From 960322d34b308585fe1acf9282c3365df79b3e30 Mon Sep 17 00:00:00 2001 From: Jacob Cable Date: Thu, 8 Aug 2024 14:15:04 +0100 Subject: [PATCH] refactor(*): use pnpm --- .../firestore-bundle-builder/api-reference.md | 2 +- .../package-lock.json | 4 +- .../package.json | 2 +- .../src/bigquery/index.ts | 20 +- .../src/bigquery/partitioning.ts | 5 +- .../src/logs.ts | 2 +- .../scripts/gen-schema-view/package-lock.json | 2291 +- .../scripts/gen-schema-view/package.json | 22 +- .../src/schema/processLeafField.ts | 44 +- .../scripts/gen-schema-view/src/snapshot.ts | 4 +- .../scripts/import/package-lock.json | 13985 ------------- .../scripts/import/package.json | 38 +- .../scripts/import/src/config.ts | 114 +- .../scripts/import/src/program.ts | 4 +- .../scripts/import/tsconfig.json | 2 +- .../clients/web/dist/sharded-counter.js | 1291 +- firestore-counter/functions/package-lock.json | 1365 +- firestore-counter/functions/package.json | 16 +- .../stress_test/bin/package.json | 9 +- .../functions/package-lock.json | 12505 +---------- firestore-send-email/functions/package.json | 8 +- lerna.json | 19 - package-lock.json | 15077 +++----------- package.json | 31 +- pnpm-lock.yaml | 17386 ++++++++++++++++ pnpm-workspace.yaml | 30 + .../functions/package-lock.json | 12855 +----------- storage-resize-images/functions/package.json | 13 +- storage-resize-images/functions/src/util.ts | 12 +- 29 files changed, 23946 insertions(+), 53210 deletions(-) delete mode 100644 firestore-bigquery-export/scripts/import/package-lock.json delete mode 100644 lerna.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/docs/firestore-bundle-builder/api-reference.md b/docs/firestore-bundle-builder/api-reference.md index db963881c..45431ffbc 100644 --- a/docs/firestore-bundle-builder/api-reference.md +++ b/docs/firestore-bundle-builder/api-reference.md @@ -90,7 +90,7 @@ type QueryCondition = { | "not-in" | "array-contains-any" ), - any + any, ]; orderBy?: [string, ("asc" | "desc")?]; limit?: number; diff --git a/firestore-bigquery-export/firestore-bigquery-change-tracker/package-lock.json b/firestore-bigquery-export/firestore-bigquery-change-tracker/package-lock.json index bfea3b7f6..630036371 100644 --- a/firestore-bigquery-export/firestore-bigquery-change-tracker/package-lock.json +++ b/firestore-bigquery-export/firestore-bigquery-change-tracker/package-lock.json @@ -1,12 +1,12 @@ { "name": "@firebaseextensions/firestore-bigquery-change-tracker", - "version": "1.1.34", + "version": "1.1.35", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@firebaseextensions/firestore-bigquery-change-tracker", - "version": "1.1.34", + "version": "1.1.35", "license": "Apache-2.0", "dependencies": { "@google-cloud/bigquery": "^7.6.0", diff --git a/firestore-bigquery-export/firestore-bigquery-change-tracker/package.json b/firestore-bigquery-export/firestore-bigquery-change-tracker/package.json index 6a642ded9..7df311186 100644 --- a/firestore-bigquery-export/firestore-bigquery-change-tracker/package.json +++ b/firestore-bigquery-export/firestore-bigquery-change-tracker/package.json @@ -9,7 +9,7 @@ "description": "Core change-tracker library for Cloud Firestore Collection BigQuery Exports", "main": "./lib/index.js", "scripts": { - "build": "npm run clean && npm run compile", + "build": "pnpm run clean && pnpm run compile", "clean": "rimraf lib", "compile": "tsc", "test:local": "jest", diff --git a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/index.ts b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/index.ts index cc2c8d772..7581f463e 100644 --- a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/index.ts +++ b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/index.ts @@ -146,19 +146,19 @@ export class FirestoreBigQueryEventHistoryTracker return undefined; } - const data = traverse>(eventData).map(function ( - property - ) { - if (property && property.constructor) { - if (property.constructor.name === "Buffer") { - this.remove(); - } + const data = traverse>(eventData).map( + function (property) { + if (property && property.constructor) { + if (property.constructor.name === "Buffer") { + this.remove(); + } - if (property.constructor.name === DocumentReference.name) { - this.update(property.path); + if (property.constructor.name === DocumentReference.name) { + this.update(property.path); + } } } - }); + ); return data; } diff --git a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/partitioning.ts b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/partitioning.ts index 1d3a468fe..4b168dac6 100644 --- a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/partitioning.ts +++ b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/bigquery/partitioning.ts @@ -291,9 +291,8 @@ export class Partitioning { } async addPartitioningToSchema(fields = []): Promise { - const { proceed, message } = await this.shouldAddPartitioningToSchema( - fields - ); + const { proceed, message } = + await this.shouldAddPartitioningToSchema(fields); if (!proceed) { functions.logger.warn(`Did not add partitioning to schema: ${message}`); diff --git a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/logs.ts b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/logs.ts index ac5d57e69..693b43b36 100644 --- a/firestore-bigquery-export/firestore-bigquery-change-tracker/src/logs.ts +++ b/firestore-bigquery-export/firestore-bigquery-change-tracker/src/logs.ts @@ -212,7 +212,7 @@ export const bigQueryTableInsertErrors = ( { row: object; errors: Array<{ message: string }>; - } + }, ] ) => { logger.warn(`Error when inserting data to table.`); diff --git a/firestore-bigquery-export/scripts/gen-schema-view/package-lock.json b/firestore-bigquery-export/scripts/gen-schema-view/package-lock.json index a240ebdcb..acbac274c 100644 --- a/firestore-bigquery-export/scripts/gen-schema-view/package-lock.json +++ b/firestore-bigquery-export/scripts/gen-schema-view/package-lock.json @@ -10,15 +10,15 @@ "license": "Apache-2.0", "dependencies": { "@firebaseextensions/firestore-bigquery-change-tracker": "^1.1.33", - "@google-cloud/bigquery": "^6.0.3", + "@google-cloud/bigquery": "^7.9.0", "commander": "5.0.0", - "firebase-admin": "^12.1.0", + "firebase-admin": "^12.3.0", "firebase-functions": "^4.2.0", "fs-find": "^0.4.0", "generate-schema": "^2.6.0", - "glob": "7.1.5", + "glob": "11.0.0", "inquirer": "^6.4.0", - "sql-formatter": "^2.3.3" + "sql-formatter": "^15.3.2" }, "bin": { "fs-bq-schema-views": "lib/index.js" @@ -35,13 +35,13 @@ "nyc": "^14.0.0", "rimraf": "^2.6.3", "ts-jest": "29.1.2", - "ts-node": "^7.0.1", + "ts-node": "^10.9.2", "typescript": "^4.9.3" } }, "../../firestore-bigquery-change-tracker": { "name": "@firebaseextensions/firestore-bigquery-change-tracker", - "version": "1.1.33", + "version": "1.1.35", "license": "Apache-2.0", "dependencies": { "@google-cloud/bigquery": "^7.6.0", @@ -7429,8 +7429,6 @@ "version": "0.8.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -7442,20 +7440,15 @@ "version": "0.3.9", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.0.0.tgz", + "integrity": "sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==" }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.1", @@ -7563,53 +7556,66 @@ "link": true }, "node_modules/@google-cloud/bigquery": { - "version": "6.0.3", - "license": "Apache-2.0", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz", + "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==", "dependencies": { - "@google-cloud/common": "^4.0.0", - "@google-cloud/paginator": "^4.0.0", - "@google-cloud/promisify": "^3.0.0", + "@google-cloud/common": "^5.0.0", + "@google-cloud/paginator": "^5.0.2", + "@google-cloud/precise-date": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", "arrify": "^2.0.1", "big.js": "^6.0.0", "duplexify": "^4.0.0", "extend": "^3.0.2", "is": "^3.3.0", - "p-event": "^4.1.0", - "readable-stream": "^4.0.0", "stream-events": "^1.0.5", - "uuid": "^8.0.0" + "uuid": "^9.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/bigquery/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@google-cloud/common": { - "version": "4.0.3", - "license": "Apache-2.0", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", + "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", "dependencies": { - "@google-cloud/projectify": "^3.0.0", - "@google-cloud/promisify": "^3.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", "arrify": "^2.0.1", "duplexify": "^4.1.1", - "ent": "^2.2.0", "extend": "^3.0.2", - "google-auth-library": "^8.0.2", - "retry-request": "^5.0.0", - "teeny-request": "^8.0.0" + "google-auth-library": "^9.0.0", + "html-entities": "^2.5.2", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.9.0.tgz", + "integrity": "sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==", "optional": true, "dependencies": { "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", + "google-gax": "^4.3.3", "protobufjs": "^7.2.6" }, "engines": { @@ -7617,28 +7623,39 @@ } }, "node_modules/@google-cloud/paginator": { - "version": "4.0.1", - "license": "Apache-2.0", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", + "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/precise-date": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", + "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "engines": { + "node": ">=14.0.0" } }, "node_modules/@google-cloud/projectify": { - "version": "3.0.0", - "license": "Apache-2.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@google-cloud/promisify": { - "version": "3.0.1", - "license": "Apache-2.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@google-cloud/storage": { @@ -7667,256 +7684,139 @@ "node": ">=14" } }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@google-cloud/storage/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@google-cloud/storage/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==", "optional": true, "dependencies": { - "ms": "2.1.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@google-cloud/storage/node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", + "node_modules/@grpc/grpc-js": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", + "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", "optional": true, "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": ">=14" + "node": ">=12.10.0" } }, - "node_modules/@google-cloud/storage/node_modules/gaxios/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "optional": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@google-cloud/storage/node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@google-cloud/storage/node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@google-cloud/storage/node_modules/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=12" } }, - "node_modules/@google-cloud/storage/node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@google-cloud/storage/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==", - "optional": true, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@google-cloud/storage/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==", - "optional": true + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/@google-cloud/storage/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==", - "optional": true, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "yocto-queue": "^0.1.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@google-cloud/storage/node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" + "node": ">=12" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", - "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "node": ">=12" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -8185,14 +8085,25 @@ "dev": true, "license": "MIT" }, - "node_modules/@jest/core/node_modules/diff": { - "version": "4.0.2", + "node_modules/@jest/core/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@jest/core/node_modules/has-flag": { @@ -8236,108 +8147,54 @@ }, "peerDependencies": { "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/ts-node": { - "version": "10.9.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "@swc/core": { + "@types/node": { "optional": true }, - "@swc/wasm": { + "ts-node": { "optional": true } } }, - "node_modules/@jest/core/node_modules/yn": { - "version": "3.1.1", + "node_modules/@jest/core/node_modules/parse-json": { + "version": "5.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@jest/environment": { @@ -8518,6 +8375,27 @@ } } }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "dev": true, @@ -8919,6 +8797,15 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "license": "BSD-3-Clause" @@ -8994,30 +8881,22 @@ "node_modules/@tsconfig/node10": { "version": "1.0.11", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9067,8 +8946,7 @@ "node_modules/@types/caseless": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" }, "node_modules/@types/chai": { "version": "4.3.4", @@ -9087,11 +8965,12 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.14", - "license": "MIT", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } @@ -9105,6 +8984,17 @@ "@types/range-parser": "*" } }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "dev": true, @@ -9143,6 +9033,14 @@ "pretty-format": "^29.0.0" } }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -9173,7 +9071,6 @@ "version": "2.48.12", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -9181,6 +9078,20 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/serve-static": { "version": "1.15.0", "license": "MIT", @@ -9197,8 +9108,7 @@ "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" }, "node_modules/@types/yargs": { "version": "17.0.32", @@ -9216,6 +9126,7 @@ "node_modules/abort-controller": { "version": "3.0.0", "license": "MIT", + "optional": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -9238,8 +9149,6 @@ "version": "8.11.3", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -9251,8 +9160,6 @@ "version": "8.3.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -9341,9 +9248,7 @@ "node_modules/arg": { "version": "4.1.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", @@ -9384,8 +9289,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "optional": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/babel-jest": { "version": "29.7.0", @@ -9486,6 +9390,27 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-coverage": { "version": "3.2.2", "dev": true, @@ -9607,58 +9532,13 @@ } }, "node_modules/bignumber.js": { - "version": "9.1.0", - "license": "MIT", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { "node": "*" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -9684,6 +9564,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -9751,28 +9632,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "license": "BSD-3-Clause" @@ -9942,11 +9801,6 @@ "node": ">= 0.8.0" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/ci-info": { "version": "3.9.0", "dev": true, @@ -10067,7 +9921,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -10089,6 +9942,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/content-disposition": { @@ -10245,14 +10099,25 @@ "dev": true, "license": "MIT" }, - "node_modules/create-jest/node_modules/diff": { - "version": "4.0.2", + "node_modules/create-jest/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/create-jest/node_modules/has-flag": { @@ -10335,70 +10200,13 @@ "node": ">=8" } }, - "node_modules/create-jest/node_modules/ts-node": { - "version": "10.9.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/create-jest/node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/create-require": { "version": "1.1.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -10411,7 +10219,6 @@ }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -10438,20 +10245,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.3", "dev": true, @@ -10476,14 +10269,6 @@ "node": ">=6" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "dev": true, @@ -10523,7 +10308,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "optional": true, "engines": { "node": ">=0.4.0" } @@ -10543,14 +10327,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "dev": true, @@ -10560,9 +10336,10 @@ } }, "node_modules/diff": { - "version": "3.5.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -10575,6 +10352,11 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" + }, "node_modules/duplexify": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", @@ -10598,6 +10380,11 @@ "node": ">= 6" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "license": "Apache-2.0", @@ -10628,8 +10415,7 @@ "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==", - "devOptional": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -10647,7 +10433,8 @@ }, "node_modules/ent": { "version": "2.2.0", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/error-ex": { "version": "1.3.2", @@ -10722,17 +10509,11 @@ "node_modules/event-target-shim": { "version": "5.0.1", "license": "MIT", + "optional": true, "engines": { "node": ">=6" } }, - "node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/exec": { "version": "0.2.1", "dev": true, @@ -10780,14 +10561,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "dev": true, @@ -10860,17 +10633,12 @@ "node": ">=4" } }, - "node_modules/farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, + "node_modules/farmhash-modern": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", + "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", "engines": { - "node": ">=10" + "node": ">=18.0.0" } }, "node_modules/fast-deep-equal": { @@ -10884,10 +10652,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "license": "Apache-2.0" - }, "node_modules/fast-xml-parser": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", @@ -11019,32 +10783,36 @@ } }, "node_modules/firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.3.0.tgz", + "integrity": "sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==", "dependencies": { - "@fastify/busboy": "^2.1.0", + "@fastify/busboy": "^3.0.0", "@firebase/database-compat": "^1.0.2", "@firebase/database-types": "^1.0.0", "@types/node": "^20.10.3", - "farmhash": "^3.3.0", + "farmhash-modern": "^1.1.0", "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", + "jwks-rsa": "^3.1.0", "node-forge": "^1.3.1", - "uuid": "^9.0.0" + "uuid": "^10.0.0" }, "engines": { "node": ">=14" }, "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", + "@google-cloud/firestore": "^7.7.0", "@google-cloud/storage": "^7.7.0" } }, "node_modules/firebase-admin/node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -11115,7 +10883,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -11139,18 +10906,15 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-find": { "version": "0.4.0", "license": "MIT" }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -11178,21 +10942,63 @@ "optional": true }, "node_modules/gaxios": { - "version": "5.0.2", - "license": "Apache-2.0", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.0.tgz", + "integrity": "sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==", "dependencies": { "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", - "node-fetch": "^2.6.7" + "node-fetch": "^2.6.9", + "uuid": "^10.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/gaxios/node_modules/is-stream": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" }, @@ -11200,15 +11006,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gaxios/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==" + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/gcp-metadata": { - "version": "5.0.1", - "license": "Apache-2.0", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", "dependencies": { - "gaxios": "^5.0.0", + "gaxios": "^6.0.0", "json-bigint": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/generate-schema": { @@ -11277,10 +11101,10 @@ "node": ">=8.0.0" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "engines": { "node": ">=10" }, @@ -11288,247 +11112,132 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob": { - "version": "7.1.5", - "license": "ISC", - "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": "*" - } - }, - "node_modules/globals": { - "version": "11.12.0", + "node_modules/get-stream": { + "version": "6.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/google-auth-library": { - "version": "8.7.0", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.0.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/google-gax/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-gax/node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" + "node": "20 || >=22" }, - "engines": { - "node": ">=14" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/google-gax/node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/google-gax/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, + "node_modules/glob/node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 14" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/google-gax/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==", - "optional": true, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/google-gax/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==", - "optional": true - }, - "node_modules/google-gax/node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, + "node_modules/glob/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/google-gax/node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=4" } }, - "node_modules/google-gax/node_modules/teeny-request/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==", - "optional": true, + "node_modules/google-auth-library": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.13.0.tgz", + "integrity": "sha512-p9Y03Uzp/Igcs36zAaB0XTSwZ8Y0/tpYiz5KIde5By+H9DCVUSYtDWZu6aFXsWTqENMb8BD/pDT3hR8NVrPkfA==", "dependencies": { - "debug": "4" + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=14" } }, - "node_modules/google-gax/node_modules/teeny-request/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==", + "node_modules/google-gax": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.9.tgz", + "integrity": "sha512-tcjQr7sXVGMdlvcG25wSv98ap1dtF4Z6mcV0rztGIddOcezw4YMb/uTXg72JPrLep+kXcVjaJjg6oo3KLf4itQ==", "optional": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.7.0", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.2", + "protobufjs": "^7.3.2", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" }, "engines": { - "node": ">= 6" + "node": ">=14" } }, "node_modules/google-gax/node_modules/uuid": { @@ -11544,19 +11253,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -11574,15 +11270,15 @@ "license": "ISC" }, "node_modules/gtoken": { - "version": "6.1.2", - "license": "MIT", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", + "gaxios": "^6.0.0", "jws": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/has-flag": { @@ -11651,6 +11347,21 @@ "dev": true, "license": "ISC" }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, "node_modules/html-escaper": { "version": "2.0.2", "dev": true, @@ -11754,24 +11465,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/import-local": { "version": "3.1.0", "dev": true, @@ -11853,7 +11546,10 @@ }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11863,11 +11559,6 @@ "version": "2.0.4", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, "node_modules/inquirer": { "version": "6.5.2", "license": "MIT", @@ -11953,7 +11644,6 @@ }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -12119,6 +11809,23 @@ "node": ">=6" } }, + "node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { "version": "29.5.0", "dev": true, @@ -12356,14 +12063,25 @@ "dev": true, "license": "MIT" }, - "node_modules/jest-cli/node_modules/diff": { - "version": "4.0.2", + "node_modules/jest-cli/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jest-cli/node_modules/has-flag": { @@ -12446,60 +12164,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/ts-node": { - "version": "10.9.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "dev": true, @@ -13216,6 +12880,27 @@ "dev": true, "license": "MIT" }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "dev": true, @@ -13655,9 +13340,9 @@ } }, "node_modules/jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -13692,7 +13377,8 @@ }, "node_modules/json-bigint": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "dependencies": { "bignumber.js": "^9.0.0" } @@ -13776,30 +13462,25 @@ } }, "node_modules/jwks-rsa": { - "version": "3.0.1", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", "debug": "^4.3.4", - "jose": "^4.10.4", + "jose": "^4.14.6", "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" + "lru-memoizer": "^2.2.0" }, "engines": { "node": ">=14" } }, - "node_modules/jwks-rsa/node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/jwks-rsa/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -13814,7 +13495,8 @@ }, "node_modules/jwks-rsa/node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/jws": { "version": "4.0.0", @@ -13849,7 +13531,9 @@ } }, "node_modules/limiter": { - "version": "1.1.5" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -13894,7 +13578,8 @@ }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", @@ -13926,29 +13611,18 @@ "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" + "node": ">=10" } }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "license": "ISC", + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" } }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "license": "ISC" - }, "node_modules/make-dir": { "version": "4.0.0", "dev": true, @@ -14071,19 +13745,9 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -14094,11 +13758,20 @@ }, "node_modules/minimist": { "version": "1.2.7", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "dev": true, @@ -14110,11 +13783,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/mocked-env": { "version": "1.3.5", "dev": true, @@ -14150,6 +13818,11 @@ "dev": true, "license": "MIT" }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/ms": { "version": "2.0.0", "license": "MIT" @@ -14158,16 +13831,37 @@ "version": "0.0.7", "license": "ISC" }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, "license": "MIT" }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/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==" + }, "node_modules/negotiator": { "version": "0.6.3", "license": "MIT", @@ -14180,36 +13874,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-abi": { - "version": "3.60.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.60.0.tgz", - "integrity": "sha512-zcGgwoXbzw9NczqbGzAWL/ToDYAxv1V8gL1D67ClbdkIfeeDBbY0GelZtC25ayLvVjr2q2cloHeQV1R0QAWqRQ==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -14353,6 +14017,27 @@ "dev": true, "license": "MIT" }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/nyc/node_modules/make-dir": { "version": "2.1.0", "dev": true, @@ -14507,26 +14192,6 @@ "node": ">=0.10.0" } }, - "node_modules/p-event": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "2.3.0", "dev": true, @@ -14552,16 +14217,6 @@ "node": ">=6" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "dev": true, @@ -14584,6 +14239,11 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/parse-json": { "version": "4.0.0", "dev": true, @@ -14613,14 +14273,15 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "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", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -14631,6 +14292,29 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "license": "MIT" @@ -14697,31 +14381,6 @@ "node": ">=6" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -14746,13 +14405,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "dev": true, @@ -14766,9 +14418,9 @@ } }, "node_modules/proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", + "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", "optional": true, "dependencies": { "protobufjs": "^7.2.5" @@ -14778,9 +14430,10 @@ } }, "node_modules/protobufjs": { - "version": "7.2.6", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", "hasInstallScript": true, - "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -14812,17 +14465,9 @@ }, "node_modules/pseudomap": { "version": "1.0.2", + "dev": true, "license": "ISC" }, - "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==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/pure-rand": { "version": "6.1.0", "dev": true, @@ -14852,11 +14497,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" + }, "node_modules/ramda": { "version": "0.27.1", "dev": true, "license": "MIT" }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/range-parser": { "version": "1.2.1", "license": "MIT", @@ -14878,28 +14540,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -14930,19 +14570,6 @@ "node": ">=6" } }, - "node_modules/readable-stream": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "dev": true, @@ -15046,6 +14673,14 @@ "node": ">=4" } }, + "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==", + "engines": { + "node": ">=0.12" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -15056,35 +14691,18 @@ } }, "node_modules/retry-request": { - "version": "5.0.2", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/retry-request/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", "dependencies": { - "ms": "2.1.2" + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=14" } }, - "node_modules/retry-request/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, "node_modules/rimraf": { "version": "2.7.1", "dev": true, @@ -15096,6 +14714,27 @@ "rimraf": "bin.js" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-async": { "version": "2.4.1", "license": "MIT", @@ -15219,7 +14858,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -15230,7 +14868,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15257,49 +14894,6 @@ "version": "3.0.7", "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "dev": true, @@ -15318,16 +14912,7 @@ "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "node": ">=0.10.0" } }, "node_modules/spawn-wrap": { @@ -15377,12 +14962,23 @@ "license": "BSD-3-Clause" }, "node_modules/sql-formatter": { - "version": "2.3.4", - "license": "MIT", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.3.2.tgz", + "integrity": "sha512-pNxSMf5DtwhpZ8gUcOGCGZIWtCcyAUx9oLgAtlO4ag7DvlfnETL0BGqXaISc84pNrXvTWmt8Wal1FWKxdTsL3Q==", "dependencies": { - "lodash": "^4.17.20" + "argparse": "^2.0.1", + "get-stdin": "=8.0.0", + "nearley": "^2.20.1" + }, + "bin": { + "sql-formatter": "bin/sql-formatter-cli.cjs" } }, + "node_modules/sql-formatter/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==" + }, "node_modules/stack-utils": { "version": "2.0.6", "dev": true, @@ -15470,6 +15066,47 @@ "node": ">=4" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "3.0.1", "license": "MIT", @@ -15497,6 +15134,26 @@ "node": ">=6" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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==", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "dev": true, @@ -15555,62 +15212,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/teeny-request": { - "version": "8.0.2", - "license": "Apache-2.0", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.9", "stream-events": "^1.0.5", "uuid": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -15629,6 +15253,27 @@ "node": ">=6" } }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/through": { "version": "2.3.8", "license": "MIT" @@ -15739,49 +15384,52 @@ } }, "node_modules/ts-node": { - "version": "7.0.1", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "license": "MIT", "dependencies": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "ts-node": "dist/bin.js" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ts-node/node_modules/arrify": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/tslib": { "version": "1.14.1", "license": "0BSD" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-detect": { "version": "4.0.8", "dev": true, @@ -15887,6 +15535,7 @@ "node_modules/uuid": { "version": "8.3.2", "license": "MIT", + "optional": true, "bin": { "uuid": "dist/bin/uuid" } @@ -15894,9 +15543,7 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -15994,6 +15641,93 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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==", + "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/wrap-ansi-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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==" + }, + "node_modules/wrap-ansi-cjs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -16178,11 +15912,12 @@ } }, "node_modules/yn": { - "version": "2.0.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/yocto-queue": { diff --git a/firestore-bigquery-export/scripts/gen-schema-view/package.json b/firestore-bigquery-export/scripts/gen-schema-view/package.json index d2fe3360e..62a87bc0e 100644 --- a/firestore-bigquery-export/scripts/gen-schema-view/package.json +++ b/firestore-bigquery-export/scripts/gen-schema-view/package.json @@ -13,7 +13,6 @@ "clean": "rimraf ./lib", "compile": "tsc && cp -r src/__tests__/fixtures lib/__tests__", "gen-schema-views": "node ./lib/index.js", - "prepare": "npm run build", "test": "jest" }, "files": [ @@ -32,29 +31,30 @@ "license": "Apache-2.0", "dependencies": { "@firebaseextensions/firestore-bigquery-change-tracker": "^1.1.33", - "@google-cloud/bigquery": "^6.0.3", + "@google-cloud/bigquery": "^7.9.0", "commander": "5.0.0", - "firebase-admin": "^12.1.0", + "firebase-admin": "^12.3.0", "firebase-functions": "^4.2.0", "fs-find": "^0.4.0", "generate-schema": "^2.6.0", - "glob": "7.1.5", + "glob": "11.0.0", "inquirer": "^6.4.0", - "sql-formatter": "^2.3.3" + "sql-formatter": "^15.3.2" }, "devDependencies": { "@types/chai": "^4.1.6", "@types/express": "^4.17.14", "@types/express-serve-static-core": "4.17.30", + "@types/jest": "29.5.0", + "@types/node": "^22.1.0", "chai": "^4.2.0", "exec": "^0.2.1", - "nyc": "^14.0.0", - "rimraf": "^2.6.3", - "ts-node": "^7.0.1", - "typescript": "^4.9.3", - "@types/jest": "29.5.0", "jest": "29.5.0", "mocked-env": "^1.3.2", - "ts-jest": "29.1.2" + "nyc": "^14.0.0", + "rimraf": "^2.6.3", + "ts-jest": "29.1.2", + "ts-node": "^10.9.2", + "typescript": "^4.9.3" } } diff --git a/firestore-bigquery-export/scripts/gen-schema-view/src/schema/processLeafField.ts b/firestore-bigquery-export/scripts/gen-schema-view/src/schema/processLeafField.ts index 20a954fd0..c7b3aeb8c 100644 --- a/firestore-bigquery-export/scripts/gen-schema-view/src/schema/processLeafField.ts +++ b/firestore-bigquery-export/scripts/gen-schema-view/src/schema/processLeafField.ts @@ -112,12 +112,17 @@ export const processLeafField = ( * We return directly from this branch because it's the only one that * generates multiple selector clauses. */ - fieldNameToSelector[ - qualifyFieldName(prefix, field.name) - ] = `${firestoreGeopoint( - datasetId, - jsonExtract(dataFieldName, extractPrefixJoined, field, ``, transformer) - )} AS ${prefix.concat(field.name).join("_")}`; + fieldNameToSelector[qualifyFieldName(prefix, field.name)] = + `${firestoreGeopoint( + datasetId, + jsonExtract( + dataFieldName, + extractPrefixJoined, + field, + ``, + transformer + ) + )} AS ${prefix.concat(field.name).join("_")}`; bigQueryFields.push({ name: qualifyFieldName(prefix, field.name), @@ -126,12 +131,11 @@ export const processLeafField = ( description: field.description, }); - fieldNameToSelector[ - qualifyFieldName(prefix, `${field.name}_latitude`) - ] = `SAFE_CAST(${latitude} AS NUMERIC) AS ${qualifyFieldName( - prefix, - `${field.name}_latitude` - )}`; + fieldNameToSelector[qualifyFieldName(prefix, `${field.name}_latitude`)] = + `SAFE_CAST(${latitude} AS NUMERIC) AS ${qualifyFieldName( + prefix, + `${field.name}_latitude` + )}`; bigQueryFields.push({ name: qualifyFieldName(prefix, `${field.name}_latitude`), @@ -140,12 +144,11 @@ export const processLeafField = ( description: `Numeric latitude component of ${field.name}.`, }); - fieldNameToSelector[ - qualifyFieldName(prefix, `${field.name}_longitude`) - ] = `SAFE_CAST(${longitude} AS NUMERIC) AS ${qualifyFieldName( - prefix, - `${field.name}_longitude` - )}`; + fieldNameToSelector[qualifyFieldName(prefix, `${field.name}_longitude`)] = + `SAFE_CAST(${longitude} AS NUMERIC) AS ${qualifyFieldName( + prefix, + `${field.name}_longitude` + )}`; bigQueryFields.push({ name: qualifyFieldName(prefix, `${field.name}_longitude`), @@ -156,9 +159,8 @@ export const processLeafField = ( return fieldNameToSelector; } - fieldNameToSelector[ - qualifyFieldName(prefix, field.name) - ] = `${selector} AS ${qualifyFieldName(prefix, field.name)}`; + fieldNameToSelector[qualifyFieldName(prefix, field.name)] = + `${selector} AS ${qualifyFieldName(prefix, field.name)}`; if (field.type === "array") { bigQueryFields.push({ diff --git a/firestore-bigquery-export/scripts/gen-schema-view/src/snapshot.ts b/firestore-bigquery-export/scripts/gen-schema-view/src/snapshot.ts index e3f731807..166904e54 100644 --- a/firestore-bigquery-export/scripts/gen-schema-view/src/snapshot.ts +++ b/firestore-bigquery-export/scripts/gen-schema-view/src/snapshot.ts @@ -149,8 +149,8 @@ export const buildLatestSchemaSnapshotViewQuery = ( ${firstValue(`timestamp`)} AS timestamp, ${firstValue(`operation`)} AS operation, ${firstValue(`operation`)} = "DELETE" AS is_deleted${ - fieldValueSelectorClauses.length > 0 ? `,` : `` - } + fieldValueSelectorClauses.length > 0 ? `,` : `` + } ${fieldValueSelectorClauses} FROM \`${process.env.PROJECT_ID}.${datasetId}.${rawViewName}\` ${offsetJoins} diff --git a/firestore-bigquery-export/scripts/import/package-lock.json b/firestore-bigquery-export/scripts/import/package-lock.json deleted file mode 100644 index a1cf9fa69..000000000 --- a/firestore-bigquery-export/scripts/import/package-lock.json +++ /dev/null @@ -1,13985 +0,0 @@ -{ - "name": "@firebaseextensions/fs-bq-import-collection", - "version": "0.1.21", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@firebaseextensions/fs-bq-import-collection", - "version": "0.1.21", - "license": "Apache-2.0", - "dependencies": { - "@firebaseextensions/firestore-bigquery-change-tracker": "^1.1.31", - "@google-cloud/bigquery": "^5.6.0", - "commander": "5.0.0", - "filenamify": "^4.2.0", - "firebase-admin": "^12.1.0", - "firebase-functions": "^4.2.0", - "generate-schema": "^2.6.0", - "inquirer": "^6.4.0", - "sql-formatter": "^2.3.3", - "workerpool": "^6.1.4" - }, - "bin": { - "fs-bq-import-collection": "lib/index.js" - }, - "devDependencies": { - "@types/chai": "^4.2.0", - "@types/jest": "29.5.0", - "@types/workerpool": "^6.0.0", - "axios": "^1.3.2", - "chai": "^4.2.0", - "dotenv": "^16.3.1", - "jest": "29.5.0", - "nanoid": "^4.0.0", - "rimraf": "^2.6.3", - "ts-jest": "29.1.2", - "ts-node": "^10.9.1", - "typescript": "^4.2.4" - } - }, - "../../firestore-bigquery-change-tracker": { - "name": "@firebaseextensions/firestore-bigquery-change-tracker", - "version": "1.1.33", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/bigquery": "^7.6.0", - "@google-cloud/resource-manager": "^5.1.0", - "firebase-admin": "^12.0.0", - "firebase-functions": "^4.9.0", - "generate-schema": "^2.6.0", - "inquirer": "^6.4.0", - "lodash": "^4.17.14", - "node-fetch": "^2.6.1", - "sql-formatter": "^2.3.3", - "traverse": "^0.6.6" - }, - "devDependencies": { - "@types/chai": "^4.1.6", - "@types/jest": "29.5.0", - "@types/node": "14.18.34", - "@types/traverse": "^0.6.32", - "chai": "^4.2.0", - "jest": "29.5.0", - "jest-config": "29.5.0", - "jest-environment-node": "29.5.0", - "mocked-env": "^1.3.2", - "nyc": "^14.0.0", - "rimraf": "^2.6.3", - "ts-jest": "29.1.2", - "typescript": "^4.9.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/code-frame": { - "version": "7.24.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/compat-data": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/core": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/generator": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/helpers": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight": { - "version": "7.24.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/parser": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/template": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/traverse": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@babel/types": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@fastify/busboy": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "text-decoding": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/app-check-interop-types": { - "version": "0.3.1", - "license": "Apache-2.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/app-types": { - "version": "0.9.1", - "license": "Apache-2.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/auth-interop-types": { - "version": "0.2.2", - "license": "Apache-2.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/component": { - "version": "0.6.6", - "license": "Apache-2.0", - "dependencies": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/database": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/database-compat": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/database-types": { - "version": "1.0.2", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/logger": { - "version": "0.4.1", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@firebase/util": { - "version": "1.9.5", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/bigquery": { - "version": "7.6.0", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/common": "^5.0.0", - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/precise-date": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "arrify": "^2.0.1", - "big.js": "^6.0.0", - "duplexify": "^4.0.0", - "extend": "^3.0.2", - "is": "^3.3.0", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/bigquery/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/common": { - "version": "5.0.1", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^9.0.0", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/firestore": { - "version": "7.6.0", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/precise-date": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/resource-manager": { - "version": "5.1.0", - "license": "Apache-2.0", - "dependencies": { - "google-gax": "^4.0.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/storage": { - "version": "7.10.0", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@grpc/grpc-js": { - "version": "1.10.6", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@grpc/proto-loader": { - "version": "0.7.12", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "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" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/console": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/core": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/core/node_modules/jest-config": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/core/node_modules/jest-environment-node": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/core/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/environment": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/expect": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/expect-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/fake-timers": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/globals": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/istanbul-reports": { - "version": "3.1.7", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/reporters/node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/schemas": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/source-map": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/test-result": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/transform": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@tootallnate/once": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@tsconfig/node10": { - "version": "1.0.11", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/@tsconfig/node16": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/babel__generator": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/babel__traverse": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/body-parser": { - "version": "1.19.2", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/body-parser/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/caseless": { - "version": "0.12.5", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/chai": { - "version": "4.3.4", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/connect": { - "version": "3.4.35", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/connect/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/cors": { - "version": "2.8.13", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/cors/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/express": { - "version": "4.17.16", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/express-serve-static-core/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/graceful-fs": { - "version": "4.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/jest": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/jsonwebtoken/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/long": { - "version": "4.0.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/mime": { - "version": "3.0.1", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/node": { - "version": "14.18.34", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/qs": { - "version": "6.9.7", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/range-parser": { - "version": "1.2.4", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/request": { - "version": "2.48.12", - "license": "MIT", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/serve-static": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/serve-static/node_modules/@types/node": { - "version": "18.11.18", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/stack-utils": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/tough-cookie": { - "version": "4.0.5", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/traverse": { - "version": "0.6.32", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/yargs": { - "version": "17.0.32", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/@types/yargs-parser": { - "version": "21.0.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/acorn-walk": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/agent-base": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ansi-escapes": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/append-transform": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-require-extensions": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/arrify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/async-retry": { - "version": "1.3.3", - "license": "MIT", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-jest": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-istanbul/node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/babel-preset-jest": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/big.js": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/bignumber.js": { - "version": "9.1.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/body-parser": { - "version": "1.20.2", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/browserslist": { - "version": "4.23.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/bs-logger": { - "version": "0.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/bser": { - "version": "2.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/bytes": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/caching-transform": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "2.4.3", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/call-bind": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/caniuse-lite": { - "version": "1.0.30001610", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/chai": { - "version": "4.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/char-regex": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/chardet": { - "version": "0.7.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/check-error": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/check-more-types": { - "version": "2.24.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cjs-module-lexer": { - "version": "1.2.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/cli-cursor": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cli-width": { - "version": "2.2.1", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/co": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/collect-v8-coverage": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/cors": { - "version": "2.8.5", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cp-file": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cp-file/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/create-jest": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/create-jest/node_modules/jest-config": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/create-jest/node_modules/jest-environment-node": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/create-jest/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/dedent": { - "version": "1.5.3", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/deep-eql": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/default-require-extensions": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/detect-newline": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/duplexify": { - "version": "4.1.3", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/duplexify/node_modules/readable-stream": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/electron-to-chromium": { - "version": "1.4.736", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/emittery": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ent": { - "version": "2.2.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/es-define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/escalade": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/exit": { - "version": "0.1.2", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/expect": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/express": { - "version": "4.19.2", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT", - "optional": true - }, - "../../firestore-bigquery-change-tracker/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/fast-xml-parser": { - "version": "4.3.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/faye-websocket": { - "version": "0.11.4", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/fb-watchman": { - "version": "2.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/figures": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/finalhandler": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/find-cache-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-admin": { - "version": "12.0.0", - "license": "Apache-2.0", - "dependencies": { - "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-admin/node_modules/@types/node": { - "version": "20.12.7", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-admin/node_modules/node-forge": { - "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-admin/node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-functions": { - "version": "4.9.0", - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/firebase-functions/node_modules/@types/express": { - "version": "4.17.3", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/foreground-child": { - "version": "1.5.6", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/foreground-child/node_modules/cross-spawn": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/foreground-child/node_modules/lru-cache": { - "version": "4.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/foreground-child/node_modules/yallist": { - "version": "2.1.2", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/form-data": { - "version": "2.5.1", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/functional-red-black-tree": { - "version": "1.0.1", - "license": "MIT", - "optional": true - }, - "../../firestore-bigquery-change-tracker/node_modules/gaxios": { - "version": "6.5.0", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/gcp-metadata": { - "version": "6.1.0", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/generate-schema": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "commander": "^2.9.0", - "type-of-is": "^3.4.0" - }, - "bin": { - "generate-schema": "bin/generate-schema" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/get-intrinsic": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/google-auth-library": { - "version": "9.8.0", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/google-gax": { - "version": "4.3.2", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/google-gax/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/gtoken": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/has-proto": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/hasha": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/hasha/node_modules/is-stream": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/http-parser-js": { - "version": "0.5.8", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/http-proxy-agent": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/https-proxy-agent": { - "version": "7.0.4", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer": { - "version": "6.5.2", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/ansi-regex": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/is-core-module": { - "version": "2.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is-generator-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-hook": { - "version": "2.0.7", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-report": { - "version": "2.0.8", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/istanbul-reports": { - "version": "2.2.7", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-changed-files": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-circus": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-cli": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-cli/node_modules/jest-config": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-cli/node_modules/jest-environment-node": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-cli/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-config": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-config/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-docblock": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-each": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-environment-node": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-get-type": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-haste-map": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-leak-detector": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-matcher-utils/node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-message-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-mock": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-regex-util": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-resolve": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-runner": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-runner/node_modules/jest-environment-node": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-runtime": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-snapshot": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-validate": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-watcher": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-watcher/node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jose": { - "version": "4.15.5", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/json-bigint": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jsonwebtoken": { - "version": "9.0.0", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jwa": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jwks-rsa": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/jws": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/kleur": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lazy-ass": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "> 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/leven": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/limiter": { - "version": "1.1.5" - }, - "../../firestore-bigquery-change-tracker/node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/load-json-file": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/lodash.clonedeep": { - "version": "4.5.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/lodash.flattendeep": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/loupe": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lru-memoizer": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/make-dir": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/makeerror": { - "version": "1.0.12", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/merge-source-map": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mime": { - "version": "3.0.0", - "license": "MIT", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mimic-fn": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/minimist": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mocked-env": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "check-more-types": "2.24.0", - "debug": "4.3.2", - "lazy-ass": "1.6.0", - "ramda": "0.27.1" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/mocked-env/node_modules/debug": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/mute-stream": { - "version": "0.0.7", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nested-error-stacks": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/node-int64": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc": { - "version": "14.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/cliui": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/wrap-ansi": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/yargs": { - "version": "13.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/nyc/node_modules/yargs-parser": { - "version": "13.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/object-hash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/object-inspect": { - "version": "1.13.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/onetime": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/os-homedir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/os-tmpdir": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/p-limit": { - "version": "3.1.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/package-hash": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/path-to-regexp": { - "version": "0.1.7", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/path-type": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pathval": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pirates": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pkg-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/prompts": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/proto3-json-serializer": { - "version": "2.0.1", - "license": "Apache-2.0", - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/protobufjs": { - "version": "7.2.6", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/pseudomap": { - "version": "1.0.2", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/pure-rand": { - "version": "6.1.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/qs": { - "version": "6.11.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ramda": { - "version": "0.27.1", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/raw-body": { - "version": "2.5.2", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/read-pkg": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/read-pkg-up": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/release-zalgo": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/require-main-filename": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/resolve": { - "version": "1.22.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/resolve.exports": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/restore-cursor": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/retry": { - "version": "0.13.1", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/retry-request": { - "version": "7.0.2", - "license": "MIT", - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/run-async": { - "version": "2.4.1", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/rxjs": { - "version": "6.6.7", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "../../firestore-bigquery-change-tracker/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/send": { - "version": "0.18.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/send/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/serve-static": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/side-channel": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/sisteransi": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/spawn-wrap": { - "version": "1.4.3", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/spawn-wrap/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/spdx-license-ids": { - "version": "3.0.12", - "dev": true, - "license": "CC0-1.0" - }, - "../../firestore-bigquery-change-tracker/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/sql-formatter": { - "version": "2.3.4", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/stack-utils": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/stream-events": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "stubs": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/stream-shift": { - "version": "1.0.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/string-length": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/strnum": { - "version": "1.0.5", - "license": "MIT", - "optional": true - }, - "../../firestore-bigquery-change-tracker/node_modules/stubs": { - "version": "3.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/teeny-request": { - "version": "9.0.0", - "license": "Apache-2.0", - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/test-exclude": { - "version": "5.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/text-decoding": { - "version": "1.0.0", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/tmpl": { - "version": "1.0.5", - "dev": true, - "license": "BSD-3-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/traverse": { - "version": "0.6.7", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ts-jest": { - "version": "29.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/ts-node": { - "version": "10.9.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "../../firestore-bigquery-change-tracker/node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "../../firestore-bigquery-change-tracker/node_modules/type-detect": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/type-of-is": { - "version": "3.5.1", - "license": "MIT", - "engines": { - "node": ">=0.10.5" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/typescript": { - "version": "4.9.4", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/update-browserslist-db": { - "version": "1.0.13", - "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" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../firestore-bigquery-change-tracker/node_modules/v8-to-istanbul": { - "version": "9.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../firestore-bigquery-change-tracker/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/walker": { - "version": "1.0.8", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "../../firestore-bigquery-change-tracker/node_modules/websocket-driver": { - "version": "0.7.4", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/websocket-extensions": { - "version": "0.1.4", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/which-module": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "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" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "../../firestore-bigquery-change-tracker/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "../../firestore-bigquery-change-tracker/node_modules/yocto-queue": { - "version": "0.1.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "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-typescript": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", - "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" - }, - "node_modules/@firebase/app-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", - "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", - "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" - }, - "node_modules/@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "dependencies": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", - "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", - "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", - "dependencies": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", - "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", - "dependencies": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebaseextensions/firestore-bigquery-change-tracker": { - "resolved": "../../firestore-bigquery-change-tracker", - "link": true - }, - "node_modules/@google-cloud/bigquery": { - "version": "5.12.0", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/common": "^3.9.0", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "big.js": "^6.0.0", - "duplexify": "^4.0.0", - "extend": "^3.0.2", - "is": "^3.3.0", - "p-event": "^4.1.0", - "readable-stream": "^3.6.0", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/common": { - "version": "3.10.0", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^7.14.0", - "retry-request": "^4.2.2", - "teeny-request": "^7.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "3.0.7", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "2.1.1", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "2.0.4", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.10.0.tgz", - "integrity": "sha512-aBNejLVzHpI7C8eJSMpBpfdq1lxvYuHqG+zy/xvs032RyPRxuu45DLMeXuAbgwyx1VBsxWGYifrPDx+O7hJrmw==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@google-cloud/storage/node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/gaxios/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@google-cloud/storage/node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@google-cloud/storage/node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", - "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "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/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.16", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.32", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "node_modules/@types/workerpool": { - "version": "6.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/arrify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/big.js": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "4.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/char-regex": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "license": "MIT" - }, - "node_modules/check-error": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "3.7.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "license": "ISC" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "devOptional": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "devOptional": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "devOptional": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.736", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, - "engines": { - "node": ">=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==", - "optional": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "license": "Apache-2.0" - }, - "node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figures": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", - "dependencies": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/firebase-admin/node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/firebase-functions": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", - "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "node_modules/firebase-functions/node_modules/@types/express": { - "version": "4.17.3", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "optional": true - }, - "node_modules/gaxios": { - "version": "4.3.3", - "license": "Apache-2.0", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcp-metadata": { - "version": "4.3.1", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/generate-schema": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "commander": "^2.9.0", - "type-of-is": "^3.4.0" - }, - "bin": { - "generate-schema": "bin/generate-schema" - } - }, - "node_modules/generate-schema/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "devOptional": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/google-auth-library": { - "version": "7.14.1", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/google-gax/node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/google-gax/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/google-gax/node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/google-gax/node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/google-gax/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/google-p12-pem": { - "version": "3.1.4", - "license": "MIT", - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "license": "ISC" - }, - "node_modules/gtoken": { - "version": "5.3.2", - "license": "MIT", - "dependencies": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.1.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "6.5.2", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "dev": true, - "license": "BSD-3-Clause", - "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.7", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/limiter": { - "version": "1.1.5" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/loupe": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "license": "ISC" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "license": "ISC" - }, - "node_modules/nanoid": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.60.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.60.0.tgz", - "integrity": "sha512-zcGgwoXbzw9NczqbGzAWL/ToDYAxv1V8gL1D67ClbdkIfeeDBbY0GelZtC25ayLvVjr2q2cloHeQV1R0QAWqRQ==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "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==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "license": "ISC" - }, - "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==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.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-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "4.2.2", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sql-formatter": { - "version": "2.3.4", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "devOptional": true, - "license": "MIT", - "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", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "7.2.0", - "license": "Apache-2.0", - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-of-is": { - "version": "3.5.1", - "license": "MIT", - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/typescript": { - "version": "4.9.4", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "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" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workerpool": { - "version": "6.3.1", - "license": "Apache-2.0" - }, - "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==", - "devOptional": 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", - "license": "ISC" - }, - "node_modules/y18n": { - "version": "5.0.8", - "devOptional": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/firestore-bigquery-export/scripts/import/package.json b/firestore-bigquery-export/scripts/import/package.json index 3895d87c8..79a11b491 100644 --- a/firestore-bigquery-export/scripts/import/package.json +++ b/firestore-bigquery-export/scripts/import/package.json @@ -14,7 +14,6 @@ "clean": "rimraf ./lib", "compile": "tsc", "import": "node ./lib/index.js", - "prepare": "npm run build", "test:local": "jest" }, "files": [ @@ -26,29 +25,30 @@ "author": "Jan Wyszynski ", "license": "Apache-2.0", "dependencies": { - "@firebaseextensions/firestore-bigquery-change-tracker": "^1.1.31", - "@google-cloud/bigquery": "^5.6.0", - "commander": "5.0.0", - "filenamify": "^4.2.0", - "firebase-admin": "^12.1.0", - "firebase-functions": "^4.2.0", + "@firebaseextensions/firestore-bigquery-change-tracker": "^1.1.35", + "@google-cloud/bigquery": "^7.9.0", + "commander": "12.1.0", + "filenamify": "^4.3.0", + "firebase-admin": "^12.3.0", + "firebase-functions": "^5.0.1", "generate-schema": "^2.6.0", "inquirer": "^6.4.0", - "sql-formatter": "^2.3.3", - "workerpool": "^6.1.4" + "sql-formatter": "^15.3.2", + "workerpool": "^9.1.3" }, "devDependencies": { - "@types/chai": "^4.2.0", + "@types/chai": "^4.3.17", "@types/jest": "29.5.0", - "@types/workerpool": "^6.0.0", - "axios": "^1.3.2", - "chai": "^4.2.0", - "dotenv": "^16.3.1", - "nanoid": "^4.0.0", - "rimraf": "^2.6.3", - "ts-node": "^10.9.1", - "typescript": "^4.2.4", + "@types/node": "^22.1.0", + "@types/workerpool": "^6.4.7", + "axios": "^1.7.3", + "chai": "^4.5.0", + "dotenv": "^16.4.5", "jest": "29.5.0", - "ts-jest": "29.1.2" + "nanoid": "^4.0.2", + "rimraf": "^2.7.1", + "ts-jest": "29.1.2", + "ts-node": "^10.9.2", + "typescript": "^5.5.4" } } \ No newline at end of file diff --git a/firestore-bigquery-export/scripts/import/src/config.ts b/firestore-bigquery-export/scripts/import/src/config.ts index 4b58a54c4..a1058301c 100644 --- a/firestore-bigquery-export/scripts/import/src/config.ts +++ b/firestore-bigquery-export/scripts/import/src/config.ts @@ -1,13 +1,10 @@ -import * as program from "commander"; +import { Command } from "commander"; import * as filenamify from "filenamify"; import * as inquirer from "inquirer"; - import { CliConfig, CliConfigError } from "./types"; const BIGQUERY_VALID_CHARACTERS = /^[a-zA-Z0-9_]+$/; -// regex of ^[^/]+(/[^/]+/[^/]+)*$ export const FIRESTORE_VALID_CHARACTERS = new RegExp("^[^/]+(/[^/]+/[^/]+)*$"); -// export const FIRESTORE_VALID_CHARACTERS = /^[^/]+(/[^/]+/[^/]+)*$/; const GCP_PROJECT_VALID_CHARACTERS = /^[a-z][a-z0-9-]{0,29}$/; const PROJECT_ID_MAX_CHARS = 6144; @@ -179,68 +176,81 @@ const questions = [ ]; export async function parseConfig(): Promise { + const program = new Command(); + + program + .option("--nonInteractive", "Run in non-interactive mode") + .option("--project ", "Firebase project ID") + .option("--bigQueryProject ", "BigQuery project ID") + .option( + "--sourceCollectionPath ", + "Source Collection Path" + ) + .option("--dataset ", "BigQuery dataset ID") + .option("--tableNamePrefix ", "BigQuery table name prefix") + .option("--queryCollectionGroup", "Query Collection Group") + .option("--batchSize ", "Batch size for import", parseInt) + .option("--datasetLocation ", "BigQuery dataset location") + .option("--multiThreaded", "Run import across multiple threads") + .option( + "--useNewSnapshotQuerySyntax", + "Use the new optimized snapshot query script" + ) + .option("--useEmulator", "Use a local Firestore emulator"); + program.parse(process.argv); - if (program.nonInteractive) { + const options = program.opts(); + + if (options.nonInteractive) { const errors = []; - if (program.project === undefined) { - errors.push("Project is not specified."); - } - if (program.bigQueryProject === undefined) { + if (!options.project) errors.push("Project is not specified."); + if (!options.bigQueryProject) errors.push("BigQuery Project is not specified."); - } - if (program.sourceCollectionPath === undefined) { + if (!options.sourceCollectionPath) errors.push("SourceCollectionPath is not specified."); - } - if (program.dataset === undefined) { - errors.push("Dataset ID is not specified."); - } - if (program.tableNamePrefix === undefined) { + if (!options.dataset) errors.push("Dataset ID is not specified."); + if (!options.tableNamePrefix) errors.push("TableNamePrefix is not specified."); - } - if (program.queryCollectionGroup === undefined) { + if (options.queryCollectionGroup === undefined) errors.push("QueryCollectionGroup is not specified."); - } - if (program.batchSize === undefined) { - errors.push("BatchSize is not specified."); - } - if (program.datasetLocation === undefined) { + if (!options.batchSize) errors.push("BatchSize is not specified."); + if (!options.datasetLocation) errors.push("DatasetLocation is not specified."); - } - if (!validateBatchSize(program.batchSize)) { + if (!validateBatchSize(options.batchSize)) errors.push("Invalid batch size."); - } if (errors.length !== 0) { program.outputHelp(); return { kind: "ERROR", errors }; } - const rawChangeLogName = `${program.tableNamePrefix}_raw_changelog`; + const rawChangeLogName = `${options.tableNamePrefix}_raw_changelog`; const cursorPositionFile = getCursorPositionFile( - program.sourceCollectionPath, - program.project, - program.dataset, + options.sourceCollectionPath, + options.project, + options.dataset, rawChangeLogName ); return { kind: "CONFIG", - projectId: program.project, - bigQueryProjectId: program.bigQueryProject, - sourceCollectionPath: program.sourceCollectionPath, - datasetId: program.dataset, - tableId: program.tableNamePrefix, - batchSize: parseInt(program.batchSize), - queryCollectionGroup: program.queryCollectionGroup === "true", - datasetLocation: program.datasetLocation, - multiThreaded: program.multiThreaded === "true", - useNewSnapshotQuerySyntax: program.useNewSnapshotQuerySyntax === "true", - useEmulator: program.useEmulator === "true", + projectId: options.project, + bigQueryProjectId: options.bigQueryProject, + sourceCollectionPath: options.sourceCollectionPath, + datasetId: options.dataset, + tableId: options.tableNamePrefix, + batchSize: options.batchSize, + queryCollectionGroup: options.queryCollectionGroup, + datasetLocation: options.datasetLocation, + multiThreaded: options.multiThreaded, + useNewSnapshotQuerySyntax: options.useNewSnapshotQuerySyntax, + useEmulator: options.useEmulator, rawChangeLogName, cursorPositionFile, }; } + const { project, sourceCollectionPath, @@ -281,23 +291,17 @@ export async function parseConfig(): Promise { }; } -/** - * - * @param template - eg, regions/{regionId}/countries - * @param text - eg, regions/asia/countries - * - * @return - eg, { regionId: "asia" } - */ export const resolveWildcardIds = (template: string, text: string) => { const textSegments = text.split("/"); - return template - .split("/") - .reduce((previousValue, currentValue, currentIndex) => { + return template.split("/").reduce( + (previousValue, currentValue, currentIndex) => { if (currentValue.startsWith("{") && currentValue.endsWith("}")) { previousValue[currentValue.slice(1, -1)] = textSegments[currentIndex]; } return previousValue; - }, {}); + }, + {} as { [key: string]: string } + ); }; function getCursorPositionFile( @@ -306,10 +310,6 @@ function getCursorPositionFile( datasetId: string, rawChangeLogName: string ) { - // TODO: make this part of config, set it in CliConfig const formattedPath = filenamify(sourceCollectionPath); - return ( - __dirname + - `/from-${formattedPath}-to-${projectId}_${datasetId}_${rawChangeLogName}` - ); + return `${__dirname}/from-${formattedPath}-to-${projectId}_${datasetId}_${rawChangeLogName}`; } diff --git a/firestore-bigquery-export/scripts/import/src/program.ts b/firestore-bigquery-export/scripts/import/src/program.ts index 40468c146..c119dd39f 100644 --- a/firestore-bigquery-export/scripts/import/src/program.ts +++ b/firestore-bigquery-export/scripts/import/src/program.ts @@ -1,4 +1,6 @@ -import * as program from "commander"; +import { Command } from "commander"; + +const program = new Command(); const packageJson = require("../package.json"); diff --git a/firestore-bigquery-export/scripts/import/tsconfig.json b/firestore-bigquery-export/scripts/import/tsconfig.json index 103dbff5e..9579778af 100644 --- a/firestore-bigquery-export/scripts/import/tsconfig.json +++ b/firestore-bigquery-export/scripts/import/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "lib": ["es2018"], + "lib": ["es2018", "dom"], "module": "commonjs", "noImplicitReturns": true, "outDir": "lib", diff --git a/firestore-counter/clients/web/dist/sharded-counter.js b/firestore-counter/clients/web/dist/sharded-counter.js index 10bdd1ca9..2be7101fe 100644 --- a/firestore-counter/clients/web/dist/sharded-counter.js +++ b/firestore-counter/clients/web/dist/sharded-counter.js @@ -1,4 +1,4 @@ -var sharded=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return _})),n.d(t,"c",(function(){return I})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return E})),n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return D})),n.d(t,"h",(function(){return S})),n.d(t,"i",(function(){return a})),n.d(t,"j",(function(){return C})),n.d(t,"k",(function(){return L})),n.d(t,"l",(function(){return h})),n.d(t,"m",(function(){return f})),n.d(t,"n",(function(){return p})),n.d(t,"o",(function(){return g})),n.d(t,"p",(function(){return k})),n.d(t,"q",(function(){return y})),n.d(t,"r",(function(){return b})),n.d(t,"s",(function(){return l})),n.d(t,"t",(function(){return d})),n.d(t,"u",(function(){return m})),n.d(t,"v",(function(){return w})),n.d(t,"w",(function(){return v})),n.d(t,"x",(function(){return N})),n.d(t,"y",(function(){return O})); +var sharded=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=12)}([function(e,t,n){"use strict";(function(e,r){n.d(t,"a",(function(){return m})),n.d(t,"b",(function(){return N})),n.d(t,"c",(function(){return A})),n.d(t,"d",(function(){return c})),n.d(t,"e",(function(){return a})),n.d(t,"f",(function(){return O})),n.d(t,"g",(function(){return y})),n.d(t,"h",(function(){return V})),n.d(t,"i",(function(){return x})),n.d(t,"j",(function(){return u})),n.d(t,"k",(function(){return F})),n.d(t,"l",(function(){return p})),n.d(t,"m",(function(){return d})),n.d(t,"n",(function(){return f})),n.d(t,"o",(function(){return g})),n.d(t,"p",(function(){return q})),n.d(t,"q",(function(){return v})),n.d(t,"r",(function(){return I})),n.d(t,"s",(function(){return _})),n.d(t,"t",(function(){return R})),n.d(t,"u",(function(){return E})),n.d(t,"v",(function(){return k})),n.d(t,"w",(function(){return w})),n.d(t,"x",(function(){return b})),n.d(t,"y",(function(){return T})),n.d(t,"z",(function(){return S})),n.d(t,"A",(function(){return L})),n.d(t,"B",(function(){return M})),n.d(t,"C",(function(){return C})); /** * @license * Copyright 2017 Google LLC @@ -15,7 +15,7 @@ var sharded=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i * See the License for the specific language governing permissions and * limitations under the License. */ -const r=function(e){const t=[];let n=0;for(let r=0;r>6|192,t[n++]=63&i|128):55296==(64512&i)&&r+1>18|240,t[n++]=i>>12&63|128,t[n++]=i>>6&63|128,t[n++]=63&i|128):(t[n++]=i>>12|224,t[n++]=i>>6&63|128,t[n++]=63&i|128)}return t},i={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[];for(let t=0;t>2,h=(3&i)<<4|o>>4;let l=(15&o)<<2|c>>6,d=63&c;a||(d=64,s||(l=64)),r.push(n[u],n[h],n[l],n[d])}return r.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(r(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let n=0,r=0;for(;n191&&i<224){const s=e[n++];t[r++]=String.fromCharCode((31&i)<<6|63&s)}else if(i>239&&i<365){const s=((7&i)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536;t[r++]=String.fromCharCode(55296+(s>>10)),t[r++]=String.fromCharCode(56320+(1023&s))}else{const s=e[n++],o=e[n++];t[r++]=String.fromCharCode((15&i)<<12|(63&s)<<6|63&o)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let t=0;t>4;if(r.push(c),64!==o){const e=s<<4&240|o>>2;if(r.push(e),64!==a){const e=o<<6&192|a;r.push(e)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}},s=function(e){return function(e){const t=r(e);return i.encodeByteArray(t,!0)}(e).replace(/\./g,"")},o=function(e){try{return i.decodeString(e,!0)}catch(e){console.error("base64Decode failed: ",e)}return null}; +const i=function(e){const t=[];let n=0;for(let r=0;r>6|192,t[n++]=63&i|128):55296==(64512&i)&&r+1>18|240,t[n++]=i>>12&63|128,t[n++]=i>>6&63|128,t[n++]=63&i|128):(t[n++]=i>>12|224,t[n++]=i>>6&63|128,t[n++]=63&i|128)}return t},s={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_();const n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[];for(let t=0;t>2,l=(3&i)<<4|o>>4;let h=(15&o)<<2|c>>6,d=63&c;a||(d=64,s||(h=64)),r.push(n[u],n[l],n[h],n[d])}return r.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(i(e),t)},decodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?atob(e):function(e){const t=[];let n=0,r=0;for(;n191&&i<224){const s=e[n++];t[r++]=String.fromCharCode((31&i)<<6|63&s)}else if(i>239&&i<365){const s=((7&i)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536;t[r++]=String.fromCharCode(55296+(s>>10)),t[r++]=String.fromCharCode(56320+(1023&s))}else{const s=e[n++],o=e[n++];t[r++]=String.fromCharCode((15&i)<<12|(63&s)<<6|63&o)}}return t.join("")}(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_();const n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let t=0;t>4;if(r.push(u),64!==a){const e=s<<4&240|a>>2;if(r.push(e),64!==c){const e=a<<6&192|c;r.push(e)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(let e=0;e=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e)}}}; /** * @license * Copyright 2017 Google LLC @@ -31,10 +31,10 @@ const r=function(e){const t=[];let n=0;for(let r=0;r{},this.resolve=()=>{},this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}wrapCallback(e){return(t,n)=>{t?this.reject(t):this.resolve(n),"function"==typeof e&&(this.promise.catch(()=>{}),1===e.length?e(t):e(t,n))}}} +const l=()=> /** * @license - * Copyright 2021 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,7 +64,8 @@ class c{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Pr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function u(e,t){if(e.uid)throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.');const n=t||"demo-project",r=e.iat||0,i=e.sub||e.user_id;if(!i)throw new Error("mockUserToken must contain 'sub' or 'user_id' field!");const o=Object.assign({iss:"https://securetoken.google.com/"+n,aud:n,iat:r,exp:r+3600,auth_time:r,sub:i,user_id:i,firebase:{sign_in_provider:"custom",identities:{}}},e);return[s(JSON.stringify({alg:"none",type:"JWT"})),s(JSON.stringify(o)),""].join(".")} + */ +function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==e)return e;throw new Error("Unable to locate global object.")}().__FIREBASE_DEFAULTS__,h=()=>{try{return l()||(()=>{if(void 0===r||void 0===r.env)return;const e=r.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0})()||(()=>{if("undefined"==typeof document)return;let e;try{e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}const t=e&&c(e[1]);return t&&JSON.parse(t)})()}catch(e){return void console.info("Unable to get __FIREBASE_DEFAULTS__ due to: "+e)}},d=e=>{var t,n;return null===(n=null===(t=h())||void 0===t?void 0:t.emulatorHosts)||void 0===n?void 0:n[e]},f=e=>{const t=d(e);if(!t)return;const n=t.lastIndexOf(":");if(n<=0||n+1===t.length)throw new Error(`Invalid host ${t} with no separate hostname and port!`);const r=parseInt(t.substring(n+1),10);return"["===t[0]?[t.substring(1,n-1),r]:[t.substring(0,n),r]},p=()=>{var e;return null===(e=h())||void 0===e?void 0:e.config},g=e=>{var t;return null===(t=h())||void 0===t?void 0:t["_"+e]}; /** * @license * Copyright 2017 Google LLC @@ -80,7 +81,24 @@ class c{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Pr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function h(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function l(){return"undefined"!=typeof window&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(h())}function d(){try{return"[object process]"===Object.prototype.toString.call(e.process)}catch(e){return!1}}function f(){return"object"==typeof self&&self.self===self}function p(){const e="object"==typeof chrome?chrome.runtime:"object"==typeof browser?browser.runtime:void 0;return"object"==typeof e&&void 0!==e.id}function m(){return"object"==typeof navigator&&"ReactNative"===navigator.product}function g(){return h().indexOf("Electron/")>=0}function y(){const e=h();return e.indexOf("MSIE ")>=0||e.indexOf("Trident/")>=0}function v(){return h().indexOf("MSAppHost/")>=0}function w(){return!d()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}function b(){return"object"==typeof indexedDB}class I extends Error{constructor(e,t,n){super(t),this.code=e,this.customData=n,this.name="FirebaseError",Object.setPrototypeOf(this,I.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,_.prototype.create)}}class _{constructor(e,t,n){this.service=e,this.serviceName=t,this.errors=n}create(e,...t){const n=t[0]||{},r=`${this.service}/${e}`,i=this.errors[e],s=i?function(e,t){return e.replace(T,(e,n)=>{const r=t[n];return null!=r?String(r):`<${n}?>`})}(i,n):"Error",o=`${this.serviceName}: ${s} (${r}).`;return new I(r,o,n)}}const T=/\{\$([^}]+)}/g; + */ +class m{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}wrapCallback(e){return(t,n)=>{t?this.reject(t):this.resolve(n),"function"==typeof e&&(this.promise.catch(()=>{}),1===e.length?e(t):e(t,n))}}} +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function y(e,t){if(e.uid)throw new Error('The "uid" field is no longer supported by mockUserToken. Please use "sub" instead for Firebase Auth User ID.');const n=t||"demo-project",r=e.iat||0,i=e.sub||e.user_id;if(!i)throw new Error("mockUserToken must contain 'sub' or 'user_id' field!");const s=Object.assign({iss:"https://securetoken.google.com/"+n,aud:n,iat:r,exp:r+3600,auth_time:r,sub:i,user_id:i,firebase:{sign_in_provider:"custom",identities:{}}},e);return[a(JSON.stringify({alg:"none",type:"JWT"})),a(JSON.stringify(s)),""].join(".")} /** * @license * Copyright 2017 Google LLC @@ -96,7 +114,7 @@ class c{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Pr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */function v(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function w(){return"undefined"!=typeof window&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(v())}function b(){var t;const n=null===(t=h())||void 0===t?void 0:t.forceEnvironment;if("node"===n)return!0;if("browser"===n)return!1;try{return"[object process]"===Object.prototype.toString.call(e.process)}catch(e){return!1}}function I(){return"object"==typeof self&&self.self===self}function _(){const e="object"==typeof chrome?chrome.runtime:"object"==typeof browser?browser.runtime:void 0;return"object"==typeof e&&void 0!==e.id}function T(){return"object"==typeof navigator&&"ReactNative"===navigator.product}function E(){const e=v();return e.indexOf("MSIE ")>=0||e.indexOf("Trident/")>=0}function S(){return!b()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}function k(){try{return"object"==typeof indexedDB}catch(e){return!1}}function C(){return new Promise((e,t)=>{try{let n=!0;const r="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(r);i.onsuccess=()=>{i.result.close(),n||self.indexedDB.deleteDatabase(r),e(!0)},i.onupgradeneeded=()=>{n=!1},i.onerror=()=>{var e;t((null===(e=i.error)||void 0===e?void 0:e.message)||"")}}catch(e){t(e)}})}class A extends Error{constructor(e,t,n){super(t),this.code=e,this.customData=n,this.name="FirebaseError",Object.setPrototypeOf(this,A.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,N.prototype.create)}}class N{constructor(e,t,n){this.service=e,this.serviceName=t,this.errors=n}create(e,...t){const n=t[0]||{},r=`${this.service}/${e}`,i=this.errors[e],s=i?function(e,t){return e.replace(D,(e,n)=>{const r=t[n];return null!=r?String(r):`<${n}?>`})}(i,n):"Error",o=`${this.serviceName}: ${s} (${r}).`;return new A(r,o,n)}}const D=/\{\$([^}]+)}/g; /** * @license * Copyright 2017 Google LLC @@ -113,7 +131,6 @@ class c{constructor(){this.reject=()=>{},this.resolve=()=>{},this.promise=new Pr * See the License for the specific language governing permissions and * limitations under the License. */ -function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function k(e){for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function S(e,t){if(e===t)return!0;const n=Object.keys(e),r=Object.keys(t);for(const i of n){if(!r.includes(i))return!1;const n=e[i],s=t[i];if(A(n)&&A(s)){if(!S(n,s))return!1}else if(n!==s)return!1}for(const e of r)if(!n.includes(e))return!1;return!0}function A(e){return null!==e&&"object"==typeof e} /** * @license * Copyright 2017 Google LLC @@ -129,10 +146,11 @@ function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function k(e){f * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function N(e){const t=[];for(const[n,r]of Object.entries(e))Array.isArray(r)?r.forEach(e=>{t.push(encodeURIComponent(n)+"="+encodeURIComponent(e))}):t.push(encodeURIComponent(n)+"="+encodeURIComponent(r));return t.length?"&"+t.join("&"):""}function O(e){const t={};return e.replace(/^\?/,"").split("&").forEach(e=>{if(e){const[n,r]=e.split("=");t[decodeURIComponent(n)]=decodeURIComponent(r)}}),t}function C(e){const t=e.indexOf("?");if(!t)return"";const n=e.indexOf("#",t);return e.substring(t,n>0?n:void 0)} + */ +function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function R(e){for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function x(e,t){if(e===t)return!0;const n=Object.keys(e),r=Object.keys(t);for(const i of n){if(!r.includes(i))return!1;const n=e[i],s=t[i];if(P(n)&&P(s)){if(!x(n,s))return!1}else if(n!==s)return!1}for(const e of r)if(!n.includes(e))return!1;return!0}function P(e){return null!==e&&"object"==typeof e} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -145,7 +163,7 @@ function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function k(e){f * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function D(e,t){const n=new R(e,t);return n.subscribe.bind(n)}class R{constructor(e,t){this.observers=[],this.unsubscribes=[],this.observerCount=0,this.task=Promise.resolve(),this.finalized=!1,this.onNoObservers=t,this.task.then(()=>{e(this)}).catch(e=>{this.error(e)})}next(e){this.forEachObserver(t=>{t.next(e)})}error(e){this.forEachObserver(t=>{t.error(e)}),this.close(e)}complete(){this.forEachObserver(e=>{e.complete()}),this.close()}subscribe(e,t,n){let r;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");r=function(e,t){if("object"!=typeof e||null===e)return!1;for(const n of t)if(n in e&&"function"==typeof e[n])return!0;return!1}(e,["next","error","complete"])?e:{next:e,error:t,complete:n},void 0===r.next&&(r.next=P),void 0===r.error&&(r.error=P),void 0===r.complete&&(r.complete=P);const i=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(()=>{try{this.finalError?r.error(this.finalError):r.complete()}catch(e){}}),this.observers.push(r),i}unsubscribeOne(e){void 0!==this.observers&&void 0!==this.observers[e]&&(delete this.observers[e],this.observerCount-=1,0===this.observerCount&&void 0!==this.onNoObservers&&this.onNoObservers(this))}forEachObserver(e){if(!this.finalized)for(let t=0;t{if(void 0!==this.observers&&void 0!==this.observers[e])try{t(this.observers[e])}catch(e){"undefined"!=typeof console&&console.error&&console.error(e)}})}close(e){this.finalized||(this.finalized=!0,void 0!==e&&(this.finalError=e),this.task.then(()=>{this.observers=void 0,this.onNoObservers=void 0}))}}function P(){} + */ /** * @license * Copyright 2017 Google LLC @@ -162,9 +180,10 @@ function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function k(e){f * See the License for the specific language governing permissions and * limitations under the License. */ +function L(e){const t=[];for(const[n,r]of Object.entries(e))Array.isArray(r)?r.forEach(e=>{t.push(encodeURIComponent(n)+"="+encodeURIComponent(e))}):t.push(encodeURIComponent(n)+"="+encodeURIComponent(r));return t.length?"&"+t.join("&"):""}function M(e){const t={};return e.replace(/^\?/,"").split("&").forEach(e=>{if(e){const[n,r]=e.split("=");t[decodeURIComponent(n)]=decodeURIComponent(r)}}),t}function F(e){const t=e.indexOf("?");if(!t)return"";const n=e.indexOf("#",t);return e.substring(t,n>0?n:void 0)} /** * @license - * Copyright 2021 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -177,11 +196,10 @@ function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function k(e){f * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -function L(e){return e&&e._delegate?e._delegate:e}}).call(this,n(8))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return ve})),n.d(t,"c",(function(){return Ne})),n.d(t,"d",(function(){return Re})),n.d(t,"e",(function(){return Le})),n.d(t,"f",(function(){return Pe})),n.d(t,"g",(function(){return Ee})),n.d(t,"h",(function(){return De})),n.d(t,"i",(function(){return pn})),n.d(t,"j",(function(){return ir})),n.d(t,"k",(function(){return c})),n.d(t,"l",(function(){return an})),n.d(t,"m",(function(){return xe})),n.d(t,"n",(function(){return Me})),n.d(t,"o",(function(){return Fe})),n.d(t,"p",(function(){return I})),n.d(t,"q",(function(){return fe})),n.d(t,"r",(function(){return g})),n.d(t,"s",(function(){return Ut})),n.d(t,"t",(function(){return k})),n.d(t,"u",(function(){return xn})),n.d(t,"v",(function(){return Z})),n.d(t,"x",(function(){return st})),n.d(t,"y",(function(){return xt})),n.d(t,"z",(function(){return nr})),n.d(t,"A",(function(){return Ft})),n.d(t,"B",(function(){return ot})),n.d(t,"C",(function(){return it})),n.d(t,"D",(function(){return me})),n.d(t,"F",(function(){return ct})),n.d(t,"G",(function(){return l})),n.d(t,"H",(function(){return ft})),n.d(t,"I",(function(){return St})),n.d(t,"J",(function(){return Ot})),n.d(t,"K",(function(){return Ln})),n.d(t,"L",(function(){return X})),n.d(t,"M",(function(){return Jt})),n.d(t,"N",(function(){return lt})),n.d(t,"O",(function(){return Ye})),n.d(t,"P",(function(){return hn})),n.d(t,"Q",(function(){return En})),n.d(t,"R",(function(){return Pn})),n.d(t,"S",(function(){return Rt})),n.d(t,"T",(function(){return Xe})),n.d(t,"U",(function(){return ln})),n.d(t,"V",(function(){return Tn})),n.d(t,"W",(function(){return Rn})),n.d(t,"X",(function(){return pt})),n.d(t,"Y",(function(){return rt})),n.d(t,"Z",(function(){return ht})),n.d(t,"ab",(function(){return qe})),n.d(t,"bb",(function(){return Je})),n.d(t,"cb",(function(){return Ze})),n.d(t,"db",(function(){return ut})),n.d(t,"eb",(function(){return dt})),n.d(t,"fb",(function(){return un})),n.d(t,"gb",(function(){return _n})),n.d(t,"hb",(function(){return Dn})),n.d(t,"ib",(function(){return We})),n.d(t,"jb",(function(){return yt})),n.d(t,"kb",(function(){return vt})),n.d(t,"lb",(function(){return fn})),n.d(t,"mb",(function(){return gt})),n.d(t,"nb",(function(){return mt})),n.d(t,"ob",(function(){return at})),n.d(t,"w",(function(){return wr})),n.d(t,"E",(function(){return yr}));var r=n(0),i=n(3);function s(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);i{e(this)}).catch(e=>{this.error(e)})}next(e){this.forEachObserver(t=>{t.next(e)})}error(e){this.forEachObserver(t=>{t.error(e)}),this.close(e)}complete(){this.forEachObserver(e=>{e.complete()}),this.close()}subscribe(e,t,n){let r;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");r=function(e,t){if("object"!=typeof e||null===e)return!1;for(const n of t)if(n in e&&"function"==typeof e[n])return!0;return!1}(e,["next","error","complete"])?e:{next:e,error:t,complete:n},void 0===r.next&&(r.next=U),void 0===r.error&&(r.error=U),void 0===r.complete&&(r.complete=U);const i=this.unsubscribeOne.bind(this,this.observers.length);return this.finalized&&this.task.then(()=>{try{this.finalError?r.error(this.finalError):r.complete()}catch(e){}}),this.observers.push(r),i}unsubscribeOne(e){void 0!==this.observers&&void 0!==this.observers[e]&&(delete this.observers[e],this.observerCount-=1,0===this.observerCount&&void 0!==this.onNoObservers&&this.onNoObservers(this))}forEachObserver(e){if(!this.finalized)for(let t=0;t{if(void 0!==this.observers&&void 0!==this.observers[e])try{t(this.observers[e])}catch(e){"undefined"!=typeof console&&console.error&&console.error(e)}})}close(e){this.finalized||(this.finalized=!0,void 0!==e&&(this.finalError=e),this.task.then(()=>{this.observers=void 0,this.onNoObservers=void 0}))}}function U(){} /** * @license - * Copyright 2021 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -195,10 +213,9 @@ function L(e){return e&&e._delegate?e._delegate:e}}).call(this,n(8))},function(e * See the License for the specific language governing permissions and * limitations under the License. */ -const c={FACEBOOK:"facebook.com",GITHUB:"github.com",GOOGLE:"google.com",PASSWORD:"password",PHONE:"phone",TWITTER:"twitter.com"},u={EMAIL_SIGNIN:"EMAIL_SIGNIN",PASSWORD_RESET:"PASSWORD_RESET",RECOVER_EMAIL:"RECOVER_EMAIL",REVERT_SECOND_FACTOR_ADDITION:"REVERT_SECOND_FACTOR_ADDITION",VERIFY_AND_CHANGE_EMAIL:"VERIFY_AND_CHANGE_EMAIL",VERIFY_EMAIL:"VERIFY_EMAIL"};function h(){return{"dependent-sdk-initialized-before-auth":"Another Firebase SDK was initialized and is trying to use Auth before Auth is initialized. Please be sure to call `initializeAuth` or `getAuth` before starting any other Firebase SDK."}}const l= /** * @license - * Copyright 2020 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -212,10 +229,10 @@ const c={FACEBOOK:"facebook.com",GITHUB:"github.com",GOOGLE:"google.com",PASSWOR * See the License for the specific language governing permissions and * limitations under the License. */ -function(){return{"admin-restricted-operation":"This operation is restricted to administrators only.","argument-error":"","app-not-authorized":"This app, identified by the domain where it's hosted, is not authorized to use Firebase Authentication with the provided API key. Review your key configuration in the Google API console.","app-not-installed":"The requested mobile application corresponding to the identifier (Android package name or iOS bundle ID) provided is not installed on this device.","captcha-check-failed":"The reCAPTCHA response token provided is either invalid, expired, already used or the domain associated with it does not match the list of whitelisted domains.","code-expired":"The SMS code has expired. Please re-send the verification code to try again.","cordova-not-ready":"Cordova framework is not ready.","cors-unsupported":"This browser is not supported.","credential-already-in-use":"This credential is already associated with a different user account.","custom-token-mismatch":"The custom token corresponds to a different audience.","requires-recent-login":"This operation is sensitive and requires recent authentication. Log in again before retrying this request.","dependent-sdk-initialized-before-auth":"Another Firebase SDK was initialized and is trying to use Auth before Auth is initialized. Please be sure to call `initializeAuth` or `getAuth` before starting any other Firebase SDK.","dynamic-link-not-activated":"Please activate Dynamic Links in the Firebase Console and agree to the terms and conditions.","email-change-needs-verification":"Multi-factor users must always have a verified email.","email-already-in-use":"The email address is already in use by another account.","emulator-config-failed":'Auth instance has already been used to make a network call. Auth can no longer be configured to use the emulator. Try calling "connectAuthEmulator()" sooner.',"expired-action-code":"The action code has expired.","cancelled-popup-request":"This operation has been cancelled due to another conflicting popup being opened.","internal-error":"An internal AuthError has occurred.","invalid-app-credential":"The phone verification request contains an invalid application verifier. The reCAPTCHA token response is either invalid or expired.","invalid-app-id":"The mobile app identifier is not registed for the current project.","invalid-user-token":"This user's credential isn't valid for this project. This can happen if the user's token has been tampered with, or if the user isn't for the project associated with this API key.","invalid-auth-event":"An internal AuthError has occurred.","invalid-verification-code":"The SMS verification code used to create the phone auth credential is invalid. Please resend the verification code sms and be sure to use the verification code provided by the user.","invalid-continue-uri":"The continue URL provided in the request is invalid.","invalid-cordova-configuration":"The following Cordova plugins must be installed to enable OAuth sign-in: cordova-plugin-buildinfo, cordova-universal-links-plugin, cordova-plugin-browsertab, cordova-plugin-inappbrowser and cordova-plugin-customurlscheme.","invalid-custom-token":"The custom token format is incorrect. Please check the documentation.","invalid-dynamic-link-domain":"The provided dynamic link domain is not configured or authorized for the current project.","invalid-email":"The email address is badly formatted.","invalid-emulator-scheme":"Emulator URL must start with a valid scheme (http:// or https://).","invalid-api-key":"Your API key is invalid, please check you have copied it correctly.","invalid-cert-hash":"The SHA-1 certificate hash provided is invalid.","invalid-credential":"The supplied auth credential is malformed or has expired.","invalid-message-payload":"The email template corresponding to this action contains invalid characters in its message. Please fix by going to the Auth email templates section in the Firebase Console.","invalid-multi-factor-session":"The request does not contain a valid proof of first factor successful sign-in.","invalid-oauth-provider":"EmailAuthProvider is not supported for this operation. This operation only supports OAuth providers.","invalid-oauth-client-id":"The OAuth client ID provided is either invalid or does not match the specified API key.","unauthorized-domain":"This domain is not authorized for OAuth operations for your Firebase project. Edit the list of authorized domains from the Firebase console.","invalid-action-code":"The action code is invalid. This can happen if the code is malformed, expired, or has already been used.","wrong-password":"The password is invalid or the user does not have a password.","invalid-persistence-type":"The specified persistence type is invalid. It can only be local, session or none.","invalid-phone-number":"The format of the phone number provided is incorrect. Please enter the phone number in a format that can be parsed into E.164 format. E.164 phone numbers are written in the format [+][country code][subscriber number including area code].","invalid-provider-id":"The specified provider ID is invalid.","invalid-recipient-email":"The email corresponding to this action failed to send as the provided recipient email address is invalid.","invalid-sender":"The email template corresponding to this action contains an invalid sender email or name. Please fix by going to the Auth email templates section in the Firebase Console.","invalid-verification-id":"The verification ID used to create the phone auth credential is invalid.","invalid-tenant-id":"The Auth instance's tenant ID is invalid.","missing-android-pkg-name":"An Android Package Name must be provided if the Android App is required to be installed.","auth-domain-config-required":"Be sure to include authDomain when calling firebase.initializeApp(), by following the instructions in the Firebase console.","missing-app-credential":"The phone verification request is missing an application verifier assertion. A reCAPTCHA response token needs to be provided.","missing-verification-code":"The phone auth credential was created with an empty SMS verification code.","missing-continue-uri":"A continue URL must be provided in the request.","missing-iframe-start":"An internal AuthError has occurred.","missing-ios-bundle-id":"An iOS Bundle ID must be provided if an App Store ID is provided.","missing-or-invalid-nonce":"The request does not contain a valid nonce. This can occur if the SHA-256 hash of the provided raw nonce does not match the hashed nonce in the ID token payload.","missing-multi-factor-info":"No second factor identifier is provided.","missing-multi-factor-session":"The request is missing proof of first factor successful sign-in.","missing-phone-number":"To send verification codes, provide a phone number for the recipient.","missing-verification-id":"The phone auth credential was created with an empty verification ID.","app-deleted":"This instance of FirebaseApp has been deleted.","multi-factor-info-not-found":"The user does not have a second factor matching the identifier provided.","multi-factor-auth-required":"Proof of ownership of a second factor is required to complete sign-in.","account-exists-with-different-credential":"An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address.","network-request-failed":"A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.","no-auth-event":"An internal AuthError has occurred.","no-such-provider":"User was not linked to an account with the given provider.","null-user":"A null user object was provided as the argument for an operation which requires a non-null user object.","operation-not-allowed":"The given sign-in provider is disabled for this Firebase project. Enable it in the Firebase console, under the sign-in method tab of the Auth section.","operation-not-supported-in-this-environment":'This operation is not supported in the environment this application is running on. "location.protocol" must be http, https or chrome-extension and web storage must be enabled.',"popup-blocked":"Unable to establish a connection with the popup. It may have been blocked by the browser.","popup-closed-by-user":"The popup has been closed by the user before finalizing the operation.","provider-already-linked":"User can only be linked to one identity for the given provider.","quota-exceeded":"The project's quota for this operation has been exceeded.","redirect-cancelled-by-user":"The redirect operation has been cancelled by the user before finalizing.","redirect-operation-pending":"A redirect sign-in operation is already pending.","rejected-credential":"The request contains malformed or mismatching credentials.","second-factor-already-in-use":"The second factor is already enrolled on this account.","maximum-second-factor-count-exceeded":"The maximum allowed number of second factors on a user has been exceeded.","tenant-id-mismatch":"The provided tenant ID does not match the Auth instance's tenant ID",timeout:"The operation has timed out.","user-token-expired":"The user's credential is no longer valid. The user must sign in again.","too-many-requests":"We have blocked all requests from this device due to unusual activity. Try again later.","unauthorized-continue-uri":"The domain of the continue URL is not whitelisted. Please whitelist the domain in the Firebase console.","unsupported-first-factor":"Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.","unsupported-persistence-type":"The current environment does not support the specified persistence type.","unsupported-tenant-operation":"This operation is not supported in a multi-tenant context.","unverified-email":"The operation requires a verified email.","user-cancelled":"The user did not grant your application the permissions it requested.","user-not-found":"There is no user record corresponding to this identifier. The user may have been deleted.","user-disabled":"The user account has been disabled by an administrator.","user-mismatch":"The supplied credentials do not correspond to the previously signed in user.","user-signed-out":"","weak-password":"The password must be 6 characters long or more.","web-storage-unsupported":"This browser is not supported or 3rd party cookies and data may be disabled.","already-initialized":"initializeAuth() has already been called with different options. To avoid this error, call initializeAuth() with the same options as when it was originally called, or call getAuth() to return the already initialized instance."}},d=h,f=new r.b("auth","Firebase",{"dependent-sdk-initialized-before-auth":"Another Firebase SDK was initialized and is trying to use Auth before Auth is initialized. Please be sure to call `initializeAuth` or `getAuth` before starting any other Firebase SDK."}),p=new o.b("@firebase/auth");function m(e,...t){p.logLevel<=o.a.ERROR&&p.error(`Auth (${i.SDK_VERSION}): ${e}`,...t)} +function q(e){return e&&e._delegate?e._delegate:e}}).call(this,n(8),n(11))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return Ce})),n.d(t,"c",(function(){return Ue})),n.d(t,"d",(function(){return Ge})),n.d(t,"e",(function(){return $e})),n.d(t,"f",(function(){return Ke})),n.d(t,"g",(function(){return Me})),n.d(t,"h",(function(){return ze})),n.d(t,"i",(function(){return Sn})),n.d(t,"j",(function(){return vr})),n.d(t,"k",(function(){return c})),n.d(t,"l",(function(){return vn})),n.d(t,"m",(function(){return We})),n.d(t,"n",(function(){return He})),n.d(t,"o",(function(){return Qe})),n.d(t,"p",(function(){return I})),n.d(t,"q",(function(){return _e})),n.d(t,"r",(function(){return m})),n.d(t,"s",(function(){return Xt})),n.d(t,"t",(function(){return Y})),n.d(t,"u",(function(){return Wn})),n.d(t,"v",(function(){return Un})),n.d(t,"w",(function(){return Z})),n.d(t,"y",(function(){return vt})),n.d(t,"z",(function(){return Ht})),n.d(t,"A",(function(){return gr})),n.d(t,"B",(function(){return Yt})),n.d(t,"C",(function(){return wt})),n.d(t,"D",(function(){return yt})),n.d(t,"E",(function(){return Ee})),n.d(t,"G",(function(){return It})),n.d(t,"H",(function(){return h})),n.d(t,"I",(function(){return kt})),n.d(t,"J",(function(){return jt})),n.d(t,"K",(function(){return Bt})),n.d(t,"L",(function(){return $n})),n.d(t,"M",(function(){return X})),n.d(t,"N",(function(){return ln})),n.d(t,"O",(function(){return Et})),n.d(t,"P",(function(){return ut})),n.d(t,"Q",(function(){return In})),n.d(t,"R",(function(){return Ln})),n.d(t,"S",(function(){return Kn})),n.d(t,"T",(function(){return Kt})),n.d(t,"U",(function(){return lt})),n.d(t,"V",(function(){return _n})),n.d(t,"W",(function(){return Pn})),n.d(t,"X",(function(){return Gn})),n.d(t,"Y",(function(){return Ct})),n.d(t,"Z",(function(){return mt})),n.d(t,"ab",(function(){return Tt})),n.d(t,"bb",(function(){return Ze})),n.d(t,"cb",(function(){return ct})),n.d(t,"db",(function(){return ht})),n.d(t,"eb",(function(){return _t})),n.d(t,"fb",(function(){return St})),n.d(t,"gb",(function(){return bn})),n.d(t,"hb",(function(){return xn})),n.d(t,"ib",(function(){return zn})),n.d(t,"jb",(function(){return rt})),n.d(t,"kb",(function(){return Dt})),n.d(t,"lb",(function(){return Ot})),n.d(t,"mb",(function(){return En})),n.d(t,"nb",(function(){return Nt})),n.d(t,"ob",(function(){return At})),n.d(t,"pb",(function(){return bt})),n.d(t,"x",(function(){return xr})),n.d(t,"F",(function(){return Or}));var r=n(0),i=n(3);function s(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);ie,"Short delay should be less than long delay!"),this.isMobile=Object(r.s)()||Object(r.u)()}get(){return"undefined"!=typeof navigator&&navigator&&"onLine"in navigator&&"boolean"==typeof navigator.onLine&&(A()||Object(r.n)()||"connection"in navigator)&&!navigator.onLine?Math.min(5e3,this.shortDelay):this.isMobile?this.longDelay:this.shortDelay}} +class C{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay should be less than long delay!"),this.isMobile=Object(r.w)()||Object(r.y)()}get(){return"undefined"!=typeof navigator&&navigator&&"onLine"in navigator&&"boolean"==typeof navigator.onLine&&(S()||Object(r.s)()||"connection"in navigator)&&!navigator.onLine?Math.min(5e3,this.shortDelay):this.isMobile?this.longDelay:this.shortDelay}} /** * @license * Copyright 2020 Google LLC @@ -326,7 +344,7 @@ class O{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay s * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function C(e,t){T(e.emulator,"Emulator should always be set here");const{url:n}=e.emulator;return t?`${n}${t.startsWith("/")?t.slice(1):t}`:n} + */function A(e,t){T(e.emulator,"Emulator should always be set here");const{url:n}=e.emulator;return t?`${n}${t.startsWith("/")?t.slice(1):t}`:n} /** * @license * Copyright 2020 Google LLC @@ -342,7 +360,7 @@ class O{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay s * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class D{static initialize(e,t,n){this.fetchImpl=e,t&&(this.headersImpl=t),n&&(this.responseImpl=n)}static fetch(){return this.fetchImpl?this.fetchImpl:"undefined"!=typeof self&&"fetch"in self?self.fetch:void _("Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static headers(){return this.headersImpl?this.headersImpl:"undefined"!=typeof self&&"Headers"in self?self.Headers:void _("Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static response(){return this.responseImpl?this.responseImpl:"undefined"!=typeof self&&"Response"in self?self.Response:void _("Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}} + */class N{static initialize(e,t,n){this.fetchImpl=e,t&&(this.headersImpl=t),n&&(this.responseImpl=n)}static fetch(){return this.fetchImpl?this.fetchImpl:"undefined"!=typeof self&&"fetch"in self?self.fetch:void _("Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static headers(){return this.headersImpl?this.headersImpl:"undefined"!=typeof self&&"Headers"in self?self.Headers:void _("Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static response(){return this.responseImpl?this.responseImpl:"undefined"!=typeof self&&"Response"in self?self.Response:void _("Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}} /** * @license * Copyright 2020 Google LLC @@ -358,7 +376,7 @@ class O{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay s * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const R={CREDENTIAL_MISMATCH:"custom-token-mismatch",MISSING_CUSTOM_TOKEN:"internal-error",INVALID_IDENTIFIER:"invalid-email",MISSING_CONTINUE_URI:"internal-error",INVALID_PASSWORD:"wrong-password",MISSING_PASSWORD:"internal-error",EMAIL_EXISTS:"email-already-in-use",PASSWORD_LOGIN_DISABLED:"operation-not-allowed",INVALID_IDP_RESPONSE:"invalid-credential",INVALID_PENDING_TOKEN:"invalid-credential",FEDERATED_USER_ID_ALREADY_LINKED:"credential-already-in-use",MISSING_REQ_TYPE:"internal-error",EMAIL_NOT_FOUND:"user-not-found",RESET_PASSWORD_EXCEED_LIMIT:"too-many-requests",EXPIRED_OOB_CODE:"expired-action-code",INVALID_OOB_CODE:"invalid-action-code",MISSING_OOB_CODE:"internal-error",CREDENTIAL_TOO_OLD_LOGIN_AGAIN:"requires-recent-login",INVALID_ID_TOKEN:"invalid-user-token",TOKEN_EXPIRED:"user-token-expired",USER_NOT_FOUND:"user-token-expired",TOO_MANY_ATTEMPTS_TRY_LATER:"too-many-requests",INVALID_CODE:"invalid-verification-code",INVALID_SESSION_INFO:"invalid-verification-id",INVALID_TEMPORARY_PROOF:"invalid-credential",MISSING_SESSION_INFO:"missing-verification-id",SESSION_EXPIRED:"code-expired",MISSING_ANDROID_PACKAGE_NAME:"missing-android-pkg-name",UNAUTHORIZED_DOMAIN:"unauthorized-continue-uri",INVALID_OAUTH_CLIENT_ID:"invalid-oauth-client-id",ADMIN_ONLY_OPERATION:"admin-restricted-operation",INVALID_MFA_PENDING_CREDENTIAL:"invalid-multi-factor-session",MFA_ENROLLMENT_NOT_FOUND:"multi-factor-info-not-found",MISSING_MFA_ENROLLMENT_ID:"missing-multi-factor-info",MISSING_MFA_PENDING_CREDENTIAL:"missing-multi-factor-session",SECOND_FACTOR_EXISTS:"second-factor-already-in-use",SECOND_FACTOR_LIMIT_EXCEEDED:"maximum-second-factor-count-exceeded",BLOCKING_FUNCTION_ERROR_RESPONSE:"internal-error"},P=new O(3e4,6e4); + */const D={CREDENTIAL_MISMATCH:"custom-token-mismatch",MISSING_CUSTOM_TOKEN:"internal-error",INVALID_IDENTIFIER:"invalid-email",MISSING_CONTINUE_URI:"internal-error",INVALID_PASSWORD:"wrong-password",MISSING_PASSWORD:"missing-password",EMAIL_EXISTS:"email-already-in-use",PASSWORD_LOGIN_DISABLED:"operation-not-allowed",INVALID_IDP_RESPONSE:"invalid-credential",INVALID_PENDING_TOKEN:"invalid-credential",FEDERATED_USER_ID_ALREADY_LINKED:"credential-already-in-use",MISSING_REQ_TYPE:"internal-error",EMAIL_NOT_FOUND:"user-not-found",RESET_PASSWORD_EXCEED_LIMIT:"too-many-requests",EXPIRED_OOB_CODE:"expired-action-code",INVALID_OOB_CODE:"invalid-action-code",MISSING_OOB_CODE:"internal-error",CREDENTIAL_TOO_OLD_LOGIN_AGAIN:"requires-recent-login",INVALID_ID_TOKEN:"invalid-user-token",TOKEN_EXPIRED:"user-token-expired",USER_NOT_FOUND:"user-token-expired",TOO_MANY_ATTEMPTS_TRY_LATER:"too-many-requests",INVALID_CODE:"invalid-verification-code",INVALID_SESSION_INFO:"invalid-verification-id",INVALID_TEMPORARY_PROOF:"invalid-credential",MISSING_SESSION_INFO:"missing-verification-id",SESSION_EXPIRED:"code-expired",MISSING_ANDROID_PACKAGE_NAME:"missing-android-pkg-name",UNAUTHORIZED_DOMAIN:"unauthorized-continue-uri",INVALID_OAUTH_CLIENT_ID:"invalid-oauth-client-id",ADMIN_ONLY_OPERATION:"admin-restricted-operation",INVALID_MFA_PENDING_CREDENTIAL:"invalid-multi-factor-session",MFA_ENROLLMENT_NOT_FOUND:"multi-factor-info-not-found",MISSING_MFA_ENROLLMENT_ID:"missing-multi-factor-info",MISSING_MFA_PENDING_CREDENTIAL:"missing-multi-factor-session",SECOND_FACTOR_EXISTS:"second-factor-already-in-use",SECOND_FACTOR_LIMIT_EXCEEDED:"maximum-second-factor-count-exceeded",BLOCKING_FUNCTION_ERROR_RESPONSE:"internal-error",RECAPTCHA_NOT_ENABLED:"recaptcha-not-enabled",MISSING_RECAPTCHA_TOKEN:"missing-recaptcha-token",INVALID_RECAPTCHA_TOKEN:"invalid-recaptcha-token",INVALID_RECAPTCHA_ACTION:"invalid-recaptcha-action",MISSING_CLIENT_TYPE:"missing-client-type",MISSING_RECAPTCHA_VERSION:"missing-recaptcha-version",INVALID_RECAPTCHA_VERSION:"invalid-recaptcha-version",INVALID_REQ_TYPE:"invalid-req-type"},O=new C(3e4,6e4); /** * @license * Copyright 2020 Google LLC @@ -374,7 +392,7 @@ class O{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay s * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function L(e,t){return e.tenantId&&!t.tenantId?Object.assign(Object.assign({},t),{tenantId:e.tenantId}):t}async function x(e,t,n,i,s={}){return M(e,s,async()=>{let s={},o={};i&&("GET"===t?o=i:s={body:JSON.stringify(i)});const a=Object(r.x)(Object.assign({key:e.config.apiKey},o)).slice(1),c=await e._getAdditionalHeaders();return c["Content-Type"]="application/json",e.languageCode&&(c["X-Firebase-Locale"]=e.languageCode),D.fetch()(j(e,e.config.apiHost,n,a),Object.assign({method:t,headers:c,referrerPolicy:"no-referrer"},s))})}async function M(e,t,n){e._canInitEmulator=!1;const i=Object.assign(Object.assign({},R),t);try{const t=new U(e),r=await Promise.race([n(),t.promise]);t.clearNetworkTimeout();const s=await r.json();if("needConfirmation"in s)throw V(e,"account-exists-with-different-credential",s);if(r.ok&&!("errorMessage"in s))return s;{const t=r.ok?s.errorMessage:s.error.message,[n,o]=t.split(" : ");if("FEDERATED_USER_ID_ALREADY_LINKED"===n)throw V(e,"credential-already-in-use",s);if("EMAIL_EXISTS"===n)throw V(e,"email-already-in-use",s);const a=i[n]||n.toLowerCase().replace(/[_\s]+/g,"-");if(o)throw v(e,a,o);g(e,a)}}catch(t){if(t instanceof r.c)throw t;g(e,"network-request-failed")}}async function F(e,t,n,r,i={}){const s=await x(e,t,n,r,i);return"mfaPendingCredential"in s&&g(e,"multi-factor-auth-required",{_serverResponse:s}),s}function j(e,t,n,r){const i=`${t}${n}?${r}`;return e.config.emulator?C(e.config,i):`${e.config.apiScheme}://${i}`}class U{constructor(e){this.auth=e,this.timer=null,this.promise=new Promise((e,t)=>{this.timer=setTimeout(()=>t(y(this.auth,"timeout")),P.get())})}clearNetworkTimeout(){clearTimeout(this.timer)}}function V(e,t,n){const r={appName:e.name};n.email&&(r.email=n.email),n.phoneNumber&&(r.phoneNumber=n.phoneNumber);const i=y(e,t,r);return i.customData._tokenResponse=n,i} + */function R(e,t){return e.tenantId&&!t.tenantId?Object.assign(Object.assign({},t),{tenantId:e.tenantId}):t}async function x(e,t,n,i,s={}){return P(e,s,async()=>{let s={},o={};i&&("GET"===t?o=i:s={body:JSON.stringify(i)});const a=Object(r.A)(Object.assign({key:e.config.apiKey},o)).slice(1),c=await e._getAdditionalHeaders();return c["Content-Type"]="application/json",e.languageCode&&(c["X-Firebase-Locale"]=e.languageCode),N.fetch()(M(e,e.config.apiHost,n,a),Object.assign({method:t,headers:c,referrerPolicy:"no-referrer"},s))})}async function P(e,t,n){e._canInitEmulator=!1;const i=Object.assign(Object.assign({},D),t);try{const t=new F(e),r=await Promise.race([n(),t.promise]);t.clearNetworkTimeout();const s=await r.json();if("needConfirmation"in s)throw V(e,"account-exists-with-different-credential",s);if(r.ok&&!("errorMessage"in s))return s;{const t=r.ok?s.errorMessage:s.error.message,[n,o]=t.split(" : ");if("FEDERATED_USER_ID_ALREADY_LINKED"===n)throw V(e,"credential-already-in-use",s);if("EMAIL_EXISTS"===n)throw V(e,"email-already-in-use",s);if("USER_DISABLED"===n)throw V(e,"user-disabled",s);const a=i[n]||n.toLowerCase().replace(/[_\s]+/g,"-");if(o)throw v(e,a,o);m(e,a)}}catch(t){if(t instanceof r.c)throw t;m(e,"network-request-failed",{message:String(t)})}}async function L(e,t,n,r,i={}){const s=await x(e,t,n,r,i);return"mfaPendingCredential"in s&&m(e,"multi-factor-auth-required",{_serverResponse:s}),s}function M(e,t,n,r){const i=`${t}${n}?${r}`;return e.config.emulator?A(e.config,i):`${e.config.apiScheme}://${i}`}class F{constructor(e){this.auth=e,this.timer=null,this.promise=new Promise((e,t)=>{this.timer=setTimeout(()=>t(y(this.auth,"network-request-failed")),O.get())})}clearNetworkTimeout(){clearTimeout(this.timer)}}function V(e,t,n){const r={appName:e.name};n.email&&(r.email=n.email),n.phoneNumber&&(r.phoneNumber=n.phoneNumber);const i=y(e,t,r);return i.customData._tokenResponse=n,i} /** * @license * Copyright 2020 Google LLC @@ -407,7 +425,7 @@ class O{constructor(e,t){this.shortDelay=e,this.longDelay=t,T(t>e,"Short delay s * See the License for the specific language governing permissions and * limitations under the License. */ -function q(e){if(e)try{const t=new Date(Number(e));if(!isNaN(t.getTime()))return t.toUTCString()}catch(e){}} +function j(e){if(e)try{const t=new Date(Number(e));if(!isNaN(t.getTime()))return t.toUTCString()}catch(e){}} /** * @license * Copyright 2020 Google LLC @@ -423,7 +441,7 @@ function q(e){if(e)try{const t=new Date(Number(e));if(!isNaN(t.getTime()))return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function B(e){return 1e3*Number(e)}function z(e){const[t,n,i]=e.split(".");if(void 0===t||void 0===n||void 0===i)return m("JWT malformed, contained fewer than 3 sections"),null;try{const e=Object(r.d)(n);return e?JSON.parse(e):(m("Failed to decode base64 JWT payload"),null)}catch(e){return m("Caught error parsing JWT payload as JSON",e),null}} + */function U(e){return 1e3*Number(e)}function q(e){const[t,n,i]=e.split(".");if(void 0===t||void 0===n||void 0===i)return g("JWT malformed, contained fewer than 3 sections"),null;try{const e=Object(r.d)(n);return e?JSON.parse(e):(g("Failed to decode base64 JWT payload"),null)}catch(e){return g("Caught error parsing JWT payload as JSON",null==e?void 0:e.toString()),null}} /** * @license * Copyright 2020 Google LLC @@ -440,7 +458,7 @@ function q(e){if(e)try{const t=new Date(Number(e));if(!isNaN(t.getTime()))return * See the License for the specific language governing permissions and * limitations under the License. */ -async function K(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t instanceof r.c&&function({code:e}){return"auth/user-disabled"===e||"auth/user-token-expired"===e} +async function B(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t instanceof r.c&&function({code:e}){return"auth/user-disabled"===e||"auth/user-token-expired"===e} /** * @license * Copyright 2020 Google LLC @@ -456,7 +474,7 @@ async function K(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t ins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(t)&&e.auth.currentUser===e&&await e.auth.signOut(),t}}class W{constructor(e){this.user=e,this.isRunning=!1,this.timerId=null,this.errorBackoff=3e4}_start(){this.isRunning||(this.isRunning=!0,this.schedule())}_stop(){this.isRunning&&(this.isRunning=!1,null!==this.timerId&&clearTimeout(this.timerId))}getInterval(e){var t;if(e){const e=this.errorBackoff;return this.errorBackoff=Math.min(2*this.errorBackoff,96e4),e}{this.errorBackoff=3e4;const e=(null!==(t=this.user.stsTokenManager.expirationTime)&&void 0!==t?t:0)-Date.now()-3e5;return Math.max(0,e)}}schedule(e=!1){if(!this.isRunning)return;const t=this.getInterval(e);this.timerId=setTimeout(async()=>{await this.iteration()},t)}async iteration(){try{await this.user.getIdToken(!0)}catch(e){return void("auth/network-request-failed"===e.code&&this.schedule(!0))}this.schedule()}} + */(t)&&e.auth.currentUser===e&&await e.auth.signOut(),t}}class z{constructor(e){this.user=e,this.isRunning=!1,this.timerId=null,this.errorBackoff=3e4}_start(){this.isRunning||(this.isRunning=!0,this.schedule())}_stop(){this.isRunning&&(this.isRunning=!1,null!==this.timerId&&clearTimeout(this.timerId))}getInterval(e){var t;if(e){const e=this.errorBackoff;return this.errorBackoff=Math.min(2*this.errorBackoff,96e4),e}{this.errorBackoff=3e4;const e=(null!==(t=this.user.stsTokenManager.expirationTime)&&void 0!==t?t:0)-Date.now()-3e5;return Math.max(0,e)}}schedule(e=!1){if(!this.isRunning)return;const t=this.getInterval(e);this.timerId=setTimeout(async()=>{await this.iteration()},t)}async iteration(){try{await this.user.getIdToken(!0)}catch(e){return void("auth/network-request-failed"===(null==e?void 0:e.code)&&this.schedule(!0))}this.schedule()}} /** * @license * Copyright 2020 Google LLC @@ -472,7 +490,7 @@ async function K(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t ins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class G{constructor(e,t){this.createdAt=e,this.lastLoginAt=t,this._initializeTime()}_initializeTime(){this.lastSignInTime=q(this.lastLoginAt),this.creationTime=q(this.createdAt)}_copy(e){this.createdAt=e.createdAt,this.lastLoginAt=e.lastLoginAt,this._initializeTime()}toJSON(){return{createdAt:this.createdAt,lastLoginAt:this.lastLoginAt}}} + */class G{constructor(e,t){this.createdAt=e,this.lastLoginAt=t,this._initializeTime()}_initializeTime(){this.lastSignInTime=j(this.lastLoginAt),this.creationTime=j(this.createdAt)}_copy(e){this.createdAt=e.createdAt,this.lastLoginAt=e.lastLoginAt,this._initializeTime()}toJSON(){return{createdAt:this.createdAt,lastLoginAt:this.lastLoginAt}}} /** * @license * Copyright 2019 Google LLC @@ -488,7 +506,7 @@ async function K(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t ins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function H(e){var t;const n=e.auth,r=await e.getIdToken(),i=await K(e,async function(e,t){return x(e,"POST","/v1/accounts:lookup",t)}(n,{idToken:r}));I(null==i?void 0:i.users.length,n,"internal-error");const o=i.users[0];e._notifyReloadListener(o);const a=(null===(t=o.providerUserInfo)||void 0===t?void 0:t.length)?o.providerUserInfo.map(e=>{var{providerId:t}=e,n=s(e,["providerId"]);return{providerId:t,uid:n.rawId||"",displayName:n.displayName||null,email:n.email||null,phoneNumber:n.phoneNumber||null,photoURL:n.photoUrl||null}}):[];const c=(u=e.providerData,h=a,[...u.filter(e=>!h.some(t=>t.providerId===e.providerId)),...h]);var u,h;const l=e.isAnonymous,d=!(e.email&&o.passwordHash||(null==c?void 0:c.length)),f=!!l&&d,p={uid:o.localId,displayName:o.displayName||null,photoURL:o.photoUrl||null,email:o.email||null,emailVerified:o.emailVerified||!1,phoneNumber:o.phoneNumber||null,tenantId:o.tenantId||null,providerData:c,metadata:new G(o.createdAt,o.lastLoginAt),isAnonymous:f};Object.assign(e,p)} + */async function K(e){var t;const n=e.auth,r=await e.getIdToken(),i=await B(e,async function(e,t){return x(e,"POST","/v1/accounts:lookup",t)}(n,{idToken:r}));I(null==i?void 0:i.users.length,n,"internal-error");const o=i.users[0];e._notifyReloadListener(o);const a=(null===(t=o.providerUserInfo)||void 0===t?void 0:t.length)?o.providerUserInfo.map(e=>{var{providerId:t}=e,n=s(e,["providerId"]);return{providerId:t,uid:n.rawId||"",displayName:n.displayName||null,email:n.email||null,phoneNumber:n.phoneNumber||null,photoURL:n.photoUrl||null}}):[];const c=(u=e.providerData,l=a,[...u.filter(e=>!l.some(t=>t.providerId===e.providerId)),...l]);var u,l;const h=e.isAnonymous,d=!(e.email&&o.passwordHash||(null==c?void 0:c.length)),f=!!h&&d,p={uid:o.localId,displayName:o.displayName||null,photoURL:o.photoUrl||null,email:o.email||null,emailVerified:o.emailVerified||!1,phoneNumber:o.phoneNumber||null,tenantId:o.tenantId||null,providerData:c,metadata:new G(o.createdAt,o.lastLoginAt),isAnonymous:f};Object.assign(e,p)} /** * @license * Copyright 2020 Google LLC @@ -505,7 +523,7 @@ async function K(e,t,n=!1){if(n)return t;try{return await t}catch(t){throw t ins * See the License for the specific language governing permissions and * limitations under the License. */ -class ${constructor(){this.refreshToken=null,this.accessToken=null,this.expirationTime=null}get isExpired(){return!this.expirationTime||Date.now()>this.expirationTime-3e4}updateFromServerResponse(e){I(e.idToken,"internal-error"),I(void 0!==e.idToken,"internal-error"),I(void 0!==e.refreshToken,"internal-error");const t="expiresIn"in e&&void 0!==e.expiresIn?Number(e.expiresIn):function(e){const t=z(e);return I(t,"internal-error"),I(void 0!==t.exp,"internal-error"),I(void 0!==t.iat,"internal-error"),Number(t.exp)-Number(t.iat)}(e.idToken);this.updateTokensAndExpiration(e.idToken,e.refreshToken,t)}async getToken(e,t=!1){return I(!this.accessToken||this.refreshToken,e,"user-token-expired"),t||!this.accessToken||this.isExpired?this.refreshToken?(await this.refresh(e,this.refreshToken),this.accessToken):null:this.accessToken}clearRefreshToken(){this.refreshToken=null}async refresh(e,t){const{accessToken:n,refreshToken:i,expiresIn:s}=await +class ${constructor(){this.refreshToken=null,this.accessToken=null,this.expirationTime=null}get isExpired(){return!this.expirationTime||Date.now()>this.expirationTime-3e4}updateFromServerResponse(e){I(e.idToken,"internal-error"),I(void 0!==e.idToken,"internal-error"),I(void 0!==e.refreshToken,"internal-error");const t="expiresIn"in e&&void 0!==e.expiresIn?Number(e.expiresIn):function(e){const t=q(e);return I(t,"internal-error"),I(void 0!==t.exp,"internal-error"),I(void 0!==t.iat,"internal-error"),Number(t.exp)-Number(t.iat)}(e.idToken);this.updateTokensAndExpiration(e.idToken,e.refreshToken,t)}async getToken(e,t=!1){return I(!this.accessToken||this.refreshToken,e,"user-token-expired"),t||!this.accessToken||this.isExpired?this.refreshToken?(await this.refresh(e,this.refreshToken),this.accessToken):null:this.accessToken}clearRefreshToken(){this.refreshToken=null}async refresh(e,t){const{accessToken:n,refreshToken:i,expiresIn:s}=await /** * @license * Copyright 2020 Google LLC @@ -522,7 +540,23 @@ class ${constructor(){this.refreshToken=null,this.accessToken=null,this.expirati * See the License for the specific language governing permissions and * limitations under the License. */ -async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_type:"refresh_token",refresh_token:t}).slice(1),{tokenApiHost:i,apiKey:s}=e.config,o=j(e,i,"/v1/token","key="+s),a=await e._getAdditionalHeaders();return a["Content-Type"]="application/x-www-form-urlencoded",D.fetch()(o,{method:"POST",headers:a,body:n})});return{accessToken:n.access_token,expiresIn:n.expires_in,refreshToken:n.refresh_token}}(e,t);this.updateTokensAndExpiration(n,i,Number(s))}updateTokensAndExpiration(e,t,n){this.refreshToken=t||null,this.accessToken=e||null,this.expirationTime=Date.now()+1e3*n}static fromJSON(e,t){const{refreshToken:n,accessToken:r,expirationTime:i}=t,s=new $;return n&&(I("string"==typeof n,"internal-error",{appName:e}),s.refreshToken=n),r&&(I("string"==typeof r,"internal-error",{appName:e}),s.accessToken=r),i&&(I("number"==typeof i,"internal-error",{appName:e}),s.expirationTime=i),s}toJSON(){return{refreshToken:this.refreshToken,accessToken:this.accessToken,expirationTime:this.expirationTime}}_assign(e){this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationTime=e.expirationTime}_clone(){return Object.assign(new $,this.toJSON())}_performRefresh(){return _("not implemented")}} +async function(e,t){const n=await P(e,{},async()=>{const n=Object(r.A)({grant_type:"refresh_token",refresh_token:t}).slice(1),{tokenApiHost:i,apiKey:s}=e.config,o=M(e,i,"/v1/token","key="+s),a=await e._getAdditionalHeaders();return a["Content-Type"]="application/x-www-form-urlencoded",N.fetch()(o,{method:"POST",headers:a,body:n})});return{accessToken:n.access_token,expiresIn:n.expires_in,refreshToken:n.refresh_token}}(e,t);this.updateTokensAndExpiration(n,i,Number(s))}updateTokensAndExpiration(e,t,n){this.refreshToken=t||null,this.accessToken=e||null,this.expirationTime=Date.now()+1e3*n}static fromJSON(e,t){const{refreshToken:n,accessToken:r,expirationTime:i}=t,s=new $;return n&&(I("string"==typeof n,"internal-error",{appName:e}),s.refreshToken=n),r&&(I("string"==typeof r,"internal-error",{appName:e}),s.accessToken=r),i&&(I("number"==typeof i,"internal-error",{appName:e}),s.expirationTime=i),s}toJSON(){return{refreshToken:this.refreshToken,accessToken:this.accessToken,expirationTime:this.expirationTime}}_assign(e){this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationTime=e.expirationTime}_clone(){return Object.assign(new $,this.toJSON())}_performRefresh(){return _("not implemented")}} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function W(e,t){I("string"==typeof e||void 0===e,"internal-error",{appName:t})}class H{constructor(e){var{uid:t,auth:n,stsTokenManager:r}=e,i=s(e,["uid","auth","stsTokenManager"]);this.providerId="firebase",this.proactiveRefresh=new z(this),this.reloadUserInfo=null,this.reloadListener=null,this.uid=t,this.auth=n,this.stsTokenManager=r,this.accessToken=r.accessToken,this.displayName=i.displayName||null,this.email=i.email||null,this.emailVerified=i.emailVerified||!1,this.phoneNumber=i.phoneNumber||null,this.photoURL=i.photoURL||null,this.isAnonymous=i.isAnonymous||!1,this.tenantId=i.tenantId||null,this.providerData=i.providerData?[...i.providerData]:[],this.metadata=new G(i.createdAt||void 0,i.lastLoginAt||void 0)}async getIdToken(e){const t=await B(this,this.stsTokenManager.getToken(this.auth,e));return I(t,this.auth,"internal-error"),this.accessToken!==t&&(this.accessToken=t,await this.auth._persistUserIfCurrent(this),this.auth._notifyListenersIfCurrent(this)),t}getIdTokenResult(e){return async function(e,t=!1){const n=Object(r.p)(e),i=await n.getIdToken(t),s=q(i);I(s&&s.exp&&s.auth_time&&s.iat,n.auth,"internal-error");const o="object"==typeof s.firebase?s.firebase:void 0,a=null==o?void 0:o.sign_in_provider;return{claims:s,token:i,authTime:j(U(s.auth_time)),issuedAtTime:j(U(s.iat)),expirationTime:j(U(s.exp)),signInProvider:a||null,signInSecondFactor:(null==o?void 0:o.sign_in_second_factor)||null}}(this,e)}reload(){return async function(e){const t=Object(r.p)(e);await K(t),await t.auth._persistUserIfCurrent(t),t.auth._notifyListenersIfCurrent(t)}(this)}_assign(e){this!==e&&(I(this.uid===e.uid,this.auth,"internal-error"),this.displayName=e.displayName,this.photoURL=e.photoURL,this.email=e.email,this.emailVerified=e.emailVerified,this.phoneNumber=e.phoneNumber,this.isAnonymous=e.isAnonymous,this.tenantId=e.tenantId,this.providerData=e.providerData.map(e=>Object.assign({},e)),this.metadata._copy(e.metadata),this.stsTokenManager._assign(e.stsTokenManager))}_clone(e){const t=new H(Object.assign(Object.assign({},this),{auth:e,stsTokenManager:this.stsTokenManager._clone()}));return t.metadata._copy(this.metadata),t}_onReload(e){I(!this.reloadListener,this.auth,"internal-error"),this.reloadListener=e,this.reloadUserInfo&&(this._notifyReloadListener(this.reloadUserInfo),this.reloadUserInfo=null)}_notifyReloadListener(e){this.reloadListener?this.reloadListener(e):this.reloadUserInfo=e}_startProactiveRefresh(){this.proactiveRefresh._start()}_stopProactiveRefresh(){this.proactiveRefresh._stop()}async _updateTokensIfNecessary(e,t=!1){let n=!1;e.idToken&&e.idToken!==this.stsTokenManager.accessToken&&(this.stsTokenManager.updateFromServerResponse(e),n=!0),t&&await K(this),await this.auth._persistUserIfCurrent(this),n&&this.auth._notifyListenersIfCurrent(this)}async delete(){const e=await this.getIdToken();return await B(this,async function(e,t){return x(e,"POST","/v1/accounts:delete",t)}(this.auth,{idToken:e})),this.stsTokenManager.clearRefreshToken(),this.auth.signOut()}toJSON(){return Object.assign(Object.assign({uid:this.uid,email:this.email||void 0,emailVerified:this.emailVerified,displayName:this.displayName||void 0,isAnonymous:this.isAnonymous,photoURL:this.photoURL||void 0,phoneNumber:this.phoneNumber||void 0,tenantId:this.tenantId||void 0,providerData:this.providerData.map(e=>Object.assign({},e)),stsTokenManager:this.stsTokenManager.toJSON(),_redirectEventId:this._redirectEventId},this.metadata.toJSON()),{apiKey:this.auth.config.apiKey,appName:this.auth.name})}get refreshToken(){return this.stsTokenManager.refreshToken||""}static _fromJSON(e,t){var n,r,i,s,o,a,c,u;const l=null!==(n=t.displayName)&&void 0!==n?n:void 0,h=null!==(r=t.email)&&void 0!==r?r:void 0,d=null!==(i=t.phoneNumber)&&void 0!==i?i:void 0,f=null!==(s=t.photoURL)&&void 0!==s?s:void 0,p=null!==(o=t.tenantId)&&void 0!==o?o:void 0,g=null!==(a=t._redirectEventId)&&void 0!==a?a:void 0,m=null!==(c=t.createdAt)&&void 0!==c?c:void 0,y=null!==(u=t.lastLoginAt)&&void 0!==u?u:void 0,{uid:v,emailVerified:w,isAnonymous:b,providerData:_,stsTokenManager:T}=t;I(v&&T,e,"internal-error");const E=$.fromJSON(this.name,T);I("string"==typeof v,e,"internal-error"),W(l,e.name),W(h,e.name),I("boolean"==typeof w,e,"internal-error"),I("boolean"==typeof b,e,"internal-error"),W(d,e.name),W(f,e.name),W(p,e.name),W(g,e.name),W(m,e.name),W(y,e.name);const S=new H({uid:v,auth:e,email:h,emailVerified:w,displayName:l,isAnonymous:b,photoURL:f,phoneNumber:d,tenantId:p,stsTokenManager:E,createdAt:m,lastLoginAt:y});return _&&Array.isArray(_)&&(S.providerData=_.map(e=>Object.assign({},e))),g&&(S._redirectEventId=g),S}static async _fromIdTokenResponse(e,t,n=!1){const r=new $;r.updateFromServerResponse(t);const i=new H({uid:t.localId,auth:e,stsTokenManager:r,isAnonymous:n});return await K(i),i}} /** * @license * Copyright 2020 Google LLC @@ -538,7 +572,7 @@ async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_ty * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Q(e,t){I("string"==typeof e||void 0===e,"internal-error",{appName:t})}class J{constructor(e){var{uid:t,auth:n,stsTokenManager:r}=e,i=s(e,["uid","auth","stsTokenManager"]);this.providerId="firebase",this.emailVerified=!1,this.isAnonymous=!1,this.tenantId=null,this.providerData=[],this.proactiveRefresh=new W(this),this.reloadUserInfo=null,this.reloadListener=null,this.uid=t,this.auth=n,this.stsTokenManager=r,this.accessToken=r.accessToken,this.displayName=i.displayName||null,this.email=i.email||null,this.emailVerified=i.emailVerified||!1,this.phoneNumber=i.phoneNumber||null,this.photoURL=i.photoURL||null,this.isAnonymous=i.isAnonymous||!1,this.tenantId=i.tenantId||null,this.metadata=new G(i.createdAt||void 0,i.lastLoginAt||void 0)}async getIdToken(e){const t=await K(this,this.stsTokenManager.getToken(this.auth,e));return I(t,this.auth,"internal-error"),this.accessToken!==t&&(this.accessToken=t,await this.auth._persistUserIfCurrent(this),this.auth._notifyListenersIfCurrent(this)),t}getIdTokenResult(e){return async function(e,t=!1){const n=Object(r.k)(e),i=await n.getIdToken(t),s=z(i);I(s&&s.exp&&s.auth_time&&s.iat,n.auth,"internal-error");const o="object"==typeof s.firebase?s.firebase:void 0,a=null==o?void 0:o.sign_in_provider;return{claims:s,token:i,authTime:q(B(s.auth_time)),issuedAtTime:q(B(s.iat)),expirationTime:q(B(s.exp)),signInProvider:a||null,signInSecondFactor:(null==o?void 0:o.sign_in_second_factor)||null}}(this,e)}reload(){return async function(e){const t=Object(r.k)(e);await H(t),await t.auth._persistUserIfCurrent(t),t.auth._notifyListenersIfCurrent(t)}(this)}_assign(e){this!==e&&(I(this.uid===e.uid,this.auth,"internal-error"),this.displayName=e.displayName,this.photoURL=e.photoURL,this.email=e.email,this.emailVerified=e.emailVerified,this.phoneNumber=e.phoneNumber,this.isAnonymous=e.isAnonymous,this.tenantId=e.tenantId,this.providerData=e.providerData.map(e=>Object.assign({},e)),this.metadata._copy(e.metadata),this.stsTokenManager._assign(e.stsTokenManager))}_clone(e){return new J(Object.assign(Object.assign({},this),{auth:e,stsTokenManager:this.stsTokenManager._clone()}))}_onReload(e){I(!this.reloadListener,this.auth,"internal-error"),this.reloadListener=e,this.reloadUserInfo&&(this._notifyReloadListener(this.reloadUserInfo),this.reloadUserInfo=null)}_notifyReloadListener(e){this.reloadListener?this.reloadListener(e):this.reloadUserInfo=e}_startProactiveRefresh(){this.proactiveRefresh._start()}_stopProactiveRefresh(){this.proactiveRefresh._stop()}async _updateTokensIfNecessary(e,t=!1){let n=!1;e.idToken&&e.idToken!==this.stsTokenManager.accessToken&&(this.stsTokenManager.updateFromServerResponse(e),n=!0),t&&await H(this),await this.auth._persistUserIfCurrent(this),n&&this.auth._notifyListenersIfCurrent(this)}async delete(){const e=await this.getIdToken();return await K(this,async function(e,t){return x(e,"POST","/v1/accounts:delete",t)}(this.auth,{idToken:e})),this.stsTokenManager.clearRefreshToken(),this.auth.signOut()}toJSON(){return Object.assign(Object.assign({uid:this.uid,email:this.email||void 0,emailVerified:this.emailVerified,displayName:this.displayName||void 0,isAnonymous:this.isAnonymous,photoURL:this.photoURL||void 0,phoneNumber:this.phoneNumber||void 0,tenantId:this.tenantId||void 0,providerData:this.providerData.map(e=>Object.assign({},e)),stsTokenManager:this.stsTokenManager.toJSON(),_redirectEventId:this._redirectEventId},this.metadata.toJSON()),{apiKey:this.auth.config.apiKey,appName:this.auth.name})}get refreshToken(){return this.stsTokenManager.refreshToken||""}static _fromJSON(e,t){var n,r,i,s,o,a,c,u;const h=null!==(n=t.displayName)&&void 0!==n?n:void 0,l=null!==(r=t.email)&&void 0!==r?r:void 0,d=null!==(i=t.phoneNumber)&&void 0!==i?i:void 0,f=null!==(s=t.photoURL)&&void 0!==s?s:void 0,p=null!==(o=t.tenantId)&&void 0!==o?o:void 0,m=null!==(a=t._redirectEventId)&&void 0!==a?a:void 0,g=null!==(c=t.createdAt)&&void 0!==c?c:void 0,y=null!==(u=t.lastLoginAt)&&void 0!==u?u:void 0,{uid:v,emailVerified:w,isAnonymous:b,providerData:_,stsTokenManager:T}=t;I(v&&T,e,"internal-error");const E=$.fromJSON(this.name,T);I("string"==typeof v,e,"internal-error"),Q(h,e.name),Q(l,e.name),I("boolean"==typeof w,e,"internal-error"),I("boolean"==typeof b,e,"internal-error"),Q(d,e.name),Q(f,e.name),Q(p,e.name),Q(m,e.name),Q(g,e.name),Q(y,e.name);const k=new J({uid:v,auth:e,email:l,emailVerified:w,displayName:h,isAnonymous:b,photoURL:f,phoneNumber:d,tenantId:p,stsTokenManager:E,createdAt:g,lastLoginAt:y});return _&&Array.isArray(_)&&(k.providerData=_.map(e=>Object.assign({},e))),m&&(k._redirectEventId=m),k}static async _fromIdTokenResponse(e,t,n=!1){const r=new $;r.updateFromServerResponse(t);const i=new J({uid:t.localId,auth:e,stsTokenManager:r,isAnonymous:n});return await H(i),i}} + */const Q=new Map;function Y(e){T(e instanceof Function,"Expected a class definition");let t=Q.get(e);return t?(T(t instanceof e,"Instance stored in cache mismatched with class"),t):(t=new e,Q.set(e,t),t)} /** * @license * Copyright 2019 Google LLC @@ -554,7 +588,7 @@ async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_ty * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Y{constructor(){this.type="NONE",this.storage={}}async _isAvailable(){return!0}async _set(e,t){this.storage[e]=t}async _get(e){const t=this.storage[e];return void 0===t?null:t}async _remove(e){delete this.storage[e]}_addListener(e,t){}_removeListener(e,t){}}Y.type="NONE";const X=Y; + */class J{constructor(){this.type="NONE",this.storage={}}async _isAvailable(){return!0}async _set(e,t){this.storage[e]=t}async _get(e){const t=this.storage[e];return void 0===t?null:t}async _remove(e){delete this.storage[e]}_addListener(e,t){}_removeListener(e,t){}}J.type="NONE";const X=J; /** * @license * Copyright 2019 Google LLC @@ -570,7 +604,7 @@ async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_ty * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Z(e,t,n){return`firebase:${e}:${t}:${n}`}class ee{constructor(e,t,n){this.persistence=e,this.auth=t,this.userKey=n;const{config:r,name:i}=this.auth;this.fullUserKey=Z(this.userKey,r.apiKey,i),this.fullPersistenceKey=Z("persistence",r.apiKey,i),this.boundEventHandler=t._onStorageEvent.bind(t),this.persistence._addListener(this.fullUserKey,this.boundEventHandler)}setCurrentUser(e){return this.persistence._set(this.fullUserKey,e.toJSON())}async getCurrentUser(){const e=await this.persistence._get(this.fullUserKey);return e?J._fromJSON(this.auth,e):null}removeCurrentUser(){return this.persistence._remove(this.fullUserKey)}savePersistenceForRedirect(){return this.persistence._set(this.fullPersistenceKey,this.persistence.type)}async setPersistence(e){if(this.persistence===e)return;const t=await this.getCurrentUser();return await this.removeCurrentUser(),this.persistence=e,t?this.setCurrentUser(t):void 0}delete(){this.persistence._removeListener(this.fullUserKey,this.boundEventHandler)}static async create(e,t,n="authUser"){if(!t.length)return new ee(k(X),e,n);const r=(await Promise.all(t.map(async e=>{if(await e._isAvailable())return e}))).filter(e=>e);let i=r[0]||k(X);const s=Z(n,e.config.apiKey,e.name);let o=null;for(const n of t)try{const t=await n._get(s);if(t){const r=J._fromJSON(e,t);n!==i&&(o=r),i=n;break}}catch(e){}const a=r.filter(e=>e._shouldAllowMigration);return i._shouldAllowMigration&&a.length?(i=a[0],o&&await i._set(s,o.toJSON()),await Promise.all(t.map(async e=>{if(e!==i)try{await e._remove(s)}catch(e){}})),new ee(i,e,n)):new ee(i,e,n)}} + */function Z(e,t,n){return`firebase:${e}:${t}:${n}`}class ee{constructor(e,t,n){this.persistence=e,this.auth=t,this.userKey=n;const{config:r,name:i}=this.auth;this.fullUserKey=Z(this.userKey,r.apiKey,i),this.fullPersistenceKey=Z("persistence",r.apiKey,i),this.boundEventHandler=t._onStorageEvent.bind(t),this.persistence._addListener(this.fullUserKey,this.boundEventHandler)}setCurrentUser(e){return this.persistence._set(this.fullUserKey,e.toJSON())}async getCurrentUser(){const e=await this.persistence._get(this.fullUserKey);return e?H._fromJSON(this.auth,e):null}removeCurrentUser(){return this.persistence._remove(this.fullUserKey)}savePersistenceForRedirect(){return this.persistence._set(this.fullPersistenceKey,this.persistence.type)}async setPersistence(e){if(this.persistence===e)return;const t=await this.getCurrentUser();return await this.removeCurrentUser(),this.persistence=e,t?this.setCurrentUser(t):void 0}delete(){this.persistence._removeListener(this.fullUserKey,this.boundEventHandler)}static async create(e,t,n="authUser"){if(!t.length)return new ee(Y(X),e,n);const r=(await Promise.all(t.map(async e=>{if(await e._isAvailable())return e}))).filter(e=>e);let i=r[0]||Y(X);const s=Z(n,e.config.apiKey,e.name);let o=null;for(const n of t)try{const t=await n._get(s);if(t){const r=H._fromJSON(e,t);n!==i&&(o=r),i=n;break}}catch(e){}const a=r.filter(e=>e._shouldAllowMigration);return i._shouldAllowMigration&&a.length?(i=a[0],o&&await i._set(s,o.toJSON()),await Promise.all(t.map(async e=>{if(e!==i)try{await e._remove(s)}catch(e){}})),new ee(i,e,n)):new ee(i,e,n)}} /** * @license * Copyright 2020 Google LLC @@ -586,7 +620,7 @@ async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_ty * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function te(e){const t=e.toLowerCase();if(t.includes("opera/")||t.includes("opr/")||t.includes("opios/"))return"Opera";if(se(t))return"IEMobile";if(t.includes("msie")||t.includes("trident/"))return"IE";if(t.includes("edge/"))return"Edge";if(ne(t))return"Firefox";if(t.includes("silk/"))return"Silk";if(ae(t))return"Blackberry";if(ce(t))return"Webos";if(re(t))return"Safari";if((t.includes("chrome/")||ie(t))&&!t.includes("edge/"))return"Chrome";if(oe(t))return"Android";{const t=/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/,n=e.match(t);if(2===(null==n?void 0:n.length))return n[1]}return"Other"}function ne(e=Object(r.l)()){return/firefox\//i.test(e)}function re(e=Object(r.l)()){const t=e.toLowerCase();return t.includes("safari/")&&!t.includes("chrome/")&&!t.includes("crios/")&&!t.includes("android")}function ie(e=Object(r.l)()){return/crios\//i.test(e)}function se(e=Object(r.l)()){return/iemobile/i.test(e)}function oe(e=Object(r.l)()){return/android/i.test(e)}function ae(e=Object(r.l)()){return/blackberry/i.test(e)}function ce(e=Object(r.l)()){return/webos/i.test(e)}function ue(e=Object(r.l)()){return/iphone|ipad|ipod/i.test(e)}function he(e=Object(r.l)()){return ue(e)||oe(e)||ce(e)||ae(e)||/windows phone/i.test(e)||se(e)} + */function te(e){const t=e.toLowerCase();if(t.includes("opera/")||t.includes("opr/")||t.includes("opios/"))return"Opera";if(se(t))return"IEMobile";if(t.includes("msie")||t.includes("trident/"))return"IE";if(t.includes("edge/"))return"Edge";if(ne(t))return"Firefox";if(t.includes("silk/"))return"Silk";if(ae(t))return"Blackberry";if(ce(t))return"Webos";if(re(t))return"Safari";if((t.includes("chrome/")||ie(t))&&!t.includes("edge/"))return"Chrome";if(oe(t))return"Android";{const t=/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/,n=e.match(t);if(2===(null==n?void 0:n.length))return n[1]}return"Other"}function ne(e=Object(r.q)()){return/firefox\//i.test(e)}function re(e=Object(r.q)()){const t=e.toLowerCase();return t.includes("safari/")&&!t.includes("chrome/")&&!t.includes("crios/")&&!t.includes("android")}function ie(e=Object(r.q)()){return/crios\//i.test(e)}function se(e=Object(r.q)()){return/iemobile/i.test(e)}function oe(e=Object(r.q)()){return/android/i.test(e)}function ae(e=Object(r.q)()){return/blackberry/i.test(e)}function ce(e=Object(r.q)()){return/webos/i.test(e)}function ue(e=Object(r.q)()){return/iphone|ipad|ipod/i.test(e)||/macintosh/i.test(e)&&/mobile/i.test(e)}function le(e=Object(r.q)()){return ue(e)||oe(e)||ce(e)||ae(e)||/windows phone/i.test(e)||se(e)} /** * @license * Copyright 2020 Google LLC @@ -603,7 +637,7 @@ async function(e,t){const n=await M(e,{},async()=>{const n=Object(r.x)({grant_ty * See the License for the specific language governing permissions and * limitations under the License. */ -function le(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.l)());break;case"Worker":n=`${te(Object(r.l)())}-${e}`;break;default:n=e}const s=t.length?t.join(","):"FirebaseCore-web";return`${n}/JsCore/${i.SDK_VERSION}/${s}`} +function he(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.q)());break;case"Worker":n=`${te(Object(r.q)())}-${e}`;break;default:n=e}const s=t.length?t.join(","):"FirebaseCore-web";return`${n}/JsCore/${i.SDK_VERSION}/${s}`} /** * @license * Copyright 2020 Google LLC @@ -619,7 +653,7 @@ function le(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.l)());break;case * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class de{constructor(e,t){this.app=e,this.config=t,this.currentUser=null,this.emulatorConfig=null,this.operations=Promise.resolve(),this.authStateSubscription=new pe(this),this.idTokenSubscription=new pe(this),this.redirectUser=null,this.isProactiveRefreshEnabled=!1,this._canInitEmulator=!0,this._isInitialized=!1,this._deleted=!1,this._initializationPromise=null,this._popupRedirectResolver=null,this._errorFactory=f,this.lastNotifiedUid=void 0,this.languageCode=null,this.tenantId=null,this.settings={appVerificationDisabledForTesting:!1},this.frameworks=[],this.name=e.name,this.clientVersion=t.sdkClientVersion}_initializeWithPersistence(e,t){return t&&(this._popupRedirectResolver=k(t)),this._initializationPromise=this.queue(async()=>{var n,r;if(!this._deleted&&(this.persistenceManager=await ee.create(this,e),!this._deleted)){if(null===(n=this._popupRedirectResolver)||void 0===n?void 0:n._shouldInitProactively)try{await this._popupRedirectResolver._initialize(this)}catch(e){}await this.initializeCurrentUser(t),this.lastNotifiedUid=(null===(r=this.currentUser)||void 0===r?void 0:r.uid)||null,this._deleted||(this._isInitialized=!0)}}),this._initializationPromise}async _onStorageEvent(){if(this._deleted)return;const e=await this.assertedPersistence.getCurrentUser();return this.currentUser||e?this.currentUser&&e&&this.currentUser.uid===e.uid?(this._currentUser._assign(e),void await this.currentUser.getIdToken()):void await this._updateCurrentUser(e):void 0}async initializeCurrentUser(e){var t;let n=await this.assertedPersistence.getCurrentUser();if(e&&this.config.authDomain){await this.getOrInitRedirectPersistenceManager();const r=null===(t=this.redirectUser)||void 0===t?void 0:t._redirectEventId,i=null==n?void 0:n._redirectEventId,s=await this.tryRedirectSignIn(e);r&&r!==i||!(null==s?void 0:s.user)||(n=s.user)}return n?n._redirectEventId?(I(this._popupRedirectResolver,this,"argument-error"),await this.getOrInitRedirectPersistenceManager(),this.redirectUser&&this.redirectUser._redirectEventId===n._redirectEventId?this.directlySetCurrentUser(n):this.reloadAndSetCurrentUserOrClear(n)):this.reloadAndSetCurrentUserOrClear(n):this.directlySetCurrentUser(null)}async tryRedirectSignIn(e){let t=null;try{t=await this._popupRedirectResolver._completeRedirectFn(this,e,!0)}catch(e){await this._setRedirectUser(null)}return t}async reloadAndSetCurrentUserOrClear(e){try{await H(e)}catch(e){if("auth/network-request-failed"!==e.code)return this.directlySetCurrentUser(null)}return this.directlySetCurrentUser(e)}useDeviceLanguage(){this.languageCode=function(){if("undefined"==typeof navigator)return null;const e=navigator;return e.languages&&e.languages[0]||e.language||null}()}async _delete(){this._deleted=!0}async updateCurrentUser(e){const t=e?Object(r.k)(e):null;return t&&I(t.auth.config.apiKey===this.config.apiKey,this,"invalid-user-token"),this._updateCurrentUser(t&&t._clone(this))}async _updateCurrentUser(e){if(!this._deleted)return e&&I(this.tenantId===e.tenantId,this,"tenant-id-mismatch"),this.queue(async()=>{await this.directlySetCurrentUser(e),this.notifyAuthListeners()})}async signOut(){return(this.redirectPersistenceManager||this._popupRedirectResolver)&&await this._setRedirectUser(null),this._updateCurrentUser(null)}setPersistence(e){return this.queue(async()=>{await this.assertedPersistence.setPersistence(k(e))})}_getPersistence(){return this.assertedPersistence.persistence.type}_updateErrorMap(e){this._errorFactory=new r.b("auth","Firebase",e())}onAuthStateChanged(e,t,n){return this.registerStateListener(this.authStateSubscription,e,t,n)}onIdTokenChanged(e,t,n){return this.registerStateListener(this.idTokenSubscription,e,t,n)}toJSON(){var e;return{apiKey:this.config.apiKey,authDomain:this.config.authDomain,appName:this.name,currentUser:null===(e=this._currentUser)||void 0===e?void 0:e.toJSON()}}async _setRedirectUser(e,t){const n=await this.getOrInitRedirectPersistenceManager(t);return null===e?n.removeCurrentUser():n.setCurrentUser(e)}async getOrInitRedirectPersistenceManager(e){if(!this.redirectPersistenceManager){const t=e&&k(e)||this._popupRedirectResolver;I(t,this,"argument-error"),this.redirectPersistenceManager=await ee.create(this,[k(t._redirectPersistence)],"redirectUser"),this.redirectUser=await this.redirectPersistenceManager.getCurrentUser()}return this.redirectPersistenceManager}async _redirectUserForId(e){var t,n;return this._isInitialized&&await this.queue(async()=>{}),(null===(t=this._currentUser)||void 0===t?void 0:t._redirectEventId)===e?this._currentUser:(null===(n=this.redirectUser)||void 0===n?void 0:n._redirectEventId)===e?this.redirectUser:null}async _persistUserIfCurrent(e){if(e===this.currentUser)return this.queue(async()=>this.directlySetCurrentUser(e))}_notifyListenersIfCurrent(e){e===this.currentUser&&this.notifyAuthListeners()}_key(){return`${this.config.authDomain}:${this.config.apiKey}:${this.name}`}_startProactiveRefresh(){this.isProactiveRefreshEnabled=!0,this.currentUser&&this._currentUser._startProactiveRefresh()}_stopProactiveRefresh(){this.isProactiveRefreshEnabled=!1,this.currentUser&&this._currentUser._stopProactiveRefresh()}get _currentUser(){return this.currentUser}notifyAuthListeners(){var e,t;if(!this._isInitialized)return;this.idTokenSubscription.next(this.currentUser);const n=null!==(t=null===(e=this.currentUser)||void 0===e?void 0:e.uid)&&void 0!==t?t:null;this.lastNotifiedUid!==n&&(this.lastNotifiedUid=n,this.authStateSubscription.next(this.currentUser))}registerStateListener(e,t,n,r){if(this._deleted)return()=>{};const i="function"==typeof t?t:t.next.bind(t),s=this._isInitialized?Promise.resolve():this._initializationPromise;return I(s,this,"internal-error"),s.then(()=>i(this.currentUser)),"function"==typeof t?e.addObserver(t,n,r):e.addObserver(t)}async directlySetCurrentUser(e){this.currentUser&&this.currentUser!==e&&(this._currentUser._stopProactiveRefresh(),e&&this.isProactiveRefreshEnabled&&e._startProactiveRefresh()),this.currentUser=e,e?await this.assertedPersistence.setCurrentUser(e):await this.assertedPersistence.removeCurrentUser()}queue(e){return this.operations=this.operations.then(e,e),this.operations}get assertedPersistence(){return I(this.persistenceManager,this,"internal-error"),this.persistenceManager}_logFramework(e){e&&!this.frameworks.includes(e)&&(this.frameworks.push(e),this.frameworks.sort(),this.clientVersion=le(this.config.clientPlatform,this._getFrameworks()))}_getFrameworks(){return this.frameworks}async _getAdditionalHeaders(){const e={"X-Client-Version":this.clientVersion};return this.app.options.appId&&(e["X-Firebase-gmpid"]=this.app.options.appId),e}}function fe(e){return Object(r.k)(e)}class pe{constructor(e){this.auth=e,this.observer=null,this.addObserver=Object(r.g)(e=>this.observer=e)}get next(){return I(this.observer,this.auth,"internal-error"),this.observer.next.bind(this.observer)}}function me(e,t,n){const r=fe(e);I(r._canInitEmulator,r,"emulator-config-failed"),I(/^https?:\/\//.test(t),r,"invalid-emulator-scheme");const i=!!(null==n?void 0:n.disableWarnings),s=ge(t),{host:o,port:a}=function(e){const t=ge(e),n=/(\/\/)?([^?#/]+)/.exec(e.substr(t.length));if(!n)return{host:"",port:null};const r=n[2].split("@").pop()||"",i=/^(\[[^\]]+\])(:|$)/.exec(r);if(i){const e=i[1];return{host:e,port:ye(r.substr(e.length+1))}}{const[e,t]=r.split(":");return{host:e,port:ye(t)}}}(t),c=null===a?"":":"+a;r.config.emulator={url:`${s}//${o}${c}/`},r.settings.appVerificationDisabledForTesting=!0,r.emulatorConfig=Object.freeze({host:o,port:a,protocol:s.replace(":",""),options:Object.freeze({disableWarnings:i})}),i||function(){function e(){const e=document.createElement("p"),t=e.style;e.innerText="Running in emulator mode. Do not use with production credentials.",t.position="fixed",t.width="100%",t.backgroundColor="#ffffff",t.border=".1em solid #000000",t.color="#b50000",t.bottom="0px",t.left="0px",t.margin="0px",t.zIndex="10000",t.textAlign="center",e.classList.add("firebase-emulator-warning"),document.body.appendChild(e)}"undefined"!=typeof console&&"function"==typeof console.info&&console.info("WARNING: You are using the Auth Emulator, which is intended for local testing only. Do not use with production credentials.");"undefined"!=typeof window&&"undefined"!=typeof document&&("loading"===document.readyState?window.addEventListener("DOMContentLoaded",e):e())} + */async function de(e,t){return x(e,"GET","/v2/recaptchaConfig",R(e,t))} /** * @license * Copyright 2020 Google LLC @@ -635,7 +669,7 @@ function le(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.l)());break;case * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */()}function ge(e){const t=e.indexOf(":");return t<0?"":e.substr(0,t+1)}function ye(e){if(!e)return null;const t=Number(e);return isNaN(t)?null:t}class ve{constructor(e,t){this.providerId=e,this.signInMethod=t}toJSON(){return _("not implemented")}_getIdTokenResponse(e){return _("not implemented")}_linkToIdToken(e,t){return _("not implemented")}_getReauthenticationResolver(e){return _("not implemented")}} + */function fe(e){return void 0!==e&&void 0!==e.getResponse}function pe(e){return void 0!==e&&void 0!==e.enterprise}class ge{constructor(e){if(this.siteKey="",this.emailPasswordEnabled=!1,void 0===e.recaptchaKey)throw new Error("recaptchaKey undefined");this.siteKey=e.recaptchaKey.split("/")[3],this.emailPasswordEnabled=e.recaptchaEnforcementState.some(e=>"EMAIL_PASSWORD_PROVIDER"===e.provider&&"OFF"!==e.enforcementState)}} /** * @license * Copyright 2020 Google LLC @@ -651,7 +685,23 @@ function le(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.l)());break;case * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function we(e,t){return x(e,"POST","/v1/accounts:resetPassword",L(e,t))}async function be(e,t){return x(e,"POST","/v1/accounts:update",t)}async function Ie(e,t){return x(e,"POST","/v1/accounts:sendOobCode",L(e,t))} + */function me(e){return new Promise((t,n)=>{const r=document.createElement("script");var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-error");t.customData=e,n(t)},r.type="text/javascript",r.charset="UTF-8",(null!==(s=null===(i=document.getElementsByTagName("head"))||void 0===i?void 0:i[0])&&void 0!==s?s:document).appendChild(r)})}function ye(e){return`__${e}${Math.floor(1e6*Math.random())}`}class ve{constructor(e){this.type="recaptcha-enterprise",this.auth=_e(e)}async verify(e="verify",t=!1){function n(t,n,r){const i=window.grecaptcha;pe(i)?i.enterprise.ready(()=>{i.enterprise.execute(t,{action:e}).then(e=>{n(e)}).catch(()=>{n("NO_RECAPTCHA")})}):r(Error("No reCAPTCHA enterprise script loaded."))}return new Promise((e,r)=>{(async function(e){if(!t){if(null==e.tenantId&&null!=e._agentRecaptchaConfig)return e._agentRecaptchaConfig.siteKey;if(null!=e.tenantId&&void 0!==e._tenantRecaptchaConfigs[e.tenantId])return e._tenantRecaptchaConfigs[e.tenantId].siteKey}return new Promise(async(t,n)=>{de(e,{clientType:"CLIENT_TYPE_WEB",version:"RECAPTCHA_ENTERPRISE"}).then(r=>{if(void 0!==r.recaptchaKey){const n=new ge(r);return null==e.tenantId?e._agentRecaptchaConfig=n:e._tenantRecaptchaConfigs[e.tenantId]=n,t(n.siteKey)}n(new Error("recaptcha Enterprise site key undefined"))}).catch(e=>{n(e)})})})(this.auth).then(i=>{if(!t&&pe(window.grecaptcha))n(i,e,r);else{if("undefined"==typeof window)return void r(new Error("RecaptchaVerifier is only supported in browser"));me("https://www.google.com/recaptcha/enterprise.js?render="+i).then(()=>{n(i,e,r)}).catch(e=>{r(e)})}}).catch(e=>{r(e)})})}}async function we(e,t,n,r=!1){const i=new ve(e);let s;try{s=await i.verify(n)}catch(e){s=await i.verify(n,!0)}const o=Object.assign({},t);return r?Object.assign(o,{captchaResp:s}):Object.assign(o,{captchaResponse:s}),Object.assign(o,{clientType:"CLIENT_TYPE_WEB"}),Object.assign(o,{recaptchaVersion:"RECAPTCHA_ENTERPRISE"}),o} +/** + * @license + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class be{constructor(e){this.auth=e,this.queue=[]}pushCallback(e,t){const n=t=>new Promise((n,r)=>{try{n(e(t))}catch(e){r(e)}});n.onAbort=t,this.queue.push(n);const r=this.queue.length-1;return()=>{this.queue[r]=()=>Promise.resolve()}}async runMiddleware(e){if(this.auth.currentUser===e)return;const t=[];try{for(const n of this.queue)await n(e),n.onAbort&&t.push(n.onAbort)}catch(e){t.reverse();for(const e of t)try{e()}catch(e){}throw this.auth._errorFactory.create("login-blocked",{originalMessage:null==e?void 0:e.message})}}} /** * @license * Copyright 2020 Google LLC @@ -667,8 +717,7 @@ function le(e,t=[]){let n;switch(e){case"Browser":n=te(Object(r.l)());break;case * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -class _e extends ve{constructor(e,t,n,r=null){super("password",n),this._email=e,this._password=t,this._tenantId=r}static _fromEmailAndPassword(e,t){return new _e(e,t,"password")}static _fromEmailAndCode(e,t,n=null){return new _e(e,t,"emailLink",n)}toJSON(){return{email:this._email,password:this._password,signInMethod:this.signInMethod,tenantId:this._tenantId}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e;if((null==t?void 0:t.email)&&(null==t?void 0:t.password)){if("password"===t.signInMethod)return this._fromEmailAndPassword(t.email,t.password);if("emailLink"===t.signInMethod)return this._fromEmailAndCode(t.email,t.password,t.tenantId)}return null}async _getIdTokenResponse(e){switch(this.signInMethod){case"password": + */class Ie{constructor(e,t,n,r){this.app=e,this.heartbeatServiceProvider=t,this.appCheckServiceProvider=n,this.config=r,this.currentUser=null,this.emulatorConfig=null,this.operations=Promise.resolve(),this.authStateSubscription=new Te(this),this.idTokenSubscription=new Te(this),this.beforeStateQueue=new be(this),this.redirectUser=null,this.isProactiveRefreshEnabled=!1,this._canInitEmulator=!0,this._isInitialized=!1,this._deleted=!1,this._initializationPromise=null,this._popupRedirectResolver=null,this._errorFactory=f,this._agentRecaptchaConfig=null,this._tenantRecaptchaConfigs={},this.lastNotifiedUid=void 0,this.languageCode=null,this.tenantId=null,this.settings={appVerificationDisabledForTesting:!1},this.frameworks=[],this.name=e.name,this.clientVersion=r.sdkClientVersion}_initializeWithPersistence(e,t){return t&&(this._popupRedirectResolver=Y(t)),this._initializationPromise=this.queue(async()=>{var n,r;if(!this._deleted&&(this.persistenceManager=await ee.create(this,e),!this._deleted)){if(null===(n=this._popupRedirectResolver)||void 0===n?void 0:n._shouldInitProactively)try{await this._popupRedirectResolver._initialize(this)}catch(e){}await this.initializeCurrentUser(t),this.lastNotifiedUid=(null===(r=this.currentUser)||void 0===r?void 0:r.uid)||null,this._deleted||(this._isInitialized=!0)}}),this._initializationPromise}async _onStorageEvent(){if(this._deleted)return;const e=await this.assertedPersistence.getCurrentUser();return this.currentUser||e?this.currentUser&&e&&this.currentUser.uid===e.uid?(this._currentUser._assign(e),void await this.currentUser.getIdToken()):void await this._updateCurrentUser(e,!0):void 0}async initializeCurrentUser(e){var t;const n=await this.assertedPersistence.getCurrentUser();let r=n,i=!1;if(e&&this.config.authDomain){await this.getOrInitRedirectPersistenceManager();const n=null===(t=this.redirectUser)||void 0===t?void 0:t._redirectEventId,s=null==r?void 0:r._redirectEventId,o=await this.tryRedirectSignIn(e);n&&n!==s||!(null==o?void 0:o.user)||(r=o.user,i=!0)}if(!r)return this.directlySetCurrentUser(null);if(!r._redirectEventId){if(i)try{await this.beforeStateQueue.runMiddleware(r)}catch(e){r=n,this._popupRedirectResolver._overrideRedirectResult(this,()=>Promise.reject(e))}return r?this.reloadAndSetCurrentUserOrClear(r):this.directlySetCurrentUser(null)}return I(this._popupRedirectResolver,this,"argument-error"),await this.getOrInitRedirectPersistenceManager(),this.redirectUser&&this.redirectUser._redirectEventId===r._redirectEventId?this.directlySetCurrentUser(r):this.reloadAndSetCurrentUserOrClear(r)}async tryRedirectSignIn(e){let t=null;try{t=await this._popupRedirectResolver._completeRedirectFn(this,e,!0)}catch(e){await this._setRedirectUser(null)}return t}async reloadAndSetCurrentUserOrClear(e){try{await K(e)}catch(e){if("auth/network-request-failed"!==(null==e?void 0:e.code))return this.directlySetCurrentUser(null)}return this.directlySetCurrentUser(e)}useDeviceLanguage(){this.languageCode=function(){if("undefined"==typeof navigator)return null;const e=navigator;return e.languages&&e.languages[0]||e.language||null}()}async _delete(){this._deleted=!0}async updateCurrentUser(e){const t=e?Object(r.p)(e):null;return t&&I(t.auth.config.apiKey===this.config.apiKey,this,"invalid-user-token"),this._updateCurrentUser(t&&t._clone(this))}async _updateCurrentUser(e,t=!1){if(!this._deleted)return e&&I(this.tenantId===e.tenantId,this,"tenant-id-mismatch"),t||await this.beforeStateQueue.runMiddleware(e),this.queue(async()=>{await this.directlySetCurrentUser(e),this.notifyAuthListeners()})}async signOut(){return await this.beforeStateQueue.runMiddleware(null),(this.redirectPersistenceManager||this._popupRedirectResolver)&&await this._setRedirectUser(null),this._updateCurrentUser(null,!0)}setPersistence(e){return this.queue(async()=>{await this.assertedPersistence.setPersistence(Y(e))})}async initializeRecaptchaConfig(){const e=await de(this,{clientType:"CLIENT_TYPE_WEB",version:"RECAPTCHA_ENTERPRISE"}),t=new ge(e);if(null==this.tenantId?this._agentRecaptchaConfig=t:this._tenantRecaptchaConfigs[this.tenantId]=t,t.emailPasswordEnabled){new ve(this).verify()}}_getRecaptchaConfig(){return null==this.tenantId?this._agentRecaptchaConfig:this._tenantRecaptchaConfigs[this.tenantId]}_getPersistence(){return this.assertedPersistence.persistence.type}_updateErrorMap(e){this._errorFactory=new r.b("auth","Firebase",e())}onAuthStateChanged(e,t,n){return this.registerStateListener(this.authStateSubscription,e,t,n)}beforeAuthStateChanged(e,t){return this.beforeStateQueue.pushCallback(e,t)}onIdTokenChanged(e,t,n){return this.registerStateListener(this.idTokenSubscription,e,t,n)}toJSON(){var e;return{apiKey:this.config.apiKey,authDomain:this.config.authDomain,appName:this.name,currentUser:null===(e=this._currentUser)||void 0===e?void 0:e.toJSON()}}async _setRedirectUser(e,t){const n=await this.getOrInitRedirectPersistenceManager(t);return null===e?n.removeCurrentUser():n.setCurrentUser(e)}async getOrInitRedirectPersistenceManager(e){if(!this.redirectPersistenceManager){const t=e&&Y(e)||this._popupRedirectResolver;I(t,this,"argument-error"),this.redirectPersistenceManager=await ee.create(this,[Y(t._redirectPersistence)],"redirectUser"),this.redirectUser=await this.redirectPersistenceManager.getCurrentUser()}return this.redirectPersistenceManager}async _redirectUserForId(e){var t,n;return this._isInitialized&&await this.queue(async()=>{}),(null===(t=this._currentUser)||void 0===t?void 0:t._redirectEventId)===e?this._currentUser:(null===(n=this.redirectUser)||void 0===n?void 0:n._redirectEventId)===e?this.redirectUser:null}async _persistUserIfCurrent(e){if(e===this.currentUser)return this.queue(async()=>this.directlySetCurrentUser(e))}_notifyListenersIfCurrent(e){e===this.currentUser&&this.notifyAuthListeners()}_key(){return`${this.config.authDomain}:${this.config.apiKey}:${this.name}`}_startProactiveRefresh(){this.isProactiveRefreshEnabled=!0,this.currentUser&&this._currentUser._startProactiveRefresh()}_stopProactiveRefresh(){this.isProactiveRefreshEnabled=!1,this.currentUser&&this._currentUser._stopProactiveRefresh()}get _currentUser(){return this.currentUser}notifyAuthListeners(){var e,t;if(!this._isInitialized)return;this.idTokenSubscription.next(this.currentUser);const n=null!==(t=null===(e=this.currentUser)||void 0===e?void 0:e.uid)&&void 0!==t?t:null;this.lastNotifiedUid!==n&&(this.lastNotifiedUid=n,this.authStateSubscription.next(this.currentUser))}registerStateListener(e,t,n,r){if(this._deleted)return()=>{};const i="function"==typeof t?t:t.next.bind(t),s=this._isInitialized?Promise.resolve():this._initializationPromise;return I(s,this,"internal-error"),s.then(()=>i(this.currentUser)),"function"==typeof t?e.addObserver(t,n,r):e.addObserver(t)}async directlySetCurrentUser(e){this.currentUser&&this.currentUser!==e&&this._currentUser._stopProactiveRefresh(),e&&this.isProactiveRefreshEnabled&&e._startProactiveRefresh(),this.currentUser=e,e?await this.assertedPersistence.setCurrentUser(e):await this.assertedPersistence.removeCurrentUser()}queue(e){return this.operations=this.operations.then(e,e),this.operations}get assertedPersistence(){return I(this.persistenceManager,this,"internal-error"),this.persistenceManager}_logFramework(e){e&&!this.frameworks.includes(e)&&(this.frameworks.push(e),this.frameworks.sort(),this.clientVersion=he(this.config.clientPlatform,this._getFrameworks()))}_getFrameworks(){return this.frameworks}async _getAdditionalHeaders(){var e;const t={"X-Client-Version":this.clientVersion};this.app.options.appId&&(t["X-Firebase-gmpid"]=this.app.options.appId);const n=await(null===(e=this.heartbeatServiceProvider.getImmediate({optional:!0}))||void 0===e?void 0:e.getHeartbeatsHeader());n&&(t["X-Firebase-Client"]=n);const r=await this._getAppCheckToken();return r&&(t["X-Firebase-AppCheck"]=r),t}async _getAppCheckToken(){var e;const t=await(null===(e=this.appCheckServiceProvider.getImmediate({optional:!0}))||void 0===e?void 0:e.getToken());return(null==t?void 0:t.error)&&function(e,...t){p.logLevel<=o.a.WARN&&p.warn(`Auth (${i.SDK_VERSION}): ${e}`,...t)}("Error while retrieving App Check token: "+t.error),null==t?void 0:t.token}}function _e(e){return Object(r.p)(e)}class Te{constructor(e){this.auth=e,this.observer=null,this.addObserver=Object(r.h)(e=>this.observer=e)}get next(){return I(this.observer,this.auth,"internal-error"),this.observer.next.bind(this.observer)}} /** * @license * Copyright 2020 Google LLC @@ -684,8 +733,7 @@ class _e extends ve{constructor(e,t,n,r=null){super("password",n),this._email=e, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -return async function(e,t){return F(e,"POST","/v1/accounts:signInWithPassword",L(e,t))}(e,{returnSecureToken:!0,email:this._email,password:this._password});case"emailLink": + */function Ee(e,t,n){const r=_e(e);I(r._canInitEmulator,r,"emulator-config-failed"),I(/^https?:\/\//.test(t),r,"invalid-emulator-scheme");const i=!!(null==n?void 0:n.disableWarnings),s=Se(t),{host:o,port:a}=function(e){const t=Se(e),n=/(\/\/)?([^?#/]+)/.exec(e.substr(t.length));if(!n)return{host:"",port:null};const r=n[2].split("@").pop()||"",i=/^(\[[^\]]+\])(:|$)/.exec(r);if(i){const e=i[1];return{host:e,port:ke(r.substr(e.length+1))}}{const[e,t]=r.split(":");return{host:e,port:ke(t)}}}(t),c=null===a?"":":"+a;r.config.emulator={url:`${s}//${o}${c}/`},r.settings.appVerificationDisabledForTesting=!0,r.emulatorConfig=Object.freeze({host:o,port:a,protocol:s.replace(":",""),options:Object.freeze({disableWarnings:i})}),i||function(){function e(){const e=document.createElement("p"),t=e.style;e.innerText="Running in emulator mode. Do not use with production credentials.",t.position="fixed",t.width="100%",t.backgroundColor="#ffffff",t.border=".1em solid #000000",t.color="#b50000",t.bottom="0px",t.left="0px",t.margin="0px",t.zIndex="10000",t.textAlign="center",e.classList.add("firebase-emulator-warning"),document.body.appendChild(e)}"undefined"!=typeof console&&"function"==typeof console.info&&console.info("WARNING: You are using the Auth Emulator, which is intended for local testing only. Do not use with production credentials.");"undefined"!=typeof window&&"undefined"!=typeof document&&("loading"===document.readyState?window.addEventListener("DOMContentLoaded",e):e())} /** * @license * Copyright 2020 Google LLC @@ -701,8 +749,7 @@ return async function(e,t){return F(e,"POST","/v1/accounts:signInWithPassword",L * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink",L(e,t))}(e,{email:this._email,oobCode:this._password});default:g(e,"internal-error")}}async _linkToIdToken(e,t){switch(this.signInMethod){case"password":return be(e,{idToken:t,returnSecureToken:!0,email:this._email,password:this._password});case"emailLink":return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink",L(e,t))}(e,{idToken:t,email:this._email,oobCode:this._password});default:g(e,"internal-error")}}_getReauthenticationResolver(e){return this._getIdTokenResponse(e)}} + */()}function Se(e){const t=e.indexOf(":");return t<0?"":e.substr(0,t+1)}function ke(e){if(!e)return null;const t=Number(e);return isNaN(t)?null:t}class Ce{constructor(e,t){this.providerId=e,this.signInMethod=t}toJSON(){return _("not implemented")}_getIdTokenResponse(e){return _("not implemented")}_linkToIdToken(e,t){return _("not implemented")}_getReauthenticationResolver(e){return _("not implemented")}} /** * @license * Copyright 2020 Google LLC @@ -718,7 +765,7 @@ return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink", * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function Te(e,t){return F(e,"POST","/v1/accounts:signInWithIdp",L(e,t))} + */async function Ae(e,t){return x(e,"POST","/v1/accounts:resetPassword",R(e,t))}async function Ne(e,t){return x(e,"POST","/v1/accounts:update",t)} /** * @license * Copyright 2020 Google LLC @@ -734,7 +781,8 @@ return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink", * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ee extends ve{constructor(){super(...arguments),this.pendingToken=null}static _fromParams(e){const t=new Ee(e.providerId,e.signInMethod);return e.idToken||e.accessToken?(e.idToken&&(t.idToken=e.idToken),e.accessToken&&(t.accessToken=e.accessToken),e.nonce&&!e.pendingToken&&(t.nonce=e.nonce),e.pendingToken&&(t.pendingToken=e.pendingToken)):e.oauthToken&&e.oauthTokenSecret?(t.accessToken=e.oauthToken,t.secret=e.oauthTokenSecret):g("argument-error"),t}toJSON(){return{idToken:this.idToken,accessToken:this.accessToken,secret:this.secret,nonce:this.nonce,pendingToken:this.pendingToken,providerId:this.providerId,signInMethod:this.signInMethod}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e,{providerId:n,signInMethod:r}=t,i=s(t,["providerId","signInMethod"]);if(!n||!r)return null;const o=new Ee(n,r);return o.idToken=i.idToken||void 0,o.accessToken=i.accessToken||void 0,o.secret=i.secret,o.nonce=i.nonce,o.pendingToken=i.pendingToken||null,o}_getIdTokenResponse(e){return Te(e,this.buildRequest())}_linkToIdToken(e,t){const n=this.buildRequest();return n.idToken=t,Te(e,n)}_getReauthenticationResolver(e){const t=this.buildRequest();return t.autoCreate=!1,Te(e,t)}buildRequest(){const e={requestUri:"http://localhost",returnSecureToken:!0};if(this.pendingToken)e.pendingToken=this.pendingToken;else{const t={};this.idToken&&(t.id_token=this.idToken),this.accessToken&&(t.access_token=this.accessToken),this.secret&&(t.oauth_token_secret=this.secret),t.providerId=this.providerId,this.nonce&&!this.pendingToken&&(t.nonce=this.nonce),e.postBody=Object(r.x)(t)}return e}} + */ +async function De(e,t){return L(e,"POST","/v1/accounts:signInWithPassword",R(e,t))}async function Oe(e,t){return x(e,"POST","/v1/accounts:sendOobCode",R(e,t))}async function Re(e,t){return Oe(e,t)}async function xe(e,t){return Oe(e,t)} /** * @license * Copyright 2020 Google LLC @@ -750,7 +798,8 @@ return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink", * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const ke={USER_NOT_FOUND:"user-not-found"}; + */ +class Pe extends Ce{constructor(e,t,n,r=null){super("password",n),this._email=e,this._password=t,this._tenantId=r}static _fromEmailAndPassword(e,t){return new Pe(e,t,"password")}static _fromEmailAndCode(e,t,n=null){return new Pe(e,t,"emailLink",n)}toJSON(){return{email:this._email,password:this._password,signInMethod:this.signInMethod,tenantId:this._tenantId}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e;if((null==t?void 0:t.email)&&(null==t?void 0:t.password)){if("password"===t.signInMethod)return this._fromEmailAndPassword(t.email,t.password);if("emailLink"===t.signInMethod)return this._fromEmailAndCode(t.email,t.password,t.tenantId)}return null}async _getIdTokenResponse(e){var t;switch(this.signInMethod){case"password":const n={returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"};if(null===(t=e._getRecaptchaConfig())||void 0===t?void 0:t.emailPasswordEnabled){const t=await we(e,n,"signInWithPassword");return De(e,t)}return De(e,n).catch(async t=>{if("auth/missing-recaptcha-token"===t.code){console.log("Sign-in with email address and password is protected by reCAPTCHA for this project. Automatically triggering the reCAPTCHA flow and restarting the sign-in flow.");const t=await we(e,n,"signInWithPassword");return De(e,t)}return Promise.reject(t)});case"emailLink": /** * @license * Copyright 2020 Google LLC @@ -767,7 +816,7 @@ return async function(e,t){return F(e,"POST","/v1/accounts:signInWithEmailLink", * See the License for the specific language governing permissions and * limitations under the License. */ -class Se extends ve{constructor(e){super("phone","phone"),this.params=e}static _fromVerification(e,t){return new Se({verificationId:e,verificationCode:t})}static _fromTokenResponse(e,t){return new Se({phoneNumber:e,temporaryProof:t})}_getIdTokenResponse(e){return async function(e,t){return F(e,"POST","/v1/accounts:signInWithPhoneNumber",L(e,t))}(e,this._makeVerificationRequest())}_linkToIdToken(e,t){return async function(e,t){const n=await F(e,"POST","/v1/accounts:signInWithPhoneNumber",L(e,t));if(n.temporaryProof)throw V(e,"account-exists-with-different-credential",n);return n}(e,Object.assign({idToken:t},this._makeVerificationRequest()))}_getReauthenticationResolver(e){return async function(e,t){return F(e,"POST","/v1/accounts:signInWithPhoneNumber",L(e,Object.assign(Object.assign({},t),{operation:"REAUTH"})),ke)}(e,this._makeVerificationRequest())}_makeVerificationRequest(){const{temporaryProof:e,phoneNumber:t,verificationId:n,verificationCode:r}=this.params;return e&&t?{temporaryProof:e,phoneNumber:t}:{sessionInfo:n,code:r}}toJSON(){const e={providerId:this.providerId};return this.params.phoneNumber&&(e.phoneNumber=this.params.phoneNumber),this.params.temporaryProof&&(e.temporaryProof=this.params.temporaryProof),this.params.verificationCode&&(e.verificationCode=this.params.verificationCode),this.params.verificationId&&(e.verificationId=this.params.verificationId),e}static fromJSON(e){"string"==typeof e&&(e=JSON.parse(e));const{verificationId:t,verificationCode:n,phoneNumber:r,temporaryProof:i}=e;return n||t||r||i?new Se({verificationId:t,verificationCode:n,phoneNumber:r,temporaryProof:i}):null}} +return async function(e,t){return L(e,"POST","/v1/accounts:signInWithEmailLink",R(e,t))}(e,{email:this._email,oobCode:this._password});default:m(e,"internal-error")}}async _linkToIdToken(e,t){switch(this.signInMethod){case"password":return Ne(e,{idToken:t,returnSecureToken:!0,email:this._email,password:this._password});case"emailLink":return async function(e,t){return L(e,"POST","/v1/accounts:signInWithEmailLink",R(e,t))}(e,{idToken:t,email:this._email,oobCode:this._password});default:m(e,"internal-error")}}_getReauthenticationResolver(e){return this._getIdTokenResponse(e)}} /** * @license * Copyright 2020 Google LLC @@ -783,7 +832,7 @@ class Se extends ve{constructor(e){super("phone","phone"),this.params=e}static _ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ae{constructor(e){var t,n,i,s,o,a;const c=Object(r.y)(Object(r.j)(e)),u=null!==(t=c.apiKey)&&void 0!==t?t:null,h=null!==(n=c.oobCode)&&void 0!==n?n:null,l=function(e){switch(e){case"recoverEmail":return"RECOVER_EMAIL";case"resetPassword":return"PASSWORD_RESET";case"signIn":return"EMAIL_SIGNIN";case"verifyEmail":return"VERIFY_EMAIL";case"verifyAndChangeEmail":return"VERIFY_AND_CHANGE_EMAIL";case"revertSecondFactorAddition":return"REVERT_SECOND_FACTOR_ADDITION";default:return null}}(null!==(i=c.mode)&&void 0!==i?i:null);I(u&&h&&l,"argument-error"),this.apiKey=u,this.operation=l,this.code=h,this.continueUrl=null!==(s=c.continueUrl)&&void 0!==s?s:null,this.languageCode=null!==(o=c.languageCode)&&void 0!==o?o:null,this.tenantId=null!==(a=c.tenantId)&&void 0!==a?a:null}static parseLink(e){const t=function(e){const t=Object(r.y)(Object(r.j)(e)).link,n=t?Object(r.y)(Object(r.j)(t)).deep_link_id:null,i=Object(r.y)(Object(r.j)(e)).deep_link_id;return(i?Object(r.y)(Object(r.j)(i)).link:null)||i||n||t||e}(e);try{return new Ae(t)}catch(e){return null}}} + */async function Le(e,t){return L(e,"POST","/v1/accounts:signInWithIdp",R(e,t))} /** * @license * Copyright 2020 Google LLC @@ -799,8 +848,7 @@ class Se extends ve{constructor(e){super("phone","phone"),this.params=e}static _ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -class Ne{constructor(){this.providerId=Ne.PROVIDER_ID}static credential(e,t){return _e._fromEmailAndPassword(e,t)}static credentialWithLink(e,t){const n=Ae.parseLink(t);return I(n,"argument-error"),_e._fromEmailAndCode(e,n.code,n.tenantId)}}Ne.PROVIDER_ID="password",Ne.EMAIL_PASSWORD_SIGN_IN_METHOD="password",Ne.EMAIL_LINK_SIGN_IN_METHOD="emailLink"; + */class Me extends Ce{constructor(){super(...arguments),this.pendingToken=null}static _fromParams(e){const t=new Me(e.providerId,e.signInMethod);return e.idToken||e.accessToken?(e.idToken&&(t.idToken=e.idToken),e.accessToken&&(t.accessToken=e.accessToken),e.nonce&&!e.pendingToken&&(t.nonce=e.nonce),e.pendingToken&&(t.pendingToken=e.pendingToken)):e.oauthToken&&e.oauthTokenSecret?(t.accessToken=e.oauthToken,t.secret=e.oauthTokenSecret):m("argument-error"),t}toJSON(){return{idToken:this.idToken,accessToken:this.accessToken,secret:this.secret,nonce:this.nonce,pendingToken:this.pendingToken,providerId:this.providerId,signInMethod:this.signInMethod}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e,{providerId:n,signInMethod:r}=t,i=s(t,["providerId","signInMethod"]);if(!n||!r)return null;const o=new Me(n,r);return o.idToken=i.idToken||void 0,o.accessToken=i.accessToken||void 0,o.secret=i.secret,o.nonce=i.nonce,o.pendingToken=i.pendingToken||null,o}_getIdTokenResponse(e){return Le(e,this.buildRequest())}_linkToIdToken(e,t){const n=this.buildRequest();return n.idToken=t,Le(e,n)}_getReauthenticationResolver(e){const t=this.buildRequest();return t.autoCreate=!1,Le(e,t)}buildRequest(){const e={requestUri:"http://localhost",returnSecureToken:!0};if(this.pendingToken)e.pendingToken=this.pendingToken;else{const t={};this.idToken&&(t.id_token=this.idToken),this.accessToken&&(t.access_token=this.accessToken),this.secret&&(t.oauth_token_secret=this.secret),t.providerId=this.providerId,this.nonce&&!this.pendingToken&&(t.nonce=this.nonce),e.postBody=Object(r.A)(t)}return e}} /** * @license * Copyright 2020 Google LLC @@ -816,11 +864,10 @@ class Ne{constructor(){this.providerId=Ne.PROVIDER_ID}static credential(e,t){ret * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -class Oe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.customParameters={}}setDefaultLanguage(e){this.defaultLanguageCode=e}setCustomParameters(e){return this.customParameters=e,this}getCustomParameters(){return this.customParameters}} + */const Fe={USER_NOT_FOUND:"user-not-found"}; /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -833,7 +880,8 @@ class Oe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.cus * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ce extends Oe{constructor(){super(...arguments),this.scopes=[]}addScope(e){return this.scopes.includes(e)||this.scopes.push(e),this}getScopes(){return[...this.scopes]}}class De extends Ce{static credentialFromJSON(e){const t="string"==typeof e?JSON.parse(e):e;return I("providerId"in t&&"signInMethod"in t,"argument-error"),Ee._fromParams(t)}credential(e){return this._credential(Object.assign(Object.assign({},e),{nonce:e.rawNonce}))}_credential(e){return I(e.idToken||e.accessToken,"argument-error"),Ee._fromParams(Object.assign(Object.assign({},e),{providerId:this.providerId,signInMethod:this.providerId}))}static credentialFromResult(e){return De.oauthCredentialFromTaggedObject(e)}static credentialFromError(e){return De.oauthCredentialFromTaggedObject(e.customData||{})}static oauthCredentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthIdToken:t,oauthAccessToken:n,oauthTokenSecret:r,pendingToken:i,nonce:s,providerId:o}=e;if(!(n||r||t||i))return null;if(!o)return null;try{return new De(o)._credential({idToken:t,accessToken:n,nonce:s,pendingToken:i})}catch(e){return null}}} + */ +class Ve extends Ce{constructor(e){super("phone","phone"),this.params=e}static _fromVerification(e,t){return new Ve({verificationId:e,verificationCode:t})}static _fromTokenResponse(e,t){return new Ve({phoneNumber:e,temporaryProof:t})}_getIdTokenResponse(e){return async function(e,t){return L(e,"POST","/v1/accounts:signInWithPhoneNumber",R(e,t))}(e,this._makeVerificationRequest())}_linkToIdToken(e,t){return async function(e,t){const n=await L(e,"POST","/v1/accounts:signInWithPhoneNumber",R(e,t));if(n.temporaryProof)throw V(e,"account-exists-with-different-credential",n);return n}(e,Object.assign({idToken:t},this._makeVerificationRequest()))}_getReauthenticationResolver(e){return async function(e,t){return L(e,"POST","/v1/accounts:signInWithPhoneNumber",R(e,Object.assign(Object.assign({},t),{operation:"REAUTH"})),Fe)}(e,this._makeVerificationRequest())}_makeVerificationRequest(){const{temporaryProof:e,phoneNumber:t,verificationId:n,verificationCode:r}=this.params;return e&&t?{temporaryProof:e,phoneNumber:t}:{sessionInfo:n,code:r}}toJSON(){const e={providerId:this.providerId};return this.params.phoneNumber&&(e.phoneNumber=this.params.phoneNumber),this.params.temporaryProof&&(e.temporaryProof=this.params.temporaryProof),this.params.verificationCode&&(e.verificationCode=this.params.verificationCode),this.params.verificationId&&(e.verificationId=this.params.verificationId),e}static fromJSON(e){"string"==typeof e&&(e=JSON.parse(e));const{verificationId:t,verificationCode:n,phoneNumber:r,temporaryProof:i}=e;return n||t||r||i?new Ve({verificationId:t,verificationCode:n,phoneNumber:r,temporaryProof:i}):null}} /** * @license * Copyright 2020 Google LLC @@ -849,7 +897,7 @@ class Oe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.cus * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Re extends Ce{constructor(){super("facebook.com")}static credential(e){return Ee._fromParams({providerId:Re.PROVIDER_ID,signInMethod:Re.FACEBOOK_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return Re.credentialFromTaggedObject(e)}static credentialFromError(e){return Re.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null;if(!e.oauthAccessToken)return null;try{return Re.credential(e.oauthAccessToken)}catch(e){return null}}}Re.FACEBOOK_SIGN_IN_METHOD="facebook.com",Re.PROVIDER_ID="facebook.com"; + */class je{constructor(e){var t,n,i,s,o,a;const c=Object(r.B)(Object(r.k)(e)),u=null!==(t=c.apiKey)&&void 0!==t?t:null,l=null!==(n=c.oobCode)&&void 0!==n?n:null,h=function(e){switch(e){case"recoverEmail":return"RECOVER_EMAIL";case"resetPassword":return"PASSWORD_RESET";case"signIn":return"EMAIL_SIGNIN";case"verifyEmail":return"VERIFY_EMAIL";case"verifyAndChangeEmail":return"VERIFY_AND_CHANGE_EMAIL";case"revertSecondFactorAddition":return"REVERT_SECOND_FACTOR_ADDITION";default:return null}}(null!==(i=c.mode)&&void 0!==i?i:null);I(u&&l&&h,"argument-error"),this.apiKey=u,this.operation=h,this.code=l,this.continueUrl=null!==(s=c.continueUrl)&&void 0!==s?s:null,this.languageCode=null!==(o=c.languageCode)&&void 0!==o?o:null,this.tenantId=null!==(a=c.tenantId)&&void 0!==a?a:null}static parseLink(e){const t=function(e){const t=Object(r.B)(Object(r.k)(e)).link,n=t?Object(r.B)(Object(r.k)(t)).deep_link_id:null,i=Object(r.B)(Object(r.k)(e)).deep_link_id;return(i?Object(r.B)(Object(r.k)(i)).link:null)||i||n||t||e}(e);try{return new je(t)}catch(e){return null}}} /** * @license * Copyright 2020 Google LLC @@ -866,7 +914,7 @@ class Oe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.cus * See the License for the specific language governing permissions and * limitations under the License. */ -class Pe extends Ce{constructor(){super("google.com"),this.addScope("profile")}static credential(e,t){return Ee._fromParams({providerId:Pe.PROVIDER_ID,signInMethod:Pe.GOOGLE_SIGN_IN_METHOD,idToken:e,accessToken:t})}static credentialFromResult(e){return Pe.credentialFromTaggedObject(e)}static credentialFromError(e){return Pe.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthIdToken:t,oauthAccessToken:n}=e;if(!t&&!n)return null;try{return Pe.credential(t,n)}catch(e){return null}}}Pe.GOOGLE_SIGN_IN_METHOD="google.com",Pe.PROVIDER_ID="google.com"; +class Ue{constructor(){this.providerId=Ue.PROVIDER_ID}static credential(e,t){return Pe._fromEmailAndPassword(e,t)}static credentialWithLink(e,t){const n=je.parseLink(t);return I(n,"argument-error"),Pe._fromEmailAndCode(e,n.code,n.tenantId)}}Ue.PROVIDER_ID="password",Ue.EMAIL_PASSWORD_SIGN_IN_METHOD="password",Ue.EMAIL_LINK_SIGN_IN_METHOD="emailLink"; /** * @license * Copyright 2020 Google LLC @@ -883,10 +931,10 @@ class Pe extends Ce{constructor(){super("google.com"),this.addScope("profile")}s * See the License for the specific language governing permissions and * limitations under the License. */ -class Le extends Ce{constructor(){super("github.com")}static credential(e){return Ee._fromParams({providerId:Le.PROVIDER_ID,signInMethod:Le.GITHUB_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return Le.credentialFromTaggedObject(e)}static credentialFromError(e){return Le.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null;if(!e.oauthAccessToken)return null;try{return Le.credential(e.oauthAccessToken)}catch(e){return null}}}Le.GITHUB_SIGN_IN_METHOD="github.com",Le.PROVIDER_ID="github.com";class xe extends ve{constructor(e,t){super(e,e),this.pendingToken=t}_getIdTokenResponse(e){return Te(e,this.buildRequest())}_linkToIdToken(e,t){const n=this.buildRequest();return n.idToken=t,Te(e,n)}_getReauthenticationResolver(e){const t=this.buildRequest();return t.autoCreate=!1,Te(e,t)}toJSON(){return{signInMethod:this.signInMethod,providerId:this.providerId,pendingToken:this.pendingToken}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e,{providerId:n,signInMethod:r,pendingToken:i}=t;return n&&r&&i&&n===r?new xe(n,i):null}static _create(e,t){return new xe(e,t)}buildRequest(){return{requestUri:"http://localhost",returnSecureToken:!0,pendingToken:this.pendingToken}}} +class qe{constructor(e){this.providerId=e,this.defaultLanguageCode=null,this.customParameters={}}setDefaultLanguage(e){this.defaultLanguageCode=e}setCustomParameters(e){return this.customParameters=e,this}getCustomParameters(){return this.customParameters}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -899,7 +947,7 @@ class Le extends Ce{constructor(){super("github.com")}static credential(e){retur * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Me extends Oe{constructor(e){I(e.startsWith("saml."),"argument-error"),super(e)}static credentialFromResult(e){return Me.samlCredentialFromTaggedObject(e)}static credentialFromError(e){return Me.samlCredentialFromTaggedObject(e.customData||{})}static credentialFromJSON(e){const t=xe.fromJSON(e);return I(t,"argument-error"),t}static samlCredentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{pendingToken:t,providerId:n}=e;if(!t||!n)return null;try{return xe._create(n,t)}catch(e){return null}}} + */class Be extends qe{constructor(){super(...arguments),this.scopes=[]}addScope(e){return this.scopes.includes(e)||this.scopes.push(e),this}getScopes(){return[...this.scopes]}}class ze extends Be{static credentialFromJSON(e){const t="string"==typeof e?JSON.parse(e):e;return I("providerId"in t&&"signInMethod"in t,"argument-error"),Me._fromParams(t)}credential(e){return this._credential(Object.assign(Object.assign({},e),{nonce:e.rawNonce}))}_credential(e){return I(e.idToken||e.accessToken,"argument-error"),Me._fromParams(Object.assign(Object.assign({},e),{providerId:this.providerId,signInMethod:this.providerId}))}static credentialFromResult(e){return ze.oauthCredentialFromTaggedObject(e)}static credentialFromError(e){return ze.oauthCredentialFromTaggedObject(e.customData||{})}static oauthCredentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthIdToken:t,oauthAccessToken:n,oauthTokenSecret:r,pendingToken:i,nonce:s,providerId:o}=e;if(!(n||r||t||i))return null;if(!o)return null;try{return new ze(o)._credential({idToken:t,accessToken:n,nonce:s,pendingToken:i})}catch(e){return null}}} /** * @license * Copyright 2020 Google LLC @@ -915,7 +963,7 @@ class Le extends Ce{constructor(){super("github.com")}static credential(e){retur * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Fe extends Ce{constructor(){super("twitter.com")}static credential(e,t){return Ee._fromParams({providerId:Fe.PROVIDER_ID,signInMethod:Fe.TWITTER_SIGN_IN_METHOD,oauthToken:e,oauthTokenSecret:t})}static credentialFromResult(e){return Fe.credentialFromTaggedObject(e)}static credentialFromError(e){return Fe.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthAccessToken:t,oauthTokenSecret:n}=e;if(!t||!n)return null;try{return Fe.credential(t,n)}catch(e){return null}}} + */class Ge extends Be{constructor(){super("facebook.com")}static credential(e){return Me._fromParams({providerId:Ge.PROVIDER_ID,signInMethod:Ge.FACEBOOK_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return Ge.credentialFromTaggedObject(e)}static credentialFromError(e){return Ge.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null;if(!e.oauthAccessToken)return null;try{return Ge.credential(e.oauthAccessToken)}catch(e){return null}}}Ge.FACEBOOK_SIGN_IN_METHOD="facebook.com",Ge.PROVIDER_ID="facebook.com"; /** * @license * Copyright 2020 Google LLC @@ -932,7 +980,7 @@ class Le extends Ce{constructor(){super("github.com")}static credential(e){retur * See the License for the specific language governing permissions and * limitations under the License. */ -async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} +class Ke extends Be{constructor(){super("google.com"),this.addScope("profile")}static credential(e,t){return Me._fromParams({providerId:Ke.PROVIDER_ID,signInMethod:Ke.GOOGLE_SIGN_IN_METHOD,idToken:e,accessToken:t})}static credentialFromResult(e){return Ke.credentialFromTaggedObject(e)}static credentialFromError(e){return Ke.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthIdToken:t,oauthAccessToken:n}=e;if(!t&&!n)return null;try{return Ke.credential(t,n)}catch(e){return null}}}Ke.GOOGLE_SIGN_IN_METHOD="google.com",Ke.PROVIDER_ID="google.com"; /** * @license * Copyright 2020 Google LLC @@ -948,7 +996,8 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */Fe.TWITTER_SIGN_IN_METHOD="twitter.com",Fe.PROVIDER_ID="twitter.com";class Ue{constructor(e){this.user=e.user,this.providerId=e.providerId,this._tokenResponse=e._tokenResponse,this.operationType=e.operationType}static async _fromIdTokenResponse(e,t,n,r=!1){const i=await J._fromIdTokenResponse(e,n,r),s=Ve(n);return new Ue({user:i,providerId:s,_tokenResponse:n,operationType:t})}static async _forOperation(e,t,n){await e._updateTokensIfNecessary(n,!0);const r=Ve(n);return new Ue({user:e,providerId:r,_tokenResponse:n,operationType:t})}}function Ve(e){return e.providerId?e.providerId:"phoneNumber"in e?"phone":null} + */ +class $e extends Be{constructor(){super("github.com")}static credential(e){return Me._fromParams({providerId:$e.PROVIDER_ID,signInMethod:$e.GITHUB_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return $e.credentialFromTaggedObject(e)}static credentialFromError(e){return $e.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null;if(!e.oauthAccessToken)return null;try{return $e.credential(e.oauthAccessToken)}catch(e){return null}}}$e.GITHUB_SIGN_IN_METHOD="github.com",$e.PROVIDER_ID="github.com";class We extends Ce{constructor(e,t){super(e,e),this.pendingToken=t}_getIdTokenResponse(e){return Le(e,this.buildRequest())}_linkToIdToken(e,t){const n=this.buildRequest();return n.idToken=t,Le(e,n)}_getReauthenticationResolver(e){const t=this.buildRequest();return t.autoCreate=!1,Le(e,t)}toJSON(){return{signInMethod:this.signInMethod,providerId:this.providerId,pendingToken:this.pendingToken}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e,{providerId:n,signInMethod:r,pendingToken:i}=t;return n&&r&&i&&n===r?new We(n,i):null}static _create(e,t){return new We(e,t)}buildRequest(){return{requestUri:"http://localhost",returnSecureToken:!0,pendingToken:this.pendingToken}}} /** * @license * Copyright 2020 Google LLC @@ -964,7 +1013,7 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function qe(e){var t;const n=fe(e);if(await n._initializationPromise,null===(t=n.currentUser)||void 0===t?void 0:t.isAnonymous)return new Ue({user:n.currentUser,providerId:null,operationType:"signIn"});const r=await je(n,{returnSecureToken:!0}),i=await Ue._fromIdTokenResponse(n,"signIn",r,!0);return await n._updateCurrentUser(i.user),i} + */class He extends qe{constructor(e){I(e.startsWith("saml."),"argument-error"),super(e)}static credentialFromResult(e){return He.samlCredentialFromTaggedObject(e)}static credentialFromError(e){return He.samlCredentialFromTaggedObject(e.customData||{})}static credentialFromJSON(e){const t=We.fromJSON(e);return I(t,"argument-error"),t}static samlCredentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{pendingToken:t,providerId:n}=e;if(!t||!n)return null;try{return We._create(n,t)}catch(e){return null}}} /** * @license * Copyright 2020 Google LLC @@ -980,7 +1029,7 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Be extends r.c{constructor(e,t,n,r){var i;super(t.code,t.message),this.operationType=n,this.user=r,Object.setPrototypeOf(this,Be.prototype),this.customData={appName:e.name,tenantId:null!==(i=e.tenantId)&&void 0!==i?i:void 0,_serverResponse:t.customData._serverResponse,operationType:n}}static _fromErrorAndOperation(e,t,n,r){return new Be(e,t,n,r)}}function ze(e,t,n,r){return("reauthenticate"===t?n._getReauthenticationResolver(e):n._getIdTokenResponse(e)).catch(n=>{if("auth/multi-factor-auth-required"===n.code)throw Be._fromErrorAndOperation(e,n,t,r);throw n})} + */class Qe extends Be{constructor(){super("twitter.com")}static credential(e,t){return Me._fromParams({providerId:Qe.PROVIDER_ID,signInMethod:Qe.TWITTER_SIGN_IN_METHOD,oauthToken:e,oauthTokenSecret:t})}static credentialFromResult(e){return Qe.credentialFromTaggedObject(e)}static credentialFromError(e){return Qe.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{oauthAccessToken:t,oauthTokenSecret:n}=e;if(!t||!n)return null;try{return Qe.credential(t,n)}catch(e){return null}}} /** * @license * Copyright 2020 Google LLC @@ -996,10 +1045,11 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Ke(e){return new Set(e.map(({providerId:e})=>e).filter(e=>!!e))} + */ +async function Ye(e,t){return L(e,"POST","/v1/accounts:signUp",R(e,t))} /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1012,10 +1062,10 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function We(e,t){const n=Object(r.k)(e);await He(!0,n,t);const{providerUserInfo:i}=await async function(e,t){return x(e,"POST","/v1/accounts:update",t)}(n.auth,{idToken:await n.getIdToken(),deleteProvider:[t]}),s=Ke(i||[]);return n.providerData=n.providerData.filter(e=>s.has(e.providerId)),s.has("phone")||(n.phoneNumber=null),await n.auth._persistUserIfCurrent(n),n}async function Ge(e,t,n=!1){const r=await K(e,t._linkToIdToken(e.auth,await e.getIdToken()),n);return Ue._forOperation(e,"link",r)}async function He(e,t,n){await H(t);const r=!1===e?"provider-already-linked":"no-such-provider";I(Ke(t.providerData).has(n)===e,t.auth,r)} + */Qe.TWITTER_SIGN_IN_METHOD="twitter.com",Qe.PROVIDER_ID="twitter.com";class Je{constructor(e){this.user=e.user,this.providerId=e.providerId,this._tokenResponse=e._tokenResponse,this.operationType=e.operationType}static async _fromIdTokenResponse(e,t,n,r=!1){const i=await H._fromIdTokenResponse(e,n,r),s=Xe(n);return new Je({user:i,providerId:s,_tokenResponse:n,operationType:t})}static async _forOperation(e,t,n){await e._updateTokensIfNecessary(n,!0);const r=Xe(n);return new Je({user:e,providerId:r,_tokenResponse:n,operationType:t})}}function Xe(e){return e.providerId?e.providerId:"phoneNumber"in e?"phone":null} /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1028,7 +1078,7 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function $e(e,t,n=!1){const{auth:r}=e;try{const i=await K(e,ze(r,"reauthenticate",t,e),n);I(i.idToken,r,"internal-error");const s=z(i.idToken);I(s,r,"internal-error");const{sub:o}=s;return I(e.uid===o,r,"user-mismatch"),Ue._forOperation(e,"reauthenticate",i)}catch(e){throw"auth/user-not-found"===(null==e?void 0:e.code)&&g(r,"user-mismatch"),e}} + */async function Ze(e){var t;const n=_e(e);if(await n._initializationPromise,null===(t=n.currentUser)||void 0===t?void 0:t.isAnonymous)return new Je({user:n.currentUser,providerId:null,operationType:"signIn"});const r=await Ye(n,{returnSecureToken:!0}),i=await Je._fromIdTokenResponse(n,"signIn",r,!0);return await n._updateCurrentUser(i.user),i} /** * @license * Copyright 2020 Google LLC @@ -1044,7 +1094,7 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function Qe(e,t,n=!1){const r=await ze(e,"signIn",t),i=await Ue._fromIdTokenResponse(e,"signIn",r);return n||await e._updateCurrentUser(i.user),i}async function Je(e,t){return Qe(fe(e),t)}async function Ye(e,t){const n=Object(r.k)(e);return await He(!1,n,t.providerId),Ge(n,t)}async function Xe(e,t){return $e(Object(r.k)(e),t)} + */class et extends r.c{constructor(e,t,n,r){var i;super(t.code,t.message),this.operationType=n,this.user=r,Object.setPrototypeOf(this,et.prototype),this.customData={appName:e.name,tenantId:null!==(i=e.tenantId)&&void 0!==i?i:void 0,_serverResponse:t.customData._serverResponse,operationType:n}}static _fromErrorAndOperation(e,t,n,r){return new et(e,t,n,r)}}function tt(e,t,n,r){return("reauthenticate"===t?n._getReauthenticationResolver(e):n._getIdTokenResponse(e)).catch(n=>{if("auth/multi-factor-auth-required"===n.code)throw et._fromErrorAndOperation(e,n,t,r);throw n})} /** * @license * Copyright 2020 Google LLC @@ -1060,10 +1110,10 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */function nt(e){return new Set(e.map(({providerId:e})=>e).filter(e=>!!e))} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1076,11 +1126,10 @@ async function je(e,t){return F(e,"POST","/v1/accounts:signUp",L(e,t))} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POST","/v1/accounts:signInWithCustomToken",L(e,t))}(n,{token:t,returnSecureToken:!0}),i=await Ue._fromIdTokenResponse(n,"signIn",r);return await n._updateCurrentUser(i.user),i} + */async function rt(e,t){const n=Object(r.p)(e);await st(!0,n,t);const{providerUserInfo:i}=await async function(e,t){return x(e,"POST","/v1/accounts:update",t)}(n.auth,{idToken:await n.getIdToken(),deleteProvider:[t]}),s=nt(i||[]);return n.providerData=n.providerData.filter(e=>s.has(e.providerId)),s.has("phone")||(n.phoneNumber=null),await n.auth._persistUserIfCurrent(n),n}async function it(e,t,n=!1){const r=await B(e,t._linkToIdToken(e.auth,await e.getIdToken()),n);return Je._forOperation(e,"link",r)}async function st(e,t,n){await K(t);const r=!1===e?"provider-already-linked":"no-such-provider";I(nt(t.providerData).has(n)===e,t.auth,r)} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1093,7 +1142,7 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class et{constructor(e,t){this.factorId=e,this.uid=t.mfaEnrollmentId,this.enrollmentTime=new Date(t.enrolledAt).toUTCString(),this.displayName=t.displayName}static _fromServerResponse(e,t){return"phoneInfo"in t?tt._fromServerResponse(e,t):g(e,"internal-error")}}class tt extends et{constructor(e){super("phone",e),this.phoneNumber=e.phoneInfo}static _fromServerResponse(e,t){return new tt(t)}} + */async function ot(e,t,n=!1){const{auth:r}=e;try{const i=await B(e,tt(r,"reauthenticate",t,e),n);I(i.idToken,r,"internal-error");const s=q(i.idToken);I(s,r,"internal-error");const{sub:o}=s;return I(e.uid===o,r,"user-mismatch"),Je._forOperation(e,"reauthenticate",i)}catch(e){throw"auth/user-not-found"===(null==e?void 0:e.code)&&m(r,"user-mismatch"),e}} /** * @license * Copyright 2020 Google LLC @@ -1109,7 +1158,7 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function nt(e,t,n){var r;I((null===(r=n.url)||void 0===r?void 0:r.length)>0,e,"invalid-continue-uri"),I(void 0===n.dynamicLinkDomain||n.dynamicLinkDomain.length>0,e,"invalid-dynamic-link-domain"),t.continueUrl=n.url,t.dynamicLinkDomain=n.dynamicLinkDomain,t.canHandleCodeInApp=n.handleCodeInApp,n.iOS&&(I(n.iOS.bundleId.length>0,e,"missing-ios-bundle-id"),t.iOSBundleId=n.iOS.bundleId),n.android&&(I(n.android.packageName.length>0,e,"missing-android-pkg-name"),t.androidInstallApp=n.android.installApp,t.androidMinimumVersionCode=n.android.minimumVersion,t.androidPackageName=n.android.packageName)} + */async function at(e,t,n=!1){const r=await tt(e,"signIn",t),i=await Je._fromIdTokenResponse(e,"signIn",r);return n||await e._updateCurrentUser(i.user),i}async function ct(e,t){return at(_e(e),t)}async function ut(e,t){const n=Object(r.p)(e);return await st(!1,n,t.providerId),it(n,t)}async function lt(e,t){return ot(Object(r.p)(e),t)} /** * @license * Copyright 2020 Google LLC @@ -1125,7 +1174,7 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function rt(e,t,n){const i=Object(r.k)(e),s={requestType:"PASSWORD_RESET",email:t};n&&nt(i,s,n),await async function(e,t){return Ie(e,t)}(i,s)}async function it(e,t,n){await we(Object(r.k)(e),{oobCode:t,newPassword:n})}async function st(e,t){await async function(e,t){return x(e,"POST","/v1/accounts:update",L(e,t))}(Object(r.k)(e),{oobCode:t})}async function ot(e,t){const n=Object(r.k)(e),i=await we(n,{oobCode:t}),s=i.requestType;switch(I(s,n,"internal-error"),s){case"EMAIL_SIGNIN":break;case"VERIFY_AND_CHANGE_EMAIL":I(i.newEmail,n,"internal-error");break;case"REVERT_SECOND_FACTOR_ADDITION":I(i.mfaInfo,n,"internal-error");default:I(i.email,n,"internal-error")}let o=null;return i.mfaInfo&&(o=et._fromServerResponse(fe(n),i.mfaInfo)),{data:{email:("VERIFY_AND_CHANGE_EMAIL"===i.requestType?i.newEmail:i.email)||null,previousEmail:("VERIFY_AND_CHANGE_EMAIL"===i.requestType?i.email:i.newEmail)||null,multiFactorInfo:o},operation:s}}async function at(e,t){const{data:n}=await ot(Object(r.k)(e),t);return n.email}async function ct(e,t,n){const r=fe(e),i=await je(r,{returnSecureToken:!0,email:t,password:n}),s=await Ue._fromIdTokenResponse(r,"signIn",i);return await r._updateCurrentUser(s.user),s}function ut(e,t,n){return Je(Object(r.k)(e),Ne.credential(t,n))} + */ /** * @license * Copyright 2020 Google LLC @@ -1141,7 +1190,8 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function ht(e,t,n){const i=Object(r.k)(e),s={requestType:"EMAIL_SIGNIN",email:t};I(n.handleCodeInApp,i,"argument-error"),n&&nt(i,s,n),await async function(e,t){return Ie(e,t)}(i,s)}function lt(e,t){const n=Ae.parseLink(t);return"EMAIL_SIGNIN"===(null==n?void 0:n.operation)}async function dt(e,t,n){const i=Object(r.k)(e),s=Ne.credentialWithLink(t,n||S());return I(s._tenantId===(i.tenantId||null),i,"tenant-id-mismatch"),Je(i,s)} + */ +async function ht(e,t){const n=_e(e),r=await async function(e,t){return L(e,"POST","/v1/accounts:signInWithCustomToken",R(e,t))}(n,{token:t,returnSecureToken:!0}),i=await Je._fromIdTokenResponse(n,"signIn",r);return await n._updateCurrentUser(i.user),i} /** * @license * Copyright 2020 Google LLC @@ -1157,7 +1207,7 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */class dt{constructor(e,t){this.factorId=e,this.uid=t.mfaEnrollmentId,this.enrollmentTime=new Date(t.enrolledAt).toUTCString(),this.displayName=t.displayName}static _fromServerResponse(e,t){return"phoneInfo"in t?ft._fromServerResponse(e,t):"totpInfo"in t?pt._fromServerResponse(e,t):m(e,"internal-error")}}class ft extends dt{constructor(e){super("phone",e),this.phoneNumber=e.phoneInfo}static _fromServerResponse(e,t){return new ft(t)}}class pt extends dt{constructor(e){super("totp",e)}static _fromServerResponse(e,t){return new pt(t)}} /** * @license * Copyright 2020 Google LLC @@ -1173,8 +1223,7 @@ async function Ze(e,t){const n=fe(e),r=await async function(e,t){return F(e,"POS * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -async function ft(e,t){const n={identifier:t,continueUri:A()?S():"http://localhost"},{signinMethods:i}=await async function(e,t){return x(e,"POST","/v1/accounts:createAuthUri",L(e,t))}(Object(r.k)(e),n);return i||[]}async function pt(e,t){const n=Object(r.k)(e),i={requestType:"VERIFY_EMAIL",idToken:await e.getIdToken()};t&&nt(n.auth,i,t);const{email:s}=await async function(e,t){return Ie(e,t)}(n.auth,i);s!==e.email&&await e.reload()}async function mt(e,t,n){const i=Object(r.k)(e),s={requestType:"VERIFY_AND_CHANGE_EMAIL",idToken:await e.getIdToken(),newEmail:t};n&&nt(i.auth,s,n);const{email:o}=await async function(e,t){return Ie(e,t)}(i.auth,s);o!==e.email&&await e.reload()} + */function gt(e,t,n){var r;I((null===(r=n.url)||void 0===r?void 0:r.length)>0,e,"invalid-continue-uri"),I(void 0===n.dynamicLinkDomain||n.dynamicLinkDomain.length>0,e,"invalid-dynamic-link-domain"),t.continueUrl=n.url,t.dynamicLinkDomain=n.dynamicLinkDomain,t.canHandleCodeInApp=n.handleCodeInApp,n.iOS&&(I(n.iOS.bundleId.length>0,e,"missing-ios-bundle-id"),t.iOSBundleId=n.iOS.bundleId),n.android&&(I(n.android.packageName.length>0,e,"missing-android-pkg-name"),t.androidInstallApp=n.android.installApp,t.androidMinimumVersionCode=n.android.minimumVersion,t.androidPackageName=n.android.packageName)} /** * @license * Copyright 2020 Google LLC @@ -1190,7 +1239,7 @@ async function ft(e,t){const n={identifier:t,continueUri:A()?S():"http://localho * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */async function mt(e,t,n){var r;const i=_e(e),s={requestType:"PASSWORD_RESET",email:t,clientType:"CLIENT_TYPE_WEB"};if(null===(r=i._getRecaptchaConfig())||void 0===r?void 0:r.emailPasswordEnabled){const e=await we(i,s,"getOobCode",!0);n&>(i,e,n),await Re(i,e)}else n&>(i,s,n),await Re(i,s).catch(async e=>{if("auth/missing-recaptcha-token"!==e.code)return Promise.reject(e);{console.log("Password resets are protected by reCAPTCHA for this project. Automatically triggering the reCAPTCHA flow and restarting the password reset flow.");const e=await we(i,s,"getOobCode",!0);n&>(i,e,n),await Re(i,e)}})}async function yt(e,t,n){await Ae(Object(r.p)(e),{oobCode:t,newPassword:n})}async function vt(e,t){await async function(e,t){return x(e,"POST","/v1/accounts:update",R(e,t))}(Object(r.p)(e),{oobCode:t})}async function wt(e,t){const n=Object(r.p)(e),i=await Ae(n,{oobCode:t}),s=i.requestType;switch(I(s,n,"internal-error"),s){case"EMAIL_SIGNIN":break;case"VERIFY_AND_CHANGE_EMAIL":I(i.newEmail,n,"internal-error");break;case"REVERT_SECOND_FACTOR_ADDITION":I(i.mfaInfo,n,"internal-error");default:I(i.email,n,"internal-error")}let o=null;return i.mfaInfo&&(o=dt._fromServerResponse(_e(n),i.mfaInfo)),{data:{email:("VERIFY_AND_CHANGE_EMAIL"===i.requestType?i.newEmail:i.email)||null,previousEmail:("VERIFY_AND_CHANGE_EMAIL"===i.requestType?i.email:i.newEmail)||null,multiFactorInfo:o},operation:s}}async function bt(e,t){const{data:n}=await wt(Object(r.p)(e),t);return n.email}async function It(e,t,n){var r;const i=_e(e),s={returnSecureToken:!0,email:t,password:n,clientType:"CLIENT_TYPE_WEB"};let o;if(null===(r=i._getRecaptchaConfig())||void 0===r?void 0:r.emailPasswordEnabled){const e=await we(i,s,"signUpPassword");o=Ye(i,e)}else o=Ye(i,s).catch(async e=>{if("auth/missing-recaptcha-token"===e.code){console.log("Sign-up is protected by reCAPTCHA for this project. Automatically triggering the reCAPTCHA flow and restarting the sign-up flow.");const e=await we(i,s,"signUpPassword");return Ye(i,e)}return Promise.reject(e)});const a=await o.catch(e=>Promise.reject(e)),c=await Je._fromIdTokenResponse(i,"signIn",a);return await i._updateCurrentUser(c.user),c}function _t(e,t,n){return ct(Object(r.p)(e),Ue.credential(t,n))} /** * @license * Copyright 2020 Google LLC @@ -1206,11 +1255,10 @@ async function ft(e,t){const n={identifier:t,continueUri:A()?S():"http://localho * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return;const i=Object(r.k)(e),s={idToken:await i.getIdToken(),displayName:t,photoUrl:n,returnSecureToken:!0},o=await K(i,async function(e,t){return x(e,"POST","/v1/accounts:update",t)}(i.auth,s));i.displayName=o.displayName||null,i.photoURL=o.photoUrl||null;const a=i.providerData.find(({providerId:e})=>"password"===e);a&&(a.displayName=i.displayName,a.photoURL=i.photoURL),await i._updateTokensIfNecessary(o)}function yt(e,t){return wt(Object(r.k)(e),t,null)}function vt(e,t){return wt(Object(r.k)(e),null,t)}async function wt(e,t,n){const{auth:r}=e,i={idToken:await e.getIdToken(),returnSecureToken:!0};t&&(i.email=t),n&&(i.password=n);const s=await K(e,be(r,i));await e._updateTokensIfNecessary(s,!0)} + */async function Tt(e,t,n){var r;const i=_e(e),s={requestType:"EMAIL_SIGNIN",email:t,clientType:"CLIENT_TYPE_WEB"};function o(e,t){I(t.handleCodeInApp,i,"argument-error"),t&>(i,e,t)}if(null===(r=i._getRecaptchaConfig())||void 0===r?void 0:r.emailPasswordEnabled){const e=await we(i,s,"getOobCode",!0);o(e,n),await xe(i,e)}else o(s,n),await xe(i,s).catch(async e=>{if("auth/missing-recaptcha-token"!==e.code)return Promise.reject(e);{console.log("Email link sign-in is protected by reCAPTCHA for this project. Automatically triggering the reCAPTCHA flow and restarting the sign-in flow.");const e=await we(i,s,"getOobCode",!0);o(e,n),await xe(i,e)}})}function Et(e,t){const n=je.parseLink(t);return"EMAIL_SIGNIN"===(null==n?void 0:n.operation)}async function St(e,t,n){const i=Object(r.p)(e),s=Ue.credentialWithLink(t,n||E());return I(s._tenantId===(i.tenantId||null),i,"tenant-id-mismatch"),ct(i,s)} /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1223,7 +1271,7 @@ async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class bt{constructor(e,t,n={}){this.isNewUser=e,this.providerId=t,this.profile=n}}class It extends bt{constructor(e,t,n,r){super(e,t,n),this.username=r}}class _t extends bt{constructor(e,t){super(e,"facebook.com",t)}}class Tt extends It{constructor(e,t){super(e,"github.com",t,"string"==typeof(null==t?void 0:t.login)?null==t?void 0:t.login:null)}}class Et extends bt{constructor(e,t){super(e,"google.com",t)}}class kt extends It{constructor(e,t,n){super(e,"twitter.com",t,n)}}function St(e){const{user:t,_tokenResponse:n}=e;return t.isAnonymous&&!n?{providerId:null,isNewUser:!1,profile:null}:function(e){var t,n;if(!e)return null;const{providerId:r}=e,i=e.rawUserInfo?JSON.parse(e.rawUserInfo):{},s=e.isNewUser||"identitytoolkit#SignupNewUserResponse"===e.kind;if(!r&&(null==e?void 0:e.idToken)){const r=null===(n=null===(t=z(e.idToken))||void 0===t?void 0:t.firebase)||void 0===n?void 0:n.sign_in_provider;if(r){return new bt(s,"anonymous"!==r&&"custom"!==r?r:null)}}if(!r)return null;switch(r){case"facebook.com":return new _t(s,i);case"github.com":return new Tt(s,i);case"google.com":return new Et(s,i);case"twitter.com":return new kt(s,i,e.screenName||null);case"custom":case"anonymous":return new bt(s,null);default:return new bt(s,r,i)}}(n)} + */ /** * @license * Copyright 2020 Google LLC @@ -1239,7 +1287,8 @@ async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class At{constructor(e,t){this.type=e,this.credential=t}static _fromIdtoken(e){return new At("enroll",e)}static _fromMfaPendingCredential(e){return new At("signin",e)}toJSON(){return{multiFactorSession:{["enroll"===this.type?"idToken":"pendingCredential"]:this.credential}}}static fromJSON(e){var t,n;if(null==e?void 0:e.multiFactorSession){if(null===(t=e.multiFactorSession)||void 0===t?void 0:t.pendingCredential)return At._fromMfaPendingCredential(e.multiFactorSession.pendingCredential);if(null===(n=e.multiFactorSession)||void 0===n?void 0:n.idToken)return At._fromIdtoken(e.multiFactorSession.idToken)}return null}} + */ +async function kt(e,t){const n={identifier:t,continueUri:S()?E():"http://localhost"},{signinMethods:i}=await async function(e,t){return x(e,"POST","/v1/accounts:createAuthUri",R(e,t))}(Object(r.p)(e),n);return i||[]}async function Ct(e,t){const n=Object(r.p)(e),i={requestType:"VERIFY_EMAIL",idToken:await e.getIdToken()};t&>(n.auth,i,t);const{email:s}=await async function(e,t){return Oe(e,t)}(n.auth,i);s!==e.email&&await e.reload()}async function At(e,t,n){const i=Object(r.p)(e),s={requestType:"VERIFY_AND_CHANGE_EMAIL",idToken:await e.getIdToken(),newEmail:t};n&>(i.auth,s,n);const{email:o}=await async function(e,t){return Oe(e,t)}(i.auth,s);o!==e.email&&await e.reload()} /** * @license * Copyright 2020 Google LLC @@ -1255,7 +1304,7 @@ async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Nt{constructor(e,t,n){this.session=e,this.hints=t,this.signInResolver=n}static _fromError(e,t){const n=fe(e),r=t.customData._serverResponse,i=(r.mfaInfo||[]).map(e=>et._fromServerResponse(n,e));I(r.mfaPendingCredential,n,"internal-error");const s=At._fromMfaPendingCredential(r.mfaPendingCredential);return new Nt(s,i,async e=>{const i=await e._process(n,s);delete r.mfaInfo,delete r.mfaPendingCredential;const o=Object.assign(Object.assign({},r),{idToken:i.idToken,refreshToken:i.refreshToken});switch(t.operationType){case"signIn":const e=await Ue._fromIdTokenResponse(n,t.operationType,o);return await n._updateCurrentUser(e.user),e;case"reauthenticate":return I(t.user,n,"internal-error"),Ue._forOperation(t.user,t.operationType,o);default:g(n,"internal-error")}})}async resolveSignIn(e){const t=e;return this.signInResolver(t)}}function Ot(e,t){var n;const i=Object(r.k)(e),s=t;return I(t.customData.operationType,i,"argument-error"),I(null===(n=s.customData._serverResponse)||void 0===n?void 0:n.mfaPendingCredential,i,"argument-error"),Nt._fromError(i,s)} + */ /** * @license * Copyright 2020 Google LLC @@ -1271,7 +1320,8 @@ async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ct{constructor(e){this.user=e,this.enrolledFactors=[],e._onReload(t=>{t.mfaInfo&&(this.enrolledFactors=t.mfaInfo.map(t=>et._fromServerResponse(e.auth,t)))})}static _fromUser(e){return new Ct(e)}async getSession(){return At._fromIdtoken(await this.user.getIdToken())}async enroll(e,t){const n=e,r=await this.getSession(),i=await K(this.user,n._process(this.user.auth,r,t));return await this.user._updateTokensIfNecessary(i),this.user.reload()}async unenroll(e){const t="string"==typeof e?e:e.uid,n=await this.user.getIdToken(),r=await K(this.user,(i=this.user.auth,s={idToken:n,mfaEnrollmentId:t},x(i,"POST","/v2/accounts/mfaEnrollment:withdraw",L(i,s))));var i,s;this.enrolledFactors=this.enrolledFactors.filter(({uid:e})=>e!==t),await this.user._updateTokensIfNecessary(r);try{await this.user.reload()}catch(e){if("auth/user-token-expired"!==e.code)throw e}}}const Dt=new WeakMap;function Rt(e){const t=Object(r.k)(e);return Dt.has(t)||Dt.set(t,Ct._fromUser(t)),Dt.get(t)} + */ +async function Nt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return;const i=Object(r.p)(e),s={idToken:await i.getIdToken(),displayName:t,photoUrl:n,returnSecureToken:!0},o=await B(i,async function(e,t){return x(e,"POST","/v1/accounts:update",t)}(i.auth,s));i.displayName=o.displayName||null,i.photoURL=o.photoUrl||null;const a=i.providerData.find(({providerId:e})=>"password"===e);a&&(a.displayName=i.displayName,a.photoURL=i.photoURL),await i._updateTokensIfNecessary(o)}function Dt(e,t){return Rt(Object(r.p)(e),t,null)}function Ot(e,t){return Rt(Object(r.p)(e),null,t)}async function Rt(e,t,n){const{auth:r}=e,i={idToken:await e.getIdToken(),returnSecureToken:!0};t&&(i.email=t),n&&(i.password=n);const s=await B(e,Ne(r,i));await e._updateTokensIfNecessary(s,!0)} /** * @license * Copyright 2019 Google LLC @@ -1287,8 +1337,7 @@ async function gt(e,{displayName:t,photoURL:n}){if(void 0===t&&void 0===n)return * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -class Pt{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try{return this.storage?(this.storage.setItem("__sak","1"),this.storage.removeItem("__sak"),Promise.resolve(!0)):Promise.resolve(!1)}catch(e){return Promise.resolve(!1)}}_set(e,t){return this.storage.setItem(e,JSON.stringify(t)),Promise.resolve()}_get(e){const t=this.storage.getItem(e);return Promise.resolve(t?JSON.parse(t):null)}_remove(e){return this.storage.removeItem(e),Promise.resolve()}get storage(){return this.storageRetriever()}} + */class xt{constructor(e,t,n={}){this.isNewUser=e,this.providerId=t,this.profile=n}}class Pt extends xt{constructor(e,t,n,r){super(e,t,n),this.username=r}}class Lt extends xt{constructor(e,t){super(e,"facebook.com",t)}}class Mt extends Pt{constructor(e,t){super(e,"github.com",t,"string"==typeof(null==t?void 0:t.login)?null==t?void 0:t.login:null)}}class Ft extends xt{constructor(e,t){super(e,"google.com",t)}}class Vt extends Pt{constructor(e,t,n){super(e,"twitter.com",t,n)}}function jt(e){const{user:t,_tokenResponse:n}=e;return t.isAnonymous&&!n?{providerId:null,isNewUser:!1,profile:null}:function(e){var t,n;if(!e)return null;const{providerId:r}=e,i=e.rawUserInfo?JSON.parse(e.rawUserInfo):{},s=e.isNewUser||"identitytoolkit#SignupNewUserResponse"===e.kind;if(!r&&(null==e?void 0:e.idToken)){const r=null===(n=null===(t=q(e.idToken))||void 0===t?void 0:t.firebase)||void 0===n?void 0:n.sign_in_provider;if(r){return new xt(s,"anonymous"!==r&&"custom"!==r?r:null)}}if(!r)return null;switch(r){case"facebook.com":return new Lt(s,i);case"github.com":return new Mt(s,i);case"google.com":return new Ft(s,i);case"twitter.com":return new Vt(s,i,e.screenName||null);case"custom":case"anonymous":return new xt(s,null);default:return new xt(s,r,i)}}(n)} /** * @license * Copyright 2020 Google LLC @@ -1304,7 +1353,7 @@ class Pt{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Lt extends Pt{constructor(){super(()=>window.localStorage,"LOCAL"),this.boundEventHandler=(e,t)=>this.onStorageEvent(e,t),this.listeners={},this.localCache={},this.pollTimer=null,this.safariLocalStorageNotSynced=function(){const e=Object(r.l)();return re(e)||ue(e)}()&&function(){try{return!(!window||window===window.top)}catch(e){return!1}}(),this.fallbackToPolling=he(),this._shouldAllowMigration=!0}forAllChangedKeys(e){for(const t of Object.keys(this.listeners)){const n=this.storage.getItem(t),r=this.localCache[t];n!==r&&e(t,r,n)}}onStorageEvent(e,t=!1){if(!e.key)return void this.forAllChangedKeys((e,t,n)=>{this.notifyListeners(e,n)});const n=e.key;if(t?this.detachListener():this.stopPolling(),this.safariLocalStorageNotSynced){const r=this.storage.getItem(n);if(e.newValue!==r)null!==e.newValue?this.storage.setItem(n,e.newValue):this.storage.removeItem(n);else if(this.localCache[n]===e.newValue&&!t)return}const i=()=>{const e=this.storage.getItem(n);(t||this.localCache[n]!==e)&&this.notifyListeners(n,e)},s=this.storage.getItem(n);Object(r.q)()&&10===document.documentMode&&s!==e.newValue&&e.newValue!==e.oldValue?setTimeout(i,10):i()}notifyListeners(e,t){this.localCache[e]=t;const n=this.listeners[e];if(n)for(const e of Array.from(n))e(t?JSON.parse(t):t)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(()=>{this.forAllChangedKeys((e,t,n)=>{this.onStorageEvent(new StorageEvent("storage",{key:e,oldValue:t,newValue:n}),!0)})},1e3)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}attachListener(){window.addEventListener("storage",this.boundEventHandler)}detachListener(){window.removeEventListener("storage",this.boundEventHandler)}_addListener(e,t){0===Object.keys(this.listeners).length&&(this.fallbackToPolling?this.startPolling():this.attachListener()),this.listeners[e]||(this.listeners[e]=new Set,this.localCache[e]=this.storage.getItem(e)),this.listeners[e].add(t)}_removeListener(e,t){this.listeners[e]&&(this.listeners[e].delete(t),0===this.listeners[e].size&&delete this.listeners[e]),0===Object.keys(this.listeners).length&&(this.detachListener(),this.stopPolling())}async _set(e,t){await super._set(e,t),this.localCache[e]=JSON.stringify(t)}async _get(e){const t=await super._get(e);return this.localCache[e]=JSON.stringify(t),t}async _remove(e){await super._remove(e),delete this.localCache[e]}}Lt.type="LOCAL";const xt=Lt; + */class Ut{constructor(e,t,n){this.type=e,this.credential=t,this.auth=n}static _fromIdtoken(e,t){return new Ut("enroll",e,t)}static _fromMfaPendingCredential(e){return new Ut("signin",e)}toJSON(){return{multiFactorSession:{["enroll"===this.type?"idToken":"pendingCredential"]:this.credential}}}static fromJSON(e){var t,n;if(null==e?void 0:e.multiFactorSession){if(null===(t=e.multiFactorSession)||void 0===t?void 0:t.pendingCredential)return Ut._fromMfaPendingCredential(e.multiFactorSession.pendingCredential);if(null===(n=e.multiFactorSession)||void 0===n?void 0:n.idToken)return Ut._fromIdtoken(e.multiFactorSession.idToken)}return null}} /** * @license * Copyright 2020 Google LLC @@ -1320,10 +1369,10 @@ class Pt{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Mt extends Pt{constructor(){super(()=>window.sessionStorage,"SESSION")}_addListener(e,t){}_removeListener(e,t){}}Mt.type="SESSION";const Ft=Mt; + */class qt{constructor(e,t,n){this.session=e,this.hints=t,this.signInResolver=n}static _fromError(e,t){const n=_e(e),r=t.customData._serverResponse,i=(r.mfaInfo||[]).map(e=>dt._fromServerResponse(n,e));I(r.mfaPendingCredential,n,"internal-error");const s=Ut._fromMfaPendingCredential(r.mfaPendingCredential);return new qt(s,i,async e=>{const i=await e._process(n,s);delete r.mfaInfo,delete r.mfaPendingCredential;const o=Object.assign(Object.assign({},r),{idToken:i.idToken,refreshToken:i.refreshToken});switch(t.operationType){case"signIn":const e=await Je._fromIdTokenResponse(n,t.operationType,o);return await n._updateCurrentUser(e.user),e;case"reauthenticate":return I(t.user,n,"internal-error"),Je._forOperation(t.user,t.operationType,o);default:m(n,"internal-error")}})}async resolveSignIn(e){const t=e;return this.signInResolver(t)}}function Bt(e,t){var n;const i=Object(r.p)(e),s=t;return I(t.customData.operationType,i,"argument-error"),I(null===(n=s.customData._serverResponse)||void 0===n?void 0:n.mfaPendingCredential,i,"argument-error"),qt._fromError(i,s)} /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1336,7 +1385,7 @@ class Pt{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */class zt{constructor(e){this.user=e,this.enrolledFactors=[],e._onReload(t=>{t.mfaInfo&&(this.enrolledFactors=t.mfaInfo.map(t=>dt._fromServerResponse(e.auth,t)))})}static _fromUser(e){return new zt(e)}async getSession(){return Ut._fromIdtoken(await this.user.getIdToken(),this.user.auth)}async enroll(e,t){const n=e,r=await this.getSession(),i=await B(this.user,n._process(this.user.auth,r,t));return await this.user._updateTokensIfNecessary(i),this.user.reload()}async unenroll(e){const t="string"==typeof e?e:e.uid,n=await this.user.getIdToken();try{const e=await B(this.user,(r=this.user.auth,i={idToken:n,mfaEnrollmentId:t},x(r,"POST","/v2/accounts/mfaEnrollment:withdraw",R(r,i))));this.enrolledFactors=this.enrolledFactors.filter(({uid:e})=>e!==t),await this.user._updateTokensIfNecessary(e),await this.user.reload()}catch(e){throw e}var r,i}}const Gt=new WeakMap;function Kt(e){const t=Object(r.p)(e);return Gt.has(t)||Gt.set(t,zt._fromUser(t)),Gt.get(t)} /** * @license * Copyright 2019 Google LLC @@ -1353,7 +1402,7 @@ class Pt{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try * See the License for the specific language governing permissions and * limitations under the License. */ -class jt{constructor(e){this.eventTarget=e,this.handlersMap={},this.boundEventHandler=this.handleEvent.bind(this)}static _getInstance(e){const t=this.receivers.find(t=>t.isListeningto(e));if(t)return t;const n=new jt(e);return this.receivers.push(n),n}isListeningto(e){return this.eventTarget===e}async handleEvent(e){const t=e,{eventId:n,eventType:r,data:i}=t.data,s=this.handlersMap[r];if(!(null==s?void 0:s.size))return;t.ports[0].postMessage({status:"ack",eventId:n,eventType:r});const o=Array.from(s).map(async e=>e(t.origin,i)),a=await function(e){return Promise.all(e.map(async e=>{try{return{fulfilled:!0,value:await e}}catch(e){return{fulfilled:!1,reason:e}}}))}(o);t.ports[0].postMessage({status:"done",eventId:n,eventType:r,response:a})}_subscribe(e,t){0===Object.keys(this.handlersMap).length&&this.eventTarget.addEventListener("message",this.boundEventHandler),this.handlersMap[e]||(this.handlersMap[e]=new Set),this.handlersMap[e].add(t)}_unsubscribe(e,t){this.handlersMap[e]&&t&&this.handlersMap[e].delete(t),t&&0!==this.handlersMap[e].size||delete this.handlersMap[e],0===Object.keys(this.handlersMap).length&&this.eventTarget.removeEventListener("message",this.boundEventHandler)}} +class $t{constructor(e,t){this.storageRetriever=e,this.type=t}_isAvailable(){try{return this.storage?(this.storage.setItem("__sak","1"),this.storage.removeItem("__sak"),Promise.resolve(!0)):Promise.resolve(!1)}catch(e){return Promise.resolve(!1)}}_set(e,t){return this.storage.setItem(e,JSON.stringify(t)),Promise.resolve()}_get(e){const t=this.storage.getItem(e);return Promise.resolve(t?JSON.parse(t):null)}_remove(e){return this.storage.removeItem(e),Promise.resolve()}get storage(){return this.storageRetriever()}} /** * @license * Copyright 2020 Google LLC @@ -1369,8 +1418,23 @@ class jt{constructor(e){this.eventTarget=e,this.handlersMap={},this.boundEventHa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -function Ut(e="",t=10){let n="";for(let e=0;ewindow.localStorage,"LOCAL"),this.boundEventHandler=(e,t)=>this.onStorageEvent(e,t),this.listeners={},this.localCache={},this.pollTimer=null,this.safariLocalStorageNotSynced=function(){const e=Object(r.q)();return re(e)||ue(e)}()&&function(){try{return!(!window||window===window.top)}catch(e){return!1}}(),this.fallbackToPolling=le(),this._shouldAllowMigration=!0}forAllChangedKeys(e){for(const t of Object.keys(this.listeners)){const n=this.storage.getItem(t),r=this.localCache[t];n!==r&&e(t,r,n)}}onStorageEvent(e,t=!1){if(!e.key)return void this.forAllChangedKeys((e,t,n)=>{this.notifyListeners(e,n)});const n=e.key;if(t?this.detachListener():this.stopPolling(),this.safariLocalStorageNotSynced){const r=this.storage.getItem(n);if(e.newValue!==r)null!==e.newValue?this.storage.setItem(n,e.newValue):this.storage.removeItem(n);else if(this.localCache[n]===e.newValue&&!t)return}const i=()=>{const e=this.storage.getItem(n);(t||this.localCache[n]!==e)&&this.notifyListeners(n,e)},s=this.storage.getItem(n);Object(r.u)()&&10===document.documentMode&&s!==e.newValue&&e.newValue!==e.oldValue?setTimeout(i,10):i()}notifyListeners(e,t){this.localCache[e]=t;const n=this.listeners[e];if(n)for(const e of Array.from(n))e(t?JSON.parse(t):t)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(()=>{this.forAllChangedKeys((e,t,n)=>{this.onStorageEvent(new StorageEvent("storage",{key:e,oldValue:t,newValue:n}),!0)})},1e3)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}attachListener(){window.addEventListener("storage",this.boundEventHandler)}detachListener(){window.removeEventListener("storage",this.boundEventHandler)}_addListener(e,t){0===Object.keys(this.listeners).length&&(this.fallbackToPolling?this.startPolling():this.attachListener()),this.listeners[e]||(this.listeners[e]=new Set,this.localCache[e]=this.storage.getItem(e)),this.listeners[e].add(t)}_removeListener(e,t){this.listeners[e]&&(this.listeners[e].delete(t),0===this.listeners[e].size&&delete this.listeners[e]),0===Object.keys(this.listeners).length&&(this.detachListener(),this.stopPolling())}async _set(e,t){await super._set(e,t),this.localCache[e]=JSON.stringify(t)}async _get(e){const t=await super._get(e);return this.localCache[e]=JSON.stringify(t),t}async _remove(e){await super._remove(e),delete this.localCache[e]}}Wt.type="LOCAL";const Ht=Wt; +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class Qt extends $t{constructor(){super(()=>window.sessionStorage,"SESSION")}_addListener(e,t){}_removeListener(e,t){}}Qt.type="SESSION";const Yt=Qt; /** * @license * Copyright 2019 Google LLC @@ -1386,10 +1450,10 @@ function Ut(e="",t=10){let n="";for(let e=0;e{const c=Ut("",20);r.port1.start();const u=setTimeout(()=>{a(new Error("unsupported_event"))},n);s={messageChannel:r,onMessage(e){const t=e;if(t.data.eventId===c)switch(t.data.status){case"ack":clearTimeout(u),i=setTimeout(()=>{a(new Error("timeout"))},3e3);break;case"done":clearTimeout(i),o(t.data.response);break;default:clearTimeout(u),clearTimeout(i),a(new Error("invalid_response"))}}},this.handlers.add(s),r.port1.addEventListener("message",s.onMessage),this.target.postMessage({eventType:e,eventId:c,data:t},[r.port2])}).finally(()=>{s&&this.removeMessageHandler(s)})}} + */ /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1402,10 +1466,11 @@ function Ut(e="",t=10){let n="";for(let e=0;et.isListeningto(e));if(t)return t;const n=new Jt(e);return this.receivers.push(n),n}isListeningto(e){return this.eventTarget===e}async handleEvent(e){const t=e,{eventId:n,eventType:r,data:i}=t.data,s=this.handlersMap[r];if(!(null==s?void 0:s.size))return;t.ports[0].postMessage({status:"ack",eventId:n,eventType:r});const o=Array.from(s).map(async e=>e(t.origin,i)),a=await function(e){return Promise.all(e.map(async e=>{try{return{fulfilled:!0,value:await e}}catch(e){return{fulfilled:!1,reason:e}}}))}(o);t.ports[0].postMessage({status:"done",eventId:n,eventType:r,response:a})}_subscribe(e,t){0===Object.keys(this.handlersMap).length&&this.eventTarget.addEventListener("message",this.boundEventHandler),this.handlersMap[e]||(this.handlersMap[e]=new Set),this.handlersMap[e].add(t)}_unsubscribe(e,t){this.handlersMap[e]&&t&&this.handlersMap[e].delete(t),t&&0!==this.handlersMap[e].size||delete this.handlersMap[e],0===Object.keys(this.handlersMap).length&&this.eventTarget.removeEventListener("message",this.boundEventHandler)}} /** * @license - * Copyright 2020 Google LLC. + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1419,7 +1484,7 @@ function Ut(e="",t=10){let n="";for(let e=0;e{this.request.addEventListener("success",()=>{e(this.request.result)}),this.request.addEventListener("error",()=>{t(this.request.error)})})}}function Wt(e,t){return e.transaction(["firebaseLocalStorage"],t?"readwrite":"readonly").objectStore("firebaseLocalStorage")}function Gt(){const e=indexedDB.open(zt,1);return new Promise((t,n)=>{e.addEventListener("error",()=>{n(e.error)}),e.addEventListener("upgradeneeded",()=>{const t=e.result;try{t.createObjectStore("firebaseLocalStorage",{keyPath:"fbase_key"})}catch(e){n(e)}}),e.addEventListener("success",async()=>{const n=e.result;n.objectStoreNames.contains("firebaseLocalStorage")?t(n):(n.close(),await function(){const e=indexedDB.deleteDatabase(zt);return new Kt(e).toPromise()}(),t(await Gt()))})})}async function Ht(e,t,n){const r=Wt(e,!0).put({fbase_key:t,value:n});return new Kt(r).toPromise()}function $t(e,t){const n=Wt(e,!0).delete(t);return new Kt(n).toPromise()}class Qt{constructor(){this.type="LOCAL",this._shouldAllowMigration=!0,this.listeners={},this.localCache={},this.pollTimer=null,this.pendingWrites=0,this.receiver=null,this.sender=null,this.serviceWorkerReceiverAvailable=!1,this.activeServiceWorker=null,this._workerInitializationPromise=this.initializeServiceWorkerMessaging().then(()=>{},()=>{})}async _openDb(){return this.db||(this.db=await Gt()),this.db}async _withRetries(e){let t=0;for(;;)try{const t=await this._openDb();return await e(t)}catch(e){if(t++>3)throw e;this.db&&(this.db.close(),this.db=void 0)}}async initializeServiceWorkerMessaging(){return Bt()?this.initializeReceiver():this.initializeSender()}async initializeReceiver(){this.receiver=jt._getInstance(Bt()?self:null),this.receiver._subscribe("keyChanged",async(e,t)=>({keyProcessed:(await this._poll()).includes(t.key)})),this.receiver._subscribe("ping",async(e,t)=>["keyChanged"])}async initializeSender(){var e,t;if(this.activeServiceWorker=await async function(){if(!(null===navigator||void 0===navigator?void 0:navigator.serviceWorker))return null;try{return(await navigator.serviceWorker.ready).active}catch(e){return null}}(),!this.activeServiceWorker)return;this.sender=new Vt(this.activeServiceWorker);const n=await this.sender._send("ping",{},800);n&&(null===(e=n[0])||void 0===e?void 0:e.fulfilled)&&(null===(t=n[0])||void 0===t?void 0:t.value.includes("keyChanged"))&&(this.serviceWorkerReceiverAvailable=!0)}async notifyServiceWorker(e){var t;if(this.sender&&this.activeServiceWorker&&((null===(t=null===navigator||void 0===navigator?void 0:navigator.serviceWorker)||void 0===t?void 0:t.controller)||null)===this.activeServiceWorker)try{await this.sender._send("keyChanged",{key:e},this.serviceWorkerReceiverAvailable?800:50)}catch(t){}}async _isAvailable(){try{if(!indexedDB)return!1;const e=await Gt();return await Ht(e,"__sak","1"),await $t(e,"__sak"),!0}catch(e){}return!1}async _withPendingWrite(e){this.pendingWrites++;try{await e()}finally{this.pendingWrites--}}async _set(e,t){return this._withPendingWrite(async()=>(await this._withRetries(n=>Ht(n,e,t)),this.localCache[e]=t,this.notifyServiceWorker(e)))}async _get(e){const t=await this._withRetries(t=>async function(e,t){const n=Wt(e,!1).get(t),r=await new Kt(n).toPromise();return void 0===r?null:r.value}(t,e));return this.localCache[e]=t,t}async _remove(e){return this._withPendingWrite(async()=>(await this._withRetries(t=>$t(t,e)),delete this.localCache[e],this.notifyServiceWorker(e)))}async _poll(){const e=await this._withRetries(e=>{const t=Wt(e,!1).getAll();return new Kt(t).toPromise()});if(!e)return[];if(0!==this.pendingWrites)return[];const t=[],n=new Set;for(const{fbase_key:r,value:i}of e)n.add(r),JSON.stringify(this.localCache[r])!==JSON.stringify(i)&&(this.notifyListeners(r,i),t.push(r));for(const e of Object.keys(this.localCache))this.localCache[e]&&!n.has(e)&&(this.notifyListeners(e,null),t.push(e));return t}notifyListeners(e,t){this.localCache[e]=t;const n=this.listeners[e];if(n)for(const e of Array.from(n))e(t)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(async()=>this._poll(),800)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}_addListener(e,t){0===Object.keys(this.listeners).length&&this.startPolling(),this.listeners[e]||(this.listeners[e]=new Set,this._get(e)),this.listeners[e].add(t)}_removeListener(e,t){this.listeners[e]&&(this.listeners[e].delete(t),0===this.listeners[e].size&&delete this.listeners[e]),0===Object.keys(this.listeners).length&&this.stopPolling()}}Qt.type="LOCAL";const Jt=Qt; + */Jt.receivers=[];class Zt{constructor(e){this.target=e,this.handlers=new Set}removeMessageHandler(e){e.messageChannel&&(e.messageChannel.port1.removeEventListener("message",e.onMessage),e.messageChannel.port1.close()),this.handlers.delete(e)}async _send(e,t,n=50){const r="undefined"!=typeof MessageChannel?new MessageChannel:null;if(!r)throw new Error("connection_unavailable");let i,s;return new Promise((o,a)=>{const c=Xt("",20);r.port1.start();const u=setTimeout(()=>{a(new Error("unsupported_event"))},n);s={messageChannel:r,onMessage(e){const t=e;if(t.data.eventId===c)switch(t.data.status){case"ack":clearTimeout(u),i=setTimeout(()=>{a(new Error("timeout"))},3e3);break;case"done":clearTimeout(i),o(t.data.response);break;default:clearTimeout(u),clearTimeout(i),a(new Error("invalid_response"))}}},this.handlers.add(s),r.port1.addEventListener("message",s.onMessage),this.target.postMessage({eventType:e,eventId:c,data:t},[r.port2])}).finally(()=>{s&&this.removeMessageHandler(s)})}} /** * @license * Copyright 2020 Google LLC @@ -1452,10 +1516,10 @@ const zt="firebaseLocalStorageDb";class Kt{constructor(e){this.request=e}toPromi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Yt(e){return new Promise((t,n)=>{const r=document.createElement("script"); + */function en(){return window} /** * @license - * Copyright 2020 Google LLC + * Copyright 2020 Google LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1469,10 +1533,10 @@ const zt="firebaseLocalStorageDb";class Kt{constructor(e){this.request=e}toPromi * See the License for the specific language governing permissions and * limitations under the License. */ -var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-error");t.customData=e,n(t)},r.type="text/javascript",r.charset="UTF-8",(null!==(s=null===(i=document.getElementsByTagName("head"))||void 0===i?void 0:i[0])&&void 0!==s?s:document).appendChild(r)})}function Xt(e){return`__${e}${Math.floor(1e6*Math.random())}`} +function tn(){return void 0!==en().WorkerGlobalScope&&"function"==typeof en().importScripts} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1485,7 +1549,8 @@ var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-err * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Zt{constructor(e){this.auth=e,this.counter=1e12,this._widgets=new Map}render(e,t){const n=this.counter;return this._widgets.set(n,new en(e,this.auth.name,t||{})),this.counter++,n}reset(e){var t;const n=e||1e12;null===(t=this._widgets.get(n))||void 0===t||t.delete(),this._widgets.delete(n)}getResponse(e){var t;const n=e||1e12;return(null===(t=this._widgets.get(n))||void 0===t?void 0:t.getResponse())||""}async execute(e){var t;const n=e||1e12;return null===(t=this._widgets.get(n))||void 0===t||t.execute(),""}}class en{constructor(e,t,n){this.params=n,this.timerId=null,this.deleted=!1,this.responseToken=null,this.clickHandler=()=>{this.execute()};const r="string"==typeof e?document.getElementById(e):e;I(r,"argument-error",{appName:t}),this.container=r,this.isVisible="invisible"!==this.params.size,this.isVisible?this.execute():this.container.addEventListener("click",this.clickHandler)}getResponse(){return this.checkIfDeleted(),this.responseToken}delete(){this.checkIfDeleted(),this.deleted=!0,this.timerId&&(clearTimeout(this.timerId),this.timerId=null),this.container.removeEventListener("click",this.clickHandler)}execute(){this.checkIfDeleted(),this.timerId||(this.timerId=window.setTimeout(()=>{this.responseToken=function(e){const t=[],n="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(let r=0;r{this.request.addEventListener("success",()=>{e(this.request.result)}),this.request.addEventListener("error",()=>{t(this.request.error)})})}}function sn(e,t){return e.transaction(["firebaseLocalStorage"],t?"readwrite":"readonly").objectStore("firebaseLocalStorage")}function on(){const e=indexedDB.open(nn,1);return new Promise((t,n)=>{e.addEventListener("error",()=>{n(e.error)}),e.addEventListener("upgradeneeded",()=>{const t=e.result;try{t.createObjectStore("firebaseLocalStorage",{keyPath:"fbase_key"})}catch(e){n(e)}}),e.addEventListener("success",async()=>{const n=e.result;n.objectStoreNames.contains("firebaseLocalStorage")?t(n):(n.close(),await function(){const e=indexedDB.deleteDatabase(nn);return new rn(e).toPromise()}(),t(await on()))})})}async function an(e,t,n){const r=sn(e,!0).put({fbase_key:t,value:n});return new rn(r).toPromise()}function cn(e,t){const n=sn(e,!0).delete(t);return new rn(n).toPromise()}class un{constructor(){this.type="LOCAL",this._shouldAllowMigration=!0,this.listeners={},this.localCache={},this.pollTimer=null,this.pendingWrites=0,this.receiver=null,this.sender=null,this.serviceWorkerReceiverAvailable=!1,this.activeServiceWorker=null,this._workerInitializationPromise=this.initializeServiceWorkerMessaging().then(()=>{},()=>{})}async _openDb(){return this.db||(this.db=await on()),this.db}async _withRetries(e){let t=0;for(;;)try{const t=await this._openDb();return await e(t)}catch(e){if(t++>3)throw e;this.db&&(this.db.close(),this.db=void 0)}}async initializeServiceWorkerMessaging(){return tn()?this.initializeReceiver():this.initializeSender()}async initializeReceiver(){this.receiver=Jt._getInstance(tn()?self:null),this.receiver._subscribe("keyChanged",async(e,t)=>({keyProcessed:(await this._poll()).includes(t.key)})),this.receiver._subscribe("ping",async(e,t)=>["keyChanged"])}async initializeSender(){var e,t;if(this.activeServiceWorker=await async function(){if(!(null===navigator||void 0===navigator?void 0:navigator.serviceWorker))return null;try{return(await navigator.serviceWorker.ready).active}catch(e){return null}}(),!this.activeServiceWorker)return;this.sender=new Zt(this.activeServiceWorker);const n=await this.sender._send("ping",{},800);n&&(null===(e=n[0])||void 0===e?void 0:e.fulfilled)&&(null===(t=n[0])||void 0===t?void 0:t.value.includes("keyChanged"))&&(this.serviceWorkerReceiverAvailable=!0)}async notifyServiceWorker(e){var t;if(this.sender&&this.activeServiceWorker&&((null===(t=null===navigator||void 0===navigator?void 0:navigator.serviceWorker)||void 0===t?void 0:t.controller)||null)===this.activeServiceWorker)try{await this.sender._send("keyChanged",{key:e},this.serviceWorkerReceiverAvailable?800:50)}catch(t){}}async _isAvailable(){try{if(!indexedDB)return!1;const e=await on();return await an(e,"__sak","1"),await cn(e,"__sak"),!0}catch(e){}return!1}async _withPendingWrite(e){this.pendingWrites++;try{await e()}finally{this.pendingWrites--}}async _set(e,t){return this._withPendingWrite(async()=>(await this._withRetries(n=>an(n,e,t)),this.localCache[e]=t,this.notifyServiceWorker(e)))}async _get(e){const t=await this._withRetries(t=>async function(e,t){const n=sn(e,!1).get(t),r=await new rn(n).toPromise();return void 0===r?null:r.value}(t,e));return this.localCache[e]=t,t}async _remove(e){return this._withPendingWrite(async()=>(await this._withRetries(t=>cn(t,e)),delete this.localCache[e],this.notifyServiceWorker(e)))}async _poll(){const e=await this._withRetries(e=>{const t=sn(e,!1).getAll();return new rn(t).toPromise()});if(!e)return[];if(0!==this.pendingWrites)return[];const t=[],n=new Set;for(const{fbase_key:r,value:i}of e)n.add(r),JSON.stringify(this.localCache[r])!==JSON.stringify(i)&&(this.notifyListeners(r,i),t.push(r));for(const e of Object.keys(this.localCache))this.localCache[e]&&!n.has(e)&&(this.notifyListeners(e,null),t.push(e));return t}notifyListeners(e,t){this.localCache[e]=t;const n=this.listeners[e];if(n)for(const e of Array.from(n))e(t)}startPolling(){this.stopPolling(),this.pollTimer=setInterval(async()=>this._poll(),800)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}_addListener(e,t){0===Object.keys(this.listeners).length&&this.startPolling(),this.listeners[e]||(this.listeners[e]=new Set,this._get(e)),this.listeners[e].add(t)}_removeListener(e,t){this.listeners[e]&&(this.listeners[e].delete(t),0===this.listeners[e].size&&delete this.listeners[e]),0===Object.keys(this.listeners).length&&this.stopPolling()}}un.type="LOCAL";const ln=un; /** * @license * Copyright 2020 Google LLC @@ -1501,7 +1566,7 @@ var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-err * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(50);const{callback:e,"expired-callback":t}=this.params;if(e)try{e(this.responseToken)}catch(e){}this.timerId=window.setTimeout(()=>{if(this.timerId=null,this.responseToken=null,t)try{t()}catch(e){}this.isVisible&&this.execute()},6e4)},500))}checkIfDeleted(){if(this.deleted)throw new Error("reCAPTCHA mock was already deleted!")}}const tn=Xt("rcb"),nn=new O(3e4,6e4);class rn{constructor(){this.hostLanguage="",this.counter=0,this.librarySeparatelyLoaded=!!qt().grecaptcha}load(e,t=""){return I(function(e){return e.length<=6&&/^\s*[a-zA-Z0-9\-]*\s*$/.test(e)}(t),e,"argument-error"),this.shouldResolveImmediately(t)?Promise.resolve(qt().grecaptcha):new Promise((n,i)=>{const s=qt().setTimeout(()=>{i(y(e,"network-request-failed"))},nn.get());qt()[tn]=()=>{qt().clearTimeout(s),delete qt()[tn];const r=qt().grecaptcha;if(!r)return void i(y(e,"internal-error"));const o=r.render;r.render=(e,t)=>{const n=o(e,t);return this.counter++,n},this.hostLanguage=t,n(r)};Yt("https://www.google.com/recaptcha/api.js??"+Object(r.x)({onload:tn,render:"explicit",hl:t})).catch(()=>{clearTimeout(s),i(y(e,"internal-error"))})})}clearedOneInstance(){this.counter--}shouldResolveImmediately(e){return!!qt().grecaptcha&&(e===this.hostLanguage||this.counter>0||this.librarySeparatelyLoaded)}}class sn{async load(e){return new Zt(e)}clearedOneInstance(){}} + */class hn{constructor(e){this.auth=e,this.counter=1e12,this._widgets=new Map}render(e,t){const n=this.counter;return this._widgets.set(n,new dn(e,this.auth.name,t||{})),this.counter++,n}reset(e){var t;const n=e||1e12;null===(t=this._widgets.get(n))||void 0===t||t.delete(),this._widgets.delete(n)}getResponse(e){var t;const n=e||1e12;return(null===(t=this._widgets.get(n))||void 0===t?void 0:t.getResponse())||""}async execute(e){var t;const n=e||1e12;return null===(t=this._widgets.get(n))||void 0===t||t.execute(),""}}class dn{constructor(e,t,n){this.params=n,this.timerId=null,this.deleted=!1,this.responseToken=null,this.clickHandler=()=>{this.execute()};const r="string"==typeof e?document.getElementById(e):e;I(r,"argument-error",{appName:t}),this.container=r,this.isVisible="invisible"!==this.params.size,this.isVisible?this.execute():this.container.addEventListener("click",this.clickHandler)}getResponse(){return this.checkIfDeleted(),this.responseToken}delete(){this.checkIfDeleted(),this.deleted=!0,this.timerId&&(clearTimeout(this.timerId),this.timerId=null),this.container.removeEventListener("click",this.clickHandler)}execute(){this.checkIfDeleted(),this.timerId||(this.timerId=window.setTimeout(()=>{this.responseToken=function(e){const t=[],n="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(let r=0;r{const t=y("internal-err * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const on={theme:"light",type:"image"};class an{constructor(e,t=Object.assign({},on),n){this.parameters=t,this.type="recaptcha",this.destroyed=!1,this.widgetId=null,this.tokenChangeListeners=new Set,this.renderPromise=null,this.recaptcha=null,this.auth=fe(n),this.isInvisible="invisible"===this.parameters.size,I("undefined"!=typeof document,this.auth,"operation-not-supported-in-this-environment");const r="string"==typeof e?document.getElementById(e):e;I(r,this.auth,"argument-error"),this.container=r,this.parameters.callback=this.makeTokenCallback(this.parameters.callback),this._recaptchaLoader=this.auth.settings.appVerificationDisabledForTesting?new sn:new rn,this.validateStartingState()}async verify(){this.assertNotDestroyed();const e=await this.render(),t=this.getAssertedRecaptcha(),n=t.getResponse(e);return n||new Promise(n=>{const r=e=>{e&&(this.tokenChangeListeners.delete(r),n(e))};this.tokenChangeListeners.add(r),this.isInvisible&&t.execute(e)})}render(){try{this.assertNotDestroyed()}catch(e){return Promise.reject(e)}return this.renderPromise||(this.renderPromise=this.makeRenderPromise().catch(e=>{throw this.renderPromise=null,e})),this.renderPromise}_reset(){this.assertNotDestroyed(),null!==this.widgetId&&this.getAssertedRecaptcha().reset(this.widgetId)}clear(){this.assertNotDestroyed(),this.destroyed=!0,this._recaptchaLoader.clearedOneInstance(),this.isInvisible||this.container.childNodes.forEach(e=>{this.container.removeChild(e)})}validateStartingState(){I(!this.parameters.sitekey,this.auth,"argument-error"),I(this.isInvisible||!this.container.hasChildNodes(),this.auth,"argument-error"),I("undefined"!=typeof document,this.auth,"operation-not-supported-in-this-environment")}makeTokenCallback(e){return t=>{if(this.tokenChangeListeners.forEach(e=>e(t)),"function"==typeof e)e(t);else if("string"==typeof e){const n=qt()[e];"function"==typeof n&&n(t)}}}assertNotDestroyed(){I(!this.destroyed,this.auth,"internal-error")}async makeRenderPromise(){if(await this.init(),!this.widgetId){let e=this.container;if(!this.isInvisible){const t=document.createElement("div");e.appendChild(t),e=t}this.widgetId=this.getAssertedRecaptcha().render(e,this.parameters)}return this.widgetId}async init(){I(A()&&!Bt(),this.auth,"internal-error"),await function(){let e=null;return new Promise(t=>{"complete"!==document.readyState?(e=()=>t(),window.addEventListener("load",e)):t()}).catch(t=>{throw e&&window.removeEventListener("load",e),t})} + */(50);const{callback:e,"expired-callback":t}=this.params;if(e)try{e(this.responseToken)}catch(e){}this.timerId=window.setTimeout(()=>{if(this.timerId=null,this.responseToken=null,t)try{t()}catch(e){}this.isVisible&&this.execute()},6e4)},500))}checkIfDeleted(){if(this.deleted)throw new Error("reCAPTCHA mock was already deleted!")}}const fn=ye("rcb"),pn=new C(3e4,6e4);class gn{constructor(){var e;this.hostLanguage="",this.counter=0,this.librarySeparatelyLoaded=!!(null===(e=en().grecaptcha)||void 0===e?void 0:e.render)}load(e,t=""){return I(function(e){return e.length<=6&&/^\s*[a-zA-Z0-9\-]*\s*$/.test(e)}(t),e,"argument-error"),this.shouldResolveImmediately(t)&&fe(en().grecaptcha)?Promise.resolve(en().grecaptcha):new Promise((n,i)=>{const s=en().setTimeout(()=>{i(y(e,"network-request-failed"))},pn.get());en()[fn]=()=>{en().clearTimeout(s),delete en()[fn];const r=en().grecaptcha;if(!r||!fe(r))return void i(y(e,"internal-error"));const o=r.render;r.render=(e,t)=>{const n=o(e,t);return this.counter++,n},this.hostLanguage=t,n(r)};me("https://www.google.com/recaptcha/api.js??"+Object(r.A)({onload:fn,render:"explicit",hl:t})).catch(()=>{clearTimeout(s),i(y(e,"internal-error"))})})}clearedOneInstance(){this.counter--}shouldResolveImmediately(e){var t;return!!(null===(t=en().grecaptcha)||void 0===t?void 0:t.render)&&(e===this.hostLanguage||this.counter>0||this.librarySeparatelyLoaded)}}class mn{async load(e){return new hn(e)}clearedOneInstance(){}} /** * @license * Copyright 2020 Google LLC @@ -1533,7 +1598,7 @@ var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-err * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(),this.recaptcha=await this._recaptchaLoader.load(this.auth,this.auth.languageCode||void 0);const e=await + */const yn={theme:"light",type:"image"};class vn{constructor(e,t=Object.assign({},yn),n){this.parameters=t,this.type="recaptcha",this.destroyed=!1,this.widgetId=null,this.tokenChangeListeners=new Set,this.renderPromise=null,this.recaptcha=null,this.auth=_e(n),this.isInvisible="invisible"===this.parameters.size,I("undefined"!=typeof document,this.auth,"operation-not-supported-in-this-environment");const r="string"==typeof e?document.getElementById(e):e;I(r,this.auth,"argument-error"),this.container=r,this.parameters.callback=this.makeTokenCallback(this.parameters.callback),this._recaptchaLoader=this.auth.settings.appVerificationDisabledForTesting?new mn:new gn,this.validateStartingState()}async verify(){this.assertNotDestroyed();const e=await this.render(),t=this.getAssertedRecaptcha(),n=t.getResponse(e);return n||new Promise(n=>{const r=e=>{e&&(this.tokenChangeListeners.delete(r),n(e))};this.tokenChangeListeners.add(r),this.isInvisible&&t.execute(e)})}render(){try{this.assertNotDestroyed()}catch(e){return Promise.reject(e)}return this.renderPromise||(this.renderPromise=this.makeRenderPromise().catch(e=>{throw this.renderPromise=null,e})),this.renderPromise}_reset(){this.assertNotDestroyed(),null!==this.widgetId&&this.getAssertedRecaptcha().reset(this.widgetId)}clear(){this.assertNotDestroyed(),this.destroyed=!0,this._recaptchaLoader.clearedOneInstance(),this.isInvisible||this.container.childNodes.forEach(e=>{this.container.removeChild(e)})}validateStartingState(){I(!this.parameters.sitekey,this.auth,"argument-error"),I(this.isInvisible||!this.container.hasChildNodes(),this.auth,"argument-error"),I("undefined"!=typeof document,this.auth,"operation-not-supported-in-this-environment")}makeTokenCallback(e){return t=>{if(this.tokenChangeListeners.forEach(e=>e(t)),"function"==typeof e)e(t);else if("string"==typeof e){const n=en()[e];"function"==typeof n&&n(t)}}}assertNotDestroyed(){I(!this.destroyed,this.auth,"internal-error")}async makeRenderPromise(){if(await this.init(),!this.widgetId){let e=this.container;if(!this.isInvisible){const t=document.createElement("div");e.appendChild(t),e=t}this.widgetId=this.getAssertedRecaptcha().render(e,this.parameters)}return this.widgetId}async init(){I(S()&&!tn(),this.auth,"internal-error"),await function(){let e=null;return new Promise(t=>{"complete"!==document.readyState?(e=()=>t(),window.addEventListener("load",e)):t()}).catch(t=>{throw e&&window.removeEventListener("load",e),t})} /** * @license * Copyright 2020 Google LLC @@ -1549,8 +1614,7 @@ var i,s;r.setAttribute("src",e),r.onload=t,r.onerror=e=>{const t=y("internal-err * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -async function(e){return(await x(e,"GET","/v1/recaptchaParams")).recaptchaSiteKey||""}(this.auth);I(e,this.auth,"internal-error"),this.parameters.sitekey=e}getAssertedRecaptcha(){return I(this.recaptcha,this.auth,"internal-error"),this.recaptcha}}class cn{constructor(e,t){this.verificationId=e,this.onConfirmation=t}confirm(e){const t=Se._fromVerification(this.verificationId,e);return this.onConfirmation(t)}}async function un(e,t,n){const i=fe(e),s=await dn(i,t,Object(r.k)(n));return new cn(s,e=>Je(i,e))}async function hn(e,t,n){const i=Object(r.k)(e);await He(!1,i,"phone");const s=await dn(i.auth,t,Object(r.k)(n));return new cn(s,e=>Ye(i,e))}async function ln(e,t,n){const i=Object(r.k)(e),s=await dn(i.auth,t,Object(r.k)(n));return new cn(s,e=>Xe(i,e))}async function dn(e,t,n){var r;const i=await n.verify();try{let s;if(I("string"==typeof i,e,"argument-error"),I("recaptcha"===n.type,e,"argument-error"),s="string"==typeof t?{phoneNumber:t}:t,"session"in s){const t=s.session;if("phoneNumber"in s){I("enroll"===t.type,e,"internal-error");return(await function(e,t){return x(e,"POST","/v2/accounts/mfaEnrollment:start",L(e,t))}(e,{idToken:t.credential,phoneEnrollmentInfo:{phoneNumber:s.phoneNumber,recaptchaToken:i}})).phoneSessionInfo.sessionInfo}{I("signin"===t.type,e,"internal-error");const n=(null===(r=s.multiFactorHint)||void 0===r?void 0:r.uid)||s.multiFactorUid;I(n,e,"missing-multi-factor-info");return(await function(e,t){return x(e,"POST","/v2/accounts/mfaSignIn:start",L(e,t))}(e,{mfaPendingCredential:t.credential,mfaEnrollmentId:n,phoneSignInInfo:{recaptchaToken:i}})).phoneResponseInfo.sessionInfo}}{const{sessionInfo:t}=await async function(e,t){return x(e,"POST","/v1/accounts:sendVerificationCode",L(e,t))}(e,{phoneNumber:s.phoneNumber,recaptchaToken:i});return t}}finally{n._reset()}}async function fn(e,t){await Ge(Object(r.k)(e),t)} + */(),this.recaptcha=await this._recaptchaLoader.load(this.auth,this.auth.languageCode||void 0);const e=await async function(e){return(await x(e,"GET","/v1/recaptchaParams")).recaptchaSiteKey||""}(this.auth);I(e,this.auth,"internal-error"),this.parameters.sitekey=e}getAssertedRecaptcha(){return I(this.recaptcha,this.auth,"internal-error"),this.recaptcha}}class wn{constructor(e,t){this.verificationId=e,this.onConfirmation=t}confirm(e){const t=Ve._fromVerification(this.verificationId,e);return this.onConfirmation(t)}}async function bn(e,t,n){const i=_e(e),s=await Tn(i,t,Object(r.p)(n));return new wn(s,e=>ct(i,e))}async function In(e,t,n){const i=Object(r.p)(e);await st(!1,i,"phone");const s=await Tn(i.auth,t,Object(r.p)(n));return new wn(s,e=>ut(i,e))}async function _n(e,t,n){const i=Object(r.p)(e),s=await Tn(i.auth,t,Object(r.p)(n));return new wn(s,e=>lt(i,e))}async function Tn(e,t,n){var r;const i=await n.verify();try{let s;if(I("string"==typeof i,e,"argument-error"),I("recaptcha"===n.type,e,"argument-error"),s="string"==typeof t?{phoneNumber:t}:t,"session"in s){const t=s.session;if("phoneNumber"in s){I("enroll"===t.type,e,"internal-error");return(await function(e,t){return x(e,"POST","/v2/accounts/mfaEnrollment:start",R(e,t))}(e,{idToken:t.credential,phoneEnrollmentInfo:{phoneNumber:s.phoneNumber,recaptchaToken:i}})).phoneSessionInfo.sessionInfo}{I("signin"===t.type,e,"internal-error");const n=(null===(r=s.multiFactorHint)||void 0===r?void 0:r.uid)||s.multiFactorUid;I(n,e,"missing-multi-factor-info");return(await function(e,t){return x(e,"POST","/v2/accounts/mfaSignIn:start",R(e,t))}(e,{mfaPendingCredential:t.credential,mfaEnrollmentId:n,phoneSignInInfo:{recaptchaToken:i}})).phoneResponseInfo.sessionInfo}}{const{sessionInfo:t}=await async function(e,t){return x(e,"POST","/v1/accounts:sendVerificationCode",R(e,t))}(e,{phoneNumber:s.phoneNumber,recaptchaToken:i});return t}}finally{n._reset()}}async function En(e,t){await it(Object(r.p)(e),t)} /** * @license * Copyright 2020 Google LLC @@ -1566,7 +1630,7 @@ async function(e){return(await x(e,"GET","/v1/recaptchaParams")).recaptchaSiteKe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class pn{constructor(e){this.providerId=pn.PROVIDER_ID,this.auth=fe(e)}verifyPhoneNumber(e,t){return dn(this.auth,e,Object(r.k)(t))}static credential(e,t){return Se._fromVerification(e,t)}static credentialFromResult(e){const t=e;return pn.credentialFromTaggedObject(t)}static credentialFromError(e){return pn.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{phoneNumber:t,temporaryProof:n}=e;return t&&n?Se._fromTokenResponse(t,n):null}} + */class Sn{constructor(e){this.providerId=Sn.PROVIDER_ID,this.auth=_e(e)}verifyPhoneNumber(e,t){return Tn(this.auth,e,Object(r.p)(t))}static credential(e,t){return Ve._fromVerification(e,t)}static credentialFromResult(e){const t=e;return Sn.credentialFromTaggedObject(t)}static credentialFromError(e){return Sn.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null;const{phoneNumber:t,temporaryProof:n}=e;return t&&n?Ve._fromTokenResponse(t,n):null}} /** * @license * Copyright 2021 Google LLC @@ -1583,7 +1647,7 @@ async function(e){return(await x(e,"GET","/v1/recaptchaParams")).recaptchaSiteKe * See the License for the specific language governing permissions and * limitations under the License. */ -function mn(e,t){return t?k(t):(I(e._popupRedirectResolver,e,"argument-error"),e._popupRedirectResolver)} +function kn(e,t){return t?Y(t):(I(e._popupRedirectResolver,e,"argument-error"),e._popupRedirectResolver)} /** * @license * Copyright 2019 Google LLC @@ -1599,7 +1663,7 @@ function mn(e,t){return t?k(t):(I(e._popupRedirectResolver,e,"argument-error"),e * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */pn.PROVIDER_ID="phone",pn.PHONE_SIGN_IN_METHOD="phone";class gn extends ve{constructor(e){super("custom","custom"),this.params=e}_getIdTokenResponse(e){return Te(e,this._buildIdpRequest())}_linkToIdToken(e,t){return Te(e,this._buildIdpRequest(t))}_getReauthenticationResolver(e){return Te(e,this._buildIdpRequest())}_buildIdpRequest(e){const t={requestUri:this.params.requestUri,sessionId:this.params.sessionId,postBody:this.params.postBody,tenantId:this.params.tenantId,pendingToken:this.params.pendingToken,returnSecureToken:!0,returnIdpCredential:!0};return e&&(t.idToken=e),t}}function yn(e){return Qe(e.auth,new gn(e),e.bypassAuthState)}function vn(e){const{auth:t,user:n}=e;return I(n,t,"internal-error"),$e(n,new gn(e),e.bypassAuthState)}async function wn(e){const{auth:t,user:n}=e;return I(n,t,"internal-error"),Ge(n,new gn(e),e.bypassAuthState)} + */Sn.PROVIDER_ID="phone",Sn.PHONE_SIGN_IN_METHOD="phone";class Cn extends Ce{constructor(e){super("custom","custom"),this.params=e}_getIdTokenResponse(e){return Le(e,this._buildIdpRequest())}_linkToIdToken(e,t){return Le(e,this._buildIdpRequest(t))}_getReauthenticationResolver(e){return Le(e,this._buildIdpRequest())}_buildIdpRequest(e){const t={requestUri:this.params.requestUri,sessionId:this.params.sessionId,postBody:this.params.postBody,tenantId:this.params.tenantId,pendingToken:this.params.pendingToken,returnSecureToken:!0,returnIdpCredential:!0};return e&&(t.idToken=e),t}}function An(e){return at(e.auth,new Cn(e),e.bypassAuthState)}function Nn(e){const{auth:t,user:n}=e;return I(n,t,"internal-error"),ot(n,new Cn(e),e.bypassAuthState)}async function Dn(e){const{auth:t,user:n}=e;return I(n,t,"internal-error"),it(n,new Cn(e),e.bypassAuthState)} /** * @license * Copyright 2020 Google LLC @@ -1615,7 +1679,7 @@ function mn(e,t){return t?k(t):(I(e._popupRedirectResolver,e,"argument-error"),e * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class bn{constructor(e,t,n,r,i=!1){this.auth=e,this.resolver=n,this.user=r,this.bypassAuthState=i,this.pendingPromise=null,this.eventManager=null,this.filter=Array.isArray(t)?t:[t]}execute(){return new Promise(async(e,t)=>{this.pendingPromise={resolve:e,reject:t};try{this.eventManager=await this.resolver._initialize(this.auth),await this.onExecution(),this.eventManager.registerConsumer(this)}catch(e){this.reject(e)}})}async onAuthEvent(e){const{urlResponse:t,sessionId:n,postBody:r,tenantId:i,error:s,type:o}=e;if(s)return void this.reject(s);const a={auth:this.auth,requestUri:t,sessionId:n,tenantId:i||void 0,postBody:r||void 0,user:this.user,bypassAuthState:this.bypassAuthState};try{this.resolve(await this.getIdpTask(o)(a))}catch(e){this.reject(e)}}onError(e){this.reject(e)}getIdpTask(e){switch(e){case"signInViaPopup":case"signInViaRedirect":return yn;case"linkViaPopup":case"linkViaRedirect":return wn;case"reauthViaPopup":case"reauthViaRedirect":return vn;default:g(this.auth,"internal-error")}}resolve(e){T(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.resolve(e),this.unregisterAndCleanUp()}reject(e){T(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.reject(e),this.unregisterAndCleanUp()}unregisterAndCleanUp(){this.eventManager&&this.eventManager.unregisterConsumer(this),this.pendingPromise=null,this.cleanUp()}} + */class On{constructor(e,t,n,r,i=!1){this.auth=e,this.resolver=n,this.user=r,this.bypassAuthState=i,this.pendingPromise=null,this.eventManager=null,this.filter=Array.isArray(t)?t:[t]}execute(){return new Promise(async(e,t)=>{this.pendingPromise={resolve:e,reject:t};try{this.eventManager=await this.resolver._initialize(this.auth),await this.onExecution(),this.eventManager.registerConsumer(this)}catch(e){this.reject(e)}})}async onAuthEvent(e){const{urlResponse:t,sessionId:n,postBody:r,tenantId:i,error:s,type:o}=e;if(s)return void this.reject(s);const a={auth:this.auth,requestUri:t,sessionId:n,tenantId:i||void 0,postBody:r||void 0,user:this.user,bypassAuthState:this.bypassAuthState};try{this.resolve(await this.getIdpTask(o)(a))}catch(e){this.reject(e)}}onError(e){this.reject(e)}getIdpTask(e){switch(e){case"signInViaPopup":case"signInViaRedirect":return An;case"linkViaPopup":case"linkViaRedirect":return Dn;case"reauthViaPopup":case"reauthViaRedirect":return Nn;default:m(this.auth,"internal-error")}}resolve(e){T(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.resolve(e),this.unregisterAndCleanUp()}reject(e){T(this.pendingPromise,"Pending promise was never set"),this.pendingPromise.reject(e),this.unregisterAndCleanUp()}unregisterAndCleanUp(){this.eventManager&&this.eventManager.unregisterConsumer(this),this.pendingPromise=null,this.cleanUp()}} /** * @license * Copyright 2020 Google LLC @@ -1631,7 +1695,7 @@ function mn(e,t){return t?k(t):(I(e._popupRedirectResolver,e,"argument-error"),e * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const In=new O(2e3,1e4);async function _n(e,t,n){const r=fe(e);w(e,t,Oe);const i=mn(r,n);return new kn(r,"signInViaPopup",t,i).executeNotNull()}async function Tn(e,t,n){const i=Object(r.k)(e);w(i.auth,t,Oe);const s=mn(i.auth,n);return new kn(i.auth,"reauthViaPopup",t,s,i).executeNotNull()}async function En(e,t,n){const i=Object(r.k)(e);w(i.auth,t,Oe);const s=mn(i.auth,n);return new kn(i.auth,"linkViaPopup",t,s,i).executeNotNull()}class kn extends bn{constructor(e,t,n,r,i){super(e,t,r,i),this.provider=n,this.authWindow=null,this.pollId=null,kn.currentPopupAction&&kn.currentPopupAction.cancel(),kn.currentPopupAction=this}async executeNotNull(){const e=await this.execute();return I(e,this.auth,"internal-error"),e}async onExecution(){T(1===this.filter.length,"Popup operations only handle one event");const e=Ut();this.authWindow=await this.resolver._openPopup(this.auth,this.provider,this.filter[0],e),this.authWindow.associatedEvent=e,this.resolver._originValidation(this.auth).catch(e=>{this.reject(e)}),this.resolver._isIframeWebStorageSupported(this.auth,e=>{e||this.reject(y(this.auth,"web-storage-unsupported"))}),this.pollUserCancellation()}get eventId(){var e;return(null===(e=this.authWindow)||void 0===e?void 0:e.associatedEvent)||null}cancel(){this.reject(y(this.auth,"cancelled-popup-request"))}cleanUp(){this.authWindow&&this.authWindow.close(),this.pollId&&window.clearTimeout(this.pollId),this.authWindow=null,this.pollId=null,kn.currentPopupAction=null}pollUserCancellation(){const e=()=>{var t,n;(null===(n=null===(t=this.authWindow)||void 0===t?void 0:t.window)||void 0===n?void 0:n.closed)?this.pollId=window.setTimeout(()=>{this.pollId=null,this.reject(y(this.auth,"popup-closed-by-user"))},2e3):this.pollId=window.setTimeout(e,In.get())};e()}}kn.currentPopupAction=null; + */const Rn=new C(2e3,1e4);async function xn(e,t,n){const r=_e(e);w(e,t,qe);const i=kn(r,n);return new Mn(r,"signInViaPopup",t,i).executeNotNull()}async function Pn(e,t,n){const i=Object(r.p)(e);w(i.auth,t,qe);const s=kn(i.auth,n);return new Mn(i.auth,"reauthViaPopup",t,s,i).executeNotNull()}async function Ln(e,t,n){const i=Object(r.p)(e);w(i.auth,t,qe);const s=kn(i.auth,n);return new Mn(i.auth,"linkViaPopup",t,s,i).executeNotNull()}class Mn extends On{constructor(e,t,n,r,i){super(e,t,r,i),this.provider=n,this.authWindow=null,this.pollId=null,Mn.currentPopupAction&&Mn.currentPopupAction.cancel(),Mn.currentPopupAction=this}async executeNotNull(){const e=await this.execute();return I(e,this.auth,"internal-error"),e}async onExecution(){T(1===this.filter.length,"Popup operations only handle one event");const e=Xt();this.authWindow=await this.resolver._openPopup(this.auth,this.provider,this.filter[0],e),this.authWindow.associatedEvent=e,this.resolver._originValidation(this.auth).catch(e=>{this.reject(e)}),this.resolver._isIframeWebStorageSupported(this.auth,e=>{e||this.reject(y(this.auth,"web-storage-unsupported"))}),this.pollUserCancellation()}get eventId(){var e;return(null===(e=this.authWindow)||void 0===e?void 0:e.associatedEvent)||null}cancel(){this.reject(y(this.auth,"cancelled-popup-request"))}cleanUp(){this.authWindow&&this.authWindow.close(),this.pollId&&window.clearTimeout(this.pollId),this.authWindow=null,this.pollId=null,Mn.currentPopupAction=null}pollUserCancellation(){const e=()=>{var t,n;(null===(n=null===(t=this.authWindow)||void 0===t?void 0:t.window)||void 0===n?void 0:n.closed)?this.pollId=window.setTimeout(()=>{this.pollId=null,this.reject(y(this.auth,"popup-closed-by-user"))},8e3):this.pollId=window.setTimeout(e,Rn.get())};e()}}Mn.currentPopupAction=null; /** * @license * Copyright 2020 Google LLC @@ -1648,7 +1712,7 @@ function mn(e,t){return t?k(t):(I(e._popupRedirectResolver,e,"argument-error"),e * See the License for the specific language governing permissions and * limitations under the License. */ -const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRedirect","linkViaRedirect","reauthViaRedirect","unknown"],t,void 0,n),this.eventId=null}async execute(){let e=Sn.get(this.auth._key());if(!e){try{const t=await async function(e,t){const n=Cn(t),r=On(e);if(!await r._isAvailable())return!1;const i="true"===await r._get(n);return await r._remove(n),i}(this.resolver,this.auth)?await super.execute():null;e=()=>Promise.resolve(t)}catch(t){e=()=>Promise.reject(t)}Sn.set(this.auth._key(),e)}return this.bypassAuthState||Sn.set(this.auth._key(),()=>Promise.resolve(null)),e()}async onAuthEvent(e){if("signInViaRedirect"===e.type)return super.onAuthEvent(e);if("unknown"!==e.type){if(e.eventId){const t=await this.auth._redirectUserForId(e.eventId);if(t)return this.user=t,super.onAuthEvent(e);this.resolve(null)}}else this.resolve(null)}async onExecution(){}cleanUp(){}}async function Nn(e,t){return On(e)._set(Cn(t),"true")}function On(e){return k(e._redirectPersistence)}function Cn(e){return Z("pendingRedirect",e.config.apiKey,e.name)} +const Fn=new Map;class Vn extends On{constructor(e,t,n=!1){super(e,["signInViaRedirect","linkViaRedirect","reauthViaRedirect","unknown"],t,void 0,n),this.eventId=null}async execute(){let e=Fn.get(this.auth._key());if(!e){try{const t=await async function(e,t){const n=Bn(t),r=qn(e);if(!await r._isAvailable())return!1;const i="true"===await r._get(n);return await r._remove(n),i}(this.resolver,this.auth)?await super.execute():null;e=()=>Promise.resolve(t)}catch(t){e=()=>Promise.reject(t)}Fn.set(this.auth._key(),e)}return this.bypassAuthState||Fn.set(this.auth._key(),()=>Promise.resolve(null)),e()}async onAuthEvent(e){if("signInViaRedirect"===e.type)return super.onAuthEvent(e);if("unknown"!==e.type){if(e.eventId){const t=await this.auth._redirectUserForId(e.eventId);if(t)return this.user=t,super.onAuthEvent(e);this.resolve(null)}}else this.resolve(null)}async onExecution(){}cleanUp(){}}async function jn(e,t){return qn(e)._set(Bn(t),"true")}function Un(e,t){Fn.set(e._key(),t)}function qn(e){return Y(e._redirectPersistence)}function Bn(e){return Z("pendingRedirect",e.config.apiKey,e.name)} /** * @license * Copyright 2020 Google LLC @@ -1664,7 +1728,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Dn(e,t,n){return async function(e,t,n){const r=fe(e);w(e,t,Oe);const i=mn(r,n);return await Nn(i,r),i._openRedirect(r,t,"signInViaRedirect")}(e,t,n)}function Rn(e,t,n){return async function(e,t,n){const i=Object(r.k)(e);w(i.auth,t,Oe);const s=mn(i.auth,n);await Nn(s,i.auth);const o=await Mn(i);return s._openRedirect(i.auth,t,"reauthViaRedirect",o)}(e,t,n)}function Pn(e,t,n){return async function(e,t,n){const i=Object(r.k)(e);w(i.auth,t,Oe);const s=mn(i.auth,n);await He(!1,i,t.providerId),await Nn(s,i.auth);const o=await Mn(i);return s._openRedirect(i.auth,t,"linkViaRedirect",o)}(e,t,n)}async function Ln(e,t){return await fe(e)._initializationPromise,xn(e,t,!1)}async function xn(e,t,n=!1){const r=fe(e),i=mn(r,t),s=new An(r,i,n),o=await s.execute();return o&&!n&&(delete o.user._redirectEventId,await r._persistUserIfCurrent(o.user),await r._setRedirectUser(null,t)),o}async function Mn(e){const t=Ut(e.uid+":::");return e._redirectEventId=t,await e.auth._setRedirectUser(e),await e.auth._persistUserIfCurrent(e),t} + */function zn(e,t,n){return async function(e,t,n){const r=_e(e);w(e,t,qe),await r._initializationPromise;const i=kn(r,n);return await jn(i,r),i._openRedirect(r,t,"signInViaRedirect")}(e,t,n)}function Gn(e,t,n){return async function(e,t,n){const i=Object(r.p)(e);w(i.auth,t,qe),await i.auth._initializationPromise;const s=kn(i.auth,n);await jn(s,i.auth);const o=await Hn(i);return s._openRedirect(i.auth,t,"reauthViaRedirect",o)}(e,t,n)}function Kn(e,t,n){return async function(e,t,n){const i=Object(r.p)(e);w(i.auth,t,qe),await i.auth._initializationPromise;const s=kn(i.auth,n);await st(!1,i,t.providerId),await jn(s,i.auth);const o=await Hn(i);return s._openRedirect(i.auth,t,"linkViaRedirect",o)}(e,t,n)}async function $n(e,t){return await _e(e)._initializationPromise,Wn(e,t,!1)}async function Wn(e,t,n=!1){const r=_e(e),i=kn(r,t),s=new Vn(r,i,n),o=await s.execute();return o&&!n&&(delete o.user._redirectEventId,await r._persistUserIfCurrent(o.user),await r._setRedirectUser(null,t)),o}async function Hn(e){const t=Xt(e.uid+":::");return e._redirectEventId=t,await e.auth._setRedirectUser(e),await e.auth._persistUserIfCurrent(e),t} /** * @license * Copyright 2020 Google LLC @@ -1680,7 +1744,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Fn{constructor(e){this.auth=e,this.cachedEventUids=new Set,this.consumers=new Set,this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1,this.lastProcessedEventTime=Date.now()}registerConsumer(e){this.consumers.add(e),this.queuedRedirectEvent&&this.isEventForConsumer(this.queuedRedirectEvent,e)&&(this.sendToConsumer(this.queuedRedirectEvent,e),this.saveEventToCache(this.queuedRedirectEvent),this.queuedRedirectEvent=null)}unregisterConsumer(e){this.consumers.delete(e)}onEvent(e){if(this.hasEventBeenHandled(e))return!1;let t=!1;return this.consumers.forEach(n=>{this.isEventForConsumer(e,n)&&(t=!0,this.sendToConsumer(e,n),this.saveEventToCache(e))}),this.hasHandledPotentialRedirect||!function(e){switch(e.type){case"signInViaRedirect":case"linkViaRedirect":case"reauthViaRedirect":return!0;case"unknown":return Un(e);default:return!1}} + */class Qn{constructor(e){this.auth=e,this.cachedEventUids=new Set,this.consumers=new Set,this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1,this.lastProcessedEventTime=Date.now()}registerConsumer(e){this.consumers.add(e),this.queuedRedirectEvent&&this.isEventForConsumer(this.queuedRedirectEvent,e)&&(this.sendToConsumer(this.queuedRedirectEvent,e),this.saveEventToCache(this.queuedRedirectEvent),this.queuedRedirectEvent=null)}unregisterConsumer(e){this.consumers.delete(e)}onEvent(e){if(this.hasEventBeenHandled(e))return!1;let t=!1;return this.consumers.forEach(n=>{this.isEventForConsumer(e,n)&&(t=!0,this.sendToConsumer(e,n),this.saveEventToCache(e))}),this.hasHandledPotentialRedirect||!function(e){switch(e.type){case"signInViaRedirect":case"linkViaRedirect":case"reauthViaRedirect":return!0;case"unknown":return Jn(e);default:return!1}} /** * @license * Copyright 2020 Google LLC @@ -1696,7 +1760,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e)||(this.hasHandledPotentialRedirect=!0,t||(this.queuedRedirectEvent=e,t=!0)),t}sendToConsumer(e,t){var n;if(e.error&&!Un(e)){const r=(null===(n=e.error.code)||void 0===n?void 0:n.split("auth/")[1])||"internal-error";t.onError(y(this.auth,r))}else t.onAuthEvent(e)}isEventForConsumer(e,t){const n=null===t.eventId||!!e.eventId&&e.eventId===t.eventId;return t.filter.includes(e.type)&&n}hasEventBeenHandled(e){return Date.now()-this.lastProcessedEventTime>=6e5&&this.cachedEventUids.clear(),this.cachedEventUids.has(jn(e))}saveEventToCache(e){this.cachedEventUids.add(jn(e)),this.lastProcessedEventTime=Date.now()}}function jn(e){return[e.type,e.eventId,e.sessionId,e.tenantId].filter(e=>e).join("-")}function Un({type:e,error:t}){return"unknown"===e&&"auth/no-auth-event"===(null==t?void 0:t.code)}async function Vn(e,t={}){return x(e,"GET","/v1/projects",t)} + */(e)||(this.hasHandledPotentialRedirect=!0,t||(this.queuedRedirectEvent=e,t=!0)),t}sendToConsumer(e,t){var n;if(e.error&&!Jn(e)){const r=(null===(n=e.error.code)||void 0===n?void 0:n.split("auth/")[1])||"internal-error";t.onError(y(this.auth,r))}else t.onAuthEvent(e)}isEventForConsumer(e,t){const n=null===t.eventId||!!e.eventId&&e.eventId===t.eventId;return t.filter.includes(e.type)&&n}hasEventBeenHandled(e){return Date.now()-this.lastProcessedEventTime>=6e5&&this.cachedEventUids.clear(),this.cachedEventUids.has(Yn(e))}saveEventToCache(e){this.cachedEventUids.add(Yn(e)),this.lastProcessedEventTime=Date.now()}}function Yn(e){return[e.type,e.eventId,e.sessionId,e.tenantId].filter(e=>e).join("-")}function Jn({type:e,error:t}){return"unknown"===e&&"auth/no-auth-event"===(null==t?void 0:t.code)}async function Xn(e,t={}){return x(e,"GET","/v1/projects",t)} /** * @license * Copyright 2020 Google LLC @@ -1712,7 +1776,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const qn=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,Bn=/^https?/;function zn(e){const t=S(),{protocol:n,hostname:r}=new URL(t);if(e.startsWith("chrome-extension://")){const i=new URL(e);return""===i.hostname&&""===r?"chrome-extension:"===n&&e.replace("chrome-extension://","")===t.replace("chrome-extension://",""):"chrome-extension:"===n&&i.hostname===r}if(!Bn.test(n))return!1;if(qn.test(e))return r===e;const i=e.replace(/\./g,"\\.");return new RegExp("^(.+\\."+i+"|"+i+")$","i").test(r)} + */const Zn=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,er=/^https?/;function tr(e){const t=E(),{protocol:n,hostname:r}=new URL(t);if(e.startsWith("chrome-extension://")){const i=new URL(e);return""===i.hostname&&""===r?"chrome-extension:"===n&&e.replace("chrome-extension://","")===t.replace("chrome-extension://",""):"chrome-extension:"===n&&i.hostname===r}if(!er.test(n))return!1;if(Zn.test(e))return r===e;const i=e.replace(/\./g,"\\.");return new RegExp("^(.+\\."+i+"|"+i+")$","i").test(r)} /** * @license * Copyright 2020 Google LLC. @@ -1728,7 +1792,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Kn=new O(3e4,6e4);function Wn(){const e=qt().___jsl;if(null==e?void 0:e.H)for(const t of Object.keys(e.H))if(e.H[t].r=e.H[t].r||[],e.H[t].L=e.H[t].L||[],e.H[t].r=[...e.H[t].L],e.CP)for(let t=0;t{var r,i,s;function o(){Wn(),gapi.load("gapi.iframes",{callback:()=>{t(gapi.iframes.getContext())},ontimeout:()=>{Wn(),n(y(e,"network-request-failed"))},timeout:Kn.get()})}if(null===(i=null===(r=qt().gapi)||void 0===r?void 0:r.iframes)||void 0===i?void 0:i.Iframe)t(gapi.iframes.getContext());else{if(!(null===(s=qt().gapi)||void 0===s?void 0:s.load)){const t=Xt("iframefcb");return qt()[t]=()=>{gapi.load?o():n(y(e,"network-request-failed"))},Yt("https://apis.google.com/js/api.js?onload="+t).catch(e=>n(e))}o()}}).catch(e=>{throw Gn=null,e})}(e),Gn} + */const nr=new C(3e4,6e4);function rr(){const e=en().___jsl;if(null==e?void 0:e.H)for(const t of Object.keys(e.H))if(e.H[t].r=e.H[t].r||[],e.H[t].L=e.H[t].L||[],e.H[t].r=[...e.H[t].L],e.CP)for(let t=0;t{var r,i,s;function o(){rr(),gapi.load("gapi.iframes",{callback:()=>{t(gapi.iframes.getContext())},ontimeout:()=>{rr(),n(y(e,"network-request-failed"))},timeout:nr.get()})}if(null===(i=null===(r=en().gapi)||void 0===r?void 0:r.iframes)||void 0===i?void 0:i.Iframe)t(gapi.iframes.getContext());else{if(!(null===(s=en().gapi)||void 0===s?void 0:s.load)){const t=ye("iframefcb");return en()[t]=()=>{gapi.load?o():n(y(e,"network-request-failed"))},me("https://apis.google.com/js/api.js?onload="+t).catch(e=>n(e))}o()}}).catch(e=>{throw ir=null,e})}(e),ir} /** * @license * Copyright 2020 Google LLC. @@ -1744,7 +1808,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const $n=new O(5e3,15e3),Qn={style:{position:"absolute",top:"-100px",width:"1px",height:"1px"},"aria-hidden":"true",tabindex:"-1"},Jn=new Map([["identitytoolkit.googleapis.com","p"],["staging-identitytoolkit.sandbox.googleapis.com","s"],["test-identitytoolkit.sandbox.googleapis.com","t"]]);function Yn(e){const t=e.config;I(t.authDomain,e,"auth-domain-config-required");const n=t.emulator?C(t,"emulator/auth/iframe"):`https://${e.config.authDomain}/__/auth/iframe`,s={apiKey:t.apiKey,appName:e.name,v:i.SDK_VERSION},o=Jn.get(e.config.apiHost);o&&(s.eid=o);const a=e._getFrameworks();return a.length&&(s.fw=a.join(",")),`${n}?${Object(r.x)(s).slice(1)}`} + */const or=new C(5e3,15e3),ar={style:{position:"absolute",top:"-100px",width:"1px",height:"1px"},"aria-hidden":"true",tabindex:"-1"},cr=new Map([["identitytoolkit.googleapis.com","p"],["staging-identitytoolkit.sandbox.googleapis.com","s"],["test-identitytoolkit.sandbox.googleapis.com","t"]]);function ur(e){const t=e.config;I(t.authDomain,e,"auth-domain-config-required");const n=t.emulator?A(t,"emulator/auth/iframe"):`https://${e.config.authDomain}/__/auth/iframe`,s={apiKey:t.apiKey,appName:e.name,v:i.SDK_VERSION},o=cr.get(e.config.apiHost);o&&(s.eid=o);const a=e._getFrameworks();return a.length&&(s.fw=a.join(",")),`${n}?${Object(r.A)(s).slice(1)}`} /** * @license * Copyright 2020 Google LLC. @@ -1761,7 +1825,7 @@ const Sn=new Map;class An extends bn{constructor(e,t,n=!1){super(e,["signInViaRe * See the License for the specific language governing permissions and * limitations under the License. */ -const Xn={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"};class Zn{constructor(e){this.window=e,this.associatedEvent=null}close(){if(this.window)try{this.window.close()}catch(e){}}}function er(e,t,n,i=500,s=600){const o=Math.max((window.screen.availHeight-s)/2,0).toString(),a=Math.max((window.screen.availWidth-i)/2,0).toString();let c="";const u=Object.assign(Object.assign({},Xn),{width:i.toString(),height:s.toString(),top:o,left:a}),h=Object(r.l)().toLowerCase();n&&(c=ie(h)?"_blank":n),ne(h)&&(t=t||"http://localhost",u.scrollbars="yes");const l=Object.entries(u).reduce((e,[t,n])=>`${e}${t}=${n},`,"");if(function(e=Object(r.l)()){var t;return ue(e)&&!!(null===(t=window.navigator)||void 0===t?void 0:t.standalone)}(h)&&"_self"!==c)return function(e,t){const n=document.createElement("a");n.href=e,n.target=t;const r=document.createEvent("MouseEvent");r.initMouseEvent("click",!0,!0,window,1,0,0,0,0,!1,!1,!1,!1,1,null),n.dispatchEvent(r)} +const lr={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"};class hr{constructor(e){this.window=e,this.associatedEvent=null}close(){if(this.window)try{this.window.close()}catch(e){}}}function dr(e,t,n,i=500,s=600){const o=Math.max((window.screen.availHeight-s)/2,0).toString(),a=Math.max((window.screen.availWidth-i)/2,0).toString();let c="";const u=Object.assign(Object.assign({},lr),{width:i.toString(),height:s.toString(),top:o,left:a}),l=Object(r.q)().toLowerCase();n&&(c=ie(l)?"_blank":n),ne(l)&&(t=t||"http://localhost",u.scrollbars="yes");const h=Object.entries(u).reduce((e,[t,n])=>`${e}${t}=${n},`,"");if(function(e=Object(r.q)()){var t;return ue(e)&&!!(null===(t=window.navigator)||void 0===t?void 0:t.standalone)}(l)&&"_self"!==c)return function(e,t){const n=document.createElement("a");n.href=e,n.target=t;const r=document.createEvent("MouseEvent");r.initMouseEvent("click",!0,!0,window,1,0,0,0,0,!1,!1,!1,!1,1,null),n.dispatchEvent(r)} /** * @license * Copyright 2021 Google LLC @@ -1777,7 +1841,7 @@ const Xn={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"};class Zn{ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(t||"",c),new Zn(null);const d=window.open(t||"",c,l);I(d,e,"popup-blocked");try{d.focus()}catch(e){}return new Zn(d)}function tr(e,t,n,s,o,a){I(e.config.authDomain,e,"auth-domain-config-required"),I(e.config.apiKey,e,"invalid-api-key");const c={apiKey:e.config.apiKey,appName:e.name,authType:n,redirectUrl:s,v:i.SDK_VERSION,eventId:o};if(t instanceof Oe){t.setDefaultLanguage(e.languageCode),c.providerId=t.providerId||"",Object(r.p)(t.getCustomParameters())||(c.customParameters=JSON.stringify(t.getCustomParameters()));for(const[e,t]of Object.entries(a||{}))c[e]=t}if(t instanceof Ce){const e=t.getScopes().filter(e=>""!==e);e.length>0&&(c.scopes=e.join(","))}e.tenantId&&(c.tid=e.tenantId);const u=c;for(const e of Object.keys(u))void 0===u[e]&&delete u[e];return`${function({config:e}){if(!e.emulator)return`https://${e.authDomain}/__/auth/handler`;return C(e,"emulator/auth/handler")} + */(t||"",c),new hr(null);const d=window.open(t||"",c,h);I(d,e,"popup-blocked");try{d.focus()}catch(e){}return new hr(d)}const fr=encodeURIComponent("fac");async function pr(e,t,n,s,o,a){I(e.config.authDomain,e,"auth-domain-config-required"),I(e.config.apiKey,e,"invalid-api-key");const c={apiKey:e.config.apiKey,appName:e.name,authType:n,redirectUrl:s,v:i.SDK_VERSION,eventId:o};if(t instanceof qe){t.setDefaultLanguage(e.languageCode),c.providerId=t.providerId||"",Object(r.t)(t.getCustomParameters())||(c.customParameters=JSON.stringify(t.getCustomParameters()));for(const[e,t]of Object.entries(a||{}))c[e]=t}if(t instanceof Be){const e=t.getScopes().filter(e=>""!==e);e.length>0&&(c.scopes=e.join(","))}e.tenantId&&(c.tid=e.tenantId);const u=c;for(const e of Object.keys(u))void 0===u[e]&&delete u[e];const l=await e._getAppCheckToken(),h=l?`#${fr}=${encodeURIComponent(l)}`:"";return`${function({config:e}){if(!e.emulator)return`https://${e.authDomain}/__/auth/handler`;return A(e,"emulator/auth/handler")} /** * @license * Copyright 2020 Google LLC @@ -1793,7 +1857,7 @@ const Xn={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"};class Zn{ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e)}?${Object(r.x)(u).slice(1)}`}const nr=class{constructor(){this.eventManagers={},this.iframes={},this.originValidationPromises={},this._redirectPersistence=Ft,this._completeRedirectFn=xn}async _openPopup(e,t,n,r){var i;T(null===(i=this.eventManagers[e._key()])||void 0===i?void 0:i.manager,"_initialize() not called before _openPopup()");return er(e,tr(e,t,n,S(),r),Ut())}async _openRedirect(e,t,n,r){var i;return await this._originValidation(e),i=tr(e,t,n,S(),r),qt().location.href=i,new Promise(()=>{})}_initialize(e){const t=e._key();if(this.eventManagers[t]){const{manager:e,promise:n}=this.eventManagers[t];return e?Promise.resolve(e):(T(n,"If manager is not set, promise should be"),n)}const n=this.initAndGetManager(e);return this.eventManagers[t]={promise:n},n.catch(()=>{delete this.eventManagers[t]}),n}async initAndGetManager(e){const t=await async function(e){const t=await Hn(e),n=qt().gapi;return I(n,e,"internal-error"),t.open({where:document.body,url:Yn(e),messageHandlersFilter:n.iframes.CROSS_ORIGIN_IFRAMES_FILTER,attributes:Qn,dontclear:!0},t=>new Promise(async(n,r)=>{await t.restyle({setHideOnLeave:!1});const i=y(e,"network-request-failed"),s=qt().setTimeout(()=>{r(i)},$n.get());function o(){qt().clearTimeout(s),n(t)}t.ping(o).then(o,()=>{r(i)})}))}(e),n=new Fn(e);return t.register("authEvent",t=>{I(null==t?void 0:t.authEvent,e,"invalid-auth-event");return{status:n.onEvent(t.authEvent)?"ACK":"ERROR"}},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER),this.eventManagers[e._key()]={manager:n},this.iframes[e._key()]=t,n}_isIframeWebStorageSupported(e,t){this.iframes[e._key()].send("webStorageSupport",{type:"webStorageSupport"},n=>{var r;const i=null===(r=null==n?void 0:n[0])||void 0===r?void 0:r.webStorageSupport;void 0!==i&&t(!!i),g(e,"internal-error")},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)}_originValidation(e){const t=e._key();return this.originValidationPromises[t]||(this.originValidationPromises[t]=async function(e){if(e.config.emulator)return;const{authorizedDomains:t}=await Vn(e);for(const e of t)try{if(zn(e))return}catch(e){}g(e,"unauthorized-domain")}(e)),this.originValidationPromises[t]}get _shouldInitProactively(){return he()||re()||ue()}};class rr extends class{constructor(e){this.factorId=e}_process(e,t,n){switch(t.type){case"enroll":return this._finalizeEnroll(e,t.credential,n);case"signin":return this._finalizeSignIn(e,t.credential);default:return _("unexpected MultiFactorSessionType")}}}{constructor(e){super("phone"),this.credential=e}static _fromCredential(e){return new rr(e)}_finalizeEnroll(e,t,n){return function(e,t){return x(e,"POST","/v2/accounts/mfaEnrollment:finalize",L(e,t))}(e,{idToken:t,displayName:n,phoneVerificationInfo:this.credential._makeVerificationRequest()})}_finalizeSignIn(e,t){return function(e,t){return x(e,"POST","/v2/accounts/mfaSignIn:finalize",L(e,t))}(e,{mfaPendingCredential:t,phoneVerificationInfo:this.credential._makeVerificationRequest()})}}class ir{constructor(){}static assertion(e){return rr._fromCredential(e)}}ir.FACTOR_ID="phone";var sr; + */(e)}?${Object(r.A)(u).slice(1)}${h}`}const gr=class{constructor(){this.eventManagers={},this.iframes={},this.originValidationPromises={},this._redirectPersistence=Yt,this._completeRedirectFn=Wn,this._overrideRedirectResult=Un}async _openPopup(e,t,n,r){var i;T(null===(i=this.eventManagers[e._key()])||void 0===i?void 0:i.manager,"_initialize() not called before _openPopup()");return dr(e,await pr(e,t,n,E(),r),Xt())}async _openRedirect(e,t,n,r){await this._originValidation(e);return function(e){en().location.href=e}(await pr(e,t,n,E(),r)),new Promise(()=>{})}_initialize(e){const t=e._key();if(this.eventManagers[t]){const{manager:e,promise:n}=this.eventManagers[t];return e?Promise.resolve(e):(T(n,"If manager is not set, promise should be"),n)}const n=this.initAndGetManager(e);return this.eventManagers[t]={promise:n},n.catch(()=>{delete this.eventManagers[t]}),n}async initAndGetManager(e){const t=await async function(e){const t=await sr(e),n=en().gapi;return I(n,e,"internal-error"),t.open({where:document.body,url:ur(e),messageHandlersFilter:n.iframes.CROSS_ORIGIN_IFRAMES_FILTER,attributes:ar,dontclear:!0},t=>new Promise(async(n,r)=>{await t.restyle({setHideOnLeave:!1});const i=y(e,"network-request-failed"),s=en().setTimeout(()=>{r(i)},or.get());function o(){en().clearTimeout(s),n(t)}t.ping(o).then(o,()=>{r(i)})}))}(e),n=new Qn(e);return t.register("authEvent",t=>{I(null==t?void 0:t.authEvent,e,"invalid-auth-event");return{status:n.onEvent(t.authEvent)?"ACK":"ERROR"}},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER),this.eventManagers[e._key()]={manager:n},this.iframes[e._key()]=t,n}_isIframeWebStorageSupported(e,t){this.iframes[e._key()].send("webStorageSupport",{type:"webStorageSupport"},n=>{var r;const i=null===(r=null==n?void 0:n[0])||void 0===r?void 0:r.webStorageSupport;void 0!==i&&t(!!i),m(e,"internal-error")},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)}_originValidation(e){const t=e._key();return this.originValidationPromises[t]||(this.originValidationPromises[t]=async function(e){if(e.config.emulator)return;const{authorizedDomains:t}=await Xn(e);for(const e of t)try{if(tr(e))return}catch(e){}m(e,"unauthorized-domain")}(e)),this.originValidationPromises[t]}get _shouldInitProactively(){return le()||re()||ue()}};class mr{constructor(e){this.factorId=e}_process(e,t,n){switch(t.type){case"enroll":return this._finalizeEnroll(e,t.credential,n);case"signin":return this._finalizeSignIn(e,t.credential);default:return _("unexpected MultiFactorSessionType")}}}class yr extends mr{constructor(e){super("phone"),this.credential=e}static _fromCredential(e){return new yr(e)}_finalizeEnroll(e,t,n){return function(e,t){return x(e,"POST","/v2/accounts/mfaEnrollment:finalize",R(e,t))}(e,{idToken:t,displayName:n,phoneVerificationInfo:this.credential._makeVerificationRequest()})}_finalizeSignIn(e,t){return function(e,t){return x(e,"POST","/v2/accounts/mfaSignIn:finalize",R(e,t))}(e,{mfaPendingCredential:t,phoneVerificationInfo:this.credential._makeVerificationRequest()})}}class vr{constructor(){}static assertion(e){return yr._fromCredential(e)}}vr.FACTOR_ID="phone"; /** * @license * Copyright 2020 Google LLC @@ -1810,7 +1874,7 @@ const Xn={location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"};class Zn{ * See the License for the specific language governing permissions and * limitations under the License. */ -class or{constructor(e){this.auth=e,this.internalListeners=new Map}getUid(){var e;return this.assertAuthConfigured(),(null===(e=this.auth.currentUser)||void 0===e?void 0:e.uid)||null}async getToken(e){if(this.assertAuthConfigured(),await this.auth._initializationPromise,!this.auth.currentUser)return null;return{accessToken:await this.auth.currentUser.getIdToken(e)}}addAuthTokenListener(e){if(this.assertAuthConfigured(),this.internalListeners.has(e))return;const t=this.auth.onIdTokenChanged(t=>{var n;e((null===(n=t)||void 0===n?void 0:n.stsTokenManager.accessToken)||null)});this.internalListeners.set(e,t),this.updateProactiveRefresh()}removeAuthTokenListener(e){this.assertAuthConfigured();const t=this.internalListeners.get(e);t&&(this.internalListeners.delete(e),t(),this.updateProactiveRefresh())}assertAuthConfigured(){I(this.auth._initializationPromise,"dependent-sdk-initialized-before-auth")}updateProactiveRefresh(){this.internalListeners.size>0?this.auth._startProactiveRefresh():this.auth._stopProactiveRefresh()}} +class wr{constructor(e){this.auth=e,this.internalListeners=new Map}getUid(){var e;return this.assertAuthConfigured(),(null===(e=this.auth.currentUser)||void 0===e?void 0:e.uid)||null}async getToken(e){if(this.assertAuthConfigured(),await this.auth._initializationPromise,!this.auth.currentUser)return null;return{accessToken:await this.auth.currentUser.getIdToken(e)}}addAuthTokenListener(e){if(this.assertAuthConfigured(),this.internalListeners.has(e))return;const t=this.auth.onIdTokenChanged(t=>{e((null==t?void 0:t.stsTokenManager.accessToken)||null)});this.internalListeners.set(e,t),this.updateProactiveRefresh()}removeAuthTokenListener(e){this.assertAuthConfigured();const t=this.internalListeners.get(e);t&&(this.internalListeners.delete(e),t(),this.updateProactiveRefresh())}assertAuthConfigured(){I(this.auth._initializationPromise,"dependent-sdk-initialized-before-auth")}updateProactiveRefresh(){this.internalListeners.size>0?this.auth._startProactiveRefresh():this.auth._stopProactiveRefresh()}} /** * @license * Copyright 2020 Google LLC @@ -1843,7 +1907,24 @@ class or{constructor(e){this.auth=e,this.internalListeners=new Map}getUid(){var * See the License for the specific language governing permissions and * limitations under the License. */ -function ar(){return window} +Object(r.o)("authIdTokenMaxAge");var br; +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function Ir(){return window} /** * @license * Copyright 2020 Google LLC @@ -1859,7 +1940,7 @@ function ar(){return window} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */sr="Browser",Object(i._registerComponent)(new a.a("auth",(e,{options:t})=>{const n=e.getProvider("app").getImmediate(),{apiKey:r,authDomain:i}=n.options;return(e=>{I(r&&!r.includes(":"),"invalid-api-key",{appName:e.name}),I(!(null==i?void 0:i.includes(":")),"argument-error",{appName:e.name});const n={apiKey:r,authDomain:i,clientPlatform:sr,apiHost:"identitytoolkit.googleapis.com",tokenApiHost:"securetoken.googleapis.com",apiScheme:"https",sdkClientVersion:le(sr)},s=new de(e,n);return function(e,t){const n=(null==t?void 0:t.persistence)||[],r=(Array.isArray(n)?n:[n]).map(k);(null==t?void 0:t.errorMap)&&e._updateErrorMap(t.errorMap),e._initializeWithPersistence(r,null==t?void 0:t.popupRedirectResolver)}(s,t),s})(n)},"PUBLIC").setInstantiationMode("EXPLICIT").setInstanceCreatedCallback((e,t,n)=>{e.getProvider("auth-internal").initialize()})),Object(i._registerComponent)(new a.a("auth-internal",e=>(e=>new or(e))(fe(e.getProvider("auth").getImmediate())),"PRIVATE").setInstantiationMode("EXPLICIT")),Object(i.registerVersion)("@firebase/auth","0.19.4",function(e){switch(e){case"Node":return"node";case"ReactNative":return"rn";case"Worker":return"webworker";case"Cordova":return"cordova";default:return}}(sr)),Object(i.registerVersion)("@firebase/auth","0.19.4","esm2017");async function cr(e,t,n){var r;const{BuildInfo:i}=ar();T(t.sessionId,"AuthEvent did not contain a session ID");const s=await async function(e){const t=function(e){if(T(/[0-9a-zA-Z]+/.test(e),"Can only convert alpha-numeric strings"),"undefined"!=typeof TextEncoder)return(new TextEncoder).encode(e);const t=new ArrayBuffer(e.length),n=new Uint8Array(t);for(let t=0;t{const n=e.getProvider("app").getImmediate(),r=e.getProvider("heartbeat"),i=e.getProvider("app-check-internal"),{apiKey:s,authDomain:o}=n.options;I(s&&!s.includes(":"),"invalid-api-key",{appName:n.name});const a={apiKey:s,authDomain:o,clientPlatform:br,apiHost:"identitytoolkit.googleapis.com",tokenApiHost:"securetoken.googleapis.com",apiScheme:"https",sdkClientVersion:he(br)},c=new Ie(n,r,i,a);return function(e,t){const n=(null==t?void 0:t.persistence)||[],r=(Array.isArray(n)?n:[n]).map(Y);(null==t?void 0:t.errorMap)&&e._updateErrorMap(t.errorMap),e._initializeWithPersistence(r,null==t?void 0:t.popupRedirectResolver)}(c,t),c},"PUBLIC").setInstantiationMode("EXPLICIT").setInstanceCreatedCallback((e,t,n)=>{e.getProvider("auth-internal").initialize()})),Object(i._registerComponent)(new a.a("auth-internal",e=>(e=>new wr(e))(_e(e.getProvider("auth").getImmediate())),"PRIVATE").setInstantiationMode("EXPLICIT")),Object(i.registerVersion)("@firebase/auth","0.23.2",function(e){switch(e){case"Node":return"node";case"ReactNative":return"rn";case"Worker":return"webworker";case"Cordova":return"cordova";default:return}}(br)),Object(i.registerVersion)("@firebase/auth","0.23.2","esm2017");async function _r(e,t,n){var r;const{BuildInfo:i}=Ir();T(t.sessionId,"AuthEvent did not contain a session ID");const s=await async function(e){const t=function(e){if(T(/[0-9a-zA-Z]+/.test(e),"Can only convert alpha-numeric strings"),"undefined"!=typeof TextEncoder)return(new TextEncoder).encode(e);const t=new ArrayBuffer(e.length),n=new Uint8Array(t);for(let t=0;te.toString(16).padStart(2,"0")).join("")}(t.sessionId),o={};return ue()?o.ibi=i.packageName:oe()?o.apn=i.packageName:g(e,"operation-not-supported-in-this-environment"),i.displayName&&(o.appDisplayName=i.displayName),o.sessionId=s,tr(e,n,t.type,void 0,null!==(r=t.eventId)&&void 0!==r?r:void 0,o)}function ur(e){const{cordova:t}=ar();return new Promise(n=>{t.plugins.browsertab.isAvailable(i=>{let s=null;i?t.plugins.browsertab.openUrl(e):s=t.InAppBrowser.open(e,function(e=Object(r.l)()){return/(iPad|iPhone|iPod).*OS 7_\d/i.test(e)||/(iPad|iPhone|iPod).*OS 8_\d/i.test(e)}()?"_blank":"_system","location=yes"),n(s)})})}class hr extends Fn{constructor(){super(...arguments),this.passiveListeners=new Set,this.initPromise=new Promise(e=>{this.resolveInialized=e})}addPassiveListener(e){this.passiveListeners.add(e)}removePassiveListener(e){this.passiveListeners.delete(e)}resetRedirect(){this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1}onEvent(e){return this.resolveInialized(),this.passiveListeners.forEach(t=>t(e)),super.onEvent(e)}async initialized(){await this.initPromise}}async function lr(e){const t=await pr()._get(mr(e));return t&&await pr()._remove(mr(e)),t}function dr(e,t){var n,r;const i=function(e){const t=gr(e),n=t.link?decodeURIComponent(t.link):void 0,r=gr(n).link,i=t.deep_link_id?decodeURIComponent(t.deep_link_id):void 0;return gr(i).link||i||r||n||e}(t);if(i.includes("/__/auth/callback")){const t=gr(i),s=t.firebaseError?function(e){try{return JSON.parse(e)}catch(e){return null}}(decodeURIComponent(t.firebaseError)):null,o=null===(r=null===(n=null==s?void 0:s.code)||void 0===n?void 0:n.split("auth/"))||void 0===r?void 0:r[1],a=o?y(o):null;return a?{type:e.type,eventId:e.eventId,tenantId:e.tenantId,error:a,urlResponse:null,sessionId:null,postBody:null}:{type:e.type,eventId:e.eventId,tenantId:e.tenantId,sessionId:e.sessionId,urlResponse:i,postBody:null}}return null}function fr(){const e=[],t="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(let n=0;n<20;n++){const n=Math.floor(Math.random()*t.length);e.push(t.charAt(n))}return e.join("")}function pr(){return k(xt)}function mr(e){return Z("authEvent",e.config.apiKey,e.name)}function gr(e){if(!(null==e?void 0:e.includes("?")))return{};const[t,...n]=e.split("?");return Object(r.y)(n.join("?"))} + */(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(t.sessionId),o={};return ue()?o.ibi=i.packageName:oe()?o.apn=i.packageName:m(e,"operation-not-supported-in-this-environment"),i.displayName&&(o.appDisplayName=i.displayName),o.sessionId=s,pr(e,n,t.type,void 0,null!==(r=t.eventId)&&void 0!==r?r:void 0,o)}function Tr(e){const{cordova:t}=Ir();return new Promise(n=>{t.plugins.browsertab.isAvailable(i=>{let s=null;i?t.plugins.browsertab.openUrl(e):s=t.InAppBrowser.open(e,function(e=Object(r.q)()){return/(iPad|iPhone|iPod).*OS 7_\d/i.test(e)||/(iPad|iPhone|iPod).*OS 8_\d/i.test(e)}()?"_blank":"_system","location=yes"),n(s)})})}class Er extends Qn{constructor(){super(...arguments),this.passiveListeners=new Set,this.initPromise=new Promise(e=>{this.resolveInialized=e})}addPassiveListener(e){this.passiveListeners.add(e)}removePassiveListener(e){this.passiveListeners.delete(e)}resetRedirect(){this.queuedRedirectEvent=null,this.hasHandledPotentialRedirect=!1}onEvent(e){return this.resolveInialized(),this.passiveListeners.forEach(t=>t(e)),super.onEvent(e)}async initialized(){await this.initPromise}}async function Sr(e){const t=await Ar()._get(Nr(e));return t&&await Ar()._remove(Nr(e)),t}function kr(e,t){var n,r;const i=function(e){const t=Dr(e),n=t.link?decodeURIComponent(t.link):void 0,r=Dr(n).link,i=t.deep_link_id?decodeURIComponent(t.deep_link_id):void 0;return Dr(i).link||i||r||n||e}(t);if(i.includes("/__/auth/callback")){const t=Dr(i),s=t.firebaseError?function(e){try{return JSON.parse(e)}catch(e){return null}}(decodeURIComponent(t.firebaseError)):null,o=null===(r=null===(n=null==s?void 0:s.code)||void 0===n?void 0:n.split("auth/"))||void 0===r?void 0:r[1],a=o?y(o):null;return a?{type:e.type,eventId:e.eventId,tenantId:e.tenantId,error:a,urlResponse:null,sessionId:null,postBody:null}:{type:e.type,eventId:e.eventId,tenantId:e.tenantId,sessionId:e.sessionId,urlResponse:i,postBody:null}}return null}function Cr(){const e=[],t="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";for(let n=0;n<20;n++){const n=Math.floor(Math.random()*t.length);e.push(t.charAt(n))}return e.join("")}function Ar(){return Y(Ht)}function Nr(e){return Z("authEvent",e.config.apiKey,e.name)}function Dr(e){if(!(null==e?void 0:e.includes("?")))return{};const[t,...n]=e.split("?");return Object(r.B)(n.join("?"))} /** * @license * Copyright 2021 Google LLC @@ -1891,7 +1972,7 @@ function ar(){return window} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const yr=class{constructor(){this._redirectPersistence=Ft,this._shouldInitProactively=!0,this.eventManagers=new Map,this.originValidationPromises={},this._completeRedirectFn=xn}async _initialize(e){const t=e._key();let n=this.eventManagers.get(t);return n||(n=new hr(e),this.eventManagers.set(t,n),this.attachCallbackListeners(e,n)),n}_openPopup(e){g(e,"operation-not-supported-in-this-environment")}async _openRedirect(e,t,n,r){!function(e){var t,n,r,i,s,o,a,c,u,h;const l=ar();I("function"==typeof(null===(t=null==l?void 0:l.universalLinks)||void 0===t?void 0:t.subscribe),e,"invalid-cordova-configuration",{missingPlugin:"cordova-universal-links-plugin-fix"}),I(void 0!==(null===(n=null==l?void 0:l.BuildInfo)||void 0===n?void 0:n.packageName),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-buildInfo"}),I("function"==typeof(null===(s=null===(i=null===(r=null==l?void 0:l.cordova)||void 0===r?void 0:r.plugins)||void 0===i?void 0:i.browsertab)||void 0===s?void 0:s.openUrl),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-browsertab"}),I("function"==typeof(null===(c=null===(a=null===(o=null==l?void 0:l.cordova)||void 0===o?void 0:o.plugins)||void 0===a?void 0:a.browsertab)||void 0===c?void 0:c.isAvailable),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-browsertab"}),I("function"==typeof(null===(h=null===(u=null==l?void 0:l.cordova)||void 0===u?void 0:u.InAppBrowser)||void 0===h?void 0:h.open),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-inappbrowser"})}(e);const i=await this._initialize(e);await i.initialized(),i.resetRedirect(),Sn.clear(),await this._originValidation(e);const s=function(e,t,n=null){return{type:t,eventId:n,urlResponse:null,sessionId:fr(),postBody:null,tenantId:e.tenantId,error:y(e,"no-auth-event")}}(e,n,r);await function(e,t){return pr()._set(mr(e),t)}(e,s);const o=await cr(e,s,t);return async function(e,t,n){const{cordova:r}=ar();let i=()=>{};try{await new Promise((s,o)=>{let a=null;function c(){var e;s();const t=null===(e=r.plugins.browsertab)||void 0===e?void 0:e.close;"function"==typeof t&&t(),"function"==typeof(null==n?void 0:n.close)&&n.close()}function u(){a||(a=window.setTimeout(()=>{o(y(e,"redirect-cancelled-by-user"))},2e3))}function h(){"visible"===(null===document||void 0===document?void 0:document.visibilityState)&&u()}t.addPassiveListener(c),document.addEventListener("resume",u,!1),oe()&&document.addEventListener("visibilitychange",h,!1),i=()=>{t.removePassiveListener(c),document.removeEventListener("resume",u,!1),document.removeEventListener("visibilitychange",h,!1),a&&window.clearTimeout(a)}})}finally{i()}}(e,i,await ur(o))}_isIframeWebStorageSupported(e,t){throw new Error("Method not implemented.")}_originValidation(e){const t=e._key();return this.originValidationPromises[t]||(this.originValidationPromises[t]=async function(e){const{BuildInfo:t}=ar(),n={};ue()?n.iosBundleId=t.packageName:oe()?n.androidPackageName=t.packageName:g(e,"operation-not-supported-in-this-environment"),await Vn(e,n)}(e)),this.originValidationPromises[t]}attachCallbackListeners(e,t){const{universalLinks:n,handleOpenURL:r,BuildInfo:i}=ar(),s=setTimeout(async()=>{await lr(e),t.onEvent(vr())},500),o=async n=>{clearTimeout(s);const r=await lr(e);let i=null;r&&(null==n?void 0:n.url)&&(i=dr(r,n.url)),t.onEvent(i||vr())};void 0!==n&&"function"==typeof n.subscribe&&n.subscribe(null,o);const a=r,c=i.packageName.toLowerCase()+"://";ar().handleOpenURL=async e=>{if(e.toLowerCase().startsWith(c)&&o({url:e}),"function"==typeof a)try{a(e)}catch(e){console.error(e)}}}};function vr(){return{type:"unknown",eventId:null,sessionId:null,urlResponse:null,postBody:null,tenantId:null,error:y("no-auth-event")}} + */const Or=class{constructor(){this._redirectPersistence=Yt,this._shouldInitProactively=!0,this.eventManagers=new Map,this.originValidationPromises={},this._completeRedirectFn=Wn,this._overrideRedirectResult=Un}async _initialize(e){const t=e._key();let n=this.eventManagers.get(t);return n||(n=new Er(e),this.eventManagers.set(t,n),this.attachCallbackListeners(e,n)),n}_openPopup(e){m(e,"operation-not-supported-in-this-environment")}async _openRedirect(e,t,n,r){!function(e){var t,n,r,i,s,o,a,c,u,l;const h=Ir();I("function"==typeof(null===(t=null==h?void 0:h.universalLinks)||void 0===t?void 0:t.subscribe),e,"invalid-cordova-configuration",{missingPlugin:"cordova-universal-links-plugin-fix"}),I(void 0!==(null===(n=null==h?void 0:h.BuildInfo)||void 0===n?void 0:n.packageName),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-buildInfo"}),I("function"==typeof(null===(s=null===(i=null===(r=null==h?void 0:h.cordova)||void 0===r?void 0:r.plugins)||void 0===i?void 0:i.browsertab)||void 0===s?void 0:s.openUrl),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-browsertab"}),I("function"==typeof(null===(c=null===(a=null===(o=null==h?void 0:h.cordova)||void 0===o?void 0:o.plugins)||void 0===a?void 0:a.browsertab)||void 0===c?void 0:c.isAvailable),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-browsertab"}),I("function"==typeof(null===(l=null===(u=null==h?void 0:h.cordova)||void 0===u?void 0:u.InAppBrowser)||void 0===l?void 0:l.open),e,"invalid-cordova-configuration",{missingPlugin:"cordova-plugin-inappbrowser"})}(e);const i=await this._initialize(e);await i.initialized(),i.resetRedirect(),Fn.clear(),await this._originValidation(e);const s=function(e,t,n=null){return{type:t,eventId:n,urlResponse:null,sessionId:Cr(),postBody:null,tenantId:e.tenantId,error:y(e,"no-auth-event")}}(e,n,r);await function(e,t){return Ar()._set(Nr(e),t)}(e,s);const o=await _r(e,s,t);return async function(e,t,n){const{cordova:r}=Ir();let i=()=>{};try{await new Promise((s,o)=>{let a=null;function c(){var e;s();const t=null===(e=r.plugins.browsertab)||void 0===e?void 0:e.close;"function"==typeof t&&t(),"function"==typeof(null==n?void 0:n.close)&&n.close()}function u(){a||(a=window.setTimeout(()=>{o(y(e,"redirect-cancelled-by-user"))},2e3))}function l(){"visible"===(null===document||void 0===document?void 0:document.visibilityState)&&u()}t.addPassiveListener(c),document.addEventListener("resume",u,!1),oe()&&document.addEventListener("visibilitychange",l,!1),i=()=>{t.removePassiveListener(c),document.removeEventListener("resume",u,!1),document.removeEventListener("visibilitychange",l,!1),a&&window.clearTimeout(a)}})}finally{i()}}(e,i,await Tr(o))}_isIframeWebStorageSupported(e,t){throw new Error("Method not implemented.")}_originValidation(e){const t=e._key();return this.originValidationPromises[t]||(this.originValidationPromises[t]=async function(e){const{BuildInfo:t}=Ir(),n={};ue()?n.iosBundleId=t.packageName:oe()?n.androidPackageName=t.packageName:m(e,"operation-not-supported-in-this-environment"),await Xn(e,n)}(e)),this.originValidationPromises[t]}attachCallbackListeners(e,t){const{universalLinks:n,handleOpenURL:r,BuildInfo:i}=Ir(),s=setTimeout(async()=>{await Sr(e),t.onEvent(Rr())},500),o=async n=>{clearTimeout(s);const r=await Sr(e);let i=null;r&&(null==n?void 0:n.url)&&(i=kr(r,n.url)),t.onEvent(i||Rr())};void 0!==n&&"function"==typeof n.subscribe&&n.subscribe(null,o);const a=r,c=i.packageName.toLowerCase()+"://";Ir().handleOpenURL=async e=>{if(e.toLowerCase().startsWith(c)&&o({url:e}),"function"==typeof a)try{a(e)}catch(e){console.error(e)}}}};function Rr(){return{type:"unknown",eventId:null,sessionId:null,urlResponse:null,postBody:null,tenantId:null,error:y("no-auth-event")}} /** * @license * Copyright 2017 Google LLC @@ -1907,7 +1988,7 @@ function ar(){return window} * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function wr(e,t){fe(e)._logFramework(t)}},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return fu})),n.d(t,"b",(function(){return uc})),n.d(t,"c",(function(){return Ka})),n.d(t,"d",(function(){return xa})),n.d(t,"e",(function(){return Pa})),n.d(t,"f",(function(){return Bc})),n.d(t,"g",(function(){return ac})),n.d(t,"h",(function(){return hc})),n.d(t,"i",(function(){return Wa})),n.d(t,"j",(function(){return T})),n.d(t,"k",(function(){return lc})),n.d(t,"l",(function(){return za})),n.d(t,"m",(function(){return La})),n.d(t,"n",(function(){return $c})),n.d(t,"o",(function(){return zc})),n.d(t,"p",(function(){return Kc})),n.d(t,"q",(function(){return qc})),n.d(t,"r",(function(){return V})),n.d(t,"s",(function(){return Pu})),n.d(t,"t",(function(){return gu})),n.d(t,"u",(function(){return Ia})),n.d(t,"v",(function(){return ae})),n.d(t,"w",(function(){return P})),n.d(t,"x",(function(){return S})),n.d(t,"y",(function(){return $})),n.d(t,"z",(function(){return Na})),n.d(t,"A",(function(){return b})),n.d(t,"B",(function(){return J})),n.d(t,"C",(function(){return g})),n.d(t,"D",(function(){return Ea})),n.d(t,"E",(function(){return Nu})),n.d(t,"F",(function(){return ju})),n.d(t,"G",(function(){return Fu})),n.d(t,"H",(function(){return Za})),n.d(t,"I",(function(){return Ma})),n.d(t,"J",(function(){return Fa})),n.d(t,"K",(function(){return Ra})),n.d(t,"L",(function(){return Au})),n.d(t,"M",(function(){return xu})),n.d(t,"N",(function(){return nc})),n.d(t,"O",(function(){return ja})),n.d(t,"P",(function(){return cc})),n.d(t,"Q",(function(){return Ja})),n.d(t,"R",(function(){return Ya})),n.d(t,"S",(function(){return tc})),n.d(t,"T",(function(){return cu})),n.d(t,"U",(function(){return au})),n.d(t,"V",(function(){return $a})),n.d(t,"W",(function(){return Du})),n.d(t,"X",(function(){return vu})),n.d(t,"Y",(function(){return bu})),n.d(t,"Z",(function(){return Iu})),n.d(t,"ab",(function(){return _u})),n.d(t,"bb",(function(){return Tu})),n.d(t,"cb",(function(){return Eu})),n.d(t,"db",(function(){return Ha})),n.d(t,"eb",(function(){return Uu})),n.d(t,"fb",(function(){return Ga})),n.d(t,"gb",(function(){return tu})),n.d(t,"hb",(function(){return nu})),n.d(t,"ib",(function(){return ic})),n.d(t,"jb",(function(){return sc})),n.d(t,"kb",(function(){return Ou})),n.d(t,"lb",(function(){return Cu})),n.d(t,"mb",(function(){return Zc})),n.d(t,"nb",(function(){return Qc})),n.d(t,"ob",(function(){return Va})),n.d(t,"pb",(function(){return Ua})),n.d(t,"qb",(function(){return Lu})),n.d(t,"rb",(function(){return Mu})),n.d(t,"sb",(function(){return ku})),n.d(t,"tb",(function(){return f})),n.d(t,"ub",(function(){return Gc})),n.d(t,"vb",(function(){return su})),n.d(t,"wb",(function(){return iu})),n.d(t,"xb",(function(){return rc})),n.d(t,"yb",(function(){return Su})),n.d(t,"zb",(function(){return ec})),n.d(t,"Ab",(function(){return Yc})),n.d(t,"Bb",(function(){return Vu}));var r=n(3),i=n(5),s=n(4),o=n(0),a=n(6);const c="@firebase/firestore"; + */function xr(e,t){_e(e)._logFramework(t)}},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return th})),n.d(t,"b",(function(){return Wu})),n.d(t,"c",(function(){return Hu})),n.d(t,"d",(function(){return Qu})),n.d(t,"e",(function(){return Du})),n.d(t,"f",(function(){return Iu})),n.d(t,"g",(function(){return wu})),n.d(t,"h",(function(){return lh})),n.d(t,"i",(function(){return Yu})),n.d(t,"j",(function(){return Xu})),n.d(t,"k",(function(){return Ou})),n.d(t,"l",(function(){return T})),n.d(t,"m",(function(){return Zu})),n.d(t,"n",(function(){return Nu})),n.d(t,"o",(function(){return bu})),n.d(t,"p",(function(){return Ll})),n.d(t,"q",(function(){return Ol})),n.d(t,"r",(function(){return hh})),n.d(t,"s",(function(){return $l})),n.d(t,"t",(function(){return xl})),n.d(t,"u",(function(){return Ul})),n.d(t,"v",(function(){return Vl})),n.d(t,"w",(function(){return dh})),n.d(t,"x",(function(){return zl})),n.d(t,"y",(function(){return uh})),n.d(t,"z",(function(){return j})),n.d(t,"A",(function(){return Wh})),n.d(t,"B",(function(){return Kh})),n.d(t,"C",(function(){return vt})),n.d(t,"D",(function(){return K})),n.d(t,"E",(function(){return x})),n.d(t,"F",(function(){return k})),n.d(t,"G",(function(){return G})),n.d(t,"H",(function(){return jr})),n.d(t,"I",(function(){return pu})),n.d(t,"J",(function(){return b})),n.d(t,"K",(function(){return ct})),n.d(t,"L",(function(){return m})),n.d(t,"M",(function(){return lu})),n.d(t,"N",(function(){return Sh})),n.d(t,"O",(function(){return ah})),n.d(t,"P",(function(){return ch})),n.d(t,"Q",(function(){return Fl})),n.d(t,"R",(function(){return Xh})),n.d(t,"S",(function(){return Jh})),n.d(t,"T",(function(){return sh})),n.d(t,"U",(function(){return ju})),n.d(t,"V",(function(){return _u})),n.d(t,"W",(function(){return Tu})),n.d(t,"X",(function(){return vu})),n.d(t,"Y",(function(){return oh})),n.d(t,"Z",(function(){return Eh})),n.d(t,"ab",(function(){return Qh})),n.d(t,"bb",(function(){return Bu})),n.d(t,"cb",(function(){return Eu})),n.d(t,"db",(function(){return Ju})),n.d(t,"eb",(function(){return Mu})),n.d(t,"fb",(function(){return Fu})),n.d(t,"gb",(function(){return qu})),n.d(t,"hb",(function(){return Hl})),n.d(t,"ib",(function(){return Wl})),n.d(t,"jb",(function(){return Pu})),n.d(t,"kb",(function(){return Ah})),n.d(t,"lb",(function(){return Oh})),n.d(t,"mb",(function(){return Dh})),n.d(t,"nb",(function(){return gh})),n.d(t,"ob",(function(){return yh})),n.d(t,"pb",(function(){return vh})),n.d(t,"qb",(function(){return wh})),n.d(t,"rb",(function(){return bh})),n.d(t,"sb",(function(){return Ih})),n.d(t,"tb",(function(){return xu})),n.d(t,"ub",(function(){return Zh})),n.d(t,"vb",(function(){return Ru})),n.d(t,"wb",(function(){return ql})),n.d(t,"xb",(function(){return Bl})),n.d(t,"yb",(function(){return Gu})),n.d(t,"zb",(function(){return Mh})),n.d(t,"Ab",(function(){return Vh})),n.d(t,"Bb",(function(){return Fh})),n.d(t,"Cb",(function(){return Ku})),n.d(t,"Db",(function(){return kh})),n.d(t,"Eb",(function(){return Ch})),n.d(t,"Fb",(function(){return Ml})),n.d(t,"Gb",(function(){return jl})),n.d(t,"Hb",(function(){return jh})),n.d(t,"Ib",(function(){return zh})),n.d(t,"Jb",(function(){return Bh})),n.d(t,"Kb",(function(){return Rl})),n.d(t,"Lb",(function(){return ku})),n.d(t,"Mb",(function(){return Su})),n.d(t,"Nb",(function(){return Hh})),n.d(t,"Ob",(function(){return Yh})),n.d(t,"Pb",(function(){return _h})),n.d(t,"Qb",(function(){return td})),n.d(t,"Rb",(function(){return f})),n.d(t,"Sb",(function(){return ph})),n.d(t,"Tb",(function(){return Kl})),n.d(t,"Ub",(function(){return Gl})),n.d(t,"Vb",(function(){return ih})),n.d(t,"Wb",(function(){return zu})),n.d(t,"Xb",(function(){return Th})),n.d(t,"Yb",(function(){return Uu})),n.d(t,"Zb",(function(){return Pl})),n.d(t,"ac",(function(){return ed}));var r=n(3),i=n(6),s=n(5),o=n(0),a=n(4);const c="@firebase/firestore"; /** * @license * Copyright 2017 Google LLC @@ -1940,7 +2021,7 @@ function ar(){return window} * See the License for the specific language governing permissions and * limitations under the License. */ -let h="9.6.1"; +let l="9.23.0"; /** * @license * Copyright 2017 Google LLC @@ -1956,7 +2037,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const l=new s.b("@firebase/firestore");function d(){return l.logLevel}function f(e){l.setLogLevel(e)}function p(e,...t){if(l.logLevel<=s.a.DEBUG){const n=t.map(y);l.debug(`Firestore (${h}): ${e}`,...n)}}function m(e,...t){if(l.logLevel<=s.a.ERROR){const n=t.map(y);l.error(`Firestore (${h}): ${e}`,...n)}}function g(e,...t){if(l.logLevel<=s.a.WARN){const n=t.map(y);l.warn(`Firestore (${h}): ${e}`,...n)}}function y(e){if("string"==typeof e)return e;try{return t=e,JSON.stringify(t)}catch(t){return e} + */const h=new s.b("@firebase/firestore");function d(){return h.logLevel}function f(e){h.setLogLevel(e)}function p(e,...t){if(h.logLevel<=s.a.DEBUG){const n=t.map(y);h.debug(`Firestore (${l}): ${e}`,...n)}}function g(e,...t){if(h.logLevel<=s.a.ERROR){const n=t.map(y);h.error(`Firestore (${l}): ${e}`,...n)}}function m(e,...t){if(h.logLevel<=s.a.WARN){const n=t.map(y);h.warn(`Firestore (${l}): ${e}`,...n)}}function y(e){if("string"==typeof e)return e;try{return t=e,JSON.stringify(t)}catch(t){return e} /** * @license * Copyright 2020 Google LLC @@ -1988,7 +2069,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function v(e="Unexpected state"){const t=`FIRESTORE (${h}) INTERNAL ASSERTION FAILED: `+e;throw m(t),new Error(t)}function w(e,t){e||v()}function b(e,t){e||v()}function I(e,t){return e} + */function v(e="Unexpected state"){const t=`FIRESTORE (${l}) INTERNAL ASSERTION FAILED: `+e;throw g(t),new Error(t)}function w(e,t){e||v()}function b(e,t){e||v()}function I(e,t){return e} /** * @license * Copyright 2017 Google LLC @@ -2004,7 +2085,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const _={OK:"ok",CANCELLED:"cancelled",UNKNOWN:"unknown",INVALID_ARGUMENT:"invalid-argument",DEADLINE_EXCEEDED:"deadline-exceeded",NOT_FOUND:"not-found",ALREADY_EXISTS:"already-exists",PERMISSION_DENIED:"permission-denied",UNAUTHENTICATED:"unauthenticated",RESOURCE_EXHAUSTED:"resource-exhausted",FAILED_PRECONDITION:"failed-precondition",ABORTED:"aborted",OUT_OF_RANGE:"out-of-range",UNIMPLEMENTED:"unimplemented",INTERNAL:"internal",UNAVAILABLE:"unavailable",DATA_LOSS:"data-loss"};class T extends Error{constructor(e,t){super(t),this.code=e,this.message=t,this.name="FirebaseError",this.toString=()=>`${this.name}: [code=${this.code}]: ${this.message}`}} + */const _={OK:"ok",CANCELLED:"cancelled",UNKNOWN:"unknown",INVALID_ARGUMENT:"invalid-argument",DEADLINE_EXCEEDED:"deadline-exceeded",NOT_FOUND:"not-found",ALREADY_EXISTS:"already-exists",PERMISSION_DENIED:"permission-denied",UNAUTHENTICATED:"unauthenticated",RESOURCE_EXHAUSTED:"resource-exhausted",FAILED_PRECONDITION:"failed-precondition",ABORTED:"aborted",OUT_OF_RANGE:"out-of-range",UNIMPLEMENTED:"unimplemented",INTERNAL:"internal",UNAVAILABLE:"unavailable",DATA_LOSS:"data-loss"};class T extends o.c{constructor(e,t){super(e,t),this.code=e,this.message=t,this.toString=()=>`${this.name}: [code=${this.code}]: ${this.message}`}} /** * @license * Copyright 2017 Google LLC @@ -2036,10 +2117,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class k{constructor(e,t){this.user=t,this.type="OAuth",this.headers=new Map,this.headers.set("Authorization","Bearer "+e)}}class S{getToken(){return Promise.resolve(null)}invalidateToken(){}start(e,t){e.enqueueRetryable(()=>t(u.UNAUTHENTICATED))}shutdown(){}}class A{constructor(e){this.token=e,this.changeListener=null}getToken(){return Promise.resolve(this.token)}invalidateToken(){}start(e,t){this.changeListener=t,e.enqueueRetryable(()=>t(this.token.user))}shutdown(){this.changeListener=null}}class N{constructor(e){this.t=e,this.currentUser=u.UNAUTHENTICATED,this.i=0,this.forceRefresh=!1,this.auth=null}start(e,t){let n=this.i;const r=e=>this.i!==n?(n=this.i,t(e)):Promise.resolve();let i=new E;this.o=()=>{this.i++,this.currentUser=this.u(),i.resolve(),i=new E,e.enqueueRetryable(()=>r(this.currentUser))};const s=()=>{const t=i;e.enqueueRetryable(async()=>{await t.promise,await r(this.currentUser)})},o=e=>{p("FirebaseAuthCredentialsProvider","Auth detected"),this.auth=e,this.auth.addAuthTokenListener(this.o),s()};this.t.onInit(e=>o(e)),setTimeout(()=>{if(!this.auth){const e=this.t.getImmediate({optional:!0});e?o(e):(p("FirebaseAuthCredentialsProvider","Auth not yet detected"),i.resolve(),i=new E)}},0),s()}getToken(){const e=this.i,t=this.forceRefresh;return this.forceRefresh=!1,this.auth?this.auth.getToken(t).then(t=>this.i!==e?(p("FirebaseAuthCredentialsProvider","getToken aborted due to token change."),this.getToken()):t?(w("string"==typeof t.accessToken),new k(t.accessToken,this.currentUser)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.auth&&this.auth.removeAuthTokenListener(this.o)}u(){const e=this.auth&&this.auth.getUid();return w(null===e||"string"==typeof e),new u(e)}}class O{constructor(e,t,n){this.type="FirstParty",this.user=u.FIRST_PARTY,this.headers=new Map,this.headers.set("X-Goog-AuthUser",t);const r=e.auth.getAuthHeaderValueForFirstParty([]);r&&this.headers.set("Authorization",r),n&&this.headers.set("X-Goog-Iam-Authorization-Token",n)}}class C{constructor(e,t,n){this.h=e,this.l=t,this.m=n}getToken(){return Promise.resolve(new O(this.h,this.l,this.m))}start(e,t){e.enqueueRetryable(()=>t(u.FIRST_PARTY))}shutdown(){}invalidateToken(){}}class D{constructor(e){this.value=e,this.type="AppCheck",this.headers=new Map,e&&e.length>0&&this.headers.set("x-firebase-appcheck",this.value)}}class R{constructor(e){this.g=e,this.forceRefresh=!1,this.appCheck=null}start(e,t){this.o=n=>{e.enqueueRetryable(()=>(e=>(null!=e.error&&p("FirebaseAppCheckTokenProvider","Error getting App Check token; using placeholder token instead. Error: "+e.error.message),t(e.token)))(n))};const n=e=>{p("FirebaseAppCheckTokenProvider","AppCheck detected"),this.appCheck=e,this.appCheck.addTokenListener(this.o)};this.g.onInit(e=>n(e)),setTimeout(()=>{if(!this.appCheck){const e=this.g.getImmediate({optional:!0});e?n(e):p("FirebaseAppCheckTokenProvider","AppCheck not yet detected")}},0)}getToken(){const e=this.forceRefresh;return this.forceRefresh=!1,this.appCheck?this.appCheck.getToken(e).then(e=>e?(w("string"==typeof e.token),new D(e.token)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.appCheck&&this.appCheck.removeTokenListener(this.o)}}class P{getToken(){return Promise.resolve(new D(""))}invalidateToken(){}start(e,t){}shutdown(){}} + */class S{constructor(e,t){this.user=t,this.type="OAuth",this.headers=new Map,this.headers.set("Authorization","Bearer "+e)}}class k{getToken(){return Promise.resolve(null)}invalidateToken(){}start(e,t){e.enqueueRetryable(()=>t(u.UNAUTHENTICATED))}shutdown(){}}class C{constructor(e){this.token=e,this.changeListener=null}getToken(){return Promise.resolve(this.token)}invalidateToken(){}start(e,t){this.changeListener=t,e.enqueueRetryable(()=>t(this.token.user))}shutdown(){this.changeListener=null}}class A{constructor(e){this.t=e,this.currentUser=u.UNAUTHENTICATED,this.i=0,this.forceRefresh=!1,this.auth=null}start(e,t){let n=this.i;const r=e=>this.i!==n?(n=this.i,t(e)):Promise.resolve();let i=new E;this.o=()=>{this.i++,this.currentUser=this.u(),i.resolve(),i=new E,e.enqueueRetryable(()=>r(this.currentUser))};const s=()=>{const t=i;e.enqueueRetryable(async()=>{await t.promise,await r(this.currentUser)})},o=e=>{p("FirebaseAuthCredentialsProvider","Auth detected"),this.auth=e,this.auth.addAuthTokenListener(this.o),s()};this.t.onInit(e=>o(e)),setTimeout(()=>{if(!this.auth){const e=this.t.getImmediate({optional:!0});e?o(e):(p("FirebaseAuthCredentialsProvider","Auth not yet detected"),i.resolve(),i=new E)}},0),s()}getToken(){const e=this.i,t=this.forceRefresh;return this.forceRefresh=!1,this.auth?this.auth.getToken(t).then(t=>this.i!==e?(p("FirebaseAuthCredentialsProvider","getToken aborted due to token change."),this.getToken()):t?(w("string"==typeof t.accessToken),new S(t.accessToken,this.currentUser)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.auth&&this.auth.removeAuthTokenListener(this.o)}u(){const e=this.auth&&this.auth.getUid();return w(null===e||"string"==typeof e),new u(e)}}class N{constructor(e,t,n){this.h=e,this.l=t,this.m=n,this.type="FirstParty",this.user=u.FIRST_PARTY,this.g=new Map}p(){return this.m?this.m():null}get headers(){this.g.set("X-Goog-AuthUser",this.h);const e=this.p();return e&&this.g.set("Authorization",e),this.l&&this.g.set("X-Goog-Iam-Authorization-Token",this.l),this.g}}class D{constructor(e,t,n){this.h=e,this.l=t,this.m=n}getToken(){return Promise.resolve(new N(this.h,this.l,this.m))}start(e,t){e.enqueueRetryable(()=>t(u.FIRST_PARTY))}shutdown(){}invalidateToken(){}}class O{constructor(e){this.value=e,this.type="AppCheck",this.headers=new Map,e&&e.length>0&&this.headers.set("x-firebase-appcheck",this.value)}}class R{constructor(e){this.I=e,this.forceRefresh=!1,this.appCheck=null,this.T=null}start(e,t){const n=e=>{null!=e.error&&p("FirebaseAppCheckTokenProvider","Error getting App Check token; using placeholder token instead. Error: "+e.error.message);const n=e.token!==this.T;return this.T=e.token,p("FirebaseAppCheckTokenProvider",`Received ${n?"new":"existing"} token.`),n?t(e.token):Promise.resolve()};this.o=t=>{e.enqueueRetryable(()=>n(t))};const r=e=>{p("FirebaseAppCheckTokenProvider","AppCheck detected"),this.appCheck=e,this.appCheck.addTokenListener(this.o)};this.I.onInit(e=>r(e)),setTimeout(()=>{if(!this.appCheck){const e=this.I.getImmediate({optional:!0});e?r(e):p("FirebaseAppCheckTokenProvider","AppCheck not yet detected")}},0)}getToken(){const e=this.forceRefresh;return this.forceRefresh=!1,this.appCheck?this.appCheck.getToken(e).then(e=>e?(w("string"==typeof e.token),this.T=e.token,new O(e.token)):null):Promise.resolve(null)}invalidateToken(){this.forceRefresh=!0}shutdown(){this.appCheck&&this.appCheck.removeTokenListener(this.o)}}class x{getToken(){return Promise.resolve(new O(""))}invalidateToken(){}start(e,t){}shutdown(){}} /** * @license - * Copyright 2018 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2052,10 +2133,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class L{constructor(e,t){this.previousValue=e,t&&(t.sequenceNumberHandler=e=>this.p(e),this.T=e=>t.writeSequenceNumber(e))}p(e){return this.previousValue=Math.max(e,this.previousValue),this.previousValue}next(){const e=++this.previousValue;return this.T&&this.T(e),e}} + */function P(e){const t="undefined"!=typeof self&&(self.crypto||self.msCrypto),n=new Uint8Array(e);if(t&&"function"==typeof t.getRandomValues)t.getRandomValues(n);else for(let t=0;tt?1:0}function F(e,t,n){return e.length===t.length&&e.every((e,r)=>n(e,t[r]))}function V(e){return e+"\0"} /** * @license * Copyright 2017 Google LLC @@ -2084,7 +2165,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */L.I=-1;class M{static A(){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t=Math.floor(256/e.length)*e.length;let n="";for(;n.length<20;){const r=x(40);for(let i=0;it?1:0}function j(e,t,n){return e.length===t.length&&e.every((e,r)=>n(e,t[r]))}function U(e){return e+"\0"} + */class j{constructor(e,t){if(this.seconds=e,this.nanoseconds=t,t<0)throw new T(_.INVALID_ARGUMENT,"Timestamp nanoseconds out of range: "+t);if(t>=1e9)throw new T(_.INVALID_ARGUMENT,"Timestamp nanoseconds out of range: "+t);if(e<-62135596800)throw new T(_.INVALID_ARGUMENT,"Timestamp seconds out of range: "+e);if(e>=253402300800)throw new T(_.INVALID_ARGUMENT,"Timestamp seconds out of range: "+e)}static now(){return j.fromMillis(Date.now())}static fromDate(e){return j.fromMillis(e.getTime())}static fromMillis(e){const t=Math.floor(e/1e3),n=Math.floor(1e6*(e-1e3*t));return new j(t,n)}toDate(){return new Date(this.toMillis())}toMillis(){return 1e3*this.seconds+this.nanoseconds/1e6}_compareTo(e){return this.seconds===e.seconds?M(this.nanoseconds,e.nanoseconds):M(this.seconds,e.seconds)}isEqual(e){return e.seconds===this.seconds&&e.nanoseconds===this.nanoseconds}toString(){return"Timestamp(seconds="+this.seconds+", nanoseconds="+this.nanoseconds+")"}toJSON(){return{seconds:this.seconds,nanoseconds:this.nanoseconds}}valueOf(){const e=this.seconds- -62135596800;return String(e).padStart(12,"0")+"."+String(this.nanoseconds).padStart(9,"0")}} /** * @license * Copyright 2017 Google LLC @@ -2100,7 +2181,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class V{constructor(e,t){if(this.seconds=e,this.nanoseconds=t,t<0)throw new T(_.INVALID_ARGUMENT,"Timestamp nanoseconds out of range: "+t);if(t>=1e9)throw new T(_.INVALID_ARGUMENT,"Timestamp nanoseconds out of range: "+t);if(e<-62135596800)throw new T(_.INVALID_ARGUMENT,"Timestamp seconds out of range: "+e);if(e>=253402300800)throw new T(_.INVALID_ARGUMENT,"Timestamp seconds out of range: "+e)}static now(){return V.fromMillis(Date.now())}static fromDate(e){return V.fromMillis(e.getTime())}static fromMillis(e){const t=Math.floor(e/1e3),n=Math.floor(1e6*(e-1e3*t));return new V(t,n)}toDate(){return new Date(this.toMillis())}toMillis(){return 1e3*this.seconds+this.nanoseconds/1e6}_compareTo(e){return this.seconds===e.seconds?F(this.nanoseconds,e.nanoseconds):F(this.seconds,e.seconds)}isEqual(e){return e.seconds===this.seconds&&e.nanoseconds===this.nanoseconds}toString(){return"Timestamp(seconds="+this.seconds+", nanoseconds="+this.nanoseconds+")"}toJSON(){return{seconds:this.seconds,nanoseconds:this.nanoseconds}}valueOf(){const e=this.seconds- -62135596800;return String(e).padStart(12,"0")+"."+String(this.nanoseconds).padStart(9,"0")}} + */class U{constructor(e){this.timestamp=e}static fromTimestamp(e){return new U(e)}static min(){return new U(new j(0,0))}static max(){return new U(new j(253402300799,999999999))}compareTo(e){return this.timestamp._compareTo(e.timestamp)}isEqual(e){return this.timestamp.isEqual(e.timestamp)}toMicroseconds(){return 1e6*this.timestamp.seconds+this.timestamp.nanoseconds/1e3}toString(){return"SnapshotVersion("+this.timestamp.toString()+")"}toTimestamp(){return this.timestamp}} /** * @license * Copyright 2017 Google LLC @@ -2116,7 +2197,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class q{constructor(e){this.timestamp=e}static fromTimestamp(e){return new q(e)}static min(){return new q(new V(0,0))}compareTo(e){return this.timestamp._compareTo(e.timestamp)}isEqual(e){return this.timestamp.isEqual(e.timestamp)}toMicroseconds(){return 1e6*this.timestamp.seconds+this.timestamp.nanoseconds/1e3}toString(){return"SnapshotVersion("+this.timestamp.toString()+")"}toTimestamp(){return this.timestamp}} + */class q{constructor(e,t,n){void 0===t?t=0:t>e.length&&v(),void 0===n?n=e.length-t:n>e.length-t&&v(),this.segments=e,this.offset=t,this.len=n}get length(){return this.len}isEqual(e){return 0===q.comparator(this,e)}child(e){const t=this.segments.slice(this.offset,this.limit());return e instanceof q?e.forEach(e=>{t.push(e)}):t.push(e),this.construct(t)}limit(){return this.offset+this.length}popFirst(e){return e=void 0===e?1:e,this.construct(this.segments,this.offset+e,this.length-e)}popLast(){return this.construct(this.segments,this.offset,this.length-1)}firstSegment(){return this.segments[this.offset]}lastSegment(){return this.get(this.length-1)}get(e){return this.segments[this.offset+e]}isEmpty(){return 0===this.length}isPrefixOf(e){if(e.lengthi)return 1}return e.lengtht.length?1:0}}class B extends q{construct(e,t,n){return new B(e,t,n)}canonicalString(){return this.toArray().join("/")}toString(){return this.canonicalString()}static fromString(...e){const t=[];for(const n of e){if(n.indexOf("//")>=0)throw new T(_.INVALID_ARGUMENT,`Invalid segment (${n}). Paths must not contain // in them.`);t.push(...n.split("/").filter(e=>e.length>0))}return new B(t)}static emptyPath(){return new B([])}}const z=/^[_a-zA-Z][_a-zA-Z0-9]*$/;class G extends q{construct(e,t,n){return new G(e,t,n)}static isValidIdentifier(e){return z.test(e)}canonicalString(){return this.toArray().map(e=>(e=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`"),G.isValidIdentifier(e)||(e="`"+e+"`"),e)).join(".")}toString(){return this.canonicalString()}isKeyField(){return 1===this.length&&"__name__"===this.get(0)}static keyField(){return new G(["__name__"])}static fromServerFormat(e){const t=[];let n="",r=0;const i=()=>{if(0===n.length)throw new T(_.INVALID_ARGUMENT,`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);t.push(n),n=""};let s=!1;for(;r=2&&this.path.get(this.path.length-2)===e}getCollectionGroup(){return this.path.get(this.path.length-2)}getCollectionPath(){return this.path.popLast()}isEqual(e){return null!==e&&0===B.comparator(this.path,e.path)}toString(){return this.path.toString()}static comparator(e,t){return B.comparator(e.path,t.path)}static isDocumentKey(e){return e.length%2==0}static fromSegments(e){return new K(new B(e.slice()))}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2148,7 +2229,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class W{constructor(e,t,n){void 0===t?t=0:t>e.length&&v(),void 0===n?n=e.length-t:n>e.length-t&&v(),this.segments=e,this.offset=t,this.len=n}get length(){return this.len}isEqual(e){return 0===W.comparator(this,e)}child(e){const t=this.segments.slice(this.offset,this.limit());return e instanceof W?e.forEach(e=>{t.push(e)}):t.push(e),this.construct(t)}limit(){return this.offset+this.length}popFirst(e){return e=void 0===e?1:e,this.construct(this.segments,this.offset+e,this.length-e)}popLast(){return this.construct(this.segments,this.offset,this.length-1)}firstSegment(){return this.segments[this.offset]}lastSegment(){return this.get(this.length-1)}get(e){return this.segments[this.offset+e]}isEmpty(){return 0===this.length}isPrefixOf(e){if(e.lengthi)return 1}return e.lengtht.length?1:0}}class G extends W{construct(e,t,n){return new G(e,t,n)}canonicalString(){return this.toArray().join("/")}toString(){return this.canonicalString()}static fromString(...e){const t=[];for(const n of e){if(n.indexOf("//")>=0)throw new T(_.INVALID_ARGUMENT,`Invalid segment (${n}). Paths must not contain // in them.`);t.push(...n.split("/").filter(e=>e.length>0))}return new G(t)}static emptyPath(){return new G([])}}const H=/^[_a-zA-Z][_a-zA-Z0-9]*$/;class $ extends W{construct(e,t,n){return new $(e,t,n)}static isValidIdentifier(e){return H.test(e)}canonicalString(){return this.toArray().map(e=>(e=e.replace(/\\/g,"\\\\").replace(/`/g,"\\`"),$.isValidIdentifier(e)||(e="`"+e+"`"),e)).join(".")}toString(){return this.canonicalString()}isKeyField(){return 1===this.length&&"__name__"===this.get(0)}static keyField(){return new $(["__name__"])}static fromServerFormat(e){const t=[];let n="",r=0;const i=()=>{if(0===n.length)throw new T(_.INVALID_ARGUMENT,`Invalid field path (${e}). Paths must not be empty, begin with '.', end with '.', or contain '..'`);t.push(n),n=""};let s=!1;for(;r2===e.kind)}function H(e){return e.fields.filter(e=>2!==e.kind)}function Q(e,t){let n=M(e.collectionGroup,t.collectionGroup);if(0!==n)return n;for(let r=0;re.isEqual(t))}} + */const re="The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.";class ie{constructor(){this.onCommittedListeners=[]}addOnCommittedListener(e){this.onCommittedListeners.push(e)}raiseOnCommittedEvent(){this.onCommittedListeners.forEach(e=>e())}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2180,10 +2261,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function J(){return"undefined"!=typeof atob} + */async function se(e){if(e.code!==_.FAILED_PRECONDITION||e.message!==re)throw e;p("LocalStore","Unexpectedly lost primary lease")} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2196,10 +2277,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Y{constructor(e){this.binaryString=e}static fromBase64String(e){const t=atob(e);return new Y(t)}static fromUint8Array(e){const t=function(e){let t="";for(let n=0;n{this.isDone=!0,this.result=e,this.nextCallback&&this.nextCallback(e)},e=>{this.isDone=!0,this.error=e,this.catchCallback&&this.catchCallback(e)})}catch(e){return this.next(void 0,e)}next(e,t){return this.callbackAttached&&v(),this.callbackAttached=!0,this.isDone?this.error?this.wrapFailure(t,this.error):this.wrapSuccess(e,this.result):new oe((n,r)=>{this.nextCallback=t=>{this.wrapSuccess(e,t).next(n,r)},this.catchCallback=e=>{this.wrapFailure(t,e).next(n,r)}})}toPromise(){return new Promise((e,t)=>{this.next(e,t)})}wrapUserFunction(e){try{const t=e();return t instanceof oe?t:oe.resolve(t)}catch(e){return oe.reject(e)}}wrapSuccess(e,t){return e?this.wrapUserFunction(()=>e(t)):oe.resolve(t)}wrapFailure(e,t){return e?this.wrapUserFunction(()=>e(t)):oe.reject(t)}static resolve(e){return new oe((t,n)=>{t(e)})}static reject(e){return new oe((t,n)=>{n(e)})}static waitFor(e){return new oe((t,n)=>{let r=0,i=0,s=!1;e.forEach(e=>{++r,e.next(()=>{++i,s&&i===r&&t()},e=>n(e))}),s=!0,i===r&&t()})}static or(e){let t=oe.resolve(!1);for(const n of e)t=t.next(e=>e?oe.resolve(e):n());return t}static forEach(e,t){const n=[];return e.forEach((e,r)=>{n.push(t.call(this,e,r))}),this.waitFor(n)}static mapArray(e,t){return new oe((n,r)=>{const i=e.length,s=new Array(i);let o=0;for(let a=0;a{s[c]=e,++o,o===i&&n(s)},e=>r(e))}})}static doWhile(e,t){return new oe((n,r)=>{const i=()=>{!0===e()?t().next(()=>{i()},r):n()};i()})}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2212,10 +2293,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(this.binaryString)}approximateByteSize(){return 2*this.binaryString.length}compareTo(e){return F(this.binaryString,e.binaryString)}isEqual(e){return this.binaryString===e.binaryString}}Y.EMPTY_BYTE_STRING=new Y("");const X=new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);function Z(e){if(w(!!e),"string"==typeof e){let t=0;const n=X.exec(e);if(w(!!n),n[1]){let e=n[1];e=(e+"000000000").substr(0,9),t=Number(e)}const r=new Date(e);return{seconds:Math.floor(r.getTime()/1e3),nanos:t}}return{seconds:ee(e.seconds),nanos:ee(e.nanos)}}function ee(e){return"number"==typeof e?e:"string"==typeof e?Number(e):0}function te(e){return"string"==typeof e?Y.fromBase64String(e):Y.fromUint8Array(e)} + */class ae{constructor(e,t){this.action=e,this.transaction=t,this.aborted=!1,this.v=new E,this.transaction.oncomplete=()=>{this.v.resolve()},this.transaction.onabort=()=>{t.error?this.v.reject(new le(e,t.error)):this.v.resolve()},this.transaction.onerror=t=>{const n=ge(t.target.error);this.v.reject(new le(e,n))}}static open(e,t,n,r){try{return new ae(t,e.transaction(r,n))}catch(e){throw new le(t,e)}}get R(){return this.v.promise}abort(e){e&&this.v.reject(e),this.aborted||(p("SimpleDb","Aborting transaction:",e?e.message:"Client-initiated abort"),this.aborted=!0,this.transaction.abort())}P(){const e=this.transaction;this.aborted||"function"!=typeof e.commit||e.commit()}store(e){const t=this.transaction.objectStore(e);return new de(t)}}class ce{constructor(e,t,n){this.name=e,this.version=t,this.V=n,12.2===ce.S(Object(o.q)())&&g("Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.")}static delete(e){return p("SimpleDb","Removing database:",e),fe(window.indexedDB.deleteDatabase(e)).toPromise()}static D(){if(!Object(o.v)())return!1;if(ce.C())return!0;const e=Object(o.q)(),t=ce.S(e),n=00||e.indexOf("Trident/")>0||e.indexOf("Edge/")>0||n||i)}static C(){var t;return void 0!==e&&"YES"===(null===(t=e.env)||void 0===t?void 0:t.k)}static M(e,t){return e.store(t)}static S(e){const t=e.match(/i(?:phone|pad|pod) os ([\d_]+)/i),n=t?t[1].split("_").slice(0,2).join("."):"-1";return Number(n)}static N(e){const t=e.match(/Android ([\d.]+)/i),n=t?t[1].split(".").slice(0,2).join("."):"-1";return Number(n)}async $(e){return this.db||(p("SimpleDb","Opening database:",this.name),this.db=await new Promise((t,n)=>{const r=indexedDB.open(this.name,this.version);r.onsuccess=e=>{const n=e.target.result;t(n)},r.onblocked=()=>{n(new le(e,"Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed."))},r.onerror=t=>{const r=t.target.error;"VersionError"===r.name?n(new T(_.FAILED_PRECONDITION,"A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.")):"InvalidStateError"===r.name?n(new T(_.FAILED_PRECONDITION,"Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: "+r)):n(new le(e,r))},r.onupgradeneeded=e=>{p("SimpleDb",'Database "'+this.name+'" requires upgrade from version:',e.oldVersion);const t=e.target.result;this.V.O(t,r.transaction,e.oldVersion,this.version).next(()=>{p("SimpleDb","Database upgrade to version "+this.version+" complete")})}})),this.F&&(this.db.onversionchange=e=>this.F(e)),this.db}B(e){this.F=e,this.db&&(this.db.onversionchange=t=>e(t))}async runTransaction(e,t,n,r){const i="readonly"===t;let s=0;for(;;){++s;try{this.db=await this.$(e);const t=ae.open(this.db,e,i?"readonly":"readwrite",n),s=r(t).next(e=>(t.P(),e)).catch(e=>(t.abort(e),oe.reject(e))).toPromise();return s.catch(()=>{}),await t.R,s}catch(e){const t=e,n="FirebaseError"!==t.name&&s<3;if(p("SimpleDb","Transaction failed with error:",t.message,"Retrying:",n),this.close(),!n)return Promise.reject(t)}}}close(){this.db&&this.db.close(),this.db=void 0}}class ue{constructor(e){this.L=e,this.q=!1,this.U=null}get isDone(){return this.q}get K(){return this.U}set cursor(e){this.L=e}done(){this.q=!0}G(e){this.U=e}delete(){return fe(this.L.delete())}}class le extends T{constructor(e,t){super(_.UNAVAILABLE,`IndexedDB transaction '${e}' failed: ${t}`),this.name="IndexedDbTransactionError"}}function he(e){return"IndexedDbTransactionError"===e.name}class de{constructor(e){this.store=e}put(e,t){let n;return void 0!==t?(p("SimpleDb","PUT",this.store.name,e,t),n=this.store.put(t,e)):(p("SimpleDb","PUT",this.store.name,"",e),n=this.store.put(e)),fe(n)}add(e){return p("SimpleDb","ADD",this.store.name,e,e),fe(this.store.add(e))}get(e){return fe(this.store.get(e)).next(t=>(void 0===t&&(t=null),p("SimpleDb","GET",this.store.name,e,t),t))}delete(e){return p("SimpleDb","DELETE",this.store.name,e),fe(this.store.delete(e))}count(){return p("SimpleDb","COUNT",this.store.name),fe(this.store.count())}j(e,t){const n=this.options(e,t);if(n.index||"function"!=typeof this.store.getAll){const e=this.cursor(n),t=[];return this.W(e,(e,n)=>{t.push(n)}).next(()=>t)}{const e=this.store.getAll(n.range);return new oe((t,n)=>{e.onerror=e=>{n(e.target.error)},e.onsuccess=e=>{t(e.target.result)}})}}H(e,t){const n=this.store.getAll(e,null===t?void 0:t);return new oe((e,t)=>{n.onerror=e=>{t(e.target.error)},n.onsuccess=t=>{e(t.target.result)}})}J(e,t){p("SimpleDb","DELETE ALL",this.store.name);const n=this.options(e,t);n.Y=!1;const r=this.cursor(n);return this.W(r,(e,t,n)=>n.delete())}X(e,t){let n;t?n=e:(n={},t=e);const r=this.cursor(n);return this.W(r,t)}Z(e){const t=this.cursor({});return new oe((n,r)=>{t.onerror=e=>{const t=ge(e.target.error);r(t)},t.onsuccess=t=>{const r=t.target.result;r?e(r.primaryKey,r.value).next(e=>{e?r.continue():n()}):n()}})}W(e,t){const n=[];return new oe((r,i)=>{e.onerror=e=>{i(e.target.error)},e.onsuccess=e=>{const i=e.target.result;if(!i)return void r();const s=new ue(i),o=t(i.primaryKey,i.value,s);if(o instanceof oe){const e=o.catch(e=>(s.done(),oe.reject(e)));n.push(e)}s.isDone?r():null===s.K?i.continue():i.continue(s.K)}}).next(()=>oe.waitFor(n))}options(e,t){let n;return void 0!==e&&("string"==typeof e?n=e:t=e),{index:n,range:t}}cursor(e){let t="next";if(e.reverse&&(t="prev"),e.index){const n=this.store.index(e.index);return e.Y?n.openKeyCursor(e.range,t):n.openCursor(e.range,t)}return this.store.openCursor(e.range,t)}}function fe(e){return new oe((t,n)=>{e.onsuccess=e=>{const n=e.target.result;t(n)},e.onerror=e=>{const t=ge(e.target.error);n(t)}})}let pe=!1;function ge(e){const t=ce.S(Object(o.q)());if(t>=12.2&&t<13){const t="An internal error was encountered in the Indexed Database server";if(e.message.indexOf(t)>=0){const e=new T("internal",`IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${t}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`);return pe||(pe=!0,setTimeout(()=>{throw e},0)),e}}return e}class me{constructor(e,t){this.asyncQueue=e,this.tt=t,this.task=null}start(){this.et(15e3)}stop(){this.task&&(this.task.cancel(),this.task=null)}get started(){return null!==this.task}et(e){p("IndexBackiller",`Scheduled in ${e}ms`),this.task=this.asyncQueue.enqueueAfterDelay("index_backfill",e,async()=>{this.task=null;try{p("IndexBackiller","Documents written: "+await this.tt.nt())}catch(e){he(e)?p("IndexBackiller","Ignoring IndexedDB error during index backfill: ",e):await se(e)}await this.et(6e4)})}}class ye{constructor(e,t){this.localStore=e,this.persistence=t}async nt(e=50){return this.persistence.runTransaction("Backfill Indexes","readwrite-primary",t=>this.st(t,e))}st(e,t){const n=new Set;let r=t,i=!0;return oe.doWhile(()=>!0===i&&r>0,()=>this.localStore.indexManager.getNextCollectionGroupToUpdate(e).next(t=>{if(null!==t&&!n.has(t))return p("IndexBackiller","Processing collection: "+t),this.it(e,t,r).next(e=>{r-=e,n.add(t)});i=!1})).next(()=>t-r)}it(e,t,n){return this.localStore.indexManager.getMinOffsetFromCollectionGroup(e,t).next(r=>this.localStore.localDocuments.getNextDocuments(e,t,r,n).next(n=>{const i=n.changes;return this.localStore.indexManager.updateIndexEntries(e,i).next(()=>this.rt(r,n)).next(n=>(p("IndexBackiller","Updating offset: "+n),this.localStore.indexManager.updateCollectionGroup(e,t,n))).next(()=>i.size)}))}rt(e,t){let n=e;return t.changes.forEach((e,t)=>{const r=ee(t);ne(r,n)>0&&(n=r)}),new te(n.readTime,n.documentKey,Math.max(t.batchId,e.largestBatchId))}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2228,7 +2309,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ne(e){var t,n;return"server_timestamp"===(null===(n=((null===(t=null==e?void 0:e.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===n?void 0:n.stringValue)}function re(e){const t=Z(e.mapValue.fields.__local_write_time__.timestampValue);return new V(t.seconds,t.nanos)} + */class ve{constructor(e,t){this.previousValue=e,t&&(t.sequenceNumberHandler=e=>this.ot(e),this.ut=e=>t.writeSequenceNumber(e))}ot(e){return this.previousValue=Math.max(e,this.previousValue),this.previousValue}next(){const e=++this.previousValue;return this.ut&&this.ut(e),e}}function we(e){return null==e}function be(e){return 0===e&&1/e==-1/0}function Ie(e){return"number"==typeof e&&Number.isInteger(e)&&!be(e)&&e<=Number.MAX_SAFE_INTEGER&&e>=Number.MIN_SAFE_INTEGER} /** * @license * Copyright 2017 Google LLC @@ -2244,10 +2325,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ie(e){return null==e}function se(e){return 0===e&&1/e==-1/0}function oe(e){return"number"==typeof e&&Number.isInteger(e)&&!se(e)&&e<=Number.MAX_SAFE_INTEGER&&e>=Number.MIN_SAFE_INTEGER} + */function _e(e){let t="";for(let n=0;n0&&(t=Ee(t)),t=Te(e.get(n),t);return Ee(t)}function Te(e,t){let n=t;const r=e.length;for(let t=0;t=2),2===t)return w(""===e.charAt(0)&&""===e.charAt(1)),B.emptyPath();const n=t-2,r=[];let i="";for(let s=0;sn)&&v(),e.charAt(t+1)){case"":const n=e.substring(s,t);let o;0===i.length?o=n:(i+=n,o=i,i=""),r.push(o);break;case"":i+=e.substring(s,t),i+="\0";break;case"":i+=e.substring(s,t+1);break;default:v()}s=t+2}return new B(r)} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2260,10 +2341,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ae{constructor(e){this.path=e}static fromPath(e){return new ae(G.fromString(e))}static fromName(e){return new ae(G.fromString(e).popFirst(5))}hasCollectionId(e){return this.path.length>=2&&this.path.get(this.path.length-2)===e}isEqual(e){return null!==e&&0===G.comparator(this.path,e.path)}toString(){return this.path.toString()}static comparator(e,t){return G.comparator(e.path,t.path)}static isDocumentKey(e){return e.length%2==0}static fromSegments(e){return new ae(new G(e.slice()))}} + */ve.ct=-1;const ke=["userId","batchId"]; /** * @license - * Copyright 2020 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2276,10 +2357,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ce(e){return"nullValue"in e?0:"booleanValue"in e?1:"integerValue"in e||"doubleValue"in e?2:"timestampValue"in e?3:"stringValue"in e?5:"bytesValue"in e?6:"referenceValue"in e?7:"geoPointValue"in e?8:"arrayValue"in e?9:"mapValue"in e?ne(e)?4:10:v()}function ue(e,t){const n=ce(e);if(n!==ce(t))return!1;switch(n){case 0:return!0;case 1:return e.booleanValue===t.booleanValue;case 4:return re(e).isEqual(re(t));case 3:return function(e,t){if("string"==typeof e.timestampValue&&"string"==typeof t.timestampValue&&e.timestampValue.length===t.timestampValue.length)return e.timestampValue===t.timestampValue;const n=Z(e.timestampValue),r=Z(t.timestampValue);return n.seconds===r.seconds&&n.nanos===r.nanos}(e,t);case 5:return e.stringValue===t.stringValue;case 6:return function(e,t){return te(e.bytesValue).isEqual(te(t.bytesValue))}(e,t);case 7:return e.referenceValue===t.referenceValue;case 8:return function(e,t){return ee(e.geoPointValue.latitude)===ee(t.geoPointValue.latitude)&&ee(e.geoPointValue.longitude)===ee(t.geoPointValue.longitude)}(e,t);case 2:return function(e,t){if("integerValue"in e&&"integerValue"in t)return ee(e.integerValue)===ee(t.integerValue);if("doubleValue"in e&&"doubleValue"in t){const n=ee(e.doubleValue),r=ee(t.doubleValue);return n===r?se(n)===se(r):isNaN(n)&&isNaN(r)}return!1}(e,t);case 9:return j(e.arrayValue.values||[],t.arrayValue.values||[],ue);case 10:return function(e,t){const n=e.mapValue.fields||{},r=t.mapValue.fields||{};if(B(n)!==B(r))return!1;for(const e in n)if(n.hasOwnProperty(e)&&(void 0===r[e]||!ue(n[e],r[e])))return!1;return!0}(e,t);default:return v()}}function he(e,t){return void 0!==(e.values||[]).find(e=>ue(e,t))}function le(e,t){const n=ce(e),r=ce(t);if(n!==r)return F(n,r);switch(n){case 0:return 0;case 1:return F(e.booleanValue,t.booleanValue);case 2:return function(e,t){const n=ee(e.integerValue||e.doubleValue),r=ee(t.integerValue||t.doubleValue);return nr?1:n===r?0:isNaN(n)?isNaN(r)?0:-1:1}(e,t);case 3:return de(e.timestampValue,t.timestampValue);case 4:return de(re(e),re(t));case 5:return F(e.stringValue,t.stringValue);case 6:return function(e,t){const n=te(e),r=te(t);return n.compareTo(r)}(e.bytesValue,t.bytesValue);case 7:return function(e,t){const n=e.split("/"),r=t.split("/");for(let e=0;et.mapValue.fields[e]=be(n)),t}if(e.arrayValue){const t={arrayValue:{values:[]}};for(let n=0;n<(e.arrayValue.values||[]).length;++n)t.arrayValue.values[n]=be(e.arrayValue.values[n]);return t}return Object.assign({},e)} + */function Ce(e,t){return[e,_e(t)]}function Ae(e,t,n){return[e,_e(t),n]}const Ne={},De=["prefixPath","collectionGroup","readTime","documentId"],Oe=["prefixPath","collectionGroup","documentId"],Re=["collectionGroup","readTime","prefixPath","documentId"],xe=["canonicalId","targetId"],Pe=["targetId","path"],Le=["path","targetId"],Me=["collectionId","parent"],Fe=["indexId","uid"],Ve=["uid","sequenceNumber"],je=["indexId","uid","arrayValue","directionalValue","orderedDocumentKey","documentKey"],Ue=["indexId","uid","orderedDocumentKey"],qe=["userId","collectionPath","documentId"],Be=["userId","collectionPath","largestBatchId"],ze=["userId","collectionGroup","largestBatchId"],Ge=["mutationQueues","mutations","documentMutations","remoteDocuments","targets","owner","targetGlobal","targetDocuments","clientMetadata","remoteDocumentGlobal","collectionParents","bundles","namedQueries"],Ke=[...Ge,"documentOverlays"],$e=["mutationQueues","mutations","documentMutations","remoteDocumentsV14","targets","owner","targetGlobal","targetDocuments","clientMetadata","remoteDocumentGlobal","collectionParents","bundles","namedQueries","documentOverlays"],We=$e,He=[...We,"indexConfiguration","indexState","indexEntries"]; /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2292,7 +2373,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ie{constructor(e){this.value=e}static empty(){return new Ie({mapValue:{}})}field(e){if(e.isEmpty())return this.value;{let t=this.value;for(let n=0;n{if(!t.isImmediateParentOf(i)){const e=this.getFieldsMap(t);this.applyChanges(e,n,r),n={},r=[],t=i.popLast()}e?n[i.lastSegment()]=be(e):r.push(i.lastSegment())});const i=this.getFieldsMap(t);this.applyChanges(i,n,r)}delete(e){const t=this.field(e.popLast());we(t)&&t.mapValue.fields&&delete t.mapValue.fields[e.lastSegment()]}isEqual(e){return ue(this.value,e.value)}getFieldsMap(e){let t=this.value;t.mapValue.fields||(t.mapValue={fields:{}});for(let n=0;ne[t]=n);for(const t of n)delete e[t]}clone(){return new Ie(be(this.value))}}function _e(e){const t=[];return z(e.fields,(e,n)=>{const r=new $([e]);if(we(n)){const e=_e(n.mapValue).fields;if(0===e.length)t.push(r);else for(const n of e)t.push(r.child(n))}else t.push(r)}),new Q(t) + */class Qe extends ie{constructor(e,t){super(),this.ht=e,this.currentSequenceNumber=t}}function Ye(e,t){const n=I(e);return ce.M(n.ht,t)} /** * @license * Copyright 2017 Google LLC @@ -2308,10 +2389,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */}class Te{constructor(e,t,n,r,i){this.key=e,this.documentType=t,this.version=n,this.data=r,this.documentState=i}static newInvalidDocument(e){return new Te(e,0,q.min(),Ie.empty(),0)}static newFoundDocument(e,t,n){return new Te(e,1,t,n,0)}static newNoDocument(e,t){return new Te(e,2,t,Ie.empty(),0)}static newUnknownDocument(e,t){return new Te(e,3,t,Ie.empty(),2)}convertToFoundDocument(e,t){return this.version=e,this.documentType=1,this.data=t,this.documentState=0,this}convertToNoDocument(e){return this.version=e,this.documentType=2,this.data=Ie.empty(),this.documentState=0,this}convertToUnknownDocument(e){return this.version=e,this.documentType=3,this.data=Ie.empty(),this.documentState=2,this}setHasCommittedMutations(){return this.documentState=2,this}setHasLocalMutations(){return this.documentState=1,this}get hasLocalMutations(){return 1===this.documentState}get hasCommittedMutations(){return 2===this.documentState}get hasPendingWrites(){return this.hasLocalMutations||this.hasCommittedMutations}isValidDocument(){return 0!==this.documentType}isFoundDocument(){return 1===this.documentType}isNoDocument(){return 2===this.documentType}isUnknownDocument(){return 3===this.documentType}isEqual(e){return e instanceof Te&&this.key.isEqual(e.key)&&this.version.isEqual(e.version)&&this.documentType===e.documentType&&this.documentState===e.documentState&&this.data.isEqual(e.data)}clone(){return new Te(this.key,this.documentType,this.version,this.data.clone(),this.documentState)}toString(){return`Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`}} + */function Je(e){let t=0;for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&t++;return t}function Xe(e,t){for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&t(n,e[n])}function Ze(e){for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0} /** * @license - * Copyright 2019 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2324,7 +2405,7 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ee{constructor(e,t=null,n=[],r=[],i=null,s=null,o=null){this.path=e,this.collectionGroup=t,this.orderBy=n,this.filters=r,this.limit=i,this.startAt=s,this.endAt=o,this.R=null}}function ke(e,t=null,n=[],r=[],i=null,s=null,o=null){return new Ee(e,t,n,r,i,s,o)}function Se(e){const t=I(e);if(null===t.R){let e=t.path.canonicalString();null!==t.collectionGroup&&(e+="|cg:"+t.collectionGroup),e+="|f:",e+=t.filters.map(e=>function(e){return e.field.canonicalString()+e.op.toString()+fe(e.value)}(e)).join(","),e+="|ob:",e+=t.orderBy.map(e=>function(e){return e.field.canonicalString()+e.dir}(e)).join(","),ie(t.limit)||(e+="|l:",e+=t.limit),t.startAt&&(e+="|lb:",e+=Ue(t.startAt)),t.endAt&&(e+="|ub:",e+=Ue(t.endAt)),t.R=e}return t.R}function Ae(e,t){if(e.limit!==t.limit)return!1;if(e.orderBy.length!==t.orderBy.length)return!1;for(let n=0;n":return e>0;case">=":return e>=0;default:return v()}}V(){return["<","<=",">",">=","!=","not-in"].indexOf(this.op)>=0}}class Ce extends Oe{constructor(e,t,n){super(e,t,n),this.key=ae.fromName(n.referenceValue)}matches(e){const t=ae.comparator(e.key,this.key);return this.v(t)}}class De extends Oe{constructor(e,t){super(e,"in",t),this.keys=Pe("in",t)}matches(e){return this.keys.some(t=>t.isEqual(e.key))}}class Re extends Oe{constructor(e,t){super(e,"not-in",t),this.keys=Pe("not-in",t)}matches(e){return!this.keys.some(t=>t.isEqual(e.key))}}function Pe(e,t){var n;return((null===(n=t.arrayValue)||void 0===n?void 0:n.values)||[]).map(e=>ae.fromName(e.referenceValue))}class Le extends Oe{constructor(e,t){super(e,"array-contains",t)}matches(e){const t=e.data.field(this.field);return ge(t)&&he(t.arrayValue,this.value)}}class xe extends Oe{constructor(e,t){super(e,"in",t)}matches(e){const t=e.data.field(this.field);return null!==t&&he(this.value.arrayValue,t)}}class Me extends Oe{constructor(e,t){super(e,"not-in",t)}matches(e){if(he(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;const t=e.data.field(this.field);return null!==t&&!he(this.value.arrayValue,t)}}class Fe extends Oe{constructor(e,t){super(e,"array-contains-any",t)}matches(e){const t=e.data.field(this.field);return!(!ge(t)||!t.arrayValue.values)&&t.arrayValue.values.some(e=>he(this.value.arrayValue,e))}}class je{constructor(e,t){this.position=e,this.before=t}}function Ue(e){return`${e.before?"b":"a"}:${e.position.map(e=>fe(e)).join(",")}`}class Ve{constructor(e,t="asc"){this.field=e,this.dir=t}}function qe(e,t){return e.dir===t.dir&&e.field.isEqual(t.field)}function Be(e,t,n){let r=0;for(let i=0;i0&&(t=t.right)}return null}indexOf(e){let t=0,n=this.root;for(;!n.isEmpty();){const r=this.comparator(e,n.key);if(0===r)return t+n.left.size;r<0?n=n.left:(t+=n.left.size+1,n=n.right)}return-1}isEmpty(){return this.root.isEmpty()}get size(){return this.root.size}minKey(){return this.root.minKey()}maxKey(){return this.root.maxKey()}inorderTraversal(e){return this.root.inorderTraversal(e)}forEach(e){this.inorderTraversal((t,n)=>(e(t,n),!1))}toString(){const e=[];return this.inorderTraversal((t,n)=>(e.push(`${t}:${n}`),!1)),`{${e.join(", ")}}`}reverseTraversal(e){return this.root.reverseTraversal(e)}getIterator(){return new tt(this.root,null,this.comparator,!1)}getIteratorFrom(e){return new tt(this.root,e,this.comparator,!1)}getReverseIterator(){return new tt(this.root,null,this.comparator,!0)}getReverseIteratorFrom(e){return new tt(this.root,e,this.comparator,!0)}}class tt{constructor(e,t,n,r){this.isReverse=r,this.nodeStack=[];let i=1;for(;!e.isEmpty();)if(i=t?n(e.key,t):1,t&&r&&(i*=-1),i<0)e=this.isReverse?e.left:e.right;else{if(0===i){this.nodeStack.push(e);break}this.nodeStack.push(e),e=this.isReverse?e.right:e.left}}getNext(){let e=this.nodeStack.pop();const t={key:e.key,value:e.value};if(this.isReverse)for(e=e.left;!e.isEmpty();)this.nodeStack.push(e),e=e.right;else for(e=e.right;!e.isEmpty();)this.nodeStack.push(e),e=e.left;return t}hasNext(){return this.nodeStack.length>0}peek(){if(0===this.nodeStack.length)return null;const e=this.nodeStack[this.nodeStack.length-1];return{key:e.key,value:e.value}}}class nt{constructor(e,t,n,r,i){this.key=e,this.value=t,this.color=null!=n?n:nt.RED,this.left=null!=r?r:nt.EMPTY,this.right=null!=i?i:nt.EMPTY,this.size=this.left.size+1+this.right.size}copy(e,t,n,r,i){return new nt(null!=e?e:this.key,null!=t?t:this.value,null!=n?n:this.color,null!=r?r:this.left,null!=i?i:this.right)}isEmpty(){return!1}inorderTraversal(e){return this.left.inorderTraversal(e)||e(this.key,this.value)||this.right.inorderTraversal(e)}reverseTraversal(e){return this.right.reverseTraversal(e)||e(this.key,this.value)||this.left.reverseTraversal(e)}min(){return this.left.isEmpty()?this:this.left.min()}minKey(){return this.min().key}maxKey(){return this.right.isEmpty()?this.key:this.right.maxKey()}insert(e,t,n){let r=this;const i=n(e,r.key);return r=i<0?r.copy(null,null,null,r.left.insert(e,t,n),null):0===i?r.copy(null,t,null,null,null):r.copy(null,null,null,null,r.right.insert(e,t,n)),r.fixUp()}removeMin(){if(this.left.isEmpty())return nt.EMPTY;let e=this;return e.left.isRed()||e.left.left.isRed()||(e=e.moveRedLeft()),e=e.copy(null,null,null,e.left.removeMin(),null),e.fixUp()}remove(e,t){let n,r=this;if(t(e,r.key)<0)r.left.isEmpty()||r.left.isRed()||r.left.left.isRed()||(r=r.moveRedLeft()),r=r.copy(null,null,null,r.left.remove(e,t),null);else{if(r.left.isRed()&&(r=r.rotateRight()),r.right.isEmpty()||r.right.isRed()||r.right.left.isRed()||(r=r.moveRedRight()),0===t(e,r.key)){if(r.right.isEmpty())return nt.EMPTY;n=r.right.min(),r=r.copy(n.key,n.value,null,null,r.right.removeMin())}r=r.copy(null,null,null,null,r.right.remove(e,t))}return r.fixUp()}isRed(){return this.color}fixUp(){let e=this;return e.right.isRed()&&!e.left.isRed()&&(e=e.rotateLeft()),e.left.isRed()&&e.left.left.isRed()&&(e=e.rotateRight()),e.left.isRed()&&e.right.isRed()&&(e=e.colorFlip()),e}moveRedLeft(){let e=this.colorFlip();return e.right.left.isRed()&&(e=e.copy(null,null,null,null,e.right.rotateRight()),e=e.rotateLeft(),e=e.colorFlip()),e}moveRedRight(){let e=this.colorFlip();return e.left.left.isRed()&&(e=e.rotateRight(),e=e.colorFlip()),e}rotateLeft(){const e=this.copy(null,null,nt.RED,null,this.right.left);return this.right.copy(null,null,this.color,e,null)}rotateRight(){const e=this.copy(null,null,nt.RED,this.left.right,null);return this.left.copy(null,null,this.color,null,e)}colorFlip(){const e=this.left.copy(null,null,!this.left.color,null,null),t=this.right.copy(null,null,!this.right.color,null,null);return this.copy(null,null,!this.color,e,t)}checkMaxDepth(){const e=this.check();return Math.pow(2,e)<=this.size+1}check(){if(this.isRed()&&this.left.isRed())throw v();if(this.right.isRed())throw v();const e=this.left.check();if(e!==this.right.check())throw v();return e+(this.isRed()?0:1)}}nt.EMPTY=null,nt.RED=!0,nt.BLACK=!1,nt.EMPTY=new class{constructor(){this.size=0}get key(){throw v()}get value(){throw v()}get color(){throw v()}get left(){throw v()}get right(){throw v()}copy(e,t,n,r,i){return this}insert(e,t,n){return new nt(e,t)}remove(e,t){return this}isEmpty(){return!0}inorderTraversal(e){return!1}reverseTraversal(e){return!1}minKey(){return null}maxKey(){return null}isRed(){return!1}checkMaxDepth(){return!0}check(){return 0}}; /** * @license * Copyright 2017 Google LLC @@ -2340,7 +2421,8 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ke{constructor(e,t=null,n=[],r=[],i=null,s="F",o=null,a=null){this.path=e,this.collectionGroup=t,this.explicitOrderBy=n,this.filters=r,this.limit=i,this.limitType=s,this.startAt=o,this.endAt=a,this.S=null,this.D=null,this.startAt,this.endAt}}function We(e,t,n,r,i,s,o,a){return new Ke(e,t,n,r,i,s,o,a)}function Ge(e){return new Ke(e)}function He(e){return!ie(e.limit)&&"F"===e.limitType}function $e(e){return!ie(e.limit)&&"L"===e.limitType}function Qe(e){return e.explicitOrderBy.length>0?e.explicitOrderBy[0].field:null}function Je(e){for(const t of e.filters)if(t.V())return t.field;return null}function Ye(e){return null!==e.collectionGroup}function Xe(e){const t=I(e);if(null===t.S){t.S=[];const e=Je(t),n=Qe(t);if(null!==e&&null===n)e.isKeyField()||t.S.push(new Ve(e)),t.S.push(new Ve($.keyField(),"asc"));else{let e=!1;for(const n of t.explicitOrderBy)t.S.push(n),n.field.isKeyField()&&(e=!0);if(!e){const e=t.explicitOrderBy.length>0?t.explicitOrderBy[t.explicitOrderBy.length-1].dir:"asc";t.S.push(new Ve($.keyField(),e))}}}return t.S}function Ze(e){const t=I(e);if(!t.D)if("F"===t.limitType)t.D=ke(t.path,t.collectionGroup,Xe(t),t.filters,t.limit,t.startAt,t.endAt);else{const e=[];for(const n of Xe(t)){const t="desc"===n.dir?"asc":"desc";e.push(new Ve(n.field,t))}const n=t.endAt?new je(t.endAt.position,!t.endAt.before):null,r=t.startAt?new je(t.startAt.position,!t.startAt.before):null;t.D=ke(t.path,t.collectionGroup,e,t.filters,t.limit,n,r)}return t.D}function et(e,t,n){return new Ke(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),t,n,e.startAt,e.endAt)}function tt(e,t){return Ae(Ze(e),Ze(t))&&e.limitType===t.limitType}function nt(e){return`${Se(Ze(e))}|lt:${e.limitType}`}function rt(e){return`Query(target=${function(e){let t=e.path.canonicalString();return null!==e.collectionGroup&&(t+=" collectionGroup="+e.collectionGroup),e.filters.length>0&&(t+=`, filters: [${e.filters.map(e=>{return`${(t=e).field.canonicalString()} ${t.op} ${fe(t.value)}`;var t}).join(", ")}]`),ie(e.limit)||(t+=", limit: "+e.limit),e.orderBy.length>0&&(t+=`, orderBy: [${e.orderBy.map(e=>function(e){return`${e.field.canonicalString()} (${e.dir})`}(e)).join(", ")}]`),e.startAt&&(t+=", startAt: "+Ue(e.startAt)),e.endAt&&(t+=", endAt: "+Ue(e.endAt)),`Target(${t})`}(Ze(e))}; limitType=${e.limitType})`}function it(e,t){return t.isFoundDocument()&&function(e,t){const n=t.key.path;return null!==e.collectionGroup?t.key.hasCollectionId(e.collectionGroup)&&e.path.isPrefixOf(n):ae.isDocumentKey(e.path)?e.path.isEqual(n):e.path.isImmediateParentOf(n)}(e,t)&&function(e,t){for(const n of e.explicitOrderBy)if(!n.field.isKeyField()&&null===t.data.field(n.field))return!1;return!0}(e,t)&&function(e,t){for(const n of e.filters)if(!n.matches(t))return!1;return!0}(e,t)&&function(e,t){return!(e.startAt&&!Be(e.startAt,Xe(e),t))&&(!e.endAt||!Be(e.endAt,Xe(e),t))}(e,t)}function st(e){return(t,n)=>{let r=!1;for(const i of Xe(e)){const e=ot(i,t,n);if(0!==e)return e;r=r||i.field.isKeyField()}return 0}}function ot(e,t,n){const r=e.field.isKeyField()?ae.comparator(t.key,n.key):function(e,t,n){const r=t.data.field(e),i=n.data.field(e);return null!==r&&null!==i?le(r,i):v()}(e.field,t,n);switch(e.dir){case"asc":return r;case"desc":return-1*r;default:return v()}} + */ +class rt{constructor(e){this.comparator=e,this.data=new et(this.comparator)}has(e){return null!==this.data.get(e)}first(){return this.data.minKey()}last(){return this.data.maxKey()}get size(){return this.data.size}indexOf(e){return this.data.indexOf(e)}forEach(e){this.data.inorderTraversal((t,n)=>(e(t),!1))}forEachInRange(e,t){const n=this.data.getIteratorFrom(e[0]);for(;n.hasNext();){const r=n.getNext();if(this.comparator(r.key,e[1])>=0)return;t(r.key)}}forEachWhile(e,t){let n;for(n=void 0!==t?this.data.getIteratorFrom(t):this.data.getIterator();n.hasNext();)if(!e(n.getNext().key))return}firstAfterOrEqual(e){const t=this.data.getIteratorFrom(e);return t.hasNext()?t.getNext().key:null}getIterator(){return new it(this.data.getIterator())}getIteratorFrom(e){return new it(this.data.getIteratorFrom(e))}add(e){return this.copy(this.data.remove(e).insert(e,!0))}delete(e){return this.has(e)?this.copy(this.data.remove(e)):this}isEmpty(){return this.data.isEmpty()}unionWith(e){let t=this;return t.size{t=t.add(e)}),t}isEqual(e){if(!(e instanceof rt))return!1;if(this.size!==e.size)return!1;const t=this.data.getIterator(),n=e.data.getIterator();for(;t.hasNext();){const e=t.getNext().key,r=n.getNext().key;if(0!==this.comparator(e,r))return!1}return!0}toArray(){const e=[];return this.forEach(t=>{e.push(t)}),e}toString(){const e=[];return this.forEach(t=>e.push(t)),"SortedSet("+e.toString()+")"}copy(e){const t=new rt(this.comparator);return t.data=e,t}}class it{constructor(e){this.iter=e}getNext(){return this.iter.getNext().key}hasNext(){return this.iter.hasNext()}}function st(e){return e.hasNext()?e.getNext():void 0} /** * @license * Copyright 2020 Google LLC @@ -2356,10 +2438,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function at(e,t){if(e.C){if(isNaN(t))return{doubleValue:"NaN"};if(t===1/0)return{doubleValue:"Infinity"};if(t===-1/0)return{doubleValue:"-Infinity"}}return{doubleValue:se(t)?"-0":t}}function ct(e){return{integerValue:""+e}}function ut(e,t){return oe(t)?ct(t):at(e,t)} + */class ot{constructor(e){this.fields=e,e.sort(G.comparator)}static empty(){return new ot([])}unionWith(e){let t=new rt(G.comparator);for(const e of this.fields)t=t.add(e);for(const n of e)t=t.add(n);return new ot(t.toArray())}covers(e){for(const t of this.fields)if(t.isPrefixOf(e))return!0;return!1}isEqual(e){return F(this.fields,e.fields,(e,t)=>e.isEqual(t))}} /** * @license - * Copyright 2018 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2372,10 +2454,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ht{constructor(){this._=void 0}}function lt(e,t,n){return e instanceof pt?function(e,t){const n={fields:{__type__:{stringValue:"server_timestamp"},__local_write_time__:{timestampValue:{seconds:e.seconds,nanos:e.nanoseconds}}}};return t&&(n.fields.__previous_value__=t),{mapValue:n}}(n,t):e instanceof mt?gt(e,t):e instanceof yt?vt(e,t):function(e,t){const n=ft(e,t),r=bt(n)+bt(e.N);return me(n)&&me(e.N)?ct(r):at(e.k,r)}(e,t)}function dt(e,t,n){return e instanceof mt?gt(e,t):e instanceof yt?vt(e,t):n}function ft(e,t){return e instanceof wt?me(n=t)||function(e){return!!e&&"doubleValue"in e}(n)?t:{integerValue:0}:null;var n}class pt extends ht{}class mt extends ht{constructor(e){super(),this.elements=e}}function gt(e,t){const n=It(t);for(const t of e.elements)n.some(e=>ue(e,t))||n.push(t);return{arrayValue:{values:n}}}class yt extends ht{constructor(e){super(),this.elements=e}}function vt(e,t){let n=It(t);for(const t of e.elements)n=n.filter(e=>!ue(e,t));return{arrayValue:{values:n}}}class wt extends ht{constructor(e,t){super(),this.k=e,this.N=t}}function bt(e){return ee(e.integerValue||e.doubleValue)}function It(e){return ge(e)&&e.arrayValue.values?e.arrayValue.values.slice():[]} + */class at extends Error{constructor(){super(...arguments),this.name="Base64DecodeError"}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2388,10 +2470,10 @@ let h="9.6.1"; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class _t{constructor(e,t){this.field=e,this.transform=t}}class Tt{constructor(e,t){this.version=e,this.transformResults=t}}class Et{constructor(e,t){this.updateTime=e,this.exists=t}static none(){return new Et}static exists(e){return new Et(void 0,e)}static updateTime(e){return new Et(e)}get isNone(){return void 0===this.updateTime&&void 0===this.exists}isEqual(e){return this.exists===e.exists&&(this.updateTime?!!e.updateTime&&this.updateTime.isEqual(e.updateTime):!e.updateTime)}}function kt(e,t){return void 0!==e.updateTime?t.isFoundDocument()&&t.version.isEqual(e.updateTime):void 0===e.exists||e.exists===t.isFoundDocument()}class St{}function At(e,t,n){e instanceof Rt?function(e,t,n){const r=e.value.clone(),i=xt(e.fieldTransforms,t,n.transformResults);r.setAll(i),t.convertToFoundDocument(n.version,r).setHasCommittedMutations()}(e,t,n):e instanceof Pt?function(e,t,n){if(!kt(e.precondition,t))return void t.convertToUnknownDocument(n.version);const r=xt(e.fieldTransforms,t,n.transformResults),i=t.data;i.setAll(Lt(e)),i.setAll(r),t.convertToFoundDocument(n.version,i).setHasCommittedMutations()}(e,t,n):function(e,t,n){t.convertToNoDocument(n.version).setHasCommittedMutations()}(0,t,n)}function Nt(e,t,n){e instanceof Rt?function(e,t,n){if(!kt(e.precondition,t))return;const r=e.value.clone(),i=Mt(e.fieldTransforms,n,t);r.setAll(i),t.convertToFoundDocument(Dt(t),r).setHasLocalMutations()}(e,t,n):e instanceof Pt?function(e,t,n){if(!kt(e.precondition,t))return;const r=Mt(e.fieldTransforms,n,t),i=t.data;i.setAll(Lt(e)),i.setAll(r),t.convertToFoundDocument(Dt(t),i).setHasLocalMutations()}(e,t,n):function(e,t){kt(e.precondition,t)&&t.convertToNoDocument(q.min())}(e,t)}function Ot(e,t){let n=null;for(const r of e.fieldTransforms){const e=t.data.field(r.field),i=ft(r.transform,e||null);null!=i&&(null==n&&(n=Ie.empty()),n.set(r.field,i))}return n||null}function Ct(e,t){return e.type===t.type&&!!e.key.isEqual(t.key)&&!!e.precondition.isEqual(t.precondition)&&!!function(e,t){return void 0===e&&void 0===t||!(!e||!t)&&j(e,t,(e,t)=>function(e,t){return e.field.isEqual(t.field)&&function(e,t){return e instanceof mt&&t instanceof mt||e instanceof yt&&t instanceof yt?j(e.elements,t.elements,ue):e instanceof wt&&t instanceof wt?ue(e.N,t.N):e instanceof pt&&t instanceof pt}(e.transform,t.transform)}(e,t))}(e.fieldTransforms,t.fieldTransforms)&&(0===e.type?e.value.isEqual(t.value):1!==e.type||e.data.isEqual(t.data)&&e.fieldMask.isEqual(t.fieldMask))}function Dt(e){return e.isFoundDocument()?e.version:q.min()}class Rt extends St{constructor(e,t,n,r=[]){super(),this.key=e,this.value=t,this.precondition=n,this.fieldTransforms=r,this.type=0}}class Pt extends St{constructor(e,t,n,r,i=[]){super(),this.key=e,this.data=t,this.fieldMask=n,this.precondition=r,this.fieldTransforms=i,this.type=1}}function Lt(e){const t=new Map;return e.fieldMask.fields.forEach(n=>{if(!n.isEmpty()){const r=e.data.field(n);t.set(n,r)}}),t}function xt(e,t,n){const r=new Map;w(e.length===n.length);for(let i=0;ie0&&(t=t.right)}return null}indexOf(e){let t=0,n=this.root;for(;!n.isEmpty();){const r=this.comparator(e,n.key);if(0===r)return t+n.left.size;r<0?n=n.left:(t+=n.left.size+1,n=n.right)}return-1}isEmpty(){return this.root.isEmpty()}get size(){return this.root.size}minKey(){return this.root.minKey()}maxKey(){return this.root.maxKey()}inorderTraversal(e){return this.root.inorderTraversal(e)}forEach(e){this.inorderTraversal((t,n)=>(e(t,n),!1))}toString(){const e=[];return this.inorderTraversal((t,n)=>(e.push(`${t}:${n}`),!1)),`{${e.join(", ")}}`}reverseTraversal(e){return this.root.reverseTraversal(e)}getIterator(){return new Wt(this.root,null,this.comparator,!1)}getIteratorFrom(e){return new Wt(this.root,e,this.comparator,!1)}getReverseIterator(){return new Wt(this.root,null,this.comparator,!0)}getReverseIteratorFrom(e){return new Wt(this.root,e,this.comparator,!0)}}class Wt{constructor(e,t,n,r){this.isReverse=r,this.nodeStack=[];let i=1;for(;!e.isEmpty();)if(i=t?n(e.key,t):1,r&&(i*=-1),i<0)e=this.isReverse?e.left:e.right;else{if(0===i){this.nodeStack.push(e);break}this.nodeStack.push(e),e=this.isReverse?e.right:e.left}}getNext(){let e=this.nodeStack.pop();const t={key:e.key,value:e.value};if(this.isReverse)for(e=e.left;!e.isEmpty();)this.nodeStack.push(e),e=e.right;else for(e=e.right;!e.isEmpty();)this.nodeStack.push(e),e=e.left;return t}hasNext(){return this.nodeStack.length>0}peek(){if(0===this.nodeStack.length)return null;const e=this.nodeStack[this.nodeStack.length-1];return{key:e.key,value:e.value}}}class Gt{constructor(e,t,n,r,i){this.key=e,this.value=t,this.color=null!=n?n:Gt.RED,this.left=null!=r?r:Gt.EMPTY,this.right=null!=i?i:Gt.EMPTY,this.size=this.left.size+1+this.right.size}copy(e,t,n,r,i){return new Gt(null!=e?e:this.key,null!=t?t:this.value,null!=n?n:this.color,null!=r?r:this.left,null!=i?i:this.right)}isEmpty(){return!1}inorderTraversal(e){return this.left.inorderTraversal(e)||e(this.key,this.value)||this.right.inorderTraversal(e)}reverseTraversal(e){return this.right.reverseTraversal(e)||e(this.key,this.value)||this.left.reverseTraversal(e)}min(){return this.left.isEmpty()?this:this.left.min()}minKey(){return this.min().key}maxKey(){return this.right.isEmpty()?this.key:this.right.maxKey()}insert(e,t,n){let r=this;const i=n(e,r.key);return r=i<0?r.copy(null,null,null,r.left.insert(e,t,n),null):0===i?r.copy(null,t,null,null,null):r.copy(null,null,null,null,r.right.insert(e,t,n)),r.fixUp()}removeMin(){if(this.left.isEmpty())return Gt.EMPTY;let e=this;return e.left.isRed()||e.left.left.isRed()||(e=e.moveRedLeft()),e=e.copy(null,null,null,e.left.removeMin(),null),e.fixUp()}remove(e,t){let n,r=this;if(t(e,r.key)<0)r.left.isEmpty()||r.left.isRed()||r.left.left.isRed()||(r=r.moveRedLeft()),r=r.copy(null,null,null,r.left.remove(e,t),null);else{if(r.left.isRed()&&(r=r.rotateRight()),r.right.isEmpty()||r.right.isRed()||r.right.left.isRed()||(r=r.moveRedRight()),0===t(e,r.key)){if(r.right.isEmpty())return Gt.EMPTY;n=r.right.min(),r=r.copy(n.key,n.value,null,null,r.right.removeMin())}r=r.copy(null,null,null,null,r.right.remove(e,t))}return r.fixUp()}isRed(){return this.color}fixUp(){let e=this;return e.right.isRed()&&!e.left.isRed()&&(e=e.rotateLeft()),e.left.isRed()&&e.left.left.isRed()&&(e=e.rotateRight()),e.left.isRed()&&e.right.isRed()&&(e=e.colorFlip()),e}moveRedLeft(){let e=this.colorFlip();return e.right.left.isRed()&&(e=e.copy(null,null,null,null,e.right.rotateRight()),e=e.rotateLeft(),e=e.colorFlip()),e}moveRedRight(){let e=this.colorFlip();return e.left.left.isRed()&&(e=e.rotateRight(),e=e.colorFlip()),e}rotateLeft(){const e=this.copy(null,null,Gt.RED,null,this.right.left);return this.right.copy(null,null,this.color,e,null)}rotateRight(){const e=this.copy(null,null,Gt.RED,this.left.right,null);return this.left.copy(null,null,this.color,null,e)}colorFlip(){const e=this.left.copy(null,null,!this.left.color,null,null),t=this.right.copy(null,null,!this.right.color,null,null);return this.copy(null,null,!this.color,e,t)}checkMaxDepth(){const e=this.check();return Math.pow(2,e)<=this.size+1}check(){if(this.isRed()&&this.left.isRed())throw v();if(this.right.isRed())throw v();const e=this.left.check();if(e!==this.right.check())throw v();return e+(this.isRed()?0:1)}}Gt.EMPTY=null,Gt.RED=!0,Gt.BLACK=!1,Gt.EMPTY=new class{constructor(){this.size=0}get key(){throw v()}get value(){throw v()}get color(){throw v()}get left(){throw v()}get right(){throw v()}copy(e,t,n,r,i){return this}insert(e,t,n){return new Gt(e,t)}remove(e,t){return this}isEmpty(){return!0}inorderTraversal(e){return!1}reverseTraversal(e){return!1}minKey(){return null}maxKey(){return null}isRed(){return!1}checkMaxDepth(){return!0}check(){return 0}}; + */function pt(e){var t,n;return"server_timestamp"===(null===(n=((null===(t=null==e?void 0:e.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===n?void 0:n.stringValue)}function gt(e){const t=e.mapValue.fields.__previous_value__;return pt(t)?gt(t):t}function mt(e){const t=ht(e.mapValue.fields.__local_write_time__.timestampValue);return new j(t.seconds,t.nanos)} /** * @license * Copyright 2017 Google LLC @@ -2453,11 +2534,10 @@ class Kt{constructor(e,t){this.comparator=e,this.root=t||Gt.EMPTY}insert(e,t){re * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ -class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has(e){return null!==this.data.get(e)}first(){return this.data.minKey()}last(){return this.data.maxKey()}get size(){return this.data.size}indexOf(e){return this.data.indexOf(e)}forEach(e){this.data.inorderTraversal((t,n)=>(e(t),!1))}forEachInRange(e,t){const n=this.data.getIteratorFrom(e[0]);for(;n.hasNext();){const r=n.getNext();if(this.comparator(r.key,e[1])>=0)return;t(r.key)}}forEachWhile(e,t){let n;for(n=void 0!==t?this.data.getIteratorFrom(t):this.data.getIterator();n.hasNext();)if(!e(n.getNext().key))return}firstAfterOrEqual(e){const t=this.data.getIteratorFrom(e);return t.hasNext()?t.getNext().key:null}getIterator(){return new $t(this.data.getIterator())}getIteratorFrom(e){return new $t(this.data.getIteratorFrom(e))}add(e){return this.copy(this.data.remove(e).insert(e,!0))}delete(e){return this.has(e)?this.copy(this.data.remove(e)):this}isEmpty(){return this.data.isEmpty()}unionWith(e){let t=this;return t.size{t=t.add(e)}),t}isEqual(e){if(!(e instanceof Ht))return!1;if(this.size!==e.size)return!1;const t=this.data.getIterator(),n=e.data.getIterator();for(;t.hasNext();){const e=t.getNext().key,r=n.getNext().key;if(0!==this.comparator(e,r))return!1}return!0}toArray(){const e=[];return this.forEach(t=>{e.push(t)}),e}toString(){const e=[];return this.forEach(t=>e.push(t)),"SortedSet("+e.toString()+")"}copy(e){const t=new Ht(this.comparator);return t.data=e,t}}class $t{constructor(e){this.iter=e}getNext(){return this.iter.getNext().key}hasNext(){return this.iter.hasNext()}} + */class yt{constructor(e,t,n,r,i,s,o,a,c){this.databaseId=e,this.appId=t,this.persistenceKey=n,this.host=r,this.ssl=i,this.forceLongPolling=s,this.autoDetectLongPolling=o,this.longPollingOptions=a,this.useFetchStreams=c}}class vt{constructor(e,t){this.projectId=e,this.database=t||"(default)"}static empty(){return new vt("","")}get isDefaultDatabase(){return"(default)"===this.database}isEqual(e){return e instanceof vt&&e.projectId===this.projectId&&e.database===this.database}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2470,7 +2550,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Qt=new Kt(ae.comparator);function Jt(){return Qt}const Yt=new Kt(ae.comparator);function Xt(){return Yt}const Zt=new Kt(ae.comparator);function en(){return Zt}const tn=new Ht(ae.comparator);function nn(...e){let t=tn;for(const n of e)t=t.add(n);return t}const rn=new Ht(F);function sn(){return rn} + */const wt={mapValue:{fields:{__type__:{stringValue:"__max__"}}}},bt={nullValue:"NULL_VALUE"};function It(e){return"nullValue"in e?0:"booleanValue"in e?1:"integerValue"in e||"doubleValue"in e?2:"timestampValue"in e?3:"stringValue"in e?5:"bytesValue"in e?6:"referenceValue"in e?7:"geoPointValue"in e?8:"arrayValue"in e?9:"mapValue"in e?pt(e)?4:Pt(e)?9007199254740991:10:v()}function _t(e,t){if(e===t)return!0;const n=It(e);if(n!==It(t))return!1;switch(n){case 0:case 9007199254740991:return!0;case 1:return e.booleanValue===t.booleanValue;case 4:return mt(e).isEqual(mt(t));case 3:return function(e,t){if("string"==typeof e.timestampValue&&"string"==typeof t.timestampValue&&e.timestampValue.length===t.timestampValue.length)return e.timestampValue===t.timestampValue;const n=ht(e.timestampValue),r=ht(t.timestampValue);return n.seconds===r.seconds&&n.nanos===r.nanos}(e,t);case 5:return e.stringValue===t.stringValue;case 6:return function(e,t){return ft(e.bytesValue).isEqual(ft(t.bytesValue))}(e,t);case 7:return e.referenceValue===t.referenceValue;case 8:return function(e,t){return dt(e.geoPointValue.latitude)===dt(t.geoPointValue.latitude)&&dt(e.geoPointValue.longitude)===dt(t.geoPointValue.longitude)}(e,t);case 2:return function(e,t){if("integerValue"in e&&"integerValue"in t)return dt(e.integerValue)===dt(t.integerValue);if("doubleValue"in e&&"doubleValue"in t){const n=dt(e.doubleValue),r=dt(t.doubleValue);return n===r?be(n)===be(r):isNaN(n)&&isNaN(r)}return!1}(e,t);case 9:return F(e.arrayValue.values||[],t.arrayValue.values||[],_t);case 10:return function(e,t){const n=e.mapValue.fields||{},r=t.mapValue.fields||{};if(Je(n)!==Je(r))return!1;for(const e in n)if(n.hasOwnProperty(e)&&(void 0===r[e]||!_t(n[e],r[e])))return!1;return!0}(e,t);default:return v()}}function Tt(e,t){return void 0!==(e.values||[]).find(e=>_t(e,t))}function Et(e,t){if(e===t)return 0;const n=It(e),r=It(t);if(n!==r)return M(n,r);switch(n){case 0:case 9007199254740991:return 0;case 1:return M(e.booleanValue,t.booleanValue);case 2:return function(e,t){const n=dt(e.integerValue||e.doubleValue),r=dt(t.integerValue||t.doubleValue);return nr?1:n===r?0:isNaN(n)?isNaN(r)?0:-1:1}(e,t);case 3:return St(e.timestampValue,t.timestampValue);case 4:return St(mt(e),mt(t));case 5:return M(e.stringValue,t.stringValue);case 6:return function(e,t){const n=ft(e),r=ft(t);return n.compareTo(r)}(e.bytesValue,t.bytesValue);case 7:return function(e,t){const n=e.split("/"),r=t.split("/");for(let e=0;et.mapValue.fields[e]=xt(n)),t}if(e.arrayValue){const t={arrayValue:{values:[]}};for(let n=0;n<(e.arrayValue.values||[]).length;++n)t.arrayValue.values[n]=xt(e.arrayValue.values[n]);return t}return Object.assign({},e)}function Pt(e){return"__max__"===(((e.mapValue||{}).fields||{}).__type__||{}).stringValue}function Lt(e){return"nullValue"in e?bt:"booleanValue"in e?{booleanValue:!1}:"integerValue"in e||"doubleValue"in e?{doubleValue:NaN}:"timestampValue"in e?{timestampValue:{seconds:Number.MIN_SAFE_INTEGER}}:"stringValue"in e?{stringValue:""}:"bytesValue"in e?{bytesValue:""}:"referenceValue"in e?Ct(vt.empty(),K.empty()):"geoPointValue"in e?{geoPointValue:{latitude:-90,longitude:-180}}:"arrayValue"in e?{arrayValue:{}}:"mapValue"in e?{mapValue:{}}:v()}function Mt(e){return"nullValue"in e?{booleanValue:!1}:"booleanValue"in e?{doubleValue:NaN}:"integerValue"in e||"doubleValue"in e?{timestampValue:{seconds:Number.MIN_SAFE_INTEGER}}:"timestampValue"in e?{stringValue:""}:"stringValue"in e?{bytesValue:""}:"bytesValue"in e?Ct(vt.empty(),K.empty()):"referenceValue"in e?{geoPointValue:{latitude:-90,longitude:-180}}:"geoPointValue"in e?{arrayValue:{}}:"arrayValue"in e?{mapValue:{}}:"mapValue"in e?wt:v()}function Ft(e,t){const n=Et(e.value,t.value);return 0!==n?n:e.inclusive&&!t.inclusive?-1:!e.inclusive&&t.inclusive?1:0}function Vt(e,t){const n=Et(e.value,t.value);return 0!==n?n:e.inclusive&&!t.inclusive?1:!e.inclusive&&t.inclusive?-1:0} /** * @license * Copyright 2017 Google LLC @@ -2486,7 +2566,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class on{constructor(e,t,n,r,i){this.snapshotVersion=e,this.targetChanges=t,this.targetMismatches=n,this.documentUpdates=r,this.resolvedLimboDocuments=i}static createSynthesizedRemoteEventForCurrentChange(e,t){const n=new Map;return n.set(e,an.createSynthesizedTargetChangeForCurrentChange(e,t)),new on(q.min(),n,sn(),Jt(),nn())}}class an{constructor(e,t,n,r,i){this.resumeToken=e,this.current=t,this.addedDocuments=n,this.modifiedDocuments=r,this.removedDocuments=i}static createSynthesizedTargetChangeForCurrentChange(e,t){return new an(Y.EMPTY_BYTE_STRING,t,nn(),nn(),nn())}} + */class jt{constructor(e){this.value=e}static empty(){return new jt({mapValue:{}})}field(e){if(e.isEmpty())return this.value;{let t=this.value;for(let n=0;n{if(!t.isImmediateParentOf(i)){const e=this.getFieldsMap(t);this.applyChanges(e,n,r),n={},r=[],t=i.popLast()}e?n[i.lastSegment()]=xt(e):r.push(i.lastSegment())});const i=this.getFieldsMap(t);this.applyChanges(i,n,r)}delete(e){const t=this.field(e.popLast());Rt(t)&&t.mapValue.fields&&delete t.mapValue.fields[e.lastSegment()]}isEqual(e){return _t(this.value,e.value)}getFieldsMap(e){let t=this.value;t.mapValue.fields||(t.mapValue={fields:{}});for(let n=0;ne[t]=n);for(const t of n)delete e[t]}clone(){return new jt(xt(this.value))}}function Ut(e){const t=[];return Xe(e.fields,(e,n)=>{const r=new G([e]);if(Rt(n)){const e=Ut(n.mapValue).fields;if(0===e.length)t.push(r);else for(const n of e)t.push(r.child(n))}else t.push(r)}),new ot(t) /** * @license * Copyright 2017 Google LLC @@ -2502,10 +2582,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class cn{constructor(e,t,n,r){this.$=e,this.removedTargetIds=t,this.key=n,this.F=r}}class un{constructor(e,t){this.targetId=e,this.O=t}}class hn{constructor(e,t,n=Y.EMPTY_BYTE_STRING,r=null){this.state=e,this.targetIds=t,this.resumeToken=n,this.cause=r}}class ln{constructor(){this.M=0,this.L=pn(),this.B=Y.EMPTY_BYTE_STRING,this.U=!1,this.q=!0}get current(){return this.U}get resumeToken(){return this.B}get K(){return 0!==this.M}get j(){return this.q}W(e){e.approximateByteSize()>0&&(this.q=!0,this.B=e)}G(){let e=nn(),t=nn(),n=nn();return this.L.forEach((r,i)=>{switch(i){case 0:e=e.add(r);break;case 2:t=t.add(r);break;case 1:n=n.add(r);break;default:v()}}),new an(this.B,this.U,e,t,n)}H(){this.q=!1,this.L=pn()}J(e,t){this.q=!0,this.L=this.L.insert(e,t)}Y(e){this.q=!0,this.L=this.L.remove(e)}X(){this.M+=1}Z(){this.M-=1}tt(){this.q=!0,this.U=!0}}class dn{constructor(e){this.et=e,this.nt=new Map,this.st=Jt(),this.it=fn(),this.rt=new Ht(F)}ot(e){for(const t of e.$)e.F&&e.F.isFoundDocument()?this.at(t,e.F):this.ct(t,e.key,e.F);for(const t of e.removedTargetIds)this.ct(t,e.key,e.F)}ut(e){this.forEachTarget(e,t=>{const n=this.ht(t);switch(e.state){case 0:this.lt(t)&&n.W(e.resumeToken);break;case 1:n.Z(),n.K||n.H(),n.W(e.resumeToken);break;case 2:n.Z(),n.K||this.removeTarget(t);break;case 3:this.lt(t)&&(n.tt(),n.W(e.resumeToken));break;case 4:this.lt(t)&&(this.ft(t),n.W(e.resumeToken));break;default:v()}})}forEachTarget(e,t){e.targetIds.length>0?e.targetIds.forEach(t):this.nt.forEach((e,n)=>{this.lt(n)&&t(n)})}dt(e){const t=e.targetId,n=e.O.count,r=this.wt(t);if(r){const e=r.target;if(Ne(e))if(0===n){const n=new ae(e.path);this.ct(t,n,Te.newNoDocument(n,q.min()))}else w(1===n);else this._t(t)!==n&&(this.ft(t),this.rt=this.rt.add(t))}}gt(e){const t=new Map;this.nt.forEach((n,r)=>{const i=this.wt(r);if(i){if(n.current&&Ne(i.target)){const t=new ae(i.target.path);null!==this.st.get(t)||this.yt(r,t)||this.ct(r,t,Te.newNoDocument(t,e))}n.j&&(t.set(r,n.G()),n.H())}});let n=nn();this.it.forEach((e,t)=>{let r=!0;t.forEachWhile(e=>{const t=this.wt(e);return!t||2===t.purpose||(r=!1,!1)}),r&&(n=n.add(e))});const r=new on(e,t,this.rt,this.st,n);return this.st=Jt(),this.it=fn(),this.rt=new Ht(F),r}at(e,t){if(!this.lt(e))return;const n=this.yt(e,t.key)?2:0;this.ht(e).J(t.key,n),this.st=this.st.insert(t.key,t),this.it=this.it.insert(t.key,this.Tt(t.key).add(e))}ct(e,t,n){if(!this.lt(e))return;const r=this.ht(e);this.yt(e,t)?r.J(t,1):r.Y(t),this.it=this.it.insert(t,this.Tt(t).delete(e)),n&&(this.st=this.st.insert(t,n))}removeTarget(e){this.nt.delete(e)}_t(e){const t=this.ht(e).G();return this.et.getRemoteKeysForTarget(e).size+t.addedDocuments.size-t.removedDocuments.size}X(e){this.ht(e).X()}ht(e){let t=this.nt.get(e);return t||(t=new ln,this.nt.set(e,t)),t}Tt(e){let t=this.it.get(e);return t||(t=new Ht(F),this.it=this.it.insert(e,t)),t}lt(e){const t=null!==this.wt(e);return t||p("WatchChangeAggregator","Detected inactive target",e),t}wt(e){const t=this.nt.get(e);return t&&t.K?null:this.et.Et(e)}ft(e){this.nt.set(e,new ln),this.et.getRemoteKeysForTarget(e).forEach(t=>{this.ct(e,t,null)})}yt(e,t){return this.et.getRemoteKeysForTarget(e).has(t)}}function fn(){return new Kt(ae.comparator)}function pn(){return new Kt(ae.comparator)} + */}class qt{constructor(e,t,n,r,i,s,o){this.key=e,this.documentType=t,this.version=n,this.readTime=r,this.createTime=i,this.data=s,this.documentState=o}static newInvalidDocument(e){return new qt(e,0,U.min(),U.min(),U.min(),jt.empty(),0)}static newFoundDocument(e,t,n,r){return new qt(e,1,t,U.min(),n,r,0)}static newNoDocument(e,t){return new qt(e,2,t,U.min(),U.min(),jt.empty(),0)}static newUnknownDocument(e,t){return new qt(e,3,t,U.min(),U.min(),jt.empty(),2)}convertToFoundDocument(e,t){return!this.createTime.isEqual(U.min())||2!==this.documentType&&0!==this.documentType||(this.createTime=e),this.version=e,this.documentType=1,this.data=t,this.documentState=0,this}convertToNoDocument(e){return this.version=e,this.documentType=2,this.data=jt.empty(),this.documentState=0,this}convertToUnknownDocument(e){return this.version=e,this.documentType=3,this.data=jt.empty(),this.documentState=2,this}setHasCommittedMutations(){return this.documentState=2,this}setHasLocalMutations(){return this.documentState=1,this.version=U.min(),this}setReadTime(e){return this.readTime=e,this}get hasLocalMutations(){return 1===this.documentState}get hasCommittedMutations(){return 2===this.documentState}get hasPendingWrites(){return this.hasLocalMutations||this.hasCommittedMutations}isValidDocument(){return 0!==this.documentType}isFoundDocument(){return 1===this.documentType}isNoDocument(){return 2===this.documentType}isUnknownDocument(){return 3===this.documentType}isEqual(e){return e instanceof qt&&this.key.isEqual(e.key)&&this.version.isEqual(e.version)&&this.documentType===e.documentType&&this.documentState===e.documentState&&this.data.isEqual(e.data)}mutableCopy(){return new qt(this.key,this.documentType,this.version,this.readTime,this.createTime,this.data.clone(),this.documentState)}toString(){return`Document(${this.key}, ${this.version}, ${JSON.stringify(this.data.value)}, {createTime: ${this.createTime}}), {documentType: ${this.documentType}}), {documentState: ${this.documentState}})`}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2518,10 +2598,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const mn={asc:"ASCENDING",desc:"DESCENDING"},gn={"<":"LESS_THAN","<=":"LESS_THAN_OR_EQUAL",">":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"};class yn{constructor(e,t){this.databaseId=e,this.C=t}}function vn(e,t){return e.C?`${new Date(1e3*t.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")}.${("000000000"+t.nanoseconds).slice(-9)}Z`:{seconds:""+t.seconds,nanos:t.nanoseconds}}function wn(e,t){return e.C?t.toBase64():t.toUint8Array()}function bn(e,t){return vn(e,t.toTimestamp())}function In(e){return w(!!e),q.fromTimestamp(function(e){const t=Z(e);return new V(t.seconds,t.nanos)}(e))}function _n(e,t){return function(e){return new G(["projects",e.projectId,"databases",e.database])}(e).child("documents").child(t).canonicalString()}function Tn(e){const t=G.fromString(e);return w(Gn(t)),t}function En(e,t){return _n(e.databaseId,t.path)}function kn(e,t){const n=Tn(t);if(n.get(1)!==e.databaseId.projectId)throw new T(_.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+n.get(1)+" vs "+e.databaseId.projectId);if(n.get(3)!==e.databaseId.database)throw new T(_.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+n.get(3)+" vs "+e.databaseId.database);return new ae(On(n))}function Sn(e,t){return _n(e.databaseId,t)}function An(e){const t=Tn(e);return 4===t.length?G.emptyPath():On(t)}function Nn(e){return new G(["projects",e.databaseId.projectId,"databases",e.databaseId.database]).canonicalString()}function On(e){return w(e.length>4&&"documents"===e.get(4)),e.popFirst(5)}function Cn(e,t,n){return{name:En(e,t),fields:n.value.mapValue.fields}}function Dn(e,t,n){const r=kn(e,t.name),i=In(t.updateTime),s=new Ie({mapValue:{fields:t.fields}}),o=Te.newFoundDocument(r,i,s);return n&&o.setHasCommittedMutations(),n?o.setHasCommittedMutations():o}function Rn(e,t){let n;if(t instanceof Rt)n={update:Cn(e,t.key,t.value)};else if(t instanceof Ft)n={delete:En(e,t.key)};else if(t instanceof Pt)n={update:Cn(e,t.key,t.data),updateMask:Wn(t.fieldMask)};else{if(!(t instanceof jt))return v();n={verify:En(e,t.key)}}return t.fieldTransforms.length>0&&(n.updateTransforms=t.fieldTransforms.map(e=>function(e,t){const n=t.transform;if(n instanceof pt)return{fieldPath:t.field.canonicalString(),setToServerValue:"REQUEST_TIME"};if(n instanceof mt)return{fieldPath:t.field.canonicalString(),appendMissingElements:{values:n.elements}};if(n instanceof yt)return{fieldPath:t.field.canonicalString(),removeAllFromArray:{values:n.elements}};if(n instanceof wt)return{fieldPath:t.field.canonicalString(),increment:n.N};throw v()}(0,e))),t.precondition.isNone||(n.currentDocument=function(e,t){return void 0!==t.updateTime?{updateTime:bn(e,t.updateTime)}:void 0!==t.exists?{exists:t.exists}:v()}(e,t.precondition)),n}function Pn(e,t){const n=t.currentDocument?function(e){return void 0!==e.updateTime?Et.updateTime(In(e.updateTime)):void 0!==e.exists?Et.exists(e.exists):Et.none()}(t.currentDocument):Et.none(),r=t.updateTransforms?t.updateTransforms.map(t=>function(e,t){let n=null;if("setToServerValue"in t)w("REQUEST_TIME"===t.setToServerValue),n=new pt;else if("appendMissingElements"in t){const e=t.appendMissingElements.values||[];n=new mt(e)}else if("removeAllFromArray"in t){const e=t.removeAllFromArray.values||[];n=new yt(e)}else"increment"in t?n=new wt(e,t.increment):v();const r=$.fromServerFormat(t.fieldPath);return new _t(r,n)}(e,t)):[];if(t.update){t.update.name;const i=kn(e,t.update.name),s=new Ie({mapValue:{fields:t.update.fields}});if(t.updateMask){const e=function(e){const t=e.fieldPaths||[];return new Q(t.map(e=>$.fromServerFormat(e)))}(t.updateMask);return new Pt(i,s,e,n,r)}return new Rt(i,s,n,r)}if(t.delete){const r=kn(e,t.delete);return new Ft(r,n)}if(t.verify){const r=kn(e,t.verify);return new jt(r,n)}return v()}function Ln(e,t){return{documents:[Sn(e,t.path)]}}function xn(e,t){const n={structuredQuery:{}},r=t.path;null!==t.collectionGroup?(n.parent=Sn(e,r),n.structuredQuery.from=[{collectionId:t.collectionGroup,allDescendants:!0}]):(n.parent=Sn(e,r.popLast()),n.structuredQuery.from=[{collectionId:r.lastSegment()}]);const i=function(e){if(0===e.length)return;const t=e.map(e=>function(e){if("=="===e.op){if(ve(e.value))return{unaryFilter:{field:qn(e.field),op:"IS_NAN"}};if(ye(e.value))return{unaryFilter:{field:qn(e.field),op:"IS_NULL"}}}else if("!="===e.op){if(ve(e.value))return{unaryFilter:{field:qn(e.field),op:"IS_NOT_NAN"}};if(ye(e.value))return{unaryFilter:{field:qn(e.field),op:"IS_NOT_NULL"}}}return{fieldFilter:{field:qn(e.field),op:Vn(e.op),value:e.value}}}(e));return 1===t.length?t[0]:{compositeFilter:{op:"AND",filters:t}}}(t.filters);i&&(n.structuredQuery.where=i);const s=function(e){if(0!==e.length)return e.map(e=>function(e){return{field:qn(e.field),direction:Un(e.dir)}}(e))}(t.orderBy);s&&(n.structuredQuery.orderBy=s);const o=function(e,t){return e.C||ie(t)?t:{value:t}}(e,t.limit);return null!==o&&(n.structuredQuery.limit=o),t.startAt&&(n.structuredQuery.startAt=Fn(t.startAt)),t.endAt&&(n.structuredQuery.endAt=Fn(t.endAt)),n}function Mn(e){let t=An(e.parent);const n=e.structuredQuery,r=n.from?n.from.length:0;let i=null;if(r>0){w(1===r);const e=n.from[0];e.allDescendants?i=e.collectionId:t=t.child(e.collectionId)}let s=[];n.where&&(s=function e(t){return t?void 0!==t.unaryFilter?[Kn(t)]:void 0!==t.fieldFilter?[zn(t)]:void 0!==t.compositeFilter?t.compositeFilter.filters.map(t=>e(t)).reduce((e,t)=>e.concat(t)):v():[]}(n.where));let o=[];n.orderBy&&(o=n.orderBy.map(e=>function(e){return new Ve(Bn(e.field),function(e){switch(e){case"ASCENDING":return"asc";case"DESCENDING":return"desc";default:return}}(e.direction))}(e)));let a=null;n.limit&&(a=function(e){let t;return t="object"==typeof e?e.value:e,ie(t)?null:t}(n.limit));let c=null;n.startAt&&(c=jn(n.startAt));let u=null;return n.endAt&&(u=jn(n.endAt)),We(t,i,o,s,a,"F",c,u)}function Fn(e){return{before:e.before,values:e.position}}function jn(e){const t=!!e.before,n=e.values||[];return new je(n,t)}function Un(e){return mn[e]}function Vn(e){return gn[e]}function qn(e){return{fieldPath:e.canonicalString()}}function Bn(e){return $.fromServerFormat(e.fieldPath)}function zn(e){return Oe.create(Bn(e.fieldFilter.field),function(e){switch(e){case"EQUAL":return"==";case"NOT_EQUAL":return"!=";case"GREATER_THAN":return">";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";default:return v()}}(e.fieldFilter.op),e.fieldFilter.value)}function Kn(e){switch(e.unaryFilter.op){case"IS_NAN":const t=Bn(e.unaryFilter.field);return Oe.create(t,"==",{doubleValue:NaN});case"IS_NULL":const n=Bn(e.unaryFilter.field);return Oe.create(n,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":const r=Bn(e.unaryFilter.field);return Oe.create(r,"!=",{doubleValue:NaN});case"IS_NOT_NULL":const i=Bn(e.unaryFilter.field);return Oe.create(i,"!=",{nullValue:"NULL_VALUE"});default:return v()}}function Wn(e){const t=[];return e.fields.forEach(e=>t.push(e.canonicalString())),{fieldPaths:t}}function Gn(e){return e.length>=4&&"projects"===e.get(0)&&"databases"===e.get(2)} + */class Bt{constructor(e,t){this.position=e,this.inclusive=t}}function zt(e,t,n){let r=0;for(let i=0;i0&&(t=Qn(t)),t=$n(e.get(n),t);return Qn(t)}function $n(e,t){let n=t;const r=e.length;for(let t=0;t=2),2===t)return w(""===e.charAt(0)&&""===e.charAt(1)),G.emptyPath();const n=t-2,r=[];let i="";for(let s=0;sn)&&v(),e.charAt(t+1)){case"":const n=e.substring(s,t);let o;0===i.length?o=n:(i+=n,o=i,i=""),r.push(o);break;case"":i+=e.substring(s,t),i+="\0";break;case"":i+=e.substring(s,t+1);break;default:v()}s=t+2}return new G(r)} + */class Kt{constructor(e,t="asc"){this.field=e,this.dir=t}}function $t(e,t){return e.dir===t.dir&&e.field.isEqual(t.field)} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2550,10 +2630,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Yn{constructor(e,t){this.seconds=e,this.nanoseconds=t}}class Xn{constructor(e,t,n){this.ownerId=e,this.allowTabSynchronization=t,this.leaseTimestampMs=n}}Xn.store="owner",Xn.key="owner";class Zn{constructor(e,t,n){this.userId=e,this.lastAcknowledgedBatchId=t,this.lastStreamToken=n}}Zn.store="mutationQueues",Zn.keyPath="userId";class er{constructor(e,t,n,r,i){this.userId=e,this.batchId=t,this.localWriteTimeMs=n,this.baseMutations=r,this.mutations=i}}er.store="mutations",er.keyPath="batchId",er.userMutationsIndex="userMutationsIndex",er.userMutationsKeyPath=["userId","batchId"];class tr{constructor(){}static prefixForUser(e){return[e]}static prefixForPath(e,t){return[e,Hn(t)]}static key(e,t,n){return[e,Hn(t),n]}}tr.store="documentMutations",tr.PLACEHOLDER=new tr;class nr{constructor(e,t){this.path=e,this.readTime=t}}class rr{constructor(e,t){this.path=e,this.version=t}}class ir{constructor(e,t,n,r,i,s){this.unknownDocument=e,this.noDocument=t,this.document=n,this.hasCommittedMutations=r,this.readTime=i,this.parentPath=s}}ir.store="remoteDocuments",ir.readTimeIndex="readTimeIndex",ir.readTimeIndexPath="readTime",ir.collectionReadTimeIndex="collectionReadTimeIndex",ir.collectionReadTimeIndexPath=["parentPath","readTime"];class sr{constructor(e){this.byteSize=e}}sr.store="remoteDocumentGlobal",sr.key="remoteDocumentGlobalKey";class or{constructor(e,t,n,r,i,s,o){this.targetId=e,this.canonicalId=t,this.readTime=n,this.resumeToken=r,this.lastListenSequenceNumber=i,this.lastLimboFreeSnapshotVersion=s,this.query=o}}or.store="targets",or.keyPath="targetId",or.queryTargetsIndexName="queryTargetsIndex",or.queryTargetsKeyPath=["canonicalId","targetId"];class ar{constructor(e,t,n){this.targetId=e,this.path=t,this.sequenceNumber=n}}ar.store="targetDocuments",ar.keyPath=["targetId","path"],ar.documentTargetsIndex="documentTargetsIndex",ar.documentTargetsKeyPath=["path","targetId"];class cr{constructor(e,t,n,r){this.highestTargetId=e,this.highestListenSequenceNumber=t,this.lastRemoteSnapshotVersion=n,this.targetCount=r}}cr.key="targetGlobalKey",cr.store="targetGlobal";class ur{constructor(e,t){this.collectionId=e,this.parent=t}}ur.store="collectionParents",ur.keyPath=["collectionId","parent"];class hr{constructor(e,t,n,r){this.clientId=e,this.updateTimeMs=t,this.networkEnabled=n,this.inForeground=r}}hr.store="clientMetadata",hr.keyPath="clientId";class lr{constructor(e,t,n){this.bundleId=e,this.createTime=t,this.version=n}}lr.store="bundles",lr.keyPath="bundleId";class dr{constructor(e,t,n){this.name=e,this.readTime=t,this.bundledQuery=n}}dr.store="namedQueries",dr.keyPath="name";const fr=[Zn.store,er.store,tr.store,ir.store,or.store,Xn.store,cr.store,ar.store,hr.store,sr.store,ur.store,lr.store,dr.store],pr="The current tab is not in the required state to perform this operation. It might be necessary to refresh the browser tab.";class mr{constructor(){this.onCommittedListeners=[]}addOnCommittedListener(e){this.onCommittedListeners.push(e)}raiseOnCommittedEvent(){this.onCommittedListeners.forEach(e=>e())}} + */class Wt{}class Ht extends Wt{constructor(e,t,n){super(),this.field=e,this.op=t,this.value=n}static create(e,t,n){return e.isKeyField()?"in"===t||"not-in"===t?this.createKeyFieldInFilter(e,t,n):new rn(e,t,n):"array-contains"===t?new cn(e,n):"in"===t?new un(e,n):"not-in"===t?new ln(e,n):"array-contains-any"===t?new hn(e,n):new Ht(e,t,n)}static createKeyFieldInFilter(e,t,n){return"in"===t?new sn(e,n):new on(e,n)}matches(e){const t=e.data.field(this.field);return"!="===this.op?null!==t&&this.matchesComparison(Et(t,this.value)):null!==t&&It(this.value)===It(t)&&this.matchesComparison(Et(t,this.value))}matchesComparison(e){switch(this.op){case"<":return e<0;case"<=":return e<=0;case"==":return 0===e;case"!=":return 0!==e;case">":return e>0;case">=":return e>=0;default:return v()}}isInequality(){return["<","<=",">",">=","!=","not-in"].indexOf(this.op)>=0}getFlattenedFilters(){return[this]}getFilters(){return[this]}getFirstInequalityField(){return this.isInequality()?this.field:null}}class Qt extends Wt{constructor(e,t){super(),this.filters=e,this.op=t,this.lt=null}static create(e,t){return new Qt(e,t)}matches(e){return Yt(this)?void 0===this.filters.find(t=>!t.matches(e)):void 0!==this.filters.find(t=>t.matches(e))}getFlattenedFilters(){return null!==this.lt||(this.lt=this.filters.reduce((e,t)=>e.concat(t.getFlattenedFilters()),[])),this.lt}getFilters(){return Object.assign([],this.filters)}getFirstInequalityField(){const e=this.ft(e=>e.isInequality());return null!==e?e.field:null}ft(e){for(const t of this.getFlattenedFilters())if(e(t))return t;return null}}function Yt(e){return"and"===e.op}function Jt(e){return"or"===e.op}function Xt(e){return Zt(e)&&Yt(e)}function Zt(e){for(const t of e.filters)if(t instanceof Qt)return!1;return!0}function en(e,t){return e instanceof Ht?function(e,t){return t instanceof Ht&&e.op===t.op&&e.field.isEqual(t.field)&&_t(e.value,t.value)}(e,t):e instanceof Qt?function(e,t){return t instanceof Qt&&e.op===t.op&&e.filters.length===t.filters.length&&e.filters.reduce((e,n,r)=>e&&en(n,t.filters[r]),!0)}(e,t):void v()}function tn(e,t){const n=e.filters.concat(t);return Qt.create(n,e.op)}function nn(e){return e instanceof Ht?function(e){return`${e.field.canonicalString()} ${e.op} ${kt(e.value)}`}(e):e instanceof Qt?function(e){return e.op.toString()+" {"+e.getFilters().map(nn).join(" ,")+"}"}(e):"Filter"}class rn extends Ht{constructor(e,t,n){super(e,t,n),this.key=K.fromName(n.referenceValue)}matches(e){const t=K.comparator(e.key,this.key);return this.matchesComparison(t)}}class sn extends Ht{constructor(e,t){super(e,"in",t),this.keys=an("in",t)}matches(e){return this.keys.some(t=>t.isEqual(e.key))}}class on extends Ht{constructor(e,t){super(e,"not-in",t),this.keys=an("not-in",t)}matches(e){return!this.keys.some(t=>t.isEqual(e.key))}}function an(e,t){var n;return((null===(n=t.arrayValue)||void 0===n?void 0:n.values)||[]).map(e=>K.fromName(e.referenceValue))}class cn extends Ht{constructor(e,t){super(e,"array-contains",t)}matches(e){const t=e.data.field(this.field);return Nt(t)&&Tt(t.arrayValue,this.value)}}class un extends Ht{constructor(e,t){super(e,"in",t)}matches(e){const t=e.data.field(this.field);return null!==t&&Tt(this.value.arrayValue,t)}}class ln extends Ht{constructor(e,t){super(e,"not-in",t)}matches(e){if(Tt(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;const t=e.data.field(this.field);return null!==t&&!Tt(this.value.arrayValue,t)}}class hn extends Ht{constructor(e,t){super(e,"array-contains-any",t)}matches(e){const t=e.data.field(this.field);return!(!Nt(t)||!t.arrayValue.values)&&t.arrayValue.values.some(e=>Tt(this.value.arrayValue,e))}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2566,7 +2646,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class gr{constructor(e){this.nextCallback=null,this.catchCallback=null,this.result=void 0,this.error=void 0,this.isDone=!1,this.callbackAttached=!1,e(e=>{this.isDone=!0,this.result=e,this.nextCallback&&this.nextCallback(e)},e=>{this.isDone=!0,this.error=e,this.catchCallback&&this.catchCallback(e)})}catch(e){return this.next(void 0,e)}next(e,t){return this.callbackAttached&&v(),this.callbackAttached=!0,this.isDone?this.error?this.wrapFailure(t,this.error):this.wrapSuccess(e,this.result):new gr((n,r)=>{this.nextCallback=t=>{this.wrapSuccess(e,t).next(n,r)},this.catchCallback=e=>{this.wrapFailure(t,e).next(n,r)}})}toPromise(){return new Promise((e,t)=>{this.next(e,t)})}wrapUserFunction(e){try{const t=e();return t instanceof gr?t:gr.resolve(t)}catch(e){return gr.reject(e)}}wrapSuccess(e,t){return e?this.wrapUserFunction(()=>e(t)):gr.resolve(t)}wrapFailure(e,t){return e?this.wrapUserFunction(()=>e(t)):gr.reject(t)}static resolve(e){return new gr((t,n)=>{t(e)})}static reject(e){return new gr((t,n)=>{n(e)})}static waitFor(e){return new gr((t,n)=>{let r=0,i=0,s=!1;e.forEach(e=>{++r,e.next(()=>{++i,s&&i===r&&t()},e=>n(e))}),s=!0,i===r&&t()})}static or(e){let t=gr.resolve(!1);for(const n of e)t=t.next(e=>e?gr.resolve(e):n());return t}static forEach(e,t){const n=[];return e.forEach((e,r)=>{n.push(t.call(this,e,r))}),this.waitFor(n)}} + */class dn{constructor(e,t=null,n=[],r=[],i=null,s=null,o=null){this.path=e,this.collectionGroup=t,this.orderBy=n,this.filters=r,this.limit=i,this.startAt=s,this.endAt=o,this.dt=null}}function fn(e,t=null,n=[],r=[],i=null,s=null,o=null){return new dn(e,t,n,r,i,s,o)}function pn(e){const t=I(e);if(null===t.dt){let e=t.path.canonicalString();null!==t.collectionGroup&&(e+="|cg:"+t.collectionGroup),e+="|f:",e+=t.filters.map(e=>function e(t){if(t instanceof Ht)return t.field.canonicalString()+t.op.toString()+kt(t.value);if(Xt(t))return t.filters.map(t=>e(t)).join(",");{const n=t.filters.map(t=>e(t)).join(",");return`${t.op}(${n})`}}(e)).join(","),e+="|ob:",e+=t.orderBy.map(e=>function(e){return e.field.canonicalString()+e.dir}(e)).join(","),we(t.limit)||(e+="|l:",e+=t.limit),t.startAt&&(e+="|lb:",e+=t.startAt.inclusive?"b:":"a:",e+=t.startAt.position.map(e=>kt(e)).join(",")),t.endAt&&(e+="|ub:",e+=t.endAt.inclusive?"a:":"b:",e+=t.endAt.position.map(e=>kt(e)).join(",")),t.dt=e}return t.dt}function gn(e,t){if(e.limit!==t.limit)return!1;if(e.orderBy.length!==t.orderBy.length)return!1;for(let n=0;ne instanceof Ht&&e.field.isEqual(t))}function vn(e,t,n){let r=bt,i=!0;for(const n of yn(e,t)){let e=bt,t=!0;switch(n.op){case"<":case"<=":e=Lt(n.value);break;case"==":case"in":case">=":e=n.value;break;case">":e=n.value,t=!1;break;case"!=":case"not-in":e=bt}Ft({value:r,inclusive:i},{value:e,inclusive:t})<0&&(r=e,i=t)}if(null!==n)for(let s=0;s=":case">":e=Mt(n.value),t=!1;break;case"==":case"in":case"<=":e=n.value;break;case"<":e=n.value,t=!1;break;case"!=":case"not-in":e=wt}Vt({value:r,inclusive:i},{value:e,inclusive:t})>0&&(r=e,i=t)}if(null!==n)for(let s=0;s0&&(r=e,i=n.inclusive);break}return{value:r,inclusive:i}} /** * @license * Copyright 2017 Google LLC @@ -2582,10 +2662,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class yr{constructor(e,t){this.action=e,this.transaction=t,this.aborted=!1,this.It=new E,this.transaction.oncomplete=()=>{this.It.resolve()},this.transaction.onabort=()=>{t.error?this.It.reject(new br(e,t.error)):this.It.resolve()},this.transaction.onerror=t=>{const n=kr(t.target.error);this.It.reject(new br(e,n))}}static open(e,t,n,r){try{return new yr(t,e.transaction(r,n))}catch(e){throw new br(t,e)}}get At(){return this.It.promise}abort(e){e&&this.It.reject(e),this.aborted||(p("SimpleDb","Aborting transaction:",e?e.message:"Client-initiated abort"),this.aborted=!0,this.transaction.abort())}store(e){const t=this.transaction.objectStore(e);return new _r(t)}}class vr{constructor(e,t,n){this.name=e,this.version=t,this.Rt=n,12.2===vr.Pt(Object(o.l)())&&m("Firestore persistence suffers from a bug in iOS 12.2 Safari that may cause your app to stop working. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.")}static delete(e){return p("SimpleDb","Removing database:",e),Tr(window.indexedDB.deleteDatabase(e)).toPromise()}static bt(){if(!Object(o.r)())return!1;if(vr.vt())return!0;const e=Object(o.l)(),t=vr.Pt(e),n=00||e.indexOf("Trident/")>0||e.indexOf("Edge/")>0||n||i)}static vt(){var t;return void 0!==e&&"YES"===(null===(t=e.env)||void 0===t?void 0:t.St)}static Dt(e,t){return e.store(t)}static Pt(e){const t=e.match(/i(?:phone|pad|pod) os ([\d_]+)/i),n=t?t[1].split("_").slice(0,2).join("."):"-1";return Number(n)}static Vt(e){const t=e.match(/Android ([\d.]+)/i),n=t?t[1].split(".").slice(0,2).join("."):"-1";return Number(n)}async Ct(e){return this.db||(p("SimpleDb","Opening database:",this.name),this.db=await new Promise((t,n)=>{const r=indexedDB.open(this.name,this.version);r.onsuccess=e=>{const n=e.target.result;t(n)},r.onblocked=()=>{n(new br(e,"Cannot upgrade IndexedDB schema while another tab is open. Close all tabs that access Firestore and reload this page to proceed."))},r.onerror=t=>{const r=t.target.error;"VersionError"===r.name?n(new T(_.FAILED_PRECONDITION,"A newer version of the Firestore SDK was previously used and so the persisted data is not compatible with the version of the SDK you are now using. The SDK will operate with persistence disabled. If you need persistence, please re-upgrade to a newer version of the SDK or else clear the persisted IndexedDB data for your app to start fresh.")):"InvalidStateError"===r.name?n(new T(_.FAILED_PRECONDITION,"Unable to open an IndexedDB connection. This could be due to running in a private browsing session on a browser whose private browsing sessions do not support IndexedDB: "+r)):n(new br(e,r))},r.onupgradeneeded=e=>{p("SimpleDb",'Database "'+this.name+'" requires upgrade from version:',e.oldVersion);const t=e.target.result;this.Rt.Nt(t,r.transaction,e.oldVersion,this.version).next(()=>{p("SimpleDb","Database upgrade to version "+this.version+" complete")})}})),this.kt&&(this.db.onversionchange=e=>this.kt(e)),this.db}xt(e){this.kt=e,this.db&&(this.db.onversionchange=t=>e(t))}async runTransaction(e,t,n,r){const i="readonly"===t;let s=0;for(;;){++s;try{this.db=await this.Ct(e);const t=yr.open(this.db,e,i?"readonly":"readwrite",n),s=r(t).catch(e=>(t.abort(e),gr.reject(e))).toPromise();return s.catch(()=>{}),await t.At,s}catch(e){const t="FirebaseError"!==e.name&&s<3;if(p("SimpleDb","Transaction failed with error:",e.message,"Retrying:",t),this.close(),!t)return Promise.reject(e)}}}close(){this.db&&this.db.close(),this.db=void 0}}class wr{constructor(e){this.$t=e,this.Ft=!1,this.Ot=null}get isDone(){return this.Ft}get Mt(){return this.Ot}set cursor(e){this.$t=e}done(){this.Ft=!0}Lt(e){this.Ot=e}delete(){return Tr(this.$t.delete())}}class br extends T{constructor(e,t){super(_.UNAVAILABLE,`IndexedDB transaction '${e}' failed: ${t}`),this.name="IndexedDbTransactionError"}}function Ir(e){return"IndexedDbTransactionError"===e.name}class _r{constructor(e){this.store=e}put(e,t){let n;return void 0!==t?(p("SimpleDb","PUT",this.store.name,e,t),n=this.store.put(t,e)):(p("SimpleDb","PUT",this.store.name,"",e),n=this.store.put(e)),Tr(n)}add(e){return p("SimpleDb","ADD",this.store.name,e,e),Tr(this.store.add(e))}get(e){return Tr(this.store.get(e)).next(t=>(void 0===t&&(t=null),p("SimpleDb","GET",this.store.name,e,t),t))}delete(e){return p("SimpleDb","DELETE",this.store.name,e),Tr(this.store.delete(e))}count(){return p("SimpleDb","COUNT",this.store.name),Tr(this.store.count())}Bt(e,t){const n=this.cursor(this.options(e,t)),r=[];return this.Ut(n,(e,t)=>{r.push(t)}).next(()=>r)}qt(e,t){p("SimpleDb","DELETE ALL",this.store.name);const n=this.options(e,t);n.Kt=!1;const r=this.cursor(n);return this.Ut(r,(e,t,n)=>n.delete())}jt(e,t){let n;t?n=e:(n={},t=e);const r=this.cursor(n);return this.Ut(r,t)}Qt(e){const t=this.cursor({});return new gr((n,r)=>{t.onerror=e=>{const t=kr(e.target.error);r(t)},t.onsuccess=t=>{const r=t.target.result;r?e(r.primaryKey,r.value).next(e=>{e?r.continue():n()}):n()}})}Ut(e,t){const n=[];return new gr((r,i)=>{e.onerror=e=>{i(e.target.error)},e.onsuccess=e=>{const i=e.target.result;if(!i)return void r();const s=new wr(i),o=t(i.primaryKey,i.value,s);if(o instanceof gr){const e=o.catch(e=>(s.done(),gr.reject(e)));n.push(e)}s.isDone?r():null===s.Mt?i.continue():i.continue(s.Mt)}}).next(()=>gr.waitFor(n))}options(e,t){let n;return void 0!==e&&("string"==typeof e?n=e:t=e),{index:n,range:t}}cursor(e){let t="next";if(e.reverse&&(t="prev"),e.index){const n=this.store.index(e.index);return e.Kt?n.openKeyCursor(e.range,t):n.openCursor(e.range,t)}return this.store.openCursor(e.range,t)}}function Tr(e){return new gr((t,n)=>{e.onsuccess=e=>{const n=e.target.result;t(n)},e.onerror=e=>{const t=kr(e.target.error);n(t)}})}let Er=!1;function kr(e){const t=vr.Pt(Object(o.l)());if(t>=12.2&&t<13){const t="An internal error was encountered in the Indexed Database server";if(e.message.indexOf(t)>=0){const e=new T("internal",`IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${t}'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.`);return Er||(Er=!0,setTimeout(()=>{throw e},0)),e}}return e} + */class bn{constructor(e,t=null,n=[],r=[],i=null,s="F",o=null,a=null){this.path=e,this.collectionGroup=t,this.explicitOrderBy=n,this.filters=r,this.limit=i,this.limitType=s,this.startAt=o,this.endAt=a,this.wt=null,this._t=null,this.startAt,this.endAt}}function In(e,t,n,r,i,s,o,a){return new bn(e,t,n,r,i,s,o,a)}function _n(e){return new bn(e)}function Tn(e){return 0===e.filters.length&&null===e.limit&&null==e.startAt&&null==e.endAt&&(0===e.explicitOrderBy.length||1===e.explicitOrderBy.length&&e.explicitOrderBy[0].field.isKeyField())}function En(e){return e.explicitOrderBy.length>0?e.explicitOrderBy[0].field:null}function Sn(e){for(const t of e.filters){const e=t.getFirstInequalityField();if(null!==e)return e}return null}function kn(e){return null!==e.collectionGroup}function Cn(e){const t=I(e);if(null===t.wt){t.wt=[];const e=Sn(t),n=En(t);if(null!==e&&null===n)e.isKeyField()||t.wt.push(new Kt(e)),t.wt.push(new Kt(G.keyField(),"asc"));else{let e=!1;for(const n of t.explicitOrderBy)t.wt.push(n),n.field.isKeyField()&&(e=!0);if(!e){const e=t.explicitOrderBy.length>0?t.explicitOrderBy[t.explicitOrderBy.length-1].dir:"asc";t.wt.push(new Kt(G.keyField(),e))}}}return t.wt}function An(e){const t=I(e);if(!t._t)if("F"===t.limitType)t._t=fn(t.path,t.collectionGroup,Cn(t),t.filters,t.limit,t.startAt,t.endAt);else{const e=[];for(const n of Cn(t)){const t="desc"===n.dir?"asc":"desc";e.push(new Kt(n.field,t))}const n=t.endAt?new Bt(t.endAt.position,t.endAt.inclusive):null,r=t.startAt?new Bt(t.startAt.position,t.startAt.inclusive):null;t._t=fn(t.path,t.collectionGroup,e,t.filters,t.limit,n,r)}return t._t}function Nn(e,t){t.getFirstInequalityField(),Sn(e);const n=e.filters.concat([t]);return new bn(e.path,e.collectionGroup,e.explicitOrderBy.slice(),n,e.limit,e.limitType,e.startAt,e.endAt)}function Dn(e,t,n){return new bn(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),t,n,e.startAt,e.endAt)}function On(e,t){return gn(An(e),An(t))&&e.limitType===t.limitType}function Rn(e){return`${pn(An(e))}|lt:${e.limitType}`}function xn(e){return`Query(target=${function(e){let t=e.path.canonicalString();return null!==e.collectionGroup&&(t+=" collectionGroup="+e.collectionGroup),e.filters.length>0&&(t+=`, filters: [${e.filters.map(e=>nn(e)).join(", ")}]`),we(e.limit)||(t+=", limit: "+e.limit),e.orderBy.length>0&&(t+=`, orderBy: [${e.orderBy.map(e=>function(e){return`${e.field.canonicalString()} (${e.dir})`}(e)).join(", ")}]`),e.startAt&&(t+=", startAt: ",t+=e.startAt.inclusive?"b:":"a:",t+=e.startAt.position.map(e=>kt(e)).join(",")),e.endAt&&(t+=", endAt: ",t+=e.endAt.inclusive?"a:":"b:",t+=e.endAt.position.map(e=>kt(e)).join(",")),`Target(${t})`}(An(e))}; limitType=${e.limitType})`}function Pn(e,t){return t.isFoundDocument()&&function(e,t){const n=t.key.path;return null!==e.collectionGroup?t.key.hasCollectionId(e.collectionGroup)&&e.path.isPrefixOf(n):K.isDocumentKey(e.path)?e.path.isEqual(n):e.path.isImmediateParentOf(n)}(e,t)&&function(e,t){for(const n of Cn(e))if(!n.field.isKeyField()&&null===t.data.field(n.field))return!1;return!0}(e,t)&&function(e,t){for(const n of e.filters)if(!n.matches(t))return!1;return!0}(e,t)&&function(e,t){return!(e.startAt&&!function(e,t,n){const r=zt(e,t,n);return e.inclusive?r<=0:r<0}(e.startAt,Cn(e),t))&&!(e.endAt&&!function(e,t,n){const r=zt(e,t,n);return e.inclusive?r>=0:r>0}(e.endAt,Cn(e),t))}(e,t)}function Ln(e){return e.collectionGroup||(e.path.length%2==1?e.path.lastSegment():e.path.get(e.path.length-2))}function Mn(e){return(t,n)=>{let r=!1;for(const i of Cn(e)){const e=Fn(i,t,n);if(0!==e)return e;r=r||i.field.isKeyField()}return 0}}function Fn(e,t,n){const r=e.field.isKeyField()?K.comparator(t.key,n.key):function(e,t,n){const r=t.data.field(e),i=n.data.field(e);return null!==r&&null!==i?Et(r,i):v()}(e.field,t,n);switch(e.dir){case"asc":return r;case"desc":return-1*r;default:return v()}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2598,7 +2678,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Sr extends mr{constructor(e,t){super(),this.Wt=e,this.currentSequenceNumber=t}}function Ar(e,t){const n=I(e);return vr.Dt(n.Wt,t)} + */class Vn{constructor(e,t){this.mapKeyFn=e,this.equalsFn=t,this.inner={},this.innerSize=0}get(e){const t=this.mapKeyFn(e),n=this.inner[t];if(void 0!==n)for(const[t,r]of n)if(this.equalsFn(t,e))return r}has(e){return void 0!==this.get(e)}set(e,t){const n=this.mapKeyFn(e),r=this.inner[n];if(void 0===r)return this.inner[n]=[[e,t]],void this.innerSize++;for(let n=0;n{for(const[t,r]of n)e(t,r)})}isEmpty(){return Ze(this.inner)}size(){return this.innerSize}} /** * @license * Copyright 2017 Google LLC @@ -2614,10 +2694,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Nr{constructor(e,t,n,r){this.batchId=e,this.localWriteTime=t,this.baseMutations=n,this.mutations=r}applyToRemoteDocument(e,t){const n=t.mutationResults;for(let t=0;t{const n=e.get(t.key),r=n;this.applyToLocalView(r),n.isValidDocument()||r.convertToNoDocument(q.min())})}keys(){return this.mutations.reduce((e,t)=>e.add(t.key),nn())}isEqual(e){return this.batchId===e.batchId&&j(this.mutations,e.mutations,(e,t)=>Ct(e,t))&&j(this.baseMutations,e.baseMutations,(e,t)=>Ct(e,t))}}class Or{constructor(e,t,n,r){this.batch=e,this.commitVersion=t,this.mutationResults=n,this.docVersions=r}static from(e,t,n){w(e.mutations.length===n.length);let r=en();const i=e.mutations;for(let e=0;et=t.insert(e,n.overlayedDocument)),t}function Gn(){return $n()}function Kn(){return $n()}function $n(){return new Vn(e=>e.toString(),(e,t)=>e.isEqual(t))}const Wn=new et(K.comparator),Hn=new rt(K.comparator);function Qn(...e){let t=Hn;for(const n of e)t=t.add(n);return t}const Yn=new rt(M);function Jn(){return Yn} /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2630,10 +2710,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Cr{constructor(e,t,n,r,i=q.min(),s=q.min(),o=Y.EMPTY_BYTE_STRING){this.target=e,this.targetId=t,this.purpose=n,this.sequenceNumber=r,this.snapshotVersion=i,this.lastLimboFreeSnapshotVersion=s,this.resumeToken=o}withSequenceNumber(e){return new Cr(this.target,this.targetId,this.purpose,e,this.snapshotVersion,this.lastLimboFreeSnapshotVersion,this.resumeToken)}withResumeToken(e,t){return new Cr(this.target,this.targetId,this.purpose,this.sequenceNumber,t,this.lastLimboFreeSnapshotVersion,e)}withLastLimboFreeSnapshotVersion(e){return new Cr(this.target,this.targetId,this.purpose,this.sequenceNumber,this.snapshotVersion,e,this.resumeToken)}} + */function Xn(e,t){if(e.useProto3Json){if(isNaN(t))return{doubleValue:"NaN"};if(t===1/0)return{doubleValue:"Infinity"};if(t===-1/0)return{doubleValue:"-Infinity"}}return{doubleValue:be(t)?"-0":t}}function Zn(e){return{integerValue:""+e}}function er(e,t){return Ie(t)?Zn(t):Xn(e,t)} /** * @license - * Copyright 2017 Google LLC + * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2646,10 +2726,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Dr{constructor(e){this.Gt=e}}function Rr(e,t){if(t.document)return Dn(e.Gt,t.document,!!t.hasCommittedMutations);if(t.noDocument){const e=ae.fromSegments(t.noDocument.path),n=Fr(t.noDocument.readTime),r=Te.newNoDocument(e,n);return t.hasCommittedMutations?r.setHasCommittedMutations():r}if(t.unknownDocument){const e=ae.fromSegments(t.unknownDocument.path),n=Fr(t.unknownDocument.version);return Te.newUnknownDocument(e,n)}return v()}function Pr(e,t,n){const r=Lr(n),i=t.key.path.popLast().toArray();if(t.isFoundDocument()){const n=function(e,t){return{name:En(e,t.key),fields:t.data.value.mapValue.fields,updateTime:vn(e,t.version.toTimestamp())}}(e.Gt,t),s=t.hasCommittedMutations;return new ir(null,null,n,s,r,i)}if(t.isNoDocument()){const e=t.key.path.toArray(),n=Mr(t.version),s=t.hasCommittedMutations;return new ir(null,new nr(e,n),null,s,r,i)}if(t.isUnknownDocument()){const e=t.key.path.toArray(),n=Mr(t.version);return new ir(new rr(e,n),null,null,!0,r,i)}return v()}function Lr(e){const t=e.toTimestamp();return[t.seconds,t.nanoseconds]}function xr(e){const t=new V(e[0],e[1]);return q.fromTimestamp(t)}function Mr(e){const t=e.toTimestamp();return new Yn(t.seconds,t.nanoseconds)}function Fr(e){const t=new V(e.seconds,e.nanoseconds);return q.fromTimestamp(t)}function jr(e,t){const n=(t.baseMutations||[]).map(t=>Pn(e.Gt,t));for(let e=0;ePn(e.Gt,t)),i=V.fromMillis(t.localWriteTimeMs);return new Nr(t.batchId,i,n,r)}function Ur(e){const t=Fr(e.readTime),n=void 0!==e.lastLimboFreeSnapshotVersion?Fr(e.lastLimboFreeSnapshotVersion):q.min();let r;var i;return void 0!==e.query.documents?(w(1===(i=e.query).documents.length),r=Ze(Ge(An(i.documents[0])))):r=function(e){return Ze(Mn(e))}(e.query),new Cr(r,e.targetId,0,e.lastListenSequenceNumber,t,n,Y.fromBase64String(e.resumeToken))}function Vr(e,t){const n=Mr(t.snapshotVersion),r=Mr(t.lastLimboFreeSnapshotVersion);let i;i=Ne(t.target)?Ln(e.Gt,t.target):xn(e.Gt,t.target);const s=t.resumeToken.toBase64();return new or(t.targetId,Se(t.target),n,s,t.sequenceNumber,r,i)}function qr(e){const t=Mn({parent:e.parent,structuredQuery:e.structuredQuery});return"LAST"===e.limitType?et(t,t.limit,"L"):t} + */class tr{constructor(){this._=void 0}}function nr(e,t,n){return e instanceof sr?function(e,t){const n={fields:{__type__:{stringValue:"server_timestamp"},__local_write_time__:{timestampValue:{seconds:e.seconds,nanos:e.nanoseconds}}}};return t&&pt(t)&&(t=gt(t)),t&&(n.fields.__previous_value__=t),{mapValue:n}}(n,t):e instanceof or?ar(e,t):e instanceof cr?ur(e,t):function(e,t){const n=ir(e,t),r=hr(n)+hr(e.gt);return At(n)&&At(e.gt)?Zn(r):Xn(e.serializer,r)}(e,t)}function rr(e,t,n){return e instanceof or?ar(e,t):e instanceof cr?ur(e,t):n}function ir(e,t){return e instanceof lr?At(n=t)||function(e){return!!e&&"doubleValue"in e}(n)?t:{integerValue:0}:null;var n}class sr extends tr{}class or extends tr{constructor(e){super(),this.elements=e}}function ar(e,t){const n=dr(t);for(const t of e.elements)n.some(e=>_t(e,t))||n.push(t);return{arrayValue:{values:n}}}class cr extends tr{constructor(e){super(),this.elements=e}}function ur(e,t){let n=dr(t);for(const t of e.elements)n=n.filter(e=>!_t(e,t));return{arrayValue:{values:n}}}class lr extends tr{constructor(e,t){super(),this.serializer=e,this.gt=t}}function hr(e){return dt(e.integerValue||e.doubleValue)}function dr(e){return Nt(e)&&e.arrayValue.values?e.arrayValue.values.slice():[]} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2662,10 +2742,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Br{getBundleMetadata(e,t){return zr(e).get(t).next(e=>{if(e)return{id:(t=e).bundleId,createTime:Fr(t.createTime),version:t.version};var t})}saveBundleMetadata(e,t){return zr(e).put({bundleId:(n=t).id,createTime:Mr(In(n.createTime)),version:n.version});var n}getNamedQuery(e,t){return Kr(e).get(t).next(e=>{if(e)return{name:(t=e).name,query:qr(t.bundledQuery),readTime:Fr(t.readTime)};var t})}saveNamedQuery(e,t){return Kr(e).put(function(e){return{name:e.name,readTime:Mr(In(e.readTime)),bundledQuery:e.bundledQuery}}(t))}}function zr(e){return Ar(e,lr.store)}function Kr(e){return Ar(e,dr.store)} + */class fr{constructor(e,t){this.field=e,this.transform=t}}class pr{constructor(e,t){this.version=e,this.transformResults=t}}class gr{constructor(e,t){this.updateTime=e,this.exists=t}static none(){return new gr}static exists(e){return new gr(void 0,e)}static updateTime(e){return new gr(e)}get isNone(){return void 0===this.updateTime&&void 0===this.exists}isEqual(e){return this.exists===e.exists&&(this.updateTime?!!e.updateTime&&this.updateTime.isEqual(e.updateTime):!e.updateTime)}}function mr(e,t){return void 0!==e.updateTime?t.isFoundDocument()&&t.version.isEqual(e.updateTime):void 0===e.exists||e.exists===t.isFoundDocument()}class yr{}function vr(e,t){if(!e.hasLocalMutations||t&&0===t.fields.length)return null;if(null===t)return e.isNoDocument()?new Ar(e.key,gr.none()):new Tr(e.key,e.data,gr.none());{const n=e.data,r=jt.empty();let i=new rt(G.comparator);for(let e of t.fields)if(!i.has(e)){let t=n.field(e);null===t&&e.length>1&&(e=e.popLast(),t=n.field(e)),null===t?r.delete(e):r.set(e,t),i=i.add(e)}return new Er(e.key,r,new ot(i.toArray()),gr.none())}}function wr(e,t,n){e instanceof Tr?function(e,t,n){const r=e.value.clone(),i=kr(e.fieldTransforms,t,n.transformResults);r.setAll(i),t.convertToFoundDocument(n.version,r).setHasCommittedMutations()}(e,t,n):e instanceof Er?function(e,t,n){if(!mr(e.precondition,t))return void t.convertToUnknownDocument(n.version);const r=kr(e.fieldTransforms,t,n.transformResults),i=t.data;i.setAll(Sr(e)),i.setAll(r),t.convertToFoundDocument(n.version,i).setHasCommittedMutations()}(e,t,n):function(e,t,n){t.convertToNoDocument(n.version).setHasCommittedMutations()}(0,t,n)}function br(e,t,n,r){return e instanceof Tr?function(e,t,n,r){if(!mr(e.precondition,t))return n;const i=e.value.clone(),s=Cr(e.fieldTransforms,r,t);return i.setAll(s),t.convertToFoundDocument(t.version,i).setHasLocalMutations(),null}(e,t,n,r):e instanceof Er?function(e,t,n,r){if(!mr(e.precondition,t))return n;const i=Cr(e.fieldTransforms,r,t),s=t.data;return s.setAll(Sr(e)),s.setAll(i),t.convertToFoundDocument(t.version,s).setHasLocalMutations(),null===n?null:n.unionWith(e.fieldMask.fields).unionWith(e.fieldTransforms.map(e=>e.field))}(e,t,n,r):function(e,t,n){return mr(e.precondition,t)?(t.convertToNoDocument(t.version).setHasLocalMutations(),null):n}(e,t,n)}function Ir(e,t){let n=null;for(const r of e.fieldTransforms){const e=t.data.field(r.field),i=ir(r.transform,e||null);null!=i&&(null===n&&(n=jt.empty()),n.set(r.field,i))}return n||null}function _r(e,t){return e.type===t.type&&!!e.key.isEqual(t.key)&&!!e.precondition.isEqual(t.precondition)&&!!function(e,t){return void 0===e&&void 0===t||!(!e||!t)&&F(e,t,(e,t)=>function(e,t){return e.field.isEqual(t.field)&&function(e,t){return e instanceof or&&t instanceof or||e instanceof cr&&t instanceof cr?F(e.elements,t.elements,_t):e instanceof lr&&t instanceof lr?_t(e.gt,t.gt):e instanceof sr&&t instanceof sr}(e.transform,t.transform)}(e,t))}(e.fieldTransforms,t.fieldTransforms)&&(0===e.type?e.value.isEqual(t.value):1!==e.type||e.data.isEqual(t.data)&&e.fieldMask.isEqual(t.fieldMask))}class Tr extends yr{constructor(e,t,n,r=[]){super(),this.key=e,this.value=t,this.precondition=n,this.fieldTransforms=r,this.type=0}getFieldMask(){return null}}class Er extends yr{constructor(e,t,n,r,i=[]){super(),this.key=e,this.data=t,this.fieldMask=n,this.precondition=r,this.fieldTransforms=i,this.type=1}getFieldMask(){return this.fieldMask}}function Sr(e){const t=new Map;return e.fieldMask.fields.forEach(n=>{if(!n.isEmpty()){const r=e.data.field(n);t.set(n,r)}}),t}function kr(e,t,n){const r=new Map;w(e.length===n.length);for(let i=0;i{const i=e.get(r.key),s=i.overlayedDocument;let o=this.applyToLocalView(s,i.mutatedFields);o=t.has(r.key)?null:o;const a=vr(s,o);null!==a&&n.set(r.key,a),s.isValidDocument()||s.convertToNoDocument(U.min())}),n}keys(){return this.mutations.reduce((e,t)=>e.add(t.key),Qn())}isEqual(e){return this.batchId===e.batchId&&F(this.mutations,e.mutations,(e,t)=>_r(e,t))&&F(this.baseMutations,e.baseMutations,(e,t)=>_r(e,t))}}class Or{constructor(e,t,n,r){this.batch=e,this.commitVersion=t,this.mutationResults=n,this.docVersions=r}static from(e,t,n){w(e.mutations.length===n.length);let r=Wn;const i=e.mutations;for(let e=0;e{this.Ht.add(t)});const i={collectionId:n,parent:Hn(r)};return $r(e).put(i)}return gr.resolve()}getCollectionParents(e,t){const n=[],r=IDBKeyRange.bound([t,""],[U(t),""],!1,!0);return $r(e).Bt(r).next(e=>{for(const r of e){if(r.collectionId!==t)break;n.push(Jn(r.parent))}return n})}}function $r(e){return Ar(e,ur.store)} + */class Rr{constructor(e,t){this.largestBatchId=e,this.mutation=t}getKey(){return this.mutation.key}isEqual(e){return null!==e&&this.mutation===e.mutation}toString(){return`Overlay{\n largestBatchId: ${this.largestBatchId},\n mutation: ${this.mutation.toString()}\n }`}} /** * @license - * Copyright 2018 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2710,10 +2790,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Qr={didRun:!1,sequenceNumbersCollected:0,targetsRemoved:0,documentsRemoved:0};class Jr{constructor(e,t,n){this.cacheSizeCollectionThreshold=e,this.percentileToCollect=t,this.maximumSequenceNumbersToCollect=n}static withCacheSize(e){return new Jr(e,Jr.DEFAULT_COLLECTION_PERCENTILE,Jr.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT)}} + */class xr{constructor(e,t,n){this.alias=e,this.yt=t,this.fieldPath=n}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2726,7 +2806,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Yr(e,t,n){const r=e.store(er.store),i=e.store(tr.store),s=[],o=IDBKeyRange.only(n.batchId);let a=0;const c=r.jt({range:o},(e,t,n)=>(a++,n.delete()));s.push(c.next(()=>{w(1===a)}));const u=[];for(const e of n.mutations){const r=tr.key(t,e.key.path,n.batchId);s.push(i.delete(r)),u.push(e.key)}return gr.waitFor(s).next(()=>u)}function Xr(e){if(!e)return 0;let t;if(e.document)t=e.document;else if(e.unknownDocument)t=e.unknownDocument;else{if(!e.noDocument)throw v();t=e.noDocument}return JSON.stringify(t).length} + */class Pr{constructor(e,t){this.count=e,this.unchangedNames=t}} /** * @license * Copyright 2017 Google LLC @@ -2742,10 +2822,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */Jr.DEFAULT_COLLECTION_PERCENTILE=10,Jr.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT=1e3,Jr.DEFAULT=new Jr(41943040,Jr.DEFAULT_COLLECTION_PERCENTILE,Jr.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT),Jr.DISABLED=new Jr(-1,0,0);class Zr{constructor(e,t,n,r){this.userId=e,this.k=t,this.Jt=n,this.referenceDelegate=r,this.Yt={}}static Xt(e,t,n,r){w(""!==e.uid);const i=e.isAuthenticated()?e.uid:"";return new Zr(i,t,n,r)}checkEmpty(e){let t=!0;const n=IDBKeyRange.bound([this.userId,Number.NEGATIVE_INFINITY],[this.userId,Number.POSITIVE_INFINITY]);return ti(e).jt({index:er.userMutationsIndex,range:n},(e,n,r)=>{t=!1,r.done()}).next(()=>t)}addMutationBatch(e,t,n,r){const i=ni(e),s=ti(e);return s.add({}).next(o=>{w("number"==typeof o);const a=new Nr(o,t,n,r),c=function(e,t,n){const r=n.baseMutations.map(t=>Rn(e.Gt,t)),i=n.mutations.map(t=>Rn(e.Gt,t));return new er(t,n.batchId,n.localWriteTime.toMillis(),r,i)}(this.k,this.userId,a),u=[];let h=new Ht((e,t)=>F(e.canonicalString(),t.canonicalString()));for(const e of r){const t=tr.key(this.userId,e.key.path,o);h=h.add(e.key.path.popLast()),u.push(s.put(c)),u.push(i.put(t,tr.PLACEHOLDER))}return h.forEach(t=>{u.push(this.Jt.addToCollectionParentIndex(e,t))}),e.addOnCommittedListener(()=>{this.Yt[o]=a.keys()}),gr.waitFor(u).next(()=>a)})}lookupMutationBatch(e,t){return ti(e).get(t).next(e=>e?(w(e.userId===this.userId),jr(this.k,e)):null)}Zt(e,t){return this.Yt[t]?gr.resolve(this.Yt[t]):this.lookupMutationBatch(e,t).next(e=>{if(e){const n=e.keys();return this.Yt[t]=n,n}return null})}getNextMutationBatchAfterBatchId(e,t){const n=t+1,r=IDBKeyRange.lowerBound([this.userId,n]);let i=null;return ti(e).jt({index:er.userMutationsIndex,range:r},(e,t,r)=>{t.userId===this.userId&&(w(t.batchId>=n),i=jr(this.k,t)),r.done()}).next(()=>i)}getHighestUnacknowledgedBatchId(e){const t=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]);let n=-1;return ti(e).jt({index:er.userMutationsIndex,range:t,reverse:!0},(e,t,r)=>{n=t.batchId,r.done()}).next(()=>n)}getAllMutationBatches(e){const t=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return ti(e).Bt(er.userMutationsIndex,t).next(e=>e.map(e=>jr(this.k,e)))}getAllMutationBatchesAffectingDocumentKey(e,t){const n=tr.prefixForPath(this.userId,t.path),r=IDBKeyRange.lowerBound(n),i=[];return ni(e).jt({range:r},(n,r,s)=>{const[o,a,c]=n,u=Jn(a);if(o===this.userId&&t.path.isEqual(u))return ti(e).get(c).next(e=>{if(!e)throw v();w(e.userId===this.userId),i.push(jr(this.k,e))});s.done()}).next(()=>i)}getAllMutationBatchesAffectingDocumentKeys(e,t){let n=new Ht(F);const r=[];return t.forEach(t=>{const i=tr.prefixForPath(this.userId,t.path),s=IDBKeyRange.lowerBound(i),o=ni(e).jt({range:s},(e,r,i)=>{const[s,o,a]=e,c=Jn(o);s===this.userId&&t.path.isEqual(c)?n=n.add(a):i.done()});r.push(o)}),gr.waitFor(r).next(()=>this.te(e,n))}getAllMutationBatchesAffectingQuery(e,t){const n=t.path,r=n.length+1,i=tr.prefixForPath(this.userId,n),s=IDBKeyRange.lowerBound(i);let o=new Ht(F);return ni(e).jt({range:s},(e,t,i)=>{const[s,a,c]=e,u=Jn(a);s===this.userId&&n.isPrefixOf(u)?u.length===r&&(o=o.add(c)):i.done()}).next(()=>this.te(e,o))}te(e,t){const n=[],r=[];return t.forEach(t=>{r.push(ti(e).get(t).next(e=>{if(null===e)throw v();w(e.userId===this.userId),n.push(jr(this.k,e))}))}),gr.waitFor(r).next(()=>n)}removeMutationBatch(e,t){return Yr(e.Wt,this.userId,t).next(n=>(e.addOnCommittedListener(()=>{this.ee(t.batchId)}),gr.forEach(n,t=>this.referenceDelegate.markPotentiallyOrphaned(e,t))))}ee(e){delete this.Yt[e]}performConsistencyCheck(e){return this.checkEmpty(e).next(t=>{if(!t)return gr.resolve();const n=IDBKeyRange.lowerBound(tr.prefixForUser(this.userId)),r=[];return ni(e).jt({range:n},(e,t,n)=>{if(e[0]===this.userId){const t=Jn(e[1]);r.push(t)}else n.done()}).next(()=>{w(0===r.length)})})}containsKey(e,t){return ei(e,this.userId,t)}ne(e){return ri(e).get(this.userId).next(e=>e||new Zn(this.userId,-1,""))}}function ei(e,t,n){const r=tr.prefixForPath(t,n.path),i=r[1],s=IDBKeyRange.lowerBound(r);let o=!1;return ni(e).jt({range:s,Kt:!0},(e,n,r)=>{const[s,a,c]=e;s===t&&a===i&&(o=!0),r.done()}).next(()=>o)}function ti(e){return Ar(e,er.store)}function ni(e){return Ar(e,tr.store)}function ri(e){return Ar(e,Zn.store)} + */var Lr,Mr;function Fr(e){switch(e){default:return v();case _.CANCELLED:case _.UNKNOWN:case _.DEADLINE_EXCEEDED:case _.RESOURCE_EXHAUSTED:case _.INTERNAL:case _.UNAVAILABLE:case _.UNAUTHENTICATED:return!1;case _.INVALID_ARGUMENT:case _.NOT_FOUND:case _.ALREADY_EXISTS:case _.PERMISSION_DENIED:case _.FAILED_PRECONDITION:case _.ABORTED:case _.OUT_OF_RANGE:case _.UNIMPLEMENTED:case _.DATA_LOSS:return!0}}function Vr(e){if(void 0===e)return g("GRPC error has no .code"),_.UNKNOWN;switch(e){case Lr.OK:return _.OK;case Lr.CANCELLED:return _.CANCELLED;case Lr.UNKNOWN:return _.UNKNOWN;case Lr.DEADLINE_EXCEEDED:return _.DEADLINE_EXCEEDED;case Lr.RESOURCE_EXHAUSTED:return _.RESOURCE_EXHAUSTED;case Lr.INTERNAL:return _.INTERNAL;case Lr.UNAVAILABLE:return _.UNAVAILABLE;case Lr.UNAUTHENTICATED:return _.UNAUTHENTICATED;case Lr.INVALID_ARGUMENT:return _.INVALID_ARGUMENT;case Lr.NOT_FOUND:return _.NOT_FOUND;case Lr.ALREADY_EXISTS:return _.ALREADY_EXISTS;case Lr.PERMISSION_DENIED:return _.PERMISSION_DENIED;case Lr.FAILED_PRECONDITION:return _.FAILED_PRECONDITION;case Lr.ABORTED:return _.ABORTED;case Lr.OUT_OF_RANGE:return _.OUT_OF_RANGE;case Lr.UNIMPLEMENTED:return _.UNIMPLEMENTED;case Lr.DATA_LOSS:return _.DATA_LOSS;default:return v()}}(Mr=Lr||(Lr={}))[Mr.OK=0]="OK",Mr[Mr.CANCELLED=1]="CANCELLED",Mr[Mr.UNKNOWN=2]="UNKNOWN",Mr[Mr.INVALID_ARGUMENT=3]="INVALID_ARGUMENT",Mr[Mr.DEADLINE_EXCEEDED=4]="DEADLINE_EXCEEDED",Mr[Mr.NOT_FOUND=5]="NOT_FOUND",Mr[Mr.ALREADY_EXISTS=6]="ALREADY_EXISTS",Mr[Mr.PERMISSION_DENIED=7]="PERMISSION_DENIED",Mr[Mr.UNAUTHENTICATED=16]="UNAUTHENTICATED",Mr[Mr.RESOURCE_EXHAUSTED=8]="RESOURCE_EXHAUSTED",Mr[Mr.FAILED_PRECONDITION=9]="FAILED_PRECONDITION",Mr[Mr.ABORTED=10]="ABORTED",Mr[Mr.OUT_OF_RANGE=11]="OUT_OF_RANGE",Mr[Mr.UNIMPLEMENTED=12]="UNIMPLEMENTED",Mr[Mr.INTERNAL=13]="INTERNAL",Mr[Mr.UNAVAILABLE=14]="UNAVAILABLE",Mr[Mr.DATA_LOSS=15]="DATA_LOSS"; /** * @license - * Copyright 2017 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2758,10 +2838,11 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ii{constructor(e){this.se=e}next(){return this.se+=2,this.se}static ie(){return new ii(0)}static re(){return new ii(-1)}} + */ +class jr{constructor(){this.onExistenceFilterMismatchCallbacks=new Map}static get instance(){return Ur}static getOrCreateInstance(){return null===Ur&&(Ur=new jr),Ur}onExistenceFilterMismatch(e){const t=Symbol();return this.onExistenceFilterMismatchCallbacks.set(t,e),()=>this.onExistenceFilterMismatchCallbacks.delete(t)}notifyOnExistenceFilterMismatch(e){this.onExistenceFilterMismatchCallbacks.forEach(t=>t(e))}}let Ur=null; /** * @license - * Copyright 2017 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2774,10 +2855,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class si{constructor(e,t){this.referenceDelegate=e,this.k=t}allocateTargetId(e){return this.oe(e).next(t=>{const n=new ii(t.highestTargetId);return t.highestTargetId=n.next(),this.ae(e,t).next(()=>t.highestTargetId)})}getLastRemoteSnapshotVersion(e){return this.oe(e).next(e=>q.fromTimestamp(new V(e.lastRemoteSnapshotVersion.seconds,e.lastRemoteSnapshotVersion.nanoseconds)))}getHighestSequenceNumber(e){return this.oe(e).next(e=>e.highestListenSequenceNumber)}setTargetsMetadata(e,t,n){return this.oe(e).next(r=>(r.highestListenSequenceNumber=t,n&&(r.lastRemoteSnapshotVersion=n.toTimestamp()),t>r.highestListenSequenceNumber&&(r.highestListenSequenceNumber=t),this.ae(e,r)))}addTargetData(e,t){return this.ce(e,t).next(()=>this.oe(e).next(n=>(n.targetCount+=1,this.ue(t,n),this.ae(e,n))))}updateTargetData(e,t){return this.ce(e,t)}removeTargetData(e,t){return this.removeMatchingKeysForTargetId(e,t.targetId).next(()=>oi(e).delete(t.targetId)).next(()=>this.oe(e)).next(t=>(w(t.targetCount>0),t.targetCount-=1,this.ae(e,t)))}removeTargets(e,t,n){let r=0;const i=[];return oi(e).jt((s,o)=>{const a=Ur(o);a.sequenceNumber<=t&&null===n.get(a.targetId)&&(r++,i.push(this.removeTargetData(e,a)))}).next(()=>gr.waitFor(i)).next(()=>r)}forEachTarget(e,t){return oi(e).jt((e,n)=>{const r=Ur(n);t(r)})}oe(e){return ai(e).get(cr.key).next(e=>(w(null!==e),e))}ae(e,t){return ai(e).put(cr.key,t)}ce(e,t){return oi(e).put(Vr(this.k,t))}ue(e,t){let n=!1;return e.targetId>t.highestTargetId&&(t.highestTargetId=e.targetId,n=!0),e.sequenceNumber>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=e.sequenceNumber,n=!0),n}getTargetCount(e){return this.oe(e).next(e=>e.targetCount)}getTargetData(e,t){const n=Se(t),r=IDBKeyRange.bound([n,Number.NEGATIVE_INFINITY],[n,Number.POSITIVE_INFINITY]);let i=null;return oi(e).jt({range:r,index:or.queryTargetsIndexName},(e,n,r)=>{const s=Ur(n);Ae(t,s.target)&&(i=s,r.done())}).next(()=>i)}addMatchingKeys(e,t,n){const r=[],i=ci(e);return t.forEach(t=>{const s=Hn(t.path);r.push(i.put(new ar(n,s))),r.push(this.referenceDelegate.addReference(e,n,t))}),gr.waitFor(r)}removeMatchingKeys(e,t,n){const r=ci(e);return gr.forEach(t,t=>{const i=Hn(t.path);return gr.waitFor([r.delete([n,i]),this.referenceDelegate.removeReference(e,n,t)])})}removeMatchingKeysForTargetId(e,t){const n=ci(e),r=IDBKeyRange.bound([t],[t+1],!1,!0);return n.delete(r)}getMatchingKeysForTargetId(e,t){const n=IDBKeyRange.bound([t],[t+1],!1,!0),r=ci(e);let i=nn();return r.jt({range:n,Kt:!0},(e,t,n)=>{const r=Jn(e[1]),s=new ae(r);i=i.add(s)}).next(()=>i)}containsKey(e,t){const n=Hn(t.path),r=IDBKeyRange.bound([n],[U(n)],!1,!0);let i=0;return ci(e).jt({index:ar.documentTargetsIndex,Kt:!0,range:r},([e,t],n,r)=>{0!==e&&(i++,r.done())}).next(()=>i>0)}Et(e,t){return oi(e).get(t).next(e=>e?Ur(e):null)}}function oi(e){return Ar(e,or.store)}function ai(e){return Ar(e,cr.store)}function ci(e){return Ar(e,ar.store)} + */function qr(){return new TextEncoder} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2790,10 +2871,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */async function ui(e){if(e.code!==_.FAILED_PRECONDITION||e.message!==pr)throw e;p("LocalStore","Unexpectedly lost primary lease")} + */const Br=new a.e([4294967295,4294967295],0);function zr(e){const t=qr().encode(e),n=new a.f;return n.update(t),new Uint8Array(n.digest())}function Gr(e){const t=new DataView(e.buffer),n=t.getUint32(0,!0),r=t.getUint32(4,!0),i=t.getUint32(8,!0),s=t.getUint32(12,!0);return[new a.e([n,r],0),new a.e([i,s],0)]}class Kr{constructor(e,t,n){if(this.bitmap=e,this.padding=t,this.hashCount=n,t<0||t>=8)throw new $r("Invalid padding: "+t);if(n<0)throw new $r("Invalid hash count: "+n);if(e.length>0&&0===this.hashCount)throw new $r("Invalid hash count: "+n);if(0===e.length&&0!==t)throw new $r("Invalid padding when bitmap length is 0: "+t);this.It=8*e.length-t,this.Tt=a.e.fromNumber(this.It)}Et(e,t,n){let r=e.add(t.multiply(a.e.fromNumber(n)));return 1===r.compare(Br)&&(r=new a.e([r.getBits(0),r.getBits(1)],0)),r.modulo(this.Tt).toNumber()}At(e){return 0!=(this.bitmap[Math.floor(e/8)]&1<s.insert(e)),s}insert(e){if(0===this.It)return;const t=zr(e),[n,r]=Gr(t);for(let e=0;e{this._e=null,this.we=!0;try{await e.collectGarbage(this.garbageCollector)}catch(e){Ir(e)?p("LruGarbageCollector","Ignoring IndexedDB error during garbage collection: ",e):await ui(e)}await this.me(e)})}}class fi{constructor(e,t){this.ge=e,this.params=t}calculateTargetCount(e,t){return this.ge.ye(e).next(e=>Math.floor(t/100*e))}nthSequenceNumber(e,t){if(0===t)return gr.resolve(L.I);const n=new li(t);return this.ge.forEachTarget(e,e=>n.de(e.sequenceNumber)).next(()=>this.ge.pe(e,e=>n.de(e))).next(()=>n.maxValue)}removeTargets(e,t,n){return this.ge.removeTargets(e,t,n)}removeOrphanedDocuments(e,t){return this.ge.removeOrphanedDocuments(e,t)}collect(e,t){return-1===this.params.cacheSizeCollectionThreshold?(p("LruGarbageCollector","Garbage collection skipped; disabled"),gr.resolve(Qr)):this.getCacheSize(e).next(n=>n(t>this.params.maximumSequenceNumbersToCollect?(p("LruGarbageCollector",`Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${t}`),r=this.params.maximumSequenceNumbersToCollect):r=t,o=Date.now(),this.nthSequenceNumber(e,r))).next(r=>(n=r,a=Date.now(),this.removeTargets(e,n,t))).next(t=>(i=t,c=Date.now(),this.removeOrphanedDocuments(e,n))).next(e=>(u=Date.now(),d()<=s.a.DEBUG&&p("LruGarbageCollector",`LRU Garbage Collection\n\tCounted targets in ${o-h}ms\n\tDetermined least recently used ${r} in `+(a-o)+"ms\n"+`\tRemoved ${i} targets in `+(c-a)+"ms\n"+`\tRemoved ${e} documents in `+(u-c)+"ms\n"+`Total Duration: ${u-h}ms`),gr.resolve({didRun:!0,sequenceNumbersCollected:r,targetsRemoved:i,documentsRemoved:e})))}} + */class Wr{constructor(e,t,n,r,i){this.snapshotVersion=e,this.targetChanges=t,this.targetMismatches=n,this.documentUpdates=r,this.resolvedLimboDocuments=i}static createSynthesizedRemoteEventForCurrentChange(e,t,n){const r=new Map;return r.set(e,Hr.createSynthesizedTargetChangeForCurrentChange(e,t,n)),new Wr(U.min(),r,new et(M),Un(),Qn())}}class Hr{constructor(e,t,n,r,i){this.resumeToken=e,this.current=t,this.addedDocuments=n,this.modifiedDocuments=r,this.removedDocuments=i}static createSynthesizedTargetChangeForCurrentChange(e,t,n){return new Hr(n,t,Qn(),Qn(),Qn())}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2822,7 +2903,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class pi{constructor(e,t){this.db=e,this.garbageCollector=function(e,t){return new fi(e,t)}(this,t)}ye(e){const t=this.Ee(e);return this.db.getTargetCache().getTargetCount(e).next(e=>t.next(t=>e+t))}Ee(e){let t=0;return this.pe(e,e=>{t++}).next(()=>t)}forEachTarget(e,t){return this.db.getTargetCache().forEachTarget(e,t)}pe(e,t){return this.Ie(e,(e,n)=>t(n))}addReference(e,t,n){return mi(e,n)}removeReference(e,t,n){return mi(e,n)}removeTargets(e,t,n){return this.db.getTargetCache().removeTargets(e,t,n)}markPotentiallyOrphaned(e,t){return mi(e,t)}Ae(e,t){return function(e,t){let n=!1;return ri(e).Qt(r=>ei(e,r,t).next(e=>(e&&(n=!0),gr.resolve(!e)))).next(()=>n)}(e,t)}removeOrphanedDocuments(e,t){const n=this.db.getRemoteDocumentCache().newChangeBuffer(),r=[];let i=0;return this.Ie(e,(s,o)=>{if(o<=t){const t=this.Ae(e,s).next(t=>{if(!t)return i++,n.getEntry(e,s).next(()=>(n.removeEntry(s),ci(e).delete([0,Hn(s.path)])))});r.push(t)}}).next(()=>gr.waitFor(r)).next(()=>n.apply(e)).next(()=>i)}removeTarget(e,t){const n=t.withSequenceNumber(e.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(e,n)}updateLimboDocument(e,t){return mi(e,t)}Ie(e,t){const n=ci(e);let r,i=L.I;return n.jt({index:ar.documentTargetsIndex},([e,n],{path:s,sequenceNumber:o})=>{0===e?(i!==L.I&&t(new ae(Jn(r)),i),i=o,r=s):i=L.I}).next(()=>{i!==L.I&&t(new ae(Jn(r)),i)})}getCacheSize(e){return this.db.getRemoteDocumentCache().getSize(e)}}function mi(e,t){return ci(e).put(function(e,t){return new ar(0,Hn(e.path),t)}(t,e.currentSequenceNumber))} + */class Qr{constructor(e,t,n,r){this.Pt=e,this.removedTargetIds=t,this.key=n,this.bt=r}}class Yr{constructor(e,t){this.targetId=e,this.Vt=t}}class Jr{constructor(e,t,n=ut.EMPTY_BYTE_STRING,r=null){this.state=e,this.targetIds=t,this.resumeToken=n,this.cause=r}}class Xr{constructor(){this.St=0,this.Dt=ti(),this.Ct=ut.EMPTY_BYTE_STRING,this.xt=!1,this.Nt=!0}get current(){return this.xt}get resumeToken(){return this.Ct}get kt(){return 0!==this.St}get Mt(){return this.Nt}$t(e){e.approximateByteSize()>0&&(this.Nt=!0,this.Ct=e)}Ot(){let e=Qn(),t=Qn(),n=Qn();return this.Dt.forEach((r,i)=>{switch(i){case 0:e=e.add(r);break;case 2:t=t.add(r);break;case 1:n=n.add(r);break;default:v()}}),new Hr(this.Ct,this.xt,e,t,n)}Ft(){this.Nt=!1,this.Dt=ti()}Bt(e,t){this.Nt=!0,this.Dt=this.Dt.insert(e,t)}Lt(e){this.Nt=!0,this.Dt=this.Dt.remove(e)}qt(){this.St+=1}Ut(){this.St-=1}Kt(){this.Nt=!0,this.xt=!0}}class Zr{constructor(e){this.Gt=e,this.Qt=new Map,this.jt=Un(),this.zt=ei(),this.Wt=new et(M)}Ht(e){for(const t of e.Pt)e.bt&&e.bt.isFoundDocument()?this.Jt(t,e.bt):this.Yt(t,e.key,e.bt);for(const t of e.removedTargetIds)this.Yt(t,e.key,e.bt)}Xt(e){this.forEachTarget(e,t=>{const n=this.Zt(t);switch(e.state){case 0:this.te(t)&&n.$t(e.resumeToken);break;case 1:n.Ut(),n.kt||n.Ft(),n.$t(e.resumeToken);break;case 2:n.Ut(),n.kt||this.removeTarget(t);break;case 3:this.te(t)&&(n.Kt(),n.$t(e.resumeToken));break;case 4:this.te(t)&&(this.ee(t),n.$t(e.resumeToken));break;default:v()}})}forEachTarget(e,t){e.targetIds.length>0?e.targetIds.forEach(t):this.Qt.forEach((e,n)=>{this.te(n)&&t(n)})}ne(e){var t;const n=e.targetId,r=e.Vt.count,i=this.se(n);if(i){const s=i.target;if(mn(s))if(0===r){const e=new K(s.path);this.Yt(n,e,qt.newNoDocument(e,U.min()))}else w(1===r);else{const i=this.ie(n);if(i!==r){const r=this.re(e,i);if(0!==r){this.ee(n);const e=2===r?"TargetPurposeExistenceFilterMismatchBloom":"TargetPurposeExistenceFilterMismatch";this.Wt=this.Wt.insert(n,e)}null===(t=jr.instance)||void 0===t||t.notifyOnExistenceFilterMismatch(function(e,t,n){var r,i,s,o,a,c;const u={localCacheCount:t,existenceFilterCount:n.count},l=n.unchangedNames;return l&&(u.bloomFilter={applied:0===e,hashCount:null!==(r=null==l?void 0:l.hashCount)&&void 0!==r?r:0,bitmapLength:null!==(o=null===(s=null===(i=null==l?void 0:l.bits)||void 0===i?void 0:i.bitmap)||void 0===s?void 0:s.length)&&void 0!==o?o:0,padding:null!==(c=null===(a=null==l?void 0:l.bits)||void 0===a?void 0:a.padding)&&void 0!==c?c:0}),u} /** * @license * Copyright 2017 Google LLC @@ -2838,7 +2919,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class gi{constructor(e,t){this.mapKeyFn=e,this.equalsFn=t,this.inner={}}get(e){const t=this.mapKeyFn(e),n=this.inner[t];if(void 0!==n)for(const[t,r]of n)if(this.equalsFn(t,e))return r}has(e){return void 0!==this.get(e)}set(e,t){const n=this.mapKeyFn(e),r=this.inner[n];if(void 0!==r){for(let n=0;n{for(const[t,r]of n)e(t,r)})}isEmpty(){return K(this.inner)}} + */(r,i,e.Vt))}}}}re(e,t){const{unchangedNames:n,count:r}=e.Vt;if(!n||!n.bits)return 1;const{bits:{bitmap:i="",padding:s=0},hashCount:o=0}=n;let a,c;try{a=ft(i).toUint8Array()}catch(e){if(e instanceof at)return m("Decoding the base64 bloom filter in existence filter failed ("+e.message+"); ignoring the bloom filter and falling back to full re-query."),1;throw e}try{c=new Kr(a,s,o)}catch(e){return m(e instanceof $r?"BloomFilter error: ":"Applying bloom filter failed: ",e),1}return 0===c.It?1:r!==t-this.oe(e.targetId,c)?2:0}oe(e,t){const n=this.Gt.getRemoteKeysForTarget(e);let r=0;return n.forEach(n=>{const i=this.Gt.ue(),s=`projects/${i.projectId}/databases/${i.database}/documents/${n.path.canonicalString()}`;t.vt(s)||(this.Yt(e,n,null),r++)}),r}ce(e){const t=new Map;this.Qt.forEach((n,r)=>{const i=this.se(r);if(i){if(n.current&&mn(i.target)){const t=new K(i.target.path);null!==this.jt.get(t)||this.ae(r,t)||this.Yt(r,t,qt.newNoDocument(t,e))}n.Mt&&(t.set(r,n.Ot()),n.Ft())}});let n=Qn();this.zt.forEach((e,t)=>{let r=!0;t.forEachWhile(e=>{const t=this.se(e);return!t||"TargetPurposeLimboResolution"===t.purpose||(r=!1,!1)}),r&&(n=n.add(e))}),this.jt.forEach((t,n)=>n.setReadTime(e));const r=new Wr(e,t,this.Wt,this.jt,n);return this.jt=Un(),this.zt=ei(),this.Wt=new et(M),r}Jt(e,t){if(!this.te(e))return;const n=this.ae(e,t.key)?2:0;this.Zt(e).Bt(t.key,n),this.jt=this.jt.insert(t.key,t),this.zt=this.zt.insert(t.key,this.he(t.key).add(e))}Yt(e,t,n){if(!this.te(e))return;const r=this.Zt(e);this.ae(e,t)?r.Bt(t,1):r.Lt(t),this.zt=this.zt.insert(t,this.he(t).delete(e)),n&&(this.jt=this.jt.insert(t,n))}removeTarget(e){this.Qt.delete(e)}ie(e){const t=this.Zt(e).Ot();return this.Gt.getRemoteKeysForTarget(e).size+t.addedDocuments.size-t.removedDocuments.size}qt(e){this.Zt(e).qt()}Zt(e){let t=this.Qt.get(e);return t||(t=new Xr,this.Qt.set(e,t)),t}he(e){let t=this.zt.get(e);return t||(t=new rt(M),this.zt=this.zt.insert(e,t)),t}te(e){const t=null!==this.se(e);return t||p("WatchChangeAggregator","Detected inactive target",e),t}se(e){const t=this.Qt.get(e);return t&&t.kt?null:this.Gt.le(e)}ee(e){this.Qt.set(e,new Xr),this.Gt.getRemoteKeysForTarget(e).forEach(t=>{this.Yt(e,t,null)})}ae(e,t){return this.Gt.getRemoteKeysForTarget(e).has(t)}}function ei(){return new et(K.comparator)}function ti(){return new et(K.comparator)}const ni={asc:"ASCENDING",desc:"DESCENDING"},ri={"<":"LESS_THAN","<=":"LESS_THAN_OR_EQUAL",">":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"},ii={and:"AND",or:"OR"};class si{constructor(e,t){this.databaseId=e,this.useProto3Json=t}}function oi(e,t){return e.useProto3Json||we(t)?t:{value:t}}function ai(e,t){return e.useProto3Json?`${new Date(1e3*t.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")}.${("000000000"+t.nanoseconds).slice(-9)}Z`:{seconds:""+t.seconds,nanos:t.nanoseconds}}function ci(e,t){return e.useProto3Json?t.toBase64():t.toUint8Array()}function ui(e,t){return ai(e,t.toTimestamp())}function li(e){return w(!!e),U.fromTimestamp(function(e){const t=ht(e);return new j(t.seconds,t.nanos)}(e))}function hi(e,t){return function(e){return new B(["projects",e.projectId,"databases",e.database])}(e).child("documents").child(t).canonicalString()}function di(e){const t=B.fromString(e);return w(Ri(t)),t}function fi(e,t){return hi(e.databaseId,t.path)}function pi(e,t){const n=di(t);if(n.get(1)!==e.databaseId.projectId)throw new T(_.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+n.get(1)+" vs "+e.databaseId.projectId);if(n.get(3)!==e.databaseId.database)throw new T(_.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+n.get(3)+" vs "+e.databaseId.database);return new K(vi(n))}function gi(e,t){return hi(e.databaseId,t)}function mi(e){const t=di(e);return 4===t.length?B.emptyPath():vi(t)}function yi(e){return new B(["projects",e.databaseId.projectId,"databases",e.databaseId.database]).canonicalString()}function vi(e){return w(e.length>4&&"documents"===e.get(4)),e.popFirst(5)}function wi(e,t,n){return{name:fi(e,t),fields:n.value.mapValue.fields}}function bi(e,t,n){const r=pi(e,t.name),i=li(t.updateTime),s=t.createTime?li(t.createTime):U.min(),o=new jt({mapValue:{fields:t.fields}}),a=qt.newFoundDocument(r,i,s,o);return n&&a.setHasCommittedMutations(),n?a.setHasCommittedMutations():a}function Ii(e,t){let n;if(t instanceof Tr)n={update:wi(e,t.key,t.value)};else if(t instanceof Ar)n={delete:fi(e,t.key)};else if(t instanceof Er)n={update:wi(e,t.key,t.data),updateMask:Oi(t.fieldMask)};else{if(!(t instanceof Nr))return v();n={verify:fi(e,t.key)}}return t.fieldTransforms.length>0&&(n.updateTransforms=t.fieldTransforms.map(e=>function(e,t){const n=t.transform;if(n instanceof sr)return{fieldPath:t.field.canonicalString(),setToServerValue:"REQUEST_TIME"};if(n instanceof or)return{fieldPath:t.field.canonicalString(),appendMissingElements:{values:n.elements}};if(n instanceof cr)return{fieldPath:t.field.canonicalString(),removeAllFromArray:{values:n.elements}};if(n instanceof lr)return{fieldPath:t.field.canonicalString(),increment:n.gt};throw v()}(0,e))),t.precondition.isNone||(n.currentDocument=function(e,t){return void 0!==t.updateTime?{updateTime:ui(e,t.updateTime)}:void 0!==t.exists?{exists:t.exists}:v()}(e,t.precondition)),n}function _i(e,t){const n=t.currentDocument?function(e){return void 0!==e.updateTime?gr.updateTime(li(e.updateTime)):void 0!==e.exists?gr.exists(e.exists):gr.none()}(t.currentDocument):gr.none(),r=t.updateTransforms?t.updateTransforms.map(t=>function(e,t){let n=null;if("setToServerValue"in t)w("REQUEST_TIME"===t.setToServerValue),n=new sr;else if("appendMissingElements"in t){const e=t.appendMissingElements.values||[];n=new or(e)}else if("removeAllFromArray"in t){const e=t.removeAllFromArray.values||[];n=new cr(e)}else"increment"in t?n=new lr(e,t.increment):v();const r=G.fromServerFormat(t.fieldPath);return new fr(r,n)}(e,t)):[];if(t.update){t.update.name;const i=pi(e,t.update.name),s=new jt({mapValue:{fields:t.update.fields}});if(t.updateMask){const e=function(e){const t=e.fieldPaths||[];return new ot(t.map(e=>G.fromServerFormat(e)))}(t.updateMask);return new Er(i,s,e,n,r)}return new Tr(i,s,n,r)}if(t.delete){const r=pi(e,t.delete);return new Ar(r,n)}if(t.verify){const r=pi(e,t.verify);return new Nr(r,n)}return v()}function Ti(e,t){return{documents:[gi(e,t.path)]}}function Ei(e,t){const n={structuredQuery:{}},r=t.path;null!==t.collectionGroup?(n.parent=gi(e,r),n.structuredQuery.from=[{collectionId:t.collectionGroup,allDescendants:!0}]):(n.parent=gi(e,r.popLast()),n.structuredQuery.from=[{collectionId:r.lastSegment()}]);const i=function(e){if(0!==e.length)return function e(t){return t instanceof Ht?function(e){if("=="===e.op){if(Ot(e.value))return{unaryFilter:{field:Ni(e.field),op:"IS_NAN"}};if(Dt(e.value))return{unaryFilter:{field:Ni(e.field),op:"IS_NULL"}}}else if("!="===e.op){if(Ot(e.value))return{unaryFilter:{field:Ni(e.field),op:"IS_NOT_NAN"}};if(Dt(e.value))return{unaryFilter:{field:Ni(e.field),op:"IS_NOT_NULL"}}}return{fieldFilter:{field:Ni(e.field),op:Ci(e.op),value:e.value}}}(t):t instanceof Qt?function(t){const n=t.getFilters().map(t=>e(t));return 1===n.length?n[0]:{compositeFilter:{op:Ai(t.op),filters:n}}}(t):v()}(Qt.create(e,"and"))}(t.filters);i&&(n.structuredQuery.where=i);const s=function(e){if(0!==e.length)return e.map(e=>function(e){return{field:Ni(e.field),direction:ki(e.dir)}}(e))}(t.orderBy);s&&(n.structuredQuery.orderBy=s);const o=oi(e,t.limit);var a;return null!==o&&(n.structuredQuery.limit=o),t.startAt&&(n.structuredQuery.startAt={before:(a=t.startAt).inclusive,values:a.position}),t.endAt&&(n.structuredQuery.endAt=function(e){return{before:!e.inclusive,values:e.position}}(t.endAt)),n}function Si(e){let t=mi(e.parent);const n=e.structuredQuery,r=n.from?n.from.length:0;let i=null;if(r>0){w(1===r);const e=n.from[0];e.allDescendants?i=e.collectionId:t=t.child(e.collectionId)}let s=[];n.where&&(s=function(e){const t=function e(t){return void 0!==t.unaryFilter?function(e){switch(e.unaryFilter.op){case"IS_NAN":const t=Di(e.unaryFilter.field);return Ht.create(t,"==",{doubleValue:NaN});case"IS_NULL":const n=Di(e.unaryFilter.field);return Ht.create(n,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":const r=Di(e.unaryFilter.field);return Ht.create(r,"!=",{doubleValue:NaN});case"IS_NOT_NULL":const i=Di(e.unaryFilter.field);return Ht.create(i,"!=",{nullValue:"NULL_VALUE"});default:return v()}}(t):void 0!==t.fieldFilter?function(e){return Ht.create(Di(e.fieldFilter.field),function(e){switch(e){case"EQUAL":return"==";case"NOT_EQUAL":return"!=";case"GREATER_THAN":return">";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";default:return v()}}(e.fieldFilter.op),e.fieldFilter.value)}(t):void 0!==t.compositeFilter?function(t){return Qt.create(t.compositeFilter.filters.map(t=>e(t)),function(e){switch(e){case"AND":return"and";case"OR":return"or";default:return v()}}(t.compositeFilter.op))}(t):v()}(e);return t instanceof Qt&&Xt(t)?t.getFilters():[t]}(n.where));let o=[];n.orderBy&&(o=n.orderBy.map(e=>function(e){return new Kt(Di(e.field),function(e){switch(e){case"ASCENDING":return"asc";case"DESCENDING":return"desc";default:return}}(e.direction))}(e)));let a=null;n.limit&&(a=function(e){let t;return t="object"==typeof e?e.value:e,we(t)?null:t}(n.limit));let c=null;n.startAt&&(c=function(e){const t=!!e.before,n=e.values||[];return new Bt(n,t)}(n.startAt));let u=null;return n.endAt&&(u=function(e){const t=!e.before,n=e.values||[];return new Bt(n,t)}(n.endAt)),In(t,i,o,s,a,"F",c,u)}function ki(e){return ni[e]}function Ci(e){return ri[e]}function Ai(e){return ii[e]}function Ni(e){return{fieldPath:e.canonicalString()}}function Di(e){return G.fromServerFormat(e.fieldPath)}function Oi(e){const t=[];return e.fields.forEach(e=>t.push(e.canonicalString())),{fieldPaths:t}}function Ri(e){return e.length>=4&&"projects"===e.get(0)&&"databases"===e.get(2)} /** * @license * Copyright 2017 Google LLC @@ -2854,7 +2935,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class yi{constructor(){this.changes=new gi(e=>e.toString(),(e,t)=>e.isEqual(t)),this.changesApplied=!1}getReadTime(e){const t=this.changes.get(e);return t?t.readTime:q.min()}addEntry(e,t){this.assertNotApplied(),this.changes.set(e.key,{document:e,readTime:t})}removeEntry(e,t=null){this.assertNotApplied(),this.changes.set(e,{document:Te.newInvalidDocument(e),readTime:t})}getEntry(e,t){this.assertNotApplied();const n=this.changes.get(t);return void 0!==n?gr.resolve(n.document):this.getFromCache(e,t)}getEntries(e,t){return this.getAllFromCache(e,t)}apply(e){return this.assertNotApplied(),this.changesApplied=!0,this.applyChanges(e)}assertNotApplied(){}} + */class xi{constructor(e,t,n,r,i=U.min(),s=U.min(),o=ut.EMPTY_BYTE_STRING,a=null){this.target=e,this.targetId=t,this.purpose=n,this.sequenceNumber=r,this.snapshotVersion=i,this.lastLimboFreeSnapshotVersion=s,this.resumeToken=o,this.expectedCount=a}withSequenceNumber(e){return new xi(this.target,this.targetId,this.purpose,e,this.snapshotVersion,this.lastLimboFreeSnapshotVersion,this.resumeToken,this.expectedCount)}withResumeToken(e,t){return new xi(this.target,this.targetId,this.purpose,this.sequenceNumber,t,this.lastLimboFreeSnapshotVersion,e,null)}withExpectedCount(e){return new xi(this.target,this.targetId,this.purpose,this.sequenceNumber,this.snapshotVersion,this.lastLimboFreeSnapshotVersion,this.resumeToken,e)}withLastLimboFreeSnapshotVersion(e){return new xi(this.target,this.targetId,this.purpose,this.sequenceNumber,this.snapshotVersion,e,this.resumeToken,this.expectedCount)}} /** * @license * Copyright 2017 Google LLC @@ -2870,7 +2951,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class vi{constructor(e,t){this.k=e,this.Jt=t}addEntry(e,t,n){return Ii(e).put(_i(t),n)}removeEntry(e,t){const n=Ii(e),r=_i(t);return n.delete(r)}updateMetadata(e,t){return this.getMetadata(e).next(n=>(n.byteSize+=t,this.Re(e,n)))}getEntry(e,t){return Ii(e).get(_i(t)).next(e=>this.Pe(t,e))}be(e,t){return Ii(e).get(_i(t)).next(e=>({document:this.Pe(t,e),size:Xr(e)}))}getEntries(e,t){let n=Jt();return this.ve(e,t,(e,t)=>{const r=this.Pe(e,t);n=n.insert(e,r)}).next(()=>n)}Ve(e,t){let n=Jt(),r=new Kt(ae.comparator);return this.ve(e,t,(e,t)=>{const i=this.Pe(e,t);n=n.insert(e,i),r=r.insert(e,Xr(t))}).next(()=>({documents:n,Se:r}))}ve(e,t,n){if(t.isEmpty())return gr.resolve();const r=IDBKeyRange.bound(t.first().path.toArray(),t.last().path.toArray()),i=t.getIterator();let s=i.getNext();return Ii(e).jt({range:r},(e,t,r)=>{const o=ae.fromSegments(e);for(;s&&ae.comparator(s,o)<0;)n(s,null),s=i.getNext();s&&s.isEqual(o)&&(n(s,t),s=i.hasNext()?i.getNext():null),s?r.Lt(s.path.toArray()):r.done()}).next(()=>{for(;s;)n(s,null),s=i.hasNext()?i.getNext():null})}getDocumentsMatchingQuery(e,t,n){let r=Jt();const i=t.path.length+1,s={};if(n.isEqual(q.min())){const e=t.path.toArray();s.range=IDBKeyRange.lowerBound(e)}else{const e=t.path.toArray(),r=Lr(n);s.range=IDBKeyRange.lowerBound([e,r],!0),s.index=ir.collectionReadTimeIndex}return Ii(e).jt(s,(e,n,s)=>{if(e.length!==i)return;const o=Rr(this.k,n);t.path.isPrefixOf(o.key.path)?it(t,o)&&(r=r.insert(o.key,o)):s.done()}).next(()=>r)}newChangeBuffer(e){return new wi(this,!!e&&e.trackRemovals)}getSize(e){return this.getMetadata(e).next(e=>e.byteSize)}getMetadata(e){return bi(e).get(sr.key).next(e=>(w(!!e),e))}Re(e,t){return bi(e).put(sr.key,t)}Pe(e,t){if(t){const e=Rr(this.k,t);if(!e.isNoDocument()||!e.version.isEqual(q.min()))return e}return Te.newInvalidDocument(e)}}class wi extends yi{constructor(e,t){super(),this.De=e,this.trackRemovals=t,this.Ce=new gi(e=>e.toString(),(e,t)=>e.isEqual(t))}applyChanges(e){const t=[];let n=0,r=new Ht((e,t)=>F(e.canonicalString(),t.canonicalString()));return this.changes.forEach((i,s)=>{const o=this.Ce.get(i);if(s.document.isValidDocument()){const a=Pr(this.De.k,s.document,this.getReadTime(i));r=r.add(i.path.popLast());const c=Xr(a);n+=c-o,t.push(this.De.addEntry(e,i,a))}else if(n-=o,this.trackRemovals){const n=Pr(this.De.k,Te.newNoDocument(i,q.min()),this.getReadTime(i));t.push(this.De.addEntry(e,i,n))}else t.push(this.De.removeEntry(e,i))}),r.forEach(n=>{t.push(this.De.Jt.addToCollectionParentIndex(e,n))}),t.push(this.De.updateMetadata(e,n)),gr.waitFor(t)}getFromCache(e,t){return this.De.be(e,t).next(e=>(this.Ce.set(t,e.size),e.document))}getAllFromCache(e,t){return this.De.Ve(e,t).next(({documents:e,Se:t})=>(t.forEach((e,t)=>{this.Ce.set(e,t)}),e))}}function bi(e){return Ar(e,sr.store)}function Ii(e){return Ar(e,ir.store)}function _i(e){return e.path.toArray()} + */class Pi{constructor(e){this.fe=e}}function Li(e,t){const n=t.key,r={prefixPath:n.getCollectionPath().popLast().toArray(),collectionGroup:n.collectionGroup,documentId:n.path.lastSegment(),readTime:Mi(t.readTime),hasCommittedMutations:t.hasCommittedMutations};if(t.isFoundDocument())r.document=function(e,t){return{name:fi(e,t.key),fields:t.data.value.mapValue.fields,updateTime:ai(e,t.version.toTimestamp()),createTime:ai(e,t.createTime.toTimestamp())}}(e.fe,t);else if(t.isNoDocument())r.noDocument={path:n.path.toArray(),readTime:Fi(t.version)};else{if(!t.isUnknownDocument())return v();r.unknownDocument={path:n.path.toArray(),version:Fi(t.version)}}return r}function Mi(e){const t=e.toTimestamp();return[t.seconds,t.nanoseconds]}function Fi(e){const t=e.toTimestamp();return{seconds:t.seconds,nanoseconds:t.nanoseconds}}function Vi(e){const t=new j(e.seconds,e.nanoseconds);return U.fromTimestamp(t)}function ji(e,t){const n=(t.baseMutations||[]).map(t=>_i(e.fe,t));for(let e=0;e_i(e.fe,t)),i=j.fromMillis(t.localWriteTimeMs);return new Dr(t.batchId,i,n,r)}function Ui(e){const t=Vi(e.readTime),n=void 0!==e.lastLimboFreeSnapshotVersion?Vi(e.lastLimboFreeSnapshotVersion):U.min();let r;var i;return void 0!==e.query.documents?(w(1===(i=e.query).documents.length),r=An(_n(mi(i.documents[0])))):r=function(e){return An(Si(e))}(e.query),new xi(r,e.targetId,"TargetPurposeListen",e.lastListenSequenceNumber,t,n,ut.fromBase64String(e.resumeToken))}function qi(e,t){const n=Fi(t.snapshotVersion),r=Fi(t.lastLimboFreeSnapshotVersion);let i;i=mn(t.target)?Ti(e.fe,t.target):Ei(e.fe,t.target);const s=t.resumeToken.toBase64();return{targetId:t.targetId,canonicalId:pn(t.target),readTime:n,resumeToken:s,lastListenSequenceNumber:t.sequenceNumber,lastLimboFreeSnapshotVersion:r,query:i}}function Bi(e){const t=Si({parent:e.parent,structuredQuery:e.structuredQuery});return"LAST"===e.limitType?Dn(t,t.limit,"L"):t}function zi(e,t){return new Rr(t.largestBatchId,_i(e.fe,t.overlayMutation))}function Gi(e,t){const n=t.path.lastSegment();return[e,_e(t.path.popLast()),n]}function Ki(e,t,n,r){return{indexId:e,uid:t.uid||"",sequenceNumber:n,readTime:Fi(r.readTime),documentKey:_e(r.documentKey.path),largestBatchId:r.largestBatchId}} /** * @license * Copyright 2020 Google LLC @@ -2886,10 +2967,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ti{constructor(e){this.k=e}Nt(e,t,n,r){w(n=0&&r<=11);const i=new yr("createOrUpgrade",t);n<1&&r>=1&&(function(e){e.createObjectStore(Xn.store)}(e),function(e){e.createObjectStore(Zn.store,{keyPath:Zn.keyPath}),e.createObjectStore(er.store,{keyPath:er.keyPath,autoIncrement:!0}).createIndex(er.userMutationsIndex,er.userMutationsKeyPath,{unique:!0}),e.createObjectStore(tr.store)}(e),Ei(e),function(e){e.createObjectStore(ir.store)}(e));let s=gr.resolve();return n<3&&r>=3&&(0!==n&&(function(e){e.deleteObjectStore(ar.store),e.deleteObjectStore(or.store),e.deleteObjectStore(cr.store)}(e),Ei(e)),s=s.next(()=>function(e){const t=e.store(cr.store),n=new cr(0,0,q.min().toTimestamp(),0);return t.put(cr.key,n)}(i))),n<4&&r>=4&&(0!==n&&(s=s.next(()=>function(e,t){return t.store(er.store).Bt().next(n=>{e.deleteObjectStore(er.store),e.createObjectStore(er.store,{keyPath:er.keyPath,autoIncrement:!0}).createIndex(er.userMutationsIndex,er.userMutationsKeyPath,{unique:!0});const r=t.store(er.store),i=n.map(e=>r.put(e));return gr.waitFor(i)})}(e,i))),s=s.next(()=>{!function(e){e.createObjectStore(hr.store,{keyPath:hr.keyPath})}(e)})),n<5&&r>=5&&(s=s.next(()=>this.Ne(i))),n<6&&r>=6&&(s=s.next(()=>(function(e){e.createObjectStore(sr.store)}(e),this.ke(i)))),n<7&&r>=7&&(s=s.next(()=>this.xe(i))),n<8&&r>=8&&(s=s.next(()=>this.$e(e,i))),n<9&&r>=9&&(s=s.next(()=>{!function(e){e.objectStoreNames.contains("remoteDocumentChanges")&&e.deleteObjectStore("remoteDocumentChanges")}(e),function(e){const t=e.objectStore(ir.store);t.createIndex(ir.readTimeIndex,ir.readTimeIndexPath,{unique:!1}),t.createIndex(ir.collectionReadTimeIndex,ir.collectionReadTimeIndexPath,{unique:!1})}(t)})),n<10&&r>=10&&(s=s.next(()=>this.Fe(i))),n<11&&r>=11&&(s=s.next(()=>{!function(e){e.createObjectStore(lr.store,{keyPath:lr.keyPath})}(e),function(e){e.createObjectStore(dr.store,{keyPath:dr.keyPath})} + */class $i{getBundleMetadata(e,t){return Wi(e).get(t).next(e=>{if(e)return{id:(t=e).bundleId,createTime:Vi(t.createTime),version:t.version};var t})}saveBundleMetadata(e,t){return Wi(e).put({bundleId:(n=t).id,createTime:Fi(li(n.createTime)),version:n.version});var n}getNamedQuery(e,t){return Hi(e).get(t).next(e=>{if(e)return{name:(t=e).name,query:Bi(t.bundledQuery),readTime:Vi(t.readTime)};var t})}saveNamedQuery(e,t){return Hi(e).put(function(e){return{name:e.name,readTime:Fi(li(e.readTime)),bundledQuery:e.bundledQuery}}(t))}}function Wi(e){return Ye(e,"bundles")}function Hi(e){return Ye(e,"namedQueries")} /** * @license - * Copyright 2017 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2902,10 +2983,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e)})),s}ke(e){let t=0;return e.store(ir.store).jt((e,n)=>{t+=Xr(n)}).next(()=>{const n=new sr(t);return e.store(sr.store).put(sr.key,n)})}Ne(e){const t=e.store(Zn.store),n=e.store(er.store);return t.Bt().next(t=>gr.forEach(t,t=>{const r=IDBKeyRange.bound([t.userId,-1],[t.userId,t.lastAcknowledgedBatchId]);return n.Bt(er.userMutationsIndex,r).next(n=>gr.forEach(n,n=>{w(n.userId===t.userId);const r=jr(this.k,n);return Yr(e,t.userId,r).next(()=>{})}))}))}xe(e){const t=e.store(ar.store),n=e.store(ir.store);return e.store(cr.store).get(cr.key).next(e=>{const r=[];return n.jt((n,i)=>{const s=new G(n),o=function(e){return[0,Hn(e)]}(s);r.push(t.get(o).next(n=>n?gr.resolve():(n=>t.put(new ar(0,Hn(n),e.highestListenSequenceNumber)))(s)))}).next(()=>gr.waitFor(r))})}$e(e,t){e.createObjectStore(ur.store,{keyPath:ur.keyPath});const n=t.store(ur.store),r=new Gr,i=e=>{if(r.add(e)){const t=e.lastSegment(),r=e.popLast();return n.put({collectionId:t,parent:Hn(r)})}};return t.store(ir.store).jt({Kt:!0},(e,t)=>{const n=new G(e);return i(n.popLast())}).next(()=>t.store(tr.store).jt({Kt:!0},([e,t,n],r)=>{const s=Jn(t);return i(s.popLast())}))}Fe(e){const t=e.store(or.store);return t.jt((e,n)=>{const r=Ur(n),i=Vr(this.k,r);return t.put(i)})}}function Ei(e){e.createObjectStore(ar.store,{keyPath:ar.keyPath}).createIndex(ar.documentTargetsIndex,ar.documentTargetsKeyPath,{unique:!0}),e.createObjectStore(or.store,{keyPath:or.keyPath}).createIndex(or.queryTargetsIndexName,or.queryTargetsKeyPath,{unique:!0}),e.createObjectStore(cr.store)}const ki="Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time.";class Si{constructor(e,t,n,r,i,s,o,a,c,u){if(this.allowTabSynchronization=e,this.persistenceKey=t,this.clientId=n,this.Oe=i,this.window=s,this.document=o,this.Me=c,this.Le=u,this.Be=null,this.Ue=!1,this.isPrimary=!1,this.networkEnabled=!0,this.qe=null,this.inForeground=!1,this.Ke=null,this.je=null,this.Qe=Number.NEGATIVE_INFINITY,this.We=e=>Promise.resolve(),!Si.bt())throw new T(_.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new pi(this,r),this.Ge=t+"main",this.k=new Dr(a),this.ze=new vr(this.Ge,11,new Ti(this.k)),this.He=new si(this.referenceDelegate,this.k),this.Jt=new Hr,this.Je=function(e,t){return new vi(e,t)}(this.k,this.Jt),this.Ye=new Br,this.window&&this.window.localStorage?this.Xe=this.window.localStorage:(this.Xe=null,!1===u&&m("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}start(){return this.Ze().then(()=>{if(!this.isPrimary&&!this.allowTabSynchronization)throw new T(_.FAILED_PRECONDITION,ki);return this.tn(),this.en(),this.nn(),this.runTransaction("getHighestListenSequenceNumber","readonly",e=>this.He.getHighestSequenceNumber(e))}).then(e=>{this.Be=new L(e,this.Me)}).then(()=>{this.Ue=!0}).catch(e=>(this.ze&&this.ze.close(),Promise.reject(e)))}sn(e){return this.We=async t=>{if(this.started)return e(t)},e(this.isPrimary)}setDatabaseDeletedListener(e){this.ze.xt(async t=>{null===t.newVersion&&await e()})}setNetworkEnabled(e){this.networkEnabled!==e&&(this.networkEnabled=e,this.Oe.enqueueAndForget(async()=>{this.started&&await this.Ze()}))}Ze(){return this.runTransaction("updateClientMetadataAndTryBecomePrimary","readwrite",e=>Ni(e).put(new hr(this.clientId,Date.now(),this.networkEnabled,this.inForeground)).next(()=>{if(this.isPrimary)return this.rn(e).next(e=>{e||(this.isPrimary=!1,this.Oe.enqueueRetryable(()=>this.We(!1)))})}).next(()=>this.on(e)).next(t=>this.isPrimary&&!t?this.an(e).next(()=>!1):!!t&&this.cn(e).next(()=>!0))).catch(e=>{if(Ir(e))return p("IndexedDbPersistence","Failed to extend owner lease: ",e),this.isPrimary;if(!this.allowTabSynchronization)throw e;return p("IndexedDbPersistence","Releasing owner lease after error during lease refresh",e),!1}).then(e=>{this.isPrimary!==e&&this.Oe.enqueueRetryable(()=>this.We(e)),this.isPrimary=e})}rn(e){return Ai(e).get(Xn.key).next(e=>gr.resolve(this.un(e)))}hn(e){return Ni(e).delete(this.clientId)}async ln(){if(this.isPrimary&&!this.fn(this.Qe,18e5)){this.Qe=Date.now();const e=await this.runTransaction("maybeGarbageCollectMultiClientState","readwrite-primary",e=>{const t=Ar(e,hr.store);return t.Bt().next(e=>{const n=this.dn(e,18e5),r=e.filter(e=>-1===n.indexOf(e));return gr.forEach(r,e=>t.delete(e.clientId)).next(()=>r)})}).catch(()=>[]);if(this.Xe)for(const t of e)this.Xe.removeItem(this.wn(t.clientId))}}nn(){this.je=this.Oe.enqueueAfterDelay("client_metadata_refresh",4e3,()=>this.Ze().then(()=>this.ln()).then(()=>this.nn()))}un(e){return!!e&&e.ownerId===this.clientId}on(e){return this.Le?gr.resolve(!0):Ai(e).get(Xn.key).next(t=>{if(null!==t&&this.fn(t.leaseTimestampMs,5e3)&&!this._n(t.ownerId)){if(this.un(t)&&this.networkEnabled)return!0;if(!this.un(t)){if(!t.allowTabSynchronization)throw new T(_.FAILED_PRECONDITION,ki);return!1}}return!(!this.networkEnabled||!this.inForeground)||Ni(e).Bt().next(e=>void 0===this.dn(e,5e3).find(e=>{if(this.clientId!==e.clientId){const t=!this.networkEnabled&&e.networkEnabled,n=!this.inForeground&&e.inForeground,r=this.networkEnabled===e.networkEnabled;if(t||n&&r)return!0}return!1}))}).next(e=>(this.isPrimary!==e&&p("IndexedDbPersistence",`Client ${e?"is":"is not"} eligible for a primary lease.`),e))}async shutdown(){this.Ue=!1,this.mn(),this.je&&(this.je.cancel(),this.je=null),this.gn(),this.yn(),await this.ze.runTransaction("shutdown","readwrite",[Xn.store,hr.store],e=>{const t=new Sr(e,L.I);return this.an(t).next(()=>this.hn(t))}),this.ze.close(),this.pn()}dn(e,t){return e.filter(e=>this.fn(e.updateTimeMs,t)&&!this._n(e.clientId))}Tn(){return this.runTransaction("getActiveClients","readonly",e=>Ni(e).Bt().next(e=>this.dn(e,18e5).map(e=>e.clientId)))}get started(){return this.Ue}getMutationQueue(e){return Zr.Xt(e,this.k,this.Jt,this.referenceDelegate)}getTargetCache(){return this.He}getRemoteDocumentCache(){return this.Je}getIndexManager(){return this.Jt}getBundleCache(){return this.Ye}runTransaction(e,t,n){p("IndexedDbPersistence","Starting transaction:",e);const r="readonly"===t?"readonly":"readwrite";let i;return this.ze.runTransaction(e,r,fr,r=>(i=new Sr(r,this.Be?this.Be.next():L.I),"readwrite-primary"===t?this.rn(i).next(e=>!!e||this.on(i)).next(t=>{if(!t)throw m(`Failed to obtain primary lease for action '${e}'.`),this.isPrimary=!1,this.Oe.enqueueRetryable(()=>this.We(!1)),new T(_.FAILED_PRECONDITION,pr);return n(i)}).next(e=>this.cn(i).next(()=>e)):this.En(i).next(()=>n(i)))).then(e=>(i.raiseOnCommittedEvent(),e))}En(e){return Ai(e).get(Xn.key).next(e=>{if(null!==e&&this.fn(e.leaseTimestampMs,5e3)&&!this._n(e.ownerId)&&!this.un(e)&&!(this.Le||this.allowTabSynchronization&&e.allowTabSynchronization))throw new T(_.FAILED_PRECONDITION,ki)})}cn(e){const t=new Xn(this.clientId,this.allowTabSynchronization,Date.now());return Ai(e).put(Xn.key,t)}static bt(){return vr.bt()}an(e){const t=Ai(e);return t.get(Xn.key).next(e=>this.un(e)?(p("IndexedDbPersistence","Releasing primary lease."),t.delete(Xn.key)):gr.resolve())}fn(e,t){const n=Date.now();return!(en&&(m(`Detected an update time that is in the future: ${e} > ${n}`),1))}tn(){null!==this.document&&"function"==typeof this.document.addEventListener&&(this.Ke=()=>{this.Oe.enqueueAndForget(()=>(this.inForeground="visible"===this.document.visibilityState,this.Ze()))},this.document.addEventListener("visibilitychange",this.Ke),this.inForeground="visible"===this.document.visibilityState)}gn(){this.Ke&&(this.document.removeEventListener("visibilitychange",this.Ke),this.Ke=null)}en(){var e;"function"==typeof(null===(e=this.window)||void 0===e?void 0:e.addEventListener)&&(this.qe=()=>{this.mn(),Object(o.v)()&&navigator.appVersion.match(/Version\/1[45]/)&&this.Oe.enterRestrictedMode(!0),this.Oe.enqueueAndForget(()=>this.shutdown())},this.window.addEventListener("pagehide",this.qe))}yn(){this.qe&&(this.window.removeEventListener("pagehide",this.qe),this.qe=null)}_n(e){var t;try{const n=null!==(null===(t=this.Xe)||void 0===t?void 0:t.getItem(this.wn(e)));return p("IndexedDbPersistence",`Client '${e}' ${n?"is":"is not"} zombied in LocalStorage`),n}catch(e){return m("IndexedDbPersistence","Failed to get zombied client id.",e),!1}}mn(){if(this.Xe)try{this.Xe.setItem(this.wn(this.clientId),String(Date.now()))}catch(e){m("Failed to set zombie client id.",e)}}pn(){if(this.Xe)try{this.Xe.removeItem(this.wn(this.clientId))}catch(e){}}wn(e){return`firestore_zombie_${this.persistenceKey}_${e}`}}function Ai(e){return Ar(e,Xn.store)}function Ni(e){return Ar(e,hr.store)}function Oi(e,t){let n=e.projectId;return e.isDefaultDatabase||(n+="."+e.database),"firestore/"+t+"/"+n+"/" + */class Qi{constructor(e,t){this.serializer=e,this.userId=t}static de(e,t){const n=t.uid||"";return new Qi(e,n)}getOverlay(e,t){return Yi(e).get(Gi(this.userId,t)).next(e=>e?zi(this.serializer,e):null)}getOverlays(e,t){const n=Gn();return oe.forEach(t,t=>this.getOverlay(e,t).next(e=>{null!==e&&n.set(t,e)})).next(()=>n)}saveOverlays(e,t,n){const r=[];return n.forEach((n,i)=>{const s=new Rr(t,i);r.push(this.we(e,s))}),oe.waitFor(r)}removeOverlaysForBatchId(e,t,n){const r=new Set;t.forEach(e=>r.add(_e(e.getCollectionPath())));const i=[];return r.forEach(t=>{const r=IDBKeyRange.bound([this.userId,t,n],[this.userId,t,n+1],!1,!0);i.push(Yi(e).J("collectionPathOverlayIndex",r))}),oe.waitFor(i)}getOverlaysForCollection(e,t,n){const r=Gn(),i=_e(t),s=IDBKeyRange.bound([this.userId,i,n],[this.userId,i,Number.POSITIVE_INFINITY],!0);return Yi(e).j("collectionPathOverlayIndex",s).next(e=>{for(const t of e){const e=zi(this.serializer,t);r.set(e.getKey(),e)}return r})}getOverlaysForCollectionGroup(e,t,n,r){const i=Gn();let s;const o=IDBKeyRange.bound([this.userId,t,n],[this.userId,t,Number.POSITIVE_INFINITY],!0);return Yi(e).X({index:"collectionGroupOverlayIndex",range:o},(e,t,n)=>{const o=zi(this.serializer,t);i.size()i)}we(e,t){return Yi(e).put(function(e,t,n){const[r,i,s]=Gi(t,n.mutation.key);return{userId:t,collectionPath:i,documentId:s,collectionGroup:n.mutation.key.getCollectionGroup(),largestBatchId:n.largestBatchId,overlayMutation:Ii(e.fe,n.mutation)}}(this.serializer,this.userId,t))}}function Yi(e){return Ye(e,"documentOverlays")} /** * @license - * Copyright 2020 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2918,10 +2999,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */}class Ci{constructor(e,t){this.progress=e,this.In=t}} + */class Ji{constructor(){}_e(e,t){this.me(e,t),t.ge()}me(e,t){if("nullValue"in e)this.ye(t,5);else if("booleanValue"in e)this.ye(t,10),t.pe(e.booleanValue?1:0);else if("integerValue"in e)this.ye(t,15),t.pe(dt(e.integerValue));else if("doubleValue"in e){const n=dt(e.doubleValue);isNaN(n)?this.ye(t,13):(this.ye(t,15),be(n)?t.pe(0):t.pe(n))}else if("timestampValue"in e){const n=e.timestampValue;this.ye(t,20),"string"==typeof n?t.Ie(n):(t.Ie(""+(n.seconds||"")),t.pe(n.nanos||0))}else if("stringValue"in e)this.Te(e.stringValue,t),this.Ee(t);else if("bytesValue"in e)this.ye(t,30),t.Ae(ft(e.bytesValue)),this.Ee(t);else if("referenceValue"in e)this.ve(e.referenceValue,t);else if("geoPointValue"in e){const n=e.geoPointValue;this.ye(t,45),t.pe(n.latitude||0),t.pe(n.longitude||0)}else"mapValue"in e?Pt(e)?this.ye(t,Number.MAX_SAFE_INTEGER):(this.Re(e.mapValue,t),this.Ee(t)):"arrayValue"in e?(this.Pe(e.arrayValue,t),this.Ee(t)):v()}Te(e,t){this.ye(t,25),this.be(e,t)}be(e,t){t.Ie(e)}Re(e,t){const n=e.fields||{};this.ye(t,55);for(const e of Object.keys(n))this.Te(e,t),this.me(n[e],t)}Pe(e,t){const n=e.values||[];this.ye(t,50);for(const e of n)this.me(e,t)}ve(e,t){this.ye(t,37),K.fromName(e).path.forEach(e=>{this.ye(t,60),this.be(e,t)})}ye(e,t){e.pe(t)}Ee(e){e.pe(2)}}function Xi(e){if(0===e)return 8;let t=0;return e>>4==0&&(t+=4,e<<=4),e>>6==0&&(t+=2,e<<=2),e>>7==0&&(t+=1),t}function Zi(e){const t=64-function(e){let t=0;for(let n=0;n<8;++n){const r=Xi(255&e[n]);if(t+=r,8!==r)break}return t}(e);return Math.ceil(t/8)}Ji.Ve=new Ji;class es{constructor(){this.buffer=new Uint8Array(1024),this.position=0}Se(e){const t=e[Symbol.iterator]();let n=t.next();for(;!n.done;)this.De(n.value),n=t.next();this.Ce()}xe(e){const t=e[Symbol.iterator]();let n=t.next();for(;!n.done;)this.Ne(n.value),n=t.next();this.ke()}Me(e){for(const t of e){const e=t.charCodeAt(0);if(e<128)this.De(e);else if(e<2048)this.De(960|e>>>6),this.De(128|63&e);else if(t<"\ud800"||"\udbff">>12),this.De(128|63&e>>>6),this.De(128|63&e);else{const e=t.codePointAt(0);this.De(240|e>>>18),this.De(128|63&e>>>12),this.De(128|63&e>>>6),this.De(128|63&e)}}this.Ce()}$e(e){for(const t of e){const e=t.charCodeAt(0);if(e<128)this.Ne(e);else if(e<2048)this.Ne(960|e>>>6),this.Ne(128|63&e);else if(t<"\ud800"||"\udbff">>12),this.Ne(128|63&e>>>6),this.Ne(128|63&e);else{const e=t.codePointAt(0);this.Ne(240|e>>>18),this.Ne(128|63&e>>>12),this.Ne(128|63&e>>>6),this.Ne(128|63&e)}}this.ke()}Oe(e){const t=this.Fe(e),n=Zi(t);this.Be(1+n),this.buffer[this.position++]=255&n;for(let e=t.length-n;ethis.Pn(e,t,n))}Pn(e,t,n){return this.Je.getEntry(e,t).next(e=>{for(const t of n)t.applyToLocalView(e);return e})}bn(e,t){e.forEach((e,n)=>{for(const e of t)e.applyToLocalView(n)})}vn(e,t){return this.Je.getEntries(e,t).next(t=>this.Vn(e,t).next(()=>t))}Vn(e,t){return this.An.getAllMutationBatchesAffectingDocumentKeys(e,t).next(e=>this.bn(t,e))}getDocumentsMatchingQuery(e,t,n){return function(e){return ae.isDocumentKey(e.path)&&null===e.collectionGroup&&0===e.filters.length}(t)?this.Sn(e,t.path):Ye(t)?this.Dn(e,t,n):this.Cn(e,t,n)}Sn(e,t){return this.Rn(e,new ae(t)).next(e=>{let t=Xt();return e.isFoundDocument()&&(t=t.insert(e.key,e)),t})}Dn(e,t,n){const r=t.collectionGroup;let i=Xt();return this.Jt.getCollectionParents(e,r).next(s=>gr.forEach(s,s=>{const o=function(e,t){return new Ke(t,null,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,e.startAt,e.endAt)}(t,s.child(r));return this.Cn(e,o,n).next(e=>{e.forEach((e,t)=>{i=i.insert(e,t)})})}).next(()=>i))}Cn(e,t,n){let r,i;return this.Je.getDocumentsMatchingQuery(e,t,n).next(n=>(r=n,this.An.getAllMutationBatchesAffectingQuery(e,t))).next(t=>(i=t,this.Nn(e,i,r).next(e=>{r=e;for(const e of i)for(const t of e.mutations){const n=t.key;let i=r.get(n);null==i&&(i=Te.newInvalidDocument(n),r=r.insert(n,i)),Nt(t,i,e.localWriteTime),i.isFoundDocument()||(r=r.remove(n))}}))).next(()=>(r.forEach((e,n)=>{it(t,n)||(r=r.remove(e))}),r))}Nn(e,t,n){let r=nn();for(const e of t)for(const t of e.mutations)t instanceof Pt&&null===n.get(t.key)&&(r=r.add(t.key));let i=n;return this.Je.getEntries(e,r).next(e=>(e.forEach((e,t)=>{t.isFoundDocument()&&(i=i.insert(e,t))}),i))}} + */class is{constructor(e,t,n,r){this.indexId=e,this.documentKey=t,this.arrayValue=n,this.directionalValue=r}Je(){const e=this.directionalValue.length,t=0===e||255===this.directionalValue[e-1]?e+1:e,n=new Uint8Array(t);return n.set(this.directionalValue,0),t!==e?n.set([0],this.directionalValue.length):++n[n.length-1],new is(this.indexId,this.documentKey,this.arrayValue,n)}}function ss(e,t){let n=e.indexId-t.indexId;return 0!==n?n:(n=os(e.arrayValue,t.arrayValue),0!==n?n:(n=os(e.directionalValue,t.directionalValue),0!==n?n:K.comparator(e.documentKey,t.documentKey)))}function os(e,t){for(let n=0;n=this.Ye.length||!this.sn(this.Ye[s++],e))return!1}return!0}en(e){for(const t of this.Xe)if(this.nn(t,e))return!0;return!1}nn(e,t){if(void 0===e||!e.field.isEqual(t.fieldPath))return!1;const n="array-contains"===e.op||"array-contains-any"===e.op;return 2===t.kind===n}sn(e,t){return!!e.field.isEqual(t.fieldPath)&&(0===t.kind&&"asc"===e.dir||1===t.kind&&"desc"===e.dir)}} /** * @license - * Copyright 2019 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2966,10 +3047,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Pi{Fn(e){this.On=e}getDocumentsMatchingQuery(e,t,n,r){return function(e){return 0===e.filters.length&&null===e.limit&&null==e.startAt&&null==e.endAt&&(0===e.explicitOrderBy.length||1===e.explicitOrderBy.length&&e.explicitOrderBy[0].field.isKeyField())}(t)||n.isEqual(q.min())?this.Mn(e,t):this.On.vn(e,r).next(i=>{const o=this.Ln(t,i);return(He(t)||$e(t))&&this.Bn(t.limitType,o,r,n)?this.Mn(e,t):(d()<=s.a.DEBUG&&p("QueryEngine","Re-using previous result from %s to execute query: %s",n.toString(),rt(t)),this.On.getDocumentsMatchingQuery(e,t,n).next(e=>(o.forEach(t=>{e=e.insert(t.key,t)}),e)))})}Ln(e,t){let n=new Ht(st(e));return t.forEach((t,r)=>{it(e,r)&&(n=n.add(r))}),n}Bn(e,t,n,r){if(n.size!==t.size)return!0;const i="F"===e?t.last():t.first();return!!i&&(i.hasPendingWrites||i.version.compareTo(r)>0)}Mn(e,t){return d()<=s.a.DEBUG&&p("QueryEngine","Using full collection scan to execute query:",rt(t)),this.On.getDocumentsMatchingQuery(e,t,q.min())}} + */function cs(e){if(0===e.getFilters().length)return[];const t=function e(t){if(w(t instanceof Ht||t instanceof Qt),t instanceof Ht)return t;if(1===t.filters.length)return e(t.filters[0]);const n=t.filters.map(t=>e(t));let r=Qt.create(n,t.op);return r=ps(r),hs(r)?r:(w(r instanceof Qt),w(Yt(r)),w(r.filters.length>1),r.filters.reduce((e,t)=>ds(e,t)))}(function e(t){var n,r;if(w(t instanceof Ht||t instanceof Qt),t instanceof Ht){if(t instanceof un){const e=(null===(r=null===(n=t.value.arrayValue)||void 0===n?void 0:n.values)||void 0===r?void 0:r.map(e=>Ht.create(t.field,"==",e)))||[];return Qt.create(e,"or")}return t}const i=t.filters.map(t=>e(t));return Qt.create(i,t.op)}(e));return w(hs(t)),us(t)||ls(t)?[t]:t.getFilters()}function us(e){return e instanceof Ht}function ls(e){return e instanceof Qt&&Xt(e)}function hs(e){return us(e)||ls(e)||function(e){if(e instanceof Qt&&Jt(e)){for(const t of e.getFilters())if(!us(t)&&!ls(t))return!1;return!0}return!1}(e)}function ds(e,t){let n;return w(e instanceof Ht||e instanceof Qt),w(t instanceof Ht||t instanceof Qt),n=e instanceof Ht?t instanceof Ht?function(e,t){return Qt.create([e,t],"and")}(e,t):fs(e,t):t instanceof Ht?fs(t,e):function(e,t){if(w(e.filters.length>0&&t.filters.length>0),Yt(e)&&Yt(t))return tn(e,t.getFilters());const n=Jt(e)?e:t,r=Jt(e)?t:e,i=n.filters.map(e=>ds(e,r));return Qt.create(i,"or")}(e,t),ps(n)}function fs(e,t){if(Yt(t))return tn(t,e.getFilters());{const n=t.filters.map(t=>ds(e,t));return Qt.create(n,"or")}}function ps(e){if(w(e instanceof Ht||e instanceof Qt),e instanceof Ht)return e;const t=e.getFilters();if(1===t.length)return ps(t[0]);if(Zt(e))return e;const n=t.map(e=>ps(e)),r=[];return n.forEach(t=>{t instanceof Ht?r.push(t):t instanceof Qt&&(t.op===e.op?r.push(...t.filters):r.push(t))}),1===r.length?r[0]:Qt.create(r,e.op) /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2982,10 +3063,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Li{constructor(e,t,n,r){this.persistence=e,this.Un=t,this.k=r,this.qn=new Kt(F),this.Kn=new gi(e=>Se(e),Ae),this.jn=q.min(),this.An=e.getMutationQueue(n),this.Qn=e.getRemoteDocumentCache(),this.He=e.getTargetCache(),this.Wn=new Di(this.Qn,this.An,this.persistence.getIndexManager()),this.Ye=e.getBundleCache(),this.Un.Fn(this.Wn)}collectGarbage(e){return this.persistence.runTransaction("Collect garbage","readwrite-primary",t=>e.collect(t,this.qn))}}function xi(e,t,n,r){return new Li(e,t,n,r)}async function Mi(e,t){const n=I(e);let r=n.An,i=n.Wn;const s=await n.persistence.runTransaction("Handle user change","readonly",e=>{let s;return n.An.getAllMutationBatches(e).next(o=>(s=o,r=n.persistence.getMutationQueue(t),i=new Di(n.Qn,r,n.persistence.getIndexManager()),r.getAllMutationBatches(e))).next(t=>{const n=[],r=[];let o=nn();for(const e of s){n.push(e.batchId);for(const t of e.mutations)o=o.add(t.key)}for(const e of t){r.push(e.batchId);for(const t of e.mutations)o=o.add(t.key)}return i.vn(e,o).next(e=>({Gn:e,removedBatchIds:n,addedBatchIds:r}))})});return n.An=r,n.Wn=i,n.Un.Fn(n.Wn),s}function Fi(e){const t=I(e);return t.persistence.runTransaction("Get last remote snapshot version","readonly",e=>t.He.getLastRemoteSnapshotVersion(e))}function ji(e,t,n,r,i){let s=nn();return n.forEach(e=>s=s.add(e)),t.getEntries(e,s).next(e=>{let s=Jt();return n.forEach((n,o)=>{const a=e.get(n),c=(null==i?void 0:i.get(n))||r;o.isNoDocument()&&o.version.isEqual(q.min())?(t.removeEntry(n,c),s=s.insert(n,o)):!a.isValidDocument()||o.version.compareTo(a.version)>0||0===o.version.compareTo(a.version)&&a.hasPendingWrites?(t.addEntry(o,c),s=s.insert(n,o)):p("LocalStore","Ignoring outdated watch update for ",n,". Current version:",a.version," Watch version:",o.version)}),s})}function Ui(e,t){const n=I(e);return n.persistence.runTransaction("Get next mutation batch","readonly",e=>(void 0===t&&(t=-1),n.An.getNextMutationBatchAfterBatchId(e,t)))}function Vi(e,t){const n=I(e);return n.persistence.runTransaction("Allocate target","readwrite",e=>{let r;return n.He.getTargetData(e,t).next(i=>i?(r=i,gr.resolve(r)):n.He.allocateTargetId(e).next(i=>(r=new Cr(t,i,0,e.currentSequenceNumber),n.He.addTargetData(e,r).next(()=>r))))}).then(e=>{const r=n.qn.get(e.targetId);return(null===r||e.snapshotVersion.compareTo(r.snapshotVersion)>0)&&(n.qn=n.qn.insert(e.targetId,e),n.Kn.set(t,e.targetId)),e})}async function qi(e,t,n){const r=I(e),i=r.qn.get(t),s=n?"readwrite":"readwrite-primary";try{n||await r.persistence.runTransaction("Release target",s,e=>r.persistence.referenceDelegate.removeTarget(e,i))}catch(e){if(!Ir(e))throw e;p("LocalStore",`Failed to update sequence numbers for target ${t}: ${e}`)}r.qn=r.qn.remove(t),r.Kn.delete(i.target)}function Bi(e,t,n){const r=I(e);let i=q.min(),s=nn();return r.persistence.runTransaction("Execute query","readonly",e=>function(e,t,n){const r=I(e),i=r.Kn.get(n);return void 0!==i?gr.resolve(r.qn.get(i)):r.He.getTargetData(t,n)}(r,e,Ze(t)).next(t=>{if(t)return i=t.lastLimboFreeSnapshotVersion,r.He.getMatchingKeysForTargetId(e,t.targetId).next(e=>{s=e})}).next(()=>r.Un.getDocumentsMatchingQuery(e,t,n?i:q.min(),n?s:nn())).next(e=>({documents:e,zn:s})))}function zi(e,t){const n=I(e),r=I(n.He),i=n.qn.get(t);return i?Promise.resolve(i.target):n.persistence.runTransaction("Get target data","readonly",e=>r.Et(e,t).next(e=>e?e.target:null))}function Ki(e){const t=I(e);return t.persistence.runTransaction("Get new document changes","readonly",e=>function(e,t,n){const r=I(e);let i=Jt(),s=Lr(n);const o=Ii(t),a=IDBKeyRange.lowerBound(s,!0);return o.jt({index:ir.readTimeIndex,range:a},(e,t)=>{const n=Rr(r.k,t);i=i.insert(n.key,n),s=t.readTime}).next(()=>({In:i,readTime:xr(s)}))}(t.Qn,e,t.jn)).then(({In:e,readTime:n})=>(t.jn=n,e))}async function Wi(e,t,n=nn()){const r=await Vi(e,Ze(qr(t.bundledQuery))),i=I(e);return i.persistence.runTransaction("Save named query","readwrite",e=>{const s=In(t.readTime);if(r.snapshotVersion.compareTo(s)>=0)return i.Ye.saveNamedQuery(e,t);const o=r.withResumeToken(Y.EMPTY_BYTE_STRING,s);return i.qn=i.qn.insert(o.targetId,o),i.He.updateTargetData(e,o).next(()=>i.He.removeMatchingKeysForTargetId(e,r.targetId)).next(()=>i.He.addMatchingKeys(e,n,r.targetId)).next(()=>i.Ye.saveNamedQuery(e,t))})} + */}class gs{constructor(){this.rn=new ms}addToCollectionParentIndex(e,t){return this.rn.add(t),oe.resolve()}getCollectionParents(e,t){return oe.resolve(this.rn.getEntries(t))}addFieldIndex(e,t){return oe.resolve()}deleteFieldIndex(e,t){return oe.resolve()}getDocumentsMatchingTarget(e,t){return oe.resolve(null)}getIndexType(e,t){return oe.resolve(0)}getFieldIndexes(e,t){return oe.resolve([])}getNextCollectionGroupToUpdate(e){return oe.resolve(null)}getMinOffset(e,t){return oe.resolve(te.min())}getMinOffsetFromCollectionGroup(e,t){return oe.resolve(te.min())}updateCollectionGroup(e,t,n){return oe.resolve()}updateIndexEntries(e,t){return oe.resolve()}}class ms{constructor(){this.index={}}add(e){const t=e.lastSegment(),n=e.popLast(),r=this.index[t]||new rt(B.comparator),i=!r.has(n);return this.index[t]=r.add(n),i}has(e){const t=e.lastSegment(),n=e.popLast(),r=this.index[t];return r&&r.has(n)}getEntries(e){return(this.index[e]||new rt(B.comparator)).toArray()}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2998,10 +3079,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Gi{constructor(e){this.k=e,this.Xn=new Map,this.Zn=new Map}getBundleMetadata(e,t){return gr.resolve(this.Xn.get(t))}saveBundleMetadata(e,t){var n;return this.Xn.set(t.id,{id:(n=t).id,version:n.version,createTime:In(n.createTime)}),gr.resolve()}getNamedQuery(e,t){return gr.resolve(this.Zn.get(t))}saveNamedQuery(e,t){return this.Zn.set(t.name,function(e){return{name:e.name,query:qr(e.bundledQuery),readTime:In(e.readTime)}}(t)),gr.resolve()}} + */const ys=new Uint8Array(0);class vs{constructor(e,t){this.user=e,this.databaseId=t,this.on=new ms,this.un=new Vn(e=>pn(e),(e,t)=>gn(e,t)),this.uid=e.uid||""}addToCollectionParentIndex(e,t){if(!this.on.has(t)){const n=t.lastSegment(),r=t.popLast();e.addOnCommittedListener(()=>{this.on.add(t)});const i={collectionId:n,parent:_e(r)};return ws(e).put(i)}return oe.resolve()}getCollectionParents(e,t){const n=[],r=IDBKeyRange.bound([t,""],[V(t),""],!1,!0);return ws(e).j(r).next(e=>{for(const r of e){if(r.collectionId!==t)break;n.push(Se(r.parent))}return n})}addFieldIndex(e,t){const n=Is(e),r=function(e){return{indexId:e.indexId,collectionGroup:e.collectionGroup,fields:e.fields.map(e=>[e.fieldPath.canonicalString(),e.kind])}}(t);delete r.indexId;const i=n.add(r);if(t.indexState){const n=_s(e);return i.next(e=>{n.put(Ki(e,this.user,t.indexState.sequenceNumber,t.indexState.offset))})}return i.next()}deleteFieldIndex(e,t){const n=Is(e),r=_s(e),i=bs(e);return n.delete(t.indexId).next(()=>r.delete(IDBKeyRange.bound([t.indexId],[t.indexId+1],!1,!0))).next(()=>i.delete(IDBKeyRange.bound([t.indexId],[t.indexId+1],!1,!0)))}getDocumentsMatchingTarget(e,t){const n=bs(e);let r=!0;const i=new Map;return oe.forEach(this.cn(t),t=>this.an(e,t).next(e=>{r&&(r=!!e),i.set(t,e)})).next(()=>{if(r){let e=Qn();const r=[];return oe.forEach(i,(i,s)=>{var o;p("IndexedDbIndexManager",`Using index ${o=i,`id=${o.indexId}|cg=${o.collectionGroup}|f=${o.fields.map(e=>`${e.fieldPath}:${e.kind}`).join(",")}`} to execute ${pn(t)}`);const a=function(e,t){const n=W(t);if(void 0===n)return null;for(const t of yn(e,n.fieldPath))switch(t.op){case"array-contains-any":return t.value.arrayValue.values||[];case"array-contains":return[t.value]}return null}(s,i),c=function(e,t){const n=new Map;for(const r of H(t))for(const t of yn(e,r.fieldPath))switch(t.op){case"==":case"in":n.set(r.fieldPath.canonicalString(),t.value);break;case"not-in":case"!=":return n.set(r.fieldPath.canonicalString(),t.value),Array.from(n.values())}return null}(s,i),u=function(e,t){const n=[];let r=!0;for(const i of H(t)){const t=0===i.kind?vn(e,i.fieldPath,e.startAt):wn(e,i.fieldPath,e.startAt);n.push(t.value),r&&(r=t.inclusive)}return new Bt(n,r)}(s,i),l=function(e,t){const n=[];let r=!0;for(const i of H(t)){const t=0===i.kind?wn(e,i.fieldPath,e.endAt):vn(e,i.fieldPath,e.endAt);n.push(t.value),r&&(r=t.inclusive)}return new Bt(n,r)}(s,i),h=this.hn(i,s,u),d=this.hn(i,s,l),f=this.ln(i,s,c),g=this.fn(i.indexId,a,h,u.inclusive,d,l.inclusive,f);return oe.forEach(g,i=>n.H(i,t.limit).next(t=>{t.forEach(t=>{const n=K.fromSegments(t.documentKey);e.has(n)||(e=e.add(n),r.push(n))})}))}).next(()=>r)}return oe.resolve(null)})}cn(e){let t=this.un.get(e);return t||(t=0===e.filters.length?[e]:cs(Qt.create(e.filters,"and")).map(t=>fn(e.path,e.collectionGroup,e.orderBy,t.getFilters(),e.limit,e.startAt,e.endAt)),this.un.set(e,t),t)}fn(e,t,n,r,i,s,o){const a=(null!=t?t.length:1)*Math.max(n.length,i.length),c=a/(null!=t?t.length:1),u=[];for(let l=0;lthis.wn(e,a,t,!0));u.push(...this.createRange(h,d,f))}return u}wn(e,t,n,r){const i=new is(e,K.empty(),t,n);return r?i:i.Je()}_n(e,t,n,r){const i=new is(e,K.empty(),t,n);return r?i.Je():i}an(e,t){const n=new as(t),r=null!=t.collectionGroup?t.collectionGroup:t.path.lastSegment();return this.getFieldIndexes(e,r).next(e=>{let t=null;for(const r of e)n.tn(r)&&(!t||r.fields.length>t.fields.length)&&(t=r);return t})}getIndexType(e,t){let n=2;const r=this.cn(t);return oe.forEach(r,t=>this.an(e,t).next(e=>{e?0!==n&&e.fields.lengthfunction(e){return null!==e.limit}(t)&&r.length>1&&2===n?1:n)}mn(e,t){const n=new rs;for(const r of H(e)){const e=t.data.field(r.fieldPath);if(null==e)return null;const i=n.He(r.kind);Ji.Ve._e(e,i)}return n.Qe()}dn(e){const t=new rs;return Ji.Ve._e(e,t.He(0)),t.Qe()}gn(e,t){const n=new rs;return Ji.Ve._e(Ct(this.databaseId,t),n.He(function(e){const t=H(e);return 0===t.length?0:t[t.length-1].kind}(e))),n.Qe()}ln(e,t,n){if(null===n)return[];let r=[];r.push(new rs);let i=0;for(const s of H(e)){const e=n[i++];for(const n of r)if(this.yn(t,s.fieldPath)&&Nt(e))r=this.pn(r,s,e);else{const t=n.He(s.kind);Ji.Ve._e(e,t)}}return this.In(r)}hn(e,t,n){return this.ln(e,t,n.position)}In(e){const t=[];for(let n=0;ne instanceof Ht&&e.field.isEqual(t)&&("in"===e.op||"not-in"===e.op))}getFieldIndexes(e,t){const n=Is(e),r=_s(e);return(t?n.j("collectionGroupIndex",IDBKeyRange.bound(t,t)):n.j()).next(e=>{const t=[];return oe.forEach(e,e=>r.get([e.indexId,this.uid]).next(n=>{t.push(function(e,t){const n=t?new X(t.sequenceNumber,new te(Vi(t.readTime),new K(Se(t.documentKey)),t.largestBatchId)):X.empty(),r=e.fields.map(([e,t])=>new Y(G.fromServerFormat(e),t));return new $(e.indexId,e.collectionGroup,r,n)}(e,n))})).next(()=>t)})}getNextCollectionGroupToUpdate(e){return this.getFieldIndexes(e).next(e=>0===e.length?null:(e.sort((e,t)=>{const n=e.indexState.sequenceNumber-t.indexState.sequenceNumber;return 0!==n?n:M(e.collectionGroup,t.collectionGroup)}),e[0].collectionGroup))}updateCollectionGroup(e,t,n){const r=Is(e),i=_s(e);return this.Tn(e).next(e=>r.j("collectionGroupIndex",IDBKeyRange.bound(t,t)).next(t=>oe.forEach(t,t=>i.put(Ki(t.indexId,this.user,e,n)))))}updateIndexEntries(e,t){const n=new Map;return oe.forEach(t,(t,r)=>{const i=n.get(t.collectionGroup);return(i?oe.resolve(i):this.getFieldIndexes(e,t.collectionGroup)).next(i=>(n.set(t.collectionGroup,i),oe.forEach(i,n=>this.En(e,t,n).next(t=>{const i=this.An(r,n);return t.isEqual(i)?oe.resolve():this.vn(e,r,n,t,i)}))))})}Rn(e,t,n,r){return bs(e).put({indexId:r.indexId,uid:this.uid,arrayValue:r.arrayValue,directionalValue:r.directionalValue,orderedDocumentKey:this.gn(n,t.key),documentKey:t.key.path.toArray()})}Pn(e,t,n,r){return bs(e).delete([r.indexId,this.uid,r.arrayValue,r.directionalValue,this.gn(n,t.key),t.key.path.toArray()])}En(e,t,n){const r=bs(e);let i=new rt(ss);return r.X({index:"documentKeyIndex",range:IDBKeyRange.only([n.indexId,this.uid,this.gn(n,t)])},(e,r)=>{i=i.add(new is(n.indexId,t,r.arrayValue,r.directionalValue))}).next(()=>i)}An(e,t){let n=new rt(ss);const r=this.mn(t,e);if(null==r)return n;const i=W(t);if(null!=i){const s=e.data.field(i.fieldPath);if(Nt(s))for(const i of s.arrayValue.values||[])n=n.add(new is(t.indexId,e.key,this.dn(i),r))}else n=n.add(new is(t.indexId,e.key,ys,r));return n}vn(e,t,n,r,i){p("IndexedDbIndexManager","Updating index entries for document '%s'",t.key);const s=[];return function(e,t,n,r,i){const s=e.getIterator(),o=t.getIterator();let a=st(s),c=st(o);for(;a||c;){let e=!1,t=!1;if(a&&c){const r=n(a,c);r<0?t=!0:r>0&&(e=!0)}else null!=a?t=!0:e=!0;e?(r(c),c=st(o)):t?(i(a),a=st(s)):(a=st(s),c=st(o))}}(r,i,ss,r=>{s.push(this.Rn(e,t,n,r))},r=>{s.push(this.Pn(e,t,n,r))}),oe.waitFor(s)}Tn(e){let t=1;return _s(e).X({index:"sequenceNumberIndex",reverse:!0,range:IDBKeyRange.upperBound([this.uid,Number.MAX_SAFE_INTEGER])},(e,n,r)=>{r.done(),t=n.sequenceNumber+1}).next(()=>t)}createRange(e,t,n){n=n.sort((e,t)=>ss(e,t)).filter((e,t,n)=>!t||0!==ss(e,n[t-1]));const r=[];r.push(e);for(const i of n){const n=ss(i,e),s=ss(i,t);if(0===n)r[0]=e.Je();else if(n>0&&s<0)r.push(i),r.push(i.Je());else if(s>0)break}r.push(t);const i=[];for(let e=0;e0}getMinOffsetFromCollectionGroup(e,t){return this.getFieldIndexes(e,t).next(Ts)}getMinOffset(e,t){return oe.mapArray(this.cn(t),t=>this.an(e,t).next(e=>e||v())).next(Ts)}}function ws(e){return Ye(e,"collectionParents")}function bs(e){return Ye(e,"indexEntries")}function Is(e){return Ye(e,"indexConfiguration")}function _s(e){return Ye(e,"indexState")}function Ts(e){w(0!==e.length);let t=e[0].indexState.offset,n=t.largestBatchId;for(let r=1;rthis.addReference(e,t))}removeReference(e,t){this.os(new $i(e,t))}cs(e,t){e.forEach(e=>this.removeReference(e,t))}us(e){const t=new ae(new G([])),n=new $i(t,e),r=new $i(t,e+1),i=[];return this.ns.forEachInRange([n,r],e=>{this.os(e),i.push(e.key)}),i}hs(){this.ts.forEach(e=>this.os(e))}os(e){this.ts=this.ts.delete(e),this.ns=this.ns.delete(e)}ls(e){const t=new ae(new G([])),n=new $i(t,e),r=new $i(t,e+1);let i=nn();return this.ns.forEachInRange([n,r],e=>{i=i.add(e.key)}),i}containsKey(e){const t=new $i(e,0),n=this.ts.firstAfterOrEqual(t);return null!==n&&e.isEqual(n.key)}}class $i{constructor(e,t){this.key=e,this.fs=t}static es(e,t){return ae.comparator(e.key,t.key)||F(e.fs,t.fs)}static ss(e,t){return F(e.fs,t.fs)||ae.comparator(e.key,t.key)}} + */const Es={didRun:!1,sequenceNumbersCollected:0,targetsRemoved:0,documentsRemoved:0};class Ss{constructor(e,t,n){this.cacheSizeCollectionThreshold=e,this.percentileToCollect=t,this.maximumSequenceNumbersToCollect=n}static withCacheSize(e){return new Ss(e,Ss.DEFAULT_COLLECTION_PERCENTILE,Ss.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT)}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3030,7 +3111,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Qi{constructor(e,t){this.Jt=e,this.referenceDelegate=t,this.An=[],this.ds=1,this.ws=new Ht($i.es)}checkEmpty(e){return gr.resolve(0===this.An.length)}addMutationBatch(e,t,n,r){const i=this.ds;this.ds++,this.An.length>0&&this.An[this.An.length-1];const s=new Nr(i,t,n,r);this.An.push(s);for(const t of r)this.ws=this.ws.add(new $i(t.key,i)),this.Jt.addToCollectionParentIndex(e,t.key.path.popLast());return gr.resolve(s)}lookupMutationBatch(e,t){return gr.resolve(this._s(t))}getNextMutationBatchAfterBatchId(e,t){const n=t+1,r=this.gs(n),i=r<0?0:r;return gr.resolve(this.An.length>i?this.An[i]:null)}getHighestUnacknowledgedBatchId(){return gr.resolve(0===this.An.length?-1:this.ds-1)}getAllMutationBatches(e){return gr.resolve(this.An.slice())}getAllMutationBatchesAffectingDocumentKey(e,t){const n=new $i(t,0),r=new $i(t,Number.POSITIVE_INFINITY),i=[];return this.ws.forEachInRange([n,r],e=>{const t=this._s(e.fs);i.push(t)}),gr.resolve(i)}getAllMutationBatchesAffectingDocumentKeys(e,t){let n=new Ht(F);return t.forEach(e=>{const t=new $i(e,0),r=new $i(e,Number.POSITIVE_INFINITY);this.ws.forEachInRange([t,r],e=>{n=n.add(e.fs)})}),gr.resolve(this.ys(n))}getAllMutationBatchesAffectingQuery(e,t){const n=t.path,r=n.length+1;let i=n;ae.isDocumentKey(i)||(i=i.child(""));const s=new $i(new ae(i),0);let o=new Ht(F);return this.ws.forEachWhile(e=>{const t=e.key.path;return!!n.isPrefixOf(t)&&(t.length===r&&(o=o.add(e.fs)),!0)},s),gr.resolve(this.ys(o))}ys(e){const t=[];return e.forEach(e=>{const n=this._s(e);null!==n&&t.push(n)}),t}removeMutationBatch(e,t){w(0===this.ps(t.batchId,"removed")),this.An.shift();let n=this.ws;return gr.forEach(t.mutations,r=>{const i=new $i(r.key,t.batchId);return n=n.delete(i),this.referenceDelegate.markPotentiallyOrphaned(e,r.key)}).next(()=>{this.ws=n})}ee(e){}containsKey(e,t){const n=new $i(t,0),r=this.ws.firstAfterOrEqual(n);return gr.resolve(t.isEqual(r&&r.key))}performConsistencyCheck(e){return this.An.length,gr.resolve()}ps(e,t){return this.gs(e)}gs(e){return 0===this.An.length?0:e-this.An[0].batchId}_s(e){const t=this.gs(e);return t<0||t>=this.An.length?null:this.An[t]}} + */function ks(e,t,n){const r=e.store("mutations"),i=e.store("documentMutations"),s=[],o=IDBKeyRange.only(n.batchId);let a=0;const c=r.X({range:o},(e,t,n)=>(a++,n.delete()));s.push(c.next(()=>{w(1===a)}));const u=[];for(const e of n.mutations){const r=Ae(t,e.key.path,n.batchId);s.push(i.delete(r)),u.push(e.key)}return oe.waitFor(s).next(()=>u)}function Cs(e){if(!e)return 0;let t;if(e.document)t=e.document;else if(e.unknownDocument)t=e.unknownDocument;else{if(!e.noDocument)throw v();t=e.noDocument}return JSON.stringify(t).length} /** * @license * Copyright 2017 Google LLC @@ -3046,7 +3127,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ji{constructor(e,t){this.Jt=e,this.Ts=t,this.docs=new Kt(ae.comparator),this.size=0}addEntry(e,t,n){const r=t.key,i=this.docs.get(r),s=i?i.size:0,o=this.Ts(t);return this.docs=this.docs.insert(r,{document:t.clone(),size:o,readTime:n}),this.size+=o-s,this.Jt.addToCollectionParentIndex(e,r.path.popLast())}removeEntry(e){const t=this.docs.get(e);t&&(this.docs=this.docs.remove(e),this.size-=t.size)}getEntry(e,t){const n=this.docs.get(t);return gr.resolve(n?n.document.clone():Te.newInvalidDocument(t))}getEntries(e,t){let n=Jt();return t.forEach(e=>{const t=this.docs.get(e);n=n.insert(e,t?t.document.clone():Te.newInvalidDocument(e))}),gr.resolve(n)}getDocumentsMatchingQuery(e,t,n){let r=Jt();const i=new ae(t.path.child("")),s=this.docs.getIteratorFrom(i);for(;s.hasNext();){const{key:e,value:{document:i,readTime:o}}=s.getNext();if(!t.path.isPrefixOf(e.path))break;o.compareTo(n)<=0||it(t,i)&&(r=r.insert(i.key,i.clone()))}return gr.resolve(r)}Es(e,t){return gr.forEach(this.docs,e=>t(e))}newChangeBuffer(e){return new Yi(this)}getSize(e){return gr.resolve(this.size)}}class Yi extends yi{constructor(e){super(),this.De=e}applyChanges(e){const t=[];return this.changes.forEach((n,r)=>{r.document.isValidDocument()?t.push(this.De.addEntry(e,r.document,this.getReadTime(n))):this.De.removeEntry(n)}),gr.waitFor(t)}getFromCache(e,t){return this.De.getEntry(e,t)}getAllFromCache(e,t){return this.De.getEntries(e,t)}} + */Ss.DEFAULT_COLLECTION_PERCENTILE=10,Ss.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT=1e3,Ss.DEFAULT=new Ss(41943040,Ss.DEFAULT_COLLECTION_PERCENTILE,Ss.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT),Ss.DISABLED=new Ss(-1,0,0);class As{constructor(e,t,n,r){this.userId=e,this.serializer=t,this.indexManager=n,this.referenceDelegate=r,this.Vn={}}static de(e,t,n,r){w(""!==e.uid);const i=e.isAuthenticated()?e.uid:"";return new As(i,t,n,r)}checkEmpty(e){let t=!0;const n=IDBKeyRange.bound([this.userId,Number.NEGATIVE_INFINITY],[this.userId,Number.POSITIVE_INFINITY]);return Ds(e).X({index:"userMutationsIndex",range:n},(e,n,r)=>{t=!1,r.done()}).next(()=>t)}addMutationBatch(e,t,n,r){const i=Os(e),s=Ds(e);return s.add({}).next(o=>{w("number"==typeof o);const a=new Dr(o,t,n,r),c=function(e,t,n){const r=n.baseMutations.map(t=>Ii(e.fe,t)),i=n.mutations.map(t=>Ii(e.fe,t));return{userId:t,batchId:n.batchId,localWriteTimeMs:n.localWriteTime.toMillis(),baseMutations:r,mutations:i}}(this.serializer,this.userId,a),u=[];let l=new rt((e,t)=>M(e.canonicalString(),t.canonicalString()));for(const e of r){const t=Ae(this.userId,e.key.path,o);l=l.add(e.key.path.popLast()),u.push(s.put(c)),u.push(i.put(t,Ne))}return l.forEach(t=>{u.push(this.indexManager.addToCollectionParentIndex(e,t))}),e.addOnCommittedListener(()=>{this.Vn[o]=a.keys()}),oe.waitFor(u).next(()=>a)})}lookupMutationBatch(e,t){return Ds(e).get(t).next(e=>e?(w(e.userId===this.userId),ji(this.serializer,e)):null)}Sn(e,t){return this.Vn[t]?oe.resolve(this.Vn[t]):this.lookupMutationBatch(e,t).next(e=>{if(e){const n=e.keys();return this.Vn[t]=n,n}return null})}getNextMutationBatchAfterBatchId(e,t){const n=t+1,r=IDBKeyRange.lowerBound([this.userId,n]);let i=null;return Ds(e).X({index:"userMutationsIndex",range:r},(e,t,r)=>{t.userId===this.userId&&(w(t.batchId>=n),i=ji(this.serializer,t)),r.done()}).next(()=>i)}getHighestUnacknowledgedBatchId(e){const t=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]);let n=-1;return Ds(e).X({index:"userMutationsIndex",range:t,reverse:!0},(e,t,r)=>{n=t.batchId,r.done()}).next(()=>n)}getAllMutationBatches(e){const t=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return Ds(e).j("userMutationsIndex",t).next(e=>e.map(e=>ji(this.serializer,e)))}getAllMutationBatchesAffectingDocumentKey(e,t){const n=Ce(this.userId,t.path),r=IDBKeyRange.lowerBound(n),i=[];return Os(e).X({range:r},(n,r,s)=>{const[o,a,c]=n,u=Se(a);if(o===this.userId&&t.path.isEqual(u))return Ds(e).get(c).next(e=>{if(!e)throw v();w(e.userId===this.userId),i.push(ji(this.serializer,e))});s.done()}).next(()=>i)}getAllMutationBatchesAffectingDocumentKeys(e,t){let n=new rt(M);const r=[];return t.forEach(t=>{const i=Ce(this.userId,t.path),s=IDBKeyRange.lowerBound(i),o=Os(e).X({range:s},(e,r,i)=>{const[s,o,a]=e,c=Se(o);s===this.userId&&t.path.isEqual(c)?n=n.add(a):i.done()});r.push(o)}),oe.waitFor(r).next(()=>this.Dn(e,n))}getAllMutationBatchesAffectingQuery(e,t){const n=t.path,r=n.length+1,i=Ce(this.userId,n),s=IDBKeyRange.lowerBound(i);let o=new rt(M);return Os(e).X({range:s},(e,t,i)=>{const[s,a,c]=e,u=Se(a);s===this.userId&&n.isPrefixOf(u)?u.length===r&&(o=o.add(c)):i.done()}).next(()=>this.Dn(e,o))}Dn(e,t){const n=[],r=[];return t.forEach(t=>{r.push(Ds(e).get(t).next(e=>{if(null===e)throw v();w(e.userId===this.userId),n.push(ji(this.serializer,e))}))}),oe.waitFor(r).next(()=>n)}removeMutationBatch(e,t){return ks(e.ht,this.userId,t).next(n=>(e.addOnCommittedListener(()=>{this.Cn(t.batchId)}),oe.forEach(n,t=>this.referenceDelegate.markPotentiallyOrphaned(e,t))))}Cn(e){delete this.Vn[e]}performConsistencyCheck(e){return this.checkEmpty(e).next(t=>{if(!t)return oe.resolve();const n=IDBKeyRange.lowerBound([this.userId]),r=[];return Os(e).X({range:n},(e,t,n)=>{if(e[0]===this.userId){const t=Se(e[1]);r.push(t)}else n.done()}).next(()=>{w(0===r.length)})})}containsKey(e,t){return Ns(e,this.userId,t)}xn(e){return Rs(e).get(this.userId).next(e=>e||{userId:this.userId,lastAcknowledgedBatchId:-1,lastStreamToken:""})}}function Ns(e,t,n){const r=Ce(t,n.path),i=r[1],s=IDBKeyRange.lowerBound(r);let o=!1;return Os(e).X({range:s,Y:!0},(e,n,r)=>{const[s,a,c]=e;s===t&&a===i&&(o=!0),r.done()}).next(()=>o)}function Ds(e){return Ye(e,"mutations")}function Os(e){return Ye(e,"documentMutations")}function Rs(e){return Ye(e,"mutationQueues")} /** * @license * Copyright 2017 Google LLC @@ -3062,7 +3143,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Xi{constructor(e){this.persistence=e,this.Is=new gi(e=>Se(e),Ae),this.lastRemoteSnapshotVersion=q.min(),this.highestTargetId=0,this.As=0,this.Rs=new Hi,this.targetCount=0,this.Ps=ii.ie()}forEachTarget(e,t){return this.Is.forEach((e,n)=>t(n)),gr.resolve()}getLastRemoteSnapshotVersion(e){return gr.resolve(this.lastRemoteSnapshotVersion)}getHighestSequenceNumber(e){return gr.resolve(this.As)}allocateTargetId(e){return this.highestTargetId=this.Ps.next(),gr.resolve(this.highestTargetId)}setTargetsMetadata(e,t,n){return n&&(this.lastRemoteSnapshotVersion=n),t>this.As&&(this.As=t),gr.resolve()}ce(e){this.Is.set(e.target,e);const t=e.targetId;t>this.highestTargetId&&(this.Ps=new ii(t),this.highestTargetId=t),e.sequenceNumber>this.As&&(this.As=e.sequenceNumber)}addTargetData(e,t){return this.ce(t),this.targetCount+=1,gr.resolve()}updateTargetData(e,t){return this.ce(t),gr.resolve()}removeTargetData(e,t){return this.Is.delete(t.target),this.Rs.us(t.targetId),this.targetCount-=1,gr.resolve()}removeTargets(e,t,n){let r=0;const i=[];return this.Is.forEach((s,o)=>{o.sequenceNumber<=t&&null===n.get(o.targetId)&&(this.Is.delete(s),i.push(this.removeMatchingKeysForTargetId(e,o.targetId)),r++)}),gr.waitFor(i).next(()=>r)}getTargetCount(e){return gr.resolve(this.targetCount)}getTargetData(e,t){const n=this.Is.get(t)||null;return gr.resolve(n)}addMatchingKeys(e,t,n){return this.Rs.rs(t,n),gr.resolve()}removeMatchingKeys(e,t,n){this.Rs.cs(t,n);const r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(t=>{i.push(r.markPotentiallyOrphaned(e,t))}),gr.waitFor(i)}removeMatchingKeysForTargetId(e,t){return this.Rs.us(t),gr.resolve()}getMatchingKeysForTargetId(e,t){const n=this.Rs.ls(t);return gr.resolve(n)}containsKey(e,t){return gr.resolve(this.Rs.containsKey(t))}} + */class xs{constructor(e){this.Nn=e}next(){return this.Nn+=2,this.Nn}static kn(){return new xs(0)}static Mn(){return new xs(-1)}} /** * @license * Copyright 2017 Google LLC @@ -3078,10 +3159,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Zi{constructor(e,t){this.bs={},this.Be=new L(0),this.Ue=!1,this.Ue=!0,this.referenceDelegate=e(this),this.He=new Xi(this),this.Jt=new Wr,this.Je=function(e,t){return new Ji(e,t)}(this.Jt,e=>this.referenceDelegate.vs(e)),this.k=new Dr(t),this.Ye=new Gi(this.k)}start(){return Promise.resolve()}shutdown(){return this.Ue=!1,Promise.resolve()}get started(){return this.Ue}setDatabaseDeletedListener(){}setNetworkEnabled(){}getIndexManager(){return this.Jt}getMutationQueue(e){let t=this.bs[e.toKey()];return t||(t=new Qi(this.Jt,this.referenceDelegate),this.bs[e.toKey()]=t),t}getTargetCache(){return this.He}getRemoteDocumentCache(){return this.Je}getBundleCache(){return this.Ye}runTransaction(e,t,n){p("MemoryPersistence","Starting transaction:",e);const r=new es(this.Be.next());return this.referenceDelegate.Vs(),n(r).next(e=>this.referenceDelegate.Ss(r).next(()=>e)).toPromise().then(e=>(r.raiseOnCommittedEvent(),e))}Ds(e,t){return gr.or(Object.values(this.bs).map(n=>()=>n.containsKey(e,t)))}}class es extends mr{constructor(e){super(),this.currentSequenceNumber=e}}class ts{constructor(e){this.persistence=e,this.Cs=new Hi,this.Ns=null}static ks(e){return new ts(e)}get xs(){if(this.Ns)return this.Ns;throw v()}addReference(e,t,n){return this.Cs.addReference(n,t),this.xs.delete(n.toString()),gr.resolve()}removeReference(e,t,n){return this.Cs.removeReference(n,t),this.xs.add(n.toString()),gr.resolve()}markPotentiallyOrphaned(e,t){return this.xs.add(t.toString()),gr.resolve()}removeTarget(e,t){this.Cs.us(t.targetId).forEach(e=>this.xs.add(e.toString()));const n=this.persistence.getTargetCache();return n.getMatchingKeysForTargetId(e,t.targetId).next(e=>{e.forEach(e=>this.xs.add(e.toString()))}).next(()=>n.removeTargetData(e,t))}Vs(){this.Ns=new Set}Ss(e){const t=this.persistence.getRemoteDocumentCache().newChangeBuffer();return gr.forEach(this.xs,n=>{const r=ae.fromPath(n);return this.$s(e,r).next(e=>{e||t.removeEntry(r)})}).next(()=>(this.Ns=null,t.apply(e)))}updateLimboDocument(e,t){return this.$s(e,t).next(e=>{e?this.xs.delete(t.toString()):this.xs.add(t.toString())})}vs(e){return 0}$s(e,t){return gr.or([()=>gr.resolve(this.Cs.containsKey(t)),()=>this.persistence.getTargetCache().containsKey(e,t),()=>this.persistence.Ds(e,t)])}} + */class Ps{constructor(e,t){this.referenceDelegate=e,this.serializer=t}allocateTargetId(e){return this.$n(e).next(t=>{const n=new xs(t.highestTargetId);return t.highestTargetId=n.next(),this.On(e,t).next(()=>t.highestTargetId)})}getLastRemoteSnapshotVersion(e){return this.$n(e).next(e=>U.fromTimestamp(new j(e.lastRemoteSnapshotVersion.seconds,e.lastRemoteSnapshotVersion.nanoseconds)))}getHighestSequenceNumber(e){return this.$n(e).next(e=>e.highestListenSequenceNumber)}setTargetsMetadata(e,t,n){return this.$n(e).next(r=>(r.highestListenSequenceNumber=t,n&&(r.lastRemoteSnapshotVersion=n.toTimestamp()),t>r.highestListenSequenceNumber&&(r.highestListenSequenceNumber=t),this.On(e,r)))}addTargetData(e,t){return this.Fn(e,t).next(()=>this.$n(e).next(n=>(n.targetCount+=1,this.Bn(t,n),this.On(e,n))))}updateTargetData(e,t){return this.Fn(e,t)}removeTargetData(e,t){return this.removeMatchingKeysForTargetId(e,t.targetId).next(()=>Ls(e).delete(t.targetId)).next(()=>this.$n(e)).next(t=>(w(t.targetCount>0),t.targetCount-=1,this.On(e,t)))}removeTargets(e,t,n){let r=0;const i=[];return Ls(e).X((s,o)=>{const a=Ui(o);a.sequenceNumber<=t&&null===n.get(a.targetId)&&(r++,i.push(this.removeTargetData(e,a)))}).next(()=>oe.waitFor(i)).next(()=>r)}forEachTarget(e,t){return Ls(e).X((e,n)=>{const r=Ui(n);t(r)})}$n(e){return Ms(e).get("targetGlobalKey").next(e=>(w(null!==e),e))}On(e,t){return Ms(e).put("targetGlobalKey",t)}Fn(e,t){return Ls(e).put(qi(this.serializer,t))}Bn(e,t){let n=!1;return e.targetId>t.highestTargetId&&(t.highestTargetId=e.targetId,n=!0),e.sequenceNumber>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=e.sequenceNumber,n=!0),n}getTargetCount(e){return this.$n(e).next(e=>e.targetCount)}getTargetData(e,t){const n=pn(t),r=IDBKeyRange.bound([n,Number.NEGATIVE_INFINITY],[n,Number.POSITIVE_INFINITY]);let i=null;return Ls(e).X({range:r,index:"queryTargetsIndex"},(e,n,r)=>{const s=Ui(n);gn(t,s.target)&&(i=s,r.done())}).next(()=>i)}addMatchingKeys(e,t,n){const r=[],i=Fs(e);return t.forEach(t=>{const s=_e(t.path);r.push(i.put({targetId:n,path:s})),r.push(this.referenceDelegate.addReference(e,n,t))}),oe.waitFor(r)}removeMatchingKeys(e,t,n){const r=Fs(e);return oe.forEach(t,t=>{const i=_e(t.path);return oe.waitFor([r.delete([n,i]),this.referenceDelegate.removeReference(e,n,t)])})}removeMatchingKeysForTargetId(e,t){const n=Fs(e),r=IDBKeyRange.bound([t],[t+1],!1,!0);return n.delete(r)}getMatchingKeysForTargetId(e,t){const n=IDBKeyRange.bound([t],[t+1],!1,!0),r=Fs(e);let i=Qn();return r.X({range:n,Y:!0},(e,t,n)=>{const r=Se(e[1]),s=new K(r);i=i.add(s)}).next(()=>i)}containsKey(e,t){const n=_e(t.path),r=IDBKeyRange.bound([n],[V(n)],!1,!0);let i=0;return Fs(e).X({index:"documentTargetsIndex",Y:!0,range:r},([e,t],n,r)=>{0!==e&&(i++,r.done())}).next(()=>i>0)}le(e,t){return Ls(e).get(t).next(e=>e?Ui(e):null)}}function Ls(e){return Ye(e,"targets")}function Ms(e){return Ye(e,"targetGlobal")}function Fs(e){return Ye(e,"targetDocuments")} /** * @license - * Copyright 2019 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3094,10 +3175,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ns(e,t){return`firestore_clients_${e}_${t}`}function rs(e,t,n){let r=`firestore_mutations_${e}_${n}`;return t.isAuthenticated()&&(r+="_"+t.uid),r}function is(e,t){return`firestore_targets_${e}_${t}`}class ss{constructor(e,t,n,r){this.user=e,this.batchId=t,this.state=n,this.error=r}static Fs(e,t,n){const r=JSON.parse(n);let i,s="object"==typeof r&&-1!==["pending","acknowledged","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return s&&r.error&&(s="string"==typeof r.error.message&&"string"==typeof r.error.code,s&&(i=new T(r.error.code,r.error.message))),s?new ss(e,t,r.state,i):(m("SharedClientState",`Failed to parse mutation state for ID '${t}': ${n}`),null)}Os(){const e={state:this.state,updateTimeMs:Date.now()};return this.error&&(e.error={code:this.error.code,message:this.error.message}),JSON.stringify(e)}}class os{constructor(e,t,n){this.targetId=e,this.state=t,this.error=n}static Fs(e,t){const n=JSON.parse(t);let r,i="object"==typeof n&&-1!==["not-current","current","rejected"].indexOf(n.state)&&(void 0===n.error||"object"==typeof n.error);return i&&n.error&&(i="string"==typeof n.error.message&&"string"==typeof n.error.code,i&&(r=new T(n.error.code,n.error.message))),i?new os(e,n.state,r):(m("SharedClientState",`Failed to parse target state for ID '${e}': ${t}`),null)}Os(){const e={state:this.state,updateTimeMs:Date.now()};return this.error&&(e.error={code:this.error.code,message:this.error.message}),JSON.stringify(e)}}class as{constructor(e,t){this.clientId=e,this.activeTargetIds=t}static Fs(e,t){const n=JSON.parse(t);let r="object"==typeof n&&n.activeTargetIds instanceof Array,i=sn();for(let e=0;r&&e{this.Gn=null;try{await this.localStore.collectGarbage(this.garbageCollector)}catch(e){he(e)?p("LruGarbageCollector","Ignoring IndexedDB error during garbage collection: ",e):await se(e)}await this.Qn(3e5)})}}class qs{constructor(e,t){this.jn=e,this.params=t}calculateTargetCount(e,t){return this.jn.zn(e).next(e=>Math.floor(t/100*e))}nthSequenceNumber(e,t){if(0===t)return oe.resolve(ve.ct);const n=new js(t);return this.jn.forEachTarget(e,e=>n.Kn(e.sequenceNumber)).next(()=>this.jn.Wn(e,e=>n.Kn(e))).next(()=>n.maxValue)}removeTargets(e,t,n){return this.jn.removeTargets(e,t,n)}removeOrphanedDocuments(e,t){return this.jn.removeOrphanedDocuments(e,t)}collect(e,t){return-1===this.params.cacheSizeCollectionThreshold?(p("LruGarbageCollector","Garbage collection skipped; disabled"),oe.resolve(Es)):this.getCacheSize(e).next(n=>n(t>this.params.maximumSequenceNumbersToCollect?(p("LruGarbageCollector",`Capping sequence numbers to collect down to the maximum of ${this.params.maximumSequenceNumbersToCollect} from ${t}`),r=this.params.maximumSequenceNumbersToCollect):r=t,o=Date.now(),this.nthSequenceNumber(e,r))).next(r=>(n=r,a=Date.now(),this.removeTargets(e,n,t))).next(t=>(i=t,c=Date.now(),this.removeOrphanedDocuments(e,n))).next(e=>(u=Date.now(),d()<=s.a.DEBUG&&p("LruGarbageCollector",`LRU Garbage Collection\n\tCounted targets in ${o-l}ms\n\tDetermined least recently used ${r} in `+(a-o)+"ms\n"+`\tRemoved ${i} targets in `+(c-a)+"ms\n"+`\tRemoved ${e} documents in `+(u-c)+"ms\n"+`Total Duration: ${u-l}ms`),oe.resolve({didRun:!0,sequenceNumbersCollected:r,targetsRemoved:i,documentsRemoved:e})))}}function Bs(e,t){return new qs(e,t)} /** * @license - * Copyright 2018 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3110,10 +3191,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(this.persistenceKey),this.Ks=this.Ks.insert(this.Bs,new us),this.Gs=new RegExp(`^firestore_clients_${s}_([^_]*)$`),this.zs=new RegExp(`^firestore_mutations_${s}_(\\d+)(?:_(.*))?$`),this.Hs=new RegExp(`^firestore_targets_${s}_(\\d+)$`),this.Js=function(e){return"firestore_online_state_"+e}(this.persistenceKey),this.Ys=function(e){return"firestore_bundle_loaded_"+e}(this.persistenceKey),this.window.addEventListener("storage",this.Us)}static bt(e){return!(!e||!e.localStorage)}async start(){const e=await this.syncEngine.Tn();for(const t of e){if(t===this.Bs)continue;const e=this.getItem(ns(this.persistenceKey,t));if(e){const n=as.Fs(t,e);n&&(this.Ks=this.Ks.insert(n.clientId,n))}}this.Xs();const t=this.storage.getItem(this.Js);if(t){const e=this.Zs(t);e&&this.ti(e)}for(const e of this.js)this.qs(e);this.js=[],this.window.addEventListener("pagehide",()=>this.shutdown()),this.started=!0}writeSequenceNumber(e){this.setItem(this.Ws,JSON.stringify(e))}getAllActiveQueryTargets(){return this.ei(this.Ks)}isActiveQueryTarget(e){let t=!1;return this.Ks.forEach((n,r)=>{r.activeTargetIds.has(e)&&(t=!0)}),t}addPendingMutation(e){this.ni(e,"pending")}updateMutationState(e,t,n){this.ni(e,t,n),this.si(e)}addLocalQueryTarget(e){let t="not-current";if(this.isActiveQueryTarget(e)){const n=this.storage.getItem(is(this.persistenceKey,e));if(n){const r=os.Fs(e,n);r&&(t=r.state)}}return this.ii.Ms(e),this.Xs(),t}removeLocalQueryTarget(e){this.ii.Ls(e),this.Xs()}isLocalQueryTarget(e){return this.ii.activeTargetIds.has(e)}clearQueryState(e){this.removeItem(is(this.persistenceKey,e))}updateQueryState(e,t,n){this.ri(e,t,n)}handleUserChange(e,t,n){t.forEach(e=>{this.si(e)}),this.currentUser=e,n.forEach(e=>{this.addPendingMutation(e)})}setOnlineState(e){this.oi(e)}notifyBundleLoaded(){this.ai()}shutdown(){this.started&&(this.window.removeEventListener("storage",this.Us),this.removeItem(this.Qs),this.started=!1)}getItem(e){const t=this.storage.getItem(e);return p("SharedClientState","READ",e,t),t}setItem(e,t){p("SharedClientState","SET",e,t),this.storage.setItem(e,t)}removeItem(e){p("SharedClientState","REMOVE",e),this.storage.removeItem(e)}qs(e){const t=e;if(t.storageArea===this.storage){if(p("SharedClientState","EVENT",t.key,t.newValue),t.key===this.Qs)return void m("Received WebStorage notification for local change. Another client might have garbage-collected our state");this.Oe.enqueueRetryable(async()=>{if(this.started){if(null!==t.key)if(this.Gs.test(t.key)){if(null==t.newValue){const e=this.ci(t.key);return this.ui(e,null)}{const e=this.hi(t.key,t.newValue);if(e)return this.ui(e.clientId,e)}}else if(this.zs.test(t.key)){if(null!==t.newValue){const e=this.li(t.key,t.newValue);if(e)return this.fi(e)}}else if(this.Hs.test(t.key)){if(null!==t.newValue){const e=this.di(t.key,t.newValue);if(e)return this.wi(e)}}else if(t.key===this.Js){if(null!==t.newValue){const e=this.Zs(t.newValue);if(e)return this.ti(e)}}else if(t.key===this.Ws){const e=function(e){let t=L.I;if(null!=e)try{const n=JSON.parse(e);w("number"==typeof n),t=n}catch(e){m("SharedClientState","Failed to read sequence number from WebStorage",e)}return t}(t.newValue);e!==L.I&&this.sequenceNumberHandler(e)}else if(t.key===this.Ys)return this.syncEngine._i()}else this.js.push(t)})}}get ii(){return this.Ks.get(this.Bs)}Xs(){this.setItem(this.Qs,this.ii.Os())}ni(e,t,n){const r=new ss(this.currentUser,e,t,n),i=rs(this.persistenceKey,this.currentUser,e);this.setItem(i,r.Os())}si(e){const t=rs(this.persistenceKey,this.currentUser,e);this.removeItem(t)}oi(e){const t={clientId:this.Bs,onlineState:e};this.storage.setItem(this.Js,JSON.stringify(t))}ri(e,t,n){const r=is(this.persistenceKey,e),i=new os(e,t,n);this.setItem(r,i.Os())}ai(){this.setItem(this.Ys,"value-not-used")}ci(e){const t=this.Gs.exec(e);return t?t[1]:null}hi(e,t){const n=this.ci(e);return as.Fs(n,t)}li(e,t){const n=this.zs.exec(e),r=Number(n[1]),i=void 0!==n[2]?n[2]:null;return ss.Fs(new u(i),r,t)}di(e,t){const n=this.Hs.exec(e),r=Number(n[1]);return os.Fs(r,t)}Zs(e){return cs.Fs(e)}async fi(e){if(e.user.uid===this.currentUser.uid)return this.syncEngine.mi(e.batchId,e.state,e.error);p("SharedClientState","Ignoring mutation for non-active user "+e.user.uid)}wi(e){return this.syncEngine.gi(e.targetId,e.state,e.error)}ui(e,t){const n=t?this.Ks.insert(e,t):this.Ks.remove(e),r=this.ei(this.Ks),i=this.ei(n),s=[],o=[];return i.forEach(e=>{r.has(e)||s.push(e)}),r.forEach(e=>{i.has(e)||o.push(e)}),this.syncEngine.yi(s,o).then(()=>{this.Ks=n})}ti(e){this.Ks.get(e.clientId)&&this.onlineStateHandler(e.onlineState)}ei(e){let t=sn();return e.forEach((e,n)=>{t=t.unionWith(n.activeTargetIds)}),t}}class ls{constructor(){this.pi=new us,this.Ti={},this.onlineStateHandler=null,this.sequenceNumberHandler=null}addPendingMutation(e){}updateMutationState(e,t,n){}addLocalQueryTarget(e){return this.pi.Ms(e),this.Ti[e]||"not-current"}updateQueryState(e,t,n){this.Ti[e]=t}removeLocalQueryTarget(e){this.pi.Ls(e)}isLocalQueryTarget(e){return this.pi.activeTargetIds.has(e)}clearQueryState(e){delete this.Ti[e]}getAllActiveQueryTargets(){return this.pi.activeTargetIds}isActiveQueryTarget(e){return this.pi.activeTargetIds.has(e)}start(){return this.pi=new us,Promise.resolve()}handleUserChange(e,t,n){}setOnlineState(e){}shutdown(){}writeSequenceNumber(e){}notifyBundleLoaded(){}} + */class zs{constructor(e,t){this.db=e,this.garbageCollector=Bs(this,t)}zn(e){const t=this.Jn(e);return this.db.getTargetCache().getTargetCount(e).next(e=>t.next(t=>e+t))}Jn(e){let t=0;return this.Wn(e,e=>{t++}).next(()=>t)}forEachTarget(e,t){return this.db.getTargetCache().forEachTarget(e,t)}Wn(e,t){return this.Yn(e,(e,n)=>t(n))}addReference(e,t,n){return Gs(e,n)}removeReference(e,t,n){return Gs(e,n)}removeTargets(e,t,n){return this.db.getTargetCache().removeTargets(e,t,n)}markPotentiallyOrphaned(e,t){return Gs(e,t)}Xn(e,t){return function(e,t){let n=!1;return Rs(e).Z(r=>Ns(e,r,t).next(e=>(e&&(n=!0),oe.resolve(!e)))).next(()=>n)}(e,t)}removeOrphanedDocuments(e,t){const n=this.db.getRemoteDocumentCache().newChangeBuffer(),r=[];let i=0;return this.Yn(e,(s,o)=>{if(o<=t){const t=this.Xn(e,s).next(t=>{if(!t)return i++,n.getEntry(e,s).next(()=>(n.removeEntry(s,U.min()),Fs(e).delete([0,_e(s.path)])))});r.push(t)}}).next(()=>oe.waitFor(r)).next(()=>n.apply(e)).next(()=>i)}removeTarget(e,t){const n=t.withSequenceNumber(e.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(e,n)}updateLimboDocument(e,t){return Gs(e,t)}Yn(e,t){const n=Fs(e);let r,i=ve.ct;return n.X({index:"documentTargetsIndex"},([e,n],{path:s,sequenceNumber:o})=>{0===e?(i!==ve.ct&&t(new K(Se(r)),i),i=o,r=s):i=ve.ct}).next(()=>{i!==ve.ct&&t(new K(Se(r)),i)})}getCacheSize(e){return this.db.getRemoteDocumentCache().getSize(e)}}function Gs(e,t){return Fs(e).put(function(e,t){return{targetId:0,path:_e(e.path),sequenceNumber:t}}(t,e.currentSequenceNumber))} /** * @license - * Copyright 2019 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3126,10 +3207,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ds{Ei(e){}shutdown(){}} + */class Ks{constructor(){this.changes=new Vn(e=>e.toString(),(e,t)=>e.isEqual(t)),this.changesApplied=!1}addEntry(e){this.assertNotApplied(),this.changes.set(e.key,e)}removeEntry(e,t){this.assertNotApplied(),this.changes.set(e,qt.newInvalidDocument(e).setReadTime(t))}getEntry(e,t){this.assertNotApplied();const n=this.changes.get(t);return void 0!==n?oe.resolve(n):this.getFromCache(e,t)}getEntries(e,t){return this.getAllFromCache(e,t)}apply(e){return this.assertNotApplied(),this.changesApplied=!0,this.applyChanges(e)}assertNotApplied(){}} /** * @license - * Copyright 2019 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3142,10 +3223,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class fs{constructor(){this.Ii=()=>this.Ai(),this.Ri=()=>this.Pi(),this.bi=[],this.vi()}Ei(e){this.bi.push(e)}shutdown(){window.removeEventListener("online",this.Ii),window.removeEventListener("offline",this.Ri)}vi(){window.addEventListener("online",this.Ii),window.addEventListener("offline",this.Ri)}Ai(){p("ConnectivityMonitor","Network connectivity changed: AVAILABLE");for(const e of this.bi)e(0)}Pi(){p("ConnectivityMonitor","Network connectivity changed: UNAVAILABLE");for(const e of this.bi)e(1)}static bt(){return"undefined"!=typeof window&&void 0!==window.addEventListener&&void 0!==window.removeEventListener}} + */class $s{constructor(e){this.serializer=e}setIndexManager(e){this.indexManager=e}addEntry(e,t,n){return Ys(e).put(n)}removeEntry(e,t,n){return Ys(e).delete(function(e,t){const n=e.path.toArray();return[n.slice(0,n.length-2),n[n.length-2],Mi(t),n[n.length-1]]}(t,n))}updateMetadata(e,t){return this.getMetadata(e).next(n=>(n.byteSize+=t,this.Zn(e,n)))}getEntry(e,t){let n=qt.newInvalidDocument(t);return Ys(e).X({index:"documentKeyIndex",range:IDBKeyRange.only(Js(t))},(e,r)=>{n=this.ts(t,r)}).next(()=>n)}es(e,t){let n={size:0,document:qt.newInvalidDocument(t)};return Ys(e).X({index:"documentKeyIndex",range:IDBKeyRange.only(Js(t))},(e,r)=>{n={document:this.ts(t,r),size:Cs(r)}}).next(()=>n)}getEntries(e,t){let n=Un();return this.ns(e,t,(e,t)=>{const r=this.ts(e,t);n=n.insert(e,r)}).next(()=>n)}ss(e,t){let n=Un(),r=new et(K.comparator);return this.ns(e,t,(e,t)=>{const i=this.ts(e,t);n=n.insert(e,i),r=r.insert(e,Cs(t))}).next(()=>({documents:n,rs:r}))}ns(e,t,n){if(t.isEmpty())return oe.resolve();let r=new rt(Zs);t.forEach(e=>r=r.add(e));const i=IDBKeyRange.bound(Js(r.first()),Js(r.last())),s=r.getIterator();let o=s.getNext();return Ys(e).X({index:"documentKeyIndex",range:i},(e,t,r)=>{const i=K.fromSegments([...t.prefixPath,t.collectionGroup,t.documentId]);for(;o&&Zs(o,i)<0;)n(o,null),o=s.getNext();o&&o.isEqual(i)&&(n(o,t),o=s.hasNext()?s.getNext():null),o?r.G(Js(o)):r.done()}).next(()=>{for(;o;)n(o,null),o=s.hasNext()?s.getNext():null})}getDocumentsMatchingQuery(e,t,n,r){const i=t.path,s=[i.popLast().toArray(),i.lastSegment(),Mi(n.readTime),n.documentKey.path.isEmpty()?"":n.documentKey.path.lastSegment()],o=[i.popLast().toArray(),i.lastSegment(),[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],""];return Ys(e).j(IDBKeyRange.bound(s,o,!0)).next(e=>{let n=Un();for(const i of e){const e=this.ts(K.fromSegments(i.prefixPath.concat(i.collectionGroup,i.documentId)),i);e.isFoundDocument()&&(Pn(t,e)||r.has(e.key))&&(n=n.insert(e.key,e))}return n})}getAllFromCollectionGroup(e,t,n,r){let i=Un();const s=Xs(t,n),o=Xs(t,te.max());return Ys(e).X({index:"collectionGroupIndex",range:IDBKeyRange.bound(s,o,!0)},(e,t,n)=>{const s=this.ts(K.fromSegments(t.prefixPath.concat(t.collectionGroup,t.documentId)),t);i=i.insert(s.key,s),i.size===r&&n.done()}).next(()=>i)}newChangeBuffer(e){return new Hs(this,!!e&&e.trackRemovals)}getSize(e){return this.getMetadata(e).next(e=>e.byteSize)}getMetadata(e){return Qs(e).get("remoteDocumentGlobalKey").next(e=>(w(!!e),e))}Zn(e,t){return Qs(e).put("remoteDocumentGlobalKey",t)}ts(e,t){if(t){const e=function(e,t){let n;if(t.document)n=bi(e.fe,t.document,!!t.hasCommittedMutations);else if(t.noDocument){const e=K.fromSegments(t.noDocument.path),r=Vi(t.noDocument.readTime);n=qt.newNoDocument(e,r),t.hasCommittedMutations&&n.setHasCommittedMutations()}else{if(!t.unknownDocument)return v();{const e=K.fromSegments(t.unknownDocument.path),r=Vi(t.unknownDocument.version);n=qt.newUnknownDocument(e,r)}}return t.readTime&&n.setReadTime(function(e){const t=new j(e[0],e[1]);return U.fromTimestamp(t)}(t.readTime)),n}(this.serializer,t);if(!e.isNoDocument()||!e.version.isEqual(U.min()))return e}return qt.newInvalidDocument(e)}}function Ws(e){return new $s(e)}class Hs extends Ks{constructor(e,t){super(),this.os=e,this.trackRemovals=t,this.us=new Vn(e=>e.toString(),(e,t)=>e.isEqual(t))}applyChanges(e){const t=[];let n=0,r=new rt((e,t)=>M(e.canonicalString(),t.canonicalString()));return this.changes.forEach((i,s)=>{const o=this.us.get(i);if(t.push(this.os.removeEntry(e,i,o.readTime)),s.isValidDocument()){const a=Li(this.os.serializer,s);r=r.add(i.path.popLast());const c=Cs(a);n+=c-o.size,t.push(this.os.addEntry(e,i,a))}else if(n-=o.size,this.trackRemovals){const n=Li(this.os.serializer,s.convertToNoDocument(U.min()));t.push(this.os.addEntry(e,i,n))}}),r.forEach(n=>{t.push(this.os.indexManager.addToCollectionParentIndex(e,n))}),t.push(this.os.updateMetadata(e,n)),oe.waitFor(t)}getFromCache(e,t){return this.os.es(e,t).next(e=>(this.us.set(t,{size:e.size,readTime:e.document.readTime}),e.document))}getAllFromCache(e,t){return this.os.ss(e,t).next(({documents:e,rs:t})=>(t.forEach((t,n)=>{this.us.set(t,{size:n,readTime:e.get(t).readTime})}),e))}}function Qs(e){return Ye(e,"remoteDocumentGlobal")}function Ys(e){return Ye(e,"remoteDocumentsV14")}function Js(e){const t=e.path.toArray();return[t.slice(0,t.length-2),t[t.length-2],t[t.length-1]]}function Xs(e,t){const n=t.documentKey.path.toArray();return[e,Mi(t.readTime),n.slice(0,n.length-2),n.length>0?n[n.length-1]:""]}function Zs(e,t){const n=e.path.toArray(),r=t.path.toArray();let i=0;for(let e=0;e(p("RestConnection","Received: ",e),e),t=>{throw g("RestConnection",e+" failed with error: ",t,"url: ",s,"request:",n),t})}ji(e,t,n,r,i){return this.Bi(e,t,n,r,i)}qi(e,t,n){e["X-Goog-Api-Client"]="gl-js/ fire/"+h,e["Content-Type"]="text/plain",this.databaseInfo.appId&&(e["X-Firebase-GMPID"]=this.databaseInfo.appId),t&&t.headers.forEach((t,n)=>e[n]=t),n&&n.headers.forEach((t,n)=>e[n]=t)}Ui(e,t){const n=ps[e];return`${this.Mi}/v1/${t}:${n}`}}{constructor(e){super(e),this.forceLongPolling=e.forceLongPolling,this.autoDetectLongPolling=e.autoDetectLongPolling,this.useFetchStreams=e.useFetchStreams}Ki(e,t,n,r){return new Promise((i,s)=>{const o=new a.g;o.listenOnce(a.c.COMPLETE,()=>{try{switch(o.getLastErrorCode()){case a.a.NO_ERROR:const t=o.getResponseJson();p("Connection","XHR received:",JSON.stringify(t)),i(t);break;case a.a.TIMEOUT:p("Connection",'RPC "'+e+'" timed out'),s(new T(_.DEADLINE_EXCEEDED,"Request time out"));break;case a.a.HTTP_ERROR:const n=o.getStatus();if(p("Connection",'RPC "'+e+'" failed with status:',n,"response text:",o.getResponseText()),n>0){const e=o.getResponseJson().error;if(e&&e.status&&e.message){const t=function(e){const t=e.toLowerCase().replace(/_/g,"-");return Object.values(_).indexOf(t)>=0?t:_.UNKNOWN}(e.status);s(new T(t,e.message))}else s(new T(_.UNKNOWN,"Server responded with status "+o.getStatus()))}else s(new T(_.UNAVAILABLE,"Connection failed."));break;default:v()}}finally{p("Connection",'RPC "'+e+'" completed.')}});const c=JSON.stringify(r);o.send(t,"POST",c,n,15)})}Qi(e,t,n){const r=[this.Mi,"/","google.firestore.v1.Firestore","/",e,"/channel"],i=Object(a.h)(),s=Object(a.i)(),c={httpSessionIdParam:"gsessionid",initMessageHeaders:{},messageUrlParams:{database:`projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`},sendRawJson:!0,supportsCrossDomainXhr:!0,internalChannelParams:{forwardChannelRequestTimeoutMs:6e5},forceLongPolling:this.forceLongPolling,detectBufferingProxy:this.autoDetectLongPolling};this.useFetchStreams&&(c.xmlHttpFactory=new a.d({})),this.qi(c.initMessageHeaders,t,n),Object(o.s)()||Object(o.u)()||Object(o.o)()||Object(o.q)()||Object(o.w)()||Object(o.n)()||(c.httpHeadersOverwriteParam="$httpHeaders");const u=r.join("");p("Connection","Creating WebChannel: "+u,c);const h=i.createWebChannel(u,c);let l=!1,d=!1;const f=new ms({Vi:e=>{d?p("Connection","Not sending because WebChannel is closed:",e):(l||(p("Connection","Opening WebChannel transport."),h.open(),l=!0),p("Connection","WebChannel sending:",e),h.send(e))},Si:()=>h.close()}),m=(e,t,n)=>{e.listen(t,e=>{try{n(e)}catch(e){setTimeout(()=>{throw e},0)}})};return m(h,a.f.EventType.OPEN,()=>{d||p("Connection","WebChannel transport opened.")}),m(h,a.f.EventType.CLOSE,()=>{d||(d=!0,p("Connection","WebChannel transport closed"),f.Fi())}),m(h,a.f.EventType.ERROR,e=>{d||(d=!0,g("Connection","WebChannel transport errored:",e),f.Fi(new T(_.UNAVAILABLE,"The operation could not be completed")))}),m(h,a.f.EventType.MESSAGE,e=>{var t;if(!d){const n=e.data[0];w(!!n);const r=n,i=r.error||(null===(t=r[0])||void 0===t?void 0:t.error);if(i){p("Connection","WebChannel received error:",i);const e=i.status;let t=function(e){const t=Vt[e];if(void 0!==t)return zt(t)}(e),n=i.message;void 0===t&&(t=_.INTERNAL,n="Unknown error status: "+e+" with message "+i.message),d=!0,f.Fi(new T(t,n)),h.close()}else p("Connection","WebChannel received:",n),f.Oi(n)}}),m(s,a.b.STAT_EVENT,e=>{e.stat===a.e.PROXY?p("Connection","Detected buffering proxy"):e.stat===a.e.NOPROXY&&p("Connection","Detected no buffering proxy")}),setTimeout(()=>{f.$i()},0),f}} + */class to{constructor(e,t,n,r){this.remoteDocumentCache=e,this.mutationQueue=t,this.documentOverlayCache=n,this.indexManager=r}getDocument(e,t){let n=null;return this.documentOverlayCache.getOverlay(e,t).next(r=>(n=r,this.remoteDocumentCache.getEntry(e,t))).next(e=>(null!==n&&br(n.mutation,e,ot.empty(),j.now()),e))}getDocuments(e,t){return this.remoteDocumentCache.getEntries(e,t).next(t=>this.getLocalViewOfDocuments(e,t,Qn()).next(()=>t))}getLocalViewOfDocuments(e,t,n=Qn()){const r=Gn();return this.populateOverlays(e,r,t).next(()=>this.computeViews(e,t,r,n).next(e=>{let t=Bn();return e.forEach((e,n)=>{t=t.insert(e,n.overlayedDocument)}),t}))}getOverlayedDocuments(e,t){const n=Gn();return this.populateOverlays(e,n,t).next(()=>this.computeViews(e,t,n,Qn()))}populateOverlays(e,t,n){const r=[];return n.forEach(e=>{t.has(e)||r.push(e)}),this.documentOverlayCache.getOverlays(e,r).next(e=>{e.forEach((e,n)=>{t.set(e,n)})})}computeViews(e,t,n,r){let i=Un();const s=$n(),o=$n();return t.forEach((e,t)=>{const o=n.get(t.key);r.has(t.key)&&(void 0===o||o.mutation instanceof Er)?i=i.insert(t.key,t):void 0!==o?(s.set(t.key,o.mutation.getFieldMask()),br(o.mutation,t,o.mutation.getFieldMask(),j.now())):s.set(t.key,ot.empty())}),this.recalculateAndSaveOverlays(e,i).next(e=>(e.forEach((e,t)=>s.set(e,t)),t.forEach((e,t)=>{var n;return o.set(e,new eo(t,null!==(n=s.get(e))&&void 0!==n?n:null))}),o))}recalculateAndSaveOverlays(e,t){const n=$n();let r=new et((e,t)=>e-t),i=Qn();return this.mutationQueue.getAllMutationBatchesAffectingDocumentKeys(e,t).next(e=>{for(const i of e)i.keys().forEach(e=>{const s=t.get(e);if(null===s)return;let o=n.get(e)||ot.empty();o=i.applyToLocalView(s,o),n.set(e,o);const a=(r.get(i.batchId)||Qn()).add(e);r=r.insert(i.batchId,a)})}).next(()=>{const s=[],o=r.getReverseIterator();for(;o.hasNext();){const r=o.getNext(),a=r.key,c=r.value,u=Kn();c.forEach(e=>{if(!i.has(e)){const r=vr(t.get(e),n.get(e));null!==r&&u.set(e,r),i=i.add(e)}}),s.push(this.documentOverlayCache.saveOverlays(e,a,u))}return oe.waitFor(s)}).next(()=>n)}recalculateAndSaveOverlaysForDocumentKeys(e,t){return this.remoteDocumentCache.getEntries(e,t).next(t=>this.recalculateAndSaveOverlays(e,t))}getDocumentsMatchingQuery(e,t,n){return function(e){return K.isDocumentKey(e.path)&&null===e.collectionGroup&&0===e.filters.length}(t)?this.getDocumentsMatchingDocumentQuery(e,t.path):kn(t)?this.getDocumentsMatchingCollectionGroupQuery(e,t,n):this.getDocumentsMatchingCollectionQuery(e,t,n)}getNextDocuments(e,t,n,r){return this.remoteDocumentCache.getAllFromCollectionGroup(e,t,n,r).next(i=>{const s=r-i.size>0?this.documentOverlayCache.getOverlaysForCollectionGroup(e,t,n.largestBatchId,r-i.size):oe.resolve(Gn());let o=-1,a=i;return s.next(t=>oe.forEach(t,(t,n)=>(o{a=a.insert(t,e)}))).next(()=>this.populateOverlays(e,t,i)).next(()=>this.computeViews(e,a,t,Qn())).next(e=>({batchId:o,changes:zn(e)})))})}getDocumentsMatchingDocumentQuery(e,t){return this.getDocument(e,new K(t)).next(e=>{let t=Bn();return e.isFoundDocument()&&(t=t.insert(e.key,e)),t})}getDocumentsMatchingCollectionGroupQuery(e,t,n){const r=t.collectionGroup;let i=Bn();return this.indexManager.getCollectionParents(e,r).next(s=>oe.forEach(s,s=>{const o=function(e,t){return new bn(t,null,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,e.startAt,e.endAt)}(t,s.child(r));return this.getDocumentsMatchingCollectionQuery(e,o,n).next(e=>{e.forEach((e,t)=>{i=i.insert(e,t)})})}).next(()=>i))}getDocumentsMatchingCollectionQuery(e,t,n){let r;return this.documentOverlayCache.getOverlaysForCollection(e,t.path,n.largestBatchId).next(i=>(r=i,this.remoteDocumentCache.getDocumentsMatchingQuery(e,t,n,r))).next(e=>{r.forEach((t,n)=>{const r=n.getKey();null===e.get(r)&&(e=e.insert(r,qt.newInvalidDocument(r)))});let n=Bn();return e.forEach((e,i)=>{const s=r.get(e);void 0!==s&&br(s.mutation,i,ot.empty(),j.now()),Pn(t,i)&&(n=n.insert(e,i))}),n})}} /** * @license * Copyright 2020 Google LLC @@ -3206,10 +3287,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */class no{constructor(e){this.serializer=e,this.cs=new Map,this.hs=new Map}getBundleMetadata(e,t){return oe.resolve(this.cs.get(t))}saveBundleMetadata(e,t){var n;return this.cs.set(t.id,{id:(n=t).id,version:n.version,createTime:li(n.createTime)}),oe.resolve()}getNamedQuery(e,t){return oe.resolve(this.hs.get(t))}saveNamedQuery(e,t){return this.hs.set(t.name,function(e){return{name:e.name,query:Bi(e.bundledQuery),readTime:li(e.readTime)}}(t)),oe.resolve()}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3222,10 +3303,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ys(){return"undefined"!=typeof window?window:null}function vs(){return"undefined"!=typeof document?document:null} + */class ro{constructor(){this.overlays=new et(K.comparator),this.ls=new Map}getOverlay(e,t){return oe.resolve(this.overlays.get(t))}getOverlays(e,t){const n=Gn();return oe.forEach(t,t=>this.getOverlay(e,t).next(e=>{null!==e&&n.set(t,e)})).next(()=>n)}saveOverlays(e,t,n){return n.forEach((n,r)=>{this.we(e,t,r)}),oe.resolve()}removeOverlaysForBatchId(e,t,n){const r=this.ls.get(n);return void 0!==r&&(r.forEach(e=>this.overlays=this.overlays.remove(e)),this.ls.delete(n)),oe.resolve()}getOverlaysForCollection(e,t,n){const r=Gn(),i=t.length+1,s=new K(t.child("")),o=this.overlays.getIteratorFrom(s);for(;o.hasNext();){const e=o.getNext().value,s=e.getKey();if(!t.isPrefixOf(s.path))break;s.path.length===i&&e.largestBatchId>n&&r.set(e.getKey(),e)}return oe.resolve(r)}getOverlaysForCollectionGroup(e,t,n,r){let i=new et((e,t)=>e-t);const s=this.overlays.getIterator();for(;s.hasNext();){const e=s.getNext().value;if(e.getKey().getCollectionGroup()===t&&e.largestBatchId>n){let t=i.get(e.largestBatchId);null===t&&(t=Gn(),i=i.insert(e.largestBatchId,t)),t.set(e.getKey(),e)}}const o=Gn(),a=i.getIterator();for(;a.hasNext()&&(a.getNext().value.forEach((e,t)=>o.set(e,t)),!(o.size()>=r)););return oe.resolve(o)}we(e,t,n){const r=this.overlays.get(n.key);if(null!==r){const e=this.ls.get(r.largestBatchId).delete(n.key);this.ls.set(r.largestBatchId,e)}this.overlays=this.overlays.insert(n.key,new Rr(t,n));let i=this.ls.get(t);void 0===i&&(i=Qn(),this.ls.set(t,i)),this.ls.set(t,i.add(n.key))}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3238,7 +3319,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function ws(e){return new yn(e,!0)}class bs{constructor(e,t,n=1e3,r=1.5,i=6e4){this.Oe=e,this.timerId=t,this.Wi=n,this.Gi=r,this.zi=i,this.Hi=0,this.Ji=null,this.Yi=Date.now(),this.reset()}reset(){this.Hi=0}Xi(){this.Hi=this.zi}Zi(e){this.cancel();const t=Math.floor(this.Hi+this.tr()),n=Math.max(0,Date.now()-this.Yi),r=Math.max(0,t-n);r>0&&p("ExponentialBackoff",`Backing off for ${r} ms (base delay: ${this.Hi} ms, delay with jitter: ${t} ms, last attempt: ${n} ms ago)`),this.Ji=this.Oe.enqueueAfterDelay(this.timerId,r,()=>(this.Yi=Date.now(),e())),this.Hi*=this.Gi,this.Hithis.zi&&(this.Hi=this.zi)}er(){null!==this.Ji&&(this.Ji.skipDelay(),this.Ji=null)}cancel(){null!==this.Ji&&(this.Ji.cancel(),this.Ji=null)}tr(){return(Math.random()-.5)*this.Hi}} + */class io{constructor(){this.fs=new rt(so.ds),this.ws=new rt(so._s)}isEmpty(){return this.fs.isEmpty()}addReference(e,t){const n=new so(e,t);this.fs=this.fs.add(n),this.ws=this.ws.add(n)}gs(e,t){e.forEach(e=>this.addReference(e,t))}removeReference(e,t){this.ys(new so(e,t))}ps(e,t){e.forEach(e=>this.removeReference(e,t))}Is(e){const t=new K(new B([])),n=new so(t,e),r=new so(t,e+1),i=[];return this.ws.forEachInRange([n,r],e=>{this.ys(e),i.push(e.key)}),i}Ts(){this.fs.forEach(e=>this.ys(e))}ys(e){this.fs=this.fs.delete(e),this.ws=this.ws.delete(e)}Es(e){const t=new K(new B([])),n=new so(t,e),r=new so(t,e+1);let i=Qn();return this.ws.forEachInRange([n,r],e=>{i=i.add(e.key)}),i}containsKey(e){const t=new so(e,0),n=this.fs.firstAfterOrEqual(t);return null!==n&&e.isEqual(n.key)}}class so{constructor(e,t){this.key=e,this.As=t}static ds(e,t){return K.comparator(e.key,t.key)||M(e.As,t.As)}static _s(e,t){return M(e.As,t.As)||K.comparator(e.key,t.key)}} /** * @license * Copyright 2017 Google LLC @@ -3254,7 +3335,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Is{constructor(e,t,n,r,i,s,o,a){this.Oe=e,this.nr=n,this.sr=r,this.ir=i,this.authCredentialsProvider=s,this.appCheckCredentialsProvider=o,this.listener=a,this.state=0,this.rr=0,this.ar=null,this.cr=null,this.stream=null,this.ur=new bs(e,t)}hr(){return 1===this.state||5===this.state||this.lr()}lr(){return 2===this.state||3===this.state}start(){4!==this.state?this.auth():this.dr()}async stop(){this.hr()&&await this.close(0)}wr(){this.state=0,this.ur.reset()}_r(){this.lr()&&null===this.ar&&(this.ar=this.Oe.enqueueAfterDelay(this.nr,6e4,()=>this.mr()))}gr(e){this.yr(),this.stream.send(e)}async mr(){if(this.lr())return this.close(0)}yr(){this.ar&&(this.ar.cancel(),this.ar=null)}pr(){this.cr&&(this.cr.cancel(),this.cr=null)}async close(e,t){this.yr(),this.pr(),this.ur.cancel(),this.rr++,4!==e?this.ur.reset():t&&t.code===_.RESOURCE_EXHAUSTED?(m(t.toString()),m("Using maximum backoff delay to prevent overloading the backend."),this.ur.Xi()):t&&t.code===_.UNAUTHENTICATED&&3!==this.state&&(this.authCredentialsProvider.invalidateToken(),this.appCheckCredentialsProvider.invalidateToken()),null!==this.stream&&(this.Tr(),this.stream.close(),this.stream=null),this.state=e,await this.listener.Ni(t)}Tr(){}auth(){this.state=1;const e=this.Er(this.rr),t=this.rr;Promise.all([this.authCredentialsProvider.getToken(),this.appCheckCredentialsProvider.getToken()]).then(([e,n])=>{this.rr===t&&this.Ir(e,n)},t=>{e(()=>{const e=new T(_.UNKNOWN,"Fetching auth token failed: "+t.message);return this.Ar(e)})})}Ir(e,t){const n=this.Er(this.rr);this.stream=this.Rr(e,t),this.stream.Di(()=>{n(()=>(this.state=2,this.cr=this.Oe.enqueueAfterDelay(this.sr,1e4,()=>(this.lr()&&(this.state=3),Promise.resolve())),this.listener.Di()))}),this.stream.Ni(e=>{n(()=>this.Ar(e))}),this.stream.onMessage(e=>{n(()=>this.onMessage(e))})}dr(){this.state=5,this.ur.Zi(async()=>{this.state=0,this.start()})}Ar(e){return p("PersistentStream","close with error: "+e),this.stream=null,this.close(4,e)}Er(e){return t=>{this.Oe.enqueueAndForget(()=>this.rr===e?t():(p("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve()))}}}class _s extends Is{constructor(e,t,n,r,i,s){super(e,"listen_stream_connection_backoff","listen_stream_idle","health_check_timeout",t,n,r,s),this.k=i}Rr(e,t){return this.ir.Qi("Listen",e,t)}onMessage(e){this.ur.reset();const t=function(e,t){let n;if("targetChange"in t){t.targetChange;const r=function(e){return"NO_CHANGE"===e?0:"ADD"===e?1:"REMOVE"===e?2:"CURRENT"===e?3:"RESET"===e?4:v()}(t.targetChange.targetChangeType||"NO_CHANGE"),i=t.targetChange.targetIds||[],s=function(e,t){return e.C?(w(void 0===t||"string"==typeof t),Y.fromBase64String(t||"")):(w(void 0===t||t instanceof Uint8Array),Y.fromUint8Array(t||new Uint8Array))}(e,t.targetChange.resumeToken),o=t.targetChange.cause,a=o&&function(e){const t=void 0===e.code?_.UNKNOWN:zt(e.code);return new T(t,e.message||"")}(o);n=new hn(r,i,s,a||null)}else if("documentChange"in t){t.documentChange;const r=t.documentChange;r.document,r.document.name,r.document.updateTime;const i=kn(e,r.document.name),s=In(r.document.updateTime),o=new Ie({mapValue:{fields:r.document.fields}}),a=Te.newFoundDocument(i,s,o),c=r.targetIds||[],u=r.removedTargetIds||[];n=new cn(c,u,a.key,a)}else if("documentDelete"in t){t.documentDelete;const r=t.documentDelete;r.document;const i=kn(e,r.document),s=r.readTime?In(r.readTime):q.min(),o=Te.newNoDocument(i,s),a=r.removedTargetIds||[];n=new cn([],a,o.key,o)}else if("documentRemove"in t){t.documentRemove;const r=t.documentRemove;r.document;const i=kn(e,r.document),s=r.removedTargetIds||[];n=new cn([],s,i,null)}else{if(!("filter"in t))return v();{t.filter;const e=t.filter;e.targetId;const r=e.count||0,i=new Ut(r),s=e.targetId;n=new un(s,i)}}return n}(this.k,e),n=function(e){if(!("targetChange"in e))return q.min();const t=e.targetChange;return t.targetIds&&t.targetIds.length?q.min():t.readTime?In(t.readTime):q.min()}(e);return this.listener.Pr(t,n)}br(e){const t={};t.database=Nn(this.k),t.addTarget=function(e,t){let n;const r=t.target;return n=Ne(r)?{documents:Ln(e,r)}:{query:xn(e,r)},n.targetId=t.targetId,t.resumeToken.approximateByteSize()>0?n.resumeToken=wn(e,t.resumeToken):t.snapshotVersion.compareTo(q.min())>0&&(n.readTime=vn(e,t.snapshotVersion.toTimestamp())),n}(this.k,e);const n=function(e,t){const n=function(e,t){switch(t){case 0:return null;case 1:return"existence-filter-mismatch";case 2:return"limbo-document";default:return v()}}(0,t.purpose);return null==n?null:{"goog-listen-tags":n}}(this.k,e);n&&(t.labels=n),this.gr(t)}vr(e){const t={};t.database=Nn(this.k),t.removeTarget=e,this.gr(t)}}class Ts extends Is{constructor(e,t,n,r,i,s){super(e,"write_stream_connection_backoff","write_stream_idle","health_check_timeout",t,n,r,s),this.k=i,this.Vr=!1}get Sr(){return this.Vr}start(){this.Vr=!1,this.lastStreamToken=void 0,super.start()}Tr(){this.Vr&&this.Dr([])}Rr(e,t){return this.ir.Qi("Write",e,t)}onMessage(e){if(w(!!e.streamToken),this.lastStreamToken=e.streamToken,this.Vr){this.ur.reset();const t=function(e,t){return e&&e.length>0?(w(void 0!==t),e.map(e=>function(e,t){let n=e.updateTime?In(e.updateTime):In(t);return n.isEqual(q.min())&&(n=In(t)),new Tt(n,e.transformResults||[])}(e,t))):[]}(e.writeResults,e.commitTime),n=In(e.commitTime);return this.listener.Cr(n,t)}return w(!e.writeResults||0===e.writeResults.length),this.Vr=!0,this.listener.Nr()}kr(){const e={};e.database=Nn(this.k),this.gr(e)}Dr(e){const t={streamToken:this.lastStreamToken,writes:e.map(e=>Rn(this.k,e))};this.gr(t)}} + */class oo{constructor(e,t){this.indexManager=e,this.referenceDelegate=t,this.mutationQueue=[],this.vs=1,this.Rs=new rt(so.ds)}checkEmpty(e){return oe.resolve(0===this.mutationQueue.length)}addMutationBatch(e,t,n,r){const i=this.vs;this.vs++,this.mutationQueue.length>0&&this.mutationQueue[this.mutationQueue.length-1];const s=new Dr(i,t,n,r);this.mutationQueue.push(s);for(const t of r)this.Rs=this.Rs.add(new so(t.key,i)),this.indexManager.addToCollectionParentIndex(e,t.key.path.popLast());return oe.resolve(s)}lookupMutationBatch(e,t){return oe.resolve(this.Ps(t))}getNextMutationBatchAfterBatchId(e,t){const n=t+1,r=this.bs(n),i=r<0?0:r;return oe.resolve(this.mutationQueue.length>i?this.mutationQueue[i]:null)}getHighestUnacknowledgedBatchId(){return oe.resolve(0===this.mutationQueue.length?-1:this.vs-1)}getAllMutationBatches(e){return oe.resolve(this.mutationQueue.slice())}getAllMutationBatchesAffectingDocumentKey(e,t){const n=new so(t,0),r=new so(t,Number.POSITIVE_INFINITY),i=[];return this.Rs.forEachInRange([n,r],e=>{const t=this.Ps(e.As);i.push(t)}),oe.resolve(i)}getAllMutationBatchesAffectingDocumentKeys(e,t){let n=new rt(M);return t.forEach(e=>{const t=new so(e,0),r=new so(e,Number.POSITIVE_INFINITY);this.Rs.forEachInRange([t,r],e=>{n=n.add(e.As)})}),oe.resolve(this.Vs(n))}getAllMutationBatchesAffectingQuery(e,t){const n=t.path,r=n.length+1;let i=n;K.isDocumentKey(i)||(i=i.child(""));const s=new so(new K(i),0);let o=new rt(M);return this.Rs.forEachWhile(e=>{const t=e.key.path;return!!n.isPrefixOf(t)&&(t.length===r&&(o=o.add(e.As)),!0)},s),oe.resolve(this.Vs(o))}Vs(e){const t=[];return e.forEach(e=>{const n=this.Ps(e);null!==n&&t.push(n)}),t}removeMutationBatch(e,t){w(0===this.Ss(t.batchId,"removed")),this.mutationQueue.shift();let n=this.Rs;return oe.forEach(t.mutations,r=>{const i=new so(r.key,t.batchId);return n=n.delete(i),this.referenceDelegate.markPotentiallyOrphaned(e,r.key)}).next(()=>{this.Rs=n})}Cn(e){}containsKey(e,t){const n=new so(t,0),r=this.Rs.firstAfterOrEqual(n);return oe.resolve(t.isEqual(r&&r.key))}performConsistencyCheck(e){return this.mutationQueue.length,oe.resolve()}Ss(e,t){return this.bs(e)}bs(e){return 0===this.mutationQueue.length?0:e-this.mutationQueue[0].batchId}Ps(e){const t=this.bs(e);return t<0||t>=this.mutationQueue.length?null:this.mutationQueue[t]}} /** * @license * Copyright 2017 Google LLC @@ -3270,7 +3351,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Es extends class{}{constructor(e,t,n,r){super(),this.authCredentials=e,this.appCheckCredentials=t,this.ir=n,this.k=r,this.$r=!1}Fr(){if(this.$r)throw new T(_.FAILED_PRECONDITION,"The client has already been terminated.")}Bi(e,t,n){return this.Fr(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([r,i])=>this.ir.Bi(e,t,n,r,i)).catch(e=>{throw"FirebaseError"===e.name?(e.code===_.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),e):new T(_.UNKNOWN,e.toString())})}ji(e,t,n){return this.Fr(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([r,i])=>this.ir.ji(e,t,n,r,i)).catch(e=>{throw"FirebaseError"===e.name?(e.code===_.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),e):new T(_.UNKNOWN,e.toString())})}terminate(){this.$r=!0}}class ks{constructor(e,t){this.asyncQueue=e,this.onlineStateHandler=t,this.state="Unknown",this.Or=0,this.Mr=null,this.Lr=!0}Br(){0===this.Or&&(this.Ur("Unknown"),this.Mr=this.asyncQueue.enqueueAfterDelay("online_state_timeout",1e4,()=>(this.Mr=null,this.qr("Backend didn't respond within 10 seconds."),this.Ur("Offline"),Promise.resolve())))}Kr(e){"Online"===this.state?this.Ur("Unknown"):(this.Or++,this.Or>=1&&(this.jr(),this.qr("Connection failed 1 times. Most recent error: "+e.toString()),this.Ur("Offline")))}set(e){this.jr(),this.Or=0,"Online"===e&&(this.Lr=!1),this.Ur(e)}Ur(e){e!==this.state&&(this.state=e,this.onlineStateHandler(e))}qr(e){const t=`Could not reach Cloud Firestore backend. ${e}\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`;this.Lr?(m(t),this.Lr=!1):p("OnlineStateTracker",t)}jr(){null!==this.Mr&&(this.Mr.cancel(),this.Mr=null)}} + */class ao{constructor(e){this.Ds=e,this.docs=new et(K.comparator),this.size=0}setIndexManager(e){this.indexManager=e}addEntry(e,t){const n=t.key,r=this.docs.get(n),i=r?r.size:0,s=this.Ds(t);return this.docs=this.docs.insert(n,{document:t.mutableCopy(),size:s}),this.size+=s-i,this.indexManager.addToCollectionParentIndex(e,n.path.popLast())}removeEntry(e){const t=this.docs.get(e);t&&(this.docs=this.docs.remove(e),this.size-=t.size)}getEntry(e,t){const n=this.docs.get(t);return oe.resolve(n?n.document.mutableCopy():qt.newInvalidDocument(t))}getEntries(e,t){let n=Un();return t.forEach(e=>{const t=this.docs.get(e);n=n.insert(e,t?t.document.mutableCopy():qt.newInvalidDocument(e))}),oe.resolve(n)}getDocumentsMatchingQuery(e,t,n,r){let i=Un();const s=t.path,o=new K(s.child("")),a=this.docs.getIteratorFrom(o);for(;a.hasNext();){const{key:e,value:{document:o}}=a.getNext();if(!s.isPrefixOf(e.path))break;e.path.length>s.length+1||ne(ee(o),n)<=0||(r.has(o.key)||Pn(t,o))&&(i=i.insert(o.key,o.mutableCopy()))}return oe.resolve(i)}getAllFromCollectionGroup(e,t,n,r){v()}Cs(e,t){return oe.forEach(this.docs,e=>t(e))}newChangeBuffer(e){return new co(this)}getSize(e){return oe.resolve(this.size)}}class co extends Ks{constructor(e){super(),this.os=e}applyChanges(e){const t=[];return this.changes.forEach((n,r)=>{r.isValidDocument()?t.push(this.os.addEntry(e,r)):this.os.removeEntry(n)}),oe.waitFor(t)}getFromCache(e,t){return this.os.getEntry(e,t)}getAllFromCache(e,t){return this.os.getEntries(e,t)}} /** * @license * Copyright 2017 Google LLC @@ -3286,10 +3367,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ss{constructor(e,t,n,r,i){this.localStore=e,this.datastore=t,this.asyncQueue=n,this.remoteSyncer={},this.Qr=[],this.Wr=new Map,this.Gr=new Set,this.zr=[],this.Hr=i,this.Hr.Ei(e=>{n.enqueueAndForget(async()=>{xs(this)&&(p("RemoteStore","Restarting streams for network reachability change."),await async function(e){const t=I(e);t.Gr.add(4),await Ns(t),t.Jr.set("Unknown"),t.Gr.delete(4),await As(t)}(this))})}),this.Jr=new ks(n,r)}}async function As(e){if(xs(e))for(const t of e.zr)await t(!0)}async function Ns(e){for(const t of e.zr)await t(!1)}function Os(e,t){const n=I(e);n.Wr.has(t.targetId)||(n.Wr.set(t.targetId,t),Ls(n)?Ps(n):Xs(n).lr()&&Ds(n,t))}function Cs(e,t){const n=I(e),r=Xs(n);n.Wr.delete(t),r.lr()&&Rs(n,t),0===n.Wr.size&&(r.lr()?r._r():xs(n)&&n.Jr.set("Unknown"))}function Ds(e,t){e.Yr.X(t.targetId),Xs(e).br(t)}function Rs(e,t){e.Yr.X(t),Xs(e).vr(t)}function Ps(e){e.Yr=new dn({getRemoteKeysForTarget:t=>e.remoteSyncer.getRemoteKeysForTarget(t),Et:t=>e.Wr.get(t)||null}),Xs(e).start(),e.Jr.Br()}function Ls(e){return xs(e)&&!Xs(e).hr()&&e.Wr.size>0}function xs(e){return 0===I(e).Gr.size}function Ms(e){e.Yr=void 0}async function Fs(e){e.Wr.forEach((t,n)=>{Ds(e,t)})}async function js(e,t){Ms(e),Ls(e)?(e.Jr.Kr(t),Ps(e)):e.Jr.set("Unknown")}async function Us(e,t,n){if(e.Jr.set("Online"),t instanceof hn&&2===t.state&&t.cause)try{await async function(e,t){const n=t.cause;for(const r of t.targetIds)e.Wr.has(r)&&(await e.remoteSyncer.rejectListen(r,n),e.Wr.delete(r),e.Yr.removeTarget(r))}(e,t)}catch(n){p("RemoteStore","Failed to remove targets %s: %s ",t.targetIds.join(","),n),await Vs(e,n)}else if(t instanceof cn?e.Yr.ot(t):t instanceof un?e.Yr.dt(t):e.Yr.ut(t),!n.isEqual(q.min()))try{const t=await Fi(e.localStore);n.compareTo(t)>=0&&await function(e,t){const n=e.Yr.gt(t);return n.targetChanges.forEach((n,r)=>{if(n.resumeToken.approximateByteSize()>0){const i=e.Wr.get(r);i&&e.Wr.set(r,i.withResumeToken(n.resumeToken,t))}}),n.targetMismatches.forEach(t=>{const n=e.Wr.get(t);if(!n)return;e.Wr.set(t,n.withResumeToken(Y.EMPTY_BYTE_STRING,n.snapshotVersion)),Rs(e,t);const r=new Cr(n.target,t,1,n.sequenceNumber);Ds(e,r)}),e.remoteSyncer.applyRemoteEvent(n)}(e,n)}catch(t){p("RemoteStore","Failed to raise snapshot:",t),await Vs(e,t)}}async function Vs(e,t,n){if(!Ir(t))throw t;e.Gr.add(1),await Ns(e),e.Jr.set("Offline"),n||(n=()=>Fi(e.localStore)),e.asyncQueue.enqueueRetryable(async()=>{p("RemoteStore","Retrying IndexedDB access"),await n(),e.Gr.delete(1),await As(e)})}function qs(e,t){return t().catch(n=>Vs(e,n,t))}async function Bs(e){const t=I(e),n=Zs(t);let r=t.Qr.length>0?t.Qr[t.Qr.length-1].batchId:-1;for(;zs(t);)try{const e=await Ui(t.localStore,r);if(null===e){0===t.Qr.length&&n._r();break}r=e.batchId,Ks(t,e)}catch(e){await Vs(t,e)}Ws(t)&&Gs(t)}function zs(e){return xs(e)&&e.Qr.length<10}function Ks(e,t){e.Qr.push(t);const n=Zs(e);n.lr()&&n.Sr&&n.Dr(t.mutations)}function Ws(e){return xs(e)&&!Zs(e).hr()&&e.Qr.length>0}function Gs(e){Zs(e).start()}async function Hs(e){Zs(e).kr()}async function $s(e){const t=Zs(e);for(const n of e.Qr)t.Dr(n.mutations)}async function Qs(e,t,n){const r=e.Qr.shift(),i=Or.from(r,t,n);await qs(e,()=>e.remoteSyncer.applySuccessfulWrite(i)),await Bs(e)}async function Js(e,t){t&&Zs(e).Sr&&await async function(e,t){if(Bt(n=t.code)&&n!==_.ABORTED){const n=e.Qr.shift();Zs(e).wr(),await qs(e,()=>e.remoteSyncer.rejectFailedWrite(n.batchId,t)),await Bs(e)}var n}(e,t),Ws(e)&&Gs(e)}async function Ys(e,t){const n=I(e);t?(n.Gr.delete(2),await As(n)):t||(n.Gr.add(2),await Ns(n),n.Jr.set("Unknown"))}function Xs(e){return e.Xr||(e.Xr=function(e,t,n){const r=I(e);return r.Fr(),new _s(t,r.ir,r.authCredentials,r.appCheckCredentials,r.k,n) + */class uo{constructor(e){this.persistence=e,this.xs=new Vn(e=>pn(e),gn),this.lastRemoteSnapshotVersion=U.min(),this.highestTargetId=0,this.Ns=0,this.ks=new io,this.targetCount=0,this.Ms=xs.kn()}forEachTarget(e,t){return this.xs.forEach((e,n)=>t(n)),oe.resolve()}getLastRemoteSnapshotVersion(e){return oe.resolve(this.lastRemoteSnapshotVersion)}getHighestSequenceNumber(e){return oe.resolve(this.Ns)}allocateTargetId(e){return this.highestTargetId=this.Ms.next(),oe.resolve(this.highestTargetId)}setTargetsMetadata(e,t,n){return n&&(this.lastRemoteSnapshotVersion=n),t>this.Ns&&(this.Ns=t),oe.resolve()}Fn(e){this.xs.set(e.target,e);const t=e.targetId;t>this.highestTargetId&&(this.Ms=new xs(t),this.highestTargetId=t),e.sequenceNumber>this.Ns&&(this.Ns=e.sequenceNumber)}addTargetData(e,t){return this.Fn(t),this.targetCount+=1,oe.resolve()}updateTargetData(e,t){return this.Fn(t),oe.resolve()}removeTargetData(e,t){return this.xs.delete(t.target),this.ks.Is(t.targetId),this.targetCount-=1,oe.resolve()}removeTargets(e,t,n){let r=0;const i=[];return this.xs.forEach((s,o)=>{o.sequenceNumber<=t&&null===n.get(o.targetId)&&(this.xs.delete(s),i.push(this.removeMatchingKeysForTargetId(e,o.targetId)),r++)}),oe.waitFor(i).next(()=>r)}getTargetCount(e){return oe.resolve(this.targetCount)}getTargetData(e,t){const n=this.xs.get(t)||null;return oe.resolve(n)}addMatchingKeys(e,t,n){return this.ks.gs(t,n),oe.resolve()}removeMatchingKeys(e,t,n){this.ks.ps(t,n);const r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(t=>{i.push(r.markPotentiallyOrphaned(e,t))}),oe.waitFor(i)}removeMatchingKeysForTargetId(e,t){return this.ks.Is(t),oe.resolve()}getMatchingKeysForTargetId(e,t){const n=this.ks.Es(t);return oe.resolve(n)}containsKey(e,t){return oe.resolve(this.ks.containsKey(t))}} /** * @license - * Copyright 2018 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3302,10 +3383,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */}(e.datastore,e.asyncQueue,{Di:Fs.bind(null,e),Ni:js.bind(null,e),Pr:Us.bind(null,e)}),e.zr.push(async t=>{t?(e.Xr.wr(),Ls(e)?Ps(e):e.Jr.set("Unknown")):(await e.Xr.stop(),Ms(e))})),e.Xr}function Zs(e){return e.Zr||(e.Zr=function(e,t,n){const r=I(e);return r.Fr(),new Ts(t,r.ir,r.authCredentials,r.appCheckCredentials,r.k,n)}(e.datastore,e.asyncQueue,{Di:Hs.bind(null,e),Ni:Js.bind(null,e),Nr:$s.bind(null,e),Cr:Qs.bind(null,e)}),e.zr.push(async t=>{t?(e.Zr.wr(),await Bs(e)):(await e.Zr.stop(),e.Qr.length>0&&(p("RemoteStore",`Stopping write stream with ${e.Qr.length} pending writes`),e.Qr=[]))})),e.Zr + */class lo{constructor(e,t){this.$s={},this.overlays={},this.Os=new ve(0),this.Fs=!1,this.Fs=!0,this.referenceDelegate=e(this),this.Bs=new uo(this),this.indexManager=new gs,this.remoteDocumentCache=function(e){return new ao(e)}(e=>this.referenceDelegate.Ls(e)),this.serializer=new Pi(t),this.qs=new no(this.serializer)}start(){return Promise.resolve()}shutdown(){return this.Fs=!1,Promise.resolve()}get started(){return this.Fs}setDatabaseDeletedListener(){}setNetworkEnabled(){}getIndexManager(e){return this.indexManager}getDocumentOverlayCache(e){let t=this.overlays[e.toKey()];return t||(t=new ro,this.overlays[e.toKey()]=t),t}getMutationQueue(e,t){let n=this.$s[e.toKey()];return n||(n=new oo(t,this.referenceDelegate),this.$s[e.toKey()]=n),n}getTargetCache(){return this.Bs}getRemoteDocumentCache(){return this.remoteDocumentCache}getBundleCache(){return this.qs}runTransaction(e,t,n){p("MemoryPersistence","Starting transaction:",e);const r=new ho(this.Os.next());return this.referenceDelegate.Us(),n(r).next(e=>this.referenceDelegate.Ks(r).next(()=>e)).toPromise().then(e=>(r.raiseOnCommittedEvent(),e))}Gs(e,t){return oe.or(Object.values(this.$s).map(n=>()=>n.containsKey(e,t)))}}class ho extends ie{constructor(e){super(),this.currentSequenceNumber=e}}class fo{constructor(e){this.persistence=e,this.Qs=new io,this.js=null}static zs(e){return new fo(e)}get Ws(){if(this.js)return this.js;throw v()}addReference(e,t,n){return this.Qs.addReference(n,t),this.Ws.delete(n.toString()),oe.resolve()}removeReference(e,t,n){return this.Qs.removeReference(n,t),this.Ws.add(n.toString()),oe.resolve()}markPotentiallyOrphaned(e,t){return this.Ws.add(t.toString()),oe.resolve()}removeTarget(e,t){this.Qs.Is(t.targetId).forEach(e=>this.Ws.add(e.toString()));const n=this.persistence.getTargetCache();return n.getMatchingKeysForTargetId(e,t.targetId).next(e=>{e.forEach(e=>this.Ws.add(e.toString()))}).next(()=>n.removeTargetData(e,t))}Us(){this.js=new Set}Ks(e){const t=this.persistence.getRemoteDocumentCache().newChangeBuffer();return oe.forEach(this.Ws,n=>{const r=K.fromPath(n);return this.Hs(e,r).next(e=>{e||t.removeEntry(r,U.min())})}).next(()=>(this.js=null,t.apply(e)))}updateLimboDocument(e,t){return this.Hs(e,t).next(e=>{e?this.Ws.delete(t.toString()):this.Ws.add(t.toString())})}Ls(e){return 0}Hs(e,t){return oe.or([()=>oe.resolve(this.Qs.containsKey(t)),()=>this.persistence.getTargetCache().containsKey(e,t),()=>this.persistence.Gs(e,t)])}}class po{constructor(e,t){this.persistence=e,this.Js=new Vn(e=>_e(e.path),(e,t)=>e.isEqual(t)),this.garbageCollector=Bs(this,t)}static zs(e,t){return new po(e,t)}Us(){}Ks(e){return oe.resolve()}forEachTarget(e,t){return this.persistence.getTargetCache().forEachTarget(e,t)}zn(e){const t=this.Jn(e);return this.persistence.getTargetCache().getTargetCount(e).next(e=>t.next(t=>e+t))}Jn(e){let t=0;return this.Wn(e,e=>{t++}).next(()=>t)}Wn(e,t){return oe.forEach(this.Js,(n,r)=>this.Xn(e,n,r).next(e=>e?oe.resolve():t(r)))}removeTargets(e,t,n){return this.persistence.getTargetCache().removeTargets(e,t,n)}removeOrphanedDocuments(e,t){let n=0;const r=this.persistence.getRemoteDocumentCache(),i=r.newChangeBuffer();return r.Cs(e,r=>this.Xn(e,r,t).next(e=>{e||(n++,i.removeEntry(r,U.min()))})).next(()=>i.apply(e)).next(()=>n)}markPotentiallyOrphaned(e,t){return this.Js.set(t,e.currentSequenceNumber),oe.resolve()}removeTarget(e,t){const n=t.withSequenceNumber(e.currentSequenceNumber);return this.persistence.getTargetCache().updateTargetData(e,n)}addReference(e,t,n){return this.Js.set(n,e.currentSequenceNumber),oe.resolve()}removeReference(e,t,n){return this.Js.set(n,e.currentSequenceNumber),oe.resolve()}updateLimboDocument(e,t){return this.Js.set(t,e.currentSequenceNumber),oe.resolve()}Ls(e){let t=e.key.toString().length;return e.isFoundDocument()&&(t+=function e(t){switch(It(t)){case 0:case 1:return 4;case 2:return 8;case 3:case 8:return 16;case 4:const n=gt(t);return n?16+e(n):16;case 5:return 2*t.stringValue.length;case 6:return ft(t.bytesValue).approximateByteSize();case 7:return t.referenceValue.length;case 9:return(t.arrayValue.values||[]).reduce((t,n)=>t+e(n),0);case 10:return function(t){let n=0;return Xe(t.fields,(t,r)=>{n+=t.length+e(r)}),n}(t.mapValue);default:throw v()}}(e.data.value)),t}Xn(e,t,n){return oe.or([()=>this.persistence.Gs(e,t),()=>this.persistence.getTargetCache().containsKey(e,t),()=>{const e=this.Js.get(t);return oe.resolve(void 0!==e&&e>n)}])}getCacheSize(e){return this.persistence.getRemoteDocumentCache().getSize(e)}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3318,7 +3399,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */}class eo{constructor(e,t,n,r,i){this.asyncQueue=e,this.timerId=t,this.targetTimeMs=n,this.op=r,this.removalCallback=i,this.deferred=new E,this.then=this.deferred.promise.then.bind(this.deferred.promise),this.deferred.promise.catch(e=>{})}static createAndSchedule(e,t,n,r,i){const s=Date.now()+n,o=new eo(e,t,s,r,i);return o.start(n),o}start(e){this.timerHandle=setTimeout(()=>this.handleDelayElapsed(),e)}skipDelay(){return this.handleDelayElapsed()}cancel(e){null!==this.timerHandle&&(this.clearTimeout(),this.deferred.reject(new T(_.CANCELLED,"Operation cancelled"+(e?": "+e:""))))}handleDelayElapsed(){this.asyncQueue.enqueueAndForget(()=>null!==this.timerHandle?(this.clearTimeout(),this.op().then(e=>this.deferred.resolve(e))):Promise.resolve())}clearTimeout(){null!==this.timerHandle&&(this.removalCallback(this),clearTimeout(this.timerHandle),this.timerHandle=null)}}function to(e,t){if(m("AsyncQueue",`${t}: ${e}`),Ir(e))return new T(_.UNAVAILABLE,`${t}: ${e}`);throw e} + */class go{constructor(e){this.serializer=e}O(e,t,n,r){const i=new ae("createOrUpgrade",t);n<1&&r>=1&&(function(e){e.createObjectStore("owner")}(e),function(e){e.createObjectStore("mutationQueues",{keyPath:"userId"}),e.createObjectStore("mutations",{keyPath:"batchId",autoIncrement:!0}).createIndex("userMutationsIndex",ke,{unique:!0}),e.createObjectStore("documentMutations")}(e),mo(e),function(e){e.createObjectStore("remoteDocuments")}(e));let s=oe.resolve();return n<3&&r>=3&&(0!==n&&(function(e){e.deleteObjectStore("targetDocuments"),e.deleteObjectStore("targets"),e.deleteObjectStore("targetGlobal")}(e),mo(e)),s=s.next(()=>function(e){const t=e.store("targetGlobal"),n={highestTargetId:0,highestListenSequenceNumber:0,lastRemoteSnapshotVersion:U.min().toTimestamp(),targetCount:0};return t.put("targetGlobalKey",n)}(i))),n<4&&r>=4&&(0!==n&&(s=s.next(()=>function(e,t){return t.store("mutations").j().next(n=>{e.deleteObjectStore("mutations"),e.createObjectStore("mutations",{keyPath:"batchId",autoIncrement:!0}).createIndex("userMutationsIndex",ke,{unique:!0});const r=t.store("mutations"),i=n.map(e=>r.put(e));return oe.waitFor(i)})}(e,i))),s=s.next(()=>{!function(e){e.createObjectStore("clientMetadata",{keyPath:"clientId"})}(e)})),n<5&&r>=5&&(s=s.next(()=>this.Ys(i))),n<6&&r>=6&&(s=s.next(()=>(function(e){e.createObjectStore("remoteDocumentGlobal")}(e),this.Xs(i)))),n<7&&r>=7&&(s=s.next(()=>this.Zs(i))),n<8&&r>=8&&(s=s.next(()=>this.ti(e,i))),n<9&&r>=9&&(s=s.next(()=>{!function(e){e.objectStoreNames.contains("remoteDocumentChanges")&&e.deleteObjectStore("remoteDocumentChanges")}(e)})),n<10&&r>=10&&(s=s.next(()=>this.ei(i))),n<11&&r>=11&&(s=s.next(()=>{!function(e){e.createObjectStore("bundles",{keyPath:"bundleId"})}(e),function(e){e.createObjectStore("namedQueries",{keyPath:"name"})}(e)})),n<12&&r>=12&&(s=s.next(()=>{!function(e){const t=e.createObjectStore("documentOverlays",{keyPath:qe});t.createIndex("collectionPathOverlayIndex",Be,{unique:!1}),t.createIndex("collectionGroupOverlayIndex",ze,{unique:!1})}(e)})),n<13&&r>=13&&(s=s.next(()=>function(e){const t=e.createObjectStore("remoteDocumentsV14",{keyPath:De});t.createIndex("documentKeyIndex",Oe),t.createIndex("collectionGroupIndex",Re)}(e)).next(()=>this.ni(e,i)).next(()=>e.deleteObjectStore("remoteDocuments"))),n<14&&r>=14&&(s=s.next(()=>this.si(e,i))),n<15&&r>=15&&(s=s.next(()=>function(e){e.createObjectStore("indexConfiguration",{keyPath:"indexId",autoIncrement:!0}).createIndex("collectionGroupIndex","collectionGroup",{unique:!1}),e.createObjectStore("indexState",{keyPath:Fe}).createIndex("sequenceNumberIndex",Ve,{unique:!1}),e.createObjectStore("indexEntries",{keyPath:je}).createIndex("documentKeyIndex",Ue,{unique:!1})}(e))),s}Xs(e){let t=0;return e.store("remoteDocuments").X((e,n)=>{t+=Cs(n)}).next(()=>{const n={byteSize:t};return e.store("remoteDocumentGlobal").put("remoteDocumentGlobalKey",n)})}Ys(e){const t=e.store("mutationQueues"),n=e.store("mutations");return t.j().next(t=>oe.forEach(t,t=>{const r=IDBKeyRange.bound([t.userId,-1],[t.userId,t.lastAcknowledgedBatchId]);return n.j("userMutationsIndex",r).next(n=>oe.forEach(n,n=>{w(n.userId===t.userId);const r=ji(this.serializer,n);return ks(e,t.userId,r).next(()=>{})}))}))}Zs(e){const t=e.store("targetDocuments"),n=e.store("remoteDocuments");return e.store("targetGlobal").get("targetGlobalKey").next(e=>{const r=[];return n.X((n,i)=>{const s=new B(n),o=function(e){return[0,_e(e)]}(s);r.push(t.get(o).next(n=>n?oe.resolve():(n=>t.put({targetId:0,path:_e(n),sequenceNumber:e.highestListenSequenceNumber}))(s)))}).next(()=>oe.waitFor(r))})}ti(e,t){e.createObjectStore("collectionParents",{keyPath:Me});const n=t.store("collectionParents"),r=new ms,i=e=>{if(r.add(e)){const t=e.lastSegment(),r=e.popLast();return n.put({collectionId:t,parent:_e(r)})}};return t.store("remoteDocuments").X({Y:!0},(e,t)=>{const n=new B(e);return i(n.popLast())}).next(()=>t.store("documentMutations").X({Y:!0},([e,t,n],r)=>{const s=Se(t);return i(s.popLast())}))}ei(e){const t=e.store("targets");return t.X((e,n)=>{const r=Ui(n),i=qi(this.serializer,r);return t.put(i)})}ni(e,t){const n=t.store("remoteDocuments"),r=[];return n.X((e,n)=>{const i=t.store("remoteDocumentsV14"),s=(o=n,o.document?new K(B.fromString(o.document.name).popFirst(5)):o.noDocument?K.fromSegments(o.noDocument.path):o.unknownDocument?K.fromSegments(o.unknownDocument.path):v()).path.toArray();var o; /** * @license * Copyright 2017 Google LLC @@ -3334,7 +3415,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class no{constructor(e){this.comparator=e?(t,n)=>e(t,n)||ae.comparator(t.key,n.key):(e,t)=>ae.comparator(e.key,t.key),this.keyedMap=Xt(),this.sortedSet=new Kt(this.comparator)}static emptySet(e){return new no(e.comparator)}has(e){return null!=this.keyedMap.get(e)}get(e){return this.keyedMap.get(e)}first(){return this.sortedSet.minKey()}last(){return this.sortedSet.maxKey()}isEmpty(){return this.sortedSet.isEmpty()}indexOf(e){const t=this.keyedMap.get(e);return t?this.sortedSet.indexOf(t):-1}get size(){return this.sortedSet.size}forEach(e){this.sortedSet.inorderTraversal((t,n)=>(e(t),!1))}add(e){const t=this.delete(e.key);return t.copy(t.keyedMap.insert(e.key,e),t.sortedSet.insert(e,null))}delete(e){const t=this.get(e);return t?this.copy(this.keyedMap.remove(e),this.sortedSet.remove(t)):this}isEqual(e){if(!(e instanceof no))return!1;if(this.size!==e.size)return!1;const t=this.sortedSet.getIterator(),n=e.sortedSet.getIterator();for(;t.hasNext();){const e=t.getNext().key,r=n.getNext().key;if(!e.isEqual(r))return!1}return!0}toString(){const e=[];return this.forEach(t=>{e.push(t.toString())}),0===e.length?"DocumentSet ()":"DocumentSet (\n "+e.join(" \n")+"\n)"}copy(e,t){const n=new no;return n.comparator=this.comparator,n.keyedMap=e,n.sortedSet=t,n}} + */const a={prefixPath:s.slice(0,s.length-2),collectionGroup:s[s.length-2],documentId:s[s.length-1],readTime:n.readTime||[0,0],unknownDocument:n.unknownDocument,noDocument:n.noDocument,document:n.document,hasCommittedMutations:!!n.hasCommittedMutations};r.push(i.put(a))}).next(()=>oe.waitFor(r))}si(e,t){const n=t.store("mutations"),r=Ws(this.serializer),i=new lo(fo.zs,this.serializer.fe);return n.j().next(e=>{const n=new Map;return e.forEach(e=>{var t;let r=null!==(t=n.get(e.userId))&&void 0!==t?t:Qn();ji(this.serializer,e).keys().forEach(e=>r=r.add(e)),n.set(e.userId,r)}),oe.forEach(n,(e,n)=>{const s=new u(n),o=Qi.de(this.serializer,s),a=i.getIndexManager(s),c=As.de(s,this.serializer,a,i.referenceDelegate);return new to(r,c,o,a).recalculateAndSaveOverlaysForDocumentKeys(new Qe(t,ve.ct),e).next()})})}}function mo(e){e.createObjectStore("targetDocuments",{keyPath:Pe}).createIndex("documentTargetsIndex",Le,{unique:!0}),e.createObjectStore("targets",{keyPath:"targetId"}).createIndex("queryTargetsIndex",xe,{unique:!0}),e.createObjectStore("targetGlobal")}const yo="Failed to obtain exclusive access to the persistence layer. To allow shared access, multi-tab synchronization has to be enabled in all tabs. If you are using `experimentalForceOwningTab:true`, make sure that only one tab has persistence enabled at any given time.";class vo{constructor(e,t,n,r,i,s,o,a,c,u,l=15){if(this.allowTabSynchronization=e,this.persistenceKey=t,this.clientId=n,this.ii=i,this.window=s,this.document=o,this.ri=c,this.oi=u,this.ui=l,this.Os=null,this.Fs=!1,this.isPrimary=!1,this.networkEnabled=!0,this.ci=null,this.inForeground=!1,this.ai=null,this.hi=null,this.li=Number.NEGATIVE_INFINITY,this.fi=e=>Promise.resolve(),!vo.D())throw new T(_.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new zs(this,r),this.di=t+"main",this.serializer=new Pi(a),this.wi=new ce(this.di,this.ui,new go(this.serializer)),this.Bs=new Ps(this.referenceDelegate,this.serializer),this.remoteDocumentCache=Ws(this.serializer),this.qs=new $i,this.window&&this.window.localStorage?this._i=this.window.localStorage:(this._i=null,!1===u&&g("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}start(){return this.mi().then(()=>{if(!this.isPrimary&&!this.allowTabSynchronization)throw new T(_.FAILED_PRECONDITION,yo);return this.gi(),this.yi(),this.pi(),this.runTransaction("getHighestListenSequenceNumber","readonly",e=>this.Bs.getHighestSequenceNumber(e))}).then(e=>{this.Os=new ve(e,this.ri)}).then(()=>{this.Fs=!0}).catch(e=>(this.wi&&this.wi.close(),Promise.reject(e)))}Ii(e){return this.fi=async t=>{if(this.started)return e(t)},e(this.isPrimary)}setDatabaseDeletedListener(e){this.wi.B(async t=>{null===t.newVersion&&await e()})}setNetworkEnabled(e){this.networkEnabled!==e&&(this.networkEnabled=e,this.ii.enqueueAndForget(async()=>{this.started&&await this.mi()}))}mi(){return this.runTransaction("updateClientMetadataAndTryBecomePrimary","readwrite",e=>bo(e).put({clientId:this.clientId,updateTimeMs:Date.now(),networkEnabled:this.networkEnabled,inForeground:this.inForeground}).next(()=>{if(this.isPrimary)return this.Ti(e).next(e=>{e||(this.isPrimary=!1,this.ii.enqueueRetryable(()=>this.fi(!1)))})}).next(()=>this.Ei(e)).next(t=>this.isPrimary&&!t?this.Ai(e).next(()=>!1):!!t&&this.vi(e).next(()=>!0))).catch(e=>{if(he(e))return p("IndexedDbPersistence","Failed to extend owner lease: ",e),this.isPrimary;if(!this.allowTabSynchronization)throw e;return p("IndexedDbPersistence","Releasing owner lease after error during lease refresh",e),!1}).then(e=>{this.isPrimary!==e&&this.ii.enqueueRetryable(()=>this.fi(e)),this.isPrimary=e})}Ti(e){return wo(e).get("owner").next(e=>oe.resolve(this.Ri(e)))}Pi(e){return bo(e).delete(this.clientId)}async bi(){if(this.isPrimary&&!this.Vi(this.li,18e5)){this.li=Date.now();const e=await this.runTransaction("maybeGarbageCollectMultiClientState","readwrite-primary",e=>{const t=Ye(e,"clientMetadata");return t.j().next(e=>{const n=this.Si(e,18e5),r=e.filter(e=>-1===n.indexOf(e));return oe.forEach(r,e=>t.delete(e.clientId)).next(()=>r)})}).catch(()=>[]);if(this._i)for(const t of e)this._i.removeItem(this.Di(t.clientId))}}pi(){this.hi=this.ii.enqueueAfterDelay("client_metadata_refresh",4e3,()=>this.mi().then(()=>this.bi()).then(()=>this.pi()))}Ri(e){return!!e&&e.ownerId===this.clientId}Ei(e){return this.oi?oe.resolve(!0):wo(e).get("owner").next(t=>{if(null!==t&&this.Vi(t.leaseTimestampMs,5e3)&&!this.Ci(t.ownerId)){if(this.Ri(t)&&this.networkEnabled)return!0;if(!this.Ri(t)){if(!t.allowTabSynchronization)throw new T(_.FAILED_PRECONDITION,yo);return!1}}return!(!this.networkEnabled||!this.inForeground)||bo(e).j().next(e=>void 0===this.Si(e,5e3).find(e=>{if(this.clientId!==e.clientId){const t=!this.networkEnabled&&e.networkEnabled,n=!this.inForeground&&e.inForeground,r=this.networkEnabled===e.networkEnabled;if(t||n&&r)return!0}return!1}))}).next(e=>(this.isPrimary!==e&&p("IndexedDbPersistence",`Client ${e?"is":"is not"} eligible for a primary lease.`),e))}async shutdown(){this.Fs=!1,this.xi(),this.hi&&(this.hi.cancel(),this.hi=null),this.Ni(),this.ki(),await this.wi.runTransaction("shutdown","readwrite",["owner","clientMetadata"],e=>{const t=new Qe(e,ve.ct);return this.Ai(t).next(()=>this.Pi(t))}),this.wi.close(),this.Mi()}Si(e,t){return e.filter(e=>this.Vi(e.updateTimeMs,t)&&!this.Ci(e.clientId))}$i(){return this.runTransaction("getActiveClients","readonly",e=>bo(e).j().next(e=>this.Si(e,18e5).map(e=>e.clientId)))}get started(){return this.Fs}getMutationQueue(e,t){return As.de(e,this.serializer,t,this.referenceDelegate)}getTargetCache(){return this.Bs}getRemoteDocumentCache(){return this.remoteDocumentCache}getIndexManager(e){return new vs(e,this.serializer.fe.databaseId)}getDocumentOverlayCache(e){return Qi.de(this.serializer,e)}getBundleCache(){return this.qs}runTransaction(e,t,n){p("IndexedDbPersistence","Starting transaction:",e);const r="readonly"===t?"readonly":"readwrite",i=15===(s=this.ui)?He:14===s?We:13===s?$e:12===s?Ke:11===s?Ge:void v();var s;let o;return this.wi.runTransaction(e,r,i,r=>(o=new Qe(r,this.Os?this.Os.next():ve.ct),"readwrite-primary"===t?this.Ti(o).next(e=>!!e||this.Ei(o)).next(t=>{if(!t)throw g(`Failed to obtain primary lease for action '${e}'.`),this.isPrimary=!1,this.ii.enqueueRetryable(()=>this.fi(!1)),new T(_.FAILED_PRECONDITION,re);return n(o)}).next(e=>this.vi(o).next(()=>e)):this.Oi(o).next(()=>n(o)))).then(e=>(o.raiseOnCommittedEvent(),e))}Oi(e){return wo(e).get("owner").next(e=>{if(null!==e&&this.Vi(e.leaseTimestampMs,5e3)&&!this.Ci(e.ownerId)&&!this.Ri(e)&&!(this.oi||this.allowTabSynchronization&&e.allowTabSynchronization))throw new T(_.FAILED_PRECONDITION,yo)})}vi(e){const t={ownerId:this.clientId,allowTabSynchronization:this.allowTabSynchronization,leaseTimestampMs:Date.now()};return wo(e).put("owner",t)}static D(){return ce.D()}Ai(e){const t=wo(e);return t.get("owner").next(e=>this.Ri(e)?(p("IndexedDbPersistence","Releasing primary lease."),t.delete("owner")):oe.resolve())}Vi(e,t){const n=Date.now();return!(en&&(g(`Detected an update time that is in the future: ${e} > ${n}`),1))}gi(){null!==this.document&&"function"==typeof this.document.addEventListener&&(this.ai=()=>{this.ii.enqueueAndForget(()=>(this.inForeground="visible"===this.document.visibilityState,this.mi()))},this.document.addEventListener("visibilitychange",this.ai),this.inForeground="visible"===this.document.visibilityState)}Ni(){this.ai&&(this.document.removeEventListener("visibilitychange",this.ai),this.ai=null)}yi(){var e;"function"==typeof(null===(e=this.window)||void 0===e?void 0:e.addEventListener)&&(this.ci=()=>{this.xi();const e=/(?:Version|Mobile)\/1[456]/;Object(o.z)()&&(navigator.appVersion.match(e)||navigator.userAgent.match(e))&&this.ii.enterRestrictedMode(!0),this.ii.enqueueAndForget(()=>this.shutdown())},this.window.addEventListener("pagehide",this.ci))}ki(){this.ci&&(this.window.removeEventListener("pagehide",this.ci),this.ci=null)}Ci(e){var t;try{const n=null!==(null===(t=this._i)||void 0===t?void 0:t.getItem(this.Di(e)));return p("IndexedDbPersistence",`Client '${e}' ${n?"is":"is not"} zombied in LocalStorage`),n}catch(e){return g("IndexedDbPersistence","Failed to get zombied client id.",e),!1}}xi(){if(this._i)try{this._i.setItem(this.Di(this.clientId),String(Date.now()))}catch(e){g("Failed to set zombie client id.",e)}}Mi(){if(this._i)try{this._i.removeItem(this.Di(this.clientId))}catch(e){}}Di(e){return`firestore_zombie_${this.persistenceKey}_${e}`}}function wo(e){return Ye(e,"owner")}function bo(e){return Ye(e,"clientMetadata")}function Io(e,t){let n=e.projectId;return e.isDefaultDatabase||(n+="."+e.database),"firestore/"+t+"/"+n+"/" /** * @license * Copyright 2017 Google LLC @@ -3350,10 +3431,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ro{constructor(){this.eo=new Kt(ae.comparator)}track(e){const t=e.doc.key,n=this.eo.get(t);n?0!==e.type&&3===n.type?this.eo=this.eo.insert(t,e):3===e.type&&1!==n.type?this.eo=this.eo.insert(t,{type:n.type,doc:e.doc}):2===e.type&&2===n.type?this.eo=this.eo.insert(t,{type:2,doc:e.doc}):2===e.type&&0===n.type?this.eo=this.eo.insert(t,{type:0,doc:e.doc}):1===e.type&&0===n.type?this.eo=this.eo.remove(t):1===e.type&&2===n.type?this.eo=this.eo.insert(t,{type:1,doc:n.doc}):0===e.type&&1===n.type?this.eo=this.eo.insert(t,{type:2,doc:e.doc}):v():this.eo=this.eo.insert(t,e)}no(){const e=[];return this.eo.inorderTraversal((t,n)=>{e.push(n)}),e}}class io{constructor(e,t,n,r,i,s,o,a){this.query=e,this.docs=t,this.oldDocs=n,this.docChanges=r,this.mutatedKeys=i,this.fromCache=s,this.syncStateChanged=o,this.excludesMetadataChanges=a}static fromInitialDocuments(e,t,n,r){const i=[];return t.forEach(e=>{i.push({type:0,doc:e})}),new io(e,t,no.emptySet(t),i,n,r,!0,!1)}get hasPendingWrites(){return!this.mutatedKeys.isEmpty()}isEqual(e){if(!(this.fromCache===e.fromCache&&this.syncStateChanged===e.syncStateChanged&&this.mutatedKeys.isEqual(e.mutatedKeys)&&tt(this.query,e.query)&&this.docs.isEqual(e.docs)&&this.oldDocs.isEqual(e.oldDocs)))return!1;const t=this.docChanges,n=e.docChanges;if(t.length!==n.length)return!1;for(let e=0;ent(e),tt),this.onlineState="Unknown",this.io=new Set}}async function ao(e,t){const n=I(e),r=t.query;let i=!1,s=n.queries.get(r);if(s||(i=!0,s=new so),i)try{s.so=await n.onListen(r)}catch(e){const n=to(e,`Initialization of query '${rt(t.query)}' failed`);return void t.onError(n)}n.queries.set(r,s),s.listeners.push(t),t.ro(n.onlineState),s.so&&t.oo(s.so)&&lo(n)}async function co(e,t){const n=I(e),r=t.query;let i=!1;const s=n.queries.get(r);if(s){const e=s.listeners.indexOf(t);e>=0&&(s.listeners.splice(e,1),i=0===s.listeners.length)}if(i)return n.queries.delete(r),n.onUnlisten(r)}function uo(e,t){const n=I(e);let r=!1;for(const e of t){const t=e.query,i=n.queries.get(t);if(i){for(const t of i.listeners)t.oo(e)&&(r=!0);i.so=e}}r&&lo(n)}function ho(e,t,n){const r=I(e),i=r.queries.get(t);if(i)for(const e of i.listeners)e.onError(n);r.queries.delete(t)}function lo(e){e.io.forEach(e=>{e.next()})}class fo{constructor(e,t,n){this.query=e,this.ao=t,this.co=!1,this.uo=null,this.onlineState="Unknown",this.options=n||{}}oo(e){if(!this.options.includeMetadataChanges){const t=[];for(const n of e.docChanges)3!==n.type&&t.push(n);e=new io(e.query,e.docs,e.oldDocs,t,e.mutatedKeys,e.fromCache,e.syncStateChanged,!0)}let t=!1;return this.co?this.ho(e)&&(this.ao.next(e),t=!0):this.lo(e,this.onlineState)&&(this.fo(e),t=!0),this.uo=e,t}onError(e){this.ao.error(e)}ro(e){this.onlineState=e;let t=!1;return this.uo&&!this.co&&this.lo(this.uo,e)&&(this.fo(this.uo),t=!0),t}lo(e,t){if(!e.fromCache)return!0;const n="Offline"!==t;return!(this.options.wo&&n||e.docs.isEmpty()&&"Offline"!==t)}ho(e){if(e.docChanges.length>0)return!0;const t=this.uo&&this.uo.hasPendingWrites!==e.hasPendingWrites;return!(!e.syncStateChanged&&!t)&&!0===this.options.includeMetadataChanges}fo(e){e=io.fromInitialDocuments(e.query,e.docs,e.mutatedKeys,e.fromCache),this.co=!0,this.ao.next(e)}} + */class To{constructor(){this.qi=!1}initialize(e,t){this.Ui=e,this.indexManager=t,this.qi=!0}getDocumentsMatchingQuery(e,t,n,r){return this.Ki(e,t).next(i=>i||this.Gi(e,t,r,n)).next(n=>n||this.Qi(e,t))}Ki(e,t){if(Tn(t))return oe.resolve(null);let n=An(t);return this.indexManager.getIndexType(e,n).next(r=>0===r?null:(null!==t.limit&&1===r&&(t=Dn(t,null,"F"),n=An(t)),this.indexManager.getDocumentsMatchingTarget(e,n).next(r=>{const i=Qn(...r);return this.Ui.getDocuments(e,i).next(r=>this.indexManager.getMinOffset(e,n).next(n=>{const s=this.ji(t,r);return this.zi(t,s,i,n.readTime)?this.Ki(e,Dn(t,null,"F")):this.Wi(e,s,t,n)}))})))}Gi(e,t,n,r){return Tn(t)||r.isEqual(U.min())?this.Qi(e,t):this.Ui.getDocuments(e,n).next(i=>{const o=this.ji(t,i);return this.zi(t,o,n,r)?this.Qi(e,t):(d()<=s.a.DEBUG&&p("QueryEngine","Re-using previous result from %s to execute query: %s",r.toString(),xn(t)),this.Wi(e,o,t,Z(r,-1)))})}ji(e,t){let n=new rt(Mn(e));return t.forEach((t,r)=>{Pn(e,r)&&(n=n.add(r))}),n}zi(e,t,n,r){if(null===e.limit)return!1;if(n.size!==t.size)return!0;const i="F"===e.limitType?t.last():t.first();return!!i&&(i.hasPendingWrites||i.version.compareTo(r)>0)}Qi(e,t){return d()<=s.a.DEBUG&&p("QueryEngine","Using full collection scan to execute query:",xn(t)),this.Ui.getDocumentsMatchingQuery(e,t,te.min())}Wi(e,t,n,r){return this.Ui.getDocumentsMatchingQuery(e,n,r).next(e=>(t.forEach(t=>{e=e.insert(t.key,t)}),e))}} /** * @license * Copyright 2020 Google LLC @@ -3382,10 +3463,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class po{constructor(e,t){this.payload=e,this.byteLength=t}_o(){return"metadata"in this.payload}} + */class Eo{constructor(e,t,n,r){this.persistence=e,this.Hi=t,this.serializer=r,this.Ji=new et(M),this.Yi=new Vn(e=>pn(e),gn),this.Xi=new Map,this.Zi=e.getRemoteDocumentCache(),this.Bs=e.getTargetCache(),this.qs=e.getBundleCache(),this.tr(n)}tr(e){this.documentOverlayCache=this.persistence.getDocumentOverlayCache(e),this.indexManager=this.persistence.getIndexManager(e),this.mutationQueue=this.persistence.getMutationQueue(e,this.indexManager),this.localDocuments=new to(this.Zi,this.mutationQueue,this.documentOverlayCache,this.indexManager),this.Zi.setIndexManager(this.indexManager),this.Hi.initialize(this.localDocuments,this.indexManager)}collectGarbage(e){return this.persistence.runTransaction("Collect garbage","readwrite-primary",t=>e.collect(t,this.Ji))}}function So(e,t,n,r){return new Eo(e,t,n,r)}async function ko(e,t){const n=I(e);return await n.persistence.runTransaction("Handle user change","readonly",e=>{let r;return n.mutationQueue.getAllMutationBatches(e).next(i=>(r=i,n.tr(t),n.mutationQueue.getAllMutationBatches(e))).next(t=>{const i=[],s=[];let o=Qn();for(const e of r){i.push(e.batchId);for(const t of e.mutations)o=o.add(t.key)}for(const e of t){s.push(e.batchId);for(const t of e.mutations)o=o.add(t.key)}return n.localDocuments.getDocuments(e,o).next(e=>({er:e,removedBatchIds:i,addedBatchIds:s}))})})}function Co(e){const t=I(e);return t.persistence.runTransaction("Get last remote snapshot version","readonly",e=>t.Bs.getLastRemoteSnapshotVersion(e))}function Ao(e,t,n){let r=Qn(),i=Qn();return n.forEach(e=>r=r.add(e)),t.getEntries(e,r).next(e=>{let r=Un();return n.forEach((n,s)=>{const o=e.get(n);s.isFoundDocument()!==o.isFoundDocument()&&(i=i.add(n)),s.isNoDocument()&&s.version.isEqual(U.min())?(t.removeEntry(n,s.readTime),r=r.insert(n,s)):!o.isValidDocument()||s.version.compareTo(o.version)>0||0===s.version.compareTo(o.version)&&o.hasPendingWrites?(t.addEntry(s),r=r.insert(n,s)):p("LocalStore","Ignoring outdated watch update for ",n,". Current version:",o.version," Watch version:",s.version)}),{nr:r,sr:i}})}function No(e,t){const n=I(e);return n.persistence.runTransaction("Get next mutation batch","readonly",e=>(void 0===t&&(t=-1),n.mutationQueue.getNextMutationBatchAfterBatchId(e,t)))}function Do(e,t){const n=I(e);return n.persistence.runTransaction("Allocate target","readwrite",e=>{let r;return n.Bs.getTargetData(e,t).next(i=>i?(r=i,oe.resolve(r)):n.Bs.allocateTargetId(e).next(i=>(r=new xi(t,i,"TargetPurposeListen",e.currentSequenceNumber),n.Bs.addTargetData(e,r).next(()=>r))))}).then(e=>{const r=n.Ji.get(e.targetId);return(null===r||e.snapshotVersion.compareTo(r.snapshotVersion)>0)&&(n.Ji=n.Ji.insert(e.targetId,e),n.Yi.set(t,e.targetId)),e})}async function Oo(e,t,n){const r=I(e),i=r.Ji.get(t),s=n?"readwrite":"readwrite-primary";try{n||await r.persistence.runTransaction("Release target",s,e=>r.persistence.referenceDelegate.removeTarget(e,i))}catch(e){if(!he(e))throw e;p("LocalStore",`Failed to update sequence numbers for target ${t}: ${e}`)}r.Ji=r.Ji.remove(t),r.Yi.delete(i.target)}function Ro(e,t,n){const r=I(e);let i=U.min(),s=Qn();return r.persistence.runTransaction("Execute query","readonly",e=>function(e,t,n){const r=I(e),i=r.Yi.get(n);return void 0!==i?oe.resolve(r.Ji.get(i)):r.Bs.getTargetData(t,n)}(r,e,An(t)).next(t=>{if(t)return i=t.lastLimboFreeSnapshotVersion,r.Bs.getMatchingKeysForTargetId(e,t.targetId).next(e=>{s=e})}).next(()=>r.Hi.getDocumentsMatchingQuery(e,t,n?i:U.min(),n?s:Qn())).next(e=>(Lo(r,Ln(t),e),{documents:e,ir:s})))}function xo(e,t){const n=I(e),r=I(n.Bs),i=n.Ji.get(t);return i?Promise.resolve(i.target):n.persistence.runTransaction("Get target data","readonly",e=>r.le(e,t).next(e=>e?e.target:null))}function Po(e,t){const n=I(e),r=n.Xi.get(t)||U.min();return n.persistence.runTransaction("Get new document changes","readonly",e=>n.Zi.getAllFromCollectionGroup(e,t,Z(r,-1),Number.MAX_SAFE_INTEGER)).then(e=>(Lo(n,t,e),e))}function Lo(e,t,n){let r=e.Xi.get(t)||U.min();n.forEach((e,t)=>{t.readTime.compareTo(r)>0&&(r=t.readTime)}),e.Xi.set(t,r)}async function Mo(e,t,n=Qn()){const r=await Do(e,An(Bi(t.bundledQuery))),i=I(e);return i.persistence.runTransaction("Save named query","readwrite",e=>{const s=li(t.readTime);if(r.snapshotVersion.compareTo(s)>=0)return i.qs.saveNamedQuery(e,t);const o=r.withResumeToken(ut.EMPTY_BYTE_STRING,s);return i.Ji=i.Ji.insert(o.targetId,o),i.Bs.updateTargetData(e,o).next(()=>i.Bs.removeMatchingKeysForTargetId(e,r.targetId)).next(()=>i.Bs.addMatchingKeys(e,n,r.targetId)).next(()=>i.qs.saveNamedQuery(e,t))})}function Fo(e,t){return`firestore_clients_${e}_${t}`}function Vo(e,t,n){let r=`firestore_mutations_${e}_${n}`;return t.isAuthenticated()&&(r+="_"+t.uid),r}function jo(e,t){return`firestore_targets_${e}_${t}`}class Uo{constructor(e,t,n,r){this.user=e,this.batchId=t,this.state=n,this.error=r}static ar(e,t,n){const r=JSON.parse(n);let i,s="object"==typeof r&&-1!==["pending","acknowledged","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return s&&r.error&&(s="string"==typeof r.error.message&&"string"==typeof r.error.code,s&&(i=new T(r.error.code,r.error.message))),s?new Uo(e,t,r.state,i):(g("SharedClientState",`Failed to parse mutation state for ID '${t}': ${n}`),null)}hr(){const e={state:this.state,updateTimeMs:Date.now()};return this.error&&(e.error={code:this.error.code,message:this.error.message}),JSON.stringify(e)}}class qo{constructor(e,t,n){this.targetId=e,this.state=t,this.error=n}static ar(e,t){const n=JSON.parse(t);let r,i="object"==typeof n&&-1!==["not-current","current","rejected"].indexOf(n.state)&&(void 0===n.error||"object"==typeof n.error);return i&&n.error&&(i="string"==typeof n.error.message&&"string"==typeof n.error.code,i&&(r=new T(n.error.code,n.error.message))),i?new qo(e,n.state,r):(g("SharedClientState",`Failed to parse target state for ID '${e}': ${t}`),null)}hr(){const e={state:this.state,updateTimeMs:Date.now()};return this.error&&(e.error={code:this.error.code,message:this.error.message}),JSON.stringify(e)}}class Bo{constructor(e,t){this.clientId=e,this.activeTargetIds=t}static ar(e,t){const n=JSON.parse(t);let r="object"==typeof n&&n.activeTargetIds instanceof Array,i=Jn();for(let e=0;r&&eji(e,c,o,q.min(),a).next(t=>(c.apply(e),t)).next(t=>i.He.removeMatchingKeysForTargetId(e,u.targetId).next(()=>i.He.addMatchingKeys(e,s,u.targetId)).next(()=>i.Wn.Vn(e,t)).next(()=>t)))}(this.localStore,new mo(this.k),this.documents,this.mo.id),t=this.po(this.documents);for(const e of this.queries)await Wi(this.localStore,e,t.get(e.name));return this.progress.taskState="Success",new Ci(Object.assign({},this.progress),e)}}function yo(e){return{taskState:"Running",documentsLoaded:0,bytesLoaded:0,totalDocuments:e.totalDocuments,totalBytes:e.totalBytes}} + */(this.persistenceKey),this.gr=this.gr.insert(this.wr,new Go),this.Tr=new RegExp(`^firestore_clients_${s}_([^_]*)$`),this.Er=new RegExp(`^firestore_mutations_${s}_(\\d+)(?:_(.*))?$`),this.Ar=new RegExp(`^firestore_targets_${s}_(\\d+)$`),this.vr=function(e){return"firestore_online_state_"+e}(this.persistenceKey),this.Rr=function(e){return"firestore_bundle_loaded_v2_"+e}(this.persistenceKey),this.window.addEventListener("storage",this._r)}static D(e){return!(!e||!e.localStorage)}async start(){const e=await this.syncEngine.$i();for(const t of e){if(t===this.wr)continue;const e=this.getItem(Fo(this.persistenceKey,t));if(e){const n=Bo.ar(t,e);n&&(this.gr=this.gr.insert(n.clientId,n))}}this.Pr();const t=this.storage.getItem(this.vr);if(t){const e=this.br(t);e&&this.Vr(e)}for(const e of this.yr)this.mr(e);this.yr=[],this.window.addEventListener("pagehide",()=>this.shutdown()),this.started=!0}writeSequenceNumber(e){this.setItem(this.Ir,JSON.stringify(e))}getAllActiveQueryTargets(){return this.Sr(this.gr)}isActiveQueryTarget(e){let t=!1;return this.gr.forEach((n,r)=>{r.activeTargetIds.has(e)&&(t=!0)}),t}addPendingMutation(e){this.Dr(e,"pending")}updateMutationState(e,t,n){this.Dr(e,t,n),this.Cr(e)}addLocalQueryTarget(e){let t="not-current";if(this.isActiveQueryTarget(e)){const n=this.storage.getItem(jo(this.persistenceKey,e));if(n){const r=qo.ar(e,n);r&&(t=r.state)}}return this.Nr.lr(e),this.Pr(),t}removeLocalQueryTarget(e){this.Nr.dr(e),this.Pr()}isLocalQueryTarget(e){return this.Nr.activeTargetIds.has(e)}clearQueryState(e){this.removeItem(jo(this.persistenceKey,e))}updateQueryState(e,t,n){this.kr(e,t,n)}handleUserChange(e,t,n){t.forEach(e=>{this.Cr(e)}),this.currentUser=e,n.forEach(e=>{this.addPendingMutation(e)})}setOnlineState(e){this.Mr(e)}notifyBundleLoaded(e){this.$r(e)}shutdown(){this.started&&(this.window.removeEventListener("storage",this._r),this.removeItem(this.pr),this.started=!1)}getItem(e){const t=this.storage.getItem(e);return p("SharedClientState","READ",e,t),t}setItem(e,t){p("SharedClientState","SET",e,t),this.storage.setItem(e,t)}removeItem(e){p("SharedClientState","REMOVE",e),this.storage.removeItem(e)}mr(e){const t=e;if(t.storageArea===this.storage){if(p("SharedClientState","EVENT",t.key,t.newValue),t.key===this.pr)return void g("Received WebStorage notification for local change. Another client might have garbage-collected our state");this.ii.enqueueRetryable(async()=>{if(this.started){if(null!==t.key)if(this.Tr.test(t.key)){if(null==t.newValue){const e=this.Or(t.key);return this.Fr(e,null)}{const e=this.Br(t.key,t.newValue);if(e)return this.Fr(e.clientId,e)}}else if(this.Er.test(t.key)){if(null!==t.newValue){const e=this.Lr(t.key,t.newValue);if(e)return this.qr(e)}}else if(this.Ar.test(t.key)){if(null!==t.newValue){const e=this.Ur(t.key,t.newValue);if(e)return this.Kr(e)}}else if(t.key===this.vr){if(null!==t.newValue){const e=this.br(t.newValue);if(e)return this.Vr(e)}}else if(t.key===this.Ir){const e=function(e){let t=ve.ct;if(null!=e)try{const n=JSON.parse(e);w("number"==typeof n),t=n}catch(e){g("SharedClientState","Failed to read sequence number from WebStorage",e)}return t}(t.newValue);e!==ve.ct&&this.sequenceNumberHandler(e)}else if(t.key===this.Rr){const e=this.Gr(t.newValue);await Promise.all(e.map(e=>this.syncEngine.Qr(e)))}}else this.yr.push(t)})}}get Nr(){return this.gr.get(this.wr)}Pr(){this.setItem(this.pr,this.Nr.hr())}Dr(e,t,n){const r=new Uo(this.currentUser,e,t,n),i=Vo(this.persistenceKey,this.currentUser,e);this.setItem(i,r.hr())}Cr(e){const t=Vo(this.persistenceKey,this.currentUser,e);this.removeItem(t)}Mr(e){const t={clientId:this.wr,onlineState:e};this.storage.setItem(this.vr,JSON.stringify(t))}kr(e,t,n){const r=jo(this.persistenceKey,e),i=new qo(e,t,n);this.setItem(r,i.hr())}$r(e){const t=JSON.stringify(Array.from(e));this.setItem(this.Rr,t)}Or(e){const t=this.Tr.exec(e);return t?t[1]:null}Br(e,t){const n=this.Or(e);return Bo.ar(n,t)}Lr(e,t){const n=this.Er.exec(e),r=Number(n[1]),i=void 0!==n[2]?n[2]:null;return Uo.ar(new u(i),r,t)}Ur(e,t){const n=this.Ar.exec(e),r=Number(n[1]);return qo.ar(r,t)}br(e){return zo.ar(e)}Gr(e){return JSON.parse(e)}async qr(e){if(e.user.uid===this.currentUser.uid)return this.syncEngine.jr(e.batchId,e.state,e.error);p("SharedClientState","Ignoring mutation for non-active user "+e.user.uid)}Kr(e){return this.syncEngine.zr(e.targetId,e.state,e.error)}Fr(e,t){const n=t?this.gr.insert(e,t):this.gr.remove(e),r=this.Sr(this.gr),i=this.Sr(n),s=[],o=[];return i.forEach(e=>{r.has(e)||s.push(e)}),r.forEach(e=>{i.has(e)||o.push(e)}),this.syncEngine.Wr(s,o).then(()=>{this.gr=n})}Vr(e){this.gr.get(e.clientId)&&this.onlineStateHandler(e.onlineState)}Sr(e){let t=Jn();return e.forEach((e,n)=>{t=t.unionWith(n.activeTargetIds)}),t}}class $o{constructor(){this.Hr=new Go,this.Jr={},this.onlineStateHandler=null,this.sequenceNumberHandler=null}addPendingMutation(e){}updateMutationState(e,t,n){}addLocalQueryTarget(e){return this.Hr.lr(e),this.Jr[e]||"not-current"}updateQueryState(e,t,n){this.Jr[e]=t}removeLocalQueryTarget(e){this.Hr.dr(e)}isLocalQueryTarget(e){return this.Hr.activeTargetIds.has(e)}clearQueryState(e){delete this.Jr[e]}getAllActiveQueryTargets(){return this.Hr.activeTargetIds}isActiveQueryTarget(e){return this.Hr.activeTargetIds.has(e)}start(){return this.Hr=new Go,Promise.resolve()}handleUserChange(e,t,n){}setOnlineState(e){}shutdown(){}writeSequenceNumber(e){}notifyBundleLoaded(e){}} /** * @license - * Copyright 2017 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3414,10 +3495,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class vo{constructor(e){this.key=e}}class wo{constructor(e){this.key=e}}class bo{constructor(e,t){this.query=e,this.To=t,this.Eo=null,this.current=!1,this.Io=nn(),this.mutatedKeys=nn(),this.Ao=st(e),this.Ro=new no(this.Ao)}get Po(){return this.To}bo(e,t){const n=t?t.vo:new ro,r=t?t.Ro:this.Ro;let i=t?t.mutatedKeys:this.mutatedKeys,s=r,o=!1;const a=He(this.query)&&r.size===this.query.limit?r.last():null,c=$e(this.query)&&r.size===this.query.limit?r.first():null;if(e.inorderTraversal((e,t)=>{const u=r.get(e),h=it(this.query,t)?t:null,l=!!u&&this.mutatedKeys.has(u.key),d=!!h&&(h.hasLocalMutations||this.mutatedKeys.has(h.key)&&h.hasCommittedMutations);let f=!1;u&&h?u.data.isEqual(h.data)?l!==d&&(n.track({type:3,doc:h}),f=!0):this.Vo(u,h)||(n.track({type:2,doc:h}),f=!0,(a&&this.Ao(h,a)>0||c&&this.Ao(h,c)<0)&&(o=!0)):!u&&h?(n.track({type:0,doc:h}),f=!0):u&&!h&&(n.track({type:1,doc:u}),f=!0,(a||c)&&(o=!0)),f&&(h?(s=s.add(h),i=d?i.add(e):i.delete(e)):(s=s.delete(e),i=i.delete(e)))}),He(this.query)||$e(this.query))for(;s.size>this.query.limit;){const e=He(this.query)?s.last():s.first();s=s.delete(e.key),i=i.delete(e.key),n.track({type:1,doc:e})}return{Ro:s,vo:n,Bn:o,mutatedKeys:i}}Vo(e,t){return e.hasLocalMutations&&t.hasCommittedMutations&&!t.hasLocalMutations}applyChanges(e,t,n){const r=this.Ro;this.Ro=e.Ro,this.mutatedKeys=e.mutatedKeys;const i=e.vo.no();i.sort((e,t)=>function(e,t){const n=e=>{switch(e){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return v()}};return n(e)-n(t)} + */class Wo{Yr(e){}shutdown(){}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3430,10 +3511,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e.type,t.type)||this.Ao(e.doc,t.doc)),this.So(n);const s=t?this.Do():[],o=0===this.Io.size&&this.current?1:0,a=o!==this.Eo;return this.Eo=o,0!==i.length||a?{snapshot:new io(this.query,e.Ro,r,i,e.mutatedKeys,0===o,a,!1),Co:s}:{Co:s}}ro(e){return this.current&&"Offline"===e?(this.current=!1,this.applyChanges({Ro:this.Ro,vo:new ro,mutatedKeys:this.mutatedKeys,Bn:!1},!1)):{Co:[]}}No(e){return!this.To.has(e)&&!!this.Ro.has(e)&&!this.Ro.get(e).hasLocalMutations}So(e){e&&(e.addedDocuments.forEach(e=>this.To=this.To.add(e)),e.modifiedDocuments.forEach(e=>{}),e.removedDocuments.forEach(e=>this.To=this.To.delete(e)),this.current=e.current)}Do(){if(!this.current)return[];const e=this.Io;this.Io=nn(),this.Ro.forEach(e=>{this.No(e.key)&&(this.Io=this.Io.add(e.key))});const t=[];return e.forEach(e=>{this.Io.has(e)||t.push(new wo(e))}),this.Io.forEach(n=>{e.has(n)||t.push(new vo(n))}),t}ko(e){this.To=e.zn,this.Io=nn();const t=this.bo(e.documents);return this.applyChanges(t,!0)}xo(){return io.fromInitialDocuments(this.query,this.Ro,this.mutatedKeys,0===this.Eo)}}class Io{constructor(e,t,n){this.query=e,this.targetId=t,this.view=n}}class _o{constructor(e){this.key=e,this.$o=!1}}class To{constructor(e,t,n,r,i,s){this.localStore=e,this.remoteStore=t,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=s,this.Fo={},this.Oo=new gi(e=>nt(e),tt),this.Mo=new Map,this.Lo=new Set,this.Bo=new Kt(ae.comparator),this.Uo=new Map,this.qo=new Hi,this.Ko={},this.jo=new Map,this.Qo=ii.re(),this.onlineState="Unknown",this.Wo=void 0}get isPrimaryClient(){return!0===this.Wo}}async function Eo(e,t){const n=Jo(e);let r,i;const s=n.Oo.get(t);if(s)r=s.targetId,n.sharedClientState.addLocalQueryTarget(r),i=s.view.xo();else{const e=await Vi(n.localStore,Ze(t)),s=n.sharedClientState.addLocalQueryTarget(e.targetId);r=e.targetId,i=await ko(n,t,r,"current"===s),n.isPrimaryClient&&Os(n.remoteStore,e)}return i}async function ko(e,t,n,r){e.Go=(t,n,r)=>async function(e,t,n,r){let i=t.view.bo(n);i.Bn&&(i=await Bi(e.localStore,t.query,!1).then(({documents:e})=>t.view.bo(e,i)));const s=r&&r.targetChanges.get(t.targetId),o=t.view.applyChanges(i,e.isPrimaryClient,s);return Mo(e,t.targetId,o.Co),o.snapshot}(e,t,n,r);const i=await Bi(e.localStore,t,!0),s=new bo(t,i.zn),o=s.bo(i.documents),a=an.createSynthesizedTargetChangeForCurrentChange(n,r&&"Offline"!==e.onlineState),c=s.applyChanges(o,e.isPrimaryClient,a);Mo(e,n,c.Co);const u=new Io(t,n,s);return e.Oo.set(t,u),e.Mo.has(n)?e.Mo.get(n).push(t):e.Mo.set(n,[t]),c.snapshot}async function So(e,t){const n=I(e),r=n.Oo.get(t),i=n.Mo.get(r.targetId);if(i.length>1)return n.Mo.set(r.targetId,i.filter(e=>!tt(e,t))),void n.Oo.delete(t);n.isPrimaryClient?(n.sharedClientState.removeLocalQueryTarget(r.targetId),n.sharedClientState.isActiveQueryTarget(r.targetId)||await qi(n.localStore,r.targetId,!1).then(()=>{n.sharedClientState.clearQueryState(r.targetId),Cs(n.remoteStore,r.targetId),Lo(n,r.targetId)}).catch(ui)):(Lo(n,r.targetId),await qi(n.localStore,r.targetId,!0))}async function Ao(e,t){const n=I(e);try{const e=await function(e,t){const n=I(e),r=t.snapshotVersion;let i=n.qn;return n.persistence.runTransaction("Apply remote event","readwrite-primary",e=>{const s=n.Qn.newChangeBuffer({trackRemovals:!0});i=n.qn;const o=[];t.targetChanges.forEach((t,s)=>{const a=i.get(s);if(!a)return;o.push(n.He.removeMatchingKeys(e,t.removedDocuments,s).next(()=>n.He.addMatchingKeys(e,t.addedDocuments,s)));const c=t.resumeToken;if(c.approximateByteSize()>0){const u=a.withResumeToken(c,r).withSequenceNumber(e.currentSequenceNumber);i=i.insert(s,u),function(e,t,n){return w(t.resumeToken.approximateByteSize()>0),0===e.resumeToken.approximateByteSize()||(t.snapshotVersion.toMicroseconds()-e.snapshotVersion.toMicroseconds()>=3e8||n.addedDocuments.size+n.modifiedDocuments.size+n.removedDocuments.size>0)}(a,u,t)&&o.push(n.He.updateTargetData(e,u))}});let a=Jt();if(t.documentUpdates.forEach((r,i)=>{t.resolvedLimboDocuments.has(r)&&o.push(n.persistence.referenceDelegate.updateLimboDocument(e,r))}),o.push(ji(e,s,t.documentUpdates,r,void 0).next(e=>{a=e})),!r.isEqual(q.min())){const t=n.He.getLastRemoteSnapshotVersion(e).next(t=>n.He.setTargetsMetadata(e,e.currentSequenceNumber,r));o.push(t)}return gr.waitFor(o).next(()=>s.apply(e)).next(()=>n.Wn.Vn(e,a)).next(()=>a)}).then(e=>(n.qn=i,e))}(n.localStore,t);t.targetChanges.forEach((e,t)=>{const r=n.Uo.get(t);r&&(w(e.addedDocuments.size+e.modifiedDocuments.size+e.removedDocuments.size<=1),e.addedDocuments.size>0?r.$o=!0:e.modifiedDocuments.size>0?w(r.$o):e.removedDocuments.size>0&&(w(r.$o),r.$o=!1))}),await Uo(n,e,t)}catch(e){await ui(e)}}function No(e,t,n){const r=I(e);if(r.isPrimaryClient&&0===n||!r.isPrimaryClient&&1===n){const e=[];r.Oo.forEach((n,r)=>{const i=r.view.ro(t);i.snapshot&&e.push(i.snapshot)}),function(e,t){const n=I(e);n.onlineState=t;let r=!1;n.queries.forEach((e,n)=>{for(const e of n.listeners)e.ro(t)&&(r=!0)}),r&&lo(n)}(r.eventManager,t),e.length&&r.Fo.Pr(e),r.onlineState=t,r.isPrimaryClient&&r.sharedClientState.setOnlineState(t)}}async function Oo(e,t,n){const r=I(e);r.sharedClientState.updateQueryState(t,"rejected",n);const i=r.Uo.get(t),s=i&&i.key;if(s){let e=new Kt(ae.comparator);e=e.insert(s,Te.newNoDocument(s,q.min()));const n=nn().add(s),i=new on(q.min(),new Map,new Ht(F),e,n);await Ao(r,i),r.Bo=r.Bo.remove(s),r.Uo.delete(t),jo(r)}else await qi(r.localStore,t,!1).then(()=>Lo(r,t,n)).catch(ui)}async function Co(e,t){const n=I(e),r=t.batch.batchId;try{const e=await function(e,t){const n=I(e);return n.persistence.runTransaction("Acknowledge batch","readwrite-primary",e=>{const r=t.batch.keys(),i=n.Qn.newChangeBuffer({trackRemovals:!0});return function(e,t,n,r){const i=n.batch,s=i.keys();let o=gr.resolve();return s.forEach(e=>{o=o.next(()=>r.getEntry(t,e)).next(t=>{const s=n.docVersions.get(e);w(null!==s),t.version.compareTo(s)<0&&(i.applyToRemoteDocument(t,n),t.isValidDocument()&&r.addEntry(t,n.commitVersion))})}),o.next(()=>e.An.removeMutationBatch(t,i))}(n,e,t,i).next(()=>i.apply(e)).next(()=>n.An.performConsistencyCheck(e)).next(()=>n.Wn.vn(e,r))})}(n.localStore,t);Po(n,r,null),Ro(n,r),n.sharedClientState.updateMutationState(r,"acknowledged"),await Uo(n,e)}catch(e){await ui(e)}}async function Do(e,t,n){const r=I(e);try{const e=await function(e,t){const n=I(e);return n.persistence.runTransaction("Reject batch","readwrite-primary",e=>{let r;return n.An.lookupMutationBatch(e,t).next(t=>(w(null!==t),r=t.keys(),n.An.removeMutationBatch(e,t))).next(()=>n.An.performConsistencyCheck(e)).next(()=>n.Wn.vn(e,r))})}(r.localStore,t);Po(r,t,n),Ro(r,t),r.sharedClientState.updateMutationState(t,"rejected",n),await Uo(r,e)}catch(n){await ui(n)}}function Ro(e,t){(e.jo.get(t)||[]).forEach(e=>{e.resolve()}),e.jo.delete(t)}function Po(e,t,n){const r=I(e);let i=r.Ko[r.currentUser.toKey()];if(i){const e=i.get(t);e&&(n?e.reject(n):e.resolve(),i=i.remove(t)),r.Ko[r.currentUser.toKey()]=i}}function Lo(e,t,n=null){e.sharedClientState.removeLocalQueryTarget(t);for(const r of e.Mo.get(t))e.Oo.delete(r),n&&e.Fo.zo(r,n);e.Mo.delete(t),e.isPrimaryClient&&e.qo.us(t).forEach(t=>{e.qo.containsKey(t)||xo(e,t)})}function xo(e,t){e.Lo.delete(t.path.canonicalString());const n=e.Bo.get(t);null!==n&&(Cs(e.remoteStore,n),e.Bo=e.Bo.remove(t),e.Uo.delete(n),jo(e))}function Mo(e,t,n){for(const r of n)r instanceof vo?(e.qo.addReference(r.key,t),Fo(e,r)):r instanceof wo?(p("SyncEngine","Document no longer in limbo: "+r.key),e.qo.removeReference(r.key,t),e.qo.containsKey(r.key)||xo(e,r.key)):v()}function Fo(e,t){const n=t.key,r=n.path.canonicalString();e.Bo.get(n)||e.Lo.has(r)||(p("SyncEngine","New document in limbo: "+n),e.Lo.add(r),jo(e))}function jo(e){for(;e.Lo.size>0&&e.Bo.size{o.push(r.Go(a,t,n).then(e=>{if(e){r.isPrimaryClient&&r.sharedClientState.updateQueryState(a.targetId,e.fromCache?"not-current":"current"),i.push(e);const t=Ri.$n(a.targetId,e);s.push(t)}}))}),await Promise.all(o),r.Fo.Pr(i),await async function(e,t){const n=I(e);try{await n.persistence.runTransaction("notifyLocalViewChanges","readwrite",e=>gr.forEach(t,t=>gr.forEach(t.kn,r=>n.persistence.referenceDelegate.addReference(e,t.targetId,r)).next(()=>gr.forEach(t.xn,r=>n.persistence.referenceDelegate.removeReference(e,t.targetId,r)))))}catch(e){if(!Ir(e))throw e;p("LocalStore","Failed to update sequence numbers: "+e)}for(const e of t){const t=e.targetId;if(!e.fromCache){const e=n.qn.get(t),r=e.snapshotVersion,i=e.withLastLimboFreeSnapshotVersion(r);n.qn=n.qn.insert(t,i)}}}(r.localStore,s))}async function Vo(e,t){const n=I(e);if(!n.currentUser.isEqual(t)){p("SyncEngine","User change. New user:",t.toKey());const e=await Mi(n.localStore,t);n.currentUser=t,function(e,t){e.jo.forEach(e=>{e.forEach(e=>{e.reject(new T(_.CANCELLED,"'waitForPendingWrites' promise is rejected due to a user change."))})}),e.jo.clear()}(n),n.sharedClientState.handleUserChange(t,e.removedBatchIds,e.addedBatchIds),await Uo(n,e.Gn)}}function qo(e,t){const n=I(e),r=n.Uo.get(t);if(r&&r.$o)return nn().add(r.key);{let e=nn();const r=n.Mo.get(t);if(!r)return e;for(const t of r){const r=n.Oo.get(t);e=e.unionWith(r.view.Po)}return e}}async function Bo(e,t){const n=I(e),r=await Bi(n.localStore,t.query,!0),i=t.view.ko(r);return n.isPrimaryClient&&Mo(n,t.targetId,i.Co),i}async function zo(e){const t=I(e);return Ki(t.localStore).then(e=>Uo(t,e))}async function Ko(e,t,n,r){const i=I(e),s=await function(e,t){const n=I(e),r=I(n.An);return n.persistence.runTransaction("Lookup mutation documents","readonly",e=>r.Zt(e,t).next(t=>t?n.Wn.vn(e,t):gr.resolve(null)))}(i.localStore,t);null!==s?("pending"===n?await Bs(i.remoteStore):"acknowledged"===n||"rejected"===n?(Po(i,t,r||null),Ro(i,t),function(e,t){I(I(e).An).ee(t)}(i.localStore,t)):v(),await Uo(i,s)):p("SyncEngine","Cannot apply mutation batch with id: "+t)}async function Wo(e,t,n){const r=I(e),i=[],s=[];for(const e of t){let t;const n=r.Mo.get(e);if(n&&0!==n.length){t=await Vi(r.localStore,Ze(n[0]));for(const e of n){const t=r.Oo.get(e),n=await Bo(r,t);n.snapshot&&s.push(n.snapshot)}}else{const n=await zi(r.localStore,e);t=await Vi(r.localStore,n),await ko(r,Go(n),e,!1)}i.push(t)}return r.Fo.Pr(s),i}function Go(e){return We(e.path,e.collectionGroup,e.orderBy,e.filters,e.limit,"F",e.startAt,e.endAt)}function Ho(e){const t=I(e);return I(I(t.localStore).persistence).Tn()}async function $o(e,t,n,r){const i=I(e);if(i.Wo)p("SyncEngine","Ignoring unexpected query state notification.");else if(i.Mo.has(t))switch(n){case"current":case"not-current":{const e=await Ki(i.localStore),r=on.createSynthesizedRemoteEventForCurrentChange(t,"current"===n);await Uo(i,e,r);break}case"rejected":await qi(i.localStore,t,!0),Lo(i,t,r);break;default:v()}}async function Qo(e,t,n){const r=Jo(e);if(r.Wo){for(const e of t){if(r.Mo.has(e)){p("SyncEngine","Adding an already active target "+e);continue}const t=await zi(r.localStore,e),n=await Vi(r.localStore,t);await ko(r,Go(t),n.targetId,!1),Os(r.remoteStore,n)}for(const e of n)r.Mo.has(e)&&await qi(r.localStore,e,!1).then(()=>{Cs(r.remoteStore,e),Lo(r,e)}).catch(ui)}}function Jo(e){const t=I(e);return t.remoteStore.remoteSyncer.applyRemoteEvent=Ao.bind(null,t),t.remoteStore.remoteSyncer.getRemoteKeysForTarget=qo.bind(null,t),t.remoteStore.remoteSyncer.rejectListen=Oo.bind(null,t),t.Fo.Pr=uo.bind(null,t.eventManager),t.Fo.zo=ho.bind(null,t.eventManager),t}function Yo(e){const t=I(e);return t.remoteStore.remoteSyncer.applySuccessfulWrite=Co.bind(null,t),t.remoteStore.remoteSyncer.rejectFailedWrite=Do.bind(null,t),t}class Xo{constructor(){this.synchronizeTabs=!1}async initialize(e){this.k=ws(e.databaseInfo.databaseId),this.sharedClientState=this.Jo(e),this.persistence=this.Yo(e),await this.persistence.start(),this.gcScheduler=this.Xo(e),this.localStore=this.Zo(e)}Xo(e){return null}Zo(e){return xi(this.persistence,new Pi,e.initialUser,this.k)}Yo(e){return new Zi(ts.ks,this.k)}Jo(e){return new ls}async terminate(){this.gcScheduler&&this.gcScheduler.stop(),await this.sharedClientState.shutdown(),await this.persistence.shutdown()}}class Zo extends Xo{constructor(e,t,n){super(),this.ta=e,this.cacheSizeBytes=t,this.forceOwnership=n,this.synchronizeTabs=!1}async initialize(e){await super.initialize(e),await async function(e){const t=I(e);return t.persistence.runTransaction("Synchronize last document change read time","readonly",e=>function(e){const t=Ii(e);let n=q.min();return t.jt({index:ir.readTimeIndex,reverse:!0},(e,t,r)=>{t.readTime&&(n=xr(t.readTime)),r.done()}).next(()=>n)}(e)).then(e=>{t.jn=e})}(this.localStore),await this.ta.initialize(this,e),await Yo(this.ta.syncEngine),await Bs(this.ta.remoteStore),await this.persistence.sn(()=>(this.gcScheduler&&!this.gcScheduler.started&&this.gcScheduler.start(this.localStore),Promise.resolve()))}Zo(e){return xi(this.persistence,new Pi,e.initialUser,this.k)}Xo(e){const t=this.persistence.referenceDelegate.garbageCollector;return new di(t,e.asyncQueue)}Yo(e){const t=Oi(e.databaseInfo.databaseId,e.databaseInfo.persistenceKey),n=void 0!==this.cacheSizeBytes?Jr.withCacheSize(this.cacheSizeBytes):Jr.DEFAULT;return new Si(this.synchronizeTabs,t,e.clientId,n,e.asyncQueue,ys(),vs(),this.k,this.sharedClientState,!!this.forceOwnership)}Jo(e){return new ls}}class ea extends Zo{constructor(e,t){super(e,t,!1),this.ta=e,this.cacheSizeBytes=t,this.synchronizeTabs=!0}async initialize(e){await super.initialize(e);const t=this.ta.syncEngine;this.sharedClientState instanceof hs&&(this.sharedClientState.syncEngine={mi:Ko.bind(null,t),gi:$o.bind(null,t),yi:Qo.bind(null,t),Tn:Ho.bind(null,t),_i:zo.bind(null,t)},await this.sharedClientState.start()),await this.persistence.sn(async e=>{await async function(e,t){const n=I(e);if(Jo(n),Yo(n),!0===t&&!0!==n.Wo){const e=n.sharedClientState.getAllActiveQueryTargets(),t=await Wo(n,e.toArray());n.Wo=!0,await Ys(n.remoteStore,!0);for(const e of t)Os(n.remoteStore,e)}else if(!1===t&&!1!==n.Wo){const e=[];let t=Promise.resolve();n.Mo.forEach((r,i)=>{n.sharedClientState.isLocalQueryTarget(i)?e.push(i):t=t.then(()=>(Lo(n,i),qi(n.localStore,i,!0))),Cs(n.remoteStore,i)}),await t,await Wo(n,e),function(e){const t=I(e);t.Uo.forEach((e,n)=>{Cs(t.remoteStore,n)}),t.qo.hs(),t.Uo=new Map,t.Bo=new Kt(ae.comparator)}(n),n.Wo=!1,await Ys(n.remoteStore,!1)}}(this.ta.syncEngine,e),this.gcScheduler&&(e&&!this.gcScheduler.started?this.gcScheduler.start(this.localStore):e||this.gcScheduler.stop())})}Jo(e){const t=ys();if(!hs.bt(t))throw new T(_.UNIMPLEMENTED,"IndexedDB persistence is only available on platforms that support LocalStorage.");const n=Oi(e.databaseInfo.databaseId,e.databaseInfo.persistenceKey);return new hs(t,e.asyncQueue,n,e.clientId,e.initialUser)}}class ta{async initialize(e,t){this.localStore||(this.localStore=e.localStore,this.sharedClientState=e.sharedClientState,this.datastore=this.createDatastore(t),this.remoteStore=this.createRemoteStore(t),this.eventManager=this.createEventManager(t),this.syncEngine=this.createSyncEngine(t,!e.synchronizeTabs),this.sharedClientState.onlineStateHandler=e=>No(this.syncEngine,e,1),this.remoteStore.remoteSyncer.handleCredentialChange=Vo.bind(null,this.syncEngine),await Ys(this.remoteStore,this.syncEngine.isPrimaryClient))}createEventManager(e){return new oo}createDatastore(e){const t=ws(e.databaseInfo.databaseId),n=(r=e.databaseInfo,new gs(r));var r;return function(e,t,n,r){return new Es(e,t,n,r)}(e.authCredentials,e.appCheckCredentials,n,t)}createRemoteStore(e){return t=this.localStore,n=this.datastore,r=e.asyncQueue,i=e=>No(this.syncEngine,e,0),s=fs.bt()?new fs:new ds,new Ss(t,n,r,i,s);var t,n,r,i,s}createSyncEngine(e,t){return function(e,t,n,r,i,s,o){const a=new To(e,t,n,r,i,s);return o&&(a.Wo=!0),a}(this.localStore,this.remoteStore,this.eventManager,this.sharedClientState,e.initialUser,e.maxConcurrentLimboResolutions,t)}terminate(){return async function(e){const t=I(e);p("RemoteStore","RemoteStore shutting down."),t.Gr.add(5),await Ns(t),t.Hr.shutdown(),t.Jr.set("Unknown")}(this.remoteStore)}} + */class Ho{constructor(){this.Xr=()=>this.Zr(),this.eo=()=>this.no(),this.so=[],this.io()}Yr(e){this.so.push(e)}shutdown(){window.removeEventListener("online",this.Xr),window.removeEventListener("offline",this.eo)}io(){window.addEventListener("online",this.Xr),window.addEventListener("offline",this.eo)}Zr(){p("ConnectivityMonitor","Network connectivity changed: AVAILABLE");for(const e of this.so)e(0)}no(){p("ConnectivityMonitor","Network connectivity changed: UNAVAILABLE");for(const e of this.so)e(1)}static D(){return"undefined"!=typeof window&&void 0!==window.addEventListener&&void 0!==window.removeEventListener}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3446,7 +3527,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function na(e,t=10240){let n=0;return{async read(){if(n{this.muted||e(t)},0)}} + */class Xo{constructor(e){this.ro=e.ro,this.oo=e.oo}uo(e){this.co=e}ao(e){this.ho=e}onMessage(e){this.lo=e}close(){this.oo()}send(e){this.ro(e)}fo(){this.co()}wo(e){this.ho(e)}_o(e){this.lo(e)}} /** * @license - * Copyright 2020 Google LLC + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3494,7 +3575,55 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ia{constructor(e,t){this.sa=e,this.k=t,this.metadata=new E,this.buffer=new Uint8Array,this.ia=new TextDecoder("utf-8"),this.ra().then(e=>{e&&e._o()?this.metadata.resolve(e.payload.metadata):this.metadata.reject(new Error("The first element of the bundle is not a metadata, it is\n "+JSON.stringify(null==e?void 0:e.payload)))},e=>this.metadata.reject(e))}close(){return this.sa.cancel()}async getMetadata(){return this.metadata.promise}async Ho(){return await this.getMetadata(),this.ra()}async ra(){const e=await this.oa();if(null===e)return null;const t=this.ia.decode(e),n=Number(t);isNaN(n)&&this.aa(`length string (${t}) is not valid number`);const r=await this.ca(n);return new po(JSON.parse(r),e.length+n)}ua(){return this.buffer.findIndex(e=>e==="{".charCodeAt(0))}async oa(){for(;this.ua()<0&&!await this.ha(););if(0===this.buffer.length)return null;const e=this.ua();e<0&&this.aa("Reached the end of bundle when a length string is expected.");const t=this.buffer.slice(0,e);return this.buffer=this.buffer.slice(e),t}async ca(e){for(;this.buffer.length(p("RestConnection",`Received RPC '${e}' ${s}: `,t),t),t=>{throw m("RestConnection",`RPC '${e}' ${s} failed with error: `,t,"url: ",o,"request:",n),t})}vo(e,t,n,r,i,s){return this.Io(e,t,n,r,i)}Eo(e,t,n){e["X-Goog-Api-Client"]="gl-js/ fire/"+l,e["Content-Type"]="text/plain",this.databaseInfo.appId&&(e["X-Firebase-GMPID"]=this.databaseInfo.appId),t&&t.headers.forEach((t,n)=>e[n]=t),n&&n.headers.forEach((t,n)=>e[n]=t)}To(e,t){const n=Jo[e];return`${this.mo}/v1/${t}:${n}`}}{constructor(e){super(e),this.forceLongPolling=e.forceLongPolling,this.autoDetectLongPolling=e.autoDetectLongPolling,this.useFetchStreams=e.useFetchStreams,this.longPollingOptions=e.longPollingOptions}Ao(e,t,n,r){const i=Yo();return new Promise((s,o)=>{const c=new a.i;c.setWithCredentials(!0),c.listenOnce(a.c.COMPLETE,()=>{try{switch(c.getLastErrorCode()){case a.a.NO_ERROR:const t=c.getResponseJson();p(Zo,`XHR for RPC '${e}' ${i} received:`,JSON.stringify(t)),s(t);break;case a.a.TIMEOUT:p(Zo,`RPC '${e}' ${i} timed out`),o(new T(_.DEADLINE_EXCEEDED,"Request time out"));break;case a.a.HTTP_ERROR:const n=c.getStatus();if(p(Zo,`RPC '${e}' ${i} failed with status:`,n,"response text:",c.getResponseText()),n>0){let e=c.getResponseJson();Array.isArray(e)&&(e=e[0]);const t=null==e?void 0:e.error;if(t&&t.status&&t.message){const e=function(e){const t=e.toLowerCase().replace(/_/g,"-");return Object.values(_).indexOf(t)>=0?t:_.UNKNOWN}(t.status);o(new T(e,t.message))}else o(new T(_.UNKNOWN,"Server responded with status "+c.getStatus()))}else o(new T(_.UNAVAILABLE,"Connection failed."));break;default:v()}}finally{p(Zo,`RPC '${e}' ${i} completed.`)}});const u=JSON.stringify(r);p(Zo,`RPC '${e}' ${i} sending request:`,r),c.send(t,"POST",u,n,15)})}Ro(e,t,n){const r=Yo(),i=[this.mo,"/","google.firestore.v1.Firestore","/",e,"/channel"],s=Object(a.j)(),o=Object(a.k)(),c={httpSessionIdParam:"gsessionid",initMessageHeaders:{},messageUrlParams:{database:`projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`},sendRawJson:!0,supportsCrossDomainXhr:!0,internalChannelParams:{forwardChannelRequestTimeoutMs:6e5},forceLongPolling:this.forceLongPolling,detectBufferingProxy:this.autoDetectLongPolling},u=this.longPollingOptions.timeoutSeconds;void 0!==u&&(c.longPollingTimeout=Math.round(1e3*u)),this.useFetchStreams&&(c.xmlHttpFactory=new a.d({})),this.Eo(c.initMessageHeaders,t,n),c.encodeInitMessageHeaders=!0;const l=i.join("");p(Zo,`Creating RPC '${e}' stream ${r}: ${l}`,c);const h=s.createWebChannel(l,c);let d=!1,f=!1;const g=new Xo({ro:t=>{f?p(Zo,`Not sending because RPC '${e}' stream ${r} is closed:`,t):(d||(p(Zo,`Opening RPC '${e}' stream ${r} transport.`),h.open(),d=!0),p(Zo,`RPC '${e}' stream ${r} sending:`,t),h.send(t))},oo:()=>h.close()}),y=(e,t,n)=>{e.listen(t,e=>{try{n(e)}catch(e){setTimeout(()=>{throw e},0)}})};return y(h,a.h.EventType.OPEN,()=>{f||p(Zo,`RPC '${e}' stream ${r} transport opened.`)}),y(h,a.h.EventType.CLOSE,()=>{f||(f=!0,p(Zo,`RPC '${e}' stream ${r} transport closed`),g.wo())}),y(h,a.h.EventType.ERROR,t=>{f||(f=!0,m(Zo,`RPC '${e}' stream ${r} transport errored:`,t),g.wo(new T(_.UNAVAILABLE,"The operation could not be completed")))}),y(h,a.h.EventType.MESSAGE,t=>{var n;if(!f){const i=t.data[0];w(!!i);const s=i,o=s.error||(null===(n=s[0])||void 0===n?void 0:n.error);if(o){p(Zo,`RPC '${e}' stream ${r} received error:`,o);const t=o.status;let n=function(e){const t=Lr[e];if(void 0!==t)return Vr(t)}(t),i=o.message;void 0===n&&(n=_.INTERNAL,i="Unknown error status: "+t+" with message "+o.message),f=!0,g.wo(new T(n,i)),h.close()}else p(Zo,`RPC '${e}' stream ${r} received:`,i),g._o(i)}}),y(o,a.b.STAT_EVENT,t=>{t.stat===a.g.PROXY?p(Zo,`RPC '${e}' stream ${r} detected buffering proxy`):t.stat===a.g.NOPROXY&&p(Zo,`RPC '${e}' stream ${r} detected no buffering proxy`)}),setTimeout(()=>{g.fo()},0),g}} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function ta(){return"undefined"!=typeof window?window:null}function na(){return"undefined"!=typeof document?document:null} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function ra(e){return new si(e,!0)} /** * @license * Copyright 2017 Google LLC @@ -3510,10 +3639,26 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class sa{constructor(e){this.datastore=e,this.readVersions=new Map,this.mutations=[],this.committed=!1,this.lastWriteError=null,this.writtenDocs=new Set}async lookup(e){if(this.ensureCommitNotCalled(),this.mutations.length>0)throw new T(_.INVALID_ARGUMENT,"Firestore transactions require all reads to be executed before all writes.");const t=await async function(e,t){const n=I(e),r=Nn(n.k)+"/documents",i={documents:t.map(e=>En(n.k,e))},s=await n.ji("BatchGetDocuments",r,i),o=new Map;s.forEach(e=>{const t=function(e,t){return"found"in t?function(e,t){w(!!t.found),t.found.name,t.found.updateTime;const n=kn(e,t.found.name),r=In(t.found.updateTime),i=new Ie({mapValue:{fields:t.found.fields}});return Te.newFoundDocument(n,r,i)}(e,t):"missing"in t?function(e,t){w(!!t.missing),w(!!t.readTime);const n=kn(e,t.missing),r=In(t.readTime);return Te.newNoDocument(n,r)}(e,t):v()}(n.k,e);o.set(t.key.toString(),t)});const a=[];return t.forEach(e=>{const t=o.get(e.toString());w(!!t),a.push(t)}),a}(this.datastore,e);return t.forEach(e=>this.recordVersion(e)),t}set(e,t){this.write(t.toMutation(e,this.precondition(e))),this.writtenDocs.add(e.toString())}update(e,t){try{this.write(t.toMutation(e,this.preconditionForUpdate(e)))}catch(e){this.lastWriteError=e}this.writtenDocs.add(e.toString())}delete(e){this.write(new Ft(e,this.precondition(e))),this.writtenDocs.add(e.toString())}async commit(){if(this.ensureCommitNotCalled(),this.lastWriteError)throw this.lastWriteError;const e=this.readVersions;this.mutations.forEach(t=>{e.delete(t.key.toString())}),e.forEach((e,t)=>{const n=ae.fromPath(t);this.mutations.push(new jt(n,this.precondition(n)))}),await async function(e,t){const n=I(e),r=Nn(n.k)+"/documents",i={writes:t.map(e=>Rn(n.k,e))};await n.Bi("Commit",r,i)}(this.datastore,this.mutations),this.committed=!0}recordVersion(e){let t;if(e.isFoundDocument())t=e.version;else{if(!e.isNoDocument())throw v();t=q.min()}const n=this.readVersions.get(e.key.toString());if(n){if(!t.isEqual(n))throw new T(_.ABORTED,"Document version changed between two reads.")}else this.readVersions.set(e.key.toString(),t)}precondition(e){const t=this.readVersions.get(e.toString());return!this.writtenDocs.has(e.toString())&&t?Et.updateTime(t):Et.none()}preconditionForUpdate(e){const t=this.readVersions.get(e.toString());if(!this.writtenDocs.has(e.toString())&&t){if(t.isEqual(q.min()))throw new T(_.INVALID_ARGUMENT,"Can't update a document that doesn't exist.");return Et.updateTime(t)}return Et.exists(!0)}write(e){this.ensureCommitNotCalled(),this.mutations.push(e)}ensureCommitNotCalled(){}} + */class ia{constructor(e,t,n=1e3,r=1.5,i=6e4){this.ii=e,this.timerId=t,this.Po=n,this.bo=r,this.Vo=i,this.So=0,this.Do=null,this.Co=Date.now(),this.reset()}reset(){this.So=0}xo(){this.So=this.Vo}No(e){this.cancel();const t=Math.floor(this.So+this.ko()),n=Math.max(0,Date.now()-this.Co),r=Math.max(0,t-n);r>0&&p("ExponentialBackoff",`Backing off for ${r} ms (base delay: ${this.So} ms, delay with jitter: ${t} ms, last attempt: ${n} ms ago)`),this.Do=this.ii.enqueueAfterDelay(this.timerId,r,()=>(this.Co=Date.now(),e())),this.So*=this.bo,this.Sothis.Vo&&(this.So=this.Vo)}Mo(){null!==this.Do&&(this.Do.skipDelay(),this.Do=null)}cancel(){null!==this.Do&&(this.Do.cancel(),this.Do=null)}ko(){return(Math.random()-.5)*this.So}} /** * @license - * Copyright 2019 Google LLC + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class sa{constructor(e,t,n,r,i,s,o,a){this.ii=e,this.$o=n,this.Oo=r,this.connection=i,this.authCredentialsProvider=s,this.appCheckCredentialsProvider=o,this.listener=a,this.state=0,this.Fo=0,this.Bo=null,this.Lo=null,this.stream=null,this.qo=new ia(e,t)}Uo(){return 1===this.state||5===this.state||this.Ko()}Ko(){return 2===this.state||3===this.state}start(){4!==this.state?this.auth():this.Go()}async stop(){this.Uo()&&await this.close(0)}Qo(){this.state=0,this.qo.reset()}jo(){this.Ko()&&null===this.Bo&&(this.Bo=this.ii.enqueueAfterDelay(this.$o,6e4,()=>this.zo()))}Wo(e){this.Ho(),this.stream.send(e)}async zo(){if(this.Ko())return this.close(0)}Ho(){this.Bo&&(this.Bo.cancel(),this.Bo=null)}Jo(){this.Lo&&(this.Lo.cancel(),this.Lo=null)}async close(e,t){this.Ho(),this.Jo(),this.qo.cancel(),this.Fo++,4!==e?this.qo.reset():t&&t.code===_.RESOURCE_EXHAUSTED?(g(t.toString()),g("Using maximum backoff delay to prevent overloading the backend."),this.qo.xo()):t&&t.code===_.UNAUTHENTICATED&&3!==this.state&&(this.authCredentialsProvider.invalidateToken(),this.appCheckCredentialsProvider.invalidateToken()),null!==this.stream&&(this.Yo(),this.stream.close(),this.stream=null),this.state=e,await this.listener.ao(t)}Yo(){}auth(){this.state=1;const e=this.Xo(this.Fo),t=this.Fo;Promise.all([this.authCredentialsProvider.getToken(),this.appCheckCredentialsProvider.getToken()]).then(([e,n])=>{this.Fo===t&&this.Zo(e,n)},t=>{e(()=>{const e=new T(_.UNKNOWN,"Fetching auth token failed: "+t.message);return this.tu(e)})})}Zo(e,t){const n=this.Xo(this.Fo);this.stream=this.eu(e,t),this.stream.uo(()=>{n(()=>(this.state=2,this.Lo=this.ii.enqueueAfterDelay(this.Oo,1e4,()=>(this.Ko()&&(this.state=3),Promise.resolve())),this.listener.uo()))}),this.stream.ao(e=>{n(()=>this.tu(e))}),this.stream.onMessage(e=>{n(()=>this.onMessage(e))})}Go(){this.state=5,this.qo.No(async()=>{this.state=0,this.start()})}tu(e){return p("PersistentStream","close with error: "+e),this.stream=null,this.close(4,e)}Xo(e){return t=>{this.ii.enqueueAndForget(()=>this.Fo===e?t():(p("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve()))}}}class oa extends sa{constructor(e,t,n,r,i,s){super(e,"listen_stream_connection_backoff","listen_stream_idle","health_check_timeout",t,n,r,s),this.serializer=i}eu(e,t){return this.connection.Ro("Listen",e,t)}onMessage(e){this.qo.reset();const t=function(e,t){let n;if("targetChange"in t){t.targetChange;const r=function(e){return"NO_CHANGE"===e?0:"ADD"===e?1:"REMOVE"===e?2:"CURRENT"===e?3:"RESET"===e?4:v()}(t.targetChange.targetChangeType||"NO_CHANGE"),i=t.targetChange.targetIds||[],s=function(e,t){return e.useProto3Json?(w(void 0===t||"string"==typeof t),ut.fromBase64String(t||"")):(w(void 0===t||t instanceof Uint8Array),ut.fromUint8Array(t||new Uint8Array))}(e,t.targetChange.resumeToken),o=t.targetChange.cause,a=o&&function(e){const t=void 0===e.code?_.UNKNOWN:Vr(e.code);return new T(t,e.message||"")}(o);n=new Jr(r,i,s,a||null)}else if("documentChange"in t){t.documentChange;const r=t.documentChange;r.document,r.document.name,r.document.updateTime;const i=pi(e,r.document.name),s=li(r.document.updateTime),o=r.document.createTime?li(r.document.createTime):U.min(),a=new jt({mapValue:{fields:r.document.fields}}),c=qt.newFoundDocument(i,s,o,a),u=r.targetIds||[],l=r.removedTargetIds||[];n=new Qr(u,l,c.key,c)}else if("documentDelete"in t){t.documentDelete;const r=t.documentDelete;r.document;const i=pi(e,r.document),s=r.readTime?li(r.readTime):U.min(),o=qt.newNoDocument(i,s),a=r.removedTargetIds||[];n=new Qr([],a,o.key,o)}else if("documentRemove"in t){t.documentRemove;const r=t.documentRemove;r.document;const i=pi(e,r.document),s=r.removedTargetIds||[];n=new Qr([],s,i,null)}else{if(!("filter"in t))return v();{t.filter;const e=t.filter;e.targetId;const{count:r=0,unchangedNames:i}=e,s=new Pr(r,i),o=e.targetId;n=new Yr(o,s)}}return n}(this.serializer,e),n=function(e){if(!("targetChange"in e))return U.min();const t=e.targetChange;return t.targetIds&&t.targetIds.length?U.min():t.readTime?li(t.readTime):U.min()}(e);return this.listener.nu(t,n)}su(e){const t={};t.database=yi(this.serializer),t.addTarget=function(e,t){let n;const r=t.target;if(n=mn(r)?{documents:Ti(e,r)}:{query:Ei(e,r)},n.targetId=t.targetId,t.resumeToken.approximateByteSize()>0){n.resumeToken=ci(e,t.resumeToken);const r=oi(e,t.expectedCount);null!==r&&(n.expectedCount=r)}else if(t.snapshotVersion.compareTo(U.min())>0){n.readTime=ai(e,t.snapshotVersion.toTimestamp());const r=oi(e,t.expectedCount);null!==r&&(n.expectedCount=r)}return n}(this.serializer,e);const n=function(e,t){const n=function(e){switch(e){case"TargetPurposeListen":return null;case"TargetPurposeExistenceFilterMismatch":return"existence-filter-mismatch";case"TargetPurposeExistenceFilterMismatchBloom":return"existence-filter-mismatch-bloom";case"TargetPurposeLimboResolution":return"limbo-document";default:return v()}}(t.purpose);return null==n?null:{"goog-listen-tags":n}}(this.serializer,e);n&&(t.labels=n),this.Wo(t)}iu(e){const t={};t.database=yi(this.serializer),t.removeTarget=e,this.Wo(t)}}class aa extends sa{constructor(e,t,n,r,i,s){super(e,"write_stream_connection_backoff","write_stream_idle","health_check_timeout",t,n,r,s),this.serializer=i,this.ru=!1}get ou(){return this.ru}start(){this.ru=!1,this.lastStreamToken=void 0,super.start()}Yo(){this.ru&&this.uu([])}eu(e,t){return this.connection.Ro("Write",e,t)}onMessage(e){if(w(!!e.streamToken),this.lastStreamToken=e.streamToken,this.ru){this.qo.reset();const t=function(e,t){return e&&e.length>0?(w(void 0!==t),e.map(e=>function(e,t){let n=e.updateTime?li(e.updateTime):li(t);return n.isEqual(U.min())&&(n=li(t)),new pr(n,e.transformResults||[])}(e,t))):[]}(e.writeResults,e.commitTime),n=li(e.commitTime);return this.listener.cu(n,t)}return w(!e.writeResults||0===e.writeResults.length),this.ru=!0,this.listener.au()}hu(){const e={};e.database=yi(this.serializer),this.Wo(e)}uu(e){const t={streamToken:this.lastStreamToken,writes:e.map(e=>Ii(this.serializer,e))};this.Wo(t)}} +/** + * @license + * Copyright 2017 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3526,7 +3671,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class oa{constructor(e,t,n,r){this.asyncQueue=e,this.datastore=t,this.updateFunction=n,this.deferred=r,this.la=5,this.ur=new bs(this.asyncQueue,"transaction_retry")}run(){this.la-=1,this.fa()}fa(){this.ur.Zi(async()=>{const e=new sa(this.datastore),t=this.da(e);t&&t.then(t=>{this.asyncQueue.enqueueAndForget(()=>e.commit().then(()=>{this.deferred.resolve(t)}).catch(e=>{this.wa(e)}))}).catch(e=>{this.wa(e)})})}da(e){try{const t=this.updateFunction(e);return!ie(t)&&t.catch&&t.then?t:(this.deferred.reject(Error("Transaction callback must return a Promise")),null)}catch(e){return this.deferred.reject(e),null}}wa(e){this.la>0&&this._a(e)?(this.la-=1,this.asyncQueue.enqueueAndForget(()=>(this.fa(),Promise.resolve()))):this.deferred.reject(e)}_a(e){if("FirebaseError"===e.name){const t=e.code;return"aborted"===t||"failed-precondition"===t||!Bt(t)}return!1}} + */class ca extends class{}{constructor(e,t,n,r){super(),this.authCredentials=e,this.appCheckCredentials=t,this.connection=n,this.serializer=r,this.lu=!1}fu(){if(this.lu)throw new T(_.FAILED_PRECONDITION,"The client has already been terminated.")}Io(e,t,n){return this.fu(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([r,i])=>this.connection.Io(e,t,n,r,i)).catch(e=>{throw"FirebaseError"===e.name?(e.code===_.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),e):new T(_.UNKNOWN,e.toString())})}vo(e,t,n,r){return this.fu(),Promise.all([this.authCredentials.getToken(),this.appCheckCredentials.getToken()]).then(([i,s])=>this.connection.vo(e,t,n,i,s,r)).catch(e=>{throw"FirebaseError"===e.name?(e.code===_.UNAUTHENTICATED&&(this.authCredentials.invalidateToken(),this.appCheckCredentials.invalidateToken()),e):new T(_.UNKNOWN,e.toString())})}terminate(){this.lu=!0}}class ua{constructor(e,t){this.asyncQueue=e,this.onlineStateHandler=t,this.state="Unknown",this.wu=0,this._u=null,this.mu=!0}gu(){0===this.wu&&(this.yu("Unknown"),this._u=this.asyncQueue.enqueueAfterDelay("online_state_timeout",1e4,()=>(this._u=null,this.pu("Backend didn't respond within 10 seconds."),this.yu("Offline"),Promise.resolve())))}Iu(e){"Online"===this.state?this.yu("Unknown"):(this.wu++,this.wu>=1&&(this.Tu(),this.pu("Connection failed 1 times. Most recent error: "+e.toString()),this.yu("Offline")))}set(e){this.Tu(),this.wu=0,"Online"===e&&(this.mu=!1),this.yu(e)}yu(e){e!==this.state&&(this.state=e,this.onlineStateHandler(e))}pu(e){const t=`Could not reach Cloud Firestore backend. ${e}\nThis typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.`;this.mu?(g(t),this.mu=!1):p("OnlineStateTracker",t)}Tu(){null!==this._u&&(this._u.cancel(),this._u=null)}} /** * @license * Copyright 2017 Google LLC @@ -3542,7 +3687,23 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class aa{constructor(e,t,n,r){this.authCredentials=e,this.appCheckCredentials=t,this.asyncQueue=n,this.databaseInfo=r,this.user=u.UNAUTHENTICATED,this.clientId=M.A(),this.authCredentialListener=()=>Promise.resolve(),this.authCredentials.start(n,async e=>{p("FirestoreClient","Received user=",e.uid),await this.authCredentialListener(e),this.user=e}),this.appCheckCredentials.start(n,()=>Promise.resolve())}async getConfiguration(){return{asyncQueue:this.asyncQueue,databaseInfo:this.databaseInfo,clientId:this.clientId,authCredentials:this.authCredentials,appCheckCredentials:this.appCheckCredentials,initialUser:this.user,maxConcurrentLimboResolutions:100}}setCredentialChangeListener(e){this.authCredentialListener=e}verifyNotTerminated(){if(this.asyncQueue.isShuttingDown)throw new T(_.FAILED_PRECONDITION,"The client has already been terminated.")}terminate(){this.asyncQueue.enterRestrictedMode();const e=new E;return this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async()=>{try{this.onlineComponents&&await this.onlineComponents.terminate(),this.offlineComponents&&await this.offlineComponents.terminate(),this.authCredentials.shutdown(),this.appCheckCredentials.shutdown(),e.resolve()}catch(t){const n=to(t,"Failed to shutdown persistence");e.reject(n)}}),e.promise}}async function ca(e,t){e.asyncQueue.verifyOperationInProgress(),p("FirestoreClient","Initializing OfflineComponentProvider");const n=await e.getConfiguration();await t.initialize(n);let r=n.initialUser;e.setCredentialChangeListener(async e=>{r.isEqual(e)||(await Mi(t.localStore,e),r=e)}),t.persistence.setDatabaseDeletedListener(()=>e.terminate()),e.offlineComponents=t}async function ua(e,t){e.asyncQueue.verifyOperationInProgress();const n=await ha(e);p("FirestoreClient","Initializing OnlineComponentProvider");const r=await e.getConfiguration();await t.initialize(n,r),e.setCredentialChangeListener(e=>async function(e,t){const n=I(e);n.asyncQueue.verifyOperationInProgress(),p("RemoteStore","RemoteStore received new credentials");const r=xs(n);n.Gr.add(3),await Ns(n),r&&n.Jr.set("Unknown"),await n.remoteSyncer.handleCredentialChange(t),n.Gr.delete(3),await As(n)}(t.remoteStore,e)),e.onlineComponents=t}async function ha(e){return e.offlineComponents||(p("FirestoreClient","Using default OfflineComponentProvider"),await ca(e,new Xo)),e.offlineComponents}async function la(e){return e.onlineComponents||(p("FirestoreClient","Using default OnlineComponentProvider"),await ua(e,new ta)),e.onlineComponents}function da(e){return ha(e).then(e=>e.persistence)}function fa(e){return ha(e).then(e=>e.localStore)}function pa(e){return la(e).then(e=>e.remoteStore)}function ma(e){return la(e).then(e=>e.syncEngine)}async function ga(e){const t=await la(e),n=t.eventManager;return n.onListen=Eo.bind(null,t.syncEngine),n.onUnlisten=So.bind(null,t.syncEngine),n}function ya(e,t,n={}){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>function(e,t,n,r,i){const s=new ra({next:s=>{t.enqueueAndForget(()=>co(e,o));const a=s.docs.has(n);!a&&s.fromCache?i.reject(new T(_.UNAVAILABLE,"Failed to get document because the client is offline.")):a&&s.fromCache&&r&&"server"===r.source?i.reject(new T(_.UNAVAILABLE,'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to "server" to retrieve the cached document.)')):i.resolve(s)},error:e=>i.reject(e)}),o=new fo(Ge(n.path),s,{includeMetadataChanges:!0,wo:!0});return ao(e,o)}(await ga(e),e.asyncQueue,t,n,r)),r.promise}function va(e,t,n={}){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>function(e,t,n,r,i){const s=new ra({next:n=>{t.enqueueAndForget(()=>co(e,o)),n.fromCache&&"server"===r.source?i.reject(new T(_.UNAVAILABLE,'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')):i.resolve(n)},error:e=>i.reject(e)}),o=new fo(n,s,{includeMetadataChanges:!0,wo:!0});return ao(e,o)}(await ga(e),e.asyncQueue,t,n,r)),r.promise}function wa(e,t,n,r){const i=function(e,t){let n;return n="string"==typeof e?(new TextEncoder).encode(e):e,function(e,t){return new ia(e,t)}(function(e,t){if(e instanceof Uint8Array)return na(e,t);if(e instanceof ArrayBuffer)return na(new Uint8Array(e),t);if(e instanceof ReadableStream)return e.getReader();throw new Error("Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream")}(n),t)} + */class la{constructor(e,t,n,r,i){this.localStore=e,this.datastore=t,this.asyncQueue=n,this.remoteSyncer={},this.Eu=[],this.Au=new Map,this.vu=new Set,this.Ru=[],this.Pu=i,this.Pu.Yr(e=>{n.enqueueAndForget(async()=>{wa(this)&&(p("RemoteStore","Restarting streams for network reachability change."),await async function(e){const t=I(e);t.vu.add(4),await da(t),t.bu.set("Unknown"),t.vu.delete(4),await ha(t)}(this))})}),this.bu=new ua(n,r)}}async function ha(e){if(wa(e))for(const t of e.Ru)await t(!0)}async function da(e){for(const t of e.Ru)await t(!1)}function fa(e,t){const n=I(e);n.Au.has(t.targetId)||(n.Au.set(t.targetId,t),va(n)?ya(n):Fa(n).Ko()&&ga(n,t))}function pa(e,t){const n=I(e),r=Fa(n);n.Au.delete(t),r.Ko()&&ma(n,t),0===n.Au.size&&(r.Ko()?r.jo():wa(n)&&n.bu.set("Unknown"))}function ga(e,t){if(e.Vu.qt(t.targetId),t.resumeToken.approximateByteSize()>0||t.snapshotVersion.compareTo(U.min())>0){const n=e.remoteSyncer.getRemoteKeysForTarget(t.targetId).size;t=t.withExpectedCount(n)}Fa(e).su(t)}function ma(e,t){e.Vu.qt(t),Fa(e).iu(t)}function ya(e){e.Vu=new Zr({getRemoteKeysForTarget:t=>e.remoteSyncer.getRemoteKeysForTarget(t),le:t=>e.Au.get(t)||null,ue:()=>e.datastore.serializer.databaseId}),Fa(e).start(),e.bu.gu()}function va(e){return wa(e)&&!Fa(e).Uo()&&e.Au.size>0}function wa(e){return 0===I(e).vu.size}function ba(e){e.Vu=void 0}async function Ia(e){e.Au.forEach((t,n)=>{ga(e,t)})}async function _a(e,t){ba(e),va(e)?(e.bu.Iu(t),ya(e)):e.bu.set("Unknown")}async function Ta(e,t,n){if(e.bu.set("Online"),t instanceof Jr&&2===t.state&&t.cause)try{await async function(e,t){const n=t.cause;for(const r of t.targetIds)e.Au.has(r)&&(await e.remoteSyncer.rejectListen(r,n),e.Au.delete(r),e.Vu.removeTarget(r))}(e,t)}catch(n){p("RemoteStore","Failed to remove targets %s: %s ",t.targetIds.join(","),n),await Ea(e,n)}else if(t instanceof Qr?e.Vu.Ht(t):t instanceof Yr?e.Vu.ne(t):e.Vu.Xt(t),!n.isEqual(U.min()))try{const t=await Co(e.localStore);n.compareTo(t)>=0&&await function(e,t){const n=e.Vu.ce(t);return n.targetChanges.forEach((n,r)=>{if(n.resumeToken.approximateByteSize()>0){const i=e.Au.get(r);i&&e.Au.set(r,i.withResumeToken(n.resumeToken,t))}}),n.targetMismatches.forEach((t,n)=>{const r=e.Au.get(t);if(!r)return;e.Au.set(t,r.withResumeToken(ut.EMPTY_BYTE_STRING,r.snapshotVersion)),ma(e,t);const i=new xi(r.target,t,n,r.sequenceNumber);ga(e,i)}),e.remoteSyncer.applyRemoteEvent(n)}(e,n)}catch(t){p("RemoteStore","Failed to raise snapshot:",t),await Ea(e,t)}}async function Ea(e,t,n){if(!he(t))throw t;e.vu.add(1),await da(e),e.bu.set("Offline"),n||(n=()=>Co(e.localStore)),e.asyncQueue.enqueueRetryable(async()=>{p("RemoteStore","Retrying IndexedDB access"),await n(),e.vu.delete(1),await ha(e)})}function Sa(e,t){return t().catch(n=>Ea(e,n,t))}async function ka(e){const t=I(e),n=Va(t);let r=t.Eu.length>0?t.Eu[t.Eu.length-1].batchId:-1;for(;Ca(t);)try{const e=await No(t.localStore,r);if(null===e){0===t.Eu.length&&n.jo();break}r=e.batchId,Aa(t,e)}catch(e){await Ea(t,e)}Na(t)&&Da(t)}function Ca(e){return wa(e)&&e.Eu.length<10}function Aa(e,t){e.Eu.push(t);const n=Va(e);n.Ko()&&n.ou&&n.uu(t.mutations)}function Na(e){return wa(e)&&!Va(e).Uo()&&e.Eu.length>0}function Da(e){Va(e).start()}async function Oa(e){Va(e).hu()}async function Ra(e){const t=Va(e);for(const n of e.Eu)t.uu(n.mutations)}async function xa(e,t,n){const r=e.Eu.shift(),i=Or.from(r,t,n);await Sa(e,()=>e.remoteSyncer.applySuccessfulWrite(i)),await ka(e)}async function Pa(e,t){t&&Va(e).ou&&await async function(e,t){if(Fr(n=t.code)&&n!==_.ABORTED){const n=e.Eu.shift();Va(e).Qo(),await Sa(e,()=>e.remoteSyncer.rejectFailedWrite(n.batchId,t)),await ka(e)}var n}(e,t),Na(e)&&Da(e)}async function La(e,t){const n=I(e);n.asyncQueue.verifyOperationInProgress(),p("RemoteStore","RemoteStore received new credentials");const r=wa(n);n.vu.add(3),await da(n),r&&n.bu.set("Unknown"),await n.remoteSyncer.handleCredentialChange(t),n.vu.delete(3),await ha(n)}async function Ma(e,t){const n=I(e);t?(n.vu.delete(2),await ha(n)):t||(n.vu.add(2),await da(n),n.bu.set("Unknown"))}function Fa(e){return e.Su||(e.Su=function(e,t,n){const r=I(e);return r.fu(),new oa(t,r.connection,r.authCredentials,r.appCheckCredentials,r.serializer,n) +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */}(e.datastore,e.asyncQueue,{uo:Ia.bind(null,e),ao:_a.bind(null,e),nu:Ta.bind(null,e)}),e.Ru.push(async t=>{t?(e.Su.Qo(),va(e)?ya(e):e.bu.set("Unknown")):(await e.Su.stop(),ba(e))})),e.Su}function Va(e){return e.Du||(e.Du=function(e,t,n){const r=I(e);return r.fu(),new aa(t,r.connection,r.authCredentials,r.appCheckCredentials,r.serializer,n)}(e.datastore,e.asyncQueue,{uo:Oa.bind(null,e),ao:Pa.bind(null,e),au:Ra.bind(null,e),cu:xa.bind(null,e)}),e.Ru.push(async t=>{t?(e.Du.Qo(),await ka(e)):(await e.Du.stop(),e.Eu.length>0&&(p("RemoteStore",`Stopping write stream with ${e.Eu.length} pending writes`),e.Eu=[]))})),e.Du /** * @license * Copyright 2017 Google LLC @@ -3558,7 +3719,55 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(n,ws(t));e.asyncQueue.enqueueAndForget(async()=>{!function(e,t,n){const r=I(e);(async function(e,t,n){try{const r=await t.getMetadata();if(await function(e,t){const n=I(e),r=In(t.createTime);return n.persistence.runTransaction("hasNewerBundle","readonly",e=>n.Ye.getBundleMetadata(e,t.id)).then(e=>!!e&&e.createTime.compareTo(r)>=0)}(e.localStore,r))return await t.close(),void n._completeWith(function(e){return{taskState:"Success",documentsLoaded:e.totalDocuments,bytesLoaded:e.totalBytes,totalDocuments:e.totalDocuments,totalBytes:e.totalBytes}}(r));n._updateProgress(yo(r));const i=new go(r,e.localStore,t.k);let s=await t.Ho();for(;s;){const e=await i.yo(s);e&&n._updateProgress(e),s=await t.Ho()}const o=await i.complete();await Uo(e,o.In,void 0),await function(e,t){const n=I(e);return n.persistence.runTransaction("Save bundle","readwrite",e=>n.Ye.saveBundleMetadata(e,t))}(e.localStore,r),n._completeWith(o.progress)}catch(e){g("SyncEngine","Loading bundle failed with "+e),n._failWith(e)}} + */}class ja{constructor(e,t,n,r,i){this.asyncQueue=e,this.timerId=t,this.targetTimeMs=n,this.op=r,this.removalCallback=i,this.deferred=new E,this.then=this.deferred.promise.then.bind(this.deferred.promise),this.deferred.promise.catch(e=>{})}static createAndSchedule(e,t,n,r,i){const s=Date.now()+n,o=new ja(e,t,s,r,i);return o.start(n),o}start(e){this.timerHandle=setTimeout(()=>this.handleDelayElapsed(),e)}skipDelay(){return this.handleDelayElapsed()}cancel(e){null!==this.timerHandle&&(this.clearTimeout(),this.deferred.reject(new T(_.CANCELLED,"Operation cancelled"+(e?": "+e:""))))}handleDelayElapsed(){this.asyncQueue.enqueueAndForget(()=>null!==this.timerHandle?(this.clearTimeout(),this.op().then(e=>this.deferred.resolve(e))):Promise.resolve())}clearTimeout(){null!==this.timerHandle&&(this.removalCallback(this),clearTimeout(this.timerHandle),this.timerHandle=null)}}function Ua(e,t){if(g("AsyncQueue",`${t}: ${e}`),he(e))return new T(_.UNAVAILABLE,`${t}: ${e}`);throw e} +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class qa{constructor(e){this.comparator=e?(t,n)=>e(t,n)||K.comparator(t.key,n.key):(e,t)=>K.comparator(e.key,t.key),this.keyedMap=Bn(),this.sortedSet=new et(this.comparator)}static emptySet(e){return new qa(e.comparator)}has(e){return null!=this.keyedMap.get(e)}get(e){return this.keyedMap.get(e)}first(){return this.sortedSet.minKey()}last(){return this.sortedSet.maxKey()}isEmpty(){return this.sortedSet.isEmpty()}indexOf(e){const t=this.keyedMap.get(e);return t?this.sortedSet.indexOf(t):-1}get size(){return this.sortedSet.size}forEach(e){this.sortedSet.inorderTraversal((t,n)=>(e(t),!1))}add(e){const t=this.delete(e.key);return t.copy(t.keyedMap.insert(e.key,e),t.sortedSet.insert(e,null))}delete(e){const t=this.get(e);return t?this.copy(this.keyedMap.remove(e),this.sortedSet.remove(t)):this}isEqual(e){if(!(e instanceof qa))return!1;if(this.size!==e.size)return!1;const t=this.sortedSet.getIterator(),n=e.sortedSet.getIterator();for(;t.hasNext();){const e=t.getNext().key,r=n.getNext().key;if(!e.isEqual(r))return!1}return!0}toString(){const e=[];return this.forEach(t=>{e.push(t.toString())}),0===e.length?"DocumentSet ()":"DocumentSet (\n "+e.join(" \n")+"\n)"}copy(e,t){const n=new qa;return n.comparator=this.comparator,n.keyedMap=e,n.sortedSet=t,n}} +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class Ba{constructor(){this.Cu=new et(K.comparator)}track(e){const t=e.doc.key,n=this.Cu.get(t);n?0!==e.type&&3===n.type?this.Cu=this.Cu.insert(t,e):3===e.type&&1!==n.type?this.Cu=this.Cu.insert(t,{type:n.type,doc:e.doc}):2===e.type&&2===n.type?this.Cu=this.Cu.insert(t,{type:2,doc:e.doc}):2===e.type&&0===n.type?this.Cu=this.Cu.insert(t,{type:0,doc:e.doc}):1===e.type&&0===n.type?this.Cu=this.Cu.remove(t):1===e.type&&2===n.type?this.Cu=this.Cu.insert(t,{type:1,doc:n.doc}):0===e.type&&1===n.type?this.Cu=this.Cu.insert(t,{type:2,doc:e.doc}):v():this.Cu=this.Cu.insert(t,e)}xu(){const e=[];return this.Cu.inorderTraversal((t,n)=>{e.push(n)}),e}}class za{constructor(e,t,n,r,i,s,o,a,c){this.query=e,this.docs=t,this.oldDocs=n,this.docChanges=r,this.mutatedKeys=i,this.fromCache=s,this.syncStateChanged=o,this.excludesMetadataChanges=a,this.hasCachedResults=c}static fromInitialDocuments(e,t,n,r,i){const s=[];return t.forEach(e=>{s.push({type:0,doc:e})}),new za(e,t,qa.emptySet(t),s,n,r,!0,!1,i)}get hasPendingWrites(){return!this.mutatedKeys.isEmpty()}isEqual(e){if(!(this.fromCache===e.fromCache&&this.hasCachedResults===e.hasCachedResults&&this.syncStateChanged===e.syncStateChanged&&this.mutatedKeys.isEqual(e.mutatedKeys)&&On(this.query,e.query)&&this.docs.isEqual(e.docs)&&this.oldDocs.isEqual(e.oldDocs)))return!1;const t=this.docChanges,n=e.docChanges;if(t.length!==n.length)return!1;for(let e=0;eRn(e),On),this.onlineState="Unknown",this.ku=new Set}}async function $a(e,t){const n=I(e),r=t.query;let i=!1,s=n.queries.get(r);if(s||(i=!0,s=new Ga),i)try{s.Nu=await n.onListen(r)}catch(e){const n=Ua(e,`Initialization of query '${xn(t.query)}' failed`);return void t.onError(n)}n.queries.set(r,s),s.listeners.push(t),t.Mu(n.onlineState),s.Nu&&t.$u(s.Nu)&&Ya(n)}async function Wa(e,t){const n=I(e),r=t.query;let i=!1;const s=n.queries.get(r);if(s){const e=s.listeners.indexOf(t);e>=0&&(s.listeners.splice(e,1),i=0===s.listeners.length)}if(i)return n.queries.delete(r),n.onUnlisten(r)}function Ha(e,t){const n=I(e);let r=!1;for(const e of t){const t=e.query,i=n.queries.get(t);if(i){for(const t of i.listeners)t.$u(e)&&(r=!0);i.Nu=e}}r&&Ya(n)}function Qa(e,t,n){const r=I(e),i=r.queries.get(t);if(i)for(const e of i.listeners)e.onError(n);r.queries.delete(t)}function Ya(e){e.ku.forEach(e=>{e.next()})}class Ja{constructor(e,t,n){this.query=e,this.Ou=t,this.Fu=!1,this.Bu=null,this.onlineState="Unknown",this.options=n||{}}$u(e){if(!this.options.includeMetadataChanges){const t=[];for(const n of e.docChanges)3!==n.type&&t.push(n);e=new za(e.query,e.docs,e.oldDocs,t,e.mutatedKeys,e.fromCache,e.syncStateChanged,!0,e.hasCachedResults)}let t=!1;return this.Fu?this.Lu(e)&&(this.Ou.next(e),t=!0):this.qu(e,this.onlineState)&&(this.Uu(e),t=!0),this.Bu=e,t}onError(e){this.Ou.error(e)}Mu(e){this.onlineState=e;let t=!1;return this.Bu&&!this.Fu&&this.qu(this.Bu,e)&&(this.Uu(this.Bu),t=!0),t}qu(e,t){if(!e.fromCache)return!0;const n="Offline"!==t;return(!this.options.Ku||!n)&&(!e.docs.isEmpty()||e.hasCachedResults||"Offline"===t)}Lu(e){if(e.docChanges.length>0)return!0;const t=this.Bu&&this.Bu.hasPendingWrites!==e.hasPendingWrites;return!(!e.syncStateChanged&&!t)&&!0===this.options.includeMetadataChanges}Uu(e){e=za.fromInitialDocuments(e.query,e.docs,e.mutatedKeys,e.fromCache,e.hasCachedResults),this.Fu=!0,this.Ou.next(e)}} /** * @license * Copyright 2020 Google LLC @@ -3574,7 +3783,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */)(r,t,n).then(()=>{r.sharedClientState.notifyBundleLoaded()})}(await ma(e),i,r)})}class ba{constructor(e,t,n,r,i,s,o,a){this.databaseId=e,this.appId=t,this.persistenceKey=n,this.host=r,this.ssl=i,this.forceLongPolling=s,this.autoDetectLongPolling=o,this.useFetchStreams=a}}class Ia{constructor(e,t){this.projectId=e,this.database=t||"(default)"}get isDefaultDatabase(){return"(default)"===this.database}isEqual(e){return e instanceof Ia&&e.projectId===this.projectId&&e.database===this.database}} + */class Xa{constructor(e,t){this.Gu=e,this.byteLength=t}Qu(){return"metadata"in this.Gu}} /** * @license * Copyright 2020 Google LLC @@ -3590,7 +3799,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const _a=new Map; + */class Za{constructor(e){this.serializer=e}rr(e){return pi(this.serializer,e)}ur(e){return e.metadata.exists?bi(this.serializer,e.document,!1):qt.newNoDocument(this.rr(e.metadata.name),this.cr(e.metadata.readTime))}cr(e){return li(e)}}class ec{constructor(e,t,n){this.ju=e,this.localStore=t,this.serializer=n,this.queries=[],this.documents=[],this.collectionGroups=new Set,this.progress=tc(e)}zu(e){this.progress.bytesLoaded+=e.byteLength;let t=this.progress.documentsLoaded;if(e.Gu.namedQuery)this.queries.push(e.Gu.namedQuery);else if(e.Gu.documentMetadata){this.documents.push({metadata:e.Gu.documentMetadata}),e.Gu.documentMetadata.exists||++t;const n=B.fromString(e.Gu.documentMetadata.name);this.collectionGroups.add(n.get(n.length-2))}else e.Gu.document&&(this.documents[this.documents.length-1].document=e.Gu.document,++t);return t!==this.progress.documentsLoaded?(this.progress.documentsLoaded=t,Object.assign({},this.progress)):null}Wu(e){const t=new Map,n=new Za(this.serializer);for(const r of e)if(r.metadata.queries){const e=n.rr(r.metadata.name);for(const n of r.metadata.queries){const r=(t.get(n)||Qn()).add(e);t.set(n,r)}}return t}async complete(){const e=await async function(e,t,n,r){const i=I(e);let s=Qn(),o=Un();for(const e of n){const n=t.rr(e.metadata.name);e.document&&(s=s.add(n));const r=t.ur(e);r.setReadTime(t.cr(e.metadata.readTime)),o=o.insert(n,r)}const a=i.Zi.newChangeBuffer({trackRemovals:!0}),c=await Do(i,function(e){return An(_n(B.fromString("__bundle__/docs/"+e)))}(r));return i.persistence.runTransaction("Apply bundle documents","readwrite",e=>Ao(e,a,o).next(t=>(a.apply(e),t)).next(t=>i.Bs.removeMatchingKeysForTargetId(e,c.targetId).next(()=>i.Bs.addMatchingKeys(e,s,c.targetId)).next(()=>i.localDocuments.getLocalViewOfDocuments(e,t.nr,t.sr)).next(()=>t.nr)))}(this.localStore,new Za(this.serializer),this.documents,this.ju.id),t=this.Wu(this.documents);for(const e of this.queries)await Mo(this.localStore,e,t.get(e.name));return this.progress.taskState="Success",{progress:this.progress,Hu:this.collectionGroups,Ju:e}}}function tc(e){return{taskState:"Running",documentsLoaded:0,bytesLoaded:0,totalDocuments:e.totalDocuments,totalBytes:e.totalBytes}} /** * @license * Copyright 2017 Google LLC @@ -3606,7 +3815,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Ta(e,t,n){if(!n)throw new T(_.INVALID_ARGUMENT,`Function ${e}() cannot be called with an empty ${t}.`)}function Ea(e,t,n,r){if(!0===t&&!0===r)throw new T(_.INVALID_ARGUMENT,`${e} and ${n} cannot be used together.`)}function ka(e){if(!ae.isDocumentKey(e))throw new T(_.INVALID_ARGUMENT,`Invalid document reference. Document references must have an even number of segments, but ${e} has ${e.length}.`)}function Sa(e){if(ae.isDocumentKey(e))throw new T(_.INVALID_ARGUMENT,`Invalid collection reference. Collection references must have an odd number of segments, but ${e} has ${e.length}.`)}function Aa(e){if(void 0===e)return"undefined";if(null===e)return"null";if("string"==typeof e)return e.length>20&&(e=e.substring(0,20)+"..."),JSON.stringify(e);if("number"==typeof e||"boolean"==typeof e)return""+e;if("object"==typeof e){if(e instanceof Array)return"an array";{const t=function(e){return e.constructor?e.constructor.name:null}(e);return t?`a custom ${t} object`:"an object"}}return"function"==typeof e?"a function":v()}function Na(e,t){if("_delegate"in e&&(e=e._delegate),!(e instanceof t)){if(t.name===e.constructor.name)throw new T(_.INVALID_ARGUMENT,"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?");{const n=Aa(e);throw new T(_.INVALID_ARGUMENT,`Expected type '${t.name}', but it was: ${n}`)}}return e}function Oa(e,t){if(t<=0)throw new T(_.INVALID_ARGUMENT,`Function ${e}() requires a positive number, but it was: ${t}.`)} + */class nc{constructor(e){this.key=e}}class rc{constructor(e){this.key=e}}class ic{constructor(e,t){this.query=e,this.Yu=t,this.Xu=null,this.hasCachedResults=!1,this.current=!1,this.Zu=Qn(),this.mutatedKeys=Qn(),this.tc=Mn(e),this.ec=new qa(this.tc)}get nc(){return this.Yu}sc(e,t){const n=t?t.ic:new Ba,r=t?t.ec:this.ec;let i=t?t.mutatedKeys:this.mutatedKeys,s=r,o=!1;const a="F"===this.query.limitType&&r.size===this.query.limit?r.last():null,c="L"===this.query.limitType&&r.size===this.query.limit?r.first():null;if(e.inorderTraversal((e,t)=>{const u=r.get(e),l=Pn(this.query,t)?t:null,h=!!u&&this.mutatedKeys.has(u.key),d=!!l&&(l.hasLocalMutations||this.mutatedKeys.has(l.key)&&l.hasCommittedMutations);let f=!1;u&&l?u.data.isEqual(l.data)?h!==d&&(n.track({type:3,doc:l}),f=!0):this.rc(u,l)||(n.track({type:2,doc:l}),f=!0,(a&&this.tc(l,a)>0||c&&this.tc(l,c)<0)&&(o=!0)):!u&&l?(n.track({type:0,doc:l}),f=!0):u&&!l&&(n.track({type:1,doc:u}),f=!0,(a||c)&&(o=!0)),f&&(l?(s=s.add(l),i=d?i.add(e):i.delete(e)):(s=s.delete(e),i=i.delete(e)))}),null!==this.query.limit)for(;s.size>this.query.limit;){const e="F"===this.query.limitType?s.last():s.first();s=s.delete(e.key),i=i.delete(e.key),n.track({type:1,doc:e})}return{ec:s,ic:n,zi:o,mutatedKeys:i}}rc(e,t){return e.hasLocalMutations&&t.hasCommittedMutations&&!t.hasLocalMutations}applyChanges(e,t,n){const r=this.ec;this.ec=e.ec,this.mutatedKeys=e.mutatedKeys;const i=e.ic.xu();i.sort((e,t)=>function(e,t){const n=e=>{switch(e){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return v()}};return n(e)-n(t)} /** * @license * Copyright 2020 Google LLC @@ -3622,7 +3831,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Ca{constructor(e){var t;if(void 0===e.host){if(void 0!==e.ssl)throw new T(_.INVALID_ARGUMENT,"Can't provide ssl option if host option is not set");this.host="firestore.googleapis.com",this.ssl=!0}else this.host=e.host,this.ssl=null===(t=e.ssl)||void 0===t||t;if(this.credentials=e.credentials,this.ignoreUndefinedProperties=!!e.ignoreUndefinedProperties,void 0===e.cacheSizeBytes)this.cacheSizeBytes=41943040;else{if(-1!==e.cacheSizeBytes&&e.cacheSizeBytes<1048576)throw new T(_.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");this.cacheSizeBytes=e.cacheSizeBytes}this.experimentalForceLongPolling=!!e.experimentalForceLongPolling,this.experimentalAutoDetectLongPolling=!!e.experimentalAutoDetectLongPolling,this.useFetchStreams=!!e.useFetchStreams,Ea("experimentalForceLongPolling",e.experimentalForceLongPolling,"experimentalAutoDetectLongPolling",e.experimentalAutoDetectLongPolling)}isEqual(e){return this.host===e.host&&this.ssl===e.ssl&&this.credentials===e.credentials&&this.cacheSizeBytes===e.cacheSizeBytes&&this.experimentalForceLongPolling===e.experimentalForceLongPolling&&this.experimentalAutoDetectLongPolling===e.experimentalAutoDetectLongPolling&&this.ignoreUndefinedProperties===e.ignoreUndefinedProperties&&this.useFetchStreams===e.useFetchStreams}} + */(e.type,t.type)||this.tc(e.doc,t.doc)),this.oc(n);const s=t?this.uc():[],o=0===this.Zu.size&&this.current?1:0,a=o!==this.Xu;return this.Xu=o,0!==i.length||a?{snapshot:new za(this.query,e.ec,r,i,e.mutatedKeys,0===o,a,!1,!!n&&n.resumeToken.approximateByteSize()>0),cc:s}:{cc:s}}Mu(e){return this.current&&"Offline"===e?(this.current=!1,this.applyChanges({ec:this.ec,ic:new Ba,mutatedKeys:this.mutatedKeys,zi:!1},!1)):{cc:[]}}ac(e){return!this.Yu.has(e)&&!!this.ec.has(e)&&!this.ec.get(e).hasLocalMutations}oc(e){e&&(e.addedDocuments.forEach(e=>this.Yu=this.Yu.add(e)),e.modifiedDocuments.forEach(e=>{}),e.removedDocuments.forEach(e=>this.Yu=this.Yu.delete(e)),this.current=e.current)}uc(){if(!this.current)return[];const e=this.Zu;this.Zu=Qn(),this.ec.forEach(e=>{this.ac(e.key)&&(this.Zu=this.Zu.add(e.key))});const t=[];return e.forEach(e=>{this.Zu.has(e)||t.push(new rc(e))}),this.Zu.forEach(n=>{e.has(n)||t.push(new nc(n))}),t}hc(e){this.Yu=e.ir,this.Zu=Qn();const t=this.sc(e.documents);return this.applyChanges(t,!0)}lc(){return za.fromInitialDocuments(this.query,this.ec,this.mutatedKeys,0===this.Xu,this.hasCachedResults)}}class sc{constructor(e,t,n){this.query=e,this.targetId=t,this.view=n}}class oc{constructor(e){this.key=e,this.fc=!1}}class ac{constructor(e,t,n,r,i,s){this.localStore=e,this.remoteStore=t,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=s,this.dc={},this.wc=new Vn(e=>Rn(e),On),this._c=new Map,this.mc=new Set,this.gc=new et(K.comparator),this.yc=new Map,this.Ic=new io,this.Tc={},this.Ec=new Map,this.Ac=xs.Mn(),this.onlineState="Unknown",this.vc=void 0}get isPrimaryClient(){return!0===this.vc}}async function cc(e,t){const n=Pc(e);let r,i;const s=n.wc.get(t);if(s)r=s.targetId,n.sharedClientState.addLocalQueryTarget(r),i=s.view.lc();else{const e=await Do(n.localStore,An(t)),s=n.sharedClientState.addLocalQueryTarget(e.targetId);r=e.targetId,i=await uc(n,t,r,"current"===s,e.resumeToken),n.isPrimaryClient&&fa(n.remoteStore,e)}return i}async function uc(e,t,n,r,i){e.Rc=(t,n,r)=>async function(e,t,n,r){let i=t.view.sc(n);i.zi&&(i=await Ro(e.localStore,t.query,!1).then(({documents:e})=>t.view.sc(e,i)));const s=r&&r.targetChanges.get(t.targetId),o=t.view.applyChanges(i,e.isPrimaryClient,s);return bc(e,t.targetId,o.cc),o.snapshot}(e,t,n,r);const s=await Ro(e.localStore,t,!0),o=new ic(t,s.ir),a=o.sc(s.documents),c=Hr.createSynthesizedTargetChangeForCurrentChange(n,r&&"Offline"!==e.onlineState,i),u=o.applyChanges(a,e.isPrimaryClient,c);bc(e,n,u.cc);const l=new sc(t,n,o);return e.wc.set(t,l),e._c.has(n)?e._c.get(n).push(t):e._c.set(n,[t]),u.snapshot}async function lc(e,t){const n=I(e),r=n.wc.get(t),i=n._c.get(r.targetId);if(i.length>1)return n._c.set(r.targetId,i.filter(e=>!On(e,t))),void n.wc.delete(t);n.isPrimaryClient?(n.sharedClientState.removeLocalQueryTarget(r.targetId),n.sharedClientState.isActiveQueryTarget(r.targetId)||await Oo(n.localStore,r.targetId,!1).then(()=>{n.sharedClientState.clearQueryState(r.targetId),pa(n.remoteStore,r.targetId),vc(n,r.targetId)}).catch(se)):(vc(n,r.targetId),await Oo(n.localStore,r.targetId,!0))}async function hc(e,t){const n=I(e);try{const e=await function(e,t){const n=I(e),r=t.snapshotVersion;let i=n.Ji;return n.persistence.runTransaction("Apply remote event","readwrite-primary",e=>{const s=n.Zi.newChangeBuffer({trackRemovals:!0});i=n.Ji;const o=[];t.targetChanges.forEach((s,a)=>{const c=i.get(a);if(!c)return;o.push(n.Bs.removeMatchingKeys(e,s.removedDocuments,a).next(()=>n.Bs.addMatchingKeys(e,s.addedDocuments,a)));let u=c.withSequenceNumber(e.currentSequenceNumber);null!==t.targetMismatches.get(a)?u=u.withResumeToken(ut.EMPTY_BYTE_STRING,U.min()).withLastLimboFreeSnapshotVersion(U.min()):s.resumeToken.approximateByteSize()>0&&(u=u.withResumeToken(s.resumeToken,r)),i=i.insert(a,u),function(e,t,n){return 0===e.resumeToken.approximateByteSize()||(t.snapshotVersion.toMicroseconds()-e.snapshotVersion.toMicroseconds()>=3e8||n.addedDocuments.size+n.modifiedDocuments.size+n.removedDocuments.size>0)}(c,u,s)&&o.push(n.Bs.updateTargetData(e,u))});let a=Un(),c=Qn();if(t.documentUpdates.forEach(r=>{t.resolvedLimboDocuments.has(r)&&o.push(n.persistence.referenceDelegate.updateLimboDocument(e,r))}),o.push(Ao(e,s,t.documentUpdates).next(e=>{a=e.nr,c=e.sr})),!r.isEqual(U.min())){const t=n.Bs.getLastRemoteSnapshotVersion(e).next(t=>n.Bs.setTargetsMetadata(e,e.currentSequenceNumber,r));o.push(t)}return oe.waitFor(o).next(()=>s.apply(e)).next(()=>n.localDocuments.getLocalViewOfDocuments(e,a,c)).next(()=>a)}).then(e=>(n.Ji=i,e))}(n.localStore,t);t.targetChanges.forEach((e,t)=>{const r=n.yc.get(t);r&&(w(e.addedDocuments.size+e.modifiedDocuments.size+e.removedDocuments.size<=1),e.addedDocuments.size>0?r.fc=!0:e.modifiedDocuments.size>0?w(r.fc):e.removedDocuments.size>0&&(w(r.fc),r.fc=!1))}),await Tc(n,e,t)}catch(e){await se(e)}}function dc(e,t,n){const r=I(e);if(r.isPrimaryClient&&0===n||!r.isPrimaryClient&&1===n){const e=[];r.wc.forEach((n,r)=>{const i=r.view.Mu(t);i.snapshot&&e.push(i.snapshot)}),function(e,t){const n=I(e);n.onlineState=t;let r=!1;n.queries.forEach((e,n)=>{for(const e of n.listeners)e.Mu(t)&&(r=!0)}),r&&Ya(n)}(r.eventManager,t),e.length&&r.dc.nu(e),r.onlineState=t,r.isPrimaryClient&&r.sharedClientState.setOnlineState(t)}}async function fc(e,t,n){const r=I(e);r.sharedClientState.updateQueryState(t,"rejected",n);const i=r.yc.get(t),s=i&&i.key;if(s){let e=new et(K.comparator);e=e.insert(s,qt.newNoDocument(s,U.min()));const n=Qn().add(s),i=new Wr(U.min(),new Map,new et(M),e,n);await hc(r,i),r.gc=r.gc.remove(s),r.yc.delete(t),_c(r)}else await Oo(r.localStore,t,!1).then(()=>vc(r,t,n)).catch(se)}async function pc(e,t){const n=I(e),r=t.batch.batchId;try{const e=await function(e,t){const n=I(e);return n.persistence.runTransaction("Acknowledge batch","readwrite-primary",e=>{const r=t.batch.keys(),i=n.Zi.newChangeBuffer({trackRemovals:!0});return function(e,t,n,r){const i=n.batch,s=i.keys();let o=oe.resolve();return s.forEach(e=>{o=o.next(()=>r.getEntry(t,e)).next(t=>{const s=n.docVersions.get(e);w(null!==s),t.version.compareTo(s)<0&&(i.applyToRemoteDocument(t,n),t.isValidDocument()&&(t.setReadTime(n.commitVersion),r.addEntry(t)))})}),o.next(()=>e.mutationQueue.removeMutationBatch(t,i))}(n,e,t,i).next(()=>i.apply(e)).next(()=>n.mutationQueue.performConsistencyCheck(e)).next(()=>n.documentOverlayCache.removeOverlaysForBatchId(e,r,t.batch.batchId)).next(()=>n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e,function(e){let t=Qn();for(let n=0;n0&&(t=t.add(e.batch.mutations[n].key));return t}(t))).next(()=>n.localDocuments.getDocuments(e,r))})}(n.localStore,t);yc(n,r,null),mc(n,r),n.sharedClientState.updateMutationState(r,"acknowledged"),await Tc(n,e)}catch(e){await se(e)}}async function gc(e,t,n){const r=I(e);try{const e=await function(e,t){const n=I(e);return n.persistence.runTransaction("Reject batch","readwrite-primary",e=>{let r;return n.mutationQueue.lookupMutationBatch(e,t).next(t=>(w(null!==t),r=t.keys(),n.mutationQueue.removeMutationBatch(e,t))).next(()=>n.mutationQueue.performConsistencyCheck(e)).next(()=>n.documentOverlayCache.removeOverlaysForBatchId(e,r,t)).next(()=>n.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(e,r)).next(()=>n.localDocuments.getDocuments(e,r))})}(r.localStore,t);yc(r,t,n),mc(r,t),r.sharedClientState.updateMutationState(t,"rejected",n),await Tc(r,e)}catch(n){await se(n)}}function mc(e,t){(e.Ec.get(t)||[]).forEach(e=>{e.resolve()}),e.Ec.delete(t)}function yc(e,t,n){const r=I(e);let i=r.Tc[r.currentUser.toKey()];if(i){const e=i.get(t);e&&(n?e.reject(n):e.resolve(),i=i.remove(t)),r.Tc[r.currentUser.toKey()]=i}}function vc(e,t,n=null){e.sharedClientState.removeLocalQueryTarget(t);for(const r of e._c.get(t))e.wc.delete(r),n&&e.dc.Pc(r,n);e._c.delete(t),e.isPrimaryClient&&e.Ic.Is(t).forEach(t=>{e.Ic.containsKey(t)||wc(e,t)})}function wc(e,t){e.mc.delete(t.path.canonicalString());const n=e.gc.get(t);null!==n&&(pa(e.remoteStore,n),e.gc=e.gc.remove(t),e.yc.delete(n),_c(e))}function bc(e,t,n){for(const r of n)r instanceof nc?(e.Ic.addReference(r.key,t),Ic(e,r)):r instanceof rc?(p("SyncEngine","Document no longer in limbo: "+r.key),e.Ic.removeReference(r.key,t),e.Ic.containsKey(r.key)||wc(e,r.key)):v()}function Ic(e,t){const n=t.key,r=n.path.canonicalString();e.gc.get(n)||e.mc.has(r)||(p("SyncEngine","New document in limbo: "+n),e.mc.add(r),_c(e))}function _c(e){for(;e.mc.size>0&&e.gc.size{o.push(r.Rc(a,t,n).then(e=>{if((e||n)&&r.isPrimaryClient&&r.sharedClientState.updateQueryState(a.targetId,(null==e?void 0:e.fromCache)?"not-current":"current"),e){i.push(e);const t=_o.Li(a.targetId,e);s.push(t)}}))}),await Promise.all(o),r.dc.nu(i),await async function(e,t){const n=I(e);try{await n.persistence.runTransaction("notifyLocalViewChanges","readwrite",e=>oe.forEach(t,t=>oe.forEach(t.Fi,r=>n.persistence.referenceDelegate.addReference(e,t.targetId,r)).next(()=>oe.forEach(t.Bi,r=>n.persistence.referenceDelegate.removeReference(e,t.targetId,r)))))}catch(e){if(!he(e))throw e;p("LocalStore","Failed to update sequence numbers: "+e)}for(const e of t){const t=e.targetId;if(!e.fromCache){const e=n.Ji.get(t),r=e.snapshotVersion,i=e.withLastLimboFreeSnapshotVersion(r);n.Ji=n.Ji.insert(t,i)}}}(r.localStore,s))}async function Ec(e,t){const n=I(e);if(!n.currentUser.isEqual(t)){p("SyncEngine","User change. New user:",t.toKey());const e=await ko(n.localStore,t);n.currentUser=t,function(e,t){e.Ec.forEach(e=>{e.forEach(e=>{e.reject(new T(_.CANCELLED,"'waitForPendingWrites' promise is rejected due to a user change."))})}),e.Ec.clear()}(n),n.sharedClientState.handleUserChange(t,e.removedBatchIds,e.addedBatchIds),await Tc(n,e.er)}}function Sc(e,t){const n=I(e),r=n.yc.get(t);if(r&&r.fc)return Qn().add(r.key);{let e=Qn();const r=n._c.get(t);if(!r)return e;for(const t of r){const r=n.wc.get(t);e=e.unionWith(r.view.nc)}return e}}async function kc(e,t){const n=I(e),r=await Ro(n.localStore,t.query,!0),i=t.view.hc(r);return n.isPrimaryClient&&bc(n,t.targetId,i.cc),i}async function Cc(e,t){const n=I(e);return Po(n.localStore,t).then(e=>Tc(n,e))}async function Ac(e,t,n,r){const i=I(e),s=await function(e,t){const n=I(e),r=I(n.mutationQueue);return n.persistence.runTransaction("Lookup mutation documents","readonly",e=>r.Sn(e,t).next(t=>t?n.localDocuments.getDocuments(e,t):oe.resolve(null)))}(i.localStore,t);null!==s?("pending"===n?await ka(i.remoteStore):"acknowledged"===n||"rejected"===n?(yc(i,t,r||null),mc(i,t),function(e,t){I(I(e).mutationQueue).Cn(t)}(i.localStore,t)):v(),await Tc(i,s)):p("SyncEngine","Cannot apply mutation batch with id: "+t)}async function Nc(e,t,n){const r=I(e),i=[],s=[];for(const e of t){let t;const n=r._c.get(e);if(n&&0!==n.length){t=await Do(r.localStore,An(n[0]));for(const e of n){const t=r.wc.get(e),n=await kc(r,t);n.snapshot&&s.push(n.snapshot)}}else{const n=await xo(r.localStore,e);t=await Do(r.localStore,n),await uc(r,Dc(n),e,!1,t.resumeToken)}i.push(t)}return r.dc.nu(s),i}function Dc(e){return In(e.path,e.collectionGroup,e.orderBy,e.filters,e.limit,"F",e.startAt,e.endAt)}function Oc(e){const t=I(e);return I(I(t.localStore).persistence).$i()}async function Rc(e,t,n,r){const i=I(e);if(i.vc)return void p("SyncEngine","Ignoring unexpected query state notification.");const s=i._c.get(t);if(s&&s.length>0)switch(n){case"current":case"not-current":{const e=await Po(i.localStore,Ln(s[0])),r=Wr.createSynthesizedRemoteEventForCurrentChange(t,"current"===n,ut.EMPTY_BYTE_STRING);await Tc(i,e,r);break}case"rejected":await Oo(i.localStore,t,!0),vc(i,t,r);break;default:v()}}async function xc(e,t,n){const r=Pc(e);if(r.vc){for(const e of t){if(r._c.has(e)){p("SyncEngine","Adding an already active target "+e);continue}const t=await xo(r.localStore,e),n=await Do(r.localStore,t);await uc(r,Dc(t),n.targetId,!1,n.resumeToken),fa(r.remoteStore,n)}for(const e of n)r._c.has(e)&&await Oo(r.localStore,e,!1).then(()=>{pa(r.remoteStore,e),vc(r,e)}).catch(se)}}function Pc(e){const t=I(e);return t.remoteStore.remoteSyncer.applyRemoteEvent=hc.bind(null,t),t.remoteStore.remoteSyncer.getRemoteKeysForTarget=Sc.bind(null,t),t.remoteStore.remoteSyncer.rejectListen=fc.bind(null,t),t.dc.nu=Ha.bind(null,t.eventManager),t.dc.Pc=Qa.bind(null,t.eventManager),t}function Lc(e){const t=I(e);return t.remoteStore.remoteSyncer.applySuccessfulWrite=pc.bind(null,t),t.remoteStore.remoteSyncer.rejectFailedWrite=gc.bind(null,t),t}class Mc{constructor(){this.synchronizeTabs=!1}async initialize(e){this.serializer=ra(e.databaseInfo.databaseId),this.sharedClientState=this.createSharedClientState(e),this.persistence=this.createPersistence(e),await this.persistence.start(),this.localStore=this.createLocalStore(e),this.gcScheduler=this.createGarbageCollectionScheduler(e,this.localStore),this.indexBackfillerScheduler=this.createIndexBackfillerScheduler(e,this.localStore)}createGarbageCollectionScheduler(e,t){return null}createIndexBackfillerScheduler(e,t){return null}createLocalStore(e){return So(this.persistence,new To,e.initialUser,this.serializer)}createPersistence(e){return new lo(fo.zs,this.serializer)}createSharedClientState(e){return new $o}async terminate(){this.gcScheduler&&this.gcScheduler.stop(),await this.sharedClientState.shutdown(),await this.persistence.shutdown()}}class Fc extends Mc{constructor(e){super(),this.cacheSizeBytes=e}createGarbageCollectionScheduler(e,t){w(this.persistence.referenceDelegate instanceof po);const n=this.persistence.referenceDelegate.garbageCollector;return new Us(n,e.asyncQueue,t)}createPersistence(e){const t=void 0!==this.cacheSizeBytes?Ss.withCacheSize(this.cacheSizeBytes):Ss.DEFAULT;return new lo(e=>po.zs(e,t),this.serializer)}}class Vc extends Mc{constructor(e,t,n){super(),this.Vc=e,this.cacheSizeBytes=t,this.forceOwnership=n,this.synchronizeTabs=!1}async initialize(e){await super.initialize(e),await this.Vc.initialize(this,e),await Lc(this.Vc.syncEngine),await ka(this.Vc.remoteStore),await this.persistence.Ii(()=>(this.gcScheduler&&!this.gcScheduler.started&&this.gcScheduler.start(),this.indexBackfillerScheduler&&!this.indexBackfillerScheduler.started&&this.indexBackfillerScheduler.start(),Promise.resolve()))}createLocalStore(e){return So(this.persistence,new To,e.initialUser,this.serializer)}createGarbageCollectionScheduler(e,t){const n=this.persistence.referenceDelegate.garbageCollector;return new Us(n,e.asyncQueue,t)}createIndexBackfillerScheduler(e,t){const n=new ye(t,this.persistence);return new me(e.asyncQueue,n)}createPersistence(e){const t=Io(e.databaseInfo.databaseId,e.databaseInfo.persistenceKey),n=void 0!==this.cacheSizeBytes?Ss.withCacheSize(this.cacheSizeBytes):Ss.DEFAULT;return new vo(this.synchronizeTabs,t,e.clientId,n,e.asyncQueue,ta(),na(),this.serializer,this.sharedClientState,!!this.forceOwnership)}createSharedClientState(e){return new $o}}class jc extends Vc{constructor(e,t){super(e,t,!1),this.Vc=e,this.cacheSizeBytes=t,this.synchronizeTabs=!0}async initialize(e){await super.initialize(e);const t=this.Vc.syncEngine;this.sharedClientState instanceof Ko&&(this.sharedClientState.syncEngine={jr:Ac.bind(null,t),zr:Rc.bind(null,t),Wr:xc.bind(null,t),$i:Oc.bind(null,t),Qr:Cc.bind(null,t)},await this.sharedClientState.start()),await this.persistence.Ii(async e=>{await async function(e,t){const n=I(e);if(Pc(n),Lc(n),!0===t&&!0!==n.vc){const e=n.sharedClientState.getAllActiveQueryTargets(),t=await Nc(n,e.toArray());n.vc=!0,await Ma(n.remoteStore,!0);for(const e of t)fa(n.remoteStore,e)}else if(!1===t&&!1!==n.vc){const e=[];let t=Promise.resolve();n._c.forEach((r,i)=>{n.sharedClientState.isLocalQueryTarget(i)?e.push(i):t=t.then(()=>(vc(n,i),Oo(n.localStore,i,!0))),pa(n.remoteStore,i)}),await t,await Nc(n,e),function(e){const t=I(e);t.yc.forEach((e,n)=>{pa(t.remoteStore,n)}),t.Ic.Ts(),t.yc=new Map,t.gc=new et(K.comparator)}(n),n.vc=!1,await Ma(n.remoteStore,!1)}}(this.Vc.syncEngine,e),this.gcScheduler&&(e&&!this.gcScheduler.started?this.gcScheduler.start():e||this.gcScheduler.stop()),this.indexBackfillerScheduler&&(e&&!this.indexBackfillerScheduler.started?this.indexBackfillerScheduler.start():e||this.indexBackfillerScheduler.stop())})}createSharedClientState(e){const t=ta();if(!Ko.D(t))throw new T(_.UNIMPLEMENTED,"IndexedDB persistence is only available on platforms that support LocalStorage.");const n=Io(e.databaseInfo.databaseId,e.databaseInfo.persistenceKey);return new Ko(t,e.asyncQueue,n,e.clientId,e.initialUser)}}class Uc{async initialize(e,t){this.localStore||(this.localStore=e.localStore,this.sharedClientState=e.sharedClientState,this.datastore=this.createDatastore(t),this.remoteStore=this.createRemoteStore(t),this.eventManager=this.createEventManager(t),this.syncEngine=this.createSyncEngine(t,!e.synchronizeTabs),this.sharedClientState.onlineStateHandler=e=>dc(this.syncEngine,e,1),this.remoteStore.remoteSyncer.handleCredentialChange=Ec.bind(null,this.syncEngine),await Ma(this.remoteStore,this.syncEngine.isPrimaryClient))}createEventManager(e){return new Ka}createDatastore(e){const t=ra(e.databaseInfo.databaseId),n=(r=e.databaseInfo,new ea(r));var r;return function(e,t,n,r){return new ca(e,t,n,r)}(e.authCredentials,e.appCheckCredentials,n,t)}createRemoteStore(e){return t=this.localStore,n=this.datastore,r=e.asyncQueue,i=e=>dc(this.syncEngine,e,0),s=Ho.D()?new Ho:new Wo,new la(t,n,r,i,s);var t,n,r,i,s}createSyncEngine(e,t){return function(e,t,n,r,i,s,o){const a=new ac(e,t,n,r,i,s);return o&&(a.vc=!0),a}(this.localStore,this.remoteStore,this.eventManager,this.sharedClientState,e.initialUser,e.maxConcurrentLimboResolutions,t)}terminate(){return async function(e){const t=I(e);p("RemoteStore","RemoteStore shutting down."),t.vu.add(5),await da(t),t.Pu.shutdown(),t.bu.set("Unknown")}(this.remoteStore)}} /** * @license * Copyright 2020 Google LLC @@ -3638,7 +3847,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Da{constructor(e,t,n){this._authCredentials=t,this._appCheckCredentials=n,this.type="firestore-lite",this._persistenceKey="(lite)",this._settings=new Ca({}),this._settingsFrozen=!1,e instanceof Ia?this._databaseId=e:(this._app=e,this._databaseId=function(e){if(!Object.prototype.hasOwnProperty.apply(e.options,["projectId"]))throw new T(_.INVALID_ARGUMENT,'"projectId" not provided in firebase.initializeApp.');return new Ia(e.options.projectId)}(e))}get app(){if(!this._app)throw new T(_.FAILED_PRECONDITION,"Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._app}get _initialized(){return this._settingsFrozen}get _terminated(){return void 0!==this._terminateTask}_setSettings(e){if(this._settingsFrozen)throw new T(_.FAILED_PRECONDITION,"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.");this._settings=new Ca(e),void 0!==e.credentials&&(this._authCredentials=function(e){if(!e)return new S;switch(e.type){case"gapi":const t=e.client;return w(!("object"!=typeof t||null===t||!t.auth||!t.auth.getAuthHeaderValueForFirstParty)),new C(t,e.sessionIndex||"0",e.iamToken||null);case"provider":return e.client;default:throw new T(_.INVALID_ARGUMENT,"makeAuthCredentialsProvider failed due to invalid credential type")}}(e.credentials))}_getSettings(){return this._settings}_freezeSettings(){return this._settingsFrozen=!0,this._settings}_delete(){return this._terminateTask||(this._terminateTask=this._terminate()),this._terminateTask}toJSON(){return{app:this._app,databaseId:this._databaseId,settings:this._settings}}_terminate(){return function(e){const t=_a.get(e);t&&(p("ComponentProvider","Removing Datastore"),_a.delete(e),t.terminate())}(this),Promise.resolve()}}function Ra(e,t,n,r={}){var i;const s=(e=Na(e,Da))._getSettings();if("firestore.googleapis.com"!==s.host&&s.host!==t&&g("Host has been set in both settings() and useEmulator(), emulator host will be used"),e._setSettings(Object.assign(Object.assign({},s),{host:`${t}:${n}`,ssl:!1})),r.mockUserToken){let t,n;if("string"==typeof r.mockUserToken)t=r.mockUserToken,n=u.MOCK_USER;else{t=Object(o.f)(r.mockUserToken,null===(i=e._app)||void 0===i?void 0:i.options.projectId);const s=r.mockUserToken.sub||r.mockUserToken.user_id;if(!s)throw new T(_.INVALID_ARGUMENT,"mockUserToken must contain 'sub' or 'user_id' field!");n=new u(s)}e._authCredentials=new A(new k(t,n))}} + */function qc(e,t=10240){let n=0;return{async read(){if(n=0)throw new T(_.INVALID_ARGUMENT,`Invalid collection ID '${t}' passed to function collectionGroup(). Collection IDs must not contain '/'.`);return new La(e,null,function(e){return new Ke(G.emptyPath(),e)}(t))}function ja(e,t,...n){if(e=Object(o.k)(e),1===arguments.length&&(t=M.A()),Ta("doc","path",t),e instanceof Da){const r=G.fromString(t,...n);return ka(r),new Pa(e,null,new ae(r))}{if(!(e instanceof Pa||e instanceof xa))throw new T(_.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=e._path.child(G.fromString(t,...n));return ka(r),new Pa(e.firestore,e instanceof xa?e.converter:null,new ae(r))}}function Ua(e,t){return e=Object(o.k)(e),t=Object(o.k)(t),(e instanceof Pa||e instanceof xa)&&(t instanceof Pa||t instanceof xa)&&e.firestore===t.firestore&&e.path===t.path&&e.converter===t.converter}function Va(e,t){return e=Object(o.k)(e),t=Object(o.k)(t),e instanceof La&&t instanceof La&&e.firestore===t.firestore&&tt(e._query,t._query)&&e.converter===t.converter + */ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class Bc{constructor(e){this.observer=e,this.muted=!1}next(e){this.observer.next&&this.Sc(this.observer.next,e)}error(e){this.observer.error?this.Sc(this.observer.error,e):g("Uncaught Error in snapshot listener:",e.toString())}Dc(){this.muted=!0}Sc(e,t){this.muted||setTimeout(()=>{this.muted||e(t)},0)}} /** * @license * Copyright 2020 Google LLC @@ -3670,7 +3895,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */}class qa{constructor(){this.ma=Promise.resolve(),this.ga=[],this.ya=!1,this.pa=[],this.Ta=null,this.Ea=!1,this.Ia=!1,this.Aa=[],this.ur=new bs(this,"async_queue_retry"),this.Ra=()=>{const e=vs();e&&p("AsyncQueue","Visibility state changed to "+e.visibilityState),this.ur.er()};const e=vs();e&&"function"==typeof e.addEventListener&&e.addEventListener("visibilitychange",this.Ra)}get isShuttingDown(){return this.ya}enqueueAndForget(e){this.enqueue(e)}enqueueAndForgetEvenWhileRestricted(e){this.Pa(),this.ba(e)}enterRestrictedMode(e){if(!this.ya){this.ya=!0,this.Ia=e||!1;const t=vs();t&&"function"==typeof t.removeEventListener&&t.removeEventListener("visibilitychange",this.Ra)}}enqueue(e){if(this.Pa(),this.ya)return new Promise(()=>{});const t=new E;return this.ba(()=>this.ya&&this.Ia?Promise.resolve():(e().then(t.resolve,t.reject),t.promise)).then(()=>t.promise)}enqueueRetryable(e){this.enqueueAndForget(()=>(this.ga.push(e),this.va()))}async va(){if(0!==this.ga.length){try{await this.ga[0](),this.ga.shift(),this.ur.reset()}catch(e){if(!Ir(e))throw e;p("AsyncQueue","Operation failed with retryable error: "+e)}this.ga.length>0&&this.ur.Zi(()=>this.va())}}ba(e){const t=this.ma.then(()=>(this.Ea=!0,e().catch(e=>{this.Ta=e,this.Ea=!1;throw m("INTERNAL UNHANDLED ERROR: ",function(e){let t=e.message||"";return e.stack&&(t=e.stack.includes(e.message)?e.stack:e.message+"\n"+e.stack),t} + */class zc{constructor(e,t){this.Cc=e,this.serializer=t,this.metadata=new E,this.buffer=new Uint8Array,this.xc=new TextDecoder("utf-8"),this.Nc().then(e=>{e&&e.Qu()?this.metadata.resolve(e.Gu.metadata):this.metadata.reject(new Error("The first element of the bundle is not a metadata, it is\n "+JSON.stringify(null==e?void 0:e.Gu)))},e=>this.metadata.reject(e))}close(){return this.Cc.cancel()}async getMetadata(){return this.metadata.promise}async bc(){return await this.getMetadata(),this.Nc()}async Nc(){const e=await this.kc();if(null===e)return null;const t=this.xc.decode(e),n=Number(t);isNaN(n)&&this.Mc(`length string (${t}) is not valid number`);const r=await this.$c(n);return new Xa(JSON.parse(r),e.length+n)}Oc(){return this.buffer.findIndex(e=>e==="{".charCodeAt(0))}async kc(){for(;this.Oc()<0&&!await this.Fc(););if(0===this.buffer.length)return null;const e=this.Oc();e<0&&this.Mc("Reached the end of bundle when a length string is expected.");const t=this.buffer.slice(0,e);return this.buffer=this.buffer.slice(e),t}async $c(e){for(;this.buffer.length(this.Ea=!1,e))));return this.ma=t,t}enqueueAfterDelay(e,t,n){this.Pa(),this.Aa.indexOf(e)>-1&&(t=0);const r=eo.createAndSchedule(this,e,t,n,e=>this.Va(e));return this.pa.push(r),r}Pa(){this.Ta&&v()}verifyOperationInProgress(){}async Sa(){let e;do{e=this.ma,await e}while(e!==this.ma)}Da(e){for(const t of this.pa)if(t.timerId===e)return!0;return!1}Ca(e){return this.Sa().then(()=>{this.pa.sort((e,t)=>e.targetTimeMs-t.targetTimeMs);for(const t of this.pa)if(t.skipDelay(),"all"!==e&&t.timerId===e)break;return this.Sa()})}Na(e){this.Aa.push(e)}Va(e){const t=this.pa.indexOf(e);this.pa.splice(t,1)}}function Ba(e){return function(e,t){if("object"!=typeof e||null===e)return!1;const n=e;for(const e of["next","error","complete"])if(e in n&&"function"==typeof n[e])return!0;return!1} + */class Gc{constructor(e){this.datastore=e,this.readVersions=new Map,this.mutations=[],this.committed=!1,this.lastWriteError=null,this.writtenDocs=new Set}async lookup(e){if(this.ensureCommitNotCalled(),this.mutations.length>0)throw new T(_.INVALID_ARGUMENT,"Firestore transactions require all reads to be executed before all writes.");const t=await async function(e,t){const n=I(e),r=yi(n.serializer)+"/documents",i={documents:t.map(e=>fi(n.serializer,e))},s=await n.vo("BatchGetDocuments",r,i,t.length),o=new Map;s.forEach(e=>{const t=function(e,t){return"found"in t?function(e,t){w(!!t.found),t.found.name,t.found.updateTime;const n=pi(e,t.found.name),r=li(t.found.updateTime),i=t.found.createTime?li(t.found.createTime):U.min(),s=new jt({mapValue:{fields:t.found.fields}});return qt.newFoundDocument(n,r,i,s)}(e,t):"missing"in t?function(e,t){w(!!t.missing),w(!!t.readTime);const n=pi(e,t.missing),r=li(t.readTime);return qt.newNoDocument(n,r)}(e,t):v()}(n.serializer,e);o.set(t.key.toString(),t)});const a=[];return t.forEach(e=>{const t=o.get(e.toString());w(!!t),a.push(t)}),a}(this.datastore,e);return t.forEach(e=>this.recordVersion(e)),t}set(e,t){this.write(t.toMutation(e,this.precondition(e))),this.writtenDocs.add(e.toString())}update(e,t){try{this.write(t.toMutation(e,this.preconditionForUpdate(e)))}catch(e){this.lastWriteError=e}this.writtenDocs.add(e.toString())}delete(e){this.write(new Ar(e,this.precondition(e))),this.writtenDocs.add(e.toString())}async commit(){if(this.ensureCommitNotCalled(),this.lastWriteError)throw this.lastWriteError;const e=this.readVersions;this.mutations.forEach(t=>{e.delete(t.key.toString())}),e.forEach((e,t)=>{const n=K.fromPath(t);this.mutations.push(new Nr(n,this.precondition(n)))}),await async function(e,t){const n=I(e),r=yi(n.serializer)+"/documents",i={writes:t.map(e=>Ii(n.serializer,e))};await n.Io("Commit",r,i)}(this.datastore,this.mutations),this.committed=!0}recordVersion(e){let t;if(e.isFoundDocument())t=e.version;else{if(!e.isNoDocument())throw v();t=U.min()}const n=this.readVersions.get(e.key.toString());if(n){if(!t.isEqual(n))throw new T(_.ABORTED,"Document version changed between two reads.")}else this.readVersions.set(e.key.toString(),t)}precondition(e){const t=this.readVersions.get(e.toString());return!this.writtenDocs.has(e.toString())&&t?t.isEqual(U.min())?gr.exists(!1):gr.updateTime(t):gr.none()}preconditionForUpdate(e){const t=this.readVersions.get(e.toString());if(!this.writtenDocs.has(e.toString())&&t){if(t.isEqual(U.min()))throw new T(_.INVALID_ARGUMENT,"Can't update a document that doesn't exist.");return gr.updateTime(t)}return gr.exists(!0)}write(e){this.ensureCommitNotCalled(),this.mutations.push(e)}ensureCommitNotCalled(){}} +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class Kc{constructor(e,t,n,r,i){this.asyncQueue=e,this.datastore=t,this.options=n,this.updateFunction=r,this.deferred=i,this.Bc=n.maxAttempts,this.qo=new ia(this.asyncQueue,"transaction_retry")}run(){this.Bc-=1,this.Lc()}Lc(){this.qo.No(async()=>{const e=new Gc(this.datastore),t=this.qc(e);t&&t.then(t=>{this.asyncQueue.enqueueAndForget(()=>e.commit().then(()=>{this.deferred.resolve(t)}).catch(e=>{this.Uc(e)}))}).catch(e=>{this.Uc(e)})})}qc(e){try{const t=this.updateFunction(e);return!we(t)&&t.catch&&t.then?t:(this.deferred.reject(Error("Transaction callback must return a Promise")),null)}catch(e){return this.deferred.reject(e),null}}Uc(e){this.Bc>0&&this.Kc(e)?(this.Bc-=1,this.asyncQueue.enqueueAndForget(()=>(this.Lc(),Promise.resolve()))):this.deferred.reject(e)}Kc(e){if("FirebaseError"===e.name){const t=e.code;return"aborted"===t||"failed-precondition"===t||"already-exists"===t||!Fr(t)}return!1}} +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class $c{constructor(e,t,n,r){this.authCredentials=e,this.appCheckCredentials=t,this.asyncQueue=n,this.databaseInfo=r,this.user=u.UNAUTHENTICATED,this.clientId=L.A(),this.authCredentialListener=()=>Promise.resolve(),this.appCheckCredentialListener=()=>Promise.resolve(),this.authCredentials.start(n,async e=>{p("FirestoreClient","Received user=",e.uid),await this.authCredentialListener(e),this.user=e}),this.appCheckCredentials.start(n,e=>(p("FirestoreClient","Received new app check token=",e),this.appCheckCredentialListener(e,this.user)))}async getConfiguration(){return{asyncQueue:this.asyncQueue,databaseInfo:this.databaseInfo,clientId:this.clientId,authCredentials:this.authCredentials,appCheckCredentials:this.appCheckCredentials,initialUser:this.user,maxConcurrentLimboResolutions:100}}setCredentialChangeListener(e){this.authCredentialListener=e}setAppCheckTokenChangeListener(e){this.appCheckCredentialListener=e}verifyNotTerminated(){if(this.asyncQueue.isShuttingDown)throw new T(_.FAILED_PRECONDITION,"The client has already been terminated.")}terminate(){this.asyncQueue.enterRestrictedMode();const e=new E;return this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async()=>{try{this._onlineComponents&&await this._onlineComponents.terminate(),this._offlineComponents&&await this._offlineComponents.terminate(),this.authCredentials.shutdown(),this.appCheckCredentials.shutdown(),e.resolve()}catch(t){const n=Ua(t,"Failed to shutdown persistence");e.reject(n)}}),e.promise}}async function Wc(e,t){e.asyncQueue.verifyOperationInProgress(),p("FirestoreClient","Initializing OfflineComponentProvider");const n=await e.getConfiguration();await t.initialize(n);let r=n.initialUser;e.setCredentialChangeListener(async e=>{r.isEqual(e)||(await ko(t.localStore,e),r=e)}),t.persistence.setDatabaseDeletedListener(()=>e.terminate()),e._offlineComponents=t}async function Hc(e,t){e.asyncQueue.verifyOperationInProgress();const n=await Yc(e);p("FirestoreClient","Initializing OnlineComponentProvider");const r=await e.getConfiguration();await t.initialize(n,r),e.setCredentialChangeListener(e=>La(t.remoteStore,e)),e.setAppCheckTokenChangeListener((e,n)=>La(t.remoteStore,n)),e._onlineComponents=t}function Qc(e){return"FirebaseError"===e.name?e.code===_.FAILED_PRECONDITION||e.code===_.UNIMPLEMENTED:!("undefined"!=typeof DOMException&&e instanceof DOMException)||22===e.code||20===e.code||11===e.code}async function Yc(e){if(!e._offlineComponents)if(e._uninitializedComponentsProvider){p("FirestoreClient","Using user provided OfflineComponentProvider");try{await Wc(e,e._uninitializedComponentsProvider._offline)}catch(t){const n=t;if(!Qc(n))throw n;m("Error using user provided cache. Falling back to memory cache: "+n),await Wc(e,new Mc)}}else p("FirestoreClient","Using default OfflineComponentProvider"),await Wc(e,new Mc);return e._offlineComponents}async function Jc(e){return e._onlineComponents||(e._uninitializedComponentsProvider?(p("FirestoreClient","Using user provided OnlineComponentProvider"),await Hc(e,e._uninitializedComponentsProvider._online)):(p("FirestoreClient","Using default OnlineComponentProvider"),await Hc(e,new Uc))),e._onlineComponents}function Xc(e){return Yc(e).then(e=>e.persistence)}function Zc(e){return Yc(e).then(e=>e.localStore)}function eu(e){return Jc(e).then(e=>e.remoteStore)}function tu(e){return Jc(e).then(e=>e.syncEngine)}function nu(e){return Jc(e).then(e=>e.datastore)}async function ru(e){const t=await Jc(e),n=t.eventManager;return n.onListen=cc.bind(null,t.syncEngine),n.onUnlisten=lc.bind(null,t.syncEngine),n}function iu(e,t,n={}){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>function(e,t,n,r,i){const s=new Bc({next:s=>{t.enqueueAndForget(()=>Wa(e,o));const a=s.docs.has(n);!a&&s.fromCache?i.reject(new T(_.UNAVAILABLE,"Failed to get document because the client is offline.")):a&&s.fromCache&&r&&"server"===r.source?i.reject(new T(_.UNAVAILABLE,'Failed to get document from server. (However, this document does exist in the local cache. Run again without setting source to "server" to retrieve the cached document.)')):i.resolve(s)},error:e=>i.reject(e)}),o=new Ja(_n(n.path),s,{includeMetadataChanges:!0,Ku:!0});return $a(e,o)}(await ru(e),e.asyncQueue,t,n,r)),r.promise}function su(e,t,n={}){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>function(e,t,n,r,i){const s=new Bc({next:n=>{t.enqueueAndForget(()=>Wa(e,o)),n.fromCache&&"server"===r.source?i.reject(new T(_.UNAVAILABLE,'Failed to get documents from server. (However, these documents may exist in the local cache. Run again without setting source to "server" to retrieve the cached documents.)')):i.resolve(n)},error:e=>i.reject(e)}),o=new Ja(n,s,{includeMetadataChanges:!0,Ku:!0});return $a(e,o)}(await ru(e),e.asyncQueue,t,n,r)),r.promise}function ou(e,t,n,r){const i=function(e,t){let n;return n="string"==typeof e?qr().encode(e):e,function(e,t){return new zc(e,t)}(function(e,t){if(e instanceof Uint8Array)return qc(e,t);if(e instanceof ArrayBuffer)return qc(new Uint8Array(e),t);if(e instanceof ReadableStream)return e.getReader();throw new Error("Source of `toByteStreamReader` has to be a ArrayBuffer or ReadableStream")}(n),t)}(n,ra(t));e.asyncQueue.enqueueAndForget(async()=>{!function(e,t,n){const r=I(e);(async function(e,t,n){try{const r=await t.getMetadata();if(await function(e,t){const n=I(e),r=li(t.createTime);return n.persistence.runTransaction("hasNewerBundle","readonly",e=>n.qs.getBundleMetadata(e,t.id)).then(e=>!!e&&e.createTime.compareTo(r)>=0)}(e.localStore,r))return await t.close(),n._completeWith(function(e){return{taskState:"Success",documentsLoaded:e.totalDocuments,bytesLoaded:e.totalBytes,totalDocuments:e.totalDocuments,totalBytes:e.totalBytes}}(r)),Promise.resolve(new Set);n._updateProgress(tc(r));const i=new ec(r,e.localStore,t.serializer);let s=await t.bc();for(;s;){const e=await i.zu(s);e&&n._updateProgress(e),s=await t.bc()}const o=await i.complete();return await Tc(e,o.Ju,void 0),await function(e,t){const n=I(e);return n.persistence.runTransaction("Save bundle","readwrite",e=>n.qs.saveBundleMetadata(e,t))}(e.localStore,r),n._completeWith(o.progress),Promise.resolve(o.Hu)}catch(e){return m("SyncEngine","Loading bundle failed with "+e),n._failWith(e),Promise.resolve(new Set)}} /** * @license * Copyright 2020 Google LLC @@ -3702,7 +3959,56 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e)}class za{constructor(){this._progressObserver={},this._taskCompletionResolver=new E,this._lastProgress={taskState:"Running",totalBytes:0,totalDocuments:0,bytesLoaded:0,documentsLoaded:0}}onProgress(e,t,n){this._progressObserver={next:e,error:t,complete:n}}catch(e){return this._taskCompletionResolver.promise.catch(e)}then(e,t){return this._taskCompletionResolver.promise.then(e,t)}_completeWith(e){this._updateProgress(e),this._progressObserver.complete&&this._progressObserver.complete(),this._taskCompletionResolver.resolve(e)}_failWith(e){this._lastProgress.taskState="Error",this._progressObserver.next&&this._progressObserver.next(this._lastProgress),this._progressObserver.error&&this._progressObserver.error(e),this._taskCompletionResolver.reject(e)}_updateProgress(e){this._lastProgress=e,this._progressObserver.next&&this._progressObserver.next(e)}} + */)(r,t,n).then(e=>{r.sharedClientState.notifyBundleLoaded(e)})}(await tu(e),i,r)})} +/** + * @license + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function au(e){const t={};return void 0!==e.timeoutSeconds&&(t.timeoutSeconds=e.timeoutSeconds),t +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */}const cu=new Map; +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function uu(e,t,n){if(!n)throw new T(_.INVALID_ARGUMENT,`Function ${e}() cannot be called with an empty ${t}.`)}function lu(e,t,n,r){if(!0===t&&!0===r)throw new T(_.INVALID_ARGUMENT,`${e} and ${n} cannot be used together.`)}function hu(e){if(!K.isDocumentKey(e))throw new T(_.INVALID_ARGUMENT,`Invalid document reference. Document references must have an even number of segments, but ${e} has ${e.length}.`)}function du(e){if(K.isDocumentKey(e))throw new T(_.INVALID_ARGUMENT,`Invalid collection reference. Collection references must have an odd number of segments, but ${e} has ${e.length}.`)}function fu(e){if(void 0===e)return"undefined";if(null===e)return"null";if("string"==typeof e)return e.length>20&&(e=e.substring(0,20)+"..."),JSON.stringify(e);if("number"==typeof e||"boolean"==typeof e)return""+e;if("object"==typeof e){if(e instanceof Array)return"an array";{const t=function(e){return e.constructor?e.constructor.name:null}(e);return t?`a custom ${t} object`:"an object"}}return"function"==typeof e?"a function":v()}function pu(e,t){if("_delegate"in e&&(e=e._delegate),!(e instanceof t)){if(t.name===e.constructor.name)throw new T(_.INVALID_ARGUMENT,"Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?");{const n=fu(e);throw new T(_.INVALID_ARGUMENT,`Expected type '${t.name}', but it was: ${n}`)}}return e}function gu(e,t){if(t<=0)throw new T(_.INVALID_ARGUMENT,`Function ${e}() requires a positive number, but it was: ${t}.`)} /** * @license * Copyright 2020 Google LLC @@ -3718,7 +4024,103 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const Ka=-1;class Wa extends Da{constructor(e,t,n){super(e,t,n),this.type="firestore",this._queue=new qa,this._persistenceKey="name"in e?e.name:"[DEFAULT]"}_terminate(){return this._firestoreClient||Qa(this),this._firestoreClient.terminate()}}function Ga(e,t){const n=Object(r._getProvider)(e,"firestore");if(n.isInitialized()){const e=n.getImmediate(),r=n.getOptions();if(Object(o.h)(r,t))return e;throw new T(_.FAILED_PRECONDITION,"initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance.")}if(void 0!==t.cacheSizeBytes&&-1!==t.cacheSizeBytes&&t.cacheSizeBytes<1048576)throw new T(_.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");return n.initialize({options:t})}function Ha(e=Object(r.getApp)()){return Object(r._getProvider)(e,"firestore").getImmediate()}function $a(e){return e._firestoreClient||Qa(e),e._firestoreClient.verifyNotTerminated(),e._firestoreClient}function Qa(e){var t;const n=e._freezeSettings(),r=function(e,t,n,r){return new ba(e,t,n,r.host,r.ssl,r.experimentalForceLongPolling,r.experimentalAutoDetectLongPolling,r.useFetchStreams)}(e._databaseId,(null===(t=e._app)||void 0===t?void 0:t.options.appId)||"",e._persistenceKey,n);e._firestoreClient=new aa(e._authCredentials,e._appCheckCredentials,e._queue,r)}function Ja(e,t){oc(e=Na(e,Wa));const n=$a(e),r=e._freezeSettings(),i=new ta;return Xa(n,i,new Zo(i,r.cacheSizeBytes,null==t?void 0:t.forceOwnership))}function Ya(e){oc(e=Na(e,Wa));const t=$a(e),n=e._freezeSettings(),r=new ta;return Xa(t,r,new ea(r,n.cacheSizeBytes))}function Xa(e,t,n){const r=new E;return e.asyncQueue.enqueue(async()=>{try{await ca(e,n),await ua(e,t),r.resolve()}catch(e){if(!function(e){return"FirebaseError"===e.name?e.code===_.FAILED_PRECONDITION||e.code===_.UNIMPLEMENTED:!("undefined"!=typeof DOMException&&e instanceof DOMException)||(22===e.code||20===e.code||11===e.code)}(e))throw e;console.warn("Error enabling offline persistence. Falling back to persistence disabled: "+e),r.reject(e)}}).then(()=>r.promise)}function Za(e){if(e._initialized&&!e._terminated)throw new T(_.FAILED_PRECONDITION,"Persistence can only be cleared before a Firestore instance is initialized or after it is terminated.");const t=new E;return e._queue.enqueueAndForgetEvenWhileRestricted(async()=>{try{await async function(e){if(!vr.bt())return Promise.resolve();const t=e+"main";await vr.delete(t)}(Oi(e._databaseId,e._persistenceKey)),t.resolve()}catch(e){t.reject(e)}}),t.promise}function ec(e){return function(e){const t=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t){const n=I(e);xs(n.remoteStore)||p("SyncEngine","The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled.");try{const e=await function(e){const t=I(e);return t.persistence.runTransaction("Get highest unacknowledged batch id","readonly",e=>t.An.getHighestUnacknowledgedBatchId(e))}(n.localStore);if(-1===e)return void t.resolve();const r=n.jo.get(e)||[];r.push(t),n.jo.set(e,r)}catch(e){const n=to(e,"Initialization of waitForPendingWrites() operation failed");t.reject(n)}}(await ma(e),t)),t.promise}($a(e=Na(e,Wa)))}function tc(e){return function(e){return e.asyncQueue.enqueue(async()=>{const t=await da(e),n=await pa(e);return t.setNetworkEnabled(!0),function(e){const t=I(e);return t.Gr.delete(0),As(t)}(n)})}($a(e=Na(e,Wa)))}function nc(e){return function(e){return e.asyncQueue.enqueue(async()=>{const t=await da(e),n=await pa(e);return t.setNetworkEnabled(!1),async function(e){const t=I(e);t.Gr.add(0),await Ns(t),t.Jr.set("Offline")}(n)})}($a(e=Na(e,Wa)))}function rc(e){return Object(r._removeServiceInstance)(e.app,"firestore"),e._delete()}function ic(e,t){const n=$a(e=Na(e,Wa)),r=new za;return wa(n,e._databaseId,t,r),r}function sc(e,t){return function(e,t){return e.asyncQueue.enqueue(async()=>function(e,t){const n=I(e);return n.persistence.runTransaction("Get named query","readonly",e=>n.Ye.getNamedQuery(e,t))}(await fa(e),t))}($a(e=Na(e,Wa)),t).then(t=>t?new La(e,null,t.query):null)}function oc(e){if(e._initialized||e._terminated)throw new T(_.FAILED_PRECONDITION,"Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object.")} + */class mu{constructor(e){var t,n;if(void 0===e.host){if(void 0!==e.ssl)throw new T(_.INVALID_ARGUMENT,"Can't provide ssl option if host option is not set");this.host="firestore.googleapis.com",this.ssl=!0}else this.host=e.host,this.ssl=null===(t=e.ssl)||void 0===t||t;if(this.credentials=e.credentials,this.ignoreUndefinedProperties=!!e.ignoreUndefinedProperties,this.cache=e.localCache,void 0===e.cacheSizeBytes)this.cacheSizeBytes=41943040;else{if(-1!==e.cacheSizeBytes&&e.cacheSizeBytes<1048576)throw new T(_.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");this.cacheSizeBytes=e.cacheSizeBytes}lu("experimentalForceLongPolling",e.experimentalForceLongPolling,"experimentalAutoDetectLongPolling",e.experimentalAutoDetectLongPolling),this.experimentalForceLongPolling=!!e.experimentalForceLongPolling,this.experimentalForceLongPolling?this.experimentalAutoDetectLongPolling=!1:void 0===e.experimentalAutoDetectLongPolling?this.experimentalAutoDetectLongPolling=!0:this.experimentalAutoDetectLongPolling=!!e.experimentalAutoDetectLongPolling,this.experimentalLongPollingOptions=au(null!==(n=e.experimentalLongPollingOptions)&&void 0!==n?n:{}),function(e){if(void 0!==e.timeoutSeconds){if(isNaN(e.timeoutSeconds))throw new T(_.INVALID_ARGUMENT,`invalid long polling timeout: ${e.timeoutSeconds} (must not be NaN)`);if(e.timeoutSeconds<5)throw new T(_.INVALID_ARGUMENT,`invalid long polling timeout: ${e.timeoutSeconds} (minimum allowed value is 5)`);if(e.timeoutSeconds>30)throw new T(_.INVALID_ARGUMENT,`invalid long polling timeout: ${e.timeoutSeconds} (maximum allowed value is 30)`)}} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */(this.experimentalLongPollingOptions),this.useFetchStreams=!!e.useFetchStreams}isEqual(e){return this.host===e.host&&this.ssl===e.ssl&&this.credentials===e.credentials&&this.cacheSizeBytes===e.cacheSizeBytes&&this.experimentalForceLongPolling===e.experimentalForceLongPolling&&this.experimentalAutoDetectLongPolling===e.experimentalAutoDetectLongPolling&&(t=this.experimentalLongPollingOptions,n=e.experimentalLongPollingOptions,t.timeoutSeconds===n.timeoutSeconds)&&this.ignoreUndefinedProperties===e.ignoreUndefinedProperties&&this.useFetchStreams===e.useFetchStreams;var t,n}}class yu{constructor(e,t,n,r){this._authCredentials=e,this._appCheckCredentials=t,this._databaseId=n,this._app=r,this.type="firestore-lite",this._persistenceKey="(lite)",this._settings=new mu({}),this._settingsFrozen=!1}get app(){if(!this._app)throw new T(_.FAILED_PRECONDITION,"Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._app}get _initialized(){return this._settingsFrozen}get _terminated(){return void 0!==this._terminateTask}_setSettings(e){if(this._settingsFrozen)throw new T(_.FAILED_PRECONDITION,"Firestore has already been started and its settings can no longer be changed. You can only modify settings before calling any other methods on a Firestore object.");this._settings=new mu(e),void 0!==e.credentials&&(this._authCredentials=function(e){if(!e)return new k;switch(e.type){case"firstParty":return new D(e.sessionIndex||"0",e.iamToken||null,e.authTokenFactory||null);case"provider":return e.client;default:throw new T(_.INVALID_ARGUMENT,"makeAuthCredentialsProvider failed due to invalid credential type")}}(e.credentials))}_getSettings(){return this._settings}_freezeSettings(){return this._settingsFrozen=!0,this._settings}_delete(){return this._terminateTask||(this._terminateTask=this._terminate()),this._terminateTask}toJSON(){return{app:this._app,databaseId:this._databaseId,settings:this._settings}}_terminate(){return function(e){const t=cu.get(e);t&&(p("ComponentProvider","Removing Datastore"),cu.delete(e),t.terminate())}(this),Promise.resolve()}}function vu(e,t,n,r={}){var i;const s=(e=pu(e,yu))._getSettings(),a=`${t}:${n}`;if("firestore.googleapis.com"!==s.host&&s.host!==a&&m("Host has been set in both settings() and connectFirestoreEmulator(), emulator host will be used."),e._setSettings(Object.assign(Object.assign({},s),{host:a,ssl:!1})),r.mockUserToken){let t,n;if("string"==typeof r.mockUserToken)t=r.mockUserToken,n=u.MOCK_USER;else{t=Object(o.g)(r.mockUserToken,null===(i=e._app)||void 0===i?void 0:i.options.projectId);const s=r.mockUserToken.sub||r.mockUserToken.user_id;if(!s)throw new T(_.INVALID_ARGUMENT,"mockUserToken must contain 'sub' or 'user_id' field!");n=new u(s)}e._authCredentials=new C(new S(t,n))}} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class wu{constructor(e,t,n){this.converter=t,this._key=n,this.type="document",this.firestore=e}get _path(){return this._key.path}get id(){return this._key.path.lastSegment()}get path(){return this._key.path.canonicalString()}get parent(){return new Iu(this.firestore,this.converter,this._key.path.popLast())}withConverter(e){return new wu(this.firestore,e,this._key)}}class bu{constructor(e,t,n){this.converter=t,this._query=n,this.type="query",this.firestore=e}withConverter(e){return new bu(this.firestore,e,this._query)}}class Iu extends bu{constructor(e,t,n){super(e,t,_n(n)),this._path=n,this.type="collection"}get id(){return this._query.path.lastSegment()}get path(){return this._query.path.canonicalString()}get parent(){const e=this._path.popLast();return e.isEmpty()?null:new wu(this.firestore,null,new K(e))}withConverter(e){return new Iu(this.firestore,e,this._path)}}function _u(e,t,...n){if(e=Object(o.p)(e),uu("collection","path",t),e instanceof yu){const r=B.fromString(t,...n);return du(r),new Iu(e,null,r)}{if(!(e instanceof wu||e instanceof Iu))throw new T(_.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=e._path.child(B.fromString(t,...n));return du(r),new Iu(e.firestore,null,r)}}function Tu(e,t){if(e=pu(e,yu),uu("collectionGroup","collection id",t),t.indexOf("/")>=0)throw new T(_.INVALID_ARGUMENT,`Invalid collection ID '${t}' passed to function collectionGroup(). Collection IDs must not contain '/'.`);return new bu(e,null,function(e){return new bn(B.emptyPath(),e)}(t))}function Eu(e,t,...n){if(e=Object(o.p)(e),1===arguments.length&&(t=L.A()),uu("doc","path",t),e instanceof yu){const r=B.fromString(t,...n);return hu(r),new wu(e,null,new K(r))}{if(!(e instanceof wu||e instanceof Iu))throw new T(_.INVALID_ARGUMENT,"Expected first argument to collection() to be a CollectionReference, a DocumentReference or FirebaseFirestore");const r=e._path.child(B.fromString(t,...n));return hu(r),new wu(e.firestore,e instanceof Iu?e.converter:null,new K(r))}}function Su(e,t){return e=Object(o.p)(e),t=Object(o.p)(t),(e instanceof wu||e instanceof Iu)&&(t instanceof wu||t instanceof Iu)&&e.firestore===t.firestore&&e.path===t.path&&e.converter===t.converter}function ku(e,t){return e=Object(o.p)(e),t=Object(o.p)(t),e instanceof bu&&t instanceof bu&&e.firestore===t.firestore&&On(e._query,t._query)&&e.converter===t.converter +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */}class Cu{constructor(){this.Gc=Promise.resolve(),this.Qc=[],this.jc=!1,this.zc=[],this.Wc=null,this.Hc=!1,this.Jc=!1,this.Yc=[],this.qo=new ia(this,"async_queue_retry"),this.Xc=()=>{const e=na();e&&p("AsyncQueue","Visibility state changed to "+e.visibilityState),this.qo.Mo()};const e=na();e&&"function"==typeof e.addEventListener&&e.addEventListener("visibilitychange",this.Xc)}get isShuttingDown(){return this.jc}enqueueAndForget(e){this.enqueue(e)}enqueueAndForgetEvenWhileRestricted(e){this.Zc(),this.ta(e)}enterRestrictedMode(e){if(!this.jc){this.jc=!0,this.Jc=e||!1;const t=na();t&&"function"==typeof t.removeEventListener&&t.removeEventListener("visibilitychange",this.Xc)}}enqueue(e){if(this.Zc(),this.jc)return new Promise(()=>{});const t=new E;return this.ta(()=>this.jc&&this.Jc?Promise.resolve():(e().then(t.resolve,t.reject),t.promise)).then(()=>t.promise)}enqueueRetryable(e){this.enqueueAndForget(()=>(this.Qc.push(e),this.ea()))}async ea(){if(0!==this.Qc.length){try{await this.Qc[0](),this.Qc.shift(),this.qo.reset()}catch(e){if(!he(e))throw e;p("AsyncQueue","Operation failed with retryable error: "+e)}this.Qc.length>0&&this.qo.No(()=>this.ea())}}ta(e){const t=this.Gc.then(()=>(this.Hc=!0,e().catch(e=>{this.Wc=e,this.Hc=!1;throw g("INTERNAL UNHANDLED ERROR: ",function(e){let t=e.message||"";return e.stack&&(t=e.stack.includes(e.message)?e.stack:e.message+"\n"+e.stack),t} +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */(e)),e}).then(e=>(this.Hc=!1,e))));return this.Gc=t,t}enqueueAfterDelay(e,t,n){this.Zc(),this.Yc.indexOf(e)>-1&&(t=0);const r=ja.createAndSchedule(this,e,t,n,e=>this.na(e));return this.zc.push(r),r}Zc(){this.Wc&&v()}verifyOperationInProgress(){}async sa(){let e;do{e=this.Gc,await e}while(e!==this.Gc)}ia(e){for(const t of this.zc)if(t.timerId===e)return!0;return!1}ra(e){return this.sa().then(()=>{this.zc.sort((e,t)=>e.targetTimeMs-t.targetTimeMs);for(const t of this.zc)if(t.skipDelay(),"all"!==e&&t.timerId===e)break;return this.sa()})}oa(e){this.Yc.push(e)}na(e){const t=this.zc.indexOf(e);this.zc.splice(t,1)}}function Au(e){return function(e,t){if("object"!=typeof e||null===e)return!1;const n=e;for(const e of["next","error","complete"])if(e in n&&"function"==typeof n[e])return!0;return!1} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */(e)}class Nu{constructor(){this._progressObserver={},this._taskCompletionResolver=new E,this._lastProgress={taskState:"Running",totalBytes:0,totalDocuments:0,bytesLoaded:0,documentsLoaded:0}}onProgress(e,t,n){this._progressObserver={next:e,error:t,complete:n}}catch(e){return this._taskCompletionResolver.promise.catch(e)}then(e,t){return this._taskCompletionResolver.promise.then(e,t)}_completeWith(e){this._updateProgress(e),this._progressObserver.complete&&this._progressObserver.complete(),this._taskCompletionResolver.resolve(e)}_failWith(e){this._lastProgress.taskState="Error",this._progressObserver.next&&this._progressObserver.next(this._lastProgress),this._progressObserver.error&&this._progressObserver.error(e),this._taskCompletionResolver.reject(e)}_updateProgress(e){this._lastProgress=e,this._progressObserver.next&&this._progressObserver.next(e)}} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */const Du=-1;class Ou extends yu{constructor(e,t,n,r){super(e,t,n,r),this.type="firestore",this._queue=new Cu,this._persistenceKey=(null==r?void 0:r.name)||"[DEFAULT]"}_terminate(){return this._firestoreClient||Lu(this),this._firestoreClient.terminate()}}function Ru(e,t,n){n||(n="(default)");const i=Object(r._getProvider)(e,"firestore");if(i.isInitialized(n)){const e=i.getImmediate({identifier:n}),r=i.getOptions(n);if(Object(o.i)(r,t))return e;throw new T(_.FAILED_PRECONDITION,"initializeFirestore() has already been called with different options. To avoid this error, call initializeFirestore() with the same options as when it was originally called, or call getFirestore() to return the already initialized instance.")}if(void 0!==t.cacheSizeBytes&&void 0!==t.localCache)throw new T(_.INVALID_ARGUMENT,"cache and cacheSizeBytes cannot be specified at the same time as cacheSizeBytes willbe deprecated. Instead, specify the cache size in the cache object");if(void 0!==t.cacheSizeBytes&&-1!==t.cacheSizeBytes&&t.cacheSizeBytes<1048576)throw new T(_.INVALID_ARGUMENT,"cacheSizeBytes must be at least 1048576");return i.initialize({options:t,instanceIdentifier:n})}function xu(e,t){const n="object"==typeof e?e:Object(r.getApp)(),i="string"==typeof e?e:t||"(default)",s=Object(r._getProvider)(n,"firestore").getImmediate({identifier:i});if(!s._initialized){const e=Object(o.n)("firestore");e&&vu(s,...e)}return s}function Pu(e){return e._firestoreClient||Lu(e),e._firestoreClient.verifyNotTerminated(),e._firestoreClient}function Lu(e){var t,n,r;const i=e._freezeSettings(),s=function(e,t,n,r){return new yt(e,t,n,r.host,r.ssl,r.experimentalForceLongPolling,r.experimentalAutoDetectLongPolling,au(r.experimentalLongPollingOptions),r.useFetchStreams)}(e._databaseId,(null===(t=e._app)||void 0===t?void 0:t.options.appId)||"",e._persistenceKey,i);e._firestoreClient=new $c(e._authCredentials,e._appCheckCredentials,e._queue,s),(null===(n=i.cache)||void 0===n?void 0:n._offlineComponentProvider)&&(null===(r=i.cache)||void 0===r?void 0:r._onlineComponentProvider)&&(e._firestoreClient._uninitializedComponentsProvider={_offlineKind:i.cache.kind,_offline:i.cache._offlineComponentProvider,_online:i.cache._onlineComponentProvider})}function Mu(e,t){$u(e=pu(e,Ou));const n=Pu(e);if(n._uninitializedComponentsProvider)throw new T(_.FAILED_PRECONDITION,"SDK cache is already specified.");m("enableIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.");const r=e._freezeSettings(),i=new Uc;return Vu(n,i,new Vc(i,r.cacheSizeBytes,null==t?void 0:t.forceOwnership))}function Fu(e){$u(e=pu(e,Ou));const t=Pu(e);if(t._uninitializedComponentsProvider)throw new T(_.FAILED_PRECONDITION,"SDK cache is already specified.");m("enableMultiTabIndexedDbPersistence() will be deprecated in the future, you can use `FirestoreSettings.cache` instead.");const n=e._freezeSettings(),r=new Uc;return Vu(t,r,new jc(r,n.cacheSizeBytes))}function Vu(e,t,n){const r=new E;return e.asyncQueue.enqueue(async()=>{try{await Wc(e,n),await Hc(e,t),r.resolve()}catch(e){const t=e;if(!Qc(t))throw t;m("Error enabling indexeddb cache. Falling back to memory cache: "+t),r.reject(t)}}).then(()=>r.promise)}function ju(e){if(e._initialized&&!e._terminated)throw new T(_.FAILED_PRECONDITION,"Persistence can only be cleared before a Firestore instance is initialized or after it is terminated.");const t=new E;return e._queue.enqueueAndForgetEvenWhileRestricted(async()=>{try{await async function(e){if(!ce.D())return Promise.resolve();const t=e+"main";await ce.delete(t)}(Io(e._databaseId,e._persistenceKey)),t.resolve()}catch(e){t.reject(e)}}),t.promise}function Uu(e){return function(e){const t=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t){const n=I(e);wa(n.remoteStore)||p("SyncEngine","The network is disabled. The task returned by 'awaitPendingWrites()' will not complete until the network is enabled.");try{const e=await function(e){const t=I(e);return t.persistence.runTransaction("Get highest unacknowledged batch id","readonly",e=>t.mutationQueue.getHighestUnacknowledgedBatchId(e))}(n.localStore);if(-1===e)return void t.resolve();const r=n.Ec.get(e)||[];r.push(t),n.Ec.set(e,r)}catch(e){const n=Ua(e,"Initialization of waitForPendingWrites() operation failed");t.reject(n)}}(await tu(e),t)),t.promise}(Pu(e=pu(e,Ou)))}function qu(e){return function(e){return e.asyncQueue.enqueue(async()=>{const t=await Xc(e),n=await eu(e);return t.setNetworkEnabled(!0),function(e){const t=I(e);return t.vu.delete(0),ha(t)}(n)})}(Pu(e=pu(e,Ou)))}function Bu(e){return function(e){return e.asyncQueue.enqueue(async()=>{const t=await Xc(e),n=await eu(e);return t.setNetworkEnabled(!1),async function(e){const t=I(e);t.vu.add(0),await da(t),t.bu.set("Offline")}(n)})}(Pu(e=pu(e,Ou)))}function zu(e){return Object(r._removeServiceInstance)(e.app,"firestore",e._databaseId.database),e._delete()}function Gu(e,t){const n=Pu(e=pu(e,Ou)),r=new Nu;return ou(n,e._databaseId,t,r),r}function Ku(e,t){return function(e,t){return e.asyncQueue.enqueue(async()=>function(e,t){const n=I(e);return n.persistence.runTransaction("Get named query","readonly",e=>n.qs.getNamedQuery(e,t))}(await Zc(e),t))}(Pu(e=pu(e,Ou)),t).then(t=>t?new bu(e,null,t.query):null)}function $u(e){if(e._initialized||e._terminated)throw new T(_.FAILED_PRECONDITION,"Firestore has already been started and persistence can no longer be enabled. You can only enable persistence before calling any other methods on a Firestore object.")} /** * @license * Copyright 2020 Google LLC @@ -3735,6 +4137,22 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * See the License for the specific language governing permissions and * limitations under the License. */ +/** + * @license + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class Wu{constructor(e="count",t){this._aggregateType=e,this._internalFieldPath=t,this.type="AggregateField"}}class Hu{constructor(e,t,n){this._userDataWriter=t,this._data=n,this.type="AggregateQuerySnapshot",this.query=e}data(){return this._userDataWriter.convertObjectMap(this._data)}} /** * @license * Copyright 2020 Google LLC @@ -3750,7 +4168,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class ac{constructor(...e){for(let t=0;t90)throw new T(_.INVALID_ARGUMENT,"Latitude must be a number between -90 and 90, but was: "+e);if(!isFinite(t)||t<-180||t>180)throw new T(_.INVALID_ARGUMENT,"Longitude must be a number between -180 and 180, but was: "+t);this._lat=e,this._long=t}get latitude(){return this._lat}get longitude(){return this._long}isEqual(e){return this._lat===e._lat&&this._long===e._long}toJSON(){return{latitude:this._lat,longitude:this._long}}_compareTo(e){return F(this._lat,e._lat)||F(this._long,e._long)}} + */class Zu{constructor(e,t){if(!isFinite(e)||e<-90||e>90)throw new T(_.INVALID_ARGUMENT,"Latitude must be a number between -90 and 90, but was: "+e);if(!isFinite(t)||t<-180||t>180)throw new T(_.INVALID_ARGUMENT,"Longitude must be a number between -180 and 180, but was: "+t);this._lat=e,this._long=t}get latitude(){return this._lat}get longitude(){return this._long}isEqual(e){return this._lat===e._lat&&this._long===e._long}toJSON(){return{latitude:this._lat,longitude:this._long}}_compareTo(e){return M(this._lat,e._lat)||M(this._long,e._long)}} /** * @license * Copyright 2017 Google LLC @@ -3814,7 +4232,23 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const dc=/^__.*__$/;class fc{constructor(e,t,n){this.data=e,this.fieldMask=t,this.fieldTransforms=n}toMutation(e,t){return null!==this.fieldMask?new Pt(e,this.data,this.fieldMask,t,this.fieldTransforms):new Rt(e,this.data,t,this.fieldTransforms)}}class pc{constructor(e,t,n){this.data=e,this.fieldMask=t,this.fieldTransforms=n}toMutation(e,t){return new Pt(e,this.data,this.fieldMask,t,this.fieldTransforms)}}function mc(e){switch(e){case 0:case 2:case 1:return!0;case 3:case 4:return!1;default:throw v()}}class gc{constructor(e,t,n,r,i,s){this.settings=e,this.databaseId=t,this.k=n,this.ignoreUndefinedProperties=r,void 0===i&&this.ka(),this.fieldTransforms=i||[],this.fieldMask=s||[]}get path(){return this.settings.path}get xa(){return this.settings.xa}$a(e){return new gc(Object.assign(Object.assign({},this.settings),e),this.databaseId,this.k,this.ignoreUndefinedProperties,this.fieldTransforms,this.fieldMask)}Fa(e){var t;const n=null===(t=this.path)||void 0===t?void 0:t.child(e),r=this.$a({path:n,Oa:!1});return r.Ma(e),r}La(e){var t;const n=null===(t=this.path)||void 0===t?void 0:t.child(e),r=this.$a({path:n,Oa:!1});return r.ka(),r}Ba(e){return this.$a({path:void 0,Oa:!0})}Ua(e){return Mc(e,this.settings.methodName,this.settings.qa||!1,this.path,this.settings.Ka)}contains(e){return void 0!==this.fieldMask.find(t=>e.isPrefixOf(t))||void 0!==this.fieldTransforms.find(t=>e.isPrefixOf(t.field))}ka(){if(this.path)for(let e=0;ec.covers(e.field))}else c=null,u=o.fieldTransforms;return new fc(new Ie(a),c,u)}class bc extends hc{_toFieldTransform(e){if(2!==e.xa)throw 1===e.xa?e.Ua(this._methodName+"() can only appear at the top level of your update data"):e.Ua(this._methodName+"() cannot be used with set() unless you pass {merge:true}");return e.fieldMask.push(e.path),null}isEqual(e){return e instanceof bc}}function Ic(e,t,n){return new gc({xa:3,Ka:t.settings.Ka,methodName:e._methodName,Oa:n},t.databaseId,t.k,t.ignoreUndefinedProperties)}class _c extends hc{_toFieldTransform(e){return new _t(e.path,new pt)}isEqual(e){return e instanceof _c}}class Tc extends hc{constructor(e,t){super(e),this.Qa=t}_toFieldTransform(e){const t=Ic(this,e,!0),n=this.Qa.map(e=>Oc(e,t)),r=new mt(n);return new _t(e.path,r)}isEqual(e){return this===e}}class Ec extends hc{constructor(e,t){super(e),this.Qa=t}_toFieldTransform(e){const t=Ic(this,e,!0),n=this.Qa.map(e=>Oc(e,t)),r=new yt(n);return new _t(e.path,r)}isEqual(e){return this===e}}class kc extends hc{constructor(e,t){super(e),this.Wa=t}_toFieldTransform(e){const t=new wt(e.k,ut(e.k,this.Wa));return new _t(e.path,t)}isEqual(e){return this===e}}function Sc(e,t,n,r){const i=e.ja(1,t,n);Rc("Data must be an object, but it was:",i,r);const s=[],a=Ie.empty();z(r,(e,r)=>{const c=xc(t,e,n);r=Object(o.k)(r);const u=i.La(c);if(r instanceof bc)s.push(c);else{const e=Oc(r,u);null!=e&&(s.push(c),a.set(c,e))}});const c=new Q(s);return new pc(a,c,i.fieldTransforms)}function Ac(e,t,n,r,i,s){const a=e.ja(1,t,n),c=[Pc(t,r,n)],u=[i];if(s.length%2!=0)throw new T(_.INVALID_ARGUMENT,`Function ${t}() needs to be called with an even number of arguments that alternate between field names and values.`);for(let e=0;e=0;--e)if(!Fc(h,c[e])){const t=c[e];let n=u[e];n=Object(o.k)(n);const r=a.La(t);if(n instanceof bc)h.push(t);else{const e=Oc(n,r);null!=e&&(h.push(t),l.set(t,e))}}const d=new Q(h);return new pc(l,d,a.fieldTransforms)}function Nc(e,t,n,r=!1){return Oc(n,e.ja(r?4:3,t))}function Oc(e,t){if(Dc(e=Object(o.k)(e)))return Rc("Unsupported field value:",t,e),Cc(e,t);if(e instanceof hc)return function(e,t){if(!mc(t.xa))throw t.Ua(e._methodName+"() can only be used with update() and set()");if(!t.path)throw t.Ua(e._methodName+"() is not currently supported inside arrays");const n=e._toFieldTransform(t);n&&t.fieldTransforms.push(n)}(e,t),null;if(void 0===e&&t.ignoreUndefinedProperties)return null;if(t.path&&t.fieldMask.push(t.path),e instanceof Array){if(t.settings.Oa&&4!==t.xa)throw t.Ua("Nested arrays are not supported");return function(e,t){const n=[];let r=0;for(const i of e){let e=Oc(i,t.Ba(r));null==e&&(e={nullValue:"NULL_VALUE"}),n.push(e),r++}return{arrayValue:{values:n}}}(e,t)}return function(e,t){if(null===(e=Object(o.k)(e)))return{nullValue:"NULL_VALUE"};if("number"==typeof e)return ut(t.k,e);if("boolean"==typeof e)return{booleanValue:e};if("string"==typeof e)return{stringValue:e};if(e instanceof Date){const n=V.fromDate(e);return{timestampValue:vn(t.k,n)}}if(e instanceof V){const n=new V(e.seconds,1e3*Math.floor(e.nanoseconds/1e3));return{timestampValue:vn(t.k,n)}}if(e instanceof lc)return{geoPointValue:{latitude:e.latitude,longitude:e.longitude}};if(e instanceof uc)return{bytesValue:wn(t.k,e._byteString)};if(e instanceof Pa){const n=t.databaseId,r=e.firestore._databaseId;if(!r.isEqual(n))throw t.Ua(`Document reference is for database ${r.projectId}/${r.database} but should be for database ${n.projectId}/${n.database}`);return{referenceValue:_n(e.firestore._databaseId||t.databaseId,e._key.path)}}throw t.Ua("Unsupported field value: "+Aa(e))}(e,t)}function Cc(e,t){const n={};return K(e)?t.path&&t.path.length>0&&t.fieldMask.push(t.path):z(e,(e,r)=>{const i=Oc(r,t.Fa(e));null!=i&&(n[e]=i)}),{mapValue:{fields:n}}}function Dc(e){return!("object"!=typeof e||null===e||e instanceof Array||e instanceof Date||e instanceof V||e instanceof lc||e instanceof uc||e instanceof Pa||e instanceof hc)}function Rc(e,t,n){if(!Dc(n)||!function(e){return"object"==typeof e&&null!==e&&(Object.getPrototypeOf(e)===Object.prototype||null===Object.getPrototypeOf(e))}(n)){const r=Aa(n);throw"an object"===r?t.Ua(e+" a custom object"):t.Ua(e+" "+r)}}function Pc(e,t,n){if((t=Object(o.k)(t))instanceof ac)return t._internalPath;if("string"==typeof t)return xc(e,t);throw Mc("Field path arguments must be of type string or FieldPath.",e,!1,void 0,n)}const Lc=new RegExp("[~\\*/\\[\\]]");function xc(e,t,n){if(t.search(Lc)>=0)throw Mc(`Invalid field path (${t}). Paths must not contain '~', '*', '/', '[', or ']'`,e,!1,void 0,n);try{return new ac(...t.split("."))._internalPath}catch(r){throw Mc(`Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`,e,!1,void 0,n)}}function Mc(e,t,n,r,i){const s=r&&!r.isEmpty(),o=void 0!==i;let a=`Function ${t}() called with invalid data`;n&&(a+=" (via `toFirestore()`)"),a+=". ";let c="";return(s||o)&&(c+=" (found",s&&(c+=" in field "+r),o&&(c+=" in document "+i),c+=")"),new T(_.INVALID_ARGUMENT,a+e+c)}function Fc(e,t){return e.some(e=>e.isEqual(t))} + */const el=/^__.*__$/;class tl{constructor(e,t,n){this.data=e,this.fieldMask=t,this.fieldTransforms=n}toMutation(e,t){return null!==this.fieldMask?new Er(e,this.data,this.fieldMask,t,this.fieldTransforms):new Tr(e,this.data,t,this.fieldTransforms)}}class nl{constructor(e,t,n){this.data=e,this.fieldMask=t,this.fieldTransforms=n}toMutation(e,t){return new Er(e,this.data,this.fieldMask,t,this.fieldTransforms)}}function rl(e){switch(e){case 0:case 2:case 1:return!0;case 3:case 4:return!1;default:throw v()}}class il{constructor(e,t,n,r,i,s){this.settings=e,this.databaseId=t,this.serializer=n,this.ignoreUndefinedProperties=r,void 0===i&&this.ua(),this.fieldTransforms=i||[],this.fieldMask=s||[]}get path(){return this.settings.path}get ca(){return this.settings.ca}aa(e){return new il(Object.assign(Object.assign({},this.settings),e),this.databaseId,this.serializer,this.ignoreUndefinedProperties,this.fieldTransforms,this.fieldMask)}ha(e){var t;const n=null===(t=this.path)||void 0===t?void 0:t.child(e),r=this.aa({path:n,la:!1});return r.fa(e),r}da(e){var t;const n=null===(t=this.path)||void 0===t?void 0:t.child(e),r=this.aa({path:n,la:!1});return r.ua(),r}wa(e){return this.aa({path:void 0,la:!0})}_a(e){return El(e,this.settings.methodName,this.settings.ma||!1,this.path,this.settings.ga)}contains(e){return void 0!==this.fieldMask.find(t=>e.isPrefixOf(t))||void 0!==this.fieldTransforms.find(t=>e.isPrefixOf(t.field))}ua(){if(this.path)for(let e=0;ec.covers(e.field))}else c=null,u=o.fieldTransforms;return new tl(new jt(a),c,u)}class cl extends Xu{_toFieldTransform(e){if(2!==e.ca)throw 1===e.ca?e._a(this._methodName+"() can only appear at the top level of your update data"):e._a(this._methodName+"() cannot be used with set() unless you pass {merge:true}");return e.fieldMask.push(e.path),null}isEqual(e){return e instanceof cl}}function ul(e,t,n){return new il({ca:3,ga:t.settings.ga,methodName:e._methodName,la:n},t.databaseId,t.serializer,t.ignoreUndefinedProperties)}class ll extends Xu{_toFieldTransform(e){return new fr(e.path,new sr)}isEqual(e){return e instanceof ll}}class hl extends Xu{constructor(e,t){super(e),this.pa=t}_toFieldTransform(e){const t=ul(this,e,!0),n=this.pa.map(e=>yl(e,t)),r=new or(n);return new fr(e.path,r)}isEqual(e){return this===e}}class dl extends Xu{constructor(e,t){super(e),this.pa=t}_toFieldTransform(e){const t=ul(this,e,!0),n=this.pa.map(e=>yl(e,t)),r=new cr(n);return new fr(e.path,r)}isEqual(e){return this===e}}class fl extends Xu{constructor(e,t){super(e),this.Ia=t}_toFieldTransform(e){const t=new lr(e.serializer,er(e.serializer,this.Ia));return new fr(e.path,t)}isEqual(e){return this===e}}function pl(e,t,n,r){const i=e.ya(1,t,n);bl("Data must be an object, but it was:",i,r);const s=[],a=jt.empty();Xe(r,(e,r)=>{const c=Tl(t,e,n);r=Object(o.p)(r);const u=i.da(c);if(r instanceof cl)s.push(c);else{const e=yl(r,u);null!=e&&(s.push(c),a.set(c,e))}});const c=new ot(s);return new nl(a,c,i.fieldTransforms)}function gl(e,t,n,r,i,s){const a=e.ya(1,t,n),c=[Il(t,r,n)],u=[i];if(s.length%2!=0)throw new T(_.INVALID_ARGUMENT,`Function ${t}() needs to be called with an even number of arguments that alternate between field names and values.`);for(let e=0;e=0;--e)if(!Sl(l,c[e])){const t=c[e];let n=u[e];n=Object(o.p)(n);const r=a.da(t);if(n instanceof cl)l.push(t);else{const e=yl(n,r);null!=e&&(l.push(t),h.set(t,e))}}const d=new ot(l);return new nl(h,d,a.fieldTransforms)}function ml(e,t,n,r=!1){return yl(n,e.ya(r?4:3,t))}function yl(e,t){if(wl(e=Object(o.p)(e)))return bl("Unsupported field value:",t,e),vl(e,t);if(e instanceof Xu)return function(e,t){if(!rl(t.ca))throw t._a(e._methodName+"() can only be used with update() and set()");if(!t.path)throw t._a(e._methodName+"() is not currently supported inside arrays");const n=e._toFieldTransform(t);n&&t.fieldTransforms.push(n)}(e,t),null;if(void 0===e&&t.ignoreUndefinedProperties)return null;if(t.path&&t.fieldMask.push(t.path),e instanceof Array){if(t.settings.la&&4!==t.ca)throw t._a("Nested arrays are not supported");return function(e,t){const n=[];let r=0;for(const i of e){let e=yl(i,t.wa(r));null==e&&(e={nullValue:"NULL_VALUE"}),n.push(e),r++}return{arrayValue:{values:n}}}(e,t)}return function(e,t){if(null===(e=Object(o.p)(e)))return{nullValue:"NULL_VALUE"};if("number"==typeof e)return er(t.serializer,e);if("boolean"==typeof e)return{booleanValue:e};if("string"==typeof e)return{stringValue:e};if(e instanceof Date){const n=j.fromDate(e);return{timestampValue:ai(t.serializer,n)}}if(e instanceof j){const n=new j(e.seconds,1e3*Math.floor(e.nanoseconds/1e3));return{timestampValue:ai(t.serializer,n)}}if(e instanceof Zu)return{geoPointValue:{latitude:e.latitude,longitude:e.longitude}};if(e instanceof Qu)return{bytesValue:ci(t.serializer,e._byteString)};if(e instanceof wu){const n=t.databaseId,r=e.firestore._databaseId;if(!r.isEqual(n))throw t._a(`Document reference is for database ${r.projectId}/${r.database} but should be for database ${n.projectId}/${n.database}`);return{referenceValue:hi(e.firestore._databaseId||t.databaseId,e._key.path)}}throw t._a("Unsupported field value: "+fu(e))}(e,t)}function vl(e,t){const n={};return Ze(e)?t.path&&t.path.length>0&&t.fieldMask.push(t.path):Xe(e,(e,r)=>{const i=yl(r,t.ha(e));null!=i&&(n[e]=i)}),{mapValue:{fields:n}}}function wl(e){return!("object"!=typeof e||null===e||e instanceof Array||e instanceof Date||e instanceof j||e instanceof Zu||e instanceof Qu||e instanceof wu||e instanceof Xu)}function bl(e,t,n){if(!wl(n)||!function(e){return"object"==typeof e&&null!==e&&(Object.getPrototypeOf(e)===Object.prototype||null===Object.getPrototypeOf(e))}(n)){const r=fu(n);throw"an object"===r?t._a(e+" a custom object"):t._a(e+" "+r)}}function Il(e,t,n){if((t=Object(o.p)(t))instanceof Yu)return t._internalPath;if("string"==typeof t)return Tl(e,t);throw El("Field path arguments must be of type string or ",e,!1,void 0,n)}const _l=new RegExp("[~\\*/\\[\\]]");function Tl(e,t,n){if(t.search(_l)>=0)throw El(`Invalid field path (${t}). Paths must not contain '~', '*', '/', '[', or ']'`,e,!1,void 0,n);try{return new Yu(...t.split("."))._internalPath}catch(r){throw El(`Invalid field path (${t}). Paths must not be empty, begin with '.', end with '.', or contain '..'`,e,!1,void 0,n)}}function El(e,t,n,r,i){const s=r&&!r.isEmpty(),o=void 0!==i;let a=`Function ${t}() called with invalid data`;n&&(a+=" (via `toFirestore()`)"),a+=". ";let c="";return(s||o)&&(c+=" (found",s&&(c+=" in field "+r),o&&(c+=" in document "+i),c+=")"),new T(_.INVALID_ARGUMENT,a+e+c)}function Sl(e,t){return e.some(e=>e.isEqual(t))} +/** + * @license + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class kl{constructor(e,t,n,r,i){this._firestore=e,this._userDataWriter=t,this._key=n,this._document=r,this._converter=i}get id(){return this._key.path.lastSegment()}get ref(){return new wu(this._firestore,this._converter,this._key)}exists(){return null!==this._document}data(){if(this._document){if(this._converter){const e=new Cl(this._firestore,this._userDataWriter,this._key,this._document,null);return this._converter.fromFirestore(e)}return this._userDataWriter.convertValue(this._document.data.value)}}get(e){if(this._document){const t=this._document.data.field(Al("DocumentSnapshot.get",e));if(null!==t)return this._userDataWriter.convertValue(t)}}}class Cl extends kl{data(){return super.data()}}function Al(e,t){return"string"==typeof t?Tl(e,t):t instanceof Yu?t._internalPath:t._delegate._internalPath} /** * @license * Copyright 2020 Google LLC @@ -3830,7 +4264,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class jc{constructor(e,t,n,r,i){this._firestore=e,this._userDataWriter=t,this._key=n,this._document=r,this._converter=i}get id(){return this._key.path.lastSegment()}get ref(){return new Pa(this._firestore,this._converter,this._key)}exists(){return null!==this._document}data(){if(this._document){if(this._converter){const e=new Uc(this._firestore,this._userDataWriter,this._key,this._document,null);return this._converter.fromFirestore(e)}return this._userDataWriter.convertValue(this._document.data.value)}}get(e){if(this._document){const t=this._document.data.field(Vc("DocumentSnapshot.get",e));if(null!==t)return this._userDataWriter.convertValue(t)}}}class Uc extends jc{data(){return super.data()}}function Vc(e,t){return"string"==typeof t?xc(e,t):t instanceof ac?t._internalPath:t._delegate._internalPath} + */function Nl(e){if("L"===e.limitType&&0===e.explicitOrderBy.length)throw new T(_.UNIMPLEMENTED,"limitToLast() queries require specifying at least one orderBy() clause")}class Dl{}class Ol extends Dl{}function Rl(e,t,...n){let r=[];t instanceof Dl&&r.push(t),r=r.concat(n),function(e){const t=e.filter(e=>e instanceof Ll).length,n=e.filter(e=>e instanceof xl).length;if(t>1||t>0&&n>0)throw new T(_.INVALID_ARGUMENT,"InvalidQuery. When using composite filters, you cannot use more than one filter at the top level. Consider nesting the multiple filters within an `and(...)` statement. For example: change `query(query, where(...), or(...))` to `query(query, and(where(...), or(...)))`.")} /** * @license * Copyright 2020 Google LLC @@ -3846,7 +4280,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class qc{constructor(e,t){this.hasPendingWrites=e,this.fromCache=t}isEqual(e){return this.hasPendingWrites===e.hasPendingWrites&&this.fromCache===e.fromCache}}class Bc extends jc{constructor(e,t,n,r,i,s){super(e,t,n,r,s),this._firestore=e,this._firestoreImpl=e,this.metadata=i}exists(){return super.exists()}data(e={}){if(this._document){if(this._converter){const t=new zc(this._firestore,this._userDataWriter,this._key,this._document,this.metadata,null);return this._converter.fromFirestore(t,e)}return this._userDataWriter.convertValue(this._document.data.value,e.serverTimestamps)}}get(e,t={}){if(this._document){const n=this._document.data.field(Vc("DocumentSnapshot.get",e));if(null!==n)return this._userDataWriter.convertValue(n,t.serverTimestamps)}}}class zc extends Bc{data(e={}){return super.data(e)}}class Kc{constructor(e,t,n,r){this._firestore=e,this._userDataWriter=t,this._snapshot=r,this.metadata=new qc(r.hasPendingWrites,r.fromCache),this.query=n}get docs(){const e=[];return this.forEach(t=>e.push(t)),e}get size(){return this._snapshot.docs.size}get empty(){return 0===this.size}forEach(e,t){this._snapshot.docs.forEach(n=>{e.call(t,new zc(this._firestore,this._userDataWriter,n.key,n,new qc(this._snapshot.mutatedKeys.has(n.key),this._snapshot.fromCache),this.query.converter))})}docChanges(e={}){const t=!!e.includeMetadataChanges;if(t&&this._snapshot.excludesMetadataChanges)throw new T(_.INVALID_ARGUMENT,"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().");return this._cachedChanges&&this._cachedChangesIncludeMetadataChanges===t||(this._cachedChanges=function(e,t){if(e._snapshot.oldDocs.isEmpty()){let t=0;return e._snapshot.docChanges.map(n=>({type:"added",doc:new zc(e._firestore,e._userDataWriter,n.doc.key,n.doc,new qc(e._snapshot.mutatedKeys.has(n.doc.key),e._snapshot.fromCache),e.query.converter),oldIndex:-1,newIndex:t++}))}{let n=e._snapshot.oldDocs;return e._snapshot.docChanges.filter(e=>t||3!==e.type).map(t=>{const r=new zc(e._firestore,e._userDataWriter,t.doc.key,t.doc,new qc(e._snapshot.mutatedKeys.has(t.doc.key),e._snapshot.fromCache),e.query.converter);let i=-1,s=-1;return 0!==t.type&&(i=n.indexOf(t.doc.key),n=n.delete(t.doc.key)),1!==t.type&&(n=n.add(t.doc),s=n.indexOf(t.doc.key)),{type:Wc(t.type),doc:r,oldIndex:i,newIndex:s}})}}(this,t),this._cachedChangesIncludeMetadataChanges=t),this._cachedChanges}}function Wc(e){switch(e){case 0:return"added";case 2:case 3:return"modified";case 1:return"removed";default:return v()}}function Gc(e,t){return e instanceof Bc&&t instanceof Bc?e._firestore===t._firestore&&e._key.isEqual(t._key)&&(null===e._document?null===t._document:e._document.isEqual(t._document))&&e._converter===t._converter:e instanceof Kc&&t instanceof Kc&&e._firestore===t._firestore&&Va(e.query,t.query)&&e.metadata.isEqual(t.metadata)&&e._snapshot.isEqual(t._snapshot)} + */(r);for(const t of r)e=t._apply(e);return e}class xl extends Ol{constructor(e,t,n){super(),this._field=e,this._op=t,this._value=n,this.type="where"}static _create(e,t,n){return new xl(e,t,n)}_apply(e){const t=this._parse(e);return Xl(e._query,t),new bu(e.firestore,e.converter,Nn(e._query,t))}_parse(e){const t=ol(e.firestore);return function(e,t,n,r,i,s,o){let a;if(i.isKeyField()){if("array-contains"===s||"array-contains-any"===s)throw new T(_.INVALID_ARGUMENT,`Invalid Query. You can't perform '${s}' queries on documentId().`);if("in"===s||"not-in"===s){Jl(o,s);const t=[];for(const n of o)t.push(Yl(r,e,n));a={arrayValue:{values:t}}}else a=Yl(r,e,o)}else"in"!==s&&"not-in"!==s&&"array-contains-any"!==s||Jl(o,s),a=ml(n,"where",o,"in"===s||"not-in"===s);return Ht.create(i,s,a)}(e._query,0,t,e.firestore._databaseId,this._field,this._op,this._value)}}function Pl(e,t,n){const r=t,i=Al("where",e);return xl._create(i,r,n)}class Ll extends Dl{constructor(e,t){super(),this.type=e,this._queryConstraints=t}static _create(e,t){return new Ll(e,t)}_parse(e){const t=this._queryConstraints.map(t=>t._parse(e)).filter(e=>e.getFilters().length>0);return 1===t.length?t[0]:Qt.create(t,this._getOperator())}_apply(e){const t=this._parse(e);return 0===t.getFilters().length?e:(function(e,t){let n=e;const r=t.getFlattenedFilters();for(const e of r)Xl(n,e),n=Nn(n,e)}(e._query,t),new bu(e.firestore,e.converter,Nn(e._query,t)))}_getQueryConstraints(){return this._queryConstraints}_getOperator(){return"and"===this.type?"and":"or"}}function Ml(...e){return e.forEach(e=>eh("or",e)),Ll._create("or",e)}function Fl(...e){return e.forEach(e=>eh("and",e)),Ll._create("and",e)}class Vl extends Ol{constructor(e,t){super(),this._field=e,this._direction=t,this.type="orderBy"}static _create(e,t){return new Vl(e,t)}_apply(e){const t=function(e,t,n){if(null!==e.startAt)throw new T(_.INVALID_ARGUMENT,"Invalid query. You must not call startAt() or startAfter() before calling orderBy().");if(null!==e.endAt)throw new T(_.INVALID_ARGUMENT,"Invalid query. You must not call endAt() or endBefore() before calling orderBy().");const r=new Kt(t,n);return function(e,t){if(null===En(e)){const n=Sn(e);null!==n&&Zl(e,n,t.field)}}(e,r),r}(e._query,this._field,this._direction);return new bu(e.firestore,e.converter,function(e,t){const n=e.explicitOrderBy.concat([t]);return new bn(e.path,e.collectionGroup,n,e.filters.slice(),e.limit,e.limitType,e.startAt,e.endAt)}(e._query,t))}}function jl(e,t="asc"){const n=t,r=Al("orderBy",e);return Vl._create(r,n)}class Ul extends Ol{constructor(e,t,n){super(),this.type=e,this._limit=t,this._limitType=n}static _create(e,t,n){return new Ul(e,t,n)}_apply(e){return new bu(e.firestore,e.converter,Dn(e._query,this._limit,this._limitType))}}function ql(e){return gu("limit",e),Ul._create("limit",e,"F")}function Bl(e){return gu("limitToLast",e),Ul._create("limitToLast",e,"L")}class zl extends Ol{constructor(e,t,n){super(),this.type=e,this._docOrFields=t,this._inclusive=n}static _create(e,t,n){return new zl(e,t,n)}_apply(e){const t=Ql(e,this.type,this._docOrFields,this._inclusive);return new bu(e.firestore,e.converter,function(e,t){return new bn(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,t,e.endAt)}(e._query,t))}}function Gl(...e){return zl._create("startAt",e,!0)}function Kl(...e){return zl._create("startAfter",e,!1)}class $l extends Ol{constructor(e,t,n){super(),this.type=e,this._docOrFields=t,this._inclusive=n}static _create(e,t,n){return new $l(e,t,n)}_apply(e){const t=Ql(e,this.type,this._docOrFields,this._inclusive);return new bu(e.firestore,e.converter,function(e,t){return new bn(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,e.startAt,t)}(e._query,t))}}function Wl(...e){return $l._create("endBefore",e,!1)}function Hl(...e){return $l._create("endAt",e,!0)}function Ql(e,t,n,r){if(n[0]=Object(o.p)(n[0]),n[0]instanceof kl)return function(e,t,n,r,i){if(!r)throw new T(_.NOT_FOUND,`Can't use a DocumentSnapshot that doesn't exist for ${n}().`);const s=[];for(const n of Cn(e))if(n.field.isKeyField())s.push(Ct(t,r.key));else{const e=r.data.field(n.field);if(pt(e))throw new T(_.INVALID_ARGUMENT,'Invalid query. You are trying to start or end a query using a document for which the field "'+n.field+'" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)');if(null===e){const e=n.field.canonicalString();throw new T(_.INVALID_ARGUMENT,`Invalid query. You are trying to start or end a query using a document for which the field '${e}' (used as the orderBy) does not exist.`)}s.push(e)}return new Bt(s,i)}(e._query,e.firestore._databaseId,t,n[0]._document,r);{const i=ol(e.firestore);return function(e,t,n,r,i,s){const o=e.explicitOrderBy;if(i.length>o.length)throw new T(_.INVALID_ARGUMENT,`Too many arguments provided to ${r}(). The number of arguments must be less than or equal to the number of orderBy() clauses`);const a=[];for(let s=0;s, or >=) must be on the same field. But you have inequality filters on '${n.toString()}' and '${r.toString()}'`);const i=En(e);null!==i&&Zl(e,r,i)}const n=function(e,t){for(const n of e)for(const e of n.getFlattenedFilters())if(t.indexOf(e.op)>=0)return e.op;return null}(e.filters,function(e){switch(e){case"!=":return["!=","not-in"];case"array-contains-any":case"in":return["not-in"];case"not-in":return["array-contains-any","in","not-in","!="];default:return[]}}(t.op));if(null!==n)throw n===t.op?new T(_.INVALID_ARGUMENT,`Invalid query. You cannot use more than one '${t.op.toString()}' filter.`):new T(_.INVALID_ARGUMENT,`Invalid query. You cannot use '${t.op.toString()}' filters with '${n.toString()}' filters.`)}function Zl(e,t,n){if(!n.isEqual(t))throw new T(_.INVALID_ARGUMENT,`Invalid query. You have a where filter with an inequality (<, <=, !=, not-in, >, or >=) on field '${t.toString()}' and so you must also use '${t.toString()}' as your first argument to orderBy(), but your first orderBy() is on field '${n.toString()}' instead.`)}function eh(e,t){if(!(t instanceof xl||t instanceof Ll))throw new T(_.INVALID_ARGUMENT,`Function ${e}() requires AppliableConstraints created with a call to 'where(...)', 'or(...)', or 'and(...)'.`)}class th{convertValue(e,t="none"){switch(It(e)){case 0:return null;case 1:return e.booleanValue;case 2:return dt(e.integerValue||e.doubleValue);case 3:return this.convertTimestamp(e.timestampValue);case 4:return this.convertServerTimestamp(e,t);case 5:return e.stringValue;case 6:return this.convertBytes(ft(e.bytesValue));case 7:return this.convertReference(e.referenceValue);case 8:return this.convertGeoPoint(e.geoPointValue);case 9:return this.convertArray(e.arrayValue,t);case 10:return this.convertObject(e.mapValue,t);default:throw v()}}convertObject(e,t){return this.convertObjectMap(e.fields,t)}convertObjectMap(e,t="none"){const n={};return Xe(e,(e,r)=>{n[e]=this.convertValue(r,t)}),n}convertGeoPoint(e){return new Zu(dt(e.latitude),dt(e.longitude))}convertArray(e,t){return(e.values||[]).map(e=>this.convertValue(e,t))}convertServerTimestamp(e,t){switch(t){case"previous":const n=gt(e);return null==n?null:this.convertValue(n,t);case"estimate":return this.convertTimestamp(mt(e));default:return null}}convertTimestamp(e){const t=ht(e);return new j(t.seconds,t.nanos)}convertDocumentKey(e,t){const n=B.fromString(e);w(Ri(n));const r=new vt(n.get(1),n.get(3)),i=new K(n.popFirst(5));return r.isEqual(t)||g(`Document ${i} contains a document reference within a different database (${r.projectId}/${r.database}) which is not supported. It will be treated as a reference in the current database (${t.projectId}/${t.database}) instead.`),i}} /** * @license * Copyright 2020 Google LLC @@ -3862,7 +4296,23 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Hc(e){if($e(e)&&0===e.explicitOrderBy.length)throw new T(_.UNIMPLEMENTED,"limitToLast() queries require specifying at least one orderBy() clause")}class $c{}function Qc(e,...t){for(const n of t)e=n._apply(e);return e}class Jc extends $c{constructor(e,t,n){super(),this.Ga=e,this.za=t,this.Ha=n,this.type="where"}_apply(e){const t=vc(e.firestore),n=function(e,t,n,r,i,s,o){let a;if(i.isKeyField()){if("array-contains"===s||"array-contains-any"===s)throw new T(_.INVALID_ARGUMENT,`Invalid Query. You can't perform '${s}' queries on FieldPath.documentId().`);if("in"===s||"not-in"===s){lu(o,s);const t=[];for(const n of o)t.push(hu(r,e,n));a={arrayValue:{values:t}}}else a=hu(r,e,o)}else"in"!==s&&"not-in"!==s&&"array-contains-any"!==s||lu(o,s),a=Nc(n,"where",o,"in"===s||"not-in"===s);const c=Oe.create(i,s,a);return function(e,t){if(t.V()){const n=Je(e);if(null!==n&&!n.isEqual(t.field))throw new T(_.INVALID_ARGUMENT,`Invalid query. All where filters with an inequality (<, <=, !=, not-in, >, or >=) must be on the same field. But you have inequality filters on '${n.toString()}' and '${t.field.toString()}'`);const r=Qe(e);null!==r&&du(e,t.field,r)}const n=function(e,t){for(const n of e.filters)if(t.indexOf(n.op)>=0)return n.op;return null}(e,function(e){switch(e){case"!=":return["!=","not-in"];case"array-contains":return["array-contains","array-contains-any","not-in"];case"in":return["array-contains-any","in","not-in"];case"array-contains-any":return["array-contains","array-contains-any","in","not-in"];case"not-in":return["array-contains","array-contains-any","in","not-in","!="];default:return[]}}(t.op));if(null!==n)throw n===t.op?new T(_.INVALID_ARGUMENT,`Invalid query. You cannot use more than one '${t.op.toString()}' filter.`):new T(_.INVALID_ARGUMENT,`Invalid query. You cannot use '${t.op.toString()}' filters with '${n.toString()}' filters.`)}(e,c),c}(e._query,0,t,e.firestore._databaseId,this.Ga,this.za,this.Ha);return new La(e.firestore,e.converter,function(e,t){const n=e.filters.concat([t]);return new Ke(e.path,e.collectionGroup,e.explicitOrderBy.slice(),n,e.limit,e.limitType,e.startAt,e.endAt)}(e._query,n))}}function Yc(e,t,n){const r=t,i=Vc("where",e);return new Jc(i,r,n)}class Xc extends $c{constructor(e,t){super(),this.Ga=e,this.Ja=t,this.type="orderBy"}_apply(e){const t=function(e,t,n){if(null!==e.startAt)throw new T(_.INVALID_ARGUMENT,"Invalid query. You must not call startAt() or startAfter() before calling orderBy().");if(null!==e.endAt)throw new T(_.INVALID_ARGUMENT,"Invalid query. You must not call endAt() or endBefore() before calling orderBy().");const r=new Ve(t,n);return function(e,t){if(null===Qe(e)){const n=Je(e);null!==n&&du(e,n,t.field)}}(e,r),r}(e._query,this.Ga,this.Ja);return new La(e.firestore,e.converter,function(e,t){const n=e.explicitOrderBy.concat([t]);return new Ke(e.path,e.collectionGroup,n,e.filters.slice(),e.limit,e.limitType,e.startAt,e.endAt)}(e._query,t))}}function Zc(e,t="asc"){const n=t,r=Vc("orderBy",e);return new Xc(r,n)}class eu extends $c{constructor(e,t,n){super(),this.type=e,this.Ya=t,this.Xa=n}_apply(e){return new La(e.firestore,e.converter,et(e._query,this.Ya,this.Xa))}}function tu(e){return Oa("limit",e),new eu("limit",e,"F")}function nu(e){return Oa("limitToLast",e),new eu("limitToLast",e,"L")}class ru extends $c{constructor(e,t,n){super(),this.type=e,this.Za=t,this.tc=n}_apply(e){const t=uu(e,this.type,this.Za,this.tc);return new La(e.firestore,e.converter,function(e,t){return new Ke(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,t,e.endAt)}(e._query,t))}}function iu(...e){return new ru("startAt",e,!0)}function su(...e){return new ru("startAfter",e,!1)}class ou extends $c{constructor(e,t,n){super(),this.type=e,this.Za=t,this.tc=n}_apply(e){const t=uu(e,this.type,this.Za,this.tc);return new La(e.firestore,e.converter,function(e,t){return new Ke(e.path,e.collectionGroup,e.explicitOrderBy.slice(),e.filters.slice(),e.limit,e.limitType,e.startAt,t)}(e._query,t))}}function au(...e){return new ou("endBefore",e,!0)}function cu(...e){return new ou("endAt",e,!1)}function uu(e,t,n,r){if(n[0]=Object(o.k)(n[0]),n[0]instanceof jc)return function(e,t,n,r,i){if(!r)throw new T(_.NOT_FOUND,`Can't use a DocumentSnapshot that doesn't exist for ${n}().`);const s=[];for(const n of Xe(e))if(n.field.isKeyField())s.push(pe(t,r.key));else{const e=r.data.field(n.field);if(ne(e))throw new T(_.INVALID_ARGUMENT,'Invalid query. You are trying to start or end a query using a document for which the field "'+n.field+'" is an uncommitted server timestamp. (Since the value of this field is unknown, you cannot start/end a query with it.)');if(null===e){const e=n.field.canonicalString();throw new T(_.INVALID_ARGUMENT,`Invalid query. You are trying to start or end a query using a document for which the field '${e}' (used as the orderBy) does not exist.`)}s.push(e)}return new je(s,i)}(e._query,e.firestore._databaseId,t,n[0]._document,r);{const i=vc(e.firestore);return function(e,t,n,r,i,s){const o=e.explicitOrderBy;if(i.length>o.length)throw new T(_.INVALID_ARGUMENT,`Too many arguments provided to ${r}(). The number of arguments must be less than or equal to the number of orderBy() clauses`);const a=[];for(let s=0;s10)throw new T(_.INVALID_ARGUMENT,`Invalid Query. '${t.toString()}' filters support a maximum of 10 elements in the value array.`)}function du(e,t,n){if(!n.isEqual(t))throw new T(_.INVALID_ARGUMENT,`Invalid query. You have a where filter with an inequality (<, <=, !=, not-in, >, or >=) on field '${t.toString()}' and so you must also use '${t.toString()}' as your first argument to orderBy(), but your first orderBy() is on field '${n.toString()}' instead.`)} + */function nh(e,t,n){let r;return r=e?n&&(n.merge||n.mergeFields)?e.toFirestore(t,n):e.toFirestore(t):t,r}class rh extends th{constructor(e){super(),this.firestore=e}convertBytes(e){return new Qu(e)}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return new wu(this.firestore,null,t)}} +/** + * @license + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function ih(e){return new Wu("sum",Il("sum",e))}function sh(e){return new Wu("avg",Il("average",e))}function oh(){return new Wu("count")}function ah(e,t){var n,r;return e instanceof Wu&&t instanceof Wu&&e._aggregateType===t._aggregateType&&(null===(n=e._internalFieldPath)||void 0===n?void 0:n.canonicalString())===(null===(r=t._internalFieldPath)||void 0===r?void 0:r.canonicalString())}function ch(e,t){return ku(e.query,t.query)&&Object(o.i)(e.data(),t.data())} /** * @license * Copyright 2020 Google LLC @@ -3878,7 +4328,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class fu{convertValue(e,t="none"){switch(ce(e)){case 0:return null;case 1:return e.booleanValue;case 2:return ee(e.integerValue||e.doubleValue);case 3:return this.convertTimestamp(e.timestampValue);case 4:return this.convertServerTimestamp(e,t);case 5:return e.stringValue;case 6:return this.convertBytes(te(e.bytesValue));case 7:return this.convertReference(e.referenceValue);case 8:return this.convertGeoPoint(e.geoPointValue);case 9:return this.convertArray(e.arrayValue,t);case 10:return this.convertObject(e.mapValue,t);default:throw v()}}convertObject(e,t){const n={};return z(e.fields,(e,r)=>{n[e]=this.convertValue(r,t)}),n}convertGeoPoint(e){return new lc(ee(e.latitude),ee(e.longitude))}convertArray(e,t){return(e.values||[]).map(e=>this.convertValue(e,t))}convertServerTimestamp(e,t){switch(t){case"previous":const n=function e(t){const n=t.mapValue.fields.__previous_value__;return ne(n)?e(n):n}(e);return null==n?null:this.convertValue(n,t);case"estimate":return this.convertTimestamp(re(e));default:return null}}convertTimestamp(e){const t=Z(e);return new V(t.seconds,t.nanos)}convertDocumentKey(e,t){const n=G.fromString(e);w(Gn(n));const r=new Ia(n.get(1),n.get(3)),i=new ae(n.popFirst(5));return r.isEqual(t)||m(`Document ${i} contains a document reference within a different database (${r.projectId}/${r.database}) which is not supported. It will be treated as a reference in the current database (${t.projectId}/${t.database}) instead.`),i}} + */class uh{constructor(e,t){this.hasPendingWrites=e,this.fromCache=t}isEqual(e){return this.hasPendingWrites===e.hasPendingWrites&&this.fromCache===e.fromCache}}class lh extends kl{constructor(e,t,n,r,i,s){super(e,t,n,r,s),this._firestore=e,this._firestoreImpl=e,this.metadata=i}exists(){return super.exists()}data(e={}){if(this._document){if(this._converter){const t=new hh(this._firestore,this._userDataWriter,this._key,this._document,this.metadata,null);return this._converter.fromFirestore(t,e)}return this._userDataWriter.convertValue(this._document.data.value,e.serverTimestamps)}}get(e,t={}){if(this._document){const n=this._document.data.field(Al("DocumentSnapshot.get",e));if(null!==n)return this._userDataWriter.convertValue(n,t.serverTimestamps)}}}class hh extends lh{data(e={}){return super.data(e)}}class dh{constructor(e,t,n,r){this._firestore=e,this._userDataWriter=t,this._snapshot=r,this.metadata=new uh(r.hasPendingWrites,r.fromCache),this.query=n}get docs(){const e=[];return this.forEach(t=>e.push(t)),e}get size(){return this._snapshot.docs.size}get empty(){return 0===this.size}forEach(e,t){this._snapshot.docs.forEach(n=>{e.call(t,new hh(this._firestore,this._userDataWriter,n.key,n,new uh(this._snapshot.mutatedKeys.has(n.key),this._snapshot.fromCache),this.query.converter))})}docChanges(e={}){const t=!!e.includeMetadataChanges;if(t&&this._snapshot.excludesMetadataChanges)throw new T(_.INVALID_ARGUMENT,"To include metadata changes with your document changes, you must also pass { includeMetadataChanges:true } to onSnapshot().");return this._cachedChanges&&this._cachedChangesIncludeMetadataChanges===t||(this._cachedChanges=function(e,t){if(e._snapshot.oldDocs.isEmpty()){let t=0;return e._snapshot.docChanges.map(n=>{const r=new hh(e._firestore,e._userDataWriter,n.doc.key,n.doc,new uh(e._snapshot.mutatedKeys.has(n.doc.key),e._snapshot.fromCache),e.query.converter);return n.doc,{type:"added",doc:r,oldIndex:-1,newIndex:t++}})}{let n=e._snapshot.oldDocs;return e._snapshot.docChanges.filter(e=>t||3!==e.type).map(t=>{const r=new hh(e._firestore,e._userDataWriter,t.doc.key,t.doc,new uh(e._snapshot.mutatedKeys.has(t.doc.key),e._snapshot.fromCache),e.query.converter);let i=-1,s=-1;return 0!==t.type&&(i=n.indexOf(t.doc.key),n=n.delete(t.doc.key)),1!==t.type&&(n=n.add(t.doc),s=n.indexOf(t.doc.key)),{type:fh(t.type),doc:r,oldIndex:i,newIndex:s}})}}(this,t),this._cachedChangesIncludeMetadataChanges=t),this._cachedChanges}}function fh(e){switch(e){case 0:return"added";case 2:case 3:return"modified";case 1:return"removed";default:return v()}}function ph(e,t){return e instanceof lh&&t instanceof lh?e._firestore===t._firestore&&e._key.isEqual(t._key)&&(null===e._document?null===t._document:e._document.isEqual(t._document))&&e._converter===t._converter:e instanceof dh&&t instanceof dh&&e._firestore===t._firestore&&ku(e.query,t.query)&&e.metadata.isEqual(t.metadata)&&e._snapshot.isEqual(t._snapshot)} /** * @license * Copyright 2020 Google LLC @@ -3894,7 +4344,55 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function pu(e,t,n){let r;return r=e?n&&(n.merge||n.mergeFields)?e.toFirestore(t,n):e.toFirestore(t):t,r}class mu extends fu{constructor(e){super(),this.firestore=e}convertBytes(e){return new uc(e)}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return new Pa(this.firestore,null,t)}} + */function gh(e){e=pu(e,wu);const t=pu(e.firestore,Ou);return iu(Pu(t),e._key).then(n=>Nh(t,e,n))}class mh extends th{constructor(e){super(),this.firestore=e}convertBytes(e){return new Qu(e)}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return new wu(this.firestore,null,t)}}function yh(e){e=pu(e,wu);const t=pu(e.firestore,Ou),n=Pu(t),r=new mh(t);return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){try{const r=await function(e,t){const n=I(e);return n.persistence.runTransaction("read document","readonly",e=>n.localDocuments.getDocument(e,t))}(e,t);r.isFoundDocument()?n.resolve(r):r.isNoDocument()?n.resolve(null):n.reject(new T(_.UNAVAILABLE,"Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)"))}catch(e){const r=Ua(e,`Failed to get document '${t} from cache`);n.reject(r)}}(await Zc(e),t,n)),n.promise}(n,e._key).then(n=>new lh(t,r,e._key,n,new uh(null!==n&&n.hasLocalMutations,!0),e.converter))}function vh(e){e=pu(e,wu);const t=pu(e.firestore,Ou);return iu(Pu(t),e._key,{source:"server"}).then(n=>Nh(t,e,n))}function wh(e){e=pu(e,bu);const t=pu(e.firestore,Ou),n=Pu(t),r=new mh(t);return Nl(e._query),su(n,e._query).then(n=>new dh(t,r,e,n))}function bh(e){e=pu(e,bu);const t=pu(e.firestore,Ou),n=Pu(t),r=new mh(t);return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){try{const r=await Ro(e,t,!0),i=new ic(t,r.ir),s=i.sc(r.documents),o=i.applyChanges(s,!1);n.resolve(o.snapshot)}catch(e){const r=Ua(e,`Failed to execute query '${t} against cache`);n.reject(r)}}(await Zc(e),t,n)),n.promise}(n,e._query).then(n=>new dh(t,r,e,n))}function Ih(e){e=pu(e,bu);const t=pu(e.firestore,Ou),n=Pu(t),r=new mh(t);return su(n,e._query,{source:"server"}).then(n=>new dh(t,r,e,n))}function _h(e,t,n){e=pu(e,wu);const r=pu(e.firestore,Ou),i=nh(e.converter,t,n);return Ah(r,[al(ol(r),"setDoc",e._key,i,null!==e.converter,n).toMutation(e._key,gr.none())])}function Th(e,t,n,...r){e=pu(e,wu);const i=pu(e.firestore,Ou),s=ol(i);let a;return a="string"==typeof(t=Object(o.p)(t))||t instanceof Yu?gl(s,"updateDoc",e._key,t,n,r):pl(s,"updateDoc",e._key,t),Ah(i,[a.toMutation(e._key,gr.exists(!0))])}function Eh(e){return Ah(pu(e.firestore,Ou),[new Ar(e._key,gr.none())])}function Sh(e,t){const n=pu(e.firestore,Ou),r=Eu(e),i=nh(e.converter,t);return Ah(n,[al(ol(e.firestore),"addDoc",r._key,i,null!==e.converter,{}).toMutation(r._key,gr.exists(!1))]).then(()=>r)}function kh(e,...t){var n,r,i;e=Object(o.p)(e);let s={includeMetadataChanges:!1},a=0;"object"!=typeof t[a]||Au(t[a])||(s=t[a],a++);const c={includeMetadataChanges:s.includeMetadataChanges};if(Au(t[a])){const e=t[a];t[a]=null===(n=e.next)||void 0===n?void 0:n.bind(e),t[a+1]=null===(r=e.error)||void 0===r?void 0:r.bind(e),t[a+2]=null===(i=e.complete)||void 0===i?void 0:i.bind(e)}let u,l,h;if(e instanceof wu)l=pu(e.firestore,Ou),h=_n(e._key.path),u={next:n=>{t[a]&&t[a](Nh(l,e,n))},error:t[a+1],complete:t[a+2]};else{const n=pu(e,bu);l=pu(n.firestore,Ou),h=n._query;const r=new mh(l);u={next:e=>{t[a]&&t[a](new dh(l,r,n,e))},error:t[a+1],complete:t[a+2]},Nl(e._query)}return function(e,t,n,r){const i=new Bc(r),s=new Ja(t,i,n);return e.asyncQueue.enqueueAndForget(async()=>$a(await ru(e),s)),()=>{i.Dc(),e.asyncQueue.enqueueAndForget(async()=>Wa(await ru(e),s))}}(Pu(l),h,c,u)}function Ch(e,t){return function(e,t){const n=new Bc(t);return e.asyncQueue.enqueueAndForget(async()=>function(e,t){I(e).ku.add(t),t.next()}(await ru(e),n)),()=>{n.Dc(),e.asyncQueue.enqueueAndForget(async()=>function(e,t){I(e).ku.delete(t)}(await ru(e),n))}}(Pu(e=pu(e,Ou)),Au(t)?t:{next:t})}function Ah(e,t){return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){const r=Lc(e);try{const e=await function(e,t){const n=I(e),r=j.now(),i=t.reduce((e,t)=>e.add(t.key),Qn());let s,o;return n.persistence.runTransaction("Locally write mutations","readwrite",e=>{let a=Un(),c=Qn();return n.Zi.getEntries(e,i).next(e=>{a=e,a.forEach((e,t)=>{t.isValidDocument()||(c=c.add(e))})}).next(()=>n.localDocuments.getOverlayedDocuments(e,a)).next(i=>{s=i;const o=[];for(const e of t){const t=Ir(e,s.get(e.key).overlayedDocument);null!=t&&o.push(new Er(e.key,t,Ut(t.value.mapValue),gr.exists(!0)))}return n.mutationQueue.addMutationBatch(e,r,o,t)}).next(t=>{o=t;const r=t.applyToLocalDocumentSet(s,c);return n.documentOverlayCache.saveOverlays(e,t.batchId,r)})}).then(()=>({batchId:o.batchId,changes:zn(s)}))}(r.localStore,t);r.sharedClientState.addPendingMutation(e.batchId),function(e,t,n){let r=e.Tc[e.currentUser.toKey()];r||(r=new et(M)),r=r.insert(t,n),e.Tc[e.currentUser.toKey()]=r}(r,e.batchId,n),await Tc(r,e.changes),await ka(r.remoteStore)}catch(e){const t=Ua(e,"Failed to persist write");n.reject(t)}}(await tu(e),t,n)),n.promise}(Pu(e),t)}function Nh(e,t,n){const r=n.docs.get(t._key),i=new mh(e);return new lh(e,i,t._key,r,new uh(n.hasPendingWrites,n.fromCache),t.converter)} +/** + * @license + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */function Dh(e){return Oh(e,{count:oh()})}function Oh(e,t){const n=pu(e.firestore,Ou),r=Pu(n),i=function(e,t){const n=[];for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&n.push(t(e[r],r));return n}(t,(e,t)=>new xr(t,e._aggregateType,e._internalFieldPath));return function(e,t,n){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>{try{const i=await nu(e);r.resolve(async function(e,t,n){var r;const i=I(e),{request:s,du:o}=function(e,t,n){const r=Ei(e,t),i={},s=[];let o=0;return n.forEach(e=>{const t="aggregate_"+o++;i[t]=e.alias,"count"===e.yt?s.push({alias:t,count:{}}):"avg"===e.yt?s.push({alias:t,avg:{field:Ni(e.fieldPath)}}):"sum"===e.yt&&s.push({alias:t,sum:{field:Ni(e.fieldPath)}})}),{request:{structuredAggregationQuery:{aggregations:s,structuredQuery:r.structuredQuery},parent:r.parent},du:i}}(i.serializer,An(t),n),a=s.parent;i.connection.po||delete s.parent;const c=(await i.vo("RunAggregationQuery",a,s,1)).filter(e=>!!e.result);w(1===c.length);const u=null===(r=c[0].result)||void 0===r?void 0:r.aggregateFields;return Object.keys(u).reduce((e,t)=>(e[o[t]]=u[t],e),{})}(i,t,n))}catch(e){r.reject(e)}}),r.promise}(r,e._query,i).then(t=>function(e,t,n){const r=new mh(e);return new Hu(t,r,n)} +/** + * @license + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */(n,e,t))}class Rh{constructor(e){this.kind="memory",this._onlineComponentProvider=new Uc,(null==e?void 0:e.garbageCollector)?this._offlineComponentProvider=e.garbageCollector._offlineComponentProvider:this._offlineComponentProvider=new Mc}toJSON(){return{kind:this.kind}}}class xh{constructor(e){let t;this.kind="persistent",(null==e?void 0:e.tabManager)?(e.tabManager._initialize(e),t=e.tabManager):(t=Bh(void 0),t._initialize(e)),this._onlineComponentProvider=t._onlineComponentProvider,this._offlineComponentProvider=t._offlineComponentProvider}toJSON(){return{kind:this.kind}}}class Ph{constructor(){this.kind="memoryEager",this._offlineComponentProvider=new Mc}toJSON(){return{kind:this.kind}}}class Lh{constructor(e){this.kind="memoryLru",this._offlineComponentProvider=new Fc(e)}toJSON(){return{kind:this.kind}}}function Mh(){return new Ph}function Fh(e){return new Lh(null==e?void 0:e.cacheSizeBytes)}function Vh(e){return new Rh(e)}function jh(e){return new xh(e)}class Uh{constructor(e){this.forceOwnership=e,this.kind="persistentSingleTab"}toJSON(){return{kind:this.kind}}_initialize(e){this._onlineComponentProvider=new Uc,this._offlineComponentProvider=new Vc(this._onlineComponentProvider,null==e?void 0:e.cacheSizeBytes,this.forceOwnership)}}class qh{constructor(){this.kind="PersistentMultipleTab"}toJSON(){return{kind:this.kind}}_initialize(e){this._onlineComponentProvider=new Uc,this._offlineComponentProvider=new jc(this._onlineComponentProvider,null==e?void 0:e.cacheSizeBytes)}}function Bh(e){return new Uh(null==e?void 0:e.forceOwnership)}function zh(){return new qh} +/** + * @license + * Copyright 2022 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */const Gh={maxAttempts:5}; /** * @license * Copyright 2020 Google LLC @@ -3910,7 +4408,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class gu{constructor(e,t){this._firestore=e,this._commitHandler=t,this._mutations=[],this._committed=!1,this._dataReader=vc(e)}set(e,t,n){this._verifyNotCommitted();const r=yu(e,this._firestore),i=pu(r.converter,t,n),s=wc(this._dataReader,"WriteBatch.set",r._key,i,null!==r.converter,n);return this._mutations.push(s.toMutation(r._key,Et.none())),this}update(e,t,n,...r){this._verifyNotCommitted();const i=yu(e,this._firestore);let s;return s="string"==typeof(t=Object(o.k)(t))||t instanceof ac?Ac(this._dataReader,"WriteBatch.update",i._key,t,n,r):Sc(this._dataReader,"WriteBatch.update",i._key,t),this._mutations.push(s.toMutation(i._key,Et.exists(!0))),this}delete(e){this._verifyNotCommitted();const t=yu(e,this._firestore);return this._mutations=this._mutations.concat(new Ft(t._key,Et.none())),this}commit(){return this._verifyNotCommitted(),this._committed=!0,this._mutations.length>0?this._commitHandler(this._mutations):Promise.resolve()}_verifyNotCommitted(){if(this._committed)throw new T(_.FAILED_PRECONDITION,"A write batch can no longer be used after commit() has been called.")}}function yu(e,t){if((e=Object(o.k)(e)).firestore!==t)throw new T(_.INVALID_ARGUMENT,"Provided document reference is from a different Firestore instance.");return e} + */class Kh{constructor(e,t){this._firestore=e,this._commitHandler=t,this._mutations=[],this._committed=!1,this._dataReader=ol(e)}set(e,t,n){this._verifyNotCommitted();const r=$h(e,this._firestore),i=nh(r.converter,t,n),s=al(this._dataReader,"WriteBatch.set",r._key,i,null!==r.converter,n);return this._mutations.push(s.toMutation(r._key,gr.none())),this}update(e,t,n,...r){this._verifyNotCommitted();const i=$h(e,this._firestore);let s;return s="string"==typeof(t=Object(o.p)(t))||t instanceof Yu?gl(this._dataReader,"WriteBatch.update",i._key,t,n,r):pl(this._dataReader,"WriteBatch.update",i._key,t),this._mutations.push(s.toMutation(i._key,gr.exists(!0))),this}delete(e){this._verifyNotCommitted();const t=$h(e,this._firestore);return this._mutations=this._mutations.concat(new Ar(t._key,gr.none())),this}commit(){return this._verifyNotCommitted(),this._committed=!0,this._mutations.length>0?this._commitHandler(this._mutations):Promise.resolve()}_verifyNotCommitted(){if(this._committed)throw new T(_.FAILED_PRECONDITION,"A write batch can no longer be used after commit() has been called.")}}function $h(e,t){if((e=Object(o.p)(e)).firestore!==t)throw new T(_.INVALID_ARGUMENT,"Provided document reference is from a different Firestore instance.");return e} /** * @license * Copyright 2020 Google LLC @@ -3942,7 +4440,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function vu(e){e=Na(e,Pa);const t=Na(e.firestore,Wa);return ya($a(t),e._key).then(n=>Ru(t,e,n))}class wu extends fu{constructor(e){super(),this.firestore=e}convertBytes(e){return new uc(e)}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return new Pa(this.firestore,null,t)}}function bu(e){e=Na(e,Pa);const t=Na(e.firestore,Wa),n=$a(t),r=new wu(t);return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){try{const r=await function(e,t){const n=I(e);return n.persistence.runTransaction("read document","readonly",e=>n.Wn.Rn(e,t))}(e,t);r.isFoundDocument()?n.resolve(r):r.isNoDocument()?n.resolve(null):n.reject(new T(_.UNAVAILABLE,"Failed to get document from cache. (However, this document may exist on the server. Run again without setting 'source' in the GetOptions to attempt to retrieve the document from the server.)"))}catch(e){const r=to(e,`Failed to get document '${t} from cache`);n.reject(r)}}(await fa(e),t,n)),n.promise}(n,e._key).then(n=>new Bc(t,r,e._key,n,new qc(null!==n&&n.hasLocalMutations,!0),e.converter))}function Iu(e){e=Na(e,Pa);const t=Na(e.firestore,Wa);return ya($a(t),e._key,{source:"server"}).then(n=>Ru(t,e,n))}function _u(e){e=Na(e,La);const t=Na(e.firestore,Wa),n=$a(t),r=new wu(t);return Hc(e._query),va(n,e._query).then(n=>new Kc(t,r,e,n))}function Tu(e){e=Na(e,La);const t=Na(e.firestore,Wa),n=$a(t),r=new wu(t);return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){try{const r=await Bi(e,t,!0),i=new bo(t,r.zn),s=i.bo(r.documents),o=i.applyChanges(s,!1);n.resolve(o.snapshot)}catch(e){const r=to(e,`Failed to execute query '${t} against cache`);n.reject(r)}}(await fa(e),t,n)),n.promise}(n,e._query).then(n=>new Kc(t,r,e,n))}function Eu(e){e=Na(e,La);const t=Na(e.firestore,Wa),n=$a(t),r=new wu(t);return va(n,e._query,{source:"server"}).then(n=>new Kc(t,r,e,n))}function ku(e,t,n){e=Na(e,Pa);const r=Na(e.firestore,Wa),i=pu(e.converter,t,n);return Du(r,[wc(vc(r),"setDoc",e._key,i,null!==e.converter,n).toMutation(e._key,Et.none())])}function Su(e,t,n,...r){e=Na(e,Pa);const i=Na(e.firestore,Wa),s=vc(i);let a;return a="string"==typeof(t=Object(o.k)(t))||t instanceof ac?Ac(s,"updateDoc",e._key,t,n,r):Sc(s,"updateDoc",e._key,t),Du(i,[a.toMutation(e._key,Et.exists(!0))])}function Au(e){return Du(Na(e.firestore,Wa),[new Ft(e._key,Et.none())])}function Nu(e,t){const n=Na(e.firestore,Wa),r=ja(e),i=pu(e.converter,t);return Du(n,[wc(vc(e.firestore),"addDoc",r._key,i,null!==e.converter,{}).toMutation(r._key,Et.exists(!1))]).then(()=>r)}function Ou(e,...t){var n,r,i;e=Object(o.k)(e);let s={includeMetadataChanges:!1},a=0;"object"!=typeof t[a]||Ba(t[a])||(s=t[a],a++);const c={includeMetadataChanges:s.includeMetadataChanges};if(Ba(t[a])){const e=t[a];t[a]=null===(n=e.next)||void 0===n?void 0:n.bind(e),t[a+1]=null===(r=e.error)||void 0===r?void 0:r.bind(e),t[a+2]=null===(i=e.complete)||void 0===i?void 0:i.bind(e)}let u,h,l;if(e instanceof Pa)h=Na(e.firestore,Wa),l=Ge(e._key.path),u={next:n=>{t[a]&&t[a](Ru(h,e,n))},error:t[a+1],complete:t[a+2]};else{const n=Na(e,La);h=Na(n.firestore,Wa),l=n._query;const r=new wu(h);u={next:e=>{t[a]&&t[a](new Kc(h,r,n,e))},error:t[a+1],complete:t[a+2]},Hc(e._query)}return function(e,t,n,r){const i=new ra(r),s=new fo(t,i,n);return e.asyncQueue.enqueueAndForget(async()=>ao(await ga(e),s)),()=>{i.na(),e.asyncQueue.enqueueAndForget(async()=>co(await ga(e),s))}}($a(h),l,c,u)}function Cu(e,t){return function(e,t){const n=new ra(t);return e.asyncQueue.enqueueAndForget(async()=>function(e,t){I(e).io.add(t),t.next()}(await ga(e),n)),()=>{n.na(),e.asyncQueue.enqueueAndForget(async()=>function(e,t){I(e).io.delete(t)}(await ga(e),n))}}($a(e=Na(e,Wa)),Ba(t)?t:{next:t})}function Du(e,t){return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>async function(e,t,n){const r=Yo(e);try{const e=await function(e,t){const n=I(e),r=V.now(),i=t.reduce((e,t)=>e.add(t.key),nn());let s;return n.persistence.runTransaction("Locally write mutations","readwrite",e=>n.Wn.vn(e,i).next(i=>{s=i;const o=[];for(const e of t){const t=Ot(e,s.get(e.key));null!=t&&o.push(new Pt(e.key,t,_e(t.value.mapValue),Et.exists(!0)))}return n.An.addMutationBatch(e,r,o,t)})).then(e=>(e.applyToLocalDocumentSet(s),{batchId:e.batchId,changes:s}))}(r.localStore,t);r.sharedClientState.addPendingMutation(e.batchId),function(e,t,n){let r=e.Ko[e.currentUser.toKey()];r||(r=new Kt(F)),r=r.insert(t,n),e.Ko[e.currentUser.toKey()]=r}(r,e.batchId,n),await Uo(r,e.changes),await Bs(r.remoteStore)}catch(e){const t=to(e,"Failed to persist write");n.reject(t)}}(await ma(e),t,n)),n.promise}($a(e),t)}function Ru(e,t,n){const r=n.docs.get(t._key),i=new wu(e);return new Bc(e,i,t._key,r,new qc(n.hasPendingWrites,n.fromCache),t.converter)} + */class Wh extends class{constructor(e,t){this._firestore=e,this._transaction=t,this._dataReader=ol(e)}get(e){const t=$h(e,this._firestore),n=new rh(this._firestore);return this._transaction.lookup([t._key]).then(e=>{if(!e||1!==e.length)return v();const r=e[0];if(r.isFoundDocument())return new kl(this._firestore,n,r.key,r,t.converter);if(r.isNoDocument())return new kl(this._firestore,n,t._key,null,t.converter);throw v()})}set(e,t,n){const r=$h(e,this._firestore),i=nh(r.converter,t,n),s=al(this._dataReader,"Transaction.set",r._key,i,null!==r.converter,n);return this._transaction.set(r._key,s),this}update(e,t,n,...r){const i=$h(e,this._firestore);let s;return s="string"==typeof(t=Object(o.p)(t))||t instanceof Yu?gl(this._dataReader,"Transaction.update",i._key,t,n,r):pl(this._dataReader,"Transaction.update",i._key,t),this._transaction.update(i._key,s),this}delete(e){const t=$h(e,this._firestore);return this._transaction.delete(t._key),this}}{constructor(e,t){super(e,t),this._firestore=e}get(e){const t=$h(e,this._firestore),n=new mh(this._firestore);return super.get(e).then(e=>new lh(this._firestore,n,t._key,e._document,new uh(!1,!1),t.converter))}}function Hh(e,t,n){e=pu(e,Ou);const r=Object.assign(Object.assign({},Gh),n);return function(e){if(e.maxAttempts<1)throw new T(_.INVALID_ARGUMENT,"Max attempts must be at least 1")}(r),function(e,t,n){const r=new E;return e.asyncQueue.enqueueAndForget(async()=>{const i=await nu(e);new Kc(e.asyncQueue,i,n,t,r).run()}),r.promise}(Pu(e),n=>t(new Wh(e,n)),r)} /** * @license * Copyright 2020 Google LLC @@ -3958,7 +4456,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class Pu extends class{constructor(e,t){this._firestore=e,this._transaction=t,this._dataReader=vc(e)}get(e){const t=yu(e,this._firestore),n=new mu(this._firestore);return this._transaction.lookup([t._key]).then(e=>{if(!e||1!==e.length)return v();const r=e[0];if(r.isFoundDocument())return new jc(this._firestore,n,r.key,r,t.converter);if(r.isNoDocument())return new jc(this._firestore,n,t._key,null,t.converter);throw v()})}set(e,t,n){const r=yu(e,this._firestore),i=pu(r.converter,t,n),s=wc(this._dataReader,"Transaction.set",r._key,i,null!==r.converter,n);return this._transaction.set(r._key,s),this}update(e,t,n,...r){const i=yu(e,this._firestore);let s;return s="string"==typeof(t=Object(o.k)(t))||t instanceof ac?Ac(this._dataReader,"Transaction.update",i._key,t,n,r):Sc(this._dataReader,"Transaction.update",i._key,t),this._transaction.update(i._key,s),this}delete(e){const t=yu(e,this._firestore);return this._transaction.delete(t._key),this}}{constructor(e,t){super(e,t),this._firestore=e}get(e){const t=yu(e,this._firestore),n=new wu(this._firestore);return super.get(e).then(e=>new Bc(this._firestore,n,t._key,e._document,new qc(!1,!1),t.converter))}}function Lu(e,t){return function(e,t){const n=new E;return e.asyncQueue.enqueueAndForget(async()=>{const r=await function(e){return la(e).then(e=>e.datastore)}(e);new oa(e.asyncQueue,r,t,n).run()}),n.promise}($a(e=Na(e,Wa)),n=>t(new Pu(e,n)))} + */function Qh(){return new cl("deleteField")}function Yh(){return new ll("serverTimestamp")}function Jh(...e){return new hl("arrayUnion",e)}function Xh(...e){return new dl("arrayRemove",e)}function Zh(e){return new fl("increment",e)} /** * @license * Copyright 2020 Google LLC @@ -3974,10 +4472,10 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function xu(){return new bc("deleteField")}function Mu(){return new _c("serverTimestamp")}function Fu(...e){return new Tc("arrayUnion",e)}function ju(...e){return new Ec("arrayRemove",e)}function Uu(e){return new kc("increment",e)} + */function ed(e){return Pu(e=pu(e,Ou)),new Kh(e,t=>Ah(e,t)) /** * @license - * Copyright 2020 Google LLC + * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -3990,7 +4488,40 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function Vu(e){return $a(e=Na(e,Wa)),new gu(e,t=>Du(e,t))}!function(e,t=!0){!function(e){h=e}(r.SDK_VERSION),Object(r._registerComponent)(new i.a("firestore",(e,{options:n})=>{const r=e.getProvider("app").getImmediate(),i=new Wa(r,new N(e.getProvider("auth-internal")),new R(e.getProvider("app-check-internal")));return n=Object.assign({useFetchStreams:t},n),i._setSettings(n),i},"PUBLIC")),Object(r.registerVersion)(c,"3.4.1",e),Object(r.registerVersion)(c,"3.4.1","esm2017")}()}).call(this,n(18))},function(e,t,n){"use strict";n.r(t),n.d(t,"SDK_VERSION",(function(){return _})),n.d(t,"_DEFAULT_ENTRY_NAME",(function(){return u})),n.d(t,"_addComponent",(function(){return f})),n.d(t,"_addOrOverwriteComponent",(function(){return p})),n.d(t,"_apps",(function(){return l})),n.d(t,"_clearComponents",(function(){return v})),n.d(t,"_components",(function(){return d})),n.d(t,"_getProvider",(function(){return g})),n.d(t,"_registerComponent",(function(){return m})),n.d(t,"_removeServiceInstance",(function(){return y})),n.d(t,"deleteApp",(function(){return S})),n.d(t,"getApp",(function(){return E})),n.d(t,"getApps",(function(){return k})),n.d(t,"initializeApp",(function(){return T})),n.d(t,"onLog",(function(){return N})),n.d(t,"registerVersion",(function(){return A})),n.d(t,"setLogLevel",(function(){return O}));var r=n(5),i=n(4),s=n(0);n.d(t,"FirebaseError",(function(){return s.c})); + */}function td(e,t){var n;const r=Pu(e=pu(e,Ou));if(!r._uninitializedComponentsProvider||"memory"===(null===(n=r._uninitializedComponentsProvider)||void 0===n?void 0:n._offlineKind))return m("Cannot enable indexes when persistence is disabled"),Promise.resolve();const i=function(e){const t="string"==typeof e?function(e){try{return JSON.parse(e)}catch(e){throw new T(_.INVALID_ARGUMENT,"Failed to parse JSON: "+(null==e?void 0:e.message))}}(e):e,n=[];if(Array.isArray(t.indexes))for(const e of t.indexes){const t=nd(e,"collectionGroup"),r=[];if(Array.isArray(e.fields))for(const t of e.fields){const e=Tl("setIndexConfiguration",nd(t,"fieldPath"));"CONTAINS"===t.arrayConfig?r.push(new Y(e,2)):"ASCENDING"===t.order?r.push(new Y(e,0)):"DESCENDING"===t.order&&r.push(new Y(e,1))}n.push(new $($.UNKNOWN_ID,t,r,X.empty()))}return n}(t);return function(e,t){return e.asyncQueue.enqueue(async()=>async function(e,t){const n=I(e),r=n.indexManager,i=[];return n.persistence.runTransaction("Configure indexes","readwrite",e=>r.getFieldIndexes(e).next(n=> +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +function(e,t,n,r,i){e=[...e],t=[...t],e.sort(n),t.sort(n);const s=e.length,o=t.length;let a=0,c=0;for(;a0?r(t[a++]):(a++,c++)}for(;a{i.push(r.addFieldIndex(e,t))},t=>{i.push(r.deleteFieldIndex(e,t))})).next(()=>oe.waitFor(i)))} +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */(await Zc(e),t))}(r,i)}function nd(e,t){if("string"!=typeof e[t])throw new T(_.INVALID_ARGUMENT,"Missing string value for: "+t);return e[t]}!function(e,t=!0){!function(e){l=e}(r.SDK_VERSION),Object(r._registerComponent)(new i.a("firestore",(e,{instanceIdentifier:n,options:r})=>{const i=e.getProvider("app").getImmediate(),s=new Ou(new A(e.getProvider("auth-internal")),new R(e.getProvider("app-check-internal")),function(e,t){if(!Object.prototype.hasOwnProperty.apply(e.options,["projectId"]))throw new T(_.INVALID_ARGUMENT,'"projectId" not provided in firebase.initializeApp.');return new vt(e.options.projectId,t)}(i,n),i);return r=Object.assign({useFetchStreams:t},r),s._setSettings(r),s},"PUBLIC").setMultipleInstances(!0)),Object(r.registerVersion)(c,"3.13.0",e),Object(r.registerVersion)(c,"3.13.0","esm2017")}()}).call(this,n(11))},function(e,t,n){"use strict";n.r(t),n.d(t,"FirebaseError",(function(){return s.c})),n.d(t,"SDK_VERSION",(function(){return V})),n.d(t,"_DEFAULT_ENTRY_NAME",(function(){return S})),n.d(t,"_addComponent",(function(){return N})),n.d(t,"_addOrOverwriteComponent",(function(){return D})),n.d(t,"_apps",(function(){return C})),n.d(t,"_clearComponents",(function(){return P})),n.d(t,"_components",(function(){return A})),n.d(t,"_getProvider",(function(){return R})),n.d(t,"_registerComponent",(function(){return O})),n.d(t,"_removeServiceInstance",(function(){return x})),n.d(t,"deleteApp",(function(){return B})),n.d(t,"getApp",(function(){return U})),n.d(t,"getApps",(function(){return q})),n.d(t,"initializeApp",(function(){return j})),n.d(t,"onLog",(function(){return G})),n.d(t,"registerVersion",(function(){return z})),n.d(t,"setLogLevel",(function(){return K}));var r=n(6),i=n(5),s=n(0);let o,a;const c=new WeakMap,u=new WeakMap,l=new WeakMap,h=new WeakMap,d=new WeakMap;let f={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return u.get(e);if("objectStoreNames"===t)return e.objectStoreNames||l.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return m(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function p(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(a||(a=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(y(this),t),m(c.get(this))}:function(...t){return m(e.apply(y(this),t))}:function(t,...n){const r=e.call(y(this),t,...n);return l.set(r,t.sort?t.sort():[t]),m(r)}}function g(e){return"function"==typeof e?p(e):(e instanceof IDBTransaction&&function(e){if(u.has(e))return;const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("complete",i),e.removeEventListener("error",s),e.removeEventListener("abort",s)},i=()=>{t(),r()},s=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",i),e.addEventListener("error",s),e.addEventListener("abort",s)});u.set(e,t)}(e),t=e,(o||(o=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some(e=>t instanceof e)?new Proxy(e,f):e);var t}function m(e){if(e instanceof IDBRequest)return function(e){const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("success",i),e.removeEventListener("error",s)},i=()=>{t(m(e.result)),r()},s=()=>{n(e.error),r()};e.addEventListener("success",i),e.addEventListener("error",s)});return t.then(t=>{t instanceof IDBCursor&&c.set(t,e)}).catch(()=>{}),d.set(t,e),t}(e);if(h.has(e))return h.get(e);const t=g(e);return t!==e&&(h.set(e,t),d.set(t,e)),t}const y=e=>d.get(e);const v=["get","getKey","getAll","getAllKeys","count"],w=["put","add","delete","clear"],b=new Map;function I(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(b.get(t))return b.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,i=w.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!i&&!v.includes(n))return;const s=async function(e,...t){const s=this.transaction(e,i?"readwrite":"readonly");let o=s.store;return r&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),i&&s.done]))[0]};return b.set(t,s),s}f=(e=>({...e,get:(t,n,r)=>I(t,n)||e.get(t,n,r),has:(t,n)=>!!I(t,n)||e.has(t,n)}))(f); /** * @license * Copyright 2019 Google LLC @@ -4007,7 +4538,7 @@ class Ht{constructor(e){this.comparator=e,this.data=new Kt(this.comparator)}has( * See the License for the specific language governing permissions and * limitations under the License. */ -class o{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map(e=>{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null}).filter(e=>e).join(" ")}}const a="@firebase/app",c=new i.b("@firebase/app"),u="[DEFAULT]",h={[a]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},l=new Map,d=new Map;function f(e,t){try{e.container.addComponent(t)}catch(n){c.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,n)}}function p(e,t){e.container.addOrOverwriteComponent(t)}function m(e){const t=e.name;if(d.has(t))return c.debug(`There were multiple attempts to register component ${t}.`),!1;d.set(t,e);for(const t of l.values())f(t,e);return!0}function g(e,t){return e.container.getProvider(t)}function y(e,t,n=u){g(e,t).clearInstance(n)}function v(){d.clear()} +class _{constructor(e){this.container=e}getPlatformInfoString(){return this.container.getProviders().map(e=>{if(function(e){const t=e.getComponent();return"VERSION"===(null==t?void 0:t.type)}(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null}).filter(e=>e).join(" ")}}const T="@firebase/app",E=new i.b("@firebase/app"),S="[DEFAULT]",k={[T]:"fire-core","@firebase/app-compat":"fire-core-compat","@firebase/analytics":"fire-analytics","@firebase/analytics-compat":"fire-analytics-compat","@firebase/app-check":"fire-app-check","@firebase/app-check-compat":"fire-app-check-compat","@firebase/auth":"fire-auth","@firebase/auth-compat":"fire-auth-compat","@firebase/database":"fire-rtdb","@firebase/database-compat":"fire-rtdb-compat","@firebase/functions":"fire-fn","@firebase/functions-compat":"fire-fn-compat","@firebase/installations":"fire-iid","@firebase/installations-compat":"fire-iid-compat","@firebase/messaging":"fire-fcm","@firebase/messaging-compat":"fire-fcm-compat","@firebase/performance":"fire-perf","@firebase/performance-compat":"fire-perf-compat","@firebase/remote-config":"fire-rc","@firebase/remote-config-compat":"fire-rc-compat","@firebase/storage":"fire-gcs","@firebase/storage-compat":"fire-gcs-compat","@firebase/firestore":"fire-fst","@firebase/firestore-compat":"fire-fst-compat","fire-js":"fire-js",firebase:"fire-js-all"},C=new Map,A=new Map;function N(e,t){try{e.container.addComponent(t)}catch(n){E.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,n)}}function D(e,t){e.container.addOrOverwriteComponent(t)}function O(e){const t=e.name;if(A.has(t))return E.debug(`There were multiple attempts to register component ${t}.`),!1;A.set(t,e);for(const t of C.values())N(t,e);return!0}function R(e,t){const n=e.container.getProvider("heartbeat").getImmediate({optional:!0});return n&&n.triggerHeartbeat(),e.container.getProvider(t)}function x(e,t,n=S){R(e,t).clearInstance(n)}function P(){A.clear()} /** * @license * Copyright 2019 Google LLC @@ -4023,7 +4554,7 @@ class o{constructor(e){this.container=e}getPlatformInfoString(){return this.cont * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const w={"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function."},b=new s.b("app","Firebase",w); + */const L={"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}","duplicate-app":"Firebase App named '{$appName}' already exists with different options or config","app-deleted":"Firebase App named '{$appName}' already deleted","no-options":"Need to provide options, when not being deployed to hosting via source.","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.","invalid-log-argument":"First argument to `onLog` must be null or a function.","idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.","idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.","idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.","idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}."},M=new s.b("app","Firebase",L); /** * @license * Copyright 2019 Google LLC @@ -4040,7 +4571,7 @@ class o{constructor(e){this.container=e}getPlatformInfoString(){return this.cont * See the License for the specific language governing permissions and * limitations under the License. */ -class I{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=n,this.container.addComponent(new r.a("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw b.create("app-deleted",{appName:this._name})}} +class F{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e),this._config=Object.assign({},t),this._name=t.name,this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled,this._container=n,this.container.addComponent(new r.a("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){return this.checkDestroyed(),this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed(),this._automaticDataCollectionEnabled=e}get name(){return this.checkDestroyed(),this._name}get options(){return this.checkDestroyed(),this._options}get config(){return this.checkDestroyed(),this._config}get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){if(this.isDeleted)throw M.create("app-deleted",{appName:this._name})}} /** * @license * Copyright 2019 Google LLC @@ -4056,7 +4587,39 @@ class I{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e), * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const _="9.6.1";function T(e,t={}){if("object"!=typeof t){t={name:t}}const n=Object.assign({name:u,automaticDataCollectionEnabled:!1},t),i=n.name;if("string"!=typeof i||!i)throw b.create("bad-app-name",{appName:String(i)});const o=l.get(i);if(o){if(Object(s.h)(e,o.options)&&Object(s.h)(n,o.config))return o;throw b.create("duplicate-app",{appName:i})}const a=new r.b(i);for(const e of d.values())a.addComponent(e);const c=new I(e,n,a);return l.set(i,c),c}function E(e=u){const t=l.get(e);if(!t)throw b.create("no-app",{appName:e});return t}function k(){return Array.from(l.values())}async function S(e){const t=e.name;l.has(t)&&(l.delete(t),await Promise.all(e.container.getProviders().map(e=>e.delete())),e.isDeleted=!0)}function A(e,t,n){var i;let s=null!==(i=h[e])&&void 0!==i?i:e;n&&(s+="-"+n);const o=s.match(/\s|\//),a=t.match(/\s|\//);if(o||a){const e=[`Unable to register library "${s}" with version "${t}":`];return o&&e.push(`library name "${s}" contains illegal characters (whitespace or "/")`),o&&a&&e.push("and"),a&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void c.warn(e.join(" "))}m(new r.a(s+"-version",()=>({library:s,version:t}),"VERSION"))}function N(e,t){if(null!==e&&"function"!=typeof e)throw b.create("invalid-log-argument");Object(i.d)(e,t)}function O(e){Object(i.c)(e)} + */const V="9.23.0";function j(e,t={}){let n=e;if("object"!=typeof t){t={name:t}}const i=Object.assign({name:S,automaticDataCollectionEnabled:!1},t),o=i.name;if("string"!=typeof o||!o)throw M.create("bad-app-name",{appName:String(o)});if(n||(n=Object(s.l)()),!n)throw M.create("no-options");const a=C.get(o);if(a){if(Object(s.i)(n,a.options)&&Object(s.i)(i,a.config))return a;throw M.create("duplicate-app",{appName:o})}const c=new r.b(o);for(const e of A.values())c.addComponent(e);const u=new F(n,i,c);return C.set(o,u),u}function U(e=S){const t=C.get(e);if(!t&&e===S&&Object(s.l)())return j();if(!t)throw M.create("no-app",{appName:e});return t}function q(){return Array.from(C.values())}async function B(e){const t=e.name;C.has(t)&&(C.delete(t),await Promise.all(e.container.getProviders().map(e=>e.delete())),e.isDeleted=!0)}function z(e,t,n){var i;let s=null!==(i=k[e])&&void 0!==i?i:e;n&&(s+="-"+n);const o=s.match(/\s|\//),a=t.match(/\s|\//);if(o||a){const e=[`Unable to register library "${s}" with version "${t}":`];return o&&e.push(`library name "${s}" contains illegal characters (whitespace or "/")`),o&&a&&e.push("and"),a&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`),void E.warn(e.join(" "))}O(new r.a(s+"-version",()=>({library:s,version:t}),"VERSION"))}function G(e,t){if(null!==e&&"function"!=typeof e)throw M.create("invalid-log-argument");Object(i.d)(e,t)}function K(e){Object(i.c)(e)} +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */const $="firebase-heartbeat-store";let W=null;function H(){return W||(W=function(e,t,{blocked:n,upgrade:r,blocking:i,terminated:s}={}){const o=indexedDB.open(e,t),a=m(o);return r&&o.addEventListener("upgradeneeded",e=>{r(m(o.result),e.oldVersion,e.newVersion,m(o.transaction),e)}),n&&o.addEventListener("blocked",e=>n(e.oldVersion,e.newVersion,e)),a.then(e=>{s&&e.addEventListener("close",()=>s()),i&&e.addEventListener("versionchange",e=>i(e.oldVersion,e.newVersion,e))}).catch(()=>{}),a}("firebase-heartbeat-database",1,{upgrade:(e,t)=>{switch(t){case 0:e.createObjectStore($)}}}).catch(e=>{throw M.create("idb-open",{originalErrorMessage:e.message})})),W}async function Q(e,t){try{const n=(await H()).transaction($,"readwrite"),r=n.objectStore($);await r.put(t,Y(e)),await n.done}catch(e){if(e instanceof s.c)E.warn(e.message);else{const t=M.create("idb-set",{originalErrorMessage:null==e?void 0:e.message});E.warn(t.message)}}}function Y(e){return`${e.name}!${e.options.appId}`} +/** + * @license + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */class J{constructor(e){this.container=e,this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new Z(t),this._heartbeatsCachePromise=this._storage.read().then(e=>(this._heartbeatsCache=e,e))}async triggerHeartbeat(){const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=X();if(null===this._heartbeatsCache&&(this._heartbeatsCache=await this._heartbeatsCachePromise),this._heartbeatsCache.lastSentHeartbeatDate!==t&&!this._heartbeatsCache.heartbeats.some(e=>e.date===t))return this._heartbeatsCache.heartbeats.push({date:t,agent:e}),this._heartbeatsCache.heartbeats=this._heartbeatsCache.heartbeats.filter(e=>{const t=new Date(e.date).valueOf();return Date.now()-t<=2592e6}),this._storage.overwrite(this._heartbeatsCache)}async getHeartbeatsHeader(){if(null===this._heartbeatsCache&&await this._heartbeatsCachePromise,null===this._heartbeatsCache||0===this._heartbeatsCache.heartbeats.length)return"";const e=X(),{heartbeatsToSend:t,unsentEntries:n}=function(e,t=1024){const n=[];let r=e.slice();for(const i of e){const e=n.find(e=>e.agent===i.agent);if(e){if(e.dates.push(i.date),ee(n)>t){e.dates.pop();break}}else if(n.push({agent:i.agent,dates:[i.date]}),ee(n)>t){n.pop();break}r=r.slice(1)}return{heartbeatsToSend:n,unsentEntries:r}}(this._heartbeatsCache.heartbeats),r=Object(s.e)(JSON.stringify({version:2,heartbeats:t}));return this._heartbeatsCache.lastSentHeartbeatDate=e,n.length>0?(this._heartbeatsCache.heartbeats=n,await this._storage.overwrite(this._heartbeatsCache)):(this._heartbeatsCache.heartbeats=[],this._storage.overwrite(this._heartbeatsCache)),r}}function X(){return(new Date).toISOString().substring(0,10)}class Z{constructor(e){this.app=e,this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}async runIndexedDBEnvironmentCheck(){return!!Object(s.v)()&&Object(s.C)().then(()=>!0).catch(()=>!1)}async read(){if(await this._canUseIndexedDBPromise){return await async function(e){try{const t=await H();return await t.transaction($).objectStore($).get(Y(e))}catch(e){if(e instanceof s.c)E.warn(e.message);else{const t=M.create("idb-get",{originalErrorMessage:null==e?void 0:e.message});E.warn(t.message)}}}(this.app)||{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){var t;if(await this._canUseIndexedDBPromise){const n=await this.read();return Q(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:n.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){var t;if(await this._canUseIndexedDBPromise){const n=await this.read();return Q(this.app,{lastSentHeartbeatDate:null!==(t=e.lastSentHeartbeatDate)&&void 0!==t?t:n.lastSentHeartbeatDate,heartbeats:[...n.heartbeats,...e.heartbeats]})}}}function ee(e){return Object(s.e)(JSON.stringify({version:2,heartbeats:e})).length} /** * @license * Copyright 2019 Google LLC @@ -4072,7 +4635,7 @@ class I{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e), * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */var C;C="",m(new r.a("platform-logger",e=>new o(e),"PRIVATE")),A(a,"0.7.11",C),A(a,"0.7.11","esm2017"),A("fire-js","")},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return h})),n.d(t,"d",(function(){return l})); + */var te;te="",O(new r.a("platform-logger",e=>new _(e),"PRIVATE")),O(new r.a("heartbeat",e=>new J(e),"PRIVATE")),z(T,"0.9.13",te),z(T,"0.9.13","esm2017"),z("fire-js","")},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return lr})),n.d(t,"b",(function(){return dr})),n.d(t,"c",(function(){return hr})),n.d(t,"d",(function(){return pr})),n.d(t,"e",(function(){return vr})),n.d(t,"f",(function(){return yr})),n.d(t,"g",(function(){return fr})),n.d(t,"h",(function(){return gr})),n.d(t,"i",(function(){return mr})),n.d(t,"j",(function(){return cr})),n.d(t,"k",(function(){return ur}));var r,i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},s={},o=o||{},a=i||self;function c(e){var t=typeof e;return"array"==(t="object"!=t?t:e?Array.isArray(e)?"array":t:"null")||"object"==t&&"number"==typeof e.length}function u(e){var t=typeof e;return"object"==t&&null!=e||"function"==t}var l="closure_uid_"+(1e9*Math.random()>>>0),h=0;function d(e,t,n){return e.call.apply(e.bind,arguments)}function f(e,t,n){if(!e)throw Error();if(2{},t),a.removeEventListener("test",()=>{},t)}catch(e){}return e}();function T(e){return/^[\s\xa0]*$/.test(e)}function E(){var e=a.navigator;return e&&(e=e.userAgent)?e:""}function S(e){return-1!=E().indexOf(e)}function k(e){return k[" "](e),e}k[" "]=function(){};var C,A,N,D=S("Opera"),O=S("Trident")||S("MSIE"),R=S("Edge"),x=R||O,P=S("Gecko")&&!(-1!=E().toLowerCase().indexOf("webkit")&&!S("Edge"))&&!(S("Trident")||S("MSIE"))&&!S("Edge"),L=-1!=E().toLowerCase().indexOf("webkit")&&!S("Edge");function M(){var e=a.document;return e?e.documentMode:void 0}e:{var F="",V=(A=E(),P?/rv:([^\);]+)(\)|;)/.exec(A):R?/Edge\/([\d\.]+)/.exec(A):O?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(A):L?/WebKit\/(\S+)/.exec(A):D?/(?:Version)[ \/]?(\S+)/.exec(A):void 0);if(V&&(F=V?V[1]:""),O){var j=M();if(null!=j&&j>parseFloat(F)){C=String(j);break e}}C=F}if(a.document&&O){var U=M();N=U||(parseInt(C,10)||void 0)}else N=void 0;var q=N;function B(e,t){if(I.call(this,e?e.type:""),this.relatedTarget=this.g=this.target=null,this.button=this.screenY=this.screenX=this.clientY=this.clientX=0,this.key="",this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1,this.state=null,this.pointerId=0,this.pointerType="",this.i=null,e){var n=this.type=e.type,r=e.changedTouches&&e.changedTouches.length?e.changedTouches[0]:null;if(this.target=e.target||e.srcElement,this.g=t,t=e.relatedTarget){if(P){e:{try{k(t.nodeName);var i=!0;break e}catch(e){}i=!1}i||(t=null)}}else"mouseover"==n?t=e.fromElement:"mouseout"==n&&(t=e.toElement);this.relatedTarget=t,r?(this.clientX=void 0!==r.clientX?r.clientX:r.pageX,this.clientY=void 0!==r.clientY?r.clientY:r.pageY,this.screenX=r.screenX||0,this.screenY=r.screenY||0):(this.clientX=void 0!==e.clientX?e.clientX:e.pageX,this.clientY=void 0!==e.clientY?e.clientY:e.pageY,this.screenX=e.screenX||0,this.screenY=e.screenY||0),this.button=e.button,this.key=e.key||"",this.ctrlKey=e.ctrlKey,this.altKey=e.altKey,this.shiftKey=e.shiftKey,this.metaKey=e.metaKey,this.pointerId=e.pointerId||0,this.pointerType="string"==typeof e.pointerType?e.pointerType:z[e.pointerType]||"",this.state=e.state,this.i=e,e.defaultPrevented&&B.$.h.call(this)}}m(B,I);var z={2:"touch",3:"pen",4:"mouse"};B.prototype.h=function(){B.$.h.call(this);var e=this.i;e.preventDefault?e.preventDefault():e.returnValue=!1};var G="closure_listenable_"+(1e6*Math.random()|0),K=0;function $(e,t,n,r,i){this.listener=e,this.proxy=null,this.src=t,this.type=n,this.capture=!!r,this.la=i,this.key=++K,this.fa=this.ia=!1}function W(e){e.fa=!0,e.listener=null,e.proxy=null,e.src=null,e.la=null}function H(e,t,n){for(const r in e)t.call(n,e[r],r,e)}function Q(e){const t={};for(const n in e)t[n]=e[n];return t}const Y="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function J(e,t){let n,r;for(let t=1;t>>0);function le(e){return"function"==typeof e?e:(e[ue]||(e[ue]=function(t){return e.handleEvent(t)}),e[ue])}function he(){y.call(this),this.i=new X(this),this.S=this,this.J=null}function de(e,t){var n,r=e.J;if(r)for(n=[];r;r=r.J)n.push(r);if(e=e.S,r=t.type||t,"string"==typeof t)t=new I(t,e);else if(t instanceof I)t.target=t.target||e;else{var i=t;J(t=new I(r,e),i)}if(i=!0,n)for(var s=n.length-1;0<=s;s--){var o=t.g=n[s];i=fe(o,r,!0,t)&&i}if(i=fe(o=t.g=e,r,!0,t)&&i,i=fe(o,r,!1,t)&&i,n)for(s=0;snew ye,e=>e.reset());class ye{constructor(){this.next=this.g=this.h=null}set(e,t){this.h=e,this.g=t,this.next=null}reset(){this.next=this.g=this.h=null}}function ve(e){var t=1;e=e.split(":");const n=[];for(;0{throw e},0)}let be,Ie=!1,_e=new class{constructor(){this.h=this.g=null}add(e,t){const n=me.get();n.set(e,t),this.h?this.h.next=n:this.g=n,this.h=n}},Te=()=>{const e=a.Promise.resolve(void 0);be=()=>{e.then(Ee)}};var Ee=()=>{for(var e;e=ge();){try{e.h.call(e.g)}catch(e){we(e)}var t=me;t.j(e),100>t.h&&(t.h++,e.next=t.g,t.g=e)}Ie=!1};function Se(e,t){he.call(this),this.h=e||1,this.g=t||a,this.j=p(this.qb,this),this.l=Date.now()}function ke(e){e.ga=!1,e.T&&(e.g.clearTimeout(e.T),e.T=null)}function Ce(e,t,n){if("function"==typeof e)n&&(e=p(e,n));else{if(!e||"function"!=typeof e.handleEvent)throw Error("Invalid listener argument");e=p(e.handleEvent,e)}return 2147483647{t.g=null,t.i&&(t.i=!1,e(t))},t.j);const n=t.h;t.h=null,t.m.apply(null,n)}(this)}N(){super.N(),this.g&&(a.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null)}}function Ne(e){y.call(this),this.h=e,this.g={}}m(Ne,y);var De=[];function Oe(e,t,n,r){Array.isArray(n)||(n&&(De[0]=n.toString()),n=De);for(var i=0;ir.length)){var i=r[1];if(Array.isArray(i)&&!(1>i.length)){var s=i[0];if("noop"!=s&&"stop"!=s&&"close"!=s)for(var o=1;ot.length?it:(t=t.slice(r,r+n),e.C=r+n,t))}function lt(e){e.Y=Date.now()+e.P,ht(e,e.P)}function ht(e,t){if(null!=e.B)throw Error("WatchDog timer not null");e.B=ze(p(e.lb,e),t)}function dt(e){e.B&&(a.clearTimeout(e.B),e.B=null)}function ft(e){0==e.l.H||e.J||On(e.l,e)}function pt(e){dt(e);var t=e.M;t&&"function"==typeof t.sa&&t.sa(),e.M=null,ke(e.V),Re(e.U),e.g&&(t=e.g,e.g=null,t.abort(),t.sa())}function gt(e,t){try{var n=e.l;if(0!=n.H&&(n.g==e||zt(n.i,e)))if(!e.K&&zt(n.i,e)&&3==n.H){try{var r=n.Ja.g.parse(t)}catch(e){r=null}if(Array.isArray(r)&&3==r.length){var i=r;if(0==i[0]){e:if(!n.u){if(n.g){if(!(n.g.G+3e3i[2]&&n.G&&0==n.A&&!n.v&&(n.v=ze(p(n.ib,n),6e3));if(1>=Bt(n.i)&&n.oa){try{n.oa()}catch(e){}n.oa=void 0}}else xn(n,11)}else if((e.K||n.g==e)&&Dn(n),!T(t))for(i=n.Ja.g.parse(t),t=0;th)&&(3!=h||x||this.g&&(this.h.h||this.g.ja()||pn(this.g)))){this.J||4!=h||7==t||je(),dt(this);var n=this.g.da();this.ca=n;t:if(at(this)){var r=pn(this.g);e="";var i=r.length,s=4==fn(this.g);if(!this.h.i){if("undefined"==typeof TextDecoder){pt(this),ft(this);var o="";break t}this.h.i=new a.TextDecoder}for(t=0;tt)throw Error("Bad port number "+t);e.m=t}else e.m=null}function _t(e,t,n){t instanceof xt?(e.i=t,function(e,t){t&&!e.j&&(Pt(e),e.i=null,e.g.forEach((function(e,t){var n=t.toLowerCase();t!=n&&(Lt(this,t),Ft(this,n,e))}),e)),e.j=t}(e.i,e.h)):(n||(t=kt(t,Ot)),e.i=new xt(t,e.h))}function Tt(e,t,n){e.i.set(t,n)}function Et(e){return Tt(e,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)),e}function St(e,t){return e?t?decodeURI(e.replace(/%25/g,"%2525")):decodeURIComponent(e):""}function kt(e,t,n){return"string"==typeof e?(e=encodeURI(e).replace(t,Ct),n&&(e=e.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),e):null}function Ct(e){return"%"+((e=e.charCodeAt(0))>>4&15).toString(16)+(15&e).toString(16)}vt.prototype.toString=function(){var e=[],t=this.j;t&&e.push(kt(t,At,!0),":");var n=this.g;return(n||"file"==t)&&(e.push("//"),(t=this.s)&&e.push(kt(t,At,!0),"@"),e.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&e.push(":",String(n))),(n=this.l)&&(this.g&&"/"!=n.charAt(0)&&e.push("/"),e.push(kt(n,"/"==n.charAt(0)?Dt:Nt,!0))),(n=this.i.toString())&&e.push("?",n),(n=this.o)&&e.push("#",kt(n,Rt)),e.join("")};var At=/[#\/\?@]/g,Nt=/[#\?:]/g,Dt=/[#\?]/g,Ot=/[#\?@]/g,Rt=/#/g;function xt(e,t){this.h=this.g=null,this.i=e||null,this.j=!!t}function Pt(e){e.g||(e.g=new Map,e.h=0,e.i&&function(e,t){if(e){e=e.split("&");for(var n=0;n=e.j}function Bt(e){return e.h?1:e.g?e.g.size:0}function zt(e,t){return e.h?e.h==t:!!e.g&&e.g.has(t)}function Gt(e,t){e.g?e.g.add(t):e.h=t}function Kt(e,t){e.h&&e.h==t?e.h=null:e.g&&e.g.has(t)&&e.g.delete(t)}function $t(e){if(null!=e.h)return e.i.concat(e.h.F);if(null!=e.g&&0!==e.g.size){let t=e.i;for(const n of e.g.values())t=t.concat(n.F);return t}return w(e.i)}jt.prototype.cancel=function(){if(this.i=$t(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const e of this.g.values())e.cancel();this.g.clear()}};function Wt(){this.g=new class{stringify(e){return a.JSON.stringify(e,void 0)}parse(e){return a.JSON.parse(e,void 0)}}}function Ht(e,t,n){const r=n||"";try{mt(e,(function(e,n){let i=e;u(e)&&(i=pe(e)),t.push(r+n+"="+encodeURIComponent(i))}))}catch(e){throw t.push(r+"type="+encodeURIComponent("_badmap")),e}}function Qt(e,t,n,r,i){try{t.onload=null,t.onerror=null,t.onabort=null,t.ontimeout=null,i(r)}catch(e){}}function Yt(e){this.l=e.fc||null,this.j=e.ob||!1}function Jt(e,t){he.call(this),this.F=e,this.u=t,this.m=void 0,this.readyState=Xt,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}m(Yt,$e),Yt.prototype.g=function(){return new Jt(this.l,this.j)},Yt.prototype.i=function(e){return function(){return e}}({}),m(Jt,he);var Xt=0;function Zt(e){e.j.read().then(e.Xa.bind(e)).catch(e.ka.bind(e))}function en(e){e.readyState=4,e.l=null,e.j=null,e.A=null,tn(e)}function tn(e){e.onreadystatechange&&e.onreadystatechange.call(e)}(r=Jt.prototype).open=function(e,t){if(this.readyState!=Xt)throw this.abort(),Error("Error reopening a connection");this.C=e,this.B=t,this.readyState=1,tn(this)},r.send=function(e){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;const t={headers:this.v,method:this.C,credentials:this.m,cache:void 0};e&&(t.body=e),(this.F||a).fetch(new Request(this.B,t)).then(this.$a.bind(this),this.ka.bind(this))},r.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted.").catch(()=>{}),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,en(this)),this.readyState=Xt},r.$a=function(e){if(this.g&&(this.l=e,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=e.headers,this.readyState=2,tn(this)),this.g&&(this.readyState=3,tn(this),this.g)))if("arraybuffer"===this.responseType)e.arrayBuffer().then(this.Ya.bind(this),this.ka.bind(this));else if(void 0!==a.ReadableStream&&"body"in e){if(this.j=e.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;Zt(this)}else e.text().then(this.Za.bind(this),this.ka.bind(this))},r.Xa=function(e){if(this.g){if(this.u&&e.value)this.response.push(e.value);else if(!this.u){var t=e.value?e.value:new Uint8Array(0);(t=this.A.decode(t,{stream:!e.done}))&&(this.response=this.responseText+=t)}e.done?en(this):tn(this),3==this.readyState&&Zt(this)}},r.Za=function(e){this.g&&(this.response=this.responseText=e,en(this))},r.Ya=function(e){this.g&&(this.response=e,en(this))},r.ka=function(){this.g&&en(this)},r.setRequestHeader=function(e,t){this.v.append(e,t)},r.getResponseHeader=function(e){return this.h&&this.h.get(e.toLowerCase())||""},r.getAllResponseHeaders=function(){if(!this.h)return"";const e=[],t=this.h.entries();for(var n=t.next();!n.done;)n=n.value,e.push(n[0]+": "+n[1]),n=t.next();return e.join("\r\n")},Object.defineProperty(Jt.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(e){this.m=e?"include":"same-origin"}});var nn=a.JSON.parse;function rn(e){he.call(this),this.headers=new Map,this.u=e||null,this.h=!1,this.C=this.g=null,this.I="",this.m=0,this.j="",this.l=this.G=this.v=this.F=!1,this.B=0,this.A=null,this.K=sn,this.L=this.M=!1}m(rn,he);var sn="",on=/^https?$/i,an=["POST","PUT"];function cn(e,t){e.h=!1,e.g&&(e.l=!0,e.g.abort(),e.l=!1),e.j=t,e.m=5,un(e),hn(e)}function un(e){e.F||(e.F=!0,de(e,"complete"),de(e,"error"))}function ln(e){if(e.h&&void 0!==o&&(!e.C[1]||4!=fn(e)||2!=e.da()))if(e.v&&4==fn(e))Ce(e.La,0,e);else if(de(e,"readystatechange"),4==fn(e)){e.h=!1;try{const o=e.da();e:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var t=!0;break e;default:t=!1}var n;if(!(n=t)){var r;if(r=0===o){var i=String(e.I).match(yt)[1]||null;!i&&a.self&&a.self.location&&(i=a.self.location.protocol.slice(0,-1)),r=!on.test(i?i.toLowerCase():"")}n=r}if(n)de(e,"complete"),de(e,"success");else{e.m=6;try{var s=2{}:null;e.g=null,e.C=null,t||de(e,"ready");try{n.onreadystatechange=r}catch(e){}}}function dn(e){e.g&&e.L&&(e.g.ontimeout=null),e.A&&(a.clearTimeout(e.A),e.A=null)}function fn(e){return e.g?e.g.readyState:0}function pn(e){try{if(!e.g)return null;if("response"in e.g)return e.g.response;switch(e.K){case sn:case"text":return e.g.responseText;case"arraybuffer":if("mozResponseArrayBuffer"in e.g)return e.g.mozResponseArrayBuffer}return null}catch(e){return null}}function gn(e){let t="";return H(e,(function(e,n){t+=n,t+=":",t+=e,t+="\r\n"})),t}function mn(e,t,n){e:{for(r in n){var r=!1;break e}r=!0}r||(n=gn(n),"string"==typeof e?null!=n&&encodeURIComponent(String(n)):Tt(e,t,n))}function yn(e,t,n){return n&&n.internalChannelParams&&n.internalChannelParams[e]||t}function vn(e){this.Ga=0,this.j=[],this.l=new xe,this.pa=this.wa=this.I=this.Y=this.g=this.Da=this.F=this.na=this.o=this.U=this.s=null,this.fb=this.W=0,this.cb=yn("failFast",!1,e),this.G=this.v=this.u=this.m=this.h=null,this.aa=!0,this.Fa=this.V=-1,this.ba=this.A=this.C=0,this.ab=yn("baseRetryDelayMs",5e3,e),this.hb=yn("retryDelaySeedMs",1e4,e),this.eb=yn("forwardChannelMaxRetries",2,e),this.xa=yn("forwardChannelRequestTimeoutMs",2e4,e),this.va=e&&e.xmlHttpFactory||void 0,this.Ha=e&&e.dc||!1,this.L=void 0,this.J=e&&e.supportsCrossDomainXhr||!1,this.K="",this.i=new jt(e&&e.concurrentRequestLimit),this.Ja=new Wt,this.P=e&&e.fastHandshake||!1,this.O=e&&e.encodeInitMessageHeaders||!1,this.P&&this.O&&(this.O=!1),this.bb=e&&e.bc||!1,e&&e.Ea&&this.l.Ea(),e&&e.forceLongPolling&&(this.aa=!1),this.ca=!this.P&&this.aa&&e&&e.detectBufferingProxy||!1,this.qa=void 0,e&&e.longPollingTimeout&&0n)t=Math.max(0,i[o].g-100),s=!1;else try{Ht(a,e,"req"+n+"_")}catch(e){r&&r(a)}}if(s){r=e.join("&");break e}}}return e=e.j.splice(0,n),t.F=e,r}function kn(e){if(!e.g&&!e.u){e.ba=1;var t=e.Ma;be||Te(),Ie||(be(),Ie=!0),_e.add(t,e),e.A=0}}function Cn(e){return!(e.g||e.u||3<=e.A)&&(e.ba++,e.u=ze(p(e.Ma,e),Rn(e,e.A)),e.A++,!0)}function An(e){null!=e.B&&(a.clearTimeout(e.B),e.B=null)}function Nn(e){e.g=new et(e,e.l,"rpc",e.ba),null===e.o&&(e.g.I=e.s),e.g.O=0;var t=wt(e.wa);Tt(t,"RID","rpc"),Tt(t,"SID",e.K),Tt(t,"AID",e.V),Tt(t,"CI",e.G?"0":"1"),!e.G&&e.qa&&Tt(t,"TO",e.qa),Tt(t,"TYPE","xmlhttp"),En(e,t),e.o&&e.s&&mn(t,e.o,e.s),e.L&&e.g.setTimeout(e.L);var n=e.g;e=e.pa,n.L=1,n.v=Et(wt(t)),n.s=null,n.S=!0,ot(n,e)}function Dn(e){null!=e.v&&(a.clearTimeout(e.v),e.v=null)}function On(e,t){var n=null;if(e.g==t){Dn(e),An(e),e.g=null;var r=2}else{if(!zt(e.i,t))return;n=t.F,Kt(e.i,t),r=1}if(0!=e.H)if(t.i)if(1==r){n=t.s?t.s.length:0,t=Date.now()-t.G;var i=e.C;de(r=Fe(),new Be(r,n)),_n(e)}else kn(e);else if(3==(i=t.o)||0==i&&0=e.i.j-(e.m?1:0))&&(e.m?(e.j=t.F.concat(e.j),!0):!(1==e.H||2==e.H||e.C>=(e.cb?0:e.eb))&&(e.m=ze(p(e.Na,e,t),Rn(e,e.C)),e.C++,!0))}(e,t)||2==r&&Cn(e)))switch(n&&0i;++i)r[i]=t.charCodeAt(n++)|t.charCodeAt(n++)<<8|t.charCodeAt(n++)<<16|t.charCodeAt(n++)<<24;else for(i=0;16>i;++i)r[i]=t[n++]|t[n++]<<8|t[n++]<<16|t[n++]<<24;t=e.g[0],n=e.g[1],i=e.g[2];var s=e.g[3],o=t+(s^n&(i^s))+r[0]+3614090360&4294967295;o=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=(n=(i=(s=(t=n+(o<<7&4294967295|o>>>25))+((o=s+(i^t&(n^i))+r[1]+3905402710&4294967295)<<12&4294967295|o>>>20))+((o=i+(n^s&(t^n))+r[2]+606105819&4294967295)<<17&4294967295|o>>>15))+((o=n+(t^i&(s^t))+r[3]+3250441966&4294967295)<<22&4294967295|o>>>10))+((o=t+(s^n&(i^s))+r[4]+4118548399&4294967295)<<7&4294967295|o>>>25))+((o=s+(i^t&(n^i))+r[5]+1200080426&4294967295)<<12&4294967295|o>>>20))+((o=i+(n^s&(t^n))+r[6]+2821735955&4294967295)<<17&4294967295|o>>>15))+((o=n+(t^i&(s^t))+r[7]+4249261313&4294967295)<<22&4294967295|o>>>10))+((o=t+(s^n&(i^s))+r[8]+1770035416&4294967295)<<7&4294967295|o>>>25))+((o=s+(i^t&(n^i))+r[9]+2336552879&4294967295)<<12&4294967295|o>>>20))+((o=i+(n^s&(t^n))+r[10]+4294925233&4294967295)<<17&4294967295|o>>>15))+((o=n+(t^i&(s^t))+r[11]+2304563134&4294967295)<<22&4294967295|o>>>10))+((o=t+(s^n&(i^s))+r[12]+1804603682&4294967295)<<7&4294967295|o>>>25))+((o=s+(i^t&(n^i))+r[13]+4254626195&4294967295)<<12&4294967295|o>>>20))+((o=i+(n^s&(t^n))+r[14]+2792965006&4294967295)<<17&4294967295|o>>>15))+((o=n+(t^i&(s^t))+r[15]+1236535329&4294967295)<<22&4294967295|o>>>10))+((o=t+(i^s&(n^i))+r[1]+4129170786&4294967295)<<5&4294967295|o>>>27))+((o=s+(n^i&(t^n))+r[6]+3225465664&4294967295)<<9&4294967295|o>>>23))+((o=i+(t^n&(s^t))+r[11]+643717713&4294967295)<<14&4294967295|o>>>18))+((o=n+(s^t&(i^s))+r[0]+3921069994&4294967295)<<20&4294967295|o>>>12))+((o=t+(i^s&(n^i))+r[5]+3593408605&4294967295)<<5&4294967295|o>>>27))+((o=s+(n^i&(t^n))+r[10]+38016083&4294967295)<<9&4294967295|o>>>23))+((o=i+(t^n&(s^t))+r[15]+3634488961&4294967295)<<14&4294967295|o>>>18))+((o=n+(s^t&(i^s))+r[4]+3889429448&4294967295)<<20&4294967295|o>>>12))+((o=t+(i^s&(n^i))+r[9]+568446438&4294967295)<<5&4294967295|o>>>27))+((o=s+(n^i&(t^n))+r[14]+3275163606&4294967295)<<9&4294967295|o>>>23))+((o=i+(t^n&(s^t))+r[3]+4107603335&4294967295)<<14&4294967295|o>>>18))+((o=n+(s^t&(i^s))+r[8]+1163531501&4294967295)<<20&4294967295|o>>>12))+((o=t+(i^s&(n^i))+r[13]+2850285829&4294967295)<<5&4294967295|o>>>27))+((o=s+(n^i&(t^n))+r[2]+4243563512&4294967295)<<9&4294967295|o>>>23))+((o=i+(t^n&(s^t))+r[7]+1735328473&4294967295)<<14&4294967295|o>>>18))+((o=n+(s^t&(i^s))+r[12]+2368359562&4294967295)<<20&4294967295|o>>>12))+((o=t+(n^i^s)+r[5]+4294588738&4294967295)<<4&4294967295|o>>>28))+((o=s+(t^n^i)+r[8]+2272392833&4294967295)<<11&4294967295|o>>>21))+((o=i+(s^t^n)+r[11]+1839030562&4294967295)<<16&4294967295|o>>>16))+((o=n+(i^s^t)+r[14]+4259657740&4294967295)<<23&4294967295|o>>>9))+((o=t+(n^i^s)+r[1]+2763975236&4294967295)<<4&4294967295|o>>>28))+((o=s+(t^n^i)+r[4]+1272893353&4294967295)<<11&4294967295|o>>>21))+((o=i+(s^t^n)+r[7]+4139469664&4294967295)<<16&4294967295|o>>>16))+((o=n+(i^s^t)+r[10]+3200236656&4294967295)<<23&4294967295|o>>>9))+((o=t+(n^i^s)+r[13]+681279174&4294967295)<<4&4294967295|o>>>28))+((o=s+(t^n^i)+r[0]+3936430074&4294967295)<<11&4294967295|o>>>21))+((o=i+(s^t^n)+r[3]+3572445317&4294967295)<<16&4294967295|o>>>16))+((o=n+(i^s^t)+r[6]+76029189&4294967295)<<23&4294967295|o>>>9))+((o=t+(n^i^s)+r[9]+3654602809&4294967295)<<4&4294967295|o>>>28))+((o=s+(t^n^i)+r[12]+3873151461&4294967295)<<11&4294967295|o>>>21))+((o=i+(s^t^n)+r[15]+530742520&4294967295)<<16&4294967295|o>>>16))+((o=n+(i^s^t)+r[2]+3299628645&4294967295)<<23&4294967295|o>>>9))+((o=t+(i^(n|~s))+r[0]+4096336452&4294967295)<<6&4294967295|o>>>26))+((o=s+(n^(t|~i))+r[7]+1126891415&4294967295)<<10&4294967295|o>>>22))+((o=i+(t^(s|~n))+r[14]+2878612391&4294967295)<<15&4294967295|o>>>17))+((o=n+(s^(i|~t))+r[5]+4237533241&4294967295)<<21&4294967295|o>>>11))+((o=t+(i^(n|~s))+r[12]+1700485571&4294967295)<<6&4294967295|o>>>26))+((o=s+(n^(t|~i))+r[3]+2399980690&4294967295)<<10&4294967295|o>>>22))+((o=i+(t^(s|~n))+r[10]+4293915773&4294967295)<<15&4294967295|o>>>17))+((o=n+(s^(i|~t))+r[1]+2240044497&4294967295)<<21&4294967295|o>>>11))+((o=t+(i^(n|~s))+r[8]+1873313359&4294967295)<<6&4294967295|o>>>26))+((o=s+(n^(t|~i))+r[15]+4264355552&4294967295)<<10&4294967295|o>>>22))+((o=i+(t^(s|~n))+r[6]+2734768916&4294967295)<<15&4294967295|o>>>17))+((o=n+(s^(i|~t))+r[13]+1309151649&4294967295)<<21&4294967295|o>>>11))+((s=(t=n+((o=t+(i^(n|~s))+r[4]+4149444226&4294967295)<<6&4294967295|o>>>26))+((o=s+(n^(t|~i))+r[11]+3174756917&4294967295)<<10&4294967295|o>>>22))^((i=s+((o=i+(t^(s|~n))+r[2]+718787259&4294967295)<<15&4294967295|o>>>17))|~t))+r[9]+3951481745&4294967295,e.g[0]=e.g[0]+t&4294967295,e.g[1]=e.g[1]+(i+(o<<21&4294967295|o>>>11))&4294967295,e.g[2]=e.g[2]+i&4294967295,e.g[3]=e.g[3]+s&4294967295}function Kn(e,t){this.h=t;for(var n=[],r=!0,i=e.length-1;0<=i;i--){var s=0|e[i];r&&s==t||(n[i]=s,r=!1)}this.g=n}(r=rn.prototype).Oa=function(e){this.M=e},r.ha=function(e,t,n,r){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.I+"; newUri="+e);t=t?t.toUpperCase():"GET",this.I=e,this.j="",this.m=0,this.F=!1,this.h=!0,this.g=this.u?this.u.g():Qe.g(),this.C=this.u?We(this.u):We(Qe),this.g.onreadystatechange=p(this.La,this);try{this.G=!0,this.g.open(t,String(e),!0),this.G=!1}catch(e){return void cn(this,e)}if(e=n||"",n=new Map(this.headers),r)if(Object.getPrototypeOf(r)===Object.prototype)for(var i in r)n.set(i,r[i]);else{if("function"!=typeof r.keys||"function"!=typeof r.get)throw Error("Unknown input type for opt_headers: "+String(r));for(const e of r.keys())n.set(e,r.get(e))}r=Array.from(n.keys()).find(e=>"content-type"==e.toLowerCase()),i=a.FormData&&e instanceof a.FormData,!(0<=v(an,t))||r||i||n.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");for(const[e,t]of n)this.g.setRequestHeader(e,t);this.K&&(this.g.responseType=this.K),"withCredentials"in this.g&&this.g.withCredentials!==this.M&&(this.g.withCredentials=this.M);try{dn(this),0=this.S)){var e=2*this.S;this.l.info("BP detection timer enabled: "+e),this.B=ze(p(this.jb,this),e)}},r.jb=function(){this.B&&(this.B=null,this.l.info("BP detection timeout reached."),this.l.info("Buffering proxy detected and switch to long-polling!"),this.G=!1,this.M=!0,qe(10),bn(this),Nn(this))},r.ib=function(){null!=this.v&&(this.v=null,bn(this),Cn(this),qe(19))},r.pb=function(e){e?(this.l.info("Successfully pinged google.com"),qe(2)):(this.l.info("Failed to ping google.com"),qe(1))},r.isActive=function(){return!!this.h&&this.h.isActive(this)},(r=Fn.prototype).Ba=function(){},r.Aa=function(){},r.za=function(){},r.ya=function(){},r.isActive=function(){return!0},r.Va=function(){},Vn.prototype.g=function(e,t){return new jn(e,t)},m(jn,he),jn.prototype.m=function(){this.g.h=this.j,this.A&&(this.g.J=!0);var e=this.g,t=this.l,n=this.h||void 0;qe(0),e.Y=t,e.na=n||{},e.G=e.aa,e.I=Ln(e,null,e.Y),_n(e)},jn.prototype.close=function(){wn(this.g)},jn.prototype.u=function(e){var t=this.g;if("string"==typeof e){var n={};n.__data__=e,e=n}else this.v&&((n={}).__data__=pe(e),e=n);t.j.push(new class{constructor(e,t){this.g=e,this.map=t}}(t.fb++,e)),3==t.H&&_n(t)},jn.prototype.N=function(){this.g.h=null,delete this.j,wn(this.g),delete this.g,jn.$.N.call(this)},m(Un,Je),m(qn,Xe),m(Bn,Fn),Bn.prototype.Ba=function(){de(this.g,"a")},Bn.prototype.Aa=function(e){de(this.g,new Un(e))},Bn.prototype.za=function(e){de(this.g,new qn)},Bn.prototype.ya=function(){de(this.g,"b")},m(zn,(function(){this.blockSize=-1})),zn.prototype.reset=function(){this.g[0]=1732584193,this.g[1]=4023233417,this.g[2]=2562383102,this.g[3]=271733878,this.i=this.h=0},zn.prototype.j=function(e,t){void 0===t&&(t=e.length);for(var n=t-this.blockSize,r=this.m,i=this.h,s=0;sthis.h?this.blockSize:2*this.blockSize)-this.h);e[0]=128;for(var t=1;tt;++t)for(var r=0;32>r;r+=8)e[n++]=this.g[t]>>>r&255;return e};var $n={};function Wn(e){return-128<=e&&128>e?function(e,t){var n=$n;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:n[e]=t(e)}(e,(function(e){return new Kn([0|e],0>e?-1:0)})):new Kn([0|e],0>e?-1:0)}function Hn(e){if(isNaN(e)||!isFinite(e))return Yn;if(0>e)return tr(Hn(-e));for(var t=[],n=1,r=0;e>=n;r++)t[r]=e/n|0,n*=Qn;return new Kn(t,0)}var Qn=4294967296,Yn=Wn(0),Jn=Wn(1),Xn=Wn(16777216);function Zn(e){if(0!=e.h)return!1;for(var t=0;t>>16,e[t]&=65535,t++}function ir(e,t){this.g=e,this.h=t}function sr(e,t){if(Zn(t))throw Error("division by zero");if(Zn(e))return new ir(Yn,Yn);if(er(e))return t=sr(tr(e),t),new ir(tr(t.g),tr(t.h));if(er(t))return t=sr(e,tr(t)),new ir(tr(t.g),t.h);if(30=r.X(e);)n=or(n),r=or(r);var i=ar(n,1),s=ar(r,1);for(r=ar(r,2),n=ar(n,2);!Zn(r);){var o=s.add(r);0>=o.X(e)&&(i=i.add(n),s=o),r=ar(r,1),n=ar(n,1)}return t=nr(e,i.R(t)),new ir(i,t)}for(i=Yn;0<=e.X(t);){for(n=Math.max(1,Math.floor(e.ea()/t.ea())),r=48>=(r=Math.ceil(Math.log(n)/Math.LN2))?1:Math.pow(2,r-48),o=(s=Hn(n)).R(t);er(o)||0>>31;return new Kn(n,e.h)}function ar(e,t){var n=t>>5;t%=32;for(var r=e.g.length-n,i=[],s=0;s>>t|e.D(s+n+1)<<32-t:e.D(s+n);return new Kn(i,e.h)}(r=Kn.prototype).ea=function(){if(er(this))return-tr(this).ea();for(var e=0,t=1,n=0;n(e=e||10)||36>>0).toString(e);if(Zn(n=i))return s+r;for(;6>s.length;)s="0"+s;r=s+r}},r.D=function(e){return 0>e?0:e>>16)+(this.D(i)>>>16)+(e.D(i)>>>16);r=o>>>16,s&=65535,o&=65535,n[i]=o<<16|s}return new Kn(n,-2147483648&n[n.length-1]?-1:0)},r.R=function(e){if(Zn(this)||Zn(e))return Yn;if(er(this))return er(e)?tr(this).R(tr(e)):tr(tr(this).R(e));if(er(e))return tr(this.R(tr(e)));if(0>this.X(Xn)&&0>e.X(Xn))return Hn(this.ea()*e.ea());for(var t=this.g.length+e.g.length,n=[],r=0;r<2*t;r++)n[r]=0;for(r=0;r>>16,o=65535&this.D(r),a=e.D(i)>>>16,c=65535&e.D(i);n[2*r+2*i]+=o*c,rr(n,2*r+2*i),n[2*r+2*i+1]+=s*c,rr(n,2*r+2*i+1),n[2*r+2*i+1]+=o*a,rr(n,2*r+2*i+1),n[2*r+2*i+2]+=s*a,rr(n,2*r+2*i+2)}for(r=0;r(n=n||10)||36o?(o=Hn(Math.pow(n,o)),i=i.R(o).add(Hn(a))):i=(i=i.R(r)).add(Hn(a))}return i};var cr=s.createWebChannelTransport=function(){return new Vn},ur=s.getStatEventTarget=function(){return Fe()},lr=s.ErrorCode=Ge,hr=s.EventType=Ke,dr=s.Event=Le,fr=s.Stat={xb:0,Ab:1,Bb:2,Ub:3,Zb:4,Wb:5,Xb:6,Vb:7,Tb:8,Yb:9,PROXY:10,NOPROXY:11,Rb:12,Nb:13,Ob:14,Mb:15,Pb:16,Qb:17,tb:18,sb:19,ub:20},pr=s.FetchXmlHttpFactory=Yt,gr=s.WebChannel=He,mr=s.XhrIo=rn,yr=s.Md5=zn,vr=s.Integer=Kn}).call(this,n(8))},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return u})),n.d(t,"c",(function(){return l})),n.d(t,"d",(function(){return h})); /** * @license * Copyright 2017 Google LLC @@ -4089,7 +4652,7 @@ class I{constructor(e,t,n){this._isDeleted=!1,this._options=Object.assign({},e), * See the License for the specific language governing permissions and * limitations under the License. */ -const r=[];var i;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(i||(i={}));const s={debug:i.DEBUG,verbose:i.VERBOSE,info:i.INFO,warn:i.WARN,error:i.ERROR,silent:i.SILENT},o=i.INFO,a={[i.DEBUG]:"log",[i.VERBOSE]:"log",[i.INFO]:"info",[i.WARN]:"warn",[i.ERROR]:"error"},c=(e,t,...n)=>{if(t{t.setLogLevel(e)})}function l(e,t){for(const n of r){let r=null;t&&t.level&&(r=s[t.level]),n.userLogHandler=null===e?null:(t,n,...s)=>{const o=s.map(e=>{if(null==e)return null;if("string"==typeof e)return e;if("number"==typeof e||"boolean"==typeof e)return e.toString();if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch(e){return null}}).filter(e=>e).join(" ");n>=(null!=r?r:t.logLevel)&&e({level:i[n].toLowerCase(),message:o,args:s,type:t.name})}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return o}));var r=n(0);class i{constructor(e,t,n){this.name=e,this.instanceFactory=t,this.type=n,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}} +const r=[];var i;!function(e){e[e.DEBUG=0]="DEBUG",e[e.VERBOSE=1]="VERBOSE",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.SILENT=5]="SILENT"}(i||(i={}));const s={debug:i.DEBUG,verbose:i.VERBOSE,info:i.INFO,warn:i.WARN,error:i.ERROR,silent:i.SILENT},o=i.INFO,a={[i.DEBUG]:"log",[i.VERBOSE]:"log",[i.INFO]:"info",[i.WARN]:"warn",[i.ERROR]:"error"},c=(e,t,...n)=>{if(t{t.setLogLevel(e)})}function h(e,t){for(const n of r){let r=null;t&&t.level&&(r=s[t.level]),n.userLogHandler=null===e?null:(t,n,...s)=>{const o=s.map(e=>{if(null==e)return null;if("string"==typeof e)return e;if("number"==typeof e||"boolean"==typeof e)return e.toString();if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch(e){return null}}).filter(e=>e).join(" ");n>=(null!=r?r:t.logLevel)&&e({level:i[n].toLowerCase(),message:o,args:s,type:t.name})}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return o}));var r=n(0);class i{constructor(e,t,n){this.name=e,this.instanceFactory=t,this.type=n,this.multipleInstances=!1,this.serviceProps={},this.instantiationMode="LAZY",this.onInstanceCreated=null}setInstantiationMode(e){return this.instantiationMode=e,this}setMultipleInstances(e){return this.multipleInstances=e,this}setServiceProps(e){return this.serviceProps=e,this}setInstanceCreatedCallback(e){return this.onInstanceCreated=e,this}} /** * @license * Copyright 2019 Google LLC @@ -4138,7 +4701,7 @@ class s{constructor(e,t){this.name=e,this.container=t,this.component=null,this.i * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e))try{this.getOrInitializeService({instanceIdentifier:"[DEFAULT]"})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const n=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:n});t.resolve(e)}catch(e){}}}}clearInstance(e="[DEFAULT]"){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter(e=>"INTERNAL"in e).map(e=>e.INTERNAL.delete()),...e.filter(e=>"_delete"in e).map(e=>e._delete())])}isComponentSet(){return null!=this.component}isInitialized(e="[DEFAULT]"){return this.instances.has(e)}getOptions(e="[DEFAULT]"){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,n=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(n))throw Error(`${this.name}(${n}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const r=this.getOrInitializeService({instanceIdentifier:n,options:t});for(const[e,t]of this.instancesDeferred.entries()){n===this.normalizeInstanceIdentifier(e)&&t.resolve(r)}return r}onInit(e,t){var n;const r=this.normalizeInstanceIdentifier(t),i=null!==(n=this.onInitCallbacks.get(r))&&void 0!==n?n:new Set;i.add(e),this.onInitCallbacks.set(r,i);const s=this.instances.get(r);return s&&e(s,r),()=>{i.delete(e)}}invokeOnInitCallbacks(e,t){const n=this.onInitCallbacks.get(t);if(n)for(const r of n)try{r(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let n=this.instances.get(e);if(!n&&this.component&&(n=this.component.instanceFactory(this.container,{instanceIdentifier:(r=e,"[DEFAULT]"===r?void 0:r),options:t}),this.instances.set(e,n),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(n,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,n)}catch(e){}var r;return n||null}normalizeInstanceIdentifier(e="[DEFAULT]"){return this.component?this.component.multipleInstances?e:"[DEFAULT]":e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class o{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new s(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}},function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return sr})),n.d(t,"b",(function(){return ar})),n.d(t,"c",(function(){return or})),n.d(t,"d",(function(){return ur})),n.d(t,"e",(function(){return cr})),n.d(t,"f",(function(){return hr})),n.d(t,"g",(function(){return lr})),n.d(t,"h",(function(){return rr})),n.d(t,"i",(function(){return ir}));var r,i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},s={},o=o||{},a=i||self;function c(){}function u(e){var t=typeof e;return"array"==(t="object"!=t?t:e?Array.isArray(e)?"array":t:"null")||"object"==t&&"number"==typeof e.length}function h(e){var t=typeof e;return"object"==t&&null!=e||"function"==t}var l="closure_uid_"+(1e9*Math.random()>>>0),d=0;function f(e,t,n){return e.call.apply(e.bind,arguments)}function p(e,t,n){if(!e)throw Error();if(2t?1:0}e:{var O=a.navigator;if(O){var C=O.userAgent;if(C){k=C;break e}}k=""}function D(e,t,n){for(const r in e)t.call(n,e[r],r,e)}function R(e){const t={};for(const n in e)t[n]=e[n];return t}var P="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function L(e,t){let n,r;for(let t=1;tparseFloat(W)){M=String(H);break e}}M=W}var $,Q={};function J(){return function(e){var t=Q;return Object.prototype.hasOwnProperty.call(t,9)?t[9]:t[9]=e(9)}((function(){let e=0;const t=S(String(M)).split("."),n=S("9").split("."),r=Math.max(t.length,n.length);for(let o=0;0==e&&o>>0);function we(e){return"function"==typeof e?e:(e[ve]||(e[ve]=function(t){return e.handleEvent(t)}),e[ve])}function be(){v.call(this),this.i=new ae(this),this.P=this,this.I=null}function Ie(e,t){var n,r=e.I;if(r)for(n=[];r;r=r.I)n.push(r);if(e=e.P,r=t.type||t,"string"==typeof t)t=new ee(t,e);else if(t instanceof ee)t.target=t.target||e;else{var i=t;L(t=new ee(r,e),i)}if(i=!0,n)for(var s=n.length-1;0<=s;s--){var o=t.g=n[s];i=_e(o,r,!0,t)&&i}if(i=_e(o=t.g=e,r,!0,t)&&i,i=_e(o,r,!1,t)&&i,n)for(s=0;snew Ae,e=>e.reset());class Ae{constructor(){this.next=this.g=this.h=null}set(e,t){this.h=e,this.g=t,this.next=null}reset(){this.next=this.g=this.h=null}}function Ne(e){a.setTimeout(()=>{throw e},0)}function Oe(e,t){ke||function(){var e=a.Promise.resolve(void 0);ke=function(){e.then(Re)}}(),Ce||(ke(),Ce=!0),De.add(e,t)}var Ce=!1,De=new class{constructor(){this.h=this.g=null}add(e,t){const n=Se.get();n.set(e,t),this.h?this.h.next=n:this.g=n,this.h=n}};function Re(){for(var e;e=Ee();){try{e.h.call(e.g)}catch(e){Ne(e)}var t=Se;t.j(e),100>t.h&&(t.h++,e.next=t.g,t.g=e)}Ce=!1}function Pe(e,t){be.call(this),this.h=e||1,this.g=t||a,this.j=m(this.kb,this),this.l=Date.now()}function Le(e){e.da=!1,e.S&&(e.g.clearTimeout(e.S),e.S=null)}function xe(e,t,n){if("function"==typeof e)n&&(e=m(e,n));else{if(!e||"function"!=typeof e.handleEvent)throw Error("Invalid listener argument");e=m(e.handleEvent,e)}return 2147483647{t.g=null,t.i&&(t.i=!1,e(t))},t.j);const n=t.h;t.h=null,t.m.apply(null,n)}(this)}M(){super.M(),this.g&&(a.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null)}}function Fe(e){v.call(this),this.h=e,this.g={}}y(Fe,v);var je=[];function Ue(e,t,n,r){Array.isArray(n)||(n&&(je[0]=n.toString()),n=je);for(var i=0;ir.length)){var i=r[1];if(Array.isArray(i)&&!(1>i.length)){var s=i[0];if("noop"!=s&&"stop"!=s&&"close"!=s)for(var o=1;ot.length?dt:(t=t.substr(r,n),e.C=r+n,t))}function vt(e){e.Y=Date.now()+e.P,wt(e,e.P)}function wt(e,t){if(null!=e.B)throw Error("WatchDog timer not null");e.B=Ye(m(e.eb,e),t)}function bt(e){e.B&&(a.clearTimeout(e.B),e.B=null)}function It(e){0==e.l.G||e.I||Wn(e.l,e)}function _t(e){bt(e);var t=e.L;t&&"function"==typeof t.na&&t.na(),e.L=null,Le(e.W),Ve(e.V),e.g&&(t=e.g,e.g=null,t.abort(),t.na())}function Tt(e,t){try{var n=e.l;if(0!=n.G&&(n.g==e||tn(n.i,e)))if(n.I=e.N,!e.J&&tn(n.i,e)&&3==n.G){try{var r=n.Ca.g.parse(t)}catch(e){r=null}if(Array.isArray(r)&&3==r.length){var i=r;if(0==i[0]){e:if(!n.u){if(n.g){if(!(n.g.F+3e3i[2]&&n.N&&0==n.A&&!n.v&&(n.v=Ye(m(n.ab,n),6e3));if(1>=en(n.i)&&n.ka){try{n.ka()}catch(e){}n.ka=void 0}}else Hn(n,11)}else if((e.J||n.g==e)&&Kn(n),!E(t))for(i=n.Ca.g.parse(t),t=0;tl)&&(3!=l||q||this.g&&(this.h.h||this.g.ga()||Nn(this.g)))){this.I||4!=l||7==t||He(8==t||0>=d?3:2),bt(this);var n=this.g.ba();this.N=n;t:if(mt(this)){var r=Nn(this.g);e="";var i=r.length,s=4==An(this.g);if(!this.h.i){if("undefined"==typeof TextDecoder){_t(this),It(this);var o="";break t}this.h.i=new a.TextDecoder}for(t=0;tt)throw Error("Bad port number "+t);e.m=t}else e.m=null}function Lt(e,t,n){t instanceof Wt?(e.h=t,function(e,t){t&&!e.j&&(Gt(e),e.i=null,e.g.forEach((function(e,t){var n=t.toLowerCase();t!=n&&(Ht(this,t),Qt(this,n,e))}),e)),e.j=t}(e.h,e.g)):(n||(t=jt(t,zt)),e.h=new Wt(t,e.g))}function xt(e,t,n){e.h.set(t,n)}function Mt(e){return xt(e,"zx",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36)),e}function Ft(e,t){return e?t?decodeURI(e.replace(/%25/g,"%2525")):decodeURIComponent(e):""}function jt(e,t,n){return"string"==typeof e?(e=encodeURI(e).replace(t,Ut),n&&(e=e.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),e):null}function Ut(e){return"%"+((e=e.charCodeAt(0))>>4&15).toString(16)+(15&e).toString(16)}Ot.prototype.toString=function(){var e=[],t=this.j;t&&e.push(jt(t,Vt,!0),":");var n=this.i;return(n||"file"==t)&&(e.push("//"),(t=this.s)&&e.push(jt(t,Vt,!0),"@"),e.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&e.push(":",String(n))),(n=this.l)&&(this.i&&"/"!=n.charAt(0)&&e.push("/"),e.push(jt(n,"/"==n.charAt(0)?Bt:qt,!0))),(n=this.h.toString())&&e.push("?",n),(n=this.o)&&e.push("#",jt(n,Kt)),e.join("")};var Vt=/[#\/\?@]/g,qt=/[#\?:]/g,Bt=/[#\?]/g,zt=/[#\?@]/g,Kt=/#/g;function Wt(e,t){this.h=this.g=null,this.i=e||null,this.j=!!t}function Gt(e){e.g||(e.g=new kt,e.h=0,e.i&&function(e,t){if(e){e=e.split("&");for(var n=0;n2*e.i&&St(e)))}function $t(e,t){return Gt(e),t=Jt(e,t),At(e.g.h,t)}function Qt(e,t,n){Ht(e,t),0=e.j}function en(e){return e.h?1:e.g?e.g.size:0}function tn(e,t){return e.h?e.h==t:!!e.g&&e.g.has(t)}function nn(e,t){e.g?e.g.add(t):e.h=t}function rn(e,t){e.h&&e.h==t?e.h=null:e.g&&e.g.has(t)&&e.g.delete(t)}function sn(e){if(null!=e.h)return e.i.concat(e.h.D);if(null!=e.g&&0!==e.g.size){let t=e.i;for(const n of e.g.values())t=t.concat(n.D);return t}return T(e.i)}function on(){}function an(){this.g=new on}function cn(e,t,n){const r=n||"";try{Et(e,(function(e,n){let i=e;h(e)&&(i=Te(e)),t.push(r+n+"="+encodeURIComponent(i))}))}catch(e){throw t.push(r+"type="+encodeURIComponent("_badmap")),e}}function un(e,t,n,r,i){try{t.onload=null,t.onerror=null,t.onabort=null,t.ontimeout=null,i(r)}catch(e){}}function hn(e){this.l=e.$b||null,this.j=e.ib||!1}function ln(e,t){be.call(this),this.D=e,this.u=t,this.m=void 0,this.readyState=dn,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}Yt.prototype.cancel=function(){if(this.i=sn(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const e of this.g.values())e.cancel();this.g.clear()}},on.prototype.stringify=function(e){return a.JSON.stringify(e,void 0)},on.prototype.parse=function(e){return a.JSON.parse(e,void 0)},y(hn,et),hn.prototype.g=function(){return new ln(this.l,this.j)},hn.prototype.i=function(e){return function(){return e}}({}),y(ln,be);var dn=0;function fn(e){e.j.read().then(e.Sa.bind(e)).catch(e.ha.bind(e))}function pn(e){e.readyState=4,e.l=null,e.j=null,e.A=null,mn(e)}function mn(e){e.onreadystatechange&&e.onreadystatechange.call(e)}(r=ln.prototype).open=function(e,t){if(this.readyState!=dn)throw this.abort(),Error("Error reopening a connection");this.C=e,this.B=t,this.readyState=1,mn(this)},r.send=function(e){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;const t={headers:this.v,method:this.C,credentials:this.m,cache:void 0};e&&(t.body=e),(this.D||a).fetch(new Request(this.B,t)).then(this.Va.bind(this),this.ha.bind(this))},r.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted."),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,pn(this)),this.readyState=dn},r.Va=function(e){if(this.g&&(this.l=e,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=e.headers,this.readyState=2,mn(this)),this.g&&(this.readyState=3,mn(this),this.g)))if("arraybuffer"===this.responseType)e.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if(void 0!==a.ReadableStream&&"body"in e){if(this.j=e.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;fn(this)}else e.text().then(this.Ua.bind(this),this.ha.bind(this))},r.Sa=function(e){if(this.g){if(this.u&&e.value)this.response.push(e.value);else if(!this.u){var t=e.value?e.value:new Uint8Array(0);(t=this.A.decode(t,{stream:!e.done}))&&(this.response=this.responseText+=t)}e.done?pn(this):mn(this),3==this.readyState&&fn(this)}},r.Ua=function(e){this.g&&(this.response=this.responseText=e,pn(this))},r.Ta=function(e){this.g&&(this.response=e,pn(this))},r.ha=function(){this.g&&pn(this)},r.setRequestHeader=function(e,t){this.v.append(e,t)},r.getResponseHeader=function(e){return this.h&&this.h.get(e.toLowerCase())||""},r.getAllResponseHeaders=function(){if(!this.h)return"";const e=[],t=this.h.entries();for(var n=t.next();!n.done;)n=n.value,e.push(n[0]+": "+n[1]),n=t.next();return e.join("\r\n")},Object.defineProperty(ln.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(e){this.m=e?"include":"same-origin"}});var gn=a.JSON.parse;function yn(e){be.call(this),this.headers=new kt,this.u=e||null,this.h=!1,this.C=this.g=null,this.H="",this.m=0,this.j="",this.l=this.F=this.v=this.D=!1,this.B=0,this.A=null,this.J=vn,this.K=this.L=!1}y(yn,be);var vn="",wn=/^https?$/i,bn=["POST","PUT"];function In(e){return"content-type"==e.toLowerCase()}function _n(e,t){e.h=!1,e.g&&(e.l=!0,e.g.abort(),e.l=!1),e.j=t,e.m=5,Tn(e),kn(e)}function Tn(e){e.D||(e.D=!0,Ie(e,"complete"),Ie(e,"error"))}function En(e){if(e.h&&void 0!==o&&(!e.C[1]||4!=An(e)||2!=e.ba()))if(e.v&&4==An(e))xe(e.Fa,0,e);else if(Ie(e,"readystatechange"),4==An(e)){e.h=!1;try{const o=e.ba();e:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var t=!0;break e;default:t=!1}var n;if(!(n=t)){var r;if(r=0===o){var i=String(e.H).match(Nt)[1]||null;if(!i&&a.self&&a.self.location){var s=a.self.location.protocol;i=s.substr(0,s.length-1)}r=!wn.test(i?i.toLowerCase():"")}n=r}if(n)Ie(e,"complete"),Ie(e,"success");else{e.m=6;try{var c=2n)t=Math.max(0,i[o].h-100),s=!1;else try{cn(a,e,"req"+n+"_")}catch(e){r&&r(a)}}if(s){r=e.join("&");break e}}}return e=e.l.splice(0,n),t.D=e,r}function Vn(e){e.g||e.u||(e.Y=1,Oe(e.Ga,e),e.A=0)}function qn(e){return!(e.g||e.u||3<=e.A)&&(e.Y++,e.u=Ye(m(e.Ga,e),Gn(e,e.A)),e.A++,!0)}function Bn(e){null!=e.B&&(a.clearTimeout(e.B),e.B=null)}function zn(e){e.g=new ct(e,e.h,"rpc",e.Y),null===e.o&&(e.g.H=e.s),e.g.O=0;var t=Ct(e.oa);xt(t,"RID","rpc"),xt(t,"SID",e.J),xt(t,"CI",e.N?"0":"1"),xt(t,"AID",e.U),jn(e,t),xt(t,"TYPE","xmlhttp"),e.o&&e.s&&On(t,e.o,e.s),e.K&&e.g.setTimeout(e.K);var n=e.g;e=e.la,n.K=1,n.v=Mt(Ct(t)),n.s=null,n.U=!0,pt(n,e)}function Kn(e){null!=e.v&&(a.clearTimeout(e.v),e.v=null)}function Wn(e,t){var n=null;if(e.g==t){Kn(e),Bn(e),e.g=null;var r=2}else{if(!tn(e.i,t))return;n=t.D,rn(e.i,t),r=1}if(e.I=t.N,0!=e.G)if(t.i)if(1==r){n=t.s?t.s.length:0,t=Date.now()-t.F;var i=e.C;Ie(r=We(),new Je(r,n,t,i)),Mn(e)}else Vn(e);else if(3==(i=t.o)||0==i&&0=e.i.j-(e.m?1:0))&&(e.m?(e.l=t.D.concat(e.l),!0):!(1==e.G||2==e.G||e.C>=(e.Xa?0:e.Ya))&&(e.m=Ye(m(e.Ha,e,t),Gn(e,e.C)),e.C++,!0))}(e,t)||2==r&&qn(e)))switch(n&&0t?null:"string"==typeof e?e.charAt(t):e[t]}(i.T()),n=a.FormData&&e instanceof a.FormData,!(0<=b(bn,t))||r||n||i.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8"),i.forEach((function(e,t){this.g.setRequestHeader(t,e)}),this),this.J&&(this.g.responseType=this.J),"withCredentials"in this.g&&this.g.withCredentials!==this.L&&(this.g.withCredentials=this.L);try{Sn(this),0=this.O)){var e=2*this.O;this.h.info("BP detection timer enabled: "+e),this.B=Ye(m(this.bb,this),e)}},r.bb=function(){this.B&&(this.B=null,this.h.info("BP detection timeout reached."),this.h.info("Buffering proxy detected and switch to long-polling!"),this.N=!1,this.L=!0,Qe(10),Pn(this),zn(this))},r.ab=function(){null!=this.v&&(this.v=null,Pn(this),qn(this),Qe(19))},r.jb=function(e){e?(this.h.info("Successfully pinged google.com"),Qe(2)):(this.h.info("Failed to ping google.com"),Qe(1))},(r=Yn.prototype).xa=function(){},r.wa=function(){},r.va=function(){},r.ua=function(){},r.Oa=function(){},Xn.prototype.g=function(e,t){return new Zn(e,t)},y(Zn,be),Zn.prototype.m=function(){this.g.j=this.j,this.A&&(this.g.H=!0);var e=this.g,t=this.l,n=this.h||void 0;e.Wa&&(e.h.info("Origin Trials enabled."),Oe(m(e.hb,e,t))),Qe(0),e.W=t,e.aa=n||{},e.N=e.X,e.F=Qn(e,null,e.W),Mn(e)},Zn.prototype.close=function(){Rn(this.g)},Zn.prototype.u=function(e){if("string"==typeof e){var t={};t.__data__=e,xn(this.g,t)}else this.v?((t={}).__data__=Te(e),xn(this.g,t)):xn(this.g,e)},Zn.prototype.M=function(){this.g.j=null,delete this.j,Rn(this.g),delete this.g,Zn.Z.M.call(this)},y(er,st),y(tr,ot),y(nr,Yn),nr.prototype.xa=function(){Ie(this.g,"a")},nr.prototype.wa=function(e){Ie(this.g,new er(e))},nr.prototype.va=function(e){Ie(this.g,new tr(e))},nr.prototype.ua=function(){Ie(this.g,"b")},Xn.prototype.createWebChannel=Xn.prototype.g,Zn.prototype.send=Zn.prototype.u,Zn.prototype.open=Zn.prototype.m,Zn.prototype.close=Zn.prototype.close,Xe.NO_ERROR=0,Xe.TIMEOUT=8,Xe.HTTP_ERROR=6,Ze.COMPLETE="complete",nt.EventType=it,it.OPEN="a",it.CLOSE="b",it.ERROR="c",it.MESSAGE="d",be.prototype.listen=be.prototype.N,yn.prototype.listenOnce=yn.prototype.O,yn.prototype.getLastError=yn.prototype.La,yn.prototype.getLastErrorCode=yn.prototype.Da,yn.prototype.getStatus=yn.prototype.ba,yn.prototype.getResponseJson=yn.prototype.Qa,yn.prototype.getResponseText=yn.prototype.ga,yn.prototype.send=yn.prototype.ea;var rr=s.createWebChannelTransport=function(){return new Xn},ir=s.getStatEventTarget=function(){return We()},sr=s.ErrorCode=Xe,or=s.EventType=Ze,ar=s.Event=ze,cr=s.Stat={rb:0,ub:1,vb:2,Ob:3,Tb:4,Qb:5,Rb:6,Pb:7,Nb:8,Sb:9,PROXY:10,NOPROXY:11,Lb:12,Hb:13,Ib:14,Gb:15,Jb:16,Kb:17,nb:18,mb:19,ob:20},ur=s.FetchXmlHttpFactory=hn,hr=s.WebChannel=nt,lr=s.XhrIo=yn}).call(this,n(8))},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(0),i=n(5),s=n(3),o=n(4); + */(e))try{this.getOrInitializeService({instanceIdentifier:"[DEFAULT]"})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const n=this.normalizeInstanceIdentifier(e);try{const e=this.getOrInitializeService({instanceIdentifier:n});t.resolve(e)}catch(e){}}}}clearInstance(e="[DEFAULT]"){this.instancesDeferred.delete(e),this.instancesOptions.delete(e),this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values());await Promise.all([...e.filter(e=>"INTERNAL"in e).map(e=>e.INTERNAL.delete()),...e.filter(e=>"_delete"in e).map(e=>e._delete())])}isComponentSet(){return null!=this.component}isInitialized(e="[DEFAULT]"){return this.instances.has(e)}getOptions(e="[DEFAULT]"){return this.instancesOptions.get(e)||{}}initialize(e={}){const{options:t={}}=e,n=this.normalizeInstanceIdentifier(e.instanceIdentifier);if(this.isInitialized(n))throw Error(`${this.name}(${n}) has already been initialized`);if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const r=this.getOrInitializeService({instanceIdentifier:n,options:t});for(const[e,t]of this.instancesDeferred.entries()){n===this.normalizeInstanceIdentifier(e)&&t.resolve(r)}return r}onInit(e,t){var n;const r=this.normalizeInstanceIdentifier(t),i=null!==(n=this.onInitCallbacks.get(r))&&void 0!==n?n:new Set;i.add(e),this.onInitCallbacks.set(r,i);const s=this.instances.get(r);return s&&e(s,r),()=>{i.delete(e)}}invokeOnInitCallbacks(e,t){const n=this.onInitCallbacks.get(t);if(n)for(const r of n)try{r(e,t)}catch(e){}}getOrInitializeService({instanceIdentifier:e,options:t={}}){let n=this.instances.get(e);if(!n&&this.component&&(n=this.component.instanceFactory(this.container,{instanceIdentifier:(r=e,"[DEFAULT]"===r?void 0:r),options:t}),this.instances.set(e,n),this.instancesOptions.set(e,t),this.invokeOnInitCallbacks(n,e),this.component.onInstanceCreated))try{this.component.onInstanceCreated(this.container,e,n)}catch(e){}var r;return n||null}normalizeInstanceIdentifier(e="[DEFAULT]"){return this.component?this.component.multipleInstances?e:"[DEFAULT]":e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}class o{constructor(e){this.name=e,this.providers=new Map}addComponent(e){const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name),this.addComponent(e)}getProvider(e){if(this.providers.has(e))return this.providers.get(e);const t=new s(e,this);return this.providers.set(e,t),t}getProviders(){return Array.from(this.providers.values())}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(0),i=n(6),s=n(3),o=n(5); /** * @license * Copyright 2020 Google LLC @@ -4171,7 +4734,7 @@ class a{constructor(e,t){this._delegate=e,this.firebase=t,Object(s._addComponent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const c={"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance."},u=new r.b("app-compat","Firebase",c);const h= + */const c={"no-app":"No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()","invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance."},u=new r.b("app-compat","Firebase",c);const l= /** * @license * Copyright 2019 Google LLC @@ -4205,7 +4768,7 @@ function e(){const t= * See the License for the specific language governing permissions and * limitations under the License. */ -function(e){const t={},n={__esModule:!0,initializeApp:function(i,o={}){const a=s.initializeApp(i,o);if(Object(r.e)(t,a.name))return t[a.name];const c=new e(a,n);return t[a.name]=c,c},app:i,registerVersion:s.registerVersion,setLogLevel:s.setLogLevel,onLog:s.onLog,apps:null,SDK_VERSION:s.SDK_VERSION,INTERNAL:{registerComponent:function(t){const o=t.name,a=o.replace("-compat","");if(s._registerComponent(t)&&"PUBLIC"===t.type){const s=(e=i())=>{if("function"!=typeof e[a])throw u.create("invalid-app-argument",{appName:o});return e[a]()};void 0!==t.serviceProps&&Object(r.i)(s,t.serviceProps),n[a]=s,e.prototype[a]=function(...e){return this._getService.bind(this,o).apply(this,t.multipleInstances?e:[])}}return"PUBLIC"===t.type?n[a]:null},removeApp:function(e){delete t[e]},useAsService:function(e,t){if("serverAuth"===t)return null;return t},modularAPIs:s}};function i(e){if(e=e||s._DEFAULT_ENTRY_NAME,!Object(r.e)(t,e))throw u.create("no-app",{appName:e});return t[e]}return n.default=n,Object.defineProperty(n,"apps",{get:function(){return Object.keys(t).map(e=>t[e])}}),i.App=e,n}(a);return t.INTERNAL=Object.assign(Object.assign({},t.INTERNAL),{createFirebaseNamespace:e,extendNamespace:function(e){Object(r.i)(t,e)},createSubscribe:r.g,ErrorFactory:r.b,deepExtend:r.i}),t}(),l=new o.b("@firebase/app-compat"); +function(e){const t={},n={__esModule:!0,initializeApp:function(i,o={}){const a=s.initializeApp(i,o);if(Object(r.f)(t,a.name))return t[a.name];const c=new e(a,n);return t[a.name]=c,c},app:i,registerVersion:s.registerVersion,setLogLevel:s.setLogLevel,onLog:s.onLog,apps:null,SDK_VERSION:s.SDK_VERSION,INTERNAL:{registerComponent:function(t){const o=t.name,a=o.replace("-compat","");if(s._registerComponent(t)&&"PUBLIC"===t.type){const s=(e=i())=>{if("function"!=typeof e[a])throw u.create("invalid-app-argument",{appName:o});return e[a]()};void 0!==t.serviceProps&&Object(r.j)(s,t.serviceProps),n[a]=s,e.prototype[a]=function(...e){return this._getService.bind(this,o).apply(this,t.multipleInstances?e:[])}}return"PUBLIC"===t.type?n[a]:null},removeApp:function(e){delete t[e]},useAsService:function(e,t){if("serverAuth"===t)return null;return t},modularAPIs:s}};function i(e){if(e=e||s._DEFAULT_ENTRY_NAME,!Object(r.f)(t,e))throw u.create("no-app",{appName:e});return t[e]}return n.default=n,Object.defineProperty(n,"apps",{get:function(){return Object.keys(t).map(e=>t[e])}}),i.App=e,n}(a);return t.INTERNAL=Object.assign(Object.assign({},t.INTERNAL),{createFirebaseNamespace:e,extendNamespace:function(e){Object(r.j)(t,e)},createSubscribe:r.h,ErrorFactory:r.b,deepExtend:r.j}),t}(),h=new o.b("@firebase/app-compat"); /** * @license * Copyright 2019 Google LLC @@ -4238,7 +4801,7 @@ function(e){const t={},n={__esModule:!0,initializeApp:function(i,o={}){const a=s * See the License for the specific language governing permissions and * limitations under the License. */ -if(Object(r.m)()&&void 0!==self.firebase){l.warn("\n Warning: Firebase is already defined in the global scope. Please make sure\n Firebase library is only loaded once.\n ");const e=self.firebase.SDK_VERSION;e&&e.indexOf("LITE")>=0&&l.warn("\n Warning: You are trying to load Firebase while using Firebase Performance standalone script.\n You should load Firebase Performance with this instance of Firebase to avoid loading duplicate code.\n ")}const d=h; +if(Object(r.r)()&&void 0!==self.firebase){h.warn("\n Warning: Firebase is already defined in the global scope. Please make sure\n Firebase library is only loaded once.\n ");const e=self.firebase.SDK_VERSION;e&&e.indexOf("LITE")>=0&&h.warn("\n Warning: You are trying to load Firebase while using Firebase Performance standalone script.\n You should load Firebase Performance with this instance of Firebase to avoid loading duplicate code.\n ")}const d=l; /** * @license * Copyright 2019 Google LLC @@ -4255,7 +4818,7 @@ if(Object(r.m)()&&void 0!==self.firebase){l.warn("\n Warning: Firebase is alr * See the License for the specific language governing permissions and * limitations under the License. */ -var f;Object(s.registerVersion)("@firebase/app-compat","0.1.12",f)},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(n){var r=new Uint8Array(16);e.exports=function(){return n(r),r}}else{var i=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),i[t]=e>>>((3&t)<<3)&255;return i}}},function(e,t){for(var n=[],r=0;r<256;++r)n[r]=(r+256).toString(16).substr(1);e.exports=function(e,t){var r=t||0,i=n;return[i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]]].join("")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Counter=void 0;const r=n(12),i=n(15);n(16),n(20);const s=n(19);t.Counter=class{constructor(e,t){this.doc=e,this.field=t,this.db=null,this.shardId="",this.shards={},this.notifyPromise=null,this.db=e.firestore,this.shardId=function(e){const t=new RegExp("(?:^|; )"+encodeURIComponent(e)+"=([^;]*)").exec(document.cookie);if(t)return t[1];const n=r.v4(),i=new Date;i.setTime(i.getTime()+2592e6);const s="; expires="+i.toUTCString();return document.cookie=encodeURIComponent(e)+"="+n+s+"; path=/",n}("FIRESTORE_COUNTER_SHARD_ID"),i.default.initializeApp(this.db.app.options);const n=i.default.firestore().collection(e.path+"/_counter_shards_");this.shards[e.path]=0,this.shards[n.path+"/"+this.shardId]=0,this.shards[n.path+"/\t"+this.shardId.substr(0,4)]=0,this.shards[n.path+"/\t\t"+this.shardId.substr(0,3)]=0,this.shards[n.path+"/\t\t\t"+this.shardId.substr(0,2)]=0,this.shards[n.path+"/\t\t\t"+this.shardId.substr(0,1)]=0}async get(e){const t=Object.keys(this.shards).map(async t=>(await this.db.doc(t).get(e)).get(this.field)||0);return(await Promise.all(t)).reduce((e,t)=>e+t,0)}onSnapshot(e){Object.keys(this.shards).forEach(t=>{const n=i.default.firestore().doc(t);(0,s.onSnapshot)(n,t=>{this.shards[t.ref.path]=t.get(this.field)||0,null===this.notifyPromise&&(this.notifyPromise=async function(e){return new Promise(async t=>{setTimeout(async()=>{const n=e();t(n)},0)})}(()=>{const t=Object.values(this.shards).reduce((e,t)=>e+t,0);e({exists:!0,data:()=>t}),this.notifyPromise=null}))})})}incrementBy(e){const t=i.default.firestore.FieldValue.increment(e),n=this.field.split(".").reverse().reduce((e,t)=>({[t]:e}),t),r=i.default.firestore().collection(this.doc.path+"/_counter_shards_");return(0,s.setDoc)((0,s.doc)(r,this.shardId),n,{merge:!0})}shard(){return this.doc.collection("_counter_shards_").doc(this.shardId)}}},function(e,t,n){var r=n(13),i=n(14),s=i;s.v1=r,s.v4=i,e.exports=s},function(e,t,n){var r,i,s=n(9),o=n(10),a=0,c=0;e.exports=function(e,t,n){var u=t&&n||0,h=t||[],l=(e=e||{}).node||r,d=void 0!==e.clockseq?e.clockseq:i;if(null==l||null==d){var f=s();null==l&&(l=r=[1|f[0],f[1],f[2],f[3],f[4],f[5]]),null==d&&(d=i=16383&(f[6]<<8|f[7]))}var p=void 0!==e.msecs?e.msecs:(new Date).getTime(),m=void 0!==e.nsecs?e.nsecs:c+1,g=p-a+(m-c)/1e4;if(g<0&&void 0===e.clockseq&&(d=d+1&16383),(g<0||p>a)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,c=m,i=d;var y=(1e4*(268435455&(p+=122192928e5))+m)%4294967296;h[u++]=y>>>24&255,h[u++]=y>>>16&255,h[u++]=y>>>8&255,h[u++]=255&y;var v=p/4294967296*1e4&268435455;h[u++]=v>>>8&255,h[u++]=255&v,h[u++]=v>>>24&15|16,h[u++]=v>>>16&255,h[u++]=d>>>8|128,h[u++]=255&d;for(var w=0;w<6;++w)h[u+w]=l[w];return t||o(h)}},function(e,t,n){var r=n(9),i=n(10);e.exports=function(e,t,n){var s=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var o=(e=e||{}).random||(e.rng||r)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t)for(var a=0;a<16;++a)t[s+a]=o[a];return t||i(o)}},function(e,t,n){"use strict";n.r(t);var r=n(7);n.d(t,"default",(function(){return r.a})); +var f;Object(s.registerVersion)("@firebase/app-compat","0.2.13",f)},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(n){var r=new Uint8Array(16);e.exports=function(){return n(r),r}}else{var i=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),i[t]=e>>>((3&t)<<3)&255;return i}}},function(e,t){for(var n=[],r=0;r<256;++r)n[r]=(r+256).toString(16).substr(1);e.exports=function(e,t){var r=t||0,i=n;return[i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],"-",i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]],i[e[r++]]].join("")}},function(e,t){var n,r,i=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(e){n=s}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var c,u=[],l=!1,h=-1;function d(){l&&c&&(l=!1,c.length?u=c.concat(u):h=-1,u.length&&f())}function f(){if(!l){var e=a(d);l=!0;for(var t=u.length;t;){for(c=u,u=[];++h1)for(var n=1;n(await this.db.doc(t).get(e)).get(this.field)||0);return(await Promise.all(t)).reduce((e,t)=>e+t,0)}onSnapshot(e){Object.keys(this.shards).forEach(t=>{const n=i.default.firestore().doc(t);(0,s.onSnapshot)(n,t=>{this.shards[t.ref.path]=t.get(this.field)||0,null===this.notifyPromise&&(this.notifyPromise=async function(e){return new Promise(async t=>{setTimeout(async()=>{const n=e();t(n)},0)})}(()=>{const t=Object.values(this.shards).reduce((e,t)=>e+t,0);e({exists:!0,data:()=>t}),this.notifyPromise=null}))})})}incrementBy(e){const t=i.default.firestore.FieldValue.increment(e),n=this.field.split(".").reverse().reduce((e,t)=>({[t]:e}),t),r=i.default.firestore().collection(this.doc.path+"/_counter_shards_");return(0,s.setDoc)((0,s.doc)(r,this.shardId),n,{merge:!0})}shard(){return this.doc.collection("_counter_shards_").doc(this.shardId)}}},function(e,t,n){var r=n(14),i=n(15),s=i;s.v1=r,s.v4=i,e.exports=s},function(e,t,n){var r,i,s=n(9),o=n(10),a=0,c=0;e.exports=function(e,t,n){var u=t&&n||0,l=t||[],h=(e=e||{}).node||r,d=void 0!==e.clockseq?e.clockseq:i;if(null==h||null==d){var f=s();null==h&&(h=r=[1|f[0],f[1],f[2],f[3],f[4],f[5]]),null==d&&(d=i=16383&(f[6]<<8|f[7]))}var p=void 0!==e.msecs?e.msecs:(new Date).getTime(),g=void 0!==e.nsecs?e.nsecs:c+1,m=p-a+(g-c)/1e4;if(m<0&&void 0===e.clockseq&&(d=d+1&16383),(m<0||p>a)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,c=g,i=d;var y=(1e4*(268435455&(p+=122192928e5))+g)%4294967296;l[u++]=y>>>24&255,l[u++]=y>>>16&255,l[u++]=y>>>8&255,l[u++]=255&y;var v=p/4294967296*1e4&268435455;l[u++]=v>>>8&255,l[u++]=255&v,l[u++]=v>>>24&15|16,l[u++]=v>>>16&255,l[u++]=d>>>8|128,l[u++]=255&d;for(var w=0;w<6;++w)l[u+w]=h[w];return t||o(l)}},function(e,t,n){var r=n(9),i=n(10);e.exports=function(e,t,n){var s=t&&n||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var o=(e=e||{}).random||(e.rng||r)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t)for(var a=0;a<16;++a)t[s+a]=o[a];return t||i(o)}},function(e,t,n){"use strict";n.r(t);var r=n(7);n.d(t,"default",(function(){return r.a})); /** * @license * Copyright 2020 Google LLC @@ -4272,7 +4835,7 @@ var f;Object(s.registerVersion)("@firebase/app-compat","0.1.12",f)},function(e,t * See the License for the specific language governing permissions and * limitations under the License. */ -r.a.registerVersion("firebase","9.6.1","app-compat")},function(e,t,n){"use strict";n.r(t);n(17)},function(e,t,n){"use strict";(function(e){var t=n(7),r=n(1),i=n(5),s=n(0);function o(){var e;return(null===(e=null===self||void 0===self?void 0:self.location)||void 0===e?void 0:e.protocol)||null}function a(e=Object(s.l)()){return!("file:"!==o()&&"ionic:"!==o()||!e.toLowerCase().match(/iphone|ipad|ipod|android/))}function c(e=Object(s.l)()){return Object(s.q)()&&11===(null===document||void 0===document?void 0:document.documentMode)||function(e=Object(s.l)()){return/Edge\/\d+/.test(e)}(e)}function u(){try{const e=self.localStorage,t=r.s();if(e)return e.setItem(t,"1"),e.removeItem(t),!c()||Object(s.r)()}catch(e){return h()&&Object(s.r)()}return!1}function h(){return void 0!==e&&"WorkerGlobalScope"in e&&"importScripts"in e}function l(){return("http:"===o()||"https:"===o()||Object(s.n)()||a())&&!(Object(s.u)()||Object(s.t)())&&u()&&!h()}function d(){return a()&&"undefined"!=typeof document} +r.a.registerVersion("firebase","9.23.0","app-compat")},function(e,t,n){"use strict";n.r(t);n(18)},function(e,t,n){"use strict";(function(e){var t=n(7),r=n(1),i=n(6),s=n(0);function o(){var e;return(null===(e=null===self||void 0===self?void 0:self.location)||void 0===e?void 0:e.protocol)||null}function a(e=Object(s.q)()){return!("file:"!==o()&&"ionic:"!==o()&&"capacitor:"!==o()||!e.toLowerCase().match(/iphone|ipad|ipod|android/))}function c(e=Object(s.q)()){return Object(s.u)()&&11===(null===document||void 0===document?void 0:document.documentMode)||function(e=Object(s.q)()){return/Edge\/\d+/.test(e)}(e)}function u(){try{const e=self.localStorage,t=r.s();if(e)return e.setItem(t,"1"),e.removeItem(t),!c()||Object(s.v)()}catch(e){return l()&&Object(s.v)()}return!1}function l(){return void 0!==e&&"WorkerGlobalScope"in e&&"importScripts"in e}function h(){return("http:"===o()||"https:"===o()||Object(s.s)()||a())&&!(Object(s.y)()||Object(s.x)())&&u()&&!l()}function d(){return a()&&"undefined"!=typeof document} /** * @license * Copyright 2020 Google LLC @@ -4289,7 +4852,7 @@ r.a.registerVersion("firebase","9.6.1","app-compat")},function(e,t,n){"use stric * See the License for the specific language governing permissions and * limitations under the License. */ -const f={LOCAL:"local",NONE:"none",SESSION:"session"},p=r.p;async function m(e){await e._initializationPromise;const t=g(),n=r.v("persistence",e.config.apiKey,e.name);(null==t?void 0:t.sessionStorage)&&t.sessionStorage.setItem(n,e._getPersistence())}function g(){return"undefined"!=typeof window?window:null} +const f={LOCAL:"local",NONE:"none",SESSION:"session"},p=r.p;async function g(e){await e._initializationPromise;const t=m(),n=r.w("persistence",e.config.apiKey,e.name);t&&t.setItem(n,e._getPersistence())}function m(){var e;try{return(null===(e="undefined"!=typeof window?window:null)||void 0===e?void 0:e.sessionStorage)||null}catch(e){return null}} /** * @license * Copyright 2020 Google LLC @@ -4305,7 +4868,7 @@ const f={LOCAL:"local",NONE:"none",SESSION:"session"},p=r.p;async function m(e){ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const y=r.p;class v{constructor(){this.browserResolver=r.t(r.z),this.cordovaResolver=r.t(r.E),this.underlyingResolver=null,this._redirectPersistence=r.A,this._completeRedirectFn=r.u}async _initialize(e){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._initialize(e)}async _openPopup(e,t,n,r){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._openPopup(e,t,n,r)}async _openRedirect(e,t,n,r){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._openRedirect(e,t,n,r)}_isIframeWebStorageSupported(e,t){this.assertedUnderlyingResolver._isIframeWebStorageSupported(e,t)}_originValidation(e){return this.assertedUnderlyingResolver._originValidation(e)}get _shouldInitProactively(){return d()||this.browserResolver._shouldInitProactively}get assertedUnderlyingResolver(){return y(this.underlyingResolver,"internal-error"),this.underlyingResolver}async selectUnderlyingResolver(){if(this.underlyingResolver)return;const e=await async function(){return!!d()&&new Promise(e=>{const t=setTimeout(()=>{e(!1)},1e3);document.addEventListener("deviceready",()=>{clearTimeout(t),e(!0)})})}();this.underlyingResolver=e?this.cordovaResolver:this.browserResolver}} + */const y=r.p;class v{constructor(){this.browserResolver=r.t(r.A),this.cordovaResolver=r.t(r.F),this.underlyingResolver=null,this._redirectPersistence=r.B,this._completeRedirectFn=r.u,this._overrideRedirectResult=r.v}async _initialize(e){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._initialize(e)}async _openPopup(e,t,n,r){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._openPopup(e,t,n,r)}async _openRedirect(e,t,n,r){return await this.selectUnderlyingResolver(),this.assertedUnderlyingResolver._openRedirect(e,t,n,r)}_isIframeWebStorageSupported(e,t){this.assertedUnderlyingResolver._isIframeWebStorageSupported(e,t)}_originValidation(e){return this.assertedUnderlyingResolver._originValidation(e)}get _shouldInitProactively(){return d()||this.browserResolver._shouldInitProactively}get assertedUnderlyingResolver(){return y(this.underlyingResolver,"internal-error"),this.underlyingResolver}async selectUnderlyingResolver(){if(this.underlyingResolver)return;const e=await async function(){return!!d()&&new Promise(e=>{const t=setTimeout(()=>{e(!1)},1e3);document.addEventListener("deviceready",()=>{clearTimeout(t),e(!0)})})}();this.underlyingResolver=e?this.cordovaResolver:this.browserResolver}} /** * @license * Copyright 2020 Google LLC @@ -4321,7 +4884,7 @@ const f={LOCAL:"local",NONE:"none",SESSION:"session"},p=r.p;async function m(e){ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function w(e){return e.unwrap()}function b(e){const{_tokenResponse:t}=e instanceof s.c?e.customData:e;if(!t)return null;if(!(e instanceof s.c)&&"temporaryProof"in t&&"phoneNumber"in t)return r.i.credentialFromResult(e);const n=t.providerId;if(!n||n===r.k.PASSWORD)return null;let i;switch(n){case r.k.GOOGLE:i=r.f;break;case r.k.FACEBOOK:i=r.d;break;case r.k.GITHUB:i=r.e;break;case r.k.TWITTER:i=r.o;break;default:const{oauthIdToken:e,oauthAccessToken:s,oauthTokenSecret:o,pendingToken:a,nonce:c}=t;return s||o||e||a?a?n.startsWith("saml.")?r.m._create(n,a):r.g._fromParams({providerId:n,signInMethod:n,pendingToken:a,idToken:e,accessToken:s}):new r.h(n).credential({idToken:e,accessToken:s,rawNonce:c}):null}return e instanceof s.c?i.credentialFromError(e):i.credentialFromResult(e)}function I(e,t){return t.catch(t=>{throw t instanceof s.c&&function(e,t){var n;const i=null===(n=t.customData)||void 0===n?void 0:n._tokenResponse;if("auth/multi-factor-auth-required"===t.code){t.resolver=new T(e,r.J(e,t))}else if(i){const e=b(t),n=t;e&&(n.credential=e,n.tenantId=i.tenantId||void 0,n.email=i.email||void 0,n.phoneNumber=i.phoneNumber||void 0)}}(e,t),t}).then(e=>{const t=e.operationType,n=e.user;return{operationType:t,credential:(i=e,b(i)),additionalUserInfo:r.I(e),user:E.getOrCreate(n)}; + */function w(e){return e.unwrap()}function b(e){const{_tokenResponse:t}=e instanceof s.c?e.customData:e;if(!t)return null;if(!(e instanceof s.c)&&"temporaryProof"in t&&"phoneNumber"in t)return r.i.credentialFromResult(e);const n=t.providerId;if(!n||n===r.k.PASSWORD)return null;let i;switch(n){case r.k.GOOGLE:i=r.f;break;case r.k.FACEBOOK:i=r.d;break;case r.k.GITHUB:i=r.e;break;case r.k.TWITTER:i=r.o;break;default:const{oauthIdToken:e,oauthAccessToken:s,oauthTokenSecret:o,pendingToken:a,nonce:c}=t;return s||o||e||a?a?n.startsWith("saml.")?r.m._create(n,a):r.g._fromParams({providerId:n,signInMethod:n,pendingToken:a,idToken:e,accessToken:s}):new r.h(n).credential({idToken:e,accessToken:s,rawNonce:c}):null}return e instanceof s.c?i.credentialFromError(e):i.credentialFromResult(e)}function I(e,t){return t.catch(t=>{throw t instanceof s.c&&function(e,t){var n;const i=null===(n=t.customData)||void 0===n?void 0:n._tokenResponse;if("auth/multi-factor-auth-required"===(null==t?void 0:t.code)){t.resolver=new T(e,r.K(e,t))}else if(i){const e=b(t),n=t;e&&(n.credential=e,n.tenantId=i.tenantId||void 0,n.email=i.email||void 0,n.phoneNumber=i.phoneNumber||void 0)}}(e,t),t}).then(e=>{const t=e.operationType,n=e.user;return{operationType:t,credential:(i=e,b(i)),additionalUserInfo:r.J(e),user:E.getOrCreate(n)}; /** * @license * Copyright 2020 Google LLC @@ -4354,7 +4917,7 @@ var i})}async function _(e,t){const n=await t;return{verificationId:n.verificati * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class E{constructor(e){this._delegate=e,this.multiFactor=r.S(e)}static getOrCreate(e){return E.USER_MAP.has(e)||E.USER_MAP.set(e,new E(e)),E.USER_MAP.get(e)}delete(){return this._delegate.delete()}reload(){return this._delegate.reload()}toJSON(){return this._delegate.toJSON()}getIdTokenResult(e){return this._delegate.getIdTokenResult(e)}getIdToken(e){return this._delegate.getIdToken(e)}linkAndRetrieveDataWithCredential(e){return this.linkWithCredential(e)}async linkWithCredential(e){return I(this.auth,r.O(this._delegate,e))}async linkWithPhoneNumber(e,t){return _(this.auth,r.P(this._delegate,e,t))}async linkWithPopup(e){return I(this.auth,r.Q(this._delegate,e,v))}async linkWithRedirect(e){return await m(r.q(this.auth)),r.R(this._delegate,e,v)}reauthenticateAndRetrieveDataWithCredential(e){return this.reauthenticateWithCredential(e)}async reauthenticateWithCredential(e){return I(this.auth,r.T(this._delegate,e))}reauthenticateWithPhoneNumber(e,t){return _(this.auth,r.U(this._delegate,e,t))}reauthenticateWithPopup(e){return I(this.auth,r.V(this._delegate,e,v))}async reauthenticateWithRedirect(e){return await m(r.q(this.auth)),r.W(this._delegate,e,v)}sendEmailVerification(e){return r.X(this._delegate,e)}async unlink(e){return await r.ib(this._delegate,e),this}updateEmail(e){return r.jb(this._delegate,e)}updatePassword(e){return r.kb(this._delegate,e)}updatePhoneNumber(e){return r.lb(this._delegate,e)}updateProfile(e){return r.mb(this._delegate,e)}verifyBeforeUpdateEmail(e,t){return r.nb(this._delegate,e,t)}get emailVerified(){return this._delegate.emailVerified}get isAnonymous(){return this._delegate.isAnonymous}get metadata(){return this._delegate.metadata}get phoneNumber(){return this._delegate.phoneNumber}get providerData(){return this._delegate.providerData}get refreshToken(){return this._delegate.refreshToken}get tenantId(){return this._delegate.tenantId}get displayName(){return this._delegate.displayName}get email(){return this._delegate.email}get photoURL(){return this._delegate.photoURL}get providerId(){return this._delegate.providerId}get uid(){return this._delegate.uid}get auth(){return this._delegate.auth}}E.USER_MAP=new WeakMap; + */class E{constructor(e){this._delegate=e,this.multiFactor=r.T(e)}static getOrCreate(e){return E.USER_MAP.has(e)||E.USER_MAP.set(e,new E(e)),E.USER_MAP.get(e)}delete(){return this._delegate.delete()}reload(){return this._delegate.reload()}toJSON(){return this._delegate.toJSON()}getIdTokenResult(e){return this._delegate.getIdTokenResult(e)}getIdToken(e){return this._delegate.getIdToken(e)}linkAndRetrieveDataWithCredential(e){return this.linkWithCredential(e)}async linkWithCredential(e){return I(this.auth,r.P(this._delegate,e))}async linkWithPhoneNumber(e,t){return _(this.auth,r.Q(this._delegate,e,t))}async linkWithPopup(e){return I(this.auth,r.R(this._delegate,e,v))}async linkWithRedirect(e){return await g(r.q(this.auth)),r.S(this._delegate,e,v)}reauthenticateAndRetrieveDataWithCredential(e){return this.reauthenticateWithCredential(e)}async reauthenticateWithCredential(e){return I(this.auth,r.U(this._delegate,e))}reauthenticateWithPhoneNumber(e,t){return _(this.auth,r.V(this._delegate,e,t))}reauthenticateWithPopup(e){return I(this.auth,r.W(this._delegate,e,v))}async reauthenticateWithRedirect(e){return await g(r.q(this.auth)),r.X(this._delegate,e,v)}sendEmailVerification(e){return r.Y(this._delegate,e)}async unlink(e){return await r.jb(this._delegate,e),this}updateEmail(e){return r.kb(this._delegate,e)}updatePassword(e){return r.lb(this._delegate,e)}updatePhoneNumber(e){return r.mb(this._delegate,e)}updateProfile(e){return r.nb(this._delegate,e)}verifyBeforeUpdateEmail(e,t){return r.ob(this._delegate,e,t)}get emailVerified(){return this._delegate.emailVerified}get isAnonymous(){return this._delegate.isAnonymous}get metadata(){return this._delegate.metadata}get phoneNumber(){return this._delegate.phoneNumber}get providerData(){return this._delegate.providerData}get refreshToken(){return this._delegate.refreshToken}get tenantId(){return this._delegate.tenantId}get displayName(){return this._delegate.displayName}get email(){return this._delegate.email}get photoURL(){return this._delegate.photoURL}get providerId(){return this._delegate.providerId}get uid(){return this._delegate.uid}get auth(){return this._delegate.auth}}E.USER_MAP=new WeakMap; /** * @license * Copyright 2020 Google LLC @@ -4371,7 +4934,7 @@ var i})}async function _(e,t){const n=await t;return{verificationId:n.verificati * See the License for the specific language governing permissions and * limitations under the License. */ -const k=r.p;class S{constructor(e,t){if(this.app=e,t.isInitialized())return this._delegate=t.getImmediate(),void this.linkUnderlyingAuth();const{apiKey:n}=e.options;k(n,"invalid-api-key",{appName:e.name});let i=[r.L];if("undefined"!=typeof window){i=function(e,t){const n=g();if(!(null==n?void 0:n.sessionStorage))return[];const i=r.v("persistence",e,t);switch(n.sessionStorage.getItem(i)){case f.NONE:return[r.L];case f.LOCAL:return[r.M,r.A];case f.SESSION:return[r.A];default:return[]}}(n,e.name);for(const e of[r.M,r.y,r.A])i.includes(e)||i.push(e)}k(n,"invalid-api-key",{appName:e.name});const s="undefined"!=typeof window?v:void 0;this._delegate=t.initialize({options:{persistence:i,popupRedirectResolver:s}}),this._delegate._updateErrorMap(r.G),this.linkUnderlyingAuth()}get emulatorConfig(){return this._delegate.emulatorConfig}get currentUser(){return this._delegate.currentUser?E.getOrCreate(this._delegate.currentUser):null}get languageCode(){return this._delegate.languageCode}set languageCode(e){this._delegate.languageCode=e}get settings(){return this._delegate.settings}get tenantId(){return this._delegate.tenantId}set tenantId(e){this._delegate.tenantId=e}useDeviceLanguage(){this._delegate.useDeviceLanguage()}signOut(){return this._delegate.signOut()}useEmulator(e,t){r.D(this._delegate,e,t)}applyActionCode(e){return r.x(this._delegate,e)}checkActionCode(e){return r.B(this._delegate,e)}confirmPasswordReset(e,t){return r.C(this._delegate,e,t)}async createUserWithEmailAndPassword(e,t){return I(this._delegate,r.F(this._delegate,e,t))}fetchProvidersForEmail(e){return this.fetchSignInMethodsForEmail(e)}fetchSignInMethodsForEmail(e){return r.H(this._delegate,e)}isSignInWithEmailLink(e){return r.N(this._delegate,e)}async getRedirectResult(){k(l(),this._delegate,"operation-not-supported-in-this-environment");const e=await r.K(this._delegate,v);return e?I(this._delegate,Promise.resolve(e)):{credential:null,user:null}}addFrameworkForLogging(e){r.w(this._delegate,e)}onAuthStateChanged(e,t,n){const{next:r,error:i,complete:s}=A(e,t,n);return this._delegate.onAuthStateChanged(r,i,s)}onIdTokenChanged(e,t,n){const{next:r,error:i,complete:s}=A(e,t,n);return this._delegate.onIdTokenChanged(r,i,s)}sendSignInLinkToEmail(e,t){return r.Z(this._delegate,e,t)}sendPasswordResetEmail(e,t){return r.Y(this._delegate,e,t||void 0)}async setPersistence(e){let t;switch(function(e,t){p(Object.values(f).includes(t),e,"invalid-persistence-type"),Object(s.u)()?p(t!==f.SESSION,e,"unsupported-persistence-type"):Object(s.t)()?p(t===f.NONE,e,"unsupported-persistence-type"):h()?p(t===f.NONE||t===f.LOCAL&&Object(s.r)(),e,"unsupported-persistence-type"):p(t===f.NONE||u(),e,"unsupported-persistence-type")}(this._delegate,e),e){case f.SESSION:t=r.A;break;case f.LOCAL:t=await r.t(r.M)._isAvailable()?r.M:r.y;break;case f.NONE:t=r.L;break;default:return r.r("argument-error",{appName:this._delegate.name})}return this._delegate.setPersistence(t)}signInAndRetrieveDataWithCredential(e){return this.signInWithCredential(e)}signInAnonymously(){return I(this._delegate,r.ab(this._delegate))}signInWithCredential(e){return I(this._delegate,r.bb(this._delegate,e))}signInWithCustomToken(e){return I(this._delegate,r.cb(this._delegate,e))}signInWithEmailAndPassword(e,t){return I(this._delegate,r.db(this._delegate,e,t))}signInWithEmailLink(e,t){return I(this._delegate,r.eb(this._delegate,e,t))}signInWithPhoneNumber(e,t){return _(this._delegate,r.fb(this._delegate,e,t))}async signInWithPopup(e){return k(l(),this._delegate,"operation-not-supported-in-this-environment"),I(this._delegate,r.gb(this._delegate,e,v))}async signInWithRedirect(e){return k(l(),this._delegate,"operation-not-supported-in-this-environment"),await m(this._delegate),r.hb(this._delegate,e,v)}updateCurrentUser(e){return this._delegate.updateCurrentUser(e)}verifyPasswordResetCode(e){return r.ob(this._delegate,e)}unwrap(){return this._delegate}_delete(){return this._delegate._delete()}linkUnderlyingAuth(){this._delegate.wrapped=()=>this}}function A(e,t,n){let r=e;"function"!=typeof e&&({next:r,error:t,complete:n}=e);const i=r;return{next:e=>i(e&&E.getOrCreate(e)),error:t,complete:n}} +const S=r.p;class k{constructor(e,t){if(this.app=e,t.isInitialized())return this._delegate=t.getImmediate(),void this.linkUnderlyingAuth();const{apiKey:n}=e.options;S(n,"invalid-api-key",{appName:e.name}),S(n,"invalid-api-key",{appName:e.name});const i="undefined"!=typeof window?v:void 0;this._delegate=t.initialize({options:{persistence:A(n,e.name),popupRedirectResolver:i}}),this._delegate._updateErrorMap(r.H),this.linkUnderlyingAuth()}get emulatorConfig(){return this._delegate.emulatorConfig}get currentUser(){return this._delegate.currentUser?E.getOrCreate(this._delegate.currentUser):null}get languageCode(){return this._delegate.languageCode}set languageCode(e){this._delegate.languageCode=e}get settings(){return this._delegate.settings}get tenantId(){return this._delegate.tenantId}set tenantId(e){this._delegate.tenantId=e}useDeviceLanguage(){this._delegate.useDeviceLanguage()}signOut(){return this._delegate.signOut()}useEmulator(e,t){r.E(this._delegate,e,t)}applyActionCode(e){return r.y(this._delegate,e)}checkActionCode(e){return r.C(this._delegate,e)}confirmPasswordReset(e,t){return r.D(this._delegate,e,t)}async createUserWithEmailAndPassword(e,t){return I(this._delegate,r.G(this._delegate,e,t))}fetchProvidersForEmail(e){return this.fetchSignInMethodsForEmail(e)}fetchSignInMethodsForEmail(e){return r.I(this._delegate,e)}isSignInWithEmailLink(e){return r.O(this._delegate,e)}async getRedirectResult(){S(h(),this._delegate,"operation-not-supported-in-this-environment");const e=await r.L(this._delegate,v);return e?I(this._delegate,Promise.resolve(e)):{credential:null,user:null}}addFrameworkForLogging(e){r.x(this._delegate,e)}onAuthStateChanged(e,t,n){const{next:r,error:i,complete:s}=C(e,t,n);return this._delegate.onAuthStateChanged(r,i,s)}onIdTokenChanged(e,t,n){const{next:r,error:i,complete:s}=C(e,t,n);return this._delegate.onIdTokenChanged(r,i,s)}sendSignInLinkToEmail(e,t){return r.ab(this._delegate,e,t)}sendPasswordResetEmail(e,t){return r.Z(this._delegate,e,t||void 0)}async setPersistence(e){let t;switch(function(e,t){p(Object.values(f).includes(t),e,"invalid-persistence-type"),Object(s.y)()?p(t!==f.SESSION,e,"unsupported-persistence-type"):Object(s.x)()?p(t===f.NONE,e,"unsupported-persistence-type"):l()?p(t===f.NONE||t===f.LOCAL&&Object(s.v)(),e,"unsupported-persistence-type"):p(t===f.NONE||u(),e,"unsupported-persistence-type")}(this._delegate,e),e){case f.SESSION:t=r.B;break;case f.LOCAL:t=await r.t(r.N)._isAvailable()?r.N:r.z;break;case f.NONE:t=r.M;break;default:return r.r("argument-error",{appName:this._delegate.name})}return this._delegate.setPersistence(t)}signInAndRetrieveDataWithCredential(e){return this.signInWithCredential(e)}signInAnonymously(){return I(this._delegate,r.bb(this._delegate))}signInWithCredential(e){return I(this._delegate,r.cb(this._delegate,e))}signInWithCustomToken(e){return I(this._delegate,r.db(this._delegate,e))}signInWithEmailAndPassword(e,t){return I(this._delegate,r.eb(this._delegate,e,t))}signInWithEmailLink(e,t){return I(this._delegate,r.fb(this._delegate,e,t))}signInWithPhoneNumber(e,t){return _(this._delegate,r.gb(this._delegate,e,t))}async signInWithPopup(e){return S(h(),this._delegate,"operation-not-supported-in-this-environment"),I(this._delegate,r.hb(this._delegate,e,v))}async signInWithRedirect(e){return S(h(),this._delegate,"operation-not-supported-in-this-environment"),await g(this._delegate),r.ib(this._delegate,e,v)}updateCurrentUser(e){return this._delegate.updateCurrentUser(e)}verifyPasswordResetCode(e){return r.pb(this._delegate,e)}unwrap(){return this._delegate}_delete(){return this._delegate._delete()}linkUnderlyingAuth(){this._delegate.wrapped=()=>this}}function C(e,t,n){let r=e;"function"!=typeof e&&({next:r,error:t,complete:n}=e);const i=r;return{next:e=>i(e&&E.getOrCreate(e)),error:t,complete:n}}function A(e,t){const n=function(e,t){const n=m();if(!n)return[];const i=r.w("persistence",e,t);switch(n.getItem(i)){case f.NONE:return[r.M];case f.LOCAL:return[r.N,r.B];case f.SESSION:return[r.B];default:return[]}}(e,t);if("undefined"==typeof self||n.includes(r.N)||n.push(r.N),"undefined"!=typeof window)for(const e of[r.z,r.B])n.includes(e)||n.push(e);return n.includes(r.M)||n.push(r.M),n} /** * @license * Copyright 2020 Google LLC @@ -4387,7 +4950,7 @@ const k=r.p;class S{constructor(e,t){if(this.app=e,t.isInitialized())return this * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */S.Persistence=f;class N{constructor(){this.providerId="phone",this._delegate=new r.i(w(t.a.auth()))}static credential(e,t){return r.i.credential(e,t)}verifyPhoneNumber(e,t){return this._delegate.verifyPhoneNumber(e,t)}unwrap(){return this._delegate}}N.PHONE_SIGN_IN_METHOD=r.i.PHONE_SIGN_IN_METHOD,N.PROVIDER_ID=r.i.PROVIDER_ID; + */k.Persistence=f;class N{constructor(){this.providerId="phone",this._delegate=new r.i(w(t.a.auth()))}static credential(e,t){return r.i.credential(e,t)}verifyPhoneNumber(e,t){return this._delegate.verifyPhoneNumber(e,t)}unwrap(){return this._delegate}}N.PHONE_SIGN_IN_METHOD=r.i.PHONE_SIGN_IN_METHOD,N.PROVIDER_ID=r.i.PROVIDER_ID; /** * @license * Copyright 2020 Google LLC @@ -4404,7 +4967,7 @@ const k=r.p;class S{constructor(e,t){if(this.app=e,t.isInitialized())return this * See the License for the specific language governing permissions and * limitations under the License. */ -const O=r.p;class C{constructor(e,n,i=t.a.app()){var s;O(null===(s=i.options)||void 0===s?void 0:s.apiKey,"invalid-api-key",{appName:i.name}),this._delegate=new r.l(e,n,i.auth()),this.type=this._delegate.type}clear(){this._delegate.clear()}render(){return this._delegate.render()}verify(){return this._delegate.verify()}} +const D=r.p;class O{constructor(e,n,i=t.a.app()){var s;D(null===(s=i.options)||void 0===s?void 0:s.apiKey,"invalid-api-key",{appName:i.name}),this._delegate=new r.l(e,n,i.auth()),this.type=this._delegate.type}clear(){this._delegate.clear()}render(){return this._delegate.render()}verify(){return this._delegate.verify()}} /** * @license * Copyright 2020 Google LLC @@ -4420,7 +4983,7 @@ const O=r.p;class C{constructor(e,n,i=t.a.app()){var s;O(null===(s=i.options)||v * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */var D;(D=t.a).INTERNAL.registerComponent(new i.a("auth-compat",e=>{const t=e.getProvider("app-compat").getImmediate(),n=e.getProvider("auth");return new S(t,n)},"PUBLIC").setServiceProps({ActionCodeInfo:{Operation:{EMAIL_SIGNIN:r.a.EMAIL_SIGNIN,PASSWORD_RESET:r.a.PASSWORD_RESET,RECOVER_EMAIL:r.a.RECOVER_EMAIL,REVERT_SECOND_FACTOR_ADDITION:r.a.REVERT_SECOND_FACTOR_ADDITION,VERIFY_AND_CHANGE_EMAIL:r.a.VERIFY_AND_CHANGE_EMAIL,VERIFY_EMAIL:r.a.VERIFY_EMAIL}},EmailAuthProvider:r.c,FacebookAuthProvider:r.d,GithubAuthProvider:r.e,GoogleAuthProvider:r.f,OAuthProvider:r.h,SAMLAuthProvider:r.n,PhoneAuthProvider:N,PhoneMultiFactorGenerator:r.j,RecaptchaVerifier:C,TwitterAuthProvider:r.o,Auth:S,AuthCredential:r.b,Error:s.c}).setInstantiationMode("LAZY").setMultipleInstances(!1)),D.registerVersion("@firebase/auth-compat","0.2.4")}).call(this,n(8))},function(e,t){var n,r,i=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(e){n=s}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var c,u=[],h=!1,l=-1;function d(){h&&c&&(h=!1,c.length?u=c.concat(u):l=-1,u.length&&f())}function f(){if(!h){var e=a(d);h=!0;for(var t=u.length;t;){for(c=u,u=[];++l1)for(var n=1;n{const t=e.getProvider("app-compat").getImmediate(),n=e.getProvider("auth");return new k(t,n)},"PUBLIC").setServiceProps({ActionCodeInfo:{Operation:{EMAIL_SIGNIN:r.a.EMAIL_SIGNIN,PASSWORD_RESET:r.a.PASSWORD_RESET,RECOVER_EMAIL:r.a.RECOVER_EMAIL,REVERT_SECOND_FACTOR_ADDITION:r.a.REVERT_SECOND_FACTOR_ADDITION,VERIFY_AND_CHANGE_EMAIL:r.a.VERIFY_AND_CHANGE_EMAIL,VERIFY_EMAIL:r.a.VERIFY_EMAIL}},EmailAuthProvider:r.c,FacebookAuthProvider:r.d,GithubAuthProvider:r.e,GoogleAuthProvider:r.f,OAuthProvider:r.h,SAMLAuthProvider:r.n,PhoneAuthProvider:N,PhoneMultiFactorGenerator:r.j,RecaptchaVerifier:O,TwitterAuthProvider:r.o,Auth:k,AuthCredential:r.b,Error:s.c}).setInstantiationMode("LAZY").setMultipleInstances(!1)),R.registerVersion("@firebase/auth-compat","0.4.2")}).call(this,n(8))},function(e,t,n){"use strict";n.r(t);var r=n(2);n.d(t,"AbstractUserDataWriter",(function(){return r.a})),n.d(t,"AggregateField",(function(){return r.b})),n.d(t,"AggregateQuerySnapshot",(function(){return r.c})),n.d(t,"Bytes",(function(){return r.d})),n.d(t,"CACHE_SIZE_UNLIMITED",(function(){return r.e})),n.d(t,"CollectionReference",(function(){return r.f})),n.d(t,"DocumentReference",(function(){return r.g})),n.d(t,"DocumentSnapshot",(function(){return r.h})),n.d(t,"FieldPath",(function(){return r.i})),n.d(t,"FieldValue",(function(){return r.j})),n.d(t,"Firestore",(function(){return r.k})),n.d(t,"FirestoreError",(function(){return r.l})),n.d(t,"GeoPoint",(function(){return r.m})),n.d(t,"LoadBundleTask",(function(){return r.n})),n.d(t,"Query",(function(){return r.o})),n.d(t,"QueryCompositeFilterConstraint",(function(){return r.p})),n.d(t,"QueryConstraint",(function(){return r.q})),n.d(t,"QueryDocumentSnapshot",(function(){return r.r})),n.d(t,"QueryEndAtConstraint",(function(){return r.s})),n.d(t,"QueryFieldFilterConstraint",(function(){return r.t})),n.d(t,"QueryLimitConstraint",(function(){return r.u})),n.d(t,"QueryOrderByConstraint",(function(){return r.v})),n.d(t,"QuerySnapshot",(function(){return r.w})),n.d(t,"QueryStartAtConstraint",(function(){return r.x})),n.d(t,"SnapshotMetadata",(function(){return r.y})),n.d(t,"Timestamp",(function(){return r.z})),n.d(t,"Transaction",(function(){return r.A})),n.d(t,"WriteBatch",(function(){return r.B})),n.d(t,"_DatabaseId",(function(){return r.C})),n.d(t,"_DocumentKey",(function(){return r.D})),n.d(t,"_EmptyAppCheckTokenProvider",(function(){return r.E})),n.d(t,"_EmptyAuthCredentialsProvider",(function(){return r.F})),n.d(t,"_FieldPath",(function(){return r.G})),n.d(t,"_TestingHooks",(function(){return r.H})),n.d(t,"_cast",(function(){return r.I})),n.d(t,"_debugAssert",(function(){return r.J})),n.d(t,"_isBase64Available",(function(){return r.K})),n.d(t,"_logWarn",(function(){return r.L})),n.d(t,"_validateIsNotUsedTogether",(function(){return r.M})),n.d(t,"addDoc",(function(){return r.N})),n.d(t,"aggregateFieldEqual",(function(){return r.O})),n.d(t,"aggregateQuerySnapshotEqual",(function(){return r.P})),n.d(t,"and",(function(){return r.Q})),n.d(t,"arrayRemove",(function(){return r.R})),n.d(t,"arrayUnion",(function(){return r.S})),n.d(t,"average",(function(){return r.T})),n.d(t,"clearIndexedDbPersistence",(function(){return r.U})),n.d(t,"collection",(function(){return r.V})),n.d(t,"collectionGroup",(function(){return r.W})),n.d(t,"connectFirestoreEmulator",(function(){return r.X})),n.d(t,"count",(function(){return r.Y})),n.d(t,"deleteDoc",(function(){return r.Z})),n.d(t,"deleteField",(function(){return r.ab})),n.d(t,"disableNetwork",(function(){return r.bb})),n.d(t,"doc",(function(){return r.cb})),n.d(t,"documentId",(function(){return r.db})),n.d(t,"enableIndexedDbPersistence",(function(){return r.eb})),n.d(t,"enableMultiTabIndexedDbPersistence",(function(){return r.fb})),n.d(t,"enableNetwork",(function(){return r.gb})),n.d(t,"endAt",(function(){return r.hb})),n.d(t,"endBefore",(function(){return r.ib})),n.d(t,"ensureFirestoreConfigured",(function(){return r.jb})),n.d(t,"executeWrite",(function(){return r.kb})),n.d(t,"getAggregateFromServer",(function(){return r.lb})),n.d(t,"getCountFromServer",(function(){return r.mb})),n.d(t,"getDoc",(function(){return r.nb})),n.d(t,"getDocFromCache",(function(){return r.ob})),n.d(t,"getDocFromServer",(function(){return r.pb})),n.d(t,"getDocs",(function(){return r.qb})),n.d(t,"getDocsFromCache",(function(){return r.rb})),n.d(t,"getDocsFromServer",(function(){return r.sb})),n.d(t,"getFirestore",(function(){return r.tb})),n.d(t,"increment",(function(){return r.ub})),n.d(t,"initializeFirestore",(function(){return r.vb})),n.d(t,"limit",(function(){return r.wb})),n.d(t,"limitToLast",(function(){return r.xb})),n.d(t,"loadBundle",(function(){return r.yb})),n.d(t,"memoryEagerGarbageCollector",(function(){return r.zb})),n.d(t,"memoryLocalCache",(function(){return r.Ab})),n.d(t,"memoryLruGarbageCollector",(function(){return r.Bb})),n.d(t,"namedQuery",(function(){return r.Cb})),n.d(t,"onSnapshot",(function(){return r.Db})),n.d(t,"onSnapshotsInSync",(function(){return r.Eb})),n.d(t,"or",(function(){return r.Fb})),n.d(t,"orderBy",(function(){return r.Gb})),n.d(t,"persistentLocalCache",(function(){return r.Hb})),n.d(t,"persistentMultipleTabManager",(function(){return r.Ib})),n.d(t,"persistentSingleTabManager",(function(){return r.Jb})),n.d(t,"query",(function(){return r.Kb})),n.d(t,"queryEqual",(function(){return r.Lb})),n.d(t,"refEqual",(function(){return r.Mb})),n.d(t,"runTransaction",(function(){return r.Nb})),n.d(t,"serverTimestamp",(function(){return r.Ob})),n.d(t,"setDoc",(function(){return r.Pb})),n.d(t,"setIndexConfiguration",(function(){return r.Qb})),n.d(t,"setLogLevel",(function(){return r.Rb})),n.d(t,"snapshotEqual",(function(){return r.Sb})),n.d(t,"startAfter",(function(){return r.Tb})),n.d(t,"startAt",(function(){return r.Ub})),n.d(t,"sum",(function(){return r.Vb})),n.d(t,"terminate",(function(){return r.Wb})),n.d(t,"updateDoc",(function(){return r.Xb})),n.d(t,"waitForPendingWrites",(function(){return r.Yb})),n.d(t,"where",(function(){return r.Zb})),n.d(t,"writeBatch",(function(){return r.ac}))},function(e,t,n){"use strict";n.r(t);var r=n(7),i=n(2),s=n(0),o=n(6); /** * @license * Copyright 2021 Google LLC @@ -4437,7 +5000,7 @@ const O=r.p;class C{constructor(e,n,i=t.a.app()){var s;O(null===(s=i.options)||v * See the License for the specific language governing permissions and * limitations under the License. */ -function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0!==t.merge)throw new i.j("invalid-argument",`Invalid options passed to function ${e}(): You cannot specify both "merge" and "mergeFields".`);return t} +function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0!==t.merge)throw new i.l("invalid-argument",`Invalid options passed to function ${e}(): You cannot specify both "merge" and "mergeFields".`);return t} /** * @license * Copyright 2017 Google LLC @@ -4453,7 +5016,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function c(){if("undefined"==typeof Uint8Array)throw new i.j("unimplemented","Uint8Arrays are not available in this environment.")}function u(){if(!Object(i.B)())throw new i.j("unimplemented","Blobs are unavailable in Firestore in this environment.")}class h{constructor(e){this._delegate=e}static fromBase64String(e){return u(),new h(i.b.fromBase64String(e))}static fromUint8Array(e){return c(),new h(i.b.fromUint8Array(e))}toBase64(){return u(),this._delegate.toBase64()}toUint8Array(){return c(),this._delegate.toUint8Array()}isEqual(e){return this._delegate.isEqual(e._delegate)}toString(){return"Blob(base64: "+this.toBase64()+")"}} + */function c(){if("undefined"==typeof Uint8Array)throw new i.l("unimplemented","Uint8Arrays are not available in this environment.")}function u(){if(!Object(i.K)())throw new i.l("unimplemented","Blobs are unavailable in Firestore in this environment.")}class l{constructor(e){this._delegate=e}static fromBase64String(e){return u(),new l(i.d.fromBase64String(e))}static fromUint8Array(e){return c(),new l(i.d.fromUint8Array(e))}toBase64(){return u(),this._delegate.toBase64()}toUint8Array(){return c(),this._delegate.toUint8Array()}isEqual(e){return this._delegate.isEqual(e._delegate)}toString(){return"Blob(base64: "+this.toBase64()+")"}} /** * @license * Copyright 2017 Google LLC @@ -4469,7 +5032,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */function l(e){return function(e,t){if("object"!=typeof e||null===e)return!1;const n=e;for(const e of t)if(e in n&&"function"==typeof n[e])return!0;return!1} + */function h(e){return function(e,t){if("object"!=typeof e||null===e)return!1;const n=e;for(const e of t)if(e in n&&"function"==typeof n[e])return!0;return!1} /** * @license * Copyright 2017 Google LLC @@ -4485,7 +5048,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */(e,["next","error","complete"])}class d{enableIndexedDbPersistence(e,t){return Object(i.Q)(e._delegate,{forceOwnership:t})}enableMultiTabIndexedDbPersistence(e){return Object(i.R)(e._delegate)}clearIndexedDbPersistence(e){return Object(i.H)(e._delegate)}}class f{constructor(e,t,n){this._delegate=t,this._persistenceProvider=n,this.INTERNAL={delete:()=>this.terminate()},e instanceof i.u||(this._appCompat=e)}get _databaseId(){return this._delegate._databaseId}settings(e){const t=this._delegate._getSettings();e.merge||t.host===e.host||Object(i.C)("You are overriding the original host. If you did not intend to override your settings, use {merge: true}."),e.merge&&delete(e=Object.assign(Object.assign({},t),e)).merge,this._delegate._setSettings(e)}useEmulator(e,t,n={}){Object(i.K)(this._delegate,e,t,n)}enableNetwork(){return Object(i.S)(this._delegate)}disableNetwork(){return Object(i.N)(this._delegate)}enablePersistence(e){let t=!1,n=!1;return e&&(t=!!e.synchronizeTabs,n=!!e.experimentalForceOwningTab,Object(i.D)("synchronizeTabs",t,"experimentalForceOwningTab",n)),t?this._persistenceProvider.enableMultiTabIndexedDbPersistence(this):this._persistenceProvider.enableIndexedDbPersistence(this,n)}clearPersistence(){return this._persistenceProvider.clearIndexedDbPersistence(this)}terminate(){return this._appCompat&&(this._appCompat._removeServiceInstance("firestore-compat"),this._appCompat._removeServiceInstance("firestore")),this._delegate._delete()}waitForPendingWrites(){return Object(i.zb)(this._delegate)}onSnapshotsInSync(e){return Object(i.lb)(this._delegate,e)}get app(){if(!this._appCompat)throw new i.j("failed-precondition","Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._appCompat}collection(e){try{return new A(this,Object(i.I)(this._delegate,e))}catch(e){throw w(e,"collection()","Firestore.collection()")}}doc(e){try{return new v(this,Object(i.O)(this._delegate,e))}catch(e){throw w(e,"doc()","Firestore.doc()")}}collectionGroup(e){try{return new E(this,Object(i.J)(this._delegate,e))}catch(e){throw w(e,"collectionGroup()","Firestore.collectionGroup()")}}runTransaction(e){return Object(i.qb)(this._delegate,t=>e(new m(this,t)))}batch(){return Object(i.V)(this._delegate),new g(new i.t(this._delegate,e=>Object(i.W)(this._delegate,e)))}loadBundle(e){return Object(i.ib)(this._delegate,e)}namedQuery(e){return Object(i.jb)(this._delegate,e).then(e=>e?new E(this,e):null)}}class p extends i.a{constructor(e){super(),this.firestore=e}convertBytes(e){return new h(new i.b(e))}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return v.forKey(t,this.firestore,null)}}class m{constructor(e,t){this._firestore=e,this._delegate=t,this._userDataWriter=new p(e)}get(e){const t=N(e);return this._delegate.get(t).then(e=>new _(this._firestore,new i.f(this._firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,t.converter)))}set(e,t,n){const r=N(e);return n?(a("Transaction.set",n),this._delegate.set(r,t,n)):this._delegate.set(r,t),this}update(e,t,n,...r){const i=N(e);return 2===arguments.length?this._delegate.update(i,t):this._delegate.update(i,t,n,...r),this}delete(e){const t=N(e);return this._delegate.delete(t),this}}class g{constructor(e){this._delegate=e}set(e,t,n){const r=N(e);return n?(a("WriteBatch.set",n),this._delegate.set(r,t,n)):this._delegate.set(r,t),this}update(e,t,n,...r){const i=N(e);return 2===arguments.length?this._delegate.update(i,t):this._delegate.update(i,t,n,...r),this}delete(e){const t=N(e);return this._delegate.delete(t),this}commit(){return this._delegate.commit()}}class y{constructor(e,t,n){this._firestore=e,this._userDataWriter=t,this._delegate=n}fromFirestore(e,t){const n=new i.o(this._firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,null);return this._delegate.fromFirestore(new T(this._firestore,n),null!=t?t:{})}toFirestore(e,t){return t?this._delegate.toFirestore(e,t):this._delegate.toFirestore(e)}static getInstance(e,t){const n=y.INSTANCES;let r=n.get(e);r||(r=new WeakMap,n.set(e,r));let i=r.get(t);return i||(i=new y(e,new p(e),t),r.set(t,i)),i}}y.INSTANCES=new WeakMap;class v{constructor(e,t){this.firestore=e,this._delegate=t,this._userDataWriter=new p(e)}static forPath(e,t,n){if(e.length%2!=0)throw new i.j("invalid-argument",`Invalid document reference. Document references must have an even number of segments, but ${e.canonicalString()} has ${e.length}`);return new v(t,new i.e(t._delegate,n,new i.v(e)))}static forKey(e,t,n){return new v(t,new i.e(t._delegate,n,e))}get id(){return this._delegate.id}get parent(){return new A(this.firestore,this._delegate.parent)}get path(){return this._delegate.path}collection(e){try{return new A(this.firestore,Object(i.I)(this._delegate,e))}catch(e){throw w(e,"collection()","DocumentReference.collection()")}}isEqual(e){return(e=Object(s.k)(e))instanceof i.e&&Object(i.pb)(this._delegate,e)}set(e,t){t=a("DocumentReference.set",t);try{return t?Object(i.sb)(this._delegate,e,t):Object(i.sb)(this._delegate,e)}catch(e){throw w(e,"setDoc()","DocumentReference.set()")}}update(e,t,...n){try{return 1===arguments.length?Object(i.yb)(this._delegate,e):Object(i.yb)(this._delegate,e,t,...n)}catch(e){throw w(e,"updateDoc()","DocumentReference.update()")}}delete(){return Object(i.L)(this._delegate)}onSnapshot(...e){const t=b(e),n=I(e,e=>new _(this.firestore,new i.f(this.firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,this._delegate.converter)));return Object(i.kb)(this._delegate,t,n)}get(e){let t;return t="cache"===(null==e?void 0:e.source)?Object(i.Y)(this._delegate):"server"===(null==e?void 0:e.source)?Object(i.Z)(this._delegate):Object(i.X)(this._delegate),t.then(e=>new _(this.firestore,new i.f(this.firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,this._delegate.converter)))}withConverter(e){return new v(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}function w(e,t,n){return e.message=e.message.replace(t,n),e}function b(e){for(const t of e)if("object"==typeof t&&!l(t))return t;return{}}function I(e,t){var n,r;let i;return i=l(e[0])?e[0]:l(e[1])?e[1]:"function"==typeof e[0]?{next:e[0],error:e[1],complete:e[2]}:{next:e[1],error:e[2],complete:e[3]},{next:e=>{i.next&&i.next(t(e))},error:null===(n=i.error)||void 0===n?void 0:n.bind(i),complete:null===(r=i.complete)||void 0===r?void 0:r.bind(i)}}class _{constructor(e,t){this._firestore=e,this._delegate=t}get ref(){return new v(this._firestore,this._delegate.ref)}get id(){return this._delegate.id}get metadata(){return this._delegate.metadata}get exists(){return this._delegate.exists()}data(e){return this._delegate.data(e)}get(e,t){return this._delegate.get(e,t)}isEqual(e){return Object(i.ub)(this._delegate,e._delegate)}}class T extends _{data(e){const t=this._delegate.data(e);return Object(i.A)(void 0!==t,"Document in a QueryDocumentSnapshot should exist"),t}}class E{constructor(e,t){this.firestore=e,this._delegate=t,this._userDataWriter=new p(e)}where(e,t,n){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.Ab)(e,t,n)))}catch(e){throw w(e,/(orderBy|where)\(\)/,"Query.$1()")}}orderBy(e,t){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.mb)(e,t)))}catch(e){throw w(e,/(orderBy|where)\(\)/,"Query.$1()")}}limit(e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.gb)(e)))}catch(e){throw w(e,"limit()","Query.limit()")}}limitToLast(e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.hb)(e)))}catch(e){throw w(e,"limitToLast()","Query.limitToLast()")}}startAt(...e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.wb)(...e)))}catch(e){throw w(e,"startAt()","Query.startAt()")}}startAfter(...e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.vb)(...e)))}catch(e){throw w(e,"startAfter()","Query.startAfter()")}}endBefore(...e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.U)(...e)))}catch(e){throw w(e,"endBefore()","Query.endBefore()")}}endAt(...e){try{return new E(this.firestore,Object(i.nb)(this._delegate,Object(i.T)(...e)))}catch(e){throw w(e,"endAt()","Query.endAt()")}}isEqual(e){return Object(i.ob)(this._delegate,e._delegate)}get(e){let t;return t="cache"===(null==e?void 0:e.source)?Object(i.bb)(this._delegate):"server"===(null==e?void 0:e.source)?Object(i.cb)(this._delegate):Object(i.ab)(this._delegate),t.then(e=>new S(this.firestore,new i.p(this.firestore._delegate,this._userDataWriter,this._delegate,e._snapshot)))}onSnapshot(...e){const t=b(e),n=I(e,e=>new S(this.firestore,new i.p(this.firestore._delegate,this._userDataWriter,this._delegate,e._snapshot)));return Object(i.kb)(this._delegate,t,n)}withConverter(e){return new E(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}class k{constructor(e,t){this._firestore=e,this._delegate=t}get type(){return this._delegate.type}get doc(){return new T(this._firestore,this._delegate.doc)}get oldIndex(){return this._delegate.oldIndex}get newIndex(){return this._delegate.newIndex}}class S{constructor(e,t){this._firestore=e,this._delegate=t}get query(){return new E(this._firestore,this._delegate.query)}get metadata(){return this._delegate.metadata}get size(){return this._delegate.size}get empty(){return this._delegate.empty}get docs(){return this._delegate.docs.map(e=>new T(this._firestore,e))}docChanges(e){return this._delegate.docChanges(e).map(e=>new k(this._firestore,e))}forEach(e,t){this._delegate.forEach(n=>{e.call(t,new T(this._firestore,n))})}isEqual(e){return Object(i.ub)(this._delegate,e._delegate)}}class A extends E{constructor(e,t){super(e,t),this.firestore=e,this._delegate=t}get id(){return this._delegate.id}get path(){return this._delegate.path}get parent(){const e=this._delegate.parent;return e?new v(this.firestore,e):null}doc(e){try{return new v(this.firestore,void 0===e?Object(i.O)(this._delegate):Object(i.O)(this._delegate,e))}catch(e){throw w(e,"doc()","CollectionReference.doc()")}}add(e){return Object(i.E)(this._delegate,e).then(e=>new v(this.firestore,e))}isEqual(e){return Object(i.pb)(this._delegate,e._delegate)}withConverter(e){return new A(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}function N(e){return Object(i.z)(e,i.e)} + */(e,["next","error","complete"])}class d{enableIndexedDbPersistence(e,t){return Object(i.eb)(e._delegate,{forceOwnership:t})}enableMultiTabIndexedDbPersistence(e){return Object(i.fb)(e._delegate)}clearIndexedDbPersistence(e){return Object(i.U)(e._delegate)}}class f{constructor(e,t,n){this._delegate=t,this._persistenceProvider=n,this.INTERNAL={delete:()=>this.terminate()},e instanceof i.C||(this._appCompat=e)}get _databaseId(){return this._delegate._databaseId}settings(e){const t=this._delegate._getSettings();e.merge||t.host===e.host||Object(i.L)("You are overriding the original host. If you did not intend to override your settings, use {merge: true}."),e.merge&&delete(e=Object.assign(Object.assign({},t),e)).merge,this._delegate._setSettings(e)}useEmulator(e,t,n={}){Object(i.X)(this._delegate,e,t,n)}enableNetwork(){return Object(i.gb)(this._delegate)}disableNetwork(){return Object(i.bb)(this._delegate)}enablePersistence(e){let t=!1,n=!1;return e&&(t=!!e.synchronizeTabs,n=!!e.experimentalForceOwningTab,Object(i.M)("synchronizeTabs",t,"experimentalForceOwningTab",n)),t?this._persistenceProvider.enableMultiTabIndexedDbPersistence(this):this._persistenceProvider.enableIndexedDbPersistence(this,n)}clearPersistence(){return this._persistenceProvider.clearIndexedDbPersistence(this)}terminate(){return this._appCompat&&(this._appCompat._removeServiceInstance("firestore-compat"),this._appCompat._removeServiceInstance("firestore")),this._delegate._delete()}waitForPendingWrites(){return Object(i.Yb)(this._delegate)}onSnapshotsInSync(e){return Object(i.Eb)(this._delegate,e)}get app(){if(!this._appCompat)throw new i.l("failed-precondition","Firestore was not initialized using the Firebase SDK. 'app' is not available");return this._appCompat}collection(e){try{return new C(this,Object(i.V)(this._delegate,e))}catch(e){throw w(e,"collection()","Firestore.collection()")}}doc(e){try{return new v(this,Object(i.cb)(this._delegate,e))}catch(e){throw w(e,"doc()","Firestore.doc()")}}collectionGroup(e){try{return new E(this,Object(i.W)(this._delegate,e))}catch(e){throw w(e,"collectionGroup()","Firestore.collectionGroup()")}}runTransaction(e){return Object(i.Nb)(this._delegate,t=>e(new g(this,t)))}batch(){return Object(i.jb)(this._delegate),new m(new i.B(this._delegate,e=>Object(i.kb)(this._delegate,e)))}loadBundle(e){return Object(i.yb)(this._delegate,e)}namedQuery(e){return Object(i.Cb)(this._delegate,e).then(e=>e?new E(this,e):null)}}class p extends i.a{constructor(e){super(),this.firestore=e}convertBytes(e){return new l(new i.d(e))}convertReference(e){const t=this.convertDocumentKey(e,this.firestore._databaseId);return v.forKey(t,this.firestore,null)}}class g{constructor(e,t){this._firestore=e,this._delegate=t,this._userDataWriter=new p(e)}get(e){const t=A(e);return this._delegate.get(t).then(e=>new _(this._firestore,new i.h(this._firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,t.converter)))}set(e,t,n){const r=A(e);return n?(a("Transaction.set",n),this._delegate.set(r,t,n)):this._delegate.set(r,t),this}update(e,t,n,...r){const i=A(e);return 2===arguments.length?this._delegate.update(i,t):this._delegate.update(i,t,n,...r),this}delete(e){const t=A(e);return this._delegate.delete(t),this}}class m{constructor(e){this._delegate=e}set(e,t,n){const r=A(e);return n?(a("WriteBatch.set",n),this._delegate.set(r,t,n)):this._delegate.set(r,t),this}update(e,t,n,...r){const i=A(e);return 2===arguments.length?this._delegate.update(i,t):this._delegate.update(i,t,n,...r),this}delete(e){const t=A(e);return this._delegate.delete(t),this}commit(){return this._delegate.commit()}}class y{constructor(e,t,n){this._firestore=e,this._userDataWriter=t,this._delegate=n}fromFirestore(e,t){const n=new i.r(this._firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,null);return this._delegate.fromFirestore(new T(this._firestore,n),null!=t?t:{})}toFirestore(e,t){return t?this._delegate.toFirestore(e,t):this._delegate.toFirestore(e)}static getInstance(e,t){const n=y.INSTANCES;let r=n.get(e);r||(r=new WeakMap,n.set(e,r));let i=r.get(t);return i||(i=new y(e,new p(e),t),r.set(t,i)),i}}y.INSTANCES=new WeakMap;class v{constructor(e,t){this.firestore=e,this._delegate=t,this._userDataWriter=new p(e)}static forPath(e,t,n){if(e.length%2!=0)throw new i.l("invalid-argument",`Invalid document reference. Document references must have an even number of segments, but ${e.canonicalString()} has ${e.length}`);return new v(t,new i.g(t._delegate,n,new i.D(e)))}static forKey(e,t,n){return new v(t,new i.g(t._delegate,n,e))}get id(){return this._delegate.id}get parent(){return new C(this.firestore,this._delegate.parent)}get path(){return this._delegate.path}collection(e){try{return new C(this.firestore,Object(i.V)(this._delegate,e))}catch(e){throw w(e,"collection()","DocumentReference.collection()")}}isEqual(e){return(e=Object(s.p)(e))instanceof i.g&&Object(i.Mb)(this._delegate,e)}set(e,t){t=a("DocumentReference.set",t);try{return t?Object(i.Pb)(this._delegate,e,t):Object(i.Pb)(this._delegate,e)}catch(e){throw w(e,"setDoc()","DocumentReference.set()")}}update(e,t,...n){try{return 1===arguments.length?Object(i.Xb)(this._delegate,e):Object(i.Xb)(this._delegate,e,t,...n)}catch(e){throw w(e,"updateDoc()","DocumentReference.update()")}}delete(){return Object(i.Z)(this._delegate)}onSnapshot(...e){const t=b(e),n=I(e,e=>new _(this.firestore,new i.h(this.firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,this._delegate.converter)));return Object(i.Db)(this._delegate,t,n)}get(e){let t;return t="cache"===(null==e?void 0:e.source)?Object(i.ob)(this._delegate):"server"===(null==e?void 0:e.source)?Object(i.pb)(this._delegate):Object(i.nb)(this._delegate),t.then(e=>new _(this.firestore,new i.h(this.firestore._delegate,this._userDataWriter,e._key,e._document,e.metadata,this._delegate.converter)))}withConverter(e){return new v(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}function w(e,t,n){return e.message=e.message.replace(t,n),e}function b(e){for(const t of e)if("object"==typeof t&&!h(t))return t;return{}}function I(e,t){var n,r;let i;return i=h(e[0])?e[0]:h(e[1])?e[1]:"function"==typeof e[0]?{next:e[0],error:e[1],complete:e[2]}:{next:e[1],error:e[2],complete:e[3]},{next:e=>{i.next&&i.next(t(e))},error:null===(n=i.error)||void 0===n?void 0:n.bind(i),complete:null===(r=i.complete)||void 0===r?void 0:r.bind(i)}}class _{constructor(e,t){this._firestore=e,this._delegate=t}get ref(){return new v(this._firestore,this._delegate.ref)}get id(){return this._delegate.id}get metadata(){return this._delegate.metadata}get exists(){return this._delegate.exists()}data(e){return this._delegate.data(e)}get(e,t){return this._delegate.get(e,t)}isEqual(e){return Object(i.Sb)(this._delegate,e._delegate)}}class T extends _{data(e){const t=this._delegate.data(e);return Object(i.J)(void 0!==t,"Document in a QueryDocumentSnapshot should exist"),t}}class E{constructor(e,t){this.firestore=e,this._delegate=t,this._userDataWriter=new p(e)}where(e,t,n){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.Zb)(e,t,n)))}catch(e){throw w(e,/(orderBy|where)\(\)/,"Query.$1()")}}orderBy(e,t){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.Gb)(e,t)))}catch(e){throw w(e,/(orderBy|where)\(\)/,"Query.$1()")}}limit(e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.wb)(e)))}catch(e){throw w(e,"limit()","Query.limit()")}}limitToLast(e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.xb)(e)))}catch(e){throw w(e,"limitToLast()","Query.limitToLast()")}}startAt(...e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.Ub)(...e)))}catch(e){throw w(e,"startAt()","Query.startAt()")}}startAfter(...e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.Tb)(...e)))}catch(e){throw w(e,"startAfter()","Query.startAfter()")}}endBefore(...e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.ib)(...e)))}catch(e){throw w(e,"endBefore()","Query.endBefore()")}}endAt(...e){try{return new E(this.firestore,Object(i.Kb)(this._delegate,Object(i.hb)(...e)))}catch(e){throw w(e,"endAt()","Query.endAt()")}}isEqual(e){return Object(i.Lb)(this._delegate,e._delegate)}get(e){let t;return t="cache"===(null==e?void 0:e.source)?Object(i.rb)(this._delegate):"server"===(null==e?void 0:e.source)?Object(i.sb)(this._delegate):Object(i.qb)(this._delegate),t.then(e=>new k(this.firestore,new i.w(this.firestore._delegate,this._userDataWriter,this._delegate,e._snapshot)))}onSnapshot(...e){const t=b(e),n=I(e,e=>new k(this.firestore,new i.w(this.firestore._delegate,this._userDataWriter,this._delegate,e._snapshot)));return Object(i.Db)(this._delegate,t,n)}withConverter(e){return new E(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}class S{constructor(e,t){this._firestore=e,this._delegate=t}get type(){return this._delegate.type}get doc(){return new T(this._firestore,this._delegate.doc)}get oldIndex(){return this._delegate.oldIndex}get newIndex(){return this._delegate.newIndex}}class k{constructor(e,t){this._firestore=e,this._delegate=t}get query(){return new E(this._firestore,this._delegate.query)}get metadata(){return this._delegate.metadata}get size(){return this._delegate.size}get empty(){return this._delegate.empty}get docs(){return this._delegate.docs.map(e=>new T(this._firestore,e))}docChanges(e){return this._delegate.docChanges(e).map(e=>new S(this._firestore,e))}forEach(e,t){this._delegate.forEach(n=>{e.call(t,new T(this._firestore,n))})}isEqual(e){return Object(i.Sb)(this._delegate,e._delegate)}}class C extends E{constructor(e,t){super(e,t),this.firestore=e,this._delegate=t}get id(){return this._delegate.id}get path(){return this._delegate.path}get parent(){const e=this._delegate.parent;return e?new v(this.firestore,e):null}doc(e){try{return new v(this.firestore,void 0===e?Object(i.cb)(this._delegate):Object(i.cb)(this._delegate,e))}catch(e){throw w(e,"doc()","CollectionReference.doc()")}}add(e){return Object(i.N)(this._delegate,e).then(e=>new v(this.firestore,e))}isEqual(e){return Object(i.Mb)(this._delegate,e._delegate)}withConverter(e){return new C(this.firestore,e?this._delegate.withConverter(y.getInstance(this.firestore,e)):this._delegate.withConverter(null))}}function A(e){return Object(i.I)(e,i.g)} /** * @license * Copyright 2017 Google LLC @@ -4501,7 +5064,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class O{constructor(...e){this._delegate=new i.g(...e)}static documentId(){return new O(i.y.keyField().canonicalString())}isEqual(e){return(e=Object(s.k)(e))instanceof i.g&&this._delegate._internalPath.isEqual(e._internalPath)}} + */class N{constructor(...e){this._delegate=new i.i(...e)}static documentId(){return new N(i.G.keyField().canonicalString())}isEqual(e){return(e=Object(s.p)(e))instanceof i.i&&this._delegate._internalPath.isEqual(e._internalPath)}} /** * @license * Copyright 2017 Google LLC @@ -4517,7 +5080,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */class C{constructor(e){this._delegate=e}static serverTimestamp(){const e=Object(i.rb)();return e._methodName="FieldValue.serverTimestamp",new C(e)}static delete(){const e=Object(i.M)();return e._methodName="FieldValue.delete",new C(e)}static arrayUnion(...e){const t=Object(i.G)(...e);return t._methodName="FieldValue.arrayUnion",new C(t)}static arrayRemove(...e){const t=Object(i.F)(...e);return t._methodName="FieldValue.arrayRemove",new C(t)}static increment(e){const t=Object(i.eb)(e);return t._methodName="FieldValue.increment",new C(t)}isEqual(e){return this._delegate.isEqual(e._delegate)}} + */class D{constructor(e){this._delegate=e}static serverTimestamp(){const e=Object(i.Ob)();return e._methodName="FieldValue.serverTimestamp",new D(e)}static delete(){const e=Object(i.ab)();return e._methodName="FieldValue.delete",new D(e)}static arrayUnion(...e){const t=Object(i.S)(...e);return t._methodName="FieldValue.arrayUnion",new D(t)}static arrayRemove(...e){const t=Object(i.R)(...e);return t._methodName="FieldValue.arrayRemove",new D(t)}static increment(e){const t=Object(i.ub)(e);return t._methodName="FieldValue.increment",new D(t)}isEqual(e){return this._delegate.isEqual(e._delegate)}} /** * @license * Copyright 2021 Google LLC @@ -4533,7 +5096,7 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */const D={Firestore:f,GeoPoint:i.k,Timestamp:i.r,Blob:h,Transaction:m,WriteBatch:g,DocumentReference:v,DocumentSnapshot:_,Query:E,QueryDocumentSnapshot:T,QuerySnapshot:S,CollectionReference:A,FieldPath:O,FieldValue:C,setLogLevel:function(e){Object(i.tb)(e)},CACHE_SIZE_UNLIMITED:i.c}; + */const O={Firestore:f,GeoPoint:i.m,Timestamp:i.z,Blob:l,Transaction:g,WriteBatch:m,DocumentReference:v,DocumentSnapshot:_,Query:E,QueryDocumentSnapshot:T,QuerySnapshot:k,CollectionReference:C,FieldPath:N,FieldValue:D,setLogLevel:function(e){Object(i.Rb)(e)},CACHE_SIZE_UNLIMITED:i.e}; /** * @license * Copyright 2020 Google LLC @@ -4550,5 +5113,5 @@ function a(e,t){if(void 0===t)return{merge:!1};if(void 0!==t.mergeFields&&void 0 * See the License for the specific language governing permissions and * limitations under the License. */ -var R,P;R=r.a,P=(e,t)=>new f(e,t,new d),R.INTERNAL.registerComponent(new o.a("firestore-compat",e=>{const t=e.getProvider("app-compat").getImmediate(),n=e.getProvider("firestore").getImmediate();return P(t,n)},"PUBLIC").setServiceProps(Object.assign({},D))),R.registerVersion("@firebase/firestore-compat","0.1.10")}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zaGFyZGVkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvZGlzdC9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvZGlzdC9lc20yMDE3L2luZGV4LTgzOWRlNTEwLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvZGlzdC9lc20yMDE3L2ludGVybmFsLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2ZpcmVzdG9yZS9kaXN0L2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvbG9nZ2VyL2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvY29tcG9uZW50L2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2Uvd2ViY2hhbm5lbC13cmFwcGVyL2Rpc3QvaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy4vbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAtY29tcGF0L2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy4vbm9kZV9tb2R1bGVzL3V1aWQvbGliL2J5dGVzVG9VdWlkLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy91dWlkL2luZGV4LmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvdXVpZC92MS5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy4vbm9kZV9tb2R1bGVzL3V1aWQvdjQuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9maXJlYmFzZS9jb21wYXQvYXBwL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvZmlyZWJhc2UvY29tcGF0L2F1dGgvZGlzdC9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8uL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC1jb21wYXQvZGlzdC9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvZmlyZWJhc2UvZmlyZXN0b3JlL2Rpc3QvaW5kZXguZXNtLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2ZpcmVzdG9yZS1jb21wYXQvZGlzdC9pbmRleC5lc20yMDE3LmpzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwic3RyaW5nVG9CeXRlQXJyYXkkMSIsInN0ciIsIm91dCIsImxlbmd0aCIsImNoYXJDb2RlQXQiLCJiYXNlNjQiLCJieXRlVG9DaGFyTWFwXyIsImNoYXJUb0J5dGVNYXBfIiwiYnl0ZVRvQ2hhck1hcFdlYlNhZmVfIiwiY2hhclRvQnl0ZU1hcFdlYlNhZmVfIiwiRU5DT0RFRF9WQUxTX0JBU0UiLCJ0aGlzIiwiSEFTX05BVElWRV9TVVBQT1JUIiwiYXRvYiIsImlucHV0Iiwid2ViU2FmZSIsIkFycmF5IiwiaXNBcnJheSIsIkVycm9yIiwiaW5pdF8iLCJieXRlVG9DaGFyTWFwIiwib3V0cHV0IiwiYnl0ZTEiLCJoYXZlQnl0ZTIiLCJieXRlMiIsImhhdmVCeXRlMyIsImJ5dGUzIiwib3V0Qnl0ZTEiLCJvdXRCeXRlMiIsIm91dEJ5dGUzIiwib3V0Qnl0ZTQiLCJwdXNoIiwiam9pbiIsImJ0b2EiLCJlbmNvZGVCeXRlQXJyYXkiLCJieXRlcyIsInBvcyIsImMxIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYzIiLCJ1IiwiYzMiLCJieXRlQXJyYXlUb1N0cmluZyIsImRlY29kZVN0cmluZ1RvQnl0ZUFycmF5IiwiY2hhclRvQnl0ZU1hcCIsImNoYXJBdCIsImJ5dGU0IiwiRU5DT0RFRF9WQUxTIiwiRU5DT0RFRF9WQUxTX1dFQlNBRkUiLCJiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyIsInV0ZjhCeXRlcyIsImJhc2U2NEVuY29kZSIsInJlcGxhY2UiLCJiYXNlNjREZWNvZGUiLCJkZWNvZGVTdHJpbmciLCJlIiwiY29uc29sZSIsImVycm9yIiwiZGVlcEV4dGVuZCIsInRhcmdldCIsInNvdXJjZSIsImNvbnN0cnVjdG9yIiwiRGF0ZSIsImdldFRpbWUiLCJ1bmRlZmluZWQiLCJwcm9wIiwiRGVmZXJyZWQiLCJyZWplY3QiLCJyZXNvbHZlIiwicHJvbWlzZSIsIlByb21pc2UiLCJjYWxsYmFjayIsImNhdGNoIiwiY3JlYXRlTW9ja1VzZXJUb2tlbiIsInRva2VuIiwicHJvamVjdElkIiwidWlkIiwicHJvamVjdCIsImlhdCIsInN1YiIsInVzZXJfaWQiLCJwYXlsb2FkIiwiYXNzaWduIiwiaXNzIiwiYXVkIiwiZXhwIiwiYXV0aF90aW1lIiwiZmlyZWJhc2UiLCJzaWduX2luX3Byb3ZpZGVyIiwiaWRlbnRpdGllcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJhbGciLCJ0eXBlIiwiZ2V0VUEiLCJuYXZpZ2F0b3IiLCJpc01vYmlsZUNvcmRvdmEiLCJ3aW5kb3ciLCJ0ZXN0IiwiaXNOb2RlIiwidG9TdHJpbmciLCJnbG9iYWwiLCJwcm9jZXNzIiwiaXNCcm93c2VyIiwic2VsZiIsImlzQnJvd3NlckV4dGVuc2lvbiIsInJ1bnRpbWUiLCJjaHJvbWUiLCJicm93c2VyIiwiaWQiLCJpc1JlYWN0TmF0aXZlIiwiaXNFbGVjdHJvbiIsImluZGV4T2YiLCJpc0lFIiwidWEiLCJpc1VXUCIsImlzU2FmYXJpIiwidXNlckFnZW50IiwiaW5jbHVkZXMiLCJpc0luZGV4ZWREQkF2YWlsYWJsZSIsImluZGV4ZWREQiIsIkZpcmViYXNlRXJyb3IiLCJjb2RlIiwibWVzc2FnZSIsImN1c3RvbURhdGEiLCJzdXBlciIsInNldFByb3RvdHlwZU9mIiwiY2FwdHVyZVN0YWNrVHJhY2UiLCJFcnJvckZhY3RvcnkiLCJzZXJ2aWNlIiwic2VydmljZU5hbWUiLCJlcnJvcnMiLCJkYXRhIiwiZnVsbENvZGUiLCJ0ZW1wbGF0ZSIsIlBBVFRFUk4iLCJfIiwicmVwbGFjZVRlbXBsYXRlIiwiZnVsbE1lc3NhZ2UiLCJjb250YWlucyIsIm9iaiIsImlzRW1wdHkiLCJkZWVwRXF1YWwiLCJhIiwiYiIsImFLZXlzIiwia2V5cyIsImJLZXlzIiwiayIsImFQcm9wIiwiYlByb3AiLCJpc09iamVjdCIsInRoaW5nIiwicXVlcnlzdHJpbmciLCJxdWVyeXN0cmluZ1BhcmFtcyIsInBhcmFtcyIsImVudHJpZXMiLCJmb3JFYWNoIiwiYXJyYXlWYWwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJxdWVyeXN0cmluZ0RlY29kZSIsInNwbGl0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXh0cmFjdFF1ZXJ5c3RyaW5nIiwidXJsIiwicXVlcnlTdGFydCIsImZyYWdtZW50U3RhcnQiLCJzdWJzdHJpbmciLCJjcmVhdGVTdWJzY3JpYmUiLCJleGVjdXRvciIsIm9uTm9PYnNlcnZlcnMiLCJwcm94eSIsIk9ic2VydmVyUHJveHkiLCJzdWJzY3JpYmUiLCJvYnNlcnZlcnMiLCJ1bnN1YnNjcmliZXMiLCJvYnNlcnZlckNvdW50IiwidGFzayIsImZpbmFsaXplZCIsInRoZW4iLCJmb3JFYWNoT2JzZXJ2ZXIiLCJvYnNlcnZlciIsIm5leHQiLCJjbG9zZSIsImNvbXBsZXRlIiwibmV4dE9yT2JzZXJ2ZXIiLCJtZXRob2RzIiwibWV0aG9kIiwiaW1wbGVtZW50c0FueU1ldGhvZHMiLCJub29wIiwidW5zdWIiLCJ1bnN1YnNjcmliZU9uZSIsImZpbmFsRXJyb3IiLCJmbiIsInNlbmRPbmUiLCJlcnIiLCJnZXRNb2R1bGFySW5zdGFuY2UiLCJfZGVsZWdhdGUiLCJfX3Jlc3QiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIlByb3ZpZGVySWQiLCJGQUNFQk9PSyIsIkdJVEhVQiIsIkdPT0dMRSIsIlBBU1NXT1JEIiwiUEhPTkUiLCJUV0lUVEVSIiwiQWN0aW9uQ29kZU9wZXJhdGlvbiIsIkVNQUlMX1NJR05JTiIsIlBBU1NXT1JEX1JFU0VUIiwiUkVDT1ZFUl9FTUFJTCIsIlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OIiwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwiLCJWRVJJRllfRU1BSUwiLCJfcHJvZEVycm9yTWFwIiwiZGVidWdFcnJvck1hcCIsInByb2RFcnJvck1hcCIsIl9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWSIsImxvZ0NsaWVudCIsIl9sb2dFcnJvciIsIm1zZyIsImFyZ3MiLCJsb2dMZXZlbCIsIkVSUk9SIiwiX2ZhaWwiLCJhdXRoT3JDb2RlIiwicmVzdCIsImNyZWF0ZUVycm9ySW50ZXJuYWwiLCJfY3JlYXRlRXJyb3IiLCJfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZSIsImF1dGgiLCJlcnJvck1hcCIsImFwcE5hbWUiLCJfYXNzZXJ0SW5zdGFuY2VPZiIsImluc3RhbmNlIiwiZnVsbFBhcmFtcyIsInNsaWNlIiwiX2Vycm9yRmFjdG9yeSIsIl9hc3NlcnQiLCJhc3NlcnRpb24iLCJkZWJ1Z0ZhaWwiLCJmYWlsdXJlIiwiZGVidWdBc3NlcnQiLCJpbnN0YW5jZUNhY2hlIiwiTWFwIiwiX2dldEluc3RhbmNlIiwiY2xzIiwiRnVuY3Rpb24iLCJzZXQiLCJfZ2V0Q3VycmVudFVybCIsIl9hIiwibG9jYXRpb24iLCJocmVmIiwiX2lzSHR0cE9ySHR0cHMiLCJfZ2V0Q3VycmVudFNjaGVtZSIsInByb3RvY29sIiwic2hvcnREZWxheSIsImxvbmdEZWxheSIsImlzTW9iaWxlIiwib25MaW5lIiwiTWF0aCIsIm1pbiIsIl9lbXVsYXRvclVybCIsImNvbmZpZyIsInBhdGgiLCJlbXVsYXRvciIsInN0YXJ0c1dpdGgiLCJGZXRjaFByb3ZpZGVyIiwiZmV0Y2hJbXBsIiwiaGVhZGVyc0ltcGwiLCJyZXNwb25zZUltcGwiLCJmZXRjaCIsIkhlYWRlcnMiLCJSZXNwb25zZSIsIlNFUlZFUl9FUlJPUl9NQVAiLCJERUZBVUxUX0FQSV9USU1FT1VUX01TIiwiX2FkZFRpZElmTmVjZXNzYXJ5IiwicmVxdWVzdCIsInRlbmFudElkIiwiYXN5bmMiLCJfcGVyZm9ybUFwaVJlcXVlc3QiLCJjdXN0b21FcnJvck1hcCIsIl9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyIsImJvZHkiLCJxdWVyeSIsImFwaUtleSIsImhlYWRlcnMiLCJfZ2V0QWRkaXRpb25hbEhlYWRlcnMiLCJsYW5ndWFnZUNvZGUiLCJfZ2V0RmluYWxUYXJnZXQiLCJhcGlIb3N0IiwicmVmZXJyZXJQb2xpY3kiLCJmZXRjaEZuIiwiX2NhbkluaXRFbXVsYXRvciIsIm5ldHdvcmtUaW1lb3V0IiwiTmV0d29ya1RpbWVvdXQiLCJyZXNwb25zZSIsInJhY2UiLCJjbGVhck5ldHdvcmtUaW1lb3V0IiwianNvbiIsIl9tYWtlVGFnZ2VkRXJyb3IiLCJvayIsImVycm9yTWVzc2FnZSIsInNlcnZlckVycm9yQ29kZSIsInNlcnZlckVycm9yTWVzc2FnZSIsImF1dGhFcnJvciIsInRvTG93ZXJDYXNlIiwiX3BlcmZvcm1TaWduSW5SZXF1ZXN0Iiwic2VydmVyUmVzcG9uc2UiLCJfc2VydmVyUmVzcG9uc2UiLCJob3N0IiwiYmFzZSIsImFwaVNjaGVtZSIsInRpbWVyIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsImVycm9yUGFyYW1zIiwiZW1haWwiLCJwaG9uZU51bWJlciIsIl90b2tlblJlc3BvbnNlIiwidXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nIiwidXRjVGltZXN0YW1wIiwiZGF0ZSIsIk51bWJlciIsImlzTmFOIiwidG9VVENTdHJpbmciLCJzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMiLCJzZWNvbmRzIiwiX3BhcnNlVG9rZW4iLCJhbGdvcml0aG0iLCJzaWduYXR1cmUiLCJkZWNvZGVkIiwicGFyc2UiLCJfbG9nb3V0SWZJbnZhbGlkYXRlZCIsInVzZXIiLCJieXBhc3NBdXRoU3RhdGUiLCJpc1VzZXJJbnZhbGlkYXRlZCIsImN1cnJlbnRVc2VyIiwic2lnbk91dCIsIlByb2FjdGl2ZVJlZnJlc2giLCJpc1J1bm5pbmciLCJ0aW1lcklkIiwiZXJyb3JCYWNrb2ZmIiwic2NoZWR1bGUiLCJ3YXNFcnJvciIsImludGVydmFsIiwic3RzVG9rZW5NYW5hZ2VyIiwiZXhwaXJhdGlvblRpbWUiLCJub3ciLCJtYXgiLCJnZXRJbnRlcnZhbCIsIml0ZXJhdGlvbiIsImdldElkVG9rZW4iLCJVc2VyTWV0YWRhdGEiLCJjcmVhdGVkQXQiLCJsYXN0TG9naW5BdCIsIl9pbml0aWFsaXplVGltZSIsImxhc3RTaWduSW5UaW1lIiwiY3JlYXRpb25UaW1lIiwibWV0YWRhdGEiLCJfcmVsb2FkV2l0aG91dFNhdmluZyIsImlkVG9rZW4iLCJnZXRBY2NvdW50SW5mbyIsInVzZXJzIiwiY29yZUFjY291bnQiLCJfbm90aWZ5UmVsb2FkTGlzdGVuZXIiLCJuZXdQcm92aWRlckRhdGEiLCJwcm92aWRlclVzZXJJbmZvIiwibWFwIiwicHJvdmlkZXJJZCIsInByb3ZpZGVyIiwicmF3SWQiLCJkaXNwbGF5TmFtZSIsInBob3RvVVJMIiwicGhvdG9VcmwiLCJwcm92aWRlckRhdGEiLCJvcmlnaW5hbCIsIm5ld0RhdGEiLCJmaWx0ZXIiLCJzb21lIiwib2xkSXNBbm9ueW1vdXMiLCJpc0Fub255bW91cyIsIm5ld0lzQW5vbnltb3VzIiwicGFzc3dvcmRIYXNoIiwidXBkYXRlcyIsImxvY2FsSWQiLCJlbWFpbFZlcmlmaWVkIiwiU3RzVG9rZW5NYW5hZ2VyIiwicmVmcmVzaFRva2VuIiwiYWNjZXNzVG9rZW4iLCJleHBpcmVzSW4iLCJwYXJzZWRUb2tlbiIsIl90b2tlbkV4cGlyZXNJbiIsInVwZGF0ZVRva2Vuc0FuZEV4cGlyYXRpb24iLCJmb3JjZVJlZnJlc2giLCJpc0V4cGlyZWQiLCJyZWZyZXNoIiwib2xkVG9rZW4iLCJ0b2tlbkFwaUhvc3QiLCJhY2Nlc3NfdG9rZW4iLCJleHBpcmVzX2luIiwicmVmcmVzaF90b2tlbiIsInJlcXVlc3RTdHNUb2tlbiIsImV4cGlyZXNJblNlYyIsIm1hbmFnZXIiLCJ0b0pTT04iLCJhc3NlcnRTdHJpbmdPclVuZGVmaW5lZCIsIm9wdCIsInByb2FjdGl2ZVJlZnJlc2giLCJyZWxvYWRVc2VySW5mbyIsInJlbG9hZExpc3RlbmVyIiwiZ2V0VG9rZW4iLCJfcGVyc2lzdFVzZXJJZkN1cnJlbnQiLCJfbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50IiwidXNlckludGVybmFsIiwiY2xhaW1zIiwic2lnbkluUHJvdmlkZXIiLCJhdXRoVGltZSIsImlzc3VlZEF0VGltZSIsInNpZ25JblNlY29uZEZhY3RvciIsImdldElkVG9rZW5SZXN1bHQiLCJyZWxvYWQiLCJ1c2VySW5mbyIsIl9jb3B5IiwiX2Fzc2lnbiIsIl9jbG9uZSIsIl9zdGFydCIsIl9zdG9wIiwidG9rZW5zUmVmcmVzaGVkIiwidXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlIiwiZGVsZXRlQWNjb3VudCIsImNsZWFyUmVmcmVzaFRva2VuIiwiX3JlZGlyZWN0RXZlbnRJZCIsIl9iIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwicGxhaW5PYmplY3RUb2tlbk1hbmFnZXIiLCJmcm9tSlNPTiIsImlkVG9rZW5SZXNwb25zZSIsIkluTWVtb3J5UGVyc2lzdGVuY2UiLCJzdG9yYWdlIiwiX2tleSIsIl9saXN0ZW5lciIsImluTWVtb3J5UGVyc2lzdGVuY2UiLCJfcGVyc2lzdGVuY2VLZXlOYW1lIiwiUGVyc2lzdGVuY2VVc2VyTWFuYWdlciIsInBlcnNpc3RlbmNlIiwidXNlcktleSIsImZ1bGxVc2VyS2V5IiwiZnVsbFBlcnNpc3RlbmNlS2V5IiwiYm91bmRFdmVudEhhbmRsZXIiLCJfb25TdG9yYWdlRXZlbnQiLCJfYWRkTGlzdGVuZXIiLCJfc2V0IiwiYmxvYiIsIl9nZXQiLCJfZnJvbUpTT04iLCJfcmVtb3ZlIiwibmV3UGVyc2lzdGVuY2UiLCJnZXRDdXJyZW50VXNlciIsInJlbW92ZUN1cnJlbnRVc2VyIiwic2V0Q3VycmVudFVzZXIiLCJfcmVtb3ZlTGlzdGVuZXIiLCJwZXJzaXN0ZW5jZUhpZXJhcmNoeSIsImF2YWlsYWJsZVBlcnNpc3RlbmNlcyIsImFsbCIsIl9pc0F2YWlsYWJsZSIsInNlbGVjdGVkUGVyc2lzdGVuY2UiLCJ1c2VyVG9NaWdyYXRlIiwibWlncmF0aW9uSGllcmFyY2h5IiwiX3Nob3VsZEFsbG93TWlncmF0aW9uIiwiX2dldEJyb3dzZXJOYW1lIiwiX2lzSUVNb2JpbGUiLCJfaXNGaXJlZm94IiwiX2lzQmxhY2tCZXJyeSIsIl9pc1dlYk9TIiwiX2lzU2FmYXJpIiwiX2lzQ2hyb21lSU9TIiwiX2lzQW5kcm9pZCIsInJlIiwibWF0Y2hlcyIsIm1hdGNoIiwiX2lzSU9TIiwiX2lzTW9iaWxlQnJvd3NlciIsIl9nZXRDbGllbnRWZXJzaW9uIiwiY2xpZW50UGxhdGZvcm0iLCJmcmFtZXdvcmtzIiwicmVwb3J0ZWRQbGF0Zm9ybSIsInJlcG9ydGVkRnJhbWV3b3JrcyIsImFwcCIsImVtdWxhdG9yQ29uZmlnIiwib3BlcmF0aW9ucyIsImF1dGhTdGF0ZVN1YnNjcmlwdGlvbiIsImlkVG9rZW5TdWJzY3JpcHRpb24iLCJyZWRpcmVjdFVzZXIiLCJpc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkIiwiX2lzSW5pdGlhbGl6ZWQiLCJfZGVsZXRlZCIsIl9pbml0aWFsaXphdGlvblByb21pc2UiLCJfcG9wdXBSZWRpcmVjdFJlc29sdmVyIiwibGFzdE5vdGlmaWVkVWlkIiwic2V0dGluZ3MiLCJhcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmciLCJjbGllbnRWZXJzaW9uIiwic2RrQ2xpZW50VmVyc2lvbiIsInBvcHVwUmVkaXJlY3RSZXNvbHZlciIsInF1ZXVlIiwicGVyc2lzdGVuY2VNYW5hZ2VyIiwiX3Nob3VsZEluaXRQcm9hY3RpdmVseSIsIl9pbml0aWFsaXplIiwiaW5pdGlhbGl6ZUN1cnJlbnRVc2VyIiwiYXNzZXJ0ZWRQZXJzaXN0ZW5jZSIsIl9jdXJyZW50VXNlciIsIl91cGRhdGVDdXJyZW50VXNlciIsInN0b3JlZFVzZXIiLCJhdXRoRG9tYWluIiwiZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIiLCJyZWRpcmVjdFVzZXJFdmVudElkIiwic3RvcmVkVXNlckV2ZW50SWQiLCJyZXN1bHQiLCJ0cnlSZWRpcmVjdFNpZ25JbiIsImRpcmVjdGx5U2V0Q3VycmVudFVzZXIiLCJyZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIiLCJyZWRpcmVjdFJlc29sdmVyIiwiX2NvbXBsZXRlUmVkaXJlY3RGbiIsIl9zZXRSZWRpcmVjdFVzZXIiLCJuYXZpZ2F0b3JMYW5ndWFnZSIsImxhbmd1YWdlcyIsImxhbmd1YWdlIiwiX2dldFVzZXJMYW5ndWFnZSIsInVzZXJFeHRlcm4iLCJub3RpZnlBdXRoTGlzdGVuZXJzIiwicmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIiLCJzZXRQZXJzaXN0ZW5jZSIsImNvbXBsZXRlZCIsInJlZ2lzdGVyU3RhdGVMaXN0ZW5lciIsInJlZGlyZWN0TWFuYWdlciIsInJlc29sdmVyIiwiX3JlZGlyZWN0UGVyc2lzdGVuY2UiLCJfc3RhcnRQcm9hY3RpdmVSZWZyZXNoIiwiX3N0b3BQcm9hY3RpdmVSZWZyZXNoIiwiY3VycmVudFVpZCIsInN1YnNjcmlwdGlvbiIsImNiIiwiYWRkT2JzZXJ2ZXIiLCJhY3Rpb24iLCJmcmFtZXdvcmsiLCJzb3J0IiwiX2dldEZyYW1ld29ya3MiLCJvcHRpb25zIiwiYXBwSWQiLCJfY2FzdEF1dGgiLCJjb25uZWN0QXV0aEVtdWxhdG9yIiwiYXV0aEludGVybmFsIiwiZGlzYWJsZVdhcm5pbmdzIiwiZXh0cmFjdFByb3RvY29sIiwicG9ydCIsImF1dGhvcml0eSIsImV4ZWMiLCJzdWJzdHIiLCJob3N0QW5kUG9ydCIsInBvcCIsImJyYWNrZXRlZElQdjYiLCJwYXJzZVBvcnQiLCJleHRyYWN0SG9zdEFuZFBvcnQiLCJwb3J0U3RyIiwiZnJlZXplIiwiYXR0YWNoQmFubmVyIiwiZWwiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzdHkiLCJzdHlsZSIsImlubmVyVGV4dCIsInBvc2l0aW9uIiwid2lkdGgiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXIiLCJjb2xvciIsImJvdHRvbSIsImxlZnQiLCJtYXJnaW4iLCJ6SW5kZXgiLCJ0ZXh0QWxpZ24iLCJjbGFzc0xpc3QiLCJhZGQiLCJhcHBlbmRDaGlsZCIsImluZm8iLCJyZWFkeVN0YXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImVtaXRFbXVsYXRvcldhcm5pbmciLCJwcm90b2NvbEVuZCIsIkF1dGhDcmVkZW50aWFsIiwic2lnbkluTWV0aG9kIiwiX2F1dGgiLCJfaWRUb2tlbiIsInJlc2V0UGFzc3dvcmQiLCJ1cGRhdGVFbWFpbFBhc3N3b3JkIiwic2VuZE9vYkNvZGUiLCJFbWFpbEF1dGhDcmVkZW50aWFsIiwiX2VtYWlsIiwiX3Bhc3N3b3JkIiwiX3RlbmFudElkIiwicGFzc3dvcmQiLCJvb2JDb2RlIiwiX2Zyb21FbWFpbEFuZFBhc3N3b3JkIiwiX2Zyb21FbWFpbEFuZENvZGUiLCJzaWduSW5XaXRoUGFzc3dvcmQiLCJyZXR1cm5TZWN1cmVUb2tlbiIsInNpZ25JbldpdGhFbWFpbExpbmskMSIsInNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nIiwiX2dldElkVG9rZW5SZXNwb25zZSIsInNpZ25JbldpdGhJZHAiLCJhcmd1bWVudHMiLCJwZW5kaW5nVG9rZW4iLCJjcmVkIiwibm9uY2UiLCJvYXV0aFRva2VuIiwib2F1dGhUb2tlblNlY3JldCIsInNlY3JldCIsImJ1aWxkUmVxdWVzdCIsImF1dG9DcmVhdGUiLCJyZXF1ZXN0VXJpIiwicG9zdEJvZHkiLCJWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfIiwiUGhvbmVBdXRoQ3JlZGVudGlhbCIsInZlcmlmaWNhdGlvbklkIiwidmVyaWZpY2F0aW9uQ29kZSIsInRlbXBvcmFyeVByb29mIiwic2lnbkluV2l0aFBob25lTnVtYmVyJDEiLCJfbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QiLCJsaW5rV2l0aFBob25lTnVtYmVyJDEiLCJvcGVyYXRpb24iLCJ2ZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nIiwic2Vzc2lvbkluZm8iLCJhY3Rpb25MaW5rIiwic2VhcmNoUGFyYW1zIiwicGFyc2VNb2RlIiwiY29udGludWVVcmwiLCJsaW5rIiwiZG91YmxlRGVlcExpbmsiLCJpT1NEZWVwTGluayIsInBhcnNlRGVlcExpbmsiLCJFbWFpbEF1dGhQcm92aWRlciIsIlBST1ZJREVSX0lEIiwiZW1haWxMaW5rIiwiYWN0aW9uQ29kZVVybCIsInBhcnNlTGluayIsIkVNQUlMX1BBU1NXT1JEX1NJR05fSU5fTUVUSE9EIiwiRU1BSUxfTElOS19TSUdOX0lOX01FVEhPRCIsIkZlZGVyYXRlZEF1dGhQcm92aWRlciIsImRlZmF1bHRMYW5ndWFnZUNvZGUiLCJjdXN0b21QYXJhbWV0ZXJzIiwiY3VzdG9tT0F1dGhQYXJhbWV0ZXJzIiwiQmFzZU9BdXRoUHJvdmlkZXIiLCJzY29wZXMiLCJzY29wZSIsIk9BdXRoUHJvdmlkZXIiLCJfZnJvbVBhcmFtcyIsIl9jcmVkZW50aWFsIiwicmF3Tm9uY2UiLCJ1c2VyQ3JlZGVudGlhbCIsIm9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QiLCJ0b2tlblJlc3BvbnNlIiwib2F1dGhJZFRva2VuIiwib2F1dGhBY2Nlc3NUb2tlbiIsIkZhY2Vib29rQXV0aFByb3ZpZGVyIiwiRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0QiLCJjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCIsImNyZWRlbnRpYWwiLCJHb29nbGVBdXRoUHJvdmlkZXIiLCJhZGRTY29wZSIsIkdPT0dMRV9TSUdOX0lOX01FVEhPRCIsIkdpdGh1YkF1dGhQcm92aWRlciIsIkdJVEhVQl9TSUdOX0lOX01FVEhPRCIsIlNBTUxBdXRoQ3JlZGVudGlhbCIsIlNBTUxBdXRoUHJvdmlkZXIiLCJzYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QiLCJfY3JlYXRlIiwiVHdpdHRlckF1dGhQcm92aWRlciIsIlRXSVRURVJfU0lHTl9JTl9NRVRIT0QiLCJzaWduVXAiLCJVc2VyQ3JlZGVudGlhbEltcGwiLCJvcGVyYXRpb25UeXBlIiwiX2Zyb21JZFRva2VuUmVzcG9uc2UiLCJwcm92aWRlcklkRm9yUmVzcG9uc2UiLCJfdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkiLCJzaWduSW5Bbm9ueW1vdXNseSIsIl9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeSIsIl9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIiLCJfZnJvbUVycm9yQW5kT3BlcmF0aW9uIiwicHJvdmlkZXJEYXRhQXNOYW1lcyIsIlNldCIsInBpZCIsInVubGluayIsIl9hc3NlcnRMaW5rZWRTdGF0dXMiLCJkZWxldGVMaW5rZWRBY2NvdW50cyIsImRlbGV0ZVByb3ZpZGVyIiwicHJvdmlkZXJzTGVmdCIsInBkIiwiaGFzIiwiX2xpbmskMSIsIl9saW5rVG9JZFRva2VuIiwiX2Zvck9wZXJhdGlvbiIsImV4cGVjdGVkIiwiX3JlYXV0aGVudGljYXRlIiwicGFyc2VkIiwiX3NpZ25JbldpdGhDcmVkZW50aWFsIiwic2lnbkluV2l0aENyZWRlbnRpYWwiLCJsaW5rV2l0aENyZWRlbnRpYWwiLCJyZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsIiwic2lnbkluV2l0aEN1c3RvbVRva2VuIiwiY3VzdG9tVG9rZW4iLCJzaWduSW5XaXRoQ3VzdG9tVG9rZW4kMSIsIk11bHRpRmFjdG9ySW5mb0ltcGwiLCJmYWN0b3JJZCIsIm1mYUVucm9sbG1lbnRJZCIsImVucm9sbG1lbnRUaW1lIiwiZW5yb2xsZWRBdCIsImVucm9sbG1lbnQiLCJQaG9uZU11bHRpRmFjdG9ySW5mbyIsIl9mcm9tU2VydmVyUmVzcG9uc2UiLCJwaG9uZUluZm8iLCJfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0IiwiYWN0aW9uQ29kZVNldHRpbmdzIiwiZHluYW1pY0xpbmtEb21haW4iLCJjYW5IYW5kbGVDb2RlSW5BcHAiLCJoYW5kbGVDb2RlSW5BcHAiLCJpT1MiLCJidW5kbGVJZCIsImlPU0J1bmRsZUlkIiwiYW5kcm9pZCIsInBhY2thZ2VOYW1lIiwiYW5kcm9pZEluc3RhbGxBcHAiLCJpbnN0YWxsQXBwIiwiYW5kcm9pZE1pbmltdW1WZXJzaW9uQ29kZSIsIm1pbmltdW1WZXJzaW9uIiwiYW5kcm9pZFBhY2thZ2VOYW1lIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsImF1dGhNb2R1bGFyIiwicmVxdWVzdFR5cGUiLCJzZW5kUGFzc3dvcmRSZXNldEVtYWlsJDEiLCJjb25maXJtUGFzc3dvcmRSZXNldCIsIm5ld1Bhc3N3b3JkIiwiYXBwbHlBY3Rpb25Db2RlIiwiYXBwbHlBY3Rpb25Db2RlJDEiLCJjaGVja0FjdGlvbkNvZGUiLCJuZXdFbWFpbCIsIm1mYUluZm8iLCJtdWx0aUZhY3RvckluZm8iLCJwcmV2aW91c0VtYWlsIiwidmVyaWZ5UGFzc3dvcmRSZXNldENvZGUiLCJjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQiLCJzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZCIsInNlbmRTaWduSW5MaW5rVG9FbWFpbCIsInNlbmRTaWduSW5MaW5rVG9FbWFpbCQxIiwiaXNTaWduSW5XaXRoRW1haWxMaW5rIiwic2lnbkluV2l0aEVtYWlsTGluayIsImNyZWRlbnRpYWxXaXRoTGluayIsImZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsIiwiaWRlbnRpZmllciIsImNvbnRpbnVlVXJpIiwic2lnbmluTWV0aG9kcyIsImNyZWF0ZUF1dGhVcmkiLCJzZW5kRW1haWxWZXJpZmljYXRpb24iLCJzZW5kRW1haWxWZXJpZmljYXRpb24kMSIsInZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsIiwidmVyaWZ5QW5kQ2hhbmdlRW1haWwiLCJ1cGRhdGVQcm9maWxlIiwicHJvZmlsZVJlcXVlc3QiLCJ1cGRhdGVQcm9maWxlJDEiLCJwYXNzd29yZFByb3ZpZGVyIiwiZmluZCIsInVwZGF0ZUVtYWlsIiwidXBkYXRlRW1haWxPclBhc3N3b3JkIiwidXBkYXRlUGFzc3dvcmQiLCJHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvIiwiaXNOZXdVc2VyIiwicHJvZmlsZSIsIkZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSIsInVzZXJuYW1lIiwiRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8iLCJHaXRodWJBZGRpdGlvbmFsVXNlckluZm8iLCJsb2dpbiIsIkdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyIsIlR3aXR0ZXJBZGRpdGlvbmFsVXNlckluZm8iLCJzY3JlZW5OYW1lIiwiZ2V0QWRkaXRpb25hbFVzZXJJbmZvIiwicmF3VXNlckluZm8iLCJraW5kIiwiTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCIsIm1mYVBlbmRpbmdDcmVkZW50aWFsIiwibXVsdGlGYWN0b3JTZXNzaW9uIiwicGVuZGluZ0NyZWRlbnRpYWwiLCJfZnJvbU1mYVBlbmRpbmdDcmVkZW50aWFsIiwiX2Zyb21JZHRva2VuIiwiTXVsdGlGYWN0b3JSZXNvbHZlckltcGwiLCJzZXNzaW9uIiwiaGludHMiLCJzaWduSW5SZXNvbHZlciIsImF1dGhFeHRlcm4iLCJtZmFSZXNwb25zZSIsIl9wcm9jZXNzIiwiYXNzZXJ0aW9uRXh0ZXJuIiwiZ2V0TXVsdGlGYWN0b3JSZXNvbHZlciIsImVycm9ySW50ZXJuYWwiLCJfZnJvbUVycm9yIiwiTXVsdGlGYWN0b3JVc2VySW1wbCIsImVucm9sbGVkRmFjdG9ycyIsIl9vblJlbG9hZCIsImdldFNlc3Npb24iLCJmaW5hbGl6ZU1mYVJlc3BvbnNlIiwiaW5mb09yVWlkIiwibXVsdGlGYWN0b3JVc2VyQ2FjaGUiLCJXZWFrTWFwIiwibXVsdGlGYWN0b3IiLCJ1c2VyTW9kdWxhciIsIl9mcm9tVXNlciIsIkJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzIiwic3RvcmFnZVJldHJpZXZlciIsInNldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZ2V0SXRlbSIsIkJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIiwibG9jYWxTdG9yYWdlIiwiZXZlbnQiLCJwb2xsIiwib25TdG9yYWdlRXZlbnQiLCJsaXN0ZW5lcnMiLCJsb2NhbENhY2hlIiwicG9sbFRpbWVyIiwic2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkIiwiX2lmcmFtZUNhbm5vdFN5bmNXZWJTdG9yYWdlIiwidG9wIiwiX2lzSWZyYW1lIiwiZmFsbGJhY2tUb1BvbGxpbmciLCJuZXdWYWx1ZSIsIm9sZFZhbHVlIiwiZm9yQWxsQ2hhbmdlZEtleXMiLCJfb2xkVmFsdWUiLCJub3RpZnlMaXN0ZW5lcnMiLCJkZXRhY2hMaXN0ZW5lciIsInN0b3BQb2xsaW5nIiwic3RvcmVkVmFsdWUiLCJ0cmlnZ2VyTGlzdGVuZXJzIiwiZG9jdW1lbnRNb2RlIiwibGlzdGVuZXIiLCJmcm9tIiwic2V0SW50ZXJ2YWwiLCJTdG9yYWdlRXZlbnQiLCJjbGVhckludGVydmFsIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInN0YXJ0UG9sbGluZyIsImF0dGFjaExpc3RlbmVyIiwiZGVsZXRlIiwic2l6ZSIsImJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIiwiQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSIsInNlc3Npb25TdG9yYWdlIiwiYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSIsIlJlY2VpdmVyIiwiZXZlbnRUYXJnZXQiLCJoYW5kbGVyc01hcCIsImhhbmRsZUV2ZW50IiwiZXhpc3RpbmdJbnN0YW5jZSIsInJlY2VpdmVycyIsInJlY2VpdmVyIiwiaXNMaXN0ZW5pbmd0byIsIm5ld0luc3RhbmNlIiwibWVzc2FnZUV2ZW50IiwiZXZlbnRJZCIsImV2ZW50VHlwZSIsImhhbmRsZXJzIiwicG9ydHMiLCJwb3N0TWVzc2FnZSIsInN0YXR1cyIsInByb21pc2VzIiwiaGFuZGxlciIsIm9yaWdpbiIsImZ1bGZpbGxlZCIsInJlYXNvbiIsIl9hbGxTZXR0bGVkIiwiZXZlbnRIYW5kbGVyIiwiX2dlbmVyYXRlRXZlbnRJZCIsInByZWZpeCIsImRpZ2l0cyIsInJhbmRvbSIsImZsb29yIiwiU2VuZGVyIiwibWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsIm9uTWVzc2FnZSIsInRpbWVvdXQiLCJNZXNzYWdlQ2hhbm5lbCIsImNvbXBsZXRpb25UaW1lciIsInN0YXJ0IiwiYWNrVGltZXIiLCJwb3J0MiIsImZpbmFsbHkiLCJyZW1vdmVNZXNzYWdlSGFuZGxlciIsIl93aW5kb3ciLCJfaXNXb3JrZXIiLCJEQl9OQU1FIiwiREJQcm9taXNlIiwiZ2V0T2JqZWN0U3RvcmUiLCJkYiIsImlzUmVhZFdyaXRlIiwidHJhbnNhY3Rpb24iLCJvYmplY3RTdG9yZSIsIl9vcGVuRGF0YWJhc2UiLCJvcGVuIiwiY3JlYXRlT2JqZWN0U3RvcmUiLCJrZXlQYXRoIiwib2JqZWN0U3RvcmVOYW1lcyIsImRlbGV0ZURhdGFiYXNlIiwidG9Qcm9taXNlIiwiX2RlbGV0ZURhdGFiYXNlIiwiX3B1dE9iamVjdCIsInB1dCIsIl9kZWxldGVPYmplY3QiLCJJbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIiwicGVuZGluZ1dyaXRlcyIsInNlbmRlciIsInNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSIsImFjdGl2ZVNlcnZpY2VXb3JrZXIiLCJfd29ya2VySW5pdGlhbGl6YXRpb25Qcm9taXNlIiwiaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmciLCJvcCIsIm51bUF0dGVtcHRzIiwiX29wZW5EYiIsImluaXRpYWxpemVSZWNlaXZlciIsImluaXRpYWxpemVTZW5kZXIiLCJfc3Vic2NyaWJlIiwiX29yaWdpbiIsImtleVByb2Nlc3NlZCIsIl9wb2xsIiwiX2RhdGEiLCJzZXJ2aWNlV29ya2VyIiwicmVhZHkiLCJhY3RpdmUiLCJfZ2V0QWN0aXZlU2VydmljZVdvcmtlciIsInJlc3VsdHMiLCJfc2VuZCIsImNvbnRyb2xsZXIiLCJ3cml0ZSIsIl93aXRoUGVuZGluZ1dyaXRlIiwiX3dpdGhSZXRyaWVzIiwibm90aWZ5U2VydmljZVdvcmtlciIsImdldE9iamVjdCIsImdldEFsbFJlcXVlc3QiLCJnZXRBbGwiLCJrZXlzSW5SZXN1bHQiLCJmYmFzZV9rZXkiLCJsb2NhbEtleSIsImluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UiLCJfbG9hZEpTIiwic2V0QXR0cmlidXRlIiwib25sb2FkIiwib25lcnJvciIsImNoYXJzZXQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSIsIk1vY2tSZUNhcHRjaGEiLCJjb3VudGVyIiwiX3dpZGdldHMiLCJjb250YWluZXIiLCJwYXJhbWV0ZXJzIiwiTW9ja1dpZGdldCIsIm9wdFdpZGdldElkIiwiZ2V0UmVzcG9uc2UiLCJleGVjdXRlIiwiY29udGFpbmVyT3JJZCIsImRlbGV0ZWQiLCJyZXNwb25zZVRva2VuIiwiY2xpY2tIYW5kbGVyIiwiZ2V0RWxlbWVudEJ5SWQiLCJpc1Zpc2libGUiLCJjaGVja0lmRGVsZXRlZCIsImxlbiIsImNoYXJzIiwiYWxsb3dlZENoYXJzIiwiZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmciLCJleHBpcmVkQ2FsbGJhY2siLCJfSlNMT0FEX0NBTExCQUNLIiwiTkVUV09SS19USU1FT1VUX0RFTEFZIiwiaG9zdExhbmd1YWdlIiwibGlicmFyeVNlcGFyYXRlbHlMb2FkZWQiLCJncmVjYXB0Y2hhIiwiaGwiLCJpc0hvc3RMYW5ndWFnZVZhbGlkIiwic2hvdWxkUmVzb2x2ZUltbWVkaWF0ZWx5IiwicmVjYXB0Y2hhIiwicmVuZGVyIiwid2lkZ2V0SWQiLCJNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCIsIkRFRkFVTFRfUEFSQU1TIiwidGhlbWUiLCJSZWNhcHRjaGFWZXJpZmllciIsImRlc3Ryb3llZCIsInRva2VuQ2hhbmdlTGlzdGVuZXJzIiwicmVuZGVyUHJvbWlzZSIsImlzSW52aXNpYmxlIiwibWFrZVRva2VuQ2FsbGJhY2siLCJfcmVjYXB0Y2hhTG9hZGVyIiwidmFsaWRhdGVTdGFydGluZ1N0YXRlIiwiYXNzZXJ0Tm90RGVzdHJveWVkIiwiZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEiLCJ0b2tlbkNoYW5nZSIsIm1ha2VSZW5kZXJQcm9taXNlIiwicmVzZXQiLCJjbGVhcmVkT25lSW5zdGFuY2UiLCJjaGlsZE5vZGVzIiwibm9kZSIsInJlbW92ZUNoaWxkIiwic2l0ZWtleSIsImhhc0NoaWxkTm9kZXMiLCJleGlzdGluZyIsImdsb2JhbEZ1bmMiLCJpbml0IiwiZ3VhcmFudGVlZEVtcHR5IiwiZG9tUmVhZHkiLCJsb2FkIiwic2l0ZUtleSIsInJlY2FwdGNoYVNpdGVLZXkiLCJnZXRSZWNhcHRjaGFQYXJhbXMiLCJDb25maXJtYXRpb25SZXN1bHRJbXBsIiwib25Db25maXJtYXRpb24iLCJhdXRoQ3JlZGVudGlhbCIsIl9mcm9tVmVyaWZpY2F0aW9uIiwic2lnbkluV2l0aFBob25lTnVtYmVyIiwiYXBwVmVyaWZpZXIiLCJfdmVyaWZ5UGhvbmVOdW1iZXIiLCJsaW5rV2l0aFBob25lTnVtYmVyIiwicmVhdXRoZW50aWNhdGVXaXRoUGhvbmVOdW1iZXIiLCJ2ZXJpZmllciIsInJlY2FwdGNoYVRva2VuIiwidmVyaWZ5IiwicGhvbmVJbmZvT3B0aW9ucyIsInN0YXJ0RW5yb2xsUGhvbmVNZmEiLCJwaG9uZUVucm9sbG1lbnRJbmZvIiwicGhvbmVTZXNzaW9uSW5mbyIsIm11bHRpRmFjdG9ySGludCIsIm11bHRpRmFjdG9yVWlkIiwic3RhcnRTaWduSW5QaG9uZU1mYSIsInBob25lU2lnbkluSW5mbyIsInBob25lUmVzcG9uc2VJbmZvIiwic2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZSIsIl9yZXNldCIsInVwZGF0ZVBob25lTnVtYmVyIiwicGhvbmVPcHRpb25zIiwiYXBwbGljYXRpb25WZXJpZmllciIsIl9mcm9tVG9rZW5SZXNwb25zZSIsIl93aXRoRGVmYXVsdFJlc29sdmVyIiwicmVzb2x2ZXJPdmVycmlkZSIsIlBIT05FX1NJR05fSU5fTUVUSE9EIiwiSWRwQ3JlZGVudGlhbCIsIl9idWlsZElkcFJlcXVlc3QiLCJzZXNzaW9uSWQiLCJyZXR1cm5JZHBDcmVkZW50aWFsIiwiX3NpZ25JbiIsIl9yZWF1dGgiLCJfbGluayIsIkFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiIsInBlbmRpbmdQcm9taXNlIiwiZXZlbnRNYW5hZ2VyIiwib25FeGVjdXRpb24iLCJyZWdpc3RlckNvbnN1bWVyIiwidXJsUmVzcG9uc2UiLCJnZXRJZHBUYXNrIiwidW5yZWdpc3RlckFuZENsZWFuVXAiLCJ1bnJlZ2lzdGVyQ29uc3VtZXIiLCJjbGVhblVwIiwiX1BPTExfV0lORE9XX0NMT1NFX1RJTUVPVVQiLCJzaWduSW5XaXRoUG9wdXAiLCJyZXNvbHZlckludGVybmFsIiwiUG9wdXBPcGVyYXRpb24iLCJleGVjdXRlTm90TnVsbCIsInJlYXV0aGVudGljYXRlV2l0aFBvcHVwIiwibGlua1dpdGhQb3B1cCIsImF1dGhXaW5kb3ciLCJwb2xsSWQiLCJjdXJyZW50UG9wdXBBY3Rpb24iLCJjYW5jZWwiLCJfb3BlblBvcHVwIiwiYXNzb2NpYXRlZEV2ZW50IiwiX29yaWdpblZhbGlkYXRpb24iLCJfaXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkIiwiaXNTdXBwb3J0ZWQiLCJwb2xsVXNlckNhbmNlbGxhdGlvbiIsImNsb3NlZCIsInJlZGlyZWN0T3V0Y29tZU1hcCIsIlJlZGlyZWN0QWN0aW9uIiwicmVhZHlPdXRjb21lIiwicGVuZGluZ1JlZGlyZWN0S2V5IiwicmVzb2x2ZXJQZXJzaXN0ZW5jZSIsImhhc1BlbmRpbmdSZWRpcmVjdCIsIl9nZXRBbmRDbGVhclBlbmRpbmdSZWRpcmVjdFN0YXR1cyIsIm9uQXV0aEV2ZW50IiwiX3JlZGlyZWN0VXNlckZvcklkIiwiX3NldFBlbmRpbmdSZWRpcmVjdFN0YXR1cyIsInNpZ25JbldpdGhSZWRpcmVjdCIsIl9vcGVuUmVkaXJlY3QiLCJfc2lnbkluV2l0aFJlZGlyZWN0IiwicmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QiLCJwcmVwYXJlVXNlckZvclJlZGlyZWN0IiwiX3JlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0IiwibGlua1dpdGhSZWRpcmVjdCIsIl9saW5rV2l0aFJlZGlyZWN0IiwiZ2V0UmVkaXJlY3RSZXN1bHQiLCJfZ2V0UmVkaXJlY3RSZXN1bHQiLCJyZXNvbHZlckV4dGVybiIsIkF1dGhFdmVudE1hbmFnZXIiLCJjYWNoZWRFdmVudFVpZHMiLCJjb25zdW1lcnMiLCJxdWV1ZWRSZWRpcmVjdEV2ZW50IiwiaGFzSGFuZGxlZFBvdGVudGlhbFJlZGlyZWN0IiwibGFzdFByb2Nlc3NlZEV2ZW50VGltZSIsImF1dGhFdmVudENvbnN1bWVyIiwiaXNFdmVudEZvckNvbnN1bWVyIiwic2VuZFRvQ29uc3VtZXIiLCJzYXZlRXZlbnRUb0NhY2hlIiwiaGFzRXZlbnRCZWVuSGFuZGxlZCIsImhhbmRsZWQiLCJjb25zdW1lciIsImlzTnVsbFJlZGlyZWN0RXZlbnQiLCJpc1JlZGlyZWN0RXZlbnQiLCJvbkVycm9yIiwiZXZlbnRJZE1hdGNoZXMiLCJjbGVhciIsImV2ZW50VWlkIiwidiIsIl9nZXRQcm9qZWN0Q29uZmlnIiwiSVBfQUREUkVTU19SRUdFWCIsIkhUVFBfUkVHRVgiLCJtYXRjaERvbWFpbiIsImN1cnJlbnRVcmwiLCJob3N0bmFtZSIsIlVSTCIsImNlVXJsIiwiZXNjYXBlZERvbWFpblBhdHRlcm4iLCJSZWdFeHAiLCJORVRXT1JLX1RJTUVPVVQiLCJyZXNldFVubG9hZGVkR2FwaU1vZHVsZXMiLCJiZWFjb24iLCJfX19qc2wiLCJIIiwiaGludCIsIkwiLCJDUCIsImNhY2hlZEdBcGlMb2FkZXIiLCJfbG9hZEdhcGkiLCJsb2FkR2FwaUlmcmFtZSIsImdhcGkiLCJpZnJhbWVzIiwiZ2V0Q29udGV4dCIsIm9udGltZW91dCIsIklmcmFtZSIsImNiTmFtZSIsImxvYWRHYXBpIiwiUElOR19USU1FT1VUIiwiSUZSQU1FX0FUVFJJQlVURVMiLCJoZWlnaHQiLCJ0YWJpbmRleCIsIkVJRF9GUk9NX0FQSUhPU1QiLCJnZXRJZnJhbWVVcmwiLCJlaWQiLCJmdyIsIkJBU0VfUE9QVVBfT1BUSU9OUyIsInJlc2l6YWJsZSIsInN0YXR1c2JhciIsInRvb2xiYXIiLCJBdXRoUG9wdXAiLCJfb3BlbiIsInNjcmVlbiIsImF2YWlsSGVpZ2h0IiwiYXZhaWxXaWR0aCIsInNjcm9sbGJhcnMiLCJvcHRpb25zU3RyaW5nIiwicmVkdWNlIiwiYWNjdW0iLCJzdGFuZGFsb25lIiwiX2lzSU9TU3RhbmRhbG9uZSIsImNsaWNrIiwiY3JlYXRlRXZlbnQiLCJpbml0TW91c2VFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJvcGVuQXNOZXdXaW5kb3dJT1MiLCJuZXdXaW4iLCJmb2N1cyIsIl9nZXRSZWRpcmVjdFVybCIsImF1dGhUeXBlIiwicmVkaXJlY3RVcmwiLCJhZGRpdGlvbmFsUGFyYW1zIiwic2V0RGVmYXVsdExhbmd1YWdlIiwiZ2V0Q3VzdG9tUGFyYW1ldGVycyIsImdldFNjb3BlcyIsInRpZCIsInBhcmFtc0RpY3QiLCJnZXRIYW5kbGVyQmFzZSIsImJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJldmVudE1hbmFnZXJzIiwib3JpZ2luVmFsaWRhdGlvblByb21pc2VzIiwiaW5pdEFuZEdldE1hbmFnZXIiLCJpZnJhbWUiLCJjb250ZXh0Iiwid2hlcmUiLCJtZXNzYWdlSGFuZGxlcnNGaWx0ZXIiLCJDUk9TU19PUklHSU5fSUZSQU1FU19GSUxURVIiLCJhdHRyaWJ1dGVzIiwiZG9udGNsZWFyIiwicmVzdHlsZSIsInNldEhpZGVPbkxlYXZlIiwibmV0d29ya0Vycm9yIiwibmV0d29ya0Vycm9yVGltZXIiLCJjbGVhclRpbWVyQW5kUmVzb2x2ZSIsInBpbmciLCJfb3BlbklmcmFtZSIsInJlZ2lzdGVyIiwiaWZyYW1lRXZlbnQiLCJhdXRoRXZlbnQiLCJvbkV2ZW50Iiwic2VuZCIsImF1dGhvcml6ZWREb21haW5zIiwiZG9tYWluIiwiX3ZhbGlkYXRlT3JpZ2luIiwiUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwiLCJfZmluYWxpemVFbnJvbGwiLCJfZmluYWxpemVTaWduSW4iLCJmaW5hbGl6ZUVucm9sbFBob25lTWZhIiwicGhvbmVWZXJpZmljYXRpb25JbmZvIiwiZmluYWxpemVTaWduSW5QaG9uZU1mYSIsIlBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IiLCJfZnJvbUNyZWRlbnRpYWwiLCJGQUNUT1JfSUQiLCJBdXRoSW50ZXJvcCIsImludGVybmFsTGlzdGVuZXJzIiwiYXNzZXJ0QXV0aENvbmZpZ3VyZWQiLCJ1bnN1YnNjcmliZSIsIm9uSWRUb2tlbkNoYW5nZWQiLCJ1cGRhdGVQcm9hY3RpdmVSZWZyZXNoIiwiX2NvcmRvdmFXaW5kb3ciLCJkZXBzIiwiZ2V0UHJvdmlkZXIiLCJnZXRJbW1lZGlhdGUiLCJhdXRoSW5zdGFuY2UiLCJoaWVyYXJjaHkiLCJfdXBkYXRlRXJyb3JNYXAiLCJfaW5pdGlhbGl6ZVdpdGhQZXJzaXN0ZW5jZSIsIl9pbml0aWFsaXplQXV0aEluc3RhbmNlIiwic2V0SW5zdGFudGlhdGlvbk1vZGUiLCJzZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjayIsIl9pbnN0YW5jZUlkZW50aWZpZXIiLCJfaW5zdGFuY2UiLCJpbml0aWFsaXplIiwiZ2V0VmVyc2lvbkZvclBsYXRmb3JtIiwiX2dlbmVyYXRlSGFuZGxlclVybCIsIkJ1aWxkSW5mbyIsInNlc3Npb25EaWdlc3QiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsImJ1ZmYiLCJBcnJheUJ1ZmZlciIsInZpZXciLCJVaW50OEFycmF5Iiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImJ1ZiIsImNyeXB0byIsInN1YnRsZSIsImRpZ2VzdCIsIm51bSIsInBhZFN0YXJ0IiwiY29tcHV0ZVNoYTI1NiIsIl9wZXJmb3JtUmVkaXJlY3QiLCJoYW5kbGVyVXJsIiwiY29yZG92YSIsInBsdWdpbnMiLCJicm93c2VydGFiIiwiaXNBdmFpbGFibGUiLCJicm93c2VyVGFiSXNBdmFpbGFibGUiLCJpYWJSZWYiLCJvcGVuVXJsIiwiSW5BcHBCcm93c2VyIiwiX2lzSU9TN09yOCIsInBhc3NpdmVMaXN0ZW5lcnMiLCJpbml0UHJvbWlzZSIsInJlc29sdmVJbmlhbGl6ZWQiLCJfZ2V0QW5kUmVtb3ZlRXZlbnQiLCJwZXJzaXN0ZW5jZUtleSIsIl9ldmVudEZyb21QYXJ0aWFsQW5kVXJsIiwicGFydGlhbEV2ZW50IiwiY2FsbGJhY2tVcmwiLCJzZWFyY2hQYXJhbXNPckVtcHR5IiwiX2dldERlZXBMaW5rRnJvbUNhbGxiYWNrIiwiZXJyb3JPYmplY3QiLCJwYXJzZUpzb25Pck51bGwiLCJnZW5lcmF0ZVNlc3Npb25JZCIsImlkeCIsImNvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJhdHRhY2hDYWxsYmFja0xpc3RlbmVycyIsIl9qIiwiX2siLCJ3aW4iLCJ1bml2ZXJzYWxMaW5rcyIsIm1pc3NpbmdQbHVnaW4iLCJfY2hlY2tDb3Jkb3ZhQ29uZmlndXJhdGlvbiIsImluaXRpYWxpemVkIiwicmVzZXRSZWRpcmVjdCIsIl9nZW5lcmF0ZU5ld0V2ZW50IiwiX3NhdmVQYXJ0aWFsRXZlbnQiLCJldmVudExpc3RlbmVyIiwiY2xlYW51cCIsIm9uQ2xvc2VUaW1lciIsImF1dGhFdmVudFNlZW4iLCJjbG9zZUJyb3dzZXJUYWIiLCJyZXN1bWVkIiwidmlzaWJpbGl0eUNoYW5nZWQiLCJ2aXNpYmlsaXR5U3RhdGUiLCJhZGRQYXNzaXZlTGlzdGVuZXIiLCJyZW1vdmVQYXNzaXZlTGlzdGVuZXIiLCJfd2FpdEZvckFwcFJlc3VtZSIsIl9jYiIsImlvc0J1bmRsZUlkIiwiaGFuZGxlT3BlblVSTCIsIm5vRXZlbnRUaW1lb3V0IiwiZ2VuZXJhdGVOb0V2ZW50IiwidW5pdmVyc2FsTGlua3NDYiIsImV2ZW50RGF0YSIsImZpbmFsRXZlbnQiLCJleGlzdGluZ0hhbmRsZU9wZW5VUkwiLCJwYWNrYWdlUHJlZml4IiwiYWRkRnJhbWV3b3JrRm9yTG9nZ2luZyIsIl9sb2dGcmFtZXdvcmsiLCJTIiwiRCIsImlzQXV0aGVudGljYXRlZCIsIlVOQVVUSEVOVElDQVRFRCIsIkdPT0dMRV9DUkVERU5USUFMUyIsIkZJUlNUX1BBUlRZIiwiTU9DS19VU0VSIiwiQyIsIk4iLCJ4Iiwic2V0TG9nTGV2ZWwiLCIkIiwiREVCVUciLCJNIiwiZGVidWciLCJGIiwiTyIsIldBUk4iLCJ3YXJuIiwiQiIsIlUiLCJxIiwiSyIsIk9LIiwiQ0FOQ0VMTEVEIiwiVU5LTk9XTiIsIklOVkFMSURfQVJHVU1FTlQiLCJERUFETElORV9FWENFRURFRCIsIk5PVF9GT1VORCIsIkFMUkVBRFlfRVhJU1RTIiwiUEVSTUlTU0lPTl9ERU5JRUQiLCJSRVNPVVJDRV9FWEhBVVNURUQiLCJGQUlMRURfUFJFQ09ORElUSU9OIiwiQUJPUlRFRCIsIk9VVF9PRl9SQU5HRSIsIlVOSU1QTEVNRU5URUQiLCJJTlRFUk5BTCIsIlVOQVZBSUxBQkxFIiwiREFUQV9MT1NTIiwiaiIsIlEiLCJXIiwiRyIsImVucXVldWVSZXRyeWFibGUiLCJ6IiwiY2hhbmdlTGlzdGVuZXIiLCJhZGRBdXRoVG9rZW5MaXN0ZW5lciIsIm9uSW5pdCIsIm9wdGlvbmFsIiwicmVtb3ZlQXV0aFRva2VuTGlzdGVuZXIiLCJnZXRVaWQiLCJKIiwiZ2V0QXV0aEhlYWRlclZhbHVlRm9yRmlyc3RQYXJ0eSIsIlkiLCJoIiwiWCIsIloiLCJnIiwiYXBwQ2hlY2siLCJhZGRUb2tlbkxpc3RlbmVyIiwicmVtb3ZlVG9rZW5MaXN0ZW5lciIsInR0IiwiZXQiLCJwcmV2aW91c1ZhbHVlIiwic2VxdWVuY2VOdW1iZXJIYW5kbGVyIiwiVCIsIndyaXRlU2VxdWVuY2VOdW1iZXIiLCJudCIsIm1zQ3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiSSIsInN0IiwiaXQiLCJydCIsImV2ZXJ5Iiwib3QiLCJhdCIsIm5hbm9zZWNvbmRzIiwiZnJvbU1pbGxpcyIsInRvTWlsbGlzIiwiY3QiLCJ0aW1lc3RhbXAiLCJfY29tcGFyZVRvIiwiaXNFcXVhbCIsInV0IiwiaHQiLCJsdCIsImZ0Iiwic2VnbWVudHMiLCJvZmZzZXQiLCJjb21wYXJhdG9yIiwibGltaXQiLCJjb25zdHJ1Y3QiLCJkdCIsInRvQXJyYXkiLCJjYW5vbmljYWxTdHJpbmciLCJ3dCIsIl90IiwiaXNWYWxpZElkZW50aWZpZXIiLCJtdCIsImZpZWxkcyIsImlzUHJlZml4T2YiLCJndCIsInl0IiwiYmluYXJ5U3RyaW5nIiwiRU1QVFlfQllURV9TVFJJTkciLCJwdCIsIlR0IiwibmFub3MiLCJFdCIsIkl0IiwiZnJvbUJhc2U2NFN0cmluZyIsImZyb21VaW50OEFycmF5IiwiQXQiLCJtYXBWYWx1ZSIsIl9fdHlwZV9fIiwic3RyaW5nVmFsdWUiLCJQdCIsIl9fbG9jYWxfd3JpdGVfdGltZV9fIiwidGltZXN0YW1wVmFsdWUiLCJidCIsInZ0IiwiVnQiLCJpc0ludGVnZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsIlN0IiwiZnJvbVN0cmluZyIsInBvcEZpcnN0IiwiRHQiLCJDdCIsImJvb2xlYW5WYWx1ZSIsImJ5dGVzVmFsdWUiLCJyZWZlcmVuY2VWYWx1ZSIsImdlb1BvaW50VmFsdWUiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImludGVnZXJWYWx1ZSIsImRvdWJsZVZhbHVlIiwiYXJyYXlWYWx1ZSIsInZhbHVlcyIsIk50Iiwia3QiLCJ4dCIsImNvbXBhcmVUbyIsIiR0IiwiRnQiLCJ0b0Jhc2U2NCIsImZyb21OYW1lIiwiT3QiLCJkYXRhYmFzZSIsIk10IiwiTHQiLCJCdCIsIlV0IiwicXQiLCJLdCIsImp0IiwibGFzdFNlZ21lbnQiLCJnZXRGaWVsZHNNYXAiLCJwb3BMYXN0IiwiZW1wdHlQYXRoIiwiaXNJbW1lZGlhdGVQYXJlbnRPZiIsImFwcGx5Q2hhbmdlcyIsImZpZWxkIiwiUXQiLCJjaGlsZCIsIld0IiwiZG9jdW1lbnRUeXBlIiwidmVyc2lvbiIsImRvY3VtZW50U3RhdGUiLCJlbXB0eSIsImhhc0xvY2FsTXV0YXRpb25zIiwiaGFzQ29tbWl0dGVkTXV0YXRpb25zIiwiY2xvbmUiLCJHdCIsImNvbGxlY3Rpb25Hcm91cCIsIm9yZGVyQnkiLCJmaWx0ZXJzIiwic3RhcnRBdCIsImVuZEF0IiwiUiIsInp0IiwiSHQiLCJ0ZSIsImRpciIsImhlIiwiWXQiLCJmZSIsIndlIiwiWHQiLCJpc0RvY3VtZW50S2V5IiwiWnQiLCJpc0tleUZpZWxkIiwiUCIsImVlIiwib2UiLCJhZSIsImNlIiwibmUiLCJzZSIsImllIiwibnVsbFZhbHVlIiwidWUiLCJiZWZvcmUiLCJsZSIsImRlIiwiZXhwbGljaXRPcmRlckJ5IiwibGltaXRUeXBlIiwibWUiLCJnZSIsInllIiwicGUiLCJUZSIsIkVlIiwiViIsIkllIiwiQWUiLCJrZXlGaWVsZCIsIlJlIiwiUGUiLCJiZSIsInZlIiwiVmUiLCJKdCIsIlNlIiwiaXNGb3VuZERvY3VtZW50IiwiaGFzQ29sbGVjdGlvbklkIiwiRGUiLCJDZSIsIk5lIiwia2UiLCJ4ZSIsIiRlIiwiRmUiLCJMZSIsIl9fcHJldmlvdXNfdmFsdWVfXyIsIkJlIiwiVWUiLCJxZSIsIktlIiwiTWUiLCJRZSIsIk9lIiwiamUiLCJlbGVtZW50cyIsIldlIiwiR2UiLCJ0cmFuc2Zvcm0iLCJIZSIsInRyYW5zZm9ybVJlc3VsdHMiLCJKZSIsInVwZGF0ZVRpbWUiLCJleGlzdHMiLCJZZSIsIlhlIiwiWmUiLCJybiIsImNuIiwiZmllbGRUcmFuc2Zvcm1zIiwic2V0QWxsIiwiY29udmVydFRvRm91bmREb2N1bWVudCIsInNldEhhc0NvbW1pdHRlZE11dGF0aW9ucyIsIm9uIiwicHJlY29uZGl0aW9uIiwiY29udmVydFRvVW5rbm93bkRvY3VtZW50IiwiYW4iLCJjb252ZXJ0VG9Ob0RvY3VtZW50IiwidG4iLCJ1biIsInNuIiwic2V0SGFzTG9jYWxNdXRhdGlvbnMiLCJlbiIsIm5uIiwiemUiLCJmaWVsZE1hc2siLCJobiIsImxuIiwiY291bnQiLCJkbiIsInduIiwiX24iLCJtbiIsImduIiwicm9vdCIsInBuIiwiRU1QVFkiLCJpbnNlcnQiLCJjb3B5IiwiQkxBQ0siLCJyZW1vdmUiLCJyaWdodCIsIm1pbktleSIsIm1heEtleSIsImlub3JkZXJUcmF2ZXJzYWwiLCJyZXZlcnNlVHJhdmVyc2FsIiwieW4iLCJpc1JldmVyc2UiLCJub2RlU3RhY2siLCJSRUQiLCJmaXhVcCIsImlzUmVkIiwibW92ZVJlZExlZnQiLCJyZW1vdmVNaW4iLCJyb3RhdGVSaWdodCIsIm1vdmVSZWRSaWdodCIsInJvdGF0ZUxlZnQiLCJjb2xvckZsaXAiLCJjaGVjayIsInBvdyIsIlRuIiwiZ2V0SXRlcmF0b3JGcm9tIiwiaGFzTmV4dCIsImdldE5leHQiLCJnZXRJdGVyYXRvciIsIkVuIiwiaXRlciIsIkluIiwiQW4iLCJSbiIsIlBuIiwiYm4iLCJ2biIsIlZuIiwiU24iLCJEbiIsIkNuIiwiTm4iLCJzbmFwc2hvdFZlcnNpb24iLCJ0YXJnZXRDaGFuZ2VzIiwidGFyZ2V0TWlzbWF0Y2hlcyIsImRvY3VtZW50VXBkYXRlcyIsInJlc29sdmVkTGltYm9Eb2N1bWVudHMiLCJrbiIsImNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSIsInJlc3VtZVRva2VuIiwiY3VycmVudCIsImFkZGVkRG9jdW1lbnRzIiwibW9kaWZpZWREb2N1bWVudHMiLCJyZW1vdmVkRG9jdW1lbnRzIiwieG4iLCJyZW1vdmVkVGFyZ2V0SWRzIiwiJG4iLCJ0YXJnZXRJZCIsIkZuIiwic3RhdGUiLCJ0YXJnZXRJZHMiLCJjYXVzZSIsIk9uIiwiQm4iLCJhcHByb3hpbWF0ZUJ5dGVTaXplIiwiTW4iLCJMbiIsImZvckVhY2hUYXJnZXQiLCJyZW1vdmVUYXJnZXQiLCJuZXdOb0RvY3VtZW50IiwiZm9yRWFjaFdoaWxlIiwicHVycG9zZSIsImdldFJlbW90ZUtleXNGb3JUYXJnZXQiLCJVbiIsImFzYyIsImRlc2MiLCJxbiIsImluIiwiS24iLCJkYXRhYmFzZUlkIiwiam4iLCJ0b0lTT1N0cmluZyIsIlFuIiwidG9VaW50OEFycmF5IiwiV24iLCJ0b1RpbWVzdGFtcCIsIkduIiwiZnJvbVRpbWVzdGFtcCIsInpuIiwiSG4iLCJBcyIsIkpuIiwiWW4iLCJlcyIsIlhuIiwiWm4iLCJ0cyIsInNzIiwibmV3Rm91bmREb2N1bWVudCIsIm9zIiwidXBkYXRlIiwidXBkYXRlTWFzayIsIklzIiwidXBkYXRlVHJhbnNmb3JtcyIsImZpZWxkUGF0aCIsInNldFRvU2VydmVyVmFsdWUiLCJhcHBlbmRNaXNzaW5nRWxlbWVudHMiLCJyZW1vdmVBbGxGcm9tQXJyYXkiLCJpbmNyZW1lbnQiLCJpc05vbmUiLCJjdXJyZW50RG9jdW1lbnQiLCJhcyIsIm5vbmUiLCJmcm9tU2VydmVyRm9ybWF0IiwiZmllbGRQYXRocyIsInVzIiwiZG9jdW1lbnRzIiwiaHMiLCJzdHJ1Y3R1cmVkUXVlcnkiLCJwYXJlbnQiLCJjb2xsZWN0aW9uSWQiLCJhbGxEZXNjZW5kYW50cyIsInVuYXJ5RmlsdGVyIiwieXMiLCJmaWVsZEZpbHRlciIsImdzIiwiY29tcG9zaXRlRmlsdGVyIiwiZGlyZWN0aW9uIiwibXMiLCJ3cyIsImxzIiwiZHMiLCJFcyIsIlRzIiwiY29uY2F0IiwicHMiLCJfcyIsIk5hTiIsIlJzIiwiYnMiLCJQcyIsInZzIiwiVnMiLCJTcyIsIm93bmVySWQiLCJhbGxvd1RhYlN5bmNocm9uaXphdGlvbiIsImxlYXNlVGltZXN0YW1wTXMiLCJzdG9yZSIsIkRzIiwidXNlcklkIiwibGFzdEFja25vd2xlZGdlZEJhdGNoSWQiLCJsYXN0U3RyZWFtVG9rZW4iLCJDcyIsImJhdGNoSWQiLCJsb2NhbFdyaXRlVGltZU1zIiwiYmFzZU11dGF0aW9ucyIsIm11dGF0aW9ucyIsInVzZXJNdXRhdGlvbnNJbmRleCIsInVzZXJNdXRhdGlvbnNLZXlQYXRoIiwiTnMiLCJQTEFDRUhPTERFUiIsImtzIiwicmVhZFRpbWUiLCJ4cyIsIiRzIiwidW5rbm93bkRvY3VtZW50Iiwibm9Eb2N1bWVudCIsInBhcmVudFBhdGgiLCJyZWFkVGltZUluZGV4IiwicmVhZFRpbWVJbmRleFBhdGgiLCJjb2xsZWN0aW9uUmVhZFRpbWVJbmRleCIsImNvbGxlY3Rpb25SZWFkVGltZUluZGV4UGF0aCIsIkZzIiwiYnl0ZVNpemUiLCJPcyIsImNhbm9uaWNhbElkIiwibGFzdExpc3RlblNlcXVlbmNlTnVtYmVyIiwibGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiIsInF1ZXJ5VGFyZ2V0c0luZGV4TmFtZSIsInF1ZXJ5VGFyZ2V0c0tleVBhdGgiLCJNcyIsInNlcXVlbmNlTnVtYmVyIiwiZG9jdW1lbnRUYXJnZXRzSW5kZXgiLCJkb2N1bWVudFRhcmdldHNLZXlQYXRoIiwiTHMiLCJoaWdoZXN0VGFyZ2V0SWQiLCJoaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIiLCJsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uIiwidGFyZ2V0Q291bnQiLCJCcyIsIlVzIiwiY2xpZW50SWQiLCJ1cGRhdGVUaW1lTXMiLCJuZXR3b3JrRW5hYmxlZCIsImluRm9yZWdyb3VuZCIsInFzIiwiY3JlYXRlVGltZSIsIktzIiwiYnVuZGxlZFF1ZXJ5IiwianMiLCJRcyIsIldzIiwib25Db21taXR0ZWRMaXN0ZW5lcnMiLCJHcyIsIm5leHRDYWxsYmFjayIsImNhdGNoQ2FsbGJhY2siLCJpc0RvbmUiLCJjYWxsYmFja0F0dGFjaGVkIiwid3JhcEZhaWx1cmUiLCJ3cmFwU3VjY2VzcyIsIndyYXBVc2VyRnVuY3Rpb24iLCJ3YWl0Rm9yIiwienMiLCJhYm9ydGVkIiwib25jb21wbGV0ZSIsIm9uYWJvcnQiLCJZcyIsIm5pIiwiYWJvcnQiLCJacyIsIkhzIiwiUnQiLCJ0aSIsImVudiIsIm9uc3VjY2VzcyIsIm9uYmxvY2tlZCIsIm9udXBncmFkZW5lZWRlZCIsIm9sZFZlcnNpb24iLCJvbnZlcnNpb25jaGFuZ2UiLCJKcyIsIlhzIiwiY3Vyc29yIiwicHJpbWFyeUtleSIsImNvbnRpbnVlIiwiZG9uZSIsImluZGV4IiwicmFuZ2UiLCJyZXZlcnNlIiwib3BlbktleUN1cnNvciIsIm9wZW5DdXJzb3IiLCJlaSIsInNpIiwiY3VycmVudFNlcXVlbmNlTnVtYmVyIiwiaWkiLCJyaSIsImxvY2FsV3JpdGVUaW1lIiwibXV0YXRpb25SZXN1bHRzIiwiYXBwbHlUb0xvY2FsVmlldyIsImlzVmFsaWREb2N1bWVudCIsIm9pIiwiYmF0Y2giLCJjb21taXRWZXJzaW9uIiwiZG9jVmVyc2lvbnMiLCJhaSIsImNpIiwidWkiLCJmcm9tU2VnbWVudHMiLCJ3aSIsIm5ld1Vua25vd25Eb2N1bWVudCIsImhpIiwibGkiLCJpc05vRG9jdW1lbnQiLCJkaSIsImlzVW5rbm93bkRvY3VtZW50IiwiZmkiLCJfaSIsInNwbGljZSIsIm1pIiwiZ2kiLCJ5aSIsInBpIiwiVGkiLCJFaSIsIklpIiwiQWkiLCJnZXRFbnRyaWVzIiwiUmkiLCJhZGRPbkNvbW1pdHRlZExpc3RlbmVyIiwiUGkiLCJJREJLZXlSYW5nZSIsImJvdW5kIiwiYmkiLCJkaWRSdW4iLCJzZXF1ZW5jZU51bWJlcnNDb2xsZWN0ZWQiLCJ0YXJnZXRzUmVtb3ZlZCIsImRvY3VtZW50c1JlbW92ZWQiLCJ2aSIsImNhY2hlU2l6ZUNvbGxlY3Rpb25UaHJlc2hvbGQiLCJwZXJjZW50aWxlVG9Db2xsZWN0IiwibWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdCIsIkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFIiwiREVGQVVMVF9NQVhfU0VRVUVOQ0VfTlVNQkVSU19UT19DT0xMRUNUIiwiVmkiLCJvbmx5IiwiU2kiLCJERUZBVUxUIiwiRElTQUJMRUQiLCJEaSIsInJlZmVyZW5jZURlbGVnYXRlIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJQT1NJVElWRV9JTkZJTklUWSIsIk5pIiwia2kiLCJhZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCIsImxvb2t1cE11dGF0aW9uQmF0Y2giLCJsb3dlckJvdW5kIiwidXBwZXJCb3VuZCIsInByZWZpeEZvclBhdGgiLCJtYXJrUG90ZW50aWFsbHlPcnBoYW5lZCIsImNoZWNrRW1wdHkiLCJwcmVmaXhGb3JVc2VyIiwiQ2kiLCJ4aSIsIiRpIiwiRmkiLCJyZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCIsIk9pIiwicmVtb3ZlVGFyZ2V0RGF0YSIsIk1pIiwiTGkiLCJhZGRSZWZlcmVuY2UiLCJyZW1vdmVSZWZlcmVuY2UiLCJCaSIsIlVpIiwicWkiLCJidWZmZXIiLCJsYXN0IiwiS2kiLCJnYXJiYWdlQ29sbGVjdG9yIiwiYXN5bmNRdWV1ZSIsImVucXVldWVBZnRlckRlbGF5IiwiY29sbGVjdEdhcmJhZ2UiLCJqaSIsIm1heFZhbHVlIiwicmVtb3ZlVGFyZ2V0cyIsInJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzIiwiZ2V0Q2FjaGVTaXplIiwiY2FsY3VsYXRlVGFyZ2V0Q291bnQiLCJudGhTZXF1ZW5jZU51bWJlciIsIlFpIiwiZ2V0VGFyZ2V0Q2FjaGUiLCJnZXRUYXJnZXRDb3VudCIsIldpIiwiZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSIsIm5ld0NoYW5nZUJ1ZmZlciIsImdldEVudHJ5IiwicmVtb3ZlRW50cnkiLCJhcHBseSIsIndpdGhTZXF1ZW5jZU51bWJlciIsInVwZGF0ZVRhcmdldERhdGEiLCJnZXRTaXplIiwiR2kiLCJtYXBLZXlGbiIsImVxdWFsc0ZuIiwiaW5uZXIiLCJ6aSIsImNoYW5nZXMiLCJjaGFuZ2VzQXBwbGllZCIsImFzc2VydE5vdEFwcGxpZWQiLCJuZXdJbnZhbGlkRG9jdW1lbnQiLCJnZXRGcm9tQ2FjaGUiLCJnZXRBbGxGcm9tQ2FjaGUiLCJIaSIsIlhpIiwiWmkiLCJnZXRNZXRhZGF0YSIsImZpcnN0IiwiSmkiLCJ0cmFja1JlbW92YWxzIiwiWWkiLCJnZXRSZWFkVGltZSIsImFkZEVudHJ5IiwidXBkYXRlTWV0YWRhdGEiLCJ0ciIsImF1dG9JbmNyZW1lbnQiLCJjcmVhdGVJbmRleCIsInVuaXF1ZSIsImVyIiwiZGVsZXRlT2JqZWN0U3RvcmUiLCJuciIsInNyIiwiaXNQcmltYXJ5IiwicnVuVHJhbnNhY3Rpb24iLCJnZXRIaWdoZXN0U2VxdWVuY2VOdW1iZXIiLCJzdGFydGVkIiwibmV3VmVyc2lvbiIsImVucXVldWVBbmRGb3JnZXQiLCJyciIsImlyIiwicmFpc2VPbkNvbW1pdHRlZEV2ZW50IiwiYXBwVmVyc2lvbiIsImVudGVyUmVzdHJpY3RlZE1vZGUiLCJzaHV0ZG93biIsIm9yIiwiaXNEZWZhdWx0RGF0YWJhc2UiLCJhciIsInByb2dyZXNzIiwiY3IiLCJnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleSIsImdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5cyIsImdldENvbGxlY3Rpb25QYXJlbnRzIiwiZ2V0RG9jdW1lbnRzTWF0Y2hpbmdRdWVyeSIsImdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ1F1ZXJ5IiwidXIiLCJmcm9tQ2FjaGUiLCJkb2NDaGFuZ2VzIiwiZG9jIiwiaHIiLCJoYXNQZW5kaW5nV3JpdGVzIiwibHIiLCJnZXRNdXRhdGlvblF1ZXVlIiwiZ2V0SW5kZXhNYW5hZ2VyIiwiZ2V0QnVuZGxlQ2FjaGUiLCJjb2xsZWN0IiwiZnIiLCJkciIsImdldEFsbE11dGF0aW9uQmF0Y2hlcyIsInJlbW92ZWRCYXRjaElkcyIsImFkZGVkQmF0Y2hJZHMiLCJfciIsImdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24iLCJnciIsInlyIiwiZ2V0TmV4dE11dGF0aW9uQmF0Y2hBZnRlckJhdGNoSWQiLCJwciIsImdldFRhcmdldERhdGEiLCJhbGxvY2F0ZVRhcmdldElkIiwiYWRkVGFyZ2V0RGF0YSIsIlRyIiwiRXIiLCJnZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCIsIklyIiwiQXIiLCJiciIsInNhdmVOYW1lZFF1ZXJ5Iiwid2l0aFJlc3VtZVRva2VuIiwiYWRkTWF0Y2hpbmdLZXlzIiwidnIiLCJWciIsIlNyIiwiZm9yRWFjaEluUmFuZ2UiLCJmaXJzdEFmdGVyT3JFcXVhbCIsImZzIiwiRHIiLCJzaGlmdCIsIkNyIiwiZG9jcyIsIk5yIiwia3IiLCJycyIsImNzIiwiY29udGFpbnNLZXkiLCJ4ciIsInRvS2V5IiwiJHIiLCJGciIsImZyb21QYXRoIiwiT3IiLCJNciIsIkxyIiwiQnIiLCJVciIsInFyIiwiYWN0aXZlVGFyZ2V0SWRzIiwiS3IiLCJvbmxpbmVTdGF0ZSIsImpyIiwiUXIiLCJzeW5jRW5naW5lIiwib25saW5lU3RhdGVIYW5kbGVyIiwiaXNBY3RpdmVRdWVyeVRhcmdldCIsImFkZFBlbmRpbmdNdXRhdGlvbiIsInN0b3JhZ2VBcmVhIiwidW5pb25XaXRoIiwiV3IiLCJHciIsInpyIiwiSHIiLCJCYXRjaEdldERvY3VtZW50cyIsIkNvbW1pdCIsIlJ1blF1ZXJ5IiwiSnIiLCJZciIsImRhdGFiYXNlSW5mbyIsInNzbCIsImZvcmNlTG9uZ1BvbGxpbmciLCJhdXRvRGV0ZWN0TG9uZ1BvbGxpbmciLCJ1c2VGZXRjaFN0cmVhbXMiLCJsaXN0ZW5PbmNlIiwiQ09NUExFVEUiLCJnZXRMYXN0RXJyb3JDb2RlIiwiTk9fRVJST1IiLCJnZXRSZXNwb25zZUpzb24iLCJUSU1FT1VUIiwiSFRUUF9FUlJPUiIsImdldFN0YXR1cyIsImdldFJlc3BvbnNlVGV4dCIsImh0dHBTZXNzaW9uSWRQYXJhbSIsImluaXRNZXNzYWdlSGVhZGVycyIsIm1lc3NhZ2VVcmxQYXJhbXMiLCJzZW5kUmF3SnNvbiIsInN1cHBvcnRzQ3Jvc3NEb21haW5YaHIiLCJpbnRlcm5hbENoYW5uZWxQYXJhbXMiLCJmb3J3YXJkQ2hhbm5lbFJlcXVlc3RUaW1lb3V0TXMiLCJkZXRlY3RCdWZmZXJpbmdQcm94eSIsInhtbEh0dHBGYWN0b3J5IiwiaHR0cEhlYWRlcnNPdmVyd3JpdGVQYXJhbSIsImNyZWF0ZVdlYkNoYW5uZWwiLCJ5IiwibGlzdGVuIiwiRXZlbnRUeXBlIiwiT1BFTiIsIkNMT1NFIiwiTUVTU0FHRSIsIlNUQVRfRVZFTlQiLCJzdGF0IiwiUFJPWFkiLCJOT1BST1hZIiwiWHIiLCJaciIsInRvIiwiZW8iLCJza2lwRGVsYXkiLCJubyIsImF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyIiwiYXBwQ2hlY2tDcmVkZW50aWFsc1Byb3ZpZGVyIiwic3RyZWFtIiwibXIiLCJpbnZhbGlkYXRlVG9rZW4iLCJSciIsInNvIiwidGFyZ2V0Q2hhbmdlIiwidGFyZ2V0Q2hhbmdlVHlwZSIsImRvY3VtZW50Q2hhbmdlIiwiZG9jdW1lbnREZWxldGUiLCJkb2N1bWVudFJlbW92ZSIsIlByIiwiYWRkVGFyZ2V0IiwibGFiZWxzIiwiaW8iLCJzdHJlYW1Ub2tlbiIsIndyaXRlUmVzdWx0cyIsImNvbW1pdFRpbWUiLCJ3cml0ZXMiLCJybyIsImF1dGhDcmVkZW50aWFscyIsImFwcENoZWNrQ3JlZGVudGlhbHMiLCJvbyIsImFvIiwibG9jYWxTdG9yZSIsImRhdGFzdG9yZSIsInJlbW90ZVN5bmNlciIsImdvIiwidW8iLCJjbyIsImhvIiwibW8iLCJfbyIsInhvIiwiZm8iLCJsbyIsIndvIiwieW8iLCJwbyIsIlRvIiwiRW8iLCJyZWplY3RMaXN0ZW4iLCJJbyIsImFwcGx5UmVtb3RlRXZlbnQiLCJBbyIsIlJvIiwiJG8iLCJQbyIsImJvIiwidm8iLCJWbyIsIlNvIiwiRG8iLCJDbyIsImFwcGx5U3VjY2Vzc2Z1bFdyaXRlIiwiTm8iLCJ3ciIsInJlamVjdEZhaWxlZFdyaXRlIiwia28iLCJzdG9wIiwiRm8iLCJ0YXJnZXRUaW1lTXMiLCJyZW1vdmFsQ2FsbGJhY2siLCJkZWZlcnJlZCIsInRpbWVySGFuZGxlIiwiaGFuZGxlRGVsYXlFbGFwc2VkIiwiT28iLCJNbyIsImtleWVkTWFwIiwic29ydGVkU2V0IiwiTG8iLCJCbyIsIm9sZERvY3MiLCJtdXRhdGVkS2V5cyIsInN5bmNTdGF0ZUNoYW5nZWQiLCJleGNsdWRlc01ldGFkYXRhQ2hhbmdlcyIsImVtcHR5U2V0IiwiVW8iLCJxbyIsInF1ZXJpZXMiLCJLbyIsIm9uTGlzdGVuIiwiR28iLCJqbyIsIm9uVW5saXN0ZW4iLCJRbyIsIldvIiwiem8iLCJpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzIiwiZnJvbUluaXRpYWxEb2N1bWVudHMiLCJIbyIsImJ5dGVMZW5ndGgiLCJKbyIsIllvIiwiWG8iLCJieXRlc0xvYWRlZCIsImRvY3VtZW50c0xvYWRlZCIsIm5hbWVkUXVlcnkiLCJkb2N1bWVudE1ldGFkYXRhIiwidGFza1N0YXRlIiwidG90YWxEb2N1bWVudHMiLCJ0b3RhbEJ5dGVzIiwiWm8iLCJ0YSIsImVhIiwiZiIsInRyYWNrIiwic25hcHNob3QiLCJuYSIsInNhIiwiaWEiLCJyZW1vdGVTdG9yZSIsInNoYXJlZENsaWVudFN0YXRlIiwibWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnMiLCJyYSIsInhhIiwiYWRkTG9jYWxRdWVyeVRhcmdldCIsIm9hIiwiaXNQcmltYXJ5Q2xpZW50IiwicGEiLCJhYSIsInJlbW92ZUxvY2FsUXVlcnlUYXJnZXQiLCJjbGVhclF1ZXJ5U3RhdGUiLCJnYSIsInJlbW92ZU1hdGNoaW5nS2V5cyIsInRvTWljcm9zZWNvbmRzIiwidXBkYXRlTGltYm9Eb2N1bWVudCIsInNldFRhcmdldHNNZXRhZGF0YSIsIklhIiwiaGEiLCJzZXRPbmxpbmVTdGF0ZSIsImxhIiwidXBkYXRlUXVlcnlTdGF0ZSIsIkVhIiwiZmEiLCJhcHBseVRvUmVtb3RlRG9jdW1lbnQiLCJyZW1vdmVNdXRhdGlvbkJhdGNoIiwicGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2siLCJtYSIsInVwZGF0ZU11dGF0aW9uU3RhdGUiLCJkYSIsInlhIiwiVGEiLCJ3aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiIsIkFhIiwiaGFuZGxlVXNlckNoYW5nZSIsIlJhIiwiUGEiLCJiYSIsInZhIiwiU2EiLCJEYSIsIkNhIiwiTmEiLCJjcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZSIsImthIiwiJGEiLCJPYSIsInN5bmNocm9uaXplVGFicyIsImdjU2NoZWR1bGVyIiwiaW5pdGlhbFVzZXIiLCJNYSIsImNhY2hlU2l6ZUJ5dGVzIiwiZm9yY2VPd25lcnNoaXAiLCJ3aXRoQ2FjaGVTaXplIiwiTGEiLCJnZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMiLCJpc0xvY2FsUXVlcnlUYXJnZXQiLCJWYSIsIkJhIiwiY3JlYXRlRGF0YXN0b3JlIiwiY3JlYXRlUmVtb3RlU3RvcmUiLCJjcmVhdGVFdmVudE1hbmFnZXIiLCJjcmVhdGVTeW5jRW5naW5lIiwiaGFuZGxlQ3JlZGVudGlhbENoYW5nZSIsIlVhIiwicWEiLCJtdXRlZCIsIkthIiwiVGV4dERlY29kZXIiLCJkZWNvZGUiLCJjYSIsImZpbmRJbmRleCIsInJlYWQiLCJqYSIsInJlYWRWZXJzaW9ucyIsImNvbW1pdHRlZCIsImxhc3RXcml0ZUVycm9yIiwid3JpdHRlbkRvY3MiLCJlbnN1cmVDb21taXROb3RDYWxsZWQiLCJmb3VuZCIsIm1pc3NpbmciLCJpcyIsInJlY29yZFZlcnNpb24iLCJ0b011dGF0aW9uIiwicHJlY29uZGl0aW9uRm9yVXBkYXRlIiwiUWEiLCJ1cGRhdGVGdW5jdGlvbiIsImNvbW1pdCIsIndhIiwiV2EiLCJBIiwiYXV0aENyZWRlbnRpYWxMaXN0ZW5lciIsImlzU2h1dHRpbmdEb3duIiwiZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQiLCJvbmxpbmVDb21wb25lbnRzIiwidGVybWluYXRlIiwib2ZmbGluZUNvbXBvbmVudHMiLCJHYSIsInZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MiLCJnZXRDb25maWd1cmF0aW9uIiwic2V0Q3JlZGVudGlhbENoYW5nZUxpc3RlbmVyIiwic2V0RGF0YWJhc2VEZWxldGVkTGlzdGVuZXIiLCJ6YSIsIkhhIiwiSmEiLCJZYSIsIlhhIiwiWmEiLCJ0YyIsImVjIiwicmMiLCJhYyIsImhjIiwiUmVhZGFibGVTdHJlYW0iLCJnZXRSZWFkZXIiLCJnZXRCdW5kbGVNZXRhZGF0YSIsIl9jb21wbGV0ZVdpdGgiLCJfdXBkYXRlUHJvZ3Jlc3MiLCJzYXZlQnVuZGxlTWV0YWRhdGEiLCJfZmFpbFdpdGgiLCJub3RpZnlCdW5kbGVMb2FkZWQiLCJGYSIsImZjIiwiZGMiLCJ3YyIsIm1jIiwiZ2MiLCJ5YyIsInBjIiwiVGMiLCJFYyIsIkljIiwiY3JlZGVudGlhbHMiLCJpZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzIiwiZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZyIsImV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZyIsIkFjIiwiX2F1dGhDcmVkZW50aWFscyIsIl9hcHBDaGVja0NyZWRlbnRpYWxzIiwiX3BlcnNpc3RlbmNlS2V5IiwiX3NldHRpbmdzIiwiX3NldHRpbmdzRnJvemVuIiwiX2RhdGFiYXNlSWQiLCJfYXBwIiwiX3Rlcm1pbmF0ZVRhc2siLCJjbGllbnQiLCJzZXNzaW9uSW5kZXgiLCJpYW1Ub2tlbiIsIl90ZXJtaW5hdGUiLCJSYyIsIl9nZXRTZXR0aW5ncyIsIl9zZXRTZXR0aW5ncyIsIm1vY2tVc2VyVG9rZW4iLCJQYyIsImNvbnZlcnRlciIsImZpcmVzdG9yZSIsInZjIiwiYmMiLCJfcXVlcnkiLCJfcGF0aCIsIlZjIiwiU2MiLCJEYyIsIkNjIiwiTmMiLCJrYyIsImVucXVldWUiLCJzdGFjayIsImNyZWF0ZUFuZFNjaGVkdWxlIiwieGMiLCIkYyIsIl9wcm9ncmVzc09ic2VydmVyIiwiX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIiLCJfbGFzdFByb2dyZXNzIiwiRmMiLCJPYyIsIl9xdWV1ZSIsIl9maXJlc3RvcmVDbGllbnQiLCJVYyIsIk1jIiwiaXNJbml0aWFsaXplZCIsImdldE9wdGlvbnMiLCJMYyIsIkJjIiwidmVyaWZ5Tm90VGVybWluYXRlZCIsIl9mcmVlemVTZXR0aW5ncyIsInFjIiwiWGMiLCJqYyIsIktjIiwiRE9NRXhjZXB0aW9uIiwiUWMiLCJfaW5pdGlhbGl6ZWQiLCJfdGVybWluYXRlZCIsIldjIiwiZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCIsIkdjIiwic2V0TmV0d29ya0VuYWJsZWQiLCJuYyIsInpjIiwic2MiLCJIYyIsIl9kZWxldGUiLCJKYyIsIlljIiwiZ2V0TmFtZWRRdWVyeSIsImxjIiwiWmMiLCJfaW50ZXJuYWxQYXRoIiwidHUiLCJldSIsIl9ieXRlU3RyaW5nIiwibnUiLCJfbWV0aG9kTmFtZSIsInN1IiwiaXNGaW5pdGUiLCJfbGF0IiwiX2xvbmciLCJpdSIsInJ1Iiwib3UiLCJhdSIsImN1IiwiVnUiLCJtZXRob2ROYW1lIiwidXUiLCJodSIsImx1IiwibWVyZ2UiLCJtZXJnZUZpZWxkcyIsIlJ1IiwiSXUiLCJQdSIsIlN1IiwiY292ZXJzIiwiZnUiLCJkdSIsInd1IiwiX3UiLCJFdSIsIm11IiwiZ3UiLCJ5dSIsInZ1IiwicHUiLCJUdSIsIkF1IiwiX3RvRmllbGRUcmFuc2Zvcm0iLCJmcm9tRGF0ZSIsImdldFByb3RvdHlwZU9mIiwiYnUiLCJzZWFyY2giLCJEdSIsIl9maXJlc3RvcmUiLCJfdXNlckRhdGFXcml0ZXIiLCJfZG9jdW1lbnQiLCJfY29udmVydGVyIiwiQ3UiLCJmcm9tRmlyZXN0b3JlIiwiY29udmVydFZhbHVlIiwiTnUiLCJrdSIsInh1IiwiX2ZpcmVzdG9yZUltcGwiLCIkdSIsInNlcnZlclRpbWVzdGFtcHMiLCJGdSIsIl9zbmFwc2hvdCIsIl9jYWNoZWRDaGFuZ2VzIiwiX2NhY2hlZENoYW5nZXNJbmNsdWRlTWV0YWRhdGFDaGFuZ2VzIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIk91IiwiTXUiLCJMdSIsIkJ1IiwiVXUiLCJfYXBwbHkiLCJxdSIsInNoIiwibmgiLCJpaCIsIkt1IiwianUiLCJRdSIsIld1IiwiR3UiLCJ6dSIsIkh1IiwiZWgiLCJKdSIsIll1IiwiWHUiLCJadSIsInRoIiwicmgiLCJjb252ZXJ0VGltZXN0YW1wIiwiY29udmVydFNlcnZlclRpbWVzdGFtcCIsImNvbnZlcnRCeXRlcyIsImNvbnZlcnRSZWZlcmVuY2UiLCJjb252ZXJ0R2VvUG9pbnQiLCJjb252ZXJ0QXJyYXkiLCJjb252ZXJ0T2JqZWN0Iiwib2giLCJ0b0ZpcmVzdG9yZSIsImFoIiwiY29udmVydERvY3VtZW50S2V5IiwiY2giLCJfY29tbWl0SGFuZGxlciIsIl9tdXRhdGlvbnMiLCJfY29tbWl0dGVkIiwiX2RhdGFSZWFkZXIiLCJfdmVyaWZ5Tm90Q29tbWl0dGVkIiwidWgiLCJoaCIsIlJoIiwibGgiLCJmaCIsImljIiwiZGgiLCJ3aCIsIm9jIiwibWgiLCJnaCIsIkFoIiwieWgiLCJwaCIsIlRoIiwiRWgiLCJJaCIsImNjIiwiYWRkTXV0YXRpb25CYXRjaCIsImFwcGx5VG9Mb2NhbERvY3VtZW50U2V0IiwiUGgiLCJfdHJhbnNhY3Rpb24iLCJsb29rdXAiLCJiaCIsInJ1biIsInVjIiwidmgiLCJWaCIsIlNoIiwiRGgiLCJDaCIsIk5oIiwiUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCIsImdldFByb3ZpZGVycyIsImNvbXBvbmVudCIsImdldENvbXBvbmVudCIsImlzVmVyc2lvblNlcnZpY2VQcm92aWRlciIsImxpYnJhcnkiLCJsb2dTdHJpbmciLCJuYW1lJG8iLCJsb2dnZXIiLCJERUZBVUxUX0VOVFJZX05BTUUiLCJQTEFURk9STV9MT0dfU1RSSU5HIiwiX2FwcHMiLCJfY29tcG9uZW50cyIsIl9hZGRDb21wb25lbnQiLCJhZGRDb21wb25lbnQiLCJfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQiLCJhZGRPck92ZXJ3cml0ZUNvbXBvbmVudCIsIl9yZWdpc3RlckNvbXBvbmVudCIsImNvbXBvbmVudE5hbWUiLCJfZ2V0UHJvdmlkZXIiLCJfcmVtb3ZlU2VydmljZUluc3RhbmNlIiwiaW5zdGFuY2VJZGVudGlmaWVyIiwiY2xlYXJJbnN0YW5jZSIsIl9jbGVhckNvbXBvbmVudHMiLCJFUlJPUlMiLCJFUlJPUl9GQUNUT1JZIiwiRmlyZWJhc2VBcHBJbXBsIiwiX2lzRGVsZXRlZCIsIl9vcHRpb25zIiwiX2NvbmZpZyIsIl9uYW1lIiwiX2F1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCIsImF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCIsIl9jb250YWluZXIiLCJjaGVja0Rlc3Ryb3llZCIsInZhbCIsImlzRGVsZXRlZCIsIlNES19WRVJTSU9OIiwiaW5pdGlhbGl6ZUFwcCIsInJhd0NvbmZpZyIsImV4aXN0aW5nQXBwIiwibmV3QXBwIiwiZ2V0QXBwIiwiZ2V0QXBwcyIsImRlbGV0ZUFwcCIsInJlZ2lzdGVyVmVyc2lvbiIsImxpYnJhcnlLZXlPck5hbWUiLCJ2YXJpYW50IiwibGlicmFyeU1pc21hdGNoIiwidmVyc2lvbk1pc21hdGNoIiwid2FybmluZyIsIm9uTG9nIiwibG9nQ2FsbGJhY2siLCJpbnN0YW5jZXMiLCJMb2dMZXZlbCIsImxldmVsU3RyaW5nVG9FbnVtIiwiVkVSQk9TRSIsIklORk8iLCJTSUxFTlQiLCJkZWZhdWx0TG9nTGV2ZWwiLCJDb25zb2xlTWV0aG9kIiwiZGVmYXVsdExvZ0hhbmRsZXIiLCJsb2dUeXBlIiwiTG9nZ2VyIiwiX2xvZ0xldmVsIiwiX2xvZ0hhbmRsZXIiLCJfdXNlckxvZ0hhbmRsZXIiLCJUeXBlRXJyb3IiLCJsZXZlbCIsImluc3QiLCJzZXRVc2VyTG9nSGFuZGxlciIsImN1c3RvbUxvZ0xldmVsIiwidXNlckxvZ0hhbmRsZXIiLCJhcmciLCJpZ25vcmVkIiwiQ29tcG9uZW50IiwiaW5zdGFuY2VGYWN0b3J5IiwibXVsdGlwbGVJbnN0YW5jZXMiLCJzZXJ2aWNlUHJvcHMiLCJpbnN0YW50aWF0aW9uTW9kZSIsIm9uSW5zdGFuY2VDcmVhdGVkIiwicHJvcHMiLCJQcm92aWRlciIsImluc3RhbmNlc0RlZmVycmVkIiwiaW5zdGFuY2VzT3B0aW9ucyIsIm9uSW5pdENhbGxiYWNrcyIsIm5vcm1hbGl6ZWRJZGVudGlmaWVyIiwibm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyIiwic2hvdWxkQXV0b0luaXRpYWxpemUiLCJnZXRPckluaXRpYWxpemVTZXJ2aWNlIiwiaXNDb21wb25lbnRFYWdlciIsImluc3RhbmNlRGVmZXJyZWQiLCJzZXJ2aWNlcyIsIm9wdHMiLCJpc0NvbXBvbmVudFNldCIsImV4aXN0aW5nQ2FsbGJhY2tzIiwiY2FsbGJhY2tzIiwiaW52b2tlT25Jbml0Q2FsbGJhY2tzIiwiQ29tcG9uZW50Q29udGFpbmVyIiwicHJvdmlkZXJzIiwic2V0Q29tcG9uZW50IiwiY29tbW9uanNHbG9iYWwiLCJnbG9iYWxUaGlzIiwiZXNtIiwiZ29vZyIsInVuc2hpZnQiLCJWYiIsInRyaW0iLCJ3IiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwiZGVmYXVsdFByZXZlbnRlZCIsInJlbGF0ZWRUYXJnZXQiLCJidXR0b24iLCJzY3JlZW5ZIiwic2NyZWVuWCIsImNsaWVudFkiLCJjbGllbnRYIiwibWV0YUtleSIsInNoaWZ0S2V5IiwiYWx0S2V5IiwiY3RybEtleSIsInBvaW50ZXJJZCIsInBvaW50ZXJUeXBlIiwiY2hhbmdlZFRvdWNoZXMiLCJzcmNFbGVtZW50Iiwibm9kZU5hbWUiLCJmcm9tRWxlbWVudCIsInRvRWxlbWVudCIsInBhZ2VYIiwicGFnZVkiLCIyIiwiMyIsIjQiLCJwcmV2ZW50RGVmYXVsdCIsInJldHVyblZhbHVlIiwic3JjIiwiY2FwdHVyZSIsImJiIiwiYWIiLCJmYiIsIm9uY2UiLCJnYiIsImhiIiwiaWIiLCJqYiIsIm1iIiwia2IiLCJhdHRhY2hFdmVudCIsImxiIiwiYWRkTGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsIm9iIiwiZGV0YWNoRXZlbnQiLCJwYiIsInFiIiwibmIiLCJyYiIsInNiIiwidGIiLCJBYiIsInZiIiwid2IiLCJ5YiIsInpiIiwiRGIiLCJCYiIsIkNiIiwiRWIiLCJGYiIsIkdiIiwiSWIiLCJIYiIsIkUiLCJKYiIsIktiIiwiTGIiLCJNYiIsIlBiIiwiUmIiLCJTYiIsIlRiIiwiVWIiLCJXYiIsInhiIiwiWGIiLCJZYiIsIlpiIiwiJGIiLCJYTUxIdHRwUmVxdWVzdCIsIk5iIiwiZWIiLCJnZXRSZXNwb25zZUhlYWRlciIsIk9iIiwiUWIiLCJkZCIsImFicyIsImRlY29kZVVSSSIsImVuY29kZVVSSSIsImNkIiwiZWQiLCJnZCIsImhkIiwiUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nIiwicGVyZm9ybWFuY2UiLCJnZXRFbnRyaWVzQnlUeXBlIiwibmV4dEhvcFByb3RvY29sIiwiamQiLCJrZCIsImxkIiwibWQiLCJvZCIsInFkIiwicmQiLCJyZXNwb25zZVR5cGUiLCJyZXNwb25zZVRleHQiLCJzdGF0dXNUZXh0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwidWQiLCJ0ZCIsInNkIiwiY2FjaGUiLCJSZXF1ZXN0IiwiYXJyYXlCdWZmZXIiLCJ0ZXh0Iiwic2V0UmVxdWVzdEhlYWRlciIsImFwcGVuZCIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsInZkIiwid2QiLCJ4ZCIsInlkIiwiemQiLCJDZCIsIkRkIiwiRWQiLCJBZCIsIm1velJlc3BvbnNlQXJyYXlCdWZmZXIiLCJHZCIsIkZkIiwiSGQiLCJJZCIsImNvbmN1cnJlbnRSZXF1ZXN0TGltaXQiLCJmYXN0SGFuZHNoYWtlIiwiSmQiLCJLZCIsInNlbmRCZWFjb24iLCJJbWFnZSIsIkxkIiwiTWQiLCJRZCIsIlBkIiwicm91bmQiLCJPZCIsIlJkIiwiTmQiLCJuZCIsImFkIiwiYmQiLCJTZCIsIlRkIiwibWVzc2FnZUhlYWRlcnMiLCJjbGllbnRQcm90b2NvbEhlYWRlclJlcXVpcmVkIiwibWVzc2FnZUNvbnRlbnRUeXBlIiwiVWQiLCJfX3NtX18iLCJWZCIsInRvVXBwZXJDYXNlIiwiRm9ybURhdGEiLCJ3aXRoQ3JlZGVudGlhbHMiLCJCZCIsIl9fZGF0YV9fIiwiZ2V0TGFzdEVycm9yIiwiY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCIsImdldFN0YXRFdmVudFRhcmdldCIsIkVycm9yQ29kZSIsIkV2ZW50IiwiU3RhdCIsInViIiwiRmV0Y2hYbWxIdHRwRmFjdG9yeSIsIldlYkNoYW5uZWwiLCJYaHJJbyIsInJlbW92ZUFwcCIsImZpcmViYXNlJDEiLCJjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZSIsIm5hbWVzcGFjZSIsImZpcmViYXNlQXBwSW1wbCIsImFwcHMiLCJhcHBDb21wYXQiLCJyZWdpc3RlckNvbXBvbmVudCIsImNvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0Iiwic2VydmljZU5hbWVzcGFjZSIsImFwcEFyZyIsIl9nZXRTZXJ2aWNlIiwidXNlQXNTZXJ2aWNlIiwibW9kdWxhckFQSXMiLCJjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZUNvcmUiLCJleHRlbmROYW1lc3BhY2UiLCJzZGtWZXJzaW9uIiwicm5kczgiLCJybmRzIiwiYnl0ZVRvSGV4IiwiYnRoIiwic2hhcmRJZCIsInNoYXJkcyIsIm5vdGlmeVByb21pc2UiLCJjb29raWUiLCJ1dWlkIiwidjQiLCJzZXRUaW1lIiwiZXhwaXJlcyIsImdldFNoYXJkSWQiLCJzaGFyZHNSZWYiLCJjb2xsZWN0aW9uIiwidmFsdWVQcm9taXNlcyIsIm9ic2VydmFibGUiLCJvblNuYXBzaG90Iiwic25hcCIsInJlZiIsImZ1bmMiLCJzdW0iLCJGaWVsZFZhbHVlIiwic2hhcmRSZWYiLCJzZXREb2MiLCJ2MSIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJybmciLCJieXRlc1RvVXVpZCIsIl9sYXN0TVNlY3MiLCJfbGFzdE5TZWNzIiwiY2xvY2tzZXEiLCJzZWVkQnl0ZXMiLCJtc2VjcyIsIm5zZWNzIiwidGwiLCJ0bWgiLCJfaXNBbmRyb2lkT3JJb3NDb3Jkb3ZhU2NoZW1lIiwiX2lzTG9jYWxTdG9yYWdlTm90U3luY2hyb25pemVkIiwiX2lzRWRnZSIsIl9pc1dlYlN0b3JhZ2VTdXBwb3J0ZWQiLCJfaXNQb3B1cFJlZGlyZWN0U3VwcG9ydGVkIiwiX2lzTGlrZWx5Q29yZG92YSIsIlBlcnNpc3RlbmNlIiwiTE9DQUwiLCJOT05FIiwiU0VTU0lPTiIsIl9hc3NlcnQkMyIsIl9zYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdCIsImdldFNlbGZXaW5kb3ciLCJfZ2V0UGVyc2lzdGVuY2UiLCJfYXNzZXJ0JDIiLCJDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJicm93c2VyUmVzb2x2ZXIiLCJjb3Jkb3ZhUmVzb2x2ZXIiLCJ1bmRlcmx5aW5nUmVzb2x2ZXIiLCJzZWxlY3RVbmRlcmx5aW5nUmVzb2x2ZXIiLCJhc3NlcnRlZFVuZGVybHlpbmdSZXNvbHZlciIsImlzQ29yZG92YSIsInRpbWVvdXRJZCIsIl9pc0NvcmRvdmEiLCJ1bndyYXAiLCJjcmVkZW50aWFsRnJvbU9iamVjdCIsImNyZWRlbnRpYWxGcm9tUmVzdWx0IiwiY3JlZGVudGlhbEZyb21FcnJvciIsImNvbnZlcnRDcmVkZW50aWFsIiwiY3JlZGVudGlhbFByb21pc2UiLCJNdWx0aUZhY3RvclJlc29sdmVyIiwiY3JlZEVyciIsImF0dGFjaEV4dHJhRXJyb3JGaWVsZHMiLCJhZGRpdGlvbmFsVXNlckluZm8iLCJVc2VyIiwiZ2V0T3JDcmVhdGUiLCJjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0IiwiY29uZmlybWF0aW9uUmVzdWx0UHJvbWlzZSIsImNvbmZpcm1hdGlvblJlc3VsdEV4cCIsImNvbmZpcm0iLCJ3cmFwcGVkIiwicmVzb2x2ZVNpZ25JbiIsIlVTRVJfTUFQIiwicGhvbmVDcmVkZW50aWFsIiwiX2Fzc2VydCQxIiwiQXV0aCIsImxpbmtVbmRlcmx5aW5nQXV0aCIsInBlcnNpc3RlbmNlcyIsIl9nZXRQZXJzaXN0ZW5jZXNGcm9tUmVkaXJlY3QiLCJ1c2VEZXZpY2VMYW5ndWFnZSIsImVycm9yRm4iLCJ3cmFwT2JzZXJ2ZXJzIiwib25BdXRoU3RhdGVDaGFuZ2VkIiwiY29udmVydGVkIiwiX3ZhbGlkYXRlUGVyc2lzdGVuY2VBcmd1bWVudCIsInVwZGF0ZUN1cnJlbnRVc2VyIiwib2xkTmV4dCIsIlBob25lQXV0aFByb3ZpZGVyIiwidmVyaWZ5UGhvbmVOdW1iZXIiLCJhdXRoUHJvdmlkZXIiLCJzZXRTZXJ2aWNlUHJvcHMiLCJBY3Rpb25Db2RlSW5mbyIsIk9wZXJhdGlvbiIsInNldE11bHRpcGxlSW5zdGFuY2VzIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImN1cnJlbnRRdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwiYXJyYXkiLCJuZXh0VGljayIsInRpdGxlIiwiYXJndiIsInZlcnNpb25zIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW1pdCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJiaW5kaW5nIiwiY3dkIiwiY2hkaXIiLCJ1bWFzayIsInZhbGlkYXRlU2V0T3B0aW9ucyIsImFzc2VydFVpbnQ4QXJyYXlBdmFpbGFibGUiLCJhc3NlcnRCYXNlNjRBdmFpbGFibGUiLCJvdGhlciIsImlzUGFydGlhbE9ic2VydmVyIiwiZGF0YWJhc2VJZE9yQXBwIiwiX3BlcnNpc3RlbmNlUHJvdmlkZXIiLCJfYXBwQ29tcGF0Iiwic2V0dGluZ3NMaXRlcmFsIiwiY3VycmVudFNldHRpbmdzIiwiZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWIiLCJlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlIiwiZW5hYmxlSW5kZXhlZERiUGVyc2lzdGVuY2UiLCJjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlIiwicGF0aFN0cmluZyIsInJlcGxhY2VGdW5jdGlvbk5hbWUiLCJXcml0ZUJhdGNoIiwiYnVuZGxlRGF0YSIsImV4cFF1ZXJ5IiwiZm9yS2V5IiwiZG9jdW1lbnRSZWYiLCJjYXN0UmVmZXJlbmNlIiwiZGF0YU9yRmllbGQiLCJtb3JlRmllbGRzQW5kVmFsdWVzIiwiZXhwU25hcHNob3QiLCJtb2RlbE9iamVjdCIsImNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlIiwiSU5TVEFOQ0VTIiwidW50eXBlZENvbnZlcnRlckJ5Q29udmVydGVyIiwiZmllbGRPclVwZGF0ZURhdGEiLCJleHRyYWN0U25hcHNob3RPcHRpb25zIiwid3JhcE9ic2VydmVyIiwid2l0aENvbnZlcnRlciIsImdldEluc3RhbmNlIiwidXBkYXRlZCIsIndyYXBwZXIiLCJ1c2VyT2JzZXJ2ZXIiLCJvcFN0ciIsImRpcmVjdGlvblN0ciIsIkRvY3VtZW50Q2hhbmdlIiwiZG9jQ2hhbmdlIiwidGhpc0FyZyIsImRvY1JlZiIsImRvY3VtZW50UGF0aCIsImZpZWxkTmFtZXMiLCJkZWxlZ2F0ZSIsImZpcmVzdG9yZU5hbWVzcGFjZSIsIkZpcmVzdG9yZSIsIkdlb1BvaW50IiwiVGltZXN0YW1wIiwiQmxvYiIsIlRyYW5zYWN0aW9uIiwiRG9jdW1lbnRSZWZlcmVuY2UiLCJEb2N1bWVudFNuYXBzaG90IiwiUXVlcnkiLCJRdWVyeURvY3VtZW50U25hcHNob3QiLCJRdWVyeVNuYXBzaG90IiwiQ29sbGVjdGlvblJlZmVyZW5jZSIsIkZpZWxkUGF0aCIsIkNBQ0hFX1NJWkVfVU5MSU1JVEVEIiwiZmlyZXN0b3JlRmFjdG9yeSIsImZpcmVzdG9yZUV4cCJdLCJtYXBwaW5ncyI6IndCQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQTBEZixPQXJEQUYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU9yQixFQUFvQlUsRUFBRWUsRUFBSUUsRUFBSyxTQUFTQSxHQUFPLE9BQU9OLEVBQU1NLElBQVFDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsR0FJUnpCLEVBQW9CNkIsRUFBSSxTQUFTMUIsR0FDaEMsSUFBSVMsRUFBU1QsR0FBVUEsRUFBT3FCLFdBQzdCLFdBQXdCLE9BQU9yQixFQUFnQixTQUMvQyxXQUE4QixPQUFPQSxHQUV0QyxPQURBSCxFQUFvQlUsRUFBRUUsRUFBUSxJQUFLQSxHQUM1QkEsR0FJUlosRUFBb0JhLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLElBR3pHL0IsRUFBb0JrQyxFQUFJLEdBSWpCbEMsRUFBb0JBLEVBQW9CbUMsRUFBSSxJLGdDQ2xGckQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLE1BaUVNQyxFQUFzQixTQUFVQyxHQUVsQyxNQUFNQyxFQUFNLEdBQ1osSUFBSUosRUFBSSxFQUNSLElBQUssSUFBSTlCLEVBQUksRUFBR0EsRUFBSWlDLEVBQUlFLE9BQVFuQyxJQUFLLENBQ2pDLElBQUlLLEVBQUk0QixFQUFJRyxXQUFXcEMsR0FDbkJLLEVBQUksSUFDSjZCLEVBQUlKLEtBQU96QixFQUVOQSxFQUFJLE1BQ1Q2QixFQUFJSixLQUFRekIsR0FBSyxFQUFLLElBQ3RCNkIsRUFBSUosS0FBWSxHQUFKekIsRUFBVSxLQUVBLFFBQVosTUFBSkEsSUFDTkwsRUFBSSxFQUFJaUMsRUFBSUUsUUFDeUIsUUFBWixNQUF4QkYsRUFBSUcsV0FBV3BDLEVBQUksS0FFcEJLLEVBQUksUUFBZ0IsS0FBSkEsSUFBZSxLQUE2QixLQUF0QjRCLEVBQUlHLGFBQWFwQyxJQUN2RGtDLEVBQUlKLEtBQVF6QixHQUFLLEdBQU0sSUFDdkI2QixFQUFJSixLQUFTekIsR0FBSyxHQUFNLEdBQU0sSUFDOUI2QixFQUFJSixLQUFTekIsR0FBSyxFQUFLLEdBQU0sSUFDN0I2QixFQUFJSixLQUFZLEdBQUp6QixFQUFVLE1BR3RCNkIsRUFBSUosS0FBUXpCLEdBQUssR0FBTSxJQUN2QjZCLEVBQUlKLEtBQVN6QixHQUFLLEVBQUssR0FBTSxJQUM3QjZCLEVBQUlKLEtBQVksR0FBSnpCLEVBQVUsS0FHOUIsT0FBTzZCLEdBMENMRyxFQUFTLENBSVhDLGVBQWdCLEtBSWhCQyxlQUFnQixLQUtoQkMsc0JBQXVCLEtBS3ZCQyxzQkFBdUIsS0FLdkJDLGtCQUFtQixpRUFJbkIsbUJBQ0ksT0FBT0MsS0FBS0Qsa0JBQW9CLE9BS3BDLDJCQUNJLE9BQU9DLEtBQUtELGtCQUFvQixPQVNwQ0UsbUJBQW9DLG1CQUFUQyxLQVUzQixnQkFBZ0JDLEVBQU9DLEdBQ25CLElBQUtDLE1BQU1DLFFBQVFILEdBQ2YsTUFBTUksTUFBTSxpREFFaEJQLEtBQUtRLFFBQ0wsTUFBTUMsRUFBZ0JMLEVBQ2hCSixLQUFLSCxzQkFDTEcsS0FBS0wsZUFDTGUsRUFBUyxHQUNmLElBQUssSUFBSXJELEVBQUksRUFBR0EsRUFBSThDLEVBQU1YLE9BQVFuQyxHQUFLLEVBQUcsQ0FDdEMsTUFBTXNELEVBQVFSLEVBQU05QyxHQUNkdUQsRUFBWXZELEVBQUksRUFBSThDLEVBQU1YLE9BQzFCcUIsRUFBUUQsRUFBWVQsRUFBTTlDLEVBQUksR0FBSyxFQUNuQ3lELEVBQVl6RCxFQUFJLEVBQUk4QyxFQUFNWCxPQUMxQnVCLEVBQVFELEVBQVlYLEVBQU05QyxFQUFJLEdBQUssRUFDbkMyRCxFQUFXTCxHQUFTLEVBQ3BCTSxHQUFxQixFQUFSTixJQUFpQixFQUFNRSxHQUFTLEVBQ25ELElBQUlLLEdBQXFCLEdBQVJMLElBQWlCLEVBQU1FLEdBQVMsRUFDN0NJLEVBQW1CLEdBQVJKLEVBQ1ZELElBQ0RLLEVBQVcsR0FDTlAsSUFDRE0sRUFBVyxLQUduQlIsRUFBT1UsS0FBS1gsRUFBY08sR0FBV1AsRUFBY1EsR0FBV1IsRUFBY1MsR0FBV1QsRUFBY1UsSUFFekcsT0FBT1QsRUFBT1csS0FBSyxLQVV2QixhQUFhbEIsRUFBT0MsR0FHaEIsT0FBSUosS0FBS0MscUJBQXVCRyxFQUNyQmtCLEtBQUtuQixHQUVUSCxLQUFLdUIsZ0JBQWdCbEMsRUFBb0JjLEdBQVFDLElBVTVELGFBQWFELEVBQU9DLEdBR2hCLE9BQUlKLEtBQUtDLHFCQUF1QkcsRUFDckJGLEtBQUtDLEdBaEpFLFNBQVVxQixHQUVoQyxNQUFNakMsRUFBTSxHQUNaLElBQUlrQyxFQUFNLEVBQUcvRCxFQUFJLEVBQ2pCLEtBQU8rRCxFQUFNRCxFQUFNaEMsUUFBUSxDQUN2QixNQUFNa0MsRUFBS0YsRUFBTUMsS0FDakIsR0FBSUMsRUFBSyxJQUNMbkMsRUFBSTdCLEtBQU9pRSxPQUFPQyxhQUFhRixRQUU5QixHQUFJQSxFQUFLLEtBQU9BLEVBQUssSUFBSyxDQUMzQixNQUFNRyxFQUFLTCxFQUFNQyxLQUNqQmxDLEVBQUk3QixLQUFPaUUsT0FBT0MsY0FBb0IsR0FBTEYsSUFBWSxFQUFXLEdBQUxHLFFBRWxELEdBQUlILEVBQUssS0FBT0EsRUFBSyxJQUFLLENBRTNCLE1BR01JLElBQVksRUFBTEosSUFBVyxJQUFhLEdBSDFCRixFQUFNQyxPQUcyQixJQUFhLEdBRjlDRCxFQUFNQyxPQUUrQyxFQUFXLEdBRGhFRCxFQUFNQyxNQUViLE1BQ0psQyxFQUFJN0IsS0FBT2lFLE9BQU9DLGFBQWEsT0FBVUUsR0FBSyxLQUM5Q3ZDLEVBQUk3QixLQUFPaUUsT0FBT0MsYUFBYSxPQUFjLEtBQUpFLFFBRXhDLENBQ0QsTUFBTUQsRUFBS0wsRUFBTUMsS0FDWE0sRUFBS1AsRUFBTUMsS0FDakJsQyxFQUFJN0IsS0FBT2lFLE9BQU9DLGNBQW9CLEdBQUxGLElBQVksSUFBYSxHQUFMRyxJQUFZLEVBQVcsR0FBTEUsSUFHL0UsT0FBT3hDLEVBQUk4QixLQUFLLElBcUhMVyxDQUFrQmhDLEtBQUtpQyx3QkFBd0I5QixFQUFPQyxLQWlCakUsd0JBQXdCRCxFQUFPQyxHQUMzQkosS0FBS1EsUUFDTCxNQUFNMEIsRUFBZ0I5QixFQUNoQkosS0FBS0Ysc0JBQ0xFLEtBQUtKLGVBQ0xjLEVBQVMsR0FDZixJQUFLLElBQUlyRCxFQUFJLEVBQUdBLEVBQUk4QyxFQUFNWCxRQUFTLENBQy9CLE1BQU1tQixFQUFRdUIsRUFBYy9CLEVBQU1nQyxPQUFPOUUsTUFFbkN3RCxFQURZeEQsRUFBSThDLEVBQU1YLE9BQ0YwQyxFQUFjL0IsRUFBTWdDLE9BQU85RSxJQUFNLElBQ3pEQSxFQUNGLE1BQ00wRCxFQURZMUQsRUFBSThDLEVBQU1YLE9BQ0YwQyxFQUFjL0IsRUFBTWdDLE9BQU85RSxJQUFNLEtBQ3pEQSxFQUNGLE1BQ00rRSxFQURZL0UsRUFBSThDLEVBQU1YLE9BQ0YwQyxFQUFjL0IsRUFBTWdDLE9BQU85RSxJQUFNLEdBRTNELEtBREVBLEVBQ1csTUFBVHNELEdBQTBCLE1BQVRFLEdBQTBCLE1BQVRFLEdBQTBCLE1BQVRxQixFQUNuRCxNQUFNN0IsUUFFVixNQUFNUyxFQUFZTCxHQUFTLEVBQU1FLEdBQVMsRUFFMUMsR0FEQUgsRUFBT1UsS0FBS0osR0FDRSxLQUFWRCxFQUFjLENBQ2QsTUFBTUUsRUFBYUosR0FBUyxFQUFLLElBQVNFLEdBQVMsRUFFbkQsR0FEQUwsRUFBT1UsS0FBS0gsR0FDRSxLQUFWbUIsRUFBYyxDQUNkLE1BQU1sQixFQUFhSCxHQUFTLEVBQUssSUFBUXFCLEVBQ3pDMUIsRUFBT1UsS0FBS0YsS0FJeEIsT0FBT1IsR0FPWCxRQUNJLElBQUtWLEtBQUtMLGVBQWdCLENBQ3RCSyxLQUFLTCxlQUFpQixHQUN0QkssS0FBS0osZUFBaUIsR0FDdEJJLEtBQUtILHNCQUF3QixHQUM3QkcsS0FBS0Ysc0JBQXdCLEdBRTdCLElBQUssSUFBSXpDLEVBQUksRUFBR0EsRUFBSTJDLEtBQUtxQyxhQUFhN0MsT0FBUW5DLElBQzFDMkMsS0FBS0wsZUFBZXRDLEdBQUsyQyxLQUFLcUMsYUFBYUYsT0FBTzlFLEdBQ2xEMkMsS0FBS0osZUFBZUksS0FBS0wsZUFBZXRDLElBQU1BLEVBQzlDMkMsS0FBS0gsc0JBQXNCeEMsR0FBSzJDLEtBQUtzQyxxQkFBcUJILE9BQU85RSxHQUNqRTJDLEtBQUtGLHNCQUFzQkUsS0FBS0gsc0JBQXNCeEMsSUFBTUEsRUFFeERBLEdBQUsyQyxLQUFLRCxrQkFBa0JQLFNBQzVCUSxLQUFLSixlQUFlSSxLQUFLc0MscUJBQXFCSCxPQUFPOUUsSUFBTUEsRUFDM0QyQyxLQUFLRixzQkFBc0JFLEtBQUtxQyxhQUFhRixPQUFPOUUsSUFBTUEsTUFpQnhFa0YsRUFBZ0MsU0FBVWpELEdBRTVDLE9BVmlCLFNBQVVBLEdBQzNCLE1BQU1rRCxFQUFZbkQsRUFBb0JDLEdBQ3RDLE9BQU9JLEVBQU82QixnQkFBZ0JpQixHQUFXLEdBUWxDQyxDQUFhbkQsR0FBS29ELFFBQVEsTUFBTyxLQVd0Q0MsRUFBZSxTQUFVckQsR0FDM0IsSUFDSSxPQUFPSSxFQUFPa0QsYUFBYXRELEdBQUssR0FFcEMsTUFBT3VELEdBQ0hDLFFBQVFDLE1BQU0sd0JBQXlCRixHQUUzQyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUNYLFNBQVNHLEVBQVdDLEVBQVFDLEdBQ3hCLEtBQU1BLGFBQWtCbkYsUUFDcEIsT0FBT21GLEVBRVgsT0FBUUEsRUFBT0MsYUFDWCxLQUFLQyxLQUlELE9BQU8sSUFBSUEsS0FET0YsRUFDUUcsV0FDOUIsS0FBS3RGLFlBQ2N1RixJQUFYTCxJQUNBQSxFQUFTLElBRWIsTUFDSixLQUFLNUMsTUFFRDRDLEVBQVMsR0FDVCxNQUNKLFFBRUksT0FBT0MsRUFFZixJQUFLLE1BQU1LLEtBQVFMLEVBRVZBLEVBQU9oRSxlQUFlcUUsSUFRaEIsY0FScUNBLElBR2hETixFQUFPTSxHQUFRUCxFQUFXQyxFQUFPTSxHQUFPTCxFQUFPSyxLQUVuRCxPQUFPTjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQlgsTUFBTU8sRUFDRixjQUNJeEQsS0FBS3lELE9BQVMsT0FDZHpELEtBQUswRCxRQUFVLE9BQ2YxRCxLQUFLMkQsUUFBVSxJQUFJQyxRQUFRLENBQUNGLEVBQVNELEtBQ2pDekQsS0FBSzBELFFBQVVBLEVBQ2YxRCxLQUFLeUQsT0FBU0EsSUFRdEIsYUFBYUksR0FDVCxNQUFPLENBQUNkLEVBQU96RSxLQUNQeUUsRUFDQS9DLEtBQUt5RCxPQUFPVixHQUdaL0MsS0FBSzBELFFBQVFwRixHQUVPLG1CQUFidUYsSUFHUDdELEtBQUsyRCxRQUFRRyxNQUFNLFFBR0ssSUFBcEJELEVBQVNyRSxPQUNUcUUsRUFBU2QsR0FHVGMsRUFBU2QsRUFBT3pFOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJwQyxTQUFTeUYsRUFBb0JDLEVBQU9DLEdBQ2hDLEdBQUlELEVBQU1FLElBQ04sTUFBTSxJQUFJM0QsTUFBTSxnSEFHcEIsTUFJTTRELEVBQVVGLEdBQWEsZUFDdkJHLEVBQU1KLEVBQU1JLEtBQU8sRUFDbkJDLEVBQU1MLEVBQU1LLEtBQU9MLEVBQU1NLFFBQy9CLElBQUtELEVBQ0QsTUFBTSxJQUFJOUQsTUFBTSx3REFFcEIsTUFBTWdFLEVBQVV4RyxPQUFPeUcsT0FBTyxDQUUxQkMsSUFBSyxrQ0FBa0NOLEVBQVdPLElBQUtQLEVBQVNDLE1BQUtPLElBQUtQLEVBQU0sS0FBTVEsVUFBV1IsRUFBS0MsTUFBS0MsUUFBU0QsRUFBS1EsU0FBVSxDQUMvSEMsaUJBQWtCLFNBQ2xCQyxXQUFZLEtBQ1hmLEdBR1QsTUFBTyxDQUNIekIsRUFBOEJ5QyxLQUFLQyxVQW5CeEIsQ0FDWEMsSUFBSyxPQUNMQyxLQUFNLFNBa0JONUMsRUFBOEJ5QyxLQUFLQyxVQUFVVixJQUgvQixJQUtoQmxELEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlgsU0FBUytELElBQ0wsTUFBeUIsb0JBQWRDLFdBQzJCLGlCQUEzQkEsVUFBcUIsVUFDckJBLFVBQXFCLFVBR3JCLEdBVWYsU0FBU0MsSUFDTCxNQUEwQixvQkFBWEMsV0FHUkEsT0FBZ0IsU0FBS0EsT0FBaUIsVUFBS0EsT0FBaUIsV0FDL0Qsb0RBQW9EQyxLQUFLSixLQVFqRSxTQUFTSyxJQUNMLElBQ0ksTUFBMkQscUJBQW5EMUgsT0FBT2tCLFVBQVV5RyxTQUFTbEksS0FBS21JLEVBQU9DLFNBRWxELE1BQU8vQyxHQUNILE9BQU8sR0FNZixTQUFTZ0QsSUFDTCxNQUF1QixpQkFBVEMsTUFBcUJBLEtBQUtBLE9BQVNBLEtBRXJELFNBQVNDLElBQ0wsTUFBTUMsRUFBNEIsaUJBQVhDLE9BQ2pCQSxPQUFPRCxRQUNZLGlCQUFaRSxRQUNIQSxRQUFRRixhQUNSMUMsRUFDVixNQUEwQixpQkFBWjBDLFFBQXVDMUMsSUFBZjBDLEVBQVFHLEdBT2xELFNBQVNDLElBQ0wsTUFBNkIsaUJBQWRmLFdBQW1ELGdCQUF6QkEsVUFBbUIsUUFHaEUsU0FBU2dCLElBQ0wsT0FBT2pCLElBQVFrQixRQUFRLGNBQWdCLEVBRzNDLFNBQVNDLElBQ0wsTUFBTUMsRUFBS3BCLElBQ1gsT0FBT29CLEVBQUdGLFFBQVEsVUFBWSxHQUFLRSxFQUFHRixRQUFRLGFBQWUsRUFHakUsU0FBU0csSUFDTCxPQUFPckIsSUFBUWtCLFFBQVEsZUFBaUIsRUFXNUMsU0FBU0ksSUFDTCxPQUFTakIsS0FDTEosVUFBVXNCLFVBQVVDLFNBQVMsWUFDNUJ2QixVQUFVc0IsVUFBVUMsU0FBUyxVQU10QyxTQUFTQyxJQUNMLE1BQTRCLGlCQUFkQyxVQTJIbEIsTUFBTUMsVUFBc0J4RyxNQUN4QixZQUFZeUcsRUFBTUMsRUFBU0MsR0FDdkJDLE1BQU1GLEdBQ05qSCxLQUFLZ0gsS0FBT0EsRUFDWmhILEtBQUtrSCxXQUFhQSxFQUNsQmxILEtBQUtwQyxLQVJNLGdCQVdYRyxPQUFPcUosZUFBZXBILEtBQU0rRyxFQUFjOUgsV0FHdENzQixNQUFNOEcsbUJBQ045RyxNQUFNOEcsa0JBQWtCckgsS0FBTXNILEVBQWFySSxVQUFVTixTQUlqRSxNQUFNMkksRUFDRixZQUFZQyxFQUFTQyxFQUFhQyxHQUM5QnpILEtBQUt1SCxRQUFVQSxFQUNmdkgsS0FBS3dILFlBQWNBLEVBQ25CeEgsS0FBS3lILE9BQVNBLEVBRWxCLE9BQU9ULEtBQVNVLEdBQ1osTUFBTVIsRUFBYVEsRUFBSyxJQUFNLEdBQ3hCQyxFQUFXLEdBQUczSCxLQUFLdUgsV0FBV1AsSUFDOUJZLEVBQVc1SCxLQUFLeUgsT0FBT1QsR0FDdkJDLEVBQVVXLEVBT3hCLFNBQXlCQSxFQUFVRixHQUMvQixPQUFPRSxFQUFTbEYsUUFBUW1GLEVBQVMsQ0FBQ0MsRUFBR2xKLEtBQ2pDLE1BQU1OLEVBQVFvSixFQUFLOUksR0FDbkIsT0FBZ0IsTUFBVE4sRUFBZ0JxRCxPQUFPckQsR0FBUyxJQUFJTSxRQVZoQm1KLENBQWdCSCxFQUFVVixHQUFjLFFBRTdEYyxFQUFjLEdBQUdoSSxLQUFLd0gsZ0JBQWdCUCxNQUFZVSxNQUV4RCxPQURjLElBQUlaLEVBQWNZLEVBQVVLLEVBQWFkLElBVS9ELE1BQU1XLEVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1LaEIsU0FBU0ksRUFBU0MsRUFBS3RKLEdBQ25CLE9BQU9iLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBSzBLLEVBQUt0SixHQVVyRCxTQUFTdUosRUFBUUQsR0FDYixJQUFLLE1BQU10SixLQUFPc0osRUFDZCxHQUFJbkssT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLMEssRUFBS3RKLEdBQzFDLE9BQU8sRUFHZixPQUFPLEVBY1gsU0FBU3dKLEVBQVVDLEVBQUdDLEdBQ2xCLEdBQUlELElBQU1DLEVBQ04sT0FBTyxFQUVYLE1BQU1DLEVBQVF4SyxPQUFPeUssS0FBS0gsR0FDcEJJLEVBQVExSyxPQUFPeUssS0FBS0YsR0FDMUIsSUFBSyxNQUFNSSxLQUFLSCxFQUFPLENBQ25CLElBQUtFLEVBQU03QixTQUFTOEIsR0FDaEIsT0FBTyxFQUVYLE1BQU1DLEVBQVFOLEVBQUVLLEdBQ1ZFLEVBQVFOLEVBQUVJLEdBQ2hCLEdBQUlHLEVBQVNGLElBQVVFLEVBQVNELElBQzVCLElBQUtSLEVBQVVPLEVBQU9DLEdBQ2xCLE9BQU8sT0FHVixHQUFJRCxJQUFVQyxFQUNmLE9BQU8sRUFHZixJQUFLLE1BQU1GLEtBQUtELEVBQ1osSUFBS0YsRUFBTTNCLFNBQVM4QixHQUNoQixPQUFPLEVBR2YsT0FBTyxFQUVYLFNBQVNHLEVBQVNDLEdBQ2QsT0FBaUIsT0FBVkEsR0FBbUMsaUJBQVZBOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0JwQyxTQUFTQyxFQUFZQyxHQUNqQixNQUFNQyxFQUFTLEdBQ2YsSUFBSyxNQUFPckssRUFBS04sS0FBVVAsT0FBT21MLFFBQVFGLEdBQ2xDM0ksTUFBTUMsUUFBUWhDLEdBQ2RBLEVBQU02SyxRQUFRQyxJQUNWSCxFQUFPN0gsS0FBS2lJLG1CQUFtQnpLLEdBQU8sSUFBTXlLLG1CQUFtQkQsTUFJbkVILEVBQU83SCxLQUFLaUksbUJBQW1CekssR0FBTyxJQUFNeUssbUJBQW1CL0ssSUFHdkUsT0FBTzJLLEVBQU96SixPQUFTLElBQU15SixFQUFPNUgsS0FBSyxLQUFPLEdBTXBELFNBQVNpSSxFQUFrQlAsR0FDdkIsTUFBTWIsRUFBTSxHQVFaLE9BUGVhLEVBQVlyRyxRQUFRLE1BQU8sSUFBSTZHLE1BQU0sS0FDN0NKLFFBQVFuRixJQUNYLEdBQUlBLEVBQU8sQ0FDUCxNQUFPcEYsRUFBS04sR0FBUzBGLEVBQU11RixNQUFNLEtBQ2pDckIsRUFBSXNCLG1CQUFtQjVLLElBQVE0SyxtQkFBbUJsTCxNQUduRDRKLEVBS1gsU0FBU3VCLEVBQW1CQyxHQUN4QixNQUFNQyxFQUFhRCxFQUFJcEQsUUFBUSxLQUMvQixJQUFLcUQsRUFDRCxNQUFPLEdBRVgsTUFBTUMsRUFBZ0JGLEVBQUlwRCxRQUFRLElBQUtxRCxHQUN2QyxPQUFPRCxFQUFJRyxVQUFVRixFQUFZQyxFQUFnQixFQUFJQSxPQUFnQnRHOzs7Ozs7Ozs7Ozs7Ozs7O0dBMlF6RSxTQUFTd0csRUFBZ0JDLEVBQVVDLEdBQy9CLE1BQU1DLEVBQVEsSUFBSUMsRUFBY0gsRUFBVUMsR0FDMUMsT0FBT0MsRUFBTUUsVUFBVXRMLEtBQUtvTCxHQU1oQyxNQUFNQyxFQU1GLFlBQVlILEVBQVVDLEdBQ2xCaEssS0FBS29LLFVBQVksR0FDakJwSyxLQUFLcUssYUFBZSxHQUNwQnJLLEtBQUtzSyxjQUFnQixFQUVyQnRLLEtBQUt1SyxLQUFPM0csUUFBUUYsVUFDcEIxRCxLQUFLd0ssV0FBWSxFQUNqQnhLLEtBQUtnSyxjQUFnQkEsRUFJckJoSyxLQUFLdUssS0FDQUUsS0FBSyxLQUNOVixFQUFTL0osUUFFUjhELE1BQU1qQixJQUNQN0MsS0FBSytDLE1BQU1GLEtBR25CLEtBQUt2RSxHQUNEMEIsS0FBSzBLLGdCQUFpQkMsSUFDbEJBLEVBQVNDLEtBQUt0TSxLQUd0QixNQUFNeUUsR0FDRi9DLEtBQUswSyxnQkFBaUJDLElBQ2xCQSxFQUFTNUgsTUFBTUEsS0FFbkIvQyxLQUFLNkssTUFBTTlILEdBRWYsV0FDSS9DLEtBQUswSyxnQkFBaUJDLElBQ2xCQSxFQUFTRyxhQUViOUssS0FBSzZLLFFBUVQsVUFBVUUsRUFBZ0JoSSxFQUFPK0gsR0FDN0IsSUFBSUgsRUFDSixRQUF1QnJILElBQW5CeUgsUUFDVXpILElBQVZQLFFBQ2FPLElBQWJ3SCxFQUNBLE1BQU0sSUFBSXZLLE1BQU0scUJBV2hCb0ssRUFzSFosU0FBOEJ6QyxFQUFLOEMsR0FDL0IsR0FBbUIsaUJBQVI5QyxHQUE0QixPQUFSQSxFQUMzQixPQUFPLEVBRVgsSUFBSyxNQUFNK0MsS0FBVUQsRUFDakIsR0FBSUMsS0FBVS9DLEdBQThCLG1CQUFoQkEsRUFBSStDLEdBQzVCLE9BQU8sRUFHZixPQUFPLEVBdklDQyxDQUFxQkgsRUFBZ0IsQ0FDckMsT0FDQSxRQUNBLGFBRVdBLEVBR0EsQ0FDUEgsS0FBTUcsRUFDTmhJLFFBQ0ErSCxpQkFHY3hILElBQWxCcUgsRUFBU0MsT0FDVEQsRUFBU0MsS0FBT08sUUFFRzdILElBQW5CcUgsRUFBUzVILFFBQ1Q0SCxFQUFTNUgsTUFBUW9JLFFBRUs3SCxJQUF0QnFILEVBQVNHLFdBQ1RILEVBQVNHLFNBQVdLLEdBRXhCLE1BQU1DLEVBQVFwTCxLQUFLcUwsZUFBZXhNLEtBQUttQixLQUFNQSxLQUFLb0ssVUFBVTVLLFFBc0I1RCxPQWxCSVEsS0FBS3dLLFdBRUx4SyxLQUFLdUssS0FBS0UsS0FBSyxLQUNYLElBQ1F6SyxLQUFLc0wsV0FDTFgsRUFBUzVILE1BQU0vQyxLQUFLc0wsWUFHcEJYLEVBQVNHLFdBR2pCLE1BQU9qSSxPQU1mN0MsS0FBS29LLFVBQVVoSixLQUFLdUosR0FDYlMsRUFJWCxlQUFlL04sUUFDWWlHLElBQW5CdEQsS0FBS29LLGdCQUFpRDlHLElBQXRCdEQsS0FBS29LLFVBQVUvTSxZQUc1QzJDLEtBQUtvSyxVQUFVL00sR0FDdEIyQyxLQUFLc0ssZUFBaUIsRUFDSyxJQUF2QnRLLEtBQUtzSyxvQkFBOENoSCxJQUF2QnRELEtBQUtnSyxlQUNqQ2hLLEtBQUtnSyxjQUFjaEssT0FHM0IsZ0JBQWdCdUwsR0FDWixJQUFJdkwsS0FBS3dLLFVBTVQsSUFBSyxJQUFJbk4sRUFBSSxFQUFHQSxFQUFJMkMsS0FBS29LLFVBQVU1SyxPQUFRbkMsSUFDdkMyQyxLQUFLd0wsUUFBUW5PLEVBQUdrTyxHQU14QixRQUFRbE8sRUFBR2tPLEdBR1B2TCxLQUFLdUssS0FBS0UsS0FBSyxLQUNYLFFBQXVCbkgsSUFBbkJ0RCxLQUFLb0ssZ0JBQWlEOUcsSUFBdEJ0RCxLQUFLb0ssVUFBVS9NLEdBQy9DLElBQ0lrTyxFQUFHdkwsS0FBS29LLFVBQVUvTSxJQUV0QixNQUFPd0YsR0FJb0Isb0JBQVpDLFNBQTJCQSxRQUFRQyxPQUMxQ0QsUUFBUUMsTUFBTUYsTUFNbEMsTUFBTTRJLEdBQ0V6TCxLQUFLd0ssWUFHVHhLLEtBQUt3SyxXQUFZLE9BQ0xsSCxJQUFSbUksSUFDQXpMLEtBQUtzTCxXQUFhRyxHQUl0QnpMLEtBQUt1SyxLQUFLRSxLQUFLLEtBQ1h6SyxLQUFLb0ssZUFBWTlHLEVBQ2pCdEQsS0FBS2dLLG1CQUFnQjFHLE1BaUNqQyxTQUFTNkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1UVCxTQUFTTyxFQUFtQm5FLEdBQ3hCLE9BQUlBLEdBQVdBLEVBQVFvRSxVQUNacEUsRUFBUW9FLFVBR1JwRSxLLGczRUN0ekRSLFNBQVNxRSxFQUFPeE0sRUFBR3lELEdBQ3RCLElBQUl0RSxFQUFJLEdBQ1IsSUFBSyxJQUFJWSxLQUFLQyxFQUFPckIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLNEIsRUFBR0QsSUFBTTBELEVBQUV5RCxRQUFRbkgsR0FBSyxJQUM5RVosRUFBRVksR0FBS0MsRUFBRUQsSUFDYixHQUFTLE1BQUxDLEdBQXFELG1CQUFqQ3JCLE9BQU84TixzQkFDdEIsS0FBSXhPLEVBQUksRUFBYixJQUFnQjhCLEVBQUlwQixPQUFPOE4sc0JBQXNCek0sR0FBSS9CLEVBQUk4QixFQUFFSyxPQUFRbkMsSUFDM0R3RixFQUFFeUQsUUFBUW5ILEVBQUU5QixJQUFNLEdBQUtVLE9BQU9rQixVQUFVNk0scUJBQXFCdE8sS0FBSzRCLEVBQUdELEVBQUU5QixNQUN2RWtCLEVBQUVZLEVBQUU5QixJQUFNK0IsRUFBRUQsRUFBRTlCLEtBRTFCLE9BQU9rQixFQXdEa0JSLE9BQU9ZLE9Bc0dYWixPQUFPWSxPOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RMaEMsTUFTTW9OLEVBQWEsQ0FFZkMsU0FBVSxlQUVWQyxPQUFRLGFBRVJDLE9BQVEsYUFFUkMsU0FBVSxXQUVWQyxNQUFPLFFBRVBDLFFBQVMsZUF5Q1BDLEVBQXNCLENBRXhCQyxhQUFjLGVBRWRDLGVBQWdCLGlCQUVoQkMsY0FBZSxnQkFFZkMsOEJBQStCLGdDQUUvQkMsd0JBQXlCLDBCQUV6QkMsYUFBYyxnQkFzS2xCLFNBQVNDLElBSUwsTUFBTyxDQUNILHdDQUFnRiwyTEFZeEYsTUFBTUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcEtOLFdBQ0ksTUFBTyxDQUNILDZCQUEyRCx1REFDM0QsaUJBQXlDLEdBQ3pDLHFCQUFpRCw2TEFHakQsb0JBQStDLHFKQUcvQyx1QkFBcUQsa0tBR3JELGVBQXFDLCtFQUVyQyxvQkFBK0Msa0NBQy9DLG1CQUE2QyxpQ0FDN0MsNEJBQStELHVFQUMvRCx3QkFBcUQsd0RBQ3JELHdCQUFnRSw2R0FFaEUsd0NBQWdGLDBMQUdoRiw2QkFBaUUsK0ZBRWpFLGtDQUEyRSx3REFDM0UsdUJBQTZDLDBEQUM3Qyx5QkFBeUQsZ0tBR3pELHNCQUFnRCwrQkFDaEQsMEJBQXlELG1GQUN6RCxpQkFBeUMsc0NBQ3pDLHlCQUF5RCxzSUFFekQsaUJBQXlDLHFFQUN6QyxxQkFBMkMsc0xBRzNDLHFCQUFpRCxzQ0FDakQsNEJBQWtELHdMQUdsRCx1QkFBcUQsdURBQ3JELGdDQUF1RSxnT0FJdkUsdUJBQXFELHdFQUNyRCw4QkFBbUUsNEZBQ25FLGdCQUF1Qyx3Q0FDdkMsMEJBQTJELHFFQUMzRCxrQkFBMkMsc0VBQzNDLG9CQUErQyxrREFDL0MscUJBQW1ELDREQUNuRCwwQkFBMkQsK0tBRTNELCtCQUE0RCxpRkFDNUQseUJBQXlELHVHQUV6RCwwQkFBMkQsMEZBRTNELHNCQUE4QywrSUFFOUMsc0JBQWdELDJHQUVoRCxpQkFBMkMsZ0VBQzNDLDJCQUF3RCxvRkFDeEQsdUJBQXFELGdQQUlyRCxzQkFBbUQsd0NBQ25ELDBCQUEyRCw0R0FFM0QsaUJBQXlDLDZLQUV6QywwQkFBd0QsMkVBQ3hELG9CQUErQyw0Q0FDL0MsMkJBQWlFLDJGQUNqRSw4QkFBMkQsOEhBRTNELHlCQUF5RCxnSUFFekQsNEJBQWtELDZFQUNsRCx1QkFBcUQsa0RBQ3JELHVCQUFxRCxzQ0FDckQsd0JBQXVELG9FQUN2RCwyQkFBNkQsb0tBRzdELDRCQUFzRCwyQ0FDdEQsK0JBQTRELG1FQUM1RCx1QkFBcUQsd0VBQ3JELDBCQUF3RCx1RUFDeEQsY0FBd0MsaURBQ3hDLDhCQUEwRCwyRUFDMUQsNkJBQW1ELHlFQUNuRCwyQ0FBc0Usd0pBR3RFLHlCQUF5RCxrR0FDekQsZ0JBQXVDLHNDQUN2QyxtQkFBNkMsNkRBQzdDLFlBQStCLDBHQUUvQix3QkFBdUQseUpBR3ZELDhDQUErRSxrTEFHL0UsZ0JBQXVDLDRGQUN2Qyx1QkFBcUQseUVBQ3JELDBCQUEyRCxrRUFDM0QsaUJBQXlDLDREQUN6Qyw2QkFBaUUsMkVBQ2pFLDZCQUFpRSxtREFDakUsc0JBQW1ELDZEQUNuRCwrQkFBdUUseURBQ3ZFLHVDQUE2RSw0RUFDN0UscUJBQWlELHNFQUNqRCxRQUEyQiwrQkFDM0IscUJBQTRDLHlFQUM1QyxvQkFBeUQsMEZBRXpELDRCQUF5RCwyR0FFekQsMkJBQTZELHNIQUM3RCwrQkFBZ0UsMkVBQ2hFLCtCQUFxRSw2REFDckUsbUJBQTZDLDJDQUM3QyxpQkFBeUMsd0VBQ3pDLGlCQUF1Qyw0RkFFdkMsZ0JBQXVDLDBEQUN2QyxnQkFBdUMsK0VBQ3ZDLGtCQUEyQyxHQUMzQyxnQkFBdUMsa0RBQ3ZDLDBCQUEyRCwrRUFDM0Qsc0JBQW1ELHNPQStCckRDLEVBQWVGLEVBQ2ZHLEVBQThCLElBQUksSUFBYSxPQUFRLFdBdEJsRCxDQUNILHdDQUFnRiw0TEFtSmxGQyxFQUFZLElBQUksSUFBTyxrQkFDN0IsU0FBU0MsRUFBVUMsS0FBUUMsR0FDbkJILEVBQVVJLFVBQVksSUFBU0MsT0FDL0JMLEVBQVVsSyxNQUFNLFNBQVMsbUJBQWlCb0ssT0FBVUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQjVELFNBQVNHLEVBQU1DLEtBQWVDLEdBQzFCLE1BQU1DLEVBQW9CRixLQUFlQyxHQUU3QyxTQUFTRSxFQUFhSCxLQUFlQyxHQUNqQyxPQUFPQyxFQUFvQkYsS0FBZUMsR0FFOUMsU0FBU0csRUFBd0JDLEVBQU03RyxFQUFNQyxHQUN6QyxNQUFNNkcsRUFBVy9QLE9BQU95RyxPQUFPekcsT0FBT3lHLE9BQU8sR0FBSXVJLEtBQWlCLENBQUUsQ0FBQy9GLEdBQU9DLElBRTVFLE9BRGdCLElBQUksSUFBYSxPQUFRLFdBQVk2RyxHQUN0Q25QLE9BQU9xSSxFQUFNLENBQ3hCK0csUUFBU0YsRUFBS2pRLE9BR3RCLFNBQVNvUSxFQUFrQkgsRUFBTTlPLEVBQVFrUCxHQUVyQyxLQUFNbFAsYUFEc0JrUCxHQUt4QixNQUx3QkEsRUFFQXJRLE9BQVNtQixFQUFPb0UsWUFBWXZGLE1BQ2hEMlAsRUFBTU0sRUFBTSxrQkFFVkQsRUFBd0JDLEVBQU0saUJBQXVDLFdBQVc5TyxFQUFPb0UsWUFBWXZGLDZGQUlqSCxTQUFTOFAsRUFBb0JGLEtBQWVDLEdBQ3hDLEdBQTBCLGlCQUFmRCxFQUF5QixDQUNoQyxNQUFNeEcsRUFBT3lHLEVBQUssR0FDWlMsRUFBYSxJQUFJVCxFQUFLVSxNQUFNLElBSWxDLE9BSElELEVBQVcsS0FDWEEsRUFBVyxHQUFHSCxRQUFVUCxFQUFXNVAsTUFFaEM0UCxFQUFXWSxjQUFjelAsT0FBT3FJLEtBQVNrSCxHQUVwRCxPQUFPbEIsRUFBNEJyTyxPQUFPNk8sS0FBZUMsR0FFN0QsU0FBU1ksRUFBUUMsRUFBV2QsS0FBZUMsR0FDdkMsSUFBS2EsRUFDRCxNQUFNWixFQUFvQkYsS0FBZUMsR0FTakQsU0FBU2MsRUFBVUMsR0FHZixNQUFNdkgsRUFBVSw4QkFBZ0N1SCxFQUtoRCxNQUpBdEIsRUFBVWpHLEdBSUosSUFBSTFHLE1BQU0wRyxHQVNwQixTQUFTd0gsRUFBWUgsRUFBV3JILEdBQ3ZCcUgsR0FDREMsRUFBVXRIOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JsQixNQUFNeUgsRUFBZ0IsSUFBSUMsSUFDMUIsU0FBU0MsRUFBYUMsR0FDbEJKLEVBQVlJLGFBQWVDLFNBQVUsK0JBQ3JDLElBQUliLEVBQVdTLEVBQWN4USxJQUFJMlEsR0FDakMsT0FBSVosR0FDQVEsRUFBWVIsYUFBb0JZLEVBQUssa0RBQzlCWixJQUVYQSxFQUFXLElBQUlZLEVBQ2ZILEVBQWNLLElBQUlGLEVBQUtaLEdBQ2hCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUZYLFNBQVNlLElBQ0wsSUFBSUMsRUFDSixNQUF3QixvQkFBVG5KLE9BQWtELFFBQXhCbUosRUFBS25KLEtBQUtvSixnQkFBNkIsSUFBUEQsT0FBZ0IsRUFBU0EsRUFBR0UsT0FBVSxHQUVuSCxTQUFTQyxJQUNMLE1BQStCLFVBQXhCQyxLQUEyRCxXQUF4QkEsSUFFOUMsU0FBU0EsSUFDTCxJQUFJSixFQUNKLE1BQXdCLG9CQUFUbkosT0FBa0QsUUFBeEJtSixFQUFLbkosS0FBS29KLGdCQUE2QixJQUFQRCxPQUFnQixFQUFTQSxFQUFHSyxXQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwRXZILE1BQU0sRUFDRixZQUFZQyxFQUFZQyxHQUNwQnhQLEtBQUt1UCxXQUFhQSxFQUNsQnZQLEtBQUt3UCxVQUFZQSxFQUVqQmYsRUFBWWUsRUFBWUQsRUFBWSwrQ0FDcEN2UCxLQUFLeVAsU0FBVyxlQUFxQixjQUV6QyxNQUNJLE1BNURxQixvQkFBZHBLLFdBQ1BBLFdBQ0EsV0FBWUEsV0FDZ0Isa0JBQXJCQSxVQUFVcUssU0FNaEJOLEtBQW9CLGVBQXdCLGVBQWdCL0osYUFDdERBLFVBQVVxSyxPQW9ETkMsS0FBS0MsSUFBSSxJQUFvQjVQLEtBQUt1UCxZQU10Q3ZQLEtBQUt5UCxTQUFXelAsS0FBS3dQLFVBQVl4UCxLQUFLdVA7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQnJELFNBQVNNLEVBQWFDLEVBQVFDLEdBQzFCdEIsRUFBWXFCLEVBQU9FLFNBQVUsc0NBQzdCLE1BQU0sSUFBRXRHLEdBQVFvRyxFQUFPRSxTQUN2QixPQUFLRCxFQUdFLEdBQUdyRyxJQUFNcUcsRUFBS0UsV0FBVyxLQUFPRixFQUFLNUIsTUFBTSxHQUFLNEIsSUFGNUNyRzs7Ozs7Ozs7Ozs7Ozs7OztHQXFCZixNQUFNd0csRUFDRixrQkFBa0JDLEVBQVdDLEVBQWFDLEdBQ3RDclEsS0FBS21RLFVBQVlBLEVBQ2JDLElBQ0FwUSxLQUFLb1EsWUFBY0EsR0FFbkJDLElBQ0FyUSxLQUFLcVEsYUFBZUEsR0FHNUIsZUFDSSxPQUFJclEsS0FBS21RLFVBQ0VuUSxLQUFLbVEsVUFFSSxvQkFBVHJLLE1BQXdCLFVBQVdBLEtBQ25DQSxLQUFLd0ssV0FFaEIvQixFQUFVLG1IQUVkLGlCQUNJLE9BQUl2TyxLQUFLb1EsWUFDRXBRLEtBQUtvUSxZQUVJLG9CQUFUdEssTUFBd0IsWUFBYUEsS0FDckNBLEtBQUt5SyxhQUVoQmhDLEVBQVUscUhBRWQsa0JBQ0ksT0FBSXZPLEtBQUtxUSxhQUNFclEsS0FBS3FRLGFBRUksb0JBQVR2SyxNQUF3QixhQUFjQSxLQUN0Q0EsS0FBSzBLLGNBRWhCakMsRUFBVTs7Ozs7Ozs7Ozs7Ozs7OztHQXVCbEIsTUFBTWtDLEVBQW1CLENBRXJCLG9CQUFtRCx3QkFFbkQscUJBQXFELGlCQUVyRCxtQkFBaUQsZ0JBRWpELHFCQUFxRCxpQkFFckQsaUJBQTZDLGlCQUU3QyxpQkFBNkMsaUJBRTdDLGFBQXFDLHVCQUNyQyx3QkFBMkQsd0JBRTNELHFCQUFxRCxxQkFDckQsc0JBQXVELHFCQUN2RCxpQ0FBNkUsNEJBRTdFLGlCQUE2QyxpQkFFN0MsZ0JBQTJDLGlCQUMzQyw0QkFBbUUsb0JBQ25FLGlCQUE2QyxzQkFDN0MsaUJBQTZDLHNCQUU3QyxpQkFBNkMsaUJBRTdDLCtCQUF5RSx3QkFDekUsaUJBQTZDLHFCQUM3QyxjQUF1QyxxQkFDdkMsZUFBeUMscUJBRXpDLDRCQUFtRSxvQkFFbkUsYUFBcUMsNEJBQ3JDLHFCQUFxRCwwQkFDckQsd0JBQTJELHFCQUMzRCxxQkFBcUQsMEJBQ3JELGdCQUEyQyxlQUkzQyw2QkFBcUUsMkJBQ3JFLG9CQUFtRCw0QkFFbkQsd0JBQTJELDBCQUUzRCxxQkFBcUQsNkJBRXJELCtCQUF5RSwrQkFDekUseUJBQTZELDhCQUM3RCwwQkFBK0QsNEJBQy9ELCtCQUF5RSwrQkFDekUscUJBQXFELCtCQUNyRCw2QkFBcUUsdUNBRXJFLGlDQUE2RSxrQkFtQjNFQyxFQUF5QixJQUFJLEVBQU0sSUFBTzs7Ozs7Ozs7Ozs7Ozs7OztHQUNoRCxTQUFTQyxFQUFtQjlDLEVBQU0rQyxHQUM5QixPQUFJL0MsRUFBS2dELFdBQWFELEVBQVFDLFNBQ25COVMsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJb00sR0FBVSxDQUFFQyxTQUFVaEQsRUFBS2dELFdBRS9ERCxFQUVYRSxlQUFlQyxFQUFtQmxELEVBQU01QyxFQUFROEUsRUFBTWEsRUFBU0ksRUFBaUIsSUFDNUUsT0FBT0MsRUFBK0JwRCxFQUFNbUQsRUFBZ0JGLFVBQ3hELElBQUlJLEVBQU8sR0FDUGpJLEVBQVMsR0FDVDJILElBQ2UsUUFBWDNGLEVBQ0FoQyxFQUFTMkgsRUFHVE0sRUFBTyxDQUNIQSxLQUFNbE0sS0FBS0MsVUFBVTJMLEtBSWpDLE1BQU1PLEVBQVEsWUFBWXBULE9BQU95RyxPQUFPLENBQUU1RixJQUFLaVAsRUFBS2lDLE9BQU9zQixRQUFVbkksSUFBU2tGLE1BQU0sR0FDOUVrRCxRQUFnQnhELEVBQUt5RCx3QkFLM0IsT0FKQUQsRUFBUSxnQkFBcUMsbUJBQ3pDeEQsRUFBSzBELGVBQ0xGLEVBQVEscUJBQStDeEQsRUFBSzBELGNBRXpEckIsRUFBY0ksT0FBZEosQ0FBc0JzQixFQUFnQjNELEVBQU1BLEVBQUtpQyxPQUFPMkIsUUFBUzFCLEVBQU1vQixHQUFRcFQsT0FBT3lHLE9BQU8sQ0FBRXlHLFNBQ2xHb0csVUFBU0ssZUFBZ0IsZUFBaUJSLE1BR3RESixlQUFlRyxFQUErQnBELEVBQU1tRCxFQUFnQlcsR0FDaEU5RCxFQUFLK0Qsa0JBQW1CLEVBQ3hCLE1BQU05RCxFQUFXL1AsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJaU0sR0FBbUJPLEdBQ3BFLElBQ0ksTUFBTWEsRUFBaUIsSUFBSUMsRUFBZWpFLEdBQ3BDa0UsUUFBaUJuTyxRQUFRb08sS0FBSyxDQUNoQ0wsSUFDQUUsRUFBZWxPLFVBSW5Ca08sRUFBZUksc0JBQ2YsTUFBTUMsUUFBYUgsRUFBU0csT0FDNUIsR0FBSSxxQkFBc0JBLEVBQ3RCLE1BQU1DLEVBQWlCdEUsRUFBTSwyQ0FBb0VxRSxHQUVyRyxHQUFJSCxFQUFTSyxNQUFRLGlCQUFrQkYsR0FDbkMsT0FBT0EsRUFFTixDQUNELE1BQU1HLEVBQWVOLEVBQVNLLEdBQUtGLEVBQUtHLGFBQWVILEVBQUtuUCxNQUFNa0UsU0FDM0RxTCxFQUFpQkMsR0FBc0JGLEVBQWE5SSxNQUFNLE9BQ2pFLEdBQXdCLHFDQUFwQitJLEVBQ0EsTUFBTUgsRUFBaUJ0RSxFQUFNLDRCQUE2RHFFLEdBRXpGLEdBQXdCLGlCQUFwQkksRUFDTCxNQUFNSCxFQUFpQnRFLEVBQU0sdUJBQTJDcUUsR0FFNUUsTUFBTU0sRUFBWTFFLEVBQVN3RSxJQUN2QkEsRUFDS0csY0FDQS9QLFFBQVEsVUFBVyxLQUM1QixHQUFJNlAsRUFDQSxNQUFNM0UsRUFBd0JDLEVBQU0yRSxFQUFXRCxHQUcvQ2hGLEVBQU1NLEVBQU0yRSxJQUl4QixNQUFPM1AsR0FDSCxHQUFJQSxhQUFhLElBQ2IsTUFBTUEsRUFFVjBLLEVBQU1NLEVBQU0sMkJBR3BCaUQsZUFBZTRCLEVBQXNCN0UsRUFBTTVDLEVBQVE4RSxFQUFNYSxFQUFTSSxFQUFpQixJQUMvRSxNQUFNMkIsUUFBd0I1QixFQUFtQmxELEVBQU01QyxFQUFROEUsRUFBTWEsRUFBU0ksR0FNOUUsTUFMSSx5QkFBMEIyQixHQUMxQnBGLEVBQU1NLEVBQU0sNkJBQWlELENBQ3pEK0UsZ0JBQWlCRCxJQUdsQkEsRUFFWCxTQUFTbkIsRUFBZ0IzRCxFQUFNZ0YsRUFBTTlDLEVBQU1vQixHQUN2QyxNQUFNMkIsRUFBTyxHQUFHRCxJQUFPOUMsS0FBUW9CLElBQy9CLE9BQUt0RCxFQUFLaUMsT0FBT0UsU0FHVkgsRUFBYWhDLEVBQUtpQyxPQUFRZ0QsR0FGdEIsR0FBR2pGLEVBQUtpQyxPQUFPaUQsZUFBZUQsSUFJN0MsTUFBTWhCLEVBQ0YsWUFBWWpFLEdBQ1I3TixLQUFLNk4sS0FBT0EsRUFJWjdOLEtBQUtnVCxNQUFRLEtBQ2JoVCxLQUFLMkQsUUFBVSxJQUFJQyxRQUFRLENBQUNrRSxFQUFHckUsS0FDM0J6RCxLQUFLZ1QsTUFBUUMsV0FBVyxJQUNieFAsRUFBT2tLLEVBQWEzTixLQUFLNk4sS0FBTSxZQUN2QzZDLEVBQXVCeFMsU0FHbEMsc0JBQ0lnVixhQUFhbFQsS0FBS2dULFFBRzFCLFNBQVNiLEVBQWlCdEUsRUFBTTdHLEVBQU0rSyxHQUNsQyxNQUFNb0IsRUFBYyxDQUNoQnBGLFFBQVNGLEVBQUtqUSxNQUVkbVUsRUFBU3FCLFFBQ1RELEVBQVlDLE1BQVFyQixFQUFTcUIsT0FFN0JyQixFQUFTc0IsY0FDVEYsRUFBWUUsWUFBY3RCLEVBQVNzQixhQUV2QyxNQUFNdFEsRUFBUTRLLEVBQWFFLEVBQU03RyxFQUFNbU0sR0FHdkMsT0FEQXBRLEVBQU1tRSxXQUFXb00sZUFBaUJ2QixFQUMzQmhQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2Q1gsU0FBU3dRLEVBQXlCQyxHQUM5QixHQUFLQSxFQUdMLElBRUksTUFBTUMsRUFBTyxJQUFJclEsS0FBS3NRLE9BQU9GLElBRTdCLElBQUtHLE1BQU1GLEVBQUtwUSxXQUVaLE9BQU9vUSxFQUFLRyxjQUdwQixNQUFPL1E7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrRVgsU0FBU2dSLEVBQTRCQyxHQUNqQyxPQUF5QixJQUFsQkosT0FBT0ksR0FFbEIsU0FBU0MsRUFBWS9QLEdBQ2pCLE1BQU9nUSxFQUFXelAsRUFBUzBQLEdBQWFqUSxFQUFNdUYsTUFBTSxLQUNwRCxRQUFrQmpHLElBQWQwUSxRQUNZMVEsSUFBWmlCLFFBQ2NqQixJQUFkMlEsRUFFQSxPQURBL0csRUFBVSxrREFDSCxLQUVYLElBQ0ksTUFBTWdILEVBQVUsWUFBYTNQLEdBQzdCLE9BQUsyUCxFQUlFbFAsS0FBS21QLE1BQU1ELElBSGRoSCxFQUFVLHVDQUNILE1BSWYsTUFBT3JLLEdBRUgsT0FEQXFLLEVBQVUsMkNBQTRDckssR0FDL0M7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJmaU8sZUFBZXNELEVBQXFCQyxFQUFNMVEsRUFBUzJRLEdBQWtCLEdBQ2pFLEdBQUlBLEVBQ0EsT0FBTzNRLEVBRVgsSUFDSSxhQUFhQSxFQUVqQixNQUFPZCxHQU1ILE1BTElBLGFBQWEsS0FRekIsVUFBMkIsS0FBRW1FLElBQ3pCLE1BQWlCLHVCQUFUQSxHQUNLLDRCQUFUQTs7Ozs7Ozs7Ozs7Ozs7OztHQVZrQ3VOLENBQWtCMVIsSUFDNUN3UixFQUFLeEcsS0FBSzJHLGNBQWdCSCxTQUNwQkEsRUFBS3hHLEtBQUs0RyxVQUdsQjVSLEdBd0JkLE1BQU02UixFQUNGLFlBQVlMLEdBQ1JyVSxLQUFLcVUsS0FBT0EsRUFDWnJVLEtBQUsyVSxXQUFZLEVBS2pCM1UsS0FBSzRVLFFBQVUsS0FDZjVVLEtBQUs2VSxhQUFlLElBRXhCLFNBQ1E3VSxLQUFLMlUsWUFHVDNVLEtBQUsyVSxXQUFZLEVBQ2pCM1UsS0FBSzhVLFlBRVQsUUFDUzlVLEtBQUsyVSxZQUdWM1UsS0FBSzJVLFdBQVksRUFDSSxPQUFqQjNVLEtBQUs0VSxTQUNMMUIsYUFBYWxULEtBQUs0VSxVQUcxQixZQUFZRyxHQUNSLElBQUk5RixFQUNKLEdBQUk4RixFQUFVLENBQ1YsTUFBTUMsRUFBV2hWLEtBQUs2VSxhQUV0QixPQURBN1UsS0FBSzZVLGFBQWVsRixLQUFLQyxJQUF3QixFQUFwQjVQLEtBQUs2VSxhQUFrQixNQUM3Q0csRUFFTixDQUVEaFYsS0FBSzZVLGFBQWUsSUFDcEIsTUFDTUcsR0FEOEQsUUFBbkQvRixFQUFLalAsS0FBS3FVLEtBQUtZLGdCQUFnQkMsc0JBQW1DLElBQVBqRyxFQUFnQkEsRUFBSyxHQUN0RTdMLEtBQUsrUixNQUFRLElBQ3hDLE9BQU94RixLQUFLeUYsSUFBSSxFQUFHSixJQUczQixTQUFTRCxHQUFXLEdBQ2hCLElBQUsvVSxLQUFLMlUsVUFFTixPQUVKLE1BQU1LLEVBQVdoVixLQUFLcVYsWUFBWU4sR0FDbEMvVSxLQUFLNFUsUUFBVTNCLFdBQVduQyxnQkFDaEI5USxLQUFLc1YsYUFDWk4sR0FFUCxrQkFDSSxVQUNVaFYsS0FBS3FVLEtBQUtrQixZQUFXLEdBRS9CLE1BQU8xUyxHQUtILFlBSGUsZ0NBQVhBLEVBQUVtRSxNQUNGaEgsS0FBSzhVLFVBQXdCLElBSXJDOVUsS0FBSzhVOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JiLE1BQU1VLEVBQ0YsWUFBWUMsRUFBV0MsR0FDbkIxVixLQUFLeVYsVUFBWUEsRUFDakJ6VixLQUFLMFYsWUFBY0EsRUFDbkIxVixLQUFLMlYsa0JBRVQsa0JBQ0kzVixLQUFLNFYsZUFBaUJyQyxFQUF5QnZULEtBQUswVixhQUNwRDFWLEtBQUs2VixhQUFldEMsRUFBeUJ2VCxLQUFLeVYsV0FFdEQsTUFBTUssR0FDRjlWLEtBQUt5VixVQUFZSyxFQUFTTCxVQUMxQnpWLEtBQUswVixZQUFjSSxFQUFTSixZQUM1QjFWLEtBQUsyVixrQkFFVCxTQUNJLE1BQU8sQ0FDSEYsVUFBV3pWLEtBQUt5VixVQUNoQkMsWUFBYTFWLEtBQUswVjs7Ozs7Ozs7Ozs7Ozs7OztHQXFCOUI1RSxlQUFlaUYsRUFBcUIxQixHQUNoQyxJQUFJcEYsRUFDSixNQUFNcEIsRUFBT3dHLEVBQUt4RyxLQUNabUksUUFBZ0IzQixFQUFLa0IsYUFDckJ4RCxRQUFpQnFDLEVBQXFCQyxFQXpUaER2RCxlQUE4QmpELEVBQU0rQyxHQUNoQyxPQUFPRyxFQUFtQmxELEVBQU0sT0FBbUIsc0JBQThDK0MsR0F3VC9DcUYsQ0FBZXBJLEVBQU0sQ0FBRW1JLGFBQ3pFM0gsRUFBUTBELGFBQTJDLEVBQVNBLEVBQVNtRSxNQUFNMVcsT0FBUXFPLEVBQU0sa0JBQ3pGLE1BQU1zSSxFQUFjcEUsRUFBU21FLE1BQU0sR0FDbkM3QixFQUFLK0Isc0JBQXNCRCxHQUMzQixNQUFNRSxHQUEyRCxRQUF2Q3BILEVBQUtrSCxFQUFZRyx3QkFBcUMsSUFBUHJILE9BQWdCLEVBQVNBLEVBQUd6UCxRQUMzRTJXLEVBQVlHLGlCQThDckJDLElBQUt0SCxJQUNsQixJQUFJLFdBQUV1SCxHQUFldkgsRUFBSXdILEVBQVc3SyxFQUFPcUQsRUFBSSxDQUFDLGVBQ2hELE1BQU8sQ0FDSHVILGFBQ0F0UyxJQUFLdVMsRUFBU0MsT0FBUyxHQUN2QkMsWUFBYUYsRUFBU0UsYUFBZSxLQUNyQ3ZELE1BQU9xRCxFQUFTckQsT0FBUyxLQUN6QkMsWUFBYW9ELEVBQVNwRCxhQUFlLEtBQ3JDdUQsU0FBVUgsRUFBU0ksVUFBWSxRQXJEakMsR0FDTixNQUFNQyxHQXVDaUJDLEVBdkNnQjFDLEVBQUt5QyxhQXVDWEUsRUF2Q3lCWCxFQXlDbkQsSUFEU1UsRUFBU0UsT0FBT25aLElBQU1rWixFQUFRRSxLQUFLcFksR0FBS0EsRUFBRTBYLGFBQWUxWSxFQUFFMFksZ0JBQ3BEUSxJQUYzQixJQUEyQkQsRUFBVUMsRUFqQ2pDLE1BQU1HLEVBQWlCOUMsRUFBSytDLFlBQ3RCQyxJQUFtQmhELEVBQUtqQixPQUFTK0MsRUFBWW1CLGVBQW1CUixhQUFtRCxFQUFTQSxFQUFhdFgsU0FDekk0WCxJQUFlRCxHQUF5QkUsRUFDeENFLEVBQVUsQ0FDWnJULElBQUtpUyxFQUFZcUIsUUFDakJiLFlBQWFSLEVBQVlRLGFBQWUsS0FDeENDLFNBQVVULEVBQVlVLFVBQVksS0FDbEN6RCxNQUFPK0MsRUFBWS9DLE9BQVMsS0FDNUJxRSxjQUFldEIsRUFBWXNCLGdCQUFpQixFQUM1Q3BFLFlBQWE4QyxFQUFZOUMsYUFBZSxLQUN4Q3hDLFNBQVVzRixFQUFZdEYsVUFBWSxLQUNsQ2lHLGVBQ0FoQixTQUFVLElBQUlOLEVBQWFXLEVBQVlWLFVBQVdVLEVBQVlULGFBQzlEMEIsZUFFSnJaLE9BQU95RyxPQUFPNlAsRUFBTWtEOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtHeEIsTUFBTUcsRUFDRixjQUNJMVgsS0FBSzJYLGFBQWUsS0FDcEIzWCxLQUFLNFgsWUFBYyxLQUNuQjVYLEtBQUtrVixlQUFpQixLQUUxQixnQkFDSSxPQUFTbFYsS0FBS2tWLGdCQUNWOVIsS0FBSytSLE1BQVFuVixLQUFLa1YsZUFBaUIsSUFFM0MseUJBQXlCbkQsR0FDckIxRCxFQUFRMEQsRUFBU2lFLFFBQVMsa0JBQzFCM0gsT0FBb0MsSUFBckIwRCxFQUFTaUUsUUFBeUIsa0JBQ2pEM0gsT0FBeUMsSUFBMUIwRCxFQUFTNEYsYUFBOEIsa0JBQ3RELE1BQU1FLEVBQVksY0FBZTlGLFFBQTBDLElBQXZCQSxFQUFTOEYsVUFDdkRuRSxPQUFPM0IsRUFBUzhGLFdBeFU5QixTQUF5QjdULEdBQ3JCLE1BQU04VCxFQUFjL0QsRUFBWS9QLEdBSWhDLE9BSEFxSyxFQUFReUosRUFBYSxrQkFDckJ6SixPQUFtQyxJQUFwQnlKLEVBQVluVCxJQUFxQixrQkFDaEQwSixPQUFtQyxJQUFwQnlKLEVBQVkxVCxJQUFxQixrQkFDekNzUCxPQUFPb0UsRUFBWW5ULEtBQU8rTyxPQUFPb0UsRUFBWTFULEtBb1UxQzJULENBQWdCaEcsRUFBU2lFLFNBQy9CaFcsS0FBS2dZLDBCQUEwQmpHLEVBQVNpRSxRQUFTakUsRUFBUzRGLGFBQWNFLEdBRTVFLGVBQWVoSyxFQUFNb0ssR0FBZSxHQUVoQyxPQURBNUosR0FBU3JPLEtBQUs0WCxhQUFlNVgsS0FBSzJYLGFBQWM5SixFQUFNLHNCQUNqRG9LLElBQWdCalksS0FBSzRYLGFBQWdCNVgsS0FBS2tZLFVBRzNDbFksS0FBSzJYLG9CQUNDM1gsS0FBS21ZLFFBQVF0SyxFQUFNN04sS0FBSzJYLGNBQ3ZCM1gsS0FBSzRYLGFBRVQsS0FOSTVYLEtBQUs0WCxZQVFwQixvQkFDSTVYLEtBQUsyWCxhQUFlLEtBRXhCLGNBQWM5SixFQUFNdUssR0FDaEIsTUFBTSxZQUFFUixFQUFXLGFBQUVELEVBQVksVUFBRUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaEYzQy9HLGVBQStCakQsRUFBTThKLEdBQ2pDLE1BQU01RixRQUFpQmQsRUFBK0JwRCxFQUFNLEdBQUlpRCxVQUM1RCxNQUFNSSxFQUFPLFlBQVksQ0FDckIsV0FBYyxnQkFDZCxjQUFpQnlHLElBQ2xCeEosTUFBTSxJQUNILGFBQUVrSyxFQUFZLE9BQUVqSCxHQUFXdkQsRUFBS2lDLE9BQ2hDcEcsRUFBTThILEVBQWdCM0QsRUFBTXdLLEVBQWMsWUFBeUIsT0FBT2pILEdBQzFFQyxRQUFnQnhELEVBQUt5RCx3QkFFM0IsT0FEQUQsRUFBUSxnQkFBcUMsb0NBQ3RDbkIsRUFBY0ksT0FBZEosQ0FBc0J4RyxFQUFLLENBQzlCdUIsT0FBUSxPQUNSb0csVUFDQUgsV0FJUixNQUFPLENBQ0gwRyxZQUFhN0YsRUFBU3VHLGFBQ3RCVCxVQUFXOUYsRUFBU3dHLFdBQ3BCWixhQUFjNUYsRUFBU3lHLGVBNERnQ0MsQ0FBZ0I1SyxFQUFNdUssR0FDN0VwWSxLQUFLZ1ksMEJBQTBCSixFQUFhRCxFQUFjakUsT0FBT21FLElBRXJFLDBCQUEwQkQsRUFBYUQsRUFBY2UsR0FDakQxWSxLQUFLMlgsYUFBZUEsR0FBZ0IsS0FDcEMzWCxLQUFLNFgsWUFBY0EsR0FBZSxLQUNsQzVYLEtBQUtrVixlQUFpQjlSLEtBQUsrUixNQUF1QixJQUFmdUQsRUFFdkMsZ0JBQWdCM0ssRUFBU2hQLEdBQ3JCLE1BQU0sYUFBRTRZLEVBQVksWUFBRUMsRUFBVyxlQUFFMUMsR0FBbUJuVyxFQUNoRDRaLEVBQVUsSUFBSWpCLEVBbUJwQixPQWxCSUMsSUFDQXRKLEVBQWdDLGlCQUFqQnNKLEVBQTJCLGlCQUF1QyxDQUM3RTVKLFlBRUo0SyxFQUFRaEIsYUFBZUEsR0FFdkJDLElBQ0F2SixFQUErQixpQkFBaEJ1SixFQUEwQixpQkFBdUMsQ0FDNUU3SixZQUVKNEssRUFBUWYsWUFBY0EsR0FFdEIxQyxJQUNBN0csRUFBa0MsaUJBQW5CNkcsRUFBNkIsaUJBQXVDLENBQy9FbkgsWUFFSjRLLEVBQVF6RCxlQUFpQkEsR0FFdEJ5RCxFQUVYLFNBQ0ksTUFBTyxDQUNIaEIsYUFBYzNYLEtBQUsyWCxhQUNuQkMsWUFBYTVYLEtBQUs0WCxZQUNsQjFDLGVBQWdCbFYsS0FBS2tWLGdCQUc3QixRQUFRRCxHQUNKalYsS0FBSzRYLFlBQWMzQyxFQUFnQjJDLFlBQ25DNVgsS0FBSzJYLGFBQWUxQyxFQUFnQjBDLGFBQ3BDM1gsS0FBS2tWLGVBQWlCRCxFQUFnQkMsZUFFMUMsU0FDSSxPQUFPblgsT0FBT3lHLE9BQU8sSUFBSWtULEVBQW1CMVgsS0FBSzRZLFVBRXJELGtCQUNJLE9BQU9ySyxFQUFVOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0J6QixTQUFTc0ssRUFBd0J2SyxFQUFXUCxHQUN4Q00sRUFBNkIsaUJBQWRDLFFBQStDLElBQWRBLEVBQTJCLGlCQUF1QyxDQUFFUCxZQUV4SCxNQUFNLEVBQ0YsWUFBWWtCLEdBQ1IsSUFBSSxJQUFFL0ssRUFBRyxLQUFFMkosRUFBSSxnQkFBRW9ILEdBQW9CaEcsRUFBSTZKLEVBQU1sTixFQUFPcUQsRUFBSSxDQUFDLE1BQU8sT0FBUSxvQkFFMUVqUCxLQUFLd1csV0FBYSxXQUNsQnhXLEtBQUt5WCxlQUFnQixFQUNyQnpYLEtBQUtvWCxhQUFjLEVBQ25CcFgsS0FBSzZRLFNBQVcsS0FDaEI3USxLQUFLOFcsYUFBZSxHQUNwQjlXLEtBQUsrWSxpQkFBbUIsSUFBSXJFLEVBQWlCMVUsTUFDN0NBLEtBQUtnWixlQUFpQixLQUN0QmhaLEtBQUtpWixlQUFpQixLQUN0QmpaLEtBQUtrRSxJQUFNQSxFQUNYbEUsS0FBSzZOLEtBQU9BLEVBQ1o3TixLQUFLaVYsZ0JBQWtCQSxFQUN2QmpWLEtBQUs0WCxZQUFjM0MsRUFBZ0IyQyxZQUNuQzVYLEtBQUsyVyxZQUFjbUMsRUFBSW5DLGFBQWUsS0FDdEMzVyxLQUFLb1QsTUFBUTBGLEVBQUkxRixPQUFTLEtBQzFCcFQsS0FBS3lYLGNBQWdCcUIsRUFBSXJCLGdCQUFpQixFQUMxQ3pYLEtBQUtxVCxZQUFjeUYsRUFBSXpGLGFBQWUsS0FDdENyVCxLQUFLNFcsU0FBV2tDLEVBQUlsQyxVQUFZLEtBQ2hDNVcsS0FBS29YLFlBQWMwQixFQUFJMUIsY0FBZSxFQUN0Q3BYLEtBQUs2USxTQUFXaUksRUFBSWpJLFVBQVksS0FDaEM3USxLQUFLOFYsU0FBVyxJQUFJTixFQUFhc0QsRUFBSXJELGdCQUFhblMsRUFBV3dWLEVBQUlwRCxrQkFBZXBTLEdBRXBGLGlCQUFpQjJVLEdBQ2IsTUFBTUwsUUFBb0J4RCxFQUFxQnBVLEtBQU1BLEtBQUtpVixnQkFBZ0JpRSxTQUFTbFosS0FBSzZOLEtBQU1vSyxJQU85RixPQU5BNUosRUFBUXVKLEVBQWE1WCxLQUFLNk4sS0FBTSxrQkFDNUI3TixLQUFLNFgsY0FBZ0JBLElBQ3JCNVgsS0FBSzRYLFlBQWNBLFFBQ2I1WCxLQUFLNk4sS0FBS3NMLHNCQUFzQm5aLE1BQ3RDQSxLQUFLNk4sS0FBS3VMLDBCQUEwQnBaLE9BRWpDNFgsRUFFWCxpQkFBaUJLLEdBQ2IsT0FqZlJuSCxlQUFnQ3VELEVBQU00RCxHQUFlLEdBQ2pELE1BQU1vQixFQUFlLFlBQW1CaEYsR0FDbENyUSxRQUFjcVYsRUFBYTlELFdBQVcwQyxHQUN0Q3FCLEVBQVN2RixFQUFZL1AsR0FDM0JxSyxFQUFRaUwsR0FBVUEsRUFBTzNVLEtBQU8yVSxFQUFPMVUsV0FBYTBVLEVBQU9sVixJQUFLaVYsRUFBYXhMLEtBQU0sa0JBQ25GLE1BQU1oSixFQUFzQyxpQkFBcEJ5VSxFQUFPelUsU0FBd0J5VSxFQUFPelUsY0FBV3ZCLEVBQ25FaVcsRUFBaUIxVSxhQUEyQyxFQUFTQSxFQUEyQixpQkFDdEcsTUFBTyxDQUNIeVUsU0FDQXRWLFFBQ0F3VixTQUFVakcsRUFBeUJNLEVBQTRCeUYsRUFBTzFVLFlBQ3RFNlUsYUFBY2xHLEVBQXlCTSxFQUE0QnlGLEVBQU9sVixNQUMxRThRLGVBQWdCM0IsRUFBeUJNLEVBQTRCeUYsRUFBTzNVLE1BQzVFNFUsZUFBZ0JBLEdBQWtCLEtBQ2xDRyxvQkFBcUI3VSxhQUEyQyxFQUFTQSxFQUFnQyx3QkFBTSxNQW1leEc4VSxDQUFpQjNaLEtBQU1pWSxHQUVsQyxTQUNJLE9BeE9SbkgsZUFBc0J1RCxHQUNsQixNQUFNZ0YsRUFBZSxZQUFtQmhGLFNBQ2xDMEIsRUFBcUJzRCxTQUlyQkEsRUFBYXhMLEtBQUtzTCxzQkFBc0JFLEdBQzlDQSxFQUFheEwsS0FBS3VMLDBCQUEwQkMsR0FpT2pDTyxDQUFPNVosTUFFbEIsUUFBUXFVLEdBQ0FyVSxPQUFTcVUsSUFHYmhHLEVBQVFyTyxLQUFLa0UsTUFBUW1RLEVBQUtuUSxJQUFLbEUsS0FBSzZOLEtBQU0sa0JBQzFDN04sS0FBSzJXLFlBQWN0QyxFQUFLc0MsWUFDeEIzVyxLQUFLNFcsU0FBV3ZDLEVBQUt1QyxTQUNyQjVXLEtBQUtvVCxNQUFRaUIsRUFBS2pCLE1BQ2xCcFQsS0FBS3lYLGNBQWdCcEQsRUFBS29ELGNBQzFCelgsS0FBS3FULFlBQWNnQixFQUFLaEIsWUFDeEJyVCxLQUFLb1gsWUFBYy9DLEVBQUsrQyxZQUN4QnBYLEtBQUs2USxTQUFXd0QsRUFBS3hELFNBQ3JCN1EsS0FBSzhXLGFBQWV6QyxFQUFLeUMsYUFBYVAsSUFBSXNELEdBQWE5YixPQUFPeUcsT0FBTyxHQUFJcVYsSUFDekU3WixLQUFLOFYsU0FBU2dFLE1BQU16RixFQUFLeUIsVUFDekI5VixLQUFLaVYsZ0JBQWdCOEUsUUFBUTFGLEVBQUtZLGtCQUV0QyxPQUFPcEgsR0FDSCxPQUFPLElBQUksRUFBUzlQLE9BQU95RyxPQUFPekcsT0FBT3lHLE9BQU8sR0FBSXhFLE1BQU8sQ0FBRTZOLE9BQU1vSCxnQkFBaUJqVixLQUFLaVYsZ0JBQWdCK0UsWUFFN0csVUFBVW5XLEdBRU53SyxHQUFTck8sS0FBS2laLGVBQWdCalosS0FBSzZOLEtBQU0sa0JBQ3pDN04sS0FBS2laLGVBQWlCcFYsRUFDbEI3RCxLQUFLZ1osaUJBQ0xoWixLQUFLb1csc0JBQXNCcFcsS0FBS2daLGdCQUNoQ2haLEtBQUtnWixlQUFpQixNQUc5QixzQkFBc0JhLEdBQ2Q3WixLQUFLaVosZUFDTGpaLEtBQUtpWixlQUFlWSxHQUlwQjdaLEtBQUtnWixlQUFpQmEsRUFHOUIseUJBQ0k3WixLQUFLK1ksaUJBQWlCa0IsU0FFMUIsd0JBQ0lqYSxLQUFLK1ksaUJBQWlCbUIsUUFFMUIsK0JBQStCbkksRUFBVTZILEdBQVMsR0FDOUMsSUFBSU8sR0FBa0IsRUFDbEJwSSxFQUFTaUUsU0FDVGpFLEVBQVNpRSxVQUFZaFcsS0FBS2lWLGdCQUFnQjJDLGNBQzFDNVgsS0FBS2lWLGdCQUFnQm1GLHlCQUF5QnJJLEdBQzlDb0ksR0FBa0IsR0FFbEJQLFNBQ003RCxFQUFxQi9WLFlBRXpCQSxLQUFLNk4sS0FBS3NMLHNCQUFzQm5aLE1BQ2xDbWEsR0FDQW5hLEtBQUs2TixLQUFLdUwsMEJBQTBCcFosTUFHNUMsZUFDSSxNQUFNZ1csUUFBZ0JoVyxLQUFLdVYsYUFLM0IsYUFKTW5CLEVBQXFCcFUsS0Exb0JuQzhRLGVBQTZCakQsRUFBTStDLEdBQy9CLE9BQU9HLEVBQW1CbEQsRUFBTSxPQUFtQixzQkFBNEMrQyxHQXlvQjFEeUosQ0FBY3JhLEtBQUs2TixLQUFNLENBQUVtSSxhQUM1RGhXLEtBQUtpVixnQkFBZ0JxRixvQkFHZHRhLEtBQUs2TixLQUFLNEcsVUFFckIsU0FDSSxPQUFPMVcsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxDQUFFTixJQUFLbEUsS0FBS2tFLElBQUtrUCxNQUFPcFQsS0FBS29ULFlBQVM5UCxFQUFXbVUsY0FBZXpYLEtBQUt5WCxjQUFlZCxZQUFhM1csS0FBSzJXLGtCQUFlclQsRUFBVzhULFlBQWFwWCxLQUFLb1gsWUFBYVIsU0FBVTVXLEtBQUs0VyxlQUFZdFQsRUFBVytQLFlBQWFyVCxLQUFLcVQsa0JBQWUvUCxFQUFXdU4sU0FBVTdRLEtBQUs2USxlQUFZdk4sRUFBV3dULGFBQWM5VyxLQUFLOFcsYUFBYVAsSUFBSXNELEdBQWE5YixPQUFPeUcsT0FBTyxHQUFJcVYsSUFBYTVFLGdCQUFpQmpWLEtBQUtpVixnQkFBZ0IyRCxTQUc1YTJCLGlCQUFrQnZhLEtBQUt1YSxrQkFBb0J2YSxLQUFLOFYsU0FBUzhDLFVBQVcsQ0FFcEV4SCxPQUFRcFIsS0FBSzZOLEtBQUtpQyxPQUFPc0IsT0FBUXJELFFBQVMvTixLQUFLNk4sS0FBS2pRLE9BRTVELG1CQUNJLE9BQU9vQyxLQUFLaVYsZ0JBQWdCMEMsY0FBZ0IsR0FFaEQsaUJBQWlCOUosRUFBTTlPLEdBQ25CLElBQUlrUSxFQUFJdUwsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFBSUMsRUFDaEMsTUFBTW5FLEVBQTRDLFFBQTdCMUgsRUFBS2xRLEVBQU80WCxtQkFBZ0MsSUFBUDFILEVBQWdCQSxPQUFLM0wsRUFDekU4UCxFQUFnQyxRQUF2Qm9ILEVBQUt6YixFQUFPcVUsYUFBMEIsSUFBUG9ILEVBQWdCQSxPQUFLbFgsRUFDN0QrUCxFQUE0QyxRQUE3Qm9ILEVBQUsxYixFQUFPc1UsbUJBQWdDLElBQVBvSCxFQUFnQkEsT0FBS25YLEVBQ3pFc1QsRUFBc0MsUUFBMUI4RCxFQUFLM2IsRUFBTzZYLGdCQUE2QixJQUFQOEQsRUFBZ0JBLE9BQUtwWCxFQUNuRXVOLEVBQXNDLFFBQTFCOEosRUFBSzViLEVBQU84UixnQkFBNkIsSUFBUDhKLEVBQWdCQSxPQUFLclgsRUFDbkVpWCxFQUFzRCxRQUFsQ0ssRUFBSzdiLEVBQU93Yix3QkFBcUMsSUFBUEssRUFBZ0JBLE9BQUt0WCxFQUNuRm1TLEVBQXdDLFFBQTNCb0YsRUFBSzliLEVBQU8wVyxpQkFBOEIsSUFBUG9GLEVBQWdCQSxPQUFLdlgsRUFDckVvUyxFQUE0QyxRQUE3Qm9GLEVBQUsvYixFQUFPMlcsbUJBQWdDLElBQVBvRixFQUFnQkEsT0FBS3hYLEdBQ3pFLElBQUVZLEVBQUcsY0FBRXVULEVBQWEsWUFBRUwsRUFBVyxhQUFFTixFQUFjN0IsZ0JBQWlCOEYsR0FBNEJoYyxFQUNwR3NQLEVBQVFuSyxHQUFPNlcsRUFBeUJsTixFQUFNLGtCQUM5QyxNQUFNb0gsRUFBa0J5QyxFQUFnQnNELFNBQVNoYixLQUFLcEMsS0FBTW1kLEdBQzVEMU0sRUFBdUIsaUJBQVJuSyxFQUFrQjJKLEVBQU0sa0JBQ3ZDZ0wsRUFBd0JsQyxFQUFhOUksRUFBS2pRLE1BQzFDaWIsRUFBd0J6RixFQUFPdkYsRUFBS2pRLE1BQ3BDeVEsRUFBaUMsa0JBQWxCb0osRUFBNkI1SixFQUFNLGtCQUNsRFEsRUFBK0Isa0JBQWhCK0ksRUFBMkJ2SixFQUFNLGtCQUNoRGdMLEVBQXdCeEYsRUFBYXhGLEVBQUtqUSxNQUMxQ2liLEVBQXdCakMsRUFBVS9JLEVBQUtqUSxNQUN2Q2liLEVBQXdCaEksRUFBVWhELEVBQUtqUSxNQUN2Q2liLEVBQXdCMEIsRUFBa0IxTSxFQUFLalEsTUFDL0NpYixFQUF3QnBELEVBQVc1SCxFQUFLalEsTUFDeENpYixFQUF3Qm5ELEVBQWE3SCxFQUFLalEsTUFDMUMsTUFBTXlXLEVBQU8sSUFBSSxFQUFTLENBQ3RCblEsTUFDQTJKLE9BQ0F1RixRQUNBcUUsZ0JBQ0FkLGNBQ0FTLGNBQ0FSLFdBQ0F2RCxjQUNBeEMsV0FDQW9FLGtCQUNBUSxZQUNBQyxnQkFRSixPQU5Jb0IsR0FBZ0J6VyxNQUFNQyxRQUFRd1csS0FDOUJ6QyxFQUFLeUMsYUFBZUEsRUFBYVAsSUFBSXNELEdBQWE5YixPQUFPeUcsT0FBTyxHQUFJcVYsS0FFcEVVLElBQ0FsRyxFQUFLa0csaUJBQW1CQSxHQUVyQmxHLEVBT1gsa0NBQWtDeEcsRUFBTW9OLEVBQWlCN0QsR0FBYyxHQUNuRSxNQUFNbkMsRUFBa0IsSUFBSXlDLEVBQzVCekMsRUFBZ0JtRix5QkFBeUJhLEdBRXpDLE1BQU01RyxFQUFPLElBQUksRUFBUyxDQUN0Qm5RLElBQUsrVyxFQUFnQnpELFFBQ3JCM0osT0FDQW9ILGtCQUNBbUMsZ0JBSUosYUFETXJCLEVBQXFCMUIsR0FDcEJBOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JmLE1BQU02RyxFQUNGLGNBQ0lsYixLQUFLbUYsS0FBTyxPQUNabkYsS0FBS21iLFFBQVUsR0FFbkIscUJBQ0ksT0FBTyxFQUVYLFdBQVd2YyxFQUFLTixHQUNaMEIsS0FBS21iLFFBQVF2YyxHQUFPTixFQUV4QixXQUFXTSxHQUNQLE1BQU1OLEVBQVEwQixLQUFLbWIsUUFBUXZjLEdBQzNCLFlBQWlCMEUsSUFBVmhGLEVBQXNCLEtBQU9BLEVBRXhDLGNBQWNNLFVBQ0hvQixLQUFLbWIsUUFBUXZjLEdBRXhCLGFBQWF3YyxFQUFNQyxJQUluQixnQkFBZ0JELEVBQU1DLEtBSzFCSCxFQUFvQi9WLEtBQU8sT0FNM0IsTUFBTW1XLEVBQXNCSjs7Ozs7Ozs7Ozs7Ozs7OztHQWtCNUIsU0FBU0ssRUFBb0IzYyxFQUFLd1MsRUFBUXJELEdBQ3RDLE1BQU8sWUFBbUNuUCxLQUFPd1MsS0FBVXJELElBRS9ELE1BQU15TixHQUNGLFlBQVlDLEVBQWE1TixFQUFNNk4sR0FDM0IxYixLQUFLeWIsWUFBY0EsRUFDbkJ6YixLQUFLNk4sS0FBT0EsRUFDWjdOLEtBQUswYixRQUFVQSxFQUNmLE1BQU0sT0FBRTVMLEVBQU0sS0FBRWxTLEdBQVNvQyxLQUFLNk4sS0FDOUI3TixLQUFLMmIsWUFBY0osRUFBb0J2YixLQUFLMGIsUUFBUzVMLEVBQU9zQixPQUFReFQsR0FDcEVvQyxLQUFLNGIsbUJBQXFCTCxFQUFvQixjQUFzQ3pMLEVBQU9zQixPQUFReFQsR0FDbkdvQyxLQUFLNmIsa0JBQW9CaE8sRUFBS2lPLGdCQUFnQmpkLEtBQUtnUCxHQUNuRDdOLEtBQUt5YixZQUFZTSxhQUFhL2IsS0FBSzJiLFlBQWEzYixLQUFLNmIsbUJBRXpELGVBQWV4SCxHQUNYLE9BQU9yVSxLQUFLeWIsWUFBWU8sS0FBS2hjLEtBQUsyYixZQUFhdEgsRUFBS3VFLFVBRXhELHVCQUNJLE1BQU1xRCxRQUFhamMsS0FBS3liLFlBQVlTLEtBQUtsYyxLQUFLMmIsYUFDOUMsT0FBT00sRUFBTyxFQUFTRSxVQUFVbmMsS0FBSzZOLEtBQU1vTyxHQUFRLEtBRXhELG9CQUNJLE9BQU9qYyxLQUFLeWIsWUFBWVcsUUFBUXBjLEtBQUsyYixhQUV6Qyw2QkFDSSxPQUFPM2IsS0FBS3liLFlBQVlPLEtBQUtoYyxLQUFLNGIsbUJBQW9CNWIsS0FBS3liLFlBQVl0VyxNQUUzRSxxQkFBcUJrWCxHQUNqQixHQUFJcmMsS0FBS3liLGNBQWdCWSxFQUNyQixPQUVKLE1BQU03SCxRQUFvQnhVLEtBQUtzYyxpQkFHL0IsYUFGTXRjLEtBQUt1YyxvQkFDWHZjLEtBQUt5YixZQUFjWSxFQUNmN0gsRUFDT3hVLEtBQUt3YyxlQUFlaEksUUFEL0IsRUFJSixTQUNJeFUsS0FBS3liLFlBQVlnQixnQkFBZ0J6YyxLQUFLMmIsWUFBYTNiLEtBQUs2YixtQkFFNUQsb0JBQW9CaE8sRUFBTTZPLEVBQXNCaEIsRUFBVSxZQUN0RCxJQUFLZ0IsRUFBcUJsZCxPQUN0QixPQUFPLElBQUlnYyxHQUF1QjVNLEVBQWEwTSxHQUFzQnpOLEVBQU02TixHQUcvRSxNQUFNaUIsU0FBK0IvWSxRQUFRZ1osSUFBSUYsRUFBcUJuRyxJQUFJekYsTUFBTzJLLElBQzdFLFNBQVVBLEVBQVlvQixlQUNsQixPQUFPcEIsTUFHVnhFLE9BQU93RSxHQUFlQSxHQUUzQixJQUFJcUIsRUFBc0JILEVBQXNCLElBQzVDL04sRUFBYTBNLEdBQ2pCLE1BQU0xYyxFQUFNMmMsRUFBb0JHLEVBQVM3TixFQUFLaUMsT0FBT3NCLE9BQVF2RCxFQUFLalEsTUFHbEUsSUFBSW1mLEVBQWdCLEtBSXBCLElBQUssTUFBTXRCLEtBQWVpQixFQUN0QixJQUNJLE1BQU1ULFFBQWFSLEVBQVlTLEtBQUt0ZCxHQUNwQyxHQUFJcWQsRUFBTSxDQUNOLE1BQU01SCxFQUFPLEVBQVM4SCxVQUFVdE8sRUFBTW9PLEdBQ2xDUixJQUFnQnFCLElBQ2hCQyxFQUFnQjFJLEdBRXBCeUksRUFBc0JyQixFQUN0QixPQUdSLE1BQU94TSxJQUlYLE1BQU0rTixFQUFxQkwsRUFBc0IxRixPQUFPOVgsR0FBS0EsRUFBRThkLHVCQUUvRCxPQUFLSCxFQUFvQkcsdUJBQ3BCRCxFQUFtQnhkLFFBR3hCc2QsRUFBc0JFLEVBQW1CLEdBQ3JDRCxTQUdNRCxFQUFvQmQsS0FBS3BkLEVBQUttZSxFQUFjbkUsZ0JBSWhEaFYsUUFBUWdaLElBQUlGLEVBQXFCbkcsSUFBSXpGLE1BQU8ySyxJQUM5QyxHQUFJQSxJQUFnQnFCLEVBQ2hCLFVBQ1VyQixFQUFZVyxRQUFReGQsR0FFOUIsTUFBT3FRLFFBR1IsSUFBSXVNLEdBQXVCc0IsRUFBcUJqUCxFQUFNNk4sSUFsQmxELElBQUlGLEdBQXVCc0IsRUFBcUJqUCxFQUFNNk47Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q3pFLFNBQVN3QixHQUFnQnZXLEdBQ3JCLE1BQU1ILEVBQUtHLEVBQVU4TCxjQUNyQixHQUFJak0sRUFBR0ksU0FBUyxXQUFhSixFQUFHSSxTQUFTLFNBQVdKLEVBQUdJLFNBQVMsVUFDNUQsTUFBTyxRQUVOLEdBQUl1VyxHQUFZM1csR0FFakIsTUFBTyxXQUVOLEdBQUlBLEVBQUdJLFNBQVMsU0FBV0osRUFBR0ksU0FBUyxZQUN4QyxNQUFPLEtBRU4sR0FBSUosRUFBR0ksU0FBUyxTQUNqQixNQUFPLE9BRU4sR0FBSXdXLEdBQVc1VyxHQUNoQixNQUFPLFVBRU4sR0FBSUEsRUFBR0ksU0FBUyxTQUNqQixNQUFPLE9BRU4sR0FBSXlXLEdBQWM3VyxHQUVuQixNQUFPLGFBRU4sR0FBSThXLEdBQVM5VyxHQUVkLE1BQU8sUUFFTixHQUFJK1csR0FBVS9XLEdBQ2YsTUFBTyxTQUVOLElBQUtBLEVBQUdJLFNBQVMsWUFBYzRXLEdBQWFoWCxNQUM1Q0EsRUFBR0ksU0FBUyxTQUNiLE1BQU8sU0FFTixHQUFJNlcsR0FBV2pYLEdBRWhCLE1BQU8sVUFFTixDQUVELE1BQU1rWCxFQUFLLGtDQUNMQyxFQUFVaFgsRUFBVWlYLE1BQU1GLEdBQ2hDLEdBQTJFLEtBQXRFQyxhQUF5QyxFQUFTQSxFQUFRbmUsUUFDM0QsT0FBT21lLEVBQVEsR0FHdkIsTUFBTyxRQUVYLFNBQVNQLEdBQVc1VyxFQUFLLGVBQ3JCLE1BQU8sYUFBYWhCLEtBQUtnQixHQUU3QixTQUFTK1csR0FBVTVXLEVBQVksZUFDM0IsTUFBTUgsRUFBS0csRUFBVThMLGNBQ3JCLE9BQVFqTSxFQUFHSSxTQUFTLGFBQ2ZKLEVBQUdJLFNBQVMsYUFDWkosRUFBR0ksU0FBUyxZQUNaSixFQUFHSSxTQUFTLFdBRXJCLFNBQVM0VyxHQUFhaFgsRUFBSyxlQUN2QixNQUFPLFdBQVdoQixLQUFLZ0IsR0FFM0IsU0FBUzJXLEdBQVkzVyxFQUFLLGVBQ3RCLE1BQU8sWUFBWWhCLEtBQUtnQixHQUU1QixTQUFTaVgsR0FBV2pYLEVBQUssZUFDckIsTUFBTyxXQUFXaEIsS0FBS2dCLEdBRTNCLFNBQVM2VyxHQUFjN1csRUFBSyxlQUN4QixNQUFPLGNBQWNoQixLQUFLZ0IsR0FFOUIsU0FBUzhXLEdBQVM5VyxFQUFLLGVBQ25CLE1BQU8sU0FBU2hCLEtBQUtnQixHQUV6QixTQUFTcVgsR0FBT3JYLEVBQUssZUFDakIsTUFBTyxvQkFBb0JoQixLQUFLZ0IsR0FhcEMsU0FBU3NYLEdBQWlCdFgsRUFBSyxlQUUzQixPQUFRcVgsR0FBT3JYLElBQ1hpWCxHQUFXalgsSUFDWDhXLEdBQVM5VyxJQUNUNlcsR0FBYzdXLElBQ2QsaUJBQWlCaEIsS0FBS2dCLElBQ3RCMlcsR0FBWTNXOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdDcEIsU0FBU3VYLEdBQWtCQyxFQUFnQkMsRUFBYSxJQUNwRCxJQUFJQyxFQUNKLE9BQVFGLEdBQ0osSUFBSyxVQUVERSxFQUFtQmhCLEdBQWdCLGVBQ25DLE1BQ0osSUFBSyxTQUlEZ0IsRUFBbUIsR0FBR2hCLEdBQWdCLGtCQUFZYyxJQUNsRCxNQUNKLFFBQ0lFLEVBQW1CRixFQUUzQixNQUFNRyxFQUFxQkYsRUFBV3plLE9BQ2hDeWUsRUFBVzVjLEtBQUssS0FDaEIsbUJBQ04sTUFBTyxHQUFHNmMsWUFBMkMsaUJBQWVDOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJ4RSxNQUFNLEdBQ0YsWUFBWUMsRUFBS3RPLEdBQ2I5UCxLQUFLb2UsSUFBTUEsRUFDWHBlLEtBQUs4UCxPQUFTQSxFQUNkOVAsS0FBS3dVLFlBQWMsS0FDbkJ4VSxLQUFLcWUsZUFBaUIsS0FDdEJyZSxLQUFLc2UsV0FBYTFhLFFBQVFGLFVBQzFCMUQsS0FBS3VlLHNCQUF3QixJQUFJLEdBQWF2ZSxNQUM5Q0EsS0FBS3dlLG9CQUFzQixJQUFJLEdBQWF4ZSxNQUM1Q0EsS0FBS3llLGFBQWUsS0FDcEJ6ZSxLQUFLMGUsMkJBQTRCLEVBR2pDMWUsS0FBSzRSLGtCQUFtQixFQUN4QjVSLEtBQUsyZSxnQkFBaUIsRUFDdEIzZSxLQUFLNGUsVUFBVyxFQUNoQjVlLEtBQUs2ZSx1QkFBeUIsS0FDOUI3ZSxLQUFLOGUsdUJBQXlCLEtBQzlCOWUsS0FBS29PLGNBQWdCcEIsRUFJckJoTixLQUFLK2UscUJBQWtCemIsRUFDdkJ0RCxLQUFLdVIsYUFBZSxLQUNwQnZSLEtBQUs2USxTQUFXLEtBQ2hCN1EsS0FBS2dmLFNBQVcsQ0FBRUMsbUNBQW1DLEdBQ3JEamYsS0FBS2llLFdBQWEsR0FDbEJqZSxLQUFLcEMsS0FBT3dnQixFQUFJeGdCLEtBQ2hCb0MsS0FBS2tmLGNBQWdCcFAsRUFBT3FQLGlCQUVoQywyQkFBMkJ6QyxFQUFzQjBDLEdBK0I3QyxPQTlCSUEsSUFDQXBmLEtBQUs4ZSx1QkFBeUJsUSxFQUFhd1EsSUFJL0NwZixLQUFLNmUsdUJBQXlCN2UsS0FBS3FmLE1BQU12TyxVQUNyQyxJQUFJN0IsRUFBSXVMLEVBQ1IsSUFBSXhhLEtBQUs0ZSxXQUdUNWUsS0FBS3NmLHlCQUEyQjlELEdBQXVCN2MsT0FBT3FCLEtBQU0wYyxJQUNoRTFjLEtBQUs0ZSxVQUFULENBS0EsR0FBMkMsUUFBdEMzUCxFQUFLalAsS0FBSzhlLDhCQUEyQyxJQUFQN1AsT0FBZ0IsRUFBU0EsRUFBR3NRLHVCQUUzRSxVQUNVdmYsS0FBSzhlLHVCQUF1QlUsWUFBWXhmLE1BRWxELE1BQU82QyxVQUVMN0MsS0FBS3lmLHNCQUFzQkwsR0FDakNwZixLQUFLK2UsaUJBQStDLFFBQTNCdkUsRUFBS3hhLEtBQUt3VSxtQkFBZ0MsSUFBUGdHLE9BQWdCLEVBQVNBLEVBQUd0VyxNQUFRLEtBQzVGbEUsS0FBSzRlLFdBR1Q1ZSxLQUFLMmUsZ0JBQWlCLE1BRW5CM2UsS0FBSzZlLHVCQUtoQix3QkFDSSxHQUFJN2UsS0FBSzRlLFNBQ0wsT0FFSixNQUFNdkssUUFBYXJVLEtBQUswZixvQkFBb0JwRCxpQkFDNUMsT0FBS3RjLEtBQUt3VSxhQUFnQkgsRUFLdEJyVSxLQUFLd1UsYUFBZUgsR0FBUXJVLEtBQUt3VSxZQUFZdFEsTUFBUW1RLEVBQUtuUSxLQUUxRGxFLEtBQUsyZixhQUFhNUYsUUFBUTFGLGNBR3BCclUsS0FBS3dVLFlBQVllLHlCQUlyQnZWLEtBQUs0ZixtQkFBbUJ2TCxRQWQ5QixFQWdCSiw0QkFBNEIrSyxHQUN4QixJQUFJblEsRUFFSixJQUFJNFEsUUFBb0I3ZixLQUFLMGYsb0JBQW9CcEQsaUJBQ2pELEdBQUk4QyxHQUF5QnBmLEtBQUs4UCxPQUFPZ1EsV0FBWSxPQUMzQzlmLEtBQUsrZixzQ0FDWCxNQUFNQyxFQUFtRCxRQUE1Qi9RLEVBQUtqUCxLQUFLeWUsb0JBQWlDLElBQVB4UCxPQUFnQixFQUFTQSxFQUFHc0wsaUJBQ3ZGMEYsRUFBb0JKLGFBQStDLEVBQVNBLEVBQVd0RixpQkFDdkYyRixRQUFlbGdCLEtBQUttZ0Isa0JBQWtCZixHQUt0Q1ksR0FBdUJBLElBQXdCQyxLQUNoREMsYUFBdUMsRUFBU0EsRUFBTzdMLFFBQ3hEd0wsRUFBYUssRUFBTzdMLE1BSTVCLE9BQUt3TCxFQUdBQSxFQUFXdEYsa0JBTWhCbE0sRUFBUXJPLEtBQUs4ZSx1QkFBd0I5ZSxLQUFNLHdCQUNyQ0EsS0FBSytmLHNDQUlQL2YsS0FBS3llLGNBQ0x6ZSxLQUFLeWUsYUFBYWxFLG1CQUFxQnNGLEVBQVd0RixpQkFDM0N2YSxLQUFLb2dCLHVCQUF1QlAsR0FFaEM3ZixLQUFLcWdCLCtCQUErQlIsSUFYaEM3ZixLQUFLcWdCLCtCQUErQlIsR0FOcEM3ZixLQUFLb2dCLHVCQUF1QixNQW1CM0Msd0JBQXdCRSxHQWdCcEIsSUFBSUosRUFBUyxLQUNiLElBR0lBLFFBQWVsZ0IsS0FBSzhlLHVCQUF1QnlCLG9CQUFvQnZnQixLQUFNc2dCLEdBQWtCLEdBRTNGLE1BQU96ZCxTQUdHN0MsS0FBS3dnQixpQkFBaUIsTUFFaEMsT0FBT04sRUFFWCxxQ0FBcUM3TCxHQUNqQyxVQUNVMEIsRUFBcUIxQixHQUUvQixNQUFPeFIsR0FDSCxHQUFlLGdDQUFYQSxFQUFFbUUsS0FHRixPQUFPaEgsS0FBS29nQix1QkFBdUIsTUFHM0MsT0FBT3BnQixLQUFLb2dCLHVCQUF1Qi9MLEdBRXZDLG9CQUNJclUsS0FBS3VSLGFBcG1EYixXQUNJLEdBQXlCLG9CQUFkbE0sVUFDUCxPQUFPLEtBRVgsTUFBTW9iLEVBQW9CcGIsVUFDMUIsT0FFQ29iLEVBQWtCQyxXQUFhRCxFQUFrQkMsVUFBVSxJQUd4REQsRUFBa0JFLFVBRWxCLEtBd2xEb0JDLEdBRXhCLGdCQUNJNWdCLEtBQUs0ZSxVQUFXLEVBRXBCLHdCQUF3QmlDLEdBR3BCLE1BQU14TSxFQUFPd00sRUFDUCxZQUFtQkEsR0FDbkIsS0FJTixPQUhJeE0sR0FDQWhHLEVBQVFnRyxFQUFLeEcsS0FBS2lDLE9BQU9zQixTQUFXcFIsS0FBSzhQLE9BQU9zQixPQUFRcFIsS0FBTSxzQkFFM0RBLEtBQUs0ZixtQkFBbUJ2TCxHQUFRQSxFQUFLMkYsT0FBT2hhLE9BRXZELHlCQUF5QnFVLEdBQ3JCLElBQUlyVSxLQUFLNGUsU0FNVCxPQUhJdkssR0FDQWhHLEVBQVFyTyxLQUFLNlEsV0FBYXdELEVBQUt4RCxTQUFVN1EsS0FBTSxzQkFFNUNBLEtBQUtxZixNQUFNdk8sZ0JBQ1I5USxLQUFLb2dCLHVCQUF1Qi9MLEdBQ2xDclUsS0FBSzhnQix3QkFHYixnQkFLSSxPQUhJOWdCLEtBQUsrZ0IsNEJBQThCL2dCLEtBQUs4ZSwrQkFDbEM5ZSxLQUFLd2dCLGlCQUFpQixNQUV6QnhnQixLQUFLNGYsbUJBQW1CLE1BRW5DLGVBQWVuRSxHQUNYLE9BQU96YixLQUFLcWYsTUFBTXZPLGdCQUNSOVEsS0FBSzBmLG9CQUFvQnNCLGVBQWVwUyxFQUFhNk0sTUFHbkUsa0JBQ0ksT0FBT3piLEtBQUswZixvQkFBb0JqRSxZQUFZdFcsS0FFaEQsZ0JBQWdCMkksR0FDWjlOLEtBQUtvTyxjQUFnQixJQUFJLElBQWEsT0FBUSxXQUFZTixLQUU5RCxtQkFBbUIvQyxFQUFnQmhJLEVBQU9rZSxHQUN0QyxPQUFPamhCLEtBQUtraEIsc0JBQXNCbGhCLEtBQUt1ZSxzQkFBdUJ4VCxFQUFnQmhJLEVBQU9rZSxHQUV6RixpQkFBaUJsVyxFQUFnQmhJLEVBQU9rZSxHQUNwQyxPQUFPamhCLEtBQUtraEIsc0JBQXNCbGhCLEtBQUt3ZSxvQkFBcUJ6VCxFQUFnQmhJLEVBQU9rZSxHQUV2RixTQUNJLElBQUloUyxFQUNKLE1BQU8sQ0FDSG1DLE9BQVFwUixLQUFLOFAsT0FBT3NCLE9BQ3BCME8sV0FBWTlmLEtBQUs4UCxPQUFPZ1EsV0FDeEIvUixRQUFTL04sS0FBS3BDLEtBQ2Q0VyxZQUEwQyxRQUE1QnZGLEVBQUtqUCxLQUFLMmYsb0JBQWlDLElBQVAxUSxPQUFnQixFQUFTQSxFQUFHMkosVUFHdEYsdUJBQXVCdkUsRUFBTStLLEdBQ3pCLE1BQU0rQixRQUF3Qm5oQixLQUFLK2Ysb0NBQW9DWCxHQUN2RSxPQUFnQixPQUFUL0ssRUFDRDhNLEVBQWdCNUUsb0JBQ2hCNEUsRUFBZ0IzRSxlQUFlbkksR0FFekMsMENBQTBDK0ssR0FDdEMsSUFBS3BmLEtBQUsrZ0IsMkJBQTRCLENBQ2xDLE1BQU1LLEVBQVloQyxHQUF5QnhRLEVBQWF3USxJQUNwRHBmLEtBQUs4ZSx1QkFDVHpRLEVBQVErUyxFQUFVcGhCLEtBQU0sa0JBQ3hCQSxLQUFLK2dCLGlDQUFtQ3ZGLEdBQXVCN2MsT0FBT3FCLEtBQU0sQ0FBQzRPLEVBQWF3UyxFQUFTQyx1QkFBd0IsZ0JBQzNIcmhCLEtBQUt5ZSxtQkFDS3plLEtBQUsrZ0IsMkJBQTJCekUsaUJBRTlDLE9BQU90YyxLQUFLK2dCLDJCQUVoQix5QkFBeUI1YSxHQUNyQixJQUFJOEksRUFBSXVMLEVBTVIsT0FISXhhLEtBQUsyZSxzQkFDQzNlLEtBQUtxZixNQUFNdk8sY0FFYSxRQUE1QjdCLEVBQUtqUCxLQUFLMmYsb0JBQWlDLElBQVAxUSxPQUFnQixFQUFTQSxFQUFHc0wsb0JBQXNCcFUsRUFDakZuRyxLQUFLMmYsY0FFa0IsUUFBNUJuRixFQUFLeGEsS0FBS3llLG9CQUFpQyxJQUFQakUsT0FBZ0IsRUFBU0EsRUFBR0Qsb0JBQXNCcFUsRUFDakZuRyxLQUFLeWUsYUFFVCxLQUVYLDRCQUE0QnBLLEdBQ3hCLEdBQUlBLElBQVNyVSxLQUFLd1UsWUFDZCxPQUFPeFUsS0FBS3FmLE1BQU12TyxTQUFZOVEsS0FBS29nQix1QkFBdUIvTCxJQUlsRSwwQkFBMEJBLEdBQ2xCQSxJQUFTclUsS0FBS3dVLGFBQ2R4VSxLQUFLOGdCLHNCQUdiLE9BQ0ksTUFBTyxHQUFHOWdCLEtBQUs4UCxPQUFPZ1EsY0FBYzlmLEtBQUs4UCxPQUFPc0IsVUFBVXBSLEtBQUtwQyxPQUVuRSx5QkFDSW9DLEtBQUswZSwyQkFBNEIsRUFDN0IxZSxLQUFLd1UsYUFDTHhVLEtBQUsyZixhQUFhMkIseUJBRzFCLHdCQUNJdGhCLEtBQUswZSwyQkFBNEIsRUFDN0IxZSxLQUFLd1UsYUFDTHhVLEtBQUsyZixhQUFhNEIsd0JBSTFCLG1CQUNJLE9BQU92aEIsS0FBS3dVLFlBRWhCLHNCQUNJLElBQUl2RixFQUFJdUwsRUFDUixJQUFLeGEsS0FBSzJlLGVBQ04sT0FFSjNlLEtBQUt3ZSxvQkFBb0I1VCxLQUFLNUssS0FBS3dVLGFBQ25DLE1BQU1nTixFQUE0RixRQUE5RWhILEVBQWlDLFFBQTNCdkwsRUFBS2pQLEtBQUt3VSxtQkFBZ0MsSUFBUHZGLE9BQWdCLEVBQVNBLEVBQUcvSyxXQUF3QixJQUFQc1csRUFBZ0JBLEVBQUssS0FDM0h4YSxLQUFLK2Usa0JBQW9CeUMsSUFDekJ4aEIsS0FBSytlLGdCQUFrQnlDLEVBQ3ZCeGhCLEtBQUt1ZSxzQkFBc0IzVCxLQUFLNUssS0FBS3dVLGNBRzdDLHNCQUFzQmlOLEVBQWMxVyxFQUFnQmhJLEVBQU9rZSxHQUN2RCxHQUFJamhCLEtBQUs0ZSxTQUNMLE1BQU8sT0FFWCxNQUFNOEMsRUFBK0IsbUJBQW5CM1csRUFDWkEsRUFDQUEsRUFBZUgsS0FBSy9MLEtBQUtrTSxHQUN6QnBILEVBQVUzRCxLQUFLMmUsZUFDZi9hLFFBQVFGLFVBQ1IxRCxLQUFLNmUsdUJBS1gsT0FKQXhRLEVBQVExSyxFQUFTM0QsS0FBTSxrQkFHdkIyRCxFQUFROEcsS0FBSyxJQUFNaVgsRUFBRzFoQixLQUFLd1UsY0FDRyxtQkFBbkJ6SixFQUNBMFcsRUFBYUUsWUFBWTVXLEVBQWdCaEksRUFBT2tlLEdBR2hEUSxFQUFhRSxZQUFZNVcsR0FReEMsNkJBQTZCc0osR0FDckJyVSxLQUFLd1UsYUFBZXhVLEtBQUt3VSxjQUFnQkgsSUFDekNyVSxLQUFLMmYsYUFBYTRCLHdCQUNkbE4sR0FBUXJVLEtBQUswZSwyQkFDYnJLLEVBQUtpTiwwQkFHYnRoQixLQUFLd1UsWUFBY0gsRUFDZkEsUUFDTXJVLEtBQUswZixvQkFBb0JsRCxlQUFlbkksU0FHeENyVSxLQUFLMGYsb0JBQW9CbkQsb0JBR3ZDLE1BQU1xRixHQUlGLE9BREE1aEIsS0FBS3NlLFdBQWF0ZSxLQUFLc2UsV0FBVzdULEtBQUttWCxFQUFRQSxHQUN4QzVoQixLQUFLc2UsV0FFaEIsMEJBRUksT0FEQWpRLEVBQVFyTyxLQUFLc2YsbUJBQW9CdGYsS0FBTSxrQkFDaENBLEtBQUtzZixtQkFFaEIsY0FBY3VDLEdBQ0xBLElBQWE3aEIsS0FBS2llLFdBQVdyWCxTQUFTaWIsS0FHM0M3aEIsS0FBS2llLFdBQVc3YyxLQUFLeWdCLEdBR3JCN2hCLEtBQUtpZSxXQUFXNkQsT0FDaEI5aEIsS0FBS2tmLGNBQWdCbkIsR0FBa0IvZCxLQUFLOFAsT0FBT2tPLGVBQWdCaGUsS0FBSytoQixtQkFFNUUsaUJBQ0ksT0FBTy9oQixLQUFLaWUsV0FFaEIsOEJBRUksTUFBTTVNLEVBQVUsQ0FDWixtQkFBNkNyUixLQUFLa2YsZUFLdEQsT0FISWxmLEtBQUtvZSxJQUFJNEQsUUFBUUMsUUFDakI1USxFQUFRLG9CQUE2Q3JSLEtBQUtvZSxJQUFJNEQsUUFBUUMsT0FFbkU1USxHQVNmLFNBQVM2USxHQUFVclUsR0FDZixPQUFPLFlBQW1CQSxHQUc5QixNQUFNLEdBQ0YsWUFBWUEsR0FDUjdOLEtBQUs2TixLQUFPQSxFQUNaN04sS0FBSzJLLFNBQVcsS0FDaEIzSyxLQUFLMmhCLFlBQWMsWUFBZ0JoWCxHQUFhM0ssS0FBSzJLLFNBQVdBLEdBRXBFLFdBRUksT0FEQTBELEVBQVFyTyxLQUFLMkssU0FBVTNLLEtBQUs2TixLQUFNLGtCQUMzQjdOLEtBQUsySyxTQUFTQyxLQUFLL0wsS0FBS21CLEtBQUsySyxXQTBCNUMsU0FBU3dYLEdBQW9CdFUsRUFBTW5FLEVBQUtzWSxHQUNwQyxNQUFNSSxFQUFlRixHQUFVclUsR0FDL0JRLEVBQVErVCxFQUFheFEsaUJBQWtCd1EsRUFBYywwQkFDckQvVCxFQUFRLGVBQWU3SSxLQUFLa0UsR0FBTTBZLEVBQWMsMkJBQ2hELE1BQU1DLEtBQXFCTCxhQUF5QyxFQUFTQSxFQUFRSyxpQkFDL0UvUyxFQUFXZ1QsR0FBZ0I1WSxJQUMzQixLQUFFbUosRUFBSSxLQUFFMFAsR0FtQmxCLFNBQTRCN1ksR0FDeEIsTUFBTTRGLEVBQVdnVCxHQUFnQjVZLEdBQzNCOFksRUFBWSxtQkFBbUJDLEtBQUsvWSxFQUFJZ1osT0FBT3BULEVBQVM5UCxTQUM5RCxJQUFLZ2pCLEVBQ0QsTUFBTyxDQUFFM1AsS0FBTSxHQUFJMFAsS0FBTSxNQUU3QixNQUFNSSxFQUFjSCxFQUFVLEdBQUdqWixNQUFNLEtBQUtxWixPQUFTLEdBQy9DQyxFQUFnQixxQkFBcUJKLEtBQUtFLEdBQ2hELEdBQUlFLEVBQWUsQ0FDZixNQUFNaFEsRUFBT2dRLEVBQWMsR0FDM0IsTUFBTyxDQUFFaFEsT0FBTTBQLEtBQU1PLEdBQVVILEVBQVlELE9BQU83UCxFQUFLclQsT0FBUyxLQUUvRCxDQUNELE1BQU9xVCxFQUFNMFAsR0FBUUksRUFBWXBaLE1BQU0sS0FDdkMsTUFBTyxDQUFFc0osT0FBTTBQLEtBQU1PLEdBQVVQLEtBakNaUSxDQUFtQnJaLEdBQ3BDc1osRUFBbUIsT0FBVFQsRUFBZ0IsR0FBSyxJQUFJQSxFQUV6Q0gsRUFBYXRTLE9BQU9FLFNBQVcsQ0FBRXRHLElBQUssR0FBRzRGLE1BQWF1RCxJQUFPbVEsTUFDN0RaLEVBQWFwRCxTQUFTQyxtQ0FBb0MsRUFDMURtRCxFQUFhL0QsZUFBaUJ0Z0IsT0FBT2tsQixPQUFPLENBQ3hDcFEsT0FDQTBQLE9BQ0FqVCxTQUFVQSxFQUFTNU0sUUFBUSxJQUFLLElBQ2hDc2YsUUFBU2prQixPQUFPa2xCLE9BQU8sQ0FBRVosc0JBRXhCQSxHQW1DVCxXQUNJLFNBQVNhLElBQ0wsTUFBTUMsRUFBS0MsU0FBU0MsY0FBYyxLQUM1QkMsRUFBTUgsRUFBR0ksTUFDZkosRUFBR0ssVUFDQyxvRUFDSkYsRUFBSUcsU0FBVyxRQUNmSCxFQUFJSSxNQUFRLE9BQ1pKLEVBQUlLLGdCQUFrQixVQUN0QkwsRUFBSU0sT0FBUyxxQkFDYk4sRUFBSU8sTUFBUSxVQUNaUCxFQUFJUSxPQUFTLE1BQ2JSLEVBQUlTLEtBQU8sTUFDWFQsRUFBSVUsT0FBUyxNQUNiVixFQUFJVyxPQUFTLFFBQ2JYLEVBQUlZLFVBQVksU0FDaEJmLEVBQUdnQixVQUFVQyxJQUFJLDZCQUNqQmhCLFNBQVNsUyxLQUFLbVQsWUFBWWxCLEdBRVAsb0JBQVpyZ0IsU0FBbUQsbUJBQWpCQSxRQUFRd2hCLE1BQ2pEeGhCLFFBQVF3aEIsS0FBSyxnSUFJSyxvQkFBWC9lLFFBQ2Esb0JBQWI2ZCxXQUNxQixZQUF4QkEsU0FBU21CLFdBQ1RoZixPQUFPaWYsaUJBQWlCLG1CQUFvQnRCLEdBRzVDQTs7Ozs7Ozs7Ozs7Ozs7OztHQWhFSnVCLEdBR1IsU0FBU25DLEdBQWdCNVksR0FDckIsTUFBTWdiLEVBQWNoYixFQUFJcEQsUUFBUSxLQUNoQyxPQUFPb2UsRUFBYyxFQUFJLEdBQUtoYixFQUFJZ1osT0FBTyxFQUFHZ0MsRUFBYyxHQW1COUQsU0FBUzVCLEdBQVVFLEdBQ2YsSUFBS0EsRUFDRCxPQUFPLEtBRVgsTUFBTVQsRUFBTzdPLE9BQU9zUCxHQUNwQixPQUFJclAsTUFBTTRPLEdBQ0MsS0FFSkEsRUE2RFgsTUFBTW9DLEdBRUYsWUFPQW5PLEVBU0FvTyxHQUNJNWtCLEtBQUt3VyxXQUFhQSxFQUNsQnhXLEtBQUs0a0IsYUFBZUEsRUFPeEIsU0FDSSxPQUFPclcsRUFBVSxtQkFHckIsb0JBQW9Cc1csR0FDaEIsT0FBT3RXLEVBQVUsbUJBR3JCLGVBQWVzVyxFQUFPQyxHQUNsQixPQUFPdlcsRUFBVSxtQkFHckIsNkJBQTZCc1csR0FDekIsT0FBT3RXLEVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQnpCdUMsZUFBZWlVLEdBQWNsWCxFQUFNK0MsR0FDL0IsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLDZCQUFtRDhDLEVBQW1COUMsRUFBTStDLElBRW5JRSxlQUFla1UsR0FBb0JuWCxFQUFNK0MsR0FDckMsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLHNCQUE4QytDLEdBeUJyR0UsZUFBZW1VLEdBQVlwWCxFQUFNK0MsR0FDN0IsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLDJCQUFnRDhDLEVBQW1COUMsRUFBTStDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdFaEksTUFBTXNVLFdBQTRCUCxHQUU5QixZQUVBUSxFQUVBQyxFQUFXUixFQUVYUyxFQUFZLE1BQ1JsZSxNQUFNLFdBQTJCeWQsR0FDakM1a0IsS0FBS21sQixPQUFTQSxFQUNkbmxCLEtBQUtvbEIsVUFBWUEsRUFDakJwbEIsS0FBS3FsQixVQUFZQSxFQUdyQiw2QkFBNkJqUyxFQUFPa1MsR0FDaEMsT0FBTyxJQUFJSixHQUFvQjlSLEVBQU9rUyxFQUFVLFlBR3BELHlCQUF5QmxTLEVBQU9tUyxFQUFTMVUsRUFBVyxNQUNoRCxPQUFPLElBQUlxVSxHQUFvQjlSLEVBQU9tUyxFQUFTLFlBQThCMVUsR0FHakYsU0FDSSxNQUFPLENBQ0h1QyxNQUFPcFQsS0FBS21sQixPQUNaRyxTQUFVdGxCLEtBQUtvbEIsVUFDZlIsYUFBYzVrQixLQUFLNGtCLGFBQ25CL1QsU0FBVTdRLEtBQUtxbEIsV0FXdkIsZ0JBQWdCblQsR0FDWixNQUFNaEssRUFBc0IsaUJBQVRnSyxFQUFvQmxOLEtBQUttUCxNQUFNakMsR0FBUUEsRUFDMUQsSUFBS2hLLGFBQWlDLEVBQVNBLEVBQUlrTCxTQUFXbEwsYUFBaUMsRUFBU0EsRUFBSW9kLFVBQVcsQ0FDbkgsR0FBeUIsYUFBckJwZCxFQUFJMGMsYUFDSixPQUFPNWtCLEtBQUt3bEIsc0JBQXNCdGQsRUFBSWtMLE1BQU9sTCxFQUFJb2QsVUFFaEQsR0FBeUIsY0FBckJwZCxFQUFJMGMsYUFDVCxPQUFPNWtCLEtBQUt5bEIsa0JBQWtCdmQsRUFBSWtMLE1BQU9sTCxFQUFJb2QsU0FBVXBkLEVBQUkySSxVQUduRSxPQUFPLEtBR1gsMEJBQTBCaEQsR0FDdEIsT0FBUTdOLEtBQUs0a0IsY0FDVCxJQUFLOzs7Ozs7Ozs7Ozs7Ozs7OztBQUNELE9BM0hoQjlULGVBQWtDakQsRUFBTStDLEdBQ3BDLE9BQU84QixFQUFzQjdFLEVBQU0sT0FBbUIsa0NBQStEOEMsRUFBbUI5QyxFQUFNK0MsSUEwSDNIOFUsQ0FBbUI3WCxFQUFNLENBQzVCOFgsbUJBQW1CLEVBQ25CdlMsTUFBT3BULEtBQUttbEIsT0FDWkcsU0FBVXRsQixLQUFLb2xCLFlBRXZCLElBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0QsT0E5RmhCdFUsZUFBcUNqRCxFQUFNK0MsR0FDdkMsT0FBTzhCLEVBQXNCN0UsRUFBTSxPQUFtQixtQ0FBa0U4QyxFQUFtQjlDLEVBQU0rQyxJQTZGOUhnVixDQUFzQi9YLEVBQU0sQ0FDL0J1RixNQUFPcFQsS0FBS21sQixPQUNaSSxRQUFTdmxCLEtBQUtvbEIsWUFFdEIsUUFDSTdYLEVBQU1NLEVBQU0sbUJBSXhCLHFCQUFxQkEsRUFBTW1JLEdBQ3ZCLE9BQVFoVyxLQUFLNGtCLGNBQ1QsSUFBSyxXQUNELE9BQU9JLEdBQW9CblgsRUFBTSxDQUM3Qm1JLFVBQ0EyUCxtQkFBbUIsRUFDbkJ2UyxNQUFPcFQsS0FBS21sQixPQUNaRyxTQUFVdGxCLEtBQUtvbEIsWUFFdkIsSUFBSyxZQUNELE9BOUdoQnRVLGVBQTZDakQsRUFBTStDLEdBQy9DLE9BQU84QixFQUFzQjdFLEVBQU0sT0FBbUIsbUNBQWtFOEMsRUFBbUI5QyxFQUFNK0MsSUE2RzlIaVYsQ0FBOEJoWSxFQUFNLENBQ3ZDbUksVUFDQTVDLE1BQU9wVCxLQUFLbWxCLE9BQ1pJLFFBQVN2bEIsS0FBS29sQixZQUV0QixRQUNJN1gsRUFBTU0sRUFBTSxtQkFJeEIsNkJBQTZCQSxHQUN6QixPQUFPN04sS0FBSzhsQixvQkFBb0JqWTs7Ozs7Ozs7Ozs7Ozs7OztHQW9CeENpRCxlQUFlaVYsR0FBY2xZLEVBQU0rQyxHQUMvQixPQUFPOEIsRUFBc0I3RSxFQUFNLE9BQW1CLDZCQUFxRDhDLEVBQW1COUMsRUFBTStDOzs7Ozs7Ozs7Ozs7Ozs7O0dBNEJ4SSxNQUFNLFdBQXdCK1QsR0FDMUIsY0FDSXhkLFNBQVM2ZSxXQUNUaG1CLEtBQUtpbUIsYUFBZSxLQUd4QixtQkFBbUJoZCxHQUNmLE1BQU1pZCxFQUFPLElBQUksR0FBZ0JqZCxFQUFPdU4sV0FBWXZOLEVBQU8yYixjQXlCM0QsT0F4QkkzYixFQUFPK00sU0FBVy9NLEVBQU8yTyxhQUVyQjNPLEVBQU8rTSxVQUNQa1EsRUFBS2xRLFFBQVUvTSxFQUFPK00sU0FFdEIvTSxFQUFPMk8sY0FDUHNPLEVBQUt0TyxZQUFjM08sRUFBTzJPLGFBRzFCM08sRUFBT2tkLFFBQVVsZCxFQUFPZ2QsZUFDeEJDLEVBQUtDLE1BQVFsZCxFQUFPa2QsT0FFcEJsZCxFQUFPZ2QsZUFDUEMsRUFBS0QsYUFBZWhkLEVBQU9nZCxlQUcxQmhkLEVBQU9tZCxZQUFjbmQsRUFBT29kLGtCQUVqQ0gsRUFBS3RPLFlBQWMzTyxFQUFPbWQsV0FDMUJGLEVBQUtJLE9BQVNyZCxFQUFPb2Qsa0JBR3JCOVksRUFBTSxrQkFFSDJZLEVBR1gsU0FDSSxNQUFPLENBQ0hsUSxRQUFTaFcsS0FBS2dXLFFBQ2Q0QixZQUFhNVgsS0FBSzRYLFlBQ2xCME8sT0FBUXRtQixLQUFLc21CLE9BQ2JILE1BQU9ubUIsS0FBS21tQixNQUNaRixhQUFjam1CLEtBQUtpbUIsYUFDbkJ6UCxXQUFZeFcsS0FBS3dXLFdBQ2pCb08sYUFBYzVrQixLQUFLNGtCLGNBWTNCLGdCQUFnQjFTLEdBQ1osTUFBTWhLLEVBQXNCLGlCQUFUZ0ssRUFBb0JsTixLQUFLbVAsTUFBTWpDLEdBQVFBLEdBQ3BELFdBQUVzRSxFQUFVLGFBQUVvTyxHQUFpQjFjLEVBQUt1RixFQUFPN0IsRUFBTzFELEVBQUssQ0FBQyxhQUFjLGlCQUM1RSxJQUFLc08sSUFBZW9PLEVBQ2hCLE9BQU8sS0FFWCxNQUFNc0IsRUFBTyxJQUFJLEdBQWdCMVAsRUFBWW9PLEdBTTdDLE9BTEFzQixFQUFLbFEsUUFBVXZJLEVBQUt1SSxjQUFXMVMsRUFDL0I0aUIsRUFBS3RPLFlBQWNuSyxFQUFLbUssa0JBQWV0VSxFQUN2QzRpQixFQUFLSSxPQUFTN1ksRUFBSzZZLE9BQ25CSixFQUFLQyxNQUFRMVksRUFBSzBZLE1BQ2xCRCxFQUFLRCxhQUFleFksRUFBS3dZLGNBQWdCLEtBQ2xDQyxFQUdYLG9CQUFvQnJZLEdBRWhCLE9BQU9rWSxHQUFjbFksRUFETDdOLEtBQUt1bUIsZ0JBSXpCLGVBQWUxWSxFQUFNbUksR0FDakIsTUFBTXBGLEVBQVU1USxLQUFLdW1CLGVBRXJCLE9BREEzVixFQUFRb0YsUUFBVUEsRUFDWCtQLEdBQWNsWSxFQUFNK0MsR0FHL0IsNkJBQTZCL0MsR0FDekIsTUFBTStDLEVBQVU1USxLQUFLdW1CLGVBRXJCLE9BREEzVixFQUFRNFYsWUFBYSxFQUNkVCxHQUFjbFksRUFBTStDLEdBRS9CLGVBQ0ksTUFBTUEsRUFBVSxDQUNaNlYsV0FqR2MsbUJBa0dkZCxtQkFBbUIsR0FFdkIsR0FBSTNsQixLQUFLaW1CLGFBQ0xyVixFQUFRcVYsYUFBZWptQixLQUFLaW1CLGlCQUUzQixDQUNELE1BQU1TLEVBQVcsR0FDYjFtQixLQUFLZ1csVUFDTDBRLEVBQW1CLFNBQUkxbUIsS0FBS2dXLFNBRTVCaFcsS0FBSzRYLGNBQ0w4TyxFQUF1QixhQUFJMW1CLEtBQUs0WCxhQUVoQzVYLEtBQUtzbUIsU0FDTEksRUFBNkIsbUJBQUkxbUIsS0FBS3NtQixRQUUxQ0ksRUFBcUIsV0FBSTFtQixLQUFLd1csV0FDMUJ4VyxLQUFLbW1CLFFBQVVubUIsS0FBS2ltQixlQUNwQlMsRUFBZ0IsTUFBSTFtQixLQUFLbW1CLE9BRTdCdlYsRUFBUThWLFNBQVcsWUFBWUEsR0FFbkMsT0FBTzlWOzs7Ozs7Ozs7Ozs7Ozs7O0dBaUNmLE1BQU0rVixHQUE4QyxDQUNoRCxlQUF5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QjdDLE1BQU1DLFdBQTRCakMsR0FDOUIsWUFBWTFiLEdBQ1I5QixNQUFNLFFBQXFCLFNBQzNCbkgsS0FBS2lKLE9BQVNBLEVBR2xCLHlCQUF5QjRkLEVBQWdCQyxHQUNyQyxPQUFPLElBQUlGLEdBQW9CLENBQUVDLGlCQUFnQkMscUJBR3JELDBCQUEwQnpULEVBQWEwVCxHQUNuQyxPQUFPLElBQUlILEdBQW9CLENBQUV2VCxjQUFhMFQsbUJBR2xELG9CQUFvQmxaLEdBQ2hCLE9BdERSaUQsZUFBdUNqRCxFQUFNK0MsR0FDekMsT0FBTzhCLEVBQXNCN0UsRUFBTSxPQUFtQixxQ0FBc0U4QyxFQUFtQjlDLEVBQU0rQyxJQXFEMUlvVyxDQUF3Qm5aLEVBQU03TixLQUFLaW5CLDRCQUc5QyxlQUFlcFosRUFBTW1JLEdBQ2pCLE9BdkRSbEYsZUFBcUNqRCxFQUFNK0MsR0FDdkMsTUFBTW1CLFFBQWlCVyxFQUFzQjdFLEVBQU0sT0FBbUIscUNBQXNFOEMsRUFBbUI5QyxFQUFNK0MsSUFDckssR0FBSW1CLEVBQVNnVixlQUNULE1BQU01VSxFQUFpQnRFLEVBQU0sMkNBQW9Fa0UsR0FFckcsT0FBT0EsRUFrREltVixDQUFzQnJaLEVBQU05UCxPQUFPeUcsT0FBTyxDQUFFd1IsV0FBV2hXLEtBQUtpbkIsNkJBR3ZFLDZCQUE2QnBaLEdBQ3pCLE9BakRSaUQsZUFBNENqRCxFQUFNK0MsR0FFOUMsT0FBTzhCLEVBQXNCN0UsRUFBTSxPQUFtQixxQ0FBc0U4QyxFQUFtQjlDLEVBRDVIOVAsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJb00sR0FBVSxDQUFFdVcsVUFBVyxZQUN3RlIsSUErQ3ZKUyxDQUE2QnZaLEVBQU03TixLQUFLaW5CLDRCQUduRCwyQkFDSSxNQUFNLGVBQUVGLEVBQWMsWUFBRTFULEVBQVcsZUFBRXdULEVBQWMsaUJBQUVDLEdBQXFCOW1CLEtBQUtpSixPQUMvRSxPQUFJOGQsR0FBa0IxVCxFQUNYLENBQUUwVCxpQkFBZ0IxVCxlQUV0QixDQUNIZ1UsWUFBYVIsRUFDYjdmLEtBQU04ZixHQUlkLFNBQ0ksTUFBTTVlLEVBQU0sQ0FDUnNPLFdBQVl4VyxLQUFLd1csWUFjckIsT0FaSXhXLEtBQUtpSixPQUFPb0ssY0FDWm5MLEVBQUltTCxZQUFjclQsS0FBS2lKLE9BQU9vSyxhQUU5QnJULEtBQUtpSixPQUFPOGQsaUJBQ1o3ZSxFQUFJNmUsZUFBaUIvbUIsS0FBS2lKLE9BQU84ZCxnQkFFakMvbUIsS0FBS2lKLE9BQU82ZCxtQkFDWjVlLEVBQUk0ZSxpQkFBbUI5bUIsS0FBS2lKLE9BQU82ZCxrQkFFbkM5bUIsS0FBS2lKLE9BQU80ZCxpQkFDWjNlLEVBQUkyZSxlQUFpQjdtQixLQUFLaUosT0FBTzRkLGdCQUU5QjNlLEVBR1gsZ0JBQWdCZ0ssR0FDUSxpQkFBVEEsSUFDUEEsRUFBT2xOLEtBQUttUCxNQUFNakMsSUFFdEIsTUFBTSxlQUFFMlUsRUFBYyxpQkFBRUMsRUFBZ0IsWUFBRXpULEVBQVcsZUFBRTBULEdBQW1CN1UsRUFDMUUsT0FBSzRVLEdBQ0FELEdBQ0F4VCxHQUNBMFQsRUFHRSxJQUFJSCxHQUFvQixDQUMzQkMsaUJBQ0FDLG1CQUNBelQsY0FDQTBULG1CQU5POzs7Ozs7Ozs7Ozs7Ozs7O0dBMEVuQixNQUFNLEdBT0YsWUFBWU8sR0FDUixJQUFJclksRUFBSXVMLEVBQUlDLEVBQUlDLEVBQUlDLEVBQUlDLEVBQ3hCLE1BQU0yTSxFQUFlLFlBQWtCLFlBQW1CRCxJQUNwRGxXLEVBQXlELFFBQS9DbkMsRUFBS3NZLEVBQW1DLGNBQXNCLElBQVB0WSxFQUFnQkEsRUFBSyxLQUN0RmpJLEVBQXFELFFBQTdDd1QsRUFBSytNLEVBQWlDLGVBQXNCLElBQVAvTSxFQUFnQkEsRUFBSyxLQUNsRjJNLEVBdERkLFNBQW1CM29CLEdBQ2YsT0FBUUEsR0FDSixJQUFLLGVBQ0QsTUFBTyxnQkFDWCxJQUFLLGdCQUNELE1BQU8saUJBQ1gsSUFBSyxTQUNELE1BQU8sZUFDWCxJQUFLLGNBQ0QsTUFBTyxlQUNYLElBQUssdUJBQ0QsTUFBTywwQkFDWCxJQUFLLDZCQUNELE1BQU8sZ0NBQ1gsUUFDSSxPQUFPLE1BdUNPZ3BCLENBQXFELFFBQTFDL00sRUFBSzhNLEVBQThCLFlBQXNCLElBQVA5TSxFQUFnQkEsRUFBSyxNQUVwR3BNLEVBQVErQyxHQUFVcEssR0FBUW1nQixFQUFXLGtCQUNyQ25uQixLQUFLb1IsT0FBU0EsRUFDZHBSLEtBQUttbkIsVUFBWUEsRUFDakJubkIsS0FBS2dILEtBQU9BLEVBQ1poSCxLQUFLeW5CLFlBQXdFLFFBQXpEL00sRUFBSzZNLEVBQTZDLG1CQUFzQixJQUFQN00sRUFBZ0JBLEVBQUssS0FDMUcxYSxLQUFLdVIsYUFBMkUsUUFBM0RvSixFQUFLNE0sRUFBK0Msb0JBQXNCLElBQVA1TSxFQUFnQkEsRUFBSyxLQUM3RzNhLEtBQUs2USxTQUErRCxRQUFuRCtKLEVBQUsyTSxFQUF1QyxnQkFBc0IsSUFBUDNNLEVBQWdCQSxFQUFLLEtBV3JHLGlCQUFpQjhNLEdBQ2IsTUFBTUosRUFuRGQsU0FBdUI1ZCxHQUNuQixNQUFNZ2UsRUFBTyxZQUFrQixZQUFtQmhlLElBQVksS0FFeERpZSxFQUFpQkQsRUFDakIsWUFBa0IsWUFBbUJBLElBQXFCLGFBQzFELEtBRUFFLEVBQWMsWUFBa0IsWUFBbUJsZSxJQUFvQixhQUk3RSxPQUgwQmtlLEVBQ3BCLFlBQWtCLFlBQW1CQSxJQUFvQixLQUN6RCxPQUNzQkEsR0FBZUQsR0FBa0JELEdBQVFoZSxFQXdDOUNtZSxDQUFjSCxHQUNqQyxJQUNJLE9BQU8sSUFBSSxHQUFjSixHQUU3QixNQUFPclksR0FDSCxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztBQW1DbkIsTUFBTTZZLEdBQ0YsY0FJSTluQixLQUFLd1csV0FBYXNSLEdBQWtCQyxZQW9CeEMsa0JBQWtCM1UsRUFBT2tTLEdBQ3JCLE9BQU9KLEdBQW9CTSxzQkFBc0JwUyxFQUFPa1MsR0F3QjVELDBCQUEwQmxTLEVBQU80VSxHQUM3QixNQUFNQyxFQUFnQixHQUFjQyxVQUFVRixHQUU5QyxPQURBM1osRUFBUTRaLEVBQWUsa0JBQ2hCL0MsR0FBb0JPLGtCQUFrQnJTLEVBQU82VSxFQUFjamhCLEtBQU1paEIsRUFBY3BYLFdBTTlGaVgsR0FBa0JDLFlBQWMsV0FJaENELEdBQWtCSyw4QkFBZ0MsV0FJbERMLEdBQWtCTSwwQkFBNEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUI5QyxNQUFNQyxHQU1GLFlBQVk3UixHQUNSeFcsS0FBS3dXLFdBQWFBLEVBRWxCeFcsS0FBS3NvQixvQkFBc0IsS0FFM0J0b0IsS0FBS3VvQixpQkFBbUIsR0FPNUIsbUJBQW1CaFgsR0FDZnZSLEtBQUtzb0Isb0JBQXNCL1csRUFZL0Isb0JBQW9CaVgsR0FFaEIsT0FEQXhvQixLQUFLdW9CLGlCQUFtQkMsRUFDakJ4b0IsS0FLWCxzQkFDSSxPQUFPQSxLQUFLdW9COzs7Ozs7Ozs7Ozs7Ozs7O0dBMEJwQixNQUFNRSxXQUEwQkosR0FDNUIsY0FDSWxoQixTQUFTNmUsV0FFVGhtQixLQUFLMG9CLE9BQVMsR0FPbEIsU0FBU0MsR0FLTCxPQUhLM29CLEtBQUswb0IsT0FBTzloQixTQUFTK2hCLElBQ3RCM29CLEtBQUswb0IsT0FBT3RuQixLQUFLdW5CLEdBRWQzb0IsS0FLWCxZQUNJLE1BQU8sSUFBSUEsS0FBSzBvQixTQTJDeEIsTUFBTUUsV0FBc0JILEdBS3hCLDBCQUEwQnZXLEdBQ3RCLE1BQU1oSyxFQUFzQixpQkFBVGdLLEVBQW9CbE4sS0FBS21QLE1BQU1qQyxHQUFRQSxFQUUxRCxPQURBN0QsRUFBUSxlQUFnQm5HLEdBQU8saUJBQWtCQSxFQUFLLGtCQUMvQyxHQUFnQjJnQixZQUFZM2dCLEdBdUJ2QyxXQUFXZSxHQUNQLE9BQU9qSixLQUFLOG9CLFlBQVkvcUIsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJeUUsR0FBUyxDQUFFa2QsTUFBT2xkLEVBQU84ZixZQUdyRixZQUFZOWYsR0FHUixPQUZBb0YsRUFBUXBGLEVBQU8rTSxTQUFXL00sRUFBTzJPLFlBQWEsa0JBRXZDLEdBQWdCaVIsWUFBWTlxQixPQUFPeUcsT0FBT3pHLE9BQU95RyxPQUFPLEdBQUl5RSxHQUFTLENBQUV1TixXQUFZeFcsS0FBS3dXLFdBQVlvTyxhQUFjNWtCLEtBQUt3VyxjQU9sSSw0QkFBNEJ3UyxHQUN4QixPQUFPSixHQUFjSyxnQ0FBZ0NELEdBUXpELDJCQUEyQmptQixHQUN2QixPQUFPNmxCLEdBQWNLLGdDQUFpQ2xtQixFQUFNbUUsWUFBYyxJQUU5RSx3Q0FBeUNvTSxlQUFnQjRWLElBQ3JELElBQUtBLEVBQ0QsT0FBTyxLQUVYLE1BQU0sYUFBRUMsRUFBWSxpQkFBRUMsRUFBZ0IsaUJBQUUvQyxFQUFnQixhQUFFSixFQUFZLE1BQUVFLEVBQUssV0FBRTNQLEdBQWUwUyxFQUM5RixLQUFLRSxHQUNBL0MsR0FDQThDLEdBQ0FsRCxHQUNELE9BQU8sS0FFWCxJQUFLelAsRUFDRCxPQUFPLEtBRVgsSUFDSSxPQUFPLElBQUlvUyxHQUFjcFMsR0FBWXNTLFlBQVksQ0FDN0M5UyxRQUFTbVQsRUFDVHZSLFlBQWF3UixFQUNiakQsUUFDQUYsaUJBR1IsTUFBT3BqQixHQUNILE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RG5CLE1BQU13bUIsV0FBNkJaLEdBQy9CLGNBQ0l0aEIsTUFBTSxnQkFjVixrQkFBa0J5USxHQUNkLE9BQU8sR0FBZ0JpUixZQUFZLENBQy9CclMsV0FBWTZTLEdBQXFCdEIsWUFDakNuRCxhQUFjeUUsR0FBcUJDLHdCQUNuQzFSLGdCQVFSLDRCQUE0Qm9SLEdBQ3hCLE9BQU9LLEdBQXFCRSwyQkFBMkJQLEdBUTNELDJCQUEyQmptQixHQUN2QixPQUFPc21CLEdBQXFCRSwyQkFBNEJ4bUIsRUFBTW1FLFlBQWMsSUFFaEYsbUNBQW9Db00sZUFBZ0I0VixJQUNoRCxJQUFLQSxLQUFtQixxQkFBc0JBLEdBQzFDLE9BQU8sS0FFWCxJQUFLQSxFQUFjRSxpQkFDZixPQUFPLEtBRVgsSUFDSSxPQUFPQyxHQUFxQkcsV0FBV04sRUFBY0Usa0JBRXpELE1BQU9uYSxHQUNILE9BQU8sT0FLbkJvYSxHQUFxQkMsd0JBQTBCLGVBRS9DRCxHQUFxQnRCLFlBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkRuQyxNQUFNMEIsV0FBMkJoQixHQUM3QixjQUNJdGhCLE1BQU0sY0FDTm5ILEtBQUswcEIsU0FBUyxXQWVsQixrQkFBa0IxVCxFQUFTNEIsR0FDdkIsT0FBTyxHQUFnQmlSLFlBQVksQ0FDL0JyUyxXQUFZaVQsR0FBbUIxQixZQUMvQm5ELGFBQWM2RSxHQUFtQkUsc0JBQ2pDM1QsVUFDQTRCLGdCQVFSLDRCQUE0Qm9SLEdBQ3hCLE9BQU9TLEdBQW1CRiwyQkFBMkJQLEdBUXpELDJCQUEyQmptQixHQUN2QixPQUFPMG1CLEdBQW1CRiwyQkFBNEJ4bUIsRUFBTW1FLFlBQWMsSUFFOUUsbUNBQW9Db00sZUFBZ0I0VixJQUNoRCxJQUFLQSxFQUNELE9BQU8sS0FFWCxNQUFNLGFBQUVDLEVBQVksaUJBQUVDLEdBQXFCRixFQUMzQyxJQUFLQyxJQUFpQkMsRUFFbEIsT0FBTyxLQUVYLElBQ0ksT0FBT0ssR0FBbUJELFdBQVdMLEVBQWNDLEdBRXZELE1BQU9uYSxHQUNILE9BQU8sT0FLbkJ3YSxHQUFtQkUsc0JBQXdCLGFBRTNDRixHQUFtQjFCLFlBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNERqQyxNQUFNNkIsV0FBMkJuQixHQUM3QixjQUNJdGhCLE1BQU0sY0FPVixrQkFBa0J5USxHQUNkLE9BQU8sR0FBZ0JpUixZQUFZLENBQy9CclMsV0FBWW9ULEdBQW1CN0IsWUFDL0JuRCxhQUFjZ0YsR0FBbUJDLHNCQUNqQ2pTLGdCQVFSLDRCQUE0Qm9SLEdBQ3hCLE9BQU9ZLEdBQW1CTCwyQkFBMkJQLEdBUXpELDJCQUEyQmptQixHQUN2QixPQUFPNm1CLEdBQW1CTCwyQkFBNEJ4bUIsRUFBTW1FLFlBQWMsSUFFOUUsbUNBQW9Db00sZUFBZ0I0VixJQUNoRCxJQUFLQSxLQUFtQixxQkFBc0JBLEdBQzFDLE9BQU8sS0FFWCxJQUFLQSxFQUFjRSxpQkFDZixPQUFPLEtBRVgsSUFDSSxPQUFPUSxHQUFtQkosV0FBV04sRUFBY0Usa0JBRXZELE1BQU9uYSxHQUNILE9BQU8sT0FLbkIyYSxHQUFtQkMsc0JBQXdCLGFBRTNDRCxHQUFtQjdCLFlBQWMsYUFzQmpDLE1BQU0rQixXQUEyQm5GLEdBRTdCLFlBQVluTyxFQUFZeVAsR0FDcEI5ZSxNQUFNcVAsRUFBWUEsR0FDbEJ4VyxLQUFLaW1CLGFBQWVBLEVBR3hCLG9CQUFvQnBZLEdBRWhCLE9BQU9rWSxHQUFjbFksRUFETDdOLEtBQUt1bUIsZ0JBSXpCLGVBQWUxWSxFQUFNbUksR0FDakIsTUFBTXBGLEVBQVU1USxLQUFLdW1CLGVBRXJCLE9BREEzVixFQUFRb0YsUUFBVUEsRUFDWCtQLEdBQWNsWSxFQUFNK0MsR0FHL0IsNkJBQTZCL0MsR0FDekIsTUFBTStDLEVBQVU1USxLQUFLdW1CLGVBRXJCLE9BREEzVixFQUFRNFYsWUFBYSxFQUNkVCxHQUFjbFksRUFBTStDLEdBRy9CLFNBQ0ksTUFBTyxDQUNIZ1UsYUFBYzVrQixLQUFLNGtCLGFBQ25CcE8sV0FBWXhXLEtBQUt3VyxXQUNqQnlQLGFBQWNqbUIsS0FBS2ltQixjQVkzQixnQkFBZ0IvVCxHQUNaLE1BQU1oSyxFQUFzQixpQkFBVGdLLEVBQW9CbE4sS0FBS21QLE1BQU1qQyxHQUFRQSxHQUNwRCxXQUFFc0UsRUFBVSxhQUFFb08sRUFBWSxhQUFFcUIsR0FBaUIvZCxFQUNuRCxPQUFLc08sR0FDQW9PLEdBQ0FxQixHQUNEelAsSUFBZW9PLEVBR1osSUFBSWtGLEdBQW1CdFQsRUFBWXlQLEdBRi9CLEtBU2YsZUFBZXpQLEVBQVl5UCxHQUN2QixPQUFPLElBQUk2RCxHQUFtQnRULEVBQVl5UCxHQUU5QyxlQUNJLE1BQU8sQ0FDSFEsV0FqRVksbUJBa0VaZCxtQkFBbUIsRUFDbkJNLGFBQWNqbUIsS0FBS2ltQjs7Ozs7Ozs7Ozs7Ozs7OztHQTJCL0IsTUFBTThELFdBQXlCMUIsR0FLM0IsWUFBWTdSLEdBQ1JuSSxFQUFRbUksRUFBV3ZHLFdBWkUsU0FZZ0Msa0JBQ3JEOUksTUFBTXFQLEdBa0JWLDRCQUE0QndTLEdBQ3hCLE9BQU9lLEdBQWlCQywrQkFBK0JoQixHQVEzRCwyQkFBMkJqbUIsR0FDdkIsT0FBT2duQixHQUFpQkMsK0JBQWdDam5CLEVBQU1tRSxZQUFjLElBTWhGLDBCQUEwQmdMLEdBQ3RCLE1BQU1zWCxFQUFhTSxHQUFtQjlPLFNBQVM5SSxHQUUvQyxPQURBN0QsRUFBUW1iLEVBQVksa0JBQ2JBLEVBRVgsdUNBQXdDbFcsZUFBZ0I0VixJQUNwRCxJQUFLQSxFQUNELE9BQU8sS0FFWCxNQUFNLGFBQUVqRCxFQUFZLFdBQUV6UCxHQUFlMFMsRUFDckMsSUFBS2pELElBQWlCelAsRUFDbEIsT0FBTyxLQUVYLElBQ0ksT0FBT3NULEdBQW1CRyxRQUFRelQsRUFBWXlQLEdBRWxELE1BQU9wakIsR0FDSCxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBNERuQixNQUFNcW5CLFdBQTRCekIsR0FDOUIsY0FDSXRoQixNQUFNLGVBUVYsa0JBQWtCbkQsRUFBT3NpQixHQUNyQixPQUFPLEdBQWdCdUMsWUFBWSxDQUMvQnJTLFdBQVkwVCxHQUFvQm5DLFlBQ2hDbkQsYUFBY3NGLEdBQW9CQyx1QkFDbEMvRCxXQUFZcGlCLEVBQ1pxaUIsaUJBQWtCQyxJQVExQiw0QkFBNEIwQyxHQUN4QixPQUFPa0IsR0FBb0JYLDJCQUEyQlAsR0FRMUQsMkJBQTJCam1CLEdBQ3ZCLE9BQU9tbkIsR0FBb0JYLDJCQUE0QnhtQixFQUFNbUUsWUFBYyxJQUUvRSxtQ0FBb0NvTSxlQUFnQjRWLElBQ2hELElBQUtBLEVBQ0QsT0FBTyxLQUVYLE1BQU0saUJBQUVFLEVBQWdCLGlCQUFFL0MsR0FBcUI2QyxFQUMvQyxJQUFLRSxJQUFxQi9DLEVBQ3RCLE9BQU8sS0FFWCxJQUNJLE9BQU82RCxHQUFvQlYsV0FBV0osRUFBa0IvQyxHQUU1RCxNQUFPcFgsR0FDSCxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7OztBQXlCbkI2QixlQUFlc1osR0FBT3ZjLEVBQU0rQyxHQUN4QixPQUFPOEIsRUFBc0I3RSxFQUFNLE9BQW1CLHNCQUFxQzhDLEVBQW1COUMsRUFBTStDOzs7Ozs7Ozs7Ozs7Ozs7O0dBckJ4SHNaLEdBQW9CQyx1QkFBeUIsY0FFN0NELEdBQW9CbkMsWUFBYyxjQXNDbEMsTUFBTXNDLEdBQ0YsWUFBWXBoQixHQUNSakosS0FBS3FVLEtBQU9wTCxFQUFPb0wsS0FDbkJyVSxLQUFLd1csV0FBYXZOLEVBQU91TixXQUN6QnhXLEtBQUtzVCxlQUFpQnJLLEVBQU9xSyxlQUM3QnRULEtBQUtzcUIsY0FBZ0JyaEIsRUFBT3FoQixjQUVoQyxrQ0FBa0N6YyxFQUFNeWMsRUFBZXJQLEVBQWlCN0QsR0FBYyxHQUNsRixNQUFNL0MsUUFBYSxFQUFTa1cscUJBQXFCMWMsRUFBTW9OLEVBQWlCN0QsR0FDbEVaLEVBQWFnVSxHQUFzQnZQLEdBT3pDLE9BTmlCLElBQUlvUCxHQUFtQixDQUNwQ2hXLE9BQ0FtQyxhQUNBbEQsZUFBZ0IySCxFQUNoQnFQLGtCQUlSLDJCQUEyQmpXLEVBQU1pVyxFQUFldlksU0FDdENzQyxFQUFLb1cseUJBQXlCMVksR0FBdUIsR0FDM0QsTUFBTXlFLEVBQWFnVSxHQUFzQnpZLEdBQ3pDLE9BQU8sSUFBSXNZLEdBQW1CLENBQzFCaFcsT0FDQW1DLGFBQ0FsRCxlQUFnQnZCLEVBQ2hCdVksbUJBSVosU0FBU0UsR0FBc0J6WSxHQUMzQixPQUFJQSxFQUFTeUUsV0FDRnpFLEVBQVN5RSxXQUVoQixnQkFBaUJ6RSxFQUNWLFFBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4QlhqQixlQUFlNFosR0FBa0I3YyxHQUM3QixJQUFJb0IsRUFDSixNQUFNbVQsRUFBZUYsR0FBVXJVLEdBRS9CLFNBRE11VSxFQUFhdkQsdUJBQ3FCLFFBQW5DNVAsRUFBS21ULEVBQWE1TixtQkFBZ0MsSUFBUHZGLE9BQWdCLEVBQVNBLEVBQUdtSSxZQUV4RSxPQUFPLElBQUlpVCxHQUFtQixDQUMxQmhXLEtBQU0rTixFQUFhNU4sWUFDbkJnQyxXQUFZLEtBQ1o4VCxjQUFlLFdBR3ZCLE1BQU12WSxRQUFpQnFZLEdBQU9oSSxFQUFjLENBQ3hDdUQsbUJBQW1CLElBRWpCcUQsUUFBdUJxQixHQUFtQkUscUJBQXFCbkksRUFBYyxTQUF3QnJRLEdBQVUsR0FFckgsYUFETXFRLEVBQWF4QyxtQkFBbUJvSixFQUFlM1UsTUFDOUMyVTs7Ozs7Ozs7Ozs7Ozs7OztHQW1CWCxNQUFNLFdBQXlCLElBQzNCLFlBQVluYixFQUFNOUssRUFBT3VuQixFQUFlalcsR0FDcEMsSUFBSXBGLEVBQ0o5SCxNQUFNcEUsRUFBTWlFLEtBQU1qRSxFQUFNa0UsU0FDeEJqSCxLQUFLc3FCLGNBQWdCQSxFQUNyQnRxQixLQUFLcVUsS0FBT0EsRUFFWnRXLE9BQU9xSixlQUFlcEgsS0FBTSxHQUFpQmYsV0FDN0NlLEtBQUtrSCxXQUFhLENBQ2Q2RyxRQUFTRixFQUFLalEsS0FDZGlULFNBQW1DLFFBQXhCNUIsRUFBS3BCLEVBQUtnRCxnQkFBNkIsSUFBUDVCLEVBQWdCQSxPQUFLM0wsRUFDaEVzUCxnQkFBaUI3UCxFQUFNbUUsV0FBVzBMLGdCQUNsQzBYLGlCQUdSLDhCQUE4QnpjLEVBQU05SyxFQUFPdW5CLEVBQWVqVyxHQUN0RCxPQUFPLElBQUksR0FBaUJ4RyxFQUFNOUssRUFBT3VuQixFQUFlalcsSUFHaEUsU0FBU3NXLEdBQThDOWMsRUFBTXljLEVBQWVkLEVBQVluVixHQUlwRixPQUgwQyxtQkFBbEJpVyxFQUNsQmQsRUFBV29CLDZCQUE2Qi9jLEdBQ3hDMmIsRUFBVzFELG9CQUFvQmpZLElBQ2QvSixNQUFNZixJQUN6QixHQUFtQixvQ0FBZkEsRUFBTWlFLEtBQ04sTUFBTSxHQUFpQjZqQix1QkFBdUJoZCxFQUFNOUssRUFBT3VuQixFQUFlalcsR0FFOUUsTUFBTXRSOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJkLFNBQVMrbkIsR0FBb0JoVSxHQUN6QixPQUFPLElBQUlpVSxJQUFJalUsRUFDVlAsSUFBSSxFQUFHQyxnQkFBaUJBLEdBQ3hCUyxPQUFPK1QsS0FBU0E7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQnpCbGEsZUFBZW1hLEdBQU81VyxFQUFNbUMsR0FDeEIsTUFBTTZDLEVBQWUsWUFBbUJoRixTQUNsQzZXLElBQW9CLEVBQU03UixFQUFjN0MsR0FDOUMsTUFBTSxpQkFBRUYsU0FuNEdaeEYsZUFBb0NqRCxFQUFNK0MsR0FDdEMsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLHNCQUE4QytDLEdBazRHOUR1YSxDQUFxQjlSLEVBQWF4TCxLQUFNLENBQ3ZFbUksY0FBZXFELEVBQWE5RCxhQUM1QjZWLGVBQWdCLENBQUM1VSxLQUVmNlUsRUFBZ0JQLEdBQW9CeFUsR0FBb0IsSUFNOUQsT0FMQStDLEVBQWF2QyxhQUFldUMsRUFBYXZDLGFBQWFHLE9BQU9xVSxHQUFNRCxFQUFjRSxJQUFJRCxFQUFHOVUsYUFDbkY2VSxFQUFjRSxJQUFJLFdBQ25CbFMsRUFBYWhHLFlBQWMsWUFFekJnRyxFQUFheEwsS0FBS3NMLHNCQUFzQkUsR0FDdkNBLEVBRVh2SSxlQUFlMGEsR0FBUW5YLEVBQU1tVixFQUFZbFYsR0FBa0IsR0FDdkQsTUFBTXZDLFFBQWlCcUMsRUFBcUJDLEVBQU1tVixFQUFXaUMsZUFBZXBYLEVBQUt4RyxXQUFZd0csRUFBS2tCLGNBQWVqQixHQUNqSCxPQUFPK1YsR0FBbUJxQixjQUFjclgsRUFBTSxPQUFtQnRDLEdBRXJFakIsZUFBZW9hLEdBQW9CUyxFQUFVdFgsRUFBTW9DLFNBQ3pDVixFQUFxQjFCLEdBQzNCLE1BQ01yTixHQUFvQixJQUFiMmtCLEVBQ1AsMEJBQ0EsbUJBQ050ZCxFQUpvQnljLEdBQW9CelcsRUFBS3lDLGNBSXpCeVUsSUFBSTlVLEtBQWNrVixFQUFVdFgsRUFBS3hHLEtBQU03Rzs7Ozs7Ozs7Ozs7Ozs7OztHQW1CL0Q4SixlQUFlOGEsR0FBZ0J2WCxFQUFNbVYsRUFBWWxWLEdBQWtCLEdBQy9ELE1BQU0sS0FBRXpHLEdBQVN3RyxFQUVqQixJQUNJLE1BQU10QyxRQUFpQnFDLEVBQXFCQyxFQUFNc1csR0FBOEM5YyxFQUY5RSxpQkFFbUcyYixFQUFZblYsR0FBT0MsR0FDeElqRyxFQUFRMEQsRUFBU2lFLFFBQVNuSSxFQUFNLGtCQUNoQyxNQUFNZ2UsRUFBUzlYLEVBQVloQyxFQUFTaUUsU0FDcEMzSCxFQUFRd2QsRUFBUWhlLEVBQU0sa0JBQ3RCLE1BQVF4SixJQUFLbVQsR0FBWXFVLEVBRXpCLE9BREF4ZCxFQUFRZ0csRUFBS25RLE1BQVFzVCxFQUFTM0osRUFBTSxpQkFDN0J3YyxHQUFtQnFCLGNBQWNyWCxFQVJ0QixpQkFRMkN0QyxHQUVqRSxNQUFPbFAsR0FLSCxLQUh1RCx5QkFBbERBLGFBQTZCLEVBQVNBLEVBQUVtRSxPQUN6Q3VHLEVBQU1NLEVBQU0saUJBRVZoTDs7Ozs7Ozs7Ozs7Ozs7OztHQW9CZGlPLGVBQWVnYixHQUFzQmplLEVBQU0yYixFQUFZbFYsR0FBa0IsR0FDckUsTUFDTXZDLFFBQWlCNFksR0FBOEM5YyxFQUQvQyxTQUNvRTJiLEdBQ3BGUixRQUF1QnFCLEdBQW1CRSxxQkFBcUIxYyxFQUYvQyxTQUVvRWtFLEdBSTFGLE9BSEt1QyxTQUNLekcsRUFBSytSLG1CQUFtQm9KLEVBQWUzVSxNQUUxQzJVLEVBYVhsWSxlQUFlaWIsR0FBcUJsZSxFQUFNMmIsR0FDdEMsT0FBT3NDLEdBQXNCNUosR0FBVXJVLEdBQU8yYixHQWFsRDFZLGVBQWVrYixHQUFtQjNYLEVBQU1tVixHQUNwQyxNQUFNblEsRUFBZSxZQUFtQmhGLEdBRXhDLGFBRE02VyxJQUFvQixFQUFPN1IsRUFBY21RLEVBQVdoVCxZQUNuRGdWLEdBQVFuUyxFQUFjbVEsR0FjakMxWSxlQUFlbWIsR0FBNkI1WCxFQUFNbVYsR0FDOUMsT0FBT29DLEdBQWdCLFlBQW1CdlgsR0FBT21WOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RHJEMVksZUFBZW9iLEdBQXNCcmUsRUFBTXNlLEdBQ3ZDLE1BQU0vSixFQUFlRixHQUFVclUsR0FDekJrRSxRQXRDVmpCLGVBQXVDakQsRUFBTStDLEdBQ3pDLE9BQU84QixFQUFzQjdFLEVBQU0sT0FBbUIscUNBQXNFOEMsRUFBbUI5QyxFQUFNK0MsSUFxQzlId2IsQ0FBd0JoSyxFQUFjLENBQ3pEcGUsTUFBT21vQixFQUNQeEcsbUJBQW1CLElBRWpCTyxRQUFhbUUsR0FBbUJFLHFCQUFxQm5JLEVBQWMsU0FBd0JyUSxHQUVqRyxhQURNcVEsRUFBYXhDLG1CQUFtQnNHLEVBQUs3UixNQUNwQzZSOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJYLE1BQU1tRyxHQUNGLFlBQVlDLEVBQVV2YSxHQUNsQi9SLEtBQUtzc0IsU0FBV0EsRUFDaEJ0c0IsS0FBS2tFLElBQU02TixFQUFTd2EsZ0JBQ3BCdnNCLEtBQUt3c0IsZUFBaUIsSUFBSXBwQixLQUFLMk8sRUFBUzBhLFlBQVk3WSxjQUNwRDVULEtBQUsyVyxZQUFjNUUsRUFBUzRFLFlBRWhDLDJCQUEyQjlJLEVBQU02ZSxHQUM3QixNQUFJLGNBQWVBLEVBQ1JDLEdBQXFCQyxvQkFBb0IvZSxFQUFNNmUsR0FFbkRuZixFQUFNTSxFQUFNLG1CQUczQixNQUFNOGUsV0FBNkJOLEdBQy9CLFlBQVl0YSxHQUNSNUssTUFBTSxRQUFxQjRLLEdBQzNCL1IsS0FBS3FULFlBQWN0QixFQUFTOGEsVUFFaEMsMkJBQTJCaEksRUFBTzZILEdBQzlCLE9BQU8sSUFBSUMsR0FBcUJEOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0J4QyxTQUFTSSxHQUFnQ2pmLEVBQU0rQyxFQUFTbWMsR0FDcEQsSUFBSTlkLEVBQ0paLEdBQTJDLFFBQWpDWSxFQUFLOGQsRUFBbUJyakIsV0FBd0IsSUFBUHVGLE9BQWdCLEVBQVNBLEVBQUd6UCxRQUFVLEVBQUdxTyxFQUFNLHdCQUNsR1EsT0FBd0QsSUFBekMwZSxFQUFtQkMsbUJBQzlCRCxFQUFtQkMsa0JBQWtCeHRCLE9BQVMsRUFBR3FPLEVBQU0sK0JBQzNEK0MsRUFBUTZXLFlBQWNzRixFQUFtQnJqQixJQUN6Q2tILEVBQVFvYyxrQkFBb0JELEVBQW1CQyxrQkFDL0NwYyxFQUFRcWMsbUJBQXFCRixFQUFtQkcsZ0JBQzVDSCxFQUFtQkksTUFDbkI5ZSxFQUFRMGUsRUFBbUJJLElBQUlDLFNBQVM1dEIsT0FBUyxFQUFHcU8sRUFBTSx5QkFDMUQrQyxFQUFReWMsWUFBY04sRUFBbUJJLElBQUlDLFVBRTdDTCxFQUFtQk8sVUFDbkJqZixFQUFRMGUsRUFBbUJPLFFBQVFDLFlBQVkvdEIsT0FBUyxFQUFHcU8sRUFBTSw0QkFDakUrQyxFQUFRNGMsa0JBQW9CVCxFQUFtQk8sUUFBUUcsV0FDdkQ3YyxFQUFROGMsMEJBQ0pYLEVBQW1CTyxRQUFRSyxlQUMvQi9jLEVBQVFnZCxtQkFBcUJiLEVBQW1CTyxRQUFRQzs7Ozs7Ozs7Ozs7Ozs7OztHQW9EaEV6YyxlQUFlK2MsR0FBdUJoZ0IsRUFBTXVGLEVBQU8yWixHQUMvQyxNQUFNZSxFQUFjLFlBQW1CamdCLEdBQ2pDK0MsRUFBVSxDQUNabWQsWUFBYSxpQkFDYjNhLFNBRUEyWixHQUNBRCxHQUFnQ2dCLEVBQWFsZCxFQUFTbWMsU0F2aEU5RGpjLGVBQXdDakQsRUFBTStDLEdBQzFDLE9BQU9xVSxHQUFZcFgsRUFBTStDLEdBd2hFbkJvZCxDQUF5QkYsRUFBYWxkLEdBV2hERSxlQUFlbWQsR0FBcUJwZ0IsRUFBTTBYLEVBQVMySSxTQUN6Q25KLEdBQWMsWUFBbUJsWCxHQUFPLENBQzFDMFgsVUFDQTJJLGdCQVlScGQsZUFBZXFkLEdBQWdCdGdCLEVBQU0wWCxTQWhsRXJDelUsZUFBaUNqRCxFQUFNK0MsR0FDbkMsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLHNCQUE4QzhDLEVBQW1COUMsRUFBTStDLElBZ2xFcEh3ZCxDQUFrQixZQUFtQnZnQixHQUFPLENBQUUwWCxZQVl4RHpVLGVBQWV1ZCxHQUFnQnhnQixFQUFNMFgsR0FDakMsTUFBTXVJLEVBQWMsWUFBbUJqZ0IsR0FDakNrRSxRQUFpQmdULEdBQWMrSSxFQUFhLENBQUV2SSxZQU85QzRCLEVBQVlwVixFQUFTZ2MsWUFFM0IsT0FEQTFmLEVBQVE4WSxFQUFXMkcsRUFBYSxrQkFDeEIzRyxHQUNKLElBQUssZUFDRCxNQUNKLElBQUssMEJBQ0Q5WSxFQUFRMEQsRUFBU3VjLFNBQVVSLEVBQWEsa0JBQ3hDLE1BQ0osSUFBSyxnQ0FDRHpmLEVBQVEwRCxFQUFTd2MsUUFBU1QsRUFBYSxrQkFFM0MsUUFDSXpmLEVBQVEwRCxFQUFTcUIsTUFBTzBhLEVBQWEsa0JBRzdDLElBQUlVLEVBQWtCLEtBSXRCLE9BSEl6YyxFQUFTd2MsVUFDVEMsRUFBa0JuQyxHQUFvQk8sb0JBQW9CMUssR0FBVTRMLEdBQWMvYixFQUFTd2MsVUFFeEYsQ0FDSDdtQixLQUFNLENBQ0YwTCxPQUFpQyw0QkFBekJyQixFQUFTZ2MsWUFDWGhjLEVBQVN1YyxTQUNUdmMsRUFBU3FCLFFBQVUsS0FDekJxYixlQUF5Qyw0QkFBekIxYyxFQUFTZ2MsWUFDbkJoYyxFQUFTcUIsTUFDVHJCLEVBQVN1YyxXQUFhLEtBQzVCRSxtQkFFSnJILGFBYVJyVyxlQUFlNGQsR0FBd0I3Z0IsRUFBTTdHLEdBQ3pDLE1BQU0sS0FBRVUsU0FBZTJtQixHQUFnQixZQUFtQnhnQixHQUFPN0csR0FFakUsT0FBT1UsRUFBSzBMLE1BbUJoQnRDLGVBQWU2ZCxHQUErQjlnQixFQUFNdUYsRUFBT2tTLEdBQ3ZELE1BQU1sRCxFQUFlRixHQUFVclUsR0FDekJrRSxRQUFpQnFZLEdBQU9oSSxFQUFjLENBQ3hDdUQsbUJBQW1CLEVBQ25CdlMsUUFDQWtTLGFBRUUwRCxRQUF1QnFCLEdBQW1CRSxxQkFBcUJuSSxFQUFjLFNBQXdCclEsR0FFM0csYUFETXFRLEVBQWF4QyxtQkFBbUJvSixFQUFlM1UsTUFDOUMyVSxFQWtCWCxTQUFTNEYsR0FBMkIvZ0IsRUFBTXVGLEVBQU9rUyxHQUM3QyxPQUFPeUcsR0FBcUIsWUFBbUJsZSxHQUFPaWEsR0FBa0IwQixXQUFXcFcsRUFBT2tTOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUQ5RnhVLGVBQWUrZCxHQUFzQmhoQixFQUFNdUYsRUFBTzJaLEdBQzlDLE1BQU1lLEVBQWMsWUFBbUJqZ0IsR0FDakMrQyxFQUFVLENBQ1ptZCxZQUFhLGVBQ2IzYSxTQUVKL0UsRUFBUTBlLEVBQW1CRyxnQkFBaUJZLEVBQWEsa0JBQ3JEZixHQUNBRCxHQUFnQ2dCLEVBQWFsZCxFQUFTbWMsU0FudUU5RGpjLGVBQXVDakQsRUFBTStDLEdBQ3pDLE9BQU9xVSxHQUFZcFgsRUFBTStDLEdBb3VFbkJrZSxDQUF3QmhCLEVBQWFsZCxHQVUvQyxTQUFTbWUsR0FBc0JsaEIsRUFBTW1hLEdBQ2pDLE1BQU1DLEVBQWdCLEdBQWNDLFVBQVVGLEdBQzlDLE1BQW1HLGtCQUEzRkMsYUFBcUQsRUFBU0EsRUFBY2QsV0F1Q3hGclcsZUFBZWtlLEdBQW9CbmhCLEVBQU11RixFQUFPNFUsR0FDNUMsTUFBTThGLEVBQWMsWUFBbUJqZ0IsR0FDakMyYixFQUFhMUIsR0FBa0JtSCxtQkFBbUI3YixFQUFPNFUsR0FBYWhaLEtBSTVFLE9BREFYLEVBQVFtYixFQUFXbkUsYUFBZXlJLEVBQVlqZCxVQUFZLE1BQU9pZCxFQUFhLHNCQUN2RS9CLEdBQXFCK0IsRUFBYXRFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxRDdDMVksZUFBZW9lLEdBQTJCcmhCLEVBQU11RixHQUk1QyxNQUNNeEMsRUFBVSxDQUNadWUsV0FBWS9iLEVBQ1pnYyxZQUhnQmhnQixJQUFtQkosSUFBbUIscUJBS3BELGNBQUVxZ0IsU0EzQ1p2ZSxlQUE2QmpELEVBQU0rQyxHQUMvQixPQUFPRyxFQUFtQmxELEVBQU0sT0FBbUIsNkJBQW9EOEMsRUFBbUI5QyxFQUFNK0MsSUEwQ2hHMGUsQ0FBYyxZQUFtQnpoQixHQUFPK0MsR0FDeEUsT0FBT3llLEdBQWlCLEdBZ0M1QnZlLGVBQWV5ZSxHQUFzQmxiLEVBQU0wWSxHQUN2QyxNQUFNMVQsRUFBZSxZQUFtQmhGLEdBRWxDekQsRUFBVSxDQUNabWQsWUFBYSxlQUNiL1gsY0FIa0IzQixFQUFLa0IsY0FLdkJ3WCxHQUNBRCxHQUFnQ3pULEVBQWF4TCxLQUFNK0MsRUFBU21jLEdBRWhFLE1BQU0sTUFBRTNaLFNBNzRFWnRDLGVBQXVDakQsRUFBTStDLEdBQ3pDLE9BQU9xVSxHQUFZcFgsRUFBTStDLEdBNDRFRDRlLENBQXdCblcsRUFBYXhMLEtBQU0rQyxHQUMvRHdDLElBQVVpQixFQUFLakIsYUFDVGlCLEVBQUt1RixTQXFDbkI5SSxlQUFlMmUsR0FBd0JwYixFQUFNaWEsRUFBVXZCLEdBQ25ELE1BQU0xVCxFQUFlLFlBQW1CaEYsR0FFbEN6RCxFQUFVLENBQ1ptZCxZQUFhLDBCQUNiL1gsY0FIa0IzQixFQUFLa0IsYUFJdkIrWSxZQUVBdkIsR0FDQUQsR0FBZ0N6VCxFQUFheEwsS0FBTStDLEVBQVNtYyxHQUVoRSxNQUFNLE1BQUUzWixTQXQ3RVp0QyxlQUFvQ2pELEVBQU0rQyxHQUN0QyxPQUFPcVUsR0FBWXBYLEVBQU0rQyxHQXE3RUQ4ZSxDQUFxQnJXLEVBQWF4TCxLQUFNK0MsR0FDNUR3QyxJQUFVaUIsRUFBS2pCLGFBR1RpQixFQUFLdUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdEbkI5SSxlQUFlNmUsR0FBY3RiLEdBQU0sWUFBRXNDLEVBQWFDLFNBQVVDLElBQ3hELFFBQW9CdlQsSUFBaEJxVCxRQUEwQ3JULElBQWJ1VCxFQUM3QixPQUVKLE1BQU13QyxFQUFlLFlBQW1CaEYsR0FFbEN1YixFQUFpQixDQUNuQjVaLGNBRmtCcUQsRUFBYTlELGFBRy9Cb0IsY0FDQUUsV0FDQThPLG1CQUFtQixHQUVqQjVULFFBQWlCcUMsRUFBcUJpRixFQXhDaER2SSxlQUErQmpELEVBQU0rQyxHQUNqQyxPQUFPRyxFQUFtQmxELEVBQU0sT0FBbUIsc0JBQThDK0MsR0F1Q3ZDaWYsQ0FBZ0J4VyxFQUFheEwsS0FBTStoQixJQUM3RnZXLEVBQWExQyxZQUFjNUUsRUFBUzRFLGFBQWUsS0FDbkQwQyxFQUFhekMsU0FBVzdFLEVBQVM4RSxVQUFZLEtBRTdDLE1BQU1pWixFQUFtQnpXLEVBQWF2QyxhQUFhaVosS0FBSyxFQUFHdlosZ0JBQWdDLGFBQWZBLEdBQ3hFc1osSUFDQUEsRUFBaUJuWixZQUFjMEMsRUFBYTFDLFlBQzVDbVosRUFBaUJsWixTQUFXeUMsRUFBYXpDLGdCQUV2Q3lDLEVBQWFvUix5QkFBeUIxWSxHQWtCaEQsU0FBU2llLEdBQVkzYixFQUFNaWEsR0FDdkIsT0FBTzJCLEdBQXNCLFlBQW1CNWIsR0FBT2lhLEVBQVUsTUFlckUsU0FBUzRCLEdBQWU3YixFQUFNNlosR0FDMUIsT0FBTytCLEdBQXNCLFlBQW1CNWIsR0FBTyxLQUFNNlosR0FFakVwZCxlQUFlbWYsR0FBc0I1YixFQUFNakIsRUFBT2tTLEdBQzlDLE1BQU0sS0FBRXpYLEdBQVN3RyxFQUVYekQsRUFBVSxDQUNab0YsY0FGa0IzQixFQUFLa0IsYUFHdkJvUSxtQkFBbUIsR0FFbkJ2UyxJQUNBeEMsRUFBUXdDLE1BQVFBLEdBRWhCa1MsSUFDQTFVLEVBQVEwVSxTQUFXQSxHQUV2QixNQUFNdlQsUUFBaUJxQyxFQUFxQkMsRUFBTTJRLEdBQW9CblgsRUFBTStDLFVBQ3RFeUQsRUFBS29XLHlCQUF5QjFZLEdBQXVCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0UvRCxNQUFNb2UsR0FDRixZQUFZQyxFQUFXNVosRUFBWTZaLEVBQVUsSUFDekNyd0IsS0FBS293QixVQUFZQSxFQUNqQnB3QixLQUFLd1csV0FBYUEsRUFDbEJ4VyxLQUFLcXdCLFFBQVVBLEdBR3ZCLE1BQU1DLFdBQWdESCxHQUNsRCxZQUFZQyxFQUFXNVosRUFBWTZaLEVBQVNFLEdBQ3hDcHBCLE1BQU1pcEIsRUFBVzVaLEVBQVk2WixHQUM3QnJ3QixLQUFLdXdCLFNBQVdBLEdBR3hCLE1BQU1DLFdBQW1DTCxHQUNyQyxZQUFZQyxFQUFXQyxHQUNuQmxwQixNQUFNaXBCLEVBQVcsZUFBK0JDLElBR3hELE1BQU1JLFdBQWlDSCxHQUNuQyxZQUFZRixFQUFXQyxHQUNuQmxwQixNQUFNaXBCLEVBQVcsYUFBMkJDLEVBQXNGLGlCQUFyRUEsYUFBeUMsRUFBU0EsRUFBUUssT0FBc0JMLGFBQXlDLEVBQVNBLEVBQVFLLE1BQVEsT0FHdk4sTUFBTUMsV0FBaUNSLEdBQ25DLFlBQVlDLEVBQVdDLEdBQ25CbHBCLE1BQU1pcEIsRUFBVyxhQUEyQkMsSUFHcEQsTUFBTU8sV0FBa0NOLEdBQ3BDLFlBQVlGLEVBQVdDLEVBQVNRLEdBQzVCMXBCLE1BQU1pcEIsRUFBVyxjQUE2QkMsRUFBU1EsSUFVL0QsU0FBU0MsR0FBc0I5SCxHQUMzQixNQUFNLEtBQUUzVSxFQUFJLGVBQUVmLEdBQW1CMFYsRUFDakMsT0FBSTNVLEVBQUsrQyxjQUFnQjlELEVBR2QsQ0FDSGtELFdBQVksS0FDWjRaLFdBQVcsRUFDWEMsUUFBUyxNQXpGckIsU0FBOEJwVixHQUMxQixJQUFJaE0sRUFBSXVMLEVBQ1IsSUFBS1MsRUFDRCxPQUFPLEtBRVgsTUFBTSxXQUFFekUsR0FBZXlFLEVBQ2pCb1YsRUFBVXBWLEVBQWdCOFYsWUFDMUIvckIsS0FBS21QLE1BQU04RyxFQUFnQjhWLGFBQzNCLEdBQ0FYLEVBQVluVixFQUFnQm1WLFdBQ0wsMENBQXpCblYsRUFBZ0IrVixLQUNwQixJQUFLeGEsSUFBZXlFLGFBQXlELEVBQVNBLEVBQWdCakYsU0FBVSxDQUM1RyxNQUFNdUQsRUFBeUgsUUFBdkdpQixFQUFxRCxRQUEvQ3ZMLEVBQUs4RSxFQUFZa0gsRUFBZ0JqRixnQkFBNkIsSUFBUC9HLE9BQWdCLEVBQVNBLEVBQUdwSyxnQkFBNkIsSUFBUDJWLE9BQWdCLEVBQVNBLEVBQXFCLGlCQUNyTCxHQUFJakIsRUFBZ0IsQ0FNaEIsT0FBTyxJQUFJNFcsR0FBMEJDLEVBTFMsY0FBbkI3VyxHQUNKLFdBQW5CQSxFQUNFQSxFQUNBLE9BS2QsSUFBSy9DLEVBQ0QsT0FBTyxLQUVYLE9BQVFBLEdBQ0osSUFBSyxlQUNELE9BQU8sSUFBSWdhLEdBQTJCSixFQUFXQyxHQUNyRCxJQUFLLGFBQ0QsT0FBTyxJQUFJSSxHQUF5QkwsRUFBV0MsR0FDbkQsSUFBSyxhQUNELE9BQU8sSUFBSU0sR0FBeUJQLEVBQVdDLEdBQ25ELElBQUssY0FDRCxPQUFPLElBQUlPLEdBQTBCUixFQUFXQyxFQUFTcFYsRUFBZ0I0VixZQUFjLE1BQzNGLElBQUssU0FDTCxJQUFLLFlBQ0QsT0FBTyxJQUFJVixHQUEwQkMsRUFBVyxNQUNwRCxRQUNJLE9BQU8sSUFBSUQsR0FBMEJDLEVBQVc1WixFQUFZNlosSUFzRDdEOUYsQ0FBcUJqWDs7Ozs7Ozs7Ozs7Ozs7OztHQW1JaEMsTUFBTTJkLEdBQ0YsWUFBWTlyQixFQUFNcWtCLEdBQ2R4cEIsS0FBS21GLEtBQU9BLEVBQ1puRixLQUFLd3BCLFdBQWFBLEVBRXRCLG9CQUFvQnhULEdBQ2hCLE9BQU8sSUFBSWliLEdBQXVCLFNBQXVCamIsR0FFN0QsaUNBQWlDa2IsR0FDN0IsT0FBTyxJQUFJRCxHQUF1QixTQUF3QkMsR0FFOUQsU0FJSSxNQUFPLENBQ0hDLG1CQUFvQixDQUNoQixDQUxrQixXQUFkbnhCLEtBQUttRixLQUNYLFVBQ0EscUJBR1NuRixLQUFLd3BCLGFBSXhCLGdCQUFnQnRoQixHQUNaLElBQUkrRyxFQUFJdUwsRUFDUixHQUFJdFMsYUFBaUMsRUFBU0EsRUFBSWlwQixtQkFBb0IsQ0FDbEUsR0FBc0MsUUFBakNsaUIsRUFBSy9HLEVBQUlpcEIsMEJBQXVDLElBQVBsaUIsT0FBZ0IsRUFBU0EsRUFBR21pQixrQkFDdEUsT0FBT0gsR0FBdUJJLDBCQUEwQm5wQixFQUFJaXBCLG1CQUFtQkMsbUJBRTlFLEdBQXNDLFFBQWpDNVcsRUFBS3RTLEVBQUlpcEIsMEJBQXVDLElBQVAzVyxPQUFnQixFQUFTQSxFQUFHeEUsUUFDM0UsT0FBT2liLEdBQXVCSyxhQUFhcHBCLEVBQUlpcEIsbUJBQW1CbmIsU0FHMUUsT0FBTzs7Ozs7Ozs7Ozs7Ozs7OztHQW9CZixNQUFNdWIsR0FDRixZQUFZQyxFQUFTQyxFQUFPQyxHQUN4QjF4QixLQUFLd3hCLFFBQVVBLEVBQ2Z4eEIsS0FBS3l4QixNQUFRQSxFQUNienhCLEtBQUsweEIsZUFBaUJBLEVBRzFCLGtCQUFrQkMsRUFBWTV1QixHQUMxQixNQUFNOEssRUFBT3FVLEdBQVV5UCxHQUNqQmhmLEVBQWlCNVAsRUFBTW1FLFdBQVcwTCxnQkFDbEM2ZSxHQUFTOWUsRUFBZTRiLFNBQVcsSUFBSWhZLElBQUltVyxHQUFjTCxHQUFvQk8sb0JBQW9CL2UsRUFBTTZlLElBQzdHcmUsRUFBUXNFLEVBQWV1ZSxxQkFBc0JyakIsRUFBTSxrQkFDbkQsTUFBTTJqQixFQUFVUCxHQUF1QkksMEJBQTBCMWUsRUFBZXVlLHNCQUNoRixPQUFPLElBQUlLLEdBQXdCQyxFQUFTQyxFQUFPM2dCLE1BQU94QyxJQUN0RCxNQUFNc2pCLFFBQW9CdGpCLEVBQVV1akIsU0FBU2hrQixFQUFNMmpCLFVBRTVDN2UsRUFBZTRiLGVBQ2Y1YixFQUFldWUscUJBRXRCLE1BQU1qVyxFQUFrQmxkLE9BQU95RyxPQUFPekcsT0FBT3lHLE9BQU8sR0FBSW1PLEdBQWlCLENBQUVxRCxRQUFTNGIsRUFBWTViLFFBQVMyQixhQUFjaWEsRUFBWWphLGVBRW5JLE9BQVE1VSxFQUFNdW5CLGVBQ1YsSUFBSyxTQUNELE1BQU10QixRQUF1QnFCLEdBQW1CRSxxQkFBcUIxYyxFQUFNOUssRUFBTXVuQixjQUFlclAsR0FFaEcsYUFETXBOLEVBQUsrUixtQkFBbUJvSixFQUFlM1UsTUFDdEMyVSxFQUNYLElBQUssaUJBRUQsT0FEQTNhLEVBQVF0TCxFQUFNc1IsS0FBTXhHLEVBQU0sa0JBQ25Cd2MsR0FBbUJxQixjQUFjM29CLEVBQU1zUixLQUFNdFIsRUFBTXVuQixjQUFlclAsR0FDN0UsUUFDSTFOLEVBQU1NLEVBQU0scUJBSTVCLG9CQUFvQmlrQixHQUNoQixNQUFNeGpCLEVBQVl3akIsRUFDbEIsT0FBTzl4QixLQUFLMHhCLGVBQWVwakIsSUFhbkMsU0FBU3lqQixHQUF1QmxrQixFQUFNOUssR0FDbEMsSUFBSWtNLEVBQ0osTUFBTTZlLEVBQWMsWUFBbUJqZ0IsR0FDakNta0IsRUFBZ0JqdkIsRUFHdEIsT0FGQXNMLEVBQVF0TCxFQUFNbUUsV0FBV29qQixjQUFld0QsRUFBYSxrQkFDckR6ZixFQUE0RCxRQUFuRFksRUFBSytpQixFQUFjOXFCLFdBQVcwTCx1QkFBb0MsSUFBUDNELE9BQWdCLEVBQVNBLEVBQUdpaUIscUJBQXNCcEQsRUFBYSxrQkFDNUh5RCxHQUF3QlUsV0FBV25FLEVBQWFrRTs7Ozs7Ozs7Ozs7Ozs7OztHQTZCM0QsTUFBTUUsR0FDRixZQUFZN2QsR0FDUnJVLEtBQUtxVSxLQUFPQSxFQUNaclUsS0FBS215QixnQkFBa0IsR0FDdkI5ZCxFQUFLK2QsVUFBVXZZLElBQ1BBLEVBQVMwVSxVQUNUdnVCLEtBQUtteUIsZ0JBQWtCdFksRUFBUzBVLFFBQVFoWSxJQUFJbVcsR0FBY0wsR0FBb0JPLG9CQUFvQnZZLEVBQUt4RyxLQUFNNmUsT0FJekgsaUJBQWlCclksR0FDYixPQUFPLElBQUk2ZCxHQUFvQjdkLEdBRW5DLG1CQUNJLE9BQU80YyxHQUF1QkssbUJBQW1CdHhCLEtBQUtxVSxLQUFLa0IsY0FFL0QsYUFBYXVjLEVBQWlCbmIsR0FDMUIsTUFBTXJJLEVBQVl3akIsRUFDWk4sUUFBaUJ4eEIsS0FBS3F5QixhQUN0QkMsUUFBNEJsZSxFQUFxQnBVLEtBQUtxVSxLQUFNL0YsRUFBVXVqQixTQUFTN3hCLEtBQUtxVSxLQUFLeEcsS0FBTTJqQixFQUFTN2EsSUFPOUcsYUFKTTNXLEtBQUtxVSxLQUFLb1cseUJBQXlCNkgsR0FJbEN0eUIsS0FBS3FVLEtBQUt1RixTQUVyQixlQUFlMlksR0FDWCxNQUFNaEcsRUFBdUMsaUJBQWRnRyxFQUF5QkEsRUFBWUEsRUFBVXJ1QixJQUN4RThSLFFBQWdCaFcsS0FBS3FVLEtBQUtrQixhQUMxQjBGLFFBQXdCN0csRUFBcUJwVSxLQUFLcVUsTUFuQzNDeEcsRUFtQzZEN04sS0FBS3FVLEtBQUt4RyxLQW5DakUrQyxFQW1DdUUsQ0FDdEZvRixVQUNBdVcsbUJBcENEeGIsRUFBbUJsRCxFQUFNLE9BQW1CLHNDQUEwRDhDLEVBQW1COUMsRUFBTStDLE1BRDFJLElBQXFCL0MsRUFBTStDLEVBd0NuQjVRLEtBQUtteUIsZ0JBQWtCbnlCLEtBQUtteUIsZ0JBQWdCbGIsT0FBTyxFQUFHL1MsU0FBVUEsSUFBUXFvQixTQUtsRXZzQixLQUFLcVUsS0FBS29XLHlCQUF5QnhQLEdBQ3pDLFVBQ1VqYixLQUFLcVUsS0FBS3VGLFNBRXBCLE1BQU8vVyxHQUNILEdBQWUsNEJBQVhBLEVBQUVtRSxLQUNGLE1BQU1uRSxJQUt0QixNQUFNMnZCLEdBQXVCLElBQUlDLFFBV2pDLFNBQVNDLEdBQVlyZSxHQUNqQixNQUFNc2UsRUFBYyxZQUFtQnRlLEdBSXZDLE9BSEttZSxHQUFxQmpILElBQUlvSCxJQUMxQkgsR0FBcUJ6akIsSUFBSTRqQixFQUFhVCxHQUFvQlUsVUFBVUQsSUFFakVILEdBQXFCdDBCLElBQUl5MEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JwQyxNQUFNRSxHQUNGLFlBQVlDLEVBQWtCM3RCLEdBQzFCbkYsS0FBSzh5QixpQkFBbUJBLEVBQ3hCOXlCLEtBQUttRixLQUFPQSxFQUVoQixlQUNJLElBQ0ksT0FBS25GLEtBQUttYixTQUdWbmIsS0FBS21iLFFBQVE0WCxRQS9CSyxRQStCMEIsS0FDNUMveUIsS0FBS21iLFFBQVE2WCxXQWhDSyxTQWlDWHB2QixRQUFRRixTQUFRLElBSlpFLFFBQVFGLFNBQVEsR0FNL0IsTUFBT3VMLEdBQ0gsT0FBT3JMLFFBQVFGLFNBQVEsSUFHL0IsS0FBSzlFLEVBQUtOLEdBRU4sT0FEQTBCLEtBQUttYixRQUFRNFgsUUFBUW4wQixFQUFLb0csS0FBS0MsVUFBVTNHLElBQ2xDc0YsUUFBUUYsVUFFbkIsS0FBSzlFLEdBQ0QsTUFBTXNULEVBQU9sUyxLQUFLbWIsUUFBUThYLFFBQVFyMEIsR0FDbEMsT0FBT2dGLFFBQVFGLFFBQVF3TyxFQUFPbE4sS0FBS21QLE1BQU1qQyxHQUFRLE1BRXJELFFBQVF0VCxHQUVKLE9BREFvQixLQUFLbWIsUUFBUTZYLFdBQVdwMEIsR0FDakJnRixRQUFRRixVQUVuQixjQUNJLE9BQU8xRCxLQUFLOHlCOzs7Ozs7Ozs7Ozs7Ozs7O0dBNEJwQixNQUFNSSxXQUFnQ0wsR0FDbEMsY0FDSTFyQixNQUFNLElBQU01QixPQUFPNHRCLGFBQWMsU0FDakNuekIsS0FBSzZiLGtCQUFvQixDQUFDdVgsRUFBT0MsSUFBU3J6QixLQUFLc3pCLGVBQWVGLEVBQU9DLEdBQ3JFcnpCLEtBQUt1ekIsVUFBWSxHQUNqQnZ6QixLQUFLd3pCLFdBQWEsR0FHbEJ4ekIsS0FBS3l6QixVQUFZLEtBRWpCenpCLEtBQUswekIsNEJBbEJiLFdBQ0ksTUFBTWx0QixFQUFLLGNBQ1gsT0FBTytXLEdBQVUvVyxJQUFPcVgsR0FBT3JYLEdBZ0JRbXRCLElBL3dIM0MsV0FDSSxJQUdJLFNBQVVwdUIsUUFBVUEsU0FBV0EsT0FBT3F1QixLQUUxQyxNQUFPL3dCLEdBQ0gsT0FBTyxHQXd3SDZEZ3hCLEdBRXBFN3pCLEtBQUs4ekIsa0JBQW9CaFcsS0FDekI5ZCxLQUFLaWQsdUJBQXdCLEVBRWpDLGtCQUFrQnlFLEdBRWQsSUFBSyxNQUFNOWlCLEtBQU9iLE9BQU95SyxLQUFLeEksS0FBS3V6QixXQUFZLENBRTNDLE1BQU1RLEVBQVcvekIsS0FBS21iLFFBQVE4WCxRQUFRcjBCLEdBQ2hDbzFCLEVBQVdoMEIsS0FBS3d6QixXQUFXNTBCLEdBRzdCbTFCLElBQWFDLEdBQ2J0UyxFQUFHOWlCLEVBQUtvMUIsRUFBVUQsSUFJOUIsZUFBZVgsRUFBT0MsR0FBTyxHQUV6QixJQUFLRCxFQUFNeDBCLElBSVAsWUFIQW9CLEtBQUtpMEIsa0JBQWtCLENBQUNyMUIsRUFBS3MxQixFQUFXSCxLQUNwQy96QixLQUFLbTBCLGdCQUFnQnYxQixFQUFLbTFCLEtBSWxDLE1BQU1uMUIsRUFBTXcwQixFQUFNeDBCLElBZWxCLEdBWkl5MEIsRUFHQXJ6QixLQUFLbzBCLGlCQUtMcDBCLEtBQUtxMEIsY0FJTHIwQixLQUFLMHpCLDRCQUE2QixDQUVsQyxNQUFNWSxFQUFjdDBCLEtBQUttYixRQUFROFgsUUFBUXIwQixHQUV6QyxHQUFJdzBCLEVBQU1XLFdBQWFPLEVBQ0ksT0FBbkJsQixFQUFNVyxTQUVOL3pCLEtBQUttYixRQUFRNFgsUUFBUW4wQixFQUFLdzBCLEVBQU1XLFVBSWhDL3pCLEtBQUttYixRQUFRNlgsV0FBV3AwQixRQUczQixHQUFJb0IsS0FBS3d6QixXQUFXNTBCLEtBQVN3MEIsRUFBTVcsV0FBYVYsRUFFakQsT0FHUixNQUFNa0IsRUFBbUIsS0FHckIsTUFBTUQsRUFBY3QwQixLQUFLbWIsUUFBUThYLFFBQVFyMEIsSUFDcEN5MEIsR0FBUXJ6QixLQUFLd3pCLFdBQVc1MEIsS0FBUzAxQixJQUt0Q3QwQixLQUFLbTBCLGdCQUFnQnYxQixFQUFLMDFCLElBRXhCQSxFQUFjdDBCLEtBQUttYixRQUFROFgsUUFBUXIwQixHQWoySHRDLGVBQW9DLEtBQTFCd2tCLFNBQVNvUixjQW0ySGxCRixJQUFnQmxCLEVBQU1XLFVBQ3RCWCxFQUFNVyxXQUFhWCxFQUFNWSxTQUt6Qi9nQixXQUFXc2hCLEVBMUZlLElBNkYxQkEsSUFHUixnQkFBZ0IzMUIsRUFBS04sR0FDakIwQixLQUFLd3pCLFdBQVc1MEIsR0FBT04sRUFDdkIsTUFBTWkxQixFQUFZdnpCLEtBQUt1ekIsVUFBVTMwQixHQUNqQyxHQUFJMjBCLEVBQ0EsSUFBSyxNQUFNa0IsS0FBWXAwQixNQUFNcTBCLEtBQUtuQixHQUM5QmtCLEVBQVNuMkIsRUFBUTBHLEtBQUttUCxNQUFNN1YsR0FBU0EsR0FJakQsZUFDSTBCLEtBQUtxMEIsY0FDTHIwQixLQUFLeXpCLFVBQVlrQixZQUFZLEtBQ3pCMzBCLEtBQUtpMEIsa0JBQWtCLENBQUNyMUIsRUFBS28xQixFQUFVRCxLQUNuQy96QixLQUFLc3pCLGVBQWUsSUFBSXNCLGFBQWEsVUFBVyxDQUM1Q2gyQixNQUNBbzFCLFdBQ0FELGNBRU8sTUFwSEksS0F3SDNCLGNBQ1EvekIsS0FBS3l6QixZQUNMb0IsY0FBYzcwQixLQUFLeXpCLFdBQ25CenpCLEtBQUt5ekIsVUFBWSxNQUd6QixpQkFDSWx1QixPQUFPaWYsaUJBQWlCLFVBQVd4a0IsS0FBSzZiLG1CQUU1QyxpQkFDSXRXLE9BQU91dkIsb0JBQW9CLFVBQVc5MEIsS0FBSzZiLG1CQUUvQyxhQUFhamQsRUFBSzYxQixHQUM2QixJQUF2QzEyQixPQUFPeUssS0FBS3hJLEtBQUt1ekIsV0FBVy96QixTQUt4QlEsS0FBSzh6QixrQkFDTDl6QixLQUFLKzBCLGVBR0wvMEIsS0FBS2cxQixrQkFHUmgxQixLQUFLdXpCLFVBQVUzMEIsS0FDaEJvQixLQUFLdXpCLFVBQVUzMEIsR0FBTyxJQUFJbXNCLElBRTFCL3FCLEtBQUt3ekIsV0FBVzUwQixHQUFPb0IsS0FBS21iLFFBQVE4WCxRQUFRcjBCLElBRWhEb0IsS0FBS3V6QixVQUFVMzBCLEdBQUt3bEIsSUFBSXFRLEdBRTVCLGdCQUFnQjcxQixFQUFLNjFCLEdBQ2J6MEIsS0FBS3V6QixVQUFVMzBCLEtBQ2ZvQixLQUFLdXpCLFVBQVUzMEIsR0FBS3EyQixPQUFPUixHQUNNLElBQTdCejBCLEtBQUt1ekIsVUFBVTMwQixHQUFLczJCLGFBQ2JsMUIsS0FBS3V6QixVQUFVMzBCLElBR2EsSUFBdkNiLE9BQU95SyxLQUFLeEksS0FBS3V6QixXQUFXL3pCLFNBQzVCUSxLQUFLbzBCLGlCQUNMcDBCLEtBQUtxMEIsZUFJYixXQUFXejFCLEVBQUtOLFNBQ042SSxNQUFNNlUsS0FBS3BkLEVBQUtOLEdBQ3RCMEIsS0FBS3d6QixXQUFXNTBCLEdBQU9vRyxLQUFLQyxVQUFVM0csR0FFMUMsV0FBV00sR0FDUCxNQUFNTixRQUFjNkksTUFBTStVLEtBQUt0ZCxHQUUvQixPQURBb0IsS0FBS3d6QixXQUFXNTBCLEdBQU9vRyxLQUFLQyxVQUFVM0csR0FDL0JBLEVBRVgsY0FBY00sU0FDSnVJLE1BQU1pVixRQUFReGQsVUFDYm9CLEtBQUt3ekIsV0FBVzUwQixJQUcvQnMwQixHQUF3Qi90QixLQUFPLFFBTy9CLE1BQU1nd0IsR0FBMEJqQzs7Ozs7Ozs7Ozs7Ozs7OztHQWtCaEMsTUFBTWtDLFdBQWtDdkMsR0FDcEMsY0FDSTFyQixNQUFNLElBQU01QixPQUFPOHZCLGVBQWdCLFdBRXZDLGFBQWFqYSxFQUFNQyxJQUluQixnQkFBZ0JELEVBQU1DLEtBSzFCK1osR0FBMEJqd0IsS0FBTyxVQU9qQyxNQUFNbXdCLEdBQTRCRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkRsQyxNQUFNRyxHQUNGLFlBQVlDLEdBQ1J4MUIsS0FBS3cxQixZQUFjQSxFQUNuQngxQixLQUFLeTFCLFlBQWMsR0FDbkJ6MUIsS0FBSzZiLGtCQUFvQjdiLEtBQUswMUIsWUFBWTcyQixLQUFLbUIsTUFRbkQsb0JBQW9CdzFCLEdBSWhCLE1BQU1HLEVBQW1CMzFCLEtBQUs0MUIsVUFBVTdGLEtBQUs4RixHQUFZQSxFQUFTQyxjQUFjTixJQUNoRixHQUFJRyxFQUNBLE9BQU9BLEVBRVgsTUFBTUksRUFBYyxJQUFJUixHQUFTQyxHQUVqQyxPQURBeDFCLEtBQUs0MUIsVUFBVXgwQixLQUFLMjBCLEdBQ2JBLEVBRVgsY0FBY1AsR0FDVixPQUFPeDFCLEtBQUt3MUIsY0FBZ0JBLEVBWWhDLGtCQUFrQnBDLEdBQ2QsTUFBTTRDLEVBQWU1QyxHQUNmLFFBQUU2QyxFQUFPLFVBQUVDLEVBQVMsS0FBRXh1QixHQUFTc3VCLEVBQWF0dUIsS0FDNUN5dUIsRUFBV24yQixLQUFLeTFCLFlBQVlTLEdBQ2xDLEtBQU1DLGFBQTJDLEVBQVNBLEVBQVNqQixNQUMvRCxPQUVKYyxFQUFhSSxNQUFNLEdBQUdDLFlBQVksQ0FDOUJDLE9BQVEsTUFDUkwsVUFDQUMsY0FFSixNQUFNSyxFQUFXbDJCLE1BQU1xMEIsS0FBS3lCLEdBQVU1ZixJQUFJekYsTUFBTzBsQixHQUFZQSxFQUFRUixFQUFhUyxPQUFRL3VCLElBQ3BGcUssUUF4RmQsU0FBcUJ3a0IsR0FDakIsT0FBTzN5QixRQUFRZ1osSUFBSTJaLEVBQVNoZ0IsSUFBSXpGLE1BQU9uTixJQUNuQyxJQUVJLE1BQU8sQ0FDSCt5QixXQUFXLEVBQ1hwNEIsWUFIZ0JxRixHQU14QixNQUFPZ3pCLEdBQ0gsTUFBTyxDQUNIRCxXQUFXLEVBQ1hDLGNBNEVlQyxDQUFZTCxHQUNuQ1AsRUFBYUksTUFBTSxHQUFHQyxZQUFZLENBQzlCQyxPQUFRLE9BQ1JMLFVBQ0FDLFlBQ0Fua0IsYUFVUixXQUFXbWtCLEVBQVdXLEdBQzJCLElBQXpDOTRCLE9BQU95SyxLQUFLeEksS0FBS3kxQixhQUFhajJCLFFBQzlCUSxLQUFLdzFCLFlBQVloUixpQkFBaUIsVUFBV3hrQixLQUFLNmIsbUJBRWpEN2IsS0FBS3kxQixZQUFZUyxLQUNsQmwyQixLQUFLeTFCLFlBQVlTLEdBQWEsSUFBSW5MLEtBRXRDL3FCLEtBQUt5MUIsWUFBWVMsR0FBVzlSLElBQUl5UyxHQVNwQyxhQUFhWCxFQUFXVyxHQUNoQjcyQixLQUFLeTFCLFlBQVlTLElBQWNXLEdBQy9CNzJCLEtBQUt5MUIsWUFBWVMsR0FBV2pCLE9BQU80QixHQUVsQ0EsR0FBcUQsSUFBckM3MkIsS0FBS3kxQixZQUFZUyxHQUFXaEIsYUFDdENsMUIsS0FBS3kxQixZQUFZUyxHQUVpQixJQUF6Q240QixPQUFPeUssS0FBS3hJLEtBQUt5MUIsYUFBYWoyQixRQUM5QlEsS0FBS3cxQixZQUFZVixvQkFBb0IsVUFBVzkwQixLQUFLNmI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JqRSxTQUFTaWIsR0FBaUJDLEVBQVMsR0FBSUMsRUFBUyxJQUM1QyxJQUFJQyxFQUFTLEdBQ2IsSUFBSyxJQUFJNTVCLEVBQUksRUFBR0EsRUFBSTI1QixFQUFRMzVCLElBQ3hCNDVCLEdBQVV0bkIsS0FBS3VuQixNQUFzQixHQUFoQnZuQixLQUFLc25CLFVBRTlCLE9BQU9GLEVBQVNFOzs7Ozs7Ozs7Ozs7Ozs7O0dBdkJwQjFCLEdBQVNLLFVBQVksR0E4Q3JCLE1BQU11QixHQUNGLFlBQVlsMEIsR0FDUmpELEtBQUtpRCxPQUFTQSxFQUNkakQsS0FBS20yQixTQUFXLElBQUlwTCxJQU94QixxQkFBcUJ5TCxHQUNiQSxFQUFRWSxpQkFDUlosRUFBUVksZUFBZUMsTUFBTXZDLG9CQUFvQixVQUFXMEIsRUFBUWMsV0FDcEVkLEVBQVFZLGVBQWVDLE1BQU14c0IsU0FFakM3SyxLQUFLbTJCLFNBQVNsQixPQUFPdUIsR0FlekIsWUFBWU4sRUFBV3h1QixFQUFNNnZCLEVBQVUsSUFDbkMsTUFBTUgsRUFBMkMsb0JBQW5CSSxlQUFpQyxJQUFJQSxlQUFtQixLQUN0RixJQUFLSixFQUNELE1BQU0sSUFBSTcyQixNQUFNLDBCQU1wQixJQUFJazNCLEVBQ0FqQixFQUNKLE9BQU8sSUFBSTV5QixRQUFRLENBQUNGLEVBQVNELEtBQ3pCLE1BQU13eUIsRUFBVWEsR0FBaUIsR0FBSSxJQUNyQ00sRUFBZUMsTUFBTUssUUFDckIsTUFBTUMsRUFBVzFrQixXQUFXLEtBQ3hCeFAsRUFBTyxJQUFJbEQsTUFBTSx1QkFDbEJnM0IsR0FDSGYsRUFBVSxDQUNOWSxpQkFDQSxVQUFVaEUsR0FDTixNQUFNNEMsRUFBZTVDLEVBQ3JCLEdBQUk0QyxFQUFhdHVCLEtBQUt1dUIsVUFBWUEsRUFHbEMsT0FBUUQsRUFBYXR1QixLQUFLNHVCLFFBQ3RCLElBQUssTUFFRHBqQixhQUFheWtCLEdBQ2JGLEVBQWtCeGtCLFdBQVcsS0FDekJ4UCxFQUFPLElBQUlsRCxNQUFNLGFBQ2xCLEtBQ0gsTUFDSixJQUFLLE9BRUQyUyxhQUFhdWtCLEdBQ2IvekIsRUFBUXN5QixFQUFhdHVCLEtBQUtxSyxVQUMxQixNQUNKLFFBQ0ltQixhQUFheWtCLEdBQ2J6a0IsYUFBYXVrQixHQUNiaDBCLEVBQU8sSUFBSWxELE1BQU0sd0JBS2pDUCxLQUFLbTJCLFNBQVMvUixJQUFJb1MsR0FDbEJZLEVBQWVDLE1BQU03UyxpQkFBaUIsVUFBV2dTLEVBQVFjLFdBQ3pEdDNCLEtBQUtpRCxPQUFPb3pCLFlBQVksQ0FDcEJILFlBQ0FELFVBQ0F2dUIsUUFDRCxDQUFDMHZCLEVBQWVRLFVBQ3BCQyxRQUFRLEtBQ0hyQixHQUNBeDJCLEtBQUs4M0IscUJBQXFCdEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQjFDLFNBQVN1QixLQUNMLE9BQU94eUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JYLFNBQVN5eUIsS0FDTCxZQUFrRCxJQUFuQ0QsS0FBNkIsbUJBQ0YsbUJBQS9CQSxLQUF5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ3hDLE1BQU1FLEdBQVUseUJBVWhCLE1BQU1DLEdBQ0YsWUFBWXRuQixHQUNSNVEsS0FBSzRRLFFBQVVBLEVBRW5CLFlBQ0ksT0FBTyxJQUFJaE4sUUFBUSxDQUFDRixFQUFTRCxLQUN6QnpELEtBQUs0USxRQUFRNFQsaUJBQWlCLFVBQVcsS0FDckM5Z0IsRUFBUTFELEtBQUs0USxRQUFRc1AsVUFFekJsZ0IsS0FBSzRRLFFBQVE0VCxpQkFBaUIsUUFBUyxLQUNuQy9nQixFQUFPekQsS0FBSzRRLFFBQVE3TixZQUtwQyxTQUFTbzFCLEdBQWVDLEVBQUlDLEdBQ3hCLE9BQU9ELEVBQ0ZFLFlBQVksQ0F6Qk8sd0JBeUJnQkQsRUFBYyxZQUFjLFlBQy9ERSxZQTFCbUIsd0JBZ0M1QixTQUFTQyxLQUNMLE1BQU01bkIsRUFBVTlKLFVBQVUyeEIsS0FBS1IsR0FsQ2hCLEdBbUNmLE9BQU8sSUFBSXIwQixRQUFRLENBQUNGLEVBQVNELEtBQ3pCbU4sRUFBUTRULGlCQUFpQixRQUFTLEtBQzlCL2dCLEVBQU9tTixFQUFRN04sU0FFbkI2TixFQUFRNFQsaUJBQWlCLGdCQUFpQixLQUN0QyxNQUFNNFQsRUFBS3huQixFQUFRc1AsT0FDbkIsSUFDSWtZLEVBQUdNLGtCQXpDUyx1QkF5QzhCLENBQUVDLFFBeENwQyxjQTBDWixNQUFPOTFCLEdBQ0hZLEVBQU9aLE1BR2YrTixFQUFRNFQsaUJBQWlCLFVBQVcxVCxVQUNoQyxNQUFNc25CLEVBQUt4bkIsRUFBUXNQLE9BS2RrWSxFQUFHUSxpQkFBaUIzd0IsU0FyRFQsd0JBNERadkUsRUFBUTAwQixJQUxSQSxFQUFHdnRCLGNBM0JuQixXQUNJLE1BQU0rRixFQUFVOUosVUFBVSt4QixlQUFlWixJQUN6QyxPQUFPLElBQUlDLEdBQVV0bkIsR0FBU2tvQixZQTBCWkMsR0FDTnIxQixRQUFjODBCLFdBUTlCMW5CLGVBQWVrb0IsR0FBV1osRUFBSXg1QixFQUFLTixHQUMvQixNQUFNc1MsRUFBVXVuQixHQUFlQyxHQUFJLEdBQU1hLElBQUksQ0FDekMsVUFBbUJyNkIsRUFDbkJOLFVBRUosT0FBTyxJQUFJNDVCLEdBQVV0bkIsR0FBU2tvQixZQU9sQyxTQUFTSSxHQUFjZCxFQUFJeDVCLEdBQ3ZCLE1BQU1nUyxFQUFVdW5CLEdBQWVDLEdBQUksR0FBTW5ELE9BQU9yMkIsR0FDaEQsT0FBTyxJQUFJczVCLEdBQVV0bkIsR0FBU2tvQixZQUlsQyxNQUFNSyxHQUNGLGNBQ0luNUIsS0FBS21GLEtBQU8sUUFDWm5GLEtBQUtpZCx1QkFBd0IsRUFDN0JqZCxLQUFLdXpCLFVBQVksR0FDakJ2ekIsS0FBS3d6QixXQUFhLEdBR2xCeHpCLEtBQUt5ekIsVUFBWSxLQUNqQnp6QixLQUFLbzVCLGNBQWdCLEVBQ3JCcDVCLEtBQUs2MUIsU0FBVyxLQUNoQjcxQixLQUFLcTVCLE9BQVMsS0FDZHI1QixLQUFLczVCLGdDQUFpQyxFQUN0Q3Q1QixLQUFLdTVCLG9CQUFzQixLQUUzQnY1QixLQUFLdzVCLDZCQUNEeDVCLEtBQUt5NUIsbUNBQW1DaHZCLEtBQUssT0FBVyxRQUVoRSxnQkFDSSxPQUFJekssS0FBS280QixLQUdUcDRCLEtBQUtvNEIsU0FBV0ksTUFGTHg0QixLQUFLbzRCLEdBS3BCLG1CQUFtQnNCLEdBQ2YsSUFBSUMsRUFBYyxFQUNsQixPQUNJLElBQ0ksTUFBTXZCLFFBQVdwNEIsS0FBSzQ1QixVQUN0QixhQUFhRixFQUFHdEIsR0FFcEIsTUFBT3YxQixHQUNILEdBQUk4MkIsSUFsQ2EsRUFtQ2IsTUFBTTkyQixFQUVON0MsS0FBS280QixLQUNMcDRCLEtBQUtvNEIsR0FBR3Z0QixRQUNSN0ssS0FBS280QixRQUFLOTBCLElBVTFCLHlDQUNJLE9BQU8wMEIsS0FBY2g0QixLQUFLNjVCLHFCQUF1Qjc1QixLQUFLODVCLG1CQUsxRCwyQkFDSTk1QixLQUFLNjFCLFNBQVdOLEdBQVMzbUIsYUEvSnRCb3BCLEtBQWNseUIsS0FBTyxNQWlLeEI5RixLQUFLNjFCLFNBQVNrRSxXQUFXLGFBQWdDanBCLE1BQU9rcEIsRUFBU3R5QixLQUU5RCxDQUNIdXlCLG9CQUZlajZCLEtBQUtrNkIsU0FFRHR6QixTQUFTYyxFQUFLOUksUUFJekNvQixLQUFLNjFCLFNBQVNrRSxXQUFXLE9BQW1CanBCLE1BQU9rcEIsRUFBU0csSUFDakQsQ0FBQyxlQVVoQix5QkFDSSxJQUFJbHJCLEVBQUl1TCxFQUdSLEdBREF4YSxLQUFLdTVCLDBCQXZNYnpvQixpQkFDSSxLQUFvQixPQUFkekwsZ0JBQW9DLElBQWRBLGVBQXVCLEVBQVNBLFVBQVUrMEIsZUFDbEUsT0FBTyxLQUVYLElBRUksYUFEMkIvMEIsVUFBVSswQixjQUFjQyxPQUMvQkMsT0FFeEIsTUFBT3JyQixHQUNILE9BQU8sTUE4TDBCc3JCLElBQzVCdjZCLEtBQUt1NUIsb0JBQ04sT0FFSnY1QixLQUFLcTVCLE9BQVMsSUFBSWxDLEdBQU9uM0IsS0FBS3U1QixxQkFFOUIsTUFBTWlCLFFBQWdCeDZCLEtBQUtxNUIsT0FBT29CLE1BQU0sT0FBbUIsR0FBSSxLQUMxREQsSUFHc0IsUUFBckJ2ckIsRUFBS3VyQixFQUFRLFVBQXVCLElBQVB2ckIsT0FBZ0IsRUFBU0EsRUFBR3luQixhQUNwQyxRQUFyQmxjLEVBQUtnZ0IsRUFBUSxVQUF1QixJQUFQaGdCLE9BQWdCLEVBQVNBLEVBQUdsYyxNQUFNc0ksU0FBUyxpQkFDMUU1RyxLQUFLczVCLGdDQUFpQyxHQVk5QywwQkFBMEIxNkIsR0FuTjlCLElBQ1FxUSxFQW1OQSxHQUFLalAsS0FBS3E1QixRQUNMcjVCLEtBQUt1NUIsdUJBbk5tRixRQUF4RnRxQixFQUFtQixPQUFkNUosZ0JBQW9DLElBQWRBLGVBQXVCLEVBQVNBLFVBQVUrMEIscUJBQWtDLElBQVBuckIsT0FBZ0IsRUFBU0EsRUFBR3lyQixhQUFlLFFBb04xRzE2QixLQUFLdTVCLG9CQUczQyxVQUNVdjVCLEtBQUtxNUIsT0FBT29CLE1BQU0sYUFBZ0MsQ0FBRTc3QixPQUUxRG9CLEtBQUtzNUIsK0JBQ0MsSUFDQSxJQUVWLE1BQU9ycUIsS0FJWCxxQkFDSSxJQUNJLElBQUtuSSxVQUNELE9BQU8sRUFFWCxNQUFNc3hCLFFBQVdJLEtBR2pCLGFBRk1RLEdBQVdaLEVBcDNCQyxRQW8zQjBCLFdBQ3RDYyxHQUFjZCxFQXIzQkYsVUFzM0JYLEVBRVgsTUFBT25wQixJQUNQLE9BQU8sRUFFWCx3QkFBd0IwckIsR0FDcEIzNkIsS0FBS281QixnQkFDTCxVQUNVdUIsSUFFVixRQUNJMzZCLEtBQUtvNUIsaUJBR2IsV0FBV3g2QixFQUFLTixHQUNaLE9BQU8wQixLQUFLNDZCLGtCQUFrQjlwQixnQkFDcEI5USxLQUFLNjZCLGFBQWN6QyxHQUFPWSxHQUFXWixFQUFJeDVCLEVBQUtOLElBQ3BEMEIsS0FBS3d6QixXQUFXNTBCLEdBQU9OLEVBQ2hCMEIsS0FBSzg2QixvQkFBb0JsOEIsS0FHeEMsV0FBV0EsR0FDUCxNQUFNc0osUUFBYWxJLEtBQUs2NkIsYUFBY3pDLEdBaEs5Q3RuQixlQUF5QnNuQixFQUFJeDVCLEdBQ3pCLE1BQU1nUyxFQUFVdW5CLEdBQWVDLEdBQUksR0FBT2w2QixJQUFJVSxHQUN4QzhJLFFBQWEsSUFBSXd3QixHQUFVdG5CLEdBQVNrb0IsWUFDMUMsWUFBZ0J4MUIsSUFBVG9FLEVBQXFCLEtBQU9BLEVBQUtwSixNQTZKU3k4QixDQUFVM0MsRUFBSXg1QixJQUUzRCxPQURBb0IsS0FBS3d6QixXQUFXNTBCLEdBQU9zSixFQUNoQkEsRUFFWCxjQUFjdEosR0FDVixPQUFPb0IsS0FBSzQ2QixrQkFBa0I5cEIsZ0JBQ3BCOVEsS0FBSzY2QixhQUFjekMsR0FBT2MsR0FBY2QsRUFBSXg1QixXQUMzQ29CLEtBQUt3ekIsV0FBVzUwQixHQUNoQm9CLEtBQUs4NkIsb0JBQW9CbDhCLEtBR3hDLGNBRUksTUFBTXNoQixRQUFlbGdCLEtBQUs2NkIsYUFBY3pDLElBQ3BDLE1BQU00QyxFQUFnQjdDLEdBQWVDLEdBQUksR0FBTzZDLFNBQ2hELE9BQU8sSUFBSS9DLEdBQVU4QyxHQUFlbEMsY0FFeEMsSUFBSzVZLEVBQ0QsTUFBTyxHQUdYLEdBQTJCLElBQXZCbGdCLEtBQUtvNUIsY0FDTCxNQUFPLEdBRVgsTUFBTTV3QixFQUFPLEdBQ1AweUIsRUFBZSxJQUFJblEsSUFDekIsSUFBSyxNQUFRb1EsVUFBV3Y4QixFQUFHLE1BQUVOLEtBQVc0aEIsRUFDcENnYixFQUFhOVcsSUFBSXhsQixHQUNib0csS0FBS0MsVUFBVWpGLEtBQUt3ekIsV0FBVzUwQixNQUFVb0csS0FBS0MsVUFBVTNHLEtBQ3hEMEIsS0FBS20wQixnQkFBZ0J2MUIsRUFBS04sR0FDMUJrSyxFQUFLcEgsS0FBS3hDLElBR2xCLElBQUssTUFBTXc4QixLQUFZcjlCLE9BQU95SyxLQUFLeEksS0FBS3d6QixZQUNoQ3h6QixLQUFLd3pCLFdBQVc0SCxLQUFjRixFQUFhM1AsSUFBSTZQLEtBRS9DcDdCLEtBQUttMEIsZ0JBQWdCaUgsRUFBVSxNQUMvQjV5QixFQUFLcEgsS0FBS2c2QixJQUdsQixPQUFPNXlCLEVBRVgsZ0JBQWdCNUosRUFBS20xQixHQUNqQi96QixLQUFLd3pCLFdBQVc1MEIsR0FBT20xQixFQUN2QixNQUFNUixFQUFZdnpCLEtBQUt1ekIsVUFBVTMwQixHQUNqQyxHQUFJMjBCLEVBQ0EsSUFBSyxNQUFNa0IsS0FBWXAwQixNQUFNcTBCLEtBQUtuQixHQUM5QmtCLEVBQVNWLEdBSXJCLGVBQ0kvekIsS0FBS3EwQixjQUNMcjBCLEtBQUt5ekIsVUFBWWtCLFlBQVk3akIsU0FBWTlRLEtBQUtrNkIsUUE1TXpCLEtBOE16QixjQUNRbDZCLEtBQUt5ekIsWUFDTG9CLGNBQWM3MEIsS0FBS3l6QixXQUNuQnp6QixLQUFLeXpCLFVBQVksTUFHekIsYUFBYTcwQixFQUFLNjFCLEdBQzZCLElBQXZDMTJCLE9BQU95SyxLQUFLeEksS0FBS3V6QixXQUFXL3pCLFFBQzVCUSxLQUFLKzBCLGVBRUovMEIsS0FBS3V6QixVQUFVMzBCLEtBQ2hCb0IsS0FBS3V6QixVQUFVMzBCLEdBQU8sSUFBSW1zQixJQUVyQi9xQixLQUFLa2MsS0FBS3RkLElBRW5Cb0IsS0FBS3V6QixVQUFVMzBCLEdBQUt3bEIsSUFBSXFRLEdBRTVCLGdCQUFnQjcxQixFQUFLNjFCLEdBQ2J6MEIsS0FBS3V6QixVQUFVMzBCLEtBQ2ZvQixLQUFLdXpCLFVBQVUzMEIsR0FBS3EyQixPQUFPUixHQUNNLElBQTdCejBCLEtBQUt1ekIsVUFBVTMwQixHQUFLczJCLGFBQ2JsMUIsS0FBS3V6QixVQUFVMzBCLElBR2EsSUFBdkNiLE9BQU95SyxLQUFLeEksS0FBS3V6QixXQUFXL3pCLFFBQzVCUSxLQUFLcTBCLGVBSWpCOEUsR0FBMEJoMEIsS0FBTyxRQU9qQyxNQUFNazJCLEdBQTRCbEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpRWxDLFNBQVNtQyxHQUFRNXhCLEdBRWIsT0FBTyxJQUFJOUYsUUFBUSxDQUFDRixFQUFTRCxLQUN6QixNQUFNMGYsRUFBS0MsU0FBU0MsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFQMUMsSUFDUXBVLEVBQUl1TCxFQU9KMkksRUFBR29ZLGFBQWEsTUFBTzd4QixHQUN2QnlaLEVBQUdxWSxPQUFTOTNCLEVBQ1p5ZixFQUFHc1ksUUFBVTU0QixJQUNULE1BQU1FLEVBQVE0SyxFQUFhLGtCQUMzQjVLLEVBQU1tRSxXQUFhckUsRUFDbkJZLEVBQU9WLElBRVhvZ0IsRUFBR2hlLEtBQU8sa0JBQ1ZnZSxFQUFHdVksUUFBVSxTQWR5RixRQUFsR2xoQixFQUFzRCxRQUFoRHZMLEVBQUttVSxTQUFTdVkscUJBQXFCLGVBQTRCLElBQVAxc0IsT0FBZ0IsRUFBU0EsRUFBRyxVQUF1QixJQUFQdUwsRUFBZ0JBLEVBQUs0SSxVQWUxR2lCLFlBQVlsQixLQUc3QyxTQUFTeVksR0FBc0I3RSxHQUMzQixNQUFPLEtBQUtBLElBQVNwbkIsS0FBS3VuQixNQUFzQixJQUFoQnZuQixLQUFLc25COzs7Ozs7Ozs7Ozs7Ozs7O0dBc0J6QyxNQUFNNEUsR0FDRixZQUFZaHVCLEdBQ1I3TixLQUFLNk4sS0FBT0EsRUFDWjdOLEtBQUs4N0IsUUFKWSxLQUtqQjk3QixLQUFLKzdCLFNBQVcsSUFBSXB0QixJQUV4QixPQUFPcXRCLEVBQVdDLEdBQ2QsTUFBTTkxQixFQUFLbkcsS0FBSzg3QixRQUdoQixPQUZBOTdCLEtBQUsrN0IsU0FBU2h0QixJQUFJNUksRUFBSSxJQUFJKzFCLEdBQVdGLEVBQVdoOEIsS0FBSzZOLEtBQUtqUSxLQUFNcStCLEdBQWMsS0FDOUVqOEIsS0FBSzg3QixVQUNFMzFCLEVBRVgsTUFBTWcyQixHQUNGLElBQUlsdEIsRUFDSixNQUFNOUksRUFBS2cyQixHQWZNLEtBZ0JzQixRQUFoQ2x0QixFQUFLalAsS0FBSys3QixTQUFTNzlCLElBQUlpSSxVQUF3QixJQUFQOEksR0FBeUJBLEVBQUdnbUIsU0FDM0VqMUIsS0FBSys3QixTQUFTOUcsT0FBTzl1QixHQUV6QixZQUFZZzJCLEdBQ1IsSUFBSWx0QixFQUNKLE1BQU05SSxFQUFLZzJCLEdBckJNLEtBc0JqQixPQUF5QyxRQUFoQ2x0QixFQUFLalAsS0FBSys3QixTQUFTNzlCLElBQUlpSSxVQUF3QixJQUFQOEksT0FBZ0IsRUFBU0EsRUFBR210QixnQkFBa0IsR0FFbkcsY0FBY0QsR0FDVixJQUFJbHRCLEVBQ0osTUFBTTlJLEVBQUtnMkIsR0ExQk0sS0E0QmpCLE9BRHVDLFFBQWhDbHRCLEVBQUtqUCxLQUFLKzdCLFNBQVM3OUIsSUFBSWlJLFVBQXdCLElBQVA4SSxHQUF5QkEsRUFBR290QixVQUNwRSxJQUdmLE1BQU1ILEdBQ0YsWUFBWUksRUFBZXZ1QixFQUFTOUUsR0FDaENqSixLQUFLaUosT0FBU0EsRUFDZGpKLEtBQUs0VSxRQUFVLEtBQ2Y1VSxLQUFLdThCLFNBQVUsRUFDZnY4QixLQUFLdzhCLGNBQWdCLEtBQ3JCeDhCLEtBQUt5OEIsYUFBZSxLQUNoQno4QixLQUFLcThCLFdBRVQsTUFBTUwsRUFBcUMsaUJBQWxCTSxFQUNuQmxaLFNBQVNzWixlQUFlSixHQUN4QkEsRUFDTmp1QixFQUFRMnRCLEVBQVcsaUJBQXVDLENBQUVqdUIsWUFDNUQvTixLQUFLZzhCLFVBQVlBLEVBQ2pCaDhCLEtBQUsyOEIsVUFBaUMsY0FBckIzOEIsS0FBS2lKLE9BQU9pc0IsS0FDekJsMUIsS0FBSzI4QixVQUNMMzhCLEtBQUtxOEIsVUFHTHI4QixLQUFLZzhCLFVBQVV4WCxpQkFBaUIsUUFBU3hrQixLQUFLeThCLGNBR3RELGNBRUksT0FEQXo4QixLQUFLNDhCLGlCQUNFNThCLEtBQUt3OEIsY0FFaEIsU0FDSXg4QixLQUFLNDhCLGlCQUNMNThCLEtBQUt1OEIsU0FBVSxFQUNYdjhCLEtBQUs0VSxVQUNMMUIsYUFBYWxULEtBQUs0VSxTQUNsQjVVLEtBQUs0VSxRQUFVLE1BRW5CNVUsS0FBS2c4QixVQUFVbEgsb0JBQW9CLFFBQVM5MEIsS0FBS3k4QixjQUVyRCxVQUNJejhCLEtBQUs0OEIsaUJBQ0Q1OEIsS0FBSzRVLFVBR1Q1VSxLQUFLNFUsUUFBVXJQLE9BQU8wTixXQUFXLEtBQzdCalQsS0FBS3c4QixjQTZCakIsU0FBMENLLEdBQ3RDLE1BQU1DLEVBQVEsR0FDUkMsRUFBZSxpRUFDckIsSUFBSyxJQUFJMS9CLEVBQUksRUFBR0EsRUFBSXcvQixFQUFLeC9CLElBQ3JCeS9CLEVBQU0xN0IsS0FBSzI3QixFQUFhNTZCLE9BQU93TixLQUFLdW5CLE1BQU12bkIsS0FBS3NuQixTQUFXOEYsRUFBYXY5QixVQUUzRSxPQUFPczlCLEVBQU16N0IsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OztHQW5DVzI3QixDQUFpQyxJQUN0RCxNQUFNLFNBQUVuNUIsRUFBVSxtQkFBb0JvNUIsR0FBb0JqOUIsS0FBS2lKLE9BQy9ELEdBQUlwRixFQUNBLElBQ0lBLEVBQVM3RCxLQUFLdzhCLGVBRWxCLE1BQU8zNUIsSUFFWDdDLEtBQUs0VSxRQUFVclAsT0FBTzBOLFdBQVcsS0FHN0IsR0FGQWpULEtBQUs0VSxRQUFVLEtBQ2Y1VSxLQUFLdzhCLGNBQWdCLEtBQ2pCUyxFQUNBLElBQ0lBLElBRUosTUFBT3A2QixJQUVQN0MsS0FBSzI4QixXQUNMMzhCLEtBQUtxOEIsV0EzRkcsTUFETCxNQWlHbkIsaUJBQ0ksR0FBSXI4QixLQUFLdThCLFFBQ0wsTUFBTSxJQUFJaDhCLE1BQU0sd0NBK0I1QixNQUFNMjhCLEdBQW1CdEIsR0FBc0IsT0FDekN1QixHQUF3QixJQUFJLEVBQU0sSUFBTyxLQUsvQyxNQUFNLEdBQ0YsY0FDSW45QixLQUFLbzlCLGFBQWUsR0FDcEJwOUIsS0FBSzg3QixRQUFVLEVBQ2Y5N0IsS0FBS3E5QiwwQkFBNEJ0RixLQUFVdUYsV0FFL0MsS0FBS3p2QixFQUFNMHZCLEVBQUssSUFFWixPQURBbHZCLEVBdURSLFNBQTZCa3ZCLEdBQ3pCLE9BQU9BLEVBQUcvOUIsUUFBVSxHQUFLLHlCQUF5QmdHLEtBQUsrM0IsR0F4RDNDQyxDQUFvQkQsR0FBSzF2QixFQUFNLGtCQUNuQzdOLEtBQUt5OUIseUJBQXlCRixHQUN2QjM1QixRQUFRRixRQUFRcTBCLEtBQVV1RixZQUU5QixJQUFJMTVCLFFBQVEsQ0FBQ0YsRUFBU0QsS0FDekIsTUFBTW9PLEVBQWlCa21CLEtBQVU5a0IsV0FBVyxLQUN4Q3hQLEVBQU9rSyxFQUFhRSxFQUFNLDRCQUMzQnN2QixHQUFzQmovQixPQUN6QjY1QixLQUFVbUYsSUFBb0IsS0FDMUJuRixLQUFVN2tCLGFBQWFyQixVQUNoQmttQixLQUFVbUYsSUFDakIsTUFBTVEsRUFBWTNGLEtBQVV1RixXQUM1QixJQUFLSSxFQUVELFlBREFqNkIsRUFBT2tLLEVBQWFFLEVBQU0sbUJBSzlCLE1BQU04dkIsRUFBU0QsRUFBVUMsT0FDekJELEVBQVVDLE9BQVMsQ0FBQzNCLEVBQVcveUIsS0FDM0IsTUFBTTIwQixFQUFXRCxFQUFPM0IsRUFBVy95QixHQUVuQyxPQURBakosS0FBSzg3QixVQUNFOEIsR0FFWDU5QixLQUFLbzlCLGFBQWVHLEVBQ3BCNzVCLEVBQVFnNkIsSUFPWnBDLEdBTFksNENBQXFCLFlBQVksQ0FDekNFLE9BQVEwQixHQUNSUyxPQUFRLFdBQ1JKLFFBRVN6NUIsTUFBTSxLQUNmb1AsYUFBYXJCLEdBQ2JwTyxFQUFPa0ssRUFBYUUsRUFBTSx1QkFJdEMscUJBQ0k3TixLQUFLODdCLFVBRVQseUJBQXlCeUIsR0FRckIsUUFBVXhGLEtBQVV1RixhQUNmQyxJQUFPdjlCLEtBQUtvOUIsY0FDVHA5QixLQUFLODdCLFFBQVUsR0FDZjk3QixLQUFLcTlCLDBCQU1yQixNQUFNUSxHQUNGLFdBQVdod0IsR0FDUCxPQUFPLElBQUlndUIsR0FBY2h1QixHQUU3Qjs7Ozs7Ozs7Ozs7Ozs7OztHQW1CSixNQUNNaXdCLEdBQWlCLENBQ25CQyxNQUFPLFFBQ1A1NEIsS0FBTSxTQU9WLE1BQU02NEIsR0F5QkYsWUFBWTFCLEVBQWVMLEVBQWFsK0IsT0FBT3lHLE9BQU8sR0FBSXM1QixJQUFpQm5NLEdBQ3ZFM3hCLEtBQUtpOEIsV0FBYUEsRUFPbEJqOEIsS0FBS21GLEtBM0NtQixZQTRDeEJuRixLQUFLaStCLFdBQVksRUFDakJqK0IsS0FBSzQ5QixTQUFXLEtBQ2hCNTlCLEtBQUtrK0IscUJBQXVCLElBQUluVCxJQUNoQy9xQixLQUFLbStCLGNBQWdCLEtBQ3JCbitCLEtBQUswOUIsVUFBWSxLQUNqQjE5QixLQUFLNk4sS0FBT3FVLEdBQVV5UCxHQUN0QjN4QixLQUFLbytCLFlBQXVDLGNBQXpCcCtCLEtBQUtpOEIsV0FBVy9HLEtBQ25DN21CLEVBQTRCLG9CQUFiK1UsU0FBMEJwakIsS0FBSzZOLEtBQU0sK0NBQ3BELE1BQU1tdUIsRUFBcUMsaUJBQWxCTSxFQUNuQmxaLFNBQVNzWixlQUFlSixHQUN4QkEsRUFDTmp1QixFQUFRMnRCLEVBQVdoOEIsS0FBSzZOLEtBQU0sa0JBQzlCN04sS0FBS2c4QixVQUFZQSxFQUNqQmg4QixLQUFLaThCLFdBQVdwNEIsU0FBVzdELEtBQUtxK0Isa0JBQWtCcitCLEtBQUtpOEIsV0FBV3A0QixVQUNsRTdELEtBQUtzK0IsaUJBQW1CdCtCLEtBQUs2TixLQUFLbVIsU0FBU0Msa0NBQ3JDLElBQUk0ZSxHQUNKLElBQUksR0FDVjc5QixLQUFLdStCLHdCQVFULGVBQ0l2K0IsS0FBS3crQixxQkFDTCxNQUFNcjRCLFFBQVduRyxLQUFLMjlCLFNBQ2hCRCxFQUFZMTlCLEtBQUt5K0IsdUJBQ2pCMXNCLEVBQVcyckIsRUFBVXRCLFlBQVlqMkIsR0FDdkMsT0FBSTRMLEdBR0csSUFBSW5PLFFBQVFGLElBQ2YsTUFBTWc3QixFQUFlMTZCLElBQ1pBLElBR0xoRSxLQUFLaytCLHFCQUFxQmpKLE9BQU95SixHQUNqQ2g3QixFQUFRTSxLQUVaaEUsS0FBS2srQixxQkFBcUI5WixJQUFJc2EsR0FDMUIxK0IsS0FBS28rQixhQUNMVixFQUFVckIsUUFBUWwyQixLQVM5QixTQUNJLElBQ0luRyxLQUFLdytCLHFCQUVULE1BQU8zN0IsR0FJSCxPQUFPZSxRQUFRSCxPQUFPWixHQUUxQixPQUFJN0MsS0FBS20rQixnQkFHVG4rQixLQUFLbStCLGNBQWdCbitCLEtBQUsyK0Isb0JBQW9CNzZCLE1BQU1qQixJQUVoRCxNQURBN0MsS0FBS20rQixjQUFnQixLQUNmdDdCLEtBSkM3QyxLQUFLbStCLGNBU3BCLFNBQ0luK0IsS0FBS3crQixxQkFDaUIsT0FBbEJ4K0IsS0FBSzQ5QixVQUNMNTlCLEtBQUt5K0IsdUJBQXVCRyxNQUFNNStCLEtBQUs0OUIsVUFNL0MsUUFDSTU5QixLQUFLdytCLHFCQUNMeCtCLEtBQUtpK0IsV0FBWSxFQUNqQmorQixLQUFLcytCLGlCQUFpQk8scUJBQ2pCNytCLEtBQUtvK0IsYUFDTnArQixLQUFLZzhCLFVBQVU4QyxXQUFXMzFCLFFBQVE0MUIsSUFDOUIvK0IsS0FBS2c4QixVQUFVZ0QsWUFBWUQsS0FJdkMsd0JBQ0kxd0IsR0FBU3JPLEtBQUtpOEIsV0FBV2dELFFBQVNqL0IsS0FBSzZOLEtBQU0sa0JBQzdDUSxFQUFRck8sS0FBS28rQixjQUFnQnArQixLQUFLZzhCLFVBQVVrRCxnQkFBaUJsL0IsS0FBSzZOLEtBQU0sa0JBQ3hFUSxFQUE0QixvQkFBYitVLFNBQTBCcGpCLEtBQUs2TixLQUFNLCtDQUV4RCxrQkFBa0JzeEIsR0FDZCxPQUFPbjdCLElBRUgsR0FEQWhFLEtBQUtrK0IscUJBQXFCLzBCLFFBQVFzckIsR0FBWUEsRUFBU3p3QixJQUMvQixtQkFBYm03QixFQUNQQSxFQUFTbjdCLFFBRVIsR0FBd0IsaUJBQWJtN0IsRUFBdUIsQ0FDbkMsTUFBTUMsRUFBYXJILEtBQVVvSCxHQUNILG1CQUFmQyxHQUNQQSxFQUFXcDdCLEtBSzNCLHFCQUNJcUssR0FBU3JPLEtBQUtpK0IsVUFBV2orQixLQUFLNk4sS0FBTSxrQkFFeEMsMEJBRUksU0FETTdOLEtBQUtxL0IsUUFDTnIvQixLQUFLNDlCLFNBQVUsQ0FDaEIsSUFBSTVCLEVBQVloOEIsS0FBS2c4QixVQUNyQixJQUFLaDhCLEtBQUtvK0IsWUFBYSxDQUNuQixNQUFNa0IsRUFBa0JsYyxTQUFTQyxjQUFjLE9BQy9DMlksRUFBVTNYLFlBQVlpYixHQUN0QnRELEVBQVlzRCxFQUVoQnQvQixLQUFLNDlCLFNBQVc1OUIsS0FBS3krQix1QkFBdUJkLE9BQU8zQixFQUFXaDhCLEtBQUtpOEIsWUFFdkUsT0FBT2o4QixLQUFLNDlCLFNBRWhCLGFBQ0l2dkIsRUFBUWUsTUFBcUI0b0IsS0FBYWg0QixLQUFLNk4sS0FBTSx3QkFZN0QsV0FDSSxJQUFJdVQsRUFBVyxLQUNmLE9BQU8sSUFBSXhkLFFBQVFGLElBQ2EsYUFBeEIwZixTQUFTbUIsWUFPYm5ELEVBQVcsSUFBTTFkLElBQ2pCNkIsT0FBT2lmLGlCQUFpQixPQUFRcEQsSUFQNUIxZCxNQVFMSSxNQUFNakIsSUFJTCxNQUhJdWUsR0FDQTdiLE9BQU91dkIsb0JBQW9CLE9BQVExVCxHQUVqQ3ZlOzs7Ozs7Ozs7Ozs7Ozs7O0dBM0JBMDhCLEdBQ052L0IsS0FBSzA5QixnQkFBa0IxOUIsS0FBS3MrQixpQkFBaUJrQixLQUFLeC9CLEtBQUs2TixLQUFNN04sS0FBSzZOLEtBQUswRCxtQkFBZ0JqTyxHQUN2RixNQUFNbThCOzs7Ozs7Ozs7Ozs7Ozs7OztBQTFjZDN1QixlQUFrQ2pELEdBQzlCLGFBQWVrRCxFQUFtQmxELEVBQU0sTUFBaUIsd0JBQWtENnhCLGtCQUFvQixHQXljckdDLENBQW1CMy9CLEtBQUs2TixNQUM5Q1EsRUFBUW94QixFQUFTei9CLEtBQUs2TixLQUFNLGtCQUM1QjdOLEtBQUtpOEIsV0FBV2dELFFBQVVRLEVBRTlCLHVCQUVJLE9BREFweEIsRUFBUXJPLEtBQUswOUIsVUFBVzE5QixLQUFLNk4sS0FBTSxrQkFDNUI3TixLQUFLMDlCLFdBdUNwQixNQUFNa0MsR0FDRixZQUFZL1ksRUFBZ0JnWixHQUN4QjcvQixLQUFLNm1CLGVBQWlCQSxFQUN0QjdtQixLQUFLNi9CLGVBQWlCQSxFQUUxQixRQUFRL1ksR0FDSixNQUFNZ1osRUFBaUJsWixHQUFvQm1aLGtCQUFrQi8vQixLQUFLNm1CLGVBQWdCQyxHQUNsRixPQUFPOW1CLEtBQUs2L0IsZUFBZUMsSUFpQ25DaHZCLGVBQWVrdkIsR0FBc0JueUIsRUFBTXdGLEVBQWE0c0IsR0FDcEQsTUFBTTdkLEVBQWVGLEdBQVVyVSxHQUN6QmdaLFFBQXVCcVosR0FBbUI5ZCxFQUFjL08sRUFBYSxZQUFtQjRzQixJQUM5RixPQUFPLElBQUlMLEdBQXVCL1ksRUFBZ0JYLEdBQVE2RixHQUFxQjNKLEVBQWM4RCxJQVdqR3BWLGVBQWVxdkIsR0FBb0I5ckIsRUFBTWhCLEVBQWE0c0IsR0FDbEQsTUFBTTVtQixFQUFlLFlBQW1CaEYsU0FDbEM2VyxJQUFvQixFQUFPN1IsRUFBYyxTQUMvQyxNQUFNd04sUUFBdUJxWixHQUFtQjdtQixFQUFheEwsS0FBTXdGLEVBQWEsWUFBbUI0c0IsSUFDbkcsT0FBTyxJQUFJTCxHQUF1Qi9ZLEVBQWdCWCxHQUFROEYsR0FBbUIzUyxFQUFjNk0sSUFhL0ZwVixlQUFlc3ZCLEdBQThCL3JCLEVBQU1oQixFQUFhNHNCLEdBQzVELE1BQU01bUIsRUFBZSxZQUFtQmhGLEdBQ2xDd1MsUUFBdUJxWixHQUFtQjdtQixFQUFheEwsS0FBTXdGLEVBQWEsWUFBbUI0c0IsSUFDbkcsT0FBTyxJQUFJTCxHQUF1Qi9ZLEVBQWdCWCxHQUFRK0YsR0FBNkI1UyxFQUFjNk0sSUFNekdwVixlQUFlb3ZCLEdBQW1CcnlCLEVBQU1tVSxFQUFTcWUsR0FDN0MsSUFBSXB4QixFQUNKLE1BQU1xeEIsUUFBdUJELEVBQVNFLFNBQ3RDLElBR0ksSUFBSUMsRUFTSixHQVhBbnlCLEVBQWtDLGlCQUFuQml5QixFQUE2Qnp5QixFQUFNLGtCQUNsRFEsRUFoVHdCLGNBZ1RoQmd5QixFQUFTbDdCLEtBQWtDMEksRUFBTSxrQkFHckQyeUIsRUFEbUIsaUJBQVp4ZSxFQUNZLENBQ2YzTyxZQUFhMk8sR0FJRUEsRUFFbkIsWUFBYXdlLEVBQWtCLENBQy9CLE1BQU1oUCxFQUFVZ1AsRUFBaUJoUCxRQUNqQyxHQUFJLGdCQUFpQmdQLEVBQWtCLENBQ25DbnlCLEVBQXlCLFdBQWpCbWpCLEVBQVFyc0IsS0FBZ0MwSSxFQUFNLGtCQVF0RCxhQWxzRGhCLFNBQTZCQSxFQUFNK0MsR0FDL0IsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLG1DQUFxRThDLEVBQW1COUMsRUFBTStDLElBMHJEOUc2dkIsQ0FBb0I1eUIsRUFBTSxDQUM3Q21JLFFBQVN3YixFQUFRaEksV0FDakJrWCxvQkFBcUIsQ0FDakJydEIsWUFBYW10QixFQUFpQm50QixZQUM5Qml0QixxQkFHUUssaUJBQWlCdFosWUFFaEMsQ0FDRGhaLEVBQXlCLFdBQWpCbWpCLEVBQVFyc0IsS0FBaUMwSSxFQUFNLGtCQUN2RCxNQUFNMGUsR0FBK0QsUUFBM0N0ZCxFQUFLdXhCLEVBQWlCSSx1QkFBb0MsSUFBUDN4QixPQUFnQixFQUFTQSxFQUFHL0ssTUFDckdzOEIsRUFBaUJLLGVBQ3JCeHlCLEVBQVFrZSxFQUFpQjFlLEVBQU0sNkJBUS9CLGFBdG9CaEIsU0FBNkJBLEVBQU0rQyxHQUMvQixPQUFPRyxFQUFtQmxELEVBQU0sT0FBbUIsK0JBQThEOEMsRUFBbUI5QyxFQUFNK0MsSUE4bkJ2R2t3QixDQUFvQmp6QixFQUFNLENBQzdDcWpCLHFCQUFzQk0sRUFBUWhJLFdBQzlCK0Msa0JBQ0F3VSxnQkFBaUIsQ0FDYlQscUJBR1FVLGtCQUFrQjNaLGFBR3JDLENBQ0QsTUFBTSxZQUFFQSxTQXJ6SXBCdlcsZUFBeUNqRCxFQUFNK0MsR0FDM0MsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLG9DQUFrRThDLEVBQW1COUMsRUFBTStDLElBb3pJeEdxd0IsQ0FBMEJwekIsRUFBTSxDQUMxRHdGLFlBQWFtdEIsRUFBaUJudEIsWUFDOUJpdEIsbUJBRUosT0FBT2paLEdBR2YsUUFDSWdaLEVBQVNhLFVBc0JqQnB3QixlQUFlcXdCLEdBQWtCOXNCLEVBQU1tVixTQUM3QmdDLEdBQVEsWUFBbUJuWCxHQUFPbVY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQzVDLE1BQU0sR0FLRixZQUFZM2IsR0FFUjdOLEtBQUt3VyxXQUFhLEdBQWtCdVIsWUFDcEMvbkIsS0FBSzZOLEtBQU9xVSxHQUFVclUsR0FpQzFCLGtCQUFrQnV6QixFQUFjQyxHQUM1QixPQUFPbkIsR0FBbUJsZ0MsS0FBSzZOLEtBQU11ekIsRUFBYyxZQUFtQkMsSUE2QjFFLGtCQUFrQnhhLEVBQWdCQyxHQUM5QixPQUFPRixHQUFvQm1aLGtCQUFrQmxaLEVBQWdCQyxHQU1qRSw0QkFBNEJrQyxHQUN4QixNQUFNUSxFQUFhUixFQUNuQixPQUFPLEdBQWtCTywyQkFBMkJDLEdBa0N4RCwyQkFBMkJ6bUIsR0FDdkIsT0FBTyxHQUFrQndtQiwyQkFBNEJ4bUIsRUFBTW1FLFlBQWMsSUFFN0UsbUNBQW9Db00sZUFBZ0I0VixJQUNoRCxJQUFLQSxFQUNELE9BQU8sS0FFWCxNQUFNLFlBQUU3VixFQUFXLGVBQUUwVCxHQUFtQm1DLEVBQ3hDLE9BQUk3VixHQUFlMFQsRUFDUkgsR0FBb0IwYSxtQkFBbUJqdUIsRUFBYTBULEdBRXhEOzs7Ozs7Ozs7Ozs7Ozs7OztBQTZCZixTQUFTd2EsR0FBcUIxekIsRUFBTTJ6QixHQUNoQyxPQUFJQSxFQUNPNXlCLEVBQWE0eUIsSUFFeEJuekIsRUFBUVIsRUFBS2lSLHVCQUF3QmpSLEVBQU0sa0JBQ3BDQSxFQUFLaVI7Ozs7Ozs7Ozs7Ozs7Ozs7R0E5QmhCLEdBQWtCaUosWUFBYyxRQUVoQyxHQUFrQjBaLHFCQUF1QixRQStDekMsTUFBTUMsV0FBc0IvYyxHQUN4QixZQUFZMWIsR0FDUjlCLE1BQU0sU0FBdUIsVUFDN0JuSCxLQUFLaUosT0FBU0EsRUFFbEIsb0JBQW9CNEUsR0FDaEIsT0FBT2tZLEdBQWNsWSxFQUFNN04sS0FBSzJoQyxvQkFFcEMsZUFBZTl6QixFQUFNbUksR0FDakIsT0FBTytQLEdBQWNsWSxFQUFNN04sS0FBSzJoQyxpQkFBaUIzckIsSUFFckQsNkJBQTZCbkksR0FDekIsT0FBT2tZLEdBQWNsWSxFQUFNN04sS0FBSzJoQyxvQkFFcEMsaUJBQWlCM3JCLEdBQ2IsTUFBTXBGLEVBQVUsQ0FDWjZWLFdBQVl6bUIsS0FBS2lKLE9BQU93ZCxXQUN4Qm1iLFVBQVc1aEMsS0FBS2lKLE9BQU8yNEIsVUFDdkJsYixTQUFVMW1CLEtBQUtpSixPQUFPeWQsU0FDdEI3VixTQUFVN1EsS0FBS2lKLE9BQU80SCxTQUN0Qm9WLGFBQWNqbUIsS0FBS2lKLE9BQU9nZCxhQUMxQk4sbUJBQW1CLEVBQ25Ca2MscUJBQXFCLEdBS3pCLE9BSEk3ckIsSUFDQXBGLEVBQVFvRixRQUFVQSxHQUVmcEYsR0FHZixTQUFTa3hCLEdBQVE3NEIsR0FDYixPQUFPNmlCLEdBQXNCN2lCLEVBQU80RSxLQUFNLElBQUk2ekIsR0FBY3o0QixHQUFTQSxFQUFPcUwsaUJBRWhGLFNBQVN5dEIsR0FBUTk0QixHQUNiLE1BQU0sS0FBRTRFLEVBQUksS0FBRXdHLEdBQVNwTCxFQUV2QixPQURBb0YsRUFBUWdHLEVBQU14RyxFQUFNLGtCQUNiK2QsR0FBZ0J2WCxFQUFNLElBQUlxdEIsR0FBY3o0QixHQUFTQSxFQUFPcUwsaUJBRW5FeEQsZUFBZWt4QixHQUFNLzRCLEdBQ2pCLE1BQU0sS0FBRTRFLEVBQUksS0FBRXdHLEdBQVNwTCxFQUV2QixPQURBb0YsRUFBUWdHLEVBQU14RyxFQUFNLGtCQUNiMmQsR0FBUW5YLEVBQU0sSUFBSXF0QixHQUFjejRCLEdBQVNBLEVBQU9xTDs7Ozs7Ozs7Ozs7Ozs7OztHQXVCM0QsTUFBTTJ0QixHQUNGLFlBQVlwMEIsRUFBTW9KLEVBQVFtSyxFQUFVL00sRUFBTUMsR0FBa0IsR0FDeER0VSxLQUFLNk4sS0FBT0EsRUFDWjdOLEtBQUtvaEIsU0FBV0EsRUFDaEJwaEIsS0FBS3FVLEtBQU9BLEVBQ1pyVSxLQUFLc1UsZ0JBQWtCQSxFQUN2QnRVLEtBQUtraUMsZUFBaUIsS0FDdEJsaUMsS0FBS21pQyxhQUFlLEtBQ3BCbmlDLEtBQUtpWCxPQUFTNVcsTUFBTUMsUUFBUTJXLEdBQVVBLEVBQVMsQ0FBQ0EsR0FFcEQsVUFDSSxPQUFPLElBQUlyVCxRQUFRa04sTUFBT3BOLEVBQVNELEtBQy9CekQsS0FBS2tpQyxlQUFpQixDQUFFeCtCLFVBQVNELFVBQ2pDLElBQ0l6RCxLQUFLbWlDLG1CQUFxQm5pQyxLQUFLb2hCLFNBQVM1QixZQUFZeGYsS0FBSzZOLFlBQ25EN04sS0FBS29pQyxjQUNYcGlDLEtBQUttaUMsYUFBYUUsaUJBQWlCcmlDLE1BRXZDLE1BQU82QyxHQUNIN0MsS0FBS3lELE9BQU9aLE1BSXhCLGtCQUFrQnV3QixHQUNkLE1BQU0sWUFBRWtQLEVBQVcsVUFBRVYsRUFBUyxTQUFFbGIsRUFBUSxTQUFFN1YsRUFBUSxNQUFFOU4sRUFBSyxLQUFFb0MsR0FBU2l1QixFQUNwRSxHQUFJcndCLEVBRUEsWUFEQS9DLEtBQUt5RCxPQUFPVixHQUdoQixNQUFNa0csRUFBUyxDQUNYNEUsS0FBTTdOLEtBQUs2TixLQUNYNFksV0FBWTZiLEVBQ1pWLFVBQVdBLEVBQ1gvd0IsU0FBVUEsUUFBWXZOLEVBQ3RCb2pCLFNBQVVBLFFBQVlwakIsRUFDdEIrUSxLQUFNclUsS0FBS3FVLEtBQ1hDLGdCQUFpQnRVLEtBQUtzVSxpQkFFMUIsSUFDSXRVLEtBQUswRCxjQUFjMUQsS0FBS3VpQyxXQUFXcDlCLEVBQWhCbkYsQ0FBc0JpSixJQUU3QyxNQUFPcEcsR0FDSDdDLEtBQUt5RCxPQUFPWixJQUdwQixRQUFRRSxHQUNKL0MsS0FBS3lELE9BQU9WLEdBRWhCLFdBQVdvQyxHQUNQLE9BQVFBLEdBQ0osSUFBSyxpQkFDTCxJQUFLLG9CQUNELE9BQU8yOEIsR0FDWCxJQUFLLGVBQ0wsSUFBSyxrQkFDRCxPQUFPRSxHQUNYLElBQUssaUJBQ0wsSUFBSyxvQkFDRCxPQUFPRCxHQUNYLFFBQ0l4MEIsRUFBTXZOLEtBQUs2TixLQUFNLG1CQUc3QixRQUFRcVksR0FDSnpYLEVBQVl6TyxLQUFLa2lDLGVBQWdCLGlDQUNqQ2xpQyxLQUFLa2lDLGVBQWV4K0IsUUFBUXdpQixHQUM1QmxtQixLQUFLd2lDLHVCQUVULE9BQU96L0IsR0FDSDBMLEVBQVl6TyxLQUFLa2lDLGVBQWdCLGlDQUNqQ2xpQyxLQUFLa2lDLGVBQWV6K0IsT0FBT1YsR0FDM0IvQyxLQUFLd2lDLHVCQUVULHVCQUNReGlDLEtBQUttaUMsY0FDTG5pQyxLQUFLbWlDLGFBQWFNLG1CQUFtQnppQyxNQUV6Q0EsS0FBS2tpQyxlQUFpQixLQUN0QmxpQyxLQUFLMGlDOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JiLE1BQU1DLEdBQTZCLElBQUksRUFBTSxJQUFNLEtBOEJuRDd4QixlQUFlOHhCLEdBQWdCLzBCLEVBQU00SSxFQUFVMkssR0FDM0MsTUFBTWdCLEVBQWVGLEdBQVVyVSxHQUMvQkcsRUFBa0JILEVBQU00SSxFQUFVNFIsSUFDbEMsTUFBTXdhLEVBQW1CdEIsR0FBcUJuZixFQUFjaEIsR0FFNUQsT0FEZSxJQUFJMGhCLEdBQWUxZ0IsRUFBYyxpQkFBMEMzTCxFQUFVb3NCLEdBQ3RGRSxpQkEyQmxCanlCLGVBQWVreUIsR0FBd0IzdUIsRUFBTW9DLEVBQVUySyxHQUNuRCxNQUFNL0gsRUFBZSxZQUFtQmhGLEdBQ3hDckcsRUFBa0JxTCxFQUFheEwsS0FBTTRJLEVBQVU0UixJQUMvQyxNQUFNd2EsRUFBbUJ0QixHQUFxQmxvQixFQUFheEwsS0FBTXVULEdBRWpFLE9BRGUsSUFBSTBoQixHQUFlenBCLEVBQWF4TCxLQUFNLGlCQUF5QzRJLEVBQVVvc0IsRUFBa0J4cEIsR0FDNUcwcEIsaUJBMEJsQmp5QixlQUFlbXlCLEdBQWM1dUIsRUFBTW9DLEVBQVUySyxHQUN6QyxNQUFNL0gsRUFBZSxZQUFtQmhGLEdBQ3hDckcsRUFBa0JxTCxFQUFheEwsS0FBTTRJLEVBQVU0UixJQUMvQyxNQUFNd2EsRUFBbUJ0QixHQUFxQmxvQixFQUFheEwsS0FBTXVULEdBRWpFLE9BRGUsSUFBSTBoQixHQUFlenBCLEVBQWF4TCxLQUFNLGVBQXFDNEksRUFBVW9zQixFQUFrQnhwQixHQUN4RzBwQixpQkFPbEIsTUFBTUQsV0FBdUJiLEdBQ3pCLFlBQVlwMEIsRUFBTW9KLEVBQVFSLEVBQVUySyxFQUFVL00sR0FDMUNsTixNQUFNMEcsRUFBTW9KLEVBQVFtSyxFQUFVL00sR0FDOUJyVSxLQUFLeVcsU0FBV0EsRUFDaEJ6VyxLQUFLa2pDLFdBQWEsS0FDbEJsakMsS0FBS21qQyxPQUFTLEtBQ1ZMLEdBQWVNLG9CQUNmTixHQUFlTSxtQkFBbUJDLFNBRXRDUCxHQUFlTSxtQkFBcUJwakMsS0FFeEMsdUJBQ0ksTUFBTWtnQixRQUFlbGdCLEtBQUtxOEIsVUFFMUIsT0FEQWh1QixFQUFRNlIsRUFBUWxnQixLQUFLNk4sS0FBTSxrQkFDcEJxUyxFQUVYLG9CQUNJelIsRUFBbUMsSUFBdkJ6TyxLQUFLaVgsT0FBT3pYLE9BQWMsMENBQ3RDLE1BQU15MkIsRUFBVWEsS0FDaEI5MkIsS0FBS2tqQyxpQkFBbUJsakMsS0FBS29oQixTQUFTa2lCLFdBQVd0akMsS0FBSzZOLEtBQU03TixLQUFLeVcsU0FBVXpXLEtBQUtpWCxPQUFPLEdBQ3ZGZ2YsR0FDQWoyQixLQUFLa2pDLFdBQVdLLGdCQUFrQnROLEVBUWxDajJCLEtBQUtvaEIsU0FBU29pQixrQkFBa0J4akMsS0FBSzZOLE1BQU0vSixNQUFNakIsSUFDN0M3QyxLQUFLeUQsT0FBT1osS0FFaEI3QyxLQUFLb2hCLFNBQVNxaUIsNkJBQTZCempDLEtBQUs2TixLQUFNNjFCLElBQzdDQSxHQUNEMWpDLEtBQUt5RCxPQUFPa0ssRUFBYTNOLEtBQUs2TixLQUFNLDhCQUk1QzdOLEtBQUsyakMsdUJBRVQsY0FDSSxJQUFJMTBCLEVBQ0osT0FBbUMsUUFBMUJBLEVBQUtqUCxLQUFLa2pDLGtCQUErQixJQUFQajBCLE9BQWdCLEVBQVNBLEVBQUdzMEIsa0JBQW9CLEtBRS9GLFNBQ0l2akMsS0FBS3lELE9BQU9rSyxFQUFhM04sS0FBSzZOLEtBQU0sNEJBRXhDLFVBQ1E3TixLQUFLa2pDLFlBQ0xsakMsS0FBS2tqQyxXQUFXcjRCLFFBRWhCN0ssS0FBS21qQyxRQUNMNTlCLE9BQU8yTixhQUFhbFQsS0FBS21qQyxRQUU3Qm5qQyxLQUFLa2pDLFdBQWEsS0FDbEJsakMsS0FBS21qQyxPQUFTLEtBQ2RMLEdBQWVNLG1CQUFxQixLQUV4Qyx1QkFDSSxNQUFNL1AsRUFBTyxLQUNULElBQUlwa0IsRUFBSXVMLEdBQzZFLFFBQWhGQSxFQUFnQyxRQUExQnZMLEVBQUtqUCxLQUFLa2pDLGtCQUErQixJQUFQajBCLE9BQWdCLEVBQVNBLEVBQUcxSixjQUEyQixJQUFQaVYsT0FBZ0IsRUFBU0EsRUFBR29wQixRQUlySDVqQyxLQUFLbWpDLE9BQVM1OUIsT0FBTzBOLFdBQVcsS0FDNUJqVCxLQUFLbWpDLE9BQVMsS0FDZG5qQyxLQUFLeUQsT0FBT2tLLEVBQWEzTixLQUFLNk4sS0FBTSwwQkFDckMsS0FHUDdOLEtBQUttakMsT0FBUzU5QixPQUFPME4sV0FBV29nQixFQUFNc1AsR0FBMkJ6a0MsUUFFckVtMUIsS0FLUnlQLEdBQWVNLG1CQUFxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQnBDLE1BR01TLEdBQXFCLElBQUlsMUIsSUFDL0IsTUFBTW0xQixXQUF1QjdCLEdBQ3pCLFlBQVlwMEIsRUFBTXVULEVBQVU5TSxHQUFrQixHQUMxQ25OLE1BQU0wRyxFQUFNLENBQ1Isb0JBQ0Esa0JBQ0Esb0JBQ0EsV0FDRHVULE9BQVU5ZCxFQUFXZ1IsR0FDeEJ0VSxLQUFLaTJCLFFBQVUsS0FNbkIsZ0JBQ0ksSUFBSThOLEVBQWVGLEdBQW1CM2xDLElBQUk4QixLQUFLNk4sS0FBS3VOLFFBQ3BELElBQUsyb0IsRUFBYyxDQUNmLElBQ0ksTUFDTTdqQixRQXNDdEJwUCxlQUFpRHNRLEVBQVV2VCxHQUN2RCxNQUFNalAsRUFBTW9sQyxHQUFtQm4yQixHQUN6QjROLEVBQWN3b0IsR0FBb0I3aUIsR0FDeEMsVUFBWTNGLEVBQVlvQixlQUNwQixPQUFPLEVBRVgsTUFBTXFuQixFQUF1RCxlQUEzQnpvQixFQUFZUyxLQUFLdGQsR0FFbkQsYUFETTZjLEVBQVlXLFFBQVF4ZCxHQUNuQnNsQyxFQS9Dc0NDLENBQWtDbmtDLEtBQUtvaEIsU0FBVXBoQixLQUFLNk4sWUFDN0MxRyxNQUFNazFCLFVBQVksS0FDNUQwSCxFQUFlLElBQU1uZ0MsUUFBUUYsUUFBUXdjLEdBRXpDLE1BQU9yZCxHQUNIa2hDLEVBQWUsSUFBTW5nQyxRQUFRSCxPQUFPWixHQUV4Q2doQyxHQUFtQjkwQixJQUFJL08sS0FBSzZOLEtBQUt1TixPQUFRMm9CLEdBTzdDLE9BSEsvakMsS0FBS3NVLGlCQUNOdXZCLEdBQW1COTBCLElBQUkvTyxLQUFLNk4sS0FBS3VOLE9BQVEsSUFBTXhYLFFBQVFGLFFBQVEsT0FFNURxZ0MsSUFFWCxrQkFBa0IzUSxHQUNkLEdBQW1CLHNCQUFmQSxFQUFNanVCLEtBQ04sT0FBT2dDLE1BQU1pOUIsWUFBWWhSLEdBRXhCLEdBQW1CLFlBQWZBLEVBQU1qdUIsTUFLZixHQUFJaXVCLEVBQU02QyxRQUFTLENBQ2YsTUFBTTVoQixRQUFhclUsS0FBSzZOLEtBQUt3MkIsbUJBQW1CalIsRUFBTTZDLFNBQ3RELEdBQUk1aEIsRUFFQSxPQURBclUsS0FBS3FVLEtBQU9BLEVBQ0xsTixNQUFNaTlCLFlBQVloUixHQUd6QnB6QixLQUFLMEQsUUFBUSxZQVZqQjFELEtBQUswRCxRQUFRLE1BY3JCLHFCQUNBLFlBWUpvTixlQUFld3pCLEdBQTBCbGpCLEVBQVV2VCxHQUMvQyxPQUFPbzJCLEdBQW9CN2lCLEdBQVVwRixLQUFLZ29CLEdBQW1CbjJCLEdBQU8sUUFLeEUsU0FBU28yQixHQUFvQjdpQixHQUN6QixPQUFPeFMsRUFBYXdTLEVBQVNDLHNCQUVqQyxTQUFTMmlCLEdBQW1CbjJCLEdBQ3hCLE9BQU8wTixFQWpGa0Isa0JBaUZ3QjFOLEVBQUtpQyxPQUFPc0IsT0FBUXZELEVBQUtqUTs7Ozs7Ozs7Ozs7Ozs7OztHQTBEOUUsU0FBUzJtQyxHQUFtQjEyQixFQUFNNEksRUFBVTJLLEdBQ3hDLE9BRUp0USxlQUFtQ2pELEVBQU00SSxFQUFVMkssR0FDL0MsTUFBTWdCLEVBQWVGLEdBQVVyVSxHQUMvQkcsRUFBa0JILEVBQU00SSxFQUFVNFIsSUFDbEMsTUFBTXdhLEVBQW1CdEIsR0FBcUJuZixFQUFjaEIsR0FFNUQsYUFETWtqQixHQUEwQnpCLEVBQWtCemdCLEdBQzNDeWdCLEVBQWlCMkIsY0FBY3BpQixFQUFjM0wsRUFBVSxxQkFQdkRndUIsQ0FBb0I1MkIsRUFBTTRJLEVBQVUySyxHQXFDL0MsU0FBU3NqQixHQUEyQnJ3QixFQUFNb0MsRUFBVTJLLEdBQ2hELE9BRUp0USxlQUEyQ3VELEVBQU1vQyxFQUFVMkssR0FDdkQsTUFBTS9ILEVBQWUsWUFBbUJoRixHQUN4Q3JHLEVBQWtCcUwsRUFBYXhMLEtBQU00SSxFQUFVNFIsSUFFL0MsTUFBTXdhLEVBQW1CdEIsR0FBcUJsb0IsRUFBYXhMLEtBQU11VCxTQUMzRGtqQixHQUEwQnpCLEVBQWtCeHBCLEVBQWF4TCxNQUMvRCxNQUFNb29CLFFBQWdCME8sR0FBdUJ0ckIsR0FDN0MsT0FBT3dwQixFQUFpQjJCLGNBQWNuckIsRUFBYXhMLEtBQU00SSxFQUFVLG9CQUErQ3dmLEdBVDNHMk8sQ0FBNEJ2d0IsRUFBTW9DLEVBQVUySyxHQW9DdkQsU0FBU3lqQixHQUFpQnh3QixFQUFNb0MsRUFBVTJLLEdBQ3RDLE9BRUp0USxlQUFpQ3VELEVBQU1vQyxFQUFVMkssR0FDN0MsTUFBTS9ILEVBQWUsWUFBbUJoRixHQUN4Q3JHLEVBQWtCcUwsRUFBYXhMLEtBQU00SSxFQUFVNFIsSUFFL0MsTUFBTXdhLEVBQW1CdEIsR0FBcUJsb0IsRUFBYXhMLEtBQU11VCxTQUMzRDhKLElBQW9CLEVBQU83UixFQUFjNUMsRUFBU0Qsa0JBQ2xEOHRCLEdBQTBCekIsRUFBa0J4cEIsRUFBYXhMLE1BQy9ELE1BQU1vb0IsUUFBZ0IwTyxHQUF1QnRyQixHQUM3QyxPQUFPd3BCLEVBQWlCMkIsY0FBY25yQixFQUFheEwsS0FBTTRJLEVBQVUsa0JBQTJDd2YsR0FWdkc2TyxDQUFrQnp3QixFQUFNb0MsRUFBVTJLLEdBbUQ3Q3RRLGVBQWVpMEIsR0FBa0JsM0IsRUFBTXVULEdBRW5DLGFBRE1jLEdBQVVyVSxHQUFNZ1IsdUJBQ2ZtbUIsR0FBbUJuM0IsRUFBTXVULEdBQVUsR0FFOUN0USxlQUFlazBCLEdBQW1CbjNCLEVBQU1vM0IsRUFBZ0Izd0IsR0FBa0IsR0FDdEUsTUFBTThOLEVBQWVGLEdBQVVyVSxHQUN6QnVULEVBQVdtZ0IsR0FBcUJuZixFQUFjNmlCLEdBQzlDcmpCLEVBQVMsSUFBSWtpQixHQUFlMWhCLEVBQWNoQixFQUFVOU0sR0FDcEQ0TCxRQUFlMEIsRUFBT3lhLFVBTTVCLE9BTEluYyxJQUFXNUwsV0FDSjRMLEVBQU83TCxLQUFLa0csdUJBQ2I2SCxFQUFhakosc0JBQXNCK0csRUFBTzdMLFlBQzFDK04sRUFBYTVCLGlCQUFpQixLQUFNeWtCLElBRXZDL2tCLEVBRVhwUCxlQUFlNnpCLEdBQXVCdHdCLEdBQ2xDLE1BQU00aEIsRUFBVWEsR0FBb0J6aUIsRUFBS25RLElBQVIsT0FJakMsT0FIQW1RLEVBQUtrRyxpQkFBbUIwYixRQUNsQjVoQixFQUFLeEcsS0FBSzJTLGlCQUFpQm5NLFNBQzNCQSxFQUFLeEcsS0FBS3NMLHNCQUFzQjlFLEdBQy9CNGhCOzs7Ozs7Ozs7Ozs7Ozs7O0dBc0JYLE1BQU1pUCxHQUNGLFlBQVlyM0IsR0FDUjdOLEtBQUs2TixLQUFPQSxFQUNaN04sS0FBS21sQyxnQkFBa0IsSUFBSXBhLElBQzNCL3FCLEtBQUtvbEMsVUFBWSxJQUFJcmEsSUFDckIvcUIsS0FBS3FsQyxvQkFBc0IsS0FDM0JybEMsS0FBS3NsQyw2QkFBOEIsRUFDbkN0bEMsS0FBS3VsQyx1QkFBeUJuaUMsS0FBSytSLE1BRXZDLGlCQUFpQnF3QixHQUNieGxDLEtBQUtvbEMsVUFBVWhoQixJQUFJb2hCLEdBQ2Z4bEMsS0FBS3FsQyxxQkFDTHJsQyxLQUFLeWxDLG1CQUFtQnpsQyxLQUFLcWxDLG9CQUFxQkcsS0FDbER4bEMsS0FBSzBsQyxlQUFlMWxDLEtBQUtxbEMsb0JBQXFCRyxHQUM5Q3hsQyxLQUFLMmxDLGlCQUFpQjNsQyxLQUFLcWxDLHFCQUMzQnJsQyxLQUFLcWxDLG9CQUFzQixNQUduQyxtQkFBbUJHLEdBQ2Z4bEMsS0FBS29sQyxVQUFVblEsT0FBT3VRLEdBRTFCLFFBQVFwUyxHQUVKLEdBQUlwekIsS0FBSzRsQyxvQkFBb0J4UyxHQUN6QixPQUFPLEVBRVgsSUFBSXlTLEdBQVUsRUFRZCxPQVBBN2xDLEtBQUtvbEMsVUFBVWo4QixRQUFRMjhCLElBQ2Y5bEMsS0FBS3lsQyxtQkFBbUJyUyxFQUFPMFMsS0FDL0JELEdBQVUsRUFDVjdsQyxLQUFLMGxDLGVBQWV0UyxFQUFPMFMsR0FDM0I5bEMsS0FBSzJsQyxpQkFBaUJ2UyxNQUcxQnB6QixLQUFLc2xDLDhCQWdEakIsU0FBeUJsUyxHQUNyQixPQUFRQSxFQUFNanVCLE1BQ1YsSUFBSyxvQkFDTCxJQUFLLGtCQUNMLElBQUssb0JBQ0QsT0FBTyxFQUNYLElBQUssVUFDRCxPQUFPNGdDLEdBQW9CM1MsR0FDL0IsUUFDSSxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBekQ4QjRTLENBQWdCNVMsS0FLekRwekIsS0FBS3NsQyw2QkFBOEIsRUFFOUJPLElBQ0Q3bEMsS0FBS3FsQyxvQkFBc0JqUyxFQUMzQnlTLEdBQVUsSUFOSEEsRUFVZixlQUFlelMsRUFBTzBTLEdBQ2xCLElBQUk3MkIsRUFDSixHQUFJbWtCLEVBQU1yd0IsUUFBVWdqQyxHQUFvQjNTLEdBQVEsQ0FDNUMsTUFBTXBzQixHQUFvQyxRQUEzQmlJLEVBQUtta0IsRUFBTXJ3QixNQUFNaUUsWUFBeUIsSUFBUGlJLE9BQWdCLEVBQVNBLEVBQUcxRixNQUFNLFNBQVMsS0FDekYsaUJBQ0p1OEIsRUFBU0csUUFBUXQ0QixFQUFhM04sS0FBSzZOLEtBQU03RyxTQUd6QzgrQixFQUFTMUIsWUFBWWhSLEdBRzdCLG1CQUFtQkEsRUFBTzBTLEdBQ3RCLE1BQU1JLEVBQXNDLE9BQXJCSixFQUFTN1AsV0FDekI3QyxFQUFNNkMsU0FBVzdDLEVBQU02QyxVQUFZNlAsRUFBUzdQLFFBQ25ELE9BQU82UCxFQUFTN3VCLE9BQU9yUSxTQUFTd3NCLEVBQU1qdUIsT0FBUytnQyxFQUVuRCxvQkFBb0I5UyxHQUtoQixPQUpJaHdCLEtBQUsrUixNQUFRblYsS0FBS3VsQyx3QkFqRWMsS0FtRWhDdmxDLEtBQUttbEMsZ0JBQWdCZ0IsUUFFbEJubUMsS0FBS21sQyxnQkFBZ0I1WixJQUFJNmEsR0FBU2hULElBRTdDLGlCQUFpQkEsR0FDYnB6QixLQUFLbWxDLGdCQUFnQi9nQixJQUFJZ2lCLEdBQVNoVCxJQUNsQ3B6QixLQUFLdWxDLHVCQUF5Qm5pQyxLQUFLK1IsT0FHM0MsU0FBU2l4QixHQUFTdmpDLEdBQ2QsTUFBTyxDQUFDQSxFQUFFc0MsS0FBTXRDLEVBQUVvekIsUUFBU3B6QixFQUFFKytCLFVBQVcvK0IsRUFBRWdPLFVBQVVvRyxPQUFPb3ZCLEdBQUtBLEdBQUdobEMsS0FBSyxLQUU1RSxTQUFTMGtDLElBQW9CLEtBQUU1Z0MsRUFBSSxNQUFFcEMsSUFDakMsTUFBaUIsWUFBVG9DLEdBQzJELHdCQUE5RHBDLGFBQXFDLEVBQVNBLEVBQU1pRSxNQStCN0Q4SixlQUFldzFCLEdBQWtCejRCLEVBQU0rQyxFQUFVLElBQzdDLE9BQU9HLEVBQW1CbEQsRUFBTSxNQUFpQixlQUF5QytDOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUI5RixNQUFNMjFCLEdBQW1CLHVDQUNuQkMsR0FBYSxVQW9CbkIsU0FBU0MsR0FBWTlhLEdBQ2pCLE1BQU0rYSxFQUFhMTNCLEtBQ2IsU0FBRU0sRUFBUSxTQUFFcTNCLEdBQWEsSUFBSUMsSUFBSUYsR0FDdkMsR0FBSS9hLEVBQVMxYixXQUFXLHVCQUF3QixDQUM1QyxNQUFNNDJCLEVBQVEsSUFBSUQsSUFBSWpiLEdBQ3RCLE1BQXVCLEtBQW5Ca2IsRUFBTUYsVUFBZ0MsS0FBYkEsRUFFSixzQkFBYnIzQixHQUNKcWMsRUFBU2pwQixRQUFRLHNCQUF1QixNQUNwQ2drQyxFQUFXaGtDLFFBQVEsc0JBQXVCLElBRWxDLHNCQUFiNE0sR0FBb0N1M0IsRUFBTUYsV0FBYUEsRUFFbEUsSUFBS0gsR0FBV2hoQyxLQUFLOEosR0FDakIsT0FBTyxFQUVYLEdBQUlpM0IsR0FBaUIvZ0MsS0FBS21tQixHQUd0QixPQUFPZ2IsSUFBYWhiLEVBR3hCLE1BQU1tYixFQUF1Qm5iLEVBQVNqcEIsUUFBUSxNQUFPLE9BSXJELE9BRFcsSUFBSXFrQyxPQUFPLFVBQVlELEVBQXVCLElBQU1BLEVBQXVCLEtBQU0sS0FDbEZ0aEMsS0FBS21oQzs7Ozs7Ozs7Ozs7Ozs7OztHQW1CbkIsTUFBTUssR0FBa0IsSUFBSSxFQUFNLElBQU8sS0FLekMsU0FBU0MsS0FJTCxNQUFNQyxFQUFTblAsS0FBVW9QLE9BRXpCLEdBQUlELGFBQXVDLEVBQVNBLEVBQU9FLEVBRXZELElBQUssTUFBTUMsS0FBUXRwQyxPQUFPeUssS0FBSzArQixFQUFPRSxHQVFsQyxHQU5BRixFQUFPRSxFQUFFQyxHQUFNbHBDLEVBQUkrb0MsRUFBT0UsRUFBRUMsR0FBTWxwQyxHQUFLLEdBRXZDK29DLEVBQU9FLEVBQUVDLEdBQU1DLEVBQUlKLEVBQU9FLEVBQUVDLEdBQU1DLEdBQUssR0FFdkNKLEVBQU9FLEVBQUVDLEdBQU1scEMsRUFBSSxJQUFJK29DLEVBQU9FLEVBQUVDLEdBQU1DLEdBRWxDSixFQUFPSyxHQUNQLElBQUssSUFBSWxxQyxFQUFJLEVBQUdBLEVBQUk2cEMsRUFBT0ssR0FBRy9uQyxPQUFRbkMsSUFFbEM2cEMsRUFBT0ssR0FBR2xxQyxHQUFLLEtBa0VuQyxJQUFJbXFDLEdBQW1CLEtBQ3ZCLFNBQVNDLEdBQVU1NUIsR0FFZixPQURBMjVCLEdBQW1CQSxJQTlEdkIsU0FBa0IzNUIsR0FDZCxPQUFPLElBQUlqSyxRQUFRLENBQUNGLEVBQVNELEtBQ3pCLElBQUl3TCxFQUFJdUwsRUFBSUMsRUFFWixTQUFTaXRCLElBR0xULEtBQ0FVLEtBQUtuSSxLQUFLLGVBQWdCLENBQ3RCMzdCLFNBQVUsS0FDTkgsRUFBUWlrQyxLQUFLQyxRQUFRQyxlQUV6QkMsVUFBVyxLQU9QYixLQUNBeGpDLEVBQU9rSyxFQUFhRSxFQUFNLDRCQUU5QjBwQixRQUFTeVAsR0FBZ0I5b0MsUUFHakMsR0FBcUYsUUFBaEZzYyxFQUErQixRQUF6QnZMLEVBQUs4b0IsS0FBVTRQLFlBQXlCLElBQVAxNEIsT0FBZ0IsRUFBU0EsRUFBRzI0QixlQUE0QixJQUFQcHRCLE9BQWdCLEVBQVNBLEVBQUd1dEIsT0FFckhya0MsRUFBUWlrQyxLQUFLQyxRQUFRQyxrQkFFcEIsTUFBaUMsUUFBekJwdEIsRUFBS3NkLEtBQVU0UCxZQUF5QixJQUFQbHRCLE9BQWdCLEVBQVNBLEVBQUcra0IsTUFJckUsQ0FNRCxNQUFNd0ksRUFBU3BNLEdBQXNCLGFBYXJDLE9BWEE3RCxLQUFVaVEsR0FBVSxLQUVWTCxLQUFLbkksS0FDUGtJLElBSUFqa0MsRUFBT2tLLEVBQWFFLEVBQU0sNEJBSTNCeXRCLEdBQVEsNENBQTRDME0sR0FBVWxrQyxNQUFNakIsR0FBS1ksRUFBT1osSUFyQnZGNmtDLE9BdUJMNWpDLE1BQU1mLElBR0wsTUFEQXlrQyxHQUFtQixLQUNiemtDLElBSzZCa2xDLENBQVNwNkIsR0FDekMyNUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQlgsTUFBTVUsR0FBZSxJQUFJLEVBQU0sSUFBTSxNQUcvQkMsR0FBb0IsQ0FDdEI1a0IsTUFBTyxDQUNIRSxTQUFVLFdBQ1ZtUSxJQUFLLFNBQ0xsUSxNQUFPLE1BQ1Awa0IsT0FBUSxPQUVaLGNBQWUsT0FDZkMsU0FBVSxNQUlSQyxHQUFtQixJQUFJMzVCLElBQUksQ0FDN0IsQ0FBQyxpQ0FBaUQsS0FDbEQsQ0FBQyxpREFBa0QsS0FDbkQsQ0FBQyw4Q0FBK0MsT0FFcEQsU0FBUzQ1QixHQUFhMTZCLEdBQ2xCLE1BQU1pQyxFQUFTakMsRUFBS2lDLE9BQ3BCekIsRUFBUXlCLEVBQU9nUSxXQUFZalMsRUFBTSwrQkFDakMsTUFBTW5FLEVBQU1vRyxFQUFPRSxTQUNiSCxFQUFhQyxFQXRCTSx3QkF1Qm5CLFdBQVdqQyxFQUFLaUMsT0FBT2dRLDRCQUN2QjdXLEVBQVMsQ0FDWG1JLE9BQVF0QixFQUFPc0IsT0FDZnJELFFBQVNGLEVBQUtqUSxLQUNkeW9DLEVBQUcsZUFFRG1DLEVBQU1GLEdBQWlCcHFDLElBQUkyUCxFQUFLaUMsT0FBTzJCLFNBQ3pDKzJCLElBQ0F2L0IsRUFBT3UvQixJQUFNQSxHQUVqQixNQUFNdnFCLEVBQWFwUSxFQUFLa1UsaUJBSXhCLE9BSEk5RCxFQUFXemUsU0FDWHlKLEVBQU93L0IsR0FBS3hxQixFQUFXNWMsS0FBSyxNQUV6QixHQUFHcUksS0FBTyxZQUFZVCxHQUFRa0YsTUFBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvRC9DLE1BQU11NkIsR0FBcUIsQ0FDdkJ4NUIsU0FBVSxNQUNWeTVCLFVBQVcsTUFDWEMsVUFBVyxNQUNYQyxRQUFTLE1BTWIsTUFBTUMsR0FDRixZQUFZdmpDLEdBQ1J2RixLQUFLdUYsT0FBU0EsRUFDZHZGLEtBQUt1akMsZ0JBQWtCLEtBRTNCLFFBQ0ksR0FBSXZqQyxLQUFLdUYsT0FDTCxJQUNJdkYsS0FBS3VGLE9BQU9zRixRQUVoQixNQUFPaEksTUFJbkIsU0FBU2ttQyxHQUFNbDdCLEVBQU1uRSxFQUFLOUwsRUFBTThsQixFQWxCVixJQWtCaUMwa0IsRUFqQmhDLEtBa0JuQixNQUFNeFUsRUFBTWprQixLQUFLeUYsS0FBSzdQLE9BQU95akMsT0FBT0MsWUFBY2IsR0FBVSxFQUFHLEdBQUcxaUMsV0FDNURxZSxFQUFPcFUsS0FBS3lGLEtBQUs3UCxPQUFPeWpDLE9BQU9FLFdBQWF4bEIsR0FBUyxFQUFHLEdBQUdoZSxXQUNqRSxJQUFJekMsRUFBUyxHQUNiLE1BQU0rZSxFQUFVamtCLE9BQU95RyxPQUFPekcsT0FBT3lHLE9BQU8sR0FBSWtrQyxJQUFxQixDQUFFaGxCLE1BQU9BLEVBQU1oZSxXQUFZMGlDLE9BQVFBLEVBQU8xaUMsV0FBWWt1QixNQUN2SDdQLFNBR0V2ZCxFQUFLLGNBQVFpTSxjQUNmN1UsSUFDQXFGLEVBQVN1YSxHQUFhaFgsR0ExQlQsU0EwQjhCNUksR0FFM0N3ZixHQUFXNVcsS0FFWGtELEVBQU1BLEdBN0JZLG1CQWdDbEJzWSxFQUFRbW5CLFdBQWEsT0FFekIsTUFBTUMsRUFBZ0JyckMsT0FBT21MLFFBQVE4WSxHQUFTcW5CLE9BQU8sQ0FBQ0MsR0FBUTFxQyxFQUFLTixLQUFXLEdBQUdnckMsSUFBUTFxQyxLQUFPTixLQUFVLElBQzFHLEdBeHBOSixTQUEwQmtJLEVBQUssZUFDM0IsSUFBSXlJLEVBQ0osT0FBTzRPLEdBQU9yWCxPQUFzQyxRQUEzQnlJLEVBQUsxSixPQUFPRixpQkFBOEIsSUFBUDRKLE9BQWdCLEVBQVNBLEVBQUdzNkIsWUFzcE5wRkMsQ0FBaUJoakMsSUFBa0IsVUFBWHZELEVBRXhCLE9BYVIsU0FBNEJ5RyxFQUFLekcsR0FDN0IsTUFBTWtnQixFQUFLQyxTQUFTQyxjQUFjLEtBQ2xDRixFQUFHaFUsS0FBT3pGLEVBQ1Z5WixFQUFHbGdCLE9BQVNBLEVBQ1osTUFBTXdtQyxFQUFRcm1CLFNBQVNzbUIsWUFBWSxjQUNuQ0QsRUFBTUUsZUFBZSxTQUFTLEdBQU0sRUFBTXBrQyxPQUFRLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxHQUFPLEdBQU8sR0FBTyxFQUFPLEVBQUcsTUFDaEc0ZCxFQUFHeW1CLGNBQWNIOzs7Ozs7Ozs7Ozs7Ozs7O0dBcEJiSSxDQUFtQm5nQyxHQUFPLEdBQUl6RyxHQUN2QixJQUFJNmxDLEdBQVUsTUFJekIsTUFBTWdCLEVBQVN2a0MsT0FBT2t6QixLQUFLL3VCLEdBQU8sR0FBSXpHLEVBQVFtbUMsR0FDOUMvNkIsRUFBUXk3QixFQUFRajhCLEVBQU0saUJBRXRCLElBQ0lpOEIsRUFBT0MsUUFFWCxNQUFPbG5DLElBQ1AsT0FBTyxJQUFJaW1DLEdBQVVnQixHQXVDekIsU0FBU0UsR0FBZ0JuOEIsRUFBTTRJLEVBQVV3ekIsRUFBVUMsRUFBYWpVLEVBQVNrVSxHQUNyRTk3QixFQUFRUixFQUFLaUMsT0FBT2dRLFdBQVlqUyxFQUFNLCtCQUN0Q1EsRUFBUVIsRUFBS2lDLE9BQU9zQixPQUFRdkQsRUFBTSxtQkFDbEMsTUFBTTVFLEVBQVMsQ0FDWG1JLE9BQVF2RCxFQUFLaUMsT0FBT3NCLE9BQ3BCckQsUUFBU0YsRUFBS2pRLEtBQ2Rxc0MsV0FDQUMsY0FDQTdELEVBQUcsY0FDSHBRLFdBRUosR0FBSXhmLGFBQW9CNFIsR0FBdUIsQ0FDM0M1UixFQUFTMnpCLG1CQUFtQnY4QixFQUFLMEQsY0FDakN0SSxFQUFPdU4sV0FBYUMsRUFBU0QsWUFBYyxHQUN0QyxZQUFRQyxFQUFTNHpCLHlCQUNsQnBoQyxFQUFPc2YsaUJBQW1CdmpCLEtBQUtDLFVBQVV3UixFQUFTNHpCLHdCQUd0RCxJQUFLLE1BQU96ckMsRUFBS04sS0FBVVAsT0FBT21MLFFBQVFpaEMsR0FBb0IsSUFDMURsaEMsRUFBT3JLLEdBQU9OLEVBR3RCLEdBQUltWSxhQUFvQmdTLEdBQW1CLENBQ3ZDLE1BQU1DLEVBQVNqUyxFQUFTNnpCLFlBQVlyekIsT0FBTzBSLEdBQW1CLEtBQVZBLEdBQ2hERCxFQUFPbHBCLE9BQVMsSUFDaEJ5SixFQUFPeWYsT0FBU0EsRUFBT3JuQixLQUFLLE1BR2hDd00sRUFBS2dELFdBQ0w1SCxFQUFPc2hDLElBQU0xOEIsRUFBS2dELFVBSXRCLE1BQU0yNUIsRUFBYXZoQyxFQUNuQixJQUFLLE1BQU1ySyxLQUFPYixPQUFPeUssS0FBS2dpQyxRQUNGbG5DLElBQXBCa25DLEVBQVc1ckMsV0FDSjRyQyxFQUFXNXJDLEdBRzFCLE1BQU8sR0FFWCxVQUF3QixPQUFFa1IsSUFDdEIsSUFBS0EsRUFBT0UsU0FDUixNQUFPLFdBQVdGLEVBQU9nUSw2QkFFN0IsT0FBT2pRLEVBQWFDLEVBOUNLOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0NmMjZCLENBQWU1OEIsTUFBUyxZQUFZMjhCLEdBQVlyOEIsTUFBTSxLQWtIcEUsTUFBTXU4QixHQXBGTixNQUNJLGNBQ0kxcUMsS0FBSzJxQyxjQUFnQixHQUNyQjNxQyxLQUFLNG5DLFFBQVUsR0FDZjVuQyxLQUFLNHFDLHlCQUEyQixHQUNoQzVxQyxLQUFLcWhCLHFCQUF1QmlVLEdBQzVCdDFCLEtBQUt1Z0Isb0JBQXNCeWtCLEdBSS9CLGlCQUFpQm4zQixFQUFNNEksRUFBVXd6QixFQUFVaFUsR0FDdkMsSUFBSWhuQixFQUNKUixFQUF1RCxRQUExQ1EsRUFBS2pQLEtBQUsycUMsY0FBYzk4QixFQUFLdU4sZUFBNEIsSUFBUG5NLE9BQWdCLEVBQVNBLEVBQUcwSixRQUFTLGdEQUVwRyxPQUFPb3dCLEdBQU1sN0IsRUFERG04QixHQUFnQm44QixFQUFNNEksRUFBVXd6QixFQUFVajdCLElBQWtCaW5CLEdBQ2hEYSxNQUU1QixvQkFBb0JqcEIsRUFBTTRJLEVBQVV3ekIsRUFBVWhVLEdBdC9FbEQsSUFBNEJ2c0IsRUF5L0VwQixhQUZNMUosS0FBS3dqQyxrQkFBa0IzMUIsR0F2L0VUbkUsRUF3L0VEc2dDLEdBQWdCbjhCLEVBQU00SSxFQUFVd3pCLEVBQVVqN0IsSUFBa0JpbkIsR0F2L0VuRjhCLEtBQVU3b0IsU0FBU0MsS0FBT3pGLEVBdy9FZixJQUFJOUYsUUFBUSxRQUV2QixZQUFZaUssR0FDUixNQUFNalAsRUFBTWlQLEVBQUt1TixPQUNqQixHQUFJcGIsS0FBSzJxQyxjQUFjL3JDLEdBQU0sQ0FDekIsTUFBTSxRQUFFK1osRUFBTyxRQUFFaFYsR0FBWTNELEtBQUsycUMsY0FBYy9yQyxHQUNoRCxPQUFJK1osRUFDTy9VLFFBQVFGLFFBQVFpVixJQUd2QmxLLEVBQVk5SyxFQUFTLDRDQUNkQSxHQUdmLE1BQU1BLEVBQVUzRCxLQUFLNnFDLGtCQUFrQmg5QixHQU92QyxPQU5BN04sS0FBSzJxQyxjQUFjL3JDLEdBQU8sQ0FBRStFLFdBRzVCQSxFQUFRRyxNQUFNLFlBQ0g5RCxLQUFLMnFDLGNBQWMvckMsS0FFdkIrRSxFQUVYLHdCQUF3QmtLLEdBQ3BCLE1BQU1pOUIsUUFsUWRoNkIsZUFBMkJqRCxHQUN2QixNQUFNazlCLFFBQWdCdEQsR0FBVTU1QixHQUMxQjg1QixFQUFPNVAsS0FBVTRQLEtBRXZCLE9BREF0NUIsRUFBUXM1QixFQUFNOTVCLEVBQU0sa0JBQ2JrOUIsRUFBUXRTLEtBQUssQ0FDaEJ1UyxNQUFPNW5CLFNBQVNsUyxLQUNoQnhILElBQUs2K0IsR0FBYTE2QixHQUNsQm85QixzQkFBdUJ0RCxFQUFLQyxRQUFRc0QsNEJBQ3BDQyxXQUFZaEQsR0FDWmlELFdBQVcsR0FDWE4sR0FBVyxJQUFJbG5DLFFBQVFrTixNQUFPcE4sRUFBU0QsV0FDakNxbkMsRUFBT08sUUFBUSxDQUVqQkMsZ0JBQWdCLElBRXBCLE1BQU1DLEVBQWU1OUIsRUFBYUUsRUFBTSwwQkFHbEMyOUIsRUFBb0J6VCxLQUFVOWtCLFdBQVcsS0FDM0N4UCxFQUFPOG5DLElBQ1JyRCxHQUFhaHFDLE9BRWhCLFNBQVN1dEMsSUFDTDFULEtBQVU3a0IsYUFBYXM0QixHQUN2QjluQyxFQUFRb25DLEdBSVpBLEVBQU9ZLEtBQUtELEdBQXNCaGhDLEtBQUtnaEMsRUFBc0IsS0FDekRob0MsRUFBTzhuQyxRQXFPVUksQ0FBWTk5QixHQUMzQjhLLEVBQVUsSUFBSXVzQixHQUFpQnIzQixHQVNyQyxPQVJBaTlCLEVBQU9jLFNBQVMsWUFBY0MsSUFDMUJ4OUIsRUFBUXc5QixhQUFpRCxFQUFTQSxFQUFZQyxVQUFXaitCLEVBQU0sc0JBRy9GLE1BQU8sQ0FBRXlvQixPQURPM2QsRUFBUW96QixRQUFRRixFQUFZQyxXQUNqQixNQUFrQixVQUM5Q25FLEtBQUtDLFFBQVFzRCw2QkFDaEJsckMsS0FBSzJxQyxjQUFjOThCLEVBQUt1TixRQUFVLENBQUV6QyxXQUNwQzNZLEtBQUs0bkMsUUFBUS81QixFQUFLdU4sUUFBVTB2QixFQUNyQm55QixFQUVYLDZCQUE2QjlLLEVBQU02VCxHQUNoQjFoQixLQUFLNG5DLFFBQVEvNUIsRUFBS3VOLFFBQzFCNHdCLEtBMURpQixvQkEwRGEsQ0FBRTdtQyxLQTFEZixxQkEwRGdEK2EsSUFDcEUsSUFBSWpSLEVBQ0osTUFBTXkwQixFQUFtRixRQUFwRXowQixFQUFLaVIsYUFBdUMsRUFBU0EsRUFBTyxVQUF1QixJQUFQalIsT0FBZ0IsRUFBU0EsRUFBMEIsdUJBQ2hJM0wsSUFBaEJvZ0MsR0FDQWhpQixJQUFLZ2lCLEdBRVRuMkIsRUFBTU0sRUFBTSxtQkFDYjg1QixLQUFLQyxRQUFRc0QsNkJBRXBCLGtCQUFrQnI5QixHQUNkLE1BQU1qUCxFQUFNaVAsRUFBS3VOLE9BSWpCLE9BSEtwYixLQUFLNHFDLHlCQUF5QmhzQyxLQUMvQm9CLEtBQUs0cUMseUJBQXlCaHNDLEdBcmYxQ2tTLGVBQStCakQsR0FFM0IsR0FBSUEsRUFBS2lDLE9BQU9FLFNBQ1osT0FFSixNQUFNLGtCQUFFaThCLFNBQTRCM0YsR0FBa0J6NEIsR0FDdEQsSUFBSyxNQUFNcStCLEtBQVVELEVBQ2pCLElBQ0ksR0FBSXhGLEdBQVl5RixHQUNaLE9BR1IsTUFBT2o5QixJQUtYMUIsRUFBTU0sRUFBTSx1QkFvZWlDcytCLENBQWdCdCtCLElBRWxEN04sS0FBSzRxQyx5QkFBeUJoc0MsR0FFekMsNkJBRUksT0FBT2tmLE1BQXNCUCxNQUFlTSxPQWdDcEQsTUFBTXV1QixXQXJCTixNQUNJLFlBQVk5ZixHQUNSdHNCLEtBQUtzc0IsU0FBV0EsRUFFcEIsU0FBU3plLEVBQU0yakIsRUFBUzdhLEdBQ3BCLE9BQVE2YSxFQUFRcnNCLE1BQ1osSUFBSyxTQUNELE9BQU9uRixLQUFLcXNDLGdCQUFnQngrQixFQUFNMmpCLEVBQVFoSSxXQUFZN1MsR0FDMUQsSUFBSyxTQUNELE9BQU8zVyxLQUFLc3NDLGdCQUFnQnorQixFQUFNMmpCLEVBQVFoSSxZQUM5QyxRQUNJLE9BQU9qYixFQUFVLHdDQVc3QixZQUFZaWIsR0FDUnJpQixNQUFNLFNBQ05uSCxLQUFLd3BCLFdBQWFBLEVBR3RCLHVCQUF1QkEsR0FDbkIsT0FBTyxJQUFJNGlCLEdBQThCNWlCLEdBRzdDLGdCQUFnQjNiLEVBQU1tSSxFQUFTVyxHQUMzQixPQWh4R1IsU0FBZ0M5SSxFQUFNK0MsR0FDbEMsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLHNDQUEyRThDLEVBQW1COUMsRUFBTStDLElBK3dHNUkyN0IsQ0FBdUIxK0IsRUFBTSxDQUNoQ21JLFVBQ0FXLGNBQ0E2MUIsc0JBQXVCeHNDLEtBQUt3cEIsV0FBV3ZDLDZCQUkvQyxnQkFBZ0JwWixFQUFNcWpCLEdBQ2xCLE9BOXNFUixTQUFnQ3JqQixFQUFNK0MsR0FDbEMsT0FBT0csRUFBbUJsRCxFQUFNLE9BQW1CLGtDQUFvRThDLEVBQW1COUMsRUFBTStDLElBNnNFckk2N0IsQ0FBdUI1K0IsRUFBTSxDQUNoQ3FqQix1QkFDQXNiLHNCQUF1QnhzQyxLQUFLd3BCLFdBQVd2Qyw4QkFTbkQsTUFBTXlsQixHQUNGLGVBUUEsaUJBQWlCbGpCLEdBQ2IsT0FBTzRpQixHQUE4Qk8sZ0JBQWdCbmpCLElBTTdEa2pCLEdBQTBCRSxVQUFZLFFBRXRDLElBd0dzQjV1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFyRnRCLE1BQU02dUIsR0FDRixZQUFZaC9CLEdBQ1I3TixLQUFLNk4sS0FBT0EsRUFDWjdOLEtBQUs4c0Msa0JBQW9CLElBQUluK0IsSUFFakMsU0FDSSxJQUFJTSxFQUVKLE9BREFqUCxLQUFLK3NDLHdCQUNvQyxRQUFoQzk5QixFQUFLalAsS0FBSzZOLEtBQUsyRyxtQkFBZ0MsSUFBUHZGLE9BQWdCLEVBQVNBLEVBQUcvSyxNQUFRLEtBRXpGLGVBQWUrVCxHQUdYLEdBRkFqWSxLQUFLK3NDLDZCQUNDL3NDLEtBQUs2TixLQUFLZ1Isd0JBQ1g3ZSxLQUFLNk4sS0FBSzJHLFlBQ1gsT0FBTyxLQUdYLE1BQU8sQ0FBRW9ELGtCQURpQjVYLEtBQUs2TixLQUFLMkcsWUFBWWUsV0FBVzBDLElBRy9ELHFCQUFxQndjLEdBRWpCLEdBREF6MEIsS0FBSytzQyx1QkFDRC9zQyxLQUFLOHNDLGtCQUFrQnZoQixJQUFJa0osR0FDM0IsT0FFSixNQUFNdVksRUFBY2h0QyxLQUFLNk4sS0FBS28vQixpQkFBaUI1NEIsSUFDM0MsSUFBSXBGLEVBQ0p3bEIsR0FBMEIsUUFBZnhsQixFQUFLb0YsU0FBeUIsSUFBUHBGLE9BQWdCLEVBQVNBLEVBQUdnRyxnQkFBZ0IyQyxjQUFnQixRQUVsRzVYLEtBQUs4c0Msa0JBQWtCLzlCLElBQUkwbEIsRUFBVXVZLEdBQ3JDaHRDLEtBQUtrdEMseUJBRVQsd0JBQXdCelksR0FDcEJ6MEIsS0FBSytzQyx1QkFDTCxNQUFNQyxFQUFjaHRDLEtBQUs4c0Msa0JBQWtCNXVDLElBQUl1MkIsR0FDMUN1WSxJQUdMaHRDLEtBQUs4c0Msa0JBQWtCN1gsT0FBT1IsR0FDOUJ1WSxJQUNBaHRDLEtBQUtrdEMsMEJBRVQsdUJBQ0k3K0IsRUFBUXJPLEtBQUs2TixLQUFLZ1IsdUJBQXdCLHlDQUU5Qyx5QkFDUTdlLEtBQUs4c0Msa0JBQWtCNVgsS0FBTyxFQUM5QmwxQixLQUFLNk4sS0FBS3lULHlCQUdWdGhCLEtBQUs2TixLQUFLMFQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzc5UnRCLFNBQVM0ckIsS0FDTCxPQUFPNW5DOzs7Ozs7Ozs7Ozs7Ozs7O0dEZ2dTV3lZLEdBb0ZULFVBbkZULDZCQUFtQixJQUFJLElBQVUsT0FBbUIsQ0FBQ2dlLEdBQWFoYSxRQUFTb3JCLE1BQ3ZFLE1BQU1odkIsRUFBTTRkLEVBQVVxUixZQUFZLE9BQU9DLGdCQUNuQyxPQUFFbDhCLEVBQU0sV0FBRTBPLEdBQWUxQixFQUFJNEQsUUFDbkMsTUFBTyxDQUFDNUQsSUFDSi9QLEVBQVErQyxJQUFXQSxFQUFPeEssU0FBUyxLQUFNLGtCQUF5QyxDQUFFbUgsUUFBU3FRLEVBQUl4Z0IsT0FFakd5USxJQUFVeVIsYUFBK0MsRUFBU0EsRUFBV2xaLFNBQVMsTUFBTyxpQkFBdUMsQ0FDaEltSCxRQUFTcVEsRUFBSXhnQixPQUVqQixNQUFNa1MsRUFBUyxDQUNYc0IsU0FDQTBPLGFBQ0E5QixrQkFDQXZNLFFBQVMsaUNBQ1Q0RyxhQUFjLDZCQUNkdEYsVUFBVyxRQUNYb00saUJBQWtCcEIsR0FBa0JDLEtBRWxDdXZCLEVBQWUsSUFBSSxHQUFTbnZCLEVBQUt0TyxHQUV2QyxPQTM5UVosU0FBaUNqQyxFQUFNdS9CLEdBQ25DLE1BQU0zeEIsR0FBZTJ4QixhQUFtQyxFQUFTQSxFQUFLM3hCLGNBQWdCLEdBQ2hGK3hCLEdBQWFudEMsTUFBTUMsUUFBUW1iLEdBQWVBLEVBQWMsQ0FBQ0EsSUFBY2xGLElBQUkzSCxJQUM3RXcrQixhQUFtQyxFQUFTQSxFQUFLdC9CLFdBQ2pERCxFQUFLNC9CLGdCQUFnQkwsRUFBS3QvQixVQUs5QkQsRUFBSzYvQiwyQkFBMkJGLEVBQVdKLGFBQW1DLEVBQVNBLEVBQUtodUIsdUJBaTlRcEZ1dUIsQ0FBd0JKLEVBQWNILEdBQy9CRyxHQWpCSixDQWtCSm52QixJQUNKLFVBS0V3dkIscUJBQXFCLFlBS3JCQywyQkFBMkIsQ0FBQzdSLEVBQVc4UixFQUFxQkMsS0FDaEMvUixFQUFVcVIsWUFBWSxpQkFDOUJXLGdCQUV6Qiw2QkFBbUIsSUFBSSxJQUFVLGdCQUFxQ2hTLEdBRTNELENBQUNudUIsR0FBUSxJQUFJZy9CLEdBQVloL0IsR0FBekIsQ0FETXFVLEdBQVU4WixFQUFVcVIsWUFBWSxRQUFtQkMsaUJBRWpFLFdBQXlCTSxxQkFBcUIsYUFDakQsMEJBakpPLGlCQUNHLFNBd0ZkLFNBQStCNXZCLEdBQzNCLE9BQVFBLEdBQ0osSUFBSyxPQUNELE1BQU8sT0FDWCxJQUFLLGNBQ0QsTUFBTyxLQUNYLElBQUssU0FDRCxNQUFPLFlBQ1gsSUFBSyxVQUNELE1BQU8sVUFDWCxRQUNJLFFBNkN1Qml3QixDQUFzQmp3QixLQUVyRCwwQkFuSk8saUJBQ0csU0FrSnFCLFdDaGhTbkNsTixlQUFlbzlCLEdBQW9CcmdDLEVBQU11bEIsRUFBTzNjLEdBQzVDLElBQUl4SCxFQUVKLE1BQU0sVUFBRWsvQixHQUFjaEIsS0FDdEIxK0IsRUFBWTJrQixFQUFNd08sVUFBVywwQ0FDN0IsTUFBTXdNLFFBZ0tWdDlCLGVBQTZCOHdCLEdBQ3pCLE1BQU1wZ0MsRUFTVixTQUE2QmxDLEdBSXpCLEdBREFtUCxFQUFZLGVBQWVqSixLQUFLbEcsR0FBTSwwQ0FDWCxvQkFBaEIrdUMsWUFDUCxPQUFPLElBQUlBLGFBQWNDLE9BQU9odkMsR0FFcEMsTUFBTWl2QyxFQUFPLElBQUlDLFlBQVlsdkMsRUFBSUUsUUFDM0JpdkMsRUFBTyxJQUFJQyxXQUFXSCxHQUM1QixJQUFLLElBQUlseEMsRUFBSSxFQUFHQSxFQUFJaUMsRUFBSUUsT0FBUW5DLElBQzVCb3hDLEVBQUtweEMsR0FBS2lDLEVBQUlHLFdBQVdwQyxHQUU3QixPQUFPb3hDOzs7Ozs7Ozs7Ozs7Ozs7O0dBckJPRSxDQUFvQi9NLEdBSzVCZ04sUUFBWUMsT0FBT0MsT0FBT0MsT0FBTyxVQUFXdnRDLEdBRWxELE9BRFluQixNQUFNcTBCLEtBQUssSUFBSWdhLFdBQVdFLElBQzNCcjRCLElBQUl5NEIsR0FBT0EsRUFBSXRwQyxTQUFTLElBQUl1cEMsU0FBUyxFQUFHLE1BQU01dEMsS0FBSyxJQXhLbEM2dEMsQ0FBYzliLEVBQU13TyxXQUMxQ3VJLEVBQW1CLEdBa0J6QixPQWpCSXRzQixLQUVBc3NCLEVBQXNCLElBQUlnRSxFQUFVNWdCLFlBRS9COVAsS0FFTDBzQixFQUFzQixJQUFJZ0UsRUFBVTVnQixZQUdwQ2hnQixFQUFNTSxFQUFNLCtDQUdac2dDLEVBQVV4M0IsY0FDVnd6QixFQUFpQyxlQUFJZ0UsRUFBVXgzQixhQUduRHd6QixFQUE0QixVQUFJaUUsRUFDekJwRSxHQUFnQm44QixFQUFNNEksRUFBVTJjLEVBQU1qdUIsVUFBTTdCLEVBQW9DLFFBQXhCMkwsRUFBS21rQixFQUFNNkMsZUFBNEIsSUFBUGhuQixFQUFnQkEsT0FBSzNMLEVBQVc2bUMsR0FvQm5JLFNBQVNnRixHQUFpQkMsR0FFdEIsTUFBTSxRQUFFQyxHQUFZbEMsS0FDcEIsT0FBTyxJQUFJdnBDLFFBQVFGLElBQ2YyckMsRUFBUUMsUUFBUUMsV0FBV0MsWUFBWUMsSUFDbkMsSUFBSUMsRUFBUyxLQUNURCxFQUNBSixFQUFRQyxRQUFRQyxXQUFXSSxRQUFRUCxHQUluQ00sRUFBU0wsRUFBUU8sYUFBYW5YLEtBQUsyVyxFRHM1RG5ELFNBQW9CNW9DLEVBQUssZUFDckIsTUFBUSwrQkFBK0JoQixLQUFLZ0IsSUFDeEMsK0JBQStCaEIsS0FBS2dCLEdDeDVEbUJxcEMsR0FBZSxTQUFXLFVBQVcsZ0JBRXhGbnNDLEVBQVFnc0MsT0F1SnBCLE1BQU0sV0FBZ0N4SyxHQUNsQyxjQUNJLzlCLFNBQVM2ZSxXQUNUaG1CLEtBQUs4dkMsaUJBQW1CLElBQUkva0IsSUFDNUIvcUIsS0FBSyt2QyxZQUFjLElBQUluc0MsUUFBUUYsSUFDM0IxRCxLQUFLZ3dDLGlCQUFtQnRzQyxJQUdoQyxtQkFBbUJnZSxHQUNmMWhCLEtBQUs4dkMsaUJBQWlCMXJCLElBQUkxQyxHQUU5QixzQkFBc0JBLEdBQ2xCMWhCLEtBQUs4dkMsaUJBQWlCN2EsT0FBT3ZULEdBSWpDLGdCQUNJMWhCLEtBQUtxbEMsb0JBQXNCLEtBQzNCcmxDLEtBQUtzbEMsNkJBQThCLEVBR3ZDLFFBQVFsUyxHQUdKLE9BRkFwekIsS0FBS2d3QyxtQkFDTGh3QyxLQUFLOHZDLGlCQUFpQjNtQyxRQUFRdVksR0FBTUEsRUFBRzBSLElBQ2hDanNCLE1BQU00a0MsUUFBUTNZLEdBRXpCLDBCQUNVcHpCLEtBQUsrdkMsYUFvQm5Cai9CLGVBQWVtL0IsR0FBbUJwaUMsR0FDOUIsTUFBTXVsQixRQUFlalksS0FBVWUsS0FBS2cwQixHQUFlcmlDLElBSW5ELE9BSEl1bEIsU0FDTWpZLEtBQVVpQixRQUFROHpCLEdBQWVyaUMsSUFFcEN1bEIsRUFFWCxTQUFTK2MsR0FBd0JDLEVBQWMxbUMsR0FDM0MsSUFBSXVGLEVBQUl1TCxFQUVSLE1BQU02MUIsRUFpRVYsU0FBa0MzbUMsR0FDOUIsTUFBTVQsRUFBU3FuQyxHQUFvQjVtQyxHQUM3QmdlLEVBQU96ZSxFQUFhLEtBQUlPLG1CQUFtQlAsRUFBYSxXQUFLM0YsRUFFN0Rxa0IsRUFBaUIyb0IsR0FBb0I1b0IsR0FBWSxLQUVqREUsRUFBYzNlLEVBQXFCLGFBQ25DTyxtQkFBbUJQLEVBQXFCLG1CQUN4QzNGLEVBRU4sT0FEMEJndEMsR0FBb0Ixb0IsR0FBbUIsTUFDckNBLEdBQWVELEdBQWtCRCxHQUFRaGUsRUEzRWpENm1DLENBQXlCN21DLEdBTTdDLEdBQUkybUMsRUFBWXpwQyxTQUFTLHFCQUFzQixDQUkzQyxNQUFNcUMsRUFBU3FuQyxHQUFvQkQsR0FFN0JHLEVBQWN2bkMsRUFBc0IsY0E0Q2xELFNBQXlCaUosR0FDckIsSUFDSSxPQUFPbE4sS0FBS21QLE1BQU1qQyxHQUV0QixNQUFPclAsR0FDSCxPQUFPLE1BaERENHRDLENBQWdCam5DLG1CQUFtQlAsRUFBc0IsZ0JBQ3pELEtBQ0FqQyxFQUE4SixRQUF0SndULEVBQThGLFFBQXhGdkwsRUFBS3VoQyxhQUFpRCxFQUFTQSxFQUFrQixZQUFzQixJQUFQdmhDLE9BQWdCLEVBQVNBLEVBQUcxRixNQUFNLGdCQUE2QixJQUFQaVIsT0FBZ0IsRUFBU0EsRUFBRyxHQUNsTXpYLEVBQVFpRSxFQUFPMkcsRUFBYTNHLEdBQVEsS0FDMUMsT0FBSWpFLEVBQ08sQ0FDSG9DLEtBQU1pckMsRUFBYWpyQyxLQUNuQjh3QixRQUFTbWEsRUFBYW5hLFFBQ3RCcGxCLFNBQVV1L0IsRUFBYXYvQixTQUN2QjlOLFFBQ0F1L0IsWUFBYSxLQUNiVixVQUFXLEtBQ1hsYixTQUFVLE1BSVAsQ0FDSHZoQixLQUFNaXJDLEVBQWFqckMsS0FDbkI4d0IsUUFBU21hLEVBQWFuYSxRQUN0QnBsQixTQUFVdS9CLEVBQWF2L0IsU0FDdkIrd0IsVUFBV3dPLEVBQWF4TyxVQUN4QlUsWUFBYStOLEVBQ2IzcEIsU0FBVSxNQUl0QixPQUFPLEtBRVgsU0FBU2dxQixLQUNMLE1BQU01VCxFQUFRLEdBQ1JDLEVBQWUsaUVBQ3JCLElBQUssSUFBSTEvQixFQUFJLEVBQUdBLEVBdkdNLEdBdUdpQkEsSUFBSyxDQUN4QyxNQUFNc3pDLEVBQU1oaEMsS0FBS3VuQixNQUFNdm5CLEtBQUtzbkIsU0FBVzhGLEVBQWF2OUIsUUFDcERzOUIsRUFBTTE3QixLQUFLMjdCLEVBQWE1NkIsT0FBT3d1QyxJQUVuQyxPQUFPN1QsRUFBTXo3QixLQUFLLElBRXRCLFNBQVM4WixLQUNMLE9BQU92TSxFQUFhdW1CLElBRXhCLFNBQVMrYSxHQUFlcmlDLEdBQ3BCLE9BQU8wTixFQUFvQixZQUE4QjFOLEVBQUtpQyxPQUFPc0IsT0FBUXZELEVBQUtqUSxNQTJCdEYsU0FBUzB5QyxHQUFvQjVtQyxHQUN6QixLQUFNQSxhQUFpQyxFQUFTQSxFQUFJOUMsU0FBUyxNQUN6RCxNQUFPLEdBRVgsTUFBT2tCLEtBQU0yRixHQUFRL0QsRUFBSUgsTUFBTSxLQUMvQixPQUFPLFlBQWtCa0UsRUFBS3BNLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSXZDLE1BQU11dkMsR0F4R04sTUFDSSxjQUNJNXdDLEtBQUtxaEIscUJBQXVCaVUsR0FDNUJ0MUIsS0FBS3VmLHdCQUF5QixFQUM5QnZmLEtBQUsycUMsY0FBZ0IsSUFBSWg4QixJQUN6QjNPLEtBQUs0cUMseUJBQTJCLEdBQ2hDNXFDLEtBQUt1Z0Isb0JBQXNCeWtCLEdBRS9CLGtCQUFrQm4zQixHQUNkLE1BQU1qUCxFQUFNaVAsRUFBS3VOLE9BQ2pCLElBQUl6QyxFQUFVM1ksS0FBSzJxQyxjQUFjenNDLElBQUlVLEdBTXJDLE9BTEsrWixJQUNEQSxFQUFVLElBQUksR0FBd0I5SyxHQUN0QzdOLEtBQUsycUMsY0FBYzU3QixJQUFJblEsRUFBSytaLEdBQzVCM1ksS0FBSzZ3Qyx3QkFBd0JoakMsRUFBTThLLElBRWhDQSxFQUVYLFdBQVc5SyxHQUNQTixFQUFNTSxFQUFNLCtDQUVoQixvQkFBb0JBLEVBQU00SSxFQUFVd3pCLEVBQVVoVSxJQXZRbEQsU0FBb0Nwb0IsR0FDaEMsSUFBSW9CLEVBQUl1TCxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJQyxFQUFJZzJCLEVBQUlDLEVBQ3hDLE1BQU1DLEVBQU03RCxLQU1aOStCLEVBQTJJLG1CQUFuRCxRQUF2RVksRUFBSytoQyxhQUFpQyxFQUFTQSxFQUFJQyxzQkFBbUMsSUFBUGhpQyxPQUFnQixFQUFTQSxFQUFHOUUsV0FBMkIwRCxFQUFNLGdDQUFxRSxDQUM5TnFqQyxjQUFlLHVDQUduQjdpQyxPQUF3SSxLQUFyRCxRQUFsRW1NLEVBQUt3MkIsYUFBaUMsRUFBU0EsRUFBSTdDLGlCQUE4QixJQUFQM3pCLE9BQWdCLEVBQVNBLEVBQUcrUyxhQUE4QjFmLEVBQU0sZ0NBQXFFLENBQzVOcWpDLGNBQWUsNkJBR25CN2lDLEVBQW1QLG1CQUFqRCxRQUFqTHNNLEVBQTZILFFBQXZIRCxFQUFzRSxRQUFoRUQsRUFBS3UyQixhQUFpQyxFQUFTQSxFQUFJM0IsZUFBNEIsSUFBUDUwQixPQUFnQixFQUFTQSxFQUFHNjBCLGVBQTRCLElBQVA1MEIsT0FBZ0IsRUFBU0EsRUFBRzYwQixrQkFBK0IsSUFBUDUwQixPQUFnQixFQUFTQSxFQUFHZzFCLFNBQXlCOWhDLEVBQU0sZ0NBQXFFLENBQ3RVcWpDLGNBQWUsOEJBRW5CN2lDLEVBQXVQLG1CQUFyRCxRQUFqTHlNLEVBQTZILFFBQXZIRCxFQUFzRSxRQUFoRUQsRUFBS28yQixhQUFpQyxFQUFTQSxFQUFJM0IsZUFBNEIsSUFBUHowQixPQUFnQixFQUFTQSxFQUFHMDBCLGVBQTRCLElBQVB6MEIsT0FBZ0IsRUFBU0EsRUFBRzAwQixrQkFBK0IsSUFBUHowQixPQUFnQixFQUFTQSxFQUFHMDBCLGFBQTZCM2hDLEVBQU0sZ0NBQXFFLENBQzFVcWpDLGNBQWUsOEJBR25CN2lDLEVBQTJMLG1CQUE5QyxRQUE1SDBpQyxFQUFzRSxRQUFoRUQsRUFBS0UsYUFBaUMsRUFBU0EsRUFBSTNCLGVBQTRCLElBQVB5QixPQUFnQixFQUFTQSxFQUFHbEIsb0JBQWlDLElBQVBtQixPQUFnQixFQUFTQSxFQUFHdFksTUFBc0I1cUIsRUFBTSxnQ0FBcUUsQ0FDOVFxakMsY0FBZSxnQ0FnUGZDLENBQTJCdGpDLEdBQzNCLE1BQU04SyxRQUFnQjNZLEtBQUt3ZixZQUFZM1IsU0FDakM4SyxFQUFReTRCLGNBSWR6NEIsRUFBUTA0QixnQkRnalBaeE4sR0FBbUJzQyxjQzlpUFRubUMsS0FBS3dqQyxrQkFBa0IzMUIsR0FDN0IsTUFBTXVsQixFQXJLZCxTQUEyQnZsQixFQUFNMUksRUFBTTh3QixFQUFVLE1BQzdDLE1BQU8sQ0FDSDl3QixPQUNBOHdCLFVBQ0FxTSxZQUFhLEtBQ2JWLFVBQVc4TyxLQUNYaHFCLFNBQVUsS0FDVjdWLFNBQVVoRCxFQUFLZ0QsU0FDZjlOLE1BQU80SyxFQUFhRSxFQUFNLGtCQTZKWnlqQyxDQUFrQnpqQyxFQUFNbzhCLEVBQVVoVSxTQTFKeEQsU0FBMkJwb0IsRUFBTXVsQixHQUM3QixPQUFPalksS0FBVWEsS0FBS2swQixHQUFlcmlDLEdBQU91bEIsR0EwSmxDbWUsQ0FBa0IxakMsRUFBTXVsQixHQUM5QixNQUFNMXBCLFFBQVl3a0MsR0FBb0JyZ0MsRUFBTXVsQixFQUFPM2MsR0FFbkQsT0F2VlIzRixlQUFpQ2pELEVBQU0yakMsRUFBZTlCLEdBRWxELE1BQU0sUUFBRUwsR0FBWWxDLEtBQ3BCLElBQUlzRSxFQUFVLE9BQ2QsVUFDVSxJQUFJN3RDLFFBQVEsQ0FBQ0YsRUFBU0QsS0FDeEIsSUFBSWl1QyxFQUFlLEtBRW5CLFNBQVNDLElBQ0wsSUFBSTFpQyxFQUdKdkwsSUFDQSxNQUFNa3VDLEVBQXdELFFBQXJDM2lDLEVBQUtvZ0MsRUFBUUMsUUFBUUMsa0JBQStCLElBQVB0Z0MsT0FBZ0IsRUFBU0EsRUFBR3BFLE1BQ25FLG1CQUFwQittQyxHQUNQQSxJQUkwRSxtQkFBbEVsQyxhQUF1QyxFQUFTQSxFQUFPN2tDLFFBQy9ENmtDLEVBQU83a0MsUUFHZixTQUFTZ25DLElBQ0RILElBSUpBLEVBQWVuc0MsT0FBTzBOLFdBQVcsS0FFN0J4UCxFQUFPa0ssRUFBYUUsRUFBTSxnQ0FyR2xCLE1Bd0doQixTQUFTaWtDLElBQ2tGLGFBQXJFLE9BQWIxdUIsZUFBa0MsSUFBYkEsY0FBc0IsRUFBU0EsU0FBUzJ1QixrQkFDOURGLElBS1JMLEVBQWNRLG1CQUFtQkwsR0FFakN2dUIsU0FBU29CLGlCQUFpQixTQUFVcXRCLEdBQVMsR0FDekNwMEIsTUFDQTJGLFNBQVNvQixpQkFBaUIsbUJBQW9Cc3RCLEdBQW1CLEdBR3JFTCxFQUFVLEtBQ05ELEVBQWNTLHNCQUFzQk4sR0FDcEN2dUIsU0FBUzBSLG9CQUFvQixTQUFVK2MsR0FBUyxHQUNoRHp1QixTQUFTMFIsb0JBQW9CLG1CQUFvQmdkLEdBQW1CLEdBQ2hFSixHQUNBbnNDLE9BQU8yTixhQUFhdytCLE1BS3BDLFFBQ0lELEtBNlJPUyxDQUFrQnJrQyxFQUFNOEssUUFEVncyQixHQUFpQnpsQyxJQUcxQyw2QkFBNkJtYixFQUFPc3RCLEdBQ2hDLE1BQU0sSUFBSTV4QyxNQUFNLDJCQUVwQixrQkFBa0JzTixHQUNkLE1BQU1qUCxFQUFNaVAsRUFBS3VOLE9BSWpCLE9BSEtwYixLQUFLNHFDLHlCQUF5QmhzQyxLQUMvQm9CLEtBQUs0cUMseUJBQXlCaHNDLEdBclkxQ2tTLGVBQStCakQsR0FDM0IsTUFBTSxVQUFFc2dDLEdBQWNoQixLQUNoQnY4QixFQUFVLEdBQ1ppTixLQUNBak4sRUFBUXdoQyxZQUFjakUsRUFBVTVnQixZQUUzQjlQLEtBQ0w3TSxFQUFRZ2QsbUJBQXFCdWdCLEVBQVU1Z0IsWUFHdkNoZ0IsRUFBTU0sRUFBTSxxREFHVnk0QixHQUFrQno0QixFQUFNK0MsR0F3WGUsQ0FBZ0IvQyxJQUVsRDdOLEtBQUs0cUMseUJBQXlCaHNDLEdBRXpDLHdCQUF3QmlQLEVBQU04SyxHQUUxQixNQUFNLGVBQUVzNEIsRUFBYyxjQUFFb0IsRUFBYSxVQUFFbEUsR0FBY2hCLEtBQy9DbUYsRUFBaUJyL0IsV0FBV25DLGdCQUd4Qm0vQixHQUFtQnBpQyxHQUN6QjhLLEVBQVFvekIsUUFBUXdHLE9BdkRLLEtBeURuQkMsRUFBbUIxaEMsTUFBTzJoQyxJQUU1QnYvQixhQUFhby9CLEdBQ2IsTUFBTWxDLFFBQXFCSCxHQUFtQnBpQyxHQUM5QyxJQUFJNmtDLEVBQWEsS0FDYnRDLElBQWlCcUMsYUFBNkMsRUFBU0EsRUFBZSxPQUN0RkMsRUFBYXZDLEdBQXdCQyxFQUFjcUMsRUFBZSxNQUd0RTk1QixFQUFRb3pCLFFBQVEyRyxHQUFjSCxZQUdKLElBQW5CdEIsR0FDNkIsbUJBQTdCQSxFQUFlOW1DLFdBQ3RCOG1DLEVBQWU5bUMsVUFBVSxLQUFNcW9DLEdBT25DLE1BQU1HLEVBQXdCTixFQUN4Qk8sRUFBbUJ6RSxFQUFVNWdCLFlBQVk5YSxjQUF6QixNQUN0QjA2QixLQUFpQmtGLGNBQWdCdmhDLE1BQU9wSCxJQU9wQyxHQU5JQSxFQUFJK0ksY0FBY3hDLFdBQVcyaUMsSUFHN0JKLEVBQWlCLENBQUU5b0MsUUFHYyxtQkFBMUJpcEMsRUFDUCxJQUNJQSxFQUFzQmpwQyxHQUUxQixNQUFPN0csR0FFSEMsUUFBUUMsTUFBTUYsT0FhbEMsU0FBUzB2QyxLQUNMLE1BQU8sQ0FDSHB0QyxLQUFNLFVBQ044d0IsUUFBUyxLQUNUMkwsVUFBVyxLQUNYVSxZQUFhLEtBQ2I1YixTQUFVLEtBQ1Y3VixTQUFVLEtBQ1Y5TixNQUFPNEssRUFBYTs7Ozs7Ozs7Ozs7Ozs7OztHQXVCNUIsU0FBU2tsQyxHQUF1QmhsQyxFQUFNZ1UsR0FDbENLLEdBQVVyVSxHQUFNaWxDLGNBQWNqeEIsSyw4QkNwakJsQyxzekZBTUEsTUFBTWt4QixFQUFJOzs7Ozs7Ozs7Ozs7Ozs7O0dBc0JWLE1BQU1DLEVBQ0YsWUFBWXowQyxHQUNSeUIsS0FBS2tFLElBQU0zRixFQUVmLGtCQUNJLE9BQU8sTUFBUXlCLEtBQUtrRSxJQUtqQixRQUNILE9BQU9sRSxLQUFLaXpDLGtCQUFvQixPQUFTanpDLEtBQUtrRSxJQUFNLGlCQUV4RCxRQUFRM0YsR0FDSixPQUFPQSxFQUFFMkYsTUFBUWxFLEtBQUtrRSxLQUlDOHVDLEVBQUVFLGdCQUFrQixJQUFJRixFQUFFLE1BR3pEQSxFQUFFRyxtQkFBcUIsSUFBSUgsRUFBRSwwQkFBMkJBLEVBQUVJLFlBQWMsSUFBSUosRUFBRSxtQkFDOUVBLEVBQUVLLFVBQVksSUFBSUwsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQnBCLElBQUlNLEVBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQlIsTUFBTUMsRUFBSSxJQUFJLElBQU8sdUJBR3JCLFNBQVM3cUMsSUFDTCxPQUFPNnFDLEVBQUVsbUMsU0FlVCxTQUFTbW1DLEVBQUVqMUMsR0FDWGcxQyxFQUFFRSxZQUFZbDFDLEdBR2xCLFNBQVNtMUMsRUFBRW4xQyxLQUFNc0UsR0FDYixHQUFJMHdDLEVBQUVsbUMsVUFBWSxJQUFTc21DLE1BQU8sQ0FDOUIsTUFBTTcwQyxFQUFJK0QsRUFBRTBULElBQUlxOUIsR0FDaEJMLEVBQUVNLE1BQU0sY0FBY1AsT0FBTy8wQyxPQUFRTyxJQUk3QyxTQUFTZzFDLEVBQUV2MUMsS0FBTXNFLEdBQ2IsR0FBSTB3QyxFQUFFbG1DLFVBQVksSUFBU0MsTUFBTyxDQUM5QixNQUFNeE8sRUFBSStELEVBQUUwVCxJQUFJcTlCLEdBQ2hCTCxFQUFFeHdDLE1BQU0sY0FBY3V3QyxPQUFPLzBDLE9BQVFPLElBTXpDLFNBQVNpMUMsRUFBRXgxQyxLQUFNc0UsR0FDakIsR0FBSTB3QyxFQUFFbG1DLFVBQVksSUFBUzJtQyxLQUFNLENBQzdCLE1BQU1sMUMsRUFBSStELEVBQUUwVCxJQUFJcTlCLEdBQ2hCTCxFQUFFVSxLQUFLLGNBQWNYLE9BQU8vMEMsT0FBUU8sSUFNeEMsU0FBUzgwQyxFQUFFcjFDLEdBQ1gsR0FBSSxpQkFBbUJBLEVBQUcsT0FBT0EsRUFDakMsSUFDSSxPQUFPc0UsRUFBSXRFLEVBQUd5RyxLQUFLQyxVQUFVcEMsR0FDL0IsTUFBT0EsR0FFTCxPQUFPdEU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQlgsSUFBSXNFOzs7Ozs7Ozs7Ozs7Ozs7O0dBMEJKLFNBQVN5a0MsRUFBRS9vQyxFQUFJLG9CQUdmLE1BQU1zRSxFQUFJLGNBQWN5d0MsaUNBQW1DLzBDLEVBSTNELE1BQU11MUMsRUFBRWp4QyxHQUFJLElBQUl0QyxNQUFNc0MsR0FRdEIsU0FBU3F4QyxFQUFFMzFDLEVBQUdzRSxHQUNkdEUsR0FBSytvQyxJQVlMLFNBQVM2TSxFQUFFNTFDLEVBQUdzRSxHQUNkdEUsR0FBSytvQyxJQU1MLFNBQVM4TSxFQUFFNzFDLEVBRWZzRSxHQUNJLE9BQU90RTs7Ozs7Ozs7Ozs7Ozs7OztHQWtCUCxNQUFNODFDLEVBQUksQ0FJVkMsR0FBSSxLQUVKQyxVQUFXLFlBRVhDLFFBQVMsVUFPVEMsaUJBQWtCLG1CQVFsQkMsa0JBQW1CLG9CQUVuQkMsVUFBVyxZQUtYQyxlQUFnQixpQkFRaEJDLGtCQUFtQixvQkFLbkIzQixnQkFBaUIsa0JBS2pCNEIsbUJBQW9CLHFCQXFCcEJDLG9CQUFxQixzQkFRckJDLFFBQVMsVUFnQlRDLGFBQWMsZUFFZEMsY0FBZSxnQkFLZkMsU0FBVSxXQVFWQyxZQUFhLGNBRWJDLFVBQVcsYUFHb0MsTUFBTUMsVUFBVS8wQyxNQUUvRCxZQUlBaEMsRUFJQXNFLEdBQ0lzRSxNQUFNdEUsR0FBSTdDLEtBQUtnSCxLQUFPekksRUFBR3lCLEtBQUtpSCxRQUFVcEUsRUFFeEM3QyxLQUFLcEMsS0FBTyxnQkFJWm9DLEtBQUswRixTQUFXLElBQU0sR0FBRzFGLEtBQUtwQyxlQUFlb0MsS0FBS2dILFVBQVVoSCxLQUFLaUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnJFLE1BQU1zdUMsRUFDTixjQUNJdjFDLEtBQUsyRCxRQUFVLElBQUlDLFFBQVEsQ0FBRXJGLEVBQUdzRSxLQUM1QjdDLEtBQUswRCxRQUFVbkYsRUFBR3lCLEtBQUt5RCxPQUFTWjs7Ozs7Ozs7Ozs7Ozs7OztHQW9CeEMsTUFBTTJ5QyxFQUNOLFlBQVlqM0MsRUFBR3NFLEdBQ1g3QyxLQUFLcVUsS0FBT3hSLEVBQUc3QyxLQUFLbUYsS0FBTyxRQUFTbkYsS0FBS3FSLFFBQVUsSUFBSTFDLElBQUszTyxLQUFLcVIsUUFBUXRDLElBQUksZ0JBQWlCLFVBQVV4USxJQU81RyxNQUFNazNDLEVBQ04sV0FDSSxPQUFPN3hDLFFBQVFGLFFBQVEsTUFFM0IsbUJBQ0EsTUFBTW5GLEVBQUdzRSxHQUVMdEUsRUFBRW0zQyxpQkFBaUIsSUFBTzd5QyxFQUFFbXdDLEVBQUVFLGtCQUVsQyxhQU1BLE1BQU15QyxFQUNOLFlBQVlwM0MsR0FDUnlCLEtBQUtnRSxNQUFRekYsRUFNYnlCLEtBQUs0MUMsZUFBaUIsS0FFMUIsV0FDSSxPQUFPaHlDLFFBQVFGLFFBQVExRCxLQUFLZ0UsT0FFaEMsbUJBQ0EsTUFBTXpGLEVBQUdzRSxHQUNMN0MsS0FBSzQxQyxlQUFpQi95QyxFQUV0QnRFLEVBQUVtM0MsaUJBQWlCLElBQU83eUMsRUFBRTdDLEtBQUtnRSxNQUFNcVEsT0FFM0MsV0FDSXJVLEtBQUs0MUMsZUFBaUIsTUFJOUIsTUFBTXhPLEVBQ0YsWUFBWTdvQyxHQUNSeUIsS0FBS3pCLEVBQUlBLEVBRVR5QixLQUFLd1UsWUFBY3crQixFQUFFRSxnQkFLckJsekMsS0FBSzNDLEVBQUksRUFBRzJDLEtBQUtpWSxjQUFlLEVBQUlqWSxLQUFLNk4sS0FBTyxLQUVwRCxNQUFNdFAsRUFBR3NFLEdBQ0wsSUFBSS9ELEVBQUlrQixLQUFLM0MsRUFFTCxNQUFNK0IsRUFBSWIsR0FBS3lCLEtBQUszQyxJQUFNeUIsR0FBS0EsRUFBSWtCLEtBQUszQyxFQUFHd0YsRUFBRXRFLElBQU1xRixRQUFRRixVQUczRCxJQUFJckcsRUFBSSxJQUFJazRDLEVBQ3BCdjFDLEtBQUtsQyxFQUFJLEtBQ0xrQyxLQUFLM0MsSUFBSzJDLEtBQUt3VSxZQUFjeFUsS0FBSzhCLElBQUt6RSxFQUFFcUcsVUFBV3JHLEVBQUksSUFBSWs0QyxFQUFHaDNDLEVBQUVtM0MsaUJBQWlCLElBQU90MkMsRUFBRVksS0FBS3dVLGVBRXBHLE1BQU1yVyxFQUFJLEtBQ04sTUFBTTBFLEVBQUl4RixFQUNWa0IsRUFBRW0zQyxpQkFBaUIsZ0JBQ1Q3eUMsRUFBRWMsY0FBZXZFLEVBQUVZLEtBQUt3VSxnQkFFbkMxVyxFQUFJUyxJQUNIbTFDLEVBQUUsa0NBQW1DLGlCQUFrQjF6QyxLQUFLNk4sS0FBT3RQLEVBQUd5QixLQUFLNk4sS0FBS2dvQyxxQkFBcUI3MUMsS0FBS2xDLEdBQzFHSyxLQUVKNkIsS0FBS3pCLEVBQUV1M0MsT0FBUXYzQyxHQUFLVCxFQUFFUyxJQUl0QjBVLFdBQVcsS0FDUCxJQUFLalQsS0FBSzZOLEtBQU0sQ0FDWixNQUFNdFAsRUFBSXlCLEtBQUt6QixFQUFFK3VDLGFBQWEsQ0FDMUJ5SSxVQUFVLElBRWR4M0MsRUFBSVQsRUFBRVMsSUFFTm0xQyxFQUFFLGtDQUFtQyx5QkFBMEJyMkMsRUFBRXFHLFVBQVdyRyxFQUFJLElBQUlrNEMsS0FFeEYsR0FBSXAzQyxJQUVaLFdBSUksTUFBTUksRUFBSXlCLEtBQUszQyxFQUFHd0YsRUFBSTdDLEtBQUtpWSxhQUMzQixPQUFPalksS0FBS2lZLGNBQWUsRUFBSWpZLEtBQUs2TixLQUFPN04sS0FBSzZOLEtBQUtxTCxTQUFTclcsR0FBRzRILEtBQU01SCxHQUl2RTdDLEtBQUszQyxJQUFNa0IsR0FBS20xQyxFQUFFLGtDQUFtQyx5Q0FDckQxekMsS0FBS2taLFlBQWNyVyxHQUFLcXhDLEVBQUUsaUJBQW1CcnhDLEVBQUUrVSxhQUFjLElBQUk0OUIsRUFBRTN5QyxFQUFFK1UsWUFBYTVYLEtBQUt3VSxjQUFnQixNQUFTNVEsUUFBUUYsUUFBUSxNQUVwSSxrQkFDSTFELEtBQUtpWSxjQUFlLEVBRXhCLFdBQ0lqWSxLQUFLNk4sTUFBUTdOLEtBQUs2TixLQUFLbW9DLHdCQUF3QmgyQyxLQUFLbEMsR0FNeEQsSUFDSSxNQUFNUyxFQUFJeUIsS0FBSzZOLE1BQVE3TixLQUFLNk4sS0FBS29vQyxTQUNqQyxPQUFPL0IsRUFBRSxPQUFTMzFDLEdBQUssaUJBQW1CQSxHQUFJLElBQUl5MEMsRUFBRXowQyxJQVV4RCxNQUFNMjNDLEVBQ04sWUFBWTMzQyxFQUFHc0UsRUFBRy9ELEdBQ2RrQixLQUFLbUYsS0FBTyxhQUFjbkYsS0FBS3FVLEtBQU8yK0IsRUFBRUksWUFBYXB6QyxLQUFLcVIsUUFBVSxJQUFJMUMsSUFBSzNPLEtBQUtxUixRQUFRdEMsSUFBSSxrQkFBbUJsTSxHQUNqSCxNQUFNekQsRUFBSWIsRUFBRXNQLEtBQUtzb0MsZ0NBQWdDLElBQ2pELzJDLEdBQUtZLEtBQUtxUixRQUFRdEMsSUFBSSxnQkFBaUIzUCxHQUFJTixHQUFLa0IsS0FBS3FSLFFBQVF0QyxJQUFJLGlDQUFrQ2pRLElBUXZHLE1BQU1zM0MsRUFDTixZQUFZNzNDLEVBQUdzRSxFQUFHL0QsR0FDZGtCLEtBQUtxMkMsRUFBSTkzQyxFQUFHeUIsS0FBSzFDLEVBQUl1RixFQUFHN0MsS0FBS3ZDLEVBQUlxQixFQUVyQyxXQUNJLE9BQU84RSxRQUFRRixRQUFRLElBQUl3eUMsRUFBRWwyQyxLQUFLcTJDLEVBQUdyMkMsS0FBSzFDLEVBQUcwQyxLQUFLdkMsSUFFdEQsTUFBTWMsRUFBR3NFLEdBRUx0RSxFQUFFbTNDLGlCQUFpQixJQUFPN3lDLEVBQUVtd0MsRUFBRUksY0FFbEMsWUFDQSxvQkFHSixNQUFNa0QsRUFDRixZQUFZLzNDLEdBQ1J5QixLQUFLMUIsTUFBUUMsRUFBR3lCLEtBQUttRixLQUFPLFdBQVluRixLQUFLcVIsUUFBVSxJQUFJMUMsSUFBS3BRLEdBQUtBLEVBQUVpQixPQUFTLEdBQUtRLEtBQUtxUixRQUFRdEMsSUFBSSxzQkFBdUIvTyxLQUFLMUIsUUFJMUksTUFBTWk0QyxFQUNGLFlBQVloNEMsR0FDUnlCLEtBQUt3MkMsRUFBSWo0QyxFQUFHeUIsS0FBS2lZLGNBQWUsRUFBSWpZLEtBQUt5MkMsU0FBVyxLQUV4RCxNQUFNbDRDLEVBQUdzRSxHQUNMN0MsS0FBS2xDLEVBQUlnQixJQUNMUCxFQUFFbTNDLGlCQUFpQixJQUFPLENBQUNuM0MsSUFBTSxNQUFRQSxFQUFFd0UsT0FBUzJ3QyxFQUFFLGdDQUFpQywwRUFBMEVuMUMsRUFBRXdFLE1BQU1rRSxTQUN6S3BFLEVBQUV0RSxFQUFFeUYsUUFEc0IsQ0FDYmxGLEtBRWpCLE1BQU1BLEVBQUlQLElBQ05tMUMsRUFBRSxnQ0FBaUMscUJBQXNCMXpDLEtBQUt5MkMsU0FBV2w0QyxFQUFHeUIsS0FBS3kyQyxTQUFTQyxpQkFBaUIxMkMsS0FBS2xDLElBRXBIa0MsS0FBS3cyQyxFQUFFVixPQUFRdjNDLEdBQUtPLEVBQUVQLElBR3RCMFUsV0FBVyxLQUNQLElBQUtqVCxLQUFLeTJDLFNBQVUsQ0FDaEIsTUFBTWw0QyxFQUFJeUIsS0FBS3cyQyxFQUFFbEosYUFBYSxDQUMxQnlJLFVBQVUsSUFFZHgzQyxFQUFJTyxFQUFFUCxHQUVObTFDLEVBQUUsZ0NBQWlDLCtCQUV2QyxHQUVSLFdBQ0ksTUFBTW4xQyxFQUFJeUIsS0FBS2lZLGFBQ2YsT0FBT2pZLEtBQUtpWSxjQUFlLEVBQUlqWSxLQUFLeTJDLFNBQVd6MkMsS0FBS3kyQyxTQUFTdjlCLFNBQVMzYSxHQUFHa00sS0FBTWxNLEdBQUtBLEdBQUsyMUMsRUFBRSxpQkFBbUIzMUMsRUFBRXlGLE9BQ2hILElBQUlzeUMsRUFBRS8zQyxFQUFFeUYsUUFBVSxNQUFTSixRQUFRRixRQUFRLE1BRS9DLGtCQUNJMUQsS0FBS2lZLGNBQWUsRUFFeEIsV0FDSWpZLEtBQUt5MkMsVUFBWXoyQyxLQUFLeTJDLFNBQVNFLG9CQUFvQjMyQyxLQUFLbEMsSUFPNUQsTUFBTTg0QyxFQUNOLFdBQ0ksT0FBT2h6QyxRQUFRRixRQUFRLElBQUk0eUMsRUFBRSxLQUVqQyxtQkFDQSxNQUFNLzNDLEVBQUdzRSxJQUNUOzs7Ozs7Ozs7Ozs7Ozs7O0dBNkJKLE1BQU1nMEMsRUFDRixZQUFZdDRDLEVBQUdzRSxHQUNYN0MsS0FBSzgyQyxjQUFnQnY0QyxFQUFHc0UsSUFBTUEsRUFBRWswQyxzQkFBd0J4NEMsR0FBS3lCLEtBQUtiLEVBQUVaLEdBQUl5QixLQUFLZzNDLEVBQUl6NEMsR0FBS3NFLEVBQUVvMEMsb0JBQW9CMTRDLElBRWhILEVBQUVBLEdBQ0UsT0FBT3lCLEtBQUs4MkMsY0FBZ0JubkMsS0FBS3lGLElBQUk3VyxFQUFHeUIsS0FBSzgyQyxlQUFnQjkyQyxLQUFLODJDLGNBRXRFLE9BQ0ksTUFBTXY0QyxJQUFNeUIsS0FBSzgyQyxjQUNqQixPQUFPOTJDLEtBQUtnM0MsR0FBS2gzQyxLQUFLZzNDLEVBQUV6NEMsR0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QnBDLFNBQVMyNEMsRUFBRzM0QyxHQUVSLE1BQU1zRSxFQUVOLG9CQUFzQmlELE9BQVNBLEtBQUsrb0MsUUFBVS9vQyxLQUFLcXhDLFVBQVdyNEMsRUFBSSxJQUFJNHZDLFdBQVdud0MsR0FDakYsR0FBSXNFLEdBQUssbUJBQXFCQSxFQUFFdTBDLGdCQUFpQnYwQyxFQUFFdTBDLGdCQUFnQnQ0QyxRQUVuRSxJQUFLLElBQUkrRCxFQUFJLEVBQUdBLEVBQUl0RSxFQUFHc0UsSUFBSy9ELEVBQUUrRCxHQUFLOE0sS0FBS3VuQixNQUFNLElBQU12bkIsS0FBS3NuQixVQUN6RCxPQUFPbjRCOzs7Ozs7Ozs7Ozs7Ozs7O0dBa0JQKzNDLEVBQUdRLEdBQUssRUFFWixNQUFNQyxFQUNGLFdBRUksTUFBTS80QyxFQUFJLGlFQUFrRXNFLEVBQUk4TSxLQUFLdW5CLE1BQU0sSUFBTTM0QixFQUFFaUIsUUFBVWpCLEVBQUVpQixPQUV2RyxJQUFJVixFQUFJLEdBQ2hCLEtBQU1BLEVBQUVVLE9BQVMsSUFBTSxDQUNuQixNQUFNSixFQUFJODNDLEVBQUcsSUFDYixJQUFLLElBQUk3NUMsRUFBSSxFQUFHQSxFQUFJK0IsRUFBRUksU0FBVW5DLEVBR2hDeUIsRUFBRVUsT0FBUyxJQUFNSixFQUFFL0IsR0FBS3dGLElBQU0vRCxHQUFLUCxFQUFFNEQsT0FBTy9DLEVBQUUvQixHQUFLa0IsRUFBRWlCLFNBRXpELE9BQU9WLEdBSWYsU0FBU3k0QyxFQUFHaDVDLEVBQUdzRSxHQUNYLE9BQU90RSxFQUFJc0UsR0FBSyxFQUFJdEUsRUFBSXNFLEVBQUksRUFBSSxFQUdhLFNBQVMyMEMsRUFBR2o1QyxFQUFHc0UsRUFBRy9ELEdBQy9ELE9BQU9QLEVBQUVpQixTQUFXcUQsRUFBRXJELFFBQVVqQixFQUFFazVDLE1BQU0sQ0FBRWw1QyxFQUFHYSxJQUFNTixFQUFFUCxFQUFHc0UsRUFBRXpELEtBTTFELFNBQVNzNEMsRUFBR241QyxHQUVaLE9BQU9BLEVBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ2YsTUFBTW81QyxFQVlGLFlBSUFwNUMsRUFJQXNFLEdBQ0ksR0FBSTdDLEtBQUs4VCxRQUFVdlYsRUFBR3lCLEtBQUs0M0MsWUFBYy8wQyxFQUFHQSxFQUFJLEVBQUcsTUFBTSxJQUFJeXlDLEVBQUVqQixFQUFFSSxpQkFBa0IsdUNBQXlDNXhDLEdBQzVILEdBQUlBLEdBQUssSUFBSyxNQUFNLElBQUl5eUMsRUFBRWpCLEVBQUVJLGlCQUFrQix1Q0FBeUM1eEMsR0FDdkYsR0FBSXRFLEdBQUssWUFBYSxNQUFNLElBQUkrMkMsRUFBRWpCLEVBQUVJLGlCQUFrQixtQ0FBcUNsMkMsR0FFbkYsR0FBSUEsR0FBSyxhQUFjLE1BQU0sSUFBSSsyQyxFQUFFakIsRUFBRUksaUJBQWtCLG1DQUFxQ2wyQyxHQU1qRyxhQUNILE9BQU9vNUMsRUFBR0UsV0FBV3owQyxLQUFLK1IsT0FRdkIsZ0JBQWdCNVcsR0FDbkIsT0FBT281QyxFQUFHRSxXQUFXdDVDLEVBQUU4RSxXQVNwQixrQkFBa0I5RSxHQUNyQixNQUFNc0UsRUFBSThNLEtBQUt1bkIsTUFBTTM0QixFQUFJLEtBQU1PLEVBQUk2USxLQUFLdW5CLE1BQU0sS0FBTzM0QixFQUFJLElBQU1zRSxJQUMvRCxPQUFPLElBQUk4MEMsRUFBRzkwQyxFQUFHL0QsR0FTZCxTQUNILE9BQU8sSUFBSXNFLEtBQUtwRCxLQUFLODNDLFlBUWxCLFdBQ0gsT0FBTyxJQUFNOTNDLEtBQUs4VCxRQUFVOVQsS0FBSzQzQyxZQUFjLElBRW5ELFdBQVdyNUMsR0FDUCxPQUFPeUIsS0FBSzhULFVBQVl2VixFQUFFdVYsUUFBVXlqQyxFQUFHdjNDLEtBQUs0M0MsWUFBYXI1QyxFQUFFcTVDLGFBQWVMLEVBQUd2M0MsS0FBSzhULFFBQVN2VixFQUFFdVYsU0FPMUYsUUFBUXZWLEdBQ1gsT0FBT0EsRUFBRXVWLFVBQVk5VCxLQUFLOFQsU0FBV3ZWLEVBQUVxNUMsY0FBZ0I1M0MsS0FBSzQzQyxZQUVBLFdBQzVELE1BQU8scUJBQXVCNTNDLEtBQUs4VCxRQUFVLGlCQUFtQjlULEtBQUs0M0MsWUFBYyxJQUViLFNBQ3RFLE1BQU8sQ0FDSDlqQyxRQUFTOVQsS0FBSzhULFFBQ2Q4akMsWUFBYTUzQyxLQUFLNDNDLGFBTW5CLFVBUUgsTUFBTXI1QyxFQUFJeUIsS0FBSzhULFVBQVcsWUFHbEIsT0FBT25TLE9BQU9wRCxHQUFHMHdDLFNBQVMsR0FBSSxLQUFPLElBQU10dEMsT0FBTzNCLEtBQUs0M0MsYUFBYTNJLFNBQVMsRUFBRzs7Ozs7Ozs7Ozs7Ozs7OztHQXVCNUYsTUFBTThJLEVBQ04sWUFBWXg1QyxHQUNSeUIsS0FBS2c0QyxVQUFZejVDLEVBRXJCLHFCQUFxQkEsR0FDakIsT0FBTyxJQUFJdzVDLEVBQUd4NUMsR0FFbEIsYUFDSSxPQUFPLElBQUl3NUMsRUFBRyxJQUFJSixFQUFHLEVBQUcsSUFFNUIsVUFBVXA1QyxHQUNOLE9BQU95QixLQUFLZzRDLFVBQVVDLFdBQVcxNUMsRUFBRXk1QyxXQUV2QyxRQUFRejVDLEdBQ0osT0FBT3lCLEtBQUtnNEMsVUFBVUUsUUFBUTM1QyxFQUFFeTVDLFdBRTRDLGlCQUU1RSxPQUFPLElBQU1oNEMsS0FBS2c0QyxVQUFVbGtDLFFBQVU5VCxLQUFLZzRDLFVBQVVKLFlBQWMsSUFFdkUsV0FDSSxNQUFPLG1CQUFxQjUzQyxLQUFLZzRDLFVBQVV0eUMsV0FBYSxJQUU1RCxjQUNJLE9BQU8xRixLQUFLZzRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJoQixTQUFTRyxFQUFHNTVDLEdBQ1osSUFBSXNFLEVBQUksRUFDUixJQUFLLE1BQU0vRCxLQUFLUCxFQUFHUixPQUFPa0IsVUFBVUMsZUFBZTFCLEtBQUtlLEVBQUdPLElBQU0rRCxJQUNqRSxPQUFPQSxFQUdYLFNBQVN1MUMsRUFBRzc1QyxFQUFHc0UsR0FDWCxJQUFLLE1BQU0vRCxLQUFLUCxFQUFHUixPQUFPa0IsVUFBVUMsZUFBZTFCLEtBQUtlLEVBQUdPLElBQU0rRCxFQUFFL0QsRUFBR1AsRUFBRU8sSUFHNUUsU0FBU3U1QyxFQUFHOTVDLEdBQ1IsSUFBSyxNQUFNc0UsS0FBS3RFLEVBQUcsR0FBSVIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLZSxFQUFHc0UsR0FBSSxPQUFPLEVBQzFFLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlgsTUFBTXkxQyxFQUNGLFlBQVkvNUMsRUFBR3NFLEVBQUcvRCxRQUNkLElBQVcrRCxFQUFJQSxFQUFJLEVBQUlBLEVBQUl0RSxFQUFFaUIsUUFBVThuQyxTQUFLLElBQVd4b0MsRUFBSUEsRUFBSVAsRUFBRWlCLE9BQVNxRCxFQUFJL0QsRUFBSVAsRUFBRWlCLE9BQVNxRCxHQUFLeWtDLElBQ2xHdG5DLEtBQUt1NEMsU0FBV2g2QyxFQUFHeUIsS0FBS3c0QyxPQUFTMzFDLEVBQUc3QyxLQUFLNjhCLElBQU0vOUIsRUFFbkQsYUFDSSxPQUFPa0IsS0FBSzY4QixJQUVoQixRQUFRdCtCLEdBQ0osT0FBTyxJQUFNKzVDLEVBQUdHLFdBQVd6NEMsS0FBTXpCLEdBRXJDLE1BQU1BLEdBQ0YsTUFBTXNFLEVBQUk3QyxLQUFLdTRDLFNBQVNwcUMsTUFBTW5PLEtBQUt3NEMsT0FBUXg0QyxLQUFLMDRDLFNBQ2hELE9BQU9uNkMsYUFBYSs1QyxFQUFLLzVDLEVBQUU0SyxRQUFTNUssSUFDaENzRSxFQUFFekIsS0FBSzdDLEtBQ0xzRSxFQUFFekIsS0FBSzdDLEdBQUl5QixLQUFLMjRDLFVBQVU5MUMsR0FFMEIsUUFDMUQsT0FBTzdDLEtBQUt3NEMsT0FBU3g0QyxLQUFLUixPQUU5QixTQUFTakIsR0FDTCxPQUFPQSxPQUFJLElBQVdBLEVBQUksRUFBSUEsRUFBR3lCLEtBQUsyNEMsVUFBVTM0QyxLQUFLdTRDLFNBQVV2NEMsS0FBS3c0QyxPQUFTajZDLEVBQUd5QixLQUFLUixPQUFTakIsR0FFbEcsVUFDSSxPQUFPeUIsS0FBSzI0QyxVQUFVMzRDLEtBQUt1NEMsU0FBVXY0QyxLQUFLdzRDLE9BQVF4NEMsS0FBS1IsT0FBUyxHQUVwRSxlQUNJLE9BQU9RLEtBQUt1NEMsU0FBU3Y0QyxLQUFLdzRDLFFBRTlCLGNBQ0ksT0FBT3g0QyxLQUFLOUIsSUFBSThCLEtBQUtSLE9BQVMsR0FFbEMsSUFBSWpCLEdBQ0EsT0FBT3lCLEtBQUt1NEMsU0FBU3Y0QyxLQUFLdzRDLE9BQVNqNkMsR0FFdkMsVUFDSSxPQUFPLElBQU15QixLQUFLUixPQUV0QixXQUFXakIsR0FDUCxHQUFJQSxFQUFFaUIsT0FBU1EsS0FBS1IsT0FBUSxPQUFPLEVBQ25DLElBQUssSUFBSXFELEVBQUksRUFBR0EsRUFBSTdDLEtBQUtSLE9BQVFxRCxJQUFLLEdBQUk3QyxLQUFLOUIsSUFBSTJFLEtBQU90RSxFQUFFTCxJQUFJMkUsR0FBSSxPQUFPLEVBQzNFLE9BQU8sRUFFWCxvQkFBb0J0RSxHQUNoQixHQUFJeUIsS0FBS1IsT0FBUyxJQUFNakIsRUFBRWlCLE9BQVEsT0FBTyxFQUN6QyxJQUFLLElBQUlxRCxFQUFJLEVBQUdBLEVBQUk3QyxLQUFLUixPQUFRcUQsSUFBSyxHQUFJN0MsS0FBSzlCLElBQUkyRSxLQUFPdEUsRUFBRUwsSUFBSTJFLEdBQUksT0FBTyxFQUMzRSxPQUFPLEVBRVgsUUFBUXRFLEdBQ0osSUFBSyxJQUFJc0UsRUFBSTdDLEtBQUt3NEMsT0FBUTE1QyxFQUFJa0IsS0FBSzA0QyxRQUFTNzFDLEVBQUkvRCxFQUFHK0QsSUFBS3RFLEVBQUV5QixLQUFLdTRDLFNBQVMxMUMsSUFFNUUsVUFDSSxPQUFPN0MsS0FBS3U0QyxTQUFTcHFDLE1BQU1uTyxLQUFLdzRDLE9BQVF4NEMsS0FBSzA0QyxTQUVqRCxrQkFBa0JuNkMsRUFBR3NFLEdBQ2pCLE1BQU0vRCxFQUFJNlEsS0FBS0MsSUFBSXJSLEVBQUVpQixPQUFRcUQsRUFBRXJELFFBQy9CLElBQUssSUFBSUosRUFBSSxFQUFHQSxFQUFJTixFQUFHTSxJQUFLLENBQ3hCLE1BQU1OLEVBQUlQLEVBQUVMLElBQUlrQixHQUFJL0IsRUFBSXdGLEVBQUUzRSxJQUFJa0IsR0FDOUIsR0FBSU4sRUFBSXpCLEVBQUcsT0FBUSxFQUNuQixHQUFJeUIsRUFBSXpCLEVBQUcsT0FBTyxFQUV0QixPQUFPa0IsRUFBRWlCLE9BQVNxRCxFQUFFckQsUUFBVSxFQUFJakIsRUFBRWlCLE9BQVNxRCxFQUFFckQsT0FBUyxFQUFJLEdBU2hFLE1BQU1vNUMsVUFBV04sRUFDakIsVUFBVS81QyxFQUFHc0UsRUFBRy9ELEdBQ1osT0FBTyxJQUFJODVDLEVBQUdyNkMsRUFBR3NFLEVBQUcvRCxHQUV4QixrQkFJSSxPQUFPa0IsS0FBSzY0QyxVQUFVeDNDLEtBQUssS0FFL0IsV0FDSSxPQUFPckIsS0FBSzg0QyxrQkFNVCxxQkFBcUJ2NkMsR0FJeEIsTUFBTXNFLEVBQUksR0FDVixJQUFLLE1BQU0vRCxLQUFLUCxFQUFHLENBQ2YsR0FBSU8sRUFBRXdILFFBQVEsT0FBUyxFQUFHLE1BQU0sSUFBSWd2QyxFQUFFakIsRUFBRUksaUJBQWtCLG9CQUFvQjMxQywwQ0FFbEUrRCxFQUFFekIsUUFBUXRDLEVBQUV5SyxNQUFNLEtBQUswTixPQUFRMVksR0FBS0EsRUFBRWlCLE9BQVMsSUFFL0QsT0FBTyxJQUFJbzVDLEVBQUcvMUMsR0FFbEIsbUJBQ0ksT0FBTyxJQUFJKzFDLEVBQUcsS0FJdEIsTUFBTUcsRUFBSywyQkFLUCxNQUFNQyxVQUFXVixFQUNqQixVQUFVLzVDLEVBQUdzRSxFQUFHL0QsR0FDWixPQUFPLElBQUlrNkMsRUFBR3o2QyxFQUFHc0UsRUFBRy9ELEdBS2pCLHlCQUF5QlAsR0FDNUIsT0FBT3c2QyxFQUFHdnpDLEtBQUtqSCxHQUVuQixrQkFDSSxPQUFPeUIsS0FBSzY0QyxVQUFVdGlDLElBQUtoWSxJQUFNQSxFQUFJQSxFQUFFbUUsUUFBUSxNQUFPLFFBQVFBLFFBQVEsS0FBTSxPQUM1RXMyQyxFQUFHQyxrQkFBa0IxNkMsS0FBT0EsRUFBSSxJQUFNQSxFQUFJLEtBQU1BLElBQUs4QyxLQUFLLEtBRTlELFdBQ0ksT0FBT3JCLEtBQUs4NEMsa0JBSVQsYUFDSCxPQUFPLElBQU05NEMsS0FBS1IsUUFBVSxhQUFlUSxLQUFLOUIsSUFBSSxHQUlqRCxrQkFDSCxPQUFPLElBQUk4NkMsRUFBRyxDQUFFLGFBV2Isd0JBQXdCejZDLEdBQzNCLE1BQU1zRSxFQUFJLEdBQ1YsSUFBSS9ELEVBQUksR0FBSU0sRUFBSSxFQUNoQixNQUFNL0IsRUFBSSxLQUNOLEdBQUksSUFBTXlCLEVBQUVVLE9BQVEsTUFBTSxJQUFJODFDLEVBQUVqQixFQUFFSSxpQkFBa0IsdUJBQXVCbDJDLDhFQUMzRXNFLEVBQUV6QixLQUFLdEMsR0FBSUEsRUFBSSxJQUVuQixJQUFJWCxHQUFJLEVBQ1IsS0FBTWlCLEVBQUliLEVBQUVpQixRQUFVLENBQ2xCLE1BQU1xRCxFQUFJdEUsRUFBRWEsR0FDWixHQUFJLE9BQVN5RCxFQUFHLENBQ1osR0FBSXpELEVBQUksSUFBTWIsRUFBRWlCLE9BQVEsTUFBTSxJQUFJODFDLEVBQUVqQixFQUFFSSxpQkFBa0IsdUNBQXlDbDJDLEdBQ2pHLE1BQU1zRSxFQUFJdEUsRUFBRWEsRUFBSSxHQUNoQixHQUFJLE9BQVN5RCxHQUFLLE1BQVFBLEdBQUssTUFBUUEsRUFBRyxNQUFNLElBQUl5eUMsRUFBRWpCLEVBQUVJLGlCQUFrQixxQ0FBdUNsMkMsR0FDakhPLEdBQUsrRCxFQUFHekQsR0FBSyxNQUNWLE1BQVF5RCxHQUFLMUUsR0FBS0EsRUFBR2lCLEtBQU8sTUFBUXlELEdBQUsxRSxHQUFLVyxHQUFLK0QsRUFBR3pELE1BQVEvQixJQUFLK0IsS0FFOUUsR0FBSS9CLElBQUtjLEVBQUcsTUFBTSxJQUFJbTNDLEVBQUVqQixFQUFFSSxpQkFBa0IsMkJBQTZCbDJDLEdBQ3pFLE9BQU8sSUFBSXk2QyxFQUFHbjJDLEdBRWxCLG1CQUNJLE9BQU8sSUFBSW0yQyxFQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0dBNkJsQixNQUFNRSxFQUNOLFlBQVkzNkMsR0FDUnlCLEtBQUttNUMsT0FBUzU2QyxFQUdkQSxFQUFFdWpCLEtBQUtrM0IsRUFBR1AsWUFPUCxPQUFPbDZDLEdBQ1YsSUFBSyxNQUFNc0UsS0FBSzdDLEtBQUttNUMsT0FBUSxHQUFJdDJDLEVBQUV1MkMsV0FBVzc2QyxHQUFJLE9BQU8sRUFDekQsT0FBTyxFQUVYLFFBQVFBLEdBQ0osT0FBT2k1QyxFQUFHeDNDLEtBQUttNUMsT0FBUTU2QyxFQUFFNDZDLE9BQVEsQ0FBRTU2QyxFQUFHc0UsSUFBTXRFLEVBQUUyNUMsUUFBUXIxQzs7Ozs7Ozs7Ozs7Ozs7OztHQXNCOUQsU0FBU3cyQyxJQUNMLE1BQU8sb0JBQXNCbjVDOzs7Ozs7Ozs7Ozs7Ozs7O0dBMkI3QixNQUFNbzVDLEVBQ04sWUFBWS82QyxHQUNSeUIsS0FBS3U1QyxhQUFlaDdDLEVBRXhCLHdCQUF3QkEsR0FDcEIsTUFBTXNFLEVBQUkzQyxLQUFLM0IsR0FDZixPQUFPLElBQUkrNkMsRUFBR3oyQyxHQUVsQixzQkFBc0J0RSxHQUNsQixNQUFNc0UsRUFJTixTQUFTdEUsR0FDTCxJQUFJc0UsRUFBSSxHQUNSLElBQUssSUFBSS9ELEVBQUksRUFBR0EsRUFBSVAsRUFBRWlCLFNBQVVWLEVBQUcrRCxHQUFLbEIsT0FBT0MsYUFBYXJELEVBQUVPLElBQzlELE9BQU8rRCxFQUhYLENBT0h0RSxHQUNHLE9BQU8sSUFBSSs2QyxFQUFHejJDLEdBRWxCLFdBQ0ksT0FBT3RFLEVBQUl5QixLQUFLdTVDLGFBQWNqNEMsS0FBSy9DLEdBRW5DLElBQUlBLEVBRVIsZUFDSSxPQUFPLFNBQVNBLEdBQ1osTUFBTXNFLEVBQUksSUFBSTZyQyxXQUFXbndDLEVBQUVpQixRQUMzQixJQUFLLElBQUlWLEVBQUksRUFBR0EsRUFBSVAsRUFBRWlCLE9BQVFWLElBQUsrRCxFQUFFL0QsR0FBS1AsRUFBRWtCLFdBQVdYLEdBQ3ZELE9BQU8rRDs7Ozs7Ozs7Ozs7Ozs7OztHQUhKLENBc0JON0MsS0FBS3U1QyxjQUVWLHNCQUNJLE9BQU8sRUFBSXY1QyxLQUFLdTVDLGFBQWEvNUMsT0FFakMsVUFBVWpCLEdBQ04sT0FBT2c1QyxFQUFHdjNDLEtBQUt1NUMsYUFBY2g3QyxFQUFFZzdDLGNBRW5DLFFBQVFoN0MsR0FDSixPQUFPeUIsS0FBS3U1QyxlQUFpQmg3QyxFQUFFZzdDLGNBSXZDRCxFQUFHRSxrQkFBb0IsSUFBSUYsRUFBRyxJQUU5QixNQUFNRyxFQUFLLElBQUkxUyxPQUFPLGlEQUtsQixTQUFTMlMsRUFBR243QyxHQUlaLEdBQUkyMUMsSUFBSTMxQyxHQUFJLGlCQUFtQkEsRUFBRyxDQUk5QixJQUFJc0UsRUFBSSxFQUNSLE1BQU0vRCxFQUFJMjZDLEVBQUdoM0IsS0FBS2xrQixHQUNsQixHQUFJMjFDLElBQUlwMUMsR0FBSUEsRUFBRSxHQUFJLENBRWQsSUFBSVAsRUFBSU8sRUFBRSxHQUNWUCxHQUFLQSxFQUFJLGFBQWFta0IsT0FBTyxFQUFHLEdBQUk3ZixFQUFJNlEsT0FBT25WLEdBRzNDLE1BQU1hLEVBQUksSUFBSWdFLEtBQUs3RSxHQUMzQixNQUFPLENBQ0h1VixRQUFTbkUsS0FBS3VuQixNQUFNOTNCLEVBQUVpRSxVQUFZLEtBQ2xDczJDLE1BQU85MkMsR0FHZixNQUFPLENBQ0hpUixRQUFTOGxDLEdBQUdyN0MsRUFBRXVWLFNBQ2Q2bEMsTUFBT0MsR0FBR3I3QyxFQUFFbzdDLFFBT2hCLFNBQVNDLEdBQUdyN0MsR0FFWixNQUFPLGlCQUFtQkEsRUFBSUEsRUFBSSxpQkFBbUJBLEVBQUltVixPQUFPblYsR0FBSyxFQUdILFNBQVNzN0MsR0FBR3Q3QyxHQUM5RSxNQUFPLGlCQUFtQkEsRUFBSSs2QyxFQUFHUSxpQkFBaUJ2N0MsR0FBSys2QyxFQUFHUyxlQUFleDdDOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0N6RSxTQUFTeTdDLEdBQUd6N0MsR0FDWixJQUFJc0UsRUFBRy9ELEVBQ1AsTUFBTyxzQkFBd0IsUUFBVUEsSUFBTSxRQUFVK0QsRUFBSSxNQUFRdEUsT0FBSSxFQUFTQSxFQUFFMDdDLGdCQUFhLElBQVdwM0MsT0FBSSxFQUFTQSxFQUFFczJDLFNBQVcsSUFBSWUsZ0JBQWEsSUFBV3A3QyxPQUFJLEVBQVNBLEVBQUVxN0MsYUFtQmpMLFNBQVNDLEdBQUc3N0MsR0FDWixNQUFNc0UsRUFBSTYyQyxFQUFHbjdDLEVBQUUwN0MsU0FBU2QsT0FBT2tCLHFCQUFxQkMsZ0JBQ3BELE9BQU8sSUFBSTNDLEVBQUc5MEMsRUFBRWlSLFFBQVNqUixFQUFFODJDOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUIvQixTQUFTWSxHQUFHaDhDLEdBQ1IsT0FBTyxNQUFRQSxFQUc2QixTQUFTaThDLEdBQUdqOEMsR0FHeEQsT0FBTyxJQUFNQSxHQUFLLEVBQUlBLElBQUssSUFNM0IsU0FBU2s4QyxHQUFHbDhDLEdBQ1osTUFBTyxpQkFBbUJBLEdBQUttVixPQUFPZ25DLFVBQVVuOEMsS0FBT2k4QyxHQUFHajhDLElBQU1BLEdBQUttVixPQUFPaW5DLGtCQUFvQnA4QyxHQUFLbVYsT0FBT2tuQzs7Ozs7Ozs7Ozs7Ozs7OztHQXFCNUcsTUFBTUMsR0FDTixZQUFZdDhDLEdBQ1J5QixLQUFLK1AsS0FBT3hSLEVBRWhCLGdCQUFnQkEsR0FDWixPQUFPLElBQUlzOEMsR0FBR2pDLEVBQUdrQyxXQUFXdjhDLElBRWhDLGdCQUFnQkEsR0FDWixPQUFPLElBQUlzOEMsR0FBR2pDLEVBQUdrQyxXQUFXdjhDLEdBQUd3OEMsU0FBUyxJQUU2QixnQkFBZ0J4OEMsR0FDckYsT0FBT3lCLEtBQUsrUCxLQUFLdlEsUUFBVSxHQUFLUSxLQUFLK1AsS0FBSzdSLElBQUk4QixLQUFLK1AsS0FBS3ZRLE9BQVMsS0FBT2pCLEVBRTVFLFFBQVFBLEdBQ0osT0FBTyxPQUFTQSxHQUFLLElBQU1xNkMsRUFBR0gsV0FBV3o0QyxLQUFLK1AsS0FBTXhSLEVBQUV3UixNQUUxRCxXQUNJLE9BQU8vUCxLQUFLK1AsS0FBS3JLLFdBRXJCLGtCQUFrQm5ILEVBQUdzRSxHQUNqQixPQUFPKzFDLEVBQUdILFdBQVdsNkMsRUFBRXdSLEtBQU1sTixFQUFFa04sTUFFbkMscUJBQXFCeFIsR0FDakIsT0FBT0EsRUFBRWlCLE9BQVMsR0FBSyxFQU9wQixvQkFBb0JqQixHQUN2QixPQUFPLElBQUlzOEMsR0FBRyxJQUFJakMsRUFBR3I2QyxFQUFFNFA7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQmtDLFNBQVM2c0MsR0FBR3o4QyxHQUN6RSxNQUFPLGNBQWVBLEVBQUksRUFBb0IsaUJBQWtCQSxFQUFJLEVBQXVCLGlCQUFrQkEsR0FBSyxnQkFBaUJBLEVBQUksRUFBc0IsbUJBQW9CQSxFQUFJLEVBQXlCLGdCQUFpQkEsRUFBSSxFQUFzQixlQUFnQkEsRUFBSSxFQUFvQixtQkFBb0JBLEVBQUksRUFBbUIsa0JBQW1CQSxFQUFJLEVBQXdCLGVBQWdCQSxFQUFJLEVBQXFCLGFBQWNBLEVBQUl5N0MsR0FBR3o3QyxHQUFLLEVBQStCLEdBQXVCK29DLElBRzNhLFNBQVMyVCxHQUFHMThDLEVBQUdzRSxHQUN4RixNQUFNL0QsRUFBSWs4QyxHQUFHejhDLEdBQ2IsR0FBSU8sSUFBTWs4QyxHQUFHbjRDLEdBQUksT0FBTyxFQUN4QixPQUFRL0QsR0FDTixLQUFLLEVBQ0gsT0FBTyxFQUVULEtBQUssRUFDSCxPQUFPUCxFQUFFMjhDLGVBQWlCcjRDLEVBQUVxNEMsYUFFOUIsS0FBSyxFQUNILE9BQU9kLEdBQUc3N0MsR0FBRzI1QyxRQUFRa0MsR0FBR3YzQyxJQUUxQixLQUFLLEVBQ0gsT0FBTyxTQUFTdEUsRUFBR3NFLEdBQ2YsR0FBSSxpQkFBbUJ0RSxFQUFFKzdDLGdCQUFrQixpQkFBbUJ6M0MsRUFBRXkzQyxnQkFBa0IvN0MsRUFBRSs3QyxlQUFlOTZDLFNBQVdxRCxFQUFFeTNDLGVBQWU5NkMsT0FFL0gsT0FBT2pCLEVBQUUrN0MsaUJBQW1CejNDLEVBQUV5M0MsZUFDOUIsTUFBTXg3QyxFQUFJNDZDLEVBQUduN0MsRUFBRSs3QyxnQkFBaUJsN0MsRUFBSXM2QyxFQUFHNzJDLEVBQUV5M0MsZ0JBQ3pDLE9BQU94N0MsRUFBRWdWLFVBQVkxVSxFQUFFMFUsU0FBV2hWLEVBQUU2NkMsUUFBVXY2QyxFQUFFdTZDLE1BTDdDLENBTUxwN0MsRUFBR3NFLEdBRVAsS0FBSyxFQUNILE9BQU90RSxFQUFFNDdDLGNBQWdCdDNDLEVBQUVzM0MsWUFFN0IsS0FBSyxFQUNILE9BQU8sU0FBUzU3QyxFQUFHc0UsR0FDZixPQUFPZzNDLEdBQUd0N0MsRUFBRTQ4QyxZQUFZakQsUUFBUTJCLEdBQUdoM0MsRUFBRXM0QyxhQURsQyxDQUVMNThDLEVBQUdzRSxHQUVQLEtBQUssRUFDSCxPQUFPdEUsRUFBRTY4QyxpQkFBbUJ2NEMsRUFBRXU0QyxlQUVoQyxLQUFLLEVBQ0gsT0FBTyxTQUFTNzhDLEVBQUdzRSxHQUNmLE9BQU8rMkMsR0FBR3I3QyxFQUFFODhDLGNBQWNDLFlBQWMxQixHQUFHLzJDLEVBQUV3NEMsY0FBY0MsV0FBYTFCLEdBQUdyN0MsRUFBRTg4QyxjQUFjRSxhQUFlM0IsR0FBRy8yQyxFQUFFdzRDLGNBQWNFLFdBRDFILENBRUxoOUMsRUFBR3NFLEdBRVAsS0FBSyxFQUNILE9BQU8sU0FBU3RFLEVBQUdzRSxHQUNmLEdBQUksaUJBQWtCdEUsR0FBSyxpQkFBa0JzRSxFQUFHLE9BQU8rMkMsR0FBR3I3QyxFQUFFaTlDLGdCQUFrQjVCLEdBQUcvMkMsRUFBRTI0QyxjQUNuRixHQUFJLGdCQUFpQmo5QyxHQUFLLGdCQUFpQnNFLEVBQUcsQ0FDMUMsTUFBTS9ELEVBQUk4NkMsR0FBR3I3QyxFQUFFazlDLGFBQWNyOEMsRUFBSXc2QyxHQUFHLzJDLEVBQUU0NEMsYUFDdEMsT0FBTzM4QyxJQUFNTSxFQUFJbzdDLEdBQUcxN0MsS0FBTzA3QyxHQUFHcDdDLEdBQUt1VSxNQUFNN1UsSUFBTTZVLE1BQU12VSxHQUV6RCxPQUFPLEVBTkosQ0FPTGIsRUFBR3NFLEdBRVAsS0FBSyxFQUNILE9BQU8yMEMsRUFBR2o1QyxFQUFFbTlDLFdBQVdDLFFBQVUsR0FBSTk0QyxFQUFFNjRDLFdBQVdDLFFBQVUsR0FBSVYsSUFFbEUsS0FBSyxHQUNILE9BQU8sU0FBUzE4QyxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSVAsRUFBRTA3QyxTQUFTZCxRQUFVLEdBQUkvNUMsRUFBSXlELEVBQUVvM0MsU0FBU2QsUUFBVSxHQUM1RCxHQUFJaEIsRUFBR3I1QyxLQUFPcTVDLEVBQUcvNEMsR0FBSSxPQUFPLEVBQzVCLElBQUssTUFBTWIsS0FBS08sRUFBRyxHQUFJQSxFQUFFSSxlQUFlWCxVQUFPLElBQVdhLEVBQUViLEtBQU8wOEMsR0FBR244QyxFQUFFUCxHQUFJYSxFQUFFYixLQUFNLE9BQU8sRUFDM0YsT0FBTyxFQUpKLENBTWdFQSxFQUFHc0UsR0FFNUUsUUFDRSxPQUFPeWtDLEtBSWYsU0FBU3NVLEdBQUdyOUMsRUFBR3NFLEdBQ1gsWUFBTyxLQUFZdEUsRUFBRW85QyxRQUFVLElBQUk1ckIsS0FBTXh4QixHQUFLMDhDLEdBQUcxOEMsRUFBR3NFLElBR3hELFNBQVNnNUMsR0FBR3Q5QyxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSWs4QyxHQUFHejhDLEdBQUlhLEVBQUk0N0MsR0FBR240QyxHQUN4QixHQUFJL0QsSUFBTU0sRUFBRyxPQUFPbTRDLEVBQUd6NEMsRUFBR00sR0FDMUIsT0FBUU4sR0FDTixLQUFLLEVBQ0gsT0FBTyxFQUVULEtBQUssRUFDSCxPQUFPeTRDLEVBQUdoNUMsRUFBRTI4QyxhQUFjcjRDLEVBQUVxNEMsY0FFOUIsS0FBSyxFQUNILE9BQU8sU0FBUzM4QyxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSTg2QyxHQUFHcjdDLEVBQUVpOUMsY0FBZ0JqOUMsRUFBRWs5QyxhQUFjcjhDLEVBQUl3NkMsR0FBRy8yQyxFQUFFMjRDLGNBQWdCMzRDLEVBQUU0NEMsYUFDMUUsT0FBTzM4QyxFQUFJTSxHQUFLLEVBQUlOLEVBQUlNLEVBQUksRUFBSU4sSUFBTU0sRUFBSSxFQUUxQ3VVLE1BQU03VSxHQUFLNlUsTUFBTXZVLEdBQUssR0FBSyxFQUFJLEVBSjVCLENBS0xiLEVBQUdzRSxHQUVQLEtBQUssRUFDSCxPQUFPaTVDLEdBQUd2OUMsRUFBRSs3QyxlQUFnQnozQyxFQUFFeTNDLGdCQUVoQyxLQUFLLEVBQ0gsT0FBT3dCLEdBQUcxQixHQUFHNzdDLEdBQUk2N0MsR0FBR3YzQyxJQUV0QixLQUFLLEVBQ0gsT0FBTzAwQyxFQUFHaDVDLEVBQUU0N0MsWUFBYXQzQyxFQUFFczNDLGFBRTdCLEtBQUssRUFDSCxPQUFPLFNBQVM1N0MsRUFBR3NFLEdBQ2YsTUFBTS9ELEVBQUkrNkMsR0FBR3Q3QyxHQUFJYSxFQUFJeTZDLEdBQUdoM0MsR0FDeEIsT0FBTy9ELEVBQUVpOUMsVUFBVTM4QyxHQUZoQixDQUdMYixFQUFFNDhDLFdBQVl0NEMsRUFBRXM0QyxZQUVwQixLQUFLLEVBQ0gsT0FBTyxTQUFTNThDLEVBQUdzRSxHQUNmLE1BQU0vRCxFQUFJUCxFQUFFZ0wsTUFBTSxLQUFNbkssRUFBSXlELEVBQUUwRyxNQUFNLEtBQ3BDLElBQUssSUFBSWhMLEVBQUksRUFBR0EsRUFBSU8sRUFBRVUsUUFBVWpCLEVBQUlhLEVBQUVJLE9BQVFqQixJQUFLLENBQy9DLE1BQU1zRSxFQUFJMDBDLEVBQUd6NEMsRUFBRVAsR0FBSWEsRUFBRWIsSUFDckIsR0FBSSxJQUFNc0UsRUFBRyxPQUFPQSxFQUV4QixPQUFPMDBDLEVBQUd6NEMsRUFBRVUsT0FBUUosRUFBRUksUUFObkIsQ0FPTGpCLEVBQUU2OEMsZUFBZ0J2NEMsRUFBRXU0QyxnQkFFeEIsS0FBSyxFQUNILE9BQU8sU0FBUzc4QyxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSXk0QyxFQUFHcUMsR0FBR3I3QyxFQUFFKzhDLFVBQVcxQixHQUFHLzJDLEVBQUV5NEMsV0FDbEMsT0FBSSxJQUFNeDhDLEVBQVVBLEVBQ2J5NEMsRUFBR3FDLEdBQUdyN0MsRUFBRWc5QyxXQUFZM0IsR0FBRy8yQyxFQUFFMDRDLFlBSDdCLENBSUxoOUMsRUFBRTg4QyxjQUFleDRDLEVBQUV3NEMsZUFFdkIsS0FBSyxFQUNILE9BQU8sU0FBUzk4QyxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSVAsRUFBRW85QyxRQUFVLEdBQUl2OEMsRUFBSXlELEVBQUU4NEMsUUFBVSxHQUMxQyxJQUFLLElBQUlwOUMsRUFBSSxFQUFHQSxFQUFJTyxFQUFFVSxRQUFVakIsRUFBSWEsRUFBRUksU0FBVWpCLEVBQUcsQ0FDL0MsTUFBTXNFLEVBQUlnNUMsR0FBRy84QyxFQUFFUCxHQUFJYSxFQUFFYixJQUNyQixHQUFJc0UsRUFBRyxPQUFPQSxFQUVsQixPQUFPMDBDLEVBQUd6NEMsRUFBRVUsT0FBUUosRUFBRUksUUFObkIsQ0FPTGpCLEVBQUVtOUMsV0FBWTc0QyxFQUFFNjRDLFlBRXBCLEtBQUssR0FDSCxPQUFPLFNBQVNuOUMsRUFBR3NFLEdBQ2YsTUFBTS9ELEVBQUlQLEVBQUU0NkMsUUFBVSxHQUFJLzVDLEVBQUlyQixPQUFPeUssS0FBSzFKLEdBQUl6QixFQUFJd0YsRUFBRXMyQyxRQUFVLEdBQUloN0MsRUFBSUosT0FBT3lLLEtBQUtuTCxHQUtsRitCLEVBQUUwaUIsT0FBUTNqQixFQUFFMmpCLE9BQ1osSUFBSyxJQUFJdmpCLEVBQUksRUFBR0EsRUFBSWEsRUFBRUksUUFBVWpCLEVBQUlKLEVBQUVxQixTQUFVakIsRUFBRyxDQUMvQyxNQUFNc0UsRUFBSTAwQyxFQUFHbjRDLEVBQUViLEdBQUlKLEVBQUVJLElBQ3JCLEdBQUksSUFBTXNFLEVBQUcsT0FBT0EsRUFDcEIsTUFBTS9FLEVBQUkrOUMsR0FBRy84QyxFQUFFTSxFQUFFYixJQUFLbEIsRUFBRWMsRUFBRUksS0FDMUIsR0FBSSxJQUFNVCxFQUFHLE9BQU9BLEVBRXhCLE9BQU95NUMsRUFBR240QyxFQUFFSSxPQUFRckIsRUFBRXFCLFFBYm5CLENBa0JWakIsRUFBRTA3QyxTQUFVcDNDLEVBQUVvM0MsVUFFYixRQUNFLE1BQU0zUyxLQUlkLFNBQVN3VSxHQUFHdjlDLEVBQUdzRSxHQUNYLEdBQUksaUJBQW1CdEUsR0FBSyxpQkFBbUJzRSxHQUFLdEUsRUFBRWlCLFNBQVdxRCxFQUFFckQsT0FBUSxPQUFPKzNDLEVBQUdoNUMsRUFBR3NFLEdBQ3hGLE1BQU0vRCxFQUFJNDZDLEVBQUduN0MsR0FBSWEsRUFBSXM2QyxFQUFHNzJDLEdBQUl4RixFQUFJazZDLEVBQUd6NEMsRUFBRWdWLFFBQVMxVSxFQUFFMFUsU0FDaEQsT0FBTyxJQUFNelcsRUFBSUEsRUFBSWs2QyxFQUFHejRDLEVBQUU2NkMsTUFBT3Y2QyxFQUFFdTZDLE9BR3ZDLFNBQVNxQyxHQUFHejlDLEdBQ1IsT0FHSixTQUFTMDlDLEVBQUcxOUMsR0FDUixNQUFPLGNBQWVBLEVBQUksT0FBUyxpQkFBa0JBLEVBQUksR0FBS0EsRUFBRTI4QyxhQUFlLGlCQUFrQjM4QyxFQUFJLEdBQUtBLEVBQUVpOUMsYUFBZSxnQkFBaUJqOUMsRUFBSSxHQUFLQSxFQUFFazlDLFlBQWMsbUJBQW9CbDlDLEVBQUksU0FBU0EsR0FDbE0sTUFBTXNFLEVBQUk2MkMsRUFBR243QyxHQUNiLE1BQU8sUUFBUXNFLEVBQUVpUixXQUFXalIsRUFBRTgyQyxTQUYySixDQUczTHA3QyxFQUFFKzdDLGdCQUFrQixnQkFBaUIvN0MsRUFBSUEsRUFBRTQ3QyxZQUFjLGVBQWdCNTdDLEVBQUlzN0MsR0FBR3Q3QyxFQUFFNDhDLFlBQVllLFdBQWEsbUJBQW9CMzlDLEdBQUtPLEVBQUlQLEVBQUU2OEMsZUFDNUlQLEdBQUdzQixTQUFTcjlDLEdBQUc0RyxZQUFjLGtCQUFtQm5ILEVBQUksUUFBUXNFLEVBQUl0RSxFQUFFODhDLGVBQWVDLFlBQVl6NEMsRUFBRTA0QyxhQUFlLGVBQWdCaDlDLEVBQUksU0FBU0EsR0FDdkksSUFBSXNFLEVBQUksSUFBSy9ELEdBQUksRUFDakIsSUFBSyxNQUFNTSxLQUFLYixFQUFFbzlDLFFBQVUsR0FBSTc4QyxFQUFJQSxHQUFJLEVBQUsrRCxHQUFLLElBQUtBLEdBQUtvNUMsRUFBRzc4QyxHQUMvRCxPQUFPeUQsRUFBSSxJQUhtSCxDQUs3RHRFLEVBQUVtOUMsWUFBYyxhQUFjbjlDLEVBQUksU0FBU0EsR0FHNUcsTUFBTXNFLEVBQUk5RSxPQUFPeUssS0FBS2pLLEVBQUU0NkMsUUFBVSxJQUFJcjNCLE9BQ3RDLElBQUloakIsRUFBSSxJQUFLTSxHQUFJLEVBQ2pCLElBQUssTUFBTS9CLEtBQUt3RixFQUFHekQsRUFBSUEsR0FBSSxFQUFLTixHQUFLLElBQUtBLEdBQUssR0FBR3pCLEtBQUs0K0MsRUFBRzE5QyxFQUFFNDZDLE9BQU85N0MsTUFDbkUsT0FBT3lCLEVBQUksSUFOd0YsQ0FPckdQLEVBQUUwN0MsVUFBWTNTLElBQ2hCLElBQUl6a0MsRUFBRy9ELEVBckJBbTlDLENBQUcxOUMsR0F3QmQsU0FBUzY5QyxHQUFHNzlDLEVBQUdzRSxHQUNYLE1BQU8sQ0FDSHU0QyxlQUFnQixZQUFZNzhDLEVBQUUwRix1QkFBdUIxRixFQUFFODlDLHNCQUFzQng1QyxFQUFFa04sS0FBSytvQyxxQkFJeEMsU0FBU3dELEdBQUcvOUMsR0FDNUQsUUFBU0EsR0FBSyxpQkFBa0JBLEVBS3BDLFNBQVNnK0MsR0FBR2grQyxHQUNSLFFBQVNBLEdBQUssZUFBZ0JBLEVBR2EsU0FBU2krQyxHQUFHaitDLEdBQ3ZELFFBQVNBLEdBQUssY0FBZUEsRUFHTSxTQUFTaytDLEdBQUdsK0MsR0FDL0MsUUFBU0EsR0FBSyxnQkFBaUJBLEdBQUtvVixNQUFNRCxPQUFPblYsRUFBRWs5QyxjQUdULFNBQVNpQixHQUFHbitDLEdBQ3RELFFBQVNBLEdBQUssYUFBY0EsRUFHUSxTQUFTbytDLEdBQUdwK0MsR0FDaEQsR0FBSUEsRUFBRTg4QyxjQUFlLE1BQU8sQ0FDeEJBLGNBQWV0OUMsT0FBT3lHLE9BQU8sR0FBSWpHLEVBQUU4OEMsZ0JBRXZDLEdBQUk5OEMsRUFBRSs3QyxnQkFBa0IsaUJBQW1CLzdDLEVBQUUrN0MsZUFBZ0IsTUFBTyxDQUNoRUEsZUFBZ0J2OEMsT0FBT3lHLE9BQU8sR0FBSWpHLEVBQUUrN0MsaUJBRXhDLEdBQUkvN0MsRUFBRTA3QyxTQUFVLENBQ1osTUFBTXAzQyxFQUFJLENBQ05vM0MsU0FBVSxDQUNOZCxPQUFRLEtBR2hCLE9BQU9mLEVBQUc3NUMsRUFBRTA3QyxTQUFTZCxPQUFRLENBQUU1NkMsRUFBR08sSUFBTStELEVBQUVvM0MsU0FBU2QsT0FBTzU2QyxHQUFLbytDLEdBQUc3OUMsSUFBTStELEVBRTVFLEdBQUl0RSxFQUFFbTlDLFdBQVksQ0FDZCxNQUFNNzRDLEVBQUksQ0FDTjY0QyxXQUFZLENBQ1JDLE9BQVEsS0FHaEIsSUFBSyxJQUFJNzhDLEVBQUksRUFBR0EsR0FBS1AsRUFBRW05QyxXQUFXQyxRQUFVLElBQUluOEMsU0FBVVYsRUFBRytELEVBQUU2NEMsV0FBV0MsT0FBTzc4QyxHQUFLNjlDLEdBQUdwK0MsRUFBRW05QyxXQUFXQyxPQUFPNzhDLElBQzdHLE9BQU8rRCxFQUVYLE9BQU85RSxPQUFPeUcsT0FBTyxHQUFJakc7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQnpCLE1BQU1xK0MsR0FDTixZQUFZcitDLEdBQ1J5QixLQUFLMUIsTUFBUUMsRUFFakIsZUFDSSxPQUFPLElBQUlxK0MsR0FBRyxDQUNWM0MsU0FBVSxLQVFYLE1BQU0xN0MsR0FDVCxHQUFJQSxFQUFFNEosVUFBVyxPQUFPbkksS0FBSzFCLE1BQzdCLENBQ0ksSUFBSXVFLEVBQUk3QyxLQUFLMUIsTUFDYixJQUFLLElBQUlRLEVBQUksRUFBR0EsRUFBSVAsRUFBRWlCLE9BQVMsSUFBS1YsRUFBRyxHQUFJK0QsR0FBS0EsRUFBRW8zQyxTQUFTZCxRQUFVLElBQUk1NkMsRUFBRUwsSUFBSVksS0FDOUU0OUMsR0FBRzc1QyxHQUFJLE9BQU8sS0FDZixPQUFPQSxHQUFLQSxFQUFFbzNDLFNBQVNkLFFBQVUsSUFBSTU2QyxFQUFFcytDLGVBQWdCaDZDLEdBQUssTUFRN0QsSUFBSXRFLEVBQUdzRSxHQUNWN0MsS0FBSzg4QyxhQUFhditDLEVBQUV3K0MsV0FBV3grQyxFQUFFcytDLGVBQWlCRixHQUFHOTVDLEdBTWxELE9BQU90RSxHQUNWLElBQUlzRSxFQUFJbTJDLEVBQUdnRSxZQUFhbCtDLEVBQUksR0FBSU0sRUFBSSxHQUNwQ2IsRUFBRTRLLFFBQVEsQ0FBRTVLLEVBQUdsQixLQUNYLElBQUt3RixFQUFFbzZDLG9CQUFvQjUvQyxHQUFJLENBRTNCLE1BQU1rQixFQUFJeUIsS0FBSzg4QyxhQUFhajZDLEdBQzVCN0MsS0FBS2s5QyxhQUFhMytDLEVBQUdPLEVBQUdNLEdBQUlOLEVBQUksR0FBSU0sRUFBSSxHQUFJeUQsRUFBSXhGLEVBQUUwL0MsVUFFdER4K0MsRUFBSU8sRUFBRXpCLEVBQUV3L0MsZUFBaUJGLEdBQUdwK0MsR0FBS2EsRUFBRWdDLEtBQUsvRCxFQUFFdy9DLGlCQUU5QyxNQUFNeC9DLEVBQUkyQyxLQUFLODhDLGFBQWFqNkMsR0FDNUI3QyxLQUFLazlDLGFBQWE3L0MsRUFBR3lCLEVBQUdNLEdBT3JCLE9BQU9iLEdBQ1YsTUFBTXNFLEVBQUk3QyxLQUFLbTlDLE1BQU01K0MsRUFBRXcrQyxXQUN2QkwsR0FBRzc1QyxJQUFNQSxFQUFFbzNDLFNBQVNkLGVBQWlCdDJDLEVBQUVvM0MsU0FBU2QsT0FBTzU2QyxFQUFFcytDLGVBRTdELFFBQVF0K0MsR0FDSixPQUFPMDhDLEdBQUdqN0MsS0FBSzFCLE1BQU9DLEVBQUVELE9BS3JCLGFBQWFDLEdBQ2hCLElBQUlzRSxFQUFJN0MsS0FBSzFCLE1BQ2J1RSxFQUFFbzNDLFNBQVNkLFNBQVd0MkMsRUFBRW8zQyxTQUFXLENBQy9CZCxPQUFRLEtBRVosSUFBSyxJQUFJcjZDLEVBQUksRUFBR0EsRUFBSVAsRUFBRWlCLFNBQVVWLEVBQUcsQ0FDL0IsSUFBSU0sRUFBSXlELEVBQUVvM0MsU0FBU2QsT0FBTzU2QyxFQUFFTCxJQUFJWSxJQUNoQzQ5QyxHQUFHdDlDLElBQU1BLEVBQUU2NkMsU0FBU2QsU0FBVy81QyxFQUFJLENBQy9CNjZDLFNBQVUsQ0FDTmQsT0FBUSxLQUVidDJDLEVBQUVvM0MsU0FBU2QsT0FBTzU2QyxFQUFFTCxJQUFJWSxJQUFNTSxHQUFJeUQsRUFBSXpELEVBRTdDLE9BQU95RCxFQUFFbzNDLFNBQVNkLE9BS2YsYUFBYTU2QyxFQUFHc0UsRUFBRy9ELEdBQ3RCczVDLEVBQUd2MUMsRUFBRyxDQUFFQSxFQUFHL0QsSUFBTVAsRUFBRXNFLEdBQUsvRCxHQUN4QixJQUFLLE1BQU0rRCxLQUFLL0QsU0FBVVAsRUFBRXNFLEdBRWhDLFFBQ0ksT0FBTyxJQUFJKzVDLEdBQUdELEdBQUczOEMsS0FBSzFCLFNBTTFCLFNBQVM4K0MsR0FBRzcrQyxHQUNaLE1BQU1zRSxFQUFJLEdBQ1YsT0FBT3UxQyxFQUFHNzVDLEVBQUU0NkMsT0FBUSxDQUFFNTZDLEVBQUdPLEtBQ3JCLE1BQU1NLEVBQUksSUFBSTQ1QyxFQUFHLENBQUV6NkMsSUFDbkIsR0FBSW0rQyxHQUFHNTlDLEdBQUksQ0FDUCxNQUFNUCxFQUFJNitDLEdBQUd0K0MsRUFBRW03QyxVQUFVZCxPQUN6QixHQUFJLElBQU01NkMsRUFBRWlCLE9BRVpxRCxFQUFFekIsS0FBS2hDLFFBR1AsSUFBSyxNQUFNTixLQUFLUCxFQUFHc0UsRUFBRXpCLEtBQUtoQyxFQUFFaStDLE1BQU12K0MsU0FJdEMrRCxFQUFFekIsS0FBS2hDLEtBQ04sSUFBSTg1QyxFQUFHcjJDOzs7Ozs7Ozs7Ozs7Ozs7O0lBNEJaLE1BQU15NkMsR0FDTixZQUFZLytDLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEdBQ3BCMkMsS0FBS3BCLElBQU1MLEVBQUd5QixLQUFLdTlDLGFBQWUxNkMsRUFBRzdDLEtBQUt3OUMsUUFBVTErQyxFQUFHa0IsS0FBSzBILEtBQU90SSxFQUFHWSxLQUFLeTlDLGNBQWdCcGdELEVBS3hGLDBCQUEwQmtCLEdBQzdCLE9BQU8sSUFBSSsrQyxHQUFHLytDLEVBQUcsRUFBa0J3NUMsRUFBR25vQyxNQUFPZ3RDLEdBQUdjLFFBQVMsR0FLdEQsd0JBQXdCbi9DLEVBQUdzRSxFQUFHL0QsR0FDakMsT0FBTyxJQUFJdytDLEdBQUcvK0MsRUFBRyxFQUF5QnNFLEVBQUcvRCxFQUFHLEdBRThCLHFCQUFxQlAsRUFBR3NFLEdBQ3RHLE9BQU8sSUFBSXk2QyxHQUFHLytDLEVBQUcsRUFBc0JzRSxFQUFHKzVDLEdBQUdjLFFBQVMsR0FNbkQsMEJBQTBCbi9DLEVBQUdzRSxHQUNoQyxPQUFPLElBQUl5NkMsR0FBRy8rQyxFQUFHLEVBQTJCc0UsRUFBRys1QyxHQUFHYyxRQUFTLEdBS3hELHVCQUF1Qm4vQyxFQUFHc0UsR0FDN0IsT0FBTzdDLEtBQUt3OUMsUUFBVWovQyxFQUFHeUIsS0FBS3U5QyxhQUFlLEVBQXlCdjlDLEtBQUswSCxLQUFPN0UsRUFDbEY3QyxLQUFLeTlDLGNBQWdCLEVBQWlCejlDLEtBS25DLG9CQUFvQnpCLEdBQ3ZCLE9BQU95QixLQUFLdzlDLFFBQVVqL0MsRUFBR3lCLEtBQUt1OUMsYUFBZSxFQUFzQnY5QyxLQUFLMEgsS0FBT2sxQyxHQUFHYyxRQUNsRjE5QyxLQUFLeTlDLGNBQWdCLEVBQWlCejlDLEtBTW5DLHlCQUF5QnpCLEdBQzVCLE9BQU95QixLQUFLdzlDLFFBQVVqL0MsRUFBR3lCLEtBQUt1OUMsYUFBZSxFQUEyQnY5QyxLQUFLMEgsS0FBT2sxQyxHQUFHYyxRQUN2RjE5QyxLQUFLeTlDLGNBQWdCLEVBQWtDejlDLEtBRTNELDJCQUNJLE9BQU9BLEtBQUt5OUMsY0FBZ0IsRUFBa0N6OUMsS0FFbEUsdUJBQ0ksT0FBT0EsS0FBS3k5QyxjQUFnQixFQUE4Qno5QyxLQUU5RCx3QkFDSSxPQUFPLElBQWdDQSxLQUFLeTlDLGNBRWhELDRCQUNJLE9BQU8sSUFBb0N6OUMsS0FBS3k5QyxjQUVwRCx1QkFDSSxPQUFPejlDLEtBQUsyOUMsbUJBQXFCMzlDLEtBQUs0OUMsc0JBRTFDLGtCQUNJLE9BQU8sSUFBb0I1OUMsS0FBS3U5QyxhQUVwQyxrQkFDSSxPQUFPLElBQTJCdjlDLEtBQUt1OUMsYUFFM0MsZUFDSSxPQUFPLElBQXdCdjlDLEtBQUt1OUMsYUFFeEMsb0JBQ0ksT0FBTyxJQUE2QnY5QyxLQUFLdTlDLGFBRTdDLFFBQVFoL0MsR0FDSixPQUFPQSxhQUFhKytDLElBQU10OUMsS0FBS3BCLElBQUlzNUMsUUFBUTM1QyxFQUFFSyxNQUFRb0IsS0FBS3c5QyxRQUFRdEYsUUFBUTM1QyxFQUFFaS9DLFVBQVl4OUMsS0FBS3U5QyxlQUFpQmgvQyxFQUFFZy9DLGNBQWdCdjlDLEtBQUt5OUMsZ0JBQWtCbC9DLEVBQUVrL0MsZUFBaUJ6OUMsS0FBSzBILEtBQUt3d0MsUUFBUTM1QyxFQUFFbUosTUFFbE0sUUFDSSxPQUFPLElBQUk0MUMsR0FBR3Q5QyxLQUFLcEIsSUFBS29CLEtBQUt1OUMsYUFBY3Y5QyxLQUFLdzlDLFFBQVN4OUMsS0FBSzBILEtBQUttMkMsUUFBUzc5QyxLQUFLeTlDLGVBRXJGLFdBQ0ksTUFBTyxZQUFZejlDLEtBQUtwQixRQUFRb0IsS0FBS3c5QyxZQUFZeDRDLEtBQUtDLFVBQVVqRixLQUFLMEgsS0FBS3BKLDBCQUEwQjBCLEtBQUt1OUMsbUNBQW1DdjlDLEtBQUt5OUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QnpKLE1BQU1LLEdBQ0YsWUFBWXYvQyxFQUFHc0UsRUFBSSxLQUFNL0QsRUFBSSxHQUFJTSxFQUFJLEdBQUkvQixFQUFJLEtBQU1jLEVBQUksS0FBTUwsRUFBSSxNQUM3RGtDLEtBQUsrUCxLQUFPeFIsRUFBR3lCLEtBQUsrOUMsZ0JBQWtCbDdDLEVBQUc3QyxLQUFLZytDLFFBQVVsL0MsRUFBR2tCLEtBQUtpK0MsUUFBVTcrQyxFQUFHWSxLQUFLMDRDLE1BQVFyN0MsRUFDMUYyQyxLQUFLaytDLFFBQVUvL0MsRUFBRzZCLEtBQUttK0MsTUFBUXJnRCxFQUFHa0MsS0FBS28rQyxFQUFJLE1BVy9DLFNBQVNDLEdBQUc5L0MsRUFBR3NFLEVBQUksS0FBTS9ELEVBQUksR0FBSU0sRUFBSSxHQUFJL0IsRUFBSSxLQUFNYyxFQUFJLEtBQU1MLEVBQUksTUFDakUsT0FBTyxJQUFJZ2dELEdBQUd2L0MsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsRUFBR0wsR0FHcEMsU0FBU3dnRCxHQUFHLy9DLEdBQ1IsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLEdBQUksT0FBU3NFLEVBQUV1N0MsRUFBRyxDQUNkLElBQUk3L0MsRUFBSXNFLEVBQUVrTixLQUFLK29DLGtCQUNmLE9BQVNqMkMsRUFBRWs3QyxrQkFBb0J4L0MsR0FBSyxPQUFTc0UsRUFBRWs3QyxpQkFBa0J4L0MsR0FBSyxNQUFPQSxHQUFLc0UsRUFBRW83QyxRQUFRMW5DLElBQUtoWSxHQXNGekcsU0FBWUEsR0FJUixPQUFPQSxFQUFFNCtDLE1BQU1yRSxrQkFBb0J2NkMsRUFBRW03QixHQUFHaDBCLFdBQWFzMkMsR0FBR3o5QyxFQUFFRCxPQTFGZ0RpZ0QsQ0FBR2hnRCxJQUFLOEMsS0FBSyxLQUNuSDlDLEdBQUssT0FBUUEsR0FBS3NFLEVBQUVtN0MsUUFBUXpuQyxJQUFLaFksR0FBSyxTQUFTQSxHQUUzQyxPQUFPQSxFQUFFNCtDLE1BQU1yRSxrQkFBb0J2NkMsRUFBRWlnRCxJQUZILENBR3BDamdELElBQUs4QyxLQUFLLEtBQU1rNUMsR0FBRzEzQyxFQUFFNjFDLFNBQVduNkMsR0FBSyxNQUFPQSxHQUFLc0UsRUFBRTYxQyxPQUFRNzFDLEVBQUVxN0MsVUFBWTMvQyxHQUFLLE9BQ2hGQSxHQUFLa2dELEdBQUc1N0MsRUFBRXE3QyxVQUFXcjdDLEVBQUVzN0MsUUFBVTUvQyxHQUFLLE9BQVFBLEdBQUtrZ0QsR0FBRzU3QyxFQUFFczdDLFFBQVN0N0MsRUFBRXU3QyxFQUFJNy9DLEVBRTNFLE9BQU9zRSxFQUFFdTdDLEVBaUJiLFNBQVNNLEdBQUduZ0QsRUFBR3NFLEdBQ1gsR0FBSXRFLEVBQUVtNkMsUUFBVTcxQyxFQUFFNjFDLE1BQU8sT0FBTyxFQUNoQyxHQUFJbjZDLEVBQUV5L0MsUUFBUXgrQyxTQUFXcUQsRUFBRW03QyxRQUFReCtDLE9BQVEsT0FBTyxFQUNsRCxJQUFLLElBQUlWLEVBQUksRUFBR0EsRUFBSVAsRUFBRXkvQyxRQUFReCtDLE9BQVFWLElBQUssSUFBSzYvQyxHQUFHcGdELEVBQUV5L0MsUUFBUWwvQyxHQUFJK0QsRUFBRW03QyxRQUFRbC9DLElBQUssT0FBTyxFQUN2RixHQUFJUCxFQUFFMC9DLFFBQVF6K0MsU0FBV3FELEVBQUVvN0MsUUFBUXorQyxPQUFRLE9BQU8sRUFDbEQsSUFBSyxJQUFJbkMsRUFBSSxFQUFHQSxFQUFJa0IsRUFBRTAvQyxRQUFReitDLE9BQVFuQyxJQUFLLEdBQUl5QixFQUFJUCxFQUFFMC9DLFFBQVE1Z0QsR0FBSStCLEVBQUl5RCxFQUFFbzdDLFFBQVE1Z0QsR0FDL0V5QixFQUFFNDZCLEtBQU90NkIsRUFBRXM2QixLQUFPNTZCLEVBQUVxK0MsTUFBTWpGLFFBQVE5NEMsRUFBRSs5QyxTQUFXbEMsR0FBR244QyxFQUFFUixNQUFPYyxFQUFFZCxPQUFRLE9BQU8sRUFDNUUsSUFBSVEsRUFBR00sRUFDUCxPQUFPYixFQUFFdy9DLGtCQUFvQmw3QyxFQUFFazdDLG1CQUFzQngvQyxFQUFFd1IsS0FBS21vQyxRQUFRcjFDLEVBQUVrTixTQUFZNnVDLEdBQUdyZ0QsRUFBRTIvQyxRQUFTcjdDLEVBQUVxN0MsVUFBWVUsR0FBR3JnRCxFQUFFNC9DLE1BQU90N0MsRUFBRXM3QyxPQUdoSSxTQUFTVSxHQUFHdGdELEdBQ1IsT0FBT3M4QyxHQUFHaUUsY0FBY3ZnRCxFQUFFd1IsT0FBUyxPQUFTeFIsRUFBRXcvQyxpQkFBbUIsSUFBTXgvQyxFQUFFMC9DLFFBQVF6K0MsT0FHckYsTUFBTXUvQyxXQUFXLFFBQ2IsWUFBWXhnRCxFQUFHc0UsRUFBRy9ELEdBQ2RxSSxRQUFTbkgsS0FBS205QyxNQUFRNStDLEVBQUd5QixLQUFLMDVCLEdBQUs3MkIsRUFBRzdDLEtBQUsxQixNQUFRUSxFQUloRCxjQUFjUCxFQUFHc0UsRUFBRy9ELEdBQ3ZCLE9BQU9QLEVBQUV5Z0QsYUFBZSxPQUFrQm44QyxHQUFLLFdBQTBCQSxFQUFJN0MsS0FBS2kvQyxFQUFFMWdELEVBQUdzRSxFQUFHL0QsR0FBSyxJQUFJb2dELEdBQUczZ0QsRUFBR3NFLEVBQUcvRCxHQUFLLG1CQUEwQytELEVBQUksSUFBSTZhLEdBQUduZixFQUFHTyxHQUFLLE9BQWtCK0QsRUFBSSxJQUFJczhDLEdBQUc1Z0QsRUFBR08sR0FBSyxXQUEwQitELEVBQUksSUFBSXU4QyxHQUFHN2dELEVBQUdPLEdBQUssdUJBQWtEK0QsRUFBSSxJQUFJdzhDLEdBQUc5Z0QsRUFBR08sR0FBSyxJQUFJaWdELEdBQUd4Z0QsRUFBR3NFLEVBQUcvRCxHQUV0VixTQUFTUCxFQUFHc0UsRUFBRy9ELEdBQ1gsTUFBTyxPQUFrQitELEVBQUksSUFBSXk4QyxHQUFHL2dELEVBQUdPLEdBQUssSUFBSXlnRCxHQUFHaGhELEVBQUdPLEdBRTFELFFBQVFQLEdBQ0osTUFBTXNFLEVBQUl0RSxFQUFFbUosS0FBS3kxQyxNQUFNbjlDLEtBQUttOUMsT0FFcEIsTUFBTyxPQUF5Qm45QyxLQUFLMDVCLEdBQUssT0FBUzcyQixHQUFLN0MsS0FBS3FtQyxFQUFFd1YsR0FBR2g1QyxFQUFHN0MsS0FBSzFCLFFBQVUsT0FBU3VFLEdBQUttNEMsR0FBR2g3QyxLQUFLMUIsU0FBVzA4QyxHQUFHbjRDLElBQU03QyxLQUFLcW1DLEVBQUV3VixHQUFHaDVDLEVBQUc3QyxLQUFLMUIsUUFHNUosRUFBRUMsR0FDRSxPQUFReUIsS0FBSzA1QixJQUNYLElBQUssSUFDSCxPQUFPbjdCLEVBQUksRUFFYixJQUFLLEtBQ0gsT0FBT0EsR0FBSyxFQUVkLElBQUssS0FDSCxPQUFPLElBQU1BLEVBRWYsSUFBSyxLQUNILE9BQU8sSUFBTUEsRUFFZixJQUFLLElBQ0gsT0FBT0EsRUFBSSxFQUViLElBQUssS0FDSCxPQUFPQSxHQUFLLEVBRWQsUUFDRSxPQUFPK29DLEtBR2YsSUFDSSxNQUFPLENBQUUsSUFBc0IsS0FBZ0MsSUFBeUIsS0FBbUMsS0FBdUIsVUFBd0JoaEMsUUFBUXRHLEtBQUswNUIsS0FBTyxHQVd0TSxNQUFNd2xCLFdBQVdILEdBQ2IsWUFBWXhnRCxFQUFHc0UsRUFBRy9ELEdBQ2RxSSxNQUFNNUksRUFBR3NFLEVBQUcvRCxHQUFJa0IsS0FBS3BCLElBQU1pOEMsR0FBR3NCLFNBQVNyOUMsRUFBRXM4QyxnQkFFN0MsUUFBUTc4QyxHQUNKLE1BQU1zRSxFQUFJZzRDLEdBQUdwQyxXQUFXbDZDLEVBQUVLLElBQUtvQixLQUFLcEIsS0FDcEMsT0FBT29CLEtBQUtxbUMsRUFBRXhqQyxJQUlvQyxNQUFNeThDLFdBQVdQLEdBQ3ZFLFlBQVl4Z0QsRUFBR3NFLEdBQ1hzRSxNQUFNNUksRUFBRyxLQUFnQnNFLEdBQUk3QyxLQUFLd0ksS0FBT2czQyxHQUFHLEtBQWdCMzhDLEdBRWhFLFFBQVF0RSxHQUNKLE9BQU95QixLQUFLd0ksS0FBSzBPLEtBQU1yVSxHQUFLQSxFQUFFcTFDLFFBQVEzNUMsRUFBRUssT0FJc0IsTUFBTTJnRCxXQUFXUixHQUNuRixZQUFZeGdELEVBQUdzRSxHQUNYc0UsTUFBTTVJLEVBQUcsU0FBd0JzRSxHQUFJN0MsS0FBS3dJLEtBQU9nM0MsR0FBRyxTQUF3QjM4QyxHQUVoRixRQUFRdEUsR0FDSixPQUFReUIsS0FBS3dJLEtBQUswTyxLQUFNclUsR0FBS0EsRUFBRXExQyxRQUFRMzVDLEVBQUVLLE9BSWpELFNBQVM0Z0QsR0FBR2poRCxFQUFHc0UsR0FDWCxJQUFJL0QsRUFDSixRQUFTLFFBQVVBLEVBQUkrRCxFQUFFNjRDLGtCQUFlLElBQVc1OEMsT0FBSSxFQUFTQSxFQUFFNjhDLFNBQVcsSUFBSXBsQyxJQUFLaFksR0FBS3M4QyxHQUFHc0IsU0FBUzU5QyxFQUFFNjhDLGlCQUdoRCxNQUFNMTlCLFdBQVdxaEMsR0FDMUUsWUFBWXhnRCxFQUFHc0UsR0FDWHNFLE1BQU01SSxFQUFHLGlCQUF3Q3NFLEdBRXJELFFBQVF0RSxHQUNKLE1BQU1zRSxFQUFJdEUsRUFBRW1KLEtBQUt5MUMsTUFBTW45QyxLQUFLbTlDLE9BQzVCLE9BQU9aLEdBQUcxNUMsSUFBTSs0QyxHQUFHLzRDLEVBQUU2NEMsV0FBWTE3QyxLQUFLMUIsUUFJRyxNQUFNNmdELFdBQVdKLEdBQzlELFlBQVl4Z0QsRUFBR3NFLEdBQ1hzRSxNQUFNNUksRUFBRyxLQUFnQnNFLEdBRTdCLFFBQVF0RSxHQUNKLE1BQU1zRSxFQUFJdEUsRUFBRW1KLEtBQUt5MUMsTUFBTW45QyxLQUFLbTlDLE9BQzVCLE9BQU8sT0FBU3Q2QyxHQUFLKzRDLEdBQUc1N0MsS0FBSzFCLE1BQU1vOUMsV0FBWTc0QyxJQUlGLE1BQU11OEMsV0FBV0wsR0FDbEUsWUFBWXhnRCxFQUFHc0UsR0FDWHNFLE1BQU01SSxFQUFHLFNBQXdCc0UsR0FFckMsUUFBUXRFLEdBQ0osR0FBSXE5QyxHQUFHNTdDLEtBQUsxQixNQUFNbzlDLFdBQVksQ0FDMUIrRCxVQUFXLGVBQ1gsT0FBTyxFQUNYLE1BQU01OEMsRUFBSXRFLEVBQUVtSixLQUFLeTFDLE1BQU1uOUMsS0FBS205QyxPQUM1QixPQUFPLE9BQVN0NkMsSUFBTSs0QyxHQUFHNTdDLEtBQUsxQixNQUFNbzlDLFdBQVk3NEMsSUFJUyxNQUFNdzhDLFdBQVdOLEdBQzlFLFlBQVl4Z0QsRUFBR3NFLEdBQ1hzRSxNQUFNNUksRUFBRyxxQkFBZ0RzRSxHQUU3RCxRQUFRdEUsR0FDSixNQUFNc0UsRUFBSXRFLEVBQUVtSixLQUFLeTFDLE1BQU1uOUMsS0FBS205QyxPQUM1QixTQUFVWixHQUFHMTVDLEtBQU9BLEVBQUU2NEMsV0FBV0MsU0FBVzk0QyxFQUFFNjRDLFdBQVdDLE9BQU96a0MsS0FBTTNZLEdBQUtxOUMsR0FBRzU3QyxLQUFLMUIsTUFBTW85QyxXQUFZbjlDLEtBaUJ6RyxNQUFNbWhELEdBQ04sWUFBWW5oRCxFQUFHc0UsR0FDWDdDLEtBQUt5akIsU0FBV2xsQixFQUFHeUIsS0FBSzIvQyxPQUFTOThDLEdBSXpDLFNBQVM0N0MsR0FBR2xnRCxHQUVSLE1BQU8sR0FBR0EsRUFBRW9oRCxPQUFTLElBQU0sT0FBT3BoRCxFQUFFa2xCLFNBQVNsTixJQUFLaFksR0FBS3k5QyxHQUFHejlDLElBQUs4QyxLQUFLLE9BS3BFLE1BQU11K0MsR0FDTixZQUFZcmhELEVBQUdzRSxFQUFJLE9BQ2Y3QyxLQUFLbTlDLE1BQVE1K0MsRUFBR3lCLEtBQUt3K0MsSUFBTTM3QyxHQUluQyxTQUFTODdDLEdBQUdwZ0QsRUFBR3NFLEdBQ1gsT0FBT3RFLEVBQUVpZ0QsTUFBUTM3QyxFQUFFMjdDLEtBQU9qZ0QsRUFBRTQrQyxNQUFNakYsUUFBUXIxQyxFQUFFczZDLE9BTTVDLFNBQVMwQyxHQUFHdGhELEVBQUdzRSxFQUFHL0QsR0FDbEIsSUFBSU0sRUFBSSxFQUNSLElBQUssSUFBSS9CLEVBQUksRUFBR0EsRUFBSWtCLEVBQUVrbEIsU0FBU2prQixPQUFRbkMsSUFBSyxDQUN4QyxNQUFNYyxFQUFJMEUsRUFBRXhGLEdBQUlTLEVBQUlTLEVBQUVrbEIsU0FBU3BtQixHQUkvQixHQUgwQitCLEVBQXRCakIsRUFBRWcvQyxNQUFNNkIsYUFBa0JuRSxHQUFHcEMsV0FBV29DLEdBQUdzQixTQUFTcitDLEVBQUVzOUMsZ0JBQWlCdDhDLEVBQUVGLEtBQ3JFaTlDLEdBQUcvOUMsRUFBR2dCLEVBQUU0SSxLQUFLeTFDLE1BQU1oL0MsRUFBRWcvQyxRQUV6QixTQUE0QmgvQyxFQUFFcWdELE1BQVFwL0MsSUFBTSxHQUFJLElBQU1BLEVBQUcsTUFFakUsT0FBT2IsRUFBRW9oRCxPQUFTdmdELEdBQUssRUFBSUEsRUFBSSxFQUduQyxTQUFTdy9DLEdBQUdyZ0QsRUFBR3NFLEdBQ1gsR0FBSSxPQUFTdEUsRUFBRyxPQUFPLE9BQVNzRSxFQUNoQyxHQUFJLE9BQVNBLEVBQUcsT0FBTyxFQUN2QixHQUFJdEUsRUFBRW9oRCxTQUFXOThDLEVBQUU4OEMsUUFBVXBoRCxFQUFFa2xCLFNBQVNqa0IsU0FBV3FELEVBQUU0Z0IsU0FBU2prQixPQUFRLE9BQU8sRUFDN0UsSUFBSyxJQUFJVixFQUFJLEVBQUdBLEVBQUlQLEVBQUVrbEIsU0FBU2prQixPQUFRVixJQUNuQyxJQUFLbThDLEdBQUcxOEMsRUFBRWtsQixTQUFTM2tCLEdBQUkrRCxFQUFFNGdCLFNBQVMza0IsSUFBSyxPQUFPLEVBRWxELE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QlAsTUFBTTZiLEdBS04sWUFBWXBjLEVBQUdzRSxFQUFJLEtBQU0vRCxFQUFJLEdBQUlNLEVBQUksR0FBSS9CLEVBQUksS0FBTWMsRUFBSSxJQUFrQkwsRUFBSSxLQUFNdUssRUFBSSxNQUNuRnJJLEtBQUsrUCxLQUFPeFIsRUFBR3lCLEtBQUsrOUMsZ0JBQWtCbDdDLEVBQUc3QyxLQUFLOC9DLGdCQUFrQmhoRCxFQUFHa0IsS0FBS2krQyxRQUFVNytDLEVBQ2xGWSxLQUFLMDRDLE1BQVFyN0MsRUFBRzJDLEtBQUsrL0MsVUFBWTVoRCxFQUFHNkIsS0FBS2srQyxRQUFVcGdELEVBQUdrQyxLQUFLbStDLE1BQVE5MUMsRUFBR3JJLEtBQUsreUMsRUFBSSxLQUUvRS95QyxLQUFLZ3pDLEVBQUksS0FBTWh6QyxLQUFLaytDLFFBQVNsK0MsS0FBS20rQyxPQUlxQixTQUFTNkIsR0FBR3poRCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUFHTCxFQUFHdUssR0FDNUYsT0FBTyxJQUFJc1MsR0FBR3BjLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUdjLEVBQUdMLEVBQUd1SyxHQUdxQyxTQUFTNDNDLEdBQUcxaEQsR0FDcEYsT0FBTyxJQUFJb2MsR0FBR3BjLEdBUWQsU0FBUzJoRCxHQUFHM2hELEdBQ1osT0FBUWc4QyxHQUFHaDhDLEVBQUVtNkMsUUFBVSxNQUFvQm42QyxFQUFFd2hELFVBR2pELFNBQVNJLEdBQUc1aEQsR0FDUixPQUFRZzhDLEdBQUdoOEMsRUFBRW02QyxRQUFVLE1BQW1CbjZDLEVBQUV3aEQsVUFHaEQsU0FBU0ssR0FBRzdoRCxHQUNSLE9BQU9BLEVBQUV1aEQsZ0JBQWdCdGdELE9BQVMsRUFBSWpCLEVBQUV1aEQsZ0JBQWdCLEdBQUczQyxNQUFRLEtBR3ZFLFNBQVNrRCxHQUFHOWhELEdBQ1IsSUFBSyxNQUFNc0UsS0FBS3RFLEVBQUUwL0MsUUFBUyxHQUFJcDdDLEVBQUV5OUMsSUFBSyxPQUFPejlDLEVBQUVzNkMsTUFDL0MsT0FBTyxLQVdYLFNBQVNvRCxHQUFHaGlELEdBQ1IsT0FBTyxPQUFTQSxFQUFFdy9DLGdCQU9sQixTQUFTeUMsR0FBR2ppRCxHQUNaLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWixHQUFJLE9BQVNzRSxFQUFFa3dDLEVBQUcsQ0FDZGx3QyxFQUFFa3dDLEVBQUksR0FDTixNQUFNeDBDLEVBQUk4aEQsR0FBR3g5QyxHQUFJL0QsRUFBSXNoRCxHQUFHdjlDLEdBQ3hCLEdBQUksT0FBU3RFLEdBQUssT0FBU08sRUFJM0JQLEVBQUV5Z0QsY0FBZ0JuOEMsRUFBRWt3QyxFQUFFM3hDLEtBQUssSUFBSXcrQyxHQUFHcmhELElBQUtzRSxFQUFFa3dDLEVBQUUzeEMsS0FBSyxJQUFJdytDLEdBQUc1RyxFQUFHeUgsV0FBWSxZQUE4QixDQUNoRyxJQUFJbGlELEdBQUksRUFDUixJQUFLLE1BQU1PLEtBQUsrRCxFQUFFaTlDLGdCQUFpQmo5QyxFQUFFa3dDLEVBQUUzeEMsS0FBS3RDLEdBQUlBLEVBQUVxK0MsTUFBTTZCLGVBQWlCemdELEdBQUksR0FDN0UsSUFBS0EsRUFBRyxDQUdKLE1BQU1BLEVBQUlzRSxFQUFFaTlDLGdCQUFnQnRnRCxPQUFTLEVBQUlxRCxFQUFFaTlDLGdCQUFnQmo5QyxFQUFFaTlDLGdCQUFnQnRnRCxPQUFTLEdBQUdnL0MsSUFBTSxNQUMvRjM3QyxFQUFFa3dDLEVBQUUzeEMsS0FBSyxJQUFJdytDLEdBQUc1RyxFQUFHeUgsV0FBWWxpRCxNQUkzQyxPQUFPc0UsRUFBRWt3QyxFQUtULFNBQVMyTixHQUFHbmlELEdBQ1osTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLElBQUtzRSxFQUFFbXdDLEVBQUcsR0FBSSxNQUFvQm53QyxFQUFFazlDLFVBQVdsOUMsRUFBRW13QyxFQUFJcUwsR0FBR3g3QyxFQUFFa04sS0FBTWxOLEVBQUVrN0MsZ0JBQWlCeUMsR0FBRzM5QyxHQUFJQSxFQUFFbzdDLFFBQVNwN0MsRUFBRTYxQyxNQUFPNzFDLEVBQUVxN0MsUUFBU3I3QyxFQUFFczdDLFdBQWEsQ0FFcEksTUFBTTUvQyxFQUFJLEdBQ1YsSUFBSyxNQUFNTyxLQUFLMGhELEdBQUczOUMsR0FBSSxDQUNuQixNQUFNQSxFQUFJLFNBQTRCL0QsRUFBRTAvQyxJQUFNLE1BQXdCLE9BQ3RFamdELEVBQUU2QyxLQUFLLElBQUl3K0MsR0FBRzlnRCxFQUFFcStDLE1BQU90NkMsSUFHbkIsTUFBTS9ELEVBQUkrRCxFQUFFczdDLE1BQVEsSUFBSXVCLEdBQUc3OEMsRUFBRXM3QyxNQUFNMTZCLFVBQVc1Z0IsRUFBRXM3QyxNQUFNd0IsUUFBVSxLQUFNdmdELEVBQUl5RCxFQUFFcTdDLFFBQVUsSUFBSXdCLEdBQUc3OEMsRUFBRXE3QyxRQUFRejZCLFVBQVc1Z0IsRUFBRXE3QyxRQUFReUIsUUFBVSxLQUU5STk4QyxFQUFFbXdDLEVBQUlxTCxHQUFHeDdDLEVBQUVrTixLQUFNbE4sRUFBRWs3QyxnQkFBaUJ4L0MsRUFBR3NFLEVBQUVvN0MsUUFBU3A3QyxFQUFFNjFDLE1BQU81NUMsRUFBR00sR0FFbEUsT0FBT3lELEVBQUVtd0MsRUFHYixTQUFTMk4sR0FBR3BpRCxFQUFHc0UsRUFBRy9ELEdBQ2QsT0FBTyxJQUFJNmIsR0FBR3BjLEVBQUV3UixLQUFNeFIsRUFBRXcvQyxnQkFBaUJ4L0MsRUFBRXVoRCxnQkFBZ0IzeEMsUUFBUzVQLEVBQUUwL0MsUUFBUTl2QyxRQUFTdEwsRUFBRy9ELEVBQUdQLEVBQUUyL0MsUUFBUzMvQyxFQUFFNC9DLE9BRzlHLFNBQVN5QyxHQUFHcmlELEVBQUdzRSxHQUNYLE9BQU82N0MsR0FBR2dDLEdBQUduaUQsR0FBSW1pRCxHQUFHNzlDLEtBQU90RSxFQUFFd2hELFlBQWNsOUMsRUFBRWs5QyxVQU1qRCxTQUFTYyxHQUFHdGlELEdBQ1IsTUFBTyxHQUFHKy9DLEdBQUdvQyxHQUFHbmlELFVBQVVBLEVBQUV3aEQsWUFHaEMsU0FBU2UsR0FBR3ZpRCxHQUNSLE1BQU8sZ0JBdldYLFNBQVlBLEdBQ1IsSUFBSXNFLEVBQUl0RSxFQUFFd1IsS0FBSytvQyxrQkFDZixPQUFPLE9BQVN2NkMsRUFBRXcvQyxrQkFBb0JsN0MsR0FBSyxvQkFBc0J0RSxFQUFFdy9DLGlCQUNuRXgvQyxFQUFFMC9DLFFBQVF6K0MsT0FBUyxJQUFNcUQsR0FBSyxlQUFldEUsRUFBRTAvQyxRQUFRMW5DLElBQUtoWSxJQUN4RCxNQUFPLElBQUlzRSxFQUFJdEUsR0FBRzQrQyxNQUFNckUscUJBQXFCajJDLEVBQUU2MkIsTUFBTXNpQixHQUFHbjVDLEVBQUV2RSxTQUUxRCxJQUFJdUUsSUFDK0R4QixLQUFLLFVBQzVFazVDLEdBQUdoOEMsRUFBRW02QyxTQUFXNzFDLEdBQUssWUFBY3RFLEVBQUVtNkMsT0FBUW42QyxFQUFFeS9DLFFBQVF4K0MsT0FBUyxJQUFNcUQsR0FBSyxlQUFldEUsRUFBRXkvQyxRQUFRem5DLElBQUtoWSxHQUFLLFNBQVNBLEdBQ25ILE1BQU8sR0FBR0EsRUFBRTQrQyxNQUFNckUsc0JBQXNCdjZDLEVBQUVpZ0QsT0FEZ0UsQ0FFNUdqZ0QsSUFBSzhDLEtBQUssVUFBVzlDLEVBQUUyL0MsVUFBWXI3QyxHQUFLLGNBQWdCNDdDLEdBQUdsZ0QsRUFBRTIvQyxVQUFXMy9DLEVBQUU0L0MsUUFBVXQ3QyxHQUFLLFlBQWM0N0MsR0FBR2xnRCxFQUFFNC9DLFFBQzlHLFVBQVV0N0MsS0E0VmFrK0MsQ0FBR0wsR0FBR25pRCxrQkFBa0JBLEVBQUV3aEQsYUFHWSxTQUFTaUIsR0FBR3ppRCxFQUFHc0UsR0FDNUUsT0FBT0EsRUFBRW8rQyxtQkFBcUIsU0FBUzFpRCxFQUFHc0UsR0FDdEMsTUFBTS9ELEVBQUkrRCxFQUFFakUsSUFBSW1SLEtBQ2hCLE9BQU8sT0FBU3hSLEVBQUV3L0MsZ0JBQWtCbDdDLEVBQUVqRSxJQUFJc2lELGdCQUFnQjNpRCxFQUFFdy9DLGtCQUFvQngvQyxFQUFFd1IsS0FBS3FwQyxXQUFXdDZDLEdBQUsrN0MsR0FBR2lFLGNBQWN2Z0QsRUFBRXdSLE1BQVF4UixFQUFFd1IsS0FBS21vQyxRQUFRcDVDLEdBQUtQLEVBQUV3UixLQUFLa3RDLG9CQUFvQm4rQyxHQUZ2SixDQU83QlAsRUFBR3NFLElBQU0sU0FBU3RFLEVBQUdzRSxHQUNsQixJQUFLLE1BQU0vRCxLQUFLUCxFQUFFdWhELGdCQUVsQixJQUFLaGhELEVBQUVxK0MsTUFBTTZCLGNBQWdCLE9BQVNuOEMsRUFBRTZFLEtBQUt5MUMsTUFBTXIrQyxFQUFFcStDLE9BQVEsT0FBTyxFQUNwRSxPQUFPLEVBSkQsQ0FLUjUrQyxFQUFHc0UsSUFBTSxTQUFTdEUsRUFBR3NFLEdBQ25CLElBQUssTUFBTS9ELEtBQUtQLEVBQUUwL0MsUUFBUyxJQUFLbi9DLEVBQUU2ZSxRQUFROWEsR0FBSSxPQUFPLEVBQ3JELE9BQU8sRUFGQSxDQUlzRHRFLEVBQUdzRSxJQUFNLFNBQVN0RSxFQUFHc0UsR0FDbEYsUUFBSXRFLEVBQUUyL0MsVUFBWTJCLEdBQUd0aEQsRUFBRTIvQyxRQUFTc0MsR0FBR2ppRCxHQUFJc0UsT0FDbkN0RSxFQUFFNC9DLFFBQVMwQixHQUFHdGhELEVBQUU0L0MsTUFBT3FDLEdBQUdqaUQsR0FBSXNFLElBRm9DLENBUXpFdEUsRUFBR3NFLEdBR1IsU0FBU3MrQyxHQUFHNWlELEdBQ1IsTUFBTyxDQUFDc0UsRUFBRy9ELEtBQ1AsSUFBSU0sR0FBSSxFQUNSLElBQUssTUFBTS9CLEtBQUttakQsR0FBR2ppRCxHQUFJLENBQ25CLE1BQU1BLEVBQUk2aUQsR0FBRy9qRCxFQUFHd0YsRUFBRy9ELEdBQ25CLEdBQUksSUFBTVAsRUFBRyxPQUFPQSxFQUNwQmEsRUFBSUEsR0FBSy9CLEVBQUU4L0MsTUFBTTZCLGFBRXJCLE9BQU8sR0FJZixTQUFTb0MsR0FBRzdpRCxFQUFHc0UsRUFBRy9ELEdBQ2QsTUFBTU0sRUFBSWIsRUFBRTQrQyxNQUFNNkIsYUFBZW5FLEdBQUdwQyxXQUFXNTFDLEVBQUVqRSxJQUFLRSxFQUFFRixLQUFPLFNBQVNMLEVBQUdzRSxFQUFHL0QsR0FDMUUsTUFBTU0sRUFBSXlELEVBQUU2RSxLQUFLeTFDLE1BQU01K0MsR0FBSWxCLEVBQUl5QixFQUFFNEksS0FBS3kxQyxNQUFNNStDLEdBQzVDLE9BQU8sT0FBU2EsR0FBSyxPQUFTL0IsRUFBSXcrQyxHQUFHejhDLEVBQUcvQixHQUFLaXFDLElBRmMsQ0FHN0Qvb0MsRUFBRTQrQyxNQUFPdDZDLEVBQUcvRCxHQUNkLE9BQVFQLEVBQUVpZ0QsS0FDUixJQUFLLE1BQ0gsT0FBT3AvQyxFQUVULElBQUssT0FDSCxPQUFRLEVBQUlBLEVBRWQsUUFDRSxPQUFPa29DOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJYLFNBQVMrWixHQUFHOWlELEVBQUdzRSxHQUNmLEdBQUl0RSxFQUFFKzBDLEVBQUcsQ0FDTCxHQUFJMy9CLE1BQU05USxHQUFJLE1BQU8sQ0FDakI0NEMsWUFBYSxPQUVqQixHQUFJNTRDLElBQU0sSUFBTyxNQUFPLENBQ3BCNDRDLFlBQWEsWUFFakIsR0FBSTU0QyxLQUFNLElBQVEsTUFBTyxDQUNyQjQ0QyxZQUFhLGFBR3JCLE1BQU8sQ0FDSEEsWUFBYWpCLEdBQUczM0MsR0FBSyxLQUFPQSxHQU1oQyxTQUFTeStDLEdBQUcvaUQsR0FDWixNQUFPLENBQ0hpOUMsYUFBYyxHQUFLajlDLEdBUXZCLFNBQVNnakQsR0FBR2hqRCxFQUFHc0UsR0FDZixPQUFPNDNDLEdBQUc1M0MsR0FBS3krQyxHQUFHeitDLEdBQUt3K0MsR0FBRzlpRCxFQUFHc0U7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnlCLE1BQU0yK0MsR0FDNUQsY0FHSXhoRCxLQUFLOEgsT0FBSSxHQU9iLFNBQVMyNUMsR0FBR2xqRCxFQUFHc0UsRUFBRy9ELEdBQ2xCLE9BQU9QLGFBQWFtakQsR0FBSyxTQUFTbmpELEVBQUdzRSxHQUNqQyxNQUFNL0QsRUFBSSxDQUNOcTZDLE9BQVEsQ0FDSmUsU0FBVSxDQUNOQyxZQUFhLG9CQUVqQkUscUJBQXNCLENBQ2xCQyxlQUFnQixDQUNaeG1DLFFBQVN2VixFQUFFdVYsUUFDWDZsQyxNQUFPcDdDLEVBQUVxNUMsZ0JBS3pCLE9BQU8vMEMsSUFBTS9ELEVBQUVxNkMsT0FBT3dJLG1CQUFxQjkrQyxHQUFJLENBQzNDbzNDLFNBQVVuN0MsR0FmTyxDQWlCdkJBLEVBQUcrRCxHQUFLdEUsYUFBYXFqRCxHQUFLQyxHQUFHdGpELEVBQUdzRSxHQUFLdEUsYUFBYXVqRCxHQUFLQyxHQUFHeGpELEVBQUdzRSxHQUFLLFNBQVN0RSxFQUFHc0UsR0FJNUUsTUFBTS9ELEVBQUlrakQsR0FBR3pqRCxFQUFHc0UsR0FBSXpELEVBQUk2aUQsR0FBR25qRCxHQUFLbWpELEdBQUcxakQsRUFBRWcxQyxHQUNyQyxPQUFPK0ksR0FBR3g5QyxJQUFNdzlDLEdBQUcvOUMsRUFBRWcxQyxHQUFLK04sR0FBR2xpRCxHQUFLaWlELEdBQUc5aUQsRUFBRW1LLEVBQUd0SixHQUxzQixDQU1sRWIsRUFBR3NFLEdBTUwsU0FBU3EvQyxHQUFHM2pELEVBQUdzRSxFQUFHL0QsR0FJbEIsT0FBT1AsYUFBYXFqRCxHQUFLQyxHQUFHdGpELEVBQUdzRSxHQUFLdEUsYUFBYXVqRCxHQUFLQyxHQUFHeGpELEVBQUdzRSxHQUFLL0QsRUFpQmpFLFNBQVNrakQsR0FBR3pqRCxFQUFHc0UsR0FDZixPQUFPdEUsYUFBYTRqRCxHQUFLN0YsR0FBR3g5QyxFQUFJK0QsSUFBTSxTQUFTdEUsR0FDM0MsUUFBU0EsR0FBSyxnQkFBaUJBLEVBREcsQ0FHc0NPLEdBQUsrRCxFQUFJLENBQ2pGMjRDLGFBQWMsR0FDZCxLQUNKLElBQUkxOEMsRUFJUixNQUFNNGlELFdBQVdGLElBRXVDLE1BQU1JLFdBQVdKLEdBQ3JFLFlBQVlqakQsR0FDUjRJLFFBQVNuSCxLQUFLb2lELFNBQVc3akQsR0FJakMsU0FBU3NqRCxHQUFHdGpELEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJdWpELEdBQUd4L0MsR0FDYixJQUFLLE1BQU1BLEtBQUt0RSxFQUFFNmpELFNBQVV0akQsRUFBRW9ZLEtBQU0zWSxHQUFLMDhDLEdBQUcxOEMsRUFBR3NFLEtBQVEvRCxFQUFFc0MsS0FBS3lCLEdBQzlELE1BQU8sQ0FDSDY0QyxXQUFZLENBQ1JDLE9BQVE3OEMsSUFLcUMsTUFBTWdqRCxXQUFXTixHQUN0RSxZQUFZampELEdBQ1I0SSxRQUFTbkgsS0FBS29pRCxTQUFXN2pELEdBSWpDLFNBQVN3akQsR0FBR3hqRCxFQUFHc0UsR0FDWCxJQUFJL0QsRUFBSXVqRCxHQUFHeC9DLEdBQ1gsSUFBSyxNQUFNQSxLQUFLdEUsRUFBRTZqRCxTQUFVdGpELEVBQUlBLEVBQUVtWSxPQUFRMVksSUFBTTA4QyxHQUFHMThDLEVBQUdzRSxJQUN0RCxNQUFPLENBQ0g2NEMsV0FBWSxDQUNSQyxPQUFRNzhDLElBVWhCLE1BQU1xakQsV0FBV1gsR0FDakIsWUFBWWpqRCxFQUFHc0UsR0FDWHNFLFFBQVNuSCxLQUFLMEksRUFBSW5LLEVBQUd5QixLQUFLdXpDLEVBQUkxd0MsR0FJdEMsU0FBU28vQyxHQUFHMWpELEdBQ1IsT0FBT3E3QyxHQUFHcjdDLEVBQUVpOUMsY0FBZ0JqOUMsRUFBRWs5QyxhQUdsQyxTQUFTNEcsR0FBRzlqRCxHQUNSLE9BQU9nK0MsR0FBR2grQyxJQUFNQSxFQUFFbTlDLFdBQVdDLE9BQVNwOUMsRUFBRW05QyxXQUFXQyxPQUFPeHRDLFFBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkwsTUFBTW0wQyxHQUNyRSxZQUFZL2pELEVBQUdzRSxHQUNYN0MsS0FBS205QyxNQUFRNStDLEVBQUd5QixLQUFLdWlELFVBQVkxL0MsR0FXekMsTUFBTTIvQyxHQUNGLFlBV0Fqa0QsRUFRQXNFLEdBQ0k3QyxLQUFLdzlDLFFBQVVqL0MsRUFBR3lCLEtBQUt5aUQsaUJBQW1CNS9DLEdBUTlDLE1BQU02L0MsR0FDTixZQUFZbmtELEVBQUdzRSxHQUNYN0MsS0FBSzJpRCxXQUFhcGtELEVBQUd5QixLQUFLNGlELE9BQVMvL0MsRUFFSyxjQUN4QyxPQUFPLElBQUk2L0MsR0FFMkMsY0FBY25rRCxHQUNwRSxPQUFPLElBQUlta0QsUUFBRyxFQUFRbmtELEdBRW9ELGtCQUFrQkEsR0FDNUYsT0FBTyxJQUFJbWtELEdBQUdua0QsR0FFb0MsYUFDbEQsWUFBTyxJQUFXeUIsS0FBSzJpRCxpQkFBYyxJQUFXM2lELEtBQUs0aUQsT0FFekQsUUFBUXJrRCxHQUNKLE9BQU95QixLQUFLNGlELFNBQVdya0QsRUFBRXFrRCxTQUFXNWlELEtBQUsyaUQsYUFBZXBrRCxFQUFFb2tELFlBQWMzaUQsS0FBSzJpRCxXQUFXekssUUFBUTM1QyxFQUFFb2tELGFBQWVwa0QsRUFBRW9rRCxhQUlqRCxTQUFTRSxHQUFHdGtELEVBQUdzRSxHQUNyRixZQUFPLElBQVd0RSxFQUFFb2tELFdBQWE5L0MsRUFBRW8rQyxtQkFBcUJwK0MsRUFBRTI2QyxRQUFRdEYsUUFBUTM1QyxFQUFFb2tELGlCQUFjLElBQVdwa0QsRUFBRXFrRCxRQUFVcmtELEVBQUVxa0QsU0FBVy8vQyxFQUFFbytDLGtCQThDaEksTUFBTTZCLElBYU4sU0FBU0MsR0FBR3hrRCxFQUFHc0UsRUFBRy9ELEdBQ2xCUCxhQUFheWtELEdBQUssU0FBU3prRCxFQUFHc0UsRUFBRy9ELEdBSTdCLE1BQU1NLEVBQUliLEVBQUVELE1BQU11L0MsUUFBU3hnRCxFQUFJNGxELEdBQUcxa0QsRUFBRTJrRCxnQkFBaUJyZ0QsRUFBRy9ELEVBQUUyakQsa0JBQzFEcmpELEVBQUUrakQsT0FBTzlsRCxHQUFJd0YsRUFBRXVnRCx1QkFBdUJ0a0QsRUFBRTArQyxRQUFTcCtDLEdBQUdpa0QsMkJBTHRDLENBTWhCOWtELEVBQUdzRSxFQUFHL0QsR0FBS1AsYUFBYStrRCxHQUFLLFNBQVMva0QsRUFBR3NFLEVBQUcvRCxHQUMxQyxJQUFLK2pELEdBQUd0a0QsRUFBRWdsRCxhQUFjMWdELEdBS3hCLFlBQVlBLEVBQUUyZ0QseUJBQXlCMWtELEVBQUUwK0MsU0FDekMsTUFBTXArQyxFQUFJNmpELEdBQUcxa0QsRUFBRTJrRCxnQkFBaUJyZ0QsRUFBRy9ELEVBQUUyakQsa0JBQW1CcGxELEVBQUl3RixFQUFFNkUsS0FDOURySyxFQUFFOGxELE9BQU9NLEdBQUdsbEQsSUFBS2xCLEVBQUU4bEQsT0FBTy9qRCxHQUFJeUQsRUFBRXVnRCx1QkFBdUJ0a0QsRUFBRTArQyxRQUFTbmdELEdBQUdnbUQsMkJBUjFDLENBUzdCOWtELEVBQUdzRSxFQUFHL0QsR0FBSyxTQUFTUCxFQUFHc0UsRUFBRy9ELEdBSXhCK0QsRUFBRTZnRCxvQkFBb0I1a0QsRUFBRTArQyxTQUFTNkYsMkJBSnhCLENBS1gsRUFBR3hnRCxFQUFHL0QsR0FjUixTQUFTNmtELEdBQUdwbEQsRUFBR3NFLEVBQUcvRCxHQUNsQlAsYUFBYXlrRCxHQUFLLFNBQVN6a0QsRUFBR3NFLEVBQUcvRCxHQUM3QixJQUFLK2pELEdBQUd0a0QsRUFBRWdsRCxhQUFjMWdELEdBR3hCLE9BQ0EsTUFBTXpELEVBQUliLEVBQUVELE1BQU11L0MsUUFBU3hnRCxFQUFJdW1ELEdBQUdybEQsRUFBRTJrRCxnQkFBaUJwa0QsRUFBRytELEdBQ3hEekQsRUFBRStqRCxPQUFPOWxELEdBQUl3RixFQUFFdWdELHVCQUF1QlMsR0FBR2hoRCxHQUFJekQsR0FBRzBrRCx1QkFObEMsQ0FvQmpCdmxELEVBQUdzRSxFQUFHL0QsR0FBS1AsYUFBYStrRCxHQUFLLFNBQVMva0QsRUFBR3NFLEVBQUcvRCxHQUN6QyxJQUFLK2pELEdBQUd0a0QsRUFBRWdsRCxhQUFjMWdELEdBQUksT0FDNUIsTUFBTXpELEVBQUl3a0QsR0FBR3JsRCxFQUFFMmtELGdCQUFpQnBrRCxFQUFHK0QsR0FBSXhGLEVBQUl3RixFQUFFNkUsS0FDN0NySyxFQUFFOGxELE9BQU9NLEdBQUdsbEQsSUFBS2xCLEVBQUU4bEQsT0FBTy9qRCxHQUFJeUQsRUFBRXVnRCx1QkFBdUJTLEdBQUdoaEQsR0FBSXhGLEdBQUd5bUQsdUJBSHZDLENBTzdCdmxELEVBQUdzRSxFQUFHL0QsR0FBSyxTQUFTUCxFQUFHc0UsR0FDcEJnZ0QsR0FBR3RrRCxFQUFFZ2xELGFBQWMxZ0QsSUFHbkJBLEVBQUU2Z0Qsb0JBQW9CM0wsRUFBR25vQyxPQUpqQixDQVlYclIsRUFBR3NFLEdBa0JKLFNBQVNraEQsR0FBR3hsRCxFQUFHc0UsR0FDZixJQUFJL0QsRUFBSSxLQUNSLElBQUssTUFBTU0sS0FBS2IsRUFBRTJrRCxnQkFBaUIsQ0FDL0IsTUFBTTNrRCxFQUFJc0UsRUFBRTZFLEtBQUt5MUMsTUFBTS85QyxFQUFFKzlDLE9BQVE5L0MsRUFBSTJrRCxHQUFHNWlELEVBQUVtakQsVUFBV2hrRCxHQUFLLE1BQzFELE1BQVFsQixJQUFNLE1BQVF5QixJQUFNQSxFQUFJODlDLEdBQUdjLFNBQVU1K0MsRUFBRWlRLElBQUkzUCxFQUFFKzlDLE1BQU85L0MsSUFFaEUsT0FBT3lCLEdBQUssS0FHaEIsU0FBU2tsRCxHQUFHemxELEVBQUdzRSxHQUNYLE9BQU90RSxFQUFFNEcsT0FBU3RDLEVBQUVzQyxRQUFXNUcsRUFBRUssSUFBSXM1QyxRQUFRcjFDLEVBQUVqRSxRQUFXTCxFQUFFZ2xELGFBQWFyTCxRQUFRcjFDLEVBQUUwZ0QsaUJBQW9CLFNBQVNobEQsRUFBR3NFLEdBQy9HLFlBQU8sSUFBV3RFLFFBQUssSUFBV3NFLE1BQVF0RSxJQUFNc0UsSUFBTTIwQyxFQUFHajVDLEVBQUdzRSxFQUFHLENBQUV0RSxFQUFHc0UsSUE3TjVFLFNBQVl0RSxFQUFHc0UsR0FDWCxPQUFPdEUsRUFBRTQrQyxNQUFNakYsUUFBUXIxQyxFQUFFczZDLFFBQVUsU0FBUzUrQyxFQUFHc0UsR0FDM0MsT0FBT3RFLGFBQWFxakQsSUFBTS8rQyxhQUFhKytDLElBQU1yakQsYUFBYXVqRCxJQUFNai9DLGFBQWFpL0MsR0FBS3RLLEVBQUdqNUMsRUFBRTZqRCxTQUFVdi9DLEVBQUV1L0MsU0FBVW5ILElBQU0xOEMsYUFBYTRqRCxJQUFNdC9DLGFBQWFzL0MsR0FBS2xILEdBQUcxOEMsRUFBRWcxQyxFQUFHMXdDLEVBQUUwd0MsR0FBS2gxQyxhQUFhbWpELElBQU03K0MsYUFBYTYrQyxHQUR4SyxDQUVqQ25qRCxFQUFFZ2tELFVBQVcxL0MsRUFBRTAvQyxXQTBONkQwQixDQUFHMWxELEVBQUdzRSxJQURtQixDQUVyR3RFLEVBQUUya0QsZ0JBQWlCcmdELEVBQUVxZ0QsbUJBQXFCLElBQWdCM2tELEVBQUU0RyxLQUFPNUcsRUFBRUQsTUFBTTQ1QyxRQUFRcjFDLEVBQUV2RSxPQUFTLElBQWtCQyxFQUFFNEcsTUFBUTVHLEVBQUVtSixLQUFLd3dDLFFBQVFyMUMsRUFBRTZFLE9BQVNuSixFQUFFMmxELFVBQVVoTSxRQUFRcjFDLEVBQUVxaEQsWUFRNUssU0FBU0wsR0FBR3RsRCxHQUNaLE9BQU9BLEVBQUUwaUQsa0JBQW9CMWlELEVBQUVpL0MsUUFBVXpGLEVBQUdub0MsTUFNNUMsTUFBTW96QyxXQUFXRixHQUNqQixZQUFZdmtELEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBSSxJQUNyQitILFFBQVNuSCxLQUFLcEIsSUFBTUwsRUFBR3lCLEtBQUsxQixNQUFRdUUsRUFBRzdDLEtBQUt1akQsYUFBZXprRCxFQUFHa0IsS0FBS2tqRCxnQkFBa0I5akQsRUFDckZZLEtBQUttRixLQUFPLEdBSXBCLE1BQU1tK0MsV0FBV1IsR0FDYixZQUFZdmtELEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUksSUFDeEI4SixRQUFTbkgsS0FBS3BCLElBQU1MLEVBQUd5QixLQUFLMEgsS0FBTzdFLEVBQUc3QyxLQUFLa2tELFVBQVlwbEQsRUFBR2tCLEtBQUt1akQsYUFBZW5rRCxFQUM5RVksS0FBS2tqRCxnQkFBa0I3bEQsRUFBRzJDLEtBQUttRixLQUFPLEdBSTlDLFNBQVNzK0MsR0FBR2xsRCxHQUNSLE1BQU1zRSxFQUFJLElBQUk4TCxJQUNkLE9BQU9wUSxFQUFFMmxELFVBQVUvSyxPQUFPaHdDLFFBQVNySyxJQUMvQixJQUFLQSxFQUFFcUosVUFBVyxDQUNkLE1BQU0vSSxFQUFJYixFQUFFbUosS0FBS3kxQyxNQUFNcitDLEdBQ3ZCK0QsRUFBRWtNLElBQUlqUSxFQUFHTSxNQUVaeUQsRUFhTCxTQUFTb2dELEdBQUcxa0QsRUFBR3NFLEVBQUcvRCxHQUNsQixNQUFNTSxFQUFJLElBQUl1UCxJQUNkdWxDLEVBQUUzMUMsRUFBRWlCLFNBQVdWLEVBQUVVLFFBQ2pCLElBQUssSUFBSW5DLEVBQUksRUFBR0EsRUFBSXlCLEVBQUVVLE9BQVFuQyxJQUFLLENBQy9CLE1BQU1jLEVBQUlJLEVBQUVsQixHQUFJUyxFQUFJSyxFQUFFb2tELFVBQVdsNkMsRUFBSXhGLEVBQUU2RSxLQUFLeTFDLE1BQU1oL0MsRUFBRWcvQyxPQUNwRC85QyxFQUFFMlAsSUFBSTVRLEVBQUVnL0MsTUFBTytFLEdBQUdwa0QsRUFBR3VLLEVBQUd2SixFQUFFekIsS0FFOUIsT0FBTytCLEVBY1AsU0FBU3drRCxHQUFHcmxELEVBQUdzRSxFQUFHL0QsR0FDbEIsTUFBTU0sRUFBSSxJQUFJdVAsSUFDZCxJQUFLLE1BQU10UixLQUFLa0IsRUFBRyxDQUNmLE1BQU1BLEVBQUlsQixFQUFFa2xELFVBQVdwa0QsRUFBSVcsRUFBRTRJLEtBQUt5MUMsTUFBTTkvQyxFQUFFOC9DLE9BQzFDLzlDLEVBQUUyUCxJQUFJMVIsRUFBRTgvQyxNQUFPc0UsR0FBR2xqRCxFQUFHSixFQUFHMEUsSUFFNUIsT0FBT3pELEVBR21ELE1BQU0ra0QsV0FBV3JCLEdBQzNFLFlBQVl2a0QsRUFBR3NFLEdBQ1hzRSxRQUFTbkgsS0FBS3BCLElBQU1MLEVBQUd5QixLQUFLdWpELGFBQWUxZ0QsRUFBRzdDLEtBQUttRixLQUFPLEVBQWlCbkYsS0FBS2tqRCxnQkFBa0IsSUFJMUcsTUFBTWtCLFdBQVd0QixHQUNiLFlBQVl2a0QsRUFBR3NFLEdBQ1hzRSxRQUFTbkgsS0FBS3BCLElBQU1MLEVBQUd5QixLQUFLdWpELGFBQWUxZ0QsRUFBRzdDLEtBQUttRixLQUFPLEVBQWlCbkYsS0FBS2tqRCxnQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnRHLE1BQU0zM0MsR0FFTixZQUFZaE4sR0FDUnlCLEtBQUtxa0QsTUFBUTlsRDs7Ozs7Ozs7Ozs7Ozs7OztHQTZCakIsSUFBSStsRCxHQUFJQyxHQVFaLFNBQVNDLEdBQUdqbUQsR0FDUixPQUFRQSxHQUNOLFFBQ0UsT0FBTytvQyxJQUVULEtBQUsrTSxFQUFFRSxVQUNQLEtBQUtGLEVBQUVHLFFBQ1AsS0FBS0gsRUFBRUssa0JBQ1AsS0FBS0wsRUFBRVMsbUJBQ1AsS0FBS1QsRUFBRWMsU0FDUCxLQUFLZCxFQUFFZSxZQUdDLEtBQUtmLEVBQUVuQixnQkFDYixPQUFPLEVBRVQsS0FBS21CLEVBQUVJLGlCQUNQLEtBQUtKLEVBQUVNLFVBQ1AsS0FBS04sRUFBRU8sZUFDUCxLQUFLUCxFQUFFUSxrQkFDUCxLQUFLUixFQUFFVSxvQkFJQyxLQUFLVixFQUFFVyxRQUNmLEtBQUtYLEVBQUVZLGFBQ1AsS0FBS1osRUFBRWEsY0FDUCxLQUFLYixFQUFFZ0IsVUFDTCxPQUFPLEdBdUJmLFNBQVNvUCxHQUFHbG1ELEdBQ1IsUUFBSSxJQUFXQSxFQUdmLE9BQU91MUMsRUFBRSwyQkFBNEJPLEVBQUVHLFFBQ3ZDLE9BQVFqMkMsR0FDTixLQUFLK2xELEdBQUdoUSxHQUNOLE9BQU9ELEVBQUVDLEdBRVgsS0FBS2dRLEdBQUcvUCxVQUNOLE9BQU9GLEVBQUVFLFVBRVgsS0FBSytQLEdBQUc5UCxRQUNOLE9BQU9ILEVBQUVHLFFBRVgsS0FBSzhQLEdBQUc1UCxrQkFDTixPQUFPTCxFQUFFSyxrQkFFWCxLQUFLNFAsR0FBR3hQLG1CQUNOLE9BQU9ULEVBQUVTLG1CQUVYLEtBQUt3UCxHQUFHblAsU0FDTixPQUFPZCxFQUFFYyxTQUVYLEtBQUttUCxHQUFHbFAsWUFDTixPQUFPZixFQUFFZSxZQUVYLEtBQUtrUCxHQUFHcFIsZ0JBQ04sT0FBT21CLEVBQUVuQixnQkFFWCxLQUFLb1IsR0FBRzdQLGlCQUNOLE9BQU9KLEVBQUVJLGlCQUVYLEtBQUs2UCxHQUFHM1AsVUFDTixPQUFPTixFQUFFTSxVQUVYLEtBQUsyUCxHQUFHMVAsZUFDTixPQUFPUCxFQUFFTyxlQUVYLEtBQUswUCxHQUFHelAsa0JBQ04sT0FBT1IsRUFBRVEsa0JBRVgsS0FBS3lQLEdBQUd2UCxvQkFDTixPQUFPVixFQUFFVSxvQkFFWCxLQUFLdVAsR0FBR3RQLFFBQ04sT0FBT1gsRUFBRVcsUUFFWCxLQUFLc1AsR0FBR3JQLGFBQ04sT0FBT1osRUFBRVksYUFFWCxLQUFLcVAsR0FBR3BQLGNBQ04sT0FBT2IsRUFBRWEsY0FFWCxLQUFLb1AsR0FBR2pQLFVBQ04sT0FBT2hCLEVBQUVnQixVQUVYLFFBQ0UsT0FBTy9OLE1BV1ZpZCxHQUFLRCxLQUFPQSxHQUFLLEtBQUtDLEdBQUdqUSxHQUFLLEdBQUssS0FBTWlRLEdBQUdBLEdBQUdoUSxVQUFZLEdBQUssWUFDckVnUSxHQUFHQSxHQUFHL1AsUUFBVSxHQUFLLFVBQVcrUCxHQUFHQSxHQUFHOVAsaUJBQW1CLEdBQUssbUJBQzlEOFAsR0FBR0EsR0FBRzdQLGtCQUFvQixHQUFLLG9CQUFxQjZQLEdBQUdBLEdBQUc1UCxVQUFZLEdBQUssWUFDM0U0UCxHQUFHQSxHQUFHM1AsZUFBaUIsR0FBSyxpQkFBa0IyUCxHQUFHQSxHQUFHMVAsa0JBQW9CLEdBQUssb0JBQzdFMFAsR0FBR0EsR0FBR3JSLGdCQUFrQixJQUFNLGtCQUFtQnFSLEdBQUdBLEdBQUd6UCxtQkFBcUIsR0FBSyxxQkFDakZ5UCxHQUFHQSxHQUFHeFAsb0JBQXNCLEdBQUssc0JBQXVCd1AsR0FBR0EsR0FBR3ZQLFFBQVUsSUFBTSxVQUM5RXVQLEdBQUdBLEdBQUd0UCxhQUFlLElBQU0sZUFBZ0JzUCxHQUFHQSxHQUFHclAsY0FBZ0IsSUFBTSxnQkFDdkVxUCxHQUFHQSxHQUFHcFAsU0FBVyxJQUFNLFdBQVlvUCxHQUFHQSxHQUFHblAsWUFBYyxJQUFNLGNBQWVtUCxHQUFHQSxHQUFHbFAsVUFBWSxJQUFNOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CcEcsTUFBTXFQLEdBQ0YsWUFBWW5tRCxFQUFHc0UsR0FDWDdDLEtBQUt5NEMsV0FBYWw2QyxFQUFHeUIsS0FBSzJrRCxLQUFPOWhELEdBQUsraEQsR0FBR0MsTUFHN0MsT0FBT3RtRCxFQUFHc0UsR0FDTixPQUFPLElBQUk2aEQsR0FBRzFrRCxLQUFLeTRDLFdBQVl6NEMsS0FBSzJrRCxLQUFLRyxPQUFPdm1ELEVBQUdzRSxFQUFHN0MsS0FBS3k0QyxZQUFZc00sS0FBSyxLQUFNLEtBQU1ILEdBQUdJLE1BQU8sS0FBTSxPQUc1RyxPQUFPem1ELEdBQ0gsT0FBTyxJQUFJbW1ELEdBQUcxa0QsS0FBS3k0QyxXQUFZejRDLEtBQUsya0QsS0FBS00sT0FBTzFtRCxFQUFHeUIsS0FBS3k0QyxZQUFZc00sS0FBSyxLQUFNLEtBQU1ILEdBQUdJLE1BQU8sS0FBTSxPQUd6RyxJQUFJem1ELEdBQ0EsSUFBSXNFLEVBQUk3QyxLQUFLMmtELEtBQ2IsTUFBTzloRCxFQUFFc0YsV0FBYSxDQUNsQixNQUFNckosRUFBSWtCLEtBQUt5NEMsV0FBV2w2QyxFQUFHc0UsRUFBRWpFLEtBQy9CLEdBQUksSUFBTUUsRUFBRyxPQUFPK0QsRUFBRXZFLE1BQ3RCUSxFQUFJLEVBQUkrRCxFQUFJQSxFQUFFa2hCLEtBQU9qbEIsRUFBSSxJQUFNK0QsRUFBSUEsRUFBRXFpRCxPQUV6QyxPQUFPLEtBSVgsUUFBUTNtRCxHQUVKLElBQUlzRSxFQUFJLEVBQUcvRCxFQUFJa0IsS0FBSzJrRCxLQUNwQixNQUFPN2xELEVBQUVxSixXQUFhLENBQ2xCLE1BQU0vSSxFQUFJWSxLQUFLeTRDLFdBQVdsNkMsRUFBR08sRUFBRUYsS0FDL0IsR0FBSSxJQUFNUSxFQUFHLE9BQU95RCxFQUFJL0QsRUFBRWlsQixLQUFLbVIsS0FDL0I5MUIsRUFBSSxFQUFJTixFQUFJQSxFQUFFaWxCLE1BRWRsaEIsR0FBSy9ELEVBQUVpbEIsS0FBS21SLEtBQU8sRUFBR3AyQixFQUFJQSxFQUFFb21ELE9BR3hCLE9BQVEsRUFFcEIsVUFDSSxPQUFPbGxELEtBQUsya0QsS0FBS3g4QyxVQUdyQixXQUNJLE9BQU9uSSxLQUFLMmtELEtBQUt6dkIsS0FHckIsU0FDSSxPQUFPbDFCLEtBQUsya0QsS0FBS1EsU0FHckIsU0FDSSxPQUFPbmxELEtBQUsya0QsS0FBS1MsU0FNckIsaUJBQWlCN21ELEdBQ2IsT0FBT3lCLEtBQUsya0QsS0FBS1UsaUJBQWlCOW1ELEdBRXRDLFFBQVFBLEdBQ0p5QixLQUFLcWxELGlCQUFpQixDQUFFeGlELEVBQUcvRCxLQUFPUCxFQUFFc0UsRUFBRy9ELElBQUksSUFFL0MsV0FDSSxNQUFNUCxFQUFJLEdBQ1YsT0FBT3lCLEtBQUtxbEQsaUJBQWlCLENBQUV4aUQsRUFBRy9ELEtBQU9QLEVBQUU2QyxLQUFLLEdBQUd5QixLQUFLL0QsTUFBTSxJQUFPLElBQUlQLEVBQUU4QyxLQUFLLFNBT3BGLGlCQUFpQjlDLEdBQ2IsT0FBT3lCLEtBQUsya0QsS0FBS1csaUJBQWlCL21ELEdBR3RDLGNBQ0ksT0FBTyxJQUFJZ25ELEdBQUd2bEQsS0FBSzJrRCxLQUFNLEtBQU0za0QsS0FBS3k0QyxZQUFZLEdBRXBELGdCQUFnQmw2QyxHQUNaLE9BQU8sSUFBSWduRCxHQUFHdmxELEtBQUsya0QsS0FBTXBtRCxFQUFHeUIsS0FBS3k0QyxZQUFZLEdBRWpELHFCQUNJLE9BQU8sSUFBSThNLEdBQUd2bEQsS0FBSzJrRCxLQUFNLEtBQU0za0QsS0FBS3k0QyxZQUFZLEdBRXBELHVCQUF1Qmw2QyxHQUNuQixPQUFPLElBQUlnbkQsR0FBR3ZsRCxLQUFLMmtELEtBQU1wbUQsRUFBR3lCLEtBQUt5NEMsWUFBWSxJQU1yRCxNQUFNOE0sR0FDRixZQUFZaG5ELEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDakJZLEtBQUt3bEQsVUFBWXBtRCxFQUFHWSxLQUFLeWxELFVBQVksR0FDckMsSUFBSXBvRCxFQUFJLEVBQ1IsTUFBT2tCLEVBQUU0SixXQUFhLEdBQUk5SyxFQUFJd0YsRUFBSS9ELEVBQUVQLEVBQUVLLElBQUtpRSxHQUFLLEVBRWhEekQsSUFBTS9CLElBQU0sR0FBSUEsRUFBSSxFQUVwQmtCLEVBQUl5QixLQUFLd2xELFVBQVlqbkQsRUFBRXdsQixLQUFPeGxCLEVBQUUybUQsVUFBWSxDQUN4QyxHQUFJLElBQU03bkQsRUFBRyxDQUdUMkMsS0FBS3lsRCxVQUFVcmtELEtBQUs3QyxHQUNwQixNQUlKeUIsS0FBS3lsRCxVQUFVcmtELEtBQUs3QyxHQUFJQSxFQUFJeUIsS0FBS3dsRCxVQUFZam5ELEVBQUUybUQsTUFBUTNtRCxFQUFFd2xCLE1BR2pFLFVBQ0ksSUFBSXhsQixFQUFJeUIsS0FBS3lsRCxVQUFVN2lDLE1BQ3ZCLE1BQU0vZixFQUFJLENBQ05qRSxJQUFLTCxFQUFFSyxJQUNQTixNQUFPQyxFQUFFRCxPQUViLEdBQUkwQixLQUFLd2xELFVBQVcsSUFBS2puRCxFQUFJQSxFQUFFd2xCLE1BQU94bEIsRUFBRTRKLFdBQWFuSSxLQUFLeWxELFVBQVVya0QsS0FBSzdDLEdBQUlBLEVBQUlBLEVBQUUybUQsV0FBWSxJQUFLM21ELEVBQUlBLEVBQUUybUQsT0FBUTNtRCxFQUFFNEosV0FBYW5JLEtBQUt5bEQsVUFBVXJrRCxLQUFLN0MsR0FDckpBLEVBQUlBLEVBQUV3bEIsS0FDTixPQUFPbGhCLEVBRVgsVUFDSSxPQUFPN0MsS0FBS3lsRCxVQUFVam1ELE9BQVMsRUFFbkMsT0FDSSxHQUFJLElBQU1RLEtBQUt5bEQsVUFBVWptRCxPQUFRLE9BQU8sS0FDeEMsTUFBTWpCLEVBQUl5QixLQUFLeWxELFVBQVV6bEQsS0FBS3lsRCxVQUFVam1ELE9BQVMsR0FDakQsTUFBTyxDQUNIWixJQUFLTCxFQUFFSyxJQUNQTixNQUFPQyxFQUFFRCxRQU9yQixNQUFNc21ELEdBQ0YsWUFBWXJtRCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixHQUNwQjJDLEtBQUtwQixJQUFNTCxFQUFHeUIsS0FBSzFCLE1BQVF1RSxFQUFHN0MsS0FBSzZqQixNQUFRLE1BQVEva0IsRUFBSUEsRUFBSThsRCxHQUFHYyxJQUFLMWxELEtBQUsrakIsS0FBTyxNQUFRM2tCLEVBQUlBLEVBQUl3bEQsR0FBR0MsTUFDbEc3a0QsS0FBS2tsRCxNQUFRLE1BQVE3bkQsRUFBSUEsRUFBSXVuRCxHQUFHQyxNQUFPN2tELEtBQUtrMUIsS0FBT2wxQixLQUFLK2pCLEtBQUttUixLQUFPLEVBQUlsMUIsS0FBS2tsRCxNQUFNaHdCLEtBR3ZGLEtBQUszMkIsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDYixPQUFPLElBQUl1bkQsR0FBRyxNQUFRcm1ELEVBQUlBLEVBQUl5QixLQUFLcEIsSUFBSyxNQUFRaUUsRUFBSUEsRUFBSTdDLEtBQUsxQixNQUFPLE1BQVFRLEVBQUlBLEVBQUlrQixLQUFLNmpCLE1BQU8sTUFBUXprQixFQUFJQSxFQUFJWSxLQUFLK2pCLEtBQU0sTUFBUTFtQixFQUFJQSxFQUFJMkMsS0FBS2tsRCxPQUVwSixVQUNJLE9BQU8sRUFNWCxpQkFBaUIzbUQsR0FDYixPQUFPeUIsS0FBSytqQixLQUFLc2hDLGlCQUFpQjltRCxJQUFNQSxFQUFFeUIsS0FBS3BCLElBQUtvQixLQUFLMUIsUUFBVTBCLEtBQUtrbEQsTUFBTUcsaUJBQWlCOW1ELEdBTW5HLGlCQUFpQkEsR0FDYixPQUFPeUIsS0FBS2tsRCxNQUFNSSxpQkFBaUIvbUQsSUFBTUEsRUFBRXlCLEtBQUtwQixJQUFLb0IsS0FBSzFCLFFBQVUwQixLQUFLK2pCLEtBQUt1aEMsaUJBQWlCL21ELEdBR25HLE1BQ0ksT0FBT3lCLEtBQUsrakIsS0FBSzViLFVBQVluSSxLQUFPQSxLQUFLK2pCLEtBQUtuVSxNQUdsRCxTQUNJLE9BQU81UCxLQUFLNFAsTUFBTWhSLElBR3RCLFNBQ0ksT0FBT29CLEtBQUtrbEQsTUFBTS84QyxVQUFZbkksS0FBS3BCLElBQU1vQixLQUFLa2xELE1BQU1FLFNBR3hELE9BQU83bUQsRUFBR3NFLEVBQUcvRCxHQUNULElBQUlNLEVBQUlZLEtBQ1IsTUFBTTNDLEVBQUl5QixFQUFFUCxFQUFHYSxFQUFFUixLQUNqQixPQUFPUSxFQUFJL0IsRUFBSSxFQUFJK0IsRUFBRTJsRCxLQUFLLEtBQU0sS0FBTSxLQUFNM2xELEVBQUUya0IsS0FBSytnQyxPQUFPdm1ELEVBQUdzRSxFQUFHL0QsR0FBSSxNQUFRLElBQU16QixFQUFJK0IsRUFBRTJsRCxLQUFLLEtBQU1saUQsRUFBRyxLQUFNLEtBQU0sTUFBUXpELEVBQUUybEQsS0FBSyxLQUFNLEtBQU0sS0FBTSxLQUFNM2xELEVBQUU4bEQsTUFBTUosT0FBT3ZtRCxFQUFHc0UsRUFBRy9ELElBQzlLTSxFQUFFdW1ELFFBRU4sWUFDSSxHQUFJM2xELEtBQUsrakIsS0FBSzViLFVBQVcsT0FBT3k4QyxHQUFHQyxNQUNuQyxJQUFJdG1ELEVBQUl5QixLQUNSLE9BQU96QixFQUFFd2xCLEtBQUs2aEMsU0FBV3JuRCxFQUFFd2xCLEtBQUtBLEtBQUs2aEMsVUFBWXJuRCxFQUFJQSxFQUFFc25ELGVBQWdCdG5ELEVBQUlBLEVBQUV3bUQsS0FBSyxLQUFNLEtBQU0sS0FBTXhtRCxFQUFFd2xCLEtBQUsraEMsWUFBYSxNQUN4SHZuRCxFQUFFb25ELFFBR04sT0FBT3BuRCxFQUFHc0UsR0FDTixJQUFJL0QsRUFBR00sRUFBSVksS0FDWCxHQUFJNkMsRUFBRXRFLEVBQUdhLEVBQUVSLEtBQU8sRUFBR1EsRUFBRTJrQixLQUFLNWIsV0FBYS9JLEVBQUUya0IsS0FBSzZoQyxTQUFXeG1ELEVBQUUya0IsS0FBS0EsS0FBSzZoQyxVQUFZeG1ELEVBQUlBLEVBQUV5bUQsZUFDekZ6bUQsRUFBSUEsRUFBRTJsRCxLQUFLLEtBQU0sS0FBTSxLQUFNM2xELEVBQUUya0IsS0FBS2toQyxPQUFPMW1ELEVBQUdzRSxHQUFJLFVBQVksQ0FDMUQsR0FBSXpELEVBQUUya0IsS0FBSzZoQyxVQUFZeG1ELEVBQUlBLEVBQUUybUQsZUFBZ0IzbUQsRUFBRThsRCxNQUFNLzhDLFdBQWEvSSxFQUFFOGxELE1BQU1VLFNBQVd4bUQsRUFBRThsRCxNQUFNbmhDLEtBQUs2aEMsVUFBWXhtRCxFQUFJQSxFQUFFNG1ELGdCQUNwSCxJQUFNbmpELEVBQUV0RSxFQUFHYSxFQUFFUixLQUFNLENBQ2YsR0FBSVEsRUFBRThsRCxNQUFNLzhDLFVBQVcsT0FBT3k4QyxHQUFHQyxNQUNqQy9sRCxFQUFJTSxFQUFFOGxELE1BQU10MUMsTUFBT3hRLEVBQUlBLEVBQUUybEQsS0FBS2ptRCxFQUFFRixJQUFLRSxFQUFFUixNQUFPLEtBQU0sS0FBTWMsRUFBRThsRCxNQUFNWSxhQUV0RTFtRCxFQUFJQSxFQUFFMmxELEtBQUssS0FBTSxLQUFNLEtBQU0sS0FBTTNsRCxFQUFFOGxELE1BQU1ELE9BQU8xbUQsRUFBR3NFLElBRXpELE9BQU96RCxFQUFFdW1ELFFBRWIsUUFDSSxPQUFPM2xELEtBQUs2akIsTUFHaEIsUUFDSSxJQUFJdGxCLEVBQUl5QixLQUNSLE9BQU96QixFQUFFMm1ELE1BQU1VLFVBQVlybkQsRUFBRXdsQixLQUFLNmhDLFVBQVlybkQsRUFBSUEsRUFBRTBuRCxjQUFlMW5ELEVBQUV3bEIsS0FBSzZoQyxTQUFXcm5ELEVBQUV3bEIsS0FBS0EsS0FBSzZoQyxVQUFZcm5ELEVBQUlBLEVBQUV3bkQsZUFDbkh4bkQsRUFBRXdsQixLQUFLNmhDLFNBQVdybkQsRUFBRTJtRCxNQUFNVSxVQUFZcm5ELEVBQUlBLEVBQUUybkQsYUFBYzNuRCxFQUU5RCxjQUNJLElBQUlBLEVBQUl5QixLQUFLa21ELFlBQ2IsT0FBTzNuRCxFQUFFMm1ELE1BQU1uaEMsS0FBSzZoQyxVQUFZcm5ELEVBQUlBLEVBQUV3bUQsS0FBSyxLQUFNLEtBQU0sS0FBTSxLQUFNeG1ELEVBQUUybUQsTUFBTWEsZUFDM0V4bkQsRUFBSUEsRUFBRTBuRCxhQUFjMW5ELEVBQUlBLEVBQUUybkQsYUFBYzNuRCxFQUU1QyxlQUNJLElBQUlBLEVBQUl5QixLQUFLa21ELFlBQ2IsT0FBTzNuRCxFQUFFd2xCLEtBQUtBLEtBQUs2aEMsVUFBWXJuRCxFQUFJQSxFQUFFd25ELGNBQWV4bkQsRUFBSUEsRUFBRTJuRCxhQUFjM25ELEVBRTVFLGFBQ0ksTUFBTUEsRUFBSXlCLEtBQUsra0QsS0FBSyxLQUFNLEtBQU1ILEdBQUdjLElBQUssS0FBTTFsRCxLQUFLa2xELE1BQU1uaEMsTUFDekQsT0FBTy9qQixLQUFLa2xELE1BQU1ILEtBQUssS0FBTSxLQUFNL2tELEtBQUs2akIsTUFBT3RsQixFQUFHLE1BRXRELGNBQ0ksTUFBTUEsRUFBSXlCLEtBQUsra0QsS0FBSyxLQUFNLEtBQU1ILEdBQUdjLElBQUsxbEQsS0FBSytqQixLQUFLbWhDLE1BQU8sTUFDekQsT0FBT2xsRCxLQUFLK2pCLEtBQUtnaEMsS0FBSyxLQUFNLEtBQU0va0QsS0FBSzZqQixNQUFPLEtBQU10bEIsR0FFeEQsWUFDSSxNQUFNQSxFQUFJeUIsS0FBSytqQixLQUFLZ2hDLEtBQUssS0FBTSxNQUFPL2tELEtBQUsrakIsS0FBS0YsTUFBTyxLQUFNLE1BQU9oaEIsRUFBSTdDLEtBQUtrbEQsTUFBTUgsS0FBSyxLQUFNLE1BQU8va0QsS0FBS2tsRCxNQUFNcmhDLE1BQU8sS0FBTSxNQUM3SCxPQUFPN2pCLEtBQUsra0QsS0FBSyxLQUFNLE1BQU8va0QsS0FBSzZqQixNQUFPdGxCLEVBQUdzRSxHQUdqRCxnQkFDSSxNQUFNdEUsRUFBSXlCLEtBQUttbUQsUUFDZixPQUFPeDJDLEtBQUt5MkMsSUFBSSxFQUFHN25ELElBQU15QixLQUFLazFCLEtBQU8sRUFJekMsUUFDSSxHQUFJbDFCLEtBQUs0bEQsU0FBVzVsRCxLQUFLK2pCLEtBQUs2aEMsUUFBUyxNQUFNdGUsSUFDN0MsR0FBSXRuQyxLQUFLa2xELE1BQU1VLFFBQVMsTUFBTXRlLElBQzlCLE1BQU0vb0MsRUFBSXlCLEtBQUsrakIsS0FBS29pQyxRQUNwQixHQUFJNW5ELElBQU15QixLQUFLa2xELE1BQU1pQixRQUFTLE1BQU03ZSxJQUNwQyxPQUFPL29DLEdBQUt5QixLQUFLNGxELFFBQVUsRUFBSSxJQU92Q2hCLEdBQUdDLE1BQVEsS0FBTUQsR0FBR2MsS0FBTSxFQUFJZCxHQUFHSSxPQUFRLEVBR3pDSixHQUFHQyxNQUFRLElBRVgsTUFDSSxjQUNJN2tELEtBQUtrMUIsS0FBTyxFQUVoQixVQUNJLE1BQU1vUyxJQUVWLFlBQ0ksTUFBTUEsSUFFVixZQUNJLE1BQU1BLElBRVYsV0FDSSxNQUFNQSxJQUVWLFlBQ0ksTUFBTUEsSUFHVixLQUFLL29DLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEdBQ2IsT0FBTzJDLEtBR1gsT0FBT3pCLEVBQUdzRSxFQUFHL0QsR0FDVCxPQUFPLElBQUk4bEQsR0FBR3JtRCxFQUFHc0UsR0FHckIsT0FBT3RFLEVBQUdzRSxHQUNOLE9BQU83QyxLQUVYLFVBQ0ksT0FBTyxFQUVYLGlCQUFpQnpCLEdBQ2IsT0FBTyxFQUVYLGlCQUFpQkEsR0FDYixPQUFPLEVBRVgsU0FDSSxPQUFPLEtBRVgsU0FDSSxPQUFPLEtBRVgsUUFDSSxPQUFPLEVBR1gsZ0JBQ0ksT0FBTyxFQUVYLFFBQ0ksT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQmYsTUFBTThuRCxHQUNGLFlBQVk5bkQsR0FDUnlCLEtBQUt5NEMsV0FBYWw2QyxFQUFHeUIsS0FBSzBILEtBQU8sSUFBSWc5QyxHQUFHMWtELEtBQUt5NEMsWUFFakQsSUFBSWw2QyxHQUNBLE9BQU8sT0FBU3lCLEtBQUswSCxLQUFLeEosSUFBSUssR0FFbEMsUUFDSSxPQUFPeUIsS0FBSzBILEtBQUt5OUMsU0FFckIsT0FDSSxPQUFPbmxELEtBQUswSCxLQUFLMDlDLFNBRXJCLFdBQ0ksT0FBT3BsRCxLQUFLMEgsS0FBS3d0QixLQUVyQixRQUFRMzJCLEdBQ0osT0FBT3lCLEtBQUswSCxLQUFLcEIsUUFBUS9ILEdBRWdDLFFBQVFBLEdBQ2pFeUIsS0FBSzBILEtBQUsyOUMsaUJBQWlCLENBQUV4aUQsRUFBRy9ELEtBQU9QLEVBQUVzRSxJQUFJLElBRTZCLGVBQWV0RSxFQUFHc0UsR0FDNUYsTUFBTS9ELEVBQUlrQixLQUFLMEgsS0FBSzQrQyxnQkFBZ0IvbkQsRUFBRSxJQUN0QyxLQUFNTyxFQUFFeW5ELFdBQWEsQ0FDakIsTUFBTW5uRCxFQUFJTixFQUFFMG5ELFVBQ1osR0FBSXhtRCxLQUFLeTRDLFdBQVdyNUMsRUFBRVIsSUFBS0wsRUFBRSxLQUFPLEVBQUcsT0FDdkNzRSxFQUFFekQsRUFBRVIsTUFLTCxhQUFhTCxFQUFHc0UsR0FDbkIsSUFBSS9ELEVBQ0osSUFBS0EsT0FBSSxJQUFXK0QsRUFBSTdDLEtBQUswSCxLQUFLNCtDLGdCQUFnQnpqRCxHQUFLN0MsS0FBSzBILEtBQUsrK0MsY0FBZTNuRCxFQUFFeW5ELFdBQzlFLElBQUtob0QsRUFBRU8sRUFBRTBuRCxVQUFVNW5ELEtBQU0sT0FHa0Msa0JBQWtCTCxHQUNqRixNQUFNc0UsRUFBSTdDLEtBQUswSCxLQUFLNCtDLGdCQUFnQi9uRCxHQUNwQyxPQUFPc0UsRUFBRTBqRCxVQUFZMWpELEVBQUUyakQsVUFBVTVuRCxJQUFNLEtBRTNDLGNBQ0ksT0FBTyxJQUFJOG5ELEdBQUcxbUQsS0FBSzBILEtBQUsrK0MsZUFFNUIsZ0JBQWdCbG9ELEdBQ1osT0FBTyxJQUFJbW9ELEdBQUcxbUQsS0FBSzBILEtBQUs0K0MsZ0JBQWdCL25ELElBRUosSUFBSUEsR0FDeEMsT0FBT3lCLEtBQUsra0QsS0FBSy9rRCxLQUFLMEgsS0FBS3U5QyxPQUFPMW1ELEdBQUd1bUQsT0FBT3ZtRCxHQUFHLElBRXRCLE9BQU9BLEdBQ2hDLE9BQU95QixLQUFLdXJCLElBQUlodEIsR0FBS3lCLEtBQUsra0QsS0FBSy9rRCxLQUFLMEgsS0FBS3U5QyxPQUFPMW1ELElBQU15QixLQUUxRCxVQUNJLE9BQU9BLEtBQUswSCxLQUFLUyxVQUVyQixVQUFVNUosR0FDTixJQUFJc0UsRUFBSTdDLEtBRUEsT0FBTzZDLEVBQUVxeUIsS0FBTzMyQixFQUFFMjJCLE9BQVNyeUIsRUFBSXRFLEVBQUdBLEVBQUl5QixNQUFPekIsRUFBRTRLLFFBQVM1SyxJQUM1RHNFLEVBQUlBLEVBQUV1aEIsSUFBSTdsQixLQUNUc0UsRUFFVCxRQUFRdEUsR0FDSixLQUFNQSxhQUFhOG5ELElBQUssT0FBTyxFQUMvQixHQUFJcm1ELEtBQUtrMUIsT0FBUzMyQixFQUFFMjJCLEtBQU0sT0FBTyxFQUNqQyxNQUFNcnlCLEVBQUk3QyxLQUFLMEgsS0FBSysrQyxjQUFlM25ELEVBQUlQLEVBQUVtSixLQUFLKytDLGNBQzlDLEtBQU01akQsRUFBRTBqRCxXQUFhLENBQ2pCLE1BQU1ob0QsRUFBSXNFLEVBQUUyakQsVUFBVTVuRCxJQUFLUSxFQUFJTixFQUFFMG5ELFVBQVU1bkQsSUFDM0MsR0FBSSxJQUFNb0IsS0FBS3k0QyxXQUFXbDZDLEVBQUdhLEdBQUksT0FBTyxFQUU1QyxPQUFPLEVBRVgsVUFDSSxNQUFNYixFQUFJLEdBQ1YsT0FBT3lCLEtBQUttSixRQUFTdEcsSUFDakJ0RSxFQUFFNkMsS0FBS3lCLEtBQ050RSxFQUVULFdBQ0ksTUFBTUEsRUFBSSxHQUNWLE9BQU95QixLQUFLbUosUUFBU3RHLEdBQUt0RSxFQUFFNkMsS0FBS3lCLElBQU0sYUFBZXRFLEVBQUVtSCxXQUFhLElBRXpFLEtBQUtuSCxHQUNELE1BQU1zRSxFQUFJLElBQUl3akQsR0FBR3JtRCxLQUFLeTRDLFlBQ3RCLE9BQU81MUMsRUFBRTZFLEtBQU9uSixFQUFHc0UsR0FJM0IsTUFBTTZqRCxHQUNGLFlBQVlub0QsR0FDUnlCLEtBQUsybUQsS0FBT3BvRCxFQUVoQixVQUNJLE9BQU95QixLQUFLMm1ELEtBQUtILFVBQVU1bkQsSUFFL0IsVUFDSSxPQUFPb0IsS0FBSzJtRCxLQUFLSjs7Ozs7Ozs7Ozs7Ozs7OztHQW1CckIsTUFBTUssR0FBSyxJQUFJbEMsR0FBRzdKLEdBQUdwQyxZQUV6QixTQUFTb08sS0FDTCxPQUFPRCxHQUdYLE1BQU1FLEdBQUssSUFBSXBDLEdBQUc3SixHQUFHcEMsWUFFckIsU0FBU3NPLEtBQ0wsT0FBT0QsR0FHWCxNQUFNRSxHQUFLLElBQUl0QyxHQUFHN0osR0FBR3BDLFlBRXJCLFNBQVN3TyxLQUNMLE9BQU9ELEdBR1gsTUFBTUUsR0FBSyxJQUFJYixHQUFHeEwsR0FBR3BDLFlBRXJCLFNBQVMwTyxNQUFNNW9ELEdBQ1gsSUFBSXNFLEVBQUlxa0QsR0FDUixJQUFLLE1BQU1wb0QsS0FBS1AsRUFBR3NFLEVBQUlBLEVBQUV1aEIsSUFBSXRsQixHQUM3QixPQUFPK0QsRUFHWCxNQUFNdWtELEdBQUssSUFBSWYsR0FBRzlPLEdBRWxCLFNBQVM4UCxLQUNMLE9BQU9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJQLE1BQU1FLEdBQ04sWUFJQS9vRCxFQUlBc0UsRUFLQS9ELEVBS0FNLEVBSUEvQixHQUNJMkMsS0FBS3VuRCxnQkFBa0JocEQsRUFBR3lCLEtBQUt3bkQsY0FBZ0Iza0QsRUFBRzdDLEtBQUt5bkQsaUJBQW1CM29ELEVBQUdrQixLQUFLMG5ELGdCQUFrQnRvRCxFQUNwR1ksS0FBSzJuRCx1QkFBeUJ0cUQsRUFTbEMsb0RBQW9Ea0IsRUFBR3NFLEdBQ25ELE1BQU0vRCxFQUFJLElBQUk2UCxJQUNkLE9BQU83UCxFQUFFaVEsSUFBSXhRLEVBQUdxcEQsR0FBR0MsOENBQThDdHBELEVBQUdzRSxJQUFLLElBQUl5a0QsR0FBR3ZQLEVBQUdub0MsTUFBTzlRLEVBQUd1b0QsS0FBTVIsS0FBTU0sT0FXN0csTUFBTVMsR0FDTixZQU9BcnBELEVBTUFzRSxFQUtBL0QsRUFLQU0sRUFLQS9CLEdBQ0kyQyxLQUFLOG5ELFlBQWN2cEQsRUFBR3lCLEtBQUsrbkQsUUFBVWxsRCxFQUFHN0MsS0FBS2dvRCxlQUFpQmxwRCxFQUFHa0IsS0FBS2lvRCxrQkFBb0I3b0QsRUFDMUZZLEtBQUtrb0QsaUJBQW1CN3FELEVBTXJCLHFEQUFxRGtCLEVBQUdzRSxHQUMzRCxPQUFPLElBQUkra0QsR0FBR3RPLEVBQUdFLGtCQUFtQjMyQyxFQUFHc2tELEtBQU1BLEtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUJ2RCxNQUFNZ0IsR0FDTixZQUVBNXBELEVBRUFzRSxFQUVBL0QsRUFLQU0sR0FDSVksS0FBSzB6QyxFQUFJbjFDLEVBQUd5QixLQUFLb29ELGlCQUFtQnZsRCxFQUFHN0MsS0FBS3BCLElBQU1FLEVBQUdrQixLQUFLOHpDLEVBQUkxMEMsR0FJdEUsTUFBTWlwRCxHQUNGLFlBQVk5cEQsRUFBR3NFLEdBQ1g3QyxLQUFLc29ELFNBQVcvcEQsRUFBR3lCLEtBQUsrekMsRUFBSWx4QyxHQUlwQyxNQUFNMGxELEdBQ0YsWUFFQWhxRCxFQUVBc0UsRUFPQS9ELEVBQUl3NkMsRUFBR0Usa0JBQ2dEcDZDLEVBQUksTUFDdkRZLEtBQUt3b0QsTUFBUWpxRCxFQUFHeUIsS0FBS3lvRCxVQUFZNWxELEVBQUc3QyxLQUFLOG5ELFlBQWNocEQsRUFBR2tCLEtBQUswb0QsTUFBUXRwRCxHQUkzQixNQUFNdXBELEdBQ3RELGNBS0kzb0QsS0FBSzR6QyxFQUFJLEVBT1Q1ekMsS0FBS3NuQyxFQUFJc2hCLEtBRVQ1b0QsS0FBS2swQyxFQUFJb0YsRUFBR0Usa0JBQW1CeDVDLEtBQUttMEMsR0FBSSxFQU14Q24wQyxLQUFLbzBDLEdBQUksRUFTTixjQUNILE9BQU9wMEMsS0FBS20wQyxFQUU0QyxrQkFDeEQsT0FBT24wQyxLQUFLazBDLEVBRXlELFFBQ3JFLE9BQU8sSUFBTWwwQyxLQUFLNHpDLEVBRXVELFFBQ3pFLE9BQU81ekMsS0FBS28wQyxFQUtULEVBQUU3MUMsR0FDTEEsRUFBRXNxRCxzQkFBd0IsSUFBTTdvRCxLQUFLbzBDLEdBQUksRUFBSXAwQyxLQUFLazBDLEVBQUkzMUMsR0FPbkQsSUFDSCxJQUFJQSxFQUFJNG9ELEtBQU10a0QsRUFBSXNrRCxLQUFNcm9ELEVBQUlxb0QsS0FDNUIsT0FBT25uRCxLQUFLc25DLEVBQUVuK0IsUUFBUSxDQUFFL0osRUFBRy9CLEtBQ3ZCLE9BQVFBLEdBQ04sS0FBSyxFQUNIa0IsRUFBSUEsRUFBRTZsQixJQUFJaGxCLEdBQ1YsTUFFRixLQUFLLEVBQ0h5RCxFQUFJQSxFQUFFdWhCLElBQUlobEIsR0FDVixNQUVGLEtBQUssRUFDSE4sRUFBSUEsRUFBRXNsQixJQUFJaGxCLEdBQ1YsTUFFRixRQUNFa29DLE9BRUgsSUFBSXNnQixHQUFHNW5ELEtBQUtrMEMsRUFBR2wwQyxLQUFLbTBDLEVBQUc1MUMsRUFBR3NFLEVBQUcvRCxHQUkvQixJQUNIa0IsS0FBS28wQyxHQUFJLEVBQUlwMEMsS0FBS3NuQyxFQUFJc2hCLEtBRTFCLEVBQUVycUQsRUFBR3NFLEdBQ0Q3QyxLQUFLbzBDLEdBQUksRUFBSXAwQyxLQUFLc25DLEVBQUl0bkMsS0FBS3NuQyxFQUFFd2QsT0FBT3ZtRCxFQUFHc0UsR0FFM0MsRUFBRXRFLEdBQ0V5QixLQUFLbzBDLEdBQUksRUFBSXAwQyxLQUFLc25DLEVBQUl0bkMsS0FBS3NuQyxFQUFFMmQsT0FBTzFtRCxHQUV4QyxJQUNJeUIsS0FBSzR6QyxHQUFLLEVBRWQsSUFDSTV6QyxLQUFLNHpDLEdBQUssRUFFZCxLQUNJNXpDLEtBQUtvMEMsR0FBSSxFQUFJcDBDLEtBQUttMEMsR0FBSSxHQU85QixNQUFNMlUsR0FDRixZQUFZdnFELEdBQ1J5QixLQUFLNjJDLEdBQUt0NEMsRUFFVnlCLEtBQUtrM0MsR0FBSyxJQUFJdm9DLElBRWQzTyxLQUFLczNDLEdBQUt1UCxLQUVWN21ELEtBQUt1M0MsR0FBS3dSLEtBTVYvb0QsS0FBS3czQyxHQUFLLElBQUk2TyxHQUFHOU8sR0FJZCxHQUFHaDVDLEdBQ04sSUFBSyxNQUFNc0UsS0FBS3RFLEVBQUVtMUMsRUFBR24xQyxFQUFFdTFDLEdBQUt2MUMsRUFBRXUxQyxFQUFFbU4sa0JBQW9CamhELEtBQUsyM0MsR0FBRzkwQyxFQUFHdEUsRUFBRXUxQyxHQUFLOXpDLEtBQUsrM0MsR0FBR2wxQyxFQUFHdEUsRUFBRUssSUFBS0wsRUFBRXUxQyxHQUMxRixJQUFLLE1BQU1qeEMsS0FBS3RFLEVBQUU2cEQsaUJBQWtCcG9ELEtBQUsrM0MsR0FBR2wxQyxFQUFHdEUsRUFBRUssSUFBS0wsRUFBRXUxQyxHQUVzQixHQUFHdjFDLEdBQ2pGeUIsS0FBS2dwRCxjQUFjenFELEVBQUlzRSxJQUNuQixNQUFNL0QsRUFBSWtCLEtBQUtvNEMsR0FBR3YxQyxHQUNsQixPQUFRdEUsRUFBRWlxRCxPQUNSLEtBQUssRUFDSHhvRCxLQUFLcTRDLEdBQUd4MUMsSUFBTS9ELEVBQUUwMkMsRUFBRWozQyxFQUFFdXBELGFBQ3BCLE1BRUYsS0FBSyxFQUdIaHBELEVBQUV5M0MsSUFBS3ozQyxFQUFFdTFDLEdBSVR2MUMsRUFBRXNvQyxJQUFLdG9DLEVBQUUwMkMsRUFBRWozQyxFQUFFdXBELGFBQ2IsTUFFRixLQUFLLEVBS0hocEQsRUFBRXkzQyxJQUFLejNDLEVBQUV1MUMsR0FBS3IwQyxLQUFLaXBELGFBQWFwbUQsR0FDaEMsTUFFRixLQUFLLEVBQ0g3QyxLQUFLcTRDLEdBQUd4MUMsS0FBTy9ELEVBQUU4M0MsS0FBTTkzQyxFQUFFMDJDLEVBQUVqM0MsRUFBRXVwRCxjQUM3QixNQUVGLEtBQUssRUFDSDluRCxLQUFLcTRDLEdBQUd4MUMsS0FJUjdDLEtBQUtzNEMsR0FBR3oxQyxHQUFJL0QsRUFBRTAyQyxFQUFFajNDLEVBQUV1cEQsY0FDbEIsTUFFRixRQUNFeGdCLE9BUUwsY0FBYy9vQyxFQUFHc0UsR0FDcEJ0RSxFQUFFa3FELFVBQVVqcEQsT0FBUyxFQUFJakIsRUFBRWtxRCxVQUFVdC9DLFFBQVF0RyxHQUFLN0MsS0FBS2szQyxHQUFHL3RDLFFBQVEsQ0FBRTVLLEVBQUdPLEtBQ25Fa0IsS0FBS3E0QyxHQUFHdjVDLElBQU0rRCxFQUFFL0QsS0FPakIsR0FBR1AsR0FDTixNQUFNc0UsRUFBSXRFLEVBQUUrcEQsU0FBVXhwRCxFQUFJUCxFQUFFdzFDLEVBQUVzUSxNQUFPamxELEVBQUlZLEtBQUsrNEMsR0FBR2wyQyxHQUNqRCxHQUFJekQsRUFBRyxDQUNILE1BQU1iLEVBQUlhLEVBQUU2RCxPQUNaLEdBQUk0N0MsR0FBR3RnRCxHQUFJLEdBQUksSUFBTU8sRUFBRyxDQU9wQixNQUFNQSxFQUFJLElBQUkrN0MsR0FBR3Q4QyxFQUFFd1IsTUFDbkIvUCxLQUFLKzNDLEdBQUdsMUMsRUFBRy9ELEVBQUd3K0MsR0FBRzRMLGNBQWNwcUQsRUFBR2k1QyxFQUFHbm9DLGFBQ2xDc2tDLEVBQUUsSUFBTXAxQyxRQUNYa0IsS0FBS2c1QyxHQUFHbjJDLEtBQU8vRCxJQUdma0IsS0FBS3M0QyxHQUFHejFDLEdBQUk3QyxLQUFLdzNDLEdBQUt4M0MsS0FBS3czQyxHQUFHcHpCLElBQUl2aEIsS0FPdkMsR0FBR3RFLEdBQ04sTUFBTXNFLEVBQUksSUFBSThMLElBQ2QzTyxLQUFLazNDLEdBQUcvdEMsUUFBUSxDQUFFckssRUFBR00sS0FDakIsTUFBTS9CLEVBQUkyQyxLQUFLKzRDLEdBQUczNUMsR0FDbEIsR0FBSS9CLEVBQUcsQ0FDSCxHQUFJeUIsRUFBRWlwRCxTQUFXbEosR0FBR3hoRCxFQUFFNEYsUUFBUyxDQVMzQixNQUFNSixFQUFJLElBQUlnNEMsR0FBR3g5QyxFQUFFNEYsT0FBTzhNLE1BQzFCLE9BQVMvUCxLQUFLczNDLEdBQUdwNUMsSUFBSTJFLElBQU03QyxLQUFLczVDLEdBQUdsNkMsRUFBR3lELElBQU03QyxLQUFLKzNDLEdBQUczNEMsRUFBR3lELEVBQUd5NkMsR0FBRzRMLGNBQWNybUQsRUFBR3RFLElBRWxGTyxFQUFFdzJDLElBQU16eUMsRUFBRWtNLElBQUkzUCxFQUFHTixFQUFFMjJDLEtBQU0zMkMsRUFBRXNvQyxRQUduQyxJQUFJdG9DLEVBQUlxb0QsS0FNQW5uRCxLQUFLdTNDLEdBQUdwdUMsUUFBUSxDQUFFNUssRUFBR3NFLEtBQ3pCLElBQUl6RCxHQUFJLEVBQ1J5RCxFQUFFc21ELGFBQWM1cUQsSUFDWixNQUFNc0UsRUFBSTdDLEtBQUsrNEMsR0FBR3g2QyxHQUNsQixPQUFRc0UsR0FBSyxJQUE0QkEsRUFBRXVtRCxVQUFZaHFELEdBQUksR0FBSSxLQUM5REEsSUFBTU4sRUFBSUEsRUFBRXNsQixJQUFJN2xCLE1BRXpCLE1BQU1hLEVBQUksSUFBSWtvRCxHQUFHL29ELEVBQUdzRSxFQUFHN0MsS0FBS3czQyxHQUFJeDNDLEtBQUtzM0MsR0FBSXg0QyxHQUN6QyxPQUFPa0IsS0FBS3MzQyxHQUFLdVAsS0FBTTdtRCxLQUFLdTNDLEdBQUt3UixLQUFNL29ELEtBQUt3M0MsR0FBSyxJQUFJNk8sR0FBRzlPLEdBQUtuNEMsRUFPakUsR0FBR2IsRUFBR3NFLEdBQ0YsSUFBSzdDLEtBQUtxNEMsR0FBRzk1QyxHQUFJLE9BQ2pCLE1BQU1PLEVBQUlrQixLQUFLczVDLEdBQUcvNkMsRUFBR3NFLEVBQUVqRSxLQUFPLEVBQW1CLEVBQ2pEb0IsS0FBS280QyxHQUFHNzVDLEdBQUcyM0MsRUFBRXJ6QyxFQUFFakUsSUFBS0UsR0FBSWtCLEtBQUtzM0MsR0FBS3QzQyxLQUFLczNDLEdBQUd3TixPQUFPamlELEVBQUVqRSxJQUFLaUUsR0FBSTdDLEtBQUt1M0MsR0FBS3YzQyxLQUFLdTNDLEdBQUd1TixPQUFPamlELEVBQUVqRSxJQUFLb0IsS0FBSzA1QyxHQUFHNzJDLEVBQUVqRSxLQUFLd2xCLElBQUk3bEIsSUFVbkgsR0FBR0EsRUFBR3NFLEVBQUcvRCxHQUNMLElBQUtrQixLQUFLcTRDLEdBQUc5NUMsR0FBSSxPQUNqQixNQUFNYSxFQUFJWSxLQUFLbzRDLEdBQUc3NUMsR0FDbEJ5QixLQUFLczVDLEdBQUcvNkMsRUFBR3NFLEdBQUt6RCxFQUFFODJDLEVBQUVyekMsRUFBRyxHQUd2QnpELEVBQUVnM0MsRUFBRXZ6QyxHQUFJN0MsS0FBS3UzQyxHQUFLdjNDLEtBQUt1M0MsR0FBR3VOLE9BQU9qaUQsRUFBRzdDLEtBQUswNUMsR0FBRzcyQyxHQUFHb3lCLE9BQU8xMkIsSUFBS08sSUFBTWtCLEtBQUtzM0MsR0FBS3QzQyxLQUFLczNDLEdBQUd3TixPQUFPamlELEVBQUcvRCxJQUVqRyxhQUFhUCxHQUNUeUIsS0FBS2szQyxHQUFHamlCLE9BQU8xMkIsR0FNWixHQUFHQSxHQUNOLE1BQU1zRSxFQUFJN0MsS0FBS280QyxHQUFHNzVDLEdBQUdrM0MsSUFDckIsT0FBT3oxQyxLQUFLNjJDLEdBQUd3Uyx1QkFBdUI5cUQsR0FBRzIyQixLQUFPcnlCLEVBQUVtbEQsZUFBZTl5QixLQUFPcnlCLEVBQUVxbEQsaUJBQWlCaHpCLEtBS3hGLEVBQUUzMkIsR0FDTHlCLEtBQUtvNEMsR0FBRzc1QyxHQUFHKzNDLElBRWYsR0FBRy8zQyxHQUNDLElBQUlzRSxFQUFJN0MsS0FBS2szQyxHQUFHaDVDLElBQUlLLEdBQ3BCLE9BQU9zRSxJQUFNQSxFQUFJLElBQUk4bEQsR0FBSTNvRCxLQUFLazNDLEdBQUdub0MsSUFBSXhRLEVBQUdzRSxJQUFLQSxFQUVqRCxHQUFHdEUsR0FDQyxJQUFJc0UsRUFBSTdDLEtBQUt1M0MsR0FBR3I1QyxJQUFJSyxHQUNwQixPQUFPc0UsSUFBTUEsRUFBSSxJQUFJd2pELEdBQUc5TyxHQUFLdjNDLEtBQUt1M0MsR0FBS3YzQyxLQUFLdTNDLEdBQUd1TixPQUFPdm1ELEVBQUdzRSxJQUFLQSxFQU0zRCxHQUFHdEUsR0FDTixNQUFNc0UsRUFBSSxPQUFTN0MsS0FBSys0QyxHQUFHeDZDLEdBQzNCLE9BQU9zRSxHQUFLNndDLEVBQUUsd0JBQXlCLDJCQUE0Qm4xQyxHQUFJc0UsRUFLcEUsR0FBR3RFLEdBQ04sTUFBTXNFLEVBQUk3QyxLQUFLazNDLEdBQUdoNUMsSUFBSUssR0FDdEIsT0FBT3NFLEdBQUtBLEVBQUV3eEMsRUFBSSxLQUFPcjBDLEtBQUs2MkMsR0FBRytDLEdBQUdyN0MsR0FNakMsR0FBR0EsR0FDTnlCLEtBQUtrM0MsR0FBR25vQyxJQUFJeFEsRUFBRyxJQUFJb3FELElBQ25CM29ELEtBQUs2MkMsR0FBR3dTLHVCQUF1QjlxRCxHQUFHNEssUUFBU3RHLElBQ3ZDN0MsS0FBSyszQyxHQUFHeDVDLEVBQUdzRSxFQUF3QixRQU1wQyxHQUFHdEUsRUFBR3NFLEdBQ1QsT0FBTzdDLEtBQUs2MkMsR0FBR3dTLHVCQUF1QjlxRCxHQUFHZ3RCLElBQUkxb0IsSUFJckQsU0FBU2ttRCxLQUNMLE9BQU8sSUFBSXJFLEdBQUc3SixHQUFHcEMsWUFHckIsU0FBU21RLEtBQ0wsT0FBTyxJQUFJbEUsR0FBRzdKLEdBQUdwQzs7Ozs7Ozs7Ozs7Ozs7OztHQWtCakIsTUFBTTZRLEdBQ0ksQ0FDTkMsSUFBSyxZQUNMQyxLQUFNLGNBR1JDLEdBQ1EsQ0FDTixJQUFLLFlBQ0wsS0FBTSxxQkFDTixJQUFLLGVBQ0wsS0FBTSx3QkFDTixLQUFNLFFBQ04sS0FBTSxZQUNOLGlCQUFrQixpQkFDbEJDLEdBQUksS0FDSixTQUFVLFNBQ1YscUJBQXNCLHNCQW1COUIsTUFBTUMsR0FDRixZQUFZcHJELEVBQUdzRSxHQUNYN0MsS0FBSzRwRCxXQUFhcnJELEVBQUd5QixLQUFLc3pDLEVBQUl6d0MsR0FPdEMsU0FBU2duRCxHQUFHdHJELEVBQUdzRSxHQUNYLE9BQUl0RSxFQUFFKzBDLEVBQ0ssR0FBRyxJQUFJbHdDLEtBQUssSUFBTVAsRUFBRWlSLFNBQVNnMkMsY0FBY3BuRCxRQUFRLFFBQVMsSUFBSUEsUUFBUSxJQUFLLFFBQVEsWUFBY0csRUFBRSswQyxhQUFhenBDLE9BQU8sTUFFN0gsQ0FDSDJGLFFBQVMsR0FBS2pSLEVBQUVpUixRQUNoQjZsQyxNQUFPOTJDLEVBQUUrMEMsYUFTakIsU0FBU21TLEdBQUd4ckQsRUFBR3NFLEdBQ1gsT0FBT3RFLEVBQUUrMEMsRUFBSXp3QyxFQUFFcTVDLFdBQWFyNUMsRUFBRW1uRCxlQUs5QixTQUFTQyxHQUFHMXJELEVBQUdzRSxHQUNmLE9BQU9nbkQsR0FBR3RyRCxFQUFHc0UsRUFBRXFuRCxlQUduQixTQUFTQyxHQUFHNXJELEdBQ1IsT0FBTzIxQyxJQUFJMzFDLEdBQUl3NUMsRUFBR3FTLGNBQWMsU0FBUzdyRCxHQUNyQyxNQUFNc0UsRUFBSTYyQyxFQUFHbjdDLEdBQ2IsT0FBTyxJQUFJbzVDLEVBQUc5MEMsRUFBRWlSLFFBQVNqUixFQUFFODJDLE9BRkMsQ0FHOUJwN0MsSUFHTixTQUFTOHJELEdBQUc5ckQsRUFBR3NFLEdBQ1gsT0FBTyxTQUFTdEUsR0FDWixPQUFPLElBQUlxNkMsRUFBRyxDQUFFLFdBQVlyNkMsRUFBRTBGLFVBQVcsWUFBYTFGLEVBQUU4OUMsV0FEckQsQ0FFTDk5QyxHQUFHOCtDLE1BQU0sYUFBYUEsTUFBTXg2QyxHQUFHaTJDLGtCQUdyQyxTQUFTd1IsR0FBRy9yRCxHQUNSLE1BQU1zRSxFQUFJKzFDLEVBQUdrQyxXQUFXdjhDLEdBQ3hCLE9BQU8yMUMsRUFBRXFXLEdBQUcxbkQsSUFBS0EsRUFHckIsU0FBUzJuRCxHQUFHanNELEVBQUdzRSxHQUNYLE9BQU93bkQsR0FBRzlyRCxFQUFFcXJELFdBQVkvbUQsRUFBRWtOLE1BRzlCLFNBQVMwNkMsR0FBR2xzRCxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSXdyRCxHQUFHem5ELEdBQ2IsR0FBSS9ELEVBQUVaLElBQUksS0FBT0ssRUFBRXFyRCxXQUFXM2xELFVBQVcsTUFBTSxJQUFJcXhDLEVBQUVqQixFQUFFSSxpQkFBa0Isb0RBQXNEMzFDLEVBQUVaLElBQUksR0FBSyxPQUFTSyxFQUFFcXJELFdBQVczbEQsV0FDaEssR0FBSW5GLEVBQUVaLElBQUksS0FBT0ssRUFBRXFyRCxXQUFXdk4sU0FBVSxNQUFNLElBQUkvRyxFQUFFakIsRUFBRUksaUJBQWtCLHFEQUF1RDMxQyxFQUFFWixJQUFJLEdBQUssT0FBU0ssRUFBRXFyRCxXQUFXdk4sVUFDaEssT0FBTyxJQUFJeEIsR0FBRzZQLEdBQUc1ckQsSUFHckIsU0FBUzZyRCxHQUFHcHNELEVBQUdzRSxHQUNYLE9BQU93bkQsR0FBRzlyRCxFQUFFcXJELFdBQVkvbUQsR0FHNUIsU0FBUytuRCxHQUFHcnNELEdBQ1IsTUFBTXNFLEVBQUl5bkQsR0FBRy9yRCxHQUtULE9BQU8sSUFBTXNFLEVBQUVyRCxPQUFTbzVDLEVBQUdvRSxZQUFjME4sR0FBRzduRCxHQUdwRCxTQUFTZ29ELEdBQUd0c0QsR0FDUixPQUFPLElBQUlxNkMsRUFBRyxDQUFFLFdBQVlyNkMsRUFBRXFyRCxXQUFXM2xELFVBQVcsWUFBYTFGLEVBQUVxckQsV0FBV3ZOLFdBQVl2RCxrQkFHOUYsU0FBUzRSLEdBQUduc0QsR0FDUixPQUFPMjFDLEVBQUUzMUMsRUFBRWlCLE9BQVMsR0FBSyxjQUFnQmpCLEVBQUVMLElBQUksSUFBS0ssRUFBRXc4QyxTQUFTLEdBR2EsU0FBU3I4QyxHQUFHSCxFQUFHc0UsRUFBRy9ELEdBQzlGLE1BQU8sQ0FDSGxCLEtBQU00c0QsR0FBR2pzRCxFQUFHc0UsR0FDWnMyQyxPQUFRcjZDLEVBQUVSLE1BQU0yN0MsU0FBU2QsUUFJakMsU0FBUzJSLEdBQUd2c0QsRUFBR3NFLEVBQUcvRCxHQUNkLE1BQU1NLEVBQUlxckQsR0FBR2xzRCxFQUFHc0UsRUFBRWpGLE1BQU9QLEVBQUk4c0QsR0FBR3RuRCxFQUFFOC9DLFlBQWF4a0QsRUFBSSxJQUFJeStDLEdBQUcsQ0FDdEQzQyxTQUFVLENBQ05kLE9BQVF0MkMsRUFBRXMyQyxVQUVkcjdDLEVBQUl3L0MsR0FBR3lOLGlCQUFpQjNyRCxFQUFHL0IsRUFBR2MsR0FDbEMsT0FBT1csR0FBS2hCLEVBQUV1bEQsMkJBQTRCdmtELEVBQUloQixFQUFFdWxELDJCQUE2QnZsRCxFQThFakYsU0FBU2t0RCxHQUFHenNELEVBQUdzRSxHQUNYLElBQUkvRCxFQUNKLEdBQUkrRCxhQUFhbWdELEdBQUlsa0QsRUFBSSxDQUNyQm1zRCxPQUFRdnNELEdBQUdILEVBQUdzRSxFQUFFakUsSUFBS2lFLEVBQUV2RSxhQUNuQixHQUFJdUUsYUFBYXNoRCxHQUFJcmxELEVBQUksQ0FDN0JtMkIsT0FBUXUxQixHQUFHanNELEVBQUdzRSxFQUFFakUsV0FDWixHQUFJaUUsYUFBYXlnRCxHQUFJeGtELEVBQUksQ0FDN0Jtc0QsT0FBUXZzRCxHQUFHSCxFQUFHc0UsRUFBRWpFLElBQUtpRSxFQUFFNkUsTUFDdkJ3akQsV0FBWUMsR0FBR3RvRCxFQUFFcWhELGdCQUNiLENBQ0osS0FBTXJoRCxhQUFhdWhELElBQUssT0FBTzljLElBQy9CeG9DLEVBQUksQ0FDQXloQyxPQUFRaXFCLEdBQUdqc0QsRUFBR3NFLEVBQUVqRSxNQUd4QixPQUFPaUUsRUFBRXFnRCxnQkFBZ0IxakQsT0FBUyxJQUFNVixFQUFFc3NELGlCQUFtQnZvRCxFQUFFcWdELGdCQUFnQjNzQyxJQUFLaFksR0FBSyxTQUFTQSxFQUFHc0UsR0FDakcsTUFBTS9ELEVBQUkrRCxFQUFFMC9DLFVBQ1osR0FBSXpqRCxhQUFhNGlELEdBQUksTUFBTyxDQUN4QjJKLFVBQVd4b0QsRUFBRXM2QyxNQUFNckUsa0JBQ25Cd1MsaUJBQWtCLGdCQUV0QixHQUFJeHNELGFBQWE4aUQsR0FBSSxNQUFPLENBQ3hCeUosVUFBV3hvRCxFQUFFczZDLE1BQU1yRSxrQkFDbkJ5UyxzQkFBdUIsQ0FDbkI1UCxPQUFRNzhDLEVBQUVzakQsV0FHbEIsR0FBSXRqRCxhQUFhZ2pELEdBQUksTUFBTyxDQUN4QnVKLFVBQVd4b0QsRUFBRXM2QyxNQUFNckUsa0JBQ25CMFMsbUJBQW9CLENBQ2hCN1AsT0FBUTc4QyxFQUFFc2pELFdBR2xCLEdBQUl0akQsYUFBYXFqRCxHQUFJLE1BQU8sQ0FDeEJrSixVQUFXeG9ELEVBQUVzNkMsTUFBTXJFLGtCQUNuQjJTLFVBQVczc0QsRUFBRXkwQyxHQUVqQixNQUFNak0sSUF0QitFLENBdUJ2RixFQUFHL29DLEtBQU9zRSxFQUFFMGdELGFBQWFtSSxTQUFXNXNELEVBQUU2c0QsZ0JBQWtCLFNBQVNwdEQsRUFBR3NFLEdBQ2xFLFlBQU8sSUFBV0EsRUFBRTgvQyxXQUFhLENBQzdCQSxXQUFZc0gsR0FBRzFyRCxFQUFHc0UsRUFBRTgvQyxrQkFDcEIsSUFBVzkvQyxFQUFFKy9DLE9BQVMsQ0FDdEJBLE9BQVEvL0MsRUFBRSsvQyxRQUNWdGIsSUFMa0QsQ0FNeEQvb0MsRUFBR3NFLEVBQUUwZ0QsZUFBZ0J6a0QsRUFHM0IsU0FBUzhzRCxHQUFHcnRELEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJK0QsRUFBRThvRCxnQkFBa0IsU0FBU3B0RCxHQUNuQyxZQUFPLElBQVdBLEVBQUVva0QsV0FBYUQsR0FBR0MsV0FBV3dILEdBQUc1ckQsRUFBRW9rRCxrQkFBZSxJQUFXcGtELEVBQUVxa0QsT0FBU0YsR0FBR0UsT0FBT3JrRCxFQUFFcWtELFFBQVVGLEdBQUdtSixPQUR4RixDQUU1QmhwRCxFQUFFOG9ELGlCQUFtQmpKLEdBQUdtSixPQUFRenNELEVBQUl5RCxFQUFFdW9ELGlCQUFtQnZvRCxFQUFFdW9ELGlCQUFpQjcwQyxJQUFLMVQsR0FBSyxTQUFTdEUsRUFBR3NFLEdBQ2hHLElBQUkvRCxFQUFJLEtBQ1IsR0FBSSxxQkFBc0IrRCxFQUFHcXhDLEVBQUUsaUJBQW1CcnhDLEVBQUV5b0Qsa0JBQW1CeHNELEVBQUksSUFBSTRpRCxRQUFTLEdBQUksMEJBQTJCNytDLEVBQUcsQ0FDdEgsTUFBTXRFLEVBQUlzRSxFQUFFMG9ELHNCQUFzQjVQLFFBQVUsR0FDNUM3OEMsRUFBSSxJQUFJOGlELEdBQUdyakQsUUFDUixHQUFJLHVCQUF3QnNFLEVBQUcsQ0FDbEMsTUFBTXRFLEVBQUlzRSxFQUFFMm9ELG1CQUFtQjdQLFFBQVUsR0FDekM3OEMsRUFBSSxJQUFJZ2pELEdBQUd2akQsT0FDUixjQUFlc0UsRUFBSS9ELEVBQUksSUFBSXFqRCxHQUFHNWpELEVBQUdzRSxFQUFFNG9ELFdBQWFua0IsSUFDdkQsTUFBTWxvQyxFQUFJNDVDLEVBQUc4UyxpQkFBaUJqcEQsRUFBRXdvRCxXQUNoQyxPQUFPLElBQUkvSSxHQUFHbGpELEVBQUdOLEdBVm1FLENBV3RGUCxFQUFHc0UsSUFBTyxHQUNaLEdBQUlBLEVBQUVvb0QsT0FBUSxDQUNWcG9ELEVBQUVvb0QsT0FBT3J0RCxLQUNULE1BQU1QLEVBQUlvdEQsR0FBR2xzRCxFQUFHc0UsRUFBRW9vRCxPQUFPcnRELE1BQU9PLEVBQUksSUFBSXkrQyxHQUFHLENBQ3ZDM0MsU0FBVSxDQUNOZCxPQUFRdDJDLEVBQUVvb0QsT0FBTzlSLFVBR3pCLEdBQUl0MkMsRUFBRXFvRCxXQUFZLENBQ2QsTUFBTTNzRCxFQUFJLFNBQVNBLEdBQ2YsTUFBTXNFLEVBQUl0RSxFQUFFd3RELFlBQWMsR0FDMUIsT0FBTyxJQUFJN1MsRUFBR3IyQyxFQUFFMFQsSUFBS2hZLEdBQUt5NkMsRUFBRzhTLGlCQUFpQnZ0RCxLQUZ4QyxDQUdSc0UsRUFBRXFvRCxZQUNKLE9BQU8sSUFBSTVILEdBQUdqbUQsRUFBR2MsRUFBR0ksRUFBR08sRUFBR00sR0FFOUIsT0FBTyxJQUFJNGpELEdBQUczbEQsRUFBR2MsRUFBR1csRUFBR00sR0FFM0IsR0FBSXlELEVBQUVveUIsT0FBUSxDQUNWLE1BQU03MUIsRUFBSXFyRCxHQUFHbHNELEVBQUdzRSxFQUFFb3lCLFFBQ2xCLE9BQU8sSUFBSWt2QixHQUFHL2tELEVBQUdOLEdBRXJCLEdBQUkrRCxFQUFFMDlCLE9BQVEsQ0FDVixNQUFNbmhDLEVBQUlxckQsR0FBR2xzRCxFQUFHc0UsRUFBRTA5QixRQUNsQixPQUFPLElBQUk2akIsR0FBR2hsRCxFQUFHTixHQUVyQixPQUFPd29DLElBaUJYLFNBQVMwa0IsR0FBR3p0RCxFQUFHc0UsR0FDWCxNQUFPLENBQ0hvcEQsVUFBVyxDQUFFdEIsR0FBR3BzRCxFQUFHc0UsRUFBRWtOLFFBSTdCLFNBQVNtOEMsR0FBRzN0RCxFQUFHc0UsR0FFWCxNQUFNL0QsRUFBSSxDQUNOcXRELGdCQUFpQixJQUNsQi9zRCxFQUFJeUQsRUFBRWtOLEtBQ1QsT0FBU2xOLEVBQUVrN0MsaUJBQW1Cai9DLEVBQUVzdEQsT0FBU3pCLEdBQUdwc0QsRUFBR2EsR0FBSU4sRUFBRXF0RCxnQkFBZ0J6M0IsS0FBTyxDQUFFLENBQzFFMjNCLGFBQWN4cEQsRUFBRWs3QyxnQkFDaEJ1TyxnQkFBZ0IsTUFDWnh0RCxFQUFFc3RELE9BQVN6QixHQUFHcHNELEVBQUdhLEVBQUUyOUMsV0FBWWorQyxFQUFFcXRELGdCQUFnQnozQixLQUFPLENBQUUsQ0FDOUQyM0IsYUFBY2p0RCxFQUFFeTlDLGlCQUVwQixNQUFNeC9DLEVBQUksU0FBU2tCLEdBQ2YsR0FBSSxJQUFNQSxFQUFFaUIsT0FBUSxPQUNwQixNQUFNcUQsRUFBSXRFLEVBQUVnWSxJQUFLaFksR0FFakIsU0FBU0EsR0FDTCxHQUFJLE9BQXFCQSxFQUFFbTdCLEdBQUksQ0FDM0IsR0FBSStpQixHQUFHbCtDLEVBQUVELE9BQVEsTUFBTyxDQUNwQml1RCxZQUFhLENBQ1RwUCxNQUFPcVAsR0FBR2p1RCxFQUFFNCtDLE9BQ1p6akIsR0FBSSxXQUdaLEdBQUk4aUIsR0FBR2orQyxFQUFFRCxPQUFRLE1BQU8sQ0FDcEJpdUQsWUFBYSxDQUNUcFAsTUFBT3FQLEdBQUdqdUQsRUFBRTQrQyxPQUNaempCLEdBQUksaUJBR1QsR0FBSSxPQUF5Qm43QixFQUFFbTdCLEdBQUksQ0FDdEMsR0FBSStpQixHQUFHbCtDLEVBQUVELE9BQVEsTUFBTyxDQUNwQml1RCxZQUFhLENBQ1RwUCxNQUFPcVAsR0FBR2p1RCxFQUFFNCtDLE9BQ1p6akIsR0FBSSxlQUdaLEdBQUk4aUIsR0FBR2orQyxFQUFFRCxPQUFRLE1BQU8sQ0FDcEJpdUQsWUFBYSxDQUNUcFAsTUFBT3FQLEdBQUdqdUQsRUFBRTQrQyxPQUNaempCLEdBQUksZ0JBSWhCLE1BQU8sQ0FDSCt5QixZQUFhLENBQ1R0UCxNQUFPcVAsR0FBR2p1RCxFQUFFNCtDLE9BQ1p6akIsR0FBSWd6QixHQUFHbnVELEVBQUVtN0IsSUFDVHA3QixNQUFPQyxFQUFFRCxRQWhDckIsQ0FtQ0VDLElBQ0YsT0FBSSxJQUFNc0UsRUFBRXJELE9BQWVxRCxFQUFFLEdBQ3RCLENBQ0g4cEQsZ0JBQWlCLENBQ2JqekIsR0FBSSxNQUNKdWtCLFFBQVNwN0MsSUE1Q1gsQ0ErQ1JBLEVBQUVvN0MsU0FDSjVnRCxJQUFNeUIsRUFBRXF0RCxnQkFBZ0JuaEIsTUFBUTN0QyxHQUNoQyxNQUFNYyxFQUFJLFNBQVNJLEdBQ2YsR0FBSSxJQUFNQSxFQUFFaUIsT0FDWixPQUFPakIsRUFBRWdZLElBQUtoWSxHQUVkLFNBQVNBLEdBQ0wsTUFBTyxDQUNINCtDLE1BQU9xUCxHQUFHanVELEVBQUU0K0MsT0FDWnlQLFVBQVdDLEdBQUd0dUQsRUFBRWlnRCxNQUh4QixDQUtFamdELElBVEksQ0FVUnNFLEVBQUVtN0MsU0FDSjcvQyxJQUFNVyxFQUFFcXRELGdCQUFnQm5PLFFBQVU3L0MsR0FDbEMsTUFBTUwsRUFBSSxTQUFTUyxFQUFHc0UsR0FDbEIsT0FBT3RFLEVBQUUrMEMsR0FBS2lILEdBQUcxM0MsR0FBS0EsRUFBSSxDQUN0QnZFLE1BQU91RSxHQUZMLENBT1R0RSxFQUFHc0UsRUFBRTYxQyxPQUNOLE9BQU8sT0FBUzU2QyxJQUFNZ0IsRUFBRXF0RCxnQkFBZ0J6VCxNQUFRNTZDLEdBQUkrRSxFQUFFcTdDLFVBQVlwL0MsRUFBRXF0RCxnQkFBZ0JqTyxRQUFVNE8sR0FBR2pxRCxFQUFFcTdDLFVBQ25HcjdDLEVBQUVzN0MsUUFBVXIvQyxFQUFFcXRELGdCQUFnQmhPLE1BQVEyTyxHQUFHanFELEVBQUVzN0MsUUFBU3IvQyxFQUd4RCxTQUFTaXVELEdBQUd4dUQsR0FDUixJQUFJc0UsRUFBSStuRCxHQUFHcnNELEVBQUU2dEQsUUFDYixNQUFNdHRELEVBQUlQLEVBQUU0dEQsZ0JBQWlCL3NELEVBQUlOLEVBQUU0MUIsS0FBTzUxQixFQUFFNDFCLEtBQUtsMUIsT0FBUyxFQUMxRCxJQUFJbkMsRUFBSSxLQUNSLEdBQUkrQixFQUFJLEVBQUcsQ0FDUDgwQyxFQUFFLElBQU05MEMsR0FDUixNQUFNYixFQUFJTyxFQUFFNDFCLEtBQUssR0FDakJuMkIsRUFBRSt0RCxlQUFpQmp2RCxFQUFJa0IsRUFBRTh0RCxhQUFleHBELEVBQUlBLEVBQUV3NkMsTUFBTTkrQyxFQUFFOHRELGNBRTFELElBQUlsdUQsRUFBSSxHQUNSVyxFQUFFa3NDLFFBQVU3c0MsRUFvRGhCLFNBQVM2dUQsRUFBR3p1RCxHQUNSLE9BQU9BLE9BQUksSUFBV0EsRUFBRWd1RCxZQUFjLENBQUVVLEdBQUcxdUQsU0FBTyxJQUFXQSxFQUFFa3VELFlBQWMsQ0FBRVMsR0FBRzN1RCxTQUFPLElBQVdBLEVBQUVvdUQsZ0JBQWtCcHVELEVBQUVvdUQsZ0JBQWdCMU8sUUFBUTFuQyxJQUFLaFksR0FBS3l1RCxFQUFHenVELElBQUs4cUMsT0FBTyxDQUFFOXFDLEVBQUdzRSxJQUFNdEUsRUFBRTR1RCxPQUFPdHFELElBQU95a0MsSUFBTSxHQXJENUwwbEIsQ0FBR2x1RCxFQUFFa3NDLFFBQ3JCLElBQUlsdEMsRUFBSSxHQUNSZ0IsRUFBRWsvQyxVQUFZbGdELEVBQUlnQixFQUFFay9DLFFBQVF6bkMsSUFBS2hZLEdBQUssU0FBU0EsR0FDM0MsT0FBTyxJQUFJcWhELEdBQUd3TixHQUFHN3VELEVBQUU0K0MsT0FFbkIsU0FBUzUrQyxHQUNMLE9BQVFBLEdBQ04sSUFBSyxZQUNILE1BQU8sTUFFVCxJQUFLLGFBQ0gsTUFBTyxPQUVULFFBQ0UsUUFUUixDQWFDQSxFQUFFcXVELFlBaEIrQixDQWlCcENydUQsS0FDRixJQUFJOEosRUFBSSxLQUNSdkosRUFBRTQ1QyxRQUFVcndDLEVBQUksU0FBUzlKLEdBQ3JCLElBQUlzRSxFQUNKLE9BQU9BLEVBQUksaUJBQW1CdEUsRUFBSUEsRUFBRUQsTUFBUUMsRUFBR2c4QyxHQUFHMTNDLEdBQUssS0FBT0EsRUFGbEQsQ0FHZC9ELEVBQUU0NUMsUUFDSixJQUFJaDdDLEVBQUksS0FDUm9CLEVBQUVvL0MsVUFBWXhnRCxFQUFJMnZELEdBQUd2dUQsRUFBRW8vQyxVQUN2QixJQUFJcDhDLEVBQUksS0FDUixPQUFPaEQsRUFBRXEvQyxRQUFVcjhDLEVBQUl1ckQsR0FBR3Z1RCxFQUFFcS9DLFFBQVM2QixHQUFHbjlDLEVBQUd4RixFQUFHUyxFQUFHSyxFQUFHa0ssRUFBRyxJQUFrQjNLLEVBQUdvRSxHQTRCaEYsU0FBU2dyRCxHQUFHdnVELEdBQ1IsTUFBTyxDQUNIb2hELE9BQVFwaEQsRUFBRW9oRCxPQUNWaEUsT0FBUXA5QyxFQUFFa2xCLFVBSWxCLFNBQVM0cEMsR0FBRzl1RCxHQUNSLE1BQU1zRSxJQUFNdEUsRUFBRW9oRCxPQUFRN2dELEVBQUlQLEVBQUVvOUMsUUFBVSxHQUN0QyxPQUFPLElBQUkrRCxHQUFHNWdELEVBQUcrRCxHQUlyQixTQUFTZ3FELEdBQUd0dUQsR0FDUixPQUFPK3FELEdBQUcvcUQsR0FHZCxTQUFTbXVELEdBQUdudUQsR0FDUixPQUFPa3JELEdBQUdsckQsR0FHZCxTQUFTaXVELEdBQUdqdUQsR0FDUixNQUFPLENBQ0g4c0QsVUFBVzlzRCxFQUFFdTZDLG1CQUlyQixTQUFTc1UsR0FBRzd1RCxHQUNSLE9BQU95NkMsRUFBRzhTLGlCQUFpQnZ0RCxFQUFFOHNELFdBR2pDLFNBQVM2QixHQUFHM3VELEdBQ1IsT0FBT3dnRCxHQUFHcGdELE9BQU95dUQsR0FBRzd1RCxFQUFFa3VELFlBQVl0UCxPQUFRLFNBQVM1K0MsR0FDL0MsT0FBUUEsR0FDTixJQUFLLFFBQ0gsTUFBTyxLQUVULElBQUssWUFDSCxNQUFPLEtBRVQsSUFBSyxlQUNILE1BQU8sSUFFVCxJQUFLLHdCQUNILE1BQU8sS0FFVCxJQUFLLFlBQ0gsTUFBTyxJQUVULElBQUsscUJBQ0gsTUFBTyxLQUVULElBQUssaUJBQ0gsTUFBTyxpQkFFVCxJQUFLLEtBQ0gsTUFBTyxLQUVULElBQUssU0FDSCxNQUFPLFNBRVQsSUFBSyxxQkFDSCxNQUFPLHFCQUVULFFBQ0UsT0FBTytvQyxLQWpDMkIsQ0FtQ3hDL29DLEVBQUVrdUQsWUFBWS95QixJQUFLbjdCLEVBQUVrdUQsWUFBWW51RCxPQUd2QyxTQUFTMnVELEdBQUcxdUQsR0FDUixPQUFRQSxFQUFFZ3VELFlBQVk3eUIsSUFDcEIsSUFBSyxTQUNILE1BQU03MkIsRUFBSXVxRCxHQUFHN3VELEVBQUVndUQsWUFBWXBQLE9BQzNCLE9BQU80QixHQUFHcGdELE9BQU9rRSxFQUFHLEtBQW1CLENBQ25DNDRDLFlBQWE2UixNQUduQixJQUFLLFVBQ0gsTUFBTXh1RCxFQUFJc3VELEdBQUc3dUQsRUFBRWd1RCxZQUFZcFAsT0FDM0IsT0FBTzRCLEdBQUdwZ0QsT0FBT0csRUFBRyxLQUFtQixDQUNuQzJnRCxVQUFXLGVBR2pCLElBQUssYUFDSCxNQUFNcmdELEVBQUlndUQsR0FBRzd1RCxFQUFFZ3VELFlBQVlwUCxPQUMzQixPQUFPNEIsR0FBR3BnRCxPQUFPUyxFQUFHLEtBQXVCLENBQ3ZDcThDLFlBQWE2UixNQUduQixJQUFLLGNBQ0gsTUFBTWp3RCxFQUFJK3ZELEdBQUc3dUQsRUFBRWd1RCxZQUFZcFAsT0FDM0IsT0FBTzRCLEdBQUdwZ0QsT0FBT3RCLEVBQUcsS0FBdUIsQ0FDdkNvaUQsVUFBVyxlQUdqQixRQUNFLE9BQU9uWSxLQUlmLFNBQVM2akIsR0FBRzVzRCxHQUNSLE1BQU1zRSxFQUFJLEdBQ1YsT0FBT3RFLEVBQUU0NkMsT0FBT2h3QyxRQUFTNUssR0FBS3NFLEVBQUV6QixLQUFLN0MsRUFBRXU2QyxvQkFBc0IsQ0FDekRpVCxXQUFZbHBELEdBSXBCLFNBQVMwbkQsR0FBR2hzRCxHQUVSLE9BQU9BLEVBQUVpQixRQUFVLEdBQUssYUFBZWpCLEVBQUVMLElBQUksSUFBTSxjQUFnQkssRUFBRUwsSUFBSTs7Ozs7Ozs7Ozs7Ozs7OztHQXNCN0UsU0FBU3F2RCxHQUFHaHZELEdBQ1IsSUFBSXNFLEVBQUksR0FDUixJQUFLLElBQUkvRCxFQUFJLEVBQUdBLEVBQUlQLEVBQUVpQixPQUFRVixJQUFLK0QsRUFBRXJELE9BQVMsSUFBTXFELEVBQUkycUQsR0FBRzNxRCxJQUFLQSxFQUFJNHFELEdBQUdsdkQsRUFBRUwsSUFBSVksR0FBSStELEdBQ2pGLE9BQU8ycUQsR0FBRzNxRCxHQUcyRCxTQUFTNHFELEdBQUdsdkQsRUFBR3NFLEdBQ3BGLElBQUkvRCxFQUFJK0QsRUFDUixNQUFNekQsRUFBSWIsRUFBRWlCLE9BQ1osSUFBSyxJQUFJcUQsRUFBSSxFQUFHQSxFQUFJekQsRUFBR3lELElBQUssQ0FDeEIsTUFBTXpELEVBQUliLEVBQUU0RCxPQUFPVSxHQUNuQixPQUFRekQsR0FDTixJQUFLLEtBQ0hOLEdBQUssS0FDTCxNQUVGLElBQUssSUFDSEEsR0FBSyxLQUNMLE1BRUYsUUFDRUEsR0FBS00sR0FHYixPQUFPTixFQUcyQyxTQUFTMHVELEdBQUdqdkQsR0FDOUQsT0FBT0EsRUFBSSxLQVFYLFNBQVNtdkQsR0FBR252RCxHQUdaLE1BQU1zRSxFQUFJdEUsRUFBRWlCLE9BQ1osR0FBSTAwQyxFQUFFcnhDLEdBQUssR0FBSSxJQUFNQSxFQUFHLE9BQU9xeEMsRUFBRSxNQUFRMzFDLEVBQUU0RCxPQUFPLElBQU0sTUFBUTVELEVBQUU0RCxPQUFPLElBQUt5MkMsRUFBR29FLFlBRzdFLE1BQU1sK0MsRUFBSStELEVBQUksRUFBR3pELEVBQUksR0FDekIsSUFBSS9CLEVBQUksR0FDUixJQUFLLElBQUljLEVBQUksRUFBR0EsRUFBSTBFLEdBQUssQ0FHckIsTUFBTUEsRUFBSXRFLEVBQUUrSCxRQUFRLElBQUtuSSxHQUV6QixRQURDMEUsRUFBSSxHQUFLQSxFQUFJL0QsSUFBTXdvQyxJQUNaL29DLEVBQUU0RCxPQUFPVSxFQUFJLElBQ25CLElBQUssSUFDSCxNQUFNL0QsRUFBSVAsRUFBRXNMLFVBQVUxTCxFQUFHMEUsR0FDekIsSUFBSS9FLEVBQ0osSUFBTVQsRUFBRW1DLE9BR1IxQixFQUFJZ0IsR0FBS3pCLEdBQUt5QixFQUFHaEIsRUFBSVQsRUFBR0EsRUFBSSxJQUFLK0IsRUFBRWdDLEtBQUt0RCxHQUN4QyxNQUVGLElBQUssSUFDSFQsR0FBS2tCLEVBQUVzTCxVQUFVMUwsRUFBRzBFLEdBQUl4RixHQUFLLEtBQzdCLE1BRUYsSUFBSyxJQUVIQSxHQUFLa0IsRUFBRXNMLFVBQVUxTCxFQUFHMEUsRUFBSSxHQUN4QixNQUVGLFFBQ0V5a0MsSUFFSm5wQyxFQUFJMEUsRUFBSSxFQUVaLE9BQU8sSUFBSSsxQyxFQUFHeDVDOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUNsQixNQUFNdXVELEdBQ0YsWUFBWXB2RCxFQUFHc0UsR0FDWDdDLEtBQUs4VCxRQUFVdlYsRUFBR3lCLEtBQUs0M0MsWUFBYy8wQyxHQVl6QyxNQUFNK3FELEdBQ04sWUFBWXJ2RCxFQUVac0UsRUFBRy9ELEdBQ0NrQixLQUFLNnRELFFBQVV0dkQsRUFBR3lCLEtBQUs4dEQsd0JBQTBCanJELEVBQUc3QyxLQUFLK3RELGlCQUFtQmp2RCxHQVVoRjh1RCxHQUFHSSxNQUFRLFFBS2ZKLEdBQUdodkQsSUFBTSxRQVFULE1BQU1xdkQsR0FDRixZQUlBMXZELEVBU0FzRSxFQVlBL0QsR0FDSWtCLEtBQUtrdUQsT0FBUzN2RCxFQUFHeUIsS0FBS211RCx3QkFBMEJ0ckQsRUFBRzdDLEtBQUtvdUQsZ0JBQWtCdHZELEdBSXRDbXZELEdBQUdELE1BQVEsaUJBRXZEQyxHQUFHdDFCLFFBQVUsU0FTYixNQUFNMDFCLEdBQ0YsWUFJQTl2RCxFQUlBc0UsRUFLQS9ELEVBYUFNLEVBTUEvQixHQUNJMkMsS0FBS2t1RCxPQUFTM3ZELEVBQUd5QixLQUFLc3VELFFBQVV6ckQsRUFBRzdDLEtBQUt1dUQsaUJBQW1CenZELEVBQUdrQixLQUFLd3VELGNBQWdCcHZELEVBQ25GWSxLQUFLeXVELFVBQVlweEQsR0FJbUJneEQsR0FBR0wsTUFBUSxZQUV2REssR0FBRzExQixRQUFVLFVBRWIwMUIsR0FBR0ssbUJBQXFCLHFCQUV4QkwsR0FBR00scUJBQXVCLENBQUUsU0FBVSxXQVN0QyxNQUFNQyxHQUNGLGVBSU8scUJBQXFCcndELEdBQ3hCLE1BQU8sQ0FBRUEsR0FLTixxQkFBcUJBLEVBQUdzRSxHQUMzQixNQUFPLENBQUV0RSxFQUFHZ3ZELEdBQUcxcUQsSUFLWixXQUFXdEUsRUFBR3NFLEVBQUcvRCxHQUNwQixNQUFPLENBQUVQLEVBQUdndkQsR0FBRzFxRCxHQUFJL0QsSUFJM0I4dkQsR0FBR1osTUFBUSxvQkFPWFksR0FBR0MsWUFBYyxJQUFJRCxHQU1yQixNQUFNRSxHQUNGLFlBQVl2d0QsRUFBR3NFLEdBQ1g3QyxLQUFLK1AsS0FBT3hSLEVBQUd5QixLQUFLK3VELFNBQVdsc0QsR0FPbkMsTUFBTW1zRCxHQUNOLFlBQVl6d0QsRUFBR3NFLEdBQ1g3QyxLQUFLK1AsS0FBT3hSLEVBQUd5QixLQUFLdzlDLFFBQVUzNkMsR0FnQmxDLE1BQU1vc0QsR0FNTixZQU1BMXdELEVBS0FzRSxFQUtBL0QsRUFPQU0sRUFLQS9CLEVBS0FjLEdBQ0k2QixLQUFLa3ZELGdCQUFrQjN3RCxFQUFHeUIsS0FBS212RCxXQUFhdHNELEVBQUc3QyxLQUFLb2pCLFNBQVd0a0IsRUFBR2tCLEtBQUs0OUMsc0JBQXdCeCtDLEVBQy9GWSxLQUFLK3VELFNBQVcxeEQsRUFBRzJDLEtBQUtvdkQsV0FBYWp4RCxHQUk3Qzh3RCxHQUFHakIsTUFBUSxrQkFPWGlCLEdBQUdJLGNBQWdCLGdCQUFpQkosR0FBR0ssa0JBQW9CLFdBUTNETCxHQUFHTSx3QkFBMEIsMEJBQTJCTixHQUFHTyw0QkFBOEIsQ0FBRSxhQUFjLFlBS3pHLE1BQU1DLEdBS0YsWUFBWWx4RCxHQUNSeUIsS0FBSzB2RCxTQUFXbnhELEdBSXhCa3hELEdBQUd6QixNQUFRLHVCQUF3QnlCLEdBQUc3d0QsSUFBTSwwQkFXNUMsTUFBTSt3RCxHQUNGLFlBU0FweEQsRUFJQXNFLEVBTUEvRCxFQWtCQU0sRUFlQS9CLEVBTUFjLEVBUUFMLEdBQ0lrQyxLQUFLc29ELFNBQVcvcEQsRUFBR3lCLEtBQUs0dkQsWUFBYy9zRCxFQUFHN0MsS0FBSyt1RCxTQUFXandELEVBQUdrQixLQUFLOG5ELFlBQWMxb0QsRUFDL0VZLEtBQUs2dkQseUJBQTJCeHlELEVBQUcyQyxLQUFLOHZELDZCQUErQjN4RCxFQUFHNkIsS0FBS21SLE1BQVFyVCxHQUkvRjZ4RCxHQUFHM0IsTUFBUSxVQUVYMkIsR0FBR2gzQixRQUFVLFdBRWJnM0IsR0FBR0ksc0JBQXdCLG9CQU0zQkosR0FBR0ssb0JBQXNCLENBQUUsY0FBZSxZQVkxQyxNQUFNQyxHQUNGLFlBSUExeEQsRUFJQXNFLEVBTUEvRCxHQUNJa0IsS0FBS3NvRCxTQUFXL3BELEVBQUd5QixLQUFLK1AsS0FBT2xOLEVBQUc3QyxLQUFLa3dELGVBQWlCcHhELEdBSXBCbXhELEdBQUdqQyxNQUFRLGtCQUV2RGlDLEdBQUd0M0IsUUFBVSxDQUFFLFdBQVksUUFFM0JzM0IsR0FBR0UscUJBQXVCLHVCQUUxQkYsR0FBR0csdUJBQXlCLENBQUUsT0FBUSxZQVF0QyxNQUFNQyxHQUNGLFlBTUE5eEQsRUFNQXNFLEVBU0EvRCxFQUlBTSxHQUNJWSxLQUFLc3dELGdCQUFrQi94RCxFQUFHeUIsS0FBS3V3RCw0QkFBOEIxdEQsRUFBRzdDLEtBQUt3d0QsMEJBQTRCMXhELEVBQ2pHa0IsS0FBS3l3RCxZQUFjcnhELEdBT3ZCaXhELEdBQUd6eEQsSUFBTSxrQkFBbUJ5eEQsR0FBR3JDLE1BQVEsZUFRM0MsTUFBTTBDLEdBQ0YsWUFJQW55RCxFQUtBc0UsR0FDSTdDLEtBQUtxc0QsYUFBZTl0RCxFQUFHeUIsS0FBS29zRCxPQUFTdnBELEdBSUY2dEQsR0FBRzFDLE1BQVEsb0JBRXREMEMsR0FBRy8zQixRQUFVLENBQUUsZUFBZ0IsVUFRL0IsTUFBTWc0QixHQUNGLFlBSUFweUQsRUFFQXNFLEVBRUEvRCxFQUVBTSxHQUNJWSxLQUFLNHdELFNBQVdyeUQsRUFBR3lCLEtBQUs2d0QsYUFBZWh1RCxFQUFHN0MsS0FBSzh3RCxlQUFpQmh5RCxFQUFHa0IsS0FBSyt3RCxhQUFlM3hELEdBSXBEdXhELEdBQUczQyxNQUFRLGlCQUV0RDJDLEdBQUdoNEIsUUFBVSxXQUtiLE1BQU1xNEIsR0FDRixZQUVBenlELEVBRUFzRSxFQUVBL0QsR0FDSWtCLEtBQUtvdEIsU0FBVzd1QixFQUFHeUIsS0FBS2l4RCxXQUFhcHVELEVBQUc3QyxLQUFLdzlDLFFBQVUxK0MsR0FJcEJreUQsR0FBR2hELE1BQVEsVUFBV2dELEdBQUdyNEIsUUFBVSxXQUs5RSxNQUFNdTRCLEdBQ0YsWUFFQTN5RCxFQUVBc0UsRUFFQS9ELEdBQ0lrQixLQUFLcEMsS0FBT1csRUFBR3lCLEtBQUsrdUQsU0FBV2xzRCxFQUFHN0MsS0FBS214RCxhQUFlcnlELEdBSW5Cb3lELEdBQUdsRCxNQUFRLGVBQWdCa0QsR0FBR3Y0QixRQUFVLE9BR25GLE1BQU15NEIsR0FBSyxDQUFzQm5ELEdBQUdELE1BQU9LLEdBQUdMLE1BQU9ZLEdBQUdaLE1BQU9pQixHQUFHakIsTUFBTzJCLEdBQUczQixNQUFPSixHQUFHSSxNQUFPcUMsR0FBR3JDLE1BQU9pQyxHQUFHakMsTUFBUzJDLEdBQUczQyxNQUFTeUIsR0FBR3pCLE1BQVMwQyxHQUFHMUMsTUFBU2dELEdBQUdoRCxNQUFPa0QsR0FBR2xELE9BQVNxRCxHQUFLLDRIQVlsTCxNQUFNQyxHQUNGLGNBQ0l0eEQsS0FBS3V4RCxxQkFBdUIsR0FFaEMsdUJBQXVCaHpELEdBQ25CeUIsS0FBS3V4RCxxQkFBcUJud0QsS0FBSzdDLEdBRW5DLHdCQUNJeUIsS0FBS3V4RCxxQkFBcUJwb0QsUUFBUzVLLEdBQUtBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0M1QyxNQUFNaXpELEdBQ04sWUFBWWp6RCxHQUdSeUIsS0FBS3l4RCxhQUFlLEtBQU16eEQsS0FBSzB4RCxjQUFnQixLQUUvQzF4RCxLQUFLa2dCLFlBQVMsRUFBUWxnQixLQUFLK0MsV0FBUSxFQUFRL0MsS0FBSzJ4RCxRQUFTLEVBR3pEM3hELEtBQUs0eEQsa0JBQW1CLEVBQUlyekQsRUFBR0EsSUFDM0J5QixLQUFLMnhELFFBQVMsRUFBSTN4RCxLQUFLa2dCLE9BQVMzaEIsRUFBR3lCLEtBQUt5eEQsY0FHeEN6eEQsS0FBS3l4RCxhQUFhbHpELElBQ2pCQSxJQUNEeUIsS0FBSzJ4RCxRQUFTLEVBQUkzeEQsS0FBSytDLE1BQVF4RSxFQUFHeUIsS0FBSzB4RCxlQUFpQjF4RCxLQUFLMHhELGNBQWNuekQsS0FHbkYsTUFBTUEsR0FDRixPQUFPeUIsS0FBSzRLLFVBQUssRUFBUXJNLEdBRTdCLEtBQUtBLEVBQUdzRSxHQUNKLE9BQU83QyxLQUFLNHhELGtCQUFvQnRxQixJQUFLdG5DLEtBQUs0eEQsa0JBQW1CLEVBQUk1eEQsS0FBSzJ4RCxPQUFTM3hELEtBQUsrQyxNQUFRL0MsS0FBSzZ4RCxZQUFZaHZELEVBQUc3QyxLQUFLK0MsT0FBUy9DLEtBQUs4eEQsWUFBWXZ6RCxFQUFHeUIsS0FBS2tnQixRQUFVLElBQUlzeEMsR0FBRyxDQUFFMXlELEVBQUdNLEtBQ3pLWSxLQUFLeXhELGFBQWU1dUQsSUFDaEI3QyxLQUFLOHhELFlBQVl2ekQsRUFBR3NFLEdBQUcrSCxLQUFLOUwsRUFBR00sSUFDaENZLEtBQUsweEQsY0FBZ0JuekQsSUFDcEJ5QixLQUFLNnhELFlBQVlodkQsRUFBR3RFLEdBQUdxTSxLQUFLOUwsRUFBR00sTUFJM0MsWUFDSSxPQUFPLElBQUl3RSxRQUFRLENBQUVyRixFQUFHc0UsS0FDcEI3QyxLQUFLNEssS0FBS3JNLEVBQUdzRSxLQUdyQixpQkFBaUJ0RSxHQUNiLElBQ0ksTUFBTXNFLEVBQUl0RSxJQUNWLE9BQU9zRSxhQUFhMnVELEdBQUszdUQsRUFBSTJ1RCxHQUFHOXRELFFBQVFiLEdBQzFDLE1BQU90RSxHQUNMLE9BQU9pekQsR0FBRy90RCxPQUFPbEYsSUFHekIsWUFBWUEsRUFBR3NFLEdBQ1gsT0FBT3RFLEVBQUl5QixLQUFLK3hELGlCQUFpQixJQUFPeHpELEVBQUVzRSxJQUFPMnVELEdBQUc5dEQsUUFBUWIsR0FFaEUsWUFBWXRFLEVBQUdzRSxHQUNYLE9BQU90RSxFQUFJeUIsS0FBSyt4RCxpQkFBaUIsSUFBT3h6RCxFQUFFc0UsSUFBTzJ1RCxHQUFHL3RELE9BQU9aLEdBRS9ELGVBQWV0RSxHQUNYLE9BQU8sSUFBSWl6RCxHQUFHLENBQUUzdUQsRUFBRy9ELEtBQ2YrRCxFQUFFdEUsS0FHVixjQUFjQSxHQUNWLE9BQU8sSUFBSWl6RCxHQUFHLENBQUUzdUQsRUFBRy9ELEtBQ2ZBLEVBQUVQLEtBR1YsZUFHQUEsR0FDSSxPQUFPLElBQUlpekQsR0FBRyxDQUFFM3VELEVBQUcvRCxLQUNmLElBQUlNLEVBQUksRUFBRy9CLEVBQUksRUFBR2MsR0FBSSxFQUN0QkksRUFBRTRLLFFBQVM1SyxNQUNMYSxFQUFHYixFQUFFcU0sS0FBSyxPQUNOdk4sRUFBR2MsR0FBS2QsSUFBTStCLEdBQUt5RCxLQUNwQnRFLEdBQUtPLEVBQUVQLE1BQ1hKLEdBQUksRUFBSWQsSUFBTStCLEdBQUt5RCxNQVF6QixVQUFVdEUsR0FDYixJQUFJc0UsRUFBSTJ1RCxHQUFHOXRELFNBQVEsR0FDbkIsSUFBSyxNQUFNNUUsS0FBS1AsRUFBR3NFLEVBQUlBLEVBQUUrSCxLQUFNck0sR0FBS0EsRUFBSWl6RCxHQUFHOXRELFFBQVFuRixHQUFLTyxLQUN4RCxPQUFPK0QsRUFFWCxlQUFldEUsRUFBR3NFLEdBQ2QsTUFBTS9ELEVBQUksR0FDVixPQUFPUCxFQUFFNEssUUFBUSxDQUFFNUssRUFBR2EsS0FDbEJOLEVBQUVzQyxLQUFLeUIsRUFBRXJGLEtBQUt3QyxLQUFNekIsRUFBR2EsTUFDdEJZLEtBQUtneUQsUUFBUWx6RDs7Ozs7Ozs7Ozs7Ozs7OztHQTBCMUIsTUFBTW16RCxHQUNGLFlBQVkxekQsRUFBR3NFLEdBQ1g3QyxLQUFLNGhCLE9BQVNyakIsRUFBR3lCLEtBQUtzNEIsWUFBY3oxQixFQUFHN0MsS0FBS2t5RCxTQUFVLEVBSXREbHlELEtBQUs2NUMsR0FBSyxJQUFJdEUsRUFBR3YxQyxLQUFLczRCLFlBQVk2NUIsV0FBYSxLQUMzQ255RCxLQUFLNjVDLEdBQUduMkMsV0FDVDFELEtBQUtzNEIsWUFBWTg1QixRQUFVLEtBQzFCdnZELEVBQUVFLE1BQVEvQyxLQUFLNjVDLEdBQUdwMkMsT0FBTyxJQUFJNHVELEdBQUc5ekQsRUFBR3NFLEVBQUVFLFFBQVUvQyxLQUFLNjVDLEdBQUduMkMsV0FDeEQxRCxLQUFLczRCLFlBQVltRCxRQUFVNTRCLElBQzFCLE1BQU0vRCxFQUFJd3pELEdBQUd6dkQsRUFBRUksT0FBT0YsT0FDdEIvQyxLQUFLNjVDLEdBQUdwMkMsT0FBTyxJQUFJNHVELEdBQUc5ekQsRUFBR08sS0FHakMsWUFBWVAsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqQixJQUNJLE9BQU8sSUFBSTZ5RCxHQUFHcHZELEVBQUd0RSxFQUFFKzVCLFlBQVlsNUIsRUFBR04sSUFDcEMsTUFBT1AsR0FDTCxNQUFNLElBQUk4ekQsR0FBR3h2RCxFQUFHdEUsSUFHeEIsU0FDSSxPQUFPeUIsS0FBSzY1QyxHQUFHbDJDLFFBRW5CLE1BQU1wRixHQUNGQSxHQUFLeUIsS0FBSzY1QyxHQUFHcDJDLE9BQU9sRixHQUFJeUIsS0FBS2t5RCxVQUFZeGUsRUFBRSxXQUFZLHdCQUF5Qm4xQyxFQUFJQSxFQUFFMEksUUFBVSwwQkFDaEdqSCxLQUFLa3lELFNBQVUsRUFBSWx5RCxLQUFLczRCLFlBQVlpNkIsU0FVakMsTUFBTWgwRCxHQUNULE1BQU1zRSxFQUFJN0MsS0FBS3M0QixZQUFZQyxZQUFZaDZCLEdBQ3ZDLE9BQU8sSUFBSWkwRCxHQUFHM3ZELElBVWxCLE1BQU00dkQsR0FVTixZQUFZbDBELEVBQUdzRSxFQUFHL0QsR0FDZGtCLEtBQUtwQyxLQUFPVyxFQUFHeUIsS0FBS3c5QyxRQUFVMzZDLEVBQUc3QyxLQUFLMHlELEdBQUs1ekQsRUFLM0MsT0FBUzJ6RCxHQUFHclksR0FBRyxnQkFBWXRHLEVBQUUsZ01BRVMsY0FBY3YxQyxHQUNwRCxPQUFPbTFDLEVBQUUsV0FBWSxxQkFBc0JuMUMsR0FBSW8wRCxHQUFHcHRELE9BQU91QixVQUFVK3hCLGVBQWV0NkIsSUFBSXU2QixZQUViLFlBQ3pFLElBQUssY0FBd0IsT0FBTyxFQUNwQyxHQUFJMjVCLEdBQUdqWSxLQUFNLE9BQU8sRUFRWixNQUFNajhDLEVBQUksY0FBU3NFLEVBQUk0dkQsR0FBR3JZLEdBQUc3N0MsR0FBSU8sRUFBSSxFQUFJK0QsR0FBS0EsRUFBSSxHQUFJekQsRUFBSXF6RCxHQUFHaFksR0FBR2w4QyxHQUFJbEIsRUFBSSxFQUFJK0IsR0FBS0EsRUFBSSxJQVNyRixRQUFTYixFQUFFK0gsUUFBUSxTQUFXLEdBQUsvSCxFQUFFK0gsUUFBUSxZQUFjLEdBQUsvSCxFQUFFK0gsUUFBUSxTQUFXLEdBQUt4SCxHQUFLekIsR0FLcEcsWUFDSCxJQUFJa0IsRUFDSixZQUFPLElBQXNCcUgsR0FBVyxTQUFXLFFBQVVySCxFQUFJcUgsRUFBUWd0RCxXQUFRLElBQVdyMEQsT0FBSSxFQUFTQSxFQUFFczhDLElBRTdDLFVBQVV0OEMsRUFBR3NFLEdBQzNFLE9BQU90RSxFQUFFeXZELE1BQU1uckQsR0FJbkIsVUFBVXRFLEdBQ04sTUFBTXNFLEVBQUl0RSxFQUFFcWYsTUFBTSxtQ0FBb0M5ZSxFQUFJK0QsRUFBSUEsRUFBRSxHQUFHMEcsTUFBTSxLQUFLNEUsTUFBTSxFQUFHLEdBQUc5TSxLQUFLLEtBQU8sS0FDdEcsT0FBT3FTLE9BQU81VSxHQUlsQixVQUFVUCxHQUNOLE1BQU1zRSxFQUFJdEUsRUFBRXFmLE1BQU0scUJBQXNCOWUsRUFBSStELEVBQUlBLEVBQUUsR0FBRzBHLE1BQU0sS0FBSzRFLE1BQU0sRUFBRyxHQUFHOU0sS0FBSyxLQUFPLEtBQ3hGLE9BQU9xUyxPQUFPNVUsR0FJWCxTQUFTUCxHQUNaLE9BQU95QixLQUFLbzRCLEtBQU9zYixFQUFFLFdBQVksb0JBQXFCMXpDLEtBQUtwQyxNQUFPb0MsS0FBS280QixTQUFXLElBQUl4MEIsUUFBUSxDQUFFZixFQUFHL0QsS0FNL0YsTUFBTU0sRUFBSTBILFVBQVUyeEIsS0FBS3o0QixLQUFLcEMsS0FBTW9DLEtBQUt3OUMsU0FDekNwK0MsRUFBRXl6RCxVQUFZdDBELElBQ1YsTUFBTU8sRUFBSVAsRUFBRTBFLE9BQU9pZCxPQUNuQnJkLEVBQUUvRCxJQUNITSxFQUFFMHpELFVBQVksS0FDYmgwRCxFQUFFLElBQUl1ekQsR0FBRzl6RCxFQUFHLHNJQUNiYSxFQUFFcThCLFFBQVU1NEIsSUFDWCxNQUFNekQsRUFBSXlELEVBQUVJLE9BQU9GLE1BQ25CLGlCQUFtQjNELEVBQUV4QixLQUFPa0IsRUFBRSxJQUFJdzJDLEVBQUVqQixFQUFFVSxvQkFBcUIseVZBQTJWLHNCQUF3QjMxQyxFQUFFeEIsS0FBT2tCLEVBQUUsSUFBSXcyQyxFQUFFakIsRUFBRVUsb0JBQXFCLDZLQUErSzMxQyxJQUFNTixFQUFFLElBQUl1ekQsR0FBRzl6RCxFQUFHYSxLQUN4cEJBLEVBQUUyekQsZ0JBQWtCeDBELElBQ25CbTFDLEVBQUUsV0FBWSxhQUFlMXpDLEtBQUtwQyxLQUFPLG1DQUFvQ1csRUFBRXkwRCxZQUMvRSxNQUFNbndELEVBQUl0RSxFQUFFMEUsT0FBT2lkLE9BQ25CbGdCLEtBQUsweUQsR0FBRzlXLEdBQUcvNEMsRUFBR3pELEVBQUVrNUIsWUFBYS81QixFQUFFeTBELFdBQVloekQsS0FBS3c5QyxTQUFTNXlDLEtBQUssS0FDMUQ4b0MsRUFBRSxXQUFZLCtCQUFpQzF6QyxLQUFLdzlDLFFBQVUsbUJBR3BFeDlDLEtBQUs2N0MsS0FBTzc3QyxLQUFLbzRCLEdBQUc2NkIsZ0JBQWtCMTBELEdBQUt5QixLQUFLNjdDLEdBQUd0OUMsSUFBS3lCLEtBQUtvNEIsR0FFdkUsR0FBRzc1QixHQUNDeUIsS0FBSzY3QyxHQUFLdDlDLEVBQUd5QixLQUFLbzRCLEtBQU9wNEIsS0FBS280QixHQUFHNjZCLGdCQUFrQnB3RCxHQUFLdEUsRUFBRXNFLElBRTlELHFCQUFxQnRFLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDMUIsTUFBTS9CLEVBQUksYUFBZXdGLEVBQ3pCLElBQUkxRSxFQUFJLEVBQ1IsT0FBUyxHQUNIQSxFQUNGLElBQ0k2QixLQUFLbzRCLFNBQVdwNEIsS0FBS2k3QyxHQUFHMThDLEdBQ3hCLE1BQU1zRSxFQUFJb3ZELEdBQUd4NUIsS0FBS3o0QixLQUFLbzRCLEdBQUk3NUIsRUFBR2xCLEVBQUksV0FBYSxZQUFheUIsR0FBSVgsRUFBSWlCLEVBQUV5RCxHQUFHaUIsTUFBT3ZGLElBRWhGc0UsRUFBRTB2RCxNQUFNaDBELEdBQUlpekQsR0FBRy90RCxPQUFPbEYsS0FBTXU2QixZQUc1QixPQUFPMzZCLEVBQUUyRixNQUFNLGNBSVRqQixFQUFFbTNDLEdBQUk3N0MsRUFDZCxNQUFPSSxHQU1MLE1BQU1zRSxFQUFJLGtCQUFvQnRFLEVBQUVYLE1BQVFPLEVBQUksRUFDNUMsR0FBSXUxQyxFQUFFLFdBQVksaUNBQWtDbjFDLEVBQUUwSSxRQUFTLFlBQWFwRSxHQUM1RTdDLEtBQUs2SyxTQUFVaEksRUFBRyxPQUFPZSxRQUFRSCxPQUFPbEYsS0FJcEQsUUFDSXlCLEtBQUtvNEIsSUFBTXA0QixLQUFLbzRCLEdBQUd2dEIsUUFBUzdLLEtBQUtvNEIsUUFBSyxHQVExQyxNQUFNODZCLEdBQ04sWUFBWTMwRCxHQUNSeUIsS0FBS2c4QyxHQUFLejlDLEVBQUd5QixLQUFLaThDLElBQUssRUFBSWo4QyxLQUFLbzhDLEdBQUssS0FFekMsYUFDSSxPQUFPcDhDLEtBQUtpOEMsR0FFaEIsU0FDSSxPQUFPajhDLEtBQUtvOEMsR0FFaEIsV0FBVzc5QyxHQUNQeUIsS0FBS2c4QyxHQUFLejlDLEVBSVAsT0FDSHlCLEtBQUtpOEMsSUFBSyxFQUtQLEdBQUcxOUMsR0FDTnlCLEtBQUtvOEMsR0FBSzc5QyxFQU1QLFNBQ0gsT0FBT28wRCxHQUFHM3lELEtBQUtnOEMsR0FBRy9tQixXQUlvRCxNQUFNbzlCLFdBQVcvYyxFQUMzRixZQUFZLzJDLEVBQUdzRSxHQUNYc0UsTUFBTWt0QyxFQUFFZSxZQUFhLDBCQUEwQjcyQyxjQUFjc0UsS0FBTTdDLEtBQUtwQyxLQUFPLDZCQUkxQixTQUFTdTFELEdBQUc1MEQsR0FHckUsTUFBTyw4QkFBZ0NBLEVBQUVYLEtBWXpDLE1BQU00MEQsR0FDTixZQUFZajBELEdBQ1J5QixLQUFLZ3VELE1BQVF6dkQsRUFFakIsSUFBSUEsRUFBR3NFLEdBQ0gsSUFBSS9ELEVBQ0osWUFBTyxJQUFXK0QsR0FBSzZ3QyxFQUFFLFdBQVksTUFBTzF6QyxLQUFLZ3VELE1BQU1wd0QsS0FBTVcsRUFBR3NFLEdBQUkvRCxFQUFJa0IsS0FBS2d1RCxNQUFNLzBCLElBQUlwMkIsRUFBR3RFLEtBQU9tMUMsRUFBRSxXQUFZLE1BQU8xekMsS0FBS2d1RCxNQUFNcHdELEtBQU0sYUFBY1csR0FDckpPLEVBQUlrQixLQUFLZ3VELE1BQU0vMEIsSUFBSTE2QixJQUFLbzBELEdBQUc3ekQsR0FReEIsSUFBSVAsR0FFUCxPQURBbTFDLEVBQUUsV0FBWSxNQUFPMXpDLEtBQUtndUQsTUFBTXB3RCxLQUFNVyxFQUFHQSxHQUNsQ28wRCxHQUFHM3lELEtBQUtndUQsTUFBTTVwQyxJQUFJN2xCLElBUXRCLElBQUlBLEdBR1AsT0FBT28wRCxHQUFHM3lELEtBQUtndUQsTUFBTTl2RCxJQUFJSyxJQUFJcU0sS0FBTS9ILFNBRW5DLElBQVdBLElBQU1BLEVBQUksTUFBTzZ3QyxFQUFFLFdBQVksTUFBTzF6QyxLQUFLZ3VELE1BQU1wd0QsS0FBTVcsRUFBR3NFLEdBQUlBLElBRTdFLE9BQU90RSxHQUVILE9BREFtMUMsRUFBRSxXQUFZLFNBQVUxekMsS0FBS2d1RCxNQUFNcHdELEtBQU1XLEdBQ2xDbzBELEdBQUczeUQsS0FBS2d1RCxNQUFNLzRCLE9BQU8xMkIsSUFPekIsUUFFSCxPQURBbTFDLEVBQUUsV0FBWSxRQUFTMXpDLEtBQUtndUQsTUFBTXB3RCxNQUMzQiswRCxHQUFHM3lELEtBQUtndUQsTUFBTTNKLFNBRXpCLEdBQUc5bEQsRUFBR3NFLEdBQ0YsTUFBTS9ELEVBQUlrQixLQUFLb3pELE9BQU9wekQsS0FBS2dpQixRQUFRempCLEVBQUdzRSxJQUFLekQsRUFBSSxHQUMvQyxPQUFPWSxLQUFLeThDLEdBQUczOUMsRUFBRyxDQUFFUCxFQUFHc0UsS0FDbkJ6RCxFQUFFZ0MsS0FBS3lCLEtBQ1ArSCxLQUFLLElBQU94TCxHQUVwQixHQUFHYixFQUFHc0UsR0FDRjZ3QyxFQUFFLFdBQVksYUFBYzF6QyxLQUFLZ3VELE1BQU1wd0QsTUFDdkMsTUFBTWtCLEVBQUlrQixLQUFLZ2lCLFFBQVF6akIsRUFBR3NFLEdBQzFCL0QsRUFBRTY5QyxJQUFLLEVBQ1AsTUFBTXY5QyxFQUFJWSxLQUFLb3pELE9BQU90MEQsR0FDdEIsT0FBT2tCLEtBQUt5OEMsR0FBR3I5QyxFQUFHLENBQUViLEVBQUdzRSxFQUFHL0QsSUFBTUEsRUFBRW0yQixVQUV0QyxHQUFHMTJCLEVBQUdzRSxHQUNGLElBQUkvRCxFQUNKK0QsRUFBSS9ELEVBQUlQLEdBQUtPLEVBQUksR0FBSStELEVBQUl0RSxHQUN6QixNQUFNYSxFQUFJWSxLQUFLb3pELE9BQU90MEQsR0FDdEIsT0FBT2tCLEtBQUt5OEMsR0FBR3I5QyxFQUFHeUQsR0FTZixHQUFHdEUsR0FDTixNQUFNc0UsRUFBSTdDLEtBQUtvekQsT0FBTyxJQUN0QixPQUFPLElBQUk1QixHQUFHLENBQUUxeUQsRUFBR00sS0FDZnlELEVBQUU0NEIsUUFBVWw5QixJQUNSLE1BQU1zRSxFQUFJeXZELEdBQUcvekQsRUFBRTBFLE9BQU9GLE9BQ3RCM0QsRUFBRXlELElBQ0hBLEVBQUVnd0QsVUFBWWh3RCxJQUNiLE1BQU16RCxFQUFJeUQsRUFBRUksT0FBT2lkLE9BQ25COWdCLEVBQUliLEVBQUVhLEVBQUVpMEQsV0FBWWowRCxFQUFFZCxPQUFPc00sS0FBTXJNLElBQy9CQSxFQUFJYSxFQUFFazBELFdBQWF4MEQsTUFDakJBLE9BSWxCLEdBQUdQLEVBQUdzRSxHQUNGLE1BQU0vRCxFQUFJLEdBQ1YsT0FBTyxJQUFJMHlELEdBQUcsQ0FBRXB5RCxFQUFHL0IsS0FDZmtCLEVBQUVrOUIsUUFBVWw5QixJQUNSbEIsRUFBRWtCLEVBQUUwRSxPQUFPRixRQUNaeEUsRUFBRXMwRCxVQUFZdDBELElBQ2IsTUFBTWxCLEVBQUlrQixFQUFFMEUsT0FBT2lkLE9BQ25CLElBQUs3aUIsRUFBRyxZQUFZK0IsSUFDcEIsTUFBTWpCLEVBQUksSUFBSSswRCxHQUFHNzFELEdBQUlTLEVBQUkrRSxFQUFFeEYsRUFBRWcyRCxXQUFZaDJELEVBQUVpQixNQUFPSCxHQUNsRCxHQUFJTCxhQUFhMHpELEdBQUksQ0FDakIsTUFBTWp6RCxFQUFJVCxFQUFFZ0csTUFBT3ZGLElBQU1KLEVBQUVvMUQsT0FBUS9CLEdBQUcvdEQsT0FBT2xGLEtBQzdDTyxFQUFFc0MsS0FBSzdDLEdBRVhKLEVBQUV3ekQsT0FBU3Z5RCxJQUFNLE9BQVNqQixFQUFFbStDLEdBQUtqL0MsRUFBRWkyRCxXQUFhajJELEVBQUVpMkQsU0FBU24xRCxFQUFFbStDLE9BRWpFMXhDLEtBQUssSUFBTzRtRCxHQUFHUSxRQUFRbHpELElBRS9CLFFBQVFQLEVBQUdzRSxHQUNQLElBQUkvRCxFQUNKLFlBQU8sSUFBV1AsSUFBTSxpQkFBbUJBLEVBQUlPLEVBQUlQLEVBQUlzRSxFQUFJdEUsR0FBSSxDQUMzRGkxRCxNQUFPMTBELEVBQ1AyMEQsTUFBTzV3RCxHQUdmLE9BQU90RSxHQUNILElBQUlzRSxFQUFJLE9BQ1IsR0FBSXRFLEVBQUVtMUQsVUFBWTd3RCxFQUFJLFFBQVN0RSxFQUFFaTFELE1BQU8sQ0FDcEMsTUFBTTEwRCxFQUFJa0IsS0FBS2d1RCxNQUFNd0YsTUFBTWoxRCxFQUFFaTFELE9BQzdCLE9BQU9qMUQsRUFBRW8rQyxHQUFLNzlDLEVBQUU2MEQsY0FBY3AxRCxFQUFFazFELE1BQU81d0QsR0FBSy9ELEVBQUU4MEQsV0FBV3IxRCxFQUFFazFELE1BQU81d0QsR0FFdEUsT0FBTzdDLEtBQUtndUQsTUFBTTRGLFdBQVdyMUQsRUFBRWsxRCxNQUFPNXdELElBTzFDLFNBQVM4dkQsR0FBR3AwRCxHQUNaLE9BQU8sSUFBSWl6RCxHQUFHLENBQUUzdUQsRUFBRy9ELEtBQ2ZQLEVBQUVzMEQsVUFBWXQwRCxJQUNWLE1BQU1PLEVBQUlQLEVBQUUwRSxPQUFPaWQsT0FDbkJyZCxFQUFFL0QsSUFDSFAsRUFBRWs5QixRQUFVbDlCLElBQ1gsTUFBTXNFLEVBQUl5dkQsR0FBRy96RCxFQUFFMEUsT0FBT0YsT0FDdEJqRSxFQUFFK0QsTUFNZCxJQUFJZ3hELElBQUssRUFFVCxTQUFTdkIsR0FBRy96RCxHQUNSLE1BQU1zRSxFQUFJNHZELEdBQUdyWSxHQUFHLGVBQ2hCLEdBQUl2M0MsR0FBSyxNQUFRQSxFQUFJLEdBQUksQ0FDckIsTUFBTUEsRUFBSSxtRUFDVixHQUFJdEUsRUFBRTBJLFFBQVFYLFFBQVF6RCxJQUFNLEVBQUcsQ0FFM0IsTUFBTXRFLEVBQUksSUFBSSsyQyxFQUFFLFdBQVksNkNBQTZDenlDLGdKQUN6RSxPQUFPZ3hELEtBQU9BLElBQUssRUFHbkI1Z0QsV0FBVyxLQUNQLE1BQU0xVSxHQUNOLElBQUtBLEdBR2pCLE9BQU9BOzs7Ozs7Ozs7Ozs7Ozs7O0dBa0JQLE1BQU11MUQsV0FBV3hDLEdBQ2pCLFlBQVkveUQsRUFBR3NFLEdBQ1hzRSxRQUFTbkgsS0FBS3M5QyxHQUFLLytDLEVBQUd5QixLQUFLK3pELHNCQUF3Qmx4RCxHQUkzRCxTQUFTbXhELEdBQUd6MUQsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUNaLE9BQU9rMEQsR0FBR3pYLEdBQUdsOEMsRUFBRXcrQyxHQUFJejZDOzs7Ozs7Ozs7Ozs7Ozs7O0dBcUJuQixNQUFNb3hELEdBWU4sWUFBWTExRCxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ2pCWSxLQUFLc3VELFFBQVUvdkQsRUFBR3lCLEtBQUtrMEQsZUFBaUJyeEQsRUFBRzdDLEtBQUt3dUQsY0FBZ0IxdkQsRUFBR2tCLEtBQUt5dUQsVUFBWXJ2RCxFQVNqRixzQkFBc0JiLEVBQUdzRSxHQUM1QixNQUFNL0QsRUFBSStELEVBQUVzeEQsZ0JBQ1osSUFBSyxJQUFJdHhELEVBQUksRUFBR0EsRUFBSTdDLEtBQUt5dUQsVUFBVWp2RCxPQUFRcUQsSUFBSyxDQUM1QyxNQUFNekQsRUFBSVksS0FBS3l1RCxVQUFVNXJELEdBQ3JCekQsRUFBRVIsSUFBSXM1QyxRQUFRMzVDLEVBQUVLLE1BQ2hCbWtELEdBQUczakQsRUFBR2IsRUFBR08sRUFBRStELEtBU2hCLGlCQUFpQnRFLEdBR3BCLElBQUssTUFBTXNFLEtBQUs3QyxLQUFLd3VELGNBQWUzckQsRUFBRWpFLElBQUlzNUMsUUFBUTM1QyxFQUFFSyxNQUFRK2tELEdBQUc5Z0QsRUFBR3RFLEVBQUd5QixLQUFLazBELGdCQUVsRSxJQUFLLE1BQU1yeEQsS0FBSzdDLEtBQUt5dUQsVUFBVzVyRCxFQUFFakUsSUFBSXM1QyxRQUFRMzVDLEVBQUVLLE1BQVEra0QsR0FBRzlnRCxFQUFHdEUsRUFBR3lCLEtBQUtrMEQsZ0JBSzNFLHdCQUF3QjMxRCxHQUkzQnlCLEtBQUt5dUQsVUFBVXRsRCxRQUFTdEcsSUFDcEIsTUFBTS9ELEVBQUlQLEVBQUVMLElBQUkyRSxFQUFFakUsS0FBTVEsRUFBSU4sRUFHaEJrQixLQUFLbzBELGlCQUFpQmgxRCxHQUFJTixFQUFFdTFELG1CQUFxQmoxRCxFQUFFc2tELG9CQUFvQjNMLEVBQUdub0MsU0FHOUYsT0FDSSxPQUFPNVAsS0FBS3l1RCxVQUFVcGxCLE9BQU8sQ0FBRTlxQyxFQUFHc0UsSUFBTXRFLEVBQUU2bEIsSUFBSXZoQixFQUFFakUsS0FBT3VvRCxNQUUzRCxRQUFRNW9ELEdBQ0osT0FBT3lCLEtBQUtzdUQsVUFBWS92RCxFQUFFK3ZELFNBQVc5VyxFQUFHeDNDLEtBQUt5dUQsVUFBV2x3RCxFQUFFa3dELFVBQVcsQ0FBRWx3RCxFQUFHc0UsSUFBTW1oRCxHQUFHemxELEVBQUdzRSxLQUFRMjBDLEVBQUd4M0MsS0FBS3d1RCxjQUFlandELEVBQUVpd0QsY0FBZSxDQUFFandELEVBQUdzRSxJQUFNbWhELEdBQUd6bEQsRUFBR3NFLEtBSWhHLE1BQU15eEQsR0FDakUsWUFBWS8xRCxFQUFHc0UsRUFBRy9ELEVBS2xCTSxHQUNJWSxLQUFLdTBELE1BQVFoMkQsRUFBR3lCLEtBQUt3MEQsY0FBZ0IzeEQsRUFBRzdDLEtBQUttMEQsZ0JBQWtCcjFELEVBQUdrQixLQUFLeTBELFlBQWNyMUQsRUFNbEYsWUFBWWIsRUFBR3NFLEVBQUcvRCxHQUNyQm8xQyxFQUFFMzFDLEVBQUVrd0QsVUFBVWp2RCxTQUFXVixFQUFFVSxRQUMzQixJQUFJSixFQUFJNm5ELEtBQ1IsTUFBTTVwRCxFQUFJa0IsRUFBRWt3RCxVQUNaLElBQUssSUFBSWx3RCxFQUFJLEVBQUdBLEVBQUlsQixFQUFFbUMsT0FBUWpCLElBQUthLEVBQUlBLEVBQUUwbEQsT0FBT3puRCxFQUFFa0IsR0FBR0ssSUFBS0UsRUFBRVAsR0FBR2kvQyxTQUMvRCxPQUFPLElBQUk4VyxHQUFHLzFELEVBQUdzRSxFQUFHL0QsRUFBR007Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQjNCLE1BQU1zMUQsR0FDTixZQUVBbjJELEVBS0FzRSxFQUVBL0QsRUFLQU0sRUFFQS9CLEVBQUkwNkMsRUFBR25vQyxNQUlEelIsRUFBSTQ1QyxFQUFHbm9DLE1BTVA5UixFQUFJdzdDLEVBQUdFLG1CQUNUeDVDLEtBQUtpRCxPQUFTMUUsRUFBR3lCLEtBQUtzb0QsU0FBV3psRCxFQUFHN0MsS0FBS29wRCxRQUFVdHFELEVBQUdrQixLQUFLa3dELGVBQWlCOXdELEVBQUdZLEtBQUt1bkQsZ0JBQWtCbHFELEVBQ3RHMkMsS0FBSzh2RCw2QkFBK0IzeEQsRUFBRzZCLEtBQUs4bkQsWUFBY2hxRCxFQUVnQixtQkFBbUJTLEdBQzdGLE9BQU8sSUFBSW0yRCxHQUFHMTBELEtBQUtpRCxPQUFRakQsS0FBS3NvRCxTQUFVdG9ELEtBQUtvcEQsUUFBUzdxRCxFQUFHeUIsS0FBS3VuRCxnQkFBaUJ2bkQsS0FBSzh2RCw2QkFBOEI5dkQsS0FBSzhuRCxhQUt0SCxnQkFBZ0J2cEQsRUFBR3NFLEdBQ3RCLE9BQU8sSUFBSTZ4RCxHQUFHMTBELEtBQUtpRCxPQUFRakQsS0FBS3NvRCxTQUFVdG9ELEtBQUtvcEQsUUFBU3BwRCxLQUFLa3dELGVBQWdCcnRELEVBQUc3QyxLQUFLOHZELDZCQUE4QnZ4RCxHQUtoSCxpQ0FBaUNBLEdBQ3BDLE9BQU8sSUFBSW0yRCxHQUFHMTBELEtBQUtpRCxPQUFRakQsS0FBS3NvRCxTQUFVdG9ELEtBQUtvcEQsUUFBU3BwRCxLQUFLa3dELGVBQWdCbHdELEtBQUt1bkQsZ0JBQWlCaHBELEVBQUd5QixLQUFLOG5EOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0I1RCxNQUFNNk0sR0FDekQsWUFBWXAyRCxHQUNSeUIsS0FBSzg5QyxHQUFLdi9DLEdBSW1ELFNBQVNxMkQsR0FBR3IyRCxFQUFHc0UsR0FDaEYsR0FBSUEsRUFBRXVnQixTQUFVLE9BQU8wbkMsR0FBR3ZzRCxFQUFFdS9DLEdBQUlqN0MsRUFBRXVnQixXQUFZdmdCLEVBQUUrNkMsdUJBQ2hELEdBQUkvNkMsRUFBRXNzRCxXQUFZLENBQ2QsTUFBTTV3RCxFQUFJczhDLEdBQUdnYSxhQUFhaHlELEVBQUVzc0QsV0FBV3AvQyxNQUFPalIsRUFBSWcyRCxHQUFHanlELEVBQUVzc0QsV0FBV0osVUFBVzN2RCxFQUFJaytDLEdBQUc0TCxjQUFjM3FELEVBQUdPLEdBQ3JHLE9BQU8rRCxFQUFFKzZDLHNCQUF3QngrQyxFQUFFaWtELDJCQUE2QmprRCxFQUVwRSxHQUFJeUQsRUFBRXFzRCxnQkFBaUIsQ0FDbkIsTUFBTTN3RCxFQUFJczhDLEdBQUdnYSxhQUFhaHlELEVBQUVxc0QsZ0JBQWdCbi9DLE1BQU9qUixFQUFJZzJELEdBQUdqeUQsRUFBRXFzRCxnQkFBZ0IxUixTQUM1RSxPQUFPRixHQUFHeVgsbUJBQW1CeDJELEVBQUdPLEdBRXBDLE9BQU93b0MsSUFHb0MsU0FBUzB0QixHQUFHejJELEVBQUdzRSxFQUFHL0QsR0FDN0QsTUFBTU0sRUFBSTYxRCxHQUFHbjJELEdBQUl6QixFQUFJd0YsRUFBRWpFLElBQUltUixLQUFLZ3RDLFVBQVVsRSxVQUMxQyxHQUFJaDJDLEVBQUVvK0Msa0JBQW1CLENBQ3JCLE1BQU1uaUQsRUFBSSxTQUFTUCxFQUFHc0UsR0FDbEIsTUFBTyxDQUNIakYsS0FBTTRzRCxHQUFHanNELEVBQUdzRSxFQUFFakUsS0FDZHU2QyxPQUFRdDJDLEVBQUU2RSxLQUFLcEosTUFBTTI3QyxTQUFTZCxPQUM5QndKLFdBQVlrSCxHQUFHdHJELEVBQUdzRSxFQUFFMjZDLFFBQVEwTSxnQkFKMUIsQ0FNUjNyRCxFQUFFdS9DLEdBQUlqN0MsR0FBSTFFLEVBQUkwRSxFQUFFKzZDLHNCQUNsQixPQUFPLElBQUlxUixHQUNZLEtBQ0wsS0FBTW53RCxFQUFHWCxFQUFHaUIsRUFBRy9CLEdBRXJDLEdBQUl3RixFQUFFcXlELGVBQWdCLENBQ2xCLE1BQU0zMkQsRUFBSXNFLEVBQUVqRSxJQUFJbVIsS0FBSzhvQyxVQUFXLzVDLEVBQUlxMkQsR0FBR3R5RCxFQUFFMjZDLFNBQVVyL0MsRUFBSTBFLEVBQUUrNkMsc0JBQ3pELE9BQU8sSUFBSXFSLEdBQ1ksS0FBTSxJQUFJSCxHQUFHdndELEVBQUdPLEdBQ3ZCLEtBQU1YLEVBQUdpQixFQUFHL0IsR0FFaEMsR0FBSXdGLEVBQUV1eUQsb0JBQXFCLENBQ3ZCLE1BQU03MkQsRUFBSXNFLEVBQUVqRSxJQUFJbVIsS0FBSzhvQyxVQUFXLzVDLEVBQUlxMkQsR0FBR3R5RCxFQUFFMjZDLFNBQ3pDLE9BQU8sSUFBSXlSLEdBQUcsSUFBSUQsR0FBR3p3RCxFQUFHTyxHQUNOLEtBQ0YsTUFDYSxFQUFJTSxFQUFHL0IsR0FFeEMsT0FBT2lxQyxJQUdYLFNBQVMydEIsR0FBRzEyRCxHQUNSLE1BQU1zRSxFQUFJdEUsRUFBRTJyRCxjQUNaLE1BQU8sQ0FBRXJuRCxFQUFFaVIsUUFBU2pSLEVBQUUrMEMsYUFHMUIsU0FBU3lkLEdBQUc5MkQsR0FDUixNQUFNc0UsRUFBSSxJQUFJODBDLEVBQUdwNUMsRUFBRSxHQUFJQSxFQUFFLElBQ3pCLE9BQU93NUMsRUFBR3FTLGNBQWN2bkQsR0FHNUIsU0FBU3N5RCxHQUFHNTJELEdBQ1IsTUFBTXNFLEVBQUl0RSxFQUFFMnJELGNBQ1osT0FBTyxJQUFJeUQsR0FBRzlxRCxFQUFFaVIsUUFBU2pSLEVBQUUrMEMsYUFHL0IsU0FBU2tkLEdBQUd2MkQsR0FDUixNQUFNc0UsRUFBSSxJQUFJODBDLEVBQUdwNUMsRUFBRXVWLFFBQVN2VixFQUFFcTVDLGFBQzlCLE9BQU9HLEVBQUdxUyxjQUFjdm5ELEdBSzVCLFNBQVN5eUQsR0FBRy8yRCxFQUFHc0UsR0FDWCxNQUFNL0QsR0FBSytELEVBQUUyckQsZUFBaUIsSUFBSWo0QyxJQUFLMVQsR0FBSytvRCxHQUFHcnRELEVBQUV1L0MsR0FBSWo3QyxJQU1qRCxJQUFLLElBQUl0RSxFQUFJLEVBQUdBLEVBQUlzRSxFQUFFNHJELFVBQVVqdkQsT0FBUyxJQUFLakIsRUFBRyxDQUNqRCxNQUFNTyxFQUFJK0QsRUFBRTRyRCxVQUFVbHdELEdBQ3RCLEdBQUlBLEVBQUksRUFBSXNFLEVBQUU0ckQsVUFBVWp2RCxhQUFVLElBQVdxRCxFQUFFNHJELFVBQVVsd0QsRUFBSSxHQUFHZ2tELFVBQVcsQ0FDdkUsTUFBTW5qRCxFQUFJeUQsRUFBRTRyRCxVQUFVbHdELEVBQUksR0FDMUJPLEVBQUVzc0QsaUJBQW1CaHNELEVBQUVtakQsVUFBVVcsZ0JBQWlCcmdELEVBQUU0ckQsVUFBVThHLE9BQU9oM0QsRUFBSSxFQUFHLEtBQzFFQSxHQUdWLE1BQU1hLEVBQUl5RCxFQUFFNHJELFVBQVVsNEMsSUFBSzFULEdBQUsrb0QsR0FBR3J0RCxFQUFFdS9DLEdBQUlqN0MsSUFBTXhGLEVBQUlzNkMsRUFBR0UsV0FBV2gxQyxFQUFFMHJELGtCQUNuRSxPQUFPLElBQUkwRixHQUFHcHhELEVBQUV5ckQsUUFBU2p4RCxFQUFHeUIsRUFBR00sR0FHTyxTQUFTbzJELEdBQUdqM0QsR0FDbEQsTUFBTXNFLEVBQUlpeUQsR0FBR3YyRCxFQUFFd3dELFVBQVdqd0QsT0FBSSxJQUFXUCxFQUFFdXhELDZCQUErQmdGLEdBQUd2MkQsRUFBRXV4RCw4QkFBZ0MvWCxFQUFHbm9DLE1BQ2xILElBQUl4USxFQUNKLElBQUkvQixFQUNKLFlBQU8sSUFBV2tCLEVBQUU0UyxNQUFNODZDLFdBQWEvWCxFQUFFLEtBQU83MkMsRUFBSWtCLEVBQUU0UyxPQUFPODZDLFVBQVV6c0QsUUFDdkVKLEVBQUlzaEQsR0FBR1QsR0FBRzJLLEdBQUd2dEQsRUFBRTR1RCxVQUFVLE9BQVM3c0QsRUFBSSxTQUFTYixHQUMzQyxPQUFPbWlELEdBQUdxTSxHQUFHeHVELElBRHFCLENBRXBDQSxFQUFFNFMsT0FBUSxJQUFJdWpELEdBQUd0MUQsRUFBR2IsRUFBRStwRCxTQUFVLEVBQWlCL3BELEVBQUVzeEQseUJBQTBCaHRELEVBQUcvRCxFQUFHdzZDLEVBQUdRLGlCQUFpQnY3QyxFQUFFdXBELGNBR2hELFNBQVMyTixHQUFHbDNELEVBQUdzRSxHQUMxRSxNQUFNL0QsRUFBSXEyRCxHQUFHdHlELEVBQUUwa0QsaUJBQWtCbm9ELEVBQUkrMUQsR0FBR3R5RCxFQUFFaXRELDhCQUMxQyxJQUFJenlELEVBQ0pBLEVBQUl3aEQsR0FBR2g4QyxFQUFFSSxRQUFVK29ELEdBQUd6dEQsRUFBRXUvQyxHQUFJajdDLEVBQUVJLFFBQVVpcEQsR0FBRzN0RCxFQUFFdS9DLEdBQUlqN0MsRUFBRUksUUFHL0MsTUFBTTlFLEVBQUkwRSxFQUFFaWxELFlBQVk1TCxXQUV4QixPQUFPLElBQUl5VCxHQUFHOXNELEVBQUV5bEQsU0FBVWhLLEdBQUd6N0MsRUFBRUksUUFBU25FLEVBQUdYLEVBQUcwRSxFQUFFcXRELGVBQWdCOXdELEVBQUcvQixHQVkzRSxTQUFTcTRELEdBQUduM0QsR0FDUixNQUFNc0UsRUFBSWtxRCxHQUFHLENBQ1RYLE9BQVE3dEQsRUFBRTZ0RCxPQUNWRCxnQkFBaUI1dEQsRUFBRTR0RCxrQkFFdkIsTUFBTyxTQUFXNXRELEVBQUV3aEQsVUFBWVksR0FBRzk5QyxFQUFHQSxFQUFFNjFDLE1BQU8sS0FBa0I3MUM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQnJFLE1BQU04eUQsR0FDRixrQkFBa0JwM0QsRUFBR3NFLEdBQ2pCLE9BQU8reUQsR0FBR3IzRCxHQUFHTCxJQUFJMkUsR0FBRytILEtBQU1yTSxJQUN0QixHQUFJQSxFQUFHLE1BQU8sQ0FDVjRILElBQUt0RCxFQUFJdEUsR0FBRzZ1QixTQUNaNmpDLFdBQVk2RCxHQUFHanlELEVBQUVvdUQsWUFDakJ6VCxRQUFTMzZDLEVBQUUyNkMsU0FHZixJQUFJMzZDLElBR1osbUJBQW1CdEUsRUFBR3NFLEdBQ2xCLE9BQU8reUQsR0FBR3IzRCxHQUFHMDZCLElBQUksQ0FDYjdMLFVBQVd0dUIsRUFBSStELEdBQUdzRCxHQUNsQjhxRCxXQUFZa0UsR0FBR2hMLEdBQUdyckQsRUFBRW15RCxhQUNwQnpULFFBQVMxK0MsRUFBRTArQyxVQUVmLElBQUkxK0MsRUFFUixjQUFjUCxFQUFHc0UsR0FDYixPQUFPZ3pELEdBQUd0M0QsR0FBR0wsSUFBSTJFLEdBQUcrSCxLQUFNck0sSUFDdEIsR0FBSUEsRUFBRyxNQUFPLENBQ1ZYLE1BQU9pRixFQUFJdEUsR0FBR1gsS0FDZHVULE1BQU91a0QsR0FBRzd5RCxFQUFFc3VELGNBQ1pwQyxTQUFVK0YsR0FBR2p5RCxFQUFFa3NELFdBRW5CLElBQUlsc0QsSUFHWixlQUFldEUsRUFBR3NFLEdBQ2QsT0FBT2d6RCxHQUFHdDNELEdBQUcwNkIsSUFBSSxTQUFTMTZCLEdBQ3RCLE1BQU8sQ0FDSFgsS0FBTVcsRUFBRVgsS0FDUm14RCxTQUFVb0csR0FBR2hMLEdBQUc1ckQsRUFBRXd3RCxXQUNsQm9DLGFBQWM1eUQsRUFBRTR5RCxjQUpQLENBTWZ0dUQsS0FNTixTQUFTK3lELEdBQUdyM0QsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBR3l5RCxHQUFHaEQsT0FLaEIsU0FBUzZILEdBQUd0M0QsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBRzJ5RCxHQUFHbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQmhCLE1BQU04SCxHQUNOLGNBQ0k5MUQsS0FBS3ErQyxHQUFLLElBQUkwWCxHQUVsQiwyQkFBMkJ4M0QsRUFBR3NFLEdBQzFCLE9BQU83QyxLQUFLcStDLEdBQUdqNkIsSUFBSXZoQixHQUFJMnVELEdBQUc5dEQsVUFFOUIscUJBQXFCbkYsRUFBR3NFLEdBQ3BCLE9BQU8ydUQsR0FBRzl0RCxRQUFRMUQsS0FBS3ErQyxHQUFHMlgsV0FBV256RCxLQVF6QyxNQUFNa3pELEdBQ04sY0FDSS8xRCxLQUFLd3pELE1BQVEsR0FHakIsSUFBSWoxRCxHQUNBLE1BQU1zRSxFQUFJdEUsRUFBRXMrQyxjQUFlLzlDLEVBQUlQLEVBQUV3K0MsVUFBVzM5QyxFQUFJWSxLQUFLd3pELE1BQU0zd0QsSUFBTSxJQUFJd2pELEdBQUd6TixFQUFHSCxZQUFhcDdDLEdBQUsrQixFQUFFbXNCLElBQUl6c0IsR0FDbkcsT0FBT2tCLEtBQUt3ekQsTUFBTTN3RCxHQUFLekQsRUFBRWdsQixJQUFJdGxCLEdBQUl6QixFQUVyQyxJQUFJa0IsR0FDQSxNQUFNc0UsRUFBSXRFLEVBQUVzK0MsY0FBZS85QyxFQUFJUCxFQUFFdytDLFVBQVczOUMsRUFBSVksS0FBS3d6RCxNQUFNM3dELEdBQzNELE9BQU96RCxHQUFLQSxFQUFFbXNCLElBQUl6c0IsR0FFdEIsV0FBV1AsR0FDUCxPQUFReUIsS0FBS3d6RCxNQUFNajFELElBQU0sSUFBSThuRCxHQUFHek4sRUFBR0gsYUFBYUk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQnBELE1BQU1vZCxHQUNOLGNBUUlqMkQsS0FBS3MrQyxHQUFLLElBQUl5WCxHQVFYLDJCQUEyQngzRCxFQUFHc0UsR0FDakMsSUFBSzdDLEtBQUtzK0MsR0FBRy95QixJQUFJMW9CLEdBQUksQ0FDakIsTUFBTS9ELEVBQUkrRCxFQUFFZzZDLGNBQWV6OUMsRUFBSXlELEVBQUVrNkMsVUFDakN4K0MsRUFBRTIzRCx1QkFBdUIsS0FHckJsMkQsS0FBS3MrQyxHQUFHbDZCLElBQUl2aEIsS0FFaEIsTUFBTXhGLEVBQUksQ0FDTmd2RCxhQUFjdnRELEVBQ2RzdEQsT0FBUW1CLEdBQUdudUQsSUFFZixPQUFPKzJELEdBQUc1M0QsR0FBRzA2QixJQUFJNTdCLEdBRXJCLE9BQU9tMEQsR0FBRzl0RCxVQUVkLHFCQUFxQm5GLEVBQUdzRSxHQUNwQixNQUFNL0QsRUFBSSxHQUFJTSxFQUFJZzNELFlBQVlDLE1BQU0sQ0FBRXh6RCxFQUFHLElBQU0sQ0FBRTYwQyxFQUFHNzBDLEdBQUksS0FDekMsR0FDQSxHQUNmLE9BQU9zekQsR0FBRzUzRCxHQUFHaStDLEdBQUdwOUMsR0FBR3dMLEtBQU1yTSxJQUNyQixJQUFLLE1BQU1hLEtBQUtiLEVBQUcsQ0FLZixHQUFJYSxFQUFFaXRELGVBQWlCeHBELEVBQUcsTUFDMUIvRCxFQUFFc0MsS0FBS3NzRCxHQUFHdHVELEVBQUVndEQsU0FFaEIsT0FBT3R0RCxLQVFmLFNBQVNxM0QsR0FBRzUzRCxHQUNaLE9BQU95MUQsR0FBR3oxRCxFQUFHbXlELEdBQUcxQzs7Ozs7Ozs7Ozs7Ozs7OztHQWtCaEIsTUFBTXNJLEdBQUssQ0FDWEMsUUFBUSxFQUNSQyx5QkFBMEIsRUFDMUJDLGVBQWdCLEVBQ2hCQyxpQkFBa0IsR0FHdEIsTUFBTUMsR0FDRixZQUdBcDRELEVBRUFzRSxFQUdBL0QsR0FDSWtCLEtBQUs0MkQsNkJBQStCcjRELEVBQUd5QixLQUFLNjJELG9CQUFzQmgwRCxFQUFHN0MsS0FBSzgyRCxnQ0FBa0NoNEQsRUFFaEgscUJBQXFCUCxHQUNqQixPQUFPLElBQUlvNEQsR0FBR3A0RCxFQUFHbzRELEdBQUdJLDhCQUErQkosR0FBR0s7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QjlELFNBQVNDLEdBQUcxNEQsRUFBR3NFLEVBQUcvRCxHQUNkLE1BQU1NLEVBQUliLEVBQUV5dkQsTUFBTUssR0FBR0wsT0FBUTN3RCxFQUFJa0IsRUFBRXl2RCxNQUFNWSxHQUFHWixPQUFRN3ZELEVBQUksR0FBSUwsRUFBSXM0RCxZQUFZYyxLQUFLcDRELEVBQUV3dkQsU0FDbkYsSUFBSWptRCxFQUFJLEVBQ1IsTUFBTTNLLEVBQUkwQixFQUFFdzlDLEdBQUcsQ0FDWDZXLE1BQU8zMUQsR0FDUixDQUFFUyxFQUFHc0UsRUFBRy9ELEtBQU91SixJQUFLdkosRUFBRW0yQixXQUN6QjkyQixFQUFFaUQsS0FBSzFELEVBQUVrTixLQUFLLEtBQ1ZzcEMsRUFBRSxJQUFNN3JDLE1BRVosTUFBTXZHLEVBQUksR0FDVixJQUFLLE1BQU12RCxLQUFLTyxFQUFFMnZELFVBQVcsQ0FDekIsTUFBTXJ2RCxFQUFJd3ZELEdBQUdod0QsSUFBSWlFLEVBQUd0RSxFQUFFSyxJQUFJbVIsS0FBTWpSLEVBQUV3dkQsU0FDbENud0QsRUFBRWlELEtBQUsvRCxFQUFFNDNCLE9BQU83MUIsSUFBSzBDLEVBQUVWLEtBQUs3QyxFQUFFSyxLQUVsQyxPQUFPNHlELEdBQUdRLFFBQVE3ekQsR0FBR3lNLEtBQUssSUFBTzlJLEdBS2pDLFNBQVNxMUQsR0FBRzU0RCxHQUNaLElBQUtBLEVBQUcsT0FBTyxFQUNmLElBQUlzRSxFQUNKLEdBQUl0RSxFQUFFNmtCLFNBQVV2Z0IsRUFBSXRFLEVBQUU2a0IsY0FBZSxHQUFJN2tCLEVBQUUyd0QsZ0JBQWlCcnNELEVBQUl0RSxFQUFFMndELG9CQUFzQixDQUNwRixJQUFLM3dELEVBQUU0d0QsV0FBWSxNQUFNN25CLElBQ3pCemtDLEVBQUl0RSxFQUFFNHdELFdBRVYsT0FBT25xRCxLQUFLQyxVQUFVcEMsR0FBR3JEOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJxQ20zRCxHQUFHSSw4QkFBZ0MsR0FDckdKLEdBQUdLLHdDQUEwQyxJQUFLTCxHQUFHUyxRQUFVLElBQUlULEdBQUcsU0FBVUEsR0FBR0ksOEJBQStCSixHQUFHSyx5Q0FDckhMLEdBQUdVLFNBQVcsSUFBSVYsSUFBSSxFQUFHLEVBQUcsR0FFNUIsTUFBTVcsR0FDRixZQUtBLzRELEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDTFksS0FBS2t1RCxPQUFTM3ZELEVBQUd5QixLQUFLMEksRUFBSTdGLEVBQUc3QyxLQUFLK2dELEdBQUtqaUQsRUFBR2tCLEtBQUt1M0Qsa0JBQW9CbjRELEVBYW5FWSxLQUFLMCtDLEdBQUssR0FNUCxVQUFVbmdELEVBQUdzRSxFQUFHL0QsRUFBR00sR0FLdEI4MEMsRUFBRSxLQUFPMzFDLEVBQUUyRixLQUNYLE1BQU03RyxFQUFJa0IsRUFBRTAwQyxrQkFBb0IxMEMsRUFBRTJGLElBQU0sR0FDeEMsT0FBTyxJQUFJb3pELEdBQUdqNkQsRUFBR3dGLEVBQUcvRCxFQUFHTSxHQUUzQixXQUFXYixHQUNQLElBQUlzRSxHQUFJLEVBQ1IsTUFBTS9ELEVBQUlzM0QsWUFBWUMsTUFBTSxDQUFFcjJELEtBQUtrdUQsT0FBUXg2QyxPQUFPOGpELG1CQUFxQixDQUFFeDNELEtBQUtrdUQsT0FBUXg2QyxPQUFPK2pELG9CQUM3RixPQUFPQyxHQUFHbjVELEdBQUdxK0MsR0FBRyxDQUNaNFcsTUFBT25GLEdBQUdLLG1CQUNWK0UsTUFBTzMwRCxHQUNSLENBQUVQLEVBQUdPLEVBQUdNLEtBQ1B5RCxHQUFJLEVBQUl6RCxFQUFFbTBELFNBQ1Yzb0QsS0FBSyxJQUFPL0gsR0FFcEIsaUJBQWlCdEUsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUN0QixNQUFNL0IsRUFBSXM2RCxHQUFHcDVELEdBQUlKLEVBQUl1NUQsR0FBR241RCxHQVV4QixPQUFPSixFQUFFaW1CLElBQUksSUFBSXhaLEtBQU05TSxJQUNuQm8yQyxFQUFFLGlCQUFtQnAyQyxHQUNyQixNQUFNdUssRUFBSSxJQUFJNHJELEdBQUduMkQsRUFBRytFLEVBQUcvRCxFQUFHTSxHQUFJMUIsRUFBSSxTQUFTYSxFQUFHc0UsRUFBRy9ELEdBQzdDLE1BQU1NLEVBQUlOLEVBQUUwdkQsY0FBY2o0QyxJQUFLMVQsR0FBS21vRCxHQUFHenNELEVBQUV1L0MsR0FBSWo3QyxJQUFNeEYsRUFBSXlCLEVBQUUydkQsVUFBVWw0QyxJQUFLMVQsR0FBS21vRCxHQUFHenNELEVBQUV1L0MsR0FBSWo3QyxJQUN0RixPQUFPLElBQUl3ckQsR0FBR3hyRCxFQUFHL0QsRUFBRXd2RCxRQUFTeHZELEVBQUVvMUQsZUFBZXBjLFdBQVkxNEMsRUFBRy9CLEdBRjlCLENBR2hDMkMsS0FBSzBJLEVBQUcxSSxLQUFLa3VELE9BQVE3bEQsR0FBSXZHLEVBQUksR0FDL0IsSUFBSXUwQyxFQUFJLElBQUlnUSxHQUFHLENBQUU5bkQsRUFBR3NFLElBQU0wMEMsRUFBR2g1QyxFQUFFdTZDLGtCQUFtQmoyQyxFQUFFaTJDLG9CQUNwRCxJQUFLLE1BQU12NkMsS0FBS2EsRUFBRyxDQUNmLE1BQU15RCxFQUFJK3JELEdBQUdod0QsSUFBSW9CLEtBQUtrdUQsT0FBUTN2RCxFQUFFSyxJQUFJbVIsS0FBTWpTLEdBQzFDdTRDLEVBQUlBLEVBQUVqeUIsSUFBSTdsQixFQUFFSyxJQUFJbVIsS0FBS2d0QyxXQUFZajdDLEVBQUVWLEtBQUtqRCxFQUFFODZCLElBQUl2N0IsSUFBS29FLEVBQUVWLEtBQUsvRCxFQUFFNDdCLElBQUlwMkIsRUFBRytyRCxHQUFHQyxjQUUxRSxPQUFPeFksRUFBRWx0QyxRQUFTdEcsSUFDZGYsRUFBRVYsS0FBS3BCLEtBQUsrZ0QsR0FBRzZXLDJCQUEyQnI1RCxFQUFHc0UsTUFDNUN0RSxFQUFFMjNELHVCQUF1QixLQUMxQmwyRCxLQUFLMCtDLEdBQUc1Z0QsR0FBS3VLLEVBQUVHLFNBQ2RncEQsR0FBR1EsUUFBUWx3RCxHQUFHOEksS0FBSyxJQUFPdkMsS0FHdkMsb0JBQW9COUosRUFBR3NFLEdBQ25CLE9BQU82MEQsR0FBR241RCxHQUFHTCxJQUFJMkUsR0FBRytILEtBQU1yTSxHQUFLQSxHQUFLMjFDLEVBQUUzMUMsRUFBRTJ2RCxTQUFXbHVELEtBQUtrdUQsUUFBU29ILEdBQUd0MUQsS0FBSzBJLEVBQUduSyxJQUFNLE1BU3RGLEdBQUdBLEVBQUdzRSxHQUNGLE9BQU83QyxLQUFLMCtDLEdBQUc3N0MsR0FBSzJ1RCxHQUFHOXRELFFBQVExRCxLQUFLMCtDLEdBQUc3N0MsSUFBTTdDLEtBQUs2M0Qsb0JBQW9CdDVELEVBQUdzRSxHQUFHK0gsS0FBTXJNLElBQzlFLEdBQUlBLEVBQUcsQ0FDSCxNQUFNTyxFQUFJUCxFQUFFaUssT0FDWixPQUFPeEksS0FBSzArQyxHQUFHNzdDLEdBQUsvRCxFQUFHQSxFQUUzQixPQUFPLE9BR2YsaUNBQWlDUCxFQUFHc0UsR0FDaEMsTUFBTS9ELEVBQUkrRCxFQUFJLEVBQUd6RCxFQUFJZzNELFlBQVkwQixXQUFXLENBQUU5M0QsS0FBS2t1RCxPQUFRcHZELElBQzNELElBQUl6QixFQUFJLEtBQ1IsT0FBT3E2RCxHQUFHbjVELEdBQUdxK0MsR0FBRyxDQUNaNFcsTUFBT25GLEdBQUdLLG1CQUNWK0UsTUFBT3IwRCxHQUNSLENBQUViLEVBQUdzRSxFQUFHekQsS0FDUHlELEVBQUVxckQsU0FBV2x1RCxLQUFLa3VELFNBQVdoYSxFQUFFcnhDLEVBQUV5ckQsU0FBV3h2RCxHQUFJekIsRUFBSWk0RCxHQUFHdDFELEtBQUswSSxFQUFHN0YsSUFBS3pELEVBQUVtMEQsU0FDdEUzb0QsS0FBSyxJQUFPdk4sR0FFcEIsZ0NBQWdDa0IsR0FDNUIsTUFBTXNFLEVBQUl1ekQsWUFBWTJCLFdBQVcsQ0FBRS8zRCxLQUFLa3VELE9BQVF4NkMsT0FBTytqRCxvQkFDdkQsSUFBSTM0RCxHQUFLLEVBQ1QsT0FBTzQ0RCxHQUFHbjVELEdBQUdxK0MsR0FBRyxDQUNaNFcsTUFBT25GLEdBQUdLLG1CQUNWK0UsTUFBTzV3RCxFQUNQNndELFNBQVMsR0FDVixDQUFFbjFELEVBQUdzRSxFQUFHekQsS0FDUE4sRUFBSStELEVBQUV5ckQsUUFBU2x2RCxFQUFFbTBELFNBQ2pCM29ELEtBQUssSUFBTzlMLEdBRXBCLHNCQUFzQlAsR0FDbEIsTUFBTXNFLEVBQUl1ekQsWUFBWUMsTUFBTSxDQUFFcjJELEtBQUtrdUQsUUFBUyxHQUFLLENBQUVsdUQsS0FBS2t1RCxPQUFReDZDLE9BQU8rakQsb0JBQ3ZFLE9BQU9DLEdBQUduNUQsR0FBR2krQyxHQUFHNlIsR0FBR0ssbUJBQW9CN3JELEdBQUcrSCxLQUFNck0sR0FBS0EsRUFBRWdZLElBQUtoWSxHQUFLKzJELEdBQUd0MUQsS0FBSzBJLEVBQUduSyxLQUVoRiwwQ0FBMENBLEVBQUdzRSxHQUd6QyxNQUFNL0QsRUFBSTh2RCxHQUFHb0osY0FBY2g0RCxLQUFLa3VELE9BQVFyckQsRUFBRWtOLE1BQU8zUSxFQUFJZzNELFlBQVkwQixXQUFXaDVELEdBQUl6QixFQUFJLEdBQ3BGLE9BQU9zNkQsR0FBR3A1RCxHQUFHcStDLEdBQUcsQ0FDWjZXLE1BQU9yMEQsR0FDUixDQUFFTixFQUFHTSxFQUFHakIsS0FDUCxNQUFPTCxFQUFHdUssRUFBRzNLLEdBQUtvQixFQUFHZ0QsRUFBSTRyRCxHQUFHcmxELEdBUWhCLEdBQUl2SyxJQUFNa0MsS0FBS2t1RCxRQUFVcnJELEVBQUVrTixLQUFLbW9DLFFBQVFwMkMsR0FFcEQsT0FBTzQxRCxHQUFHbjVELEdBQUdMLElBQUlSLEdBQUdrTixLQUFNck0sSUFDdEIsSUFBS0EsRUFBRyxNQUFNK29DLElBQ2Q0TSxFQUFFMzFDLEVBQUUydkQsU0FBV2x1RCxLQUFLa3VELFFBQVM3d0QsRUFBRStELEtBQUtrMEQsR0FBR3QxRCxLQUFLMEksRUFBR25LLE1BRW5ESixFQUFFbzFELFNBQ0Yzb0QsS0FBSyxJQUFPdk4sR0FFcEIsMkNBQTJDa0IsRUFBR3NFLEdBQzFDLElBQUkvRCxFQUFJLElBQUl1bkQsR0FBRzlPLEdBQ2YsTUFBTW40QyxFQUFJLEdBQ1YsT0FBT3lELEVBQUVzRyxRQUFTdEcsSUFDZCxNQUFNeEYsRUFBSXV4RCxHQUFHb0osY0FBY2g0RCxLQUFLa3VELE9BQVFyckQsRUFBRWtOLE1BQU81UixFQUFJaTRELFlBQVkwQixXQUFXejZELEdBQUlTLEVBQUk2NUQsR0FBR3A1RCxHQUFHcStDLEdBQUcsQ0FDekY2VyxNQUFPdDFELEdBQ1IsQ0FBRUksRUFBR2EsRUFBRy9CLEtBQ1AsTUFBT2MsRUFBR0wsRUFBR3VLLEdBQUs5SixFQUFHYixFQUFJZ3dELEdBQUc1dkQsR0FRWkssSUFBTTZCLEtBQUtrdUQsUUFBVXJyRCxFQUFFa04sS0FBS21vQyxRQUFReDZDLEdBQUtvQixFQUFJQSxFQUFFc2xCLElBQUkvYixHQUFLaEwsRUFBRWsyRCxTQUU5RW4wRCxFQUFFZ0MsS0FBS3RELEtBQ04wekQsR0FBR1EsUUFBUTV5RCxHQUFHd0wsS0FBSyxJQUFPNUssS0FBS3UrQyxHQUFHaGdELEVBQUdPLElBRTlDLG9DQUFvQ1AsRUFBR3NFLEdBQ25DLE1BQU0vRCxFQUFJK0QsRUFBRWtOLEtBQU0zUSxFQUFJTixFQUFFVSxPQUFTLEVBQUduQyxFQUFJdXhELEdBQUdvSixjQUFjaDRELEtBQUtrdUQsT0FBUXB2RCxHQUFJWCxFQUFJaTRELFlBQVkwQixXQUFXejZELEdBSXJHLElBQUlTLEVBQUksSUFBSXVvRCxHQUFHOU8sR0FDZixPQUFPb2dCLEdBQUdwNUQsR0FBR3ErQyxHQUFHLENBQ1o2VyxNQUFPdDFELEdBQ1IsQ0FBRUksRUFBR3NFLEVBQUd4RixLQUNQLE1BQU9jLEVBQUdrSyxFQUFHM0ssR0FBS2EsRUFBR3VELEVBQUk0ckQsR0FBR3JsRCxHQUM1QmxLLElBQU02QixLQUFLa3VELFFBQVVwdkQsRUFBRXM2QyxXQUFXdDNDLEdBTWxDQSxFQUFFdEMsU0FBV0osSUFBTXRCLEVBQUlBLEVBQUVzbUIsSUFBSTFtQixJQUFNTCxFQUFFazJELFNBQ3JDM29ELEtBQUssSUFBTzVLLEtBQUt1K0MsR0FBR2hnRCxFQUFHVCxJQUUvQixHQUFHUyxFQUFHc0UsR0FDRixNQUFNL0QsRUFBSSxHQUFJTSxFQUFJLEdBRWxCLE9BQU95RCxFQUFFc0csUUFBU3RHLElBQ2R6RCxFQUFFZ0MsS0FBS3MyRCxHQUFHbjVELEdBQUdMLElBQUkyRSxHQUFHK0gsS0FBTXJNLElBQ3RCLEdBQUksT0FBU0EsRUFBRyxNQUFNK29DLElBQ3RCNE0sRUFBRTMxQyxFQUFFMnZELFNBQVdsdUQsS0FBS2t1RCxRQUFTcHZELEVBQUVzQyxLQUFLazBELEdBQUd0MUQsS0FBSzBJLEVBQUduSyxTQUVsRGl6RCxHQUFHUSxRQUFRNXlELEdBQUd3TCxLQUFLLElBQU85TCxHQUVuQyxvQkFBb0JQLEVBQUdzRSxHQUNuQixPQUFPbzBELEdBQUcxNEQsRUFBRSsrQyxHQUFJdDlDLEtBQUtrdUQsT0FBUXJyRCxHQUFHK0gsS0FBTTlMLElBQU1QLEVBQUUyM0QsdUJBQXVCLEtBQ2pFbDJELEtBQUtrL0MsR0FBR3I4QyxFQUFFeXJELFdBQ1RrRCxHQUFHcm9ELFFBQVFySyxFQUFJK0QsR0FBSzdDLEtBQUt1M0Qsa0JBQWtCVSx3QkFBd0IxNUQsRUFBR3NFLE1BVy9FLEdBQUd0RSxVQUNReUIsS0FBSzArQyxHQUFHbmdELEdBRW5CLHdCQUF3QkEsR0FDcEIsT0FBT3lCLEtBQUtrNEQsV0FBVzM1RCxHQUFHcU0sS0FBTS9ILElBQzVCLElBQUtBLEVBQUcsT0FBTzJ1RCxHQUFHOXRELFVBR04sTUFBTTVFLEVBQUlzM0QsWUFBWTBCLFdBQVdsSixHQUFHdUosY0FBY240RCxLQUFLa3VELFNBQVU5dUQsRUFBSSxHQUNqRixPQUFPdTRELEdBQUdwNUQsR0FBR3ErQyxHQUFHLENBQ1o2VyxNQUFPMzBELEdBQ1IsQ0FBRVAsRUFBR3NFLEVBQUcvRCxLQUNQLEdBQUlQLEVBQUUsS0FBT3lCLEtBQUtrdUQsT0FBUSxDQUN0QixNQUFNcnJELEVBQUk2cUQsR0FBR252RCxFQUFFLElBQ2ZhLEVBQUVnQyxLQUFLeUIsUUFDSi9ELEVBQUV5MEQsU0FDVDNvRCxLQUFLLEtBQ0xzcEMsRUFBRSxJQUFNOTBDLEVBQUVJLFlBSXRCLFlBQVlqQixFQUFHc0UsR0FDWCxPQUFPdTFELEdBQUc3NUQsRUFBR3lCLEtBQUtrdUQsT0FBUXJyRCxHQUk5QixHQUFHdEUsR0FDQyxPQUFPODVELEdBQUc5NUQsR0FBR0wsSUFBSThCLEtBQUtrdUQsUUFBUXRqRCxLQUFNck0sR0FBS0EsR0FBSyxJQUFJMHZELEdBQUdqdUQsS0FBS2t1RCxRQUFTLEVBQzlDLE1BT3pCLFNBQVNrSyxHQUFHNzVELEVBQUdzRSxFQUFHL0QsR0FDbEIsTUFBTU0sRUFBSXd2RCxHQUFHb0osY0FBY24xRCxFQUFHL0QsRUFBRWlSLE1BQU8xUyxFQUFJK0IsRUFBRSxHQUFJakIsRUFBSWk0RCxZQUFZMEIsV0FBVzE0RCxHQUM1RSxJQUFJdEIsR0FBSSxFQUNSLE9BQU82NUQsR0FBR3A1RCxHQUFHcStDLEdBQUcsQ0FDWjZXLE1BQU90MUQsRUFDUHcrQyxJQUFJLEdBQ0wsQ0FBRXArQyxFQUFHTyxFQUFHTSxLQUNQLE1BQU9qQixFQUFHa0ssRUFBZTNLLEdBQUthLEVBQzlCSixJQUFNMEUsR0FBS3dGLElBQU1oTCxJQUFNUyxHQUFJLEdBQUtzQixFQUFFbTBELFNBQ2xDM29ELEtBQUssSUFBTzlNLEdBT3BCLFNBQVM0NUQsR0FBR241RCxHQUNSLE9BQU95MUQsR0FBR3oxRCxFQUFHOHZELEdBQUdMLE9BS2hCLFNBQVMySixHQUFHcDVELEdBQ1osT0FBT3kxRCxHQUFHejFELEVBQUdxd0QsR0FBR1osT0FLaEIsU0FBU3FLLEdBQUc5NUQsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBRzB2RCxHQUFHRDs7Ozs7Ozs7Ozs7Ozs7OztHQWtDcEIsTUFBTXNLLEdBQ0YsWUFBWS81RCxHQUNSeUIsS0FBS3UvQyxHQUFLaGhELEVBRWQsT0FDSSxPQUFPeUIsS0FBS3UvQyxJQUFNLEVBQUd2L0MsS0FBS3UvQyxHQUU5QixZQUtJLE9BQU8sSUFBSStZLEdBQUcsR0FFbEIsWUFFSSxPQUFPLElBQUlBLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQm5CLE1BQU1DLEdBQ04sWUFBWWg2RCxFQUFHc0UsR0FDWDdDLEtBQUt1M0Qsa0JBQW9CaDVELEVBQUd5QixLQUFLMEksRUFBSTdGLEVBUXpDLGlCQUFpQnRFLEdBQ2IsT0FBT3lCLEtBQUttL0MsR0FBRzVnRCxHQUFHcU0sS0FBTS9ILElBQ3BCLE1BQU0vRCxFQUFJLElBQUl3NUQsR0FBR3oxRCxFQUFFeXRELGlCQUNuQixPQUFPenRELEVBQUV5dEQsZ0JBQWtCeHhELEVBQUU4TCxPQUFRNUssS0FBS28vQyxHQUFHN2dELEVBQUdzRSxHQUFHK0gsS0FBSyxJQUFPL0gsRUFBRXl0RCxtQkFHekUsNkJBQTZCL3hELEdBQ3pCLE9BQU95QixLQUFLbS9DLEdBQUc1Z0QsR0FBR3FNLEtBQU1yTSxHQUFLdzVDLEVBQUdxUyxjQUFjLElBQUl6UyxFQUFHcDVDLEVBQUVpeUQsMEJBQTBCMThDLFFBQVN2VixFQUFFaXlELDBCQUEwQjVZLGVBRTFILHlCQUF5QnI1QyxHQUNyQixPQUFPeUIsS0FBS20vQyxHQUFHNWdELEdBQUdxTSxLQUFNck0sR0FBS0EsRUFBRWd5RCw2QkFFbkMsbUJBQW1CaHlELEVBQUdzRSxFQUFHL0QsR0FDckIsT0FBT2tCLEtBQUttL0MsR0FBRzVnRCxHQUFHcU0sS0FBTXhMLElBQU1BLEVBQUVteEQsNEJBQThCMXRELEVBQUcvRCxJQUFNTSxFQUFFb3hELDBCQUE0QjF4RCxFQUFFb3JELGVBQ3ZHcm5ELEVBQUl6RCxFQUFFbXhELDhCQUFnQ254RCxFQUFFbXhELDRCQUE4QjF0RCxHQUFJN0MsS0FBS28vQyxHQUFHN2dELEVBQUdhLEtBRXpGLGNBQWNiLEVBQUdzRSxHQUNiLE9BQU83QyxLQUFLcS9DLEdBQUc5Z0QsRUFBR3NFLEdBQUcrSCxLQUFLLElBQU81SyxLQUFLbS9DLEdBQUc1Z0QsR0FBR3FNLEtBQU05TCxJQUFNQSxFQUFFMnhELGFBQWUsRUFBR3p3RCxLQUFLMC9DLEdBQUc3OEMsRUFBRy9ELEdBQ3ZGa0IsS0FBS28vQyxHQUFHN2dELEVBQUdPLE1BRWYsaUJBQWlCUCxFQUFHc0UsR0FDaEIsT0FBTzdDLEtBQUtxL0MsR0FBRzlnRCxFQUFHc0UsR0FFdEIsaUJBQWlCdEUsRUFBR3NFLEdBQ2hCLE9BQU83QyxLQUFLdzRELDhCQUE4Qmo2RCxFQUFHc0UsRUFBRXlsRCxVQUFVMTlDLEtBQUssSUFBTzZ0RCxHQUFHbDZELEdBQUcwMkIsT0FBT3B5QixFQUFFeWxELFdBQVkxOUMsS0FBSyxJQUFPNUssS0FBS20vQyxHQUFHNWdELElBQUtxTSxLQUFNL0gsSUFBTXF4QyxFQUFFcnhDLEVBQUU0dEQsWUFBYyxHQUN2SjV0RCxFQUFFNHRELGFBQWUsRUFBR3p3RCxLQUFLby9DLEdBQUc3Z0QsRUFBR3NFLEtBTTVCLGNBQWN0RSxFQUFHc0UsRUFBRy9ELEdBQ3ZCLElBQUlNLEVBQUksRUFDUixNQUFNL0IsRUFBSSxHQUNWLE9BQU9vN0QsR0FBR2w2RCxHQUFHcStDLEdBQUcsQ0FBRXorQyxFQUFHTCxLQUNqQixNQUFNdUssRUFBSW10RCxHQUFHMTNELEdBQ2J1SyxFQUFFNm5ELGdCQUFrQnJ0RCxHQUFLLE9BQVMvRCxFQUFFWixJQUFJbUssRUFBRWlnRCxZQUFjbHBELElBQUsvQixFQUFFK0QsS0FBS3BCLEtBQUswNEQsaUJBQWlCbjZELEVBQUc4SixPQUM3RnVDLEtBQUssSUFBTzRtRCxHQUFHUSxRQUFRMzBELElBQUt1TixLQUFLLElBQU94TCxHQUl6QyxjQUFjYixFQUFHc0UsR0FDcEIsT0FBTzQxRCxHQUFHbDZELEdBQUdxK0MsR0FBRyxDQUFFcitDLEVBQUdPLEtBQ2pCLE1BQU1NLEVBQUlvMkQsR0FBRzEyRCxHQUNiK0QsRUFBRXpELEtBR1YsR0FBR2IsR0FDQyxPQUFPbzZELEdBQUdwNkQsR0FBR0wsSUFBSW15RCxHQUFHenhELEtBQUtnTSxLQUFNck0sSUFBTTIxQyxFQUFFLE9BQVMzMUMsR0FBSUEsSUFFeEQsR0FBR0EsRUFBR3NFLEdBQ0YsT0FBTzgxRCxHQUFHcDZELEdBQUcwNkIsSUFBSW8zQixHQUFHenhELElBQUtpRSxHQUU3QixHQUFHdEUsRUFBR3NFLEdBQ0YsT0FBTzQxRCxHQUFHbDZELEdBQUcwNkIsSUFBSXc4QixHQUFHejFELEtBQUswSSxFQUFHN0YsSUFNekIsR0FBR3RFLEVBQUdzRSxHQUNULElBQUkvRCxHQUFJLEVBQ1IsT0FBT1AsRUFBRStwRCxTQUFXemxELEVBQUV5dEQsa0JBQW9CenRELEVBQUV5dEQsZ0JBQWtCL3hELEVBQUUrcEQsU0FBVXhwRCxHQUFJLEdBQzlFUCxFQUFFMnhELGVBQWlCcnRELEVBQUUwdEQsOEJBQWdDMXRELEVBQUUwdEQsNEJBQThCaHlELEVBQUUyeEQsZUFDdkZweEQsR0FBSSxHQUFLQSxFQUViLGVBQWVQLEdBQ1gsT0FBT3lCLEtBQUttL0MsR0FBRzVnRCxHQUFHcU0sS0FBTXJNLEdBQUtBLEVBQUVreUQsYUFFbkMsY0FBY2x5RCxFQUFHc0UsR0FJYixNQUFNL0QsRUFBSXcvQyxHQUFHejdDLEdBQUl6RCxFQUFJZzNELFlBQVlDLE1BQU0sQ0FBRXYzRCxFQUFHNFUsT0FBTzhqRCxtQkFBcUIsQ0FBRTE0RCxFQUFHNFUsT0FBTytqRCxvQkFDcEYsSUFBSXA2RCxFQUFJLEtBQ1IsT0FBT283RCxHQUFHbDZELEdBQUdxK0MsR0FBRyxDQUNaNlcsTUFBT3IwRCxFQUNQbzBELE1BQU83RCxHQUFHSSx1QkFDWCxDQUFFeHhELEVBQUdPLEVBQUdNLEtBQ1AsTUFBTWpCLEVBQUlxM0QsR0FBRzEyRCxHQUdENC9DLEdBQUc3N0MsRUFBRzFFLEVBQUU4RSxVQUFZNUYsRUFBSWMsRUFBR2lCLEVBQUVtMEQsVUFDekMzb0QsS0FBSyxJQUFPdk4sR0FFcEIsZ0JBQWdCa0IsRUFBR3NFLEVBQUcvRCxHQUdsQixNQUFNTSxFQUFJLEdBQUkvQixFQUFJdTdELEdBQUdyNkQsR0FDckIsT0FBT3NFLEVBQUVzRyxRQUFTdEcsSUFDZCxNQUFNMUUsRUFBSW92RCxHQUFHMXFELEVBQUVrTixNQUNmM1EsRUFBRWdDLEtBQUsvRCxFQUFFNDdCLElBQUksSUFBSWczQixHQUFHbnhELEVBQUdYLEtBQU1pQixFQUFFZ0MsS0FBS3BCLEtBQUt1M0Qsa0JBQWtCc0IsYUFBYXQ2RCxFQUFHTyxFQUFHK0QsTUFDN0UydUQsR0FBR1EsUUFBUTV5RCxHQUVwQixtQkFBbUJiLEVBQUdzRSxFQUFHL0QsR0FHckIsTUFBTU0sRUFBSXc1RCxHQUFHcjZELEdBQ2IsT0FBT2l6RCxHQUFHcm9ELFFBQVF0RyxFQUFJQSxJQUNsQixNQUFNeEYsRUFBSWt3RCxHQUFHMXFELEVBQUVrTixNQUNmLE9BQU95aEQsR0FBR1EsUUFBUSxDQUFFNXlELEVBQUU2MUIsT0FBTyxDQUFFbjJCLEVBQUd6QixJQUFNMkMsS0FBS3UzRCxrQkFBa0J1QixnQkFBZ0J2NkQsRUFBR08sRUFBRytELE9BRzdGLDhCQUE4QnRFLEVBQUdzRSxHQUM3QixNQUFNL0QsRUFBSTg1RCxHQUFHcjZELEdBQUlhLEVBQUlnM0QsWUFBWUMsTUFBTSxDQUFFeHpELEdBQUssQ0FBRUEsRUFBSSxJQUNyQyxHQUNBLEdBQ2YsT0FBTy9ELEVBQUVtMkIsT0FBTzcxQixHQUVwQiwyQkFBMkJiLEVBQUdzRSxHQUMxQixNQUFNL0QsRUFBSXMzRCxZQUFZQyxNQUFNLENBQUV4ekQsR0FBSyxDQUFFQSxFQUFJLElBQzFCLEdBQ0EsR0FBS3pELEVBQUl3NUQsR0FBR3I2RCxHQUMzQixJQUFJbEIsRUFBSThwRCxLQUNSLE9BQU8vbkQsRUFBRXc5QyxHQUFHLENBQ1I2VyxNQUFPMzBELEVBQ1A2OUMsSUFBSSxHQUNMLENBQUVwK0MsRUFBR3NFLEVBQUcvRCxLQUNQLE1BQU1NLEVBQUlzdUQsR0FBR252RCxFQUFFLElBQUtKLEVBQUksSUFBSTA4QyxHQUFHejdDLEdBQy9CL0IsRUFBSUEsRUFBRSttQixJQUFJam1CLEtBQ1Z5TSxLQUFLLElBQU92TixHQUVwQixZQUFZa0IsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUl5dUQsR0FBRzFxRCxFQUFFa04sTUFBTzNRLEVBQUlnM0QsWUFBWUMsTUFBTSxDQUFFdjNELEdBQUssQ0FBRTQ0QyxFQUFHNTRDLEtBQ3pDLEdBQ0EsR0FDZixJQUFJekIsRUFBSSxFQUNSLE9BQU91N0QsR0FBR3I2RCxHQUFHcStDLEdBQUcsQ0FDWjRXLE1BQU92RCxHQUFHRSxxQkFDVnhULElBQUksRUFDSjhXLE1BQU9yMEQsR0FDUixFQUFHYixFQUFHc0UsR0FBSS9ELEVBQUdNLEtBSVosSUFBTWIsSUFBTWxCLElBQUsrQixFQUFFbTBELFVBQ25CM29ELEtBQUssSUFBT3ZOLEVBQUksR0FVeEIsR0FBR2tCLEVBQUdzRSxHQUNGLE9BQU80MUQsR0FBR2w2RCxHQUFHTCxJQUFJMkUsR0FBRytILEtBQU1yTSxHQUFLQSxFQUFJaTNELEdBQUdqM0QsR0FBSyxPQU0vQyxTQUFTazZELEdBQUdsNkQsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBR294RCxHQUFHM0IsT0FLaEIsU0FBUzJLLEdBQUdwNkQsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBRzh4RCxHQUFHckMsT0FLaEIsU0FBUzRLLEdBQUdyNkQsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBRzB4RCxHQUFHakM7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QmhCbDlDLGVBQWVpb0QsR0FBR3g2RCxHQUNsQixHQUFJQSxFQUFFeUksT0FBU3F0QyxFQUFFVSxxQkFBdUJ4MkMsRUFBRTBJLFVBQVlvcUQsR0FBSSxNQUFNOXlELEVBQ2hFbTFDLEVBQUUsYUFBYzs7Ozs7Ozs7Ozs7Ozs7OztHQWtCaEIsU0FBU3NsQixJQUFJejZELEVBQUdzRSxJQUFLL0QsRUFBR00sSUFDeEIsTUFBTS9CLEVBQUlrNkMsRUFBR2g1QyxFQUFHTyxHQUNoQixPQUFPLElBQU16QixFQUFJazZDLEVBQUcxMEMsRUFBR3pELEdBQUsvQixFQU81QixNQUFNNDdELEdBQ04sWUFBWTE2RCxHQUNSeUIsS0FBS3krQyxHQUFLbGdELEVBQUd5QixLQUFLazVELE9BQVMsSUFBSTdTLEdBQUcyUyxJQUFLaDVELEtBQUs0L0MsR0FBSyxFQUVyRCxLQUNJLFFBQVM1L0MsS0FBSzQvQyxHQUVsQixHQUFHcmhELEdBQ0MsTUFBTXNFLEVBQUksQ0FBRXRFLEVBQUd5QixLQUFLMitDLE1BQ3BCLEdBQUkzK0MsS0FBS2s1RCxPQUFPaGtDLEtBQU9sMUIsS0FBS3krQyxHQUFJeitDLEtBQUtrNUQsT0FBU2w1RCxLQUFLazVELE9BQU85MEMsSUFBSXZoQixPQUFTLENBQ25FLE1BQU10RSxFQUFJeUIsS0FBS2s1RCxPQUFPQyxPQUN0QkgsR0FBR24yRCxFQUFHdEUsR0FBSyxJQUFNeUIsS0FBS2s1RCxPQUFTbDVELEtBQUtrNUQsT0FBT2prQyxPQUFPMTJCLEdBQUc2bEIsSUFBSXZoQixLQUdqRSxlQU9JLE9BQU83QyxLQUFLazVELE9BQU9DLE9BQU8sSUFPOUIsTUFBTUMsR0FDTixZQUFZNzZELEVBQUdzRSxHQUNYN0MsS0FBS3E1RCxpQkFBbUI5NkQsRUFBR3lCLEtBQUtzNUQsV0FBYXoyRCxFQUFHN0MsS0FBSzQrQyxJQUFLLEVBQUk1K0MsS0FBSzJhLEdBQUssS0FFNUUsTUFBTXBjLElBQ0QsSUFBTXlCLEtBQUtxNUQsaUJBQWlCcHdELE9BQU8ydEQsOEJBQWdDNTJELEtBQUtnZ0QsR0FBR3poRCxHQUVoRixPQUNJeUIsS0FBSzJhLEtBQU8zYSxLQUFLMmEsR0FBRzBvQixTQUFVcmpDLEtBQUsyYSxHQUFLLE1BRTVDLGNBQ0ksT0FBTyxPQUFTM2EsS0FBSzJhLEdBRXpCLEdBQUdwYyxHQUNDLE1BQU1zRSxFQUFJN0MsS0FBSzQrQyxHQUFLLElBQU0sSUFDMUJsTCxFQUFFLHNCQUF1QixtQ0FBbUM3d0MsT0FBUTdDLEtBQUsyYSxHQUFLM2EsS0FBS3M1RCxXQUFXQyxrQkFBa0IseUJBQXNEMTJELEVBQUcsVUFDcks3QyxLQUFLMmEsR0FBSyxLQUFNM2EsS0FBSzQrQyxJQUFLLEVBQzFCLFVBQ1VyZ0QsRUFBRWk3RCxlQUFleDVELEtBQUtxNUQsa0JBQzlCLE1BQU85NkQsR0FDTDQwRCxHQUFHNTBELEdBQUttMUMsRUFBRSxzQkFBdUIsdURBQXdEbjFDLFNBQVd3NkQsR0FBR3g2RCxTQUVyR3lCLEtBQUtnZ0QsR0FBR3poRCxNQUs4QixNQUFNazdELEdBQzFELFlBQVlsN0QsRUFBR3NFLEdBQ1g3QyxLQUFLaWdELEdBQUsxaEQsRUFBR3lCLEtBQUtpSixPQUFTcEcsRUFFL0IscUJBQXFCdEUsRUFBR3NFLEdBQ3BCLE9BQU83QyxLQUFLaWdELEdBQUdDLEdBQUczaEQsR0FBR3FNLEtBQU1yTSxHQUFLb1IsS0FBS3VuQixNQUFNcjBCLEVBQUksSUFBTXRFLElBRXpELGtCQUFrQkEsRUFBR3NFLEdBQ2pCLEdBQUksSUFBTUEsRUFBRyxPQUFPMnVELEdBQUc5dEQsUUFBUW16QyxFQUFHUSxHQUNsQyxNQUFNdjRDLEVBQUksSUFBSW02RCxHQUFHcDJELEdBQ2pCLE9BQU83QyxLQUFLaWdELEdBQUcrSSxjQUFjenFELEVBQUlBLEdBQUtPLEVBQUUrZ0QsR0FBR3RoRCxFQUFFMnhELGlCQUFrQnRsRCxLQUFLLElBQU81SyxLQUFLaWdELEdBQUdFLEdBQUc1aEQsRUFBSUEsR0FBS08sRUFBRStnRCxHQUFHdGhELEtBQU9xTSxLQUFLLElBQU85TCxFQUFFNDZELFVBRTdILGNBQWNuN0QsRUFBR3NFLEVBQUcvRCxHQUNoQixPQUFPa0IsS0FBS2lnRCxHQUFHMFosY0FBY3A3RCxFQUFHc0UsRUFBRy9ELEdBRXZDLHdCQUF3QlAsRUFBR3NFLEdBQ3ZCLE9BQU83QyxLQUFLaWdELEdBQUcyWix3QkFBd0JyN0QsRUFBR3NFLEdBRTlDLFFBQVF0RSxFQUFHc0UsR0FDUCxPQUFRLElBQU03QyxLQUFLaUosT0FBTzJ0RCw4QkFBZ0NsakIsRUFBRSxzQkFBdUIsd0NBQ25GOGQsR0FBRzl0RCxRQUFRNHlELEtBQU90MkQsS0FBSzY1RCxhQUFhdDdELEdBQUdxTSxLQUFNOUwsR0FBS0EsRUFBSWtCLEtBQUtpSixPQUFPMnRELDhCQUFnQ2xqQixFQUFFLHNCQUF1QiwwQ0FBMEM1MEMsNkJBQTZCa0IsS0FBS2lKLE9BQU8ydEQsZ0NBQzlNTixJQUFNdDJELEtBQUtvZ0QsR0FBRzdoRCxFQUFHc0UsSUFFckIsYUFBYXRFLEdBQ1QsT0FBT3lCLEtBQUtpZ0QsR0FBRzRaLGFBQWF0N0QsR0FFaEMsR0FBR0EsRUFBR3NFLEdBQ0YsSUFBSS9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUFHTCxFQUFHSixFQUFHb0UsRUFDdEIsTUFBTXUwQyxFQUFJanpDLEtBQUsrUixNQUNmLE9BQU9uVixLQUFLODVELHFCQUFxQnY3RCxFQUFHeUIsS0FBS2lKLE9BQU80dEQscUJBQXFCanNELEtBQU0vSCxJQUUzRUEsRUFBSTdDLEtBQUtpSixPQUFPNnRELGlDQUFtQ3BqQixFQUFFLHNCQUF1Qiw4REFBOEQxekMsS0FBS2lKLE9BQU82dEQsd0NBQXdDajBELEtBQzlMekQsRUFBSVksS0FBS2lKLE9BQU82dEQsaUNBQW1DMTNELEVBQUl5RCxFQUFHMUUsRUFBSWlGLEtBQUsrUixNQUFPblYsS0FBSys1RCxrQkFBa0J4N0QsRUFBR2EsS0FBTXdMLEtBQU14TCxJQUFNTixFQUFJTSxFQUMxSHRCLEVBQUlzRixLQUFLK1IsTUFBT25WLEtBQUsyNUQsY0FBY3A3RCxFQUFHTyxFQUFHK0QsS0FBTStILEtBQU0vSCxJQUFNeEYsRUFBSXdGLEVBQUduRixFQUFJMEYsS0FBSytSLE1BQzNFblYsS0FBSzQ1RCx3QkFBd0JyN0QsRUFBR08sS0FBTThMLEtBQU1yTSxJQUNwQ3VELEVBQUlzQixLQUFLK1IsTUFBT3pNLEtBQU8sSUFBU2lyQyxPQUNoQ0QsRUFBRSxzQkFBdUIsZ0RBQWdEdjFDLEVBQUlrNEMseUNBQXlDajNDLFNBQVd0QixFQUFJSyxHQUFLLE9BQVMsYUFBYWQsaUJBQW1CSyxFQUFJSSxHQUFLLE9BQVMsYUFBYVMsbUJBQXFCdUQsRUFBSXBFLEdBQUssT0FBUyxtQkFBbUJvRSxFQUFJdTBDLE9BRTdRbWIsR0FBRzl0RCxRQUFRLENBQ2Q2eUQsUUFBUSxFQUNSQyx5QkFBMEJwM0QsRUFDMUJxM0QsZUFBZ0JwNUQsRUFDaEJxNUQsaUJBQWtCbjREOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJsQyxNQUFNeTdELEdBQ0YsWUFBWXo3RCxFQUFHc0UsR0FDWDdDLEtBQUtvNEIsR0FBSzc1QixFQUFHeUIsS0FBS3E1RCxpQkFBbUIsU0FBUzk2RCxFQUFHc0UsR0FDN0MsT0FBTyxJQUFJNDJELEdBQUdsN0QsRUFBR3NFLEdBRGdCLENBRW5DN0MsS0FBTTZDLEdBRVosR0FBR3RFLEdBQ0MsTUFBTXNFLEVBQUk3QyxLQUFLcWdELEdBQUc5aEQsR0FDbEIsT0FBT3lCLEtBQUtvNEIsR0FBRzZoQyxpQkFBaUJDLGVBQWUzN0QsR0FBR3FNLEtBQU1yTSxHQUFLc0UsRUFBRStILEtBQU0vSCxHQUFLdEUsRUFBSXNFLElBRWxGLEdBQUd0RSxHQUNDLElBQUlzRSxFQUFJLEVBQ1IsT0FBTzdDLEtBQUttZ0QsR0FBRzVoRCxFQUFJQSxJQUNmc0UsTUFDQStILEtBQUssSUFBTy9ILEdBRXBCLGNBQWN0RSxFQUFHc0UsR0FDYixPQUFPN0MsS0FBS280QixHQUFHNmhDLGlCQUFpQmpSLGNBQWN6cUQsRUFBR3NFLEdBRXJELEdBQUd0RSxFQUFHc0UsR0FDRixPQUFPN0MsS0FBS3VnRCxHQUFHaGlELEVBQUcsQ0FBRUEsRUFBR08sSUFBTStELEVBQUUvRCxJQUVuQyxhQUFhUCxFQUFHc0UsRUFBRy9ELEdBQ2YsT0FBT3E3RCxHQUFHNTdELEVBQUdPLEdBRWpCLGdCQUFnQlAsRUFBR3NFLEVBQUcvRCxHQUNsQixPQUFPcTdELEdBQUc1N0QsRUFBR08sR0FFakIsY0FBY1AsRUFBR3NFLEVBQUcvRCxHQUNoQixPQUFPa0IsS0FBS280QixHQUFHNmhDLGlCQUFpQk4sY0FBY3A3RCxFQUFHc0UsRUFBRy9ELEdBRXhELHdCQUF3QlAsRUFBR3NFLEdBQ3ZCLE9BQU9zM0QsR0FBRzU3RCxFQUFHc0UsR0FPVixHQUFHdEUsRUFBR3NFLEdBQ1QsT0FBTyxTQUFTdEUsRUFBR3NFLEdBQ2YsSUFBSS9ELEdBQUksRUFDUixPQUFPdTVELEdBQUc5NUQsR0FBRzYrQyxHQUFJaCtDLEdBQUtnNUQsR0FBRzc1RCxFQUFHYSxFQUFHeUQsR0FBRytILEtBQU1yTSxJQUFNQSxJQUFNTyxHQUFJLEdBQUsweUQsR0FBRzl0RCxTQUFTbkYsTUFBUXFNLEtBQUssSUFBTzlMLEdBRjFGLENBR0xQLEVBQUdzRSxHQUVULHdCQUF3QnRFLEVBQUdzRSxHQUN2QixNQUFNL0QsRUFBSWtCLEtBQUtvNEIsR0FBR2dpQyx5QkFBeUJDLGtCQUFtQmo3RCxFQUFJLEdBQ2xFLElBQUkvQixFQUFJLEVBQ1IsT0FBTzJDLEtBQUt1Z0QsR0FBR2hpRCxFQUFHLENBQUVKLEVBQUdMLEtBQ25CLEdBQUlBLEdBQUsrRSxFQUFHLENBQ1IsTUFBTUEsRUFBSTdDLEtBQUt3Z0QsR0FBR2ppRCxFQUFHSixHQUFHeU0sS0FBTS9ILElBQzFCLElBQUtBLEVBR0wsT0FBT3hGLElBQUt5QixFQUFFdzdELFNBQVMvN0QsRUFBR0osR0FBR3lNLEtBQUssS0FBUTlMLEVBQUV5N0QsWUFBWXA4RCxHQUFJeTZELEdBQUdyNkQsR0FBRzAyQixPQUFPLENBQUUsRUFBR3M0QixHQUFHcHZELEVBQUU0UixZQUV2RjNRLEVBQUVnQyxLQUFLeUIsTUFFWCtILEtBQUssSUFBTzRtRCxHQUFHUSxRQUFRNXlELElBQUt3TCxLQUFLLElBQU85TCxFQUFFMDdELE1BQU1qOEQsSUFBS3FNLEtBQUssSUFBT3ZOLEdBRXpFLGFBQWFrQixFQUFHc0UsR0FDWixNQUFNL0QsRUFBSStELEVBQUU0M0QsbUJBQW1CbDhELEVBQUV3MUQsdUJBQ2pDLE9BQU8vekQsS0FBS280QixHQUFHNmhDLGlCQUFpQlMsaUJBQWlCbjhELEVBQUdPLEdBRXhELG9CQUFvQlAsRUFBR3NFLEdBQ25CLE9BQU9zM0QsR0FBRzU3RCxFQUFHc0UsR0FPVixHQUFHdEUsRUFBR3NFLEdBQ1QsTUFBTS9ELEVBQUk4NUQsR0FBR3I2RCxHQUNiLElBQUlhLEVBQUcvQixFQUFJdzVDLEVBQUdRLEVBQ2QsT0FBT3Y0QyxFQUFFODlDLEdBQUcsQ0FDUjRXLE1BQU92RCxHQUFHRSxzQkFDWCxFQUFHNXhELEVBQUdPLElBQUtpUixLQUFNNVIsRUFBRyt4RCxlQUFnQnB5RCxNQUNuQyxJQUFNUyxHQUdObEIsSUFBTXc1QyxFQUFHUSxHQUFLeDBDLEVBQUUsSUFBSWc0QyxHQUFHNlMsR0FBR3R1RCxJQUFLL0IsR0FLL0JBLEVBQUlTLEVBQUdzQixFQUFJakIsR0FHWGQsRUFBSXc1QyxFQUFHUSxJQUNQenNDLEtBQUssS0FJTHZOLElBQU13NUMsRUFBR1EsR0FBS3gwQyxFQUFFLElBQUlnNEMsR0FBRzZTLEdBQUd0dUQsSUFBSy9CLEtBR3ZDLGFBQWFrQixHQUNULE9BQU95QixLQUFLbzRCLEdBQUdnaUMseUJBQXlCTyxRQUFRcDhELElBSXhELFNBQVM0N0QsR0FBRzU3RCxFQUFHc0UsR0FDWCxPQUFPKzFELEdBQUdyNkQsR0FBRzA2QixJQUtiLFNBQVMxNkIsRUFBR3NFLEdBQ1IsT0FBTyxJQUFJb3RELEdBQUcsRUFBRzFDLEdBQUdodkQsRUFBRXdSLE1BQU9sTixHQURqQyxDQUVFQSxFQUFHdEUsRUFBRXcxRDs7Ozs7Ozs7Ozs7Ozs7OztHQXdCUCxNQUFNNkcsR0FDTixZQUFZcjhELEVBQUdzRSxHQUNYN0MsS0FBSzY2RCxTQUFXdDhELEVBQUd5QixLQUFLODZELFNBQVdqNEQsRUFPbkM3QyxLQUFLKzZELE1BQVEsR0FFc0QsSUFBSXg4RCxHQUN2RSxNQUFNc0UsRUFBSTdDLEtBQUs2NkQsU0FBU3Q4RCxHQUFJTyxFQUFJa0IsS0FBSys2RCxNQUFNbDRELEdBQzNDLFFBQUksSUFBVy9ELEVBQUcsSUFBSyxNQUFPK0QsRUFBR3pELEtBQU1OLEVBQUcsR0FBSWtCLEtBQUs4NkQsU0FBU2o0RCxFQUFHdEUsR0FBSSxPQUFPYSxFQUU5RSxJQUFJYixHQUNBLFlBQU8sSUFBV3lCLEtBQUs5QixJQUFJSyxHQUVjLElBQUlBLEVBQUdzRSxHQUNoRCxNQUFNL0QsRUFBSWtCLEtBQUs2NkQsU0FBU3Q4RCxHQUFJYSxFQUFJWSxLQUFLKzZELE1BQU1qOEQsR0FDM0MsUUFBSSxJQUFXTSxFQUFHLENBQ2QsSUFBSyxJQUFJTixFQUFJLEVBQUdBLEVBQUlNLEVBQUVJLE9BQVFWLElBQUssR0FBSWtCLEtBQUs4NkQsU0FBUzE3RCxFQUFFTixHQUFHLEdBQUlQLEdBQUksWUFBYWEsRUFBRU4sR0FBSyxDQUFFUCxFQUFHc0UsSUFDM0Z6RCxFQUFFZ0MsS0FBSyxDQUFFN0MsRUFBR3NFLFNBQ1Q3QyxLQUFLKzZELE1BQU1qOEQsR0FBSyxDQUFFLENBQUVQLEVBQUdzRSxJQUkzQixPQUFPdEUsR0FDVixNQUFNc0UsRUFBSTdDLEtBQUs2NkQsU0FBU3Q4RCxHQUFJTyxFQUFJa0IsS0FBSys2RCxNQUFNbDRELEdBQzNDLFFBQUksSUFBVy9ELEVBQUcsT0FBTyxFQUN6QixJQUFLLElBQUlNLEVBQUksRUFBR0EsRUFBSU4sRUFBRVUsT0FBUUosSUFBSyxHQUFJWSxLQUFLODZELFNBQVNoOEQsRUFBRU0sR0FBRyxHQUFJYixHQUFJLE9BQU8sSUFBTU8sRUFBRVUsY0FBZ0JRLEtBQUsrNkQsTUFBTWw0RCxHQUFLL0QsRUFBRXkyRCxPQUFPbjJELEVBQUcsSUFDN0gsRUFDQSxPQUFPLEVBRVgsUUFBUWIsR0FDSjY1QyxFQUFHcDRDLEtBQUsrNkQsTUFBTyxDQUFFbDRELEVBQUcvRCxLQUNoQixJQUFLLE1BQU8rRCxFQUFHekQsS0FBTU4sRUFBR1AsRUFBRXNFLEVBQUd6RCxLQUdyQyxVQUNJLE9BQU9pNUMsRUFBR3I0QyxLQUFLKzZEOzs7Ozs7Ozs7Ozs7Ozs7O0dBaUNuQixNQUFNQyxHQUNOLGNBR0loN0QsS0FBS2k3RCxRQUFVLElBQUlMLEdBQUlyOEQsR0FBS0EsRUFBRW1ILFdBQWEsQ0FBRW5ILEVBQUdzRSxJQUFNdEUsRUFBRTI1QyxRQUFRcjFDLElBQU03QyxLQUFLazdELGdCQUFpQixFQUVoRyxZQUFZMzhELEdBQ1IsTUFBTXNFLEVBQUk3QyxLQUFLaTdELFFBQVEvOEQsSUFBSUssR0FDM0IsT0FBT3NFLEVBQUlBLEVBQUVrc0QsU0FBV2hYLEVBQUdub0MsTUFPeEIsU0FBU3JSLEVBQUdzRSxHQUNmN0MsS0FBS203RCxtQkFBb0JuN0QsS0FBS2k3RCxRQUFRbHNELElBQUl4USxFQUFFSyxJQUFLLENBQzdDd2tCLFNBQVU3a0IsRUFDVnd3RCxTQUFVbHNELElBUVgsWUFBWXRFLEVBQUdzRSxFQUFJLE1BQ3RCN0MsS0FBS203RCxtQkFBb0JuN0QsS0FBS2k3RCxRQUFRbHNELElBQUl4USxFQUFHLENBQ3pDNmtCLFNBQVVrNkIsR0FBRzhkLG1CQUFtQjc4RCxHQUNoQ3d3RCxTQUFVbHNELElBYVgsU0FBU3RFLEVBQUdzRSxHQUNmN0MsS0FBS203RCxtQkFDTCxNQUFNcjhELEVBQUlrQixLQUFLaTdELFFBQVEvOEQsSUFBSTJFLEdBQzNCLFlBQU8sSUFBVy9ELEVBQUkweUQsR0FBRzl0RCxRQUFRNUUsRUFBRXNrQixVQUFZcGpCLEtBQUtxN0QsYUFBYTk4RCxFQUFHc0UsR0FXakUsV0FBV3RFLEVBQUdzRSxHQUNqQixPQUFPN0MsS0FBS3M3RCxnQkFBZ0IvOEQsRUFBR3NFLEdBSzVCLE1BQU10RSxHQUNULE9BQU95QixLQUFLbTdELG1CQUFvQm43RCxLQUFLazdELGdCQUFpQixFQUFJbDdELEtBQUtrOUMsYUFBYTMrQyxHQUUzQjs7Ozs7Ozs7Ozs7Ozs7OztHQXNCckQsTUFBTWc5RCxHQUtOLFlBQVloOUQsRUFBR3NFLEdBQ1g3QyxLQUFLMEksRUFBSW5LLEVBQUd5QixLQUFLK2dELEdBQUtsK0MsRUFPbkIsU0FBU3RFLEVBQUdzRSxFQUFHL0QsR0FDbEIsT0FBTzA4RCxHQUFHajlELEdBQUcwNkIsSUFBSXdpQyxHQUFHNTRELEdBQUkvRCxHQU9yQixZQUFZUCxFQUFHc0UsR0FDbEIsTUFBTS9ELEVBQUkwOEQsR0FBR2o5RCxHQUFJYSxFQUFJcThELEdBQUc1NEQsR0FDeEIsT0FBTy9ELEVBQUVtMkIsT0FBTzcxQixHQU9iLGVBQWViLEVBQUdzRSxHQUNyQixPQUFPN0MsS0FBSzA3RCxZQUFZbjlELEdBQUdxTSxLQUFNOUwsSUFBTUEsRUFBRTR3RCxVQUFZN3NELEVBQUc3QyxLQUFLMGdELEdBQUduaUQsRUFBR08sS0FFdkUsU0FBU1AsRUFBR3NFLEdBQ1IsT0FBTzI0RCxHQUFHajlELEdBQUdMLElBQUl1OUQsR0FBRzU0RCxJQUFJK0gsS0FBTXJNLEdBQUt5QixLQUFLMmdELEdBQUc5OUMsRUFBR3RFLElBTzNDLEdBQUdBLEVBQUdzRSxHQUNULE9BQU8yNEQsR0FBR2o5RCxHQUFHTCxJQUFJdTlELEdBQUc1NEQsSUFBSStILEtBQU1yTSxJQUFLLENBQy9CNmtCLFNBQVVwakIsS0FBSzJnRCxHQUFHOTlDLEVBQUd0RSxHQUNyQjIyQixLQUFNaWlDLEdBQUc1NEQsTUFHakIsV0FBV0EsRUFBR3NFLEdBQ1YsSUFBSS9ELEVBQUkrbkQsS0FDUixPQUFPN21ELEtBQUs2Z0QsR0FBR3RpRCxFQUFHc0UsRUFBRyxDQUFFdEUsRUFBR3NFLEtBQ3RCLE1BQU16RCxFQUFJWSxLQUFLMmdELEdBQUdwaUQsRUFBR3NFLEdBQ3JCL0QsRUFBSUEsRUFBRWdtRCxPQUFPdm1ELEVBQUdhLEtBQ2hCd0wsS0FBSyxJQUFPOUwsR0FRYixHQUFHUCxFQUFHc0UsR0FDVCxJQUFJL0QsRUFBSStuRCxLQUFNem5ELEVBQUksSUFBSXNsRCxHQUFHN0osR0FBR3BDLFlBQzVCLE9BQU96NEMsS0FBSzZnRCxHQUFHdGlELEVBQUdzRSxFQUFHLENBQUV0RSxFQUFHc0UsS0FDdEIsTUFBTXhGLEVBQUkyQyxLQUFLMmdELEdBQUdwaUQsRUFBR3NFLEdBQ3JCL0QsRUFBSUEsRUFBRWdtRCxPQUFPdm1ELEVBQUdsQixHQUFJK0IsRUFBSUEsRUFBRTBsRCxPQUFPdm1ELEVBQUc0NEQsR0FBR3QwRCxNQUN2QytILEtBQUssS0FBTyxDQUNacWhELFVBQVdudEQsRUFDWGtpRCxHQUFJNWhELEtBR1osR0FBR2IsRUFBR3NFLEVBQUcvRCxHQUNMLEdBQUkrRCxFQUFFc0YsVUFBVyxPQUFPcXBELEdBQUc5dEQsVUFDM0IsTUFBTXRFLEVBQUlnM0QsWUFBWUMsTUFBTXh6RCxFQUFFODRELFFBQVE1ckQsS0FBSzhvQyxVQUFXaDJDLEVBQUVzMkQsT0FBT3BwRCxLQUFLOG9DLFdBQVl4N0MsRUFBSXdGLEVBQUU0akQsY0FDdEYsSUFBSXRvRCxFQUFJZCxFQUFFbXBELFVBQ1YsT0FBT2dWLEdBQUdqOUQsR0FBR3ErQyxHQUFHLENBQ1o2VyxNQUFPcjBELEdBQ1IsQ0FBRWIsRUFBR3NFLEVBQUd6RCxLQUNQLE1BQU10QixFQUFJKzhDLEdBQUdnYSxhQUFhdDJELEdBRWQsS0FBTUosR0FBSzA4QyxHQUFHcEMsV0FBV3Q2QyxFQUFHTCxHQUFLLEdBQUtnQixFQUFFWCxFQUFHLE1BQU9BLEVBQUlkLEVBQUVtcEQsVUFDcEVyb0QsR0FBS0EsRUFBRSs1QyxRQUFRcDZDLEtBRWZnQixFQUFFWCxFQUFHMEUsR0FBSTFFLEVBQUlkLEVBQUVrcEQsVUFBWWxwRCxFQUFFbXBELFVBQVksTUFFekNyb0QsRUFBSWlCLEVBQUVtOUMsR0FBR3ArQyxFQUFFNFIsS0FBSzhvQyxXQUFhejVDLEVBQUVtMEQsU0FDL0Izb0QsS0FBSyxLQUdMLEtBQU16TSxHQUFLVyxFQUFFWCxFQUFHLE1BQU9BLEVBQUlkLEVBQUVrcEQsVUFBWWxwRCxFQUFFbXBELFVBQVksT0FHL0QsMEJBQTBCam9ELEVBQUdzRSxFQUFHL0QsR0FDNUIsSUFBSU0sRUFBSXluRCxLQUNSLE1BQU14cEQsRUFBSXdGLEVBQUVrTixLQUFLdlEsT0FBUyxFQUFHckIsRUFBSSxHQUNqQyxHQUFJVyxFQUFFbzVDLFFBQVFILEVBQUdub0MsT0FBUSxDQUdyQixNQUFNclIsRUFBSXNFLEVBQUVrTixLQUFLOG9DLFVBQ2pCMTZDLEVBQUVzMUQsTUFBUTJDLFlBQVkwQixXQUFXdjVELE9BQzlCLENBSUgsTUFBTUEsRUFBSXNFLEVBQUVrTixLQUFLOG9DLFVBQVd6NUMsRUFBSTYxRCxHQUFHbjJELEdBQ25DWCxFQUFFczFELE1BQVEyQyxZQUFZMEIsV0FBVyxDQUFFdjVELEVBQUdhLElBQzFCLEdBQUtqQixFQUFFcTFELE1BQVF2RSxHQUFHTSx3QkFFbEMsT0FBT2lNLEdBQUdqOUQsR0FBR3ErQyxHQUFHeitDLEVBQUcsQ0FBRUksRUFBR08sRUFBR1gsS0FNdkIsR0FBSUksRUFBRWlCLFNBQVduQyxFQUFHLE9BQ3BCLE1BQU1TLEVBQUk4MkQsR0FBRzUwRCxLQUFLMEksRUFBRzVKLEdBQ3JCK0QsRUFBRWtOLEtBQUtxcEMsV0FBV3Q3QyxFQUFFYyxJQUFJbVIsTUFBUWl4QyxHQUFHbitDLEVBQUcvRSxLQUFPc0IsRUFBSUEsRUFBRTBsRCxPQUFPaG5ELEVBQUVjLElBQUtkLElBQU1LLEVBQUVvMUQsU0FDekUzb0QsS0FBSyxJQUFPeEwsR0FFcEIsZ0JBQWdCYixHQUNaLE9BQU8sSUFBSXE5RCxHQUFHNTdELE9BQVF6QixHQUFLQSxFQUFFczlELGVBRWpDLFFBQVF0OUQsR0FDSixPQUFPeUIsS0FBSzA3RCxZQUFZbjlELEdBQUdxTSxLQUFNck0sR0FBS0EsRUFBRW14RCxVQUU1QyxZQUFZbnhELEdBQ1IsT0FBT3U5RCxHQUFHdjlELEdBQUdMLElBQUl1eEQsR0FBRzd3RCxLQUFLZ00sS0FBTXJNLElBQU0yMUMsSUFBSTMxQyxHQUFJQSxJQUVqRCxHQUFHQSxFQUFHc0UsR0FDRixPQUFPaTVELEdBQUd2OUQsR0FBRzA2QixJQUFJdzJCLEdBQUc3d0QsSUFBS2lFLEdBS3RCLEdBQUd0RSxFQUFHc0UsR0FDVCxHQUFJQSxFQUFHLENBQ0gsTUFBTXRFLEVBQUlxMkQsR0FBRzUwRCxLQUFLMEksRUFBRzdGLEdBR1QsSUFBTXRFLEVBQUUyMkQsaUJBQWtCMzJELEVBQUVpL0MsUUFBUXRGLFFBQVFILEVBQUdub0MsT0FBUyxPQUFPclIsRUFFL0UsT0FBTysrQyxHQUFHOGQsbUJBQW1CNzhELElBaUJyQyxNQUFNcTlELFdBQVdaLEdBTWIsWUFBWXo4RCxFQUFHc0UsR0FDWHNFLFFBQVNuSCxLQUFLbWhELEdBQUs1aUQsRUFBR3lCLEtBQUs2N0QsY0FBZ0JoNUQsRUFFM0M3QyxLQUFLb2hELEdBQUssSUFBSXdaLEdBQUlyOEQsR0FBS0EsRUFBRW1ILFdBQWEsQ0FBRW5ILEVBQUdzRSxJQUFNdEUsRUFBRTI1QyxRQUFRcjFDLElBRS9ELGFBQWF0RSxHQUNULE1BQU1zRSxFQUFJLEdBQ1YsSUFBSS9ELEVBQUksRUFBR00sRUFBSSxJQUFJaW5ELEdBQUcsQ0FBRTluRCxFQUFHc0UsSUFBTTAwQyxFQUFHaDVDLEVBQUV1NkMsa0JBQW1CajJDLEVBQUVpMkMsb0JBQzNELE9BQU85NEMsS0FBS2k3RCxRQUFROXhELFFBQVEsQ0FBRTlMLEVBQUdjLEtBQzdCLE1BQU1MLEVBQUlrQyxLQUFLb2hELEdBQUdsakQsSUFBSWIsR0FDdEIsR0FBSWMsRUFBRWlsQixTQUFTaXhDLGtCQUFtQixDQUM5QixNQUFNaHNELEVBQUkyc0QsR0FBR2gxRCxLQUFLbWhELEdBQUd6NEMsRUFBR3ZLLEVBQUVpbEIsU0FBVXBqQixLQUFLKzdELFlBQVkxK0QsSUFDckQrQixFQUFJQSxFQUFFZ2xCLElBQUkvbUIsRUFBRTBTLEtBQUtndEMsV0FDakIsTUFBTXIvQyxFQUFJeTVELEdBQUc5dUQsR0FDYnZKLEdBQUtwQixFQUFJSSxFQUFHK0UsRUFBRXpCLEtBQUtwQixLQUFLbWhELEdBQUc2YSxTQUFTejlELEVBQUdsQixFQUFHZ0wsU0FDdkMsR0FBSXZKLEdBQUtoQixFQUFHa0MsS0FBSzY3RCxjQUFlLENBS25DLE1BQU0vOEQsRUFBSWsyRCxHQUFHaDFELEtBQUttaEQsR0FBR3o0QyxFQUFHNDBDLEdBQUc0TCxjQUFjN3JELEVBQUcwNkMsRUFBR25vQyxPQUFRNVAsS0FBSys3RCxZQUFZMStELElBQ3hFd0YsRUFBRXpCLEtBQUtwQixLQUFLbWhELEdBQUc2YSxTQUFTejlELEVBQUdsQixFQUFHeUIsU0FDM0IrRCxFQUFFekIsS0FBS3BCLEtBQUttaEQsR0FBR29aLFlBQVloOEQsRUFBR2xCLE1BQ3BDK0IsRUFBRStKLFFBQVNySyxJQUNaK0QsRUFBRXpCLEtBQUtwQixLQUFLbWhELEdBQUdKLEdBQUc2VywyQkFBMkJyNUQsRUFBR08sTUFDL0MrRCxFQUFFekIsS0FBS3BCLEtBQUttaEQsR0FBRzhhLGVBQWUxOUQsRUFBR08sSUFBSzB5RCxHQUFHUSxRQUFRbnZELEdBRTFELGFBQWF0RSxFQUFHc0UsR0FFWixPQUFPN0MsS0FBS21oRCxHQUFHUCxHQUFHcmlELEVBQUdzRSxHQUFHK0gsS0FBTXJNLElBQU15QixLQUFLb2hELEdBQUdyeUMsSUFBSWxNLEVBQUd0RSxFQUFFMjJCLE1BQU8zMkIsRUFBRTZrQixXQUVsRSxnQkFBZ0I3a0IsRUFBR3NFLEdBR2YsT0FBTzdDLEtBQUttaEQsR0FBR0wsR0FBR3ZpRCxFQUFHc0UsR0FBRytILEtBQUssRUFBR3FoRCxVQUFXMXRELEVBQUd5aUQsR0FBSW4rQyxNQUlsREEsRUFBRXNHLFFBQVEsQ0FBRTVLLEVBQUdzRSxLQUNYN0MsS0FBS29oRCxHQUFHcnlDLElBQUl4USxFQUFHc0UsS0FDZHRFLEtBSWIsU0FBU3U5RCxHQUFHdjlELEdBQ1IsT0FBT3kxRCxHQUFHejFELEVBQUdreEQsR0FBR3pCLE9BS2hCLFNBQVN3TixHQUFHajlELEdBQ1osT0FBT3kxRCxHQUFHejFELEVBQUcwd0QsR0FBR2pCLE9BR3BCLFNBQVN5TixHQUFHbDlELEdBQ1IsT0FBT0EsRUFBRXdSLEtBQUs4b0M7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnFDLE1BQU1xakIsR0FDekQsWUFBWTM5RCxHQUNSeUIsS0FBSzBJLEVBQUluSyxFQVFOLEdBQUdBLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDZjgwQyxFQUFFcDFDLEVBQUlNLEdBQUtOLEdBQUssR0FBS00sR0FBSyxJQUMxQixNQUFNL0IsRUFBSSxJQUFJNDBELEdBQUcsa0JBQW1CcHZELEdBQ3BDL0QsRUFBSSxHQUFLTSxHQUFLLElBQU0sU0FBU2IsR0FDekJBLEVBQUVtNkIsa0JBQWtCazFCLEdBQUdJLE9BRFAsQ0FFbEJ6dkQsR0FBSSxTQUFTQSxHQUNYQSxFQUFFbTZCLGtCQUFrQnUxQixHQUFHRCxNQUFPLENBQzFCcjFCLFFBQVNzMUIsR0FBR3QxQixVQUVoQnA2QixFQUFFbTZCLGtCQUFrQjIxQixHQUFHTCxNQUFPLENBQzFCcjFCLFFBQVMwMUIsR0FBRzExQixRQUNad2pDLGVBQWUsSUFDaEJDLFlBQVkvTixHQUFHSyxtQkFBb0JMLEdBQUdNLHFCQUFzQixDQUMzRDBOLFFBQVEsSUFDUjk5RCxFQUFFbTZCLGtCQUFrQmsyQixHQUFHWixPQVR6QixDQWNUenZELEdBQUkrOUQsR0FBRy85RCxHQUFJLFNBQVNBLEdBQ2JBLEVBQUVtNkIsa0JBQWtCdTJCLEdBQUdqQixPQURuQixDQUVOenZELElBR00sSUFBSUosRUFBSXF6RCxHQUFHOXRELFVBQ25CLE9BQU81RSxFQUFJLEdBQUtNLEdBQUssSUFHckIsSUFBTU4sSUFBTyxTQUFTUCxHQUNsQkEsRUFBRWcrRCxrQkFBa0J0TSxHQUFHakMsT0FBUXp2RCxFQUFFZytELGtCQUFrQjVNLEdBQUczQixPQUFRenZELEVBQUVnK0Qsa0JBQWtCbE0sR0FBR3JDLE9BRDVFLENBRVh6dkQsR0FBSSs5RCxHQUFHLzlELElBQUtKLEVBQUlBLEVBQUV5TSxLQUFLLElBTXpCLFNBQVNyTSxHQUNMLE1BQU1zRSxFQUFJdEUsRUFBRXl2RCxNQUFNcUMsR0FBR3JDLE9BQVFsdkQsRUFBSSxJQUFJdXhELEdBQ2hCLEVBQ1MsRUFBR3RZLEVBQUdub0MsTUFBTXM2QyxjQUN6QixHQUNqQixPQUFPcm5ELEVBQUVvMkIsSUFBSW8zQixHQUFHenhELElBQUtFLEdBTHpCLENBVUh6QixLQUFPeUIsRUFBSSxHQUFLTSxHQUFLLElBQU0sSUFBTU4sSUFPOUJYLEVBQUlBLEVBQUV5TSxLQUFLLElBQU8sU0FBU3JNLEVBQUdzRSxHQUMxQixPQUFPQSxFQUFFbXJELE1BQU1LLEdBQUdMLE9BQU94UixLQUFLNXhDLEtBQU05TCxJQUNoQ1AsRUFBRWcrRCxrQkFBa0JsTyxHQUFHTCxPQUN2Qnp2RCxFQUFFbTZCLGtCQUFrQjIxQixHQUFHTCxNQUFPLENBQzFCcjFCLFFBQVMwMUIsR0FBRzExQixRQUNad2pDLGVBQWUsSUFDaEJDLFlBQVkvTixHQUFHSyxtQkFBb0JMLEdBQUdNLHFCQUFzQixDQUMzRDBOLFFBQVEsSUFFWixNQUFNajlELEVBQUl5RCxFQUFFbXJELE1BQU1LLEdBQUdMLE9BQVEzd0QsRUFBSXlCLEVBQUV5WCxJQUFLaFksR0FBS2EsRUFBRTY1QixJQUFJMTZCLElBQ25ELE9BQU9pekQsR0FBR1EsUUFBUTMwRCxLQVZSLENBWWhCa0IsRUFBR2xCLEtBQU9jLEVBQUlBLEVBQUV5TSxLQUFLLE1BQ2xCLFNBQVNyTSxHQUNOQSxFQUFFbTZCLGtCQUFrQmk0QixHQUFHM0MsTUFBTyxDQUMxQnIxQixRQUFTZzRCLEdBQUdoNEIsVUFGbkIsQ0FJQ3A2QixNQUNBTyxFQUFJLEdBQUtNLEdBQUssSUFBTWpCLEVBQUlBLEVBQUV5TSxLQUFLLElBQU81SyxLQUFLcWhELEdBQUdoa0QsS0FBT3lCLEVBQUksR0FBS00sR0FBSyxJQUFNakIsRUFBSUEsRUFBRXlNLEtBQUssS0FBUSxTQUFTck0sR0FDdkdBLEVBQUVtNkIsa0JBQWtCKzJCLEdBQUd6QixPQUR1RSxDQUVoR3p2RCxHQUFJeUIsS0FBS3NoRCxHQUFHamtELE1BQVF5QixFQUFJLEdBQUtNLEdBQUssSUFBTWpCLEVBQUlBLEVBQUV5TSxLQUFLLElBQU81SyxLQUFLdWhELEdBQUdsa0QsS0FBT3lCLEVBQUksR0FBS00sR0FBSyxJQUFNakIsRUFBSUEsRUFBRXlNLEtBQUssSUFBTzVLLEtBQUt3aEQsR0FBR2pqRCxFQUFHbEIsS0FDNUh5QixFQUFJLEdBQUtNLEdBQUssSUFBTWpCLEVBQUlBLEVBQUV5TSxLQUFLLE1BSTFCLFNBQVNyTSxHQUNOQSxFQUFFcTZCLGlCQUFpQjN3QixTQUFTLDBCQUE0QjFKLEVBQUVnK0Qsa0JBQWtCLHlCQUQvRSxDQUVDaCtELEdBQUksU0FBU0EsR0FDWCxNQUFNc0UsRUFBSXRFLEVBQUVnNkIsWUFBWTAyQixHQUFHakIsT0FDM0JuckQsRUFBRXU1RCxZQUFZbk4sR0FBR0ksY0FBZUosR0FBR0ssa0JBQW1CLENBQ2xEK00sUUFBUSxJQUNSeDVELEVBQUV1NUQsWUFBWW5OLEdBQUdNLHdCQUF5Qk4sR0FBR08sNEJBQTZCLENBQzFFNk0sUUFBUSxJQUxWLENBT0p4NUQsTUFDQS9ELEVBQUksSUFBTU0sR0FBSyxLQUFPakIsRUFBSUEsRUFBRXlNLEtBQUssSUFBTzVLLEtBQUt5aEQsR0FBR3BrRCxLQUFPeUIsRUFBSSxJQUFNTSxHQUFLLEtBQU9qQixFQUFJQSxFQUFFeU0sS0FBSyxNQUN6RixTQUFTck0sR0FDTkEsRUFBRW02QixrQkFBa0JzNEIsR0FBR2hELE1BQU8sQ0FDMUJyMUIsUUFBU3E0QixHQUFHcjRCLFVBRm5CLENBSUNwNkIsR0FBSSxTQUFTQSxHQUNYQSxFQUFFbTZCLGtCQUFrQnc0QixHQUFHbEQsTUFBTyxDQUMxQnIxQixRQUFTdTRCLEdBQUd2NEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FGZCxDQW9CYnA2QixNQUNTSixFQUVWLEdBQUdJLEdBQ0MsSUFBSXNFLEVBQUksRUFDUixPQUFPdEUsRUFBRXl2RCxNQUFNaUIsR0FBR2pCLE9BQU9wUixHQUFHLENBQUVyK0MsRUFBR08sS0FDN0IrRCxHQUFLczBELEdBQUdyNEQsS0FDUjhMLEtBQUssS0FDTCxNQUFNOUwsRUFBSSxJQUFJMndELEdBQUc1c0QsR0FDakIsT0FBT3RFLEVBQUV5dkQsTUFBTXlCLEdBQUd6QixPQUFPLzBCLElBQUl3MkIsR0FBRzd3RCxJQUFLRSxLQUc3QyxHQUFHUCxHQUNDLE1BQU1zRSxFQUFJdEUsRUFBRXl2RCxNQUFNQyxHQUFHRCxPQUFRbHZELEVBQUlQLEVBQUV5dkQsTUFBTUssR0FBR0wsT0FDNUMsT0FBT25yRCxFQUFFMjVDLEtBQUs1eEMsS0FBTS9ILEdBQUsydUQsR0FBR3JvRCxRQUFRdEcsRUFBSUEsSUFDcEMsTUFBTXpELEVBQUlnM0QsWUFBWUMsTUFBTSxDQUFFeHpELEVBQUVxckQsUUFBUyxHQUFLLENBQUVyckQsRUFBRXFyRCxPQUFRcnJELEVBQUVzckQsMEJBQzVELE9BQU9ydkQsRUFBRTA5QyxHQUFHNlIsR0FBR0ssbUJBQW9CdHZELEdBQUd3TCxLQUFNOUwsR0FBSzB5RCxHQUFHcm9ELFFBQVFySyxFQUFJQSxJQUM1RG8xQyxFQUFFcDFDLEVBQUVvdkQsU0FBV3JyRCxFQUFFcXJELFFBQ2pCLE1BQU05dUQsRUFBSWsyRCxHQUFHdDFELEtBQUswSSxFQUFHNUosR0FDckIsT0FBT200RCxHQUFHMTRELEVBQUdzRSxFQUFFcXJELE9BQVE5dUQsR0FBR3dMLEtBQUssY0FPcEMsR0FBR3JNLEdBQ04sTUFBTXNFLEVBQUl0RSxFQUFFeXZELE1BQU1pQyxHQUFHakMsT0FBUWx2RCxFQUFJUCxFQUFFeXZELE1BQU1pQixHQUFHakIsT0FDNUMsT0FBT3p2RCxFQUFFeXZELE1BQU1xQyxHQUFHckMsT0FBTzl2RCxJQUFJbXlELEdBQUd6eEQsS0FBS2dNLEtBQU1yTSxJQUN2QyxNQUFNYSxFQUFJLEdBQ1YsT0FBT04sRUFBRTg5QyxHQUFHLENBQUU5OUMsRUFBR3pCLEtBQ2IsTUFBTWMsRUFBSSxJQUFJeTZDLEVBQUc5NUMsR0FBSWhCLEVBQUksU0FBU1MsR0FDOUIsTUFBTyxDQUFFLEVBQUdndkQsR0FBR2h2RCxJQURNLENBRXZCSixHQUNGaUIsRUFBRWdDLEtBQUt5QixFQUFFM0UsSUFBSUosR0FBRzhNLEtBQU05TCxHQUFLQSxFQUFJMHlELEdBQUc5dEQsVUFBWSxDQUFDNUUsR0FBSytELEVBQUVvMkIsSUFBSSxJQUFJZzNCLEdBQUcsRUFBRzFDLEdBQUd6dUQsR0FBSVAsRUFBRWd5RCw4QkFBL0IsQ0FBOERweUQsT0FDNUd5TSxLQUFLLElBQU80bUQsR0FBR1EsUUFBUTV5RCxNQUduQyxHQUFHYixFQUFHc0UsR0FFRnRFLEVBQUVtNkIsa0JBQWtCZzRCLEdBQUcxQyxNQUFPLENBQzFCcjFCLFFBQVMrM0IsR0FBRy8zQixVQUVoQixNQUFNNzVCLEVBQUkrRCxFQUFFbXJELE1BQU0wQyxHQUFHMUMsT0FBUTV1RCxFQUFJLElBQUkyMkQsR0FBSTE0RCxFQUFJa0IsSUFDekMsR0FBSWEsRUFBRWdsQixJQUFJN2xCLEdBQUksQ0FDVixNQUFNc0UsRUFBSXRFLEVBQUVzK0MsY0FBZXo5QyxFQUFJYixFQUFFdytDLFVBQ2pDLE9BQU9qK0MsRUFBRW02QixJQUFJLENBQ1RvekIsYUFBY3hwRCxFQUNkdXBELE9BQVFtQixHQUFHbnVELE9BTXZCLE9BQU95RCxFQUFFbXJELE1BQU1pQixHQUFHakIsT0FBT3BSLEdBQUcsQ0FDeEJELElBQUksR0FDTCxDQUFFcCtDLEVBQUdzRSxLQUNKLE1BQU0vRCxFQUFJLElBQUk4NUMsRUFBR3I2QyxHQUNqQixPQUFPbEIsRUFBRXlCLEVBQUVpK0MsYUFDWG55QyxLQUFLLElBQU8vSCxFQUFFbXJELE1BQU1ZLEdBQUdaLE9BQU9wUixHQUFHLENBQ2pDRCxJQUFJLEdBQ0wsRUFBR3ArQyxFQUFHc0UsRUFBRy9ELEdBQUlNLEtBQ1osTUFBTWpCLEVBQUl1dkQsR0FBRzdxRCxHQUNiLE9BQU94RixFQUFFYyxFQUFFNCtDLGNBR25CLEdBQUd4K0MsR0FDQyxNQUFNc0UsRUFBSXRFLEVBQUV5dkQsTUFBTTJCLEdBQUczQixPQUNyQixPQUFPbnJELEVBQUUrNUMsR0FBRyxDQUFFcitDLEVBQUdPLEtBQ2IsTUFBTU0sRUFBSW8yRCxHQUFHMTJELEdBQUl6QixFQUFJbzRELEdBQUd6MUQsS0FBSzBJLEVBQUd0SixHQUNoQyxPQUFPeUQsRUFBRW8yQixJQUFJNTdCLE1BS3pCLFNBQVNpL0QsR0FBRy85RCxHQUNSQSxFQUFFbTZCLGtCQUFrQnUzQixHQUFHakMsTUFBTyxDQUMxQnIxQixRQUFTczNCLEdBQUd0M0IsVUFDYnlqQyxZQUFZbk0sR0FBR0UscUJBQXNCRixHQUFHRyx1QkFBd0IsQ0FDL0RpTSxRQUFRLElBR1o5OUQsRUFBRW02QixrQkFBa0JpM0IsR0FBRzNCLE1BQU8sQ0FDMUJyMUIsUUFBU2czQixHQUFHaDNCLFVBQ2J5akMsWUFBWXpNLEdBQUdJLHNCQUF1QkosR0FBR0ssb0JBQXFCLENBQzdEcU0sUUFBUSxJQUNSOTlELEVBQUVtNkIsa0JBQWtCMjNCLEdBQUdyQyxPQUcvQixNQUFNd08sR0FBSywwUUFvRFgsTUFBTUMsR0FDRixZQUtBbCtELEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUdjLEVBQUdMLEVBQUd1SyxFQUFHM0ssRUFLeEJvRSxHQUNJLEdBQUk5QixLQUFLOHRELHdCQUEwQnZ2RCxFQUFHeUIsS0FBS2t3QyxlQUFpQnJ0QyxFQUFHN0MsS0FBSzR3RCxTQUFXOXhELEVBQy9Fa0IsS0FBS2tpRCxHQUFLN2tELEVBQUcyQyxLQUFLdUYsT0FBU3BILEVBQUc2QixLQUFLb2pCLFNBQVd0bEIsRUFBR2tDLEtBQUtnaUQsR0FBS3RrRCxFQUFHc0MsS0FBSzBoRCxHQUFLNS9DLEVBQUc5QixLQUFLNGhELEdBQUssS0FDckY1aEQsS0FBSzZoRCxJQUFLLEVBQUk3aEQsS0FBSzA4RCxXQUFZLEVBQUkxOEQsS0FBSzh3RCxnQkFBaUIsRUFFekQ5d0QsS0FBSzhoRCxHQUFLLEtBQU05aEQsS0FBSyt3RCxjQUFlLEVBRXBDL3dELEtBQUsraEQsR0FBSyxLQUVWL2hELEtBQUttaUQsR0FBSyxLQUVWbmlELEtBQUtpaUQsR0FBS3Z1QyxPQUFPOGpELGtCQUVqQngzRCxLQUFLcWlELEdBQUs5akQsR0FBS3FGLFFBQVFGLFdBQVkrNEQsR0FBR2xpQixLQUFNLE1BQU0sSUFBSWpGLEVBQUVqQixFQUFFYSxjQUFlLHNJQUN6RWwxQyxLQUFLdTNELGtCQUFvQixJQUFJeUMsR0FBR2g2RCxLQUFNWixHQUFJWSxLQUFLc2lELEdBQUt6L0MsRUFBSSxPQUFRN0MsS0FBSzBJLEVBQUksSUFBSWlzRCxHQUFHdHNELEdBQ2hGckksS0FBS2lrRCxHQUFLLElBQUl3TyxHQUFHenlELEtBQUtzaUQsR0FBSSxHQUFJLElBQUk0WixHQUFHbDhELEtBQUswSSxJQUFLMUksS0FBS3dpRCxHQUFLLElBQUkrVixHQUFHdjRELEtBQUt1M0Qsa0JBQW1CdjNELEtBQUswSSxHQUM3RjFJLEtBQUsrZ0QsR0FBSyxJQUFJa1YsR0FBSWoyRCxLQUFLMGlELEdBQUssU0FBU25rRCxFQUFHc0UsR0FDcEMsT0FBTyxJQUFJMDRELEdBQUdoOUQsRUFBR3NFLEdBRE8sQ0FRM0I3QyxLQUFLMEksRUFBRzFJLEtBQUsrZ0QsSUFBSy9nRCxLQUFLNmlELEdBQUssSUFBSThTLEdBQUkzMUQsS0FBS3VGLFFBQVV2RixLQUFLdUYsT0FBTzR0QixhQUFlbnpCLEtBQUs4aUQsR0FBSzlpRCxLQUFLdUYsT0FBTzR0QixjQUFnQm56QixLQUFLOGlELEdBQUssTUFDL0gsSUFBT2hoRCxHQUFLZ3lDLEVBQUUsdUJBQXdCLHFLQU1uQyxRQUlILE9BQU85ekMsS0FBSytpRCxLQUFLdDRDLEtBQUssS0FDbEIsSUFBS3pLLEtBQUswOEQsWUFBYzE4RCxLQUFLOHRELHdCQUc3QixNQUFNLElBQUl4WSxFQUFFakIsRUFBRVUsb0JBQXFCeW5CLElBQ25DLE9BQU94OEQsS0FBSzJqRCxLQUFNM2pELEtBQUsrakQsS0FBTS9qRCxLQUFLZ2tELEtBQU1oa0QsS0FBSzI4RCxlQUFlLGlDQUFrQyxXQUFhcCtELEdBQUt5QixLQUFLd2lELEdBQUdvYSx5QkFBeUJyK0QsTUFDakprTSxLQUFNbE0sSUFDTnlCLEtBQUs0aEQsR0FBSyxJQUFJL0ssRUFBR3Q0QyxFQUFHeUIsS0FBS2dpRCxNQUN6QnYzQyxLQUFLLEtBQ0x6SyxLQUFLNmhELElBQUssSUFDVi85QyxNQUFPdkYsSUFBTXlCLEtBQUtpa0QsSUFBTWprRCxLQUFLaWtELEdBQUdwNUMsUUFBU2pILFFBQVFILE9BQU9sRixLQVF6RCxHQUFHQSxHQUNOLE9BQU95QixLQUFLcWlELEdBQUt2eEMsVUFDYixHQUFJOVEsS0FBSzY4RCxRQUFTLE9BQU90K0QsRUFBRXNFLElBQzVCdEUsRUFBRXlCLEtBQUswOEQsV0FPUCwyQkFBMkJuK0QsR0FDOUJ5QixLQUFLaWtELEdBQUduSSxHQUFHLE1BQUNockMsSUFFUixPQUFTak8sRUFBRWk2RCxrQkFBb0J2K0QsTUFRaEMsa0JBQWtCQSxHQUNyQnlCLEtBQUs4d0QsaUJBQW1CdnlELElBQU15QixLQUFLOHdELGVBQWlCdnlELEVBR3BEeUIsS0FBS2tpRCxHQUFHNmEsaUJBQWlCLFVBQ3JCLzhELEtBQUs2OEQsZUFBaUI3OEQsS0FBSytpRCxRQVE1QixLQUNILE9BQU8vaUQsS0FBSzI4RCxlQUFlLDBDQUEyQyxZQUFjcCtELEdBQUt5K0QsR0FBR3orRCxHQUFHMDZCLElBQUksSUFBSTAzQixHQUFHM3dELEtBQUs0d0QsU0FBVXh0RCxLQUFLK1IsTUFBT25WLEtBQUs4d0QsZUFBZ0I5d0QsS0FBSyt3RCxlQUFlbm1ELEtBQUssS0FDL0ssR0FBSTVLLEtBQUswOEQsVUFBVyxPQUFPMThELEtBQUtnakQsR0FBR3prRCxHQUFHcU0sS0FBTXJNLElBQ3hDQSxJQUFNeUIsS0FBSzA4RCxXQUFZLEVBQUkxOEQsS0FBS2tpRCxHQUFHeE0saUJBQWlCLElBQU8xMUMsS0FBS3FpRCxJQUFHLFNBRXZFejNDLEtBQUssSUFBTzVLLEtBQUtzakQsR0FBRy9rRCxJQUFLcU0sS0FBTS9ILEdBQUs3QyxLQUFLMDhELFlBQWM3NUQsRUFBSTdDLEtBQUt5akQsR0FBR2xsRCxHQUFHcU0sS0FBSyxLQUFPLEtBQVMvSCxHQUFLN0MsS0FBS2lqRCxHQUFHMWtELEdBQUdxTSxLQUFLLEtBQU8sS0FBUzlHLE1BQU92RixJQUN2SSxHQUFJNDBELEdBQUc1MEQsR0FHUCxPQUFPbTFDLEVBQUUsdUJBQXdCLGlDQUFrQ24xQyxHQUFJeUIsS0FBSzA4RCxVQUM1RSxJQUFLMThELEtBQUs4dEQsd0JBQXlCLE1BQU12dkQsRUFDekMsT0FBT20xQyxFQUFFLHVCQUF3Qix5REFBMERuMUMsSUFDMUUsSUFDakJrTSxLQUFNbE0sSUFDTnlCLEtBQUswOEQsWUFBY24rRCxHQUFLeUIsS0FBS2tpRCxHQUFHeE0saUJBQWlCLElBQU8xMUMsS0FBS3FpRCxHQUFHOWpELElBQU15QixLQUFLMDhELFVBQVluK0QsSUFHL0YsR0FBR0EsR0FDQyxPQUFPMCtELEdBQUcxK0QsR0FBR0wsSUFBSTB2RCxHQUFHaHZELEtBQUtnTSxLQUFNck0sR0FBS2l6RCxHQUFHOXRELFFBQVExRCxLQUFLNGpELEdBQUdybEQsS0FFM0QsR0FBR0EsR0FDQyxPQUFPeStELEdBQUd6K0QsR0FBRzAyQixPQUFPajFCLEtBQUs0d0QsVUFNdEIsV0FDSCxHQUFJNXdELEtBQUswOEQsWUFBYzE4RCxLQUFLdUwsR0FBR3ZMLEtBQUtpaUQsR0FBSSxNQUFPLENBQzNDamlELEtBQUtpaUQsR0FBSzcrQyxLQUFLK1IsTUFDZixNQUFNNVcsUUFBVXlCLEtBQUsyOEQsZUFBZSxzQ0FBdUMsb0JBQXNCcCtELElBQzdGLE1BQU1zRSxFQUFJbXhELEdBQUd6MUQsRUFBR295RCxHQUFHM0MsT0FDbkIsT0FBT25yRCxFQUFFMjVDLEtBQUs1eEMsS0FBTXJNLElBQ2hCLE1BQU1PLEVBQUlrQixLQUFLc2tELEdBQUcvbEQsRUFBRyxNQUFPYSxFQUFJYixFQUFFMFksT0FBUTFZLElBQU0sSUFBTU8sRUFBRXdILFFBQVEvSCxJQUVoRSxPQUFPaXpELEdBQUdyb0QsUUFBUS9KLEVBQUliLEdBQUtzRSxFQUFFb3lCLE9BQU8xMkIsRUFBRXF5RCxXQUFZaG1ELEtBQUssSUFBT3hMLE9BRWxFMEUsTUFBTSxJQUFPLElBTUwsR0FBSTlELEtBQUs4aUQsR0FBSSxJQUFLLE1BQU1qZ0QsS0FBS3RFLEVBQUd5QixLQUFLOGlELEdBQUc5dkIsV0FBV2h6QixLQUFLdWtELEdBQUcxaEQsRUFBRSt0RCxZQU0xRSxLQUNINXdELEtBQUttaUQsR0FBS25pRCxLQUFLa2lELEdBQUdxWCxrQkFBa0IsMEJBQXdELElBQUssSUFBT3Y1RCxLQUFLK2lELEtBQUt0NEMsS0FBSyxJQUFPekssS0FBS29rRCxNQUFPMzVDLEtBQUssSUFBT3pLLEtBQUtna0QsT0FFeEcsR0FBR3psRCxHQUN0RCxRQUFTQSxHQUFLQSxFQUFFc3ZELFVBQVk3dEQsS0FBSzR3RCxTQVE5QixHQUFHcnlELEdBQ04sT0FBSXlCLEtBQUswaEQsR0FBVzhQLEdBQUc5dEQsU0FBUSxHQUN4QnU1RCxHQUFHMStELEdBQUdMLElBQUkwdkQsR0FBR2h2RCxLQUFLZ00sS0FBTS9ILElBVTNCLEdBQUksT0FBU0EsR0FBSzdDLEtBQUt1TCxHQUFHMUksRUFBRWtyRCxpQkFBa0IsT0FBUy90RCxLQUFLd2tELEdBQUczaEQsRUFBRWdyRCxTQUFVLENBQ3ZFLEdBQUk3dEQsS0FBSzRqRCxHQUFHL2dELElBQU03QyxLQUFLOHdELGVBQWdCLE9BQU8sRUFDOUMsSUFBSzl3RCxLQUFLNGpELEdBQUcvZ0QsR0FBSSxDQUNiLElBQUtBLEVBQUVpckQsd0JBWVAsTUFBTSxJQUFJeFksRUFBRWpCLEVBQUVVLG9CQUFxQnluQixJQUNuQyxPQUFPLEdBR2YsU0FBVXg4RCxLQUFLOHdELGlCQUFtQjl3RCxLQUFLK3dELGVBQWlCaU0sR0FBR3orRCxHQUFHaStDLEtBQUs1eEMsS0FBTXJNLFFBQUssSUFBV3lCLEtBQUtza0QsR0FBRy9sRCxFQUFHLEtBQUt3eEIsS0FBTXh4QixJQUMzRyxHQUFJeUIsS0FBSzR3RCxXQUFhcnlELEVBQUVxeUQsU0FBVSxDQUM5QixNQUFNL3RELEdBQUs3QyxLQUFLOHdELGdCQUFrQnZ5RCxFQUFFdXlELGVBQWdCaHlELEdBQUtrQixLQUFLK3dELGNBQWdCeHlELEVBQUV3eUQsYUFBYzN4RCxFQUFJWSxLQUFLOHdELGlCQUFtQnZ5RCxFQUFFdXlELGVBQzVILEdBQUlqdUQsR0FBSy9ELEdBQUtNLEVBQUcsT0FBTyxFQUU1QixPQUFPLE9BRVh3TCxLQUFNck0sSUFBTXlCLEtBQUswOEQsWUFBY24rRCxHQUFLbTFDLEVBQUUsdUJBQXdCLFVBQVVuMUMsRUFBSSxLQUFPLDBDQUN2RkEsSUFFSixpQkFHSXlCLEtBQUs2aEQsSUFBSyxFQUFJN2hELEtBQUt5a0QsS0FBTXprRCxLQUFLbWlELEtBQU9uaUQsS0FBS21pRCxHQUFHOWUsU0FBVXJqQyxLQUFLbWlELEdBQUssTUFBT25pRCxLQUFLMGtELEtBQzdFMWtELEtBQUt1bEQsV0FHQ3ZsRCxLQUFLaWtELEdBQUcwWSxlQUFlLFdBQVksWUFBYSxDQUFFL08sR0FBR0ksTUFBTzJDLEdBQUczQyxPQUFVenZELElBQzNFLE1BQU1zRSxFQUFJLElBQUlpeEQsR0FBR3YxRCxFQUFHczRDLEVBQUdRLEdBQ3ZCLE9BQU9yM0MsS0FBS3lqRCxHQUFHNWdELEdBQUcrSCxLQUFLLElBQU81SyxLQUFLbWtELEdBQUd0aEQsTUFDckM3QyxLQUFLaWtELEdBQUdwNUMsUUFHYjdLLEtBQUs0a0QsS0FLRixHQUFHcm1ELEVBQUdzRSxHQUNULE9BQU90RSxFQUFFMFksT0FBUTFZLEdBQUt5QixLQUFLdUwsR0FBR2hOLEVBQUVzeUQsYUFBY2h1RCxLQUFPN0MsS0FBS3drRCxHQUFHam1ELEVBQUVxeUQsV0FRNUQsS0FDSCxPQUFPNXdELEtBQUsyOEQsZUFBZSxtQkFBb0IsV0FBYXArRCxHQUFLeStELEdBQUd6K0QsR0FBR2krQyxLQUFLNXhDLEtBQU1yTSxHQUFLeUIsS0FBS3NrRCxHQUFHL2xELEVBQUcsTUFBTWdZLElBQUtoWSxHQUFLQSxFQUFFcXlELFlBRXhILGNBQ0ksT0FBTzV3RCxLQUFLNmhELEdBRWhCLGlCQUFpQnRqRCxHQUNiLE9BQU8rNEQsR0FBR3pZLEdBQUd0Z0QsRUFBR3lCLEtBQUswSSxFQUFHMUksS0FBSytnRCxHQUFJL2dELEtBQUt1M0QsbUJBRTFDLGlCQUNJLE9BQU92M0QsS0FBS3dpRCxHQUVoQix5QkFDSSxPQUFPeGlELEtBQUswaUQsR0FFaEIsa0JBQ0ksT0FBTzFpRCxLQUFLK2dELEdBRWhCLGlCQUNJLE9BQU8vZ0QsS0FBSzZpRCxHQUVoQixlQUFldGtELEVBQUdzRSxFQUFHL0QsR0FDakI0MEMsRUFBRSx1QkFBd0Isd0JBQXlCbjFDLEdBQ25ELE1BQU1hLEVBQUksYUFBZXlELEVBQUksV0FBYSxZQUMxQyxJQUFJeEYsRUFHSSxPQUFPMkMsS0FBS2lrRCxHQUFHMFksZUFBZXArRCxFQUFHYSxFQUFHZ3lELEdBQUtoeUQsSUFBTS9CLEVBQUksSUFBSXkyRCxHQUFHMTBELEVBQUdZLEtBQUs0aEQsR0FBSzVoRCxLQUFLNGhELEdBQUdoM0MsT0FBU2lzQyxFQUFHUSxHQUNuRyxzQkFBd0J4MEMsRUFBSTdDLEtBQUtnakQsR0FBRzNsRCxHQUFHdU4sS0FBTXJNLEtBQU9BLEdBQUt5QixLQUFLc2pELEdBQUdqbUQsSUFBS3VOLEtBQU0vSCxJQUN4RSxJQUFLQSxFQUFHLE1BQU1peEMsRUFBRSw4Q0FBOEN2MUMsT0FBUXlCLEtBQUswOEQsV0FBWSxFQUN2RjE4RCxLQUFLa2lELEdBQUd4TSxpQkFBaUIsSUFBTzExQyxLQUFLcWlELElBQUcsSUFBTyxJQUFJL00sRUFBRWpCLEVBQUVVLG9CQUFxQnNjLElBQzVFLE9BQU92eUQsRUFBRXpCLEtBQ1R1TixLQUFNck0sR0FBS3lCLEtBQUtpakQsR0FBRzVsRCxHQUFHdU4sS0FBSyxJQUFPck0sSUFBUXlCLEtBQUswbUQsR0FBR3JwRCxHQUFHdU4sS0FBSyxJQUFPOUwsRUFBRXpCLE1BQVFvTixLQUFNbE0sSUFBTWxCLEVBQUU2L0Qsd0JBQzdGMytELElBUUosR0FBR0EsR0FDQyxPQUFPMCtELEdBQUcxK0QsR0FBR0wsSUFBSTB2RCxHQUFHaHZELEtBQUtnTSxLQUFNck0sSUFDM0IsR0FBSSxPQUFTQSxHQUFLeUIsS0FBS3VMLEdBQUdoTixFQUFFd3ZELGlCQUFrQixPQUFTL3RELEtBQUt3a0QsR0FBR2ptRCxFQUFFc3ZELFdBQWE3dEQsS0FBSzRqRCxHQUFHcmxELE1BQVF5QixLQUFLMGhELElBQU0xaEQsS0FBSzh0RCx5QkFBMkJ2dkQsRUFBRXV2RCx5QkFBMEIsTUFBTSxJQUFJeFksRUFBRWpCLEVBQUVVLG9CQUFxQnluQixNQU16TSxHQUFHaitELEdBQ04sTUFBTXNFLEVBQUksSUFBSStxRCxHQUFHNXRELEtBQUs0d0QsU0FBVTV3RCxLQUFLOHRELHdCQUF5QjFxRCxLQUFLK1IsT0FDbkUsT0FBTzhuRCxHQUFHMStELEdBQUcwNkIsSUFBSTIwQixHQUFHaHZELElBQUtpRSxHQUU3QixZQUNJLE9BQU80dkQsR0FBR2xZLEtBRW1FLEdBQUdoOEMsR0FDaEYsTUFBTXNFLEVBQUlvNkQsR0FBRzErRCxHQUNiLE9BQU9zRSxFQUFFM0UsSUFBSTB2RCxHQUFHaHZELEtBQUtnTSxLQUFNck0sR0FBS3lCLEtBQUs0akQsR0FBR3JsRCxJQUFNbTFDLEVBQUUsdUJBQXdCLDRCQUN4RTd3QyxFQUFFb3lCLE9BQU8yNEIsR0FBR2h2RCxNQUFRNHlELEdBQUc5dEQsV0FFa0MsR0FBR25GLEVBQUdzRSxHQUMvRCxNQUFNL0QsRUFBSXNFLEtBQUsrUixNQUNmLFFBQVM1VyxFQUFJTyxFQUFJK0QsR0FBU3RFLEVBQUlPLElBQU9nMUMsRUFBRSxrREFBa0R2MUMsT0FBT08sS0FDaEcsSUFFSixLQUNJLE9BQVNrQixLQUFLb2pCLFVBQVksbUJBQXFCcGpCLEtBQUtvakIsU0FBU29CLG1CQUFxQnhrQixLQUFLK2hELEdBQUssS0FDeEYvaEQsS0FBS2tpRCxHQUFHNmEsaUJBQWlCLEtBQVEvOEQsS0FBSyt3RCxhQUFlLFlBQWMvd0QsS0FBS29qQixTQUFTMnVCLGdCQUNqRi94QyxLQUFLK2lELFFBQ04vaUQsS0FBS29qQixTQUFTb0IsaUJBQWlCLG1CQUFvQnhrQixLQUFLK2hELElBQUsvaEQsS0FBSyt3RCxhQUFlLFlBQWMvd0QsS0FBS29qQixTQUFTMnVCLGlCQUVwSCxLQUNJL3hDLEtBQUsraEQsS0FBTy9oRCxLQUFLb2pCLFNBQVMwUixvQkFBb0IsbUJBQW9COTBCLEtBQUsraEQsSUFBSy9oRCxLQUFLK2hELEdBQUssTUFXbkYsS0FDSCxJQUFJeGpELEVBQ0osbUJBQXNCLFFBQVVBLEVBQUl5QixLQUFLdUYsY0FBVyxJQUFXaEgsT0FBSSxFQUFTQSxFQUFFaW1CLG9CQUFzQnhrQixLQUFLOGhELEdBQUssS0FJMUc5aEQsS0FBS3lrRCxLQUFNLGVBQWNwL0MsVUFBVTgzRCxXQUFXdi9DLE1BQU0sbUJBS3BENWQsS0FBS2tpRCxHQUFHa2IscUJBQThDLEdBQUtwOUQsS0FBS2tpRCxHQUFHNmEsaUJBQWlCLElBQU8vOEQsS0FBS3E5RCxhQUNqR3I5RCxLQUFLdUYsT0FBT2lmLGlCQUFpQixXQUFZeGtCLEtBQUs4aEQsS0FFckQsS0FDSTloRCxLQUFLOGhELEtBQU85aEQsS0FBS3VGLE9BQU91dkIsb0JBQW9CLFdBQVk5MEIsS0FBSzhoRCxJQUFLOWhELEtBQUs4aEQsR0FBSyxNQU16RSxHQUFHdmpELEdBQ04sSUFBSXNFLEVBQ0osSUFDSSxNQUFNL0QsRUFBSSxRQUFVLFFBQVUrRCxFQUFJN0MsS0FBSzhpRCxVQUFPLElBQVdqZ0QsT0FBSSxFQUFTQSxFQUFFb3dCLFFBQVFqekIsS0FBS3VrRCxHQUFHaG1ELEtBQ3hGLE9BQU9tMUMsRUFBRSx1QkFBd0IsV0FBV24xQyxNQUFNTyxFQUFJLEtBQU8sb0NBQzdEQSxFQUNGLE1BQU9QLEdBRUwsT0FBT3UxQyxFQUFFLHVCQUF3QixtQ0FBb0N2MUMsSUFBSSxHQU0xRSxLQUNILEdBQUl5QixLQUFLOGlELEdBQUksSUFDVDlpRCxLQUFLOGlELEdBQUcvdkIsUUFBUS95QixLQUFLdWtELEdBQUd2a0QsS0FBSzR3RCxVQUFXanZELE9BQU95QixLQUFLK1IsUUFDdEQsTUFBTzVXLEdBRUx1MUMsRUFBRSxrQ0FBbUN2MUMsSUFHWSxLQUNyRCxHQUFJeUIsS0FBSzhpRCxHQUFJLElBQ1Q5aUQsS0FBSzhpRCxHQUFHOXZCLFdBQVdoekIsS0FBS3VrRCxHQUFHdmtELEtBQUs0d0QsV0FDbEMsTUFBT3J5RCxLQUliLEdBQUdBLEdBQ0MsTUFBTyxvQkFBb0J5QixLQUFLa3dDLGtCQUFrQjN4QyxLQU10RCxTQUFTMCtELEdBQUcxK0QsR0FDWixPQUFPeTFELEdBQUd6MUQsRUFBR3F2RCxHQUFHSSxPQUtoQixTQUFTZ1AsR0FBR3orRCxHQUNaLE9BQU95MUQsR0FBR3oxRCxFQUFHb3lELEdBQUczQyxPQU1oQixTQUFTc1AsR0FBRy8rRCxFQUFHc0UsR0FNZixJQUFJL0QsRUFBSVAsRUFBRTBGLFVBQ1YsT0FBTzFGLEVBQUVnL0Qsb0JBQXNCeitELEdBQUssSUFBTVAsRUFBRTg5QyxVQUFXLGFBQWV4NUMsRUFBSSxJQUFNL0QsRUFBSTs7Ozs7Ozs7Ozs7Ozs7OztJQW1CeEYsTUFBTTArRCxHQUNGLFlBQVlqL0QsRUFBR3NFLEdBQ1g3QyxLQUFLeTlELFNBQVdsL0QsRUFBR3lCLEtBQUs0bUQsR0FBSy9qRDs7Ozs7Ozs7Ozs7Ozs7OztHQXlCakMsTUFBTTY2RCxHQUNOLFlBQVluL0QsRUFBR3NFLEVBQUcvRCxHQUNka0IsS0FBSzBpRCxHQUFLbmtELEVBQUd5QixLQUFLNm1ELEdBQUtoa0QsRUFBRzdDLEtBQUsrZ0QsR0FBS2ppRCxFQU9qQyxHQUFHUCxFQUFHc0UsR0FDVCxPQUFPN0MsS0FBSzZtRCxHQUFHOFcsMENBQTBDcC9ELEVBQUdzRSxHQUFHK0gsS0FBTTlMLEdBQUtrQixLQUFLK21ELEdBQUd4b0QsRUFBR3NFLEVBQUcvRCxJQUVuQixHQUFHUCxFQUFHc0UsRUFBRy9ELEdBQzlFLE9BQU9rQixLQUFLMGlELEdBQUc0WCxTQUFTLzdELEVBQUdzRSxHQUFHK0gsS0FBTXJNLElBQ2hDLElBQUssTUFBTXNFLEtBQUsvRCxFQUFHK0QsRUFBRXV4RCxpQkFBaUI3MUQsR0FDdEMsT0FBT0EsSUFLZixHQUFHQSxFQUFHc0UsR0FDRnRFLEVBQUU0SyxRQUFRLENBQUU1SyxFQUFHTyxLQUNYLElBQUssTUFBTVAsS0FBS3NFLEVBQUd0RSxFQUFFNjFELGlCQUFpQnQxRCxLQVF2QyxHQUFHUCxFQUFHc0UsR0FDVCxPQUFPN0MsS0FBSzBpRCxHQUFHc1QsV0FBV3ozRCxFQUFHc0UsR0FBRytILEtBQU0vSCxHQUFLN0MsS0FBS2tuRCxHQUFHM29ELEVBQUdzRSxHQUFHK0gsS0FBSyxJQUFPL0gsSUFLbEUsR0FBR3RFLEVBQUdzRSxHQUNULE9BQU83QyxLQUFLNm1ELEdBQUcrVywyQ0FBMkNyL0QsRUFBR3NFLEdBQUcrSCxLQUFNck0sR0FBS3lCLEtBQUtnbkQsR0FBR25rRCxFQUFHdEUsSUFTbkYsMEJBQTBCQSxFQUFHc0UsRUFBRy9ELEdBS25DLE9BQU8sU0FBU1AsR0FDWixPQUFPczhDLEdBQUdpRSxjQUFjdmdELEVBQUV3UixPQUFTLE9BQVN4UixFQUFFdy9DLGlCQUFtQixJQUFNeC9DLEVBQUUwL0MsUUFBUXorQyxPQUQ5RSxDQUVMcUQsR0FBSzdDLEtBQUttbkQsR0FBRzVvRCxFQUFHc0UsRUFBRWtOLE1BQVF3d0MsR0FBRzE5QyxHQUFLN0MsS0FBS29uRCxHQUFHN29ELEVBQUdzRSxFQUFHL0QsR0FBS2tCLEtBQUtxbkQsR0FBRzlvRCxFQUFHc0UsRUFBRy9ELEdBRXpFLEdBQUdQLEVBQUdzRSxHQUVGLE9BQU83QyxLQUFLOG1ELEdBQUd2b0QsRUFBRyxJQUFJczhDLEdBQUdoNEMsSUFBSStILEtBQU1yTSxJQUMvQixJQUFJc0UsRUFBSWtrRCxLQUNSLE9BQU94b0QsRUFBRTBpRCxvQkFBc0JwK0MsRUFBSUEsRUFBRWlpRCxPQUFPdm1ELEVBQUVLLElBQUtMLElBQUtzRSxJQUdoRSxHQUFHdEUsRUFBR3NFLEVBQUcvRCxHQUNMLE1BQU1NLEVBQUl5RCxFQUFFazdDLGdCQUNaLElBQUkxZ0QsRUFBSTBwRCxLQUNSLE9BQU8vbUQsS0FBSytnRCxHQUFHOGMscUJBQXFCdC9ELEVBQUdhLEdBQUd3TCxLQUFNek0sR0FBS3F6RCxHQUFHcm9ELFFBQVFoTCxFQUFJQSxJQUNoRSxNQUFNTCxFQUFJLFNBQVNTLEVBQUdzRSxHQUNsQixPQUFPLElBQUk4WCxHQUFHOVgsRUFDTyxLQUFNdEUsRUFBRXVoRCxnQkFBZ0IzeEMsUUFBUzVQLEVBQUUwL0MsUUFBUTl2QyxRQUFTNVAsRUFBRW02QyxNQUFPbjZDLEVBQUV3aEQsVUFBV3hoRCxFQUFFMi9DLFFBQVMzL0MsRUFBRTQvQyxPQUZ0RyxDQU9qQnQ3QyxFQUFHMUUsRUFBRWsvQyxNQUFNaitDLElBQ0osT0FBT1ksS0FBS3FuRCxHQUFHOW9ELEVBQUdULEVBQUdnQixHQUFHOEwsS0FBTXJNLElBQzFCQSxFQUFFNEssUUFBUSxDQUFFNUssRUFBR3NFLEtBQ1h4RixFQUFJQSxFQUFFeW5ELE9BQU92bUQsRUFBR3NFLFNBR3hCK0gsS0FBSyxJQUFPdk4sSUFFcEIsR0FBR2tCLEVBQUdzRSxFQUFHL0QsR0FFTCxJQUFJTSxFQUFHL0IsRUFDUCxPQUFPMkMsS0FBSzBpRCxHQUFHb2IsMEJBQTBCdi9ELEVBQUdzRSxFQUFHL0QsR0FBRzhMLEtBQU05TCxJQUFNTSxFQUFJTixFQUFHa0IsS0FBSzZtRCxHQUFHa1gsb0NBQW9DeC9ELEVBQUdzRSxLQUFNK0gsS0FBTS9ILElBQU14RixFQUFJd0YsRUFDMUk3QyxLQUFLc25ELEdBQUcvb0QsRUFBR2xCLEVBQUcrQixHQUFHd0wsS0FBTXJNLElBQ25CYSxFQUFJYixFQUNKLElBQUssTUFBTUEsS0FBS2xCLEVBQUcsSUFBSyxNQUFNd0YsS0FBS3RFLEVBQUVrd0QsVUFBVyxDQUM1QyxNQUFNM3ZELEVBQUkrRCxFQUFFakUsSUFDWixJQUFJdkIsRUFBSStCLEVBQUVsQixJQUFJWSxHQUNkLE1BQVF6QixJQUVSQSxFQUFJaWdELEdBQUc4ZCxtQkFBbUJ0OEQsR0FBSU0sRUFBSUEsRUFBRTBsRCxPQUFPaG1ELEVBQUd6QixJQUFLc21ELEdBQUc5Z0QsRUFBR3hGLEVBQUdrQixFQUFFMjFELGdCQUFpQjcyRCxFQUFFNGpELG9CQUFzQjdoRCxFQUFJQSxFQUFFNmxELE9BQU9ubUQsU0FFckg4TCxLQUFLLEtBR1p4TCxFQUFFK0osUUFBUSxDQUFFNUssRUFBR08sS0FDWGtpRCxHQUFHbitDLEVBQUcvRCxLQUFPTSxFQUFJQSxFQUFFNmxELE9BQU8xbUQsTUFDekJhLElBRVQsR0FBR2IsRUFBR3NFLEVBQUcvRCxHQUNMLElBQUlNLEVBQUkrbkQsS0FDUixJQUFLLE1BQU01b0QsS0FBS3NFLEVBQUcsSUFBSyxNQUFNQSxLQUFLdEUsRUFBRWt3RCxVQUFXNXJELGFBQWF5Z0QsSUFBTSxPQUFTeGtELEVBQUVaLElBQUkyRSxFQUFFakUsT0FBU1EsRUFBSUEsRUFBRWdsQixJQUFJdmhCLEVBQUVqRSxNQUN6RyxJQUFJdkIsRUFBSXlCLEVBQ1IsT0FBT2tCLEtBQUswaUQsR0FBR3NULFdBQVd6M0QsRUFBR2EsR0FBR3dMLEtBQU1yTSxJQUFNQSxFQUFFNEssUUFBUSxDQUFFNUssRUFBR3NFLEtBQ3ZEQSxFQUFFbytDLG9CQUFzQjVqRCxFQUFJQSxFQUFFeW5ELE9BQU92bUQsRUFBR3NFLE1BQ3ZDeEY7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQsTUFBTTJnRSxHQUNOLFlBQVl6L0QsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqQlksS0FBS3NvRCxTQUFXL3BELEVBQUd5QixLQUFLaStELFVBQVlwN0QsRUFBRzdDLEtBQUs0bkQsR0FBSzlvRCxFQUFHa0IsS0FBS21vRCxHQUFLL29ELEVBRWxFLFVBQVViLEVBQUdzRSxHQUNULElBQUkvRCxFQUFJcW9ELEtBQU0vbkQsRUFBSStuRCxLQUNsQixJQUFLLE1BQU01b0QsS0FBS3NFLEVBQUVxN0QsV0FBWSxPQUFRMy9ELEVBQUU0RyxNQUN0QyxLQUFLLEVBQ0hyRyxFQUFJQSxFQUFFc2xCLElBQUk3bEIsRUFBRTQvRCxJQUFJdi9ELEtBQ2hCLE1BRUYsS0FBSyxFQUNIUSxFQUFJQSxFQUFFZ2xCLElBQUk3bEIsRUFBRTQvRCxJQUFJdi9ELEtBR3BCLE9BQU8sSUFBSW8vRCxHQUFHei9ELEVBQUdzRSxFQUFFbzdELFVBQVduL0QsRUFBR007Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ3JDLE1BQU1nL0QsR0FFTixHQUFHNy9ELEdBQ0N5QixLQUFLMm9ELEdBQUtwcUQsRUFFc0QsMEJBQTBCQSxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBSW5HLE9BQU8sU0FBU2IsR0FDWixPQUFPLElBQU1BLEVBQUUwL0MsUUFBUXorQyxRQUFVLE9BQVNqQixFQUFFbTZDLE9BQVMsTUFBUW42QyxFQUFFMi9DLFNBQVcsTUFBUTMvQyxFQUFFNC9DLFFBQVUsSUFBTTUvQyxFQUFFdWhELGdCQUFnQnRnRCxRQUFVLElBQU1qQixFQUFFdWhELGdCQUFnQnRnRCxRQUFVakIsRUFBRXVoRCxnQkFBZ0IsR0FBRzNDLE1BQU02QixjQUQxTCxDQUVMbjhDLElBQU0vRCxFQUFFbzVDLFFBQVFILEVBQUdub0MsT0FBUzVQLEtBQUs4b0QsR0FBR3ZxRCxFQUFHc0UsR0FBSzdDLEtBQUsyb0QsR0FBRzFCLEdBQUcxb0QsRUFBR2EsR0FBR3dMLEtBQU12TixJQUNqRSxNQUFNYyxFQUFJNkIsS0FBSytvRCxHQUFHbG1ELEVBQUd4RixHQUNyQixPQUFRNmlELEdBQUdyOUMsSUFBTXM5QyxHQUFHdDlDLEtBQU83QyxLQUFLNG9ELEdBQUcvbEQsRUFBRWs5QyxVQUFXNWhELEVBQUdpQixFQUFHTixHQUFLa0IsS0FBSzhvRCxHQUFHdnFELEVBQUdzRSxJQUFNNkYsS0FBTyxJQUFTaXJDLE9BQVNELEVBQUUsY0FBZSx3REFBeUQ1MEMsRUFBRTRHLFdBQVlvN0MsR0FBR2orQyxJQUNoTTdDLEtBQUsyb0QsR0FBR21WLDBCQUEwQnYvRCxFQUFHc0UsRUFBRy9ELEdBQUc4TCxLQUFNck0sSUFJakRKLEVBQUVnTCxRQUFTdEcsSUFDUHRFLEVBQUlBLEVBQUV1bUQsT0FBT2ppRCxFQUFFakUsSUFBS2lFLEtBQ25CdEUsT0FLOEQsR0FBR0EsRUFBR3NFLEdBRzdFLElBQUkvRCxFQUFJLElBQUl1bkQsR0FBR2xGLEdBQUc1aUQsSUFDbEIsT0FBT3NFLEVBQUVzRyxRQUFRLENBQUV0RyxFQUFHekQsS0FDbEI0aEQsR0FBR3ppRCxFQUFHYSxLQUFPTixFQUFJQSxFQUFFc2xCLElBQUlobEIsTUFDdEJOLEVBWUYsR0FBR1AsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUdmLEdBQUlOLEVBQUVvMkIsT0FBU3J5QixFQUFFcXlCLEtBQU0sT0FBTyxFQVN0QixNQUFNNzNCLEVBQUksTUFBb0JrQixFQUFJc0UsRUFBRXMyRCxPQUFTdDJELEVBQUU4NEQsUUFDdkQsUUFBU3QrRCxJQUFNQSxFQUFFZ2hFLGtCQUFvQmhoRSxFQUFFbWdELFFBQVF6QixVQUFVMzhDLEdBQUssR0FFbEUsR0FBR2IsRUFBR3NFLEdBQ0YsT0FBTzZGLEtBQU8sSUFBU2lyQyxPQUFTRCxFQUFFLGNBQWUsK0NBQWdEb04sR0FBR2orQyxJQUNwRzdDLEtBQUsyb0QsR0FBR21WLDBCQUEwQnYvRCxFQUFHc0UsRUFBR2sxQyxFQUFHbm9DOzs7Ozs7Ozs7Ozs7Ozs7O0dBNEJuRCxNQUFNMHVELEdBQ0YsWUFFQS8vRCxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ0xZLEtBQUt5YixZQUFjbGQsRUFBR3lCLEtBQUtzcEQsR0FBS3ptRCxFQUFHN0MsS0FBSzBJLEVBQUl0SixFQU81Q1ksS0FBS3lwRCxHQUFLLElBQUkvRSxHQUFHbk4sR0FHakJ2M0MsS0FBSzJwRCxHQUFLLElBQUlpUixHQUFJcjhELEdBQUsrL0MsR0FBRy8vQyxHQUFLbWdELElBTS9CMStDLEtBQUs2cEQsR0FBSzlSLEVBQUdub0MsTUFBTzVQLEtBQUs2bUQsR0FBS3RvRCxFQUFFZ2dFLGlCQUFpQnovRCxHQUFJa0IsS0FBSytwRCxHQUFLeHJELEVBQUU2N0QseUJBQ2pFcDZELEtBQUt3aUQsR0FBS2prRCxFQUFFMDdELGlCQUFrQmo2RCxLQUFLaXFELEdBQUssSUFBSXlULEdBQUcxOUQsS0FBSytwRCxHQUFJL3BELEtBQUs2bUQsR0FBSTdtRCxLQUFLeWIsWUFBWStpRCxtQkFDbEZ4K0QsS0FBSzZpRCxHQUFLdGtELEVBQUVrZ0UsaUJBQWtCeitELEtBQUtzcEQsR0FBR2YsR0FBR3ZvRCxLQUFLaXFELElBRWxELGVBQWUxckQsR0FDWCxPQUFPeUIsS0FBS3liLFlBQVlraEQsZUFBZSxrQkFBbUIsb0JBQXNCOTVELEdBQUt0RSxFQUFFbWdFLFFBQVE3N0QsRUFBRzdDLEtBQUt5cEQsTUFJL0csU0FBU2tWLEdBRVRwZ0UsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNMLE9BQU8sSUFBSWsvRCxHQUFHLy9ELEVBQUdzRSxFQUFHL0QsRUFBR00sR0FXM0IwUixlQUFlOHRELEdBQUdyZ0UsRUFBR3NFLEdBQ2pCLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixJQUFJYSxFQUFJTixFQUFFK25ELEdBQUl4cEQsRUFBSXlCLEVBQUVtckQsR0FDcEIsTUFBTTlyRCxRQUFVVyxFQUFFMmMsWUFBWWtoRCxlQUFlLHFCQUFzQixXQUFhcCtELElBRzVFLElBQUlKLEVBQ0osT0FBT1csRUFBRStuRCxHQUFHZ1ksc0JBQXNCdGdFLEdBQUdxTSxLQUFNOU0sSUFBTUssRUFBSUwsRUFBR3NCLEVBQUlOLEVBQUUyYyxZQUFZOGlELGlCQUFpQjE3RCxHQUczRnhGLEVBQUksSUFBSXFnRSxHQUFHNStELEVBQUVpckQsR0FBSTNxRCxFQUFHTixFQUFFMmMsWUFBWStpRCxtQkFBb0JwL0QsRUFBRXkvRCxzQkFBc0J0Z0UsS0FBTXFNLEtBQU0vSCxJQUN0RixNQUFNL0QsRUFBSSxHQUFJTSxFQUFJLEdBRWxCLElBQUl0QixFQUFJcXBELEtBQ1IsSUFBSyxNQUFNNW9ELEtBQUtKLEVBQUcsQ0FDZlcsRUFBRXNDLEtBQUs3QyxFQUFFK3ZELFNBQ1QsSUFBSyxNQUFNenJELEtBQUt0RSxFQUFFa3dELFVBQVczd0QsRUFBSUEsRUFBRXNtQixJQUFJdmhCLEVBQUVqRSxLQUU3QyxJQUFLLE1BQU1MLEtBQUtzRSxFQUFHLENBQ2Z6RCxFQUFFZ0MsS0FBSzdDLEVBQUUrdkQsU0FDVCxJQUFLLE1BQU16ckQsS0FBS3RFLEVBQUVrd0QsVUFBVzN3RCxFQUFJQSxFQUFFc21CLElBQUl2aEIsRUFBRWpFLEtBSWpDLE9BQU92QixFQUFFNHBELEdBQUcxb0QsRUFBR1QsR0FBRzhNLEtBQU1yTSxJQUFLLENBQ3JDNHJELEdBQUk1ckQsRUFDSnVnRSxnQkFBaUJoZ0UsRUFDakJpZ0UsY0FBZTMvRCxTQUkzQixPQUFPTixFQUFFK25ELEdBQUt6bkQsRUFBR04sRUFBRW1yRCxHQUFLNXNELEVBQUd5QixFQUFFd3FELEdBQUdmLEdBQUd6cEQsRUFBRW1yRCxJQUFLOXJELEVBc0Q5QyxTQUFTNmdFLEdBQUd6Z0UsR0FDUixNQUFNc0UsRUFBSXV4QyxFQUFFNzFDLEdBQ1osT0FBT3NFLEVBQUU0WSxZQUFZa2hELGVBQWUsbUNBQW9DLFdBQWFwK0QsR0FBS3NFLEVBQUUyL0MsR0FBR3ljLDZCQUE2QjFnRSxJQXFHNUgsU0FBUzJnRSxHQUFHM2dFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFHekIvQixHQUNJLElBQUljLEVBQUlncEQsS0FDUixPQUFPcm9ELEVBQUVxSyxRQUFTNUssR0FBS0osRUFBSUEsRUFBRWltQixJQUFJN2xCLElBQU1zRSxFQUFFbXpELFdBQVd6M0QsRUFBR0osR0FBR3lNLEtBQU1yTSxJQUM1RCxJQUFJSixFQUFJMG9ELEtBQ1IsT0FBTy9uRCxFQUFFcUssUUFBUSxDQUFFckssRUFBR2hCLEtBQ2xCLE1BQU11SyxFQUFJOUosRUFBRUwsSUFBSVksR0FBSXBCLEdBQUssTUFBUUwsT0FBSSxFQUFTQSxFQUFFYSxJQUFJWSxLQUFPTSxFQUszRHRCLEVBQUVvM0QsZ0JBQWtCcDNELEVBQUUwL0MsUUFBUXRGLFFBQVFILEVBQUdub0MsUUFJekMvTSxFQUFFMDNELFlBQVl6N0QsRUFBR3BCLEdBQUlTLEVBQUlBLEVBQUUybUQsT0FBT2htRCxFQUFHaEIsS0FBT3VLLEVBQUVnc0QsbUJBQXFCdjJELEVBQUUwL0MsUUFBUXpCLFVBQVUxekMsRUFBRW0xQyxTQUFXLEdBQUssSUFBTTEvQyxFQUFFMC9DLFFBQVF6QixVQUFVMXpDLEVBQUVtMUMsVUFBWW4xQyxFQUFFZzJELGtCQUFvQng3RCxFQUFFbTVELFNBQVNsK0QsRUFBR0osR0FDckxTLEVBQUlBLEVBQUUybUQsT0FBT2htRCxFQUFHaEIsSUFBTTQxQyxFQUFFLGFBQWMsc0NBQXVDNTBDLEVBQUcscUJBQXNCdUosRUFBRW0xQyxRQUFTLGtCQUFtQjEvQyxFQUFFMC9DLFdBQ3JJci9DLElBVWIsU0FBU2doRSxHQUFHNWdFLEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixPQUFPTyxFQUFFMmMsWUFBWWtoRCxlQUFlLDBCQUEyQixXQUFhcCtELFNBQU0sSUFBV3NFLElBQU1BLEdBQUssR0FDeEcvRCxFQUFFK25ELEdBQUd1WSxpQ0FBaUM3Z0UsRUFBR3NFLEtBZTdDLFNBQVN3OEQsR0FBRzlnRSxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1osT0FBT08sRUFBRTJjLFlBQVlraEQsZUFBZSxrQkFBbUIsWUFBY3ArRCxJQUNqRSxJQUFJYSxFQUNKLE9BQU9OLEVBQUUwakQsR0FBRzhjLGNBQWMvZ0UsRUFBR3NFLEdBQUcrSCxLQUFNdk4sR0FBS0EsR0FJM0MrQixFQUFJL0IsRUFBR20wRCxHQUFHOXRELFFBQVF0RSxJQUFNTixFQUFFMGpELEdBQUcrYyxpQkFBaUJoaEUsR0FBR3FNLEtBQU12TixJQUFNK0IsRUFBSSxJQUFJczFELEdBQUc3eEQsRUFBR3hGLEVBQUcsRUFBaUJrQixFQUFFdzFELHVCQUNqR2oxRCxFQUFFMGpELEdBQUdnZCxjQUFjamhFLEVBQUdhLEdBQUd3TCxLQUFLLElBQU94TCxRQUNyQ3FMLEtBQU1sTSxJQUdOLE1BQU1hLEVBQUlOLEVBQUUycUQsR0FBR3ZyRCxJQUFJSyxFQUFFK3BELFVBQ3JCLE9BQVEsT0FBU2xwRCxHQUFLYixFQUFFZ3BELGdCQUFnQnhMLFVBQVUzOEMsRUFBRW1vRCxpQkFBbUIsS0FBT3pvRCxFQUFFMnFELEdBQUszcUQsRUFBRTJxRCxHQUFHM0UsT0FBT3ZtRCxFQUFFK3BELFNBQVUvcEQsR0FDN0dPLEVBQUU2cUQsR0FBRzU2QyxJQUFJbE0sRUFBR3RFLEVBQUUrcEQsV0FBWS9wRCxJQWlCbEN1UyxlQUFlMnVELEdBQUdsaEUsRUFBR3NFLEVBQUcvRCxHQUNwQixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FBSWxCLEVBQUkrQixFQUFFcXFELEdBQUd2ckQsSUFBSTJFLEdBQUkxRSxFQUFJVyxFQUFJLFlBQWMsb0JBQ3ZELElBQ0lBLFNBQVdNLEVBQUVxYyxZQUFZa2hELGVBQWUsaUJBQWtCeCtELEVBQUlJLEdBQUthLEVBQUVxYyxZQUFZODdDLGtCQUFrQnRPLGFBQWExcUQsRUFBR2xCLElBQ3JILE1BQU9rQixHQUNMLElBQUs0MEQsR0FBRzUwRCxHQUFJLE1BQU1BLEVBTWxCbTFDLEVBQUUsYUFBYyxnREFBZ0Q3d0MsTUFBTXRFLEtBRTFFYSxFQUFFcXFELEdBQUtycUQsRUFBRXFxRCxHQUFHeEUsT0FBT3BpRCxHQUFJekQsRUFBRXVxRCxHQUFHMTBCLE9BQU81M0IsRUFBRTRGLFFBVXJDLFNBQVN5OEQsR0FBR25oRSxFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUlnMUMsRUFBRTcxQyxHQUNaLElBQUlsQixFQUFJMDZDLEVBQUdub0MsTUFBT3pSLEVBQUlncEQsS0FDdEIsT0FBTy9uRCxFQUFFcWMsWUFBWWtoRCxlQUFlLGdCQUFpQixXQUFhcCtELEdBQUssU0FBU0EsRUFBR3NFLEVBQUcvRCxHQUNsRixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FBSWxCLEVBQUkrQixFQUFFdXFELEdBQUd6ckQsSUFBSVksR0FDN0IsWUFBTyxJQUFXekIsRUFBSW0wRCxHQUFHOXRELFFBQVF0RSxFQUFFcXFELEdBQUd2ckQsSUFBSWIsSUFBTStCLEVBQUVvakQsR0FBRzhjLGNBQWN6OEQsRUFBRy9ELEdBRkgsQ0FHckVNLEVBQUdiLEVBQUdtaUQsR0FBRzc5QyxJQUFJK0gsS0FBTS9ILElBQ2pCLEdBQUlBLEVBQUcsT0FBT3hGLEVBQUl3RixFQUFFaXRELDZCQUE4QjF3RCxFQUFFb2pELEdBQUdtZCwyQkFBMkJwaEUsRUFBR3NFLEVBQUV5bEQsVUFBVTE5QyxLQUFNck0sSUFDbkdKLEVBQUlJLE1BRVJxTSxLQUFLLElBQU94TCxFQUFFa3FELEdBQUd3VSwwQkFBMEJ2L0QsRUFBR3NFLEVBQUcvRCxFQUFJekIsRUFBSTA2QyxFQUFHbm9DLE1BQU85USxFQUFJWCxFQUFJZ3BELE9BQVF2OEMsS0FBTXJNLElBQUssQ0FDOUYwdEQsVUFBVzF0RCxFQUNYOHJELEdBQUlsc0QsTUFLWixTQUFTeWhFLEdBQUdyaEUsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxFQUFJZzFDLEVBQUV0MUMsRUFBRTBqRCxJQUFLbmxELEVBQUl5QixFQUFFMnFELEdBQUd2ckQsSUFBSTJFLEdBQzFDLE9BQU94RixFQUFJdUcsUUFBUUYsUUFBUXJHLEVBQUU0RixRQUFVbkUsRUFBRTJjLFlBQVlraEQsZUFBZSxrQkFBbUIsV0FBYXArRCxHQUFLYSxFQUFFdzZDLEdBQUdyN0MsRUFBR3NFLEdBQUcrSCxLQUFNck0sR0FBS0EsRUFBSUEsRUFBRTBFLE9BQVMsT0FVbEosU0FBUzQ4RCxHQUFHdGhFLEdBQ1IsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLE9BQU9zRSxFQUFFNFksWUFBWWtoRCxlQUFlLDJCQUE0QixXQUFhcCtELEdBQUssU0FBU0EsRUFBR3NFLEVBQUcvRCxHQUM3RixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FDWixJQUFJbEIsRUFBSXdwRCxLQUFNMW9ELEVBQUk4MkQsR0FBR24yRCxHQUNyQixNQUFNaEIsRUFBSTA5RCxHQUFHMzRELEdBQUl3RixFQUFJK3RELFlBQVkwQixXQUFXMzVELEdBQUcsR0FDL0MsT0FBT0wsRUFBRTgrQyxHQUFHLENBQ1I0VyxNQUFPdkUsR0FBR0ksY0FDVm9FLE1BQU9wckQsR0FDUixDQUFFOUosRUFBR3NFLEtBR0osTUFBTS9ELEVBQUk4MUQsR0FBR3gxRCxFQUFFc0osRUFBRzdGLEdBQ2xCeEYsRUFBSUEsRUFBRXluRCxPQUFPaG1ELEVBQUVGLElBQUtFLEdBQUlYLEVBQUkwRSxFQUFFa3NELFdBQzlCbmtELEtBQUssS0FBTyxDQUNaZzhDLEdBQUl2cEQsRUFDSjB4RCxTQUFVc0csR0FBR2wzRCxNQWQ2RCxDQXNCakYwRSxFQUFFa25ELEdBQUl4ckQsRUFBR3NFLEVBQUVnbkQsS0FBTXAvQyxLQUFLLEVBQUdtOEMsR0FBSXJvRCxFQUFHd3dELFNBQVVqd0QsTUFBUStELEVBQUVnbkQsR0FBSy9xRCxFQUFHUCxJQWtFakV1UyxlQUFlZ3ZELEdBQUd2aEUsRUFBR3NFLEVBQUcvRCxFQUFJcW9ELE1BTXhCLE1BQU0vbkQsUUFBVWlnRSxHQUFHOWdFLEVBQUdtaUQsR0FBR2dWLEdBQUc3eUQsRUFBRXN1RCxnQkFBaUI5ekQsRUFBSSsyQyxFQUFFNzFDLEdBQ3JELE9BQU9sQixFQUFFb2UsWUFBWWtoRCxlQUFlLG1CQUFvQixZQUFjcCtELElBQ2xFLE1BQU1KLEVBQUlnc0QsR0FBR3RuRCxFQUFFa3NELFVBR1AsR0FBSTN2RCxFQUFFbW9ELGdCQUFnQnhMLFVBQVU1OUMsSUFBTSxFQUFHLE9BQU9kLEVBQUV3bEQsR0FBR2tkLGVBQWV4aEUsRUFBR3NFLEdBRXZFLE1BQU0vRSxFQUFJc0IsRUFBRTRnRSxnQkFBZ0IxbUIsRUFBR0Usa0JBQW1CcjdDLEdBQzFELE9BQU9kLEVBQUVvc0QsR0FBS3BzRCxFQUFFb3NELEdBQUczRSxPQUFPaG5ELEVBQUV3cUQsU0FBVXhxRCxHQUFJVCxFQUFFbWxELEdBQUdrWSxpQkFBaUJuOEQsRUFBR1QsR0FBRzhNLEtBQUssSUFBT3ZOLEVBQUVtbEQsR0FBR2dXLDhCQUE4Qmo2RCxFQUFHYSxFQUFFa3BELFdBQVkxOUMsS0FBSyxJQUFPdk4sRUFBRW1sRCxHQUFHeWQsZ0JBQWdCMWhFLEVBQUdPLEVBQUdNLEVBQUVrcEQsV0FBWTE5QyxLQUFLLElBQU92TixFQUFFd2xELEdBQUdrZCxlQUFleGhFLEVBQUdzRTs7Ozs7Ozs7Ozs7Ozs7OztHQW1CbE8sTUFBTXE5RCxHQUNOLFlBQVkzaEUsR0FDUnlCLEtBQUswSSxFQUFJbkssRUFBR3lCLEtBQUsycUQsR0FBSyxJQUFJaDhDLElBQUszTyxLQUFLNHFELEdBQUssSUFBSWo4QyxJQUVqRCxrQkFBa0JwUSxFQUFHc0UsR0FDakIsT0FBTzJ1RCxHQUFHOXRELFFBQVExRCxLQUFLMnFELEdBQUd6c0QsSUFBSTJFLElBRWxDLG1CQUFtQnRFLEVBQUdzRSxHQUVsQixJQUFJL0QsRUFDSixPQUFPa0IsS0FBSzJxRCxHQUFHNTdDLElBQUlsTSxFQUFFc0QsR0FBSSxDQUNyQkEsSUFBS3JILEVBQUkrRCxHQUFHc0QsR0FDWnEzQyxRQUFTMStDLEVBQUUwK0MsUUFDWHlULFdBQVk5RyxHQUFHcnJELEVBQUVteUQsY0FDakJPLEdBQUc5dEQsVUFFWCxjQUFjbkYsRUFBR3NFLEdBQ2IsT0FBTzJ1RCxHQUFHOXRELFFBQVExRCxLQUFLNHFELEdBQUcxc0QsSUFBSTJFLElBRWxDLGVBQWV0RSxFQUFHc0UsR0FDZCxPQUFPN0MsS0FBSzRxRCxHQUFHNzdDLElBQUlsTSxFQUFFakYsS0FBTSxTQUFTVyxHQUNoQyxNQUFPLENBQ0hYLEtBQU1XLEVBQUVYLEtBQ1J1VCxNQUFPdWtELEdBQUduM0QsRUFBRTR5RCxjQUNacEMsU0FBVTVFLEdBQUc1ckQsRUFBRXd3RCxXQUpJLENBTXpCbHNELElBQUsydUQsR0FBRzl0RDs7Ozs7Ozs7Ozs7Ozs7OztHQWtDZCxNQUFNeThELEdBQ04sY0FFSW5nRSxLQUFLNnFELEdBQUssSUFBSXhFLEdBQUcrWixHQUFHMVYsSUFFcEIxcUQsS0FBS3RCLEdBQUssSUFBSTJuRCxHQUFHK1osR0FBR3RWLElBRTRDLFVBQ2hFLE9BQU85cUQsS0FBSzZxRCxHQUFHMWlELFVBRW9ELGFBQWE1SixFQUFHc0UsR0FDbkYsTUFBTS9ELEVBQUksSUFBSXNoRSxHQUFHN2hFLEVBQUdzRSxHQUNwQjdDLEtBQUs2cUQsR0FBSzdxRCxLQUFLNnFELEdBQUd6bUMsSUFBSXRsQixHQUFJa0IsS0FBS3RCLEdBQUtzQixLQUFLdEIsR0FBRzBsQixJQUFJdGxCLEdBRWtCLEdBQUdQLEVBQUdzRSxHQUN4RXRFLEVBQUU0SyxRQUFTNUssR0FBS3lCLEtBQUs2NEQsYUFBYXQ2RCxFQUFHc0UsSUFLbEMsZ0JBQWdCdEUsRUFBR3NFLEdBQ3RCN0MsS0FBS2dyRCxHQUFHLElBQUlvVixHQUFHN2hFLEVBQUdzRSxJQUV0QixHQUFHdEUsRUFBR3NFLEdBQ0Z0RSxFQUFFNEssUUFBUzVLLEdBQUt5QixLQUFLODRELGdCQUFnQnY2RCxFQUFHc0UsSUFLckMsR0FBR3RFLEdBQ04sTUFBTXNFLEVBQUksSUFBSWc0QyxHQUFHLElBQUlqQyxFQUFHLEtBQU05NUMsRUFBSSxJQUFJc2hFLEdBQUd2OUQsRUFBR3RFLEdBQUlhLEVBQUksSUFBSWdoRSxHQUFHdjlELEVBQUd0RSxFQUFJLEdBQUlsQixFQUFJLEdBQzFFLE9BQU8yQyxLQUFLdEIsR0FBRzJoRSxlQUFlLENBQUV2aEUsRUFBR00sR0FBTWIsSUFDckN5QixLQUFLZ3JELEdBQUd6c0QsR0FBSWxCLEVBQUUrRCxLQUFLN0MsRUFBRUssT0FDcEJ2QixFQUVULEtBQ0kyQyxLQUFLNnFELEdBQUcxaEQsUUFBUzVLLEdBQUt5QixLQUFLZ3JELEdBQUd6c0QsSUFFbEMsR0FBR0EsR0FDQ3lCLEtBQUs2cUQsR0FBSzdxRCxLQUFLNnFELEdBQUc1MUIsT0FBTzEyQixHQUFJeUIsS0FBS3RCLEdBQUtzQixLQUFLdEIsR0FBR3UyQixPQUFPMTJCLEdBRTFELEdBQUdBLEdBQ0MsTUFBTXNFLEVBQUksSUFBSWc0QyxHQUFHLElBQUlqQyxFQUFHLEtBQU05NUMsRUFBSSxJQUFJc2hFLEdBQUd2OUQsRUFBR3RFLEdBQUlhLEVBQUksSUFBSWdoRSxHQUFHdjlELEVBQUd0RSxFQUFJLEdBQ2xFLElBQUlsQixFQUFJOHBELEtBQ1IsT0FBT25uRCxLQUFLdEIsR0FBRzJoRSxlQUFlLENBQUV2aEUsRUFBR00sR0FBTWIsSUFDckNsQixFQUFJQSxFQUFFK21CLElBQUk3bEIsRUFBRUssT0FDWHZCLEVBRVQsWUFBWWtCLEdBQ1IsTUFBTXNFLEVBQUksSUFBSXU5RCxHQUFHN2hFLEVBQUcsR0FBSU8sRUFBSWtCLEtBQUs2cUQsR0FBR3lWLGtCQUFrQno5RCxHQUN0RCxPQUFPLE9BQVMvRCxHQUFLUCxFQUFFMjVDLFFBQVFwNUMsRUFBRUYsTUFJekMsTUFBTXdoRSxHQUNGLFlBQVk3aEUsRUFBR3NFLEdBQ1g3QyxLQUFLcEIsSUFBTUwsRUFBR3lCLEtBQUt1Z0UsR0FBSzE5RCxFQUVRLFVBQVV0RSxFQUFHc0UsR0FDN0MsT0FBT2c0QyxHQUFHcEMsV0FBV2w2QyxFQUFFSyxJQUFLaUUsRUFBRWpFLE1BQVEyNEMsRUFBR2g1QyxFQUFFZ2lFLEdBQUkxOUQsRUFBRTA5RCxJQUVqQixVQUFVaGlFLEVBQUdzRSxHQUM3QyxPQUFPMDBDLEVBQUdoNUMsRUFBRWdpRSxHQUFJMTlELEVBQUUwOUQsS0FBTzFsQixHQUFHcEMsV0FBV2w2QyxFQUFFSyxJQUFLaUUsRUFBRWpFOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJwRCxNQUFNNGhFLEdBQ04sWUFBWWppRSxFQUFHc0UsR0FDWDdDLEtBQUsrZ0QsR0FBS3hpRCxFQUFHeUIsS0FBS3UzRCxrQkFBb0IxMEQsRUFLdEM3QyxLQUFLNm1ELEdBQUssR0FFVjdtRCxLQUFLZ3RELEdBQUssRUFFVmh0RCxLQUFLOHNELEdBQUssSUFBSXpHLEdBQUcrWixHQUFHMVYsSUFFeEIsV0FBV25zRCxHQUNQLE9BQU9pekQsR0FBRzl0RCxRQUFRLElBQU0xRCxLQUFLNm1ELEdBQUdybkQsUUFFcEMsaUJBQWlCakIsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUN0QixNQUFNL0IsRUFBSTJDLEtBQUtndEQsR0FDZmh0RCxLQUFLZ3RELEtBQU1odEQsS0FBSzZtRCxHQUFHcm5ELE9BQVMsR0FBS1EsS0FBSzZtRCxHQUFHN21ELEtBQUs2bUQsR0FBR3JuRCxPQUFTLEdBQzFELE1BQU1yQixFQUFJLElBQUk4MUQsR0FBRzUyRCxFQUFHd0YsRUFBRy9ELEVBQUdNLEdBQzFCWSxLQUFLNm1ELEdBQUd6bEQsS0FBS2pELEdBRWIsSUFBSyxNQUFNMEUsS0FBS3pELEVBQUdZLEtBQUs4c0QsR0FBSzlzRCxLQUFLOHNELEdBQUcxb0MsSUFBSSxJQUFJZzhDLEdBQUd2OUQsRUFBRWpFLElBQUt2QixJQUFLMkMsS0FBSytnRCxHQUFHNlcsMkJBQTJCcjVELEVBQUdzRSxFQUFFakUsSUFBSW1SLEtBQUtndEMsV0FDN0csT0FBT3lVLEdBQUc5dEQsUUFBUXZGLEdBRXRCLG9CQUFvQkksRUFBR3NFLEdBQ25CLE9BQU8ydUQsR0FBRzl0RCxRQUFRMUQsS0FBS3F0RCxHQUFHeHFELElBRTlCLGlDQUFpQ3RFLEVBQUdzRSxHQUNoQyxNQUFNL0QsRUFBSStELEVBQUksRUFBR3pELEVBQUlZLEtBQUswc0QsR0FBRzV0RCxHQUFJekIsRUFBSStCLEVBQUksRUFBSSxFQUFJQSxFQUd6QyxPQUFPb3lELEdBQUc5dEQsUUFBUTFELEtBQUs2bUQsR0FBR3JuRCxPQUFTbkMsRUFBSTJDLEtBQUs2bUQsR0FBR3hwRCxHQUFLLE1BRWhFLGtDQUNJLE9BQU9tMEQsR0FBRzl0RCxRQUFRLElBQU0xRCxLQUFLNm1ELEdBQUdybkQsUUFBVSxFQUFJUSxLQUFLZ3RELEdBQUssR0FFNUQsc0JBQXNCenVELEdBQ2xCLE9BQU9pekQsR0FBRzl0RCxRQUFRMUQsS0FBSzZtRCxHQUFHMTRDLFNBRTlCLDBDQUEwQzVQLEVBQUdzRSxHQUN6QyxNQUFNL0QsRUFBSSxJQUFJc2hFLEdBQUd2OUQsRUFBRyxHQUFJekQsRUFBSSxJQUFJZ2hFLEdBQUd2OUQsRUFBRzZRLE9BQU8rakQsbUJBQW9CcDZELEVBQUksR0FDckUsT0FBTzJDLEtBQUs4c0QsR0FBR3VULGVBQWUsQ0FBRXZoRSxFQUFHTSxHQUFNYixJQUNyQyxNQUFNc0UsRUFBSTdDLEtBQUtxdEQsR0FBRzl1RCxFQUFFZ2lFLElBQ3BCbGpFLEVBQUUrRCxLQUFLeUIsS0FDTjJ1RCxHQUFHOXRELFFBQVFyRyxHQUVwQiwyQ0FBMkNrQixFQUFHc0UsR0FDMUMsSUFBSS9ELEVBQUksSUFBSXVuRCxHQUFHOU8sR0FDZixPQUFPMTBDLEVBQUVzRyxRQUFTNUssSUFDZCxNQUFNc0UsRUFBSSxJQUFJdTlELEdBQUc3aEUsRUFBRyxHQUFJYSxFQUFJLElBQUlnaEUsR0FBRzdoRSxFQUFHbVYsT0FBTytqRCxtQkFDN0N6M0QsS0FBSzhzRCxHQUFHdVQsZUFBZSxDQUFFeDlELEVBQUd6RCxHQUFNYixJQUM5Qk8sRUFBSUEsRUFBRXNsQixJQUFJN2xCLEVBQUVnaUUsUUFFZi9PLEdBQUc5dEQsUUFBUTFELEtBQUt3c0QsR0FBRzF0RCxJQUU1QixvQ0FBb0NQLEVBQUdzRSxHQUduQyxNQUFNL0QsRUFBSStELEVBQUVrTixLQUFNM1EsRUFBSU4sRUFBRVUsT0FBUyxFQUtqQyxJQUFJbkMsRUFBSXlCLEVBQ1IrN0MsR0FBR2lFLGNBQWN6aEQsS0FBT0EsRUFBSUEsRUFBRWdnRCxNQUFNLEtBQ3BDLE1BQU1sL0MsRUFBSSxJQUFJaWlFLEdBQUcsSUFBSXZsQixHQUFHeDlDLEdBQUksR0FHcEIsSUFBSVMsRUFBSSxJQUFJdW9ELEdBQUc5TyxHQUN2QixPQUFPdjNDLEtBQUs4c0QsR0FBRzNELGFBQWM1cUQsSUFDekIsTUFBTXNFLEVBQUl0RSxFQUFFSyxJQUFJbVIsS0FDaEIsUUFBU2pSLEVBQUVzNkMsV0FBV3YyQyxLQU10QkEsRUFBRXJELFNBQVdKLElBQU10QixFQUFJQSxFQUFFc21CLElBQUk3bEIsRUFBRWdpRSxNQUFNLElBQ3JDcGlFLEdBQUlxekQsR0FBRzl0RCxRQUFRMUQsS0FBS3dzRCxHQUFHMXVELElBRS9CLEdBQUdTLEdBR0MsTUFBTXNFLEVBQUksR0FDVixPQUFPdEUsRUFBRTRLLFFBQVM1SyxJQUNkLE1BQU1PLEVBQUlrQixLQUFLcXRELEdBQUc5dUQsR0FDbEIsT0FBU08sR0FBSytELEVBQUV6QixLQUFLdEMsS0FDcEIrRCxFQUVULG9CQUFvQnRFLEVBQUdzRSxHQUNuQnF4QyxFQUFFLElBQU1sMEMsS0FBS290RCxHQUFHdnFELEVBQUV5ckQsUUFBUyxZQUFhdHVELEtBQUs2bUQsR0FBRzRaLFFBQ2hELElBQUkzaEUsRUFBSWtCLEtBQUs4c0QsR0FDYixPQUFPMEUsR0FBR3JvRCxRQUFRdEcsRUFBRTRyRCxVQUFZcnZELElBQzVCLE1BQU0vQixFQUFJLElBQUkraUUsR0FBR2hoRSxFQUFFUixJQUFLaUUsRUFBRXlyRCxTQUMxQixPQUFPeHZELEVBQUlBLEVBQUVtMkIsT0FBTzUzQixHQUFJMkMsS0FBS3UzRCxrQkFBa0JVLHdCQUF3QjE1RCxFQUFHYSxFQUFFUixPQUM1RWdNLEtBQUssS0FDTDVLLEtBQUs4c0QsR0FBS2h1RCxJQUdsQixHQUFHUCxJQUdILFlBQVlBLEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJLElBQUlzaEUsR0FBR3Y5RCxFQUFHLEdBQUl6RCxFQUFJWSxLQUFLOHNELEdBQUd3VCxrQkFBa0J4aEUsR0FDdEQsT0FBTzB5RCxHQUFHOXRELFFBQVFiLEVBQUVxMUMsUUFBUTk0QyxHQUFLQSxFQUFFUixNQUV2Qyx3QkFBd0JMLEdBQ3BCLE9BQU95QixLQUFLNm1ELEdBQUdybkQsT0FBUWd5RCxHQUFHOXRELFVBU3ZCLEdBQUduRixFQUFHc0UsR0FDVCxPQUFPN0MsS0FBSzBzRCxHQUFHbnVELEdBVVosR0FBR0EsR0FDTixPQUFJLElBQU15QixLQUFLNm1ELEdBQUdybkQsT0FFWCxFQUtRakIsRUFBSXlCLEtBQUs2bUQsR0FBRyxHQUFHeUgsUUFLM0IsR0FBRy92RCxHQUNOLE1BQU1zRSxFQUFJN0MsS0FBSzBzRCxHQUFHbnVELEdBQ2xCLE9BQUlzRSxFQUFJLEdBQUtBLEdBQUs3QyxLQUFLNm1ELEdBQUdybkQsT0FBZSxLQUNsQ1EsS0FBSzZtRCxHQUFHaGtEOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0J2QixNQUFNNjlELEdBTUYsWUFBWW5pRSxFQUFHc0UsR0FDWDdDLEtBQUsrZ0QsR0FBS3hpRCxFQUFHeUIsS0FBS2t0RCxHQUFLcnFELEVBRXZCN0MsS0FBSzJnRSxLQUFPLElBQUlqYyxHQUFHN0osR0FBR3BDLFlBRXRCejRDLEtBQUtrMUIsS0FBTyxFQU9ULFNBQVMzMkIsRUFBR3NFLEVBQUcvRCxHQUNsQixNQUFNTSxFQUFJeUQsRUFBRWpFLElBQUt2QixFQUFJMkMsS0FBSzJnRSxLQUFLemlFLElBQUlrQixHQUFJakIsRUFBSWQsRUFBSUEsRUFBRTYzQixLQUFPLEVBQUdwM0IsRUFBSWtDLEtBQUtrdEQsR0FBR3JxRCxHQUN2RSxPQUFPN0MsS0FBSzJnRSxLQUFPM2dFLEtBQUsyZ0UsS0FBSzdiLE9BQU8xbEQsRUFBRyxDQUNuQ2drQixTQUFVdmdCLEVBQUVnN0MsUUFDWjNvQixLQUFNcDNCLEVBQ05peEQsU0FBVWp3RCxJQUNWa0IsS0FBS2sxQixNQUFRcDNCLEVBQUlLLEVBQUc2QixLQUFLK2dELEdBQUc2VywyQkFBMkJyNUQsRUFBR2EsRUFBRTJRLEtBQUtndEMsV0FPbEUsWUFBWXgrQyxHQUNmLE1BQU1zRSxFQUFJN0MsS0FBSzJnRSxLQUFLemlFLElBQUlLLEdBQ3hCc0UsSUFBTTdDLEtBQUsyZ0UsS0FBTzNnRSxLQUFLMmdFLEtBQUsxYixPQUFPMW1ELEdBQUl5QixLQUFLazFCLE1BQVFyeUIsRUFBRXF5QixNQUUxRCxTQUFTMzJCLEVBQUdzRSxHQUNSLE1BQU0vRCxFQUFJa0IsS0FBSzJnRSxLQUFLemlFLElBQUkyRSxHQUN4QixPQUFPMnVELEdBQUc5dEQsUUFBUTVFLEVBQUlBLEVBQUVza0IsU0FBU3k2QixRQUFVUCxHQUFHOGQsbUJBQW1CdjRELElBRXJFLFdBQVd0RSxFQUFHc0UsR0FDVixJQUFJL0QsRUFBSStuRCxLQUNSLE9BQU9oa0QsRUFBRXNHLFFBQVM1SyxJQUNkLE1BQU1zRSxFQUFJN0MsS0FBSzJnRSxLQUFLemlFLElBQUlLLEdBQ3hCTyxFQUFJQSxFQUFFZ21ELE9BQU92bUQsRUFBR3NFLEVBQUlBLEVBQUV1Z0IsU0FBU3k2QixRQUFVUCxHQUFHOGQsbUJBQW1CNzhELE1BQzlEaXpELEdBQUc5dEQsUUFBUTVFLEdBRXBCLDBCQUEwQlAsRUFBR3NFLEVBQUcvRCxHQUM1QixJQUFJTSxFQUFJeW5ELEtBR0EsTUFBTXhwRCxFQUFJLElBQUl3OUMsR0FBR2g0QyxFQUFFa04sS0FBS3N0QyxNQUFNLEtBQU1sL0MsRUFBSTZCLEtBQUsyZ0UsS0FBS3JhLGdCQUFnQmpwRCxHQUMxRSxLQUFNYyxFQUFFb29ELFdBQWEsQ0FDakIsTUFBTzNuRCxJQUFLTCxFQUFHRCxPQUFROGtCLFNBQVUvbEIsRUFBRzB4RCxTQUFVanhELElBQU1LLEVBQUVxb0QsVUFDdEQsSUFBSzNqRCxFQUFFa04sS0FBS3FwQyxXQUFXNzZDLEVBQUV3UixNQUFPLE1BQ2hDalMsRUFBRWkrQyxVQUFVajlDLElBQU0sR0FBS2tpRCxHQUFHbitDLEVBQUd4RixLQUFPK0IsRUFBSUEsRUFBRTBsRCxPQUFPem5ELEVBQUV1QixJQUFLdkIsRUFBRXdnRCxVQUU5RCxPQUFPMlQsR0FBRzl0RCxRQUFRdEUsR0FFdEIsR0FBR2IsRUFBR3NFLEdBQ0YsT0FBTzJ1RCxHQUFHcm9ELFFBQVFuSixLQUFLMmdFLEtBQU9waUUsR0FBS3NFLEVBQUV0RSxJQUV6QyxnQkFBZ0JBLEdBR1osT0FBTyxJQUFJcWlFLEdBQUc1Z0UsTUFFbEIsUUFBUXpCLEdBQ0osT0FBT2l6RCxHQUFHOXRELFFBQVExRCxLQUFLazFCLE9BZS9CLE1BQU0wckMsV0FBVzVGLEdBQ2IsWUFBWXo4RCxHQUNSNEksUUFBU25ILEtBQUttaEQsR0FBSzVpRCxFQUV2QixhQUFhQSxHQUNULE1BQU1zRSxFQUFJLEdBQ1YsT0FBTzdDLEtBQUtpN0QsUUFBUTl4RCxRQUFRLENBQUVySyxFQUFHTSxLQUM3QkEsRUFBRWdrQixTQUFTaXhDLGtCQUFvQnh4RCxFQUFFekIsS0FBS3BCLEtBQUttaEQsR0FBRzZhLFNBQVN6OUQsRUFBR2EsRUFBRWdrQixTQUFVcGpCLEtBQUsrN0QsWUFBWWo5RCxLQUFPa0IsS0FBS21oRCxHQUFHb1osWUFBWXo3RCxLQUNqSDB5RCxHQUFHUSxRQUFRbnZELEdBRXBCLGFBQWF0RSxFQUFHc0UsR0FDWixPQUFPN0MsS0FBS21oRCxHQUFHbVosU0FBUy83RCxFQUFHc0UsR0FFL0IsZ0JBQWdCdEUsRUFBR3NFLEdBQ2YsT0FBTzdDLEtBQUttaEQsR0FBRzZVLFdBQVd6M0QsRUFBR3NFOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJqQyxNQUFNZytELEdBQ04sWUFBWXRpRSxHQUNSeUIsS0FBS3liLFlBQWNsZCxFQUluQnlCLEtBQUttckQsR0FBSyxJQUFJeVAsR0FBSXI4RCxHQUFLKy9DLEdBQUcvL0MsR0FBS21nRCxJQUUvQjErQyxLQUFLd3dELDBCQUE0QnpZLEVBQUdub0MsTUFFcEM1UCxLQUFLc3dELGdCQUFrQixFQUV2QnR3RCxLQUFLdXFELEdBQUssRUFLVnZxRCxLQUFLdXRELEdBQUssSUFBSTRTLEdBQUluZ0UsS0FBS3l3RCxZQUFjLEVBQUd6d0QsS0FBS3l0RCxHQUFLNkssR0FBRzlZLEtBRXpELGNBQWNqaEQsRUFBR3NFLEdBQ2IsT0FBTzdDLEtBQUttckQsR0FBR2hpRCxRQUFRLENBQUU1SyxFQUFHTyxJQUFNK0QsRUFBRS9ELElBQU0weUQsR0FBRzl0RCxVQUVqRCw2QkFBNkJuRixHQUN6QixPQUFPaXpELEdBQUc5dEQsUUFBUTFELEtBQUt3d0QsMkJBRTNCLHlCQUF5Qmp5RCxHQUNyQixPQUFPaXpELEdBQUc5dEQsUUFBUTFELEtBQUt1cUQsSUFFM0IsaUJBQWlCaHNELEdBQ2IsT0FBT3lCLEtBQUtzd0QsZ0JBQWtCdHdELEtBQUt5dEQsR0FBRzdpRCxPQUFRNG1ELEdBQUc5dEQsUUFBUTFELEtBQUtzd0QsaUJBRWxFLG1CQUFtQi94RCxFQUFHc0UsRUFBRy9ELEdBQ3JCLE9BQU9BLElBQU1rQixLQUFLd3dELDBCQUE0QjF4RCxHQUFJK0QsRUFBSTdDLEtBQUt1cUQsS0FBT3ZxRCxLQUFLdXFELEdBQUsxbkQsR0FDNUUydUQsR0FBRzl0RCxVQUVQLEdBQUduRixHQUNDeUIsS0FBS21yRCxHQUFHcDhDLElBQUl4USxFQUFFMEUsT0FBUTFFLEdBQ3RCLE1BQU1zRSxFQUFJdEUsRUFBRStwRCxTQUNaemxELEVBQUk3QyxLQUFLc3dELGtCQUFvQnR3RCxLQUFLeXRELEdBQUssSUFBSTZLLEdBQUd6MUQsR0FBSTdDLEtBQUtzd0QsZ0JBQWtCenRELEdBQUl0RSxFQUFFMnhELGVBQWlCbHdELEtBQUt1cUQsS0FBT3ZxRCxLQUFLdXFELEdBQUtoc0QsRUFBRTJ4RCxnQkFFNUgsY0FBYzN4RCxFQUFHc0UsR0FDYixPQUFPN0MsS0FBS3EvQyxHQUFHeDhDLEdBQUk3QyxLQUFLeXdELGFBQWUsRUFBR2UsR0FBRzl0RCxVQUVqRCxpQkFBaUJuRixFQUFHc0UsR0FDaEIsT0FBTzdDLEtBQUtxL0MsR0FBR3g4QyxHQUFJMnVELEdBQUc5dEQsVUFFMUIsaUJBQWlCbkYsRUFBR3NFLEdBQ2hCLE9BQU83QyxLQUFLbXJELEdBQUdsMkIsT0FBT3B5QixFQUFFSSxRQUFTakQsS0FBS3V0RCxHQUFHdkIsR0FBR25wRCxFQUFFeWxELFVBQVd0b0QsS0FBS3l3RCxhQUFlLEVBQzdFZSxHQUFHOXRELFVBRVAsY0FBY25GLEVBQUdzRSxFQUFHL0QsR0FDaEIsSUFBSU0sRUFBSSxFQUNSLE1BQU0vQixFQUFJLEdBQ1YsT0FBTzJDLEtBQUttckQsR0FBR2hpRCxRQUFRLENBQUVoTCxFQUFHTCxLQUN4QkEsRUFBRW95RCxnQkFBa0JydEQsR0FBSyxPQUFTL0QsRUFBRVosSUFBSUosRUFBRXdxRCxZQUFjdG9ELEtBQUttckQsR0FBR2wyQixPQUFPOTJCLEdBQUlkLEVBQUUrRCxLQUFLcEIsS0FBS3c0RCw4QkFBOEJqNkQsRUFBR1QsRUFBRXdxRCxXQUMxSGxwRCxPQUNDb3lELEdBQUdRLFFBQVEzMEQsR0FBR3VOLEtBQUssSUFBT3hMLEdBRW5DLGVBQWViLEdBQ1gsT0FBT2l6RCxHQUFHOXRELFFBQVExRCxLQUFLeXdELGFBRTNCLGNBQWNseUQsRUFBR3NFLEdBQ2IsTUFBTS9ELEVBQUlrQixLQUFLbXJELEdBQUdqdEQsSUFBSTJFLElBQU0sS0FDNUIsT0FBTzJ1RCxHQUFHOXRELFFBQVE1RSxHQUV0QixnQkFBZ0JQLEVBQUdzRSxFQUFHL0QsR0FDbEIsT0FBT2tCLEtBQUt1dEQsR0FBR3VULEdBQUdqK0QsRUFBRy9ELEdBQUkweUQsR0FBRzl0RCxVQUVoQyxtQkFBbUJuRixFQUFHc0UsRUFBRy9ELEdBQ3JCa0IsS0FBS3V0RCxHQUFHd1QsR0FBR2wrRCxFQUFHL0QsR0FDZCxNQUFNTSxFQUFJWSxLQUFLeWIsWUFBWTg3QyxrQkFBbUJsNkQsRUFBSSxHQUNsRCxPQUFPK0IsR0FBS3lELEVBQUVzRyxRQUFTdEcsSUFDbkJ4RixFQUFFK0QsS0FBS2hDLEVBQUU2NEQsd0JBQXdCMTVELEVBQUdzRSxNQUNuQzJ1RCxHQUFHUSxRQUFRMzBELEdBRXBCLDhCQUE4QmtCLEVBQUdzRSxHQUM3QixPQUFPN0MsS0FBS3V0RCxHQUFHdkIsR0FBR25wRCxHQUFJMnVELEdBQUc5dEQsVUFFN0IsMkJBQTJCbkYsRUFBR3NFLEdBQzFCLE1BQU0vRCxFQUFJa0IsS0FBS3V0RCxHQUFHUixHQUFHbHFELEdBQ3JCLE9BQU8ydUQsR0FBRzl0RCxRQUFRNUUsR0FFdEIsWUFBWVAsRUFBR3NFLEdBQ1gsT0FBTzJ1RCxHQUFHOXRELFFBQVExRCxLQUFLdXRELEdBQUd5VCxZQUFZbitEOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0I5QyxNQUFNbytELEdBT0YsWUFBWTFpRSxFQUFHc0UsR0FDWDdDLEtBQUt3dEQsR0FBSyxHQUFJeHRELEtBQUs0aEQsR0FBSyxJQUFJL0ssRUFBRyxHQUFJNzJDLEtBQUs2aEQsSUFBSyxFQUFJN2hELEtBQUs2aEQsSUFBSyxFQUFJN2hELEtBQUt1M0Qsa0JBQW9CaDVELEVBQUV5QixNQUMxRkEsS0FBS3dpRCxHQUFLLElBQUlxZSxHQUFHN2dFLE1BQ2pCQSxLQUFLK2dELEdBQUssSUFBSStVLEdBQUk5MUQsS0FBSzBpRCxHQUFLLFNBQVNua0QsRUFBR3NFLEdBQ3BDLE9BQU8sSUFBSTY5RCxHQUFHbmlFLEVBQUdzRSxHQURPLENBRTFCN0MsS0FBSytnRCxHQUFLeGlELEdBQUt5QixLQUFLdTNELGtCQUFrQjdKLEdBQUdudkQsSUFBTXlCLEtBQUswSSxFQUFJLElBQUlpc0QsR0FBRzl4RCxHQUFJN0MsS0FBSzZpRCxHQUFLLElBQUlxZCxHQUFHbGdFLEtBQUswSSxHQUUvRixRQUNJLE9BQU85RSxRQUFRRixVQUVuQixXQUVJLE9BQU8xRCxLQUFLNmhELElBQUssRUFBSWorQyxRQUFRRixVQUVqQyxjQUNJLE9BQU8xRCxLQUFLNmhELEdBRWhCLDhCQUdBLHFCQUdBLGtCQUNJLE9BQU83aEQsS0FBSytnRCxHQUVoQixpQkFBaUJ4aUQsR0FDYixJQUFJc0UsRUFBSTdDLEtBQUt3dEQsR0FBR2p2RCxFQUFFMmlFLFNBQ2xCLE9BQU9yK0QsSUFBTUEsRUFBSSxJQUFJMjlELEdBQUd4Z0UsS0FBSytnRCxHQUFJL2dELEtBQUt1M0QsbUJBQW9CdjNELEtBQUt3dEQsR0FBR2p2RCxFQUFFMmlFLFNBQVdyK0QsR0FDL0VBLEVBRUosaUJBQ0ksT0FBTzdDLEtBQUt3aUQsR0FFaEIseUJBQ0ksT0FBT3hpRCxLQUFLMGlELEdBRWhCLGlCQUNJLE9BQU8xaUQsS0FBSzZpRCxHQUVoQixlQUFldGtELEVBQUdzRSxFQUFHL0QsR0FDakI0MEMsRUFBRSxvQkFBcUIsd0JBQXlCbjFDLEdBQ2hELE1BQU1hLEVBQUksSUFBSStoRSxHQUFHbmhFLEtBQUs0aEQsR0FBR2gzQyxRQUN6QixPQUFPNUssS0FBS3UzRCxrQkFBa0I1SixLQUFNN3VELEVBQUVNLEdBQUd3TCxLQUFNck0sR0FBS3lCLEtBQUt1M0Qsa0JBQWtCM0osR0FBR3h1RCxHQUFHd0wsS0FBSyxJQUFPck0sSUFBTXU2QixZQUFZcnVCLEtBQU1sTSxJQUFNYSxFQUFFODlELHdCQUM3SDMrRCxJQUVKLEdBQUdBLEVBQUdzRSxHQUNGLE9BQU8ydUQsR0FBRzhMLEdBQUd2L0QsT0FBTzQ5QyxPQUFPMzdDLEtBQUt3dEQsSUFBSWozQyxJQUFLelgsR0FBSyxJQUFNQSxFQUFFa2lFLFlBQVl6aUUsRUFBR3NFLE1BT3pFLE1BQU1zK0QsV0FBVzdQLEdBQ2pCLFlBQVkveUQsR0FDUjRJLFFBQVNuSCxLQUFLK3pELHNCQUF3QngxRCxHQUk5QyxNQUFNNmlFLEdBQ0YsWUFBWTdpRSxHQUNSeUIsS0FBS3liLFlBQWNsZCxFQUVuQnlCLEtBQUtxdUQsR0FBSyxJQUFJOFIsR0FFZG5nRSxLQUFLNHVELEdBQUssS0FFZCxVQUFVcndELEdBQ04sT0FBTyxJQUFJNmlFLEdBQUc3aUUsR0FFbEIsU0FDSSxHQUFJeUIsS0FBSzR1RCxHQUFJLE9BQU81dUQsS0FBSzR1RCxHQUN6QixNQUFNdG5CLElBRVYsYUFBYS9vQyxFQUFHc0UsRUFBRy9ELEdBQ2YsT0FBT2tCLEtBQUtxdUQsR0FBR3dLLGFBQWEvNUQsRUFBRytELEdBQUk3QyxLQUFLZ3ZELEdBQUcvNUIsT0FBT24yQixFQUFFNEcsWUFBYThyRCxHQUFHOXRELFVBRXhFLGdCQUFnQm5GLEVBQUdzRSxFQUFHL0QsR0FDbEIsT0FBT2tCLEtBQUtxdUQsR0FBR3lLLGdCQUFnQmg2RCxFQUFHK0QsR0FBSTdDLEtBQUtndkQsR0FBRzVxQyxJQUFJdGxCLEVBQUU0RyxZQUFhOHJELEdBQUc5dEQsVUFFeEUsd0JBQXdCbkYsRUFBR3NFLEdBQ3ZCLE9BQU83QyxLQUFLZ3ZELEdBQUc1cUMsSUFBSXZoQixFQUFFNkMsWUFBYThyRCxHQUFHOXRELFVBRXpDLGFBQWFuRixFQUFHc0UsR0FDWjdDLEtBQUtxdUQsR0FBR3JDLEdBQUducEQsRUFBRXlsRCxVQUFVbi9DLFFBQVM1SyxHQUFLeUIsS0FBS2d2RCxHQUFHNXFDLElBQUk3bEIsRUFBRW1ILGFBQ25ELE1BQU01RyxFQUFJa0IsS0FBS3liLFlBQVl3K0MsaUJBQzNCLE9BQU9uN0QsRUFBRTZnRSwyQkFBMkJwaEUsRUFBR3NFLEVBQUV5bEQsVUFBVTE5QyxLQUFNck0sSUFDckRBLEVBQUU0SyxRQUFTNUssR0FBS3lCLEtBQUtndkQsR0FBRzVxQyxJQUFJN2xCLEVBQUVtSCxlQUM5QmtGLEtBQUssSUFBTzlMLEVBQUU0NUQsaUJBQWlCbjZELEVBQUdzRSxJQUUxQyxLQUNJN0MsS0FBSzR1RCxHQUFLLElBQUk3akMsSUFFbEIsR0FBR3hzQixHQUVDLE1BQU1zRSxFQUFJN0MsS0FBS3liLFlBQVkyK0MseUJBQXlCQyxrQkFDcEQsT0FBTzdJLEdBQUdyb0QsUUFBUW5KLEtBQUtndkQsR0FBS2x3RCxJQUN4QixNQUFNTSxFQUFJeTdDLEdBQUd3bUIsU0FBU3ZpRSxHQUN0QixPQUFPa0IsS0FBS2l2RCxHQUFHMXdELEVBQUdhLEdBQUd3TCxLQUFNck0sSUFDdkJBLEdBQUtzRSxFQUFFMDNELFlBQVluN0QsT0FFdkJ3TCxLQUFLLEtBQVE1SyxLQUFLNHVELEdBQUssS0FBTS9yRCxFQUFFMjNELE1BQU1qOEQsS0FFN0Msb0JBQW9CQSxFQUFHc0UsR0FDbkIsT0FBTzdDLEtBQUtpdkQsR0FBRzF3RCxFQUFHc0UsR0FBRytILEtBQU1yTSxJQUN2QkEsRUFBSXlCLEtBQUtndkQsR0FBRy81QixPQUFPcHlCLEVBQUU2QyxZQUFjMUYsS0FBS2d2RCxHQUFHNXFDLElBQUl2aEIsRUFBRTZDLGNBR3pELEdBQUduSCxHQUVDLE9BQU8sRUFFWCxHQUFHQSxFQUFHc0UsR0FDRixPQUFPMnVELEdBQUc4TCxHQUFHLENBQUUsSUFBTTlMLEdBQUc5dEQsUUFBUTFELEtBQUtxdUQsR0FBRzJTLFlBQVluK0QsSUFBSyxJQUFNN0MsS0FBS3liLFlBQVl3K0MsaUJBQWlCK0csWUFBWXppRSxFQUFHc0UsR0FBSSxJQUFNN0MsS0FBS3liLFlBQVl3eUMsR0FBRzF2RCxFQUFHc0U7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QnpKLFNBQVN5K0QsR0FBRy9pRSxFQUFHc0UsR0FDWCxNQUFPLHFCQUFxQnRFLEtBQUtzRSxJQVdyQyxTQUFTMCtELEdBQUdoakUsRUFBR3NFLEVBQUcvRCxHQUNkLElBQUlNLEVBQUksdUJBQXVCYixLQUFLTyxJQUNwQyxPQUFPK0QsRUFBRW93QyxvQkFBc0I3ekMsR0FBSyxJQUFJeUQsRUFBRXFCLEtBQVE5RSxFQU10RCxTQUFTb2lFLEdBQUdqakUsRUFBR3NFLEdBQ1gsTUFBTyxxQkFBcUJ0RSxLQUFLc0UsSUFXckMsTUFBTTQrRCxHQUNGLFlBQVlsakUsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqQlksS0FBS3FVLEtBQU85VixFQUFHeUIsS0FBS3N1RCxRQUFVenJELEVBQUc3QyxLQUFLd29ELE1BQVExcEQsRUFBR2tCLEtBQUsrQyxNQUFRM0QsRUFLM0QsVUFBVWIsRUFBR3NFLEVBQUcvRCxHQUNuQixNQUFNTSxFQUFJNEYsS0FBS21QLE1BQU1yVixHQUNyQixJQUFJekIsRUFBR2MsRUFBSSxpQkFBbUJpQixJQUFNLElBQU0sQ0FBRSxVQUFXLGVBQWdCLFlBQWFrSCxRQUFRbEgsRUFBRW9wRCxjQUFXLElBQVdwcEQsRUFBRTJELE9BQVMsaUJBQW1CM0QsRUFBRTJELE9BQ3BKLE9BQU81RSxHQUFLaUIsRUFBRTJELFFBQVU1RSxFQUFJLGlCQUFtQmlCLEVBQUUyRCxNQUFNa0UsU0FBVyxpQkFBbUI3SCxFQUFFMkQsTUFBTWlFLEtBQzdGN0ksSUFBTWQsRUFBSSxJQUFJaTRDLEVBQUVsMkMsRUFBRTJELE1BQU1pRSxLQUFNNUgsRUFBRTJELE1BQU1rRSxXQUFZOUksRUFBSSxJQUFJc2pFLEdBQUdsakUsRUFBR3NFLEVBQUd6RCxFQUFFb3BELE1BQU9uckQsSUFBTXkyQyxFQUFFLG9CQUFxQiwwQ0FBMENqeEMsT0FBTy9ELEtBQzFKLE1BRUosS0FDSSxNQUFNUCxFQUFJLENBQ05pcUQsTUFBT3hvRCxLQUFLd29ELE1BQ1pxSSxhQUFjenRELEtBQUsrUixPQUV2QixPQUFPblYsS0FBSytDLFFBQVV4RSxFQUFFd0UsTUFBUSxDQUM1QmlFLEtBQU1oSCxLQUFLK0MsTUFBTWlFLEtBQ2pCQyxRQUFTakgsS0FBSytDLE1BQU1rRSxVQUNwQmpDLEtBQUtDLFVBQVUxRyxJQVMzQixNQUFNbWpFLEdBQ0YsWUFBWW5qRSxFQUFHc0UsRUFBRy9ELEdBQ2RrQixLQUFLc29ELFNBQVcvcEQsRUFBR3lCLEtBQUt3b0QsTUFBUTNsRCxFQUFHN0MsS0FBSytDLE1BQVFqRSxFQUs3QyxVQUFVUCxFQUFHc0UsR0FDaEIsTUFBTS9ELEVBQUlrRyxLQUFLbVAsTUFBTXRSLEdBQ3JCLElBQUl6RCxFQUFHL0IsRUFBSSxpQkFBbUJ5QixJQUFNLElBQU0sQ0FBRSxjQUFlLFVBQVcsWUFBYXdILFFBQVF4SCxFQUFFMHBELGNBQVcsSUFBVzFwRCxFQUFFaUUsT0FBUyxpQkFBbUJqRSxFQUFFaUUsT0FDbkosT0FBTzFGLEdBQUt5QixFQUFFaUUsUUFBVTFGLEVBQUksaUJBQW1CeUIsRUFBRWlFLE1BQU1rRSxTQUFXLGlCQUFtQm5JLEVBQUVpRSxNQUFNaUUsS0FDN0YzSixJQUFNK0IsRUFBSSxJQUFJazJDLEVBQUV4MkMsRUFBRWlFLE1BQU1pRSxLQUFNbEksRUFBRWlFLE1BQU1rRSxXQUFZNUosRUFBSSxJQUFJcWtFLEdBQUduakUsRUFBR08sRUFBRTBwRCxNQUFPcHBELElBQU0wMEMsRUFBRSxvQkFBcUIsd0NBQXdDdjFDLE9BQU9zRSxLQUNySixNQUVKLEtBQ0ksTUFBTXRFLEVBQUksQ0FDTmlxRCxNQUFPeG9ELEtBQUt3b0QsTUFDWnFJLGFBQWN6dEQsS0FBSytSLE9BRXZCLE9BQU9uVixLQUFLK0MsUUFBVXhFLEVBQUV3RSxNQUFRLENBQzVCaUUsS0FBTWhILEtBQUsrQyxNQUFNaUUsS0FDakJDLFFBQVNqSCxLQUFLK0MsTUFBTWtFLFVBQ3BCakMsS0FBS0MsVUFBVTFHLElBT3ZCLE1BQU1vakUsR0FDTixZQUFZcGpFLEVBQUdzRSxHQUNYN0MsS0FBSzR3RCxTQUFXcnlELEVBQUd5QixLQUFLNGhFLGdCQUFrQi8rRCxFQUt2QyxVQUFVdEUsRUFBR3NFLEdBQ2hCLE1BQU0vRCxFQUFJa0csS0FBS21QLE1BQU10UixHQUNyQixJQUFJekQsRUFBSSxpQkFBbUJOLEdBQUtBLEVBQUU4aUUsMkJBQTJCdmhFLE1BQU9oRCxFQUFJZ3FELEtBQ3hFLElBQUssSUFBSTlvRCxFQUFJLEVBQUdhLEdBQUtiLEVBQUlPLEVBQUU4aUUsZ0JBQWdCcGlFLFNBQVVqQixFQUFHYSxFQUFJcTdDLEdBQUczN0MsRUFBRThpRSxnQkFBZ0JyakUsSUFDakZsQixFQUFJQSxFQUFFK21CLElBQUl0bEIsRUFBRThpRSxnQkFBZ0JyakUsSUFDNUIsT0FBT2EsRUFBSSxJQUFJdWlFLEdBQUdwakUsRUFBR2xCLElBQU15MkMsRUFBRSxvQkFBcUIsNkNBQTZDdjFDLE9BQU9zRSxLQUN0RyxPQVFKLE1BQU1nL0QsR0FDTixZQUFZdGpFLEVBQUdzRSxHQUNYN0MsS0FBSzR3RCxTQUFXcnlELEVBQUd5QixLQUFLOGhFLFlBQWNqL0QsRUFLbkMsVUFBVXRFLEdBQ2IsTUFBTXNFLEVBQUltQyxLQUFLbVAsTUFBTTVWLEdBQ3JCLE1BQU8saUJBQW1Cc0UsSUFBTSxJQUFNLENBQUUsVUFBVyxTQUFVLFdBQVl5RCxRQUFRekQsRUFBRWkvRCxjQUFnQixpQkFBbUJqL0QsRUFBRSt0RCxTQUFXLElBQUlpUixHQUFHaC9ELEVBQUUrdEQsU0FBVS90RCxFQUFFaS9ELGNBQWdCaHVCLEVBQUUsb0JBQXFCLGlDQUFpQ3YxQyxHQUNoTyxPQWVSLE1BQU13akUsR0FDRixjQUNJL2hFLEtBQUs0aEUsZ0JBQWtCdmEsS0FFM0IsR0FBRzlvRCxHQUNDeUIsS0FBSzRoRSxnQkFBa0I1aEUsS0FBSzRoRSxnQkFBZ0J4OUMsSUFBSTdsQixHQUVwRCxHQUFHQSxHQUNDeUIsS0FBSzRoRSxnQkFBa0I1aEUsS0FBSzRoRSxnQkFBZ0Izc0MsT0FBTzEyQixHQUtoRCxLQUNILE1BQU1BLEVBQUksQ0FDTnFqRSxnQkFBaUI1aEUsS0FBSzRoRSxnQkFBZ0Ivb0IsVUFDdENnWSxhQUFjenRELEtBQUsrUixPQUV2QixPQUFPblEsS0FBS0MsVUFBVTFHLElBUTFCLE1BQU15akUsR0FDTixZQUFZempFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEdBQ3BCMkMsS0FBS3VGLE9BQVNoSCxFQUFHeUIsS0FBS2tpRCxHQUFLci9DLEVBQUc3QyxLQUFLa3dDLGVBQWlCcHhDLEVBQUdrQixLQUFLMHdELEdBQUt0eEQsRUFBR1ksS0FBS2lpRSxXQUFhLEtBQ3RGamlFLEtBQUtraUUsbUJBQXFCLEtBQU1saUUsS0FBSysyQyxzQkFBd0IsS0FBTS8yQyxLQUFLMndELEdBQUszd0QsS0FBS2d4RCxHQUFHbnlELEtBQUttQixNQUMxRkEsS0FBS2t4RCxHQUFLLElBQUl4TSxHQUFHbk4sR0FBS3YzQyxLQUFLNjhELFNBQVUsRUFLckM3OEQsS0FBS294RCxHQUFLLEdBR1YsTUFBTWp6RCxFQUFJVyxFQUFFNEQsUUFBUSxzQkFBdUIsUUFDM0MxQyxLQUFLbWIsUUFBVW5iLEtBQUt1RixPQUFPNHRCLGFBQWNuekIsS0FBS3dVLFlBQWNuWCxFQUFHMkMsS0FBS3F4RCxHQUFLaVEsR0FBR3RoRSxLQUFLa3dDLGVBQWdCbHdDLEtBQUswd0QsSUFDdEcxd0QsS0FBS3N4RCxHQUVMLFNBQVMveUQsR0FDTCxNQUFPLDZCQUE2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FEeEMsQ0FrQkh5QixLQUFLa3dDLGdCQUFpQmx3QyxLQUFLa3hELEdBQUtseEQsS0FBS2t4RCxHQUFHcE0sT0FBTzlrRCxLQUFLMHdELEdBQUksSUFBSXFSLElBQUsvaEUsS0FBS3d4RCxHQUFLLElBQUl6cUIsT0FBTyxzQkFBc0I1b0MsY0FDekc2QixLQUFLaXlELEdBQUssSUFBSWxyQixPQUFPLHdCQUF3QjVvQyx1QkFBd0I2QixLQUFLeXlELEdBQUssSUFBSTFyQixPQUFPLHNCQUFzQjVvQyxhQUNoSDZCLEtBQUtrekQsR0FFTCxTQUFTMzBELEdBQ0wsTUFBTywwQkFBMEJBLEVBRHJDLENBT0N5QixLQUFLa3dDLGdCQUFpQmx3QyxLQUFLcXlELEdBQUssU0FBUzl6RCxHQUN0QyxNQUFPLDJCQUEyQkEsRUFETCxDQUtoQ3lCLEtBQUtrd0MsZ0JBT05sd0MsS0FBS3VGLE9BQU9pZixpQkFBaUIsVUFBV3hrQixLQUFLMndELElBRStCLFVBQVVweUQsR0FDdEYsU0FBVUEsSUFBTUEsRUFBRTQwQixjQUV0QixjQUdJLE1BQU01MEIsUUFBVXlCLEtBQUtpaUUsV0FBVzViLEtBQ2hDLElBQUssTUFBTXhqRCxLQUFLdEUsRUFBRyxDQUNmLEdBQUlzRSxJQUFNN0MsS0FBSzB3RCxHQUFJLFNBQ25CLE1BQU1ueUQsRUFBSXlCLEtBQUtpekIsUUFBUXF1QyxHQUFHdGhFLEtBQUtrd0MsZUFBZ0JydEMsSUFDL0MsR0FBSXRFLEVBQUcsQ0FDSCxNQUFNTyxFQUFJNmlFLEdBQUdsUyxHQUFHNXNELEVBQUd0RSxHQUNuQk8sSUFBTWtCLEtBQUtreEQsR0FBS2x4RCxLQUFLa3hELEdBQUdwTSxPQUFPaG1ELEVBQUU4eEQsU0FBVTl4RCxLQUduRGtCLEtBQUttekQsS0FHTCxNQUFNdHdELEVBQUk3QyxLQUFLbWIsUUFBUThYLFFBQVFqekIsS0FBS2t6RCxJQUNwQyxHQUFJcndELEVBQUcsQ0FDSCxNQUFNdEUsRUFBSXlCLEtBQUt3eUQsR0FBRzN2RCxHQUNsQnRFLEdBQUt5QixLQUFLMnlELEdBQUdwMEQsR0FFakIsSUFBSyxNQUFNQSxLQUFLeUIsS0FBS294RCxHQUFJcHhELEtBQUtneEQsR0FBR3p5RCxHQUNqQ3lCLEtBQUtveEQsR0FBSyxHQUdWcHhELEtBQUt1RixPQUFPaWYsaUJBQWlCLFdBQVksSUFBT3hrQixLQUFLcTlELFlBQWNyOUQsS0FBSzY4RCxTQUFVLEVBRXRGLG9CQUFvQnQrRCxHQUNoQnlCLEtBQUsreUIsUUFBUS95QixLQUFLc3hELEdBQUl0c0QsS0FBS0MsVUFBVTFHLElBRXpDLDJCQUNJLE9BQU95QixLQUFLNnpELEdBQUc3ekQsS0FBS2t4RCxJQUV4QixvQkFBb0IzeUQsR0FDaEIsSUFBSXNFLEdBQUksRUFDUixPQUFPN0MsS0FBS2t4RCxHQUFHL25ELFFBQVEsQ0FBRXJLLEVBQUdNLEtBQ3hCQSxFQUFFd2lFLGdCQUFnQnIyQyxJQUFJaHRCLEtBQU9zRSxHQUFJLEtBQ2hDQSxFQUVULG1CQUFtQnRFLEdBQ2Z5QixLQUFLc3lELEdBQUcvekQsRUFBRyxXQUVmLG9CQUFvQkEsRUFBR3NFLEVBQUcvRCxHQUN0QmtCLEtBQUtzeUQsR0FBRy96RCxFQUFHc0UsRUFBRy9ELEdBSWRrQixLQUFLOHpELEdBQUd2MUQsR0FFWixvQkFBb0JBLEdBQ2hCLElBQUlzRSxFQUFJLGNBR0EsR0FBSTdDLEtBQUttaUUsb0JBQW9CNWpFLEdBQUksQ0FDckMsTUFBTU8sRUFBSWtCLEtBQUttYixRQUFROFgsUUFBUXV1QyxHQUFHeGhFLEtBQUtrd0MsZUFBZ0IzeEMsSUFDdkQsR0FBSU8sRUFBRyxDQUNILE1BQU1NLEVBQUlzaUUsR0FBR2pTLEdBQUdseEQsRUFBR08sR0FDbkJNLElBQU15RCxFQUFJekQsRUFBRW9wRCxRQUdwQixPQUFPeG9ELEtBQUtnMEQsR0FBRy9ELEdBQUcxeEQsR0FBSXlCLEtBQUttekQsS0FBTXR3RCxFQUVyQyx1QkFBdUJ0RSxHQUNuQnlCLEtBQUtnMEQsR0FBRzNELEdBQUc5eEQsR0FBSXlCLEtBQUttekQsS0FFeEIsbUJBQW1CNTBELEdBQ2YsT0FBT3lCLEtBQUtnMEQsR0FBRzROLGdCQUFnQnIyQyxJQUFJaHRCLEdBRXZDLGdCQUFnQkEsR0FDWnlCLEtBQUtnekIsV0FBV3d1QyxHQUFHeGhFLEtBQUtrd0MsZUFBZ0IzeEMsSUFFNUMsaUJBQWlCQSxFQUFHc0UsRUFBRy9ELEdBQ25Ca0IsS0FBS2kwRCxHQUFHMTFELEVBQUdzRSxFQUFHL0QsR0FFbEIsaUJBQWlCUCxFQUFHc0UsRUFBRy9ELEdBQ25CK0QsRUFBRXNHLFFBQVM1SyxJQUNQeUIsS0FBSzh6RCxHQUFHdjFELEtBQ1B5QixLQUFLd1UsWUFBY2pXLEVBQUdPLEVBQUVxSyxRQUFTNUssSUFDbEN5QixLQUFLb2lFLG1CQUFtQjdqRSxLQUdoQyxlQUFlQSxHQUNYeUIsS0FBS3MwRCxHQUFHLzFELEdBRVoscUJBQ0l5QixLQUFLMDBELEtBRVQsV0FDSTEwRCxLQUFLNjhELFVBQVk3OEQsS0FBS3VGLE9BQU91dkIsb0JBQW9CLFVBQVc5MEIsS0FBSzJ3RCxJQUFLM3dELEtBQUtnekIsV0FBV2h6QixLQUFLcXhELElBQzNGcnhELEtBQUs2OEQsU0FBVSxHQUVuQixRQUFRdCtELEdBQ0osTUFBTXNFLEVBQUk3QyxLQUFLbWIsUUFBUThYLFFBQVExMEIsR0FDL0IsT0FBT20xQyxFQUFFLG9CQUFxQixPQUFRbjFDLEVBQUdzRSxHQUFJQSxFQUVqRCxRQUFRdEUsRUFBR3NFLEdBQ1A2d0MsRUFBRSxvQkFBcUIsTUFBT24xQyxFQUFHc0UsR0FBSTdDLEtBQUttYixRQUFRNFgsUUFBUXgwQixFQUFHc0UsR0FFakUsV0FBV3RFLEdBQ1BtMUMsRUFBRSxvQkFBcUIsU0FBVW4xQyxHQUFJeUIsS0FBS21iLFFBQVE2WCxXQUFXejBCLEdBRWpFLEdBQUdBLEdBR0MsTUFBTXNFLEVBQUl0RSxFQUNWLEdBQUlzRSxFQUFFdy9ELGNBQWdCcmlFLEtBQUttYixRQUFTLENBQ2hDLEdBQUl1NEIsRUFBRSxvQkFBcUIsUUFBUzd3QyxFQUFFakUsSUFBS2lFLEVBQUVreEIsVUFBV2x4QixFQUFFakUsTUFBUW9CLEtBQUtxeEQsR0FBSSxZQUFZdmQsRUFBRSw0R0FDekY5ekMsS0FBS2tpRCxHQUFHeE0saUJBQWlCLFVBQ3JCLEdBQUkxMUMsS0FBSzY4RCxTQUNMLEdBQUksT0FBU2g2RCxFQUFFakUsSUFBSyxHQUFJb0IsS0FBS3d4RCxHQUFHaHNELEtBQUszQyxFQUFFakUsS0FBTSxDQUN6QyxHQUFJLE1BQVFpRSxFQUFFa3hCLFNBQVUsQ0FDcEIsTUFBTXgxQixFQUFJeUIsS0FBSzIwRCxHQUFHOXhELEVBQUVqRSxLQUNwQixPQUFPb0IsS0FBSzQwRCxHQUFHcjJELEVBQUcsTUFFdEIsQ0FDSSxNQUFNQSxFQUFJeUIsS0FBS2cxRCxHQUFHbnlELEVBQUVqRSxJQUFLaUUsRUFBRWt4QixVQUMzQixHQUFJeDFCLEVBQUcsT0FBT3lCLEtBQUs0MEQsR0FBR3IyRCxFQUFFcXlELFNBQVVyeUQsU0FFbkMsR0FBSXlCLEtBQUtpeUQsR0FBR3pzRCxLQUFLM0MsRUFBRWpFLE1BQ3RCLEdBQUksT0FBU2lFLEVBQUVreEIsU0FBVSxDQUNyQixNQUFNeDFCLEVBQUl5QixLQUFLaTFELEdBQUdweUQsRUFBRWpFLElBQUtpRSxFQUFFa3hCLFVBQzNCLEdBQUl4MUIsRUFBRyxPQUFPeUIsS0FBS3ExRCxHQUFHOTJELFNBRXZCLEdBQUl5QixLQUFLeXlELEdBQUdqdEQsS0FBSzNDLEVBQUVqRSxNQUN0QixHQUFJLE9BQVNpRSxFQUFFa3hCLFNBQVUsQ0FDckIsTUFBTXgxQixFQUFJeUIsS0FBS20xRCxHQUFHdHlELEVBQUVqRSxJQUFLaUUsRUFBRWt4QixVQUMzQixHQUFJeDFCLEVBQUcsT0FBT3lCLEtBQUs4MEQsR0FBR3YyRCxTQUV2QixHQUFJc0UsRUFBRWpFLE1BQVFvQixLQUFLa3pELElBQ3RCLEdBQUksT0FBU3J3RCxFQUFFa3hCLFNBQVUsQ0FDckIsTUFBTXgxQixFQUFJeUIsS0FBS3d5RCxHQUFHM3ZELEVBQUVreEIsVUFDcEIsR0FBSXgxQixFQUFHLE9BQU95QixLQUFLMnlELEdBQUdwMEQsU0FFdkIsR0FBSXNFLEVBQUVqRSxNQUFRb0IsS0FBS3N4RCxHQUFJLENBQzFCLE1BQU0veUQsRUFBSSxTQUFTQSxHQUNmLElBQUlzRSxFQUFJZzBDLEVBQUdRLEVBQ1gsR0FBSSxNQUFROTRDLEVBQUcsSUFDWCxNQUFNTyxFQUFJa0csS0FBS21QLE1BQU01VixHQUNyQjIxQyxFQUFFLGlCQUFtQnAxQyxHQUFJK0QsRUFBSS9ELEVBQy9CLE1BQU9QLEdBQ0x1MUMsRUFBRSxvQkFBcUIsaURBQWtEdjFDLEdBRTdFLE9BQU9zRSxFQVJELENBYzdCQSxFQUFFa3hCLFVBQ2lCeDFCLElBQU1zNEMsRUFBR1EsR0FBS3IzQyxLQUFLKzJDLHNCQUFzQng0QyxRQUN0QyxHQUFJc0UsRUFBRWpFLE1BQVFvQixLQUFLcXlELEdBQUksT0FBT3J5RCxLQUFLaWlFLFdBQVczTSxVQUNsRHQxRCxLQUFLb3hELEdBQUdod0QsS0FBS3lCLE1BSWhDLFNBQ0ksT0FBTzdDLEtBQUtreEQsR0FBR2h6RCxJQUFJOEIsS0FBSzB3RCxJQUU1QixLQUNJMXdELEtBQUsreUIsUUFBUS95QixLQUFLcXhELEdBQUlyeEQsS0FBS2cwRCxHQUFHckUsTUFFbEMsR0FBR3B4RCxFQUFHc0UsRUFBRy9ELEdBQ0wsTUFBTU0sRUFBSSxJQUFJcWlFLEdBQUd6aEUsS0FBS3dVLFlBQWFqVyxFQUFHc0UsRUFBRy9ELEdBQUl6QixFQUFJa2tFLEdBQUd2aEUsS0FBS2t3QyxlQUFnQmx3QyxLQUFLd1UsWUFBYWpXLEdBQzNGeUIsS0FBSyt5QixRQUFRMTFCLEVBQUcrQixFQUFFdXdELE1BRXRCLEdBQUdweEQsR0FDQyxNQUFNc0UsRUFBSTArRCxHQUFHdmhFLEtBQUtrd0MsZUFBZ0Jsd0MsS0FBS3dVLFlBQWFqVyxHQUNwRHlCLEtBQUtnekIsV0FBV253QixHQUVwQixHQUFHdEUsR0FDQyxNQUFNc0UsRUFBSSxDQUNOK3RELFNBQVU1d0QsS0FBSzB3RCxHQUNmb1IsWUFBYXZqRSxHQUVqQnlCLEtBQUttYixRQUFRNFgsUUFBUS95QixLQUFLa3pELEdBQUlsdUQsS0FBS0MsVUFBVXBDLElBRWpELEdBQUd0RSxFQUFHc0UsRUFBRy9ELEdBQ0wsTUFBTU0sRUFBSW9pRSxHQUFHeGhFLEtBQUtrd0MsZUFBZ0IzeEMsR0FBSWxCLEVBQUksSUFBSXFrRSxHQUFHbmpFLEVBQUdzRSxFQUFHL0QsR0FDdkRrQixLQUFLK3lCLFFBQVEzekIsRUFBRy9CLEVBQUVzeUQsTUFFdEIsS0FDSTN2RCxLQUFLK3lCLFFBQVEveUIsS0FBS3F5RCxHQUFJLGtCQUtuQixHQUFHOXpELEdBQ04sTUFBTXNFLEVBQUk3QyxLQUFLd3hELEdBQUcvdUMsS0FBS2xrQixHQUN2QixPQUFPc0UsRUFBSUEsRUFBRSxHQUFLLEtBS2YsR0FBR3RFLEVBQUdzRSxHQUNULE1BQU0vRCxFQUFJa0IsS0FBSzIwRCxHQUFHcDJELEdBQ2xCLE9BQU9vakUsR0FBR2xTLEdBQUczd0QsRUFBRytELEdBS2IsR0FBR3RFLEVBQUdzRSxHQUNULE1BQU0vRCxFQUFJa0IsS0FBS2l5RCxHQUFHeHZDLEtBQUtsa0IsR0FBSWEsRUFBSXNVLE9BQU81VSxFQUFFLElBQUt6QixPQUFJLElBQVd5QixFQUFFLEdBQUtBLEVBQUUsR0FBSyxLQUMxRSxPQUFPMmlFLEdBQUdoUyxHQUFHLElBQUl6YyxFQUFFMzFDLEdBQUkrQixFQUFHeUQsR0FLdkIsR0FBR3RFLEVBQUdzRSxHQUNULE1BQU0vRCxFQUFJa0IsS0FBS3l5RCxHQUFHaHdDLEtBQUtsa0IsR0FBSWEsRUFBSXNVLE9BQU81VSxFQUFFLElBQ3hDLE9BQU80aUUsR0FBR2pTLEdBQUdyd0QsRUFBR3lELEdBS2IsR0FBR3RFLEdBQ04sT0FBT3NqRSxHQUFHcFMsR0FBR2x4RCxHQUVqQixTQUFTQSxHQUNMLEdBQUlBLEVBQUU4VixLQUFLblEsTUFBUWxFLEtBQUt3VSxZQUFZdFEsSUFBSyxPQUFPbEUsS0FBS2lpRSxXQUFXek0sR0FBR2ozRCxFQUFFK3ZELFFBQVMvdkQsRUFBRWlxRCxNQUFPanFELEVBQUV3RSxPQUN6RjJ3QyxFQUFFLG9CQUFxQix5Q0FBeUNuMUMsRUFBRThWLEtBQUtuUSxLQUUzRSxHQUFHM0YsR0FDQyxPQUFPeUIsS0FBS2lpRSxXQUFXeE0sR0FBR2wzRCxFQUFFK3BELFNBQVUvcEQsRUFBRWlxRCxNQUFPanFELEVBQUV3RSxPQUVyRCxHQUFHeEUsRUFBR3NFLEdBQ0YsTUFBTS9ELEVBQUkrRCxFQUFJN0MsS0FBS2t4RCxHQUFHcE0sT0FBT3ZtRCxFQUFHc0UsR0FBSzdDLEtBQUtreEQsR0FBR2pNLE9BQU8xbUQsR0FBSWEsRUFBSVksS0FBSzZ6RCxHQUFHN3pELEtBQUtreEQsSUFBSzd6RCxFQUFJMkMsS0FBSzZ6RCxHQUFHLzBELEdBQUlYLEVBQUksR0FBSUwsRUFBSSxHQUMxRyxPQUFPVCxFQUFFOEwsUUFBUzVLLElBQ2RhLEVBQUVtc0IsSUFBSWh0QixJQUFNSixFQUFFaUQsS0FBSzdDLEtBQ2xCYSxFQUFFK0osUUFBUzVLLElBQ1psQixFQUFFa3VCLElBQUlodEIsSUFBTVQsRUFBRXNELEtBQUs3QyxLQUNsQnlCLEtBQUtpaUUsV0FBV3ZNLEdBQUd2M0QsRUFBR0wsR0FBRzJNLEtBQUssS0FDL0J6SyxLQUFLa3hELEdBQUtweUQsSUFHbEIsR0FBR1AsR0FNQ3lCLEtBQUtreEQsR0FBR2h6RCxJQUFJSyxFQUFFcXlELFdBQWE1d0QsS0FBS2tpRSxtQkFBbUIzakUsRUFBRXVqRSxhQUV6RCxHQUFHdmpFLEdBQ0MsSUFBSXNFLEVBQUl3a0QsS0FDUixPQUFPOW9ELEVBQUU0SyxRQUFRLENBQUU1SyxFQUFHTyxLQUNsQitELEVBQUlBLEVBQUV5L0QsVUFBVXhqRSxFQUFFOGlFLG1CQUNqQi8rRCxHQUliLE1BQU0wL0QsR0FDRixjQUNJdmlFLEtBQUsyMUQsR0FBSyxJQUFJb00sR0FBSS9oRSxLQUFLNDFELEdBQUssR0FBSTUxRCxLQUFLa2lFLG1CQUFxQixLQUFNbGlFLEtBQUsrMkMsc0JBQXdCLEtBRWpHLG1CQUFtQng0QyxJQUduQixvQkFBb0JBLEVBQUdzRSxFQUFHL0QsSUFHMUIsb0JBQW9CUCxHQUNoQixPQUFPeUIsS0FBSzIxRCxHQUFHMUYsR0FBRzF4RCxHQUFJeUIsS0FBSzQxRCxHQUFHcjNELElBQU0sY0FFeEMsaUJBQWlCQSxFQUFHc0UsRUFBRy9ELEdBQ25Ca0IsS0FBSzQxRCxHQUFHcjNELEdBQUtzRSxFQUVqQix1QkFBdUJ0RSxHQUNuQnlCLEtBQUsyMUQsR0FBR3RGLEdBQUc5eEQsR0FFZixtQkFBbUJBLEdBQ2YsT0FBT3lCLEtBQUsyMUQsR0FBR2lNLGdCQUFnQnIyQyxJQUFJaHRCLEdBRXZDLGdCQUFnQkEsVUFDTHlCLEtBQUs0MUQsR0FBR3IzRCxHQUVuQiwyQkFDSSxPQUFPeUIsS0FBSzIxRCxHQUFHaU0sZ0JBRW5CLG9CQUFvQnJqRSxHQUNoQixPQUFPeUIsS0FBSzIxRCxHQUFHaU0sZ0JBQWdCcjJDLElBQUlodEIsR0FFdkMsUUFDSSxPQUFPeUIsS0FBSzIxRCxHQUFLLElBQUlvTSxHQUFJbitELFFBQVFGLFVBRXJDLGlCQUFpQm5GLEVBQUdzRSxFQUFHL0QsSUFHdkIsZUFBZVAsSUFHZixZQUNBLG9CQUFvQkEsSUFDcEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkEsTUFBTWlrRSxHQUNOLEdBQUdqa0UsSUFHSDs7Ozs7Ozs7Ozs7Ozs7OztHQTBCSixNQUFNa2tFLEdBQ0YsY0FDSXppRSxLQUFLODFELEdBQUssSUFBTTkxRCxLQUFLKzFELEtBQU0vMUQsS0FBS2kyRCxHQUFLLElBQU1qMkQsS0FBS20yRCxLQUFNbjJELEtBQUtzMkQsR0FBSyxHQUFJdDJELEtBQUsyMkQsS0FFN0UsR0FBR3A0RCxHQUNDeUIsS0FBS3MyRCxHQUFHbDFELEtBQUs3QyxHQUVqQixXQUNJZ0gsT0FBT3V2QixvQkFBb0IsU0FBVTkwQixLQUFLODFELElBQUt2d0QsT0FBT3V2QixvQkFBb0IsVUFBVzkwQixLQUFLaTJELElBRTlGLEtBQ0kxd0QsT0FBT2lmLGlCQUFpQixTQUFVeGtCLEtBQUs4MUQsSUFBS3Z3RCxPQUFPaWYsaUJBQWlCLFVBQVd4a0IsS0FBS2kyRCxJQUV4RixLQUNJdmlCLEVBQUUsc0JBQXVCLDJDQUN6QixJQUFLLE1BQU1uMUMsS0FBS3lCLEtBQUtzMkQsR0FBSS8zRCxFQUFFLEdBRS9CLEtBQ0ltMUMsRUFBRSxzQkFBdUIsNkNBQ3pCLElBQUssTUFBTW4xQyxLQUFLeUIsS0FBS3MyRCxHQUFJLzNELEVBQUUsR0FLL0IsWUFDSSxNQUFPLG9CQUFzQmdILGFBQVUsSUFBV0EsT0FBT2lmLHVCQUFvQixJQUFXamYsT0FBT3V2Qjs7Ozs7Ozs7Ozs7Ozs7OztHQW1CbkcsTUFBTTR0QyxHQUFLLENBQ1hDLGtCQUFtQixXQUNuQkMsT0FBUSxTQUNSQyxTQUFVOzs7Ozs7Ozs7Ozs7Ozs7O0dBNkJkLE1BQU1DLEdBQ0YsWUFBWXZrRSxHQUNSeUIsS0FBS2kzRCxHQUFLMTRELEVBQUUwNEQsR0FBSWozRCxLQUFLbTNELEdBQUs1NEQsRUFBRTQ0RCxHQUVoQyxHQUFHNTRELEdBQ0N5QixLQUFLbzRELEdBQUs3NUQsRUFFZCxHQUFHQSxHQUNDeUIsS0FBSzIzRCxHQUFLcDVELEVBRWQsVUFBVUEsR0FDTnlCLEtBQUtxNEQsR0FBSzk1RCxFQUVkLFFBQ0l5QixLQUFLbTNELEtBRVQsS0FBSzU0RCxHQUNEeUIsS0FBS2kzRCxHQUFHMTRELEdBRVosS0FDSXlCLEtBQUtvNEQsS0FFVCxHQUFHNzVELEdBQ0N5QixLQUFLMjNELEdBQUdwNUQsR0FFWixHQUFHQSxHQUNDeUIsS0FBS3E0RCxHQUFHOTVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJaLE1BQU13a0UsV0FLVixNQUNJLFlBQVl4a0UsR0FDUnlCLEtBQUtnakUsYUFBZXprRSxFQUFHeUIsS0FBSzRwRCxXQUFhcnJELEVBQUVxckQsV0FDM0MsTUFBTS9tRCxFQUFJdEUsRUFBRTBrRSxJQUFNLFFBQVUsT0FDNUJqakUsS0FBSzI0RCxHQUFLOTFELEVBQUksTUFBUXRFLEVBQUVzVSxLQUFNN1MsS0FBSzQ0RCxHQUFLLFlBQWM1NEQsS0FBSzRwRCxXQUFXM2xELFVBQVksY0FBZ0JqRSxLQUFLNHBELFdBQVd2TixTQUFXLGFBRWpJLEdBQUc5OUMsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDWCxNQUFNYyxFQUFJNkIsS0FBS2c1RCxHQUFHejZELEVBQUdzRSxHQUNyQjZ3QyxFQUFFLGlCQUFrQixZQUFhdjFDLEVBQUdXLEdBQ3BDLE1BQU1oQixFQUFJLEdBQ1YsT0FBT2tDLEtBQUtpNUQsR0FBR243RCxFQUFHc0IsRUFBRy9CLEdBQUkyQyxLQUFLbzVELEdBQUc3NkQsRUFBR0osRUFBR0wsRUFBR2dCLEdBQUcyTCxLQUFNbE0sSUFBTW0xQyxFQUFFLGlCQUFrQixhQUFjbjFDLEdBQzNGQSxHQUFNc0UsSUFDRixNQUFNa3hDLEVBQUUsaUJBQXFCeDFDLEVBQUgsdUJBQTRCc0UsRUFBRyxRQUFTMUUsRUFBRyxXQUFZVyxHQUNqRitELElBR1IsR0FBR3RFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEdBR1gsT0FBTzJDLEtBQUsrNEQsR0FBR3g2RCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixHQUt4QixHQUFHa0IsRUFBR3NFLEVBQUcvRCxHQUNaUCxFQUFFLHFCQUF1QixlQUFpQiswQyxFQUsxQy8wQyxFQUFFLGdCQUFrQixhQUFjeUIsS0FBS2dqRSxhQUFhL2dELFFBQVUxakIsRUFBRSxvQkFBc0J5QixLQUFLZ2pFLGFBQWEvZ0QsT0FDeEdwZixHQUFLQSxFQUFFd08sUUFBUWxJLFFBQVEsQ0FBRXRHLEVBQUcvRCxJQUFNUCxFQUFFTyxHQUFLK0QsR0FBSy9ELEdBQUtBLEVBQUV1UyxRQUFRbEksUUFBUSxDQUFFdEcsRUFBRy9ELElBQU1QLEVBQUVPLEdBQUsrRCxHQUUzRixHQUFHdEUsRUFBR3NFLEdBQ0YsTUFBTS9ELEVBQUk0akUsR0FBR25rRSxHQUNiLE1BQU8sR0FBR3lCLEtBQUsyNEQsU0FBUzkxRCxLQUFLL0QsTUFHakMsWUFBWVAsR0FDUjRJLE1BQU01SSxHQUFJeUIsS0FBS2tqRSxpQkFBbUIza0UsRUFBRTJrRSxpQkFBa0JsakUsS0FBS21qRSxzQkFBd0I1a0UsRUFBRTRrRSxzQkFDckZuakUsS0FBS29qRSxnQkFBa0I3a0UsRUFBRTZrRSxnQkFFN0IsR0FBRzdrRSxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ1IsT0FBTyxJQUFJd0UsUUFBUSxDQUFFdkcsRUFBR2MsS0FDcEIsTUFBTUwsRUFBSSxJQUFJLElBQ2RBLEVBQUV1bEUsV0FBVyxJQUFVQyxTQUFVLEtBQzdCLElBQ0ksT0FBUXhsRSxFQUFFeWxFLG9CQUNSLEtBQUssSUFBVUMsU0FDYixNQUFNM2dFLEVBQUkvRSxFQUFFMmxFLGtCQUNaL3ZCLEVBQUUsYUFBYyxnQkFBaUIxdUMsS0FBS0MsVUFBVXBDLElBQUt4RixFQUFFd0YsR0FDdkQsTUFFRixLQUFLLElBQVU2Z0UsUUFDYmh3QixFQUFFLGFBQWMsUUFBVW4xQyxFQUFJLGVBQWdCSixFQUFFLElBQUltM0MsRUFBRWpCLEVBQUVLLGtCQUFtQixxQkFDM0UsTUFFRixLQUFLLElBQVVpdkIsV0FDYixNQUFNN2tFLEVBQUloQixFQUFFOGxFLFlBQ1osR0FBSWx3QixFQUFFLGFBQWMsUUFBVW4xQyxFQUFJLHdCQUF5Qk8sRUFBRyxpQkFBa0JoQixFQUFFK2xFLG1CQUNsRi9rRSxFQUFJLEVBQUcsQ0FDSCxNQUFNUCxFQUFJVCxFQUFFMmxFLGtCQUFrQjFnRSxNQUM5QixHQUFJeEUsR0FBS0EsRUFBRSszQixRQUFVLzNCLEVBQUUwSSxRQUFTLENBQzVCLE1BQU1wRSxFQUFJLFNBQVN0RSxHQUNmLE1BQU1zRSxFQUFJdEUsRUFBRWtVLGNBQWMvUCxRQUFRLEtBQU0sS0FDeEMsT0FBTzNFLE9BQU80OUMsT0FBT3RILEdBQUcvdEMsUUFBUXpELElBQU0sRUFBSUEsRUFBSXd4QyxFQUFFRyxRQUYxQyxDQUdSajJDLEVBQUUrM0IsUUFDSm40QixFQUFFLElBQUltM0MsRUFBRXp5QyxFQUFHdEUsRUFBRTBJLGVBQ1Y5SSxFQUFFLElBQUltM0MsRUFBRWpCLEVBQUVHLFFBQVMsZ0NBQWtDMTJDLEVBQUU4bEUsbUJBSWxFemxFLEVBQUUsSUFBSW0zQyxFQUFFakIsRUFBRWUsWUFBYSx1QkFDdkIsTUFFRixRQUNFOU4sS0FFTixRQUNFb00sRUFBRSxhQUFjLFFBQVVuMUMsRUFBSSxtQkFHdEMsTUFBTThKLEVBQUlyRCxLQUFLQyxVQUFVN0YsR0FDekJ0QixFQUFFa3VDLEtBQUtucEMsRUFBRyxPQUFRd0YsRUFBR3ZKLEVBQUcsTUFHaEMsR0FBR1AsRUFBR3NFLEVBQUcvRCxHQUNMLE1BQU1NLEVBQUksQ0FBRVksS0FBSzI0RCxHQUFJLElBQUssZ0NBQWlDLElBQUtwNkQsRUFBRyxZQUFjbEIsRUFBSSxjQUE2QmMsRUFBSSxjQUFzQkwsRUFBSSxDQUc1SWdtRSxtQkFBb0IsYUFDcEJDLG1CQUFvQixHQUNwQkMsaUJBQWtCLENBR2QzbkIsU0FBVSxZQUFZcjhDLEtBQUs0cEQsV0FBVzNsRCx1QkFBdUJqRSxLQUFLNHBELFdBQVd2TixZQUVqRjRuQixhQUFhLEVBQ2JDLHdCQUF3QixFQUN4QkMsc0JBQXVCLENBT25CQywrQkFBZ0MsS0FFcENsQixpQkFBa0JsakUsS0FBS2tqRSxpQkFDdkJtQixxQkFBc0Jya0UsS0FBS21qRSx1QkFFL0JuakUsS0FBS29qRSxrQkFBb0J0bEUsRUFBRXdtRSxlQUFpQixJQUFJLElBQW9CLEtBQU10a0UsS0FBS2k1RCxHQUFHbjdELEVBQUVpbUUsbUJBQW9CbGhFLEVBQUcvRCxHQWdCM0csZUFBcUIsZUFBbUIsZUFBZ0IsZUFBVSxlQUFXLGdCQUF5QmhCLEVBQUV5bUUsMEJBQTRCLGdCQUNwSSxNQUFNbDhELEVBQUlqSixFQUFFaUMsS0FBSyxJQUNqQnF5QyxFQUFFLGFBQWMsd0JBQTBCcnJDLEVBQUd2SyxHQUM3QyxNQUFNSixFQUFJTCxFQUFFbW5FLGlCQUFpQm44RCxFQUFHdkssR0FNeEIsSUFBSWdFLEdBQUksRUFBSXUwQyxHQUFJLEVBSWhCLE1BQU1HLEVBQUksSUFBSXNzQixHQUFHLENBQ3JCN0wsR0FBSTE0RCxJQUNBODNDLEVBQUkzQyxFQUFFLGFBQWMsNENBQTZDbjFDLElBQU11RCxJQUFNNHhDLEVBQUUsYUFBYyxpQ0FDN0ZoMkMsRUFBRSs2QixPQUFRMzJCLEdBQUksR0FBSzR4QyxFQUFFLGFBQWMsc0JBQXVCbjFDLEdBQUliLEVBQUVzdUMsS0FBS3p0QyxLQUV6RTQ0RCxHQUFJLElBQU16NUQsRUFBRW1OLFVBQ1o0NUQsRUFBSSxDQUFDbG1FLEVBQUdzRSxFQUFHL0QsS0FHWFAsRUFBRW1tRSxPQUFPN2hFLEVBQUl0RSxJQUNULElBQ0lPLEVBQUVQLEdBQ0osTUFBT0EsR0FDTDBVLFdBQVcsS0FDUCxNQUFNMVUsR0FDTixPQVFSLE9BQU9rbUUsRUFBRS9tRSxFQUFHLElBQVdpbkUsVUFBVUMsS0FBTSxLQUMzQ3Z1QixHQUFLM0MsRUFBRSxhQUFjLGtDQUNwQit3QixFQUFFL21FLEVBQUcsSUFBV2luRSxVQUFVRSxNQUFPLEtBQ2xDeHVCLElBQU1BLEdBQUksRUFBSTNDLEVBQUUsYUFBYywrQkFBZ0M4QyxFQUFFK2hCLFFBQy9Ea00sRUFBRS9tRSxFQUFHLElBQVdpbkUsVUFBVXIzRCxNQUFRL08sSUFDbkM4M0MsSUFBTUEsR0FBSSxFQUFJdEMsRUFBRSxhQUFjLGdDQUFpQ3gxQyxHQUFJaTRDLEVBQUUraEIsR0FBRyxJQUFJampCLEVBQUVqQixFQUFFZSxZQUFhLDRDQUM1RnF2QixFQUFFL21FLEVBQUcsSUFBV2luRSxVQUFVRyxRQUFVdm1FLElBQ3JDLElBQUlzRSxFQUNKLElBQUt3ekMsRUFBRyxDQUNKLE1BQU12M0MsRUFBSVAsRUFBRW1KLEtBQUssR0FDakJ3c0MsSUFBSXAxQyxHQU1KLE1BQU1NLEVBQUlOLEVBQUd6QixFQUFJK0IsRUFBRTJELFFBQVUsUUFBVUYsRUFBSXpELEVBQUUsVUFBTyxJQUFXeUQsT0FBSSxFQUFTQSxFQUFFRSxPQUM5RSxHQUFJMUYsRUFBRyxDQUNIcTJDLEVBQUUsYUFBYyw2QkFBOEJyMkMsR0FFOUMsTUFBTWtCLEVBQUlsQixFQUFFaTVCLE9BQ1osSUFBSXp6QixFQU9KLFNBQVN0RSxHQUdMLE1BQU1zRSxFQUFJeWhELEdBQUcvbEQsR0FDYixRQUFJLElBQVdzRSxFQUFHLE9BQU80aEQsR0FBRzVoRCxHQUpoQyxDQUtFdEUsR0FBSU8sRUFBSXpCLEVBQUU0SixhQUNaLElBQVdwRSxJQUFNQSxFQUFJd3hDLEVBQUVjLFNBQVVyMkMsRUFBSSx5QkFBMkJQLEVBQUksaUJBQW1CbEIsRUFBRTRKLFNBRXpGb3ZDLEdBQUksRUFBSUcsRUFBRStoQixHQUFHLElBQUlqakIsRUFBRXp5QyxFQUFHL0QsSUFBS3BCLEVBQUVtTixhQUMxQjZvQyxFQUFFLGFBQWMsdUJBQXdCNTBDLEdBQUkwM0MsRUFBRWlpQixHQUFHMzVELE1BRTNEMmxFLEVBQUV0bUUsRUFBRyxJQUFNNG1FLFdBQWF4bUUsSUFDekJBLEVBQUV5bUUsT0FBUyxJQUFLQyxNQUFRdnhCLEVBQUUsYUFBYyw0QkFBOEJuMUMsRUFBRXltRSxPQUFTLElBQUtFLFNBQVd4eEIsRUFBRSxhQUFjLGlDQUNoSHpnQyxXQUFXLEtBS1p1akMsRUFBRThoQixNQUNGLEdBQUk5aEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NoQixTQUFTMnVCLEtBR0wsTUFBTyxvQkFBc0I1L0QsT0FBU0EsT0FBUyxLQUd1QixTQUFTNi9ELEtBRy9FLE1BQU8sb0JBQXNCaGlELFNBQVdBLFNBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQm5ELFNBQVNpaUQsR0FBRzltRSxHQUNaLE9BQU8sSUFBSW9yRCxHQUFHcHJELEdBQXdCLEdBZTFDLE1BQU0rbUUsR0FDRixZQUlBL21FLEVBSUFzRSxFQU1BL0QsRUFBSSxJQUlFTSxFQUFJLElBS0ovQixFQUFJLEtBQ04yQyxLQUFLa2lELEdBQUszakQsRUFBR3lCLEtBQUs0VSxRQUFVL1IsRUFBRzdDLEtBQUttNkQsR0FBS3I3RCxFQUFHa0IsS0FBSzQ2RCxHQUFLeDdELEVBQUdZLEtBQUtnN0QsR0FBSzM5RCxFQUFHMkMsS0FBS3U3RCxHQUFLLEVBQ2hGdjdELEtBQUs0N0QsR0FBSyxLQUVWNTdELEtBQUs4N0QsR0FBSzE0RCxLQUFLK1IsTUFBT25WLEtBQUs0K0IsUUFReEIsUUFDSDUrQixLQUFLdTdELEdBQUssRUFLUCxLQUNIdjdELEtBQUt1N0QsR0FBS3Y3RCxLQUFLZzdELEdBTVosR0FBR3o4RCxHQUVOeUIsS0FBS3FqQyxTQUdMLE1BQU14Z0MsRUFBSThNLEtBQUt1bkIsTUFBTWwzQixLQUFLdTdELEdBQUt2N0QsS0FBS2s4RCxNQUFPcDlELEVBQUk2USxLQUFLeUYsSUFBSSxFQUFHaFMsS0FBSytSLE1BQVFuVixLQUFLODdELElBQUsxOEQsRUFBSXVRLEtBQUt5RixJQUFJLEVBQUd2UyxFQUFJL0QsR0FFOUZNLEVBQUksR0FBS3MwQyxFQUFFLHFCQUFzQixtQkFBbUJ0MEMscUJBQXFCWSxLQUFLdTdELDZCQUE2QjE0RCx1QkFBdUIvRCxhQUMxSWtCLEtBQUs0N0QsR0FBSzU3RCxLQUFLa2lELEdBQUdxWCxrQkFBa0J2NUQsS0FBSzRVLFFBQVN4VixFQUFHLEtBQVFZLEtBQUs4N0QsR0FBSzE0RCxLQUFLK1IsTUFDNUU1VyxNQUdBeUIsS0FBS3U3RCxJQUFNdjdELEtBQUs0NkQsR0FBSTU2RCxLQUFLdTdELEdBQUt2N0QsS0FBS202RCxLQUFPbjZELEtBQUt1N0QsR0FBS3Y3RCxLQUFLbTZELElBQUtuNkQsS0FBS3U3RCxHQUFLdjdELEtBQUtnN0QsS0FBT2g3RCxLQUFLdTdELEdBQUt2N0QsS0FBS2c3RCxJQUV2RyxLQUNJLE9BQVNoN0QsS0FBSzQ3RCxLQUFPNTdELEtBQUs0N0QsR0FBRzJKLFlBQWF2bEUsS0FBSzQ3RCxHQUFLLE1BRXhELFNBQ0ksT0FBUzU3RCxLQUFLNDdELEtBQU81N0QsS0FBSzQ3RCxHQUFHdjRCLFNBQVVyakMsS0FBSzQ3RCxHQUFLLE1BRTZCLEtBQzlFLE9BQVFqc0QsS0FBS3NuQixTQUFXLElBQU1qM0IsS0FBS3U3RDs7Ozs7Ozs7Ozs7Ozs7OztHQW9EM0MsTUFBTWlLLEdBQ0YsWUFBWWpuRSxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUFHTCxFQUFHdUssR0FDN0JySSxLQUFLa2lELEdBQUszakQsRUFBR3lCLEtBQUt3OEQsR0FBSzE5RCxFQUFHa0IsS0FBS3k4RCxHQUFLcjlELEVBQUdZLEtBQUtpOUQsR0FBSzUvRCxFQUFHMkMsS0FBS3lsRSx3QkFBMEJ0bkUsRUFDbkY2QixLQUFLMGxFLDRCQUE4QjVuRSxFQUFHa0MsS0FBS3kwQixTQUFXcHNCLEVBQUdySSxLQUFLd29ELE1BQVEsRUFNdEV4b0QsS0FBS2c5RCxHQUFLLEVBQUdoOUQsS0FBS3c5RCxHQUFLLEtBQU14OUQsS0FBSzA5RCxHQUFLLEtBQU0xOUQsS0FBSzJsRSxPQUFTLEtBQU0zbEUsS0FBS2crRCxHQUFLLElBQUlzSCxHQUFHL21FLEVBQUdzRSxHQVFsRixLQUNILE9BQU8sSUFBcUI3QyxLQUFLd29ELE9BQVMsSUFBb0J4b0QsS0FBS3dvRCxPQUFTeG9ELEtBQUtzK0QsS0FLOUUsS0FDSCxPQUFPLElBQWlCdCtELEtBQUt3b0QsT0FBUyxJQUFvQnhvRCxLQUFLd29ELE1BUTVELFFBQ0gsSUFBa0J4b0QsS0FBS3dvRCxNQUFReG9ELEtBQUs2TixPQUFTN04sS0FBSzQrRCxLQU8vQyxhQUNINStELEtBQUtvK0QsWUFBY3ArRCxLQUFLNkssTUFBTSxHQVMzQixLQUNIN0ssS0FBS3dvRCxNQUFRLEVBQWtCeG9ELEtBQUtnK0QsR0FBR3AvQixRQVdwQyxLQUdINStCLEtBQUtzK0QsTUFBUSxPQUFTdCtELEtBQUt3OUQsS0FBT3g5RCxLQUFLdzlELEdBQUt4OUQsS0FBS2tpRCxHQUFHcVgsa0JBQWtCdjVELEtBQUt3OEQsR0FBSSxJQUFLLElBQU94OEQsS0FBSzRsRSxPQUVoRCxHQUFHcm5FLEdBQ25EeUIsS0FBS20vRCxLQUFNbi9ELEtBQUsybEUsT0FBTzM1QixLQUFLenRDLEdBRW1ELFdBQy9FLEdBQUl5QixLQUFLcytELEtBR1QsT0FBT3QrRCxLQUFLNkssTUFBTSxHQUVzQixLQUN4QzdLLEtBQUt3OUQsS0FBT3g5RCxLQUFLdzlELEdBQUduNkIsU0FBVXJqQyxLQUFLdzlELEdBQUssTUFFVSxLQUNsRHg5RCxLQUFLMDlELEtBQU8xOUQsS0FBSzA5RCxHQUFHcjZCLFNBQVVyakMsS0FBSzA5RCxHQUFLLE1BY3JDLFlBQVluL0QsRUFBR3NFLEdBRWxCN0MsS0FBS20vRCxLQUFNbi9ELEtBQUtxL0QsS0FBTXIvRCxLQUFLZytELEdBQUczNkIsU0FHOUJyakMsS0FBS2c5RCxLQUFNLElBQWtCeitELEVBRTdCeUIsS0FBS2crRCxHQUFHcC9CLFFBQVUvN0IsR0FBS0EsRUFBRW1FLE9BQVNxdEMsRUFBRVMsb0JBRXBDaEIsRUFBRWp4QyxFQUFFNkMsWUFBYW91QyxFQUFFLG1FQUNuQjl6QyxLQUFLZytELEdBQUd4QyxNQUFRMzRELEdBQUtBLEVBQUVtRSxPQUFTcXRDLEVBQUVuQixpQkFBbUIsSUFBb0JsekMsS0FBS3dvRCxRQU85RXhvRCxLQUFLeWxFLHdCQUF3Qkksa0JBQW1CN2xFLEtBQUswbEUsNEJBQTRCRyxtQkFFakYsT0FBUzdsRSxLQUFLMmxFLFNBQVczbEUsS0FBS3kvRCxLQUFNei9ELEtBQUsybEUsT0FBTzk2RCxRQUFTN0ssS0FBSzJsRSxPQUFTLE1BR3ZFM2xFLEtBQUt3b0QsTUFBUWpxRCxRQUVQeUIsS0FBS3kwQixTQUFTaWpDLEdBQUc3MEQsR0FLcEIsTUFDUCxPQUNJN0MsS0FBS3dvRCxNQUFRLEVBQ2IsTUFBTWpxRCxFQUFJeUIsS0FBSzAvRCxHQUFHMS9ELEtBQUtnOUQsSUFBS242RCxFQUFJN0MsS0FBS2c5RCxHQUU3QnA1RCxRQUFRZ1osSUFBSSxDQUFFNWMsS0FBS3lsRSx3QkFBd0J2c0QsV0FBWWxaLEtBQUswbEUsNEJBQTRCeHNELGFBQWN6TyxLQUFLLEVBQUdsTSxFQUFHTyxNQUtySGtCLEtBQUtnOUQsS0FBT242RCxHQUlaN0MsS0FBSzQvRCxHQUFHcmhFLEVBQUdPLElBQ1YrRCxJQUNEdEUsRUFBRSxLQUNFLE1BQU1BLEVBQUksSUFBSSsyQyxFQUFFakIsRUFBRUcsUUFBUywrQkFBaUMzeEMsRUFBRW9FLFNBQzlELE9BQU9qSCxLQUFLNi9ELEdBQUd0aEUsT0FJM0IsR0FBR0EsRUFBR3NFLEdBQ0YsTUFBTS9ELEVBQUlrQixLQUFLMC9ELEdBQUcxL0QsS0FBS2c5RCxJQUN2Qmg5RCxLQUFLMmxFLE9BQVMzbEUsS0FBSzhsRSxHQUFHdm5FLEVBQUdzRSxHQUFJN0MsS0FBSzJsRSxPQUFPck8sR0FBRyxLQUN4Q3g0RCxFQUFFLEtBQVFrQixLQUFLd29ELE1BQVEsRUFBZXhvRCxLQUFLMDlELEdBQUsxOUQsS0FBS2tpRCxHQUFHcVgsa0JBQWtCdjVELEtBQUt5OEQsR0FBSSxJQUFLLEtBQVF6OEQsS0FBS3MrRCxPQUFTdCtELEtBQUt3b0QsTUFBUSxHQUMzSDVrRCxRQUFRRixZQUFjMUQsS0FBS3kwQixTQUFTNmlDLFNBQ25DdDNELEtBQUsybEUsT0FBT2pPLEdBQUluNUQsSUFDakJPLEVBQUUsSUFBT2tCLEtBQUs2L0QsR0FBR3RoRSxNQUNoQnlCLEtBQUsybEUsT0FBT3J1QyxVQUFXLzRCLElBQ3hCTyxFQUFFLElBQU9rQixLQUFLczNCLFVBQVUvNEIsTUFHaEMsS0FDSXlCLEtBQUt3b0QsTUFBUSxFQUFrQnhvRCxLQUFLZytELEdBQUd2QyxHQUFHLFVBQ3RDejdELEtBQUt3b0QsTUFBUSxFQUFrQnhvRCxLQUFLMDNCLFVBSTVDLEdBQUduNUIsR0FLQyxPQUFPbTFDLEVBQUUsbUJBQW9CLHFCQUFxQm4xQyxHQUFNeUIsS0FBSzJsRSxPQUFTLEtBQU0zbEUsS0FBSzZLLE1BQU0sRUFBZ0J0TSxHQU9wRyxHQUFHQSxHQUNOLE9BQU9zRSxJQUNIN0MsS0FBS2tpRCxHQUFHNmEsaUJBQWlCLElBQU8vOEQsS0FBS2c5RCxLQUFPeitELEVBQUlzRSxLQUFPNndDLEVBQUUsbUJBQW9CLHlEQUM3RTl2QyxRQUFRRixjQVdoQixNQUFNcWlFLFdBQVdQLEdBQ2pCLFlBQVlqbkUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsR0FDdkJnSixNQUFNNUksRUFBRyxtQ0FBeUUscUJBQThDLHVCQUFrRHNFLEVBQUcvRCxFQUFHTSxFQUFHakIsR0FDM0w2QixLQUFLMEksRUFBSXJMLEVBRWIsR0FBR2tCLEVBQUdzRSxHQUNGLE9BQU83QyxLQUFLaTlELEdBQUdqRCxHQUFHLFNBQVV6N0QsRUFBR3NFLEdBRW5DLFVBQVV0RSxHQUVOeUIsS0FBS2crRCxHQUFHcC9CLFFBQ1IsTUFBTS83QixFQS95TmQsU0FBWXRFLEVBQUdzRSxHQUNYLElBQUkvRCxFQUNKLEdBQUksaUJBQWtCK0QsRUFBRyxDQUNyQkEsRUFBRW1qRSxhQUdGLE1BQU01bUUsRUFBSSxTQUFTYixHQUNmLE1BQU8sY0FBZ0JBLEVBQUksRUFBbUIsUUFBVUEsRUFBSSxFQUFnQixXQUFhQSxFQUFJLEVBQWtCLFlBQWNBLEVBQUksRUFBa0IsVUFBWUEsRUFBSSxFQUFnQitvQyxJQUQ3SyxDQUVSemtDLEVBQUVtakUsYUFBYUMsa0JBQW9CLGFBQWM1b0UsRUFBSXdGLEVBQUVtakUsYUFBYXZkLFdBQWEsR0FBSXRxRCxFQUFJLFNBQVNJLEVBQUdzRSxHQUNuRyxPQUFPdEUsRUFBRSswQyxHQUFLWSxPQUFFLElBQVdyeEMsR0FBSyxpQkFBbUJBLEdBQUl5MkMsRUFBR1EsaUJBQWlCajNDLEdBQUssTUFBUXF4QyxPQUFFLElBQVdyeEMsR0FBS0EsYUFBYTZyQyxZQUN2SDRLLEVBQUdTLGVBQWVsM0MsR0FBSyxJQUFJNnJDLGFBRjRELENBR3pGbndDLEVBQUdzRSxFQUFFbWpFLGFBQWFsZSxhQUFjaHFELEVBQUkrRSxFQUFFbWpFLGFBQWF0ZCxNQUFPcmdELEVBQUl2SyxHQUFLLFNBQVNTLEdBQzFFLE1BQU1zRSxPQUFJLElBQVd0RSxFQUFFeUksS0FBT3F0QyxFQUFFRyxRQUFVaVEsR0FBR2xtRCxFQUFFeUksTUFDL0MsT0FBTyxJQUFJc3VDLEVBQUV6eUMsRUFBR3RFLEVBQUUwSSxTQUFXLElBRm9DLENBV3hFbkosR0FDR2dCLEVBQUksSUFBSXlwRCxHQUFHbnBELEVBQUcvQixFQUFHYyxFQUFHa0ssR0FBSyxXQUN0QixHQUFJLG1CQUFvQnhGLEVBQUcsQ0FDOUJBLEVBQUVxakUsZUFDRixNQUFNOW1FLEVBQUl5RCxFQUFFcWpFLGVBQ1o5bUUsRUFBRWdrQixTQUFVaGtCLEVBQUVna0IsU0FBU3hsQixLQUFNd0IsRUFBRWdrQixTQUFTdS9CLFdBQ3hDLE1BQU10bEQsRUFBSW90RCxHQUFHbHNELEVBQUdhLEVBQUVna0IsU0FBU3hsQixNQUFPTyxFQUFJZ3NELEdBQUcvcUQsRUFBRWdrQixTQUFTdS9CLFlBQWE3a0QsRUFBSSxJQUFJOCtDLEdBQUcsQ0FDeEUzQyxTQUFVLENBQ05kLE9BQVEvNUMsRUFBRWdrQixTQUFTKzFCLFVBRXZCOXdDLEVBQUlpMUMsR0FBR3lOLGlCQUFpQjF0RCxFQUFHYyxFQUFHTCxHQUFJSixFQUFJMEIsRUFBRXFwRCxXQUFhLEdBQUkzbUQsRUFBSTFDLEVBQUVncEQsa0JBQW9CLEdBQ3ZGdHBELEVBQUksSUFBSXFwRCxHQUFHenFELEVBQUdvRSxFQUFHdUcsRUFBRXpKLElBQUt5SixRQUNyQixHQUFJLG1CQUFvQnhGLEVBQUcsQ0FDOUJBLEVBQUVzakUsZUFDRixNQUFNL21FLEVBQUl5RCxFQUFFc2pFLGVBQ1ovbUUsRUFBRWdrQixTQUNGLE1BQU0vbEIsRUFBSW90RCxHQUFHbHNELEVBQUdhLEVBQUVna0IsVUFBV2psQixFQUFJaUIsRUFBRTJ2RCxTQUFXNUUsR0FBRy9xRCxFQUFFMnZELFVBQVloWCxFQUFHbm9DLE1BQU85UixFQUFJdy9DLEdBQUc0TCxjQUFjN3JELEVBQUdjLEdBQUlrSyxFQUFJakosRUFBRWdwRCxrQkFBb0IsR0FDL0h0cEQsRUFBSSxJQUFJcXBELEdBQUcsR0FBSTkvQyxFQUFHdkssRUFBRWMsSUFBS2QsUUFDdEIsR0FBSSxtQkFBb0IrRSxFQUFHLENBQzlCQSxFQUFFdWpFLGVBQ0YsTUFBTWhuRSxFQUFJeUQsRUFBRXVqRSxlQUNaaG5FLEVBQUVna0IsU0FDRixNQUFNL2xCLEVBQUlvdEQsR0FBR2xzRCxFQUFHYSxFQUFFZ2tCLFVBQVdqbEIsRUFBSWlCLEVBQUVncEQsa0JBQW9CLEdBQ3ZEdHBELEVBQUksSUFBSXFwRCxHQUFHLEdBQUlocUQsRUFBR2QsRUFBRyxVQUNsQixDQUNILEtBQU0sV0FBWXdGLEdBQUksT0FBT3lrQyxJQUM3QixDQUNJemtDLEVBQUVvVSxPQUNGLE1BQU0xWSxFQUFJc0UsRUFBRW9VLE9BQ1oxWSxFQUFFK3BELFNBQ0YsTUFBTWxwRCxFQUFJYixFQUFFOGxELE9BQVMsRUFBR2huRCxFQUFJLElBQUlrTyxHQUFHbk0sR0FBSWpCLEVBQUlJLEVBQUUrcEQsU0FDN0N4cEQsRUFBSSxJQUFJdXBELEdBQUdscUQsRUFBR2QsSUFHdEIsT0FBT3lCLEVBdXZOT2dpRSxDQUFHOWdFLEtBQUswSSxFQUFHbkssR0FBSU8sRUFBSSxTQUFTUCxHQUlsQyxLQUFNLGlCQUFrQkEsR0FBSSxPQUFPdzVDLEVBQUdub0MsTUFDdEMsTUFBTS9NLEVBQUl0RSxFQUFFeW5FLGFBQ1osT0FBT25qRSxFQUFFNGxELFdBQWE1bEQsRUFBRTRsRCxVQUFVanBELE9BQVN1NEMsRUFBR25vQyxNQUFRL00sRUFBRWtzRCxTQUFXNUUsR0FBR3RuRCxFQUFFa3NELFVBQVloWCxFQUFHbm9DLE1BTjlELENBTzNCclIsR0FDRixPQUFPeUIsS0FBS3kwQixTQUFTNHhDLEdBQUd4akUsRUFBRy9ELEdBT3hCLEdBQUdQLEdBQ04sTUFBTXNFLEVBQUksR0FDVkEsRUFBRXc1QyxTQUFXd08sR0FBRzdxRCxLQUFLMEksR0FBSTdGLEVBQUV5akUsVUFBWSxTQUFTL25FLEVBQUdzRSxHQUMvQyxJQUFJL0QsRUFDSixNQUFNTSxFQUFJeUQsRUFBRUksT0FDWixPQUFPbkUsRUFBSSsvQyxHQUFHei9DLEdBQUssQ0FDZjZzRCxVQUFXRCxHQUFHenRELEVBQUdhLElBQ2pCLENBQ0ErUixNQUFPKzZDLEdBQUczdEQsRUFBR2EsSUFDZE4sRUFBRXdwRCxTQUFXemxELEVBQUV5bEQsU0FBVXpsRCxFQUFFaWxELFlBQVllLHNCQUF3QixFQUFJL3BELEVBQUVncEQsWUFBY2lDLEdBQUd4ckQsRUFBR3NFLEVBQUVpbEQsYUFBZWpsRCxFQUFFMGtELGdCQUFnQnhMLFVBQVVoRSxFQUFHbm9DLE9BQVMsSUFJcko5USxFQUFFaXdELFNBQVdsRixHQUFHdHJELEVBQUdzRSxFQUFFMGtELGdCQUFnQjJDLGdCQUFpQnByRCxFQVhuQixDQVlyQ2tCLEtBQUswSSxFQUFHbkssR0FDVixNQUFNTyxFQXhpTmQsU0FBWVAsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUksU0FBU1AsRUFBR3NFLEdBQ2xCLE9BQVFBLEdBQ04sS0FBSyxFQUNILE9BQU8sS0FFVCxLQUFLLEVBQ0gsTUFBTyw0QkFFVCxLQUFLLEVBQ0gsTUFBTyxpQkFFVCxRQUNFLE9BQU95a0MsS0FaTCxDQWNSLEVBQUd6a0MsRUFBRXVtRCxTQUNQLE9BQU8sTUFBUXRxRCxFQUFJLEtBQU8sQ0FDdEIsbUJBQW9CQSxHQXVoTlZ5aEUsQ0FBR3ZnRSxLQUFLMEksRUFBR25LLEdBQ3JCTyxJQUFNK0QsRUFBRTBqRSxPQUFTem5FLEdBQUlrQixLQUFLay9ELEdBQUdyOEQsR0FLMUIsR0FBR3RFLEdBQ04sTUFBTXNFLEVBQUksR0FDVkEsRUFBRXc1QyxTQUFXd08sR0FBRzdxRCxLQUFLMEksR0FBSTdGLEVBQUVvbUQsYUFBZTFxRCxFQUFHeUIsS0FBS2svRCxHQUFHcjhELElBb0J6RCxNQUFNMmpFLFdBQVdoQixHQUNqQixZQUFZam5FLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUdjLEdBQ3ZCZ0osTUFBTTVJLEVBQUcsa0NBQXVFLG9CQUE0Qyx1QkFBa0RzRSxFQUFHL0QsRUFBR00sRUFBR2pCLEdBQ3ZMNkIsS0FBSzBJLEVBQUlyTCxFQUFHMkMsS0FBS21nRSxJQUFLLEVBS25CLFNBQ0gsT0FBT25nRSxLQUFLbWdFLEdBR2hCLFFBQ0luZ0UsS0FBS21nRSxJQUFLLEVBQUluZ0UsS0FBS291RCxxQkFBa0IsRUFBUWpuRCxNQUFNdXdCLFFBRXZELEtBQ0kxM0IsS0FBS21nRSxJQUFNbmdFLEtBQUt3Z0UsR0FBRyxJQUV2QixHQUFHamlFLEVBQUdzRSxHQUNGLE9BQU83QyxLQUFLaTlELEdBQUdqRCxHQUFHLFFBQVN6N0QsRUFBR3NFLEdBRWxDLFVBQVV0RSxHQUNOLEdBRUEyMUMsSUFBSTMxQyxFQUFFa29FLGFBQWN6bUUsS0FBS291RCxnQkFBa0I3dkQsRUFBRWtvRSxZQUFhem1FLEtBQUttZ0UsR0FBSSxDQUkvRG5nRSxLQUFLZytELEdBQUdwL0IsUUFDUixNQUFNLzdCLEVBbHZObEIsU0FBWXRFLEVBQUdzRSxHQUNYLE9BQU90RSxHQUFLQSxFQUFFaUIsT0FBUyxHQUFLMDBDLE9BQUUsSUFBV3J4QyxHQUFJdEUsRUFBRWdZLElBQUtoWSxHQUFLLFNBQVNBLEVBQUdzRSxHQUVqRSxJQUFJL0QsRUFBSVAsRUFBRW9rRCxXQUFhd0gsR0FBRzVyRCxFQUFFb2tELFlBQWN3SCxHQUFHdG5ELEdBQzdDLE9BQU8vRCxFQUFFbzVDLFFBQVFILEVBQUdub0MsU0FNcEI5USxFQUFJcXJELEdBQUd0bkQsSUFBSyxJQUFJMi9DLEdBQUcxakQsRUFBR1AsRUFBRWtrRCxrQkFBb0IsSUFUUyxDQVV2RGxrRCxFQUFHc0UsS0FBUSxHQXV1TktrK0QsQ0FBR3hpRSxFQUFFbW9FLGFBQWNub0UsRUFBRW9vRSxZQUFhN25FLEVBQUlxckQsR0FBRzVyRCxFQUFFb29FLFlBQ3JELE9BQU8zbUUsS0FBS3kwQixTQUFTaXNDLEdBQUc1aEUsRUFBRytELEdBRy9CLE9BQU9xeEMsR0FBRzMxQyxFQUFFbW9FLGNBQWdCLElBQU1ub0UsRUFBRW1vRSxhQUFhbG5FLFFBQVNRLEtBQUttZ0UsSUFBSyxFQUFJbmdFLEtBQUt5MEIsU0FBU21zQyxLQU1uRixLQUdILE1BQU1yaUUsRUFBSSxHQUNWQSxFQUFFODlDLFNBQVd3TyxHQUFHN3FELEtBQUswSSxHQUFJMUksS0FBS2svRCxHQUFHM2dFLEdBRW1DLEdBQUdBLEdBQ3ZFLE1BQU1zRSxFQUFJLENBQ040akUsWUFBYXptRSxLQUFLb3VELGdCQUNsQndZLE9BQVFyb0UsRUFBRWdZLElBQUtoWSxHQUFLeXNELEdBQUdockQsS0FBSzBJLEVBQUduSyxLQUVuQ3lCLEtBQUtrL0QsR0FBR3I4RDs7Ozs7Ozs7Ozs7Ozs7OztHQTZCaEIsTUFBTWdrRSxXQUFXLFFBQ2IsWUFBWXRvRSxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ2pCK0gsUUFBU25ILEtBQUs4bUUsZ0JBQWtCdm9FLEVBQUd5QixLQUFLK21FLG9CQUFzQmxrRSxFQUFHN0MsS0FBS2k5RCxHQUFLbitELEVBQUdrQixLQUFLMEksRUFBSXRKLEVBQ3ZGWSxLQUFLbWhFLElBQUssRUFFZCxLQUNJLEdBQUluaEUsS0FBS21oRSxHQUFJLE1BQU0sSUFBSTdyQixFQUFFakIsRUFBRVUsb0JBQXFCLDJDQUVjLEdBQUd4MkMsRUFBR3NFLEVBQUcvRCxHQUN2RSxPQUFPa0IsS0FBS29oRSxLQUFNeDlELFFBQVFnWixJQUFJLENBQUU1YyxLQUFLOG1FLGdCQUFnQjV0RCxXQUFZbFosS0FBSyttRSxvQkFBb0I3dEQsYUFBY3pPLEtBQUssRUFBR3JMLEVBQUcvQixLQUFPMkMsS0FBS2k5RCxHQUFHbEUsR0FBR3g2RCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixJQUFLeUcsTUFBT3ZGLElBQ3pKLEtBQU0sa0JBQW9CQSxFQUFFWCxNQUFRVyxFQUFFeUksT0FBU3F0QyxFQUFFbkIsa0JBQW9CbHpDLEtBQUs4bUUsZ0JBQWdCakIsa0JBQzFGN2xFLEtBQUsrbUUsb0JBQW9CbEIsbUJBQW9CdG5FLEdBQUssSUFBSSsyQyxFQUFFakIsRUFBRUcsUUFBU2oyQyxFQUFFbUgsY0FHVyxHQUFHbkgsRUFBR3NFLEVBQUcvRCxHQUM3RixPQUFPa0IsS0FBS29oRSxLQUFNeDlELFFBQVFnWixJQUFJLENBQUU1YyxLQUFLOG1FLGdCQUFnQjV0RCxXQUFZbFosS0FBSyttRSxvQkFBb0I3dEQsYUFBY3pPLEtBQUssRUFBR3JMLEVBQUcvQixLQUFPMkMsS0FBS2k5RCxHQUFHeEQsR0FBR2w3RCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixJQUFLeUcsTUFBT3ZGLElBQ3pKLEtBQU0sa0JBQW9CQSxFQUFFWCxNQUFRVyxFQUFFeUksT0FBU3F0QyxFQUFFbkIsa0JBQW9CbHpDLEtBQUs4bUUsZ0JBQWdCakIsa0JBQzFGN2xFLEtBQUsrbUUsb0JBQW9CbEIsbUJBQW9CdG5FLEdBQUssSUFBSSsyQyxFQUFFakIsRUFBRUcsUUFBU2oyQyxFQUFFbUgsY0FHN0UsWUFDSTFGLEtBQUttaEUsSUFBSyxHQWlCbEIsTUFBTTZGLEdBQ0YsWUFBWXpvRSxFQUFHc0UsR0FDWDdDLEtBQUtzNUQsV0FBYS82RCxFQUFHeUIsS0FBS2tpRSxtQkFBcUJyL0QsRUFFL0M3QyxLQUFLd29ELE1BQVEsVUFNYnhvRCxLQUFLc2hFLEdBQUssRUFNVnRoRSxLQUFLdWhFLEdBQUssS0FNVnZoRSxLQUFLd2hFLElBQUssRUFRUCxLQUNILElBQU14aEUsS0FBS3NoRSxLQUFPdGhFLEtBQUswaEUsR0FBRyxXQUEwQjFoRSxLQUFLdWhFLEdBQUt2aEUsS0FBS3M1RCxXQUFXQyxrQkFBa0IsdUJBQWtELElBQUssS0FBUXY1RCxLQUFLdWhFLEdBQUssS0FDekt2aEUsS0FBSzJoRSxHQUFHLDZDQUE4QzNoRSxLQUFLMGhFLEdBQUcsV0FDOUQ5OUQsUUFBUUYsYUFPTCxHQUFHbkYsR0FDTixXQUEwQnlCLEtBQUt3b0QsTUFBUXhvRCxLQUFLMGhFLEdBQUcsWUFBNEIxaEUsS0FBS3NoRSxLQUNoRnRoRSxLQUFLc2hFLElBQU0sSUFBTXRoRSxLQUFLK2hFLEtBQU0vaEUsS0FBSzJoRSxHQUFHLGlEQUFpRHBqRSxFQUFFbUgsWUFDdkYxRixLQUFLMGhFLEdBQUcsYUFRTCxJQUFJbmpFLEdBQ1B5QixLQUFLK2hFLEtBQU0vaEUsS0FBS3NoRSxHQUFLLEVBQUcsV0FBMEIvaUUsSUFHbER5QixLQUFLd2hFLElBQUssR0FBS3hoRSxLQUFLMGhFLEdBQUduakUsR0FFM0IsR0FBR0EsR0FDQ0EsSUFBTXlCLEtBQUt3b0QsUUFBVXhvRCxLQUFLd29ELE1BQVFqcUQsRUFBR3lCLEtBQUtraUUsbUJBQW1CM2pFLElBRWpFLEdBQUdBLEdBQ0MsTUFBTXNFLEVBQUksNENBQTRDdEUsMk1BQ3REeUIsS0FBS3doRSxJQUFNMXRCLEVBQUVqeEMsR0FBSTdDLEtBQUt3aEUsSUFBSyxHQUFNOXRCLEVBQUUscUJBQXNCN3dDLEdBRTdELEtBQ0ksT0FBUzdDLEtBQUt1aEUsS0FBT3ZoRSxLQUFLdWhFLEdBQUdsK0IsU0FBVXJqQyxLQUFLdWhFLEdBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnJELE1BQU0wRixHQUNOLFlBSUExb0UsRUFFQXNFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDTDJDLEtBQUtrbkUsV0FBYTNvRSxFQUFHeUIsS0FBS21uRSxVQUFZdGtFLEVBQUc3QyxLQUFLczVELFdBQWF4NkQsRUFBR2tCLEtBQUtvbkUsYUFBZSxHQWtCbEZwbkUsS0FBS2dpRSxHQUFLLEdBVVZoaUUsS0FBS3VpRSxHQUFLLElBQUk1ekQsSUFLZDNPLEtBQUt3aUUsR0FBSyxJQUFJejNDLElBUWQvcUIsS0FBS3lpRSxHQUFLLEdBQUl6aUUsS0FBSzBpRSxHQUFLcmxFLEVBQUcyQyxLQUFLMGlFLEdBQUc3TSxHQUFJdDNELElBQ25DTyxFQUFFaStELGlCQUFpQixVQUlmc0ssR0FBR3JuRSxRQUFVMHpDLEVBQUUsY0FBZSw2REFDeEI1aUMsZUFBZXZTLEdBQ2pCLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWnNFLEVBQUUyL0QsR0FBR3ArQyxJQUFJLFNBQW1Da2pELEdBQUd6a0UsR0FBSUEsRUFBRWlnRSxHQUFHL3pELElBQUksV0FDNURsTSxFQUFFMi9ELEdBQUd2dEMsT0FBTyxTQUFtQ3N5QyxHQUFHMWtFLEdBSGhEaU8sQ0FJSjlRLFdBRUxBLEtBQUs4aUUsR0FBSyxJQUFJa0UsR0FBR2xvRSxFQUFHTSxJQUlqQzBSLGVBQWV5MkQsR0FBR2hwRSxHQUNkLEdBQUk4b0UsR0FBRzlvRSxHQUFJLElBQUssTUFBTXNFLEtBQUt0RSxFQUFFa2tFLFNBQVU1L0QsR0FBaUIsR0FNeERpTyxlQUFldzJELEdBQUcvb0UsR0FDbEIsSUFBSyxNQUFNc0UsS0FBS3RFLEVBQUVra0UsU0FBVTUvRCxHQUFpQixHQU9qRCxTQUFTMmtFLEdBQUdqcEUsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUNaTyxFQUFFeWpFLEdBQUdoM0MsSUFBSTFvQixFQUFFeWxELFlBRVh4cEQsRUFBRXlqRSxHQUFHeHpELElBQUlsTSxFQUFFeWxELFNBQVV6bEQsR0FBSTRrRSxHQUFHM29FLEdBRTVCNG9FLEdBQUc1b0UsR0FBSzZvRSxHQUFHN29FLEdBQUd3L0QsTUFBUXNKLEdBQUc5b0UsRUFBRytELElBTTVCLFNBQVNnbEUsR0FBR3RwRSxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQUlhLEVBQUl1b0UsR0FBRzdvRSxHQUN2QkEsRUFBRXlqRSxHQUFHdHRDLE9BQU9weUIsR0FBSXpELEVBQUVrL0QsTUFBUXdKLEdBQUdocEUsRUFBRytELEdBQUksSUFBTS9ELEVBQUV5akUsR0FBR3J0QyxPQUFTOTFCLEVBQUVrL0QsS0FBT2wvRCxFQUFFNC9ELEtBQU9xSSxHQUFHdm9FLElBSTdFQSxFQUFFZ2tFLEdBQUcvekQsSUFBSSxZQU1ULFNBQVM2NEQsR0FBR3JwRSxFQUFHc0UsR0FDZnRFLEVBQUV3a0UsR0FBR3pzQixFQUFFenpDLEVBQUV5bEQsVUFBV3FmLEdBQUdwcEUsR0FBR3VoRSxHQUFHajlELEdBTzdCLFNBQVNpbEUsR0FBR3ZwRSxFQUFHc0UsR0FDZnRFLEVBQUV3a0UsR0FBR3pzQixFQUFFenpDLEdBQUk4a0UsR0FBR3BwRSxHQUFHMmhFLEdBQUdyOUQsR0FHeEIsU0FBUzZrRSxHQUFHbnBFLEdBQ1JBLEVBQUV3a0UsR0FBSyxJQUFJamEsR0FBRyxDQUNWTyx1QkFBd0J4bUQsR0FBS3RFLEVBQUU2b0UsYUFBYS9kLHVCQUF1QnhtRCxHQUNuRSsyQyxHQUFJLzJDLEdBQUt0RSxFQUFFZ2tFLEdBQUdya0UsSUFBSTJFLElBQU0sT0FDeEI4a0UsR0FBR3BwRSxHQUFHbTVCLFFBQVNuNUIsRUFBRXVrRSxHQUFHckIsS0FNeEIsU0FBU2dHLEdBQUdscEUsR0FDWixPQUFPOG9FLEdBQUc5b0UsS0FBT29wRSxHQUFHcHBFLEdBQUc2L0QsTUFBUTcvRCxFQUFFZ2tFLEdBQUdydEMsS0FBTyxFQUcvQyxTQUFTbXlDLEdBQUc5b0UsR0FDUixPQUFPLElBQU02MUMsRUFBRTcxQyxHQUFHaWtFLEdBQUd0dEMsS0FHekIsU0FBUzZ5QyxHQUFHeHBFLEdBQ1JBLEVBQUV3a0UsUUFBSyxFQUdYanlELGVBQWVrM0QsR0FBR3pwRSxHQUNkQSxFQUFFZ2tFLEdBQUdwNUQsUUFBUSxDQUFFdEcsRUFBRy9ELEtBQ2Q4b0UsR0FBR3JwRSxFQUFHc0UsS0FJZGlPLGVBQWVtM0QsR0FBRzFwRSxFQUFHc0UsR0FDakJrbEUsR0FBR3hwRSxHQUVIa3BFLEdBQUdscEUsSUFBTUEsRUFBRXVrRSxHQUFHakIsR0FBR2gvRCxHQUFJNmtFLEdBQUducEUsSUFJeEJBLEVBQUV1a0UsR0FBRy96RCxJQUFJLFdBR2IrQixlQUFlbzNELEdBQUczcEUsRUFBR3NFLEVBQUcvRCxHQUNwQixHQUVBUCxFQUFFdWtFLEdBQUcvekQsSUFBSSxVQUF3QmxNLGFBQWEwbEQsSUFBTSxJQUFvQjFsRCxFQUFFMmxELE9BQVMzbEQsRUFBRTZsRCxNQUdyRixVQUdJNTNDLGVBQWV2UyxFQUFHc0UsR0FDZCxNQUFNL0QsRUFBSStELEVBQUU2bEQsTUFDWixJQUFLLE1BQU10cEQsS0FBS3lELEVBQUU0bEQsVUFFbEJscUQsRUFBRWdrRSxHQUFHaDNDLElBQUluc0IsV0FBYWIsRUFBRTZvRSxhQUFhZSxhQUFhL29FLEVBQUdOLEdBQUlQLEVBQUVna0UsR0FBR3R0QyxPQUFPNzFCLEdBQUliLEVBQUV3a0UsR0FBRzlaLGFBQWE3cEQsSUFKL0YwUixDQWFIdlMsRUFBR3NFLEdBQ0YsTUFBTy9ELEdBQ0w0MEMsRUFBRSxjQUFlLG1DQUFvQzd3QyxFQUFFNGxELFVBQVVwbkQsS0FBSyxLQUFNdkMsU0FDdEVzcEUsR0FBRzdwRSxFQUFHTyxRQUNULEdBQUkrRCxhQUFhc2xELEdBQUs1cEQsRUFBRXdrRSxHQUFHcnJCLEdBQUc3MEMsR0FBS0EsYUFBYXdsRCxHQUFLOXBELEVBQUV3a0UsR0FBR25xQixHQUFHLzFDLEdBQUt0RSxFQUFFd2tFLEdBQUc1cUIsR0FBR3QxQyxJQUNoRi9ELEVBQUVvNUMsUUFBUUgsRUFBR25vQyxPQUFRLElBQ2xCLE1BQU0vTSxRQUFVbThELEdBQUd6Z0UsRUFBRTJvRSxZQUNyQnBvRSxFQUFFaTlDLFVBQVVsNUMsSUFBTSxTQVNsQixTQUFTdEUsRUFBR3NFLEdBQ1IsTUFBTS9ELEVBQUlQLEVBQUV3a0UsR0FBRzFwQixHQUFHeDJDLEdBR04sT0FBTy9ELEVBQUUwb0QsY0FBY3IrQyxRQUFRLENBQUVySyxFQUFHTSxLQUM1QyxHQUFJTixFQUFFZ3BELFlBQVllLHNCQUF3QixFQUFHLENBQ3pDLE1BQU14ckQsRUFBSWtCLEVBQUVna0UsR0FBR3JrRSxJQUFJa0IsR0FFQy9CLEdBQUtrQixFQUFFZ2tFLEdBQUd4ekQsSUFBSTNQLEVBQUcvQixFQUFFMmlFLGdCQUFnQmxoRSxFQUFFZ3BELFlBQWFqbEQsT0FLOUUvRCxFQUFFMm9ELGlCQUFpQnQrQyxRQUFTdEcsSUFDeEIsTUFBTS9ELEVBQUlQLEVBQUVna0UsR0FBR3JrRSxJQUFJMkUsR0FDbkIsSUFBSy9ELEVBRUwsT0FHZ0JQLEVBQUVna0UsR0FBR3h6RCxJQUFJbE0sRUFBRy9ELEVBQUVraEUsZ0JBQWdCMW1CLEVBQUdFLGtCQUFtQjE2QyxFQUFFeW9ELGtCQUd0RXVnQixHQUFHdnBFLEVBQUdzRSxHQUtOLE1BQU16RCxFQUFJLElBQUlzMUQsR0FBRzUxRCxFQUFFbUUsT0FBUUosRUFBRyxFQUFrQy9ELEVBQUVveEQsZ0JBQ2xFMFgsR0FBR3JwRSxFQUFHYSxLQUNMYixFQUFFNm9FLGFBQWFpQixpQkFBaUJ2cEUsR0E5QnpDLENBK0JFUCxFQUFHTyxHQUNQLE1BQU8rRCxHQUNMNndDLEVBQUUsY0FBZSw0QkFBNkI3d0MsU0FBVXVsRSxHQUFHN3BFLEVBQUdzRSxJQVlsRWlPLGVBQWVzM0QsR0FBRzdwRSxFQUFHc0UsRUFBRy9ELEdBQ3hCLElBQUtxMEQsR0FBR3R3RCxHQUFJLE1BQU1BLEVBQ2xCdEUsRUFBRWlrRSxHQUFHcCtDLElBQUksU0FFSGtqRCxHQUFHL29FLEdBQUlBLEVBQUV1a0UsR0FBRy96RCxJQUFJLFdBQTBCalEsSUFJaERBLEVBQUksSUFBTWtnRSxHQUFHemdFLEVBQUUyb0UsYUFFZjNvRSxFQUFFKzZELFdBQVc1akIsaUJBQWlCLFVBQzFCaEMsRUFBRSxjQUFlLG1DQUFvQzUwQyxJQUFLUCxFQUFFaWtFLEdBQUd2dEMsT0FBTyxTQUNoRXN5QyxHQUFHaHBFLEtBT2IsU0FBUytwRSxHQUFHL3BFLEVBQUdzRSxHQUNmLE9BQU9BLElBQUlpQixNQUFPaEYsR0FBS3NwRSxHQUFHN3BFLEVBQUdPLEVBQUcrRCxJQUdwQ2lPLGVBQWV5M0QsR0FBR2hxRSxHQUNkLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FBSU8sRUFBSTBwRSxHQUFHM2xFLEdBQ3ZCLElBQUl6RCxFQUFJeUQsRUFBRW0vRCxHQUFHeGlFLE9BQVMsRUFBSXFELEVBQUVtL0QsR0FBR24vRCxFQUFFbS9ELEdBQUd4aUUsT0FBUyxHQUFHOHVELFNBQVcsRUFDM0QsS0FBTW1hLEdBQUc1bEUsSUFBTSxJQUNYLE1BQU10RSxRQUFVNGdFLEdBQUd0OEQsRUFBRXFrRSxXQUFZOW5FLEdBQ2pDLEdBQUksT0FBU2IsRUFBRyxDQUNaLElBQU1zRSxFQUFFbS9ELEdBQUd4aUUsUUFBVVYsRUFBRWtnRSxLQUN2QixNQUVKNS9ELEVBQUliLEVBQUUrdkQsUUFBU29hLEdBQUc3bEUsRUFBR3RFLEdBQ3ZCLE1BQU9BLFNBQ0M2cEUsR0FBR3ZsRSxFQUFHdEUsR0FFaEJvcUUsR0FBRzlsRSxJQUFNK2xFLEdBQUcvbEUsR0FNWixTQUFTNGxFLEdBQUdscUUsR0FDWixPQUFPOG9FLEdBQUc5b0UsSUFBTUEsRUFBRXlqRSxHQUFHeGlFLE9BQVMsR0FNOUIsU0FBU2twRSxHQUFHbnFFLEVBQUdzRSxHQUNmdEUsRUFBRXlqRSxHQUFHNWdFLEtBQUt5QixHQUNWLE1BQU0vRCxFQUFJMHBFLEdBQUdqcUUsR0FDYk8sRUFBRXcvRCxNQUFReC9ELEVBQUVzaEUsSUFBTXRoRSxFQUFFMGhFLEdBQUczOUQsRUFBRTRyRCxXQUc3QixTQUFTa2EsR0FBR3BxRSxHQUNSLE9BQU84b0UsR0FBRzlvRSxLQUFPaXFFLEdBQUdqcUUsR0FBRzYvRCxNQUFRNy9ELEVBQUV5akUsR0FBR3hpRSxPQUFTLEVBR2pELFNBQVNvcEUsR0FBR3JxRSxHQUNSaXFFLEdBQUdqcUUsR0FBR201QixRQUdWNW1CLGVBQWUrM0QsR0FBR3RxRSxHQUNkaXFFLEdBQUdqcUUsR0FBR3NpRSxLQUdWL3ZELGVBQWVnNEQsR0FBR3ZxRSxHQUNkLE1BQU1zRSxFQUFJMmxFLEdBQUdqcUUsR0FFVCxJQUFLLE1BQU1PLEtBQUtQLEVBQUV5akUsR0FBSW4vRCxFQUFFMjlELEdBQUcxaEUsRUFBRTJ2RCxXQUdyQzM5QyxlQUFlaTRELEdBQUd4cUUsRUFBR3NFLEVBQUcvRCxHQUNwQixNQUFNTSxFQUFJYixFQUFFeWpFLEdBQUd2QixRQUFTcGpFLEVBQUlpM0QsR0FBRzUvQixLQUFLdDFCLEVBQUd5RCxFQUFHL0QsU0FDcEN3cEUsR0FBRy9wRSxFQUFHLElBQU9BLEVBQUU2b0UsYUFBYTRCLHFCQUFxQjNyRSxVQUdqRGtyRSxHQUFHaHFFLEdBR2J1UyxlQUFlbTRELEdBQUcxcUUsRUFBR3NFLEdBR2pCQSxHQUFLMmxFLEdBQUdqcUUsR0FBRzZoRSxVQUVMdHZELGVBQWV2UyxFQUFHc0UsR0FHcEIsR0FBZ0IyaEQsR0FBWjFsRCxFQUFJK0QsRUFBRW1FLE9BQWVsSSxJQUFNdTFDLEVBQUVXLFFBQVMsQ0FHdEMsTUFBTWwyQyxFQUFJUCxFQUFFeWpFLEdBQUd2QixRQUlIK0gsR0FBR2pxRSxHQUFHMnFFLFdBQVlaLEdBQUcvcEUsRUFBRyxJQUFPQSxFQUFFNm9FLGFBQWErQixrQkFBa0JycUUsRUFBRXd2RCxRQUFTenJELFVBR2pGMGxFLEdBQUdocUUsR0FFYixJQUFJTyxFQWZGZ1MsQ0FnQkp2UyxFQUFHc0UsR0FHTDhsRSxHQUFHcHFFLElBQU1xcUUsR0FBR3JxRSxHQU1oQnVTLGVBQWVzNEQsR0FBRzdxRSxFQUFHc0UsR0FDakIsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUNac0UsR0FBSy9ELEVBQUUwakUsR0FBR3Z0QyxPQUFPLFNBQTRCc3lDLEdBQUd6b0UsSUFBTStELElBQU0vRCxFQUFFMGpFLEdBQUdwK0MsSUFBSSxTQUMvRGtqRCxHQUFHeG9FLEdBQUlBLEVBQUVna0UsR0FBRy96RCxJQUFJLFlBVXRCLFNBQVM0NEQsR0FBR3BwRSxHQUNaLE9BQU9BLEVBQUU0bUUsS0FFVDVtRSxFQUFFNG1FLEdBQUssU0FBUzVtRSxFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUlnMUMsRUFBRTcxQyxHQUNaLE9BQU9hLEVBQUVnaUUsS0FBTSxJQUFJMkUsR0FBR2xqRSxFQUFHekQsRUFBRTY5RCxHQUFJNzlELEVBQUUwbkUsZ0JBQWlCMW5FLEVBQUUybkUsb0JBQXFCM25FLEVBQUVzSixFQUFHNUo7Ozs7Ozs7Ozs7Ozs7Ozs7SUFGM0UsQ0FtQk5QLEVBQUU0b0UsVUFBVzVvRSxFQUFFKzZELFdBQVksQ0FDeEJoQyxHQUFJMFEsR0FBR25wRSxLQUFLLEtBQU1OLEdBQ2xCbTVELEdBQUl1USxHQUFHcHBFLEtBQUssS0FBTU4sR0FDbEI4bkUsR0FBSTZCLEdBQUdycEUsS0FBSyxLQUFNTixLQUNsQkEsRUFBRWtrRSxHQUFHcmhFLEtBQUssTUFBQzBQLElBQ1hqTyxHQUFLdEUsRUFBRTRtRSxHQUFHK0QsS0FBTXpCLEdBQUdscEUsR0FBS21wRSxHQUFHbnBFLEdBQUtBLEVBQUV1a0UsR0FBRy96RCxJQUFJLG1CQUFtQ3hRLEVBQUU0bUUsR0FBR2tFLE9BQ2pGdEIsR0FBR3hwRSxPQUNEQSxFQUFFNG1FLEdBVVIsU0FBU3FELEdBQUdqcUUsR0FDWixPQUFPQSxFQUFFNm1FLEtBRVQ3bUUsRUFBRTZtRSxHQUFLLFNBQVM3bUUsRUFBR3NFLEVBQUcvRCxHQUNsQixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FDWixPQUFPYSxFQUFFZ2lFLEtBQU0sSUFBSW9GLEdBQUczakUsRUFBR3pELEVBQUU2OUQsR0FBSTc5RCxFQUFFMG5FLGdCQUFpQjFuRSxFQUFFMm5FLG9CQUFxQjNuRSxFQUFFc0osRUFBRzVKLEdBRjNFLENBR0xQLEVBQUU0b0UsVUFBVzVvRSxFQUFFKzZELFdBQVksQ0FDekJoQyxHQUFJdVIsR0FBR2hxRSxLQUFLLEtBQU1OLEdBQ2xCbTVELEdBQUl1UixHQUFHcHFFLEtBQUssS0FBTU4sR0FDbEJxaUUsR0FBSWtJLEdBQUdqcUUsS0FBSyxLQUFNTixHQUNsQm1pRSxHQUFJcUksR0FBR2xxRSxLQUFLLEtBQU1OLEtBQ2xCQSxFQUFFa2tFLEdBQUdyaEUsS0FBSyxNQUFDMFAsSUFDWGpPLEdBQUt0RSxFQUFFNm1FLEdBQUc4RCxXQUVKWCxHQUFHaHFFLFdBQWFBLEVBQUU2bUUsR0FBR2lFLE9BQVE5cUUsRUFBRXlqRSxHQUFHeGlFLE9BQVMsSUFBTWswQyxFQUFFLGNBQWUsOEJBQThCbjFDLEVBQUV5akUsR0FBR3hpRSx5QkFDM0dqQixFQUFFeWpFLEdBQUssUUFDTHpqRSxFQUFFNm1FOzs7Ozs7Ozs7Ozs7Ozs7O0lBOEJaLE1BQU1rRSxHQUNGLFlBQVkvcUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDcEIyQyxLQUFLczVELFdBQWEvNkQsRUFBR3lCLEtBQUs0VSxRQUFVL1IsRUFBRzdDLEtBQUt1cEUsYUFBZXpxRSxFQUFHa0IsS0FBSzA1QixHQUFLdDZCLEVBQUdZLEtBQUt3cEUsZ0JBQWtCbnNFLEVBQ2xHMkMsS0FBS3lwRSxTQUFXLElBQUlsMEIsRUFBR3YxQyxLQUFLeUssS0FBT3pLLEtBQUt5cEUsU0FBUzlsRSxRQUFROEcsS0FBSzVMLEtBQUttQixLQUFLeXBFLFNBQVM5bEUsU0FJakYzRCxLQUFLeXBFLFNBQVM5bEUsUUFBUUcsTUFBT3ZGLE9BZTFCLHlCQUF5QkEsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDeEMsTUFBTWMsRUFBSWlGLEtBQUsrUixNQUFRclcsRUFBR2hCLEVBQUksSUFBSXdyRSxHQUFHL3FFLEVBQUdzRSxFQUFHMUUsRUFBR2lCLEVBQUcvQixHQUNqRCxPQUFPUyxFQUFFNDVCLE1BQU01NEIsR0FBSWhCLEVBS2hCLE1BQU1TLEdBQ1R5QixLQUFLMHBFLFlBQWN6MkQsV0FBVyxJQUFPalQsS0FBSzJwRSxxQkFBdUJwckUsR0FLOUQsWUFDSCxPQUFPeUIsS0FBSzJwRSxxQkFRVCxPQUFPcHJFLEdBQ1YsT0FBU3lCLEtBQUswcEUsY0FBZ0IxcEUsS0FBS2tULGVBQWdCbFQsS0FBS3lwRSxTQUFTaG1FLE9BQU8sSUFBSTZ4QyxFQUFFakIsRUFBRUUsVUFBVyx1QkFBeUJoMkMsRUFBSSxLQUFPQSxFQUFJLE9BRXZJLHFCQUNJeUIsS0FBS3M1RCxXQUFXeUQsaUJBQWlCLElBQU8sT0FBUy84RCxLQUFLMHBFLGFBQWUxcEUsS0FBS2tULGVBQzFFbFQsS0FBSzA1QixLQUFLanZCLEtBQU1sTSxHQUFLeUIsS0FBS3lwRSxTQUFTL2xFLFFBQVFuRixLQUFRcUYsUUFBUUYsV0FFL0QsZUFDSSxPQUFTMUQsS0FBSzBwRSxjQUFnQjFwRSxLQUFLd3BFLGdCQUFnQnhwRSxNQUFPa1QsYUFBYWxULEtBQUswcEUsYUFDNUUxcEUsS0FBSzBwRSxZQUFjLE9BT3ZCLFNBQVNFLEdBQUdyckUsRUFBR3NFLEdBQ2YsR0FBSWl4QyxFQUFFLGFBQWMsR0FBR2p4QyxNQUFNdEUsS0FBTTQwRCxHQUFHNTBELEdBQUksT0FBTyxJQUFJKzJDLEVBQUVqQixFQUFFZSxZQUFhLEdBQUd2eUMsTUFBTXRFLEtBQy9FLE1BQU1BOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0JOLE1BQU1zckUsR0FFTixZQUFZdHJFLEdBR1J5QixLQUFLeTRDLFdBQWFsNkMsRUFBSSxDQUFDc0UsRUFBRy9ELElBQU1QLEVBQUVzRSxFQUFHL0QsSUFBTSs3QyxHQUFHcEMsV0FBVzUxQyxFQUFFakUsSUFBS0UsRUFBRUYsS0FBTyxDQUFDTCxFQUFHc0UsSUFBTWc0QyxHQUFHcEMsV0FBV2w2QyxFQUFFSyxJQUFLaUUsRUFBRWpFLEtBQzFHb0IsS0FBSzhwRSxTQUFXL2lCLEtBQU0vbUQsS0FBSytwRSxVQUFZLElBQUlybEIsR0FBRzFrRCxLQUFLeTRDLFlBS2hELGdCQUFnQmw2QyxHQUNuQixPQUFPLElBQUlzckUsR0FBR3RyRSxFQUFFazZDLFlBRXBCLElBQUlsNkMsR0FDQSxPQUFPLE1BQVF5QixLQUFLOHBFLFNBQVM1ckUsSUFBSUssR0FFckMsSUFBSUEsR0FDQSxPQUFPeUIsS0FBSzhwRSxTQUFTNXJFLElBQUlLLEdBRTdCLFFBQ0ksT0FBT3lCLEtBQUsrcEUsVUFBVTVrQixTQUUxQixPQUNJLE9BQU9ubEQsS0FBSytwRSxVQUFVM2tCLFNBRTFCLFVBQ0ksT0FBT3BsRCxLQUFLK3BFLFVBQVU1aEUsVUFLbkIsUUFBUTVKLEdBQ1gsTUFBTXNFLEVBQUk3QyxLQUFLOHBFLFNBQVM1ckUsSUFBSUssR0FDNUIsT0FBT3NFLEVBQUk3QyxLQUFLK3BFLFVBQVV6akUsUUFBUXpELElBQU0sRUFFNUMsV0FDSSxPQUFPN0MsS0FBSytwRSxVQUFVNzBDLEtBRW9DLFFBQVEzMkIsR0FDbEV5QixLQUFLK3BFLFVBQVUxa0IsaUJBQWlCLENBQUV4aUQsRUFBRy9ELEtBQU9QLEVBQUVzRSxJQUFJLElBRUksSUFBSXRFLEdBRTFELE1BQU1zRSxFQUFJN0MsS0FBS2kxQixPQUFPMTJCLEVBQUVLLEtBQ3hCLE9BQU9pRSxFQUFFa2lELEtBQUtsaUQsRUFBRWluRSxTQUFTaGxCLE9BQU92bUQsRUFBRUssSUFBS0wsR0FBSXNFLEVBQUVrbkUsVUFBVWpsQixPQUFPdm1ELEVBQUcsT0FFdkIsT0FBT0EsR0FDakQsTUFBTXNFLEVBQUk3QyxLQUFLOUIsSUFBSUssR0FDbkIsT0FBT3NFLEVBQUk3QyxLQUFLK2tELEtBQUsva0QsS0FBSzhwRSxTQUFTN2tCLE9BQU8xbUQsR0FBSXlCLEtBQUsrcEUsVUFBVTlrQixPQUFPcGlELElBQU03QyxLQUU5RSxRQUFRekIsR0FDSixLQUFNQSxhQUFhc3JFLElBQUssT0FBTyxFQUMvQixHQUFJN3BFLEtBQUtrMUIsT0FBUzMyQixFQUFFMjJCLEtBQU0sT0FBTyxFQUNqQyxNQUFNcnlCLEVBQUk3QyxLQUFLK3BFLFVBQVV0akIsY0FBZTNuRCxFQUFJUCxFQUFFd3JFLFVBQVV0akIsY0FDeEQsS0FBTTVqRCxFQUFFMGpELFdBQWEsQ0FDakIsTUFBTWhvRCxFQUFJc0UsRUFBRTJqRCxVQUFVNW5ELElBQUtRLEVBQUlOLEVBQUUwbkQsVUFBVTVuRCxJQUMzQyxJQUFLTCxFQUFFMjVDLFFBQVE5NEMsR0FBSSxPQUFPLEVBRTlCLE9BQU8sRUFFWCxXQUNJLE1BQU1iLEVBQUksR0FDVixPQUFPeUIsS0FBS21KLFFBQVN0RyxJQUNqQnRFLEVBQUU2QyxLQUFLeUIsRUFBRTZDLGNBQ1IsSUFBTW5ILEVBQUVpQixPQUFTLGlCQUFtQixvQkFBc0JqQixFQUFFOEMsS0FBSyxRQUFVLE1BRXBGLEtBQUs5QyxFQUFHc0UsR0FDSixNQUFNL0QsRUFBSSxJQUFJK3FFLEdBQ2QsT0FBTy9xRSxFQUFFMjVDLFdBQWF6NEMsS0FBS3k0QyxXQUFZMzVDLEVBQUVnckUsU0FBV3ZyRSxFQUFHTyxFQUFFaXJFLFVBQVlsbkUsRUFBRy9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUI1RSxNQUFNa3JFLEdBQ04sY0FDSWhxRSxLQUFLc2xFLEdBQUssSUFBSTVnQixHQUFHN0osR0FBR3BDLFlBRXhCLE1BQU1sNkMsR0FDRixNQUFNc0UsRUFBSXRFLEVBQUU0L0QsSUFBSXYvRCxJQUFLRSxFQUFJa0IsS0FBS3NsRSxHQUFHcG5FLElBQUkyRSxHQUNyQy9ELEVBRUEsSUFBa0JQLEVBQUU0RyxNQUFRLElBQXFCckcsRUFBRXFHLEtBQU9uRixLQUFLc2xFLEdBQUt0bEUsS0FBS3NsRSxHQUFHeGdCLE9BQU9qaUQsRUFBR3RFLEdBQUssSUFBcUJBLEVBQUU0RyxNQUFRLElBQW9CckcsRUFBRXFHLEtBQU9uRixLQUFLc2xFLEdBQUt0bEUsS0FBS3NsRSxHQUFHeGdCLE9BQU9qaUQsRUFBRyxDQUMvS3NDLEtBQU1yRyxFQUFFcUcsS0FDUmc1RCxJQUFLNS9ELEVBQUU0L0QsTUFDTixJQUFxQjUvRCxFQUFFNEcsTUFBUSxJQUFxQnJHLEVBQUVxRyxLQUFPbkYsS0FBS3NsRSxHQUFLdGxFLEtBQUtzbEUsR0FBR3hnQixPQUFPamlELEVBQUcsQ0FDMUZzQyxLQUFNLEVBQ05nNUQsSUFBSzUvRCxFQUFFNC9ELE1BQ04sSUFBcUI1L0QsRUFBRTRHLE1BQVEsSUFBa0JyRyxFQUFFcUcsS0FBT25GLEtBQUtzbEUsR0FBS3RsRSxLQUFLc2xFLEdBQUd4Z0IsT0FBT2ppRCxFQUFHLENBQ3ZGc0MsS0FBTSxFQUNOZzVELElBQUs1L0QsRUFBRTQvRCxNQUNOLElBQW9CNS9ELEVBQUU0RyxNQUFRLElBQWtCckcsRUFBRXFHLEtBQU9uRixLQUFLc2xFLEdBQUt0bEUsS0FBS3NsRSxHQUFHcmdCLE9BQU9waUQsR0FBSyxJQUFvQnRFLEVBQUU0RyxNQUFRLElBQXFCckcsRUFBRXFHLEtBQU9uRixLQUFLc2xFLEdBQUt0bEUsS0FBS3NsRSxHQUFHeGdCLE9BQU9qaUQsRUFBRyxDQUNoTHNDLEtBQU0sRUFDTmc1RCxJQUFLci9ELEVBQUVxL0QsTUFDTixJQUFrQjUvRCxFQUFFNEcsTUFBUSxJQUFvQnJHLEVBQUVxRyxLQUFPbkYsS0FBS3NsRSxHQUFLdGxFLEtBQUtzbEUsR0FBR3hnQixPQUFPamlELEVBQUcsQ0FDdEZzQyxLQUFNLEVBQ05nNUQsSUFBSzUvRCxFQUFFNC9ELE1BU1g3MkIsSUFBTXRuQyxLQUFLc2xFLEdBQUt0bEUsS0FBS3NsRSxHQUFHeGdCLE9BQU9qaUQsRUFBR3RFLEdBRXRDLEtBQ0ksTUFBTUEsRUFBSSxHQUNWLE9BQU95QixLQUFLc2xFLEdBQUdqZ0IsaUJBQWlCLENBQUV4aUQsRUFBRy9ELEtBQ2pDUCxFQUFFNkMsS0FBS3RDLEtBQ05QLEdBSWIsTUFBTTByRSxHQUNGLFlBQVkxckUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsRUFBR0wsRUFBR3VLLEdBQzdCckksS0FBS21SLE1BQVE1UyxFQUFHeUIsS0FBSzJnRSxLQUFPOTlELEVBQUc3QyxLQUFLa3FFLFFBQVVwckUsRUFBR2tCLEtBQUtrK0QsV0FBYTkrRCxFQUFHWSxLQUFLbXFFLFlBQWM5c0UsRUFDekYyQyxLQUFLaStELFVBQVk5L0QsRUFBRzZCLEtBQUtvcUUsaUJBQW1CdHNFLEVBQUdrQyxLQUFLcXFFLHdCQUEwQmhpRSxFQUVBLDRCQUE0QjlKLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDbkgsTUFBTS9CLEVBQUksR0FDVixPQUFPd0YsRUFBRXNHLFFBQVM1SyxJQUNkbEIsRUFBRStELEtBQUssQ0FDSCtELEtBQU0sRUFDTmc1RCxJQUFLNS9ELE1BRVIsSUFBSTByRSxHQUFHMXJFLEVBQUdzRSxFQUFHZ25FLEdBQUdTLFNBQVN6bkUsR0FBSXhGLEVBQUd5QixFQUFHTSxHQUNoQixHQUNPLEdBRW5DLHVCQUNJLE9BQVFZLEtBQUttcUUsWUFBWWhpRSxVQUU3QixRQUFRNUosR0FDSixLQUFNeUIsS0FBS2krRCxZQUFjMS9ELEVBQUUwL0QsV0FBYWorRCxLQUFLb3FFLG1CQUFxQjdyRSxFQUFFNnJFLGtCQUFvQnBxRSxLQUFLbXFFLFlBQVlqeUIsUUFBUTM1QyxFQUFFNHJFLGNBQWdCdnBCLEdBQUc1Z0QsS0FBS21SLE1BQU81UyxFQUFFNFMsUUFBVW5SLEtBQUsyZ0UsS0FBS3pvQixRQUFRMzVDLEVBQUVvaUUsT0FBUzNnRSxLQUFLa3FFLFFBQVFoeUIsUUFBUTM1QyxFQUFFMnJFLFVBQVcsT0FBTyxFQUNwTyxNQUFNcm5FLEVBQUk3QyxLQUFLaytELFdBQVlwL0QsRUFBSVAsRUFBRTIvRCxXQUNqQyxHQUFJcjdELEVBQUVyRCxTQUFXVixFQUFFVSxPQUFRLE9BQU8sRUFDbEMsSUFBSyxJQUFJakIsRUFBSSxFQUFHQSxFQUFJc0UsRUFBRXJELE9BQVFqQixJQUFLLEdBQUlzRSxFQUFFdEUsR0FBRzRHLE9BQVNyRyxFQUFFUCxHQUFHNEcsT0FBU3RDLEVBQUV0RSxHQUFHNC9ELElBQUlqbUIsUUFBUXA1QyxFQUFFUCxHQUFHNC9ELEtBQU0sT0FBTyxFQUN0RyxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJYLE1BQU1vTSxHQUNOLGNBQ0l2cUUsS0FBSytsRSxRQUFLLEVBQVEvbEUsS0FBS3V6QixVQUFZLElBSTNDLE1BQU1pM0MsR0FDRixjQUNJeHFFLEtBQUt5cUUsUUFBVSxJQUFJN1AsR0FBSXI4RCxHQUFLc2lELEdBQUd0aUQsR0FBS3FpRCxJQUFLNWdELEtBQUs4aEUsWUFBYyxVQUM1RDloRSxLQUFLd21FLEdBQUssSUFBSXo3QyxLQUl0QmphLGVBQWU0NUQsR0FBR25zRSxFQUFHc0UsR0FDakIsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxFQUFJeUQsRUFBRXNPLE1BQ3RCLElBQUk5VCxHQUFJLEVBQUljLEVBQUlXLEVBQUUyckUsUUFBUXZzRSxJQUFJa0IsR0FDOUIsR0FBSWpCLElBQU1kLEdBQUksRUFBSWMsRUFBSSxJQUFJb3NFLElBQUtsdEUsRUFBRyxJQUM5QmMsRUFBRTRuRSxTQUFXam5FLEVBQUU2ckUsU0FBU3ZyRSxHQUMxQixNQUFPYixHQUNMLE1BQU1PLEVBQUk4cUUsR0FBR3JyRSxFQUFHLDRCQUE0QnVpRCxHQUFHaitDLEVBQUVzTyxrQkFDakQsWUFBWXRPLEVBQUVvakMsUUFBUW5uQyxHQUV0QkEsRUFBRTJyRSxRQUFRMTdELElBQUkzUCxFQUFHakIsR0FBSUEsRUFBRW8xQixVQUFVbnlCLEtBQUt5QixHQUUxQ0EsRUFBRWdrRSxHQUFHL25FLEVBQUVnakUsYUFBYzNqRSxFQUFFNG5FLElBQ25CbGpFLEVBQUVta0UsR0FBRzdvRSxFQUFFNG5FLEtBQU82RSxHQUFHOXJFLEdBSXpCZ1MsZUFBZSs1RCxHQUFHdHNFLEVBQUdzRSxHQUNqQixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQUlhLEVBQUl5RCxFQUFFc08sTUFDdEIsSUFBSTlULEdBQUksRUFDUixNQUFNYyxFQUFJVyxFQUFFMnJFLFFBQVF2c0UsSUFBSWtCLEdBQ3hCLEdBQUlqQixFQUFHLENBQ0gsTUFBTUksRUFBSUosRUFBRW8xQixVQUFVanRCLFFBQVF6RCxHQUM5QnRFLEdBQUssSUFBTUosRUFBRW8xQixVQUFVZ2lDLE9BQU9oM0QsRUFBRyxHQUFJbEIsRUFBSSxJQUFNYyxFQUFFbzFCLFVBQVUvekIsUUFFL0QsR0FBSW5DLEVBQUcsT0FBT3lCLEVBQUUyckUsUUFBUXgxQyxPQUFPNzFCLEdBQUlOLEVBQUVnc0UsV0FBVzFyRSxHQUdwRCxTQUFTMnJFLEdBQUd4c0UsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUNaLElBQUlhLEdBQUksRUFDUixJQUFLLE1BQU1iLEtBQUtzRSxFQUFHLENBQ2YsTUFBTUEsRUFBSXRFLEVBQUU0UyxNQUFPOVQsRUFBSXlCLEVBQUUyckUsUUFBUXZzRSxJQUFJMkUsR0FDckMsR0FBSXhGLEVBQUcsQ0FDSCxJQUFLLE1BQU13RixLQUFLeEYsRUFBRWsyQixVQUFXMXdCLEVBQUVta0UsR0FBR3pvRSxLQUFPYSxHQUFJLEdBQzdDL0IsRUFBRTBvRSxHQUFLeG5FLEdBR2ZhLEdBQUt3ckUsR0FBRzlyRSxHQUdaLFNBQVNrc0UsR0FBR3pzRSxFQUFHc0UsRUFBRy9ELEdBQ2QsTUFBTU0sRUFBSWcxQyxFQUFFNzFDLEdBQUlsQixFQUFJK0IsRUFBRXFyRSxRQUFRdnNFLElBQUkyRSxHQUNsQyxHQUFJeEYsRUFBRyxJQUFLLE1BQU1rQixLQUFLbEIsRUFBRWsyQixVQUFXaDFCLEVBQUUwbkMsUUFBUW5uQyxHQUcxQ00sRUFBRXFyRSxRQUFReDFDLE9BQU9weUIsR0FJekIsU0FBUytuRSxHQUFHcnNFLEdBQ1JBLEVBQUVpb0UsR0FBR3I5RCxRQUFTNUssSUFDVkEsRUFBRXFNLFNBU04sTUFBTXFnRSxHQUNOLFlBQVkxc0UsRUFBR3NFLEVBQUcvRCxHQUNka0IsS0FBS21SLE1BQVE1UyxFQUFHeUIsS0FBS2luRSxHQUFLcGtFLEVBSzFCN0MsS0FBS3VuRSxJQUFLLEVBQUl2bkUsS0FBS3NuRSxHQUFLLEtBQU10bkUsS0FBSzhoRSxZQUFjLFVBQTBCOWhFLEtBQUtnaUIsUUFBVWxqQixHQUFLLEdBTzVGLEdBQUdQLEdBQ04sSUFBS3lCLEtBQUtnaUIsUUFBUWtwRCx1QkFBd0IsQ0FFdEMsTUFBTXJvRSxFQUFJLEdBQ1YsSUFBSyxNQUFNL0QsS0FBS1AsRUFBRTIvRCxXQUFZLElBQXFCcC9ELEVBQUVxRyxNQUFRdEMsRUFBRXpCLEtBQUt0QyxHQUNwRVAsRUFBSSxJQUFJMHJFLEdBQUcxckUsRUFBRTRTLE1BQU81UyxFQUFFb2lFLEtBQU1waUUsRUFBRTJyRSxRQUFTcm5FLEVBQUd0RSxFQUFFNHJFLFlBQWE1ckUsRUFBRTAvRCxVQUFXMS9ELEVBQUU2ckUsa0JBQ3pDLEdBRW5DLElBQUl2bkUsR0FBSSxFQUNSLE9BQU83QyxLQUFLdW5FLEdBQUt2bkUsS0FBS3duRSxHQUFHanBFLEtBQU95QixLQUFLaW5FLEdBQUdyOEQsS0FBS3JNLEdBQUlzRSxHQUFJLEdBQU03QyxLQUFLNm5FLEdBQUd0cEUsRUFBR3lCLEtBQUs4aEUsZUFBaUI5aEUsS0FBSzRuRSxHQUFHcnBFLEdBQ3BHc0UsR0FBSSxHQUFLN0MsS0FBS3NuRSxHQUFLL29FLEVBQUdzRSxFQUUxQixRQUFRdEUsR0FDSnlCLEtBQUtpbkUsR0FBR2xrRSxNQUFNeEUsR0FFK0IsR0FBR0EsR0FDaER5QixLQUFLOGhFLFlBQWN2akUsRUFDbkIsSUFBSXNFLEdBQUksRUFDUixPQUFPN0MsS0FBS3NuRSxLQUFPdG5FLEtBQUt1bkUsSUFBTXZuRSxLQUFLNm5FLEdBQUc3bkUsS0FBS3NuRSxHQUFJL29FLEtBQU95QixLQUFLNG5FLEdBQUc1bkUsS0FBS3NuRSxJQUFLemtFLEdBQUksR0FDNUVBLEVBRUosR0FBR3RFLEVBQUdzRSxHQUVGLElBQUt0RSxFQUFFMC9ELFVBQVcsT0FBTyxFQUdqQixNQUFNbi9ELEVBQUksWUFBNEIrRCxFQUd0QyxRQUFTN0MsS0FBS2dpQixRQUFROGxELElBQU9ocEUsR0FBUVAsRUFBRW9pRSxLQUFLeDRELFdBQWEsWUFBNEJ0RixHQUdqRyxHQUFHdEUsR0FLQyxHQUFJQSxFQUFFMi9ELFdBQVcxK0QsT0FBUyxFQUFHLE9BQU8sRUFDcEMsTUFBTXFELEVBQUk3QyxLQUFLc25FLElBQU10bkUsS0FBS3NuRSxHQUFHakosbUJBQXFCOS9ELEVBQUU4L0QsaUJBQ3BELFNBQVU5L0QsRUFBRTZyRSxtQkFBcUJ2bkUsS0FBTSxJQUFPN0MsS0FBS2dpQixRQUFRa3BELHVCQUsvRCxHQUFHM3NFLEdBQ0NBLEVBQUkwckUsR0FBR2tCLHFCQUFxQjVzRSxFQUFFNFMsTUFBTzVTLEVBQUVvaUUsS0FBTXBpRSxFQUFFNHJFLFlBQWE1ckUsRUFBRTAvRCxXQUFZaitELEtBQUt1bkUsSUFBSyxFQUNwRnZuRSxLQUFLaW5FLEdBQUdyOEQsS0FBS3JNOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJqQixNQUFNNnNFLEdBQ04sWUFBWTdzRSxFQUVac0UsR0FDSTdDLEtBQUt1RSxRQUFVaEcsRUFBR3lCLEtBQUtxckUsV0FBYXhvRSxFQUV4QyxLQUNJLE1BQU8sYUFBYzdDLEtBQUt1RTs7Ozs7Ozs7Ozs7Ozs7OztHQXNCOUIsTUFBTSttRSxHQUNOLFlBQVkvc0UsR0FDUnlCLEtBQUswSSxFQUFJbkssRUFFYixHQUFHQSxHQUNDLE9BQU9rc0QsR0FBR3pxRCxLQUFLMEksRUFBR25LLEdBSWYsR0FBR0EsR0FDTixPQUFPQSxFQUFFdVgsU0FBUzhzQyxPQUFTa0ksR0FBRzlxRCxLQUFLMEksRUFBR25LLEVBQUU2a0IsVUFBVSxHQUFNazZCLEdBQUc0TCxjQUFjbHBELEtBQUtzcUQsR0FBRy9yRCxFQUFFdVgsU0FBU2xZLE1BQU9vQyxLQUFLeXFELEdBQUdsc0QsRUFBRXVYLFNBQVNpNUMsV0FFMUgsR0FBR3h3RCxHQUNDLE9BQU80ckQsR0FBRzVyRCxJQU9kLE1BQU1ndEUsR0FDTixZQUFZaHRFLEVBQUdzRSxFQUFHL0QsR0FDZGtCLEtBQUt5bkUsR0FBS2xwRSxFQUFHeUIsS0FBS2tuRSxXQUFhcmtFLEVBQUc3QyxLQUFLMEksRUFBSTVKLEVBRTNDa0IsS0FBS3lxRSxRQUFVLEdBRWZ6cUUsS0FBS2lzRCxVQUFZLEdBQUlqc0QsS0FBS3k5RCxTQUFXK04sR0FBR2p0RSxHQU9yQyxHQUFHQSxHQUNOeUIsS0FBS3k5RCxTQUFTZ08sYUFBZWx0RSxFQUFFOHNFLFdBQy9CLElBQUl4b0UsRUFBSTdDLEtBQUt5OUQsU0FBU2lPLGdCQUN0QixPQUFPbnRFLEVBQUVnRyxRQUFRb25FLFdBQWEzckUsS0FBS3lxRSxRQUFRcnBFLEtBQUs3QyxFQUFFZ0csUUFBUW9uRSxZQUFjcHRFLEVBQUVnRyxRQUFRcW5FLGtCQUFvQjVyRSxLQUFLaXNELFVBQVU3cUQsS0FBSyxDQUN0SDBVLFNBQVV2WCxFQUFFZ0csUUFBUXFuRSxtQkFDcEJydEUsRUFBRWdHLFFBQVFxbkUsaUJBQWlCaHBCLFVBQVkvL0MsR0FBS3RFLEVBQUVnRyxRQUFRNmUsV0FBYXBqQixLQUFLaXNELFVBQVVqc0QsS0FBS2lzRCxVQUFVenNELE9BQVMsR0FBRzRqQixTQUFXN2tCLEVBQUVnRyxRQUFRNmUsV0FDcEl2Z0IsR0FBSUEsSUFBTTdDLEtBQUt5OUQsU0FBU2lPLGlCQUFtQjFyRSxLQUFLeTlELFNBQVNpTyxnQkFBa0I3b0UsRUFDN0U5RSxPQUFPeUcsT0FBTyxHQUFJeEUsS0FBS3k5RCxXQUFhLEtBRXhDLEdBQUdsL0QsR0FDQyxNQUFNc0UsRUFBSSxJQUFJOEwsSUFBSzdQLEVBQUksSUFBSXdzRSxHQUFHdHJFLEtBQUswSSxHQUNuQyxJQUFLLE1BQU10SixLQUFLYixFQUFHLEdBQUlhLEVBQUUwVyxTQUFTMjBELFFBQVMsQ0FDdkMsTUFBTWxzRSxFQUFJTyxFQUFFd3JELEdBQUdsckQsRUFBRTBXLFNBQVNsWSxNQUMxQixJQUFLLE1BQU1rQixLQUFLTSxFQUFFMFcsU0FBUzIwRCxRQUFTLENBQ2hDLE1BQU1yckUsR0FBS3lELEVBQUUzRSxJQUFJWSxJQUFNcW9ELE1BQU0vaUMsSUFBSTdsQixHQUNqQ3NFLEVBQUVrTSxJQUFJalEsRUFBR00sSUFHakIsT0FBT3lELEVBSUosaUJBQ0gsTUFBTXRFLFFBcHJHZHVTLGVBQWtCdlMsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUN2QixNQUFNL0IsRUFBSSsyQyxFQUFFNzFDLEdBQ1osSUFBSUosRUFBSWdwRCxLQUFNcnBELEVBQUkrb0QsS0FBTXgrQyxFQUFJNCtDLEtBQzVCLElBQUssTUFBTTFvRCxLQUFLTyxFQUFHLENBQ2YsTUFBTUEsRUFBSStELEVBQUV5bkQsR0FBRy9yRCxFQUFFdVgsU0FBU2xZLE1BQzFCVyxFQUFFNmtCLFdBQWFqbEIsRUFBSUEsRUFBRWltQixJQUFJdGxCLElBQUtoQixFQUFJQSxFQUFFZ25ELE9BQU9obUQsRUFBRytELEVBQUUybkQsR0FBR2pzRCxJQUFLOEosRUFBSUEsRUFBRXk4QyxPQUFPaG1ELEVBQUcrRCxFQUFFNG5ELEdBQUdsc0QsRUFBRXVYLFNBQVNpNUMsV0FFNUYsTUFBTXJ4RCxFQUFJTCxFQUFFMHNELEdBQUdzUSxnQkFBZ0IsQ0FDM0J3QixlQUFlLElBQ2YvNUQsUUFBVXU5RCxHQUFHaGlFLEVBQUcsU0FBU2tCLEdBR3pCLE9BQU9taUQsR0FBR1QsR0FBR3JILEVBQUdrQyxXQUFXLG1CQUFtQnY4QyxLQUg5QixDQUlsQmEsSUFHRSxPQUFPL0IsRUFBRW9lLFlBQVlraEQsZUFBZSx5QkFBMEIsWUFBY3ArRCxHQUFLMmdFLEdBQUczZ0UsRUFBR2IsRUFBR0ksRUFBR2k2QyxFQUFHbm9DLE1BQU92SCxHQUFHdUMsS0FBTS9ILElBQU1uRixFQUFFODhELE1BQU1qOEQsR0FDbElzRSxJQUFLK0gsS0FBTS9ILEdBQUt4RixFQUFFbWxELEdBQUdnVyw4QkFBOEJqNkQsRUFBR3VELEVBQUV3bUQsVUFBVTE5QyxLQUFLLElBQU92TixFQUFFbWxELEdBQUd5ZCxnQkFBZ0IxaEUsRUFBR0osRUFBRzJELEVBQUV3bUQsV0FBWTE5QyxLQUFLLElBQU92TixFQUFFNHNELEdBQUcvQyxHQUFHM29ELEVBQUdzRSxJQUFLK0gsS0FBSyxJQUFPL0gsS0FtcUczSXdqRSxDQUFHcm1FLEtBQUtrbkUsV0FBWSxJQUFJb0UsR0FBR3RyRSxLQUFLMEksR0FBSTFJLEtBQUtpc0QsVUFBV2pzRCxLQUFLeW5FLEdBQUd0aEUsSUFBS3RELEVBQUk3QyxLQUFLZ29FLEdBQUdob0UsS0FBS2lzRCxXQUNsRyxJQUFLLE1BQU0xdEQsS0FBS3lCLEtBQUt5cUUsY0FBZTNLLEdBQUc5L0QsS0FBS2tuRSxXQUFZM29FLEVBQUdzRSxFQUFFM0UsSUFBSUssRUFBRVgsT0FDbkUsT0FBT29DLEtBQUt5OUQsU0FBU29PLFVBQVksVUFBVyxJQUFJck8sR0FBR3ovRCxPQUFPeUcsT0FBTyxHQUFJeEUsS0FBS3k5RCxVQUFXbC9ELElBT3pGLFNBQVNpdEUsR0FBR2p0RSxHQUNaLE1BQU8sQ0FDSHN0RSxVQUFXLFVBQ1hILGdCQUFpQixFQUNqQkQsWUFBYSxFQUNiSyxlQUFnQnZ0RSxFQUFFdXRFLGVBQ2xCQyxXQUFZeHRFLEVBQUV3dEU7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QnRCLE1BQU1DLEdBQ0YsWUFBWXp0RSxHQUNSeUIsS0FBS3BCLElBQU1MLEdBSW5CLE1BQU0wdEUsR0FDRixZQUFZMXRFLEdBQ1J5QixLQUFLcEIsSUFBTUwsR0FRZixNQUFNMnRFLEdBQ04sWUFBWTN0RSxFQUVac0UsR0FDSTdDLEtBQUttUixNQUFRNVMsRUFBR3lCLEtBQUtpb0UsR0FBS3BsRSxFQUFHN0MsS0FBS2tvRSxHQUFLLEtBT3ZDbG9FLEtBQUsrbkQsU0FBVSxFQUVmL25ELEtBQUtvb0UsR0FBS2poQixLQUVWbm5ELEtBQUttcUUsWUFBY2hqQixLQUFNbm5ELEtBQUtzb0UsR0FBS25uQixHQUFHNWlELEdBQUl5QixLQUFLdW9FLEdBQUssSUFBSXNCLEdBQUc3cEUsS0FBS3NvRSxJQUs3RCxTQUNILE9BQU90b0UsS0FBS2lvRSxHQVdULEdBQUcxcEUsRUFBR3NFLEdBQ1QsTUFBTS9ELEVBQUkrRCxFQUFJQSxFQUFFOGxFLEdBQUssSUFBSXFCLEdBQUk1cUUsRUFBSXlELEVBQUlBLEVBQUUwbEUsR0FBS3ZvRSxLQUFLdW9FLEdBQ2pELElBQUlsckUsRUFBSXdGLEVBQUlBLEVBQUVzbkUsWUFBY25xRSxLQUFLbXFFLFlBQWFoc0UsRUFBSWlCLEVBQUd0QixHQUFJLEVBU3pELE1BQU11SyxFQUFJNjNDLEdBQUdsZ0QsS0FBS21SLFFBQVUvUixFQUFFODFCLE9BQVNsMUIsS0FBS21SLE1BQU11bkMsTUFBUXQ1QyxFQUFFKzVELE9BQVMsS0FBTXo3RCxFQUFJeWlELEdBQUduZ0QsS0FBS21SLFFBQVUvUixFQUFFODFCLE9BQVNsMUIsS0FBS21SLE1BQU11bkMsTUFBUXQ1QyxFQUFFdThELFFBQVUsS0FFM0ksR0FBSXA5RCxFQUFFOG1ELGlCQUFpQixDQUFFOW1ELEVBQUdzRSxLQUN4QixNQUFNZixFQUFJMUMsRUFBRWxCLElBQUlLLEdBQUk4M0MsRUFBSTJLLEdBQUdoaEQsS0FBS21SLE1BQU90TyxHQUFLQSxFQUFJLEtBQU12RixJQUFNd0UsR0FBSzlCLEtBQUttcUUsWUFBWTUrQyxJQUFJenBCLEVBQUVsRCxLQUFNdXRFLElBQU05MUIsSUFBTUEsRUFBRXNILG1CQUc1RzM5QyxLQUFLbXFFLFlBQVk1K0MsSUFBSThxQixFQUFFejNDLE1BQVF5M0MsRUFBRXVILHVCQUNqQyxJQUFJamdELEdBQUksRUFFUW1FLEdBQUt1MEMsRUFDakJ2MEMsRUFBRTRGLEtBQUt3d0MsUUFBUTdCLEVBQUUzdUMsTUFBUXBLLElBQU02dUUsSUFBTXJ0RSxFQUFFc3RFLE1BQU0sQ0FDekNqbkUsS0FBTSxFQUNOZzVELElBQUs5bkIsSUFDTDE0QyxHQUFJLEdBQU1xQyxLQUFLNG9FLEdBQUc5bUUsRUFBR3UwQyxLQUFPdjNDLEVBQUVzdEUsTUFBTSxDQUNwQ2puRSxLQUFNLEVBQ05nNUQsSUFBSzluQixJQUNMMTRDLEdBQUksR0FBSzBLLEdBQUtySSxLQUFLc29FLEdBQUdqeUIsRUFBR2h1QyxHQUFLLEdBQUszSyxHQUFLc0MsS0FBS3NvRSxHQUFHanlCLEVBQUczNEMsR0FBSyxLQUk1REksR0FBSSxLQUNBZ0UsR0FBS3UwQyxHQUFLdjNDLEVBQUVzdEUsTUFBTSxDQUN0QmpuRSxLQUFNLEVBQ05nNUQsSUFBSzluQixJQUNMMTRDLEdBQUksR0FBTW1FLElBQU11MEMsSUFBTXYzQyxFQUFFc3RFLE1BQU0sQ0FDOUJqbkUsS0FBTSxFQUNOZzVELElBQUtyOEQsSUFDTG5FLEdBQUksR0FBSzBLLEdBQUszSyxLQUlsQkksR0FBSSxJQUNKSCxJQUFNMDRDLEdBQUtsNEMsRUFBSUEsRUFBRWltQixJQUFJaXlCLEdBQUloNUMsRUFBSTh1RSxFQUFJOXVFLEVBQUUrbUIsSUFBSTdsQixHQUFLbEIsRUFBRTQzQixPQUFPMTJCLEtBQU9KLEVBQUlBLEVBQUU4MkIsT0FBTzEyQixHQUFJbEIsRUFBSUEsRUFBRTQzQixPQUFPMTJCLE9BQ3pGMmhELEdBQUdsZ0QsS0FBS21SLFFBQVVndkMsR0FBR25nRCxLQUFLbVIsT0FBUSxLQUFNaFQsRUFBRSsyQixLQUFPbDFCLEtBQUttUixNQUFNdW5DLE9BQVMsQ0FDdEUsTUFBTW42QyxFQUFJMmhELEdBQUdsZ0QsS0FBS21SLE9BQVNoVCxFQUFFZzdELE9BQVNoN0QsRUFBRXc5RCxRQUN4Q3g5RCxFQUFJQSxFQUFFODJCLE9BQU8xMkIsRUFBRUssS0FBTXZCLEVBQUlBLEVBQUU0M0IsT0FBTzEyQixFQUFFSyxLQUFNRSxFQUFFc3RFLE1BQU0sQ0FDOUNqbkUsS0FBTSxFQUNOZzVELElBQUs1L0QsSUFHYixNQUFPLENBQ0hncUUsR0FBSXBxRSxFQUNKd3FFLEdBQUk3cEUsRUFDSjhwRCxHQUFJOXFELEVBQ0pxc0UsWUFBYTlzRSxHQUdyQixHQUFHa0IsRUFBR3NFLEdBUUYsT0FBT3RFLEVBQUVvL0MsbUJBQXFCOTZDLEVBQUUrNkMsd0JBQTBCLzZDLEVBQUU4NkMsa0JBYWhFLGFBQWFwL0MsRUFBR3NFLEVBQUcvRCxHQUNmLE1BQU1NLEVBQUlZLEtBQUt1b0UsR0FDZnZvRSxLQUFLdW9FLEdBQUtocUUsRUFBRWdxRSxHQUFJdm9FLEtBQUttcUUsWUFBYzVyRSxFQUFFNHJFLFlBRXJDLE1BQU05c0UsRUFBSWtCLEVBQUVvcUUsR0FBR25ELEtBQ2Zub0UsRUFBRXlrQixLQUFLLENBQUV2akIsRUFBR3NFLElBQU0sU0FBU3RFLEVBQUdzRSxHQUMxQixNQUFNL0QsRUFBSVAsSUFDTixPQUFRQSxHQUNOLEtBQUssRUFDSCxPQUFPLEVBRVQsS0FBSyxFQUNMLEtBQUssRUFJSCxPQUFPLEVBRVQsS0FBSyxFQUNILE9BQU8sRUFFVCxRQUNFLE9BQU8rb0MsTUFHZixPQUFPeG9DLEVBQUVQLEdBQUtPLEVBQUUrRDs7Ozs7Ozs7Ozs7Ozs7OztHQXBCRixDQXFDckJ0RSxFQUFFNEcsS0FBTXRDLEVBQUVzQyxPQUFTbkYsS0FBS3NvRSxHQUFHL3BFLEVBQUU0L0QsSUFBS3Q3RCxFQUFFczdELE1BQVFuK0QsS0FBSzZvRSxHQUFHL3BFLEdBQ2pELE1BQU1YLEVBQUkwRSxFQUFJN0MsS0FBSzhvRSxLQUFPLEdBQUlockUsRUFBSSxJQUFNa0MsS0FBS29vRSxHQUFHbHpDLE1BQVFsMUIsS0FBSytuRCxRQUFVLEVBQWlCLEVBQWdCMS9DLEVBQUl2SyxJQUFNa0MsS0FBS2tvRSxHQUN2SCxPQUFJbG9FLEtBQUtrb0UsR0FBS3BxRSxFQUFHLElBQU1ULEVBQUVtQyxRQUFVNkksRUFDeEIsQ0FDSGdrRSxTQUFVLElBQUlwQyxHQUFHanFFLEtBQUttUixNQUFPNVMsRUFBRWdxRSxHQUFJbnBFLEVBQUcvQixFQUFHa0IsRUFBRTRyRSxZQUFhLElBQWtCcnNFLEVBQUd1SyxHQUM5QyxHQUMvQjBnRSxHQUFJNXFFLEdBSUwsQ0FDSDRxRSxHQUFJNXFFLEdBTUwsR0FBR0ksR0FDTixPQUFPeUIsS0FBSytuRCxTQUFXLFlBQTRCeHBELEdBS25EeUIsS0FBSytuRCxTQUFVLEVBQUkvbkQsS0FBS2s5QyxhQUFhLENBQ2pDcXJCLEdBQUl2b0UsS0FBS3VvRSxHQUNUSSxHQUFJLElBQUlxQixHQUNSRyxZQUFhbnFFLEtBQUttcUUsWUFDbEJ2aEIsSUFBSSxJQUVvQixJQUFPLENBQy9CbWdCLEdBQUksSUFLTCxHQUFHeHFFLEdBRU4sT0FBUXlCLEtBQUtpb0UsR0FBRzE4QyxJQUFJaHRCLE1BRWxCeUIsS0FBS3VvRSxHQUFHaDlDLElBQUlodEIsS0FBT3lCLEtBQUt1b0UsR0FBR3JxRSxJQUFJSyxHQUFHby9DLGtCQUtqQyxHQUFHcC9DLEdBQ05BLElBQU1BLEVBQUV5cEQsZUFBZTcrQyxRQUFTNUssR0FBS3lCLEtBQUtpb0UsR0FBS2pvRSxLQUFLaW9FLEdBQUc3akQsSUFBSTdsQixJQUFNQSxFQUFFMHBELGtCQUFrQjkrQyxRQUFTNUssT0FDOUZBLEVBQUUycEQsaUJBQWlCLytDLFFBQVM1SyxHQUFLeUIsS0FBS2lvRSxHQUFLam9FLEtBQUtpb0UsR0FBR2h6QyxPQUFPMTJCLElBQU15QixLQUFLK25ELFFBQVV4cEQsRUFBRXdwRCxTQUVyRixLQUVJLElBQUsvbkQsS0FBSytuRCxRQUFTLE1BQU8sR0FHbEIsTUFBTXhwRCxFQUFJeUIsS0FBS29vRSxHQUN2QnBvRSxLQUFLb29FLEdBQUtqaEIsS0FBTW5uRCxLQUFLdW9FLEdBQUdwL0QsUUFBUzVLLElBQzdCeUIsS0FBS2lwRSxHQUFHMXFFLEVBQUVLLE9BQVNvQixLQUFLb29FLEdBQUtwb0UsS0FBS29vRSxHQUFHaGtELElBQUk3bEIsRUFBRUssUUFHL0MsTUFBTWlFLEVBQUksR0FDVixPQUFPdEUsRUFBRTRLLFFBQVM1SyxJQUNkeUIsS0FBS29vRSxHQUFHNzhDLElBQUlodEIsSUFBTXNFLEVBQUV6QixLQUFLLElBQUk2cUUsR0FBRzF0RSxNQUMvQnlCLEtBQUtvb0UsR0FBR2ovRCxRQUFTckssSUFDbEJQLEVBQUVndEIsSUFBSXpzQixJQUFNK0QsRUFBRXpCLEtBQUssSUFBSTRxRSxHQUFHbHRFLE1BQ3pCK0QsRUFzQlQsR0FBR3RFLEdBQ0N5QixLQUFLaW9FLEdBQUsxcEUsRUFBRThyRCxHQUFJcnFELEtBQUtvb0UsR0FBS2poQixLQUMxQixNQUFNdGtELEVBQUk3QyxLQUFLMG9FLEdBQUducUUsRUFBRTB0RCxXQUNwQixPQUFPanNELEtBQUtrOUMsYUFBYXI2QyxHQUE2QixHQVExRCxLQUNJLE9BQU9vbkUsR0FBR2tCLHFCQUFxQm5yRSxLQUFLbVIsTUFBT25SLEtBQUt1b0UsR0FBSXZvRSxLQUFLbXFFLFlBQWEsSUFBa0JucUUsS0FBS2tvRSxLQVFyRyxNQUFNb0UsR0FDRixZQUlBL3RFLEVBS0FzRSxFQU9BL0QsR0FDSWtCLEtBQUttUixNQUFRNVMsRUFBR3lCLEtBQUtzb0QsU0FBV3psRCxFQUFHN0MsS0FBS3l1QyxLQUFPM3ZDLEdBSXJCLE1BQU15dEUsR0FDcEMsWUFBWWh1RSxHQUNSeUIsS0FBS3BCLElBQU1MLEVBT1h5QixLQUFLd29FLElBQUssR0FnQmQsTUFBTWdFLEdBQ04sWUFBWWp1RSxFQUFHc0UsRUFBRy9ELEVBRWxCTSxFQUFHL0IsRUFBR2MsR0FDRjZCLEtBQUtrbkUsV0FBYTNvRSxFQUFHeUIsS0FBS3lzRSxZQUFjNXBFLEVBQUc3QyxLQUFLbWlDLGFBQWVyakMsRUFBR2tCLEtBQUswc0Usa0JBQW9CdHRFLEVBQzNGWSxLQUFLd1UsWUFBY25YLEVBQUcyQyxLQUFLMnNFLDhCQUFnQ3h1RSxFQUFHNkIsS0FBS3NwRSxHQUFLLEdBQUl0cEUsS0FBSzRwRSxHQUFLLElBQUloUCxHQUFJcjhELEdBQUtzaUQsR0FBR3RpRCxHQUFLcWlELElBQzNHNWdELEtBQUs2cEUsR0FBSyxJQUFJbDdELElBVWQzTyxLQUFLZ3FFLEdBQUssSUFBSWovQyxJQUtkL3FCLEtBQUtpcUUsR0FBSyxJQUFJdmxCLEdBQUc3SixHQUFHcEMsWUFLcEJ6NEMsS0FBS3VxRSxHQUFLLElBQUk1N0QsSUFBSzNPLEtBQUt3cUUsR0FBSyxJQUFJckssR0FFakNuZ0UsS0FBSzBxRSxHQUFLLEdBRVYxcUUsS0FBSzZxRSxHQUFLLElBQUlsOEQsSUFBSzNPLEtBQUsrcUUsR0FBS3pTLEdBQUc1NkMsS0FBTTFkLEtBQUs4aEUsWUFBYyxVQUl6RDloRSxLQUFLZ3JFLFFBQUssRUFFZCxzQkFDSSxPQUFPLElBQU9ockUsS0FBS2dyRSxJQVMzQmw2RCxlQUFlODdELEdBQUdydUUsRUFBR3NFLEdBQ2pCLE1BQU0vRCxFQUFJK3RFLEdBQUd0dUUsR0FDYixJQUFJYSxFQUFHL0IsRUFDUCxNQUFNYyxFQUFJVyxFQUFFOHFFLEdBQUcxckUsSUFBSTJFLEdBQ25CLEdBQUkxRSxFQU9KaUIsRUFBSWpCLEVBQUVtcUQsU0FBVXhwRCxFQUFFNHRFLGtCQUFrQkksb0JBQW9CMXRFLEdBQUkvQixFQUFJYyxFQUFFc3dDLEtBQUtrNUIsU0FBVyxDQUM5RSxNQUFNcHBFLFFBQVU4Z0UsR0FBR3ZnRSxFQUFFb29FLFdBQVl4bUIsR0FBRzc5QyxJQUFLMUUsRUFBSVcsRUFBRTR0RSxrQkFBa0JJLG9CQUFvQnZ1RSxFQUFFK3BELFVBQ3ZGbHBELEVBQUliLEVBQUUrcEQsU0FBVWpyRCxRQUFVMHZFLEdBQUdqdUUsRUFBRytELEVBQUd6RCxFQUFHLFlBQWNqQixHQUFJVyxFQUFFa3VFLGlCQUFtQnhGLEdBQUcxb0UsRUFBRTJ0RSxZQUFhbHVFLEdBRW5HLE9BQU9sQixFQU1QeVQsZUFBZWk4RCxHQUFHeHVFLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FJM0JiLEVBQUVxc0UsR0FBSyxDQUFDL25FLEVBQUcvRCxFQUFHTSxJQUFNMFIsZUFBZXZTLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDeEMsSUFBSS9CLEVBQUl3RixFQUFFNHJDLEtBQUtpNkIsR0FBRzVwRSxHQUNsQnpCLEVBQUV1ckQsS0FJRnZyRCxRQUFVcWlFLEdBQUduaEUsRUFBRTJvRSxXQUFZcmtFLEVBQUVzTyxPQUNILEdBQUkxRyxLQUFLLEVBQUd3aEQsVUFBVzF0RCxLQUFPc0UsRUFBRTRyQyxLQUFLaTZCLEdBQUducUUsRUFBR2xCLEtBQ3JFLE1BQU1jLEVBQUlpQixHQUFLQSxFQUFFb29ELGNBQWN0cEQsSUFBSTJFLEVBQUV5bEQsVUFBV3hxRCxFQUFJK0UsRUFBRTRyQyxLQUFLeU8sYUFBYTcvQyxFQUM1Q2tCLEVBQUV5dUUsZ0JBQWlCN3VFLEdBQy9DLE9BQU84dUUsR0FBRzF1RSxFQUFHc0UsRUFBRXlsRCxTQUFVeHFELEVBQUVpckUsSUFBS2pyRSxFQUFFdXVFLFNBVmxCdjdELENBV2xCdlMsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNYLE1BQU0vQixRQUFVcWlFLEdBQUduaEUsRUFBRTJvRSxXQUFZcmtFLEdBQ1AsR0FBSzFFLEVBQUksSUFBSSt0RSxHQUFHcnBFLEVBQUd4RixFQUFFZ3RELElBQUt2c0QsRUFBSUssRUFBRXVxRSxHQUFHcnJFLEVBQUU0dUQsV0FBWTVqRCxFQUFJdS9DLEdBQUdDLDhDQUE4Qy9vRCxFQUFHTSxHQUFLLFlBQTRCYixFQUFFdWpFLGFBQWNwa0UsRUFBSVMsRUFBRSsrQyxhQUFhcC9DLEVBQzNLUyxFQUFFeXVFLGdCQUFpQjNrRSxHQUMvQzRrRSxHQUFHMXVFLEVBQUdPLEVBQUdwQixFQUFFcXJFLElBQ1gsTUFBTWpuRSxFQUFJLElBQUl3cUUsR0FBR3pwRSxFQUFHL0QsRUFBR1gsR0FDdkIsT0FBT0ksRUFBRXFyRSxHQUFHNzZELElBQUlsTSxFQUFHZixHQUFJdkQsRUFBRXNyRSxHQUFHdCtDLElBQUl6c0IsR0FBS1AsRUFBRXNyRSxHQUFHM3JFLElBQUlZLEdBQUdzQyxLQUFLeUIsR0FBS3RFLEVBQUVzckUsR0FBRzk2RCxJQUFJalEsRUFBRyxDQUFFK0QsSUFBTW5GLEVBQUUydUUsU0FHaER2N0QsZUFBZW84RCxHQUFHM3VFLEVBQUdzRSxHQUN0RCxNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQUlhLEVBQUlOLEVBQUU4cUUsR0FBRzFyRSxJQUFJMkUsR0FBSXhGLEVBQUl5QixFQUFFK3FFLEdBQUczckUsSUFBSWtCLEVBQUVrcEQsVUFDaEQsR0FBSWpyRCxFQUFFbUMsT0FBUyxFQUFHLE9BQU9WLEVBQUUrcUUsR0FBRzk2RCxJQUFJM1AsRUFBRWtwRCxTQUFVanJELEVBQUU0WixPQUFRMVksSUFBTXFpRCxHQUFHcmlELEVBQUdzRSxVQUFZL0QsRUFBRThxRSxHQUFHMzBDLE9BQU9weUIsR0FFcEYvRCxFQUFFa3VFLGlCQUdObHVFLEVBQUU0dEUsa0JBQWtCUyx1QkFBdUIvdEUsRUFBRWtwRCxVQUM3Q3hwRCxFQUFFNHRFLGtCQUFrQnZLLG9CQUFvQi9pRSxFQUFFa3BELGlCQUFtQm1YLEdBQUczZ0UsRUFBRW9vRSxXQUFZOW5FLEVBQUVrcEQsVUFDbkQsR0FBSTc5QyxLQUFLLEtBQ2xDM0wsRUFBRTR0RSxrQkFBa0JVLGdCQUFnQmh1RSxFQUFFa3BELFVBQVd1ZixHQUFHL29FLEVBQUUydEUsWUFBYXJ0RSxFQUFFa3BELFVBQ3JFK2tCLEdBQUd2dUUsRUFBR00sRUFBRWtwRCxZQUNSeGtELE1BQU1pMUQsTUFDUHNVLEdBQUd2dUUsRUFBR00sRUFBRWtwRCxnQkFBaUJtWCxHQUFHM2dFLEVBQUVvb0UsV0FBWTluRSxFQUFFa3BELFVBQ3RCLElBNkQ3QngzQyxlQUFldEssR0FBR2pJLEVBQUdzRSxHQUNyQixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1osSUFDSSxNQUFNQSxRQWwrSFYsU0FBWUEsRUFBR3NFLEdBQ2YsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxFQUFJeUQsRUFBRTBrRCxnQkFDdEIsSUFBSWxxRCxFQUFJeUIsRUFBRTJxRCxHQUNWLE9BQU8zcUQsRUFBRTJjLFlBQVlraEQsZUFBZSxxQkFBc0Isb0JBQXNCcCtELElBQzVFLE1BQU1KLEVBQUlXLEVBQUVpckQsR0FBR3NRLGdCQUFnQixDQUMzQndCLGVBQWUsSUFHWHgrRCxFQUFJeUIsRUFBRTJxRCxHQUNkLE1BQU0zckQsRUFBSSxHQUNWK0UsRUFBRTJrRCxjQUFjcitDLFFBQVEsQ0FBRXRHLEVBQUcxRSxLQUN6QixNQUFNa0ssRUFBSWhMLEVBQUVhLElBQUlDLEdBQ2hCLElBQUtrSyxFQUFHLE9BSUl2SyxFQUFFc0QsS0FBS3RDLEVBQUUwakQsR0FBRzhxQixtQkFBbUIvdUUsRUFBR3NFLEVBQUVxbEQsaUJBQWtCL3BELEdBQUd5TSxLQUFLLElBQU85TCxFQUFFMGpELEdBQUd5ZCxnQkFBZ0IxaEUsRUFBR3NFLEVBQUVtbEQsZUFBZ0I3cEQsS0FDM0gsTUFBTVQsRUFBSW1GLEVBQUVpbEQsWUFFQSxHQUFJcHFELEVBQUVtckQsc0JBQXdCLEVBQUcsQ0FDekMsTUFBTS9tRCxFQUFJdUcsRUFBRTIzRCxnQkFBZ0J0aUUsRUFBRzBCLEdBQUdxN0QsbUJBQW1CbDhELEVBQUV3MUQsdUJBQ3ZEMTJELEVBQUlBLEVBQUV5bkQsT0FBTzNtRCxFQUFHMkQsR0FjaEIsU0FBU3ZELEVBQUdzRSxFQUFHL0QsR0FFWCxPQUFJbzFDLEVBQUVyeEMsRUFBRWlsRCxZQUFZZSxzQkFBd0IsR0FBSSxJQUFNdHFELEVBQUV1cEQsWUFBWWUsd0JBTTVDaG1ELEVBQUUwa0QsZ0JBQWdCZ21CLGlCQUFtQmh2RSxFQUFFZ3BELGdCQUFnQmdtQixrQkFBb0IsS0FNeEV6dUUsRUFBRWtwRCxlQUFlOXlCLEtBQU9wMkIsRUFBRW1wRCxrQkFBa0IveUIsS0FBT3AyQixFQUFFb3BELGlCQUFpQmh6QixLQUFPLEdBZDVHLENBa0JYN3NCLEVBQUd2RyxFQUFHZSxJQUFNL0UsRUFBRXNELEtBQUt0QyxFQUFFMGpELEdBQUdrWSxpQkFBaUJuOEQsRUFBR3VELE9BR3pDLElBQUl1RyxFQUFJdytDLEtBS1IsR0FBSWhrRCxFQUFFNmtELGdCQUFnQnYrQyxRQUFRLENBQUUvSixFQUFHL0IsS0FDL0J3RixFQUFFOGtELHVCQUF1QnA4QixJQUFJbnNCLElBQU10QixFQUFFc0QsS0FBS3RDLEVBQUUyYyxZQUFZODdDLGtCQUFrQmlXLG9CQUFvQmp2RSxFQUFHYSxNQUlyR3RCLEVBQUVzRCxLQUFLODlELEdBQUczZ0UsRUFBR0osRUFBRzBFLEVBQUU2a0QsZ0JBQWlCdG9ELE9BQUcsR0FBUXdMLEtBQU1yTSxJQUNoRDhKLEVBQUk5SixNQUNEYSxFQUFFODRDLFFBQVFILEVBQUdub0MsT0FBUSxDQUN4QixNQUFNL00sRUFBSS9ELEVBQUUwakQsR0FBR3ljLDZCQUE2QjFnRSxHQUFHcU0sS0FBTS9ILEdBQUsvRCxFQUFFMGpELEdBQUdpckIsbUJBQW1CbHZFLEVBQUdBLEVBQUV3MUQsc0JBQXVCMzBELElBQzlHdEIsRUFBRXNELEtBQUt5QixHQUVYLE9BQU8ydUQsR0FBR1EsUUFBUWwwRCxHQUFHOE0sS0FBSyxJQUFPek0sRUFBRXE4RCxNQUFNajhELElBQUtxTSxLQUFLLElBQU85TCxFQUFFbXJELEdBQUcvQyxHQUFHM29ELEVBQUc4SixJQUFLdUMsS0FBSyxJQUFPdkMsS0FDdEZvQyxLQUFNbE0sSUFBTU8sRUFBRTJxRCxHQUFLcHNELEVBQUdrQixJQXk1SE5xbkUsQ0FBRzltRSxFQUFFb29FLFdBQVlya0UsR0FFekJBLEVBQUUya0QsY0FBY3IrQyxRQUFRLENBQUU1SyxFQUFHc0UsS0FDakMsTUFBTXpELEVBQUlOLEVBQUV5ckUsR0FBR3JzRSxJQUFJMkUsR0FDbkJ6RCxJQUdBODBDLEVBQUUzMUMsRUFBRXlwRCxlQUFlOXlCLEtBQU8zMkIsRUFBRTBwRCxrQkFBa0IveUIsS0FBTzMyQixFQUFFMnBELGlCQUFpQmh6QixNQUFRLEdBQ2hGMzJCLEVBQUV5cEQsZUFBZTl5QixLQUFPLEVBQUk5MUIsRUFBRW9wRSxJQUFLLEVBQUtqcUUsRUFBRTBwRCxrQkFBa0IveUIsS0FBTyxFQUFJZ2YsRUFBRTkwQyxFQUFFb3BFLElBQU1qcUUsRUFBRTJwRCxpQkFBaUJoekIsS0FBTyxJQUFNZ2YsRUFBRTkwQyxFQUFFb3BFLElBQ3JIcHBFLEVBQUVvcEUsSUFBSyxZQUNBa0YsR0FBRzV1RSxFQUFHUCxFQUFHc0UsR0FDdEIsTUFBT3RFLFNBQ0N3NkQsR0FBR3g2RCxJQU9iLFNBQVNvdkUsR0FBR3B2RSxFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUlnMUMsRUFBRTcxQyxHQUtSLEdBQUlhLEVBQUU0dEUsaUJBQW1CLElBQXdCbHVFLElBQU1NLEVBQUU0dEUsaUJBQW1CLElBQThCbHVFLEVBQUcsQ0FDN0csTUFBTVAsRUFBSSxHQUNWYSxFQUFFd3FFLEdBQUd6Z0UsUUFBUSxDQUFFckssRUFBR00sS0FDZCxNQUFNL0IsRUFBSStCLEVBQUVxdkMsS0FBS280QixHQUFHaGtFLEdBQ3BCeEYsRUFBRWd2RSxVQUFZOXRFLEVBQUU2QyxLQUFLL0QsRUFBRWd2RSxZQUN0QixTQUFTOXRFLEVBQUdzRSxHQUNiLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWk8sRUFBRWdqRSxZQUFjai9ELEVBQ2hCLElBQUl6RCxHQUFJLEVBQ1JOLEVBQUUyckUsUUFBUXRoRSxRQUFRLENBQUU1SyxFQUFHTyxLQUNuQixJQUFLLE1BQU1QLEtBQUtPLEVBQUV5MEIsVUFFbEJoMUIsRUFBRXNvRSxHQUFHaGtFLEtBQU96RCxHQUFJLEtBQ2ZBLEdBQUt3ckUsR0FBRzlyRSxHQVJaLENBU0hNLEVBQUUraUMsYUFBY3QvQixHQUFJdEUsRUFBRWlCLFFBQVVKLEVBQUVrcUUsR0FBR2pELEdBQUc5bkUsR0FBSWEsRUFBRTBpRSxZQUFjai9ELEVBQUd6RCxFQUFFNHRFLGlCQUFtQjV0RSxFQUFFc3RFLGtCQUFrQmtCLGVBQWUvcUUsSUFjN0hpTyxlQUFlKzhELEdBQUd0dkUsRUFBR3NFLEVBQUcvRCxHQUN4QixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FFUmEsRUFBRXN0RSxrQkFBa0JvQixpQkFBaUJqckUsRUFBRyxXQUFZL0QsR0FDeEQsTUFBTXpCLEVBQUkrQixFQUFFbXJFLEdBQUdyc0UsSUFBSTJFLEdBQUkxRSxFQUFJZCxHQUFLQSxFQUFFdUIsSUFDbEMsR0FBSVQsRUFBRyxDQU9ILElBQUlJLEVBQUksSUFBSW1tRCxHQUFHN0osR0FBR3BDLFlBQ2xCbDZDLEVBQUlBLEVBQUV1bUQsT0FBTzNtRCxFQUFHbS9DLEdBQUc0TCxjQUFjL3FELEVBQUc0NUMsRUFBR25vQyxRQUN2QyxNQUFNOVEsRUFBSXFvRCxLQUFLL2lDLElBQUlqbUIsR0FBSWQsRUFBSSxJQUFJaXFELEdBQUd2UCxFQUFHbm9DLE1BQ2hCLElBQUlqQixJQUNELElBQUkwM0MsR0FBRzlPLEdBQUtoNUMsRUFBR08sU0FDakMwSCxHQUFHcEgsRUFBRy9CLEdBTVorQixFQUFFNnFFLEdBQUs3cUUsRUFBRTZxRSxHQUFHaGxCLE9BQU85bUQsR0FBSWlCLEVBQUVtckUsR0FBR3QxQyxPQUFPcHlCLEdBQUlrckUsR0FBRzN1RSxjQUNqQ3FnRSxHQUFHcmdFLEVBQUU4bkUsV0FBWXJrRSxHQUNBLEdBQUk0SCxLQUFLLElBQU80aUUsR0FBR2p1RSxFQUFHeUQsRUFBRy9ELElBQUtnRixNQUFNaTFELElBR3RFam9ELGVBQWVrOUQsR0FBR3p2RSxFQUFHc0UsR0FDakIsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxFQUFJeUQsRUFBRTB4RCxNQUFNakcsUUFDNUIsSUFDSSxNQUFNL3ZELFFBdG1JZCxTQUFZQSxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1osT0FBT08sRUFBRTJjLFlBQVlraEQsZUFBZSxvQkFBcUIsb0JBQXNCcCtELElBQzNFLE1BQU1hLEVBQUl5RCxFQUFFMHhELE1BQU0vckQsT0FBUW5MLEVBQUl5QixFQUFFaXJELEdBQUdzUSxnQkFBZ0IsQ0FDL0N3QixlQUFlLElBRW5CLE9BQU8sU0FBU3Q5RCxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ3JCLE1BQU0vQixFQUFJeUIsRUFBRXkxRCxNQUFPcDJELEVBQUlkLEVBQUVtTCxPQUN6QixJQUFJMUssRUFBSTB6RCxHQUFHOXRELFVBQ1gsT0FBT3ZGLEVBQUVnTCxRQUFTNUssSUFDZFQsRUFBSUEsRUFBRThNLEtBQUssSUFBT3hMLEVBQUVrN0QsU0FBU3ozRCxFQUFHdEUsSUFBS3FNLEtBQU0vSCxJQUN2QyxNQUFNMUUsRUFBSVcsRUFBRTIxRCxZQUFZdjJELElBQUlLLEdBQzVCMjFDLEVBQUUsT0FBUy8xQyxHQUFJMEUsRUFBRTI2QyxRQUFRekIsVUFBVTU5QyxHQUFLLElBQU1kLEVBQUU0d0Usc0JBQXNCcHJFLEVBQUcvRCxHQUFJK0QsRUFBRXd4RCxtQkFJL0VqMUQsRUFBRTQ4RCxTQUFTbjVELEVBQUcvRCxFQUFFMDFELG9CQUVuQjEyRCxFQUFFOE0sS0FBSyxJQUFPck0sRUFBRXNvRCxHQUFHcW5CLG9CQUFvQnJyRSxFQUFHeEYsSUFaNUMsQ0FnQk55QixFQUFHUCxFQUFHc0UsRUFBR3hGLEdBQUd1TixLQUFLLElBQU92TixFQUFFbTlELE1BQU1qOEQsSUFBS3FNLEtBQUssSUFBTzlMLEVBQUUrbkQsR0FBR3NuQix3QkFBd0I1dkUsSUFBS3FNLEtBQUssSUFBTzlMLEVBQUVtckQsR0FBR2hELEdBQUcxb0QsRUFBR2EsTUFnbEkzRjhwRSxDQUFHcHFFLEVBQUVvb0UsV0FBWXJrRSxHQUt6QnVyRSxHQUFHdHZFLEVBQUdNLEVBQWMsTUFBTzZQLEdBQUduUSxFQUFHTSxHQUFJTixFQUFFNHRFLGtCQUFrQjJCLG9CQUFvQmp2RSxFQUFHLHNCQUNsRnN1RSxHQUFHNXVFLEVBQUdQLEdBQ2QsTUFBT0EsU0FDQ3c2RCxHQUFHeDZELElBSWpCdVMsZUFBZXc5RCxHQUFHL3ZFLEVBQUdzRSxFQUFHL0QsR0FDcEIsTUFBTU0sRUFBSWcxQyxFQUFFNzFDLEdBQ1osSUFDSSxNQUFNQSxRQUFVLFNBQVNBLEVBQUdzRSxHQUN4QixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1osT0FBT08sRUFBRTJjLFlBQVlraEQsZUFBZSxlQUFnQixvQkFBc0JwK0QsSUFDdEUsSUFBSWEsRUFDSixPQUFPTixFQUFFK25ELEdBQUdnUixvQkFBb0J0NUQsRUFBR3NFLEdBQUcrSCxLQUFNL0gsSUFBTXF4QyxFQUFFLE9BQVNyeEMsR0FBSXpELEVBQUl5RCxFQUFFMkYsT0FBUTFKLEVBQUUrbkQsR0FBR3FuQixvQkFBb0IzdkUsRUFBR3NFLEtBQU0rSCxLQUFLLElBQU85TCxFQUFFK25ELEdBQUdzbkIsd0JBQXdCNXZFLElBQUtxTSxLQUFLLElBQU85TCxFQUFFbXJELEdBQUdoRCxHQUFHMW9ELEVBQUdhLE1BSjlLLENBWW5CQSxFQUFFOG5FLFdBQVlya0UsR0FLSHVyRSxHQUFHaHZFLEVBQUd5RCxFQUFHL0QsR0FBSW1RLEdBQUc3UCxFQUFHeUQsR0FBSXpELEVBQUVzdEUsa0JBQWtCMkIsb0JBQW9CeHJFLEVBQUcsV0FBWS9ELFNBQ2hGNHVFLEdBQUd0dUUsRUFBR2IsR0FDZCxNQUFPTyxTQUNDaTZELEdBQUdqNkQsSUE2QmIsU0FBU21RLEdBQUcxUSxFQUFHc0UsSUFDZHRFLEVBQUVzc0UsR0FBRzNzRSxJQUFJMkUsSUFBTSxJQUFJc0csUUFBUzVLLElBQ3pCQSxFQUFFbUYsWUFDRG5GLEVBQUVzc0UsR0FBRzUxQyxPQUFPcHlCLEdBRzJELFNBQVN1ckUsR0FBRzd2RSxFQUFHc0UsRUFBRy9ELEdBQzlGLE1BQU1NLEVBQUlnMUMsRUFBRTcxQyxHQUNaLElBQUlsQixFQUFJK0IsRUFBRXNyRSxHQUFHdHJFLEVBQUVvVixZQUFZMHNELFNBR3ZCLEdBQUk3akUsRUFBRyxDQUNQLE1BQU1rQixFQUFJbEIsRUFBRWEsSUFBSTJFLEdBQ2hCdEUsSUFBTU8sRUFBSVAsRUFBRWtGLE9BQU8zRSxHQUFLUCxFQUFFbUYsVUFBV3JHLEVBQUlBLEVBQUU0bkQsT0FBT3BpRCxJQUFLekQsRUFBRXNyRSxHQUFHdHJFLEVBQUVvVixZQUFZMHNELFNBQVc3akUsR0FJN0YsU0FBU2d3RSxHQUFHOXVFLEVBQUdzRSxFQUFHL0QsRUFBSSxNQUNsQlAsRUFBRW11RSxrQkFBa0JTLHVCQUF1QnRxRSxHQUMzQyxJQUFLLE1BQU16RCxLQUFLYixFQUFFc3JFLEdBQUczckUsSUFBSTJFLEdBQUl0RSxFQUFFcXJFLEdBQUczMEMsT0FBTzcxQixHQUFJTixHQUFLUCxFQUFFK3FFLEdBQUcyQixHQUFHN3JFLEVBQUdOLEdBQ3pEUCxFQUFFc3JFLEdBQUc1MEMsT0FBT3B5QixHQUFJdEUsRUFBRXl1RSxpQkFDbEJ6dUUsRUFBRWlzRSxHQUFHeGUsR0FBR25wRCxHQUFHc0csUUFBU3RHLElBQ2hCdEUsRUFBRWlzRSxHQUFHeEosWUFBWW4rRCxJQUVqQjByRSxHQUFHaHdFLEVBQUdzRSxLQUtsQixTQUFTMHJFLEdBQUdod0UsRUFBR3NFLEdBQ1h0RSxFQUFFeXJFLEdBQUcvMEMsT0FBT3B5QixFQUFFa04sS0FBSytvQyxtQkFHbkIsTUFBTWg2QyxFQUFJUCxFQUFFMHJFLEdBQUcvckUsSUFBSTJFLEdBQ25CLE9BQVMvRCxJQUFNK29FLEdBQUd0cEUsRUFBRWt1RSxZQUFhM3RFLEdBQUlQLEVBQUUwckUsR0FBSzFyRSxFQUFFMHJFLEdBQUdobEIsT0FBT3BpRCxHQUFJdEUsRUFBRWdzRSxHQUFHdDFDLE9BQU9uMkIsR0FBSWl2RSxHQUFHeHZFLElBR25GLFNBQVMwdUUsR0FBRzF1RSxFQUFHc0UsRUFBRy9ELEdBQ2QsSUFBSyxNQUFNTSxLQUFLTixFQUFPTSxhQUFhNHNFLElBQUl6dEUsRUFBRWlzRSxHQUFHM1IsYUFBYXo1RCxFQUFFUixJQUFLaUUsR0FBSTJyRSxHQUFHandFLEVBQUdhLElBQWFBLGFBQWE2c0UsSUFDakd2NEIsRUFBRSxhQUFjLGdDQUFrQ3QwQyxFQUFFUixLQUFNTCxFQUFFaXNFLEdBQUcxUixnQkFBZ0IxNUQsRUFBRVIsSUFBS2lFLEdBQ3RGdEUsRUFBRWlzRSxHQUFHeEosWUFBWTVoRSxFQUFFUixNQUVuQjJ2RSxHQUFHaHdFLEVBQUdhLEVBQUVSLE1BQ0wwb0MsSUFHWCxTQUFTa25DLEdBQUdqd0UsRUFBR3NFLEdBQ1gsTUFBTS9ELEVBQUkrRCxFQUFFakUsSUFBS1EsRUFBSU4sRUFBRWlSLEtBQUsrb0Msa0JBQzVCdjZDLEVBQUUwckUsR0FBRy9yRSxJQUFJWSxJQUFNUCxFQUFFeXJFLEdBQUd6K0MsSUFBSW5zQixLQUFPczBDLEVBQUUsYUFBYywwQkFBNEI1MEMsR0FBSVAsRUFBRXlyRSxHQUFHNWxELElBQUlobEIsR0FDeEYydUUsR0FBR3h2RSxJQVVILFNBQVN3dkUsR0FBR3h2RSxHQUNaLEtBQU1BLEVBQUV5ckUsR0FBRzkwQyxLQUFPLEdBQUszMkIsRUFBRTByRSxHQUFHLzBDLEtBQU8zMkIsRUFBRW91RSwrQkFBaUMsQ0FDbEUsTUFBTTlwRSxFQUFJdEUsRUFBRXlyRSxHQUFHcnVCLFNBQVMvd0MsT0FBT3RNLE1BQy9CQyxFQUFFeXJFLEdBQUcvMEMsT0FBT3B5QixHQUNaLE1BQU0vRCxFQUFJLElBQUkrN0MsR0FBR2pDLEVBQUdrQyxXQUFXajRDLElBQUt6RCxFQUFJYixFQUFFd3NFLEdBQUduZ0UsT0FDN0NyTSxFQUFFZ3NFLEdBQUd4N0QsSUFBSTNQLEVBQUcsSUFBSW10RSxHQUFHenRFLElBQUtQLEVBQUUwckUsR0FBSzFyRSxFQUFFMHJFLEdBQUdubEIsT0FBT2htRCxFQUFHTSxHQUFJb29FLEdBQUdqcEUsRUFBRWt1RSxZQUFhLElBQUkvWCxHQUFHaFUsR0FBR1QsR0FBR25oRCxFQUFFaVIsT0FBUTNRLEVBQUcsRUFBMEJ5M0MsRUFBR1EsS0FJbkl2bUMsZUFBZTQ4RCxHQUFHbnZFLEVBQUdzRSxFQUFHL0QsR0FDcEIsTUFBTU0sRUFBSWcxQyxFQUFFNzFDLEdBQUlsQixFQUFJLEdBQUljLEVBQUksR0FBSUwsRUFBSSxHQUNwQ3NCLEVBQUV3cUUsR0FBR3poRSxZQUFjL0ksRUFBRXdxRSxHQUFHemdFLFFBQVEsQ0FBRTVLLEVBQUc4SixLQUNqQ3ZLLEVBQUVzRCxLQUFLaEMsRUFBRXdyRSxHQUFHdmlFLEVBQUd4RixFQUFHL0QsR0FBRzJMLEtBQU1sTSxJQUN2QixHQUFJQSxFQUFHLENBQ0hhLEVBQUU0dEUsaUJBQW1CNXRFLEVBQUVzdEUsa0JBQWtCb0IsaUJBQWlCemxFLEVBQUVpZ0QsU0FBVS9wRCxFQUFFMC9ELFVBQVksY0FBZ0IsV0FDcEc1Z0UsRUFBRStELEtBQUs3QyxHQUNQLE1BQU1zRSxFQUFJbTdELEdBQUczVixHQUFHaGdELEVBQUVpZ0QsU0FBVS9wRCxHQUM1QkosRUFBRWlELEtBQUt5QixlQUdSZSxRQUFRZ1osSUFBSTllLEdBQUlzQixFQUFFa3FFLEdBQUdqRCxHQUFHaHBFLFNBQVV5VCxlQUFldlMsRUFBR3NFLEdBQzNELE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixVQUNVTyxFQUFFMmMsWUFBWWtoRCxlQUFlLHlCQUEwQixZQUFjcCtELEdBQUtpekQsR0FBR3JvRCxRQUFRdEcsRUFBSUEsR0FBSzJ1RCxHQUFHcm9ELFFBQVF0RyxFQUFFK2tELEdBQUt4b0QsR0FBS04sRUFBRTJjLFlBQVk4N0Msa0JBQWtCc0IsYUFBYXQ2RCxFQUFHc0UsRUFBRXlsRCxTQUFVbHBELElBQUt3TCxLQUFLLElBQU80bUQsR0FBR3JvRCxRQUFRdEcsRUFBRXNsRCxHQUFLL29ELEdBQUtOLEVBQUUyYyxZQUFZODdDLGtCQUFrQnVCLGdCQUFnQnY2RCxFQUFHc0UsRUFBRXlsRCxTQUFVbHBELE9BQ2hTLE1BQU9iLEdBQ0wsSUFBSzQwRCxHQUFHNTBELEdBQUksTUFBTUEsRUFLbEJtMUMsRUFBRSxhQUFjLHNDQUF3Q24xQyxHQUU1RCxJQUFLLE1BQU1BLEtBQUtzRSxFQUFHLENBQ2YsTUFBTUEsRUFBSXRFLEVBQUUrcEQsU0FDWixJQUFLL3BELEVBQUUwL0QsVUFBVyxDQUNkLE1BQU0xL0QsRUFBSU8sRUFBRTJxRCxHQUFHdnJELElBQUkyRSxHQUFJekQsRUFBSWIsRUFBRWdwRCxnQkFBaUJscUQsRUFBSWtCLEVBQUVrd0UsaUNBQWlDcnZFLEdBRXJFTixFQUFFMnFELEdBQUszcUQsRUFBRTJxRCxHQUFHM0UsT0FBT2ppRCxFQUFHeEYsS0FqQkx5VCxDQW9CM0MxUixFQUFFOG5FLFdBQVkvb0UsSUFHcEIyUyxlQUFlNDlELEdBQUdud0UsRUFBR3NFLEdBQ2pCLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixJQUFLTyxFQUFFMFYsWUFBWTBqQyxRQUFRcjFDLEdBQUksQ0FDM0I2d0MsRUFBRSxhQUFjLHlCQUEwQjd3QyxFQUFFcStELFNBQzVDLE1BQU0zaUUsUUFBVXFnRSxHQUFHOS9ELEVBQUVvb0UsV0FBWXJrRSxHQUNqQy9ELEVBQUUwVixZQUFjM1IsRUFFaEIsU0FBU3RFLEVBQUdzRSxHQUNSdEUsRUFBRXNzRSxHQUFHMWhFLFFBQVM1SyxJQUNWQSxFQUFFNEssUUFBUzVLLElBQ1BBLEVBQUVrRixPQUFPLElBQUk2eEMsRUFBRWpCLEVBQUVFLFVBR3hCLHlFQURJaDJDLEVBQUVzc0UsR0FBRzFrQyxRQUxkLENBTUVybkMsR0FFRkEsRUFBRTR0RSxrQkFBa0JpQyxpQkFBaUI5ckUsRUFBR3RFLEVBQUV1Z0UsZ0JBQWlCdmdFLEVBQUV3Z0UscUJBQXNCMk8sR0FBRzV1RSxFQUFHUCxFQUFFNHJELEtBSW5HLFNBQVN5a0IsR0FBR3J3RSxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQUlhLEVBQUlOLEVBQUV5ckUsR0FBR3JzRSxJQUFJMkUsR0FDN0IsR0FBSXpELEdBQUtBLEVBQUVvcEUsR0FBSSxPQUFPcmhCLEtBQUsvaUMsSUFBSWhsQixFQUFFUixLQUNqQyxDQUNJLElBQUlMLEVBQUk0b0QsS0FDUixNQUFNL25ELEVBQUlOLEVBQUUrcUUsR0FBRzNyRSxJQUFJMkUsR0FDbkIsSUFBS3pELEVBQUcsT0FBT2IsRUFDZixJQUFLLE1BQU1zRSxLQUFLekQsRUFBRyxDQUNmLE1BQU1BLEVBQUlOLEVBQUU4cUUsR0FBRzFyRSxJQUFJMkUsR0FDbkJ0RSxFQUFJQSxFQUFFK2pFLFVBQVVsakUsRUFBRXF2QyxLQUFLZzZCLElBRTNCLE9BQU9scUUsR0FPWHVTLGVBQWUrOUQsR0FBR3R3RSxFQUFHc0UsR0FDckIsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxRQUFVc2dFLEdBQUc1Z0UsRUFBRW9vRSxXQUFZcmtFLEVBQUVzTyxPQUNuQixHQUFLOVQsRUFBSXdGLEVBQUU0ckMsS0FBSzI2QixHQUFHaHFFLEdBQzdDLE9BQU9OLEVBQUVrdUUsaUJBQW1CQyxHQUFHbnVFLEVBQUcrRCxFQUFFeWxELFNBQVVqckQsRUFBRTByRSxJQUFLMXJFLEVBUXpEeVQsZUFBZWcrRCxHQUFHdndFLEdBQ2QsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLE9BQU9zaEUsR0FBR2g5RCxFQUFFcWtFLFlBQVl6OEQsS0FBTWxNLEdBQUttdkUsR0FBRzdxRSxFQUFHdEUsSUFLN0N1UyxlQUFlaStELEdBQUd4d0UsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUN2QixNQUFNL0IsRUFBSSsyQyxFQUFFNzFDLEdBQUlKLFFBQVUsU0FBU0ksRUFBR3NFLEdBQ2xDLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FBSWEsRUFBSWcxQyxFQUFFdDFDLEVBQUUrbkQsSUFDeEIsT0FBTy9uRCxFQUFFMmMsWUFBWWtoRCxlQUFlLDRCQUE2QixXQUFhcCtELEdBQUthLEVBQUUyL0MsR0FBR3hnRCxFQUFHc0UsR0FBRytILEtBQU0vSCxHQUFLQSxFQUFJL0QsRUFBRW1yRCxHQUFHaEQsR0FBRzFvRCxFQUFHc0UsR0FBSzJ1RCxHQUFHOXRELFFBQVEsUUFGbEgsQ0FLekJyRyxFQUFFNnBFLFdBQVlya0UsR0FDZixPQUFTMUUsR0FBSyxZQUFjVyxRQUl0QnlwRSxHQUFHbHJFLEVBQUVvdkUsYUFBZSxpQkFBbUIzdEUsR0FBSyxhQUFlQSxHQUdqRXN2RSxHQUFHL3dFLEVBQUd3RixFQUFHekQsR0FBSyxNQUFPNlAsR0FBRzVSLEVBQUd3RixHQUFJLFNBQVN0RSxFQUFHc0UsR0FDdkN1eEMsRUFBRUEsRUFBRTcxQyxHQUFHc29ELElBQUkzSCxHQUFHcjhDLEdBRGEsQ0FJOUJ4RixFQUFFNnBFLFdBQVlya0UsSUFBTXlrQyxVQUFXb21DLEdBQUdyd0UsRUFBR2MsSUFRdEN1MUMsRUFBRSxhQUFjLHdDQUEwQzd3QyxHQStDOURpTyxlQUFlaytELEdBQUd6d0UsRUFBR3NFLEVBQUcvRCxHQUNwQixNQUFNTSxFQUFJZzFDLEVBQUU3MUMsR0FBSWxCLEVBQUksR0FBSWMsRUFBSSxHQUM1QixJQUFLLE1BQU1JLEtBQUtzRSxFQUFHLENBQ2YsSUFBSUEsRUFDSixNQUFNL0QsRUFBSU0sRUFBRXlxRSxHQUFHM3JFLElBQUlLLEdBQ25CLEdBQUlPLEdBQUssSUFBTUEsRUFBRVUsT0FBUSxDQUtyQnFELFFBQVV3OEQsR0FBR2pnRSxFQUFFOG5FLFdBQVl4bUIsR0FBRzVoRCxFQUFFLEtBQ2hDLElBQUssTUFBTVAsS0FBS08sRUFBRyxDQUNmLE1BQU0rRCxFQUFJekQsRUFBRXdxRSxHQUFHMXJFLElBQUlLLEdBQUlPLFFBQVUrdkUsR0FBR3p2RSxFQUFHeUQsR0FDdkMvRCxFQUFFdXRFLFVBQVlsdUUsRUFBRWlELEtBQUt0QyxFQUFFdXRFLGVBRXhCLENBR0gsTUFBTXZ0RSxRQUFVOGdFLEdBQUd4Z0UsRUFBRThuRSxXQUFZM29FLEdBQ2pDc0UsUUFBVXc4RCxHQUFHamdFLEVBQUU4bkUsV0FBWXBvRSxTQUFVaXVFLEdBQUczdEUsRUFBRzZ2RSxHQUFHbndFLEdBQUlQLEdBQ3JDLEdBRWpCbEIsRUFBRStELEtBQUt5QixHQUVYLE9BQU96RCxFQUFFa3FFLEdBQUdqRCxHQUFHbG9FLEdBQUlkLEVBY3ZCLFNBQVM0eEUsR0FBRzF3RSxHQUNSLE9BQU95aEQsR0FBR3poRCxFQUFFd1IsS0FBTXhSLEVBQUV3L0MsZ0JBQWlCeC9DLEVBQUV5L0MsUUFBU3ovQyxFQUFFMC9DLFFBQVMxL0MsRUFBRW02QyxNQUFPLElBQWtCbjZDLEVBQUUyL0MsUUFBUzMvQyxFQUFFNC9DLE9BS3ZHLFNBQVMrd0IsR0FBRzN3RSxHQUNSLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWixPQUFPNjFDLEVBQUVBLEVBQUV2eEMsRUFBRXFrRSxZQUFZenJELGFBQWE0cUMsS0FLMUN2MUMsZUFBZXErRCxHQUFHNXdFLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDdkIsTUFBTS9CLEVBQUkrMkMsRUFBRTcxQyxHQUNaLEdBQUlsQixFQUFFMnRFLEdBR050M0IsRUFBRSxhQUFjLHNEQUF1RCxHQUFJcjJDLEVBQUV3c0UsR0FBR3QrQyxJQUFJMW9CLEdBQUksT0FBUS9ELEdBQzlGLElBQUssVUFDTCxJQUFLLGNBQ0gsQ0FDSSxNQUFNUCxRQUFVc2hFLEdBQUd4aUUsRUFBRTZwRSxZQUFhOW5FLEVBQUlrb0QsR0FBRzhuQiw2Q0FBNkN2c0UsRUFBRyxZQUFjL0QsU0FDakc0dUUsR0FBR3J3RSxFQUFHa0IsRUFBR2EsR0FDZixNQUdOLElBQUssaUJBQ0dxZ0UsR0FBR3BpRSxFQUFFNnBFLFdBQVlya0UsR0FDTyxHQUFLd3FFLEdBQUdod0UsRUFBR3dGLEVBQUd6RCxHQUM1QyxNQUVGLFFBQ0Vrb0MsS0FJOER4MkIsZUFBZXUrRCxHQUFHOXdFLEVBQUdzRSxFQUFHL0QsR0FDMUYsTUFBTU0sRUFBSXl0RSxHQUFHdHVFLEdBQ2IsR0FBSWEsRUFBRTRyRSxHQUFJLENBQ04sSUFBSyxNQUFNenNFLEtBQUtzRSxFQUFHLENBQ2YsR0FBSXpELEVBQUV5cUUsR0FBR3QrQyxJQUFJaHRCLEdBQUksQ0FFYm0xQyxFQUFFLGFBQWMsbUNBQXFDbjFDLEdBQ3JELFNBRUosTUFBTXNFLFFBQVUrOEQsR0FBR3hnRSxFQUFFOG5FLFdBQVkzb0UsR0FBSU8sUUFBVXVnRSxHQUFHamdFLEVBQUU4bkUsV0FBWXJrRSxTQUMxRGtxRSxHQUFHM3RFLEVBQUc2dkUsR0FBR3BzRSxHQUFJL0QsRUFBRXdwRCxVQUNSLEdBQUtrZixHQUFHcG9FLEVBQUVxdEUsWUFBYTN0RSxHQUV4QyxJQUFLLE1BQU1QLEtBQUtPLEVBR2hCTSxFQUFFeXFFLEdBQUd0K0MsSUFBSWh0QixVQUVIa2hFLEdBQUdyZ0UsRUFBRThuRSxXQUFZM29FLEdBQ08sR0FBSWtNLEtBQUssS0FDbkNvOUQsR0FBR3pvRSxFQUFFcXRFLFlBQWFsdUUsR0FBSTh1RSxHQUFHanVFLEVBQUdiLEtBQzVCdUYsTUFBTWkxRCxLQUlsQixTQUFTOFQsR0FBR3R1RSxHQUNSLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWixPQUFPc0UsRUFBRTRwRSxZQUFZckYsYUFBYWlCLGlCQUFtQjdoRSxHQUFHM0gsS0FBSyxLQUFNZ0UsR0FBSUEsRUFBRTRwRSxZQUFZckYsYUFBYS9kLHVCQUF5QnVsQixHQUFHL3ZFLEtBQUssS0FBTWdFLEdBQ3pJQSxFQUFFNHBFLFlBQVlyRixhQUFhZSxhQUFlMEYsR0FBR2h2RSxLQUFLLEtBQU1nRSxHQUFJQSxFQUFFeW1FLEdBQUdqRCxHQUFLMEUsR0FBR2xzRSxLQUFLLEtBQU1nRSxFQUFFcy9CLGNBQ3RGdC9CLEVBQUV5bUUsR0FBRzJCLEdBQUtELEdBQUduc0UsS0FBSyxLQUFNZ0UsRUFBRXMvQixjQUFldC9CLEVBRzdDLFNBQVN5c0UsR0FBRy93RSxHQUNSLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWixPQUFPc0UsRUFBRTRwRSxZQUFZckYsYUFBYTRCLHFCQUF1QmdGLEdBQUdudkUsS0FBSyxLQUFNZ0UsR0FBSUEsRUFBRTRwRSxZQUFZckYsYUFBYStCLGtCQUFvQm1GLEdBQUd6dkUsS0FBSyxLQUFNZ0UsR0FDeElBLEVBaUZKLE1BQU0wc0UsR0FDRixjQUNJdnZFLEtBQUt3dkUsaUJBQWtCLEVBRTNCLGlCQUFpQmp4RSxHQUNieUIsS0FBSzBJLEVBQUkyOEQsR0FBRzltRSxFQUFFeWtFLGFBQWFwWixZQUFhNXBELEtBQUswc0Usa0JBQW9CMXNFLEtBQUtzckUsR0FBRy9zRSxHQUFJeUIsS0FBS3liLFlBQWN6YixLQUFLdXJFLEdBQUdodEUsU0FDbEd5QixLQUFLeWIsWUFBWWljLFFBQVMxM0IsS0FBS3l2RSxZQUFjenZFLEtBQUt3ckUsR0FBR2p0RSxHQUFJeUIsS0FBS2tuRSxXQUFhbG5FLEtBQUtnc0UsR0FBR3p0RSxHQUU3RixHQUFHQSxHQUNDLE9BQU8sS0FFWCxHQUFHQSxHQUNDLE9BQU9vZ0UsR0FBRzMrRCxLQUFLeWIsWUFBYSxJQUFJMmlELEdBQUk3L0QsRUFBRW14RSxZQUFhMXZFLEtBQUswSSxHQUU1RCxHQUFHbkssR0FDQyxPQUFPLElBQUkwaUUsR0FBR0csR0FBR3RTLEdBQUk5dUQsS0FBSzBJLEdBRTlCLEdBQUduSyxHQUNDLE9BQU8sSUFBSWdrRSxHQUVmLGtCQUNJdmlFLEtBQUt5dkUsYUFBZXp2RSxLQUFLeXZFLFlBQVlwRyxhQUFjcnBFLEtBQUswc0Usa0JBQWtCclAsaUJBQ3BFcjlELEtBQUt5YixZQUFZNGhELFlBTTNCLE1BQU1zUyxXQUFXSixHQUNqQixZQUFZaHhFLEVBQUdzRSxFQUFHL0QsR0FDZHFJLFFBQVNuSCxLQUFLaXNFLEdBQUsxdEUsRUFBR3lCLEtBQUs0dkUsZUFBaUIvc0UsRUFBRzdDLEtBQUs2dkUsZUFBaUIvd0UsRUFBR2tCLEtBQUt3dkUsaUJBQWtCLEVBRW5HLGlCQUFpQmp4RSxTQUNQNEksTUFBTTZtQyxXQUFXenZDLFNBN3pJL0J1UyxlQUFrQnZTLEdBQ2QsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLE9BQU9zRSxFQUFFNFksWUFBWWtoRCxlQUFlLDZDQUE4QyxXQUFhcCtELEdBQUssU0FBU0EsR0FDekcsTUFBTXNFLEVBQUkyNEQsR0FBR2o5RCxHQUVMLElBQUlPLEVBQUlpNUMsRUFBR25vQyxNQUNuQixPQUFPL00sRUFBRSs1QyxHQUFHLENBQ1I0VyxNQUFPdkUsR0FBR0ksY0FDVnFFLFNBQVMsR0FDVixDQUFFbjFELEVBQUdzRSxFQUFHekQsS0FDUHlELEVBQUVrc0QsV0FBYWp3RCxFQUFJdTJELEdBQUd4eUQsRUFBRWtzRCxXQUFZM3ZELEVBQUVtMEQsU0FDdEMzb0QsS0FBSyxJQUFPOUwsR0FUZ0YsQ0FVbEdQLElBQUtrTSxLQUFNbE0sSUFDVHNFLEVBQUVnbkQsR0FBS3RyRCxJQWd6STBCdW5FLENBQUc5bEUsS0FBS2tuRSxrQkFBbUJsbkUsS0FBS2lzRSxHQUFHaitCLFdBQVdodUMsS0FBTXpCLFNBRS9FK3dFLEdBQUd0dkUsS0FBS2lzRSxHQUFHaEssa0JBQW1Cc0csR0FBR3ZvRSxLQUFLaXNFLEdBQUdRLG1CQUd6Q3pzRSxLQUFLeWIsWUFBWW9vQyxHQUFHLEtBQVE3akQsS0FBS3l2RSxjQUFnQnp2RSxLQUFLeXZFLFlBQVk1UyxTQUFXNzhELEtBQUt5dkUsWUFBWS8zQyxNQUFNMTNCLEtBQUtrbkUsWUFDL0d0akUsUUFBUUYsWUFFWixHQUFHbkYsR0FDQyxPQUFPb2dFLEdBQUczK0QsS0FBS3liLFlBQWEsSUFBSTJpRCxHQUFJNy9ELEVBQUVteEUsWUFBYTF2RSxLQUFLMEksR0FFNUQsR0FBR25LLEdBQ0MsTUFBTXNFLEVBQUk3QyxLQUFLeWIsWUFBWTg3QyxrQkFBa0I4QixpQkFDN0MsT0FBTyxJQUFJRCxHQUFHdjJELEVBQUd0RSxFQUFFKzZELFlBRXZCLEdBQUcvNkQsR0FDQyxNQUFNc0UsRUFBSXk2RCxHQUFHLytELEVBQUV5a0UsYUFBYXBaLFdBQVlyckQsRUFBRXlrRSxhQUFhOXlCLGdCQUFpQnB4QyxPQUFJLElBQVdrQixLQUFLNHZFLGVBQWlCalosR0FBR21aLGNBQWM5dkUsS0FBSzR2RSxnQkFBa0JqWixHQUFHUyxRQUN4SixPQUFPLElBQUlxRixHQUFHejhELEtBQUt3dkUsZ0JBQWlCM3NFLEVBQUd0RSxFQUFFcXlELFNBQVU5eEQsRUFBR1AsRUFBRSs2RCxXQUFZNkwsS0FBTUMsS0FBTXBsRSxLQUFLMEksRUFBRzFJLEtBQUswc0Usb0JBQXFCMXNFLEtBQUs2dkUsZ0JBRTNILEdBQUd0eEUsR0FDQyxPQUFPLElBQUlna0UsSUFXZixNQUFNd04sV0FBV0osR0FDakIsWUFBWXB4RSxFQUFHc0UsR0FDWHNFLE1BQU01SSxFQUFHc0UsR0FBeUIsR0FBSzdDLEtBQUtpc0UsR0FBSzF0RSxFQUFHeUIsS0FBSzR2RSxlQUFpQi9zRSxFQUFHN0MsS0FBS3d2RSxpQkFBa0IsRUFFeEcsaUJBQWlCanhFLFNBQ1A0SSxNQUFNNm1DLFdBQVd6dkMsR0FDdkIsTUFBTXNFLEVBQUk3QyxLQUFLaXNFLEdBQUdoSyxXQUNsQmppRSxLQUFLMHNFLDZCQUE2QjFLLEtBQU9oaUUsS0FBSzBzRSxrQkFBa0J6SyxXQUFhLENBQ3pFek0sR0FBSXVaLEdBQUdsd0UsS0FBSyxLQUFNZ0UsR0FDbEI0eUQsR0FBSTBaLEdBQUd0d0UsS0FBSyxLQUFNZ0UsR0FDbEI2eUQsR0FBSTJaLEdBQUd4d0UsS0FBSyxLQUFNZ0UsR0FDbEJ3akQsR0FBSTZvQixHQUFHcndFLEtBQUssS0FBTWdFLEdBQ2xCeXlELEdBQUl3WixHQUFHandFLEtBQUssS0FBTWdFLFVBQ2I3QyxLQUFLMHNFLGtCQUFrQmgxQyxlQUcxQjEzQixLQUFLeWIsWUFBWW9vQyxHQUFHLE1BQUMveUMsVUF6VG5DQSxlQUFrQnZTLEVBQUdzRSxHQUNqQixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1osR0FBSXN1RSxHQUFHL3RFLEdBQUl3d0UsR0FBR3h3RSxJQUFJLElBQU8rRCxJQUFLLElBQU8vRCxFQUFFa3NFLEdBQUksQ0FPdkMsTUFBTXpzRSxFQUFJTyxFQUFFNHRFLGtCQUFrQnNELDJCQUE0Qm50RSxRQUFVbXNFLEdBQUdsd0UsRUFBR1AsRUFBRXM2QyxXQUM1RS81QyxFQUFFa3NFLElBQUssUUFBVTVCLEdBQUd0cUUsRUFBRTJ0RSxhQUFhLEdBQ25DLElBQUssTUFBTWx1RSxLQUFLc0UsRUFBRzJrRSxHQUFHMW9FLEVBQUUydEUsWUFBYWx1RSxRQUNsQyxJQUFJLElBQU9zRSxJQUFLLElBQU8vRCxFQUFFa3NFLEdBQUksQ0FDaEMsTUFBTXpzRSxFQUFJLEdBQ1YsSUFBSXNFLEVBQUllLFFBQVFGLFVBQ2hCNUUsRUFBRStxRSxHQUFHMWdFLFFBQVEsQ0FBRS9KLEVBQUcvQixLQUNkeUIsRUFBRTR0RSxrQkFBa0J1RCxtQkFBbUI1eUUsR0FBS2tCLEVBQUU2QyxLQUFLL0QsR0FBS3dGLEVBQUlBLEVBQUU0SCxLQUFLLEtBQVE0aUUsR0FBR3Z1RSxFQUFHekIsR0FDakZvaUUsR0FBRzNnRSxFQUFFb29FLFdBQVk3cEUsR0FDWSxLQUFRd3FFLEdBQUcvb0UsRUFBRTJ0RSxZQUFhcHZFLFdBQ2hEd0YsUUFBU21zRSxHQUFHbHdFLEVBQUdQLEdBRTFCLFNBQVNBLEdBQ0wsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNac0UsRUFBRTBuRSxHQUFHcGhFLFFBQVEsQ0FBRTVLLEVBQUdPLEtBQ2Qrb0UsR0FBR2hsRSxFQUFFNHBFLFlBQWEzdEUsS0FDakIrRCxFQUFFMm5FLEdBQUd0ZSxLQUFNcnBELEVBQUUwbkUsR0FBSyxJQUFJNTdELElBQUs5TCxFQUFFb25FLEdBQUssSUFBSXZsQixHQUFHN0osR0FBR3BDLFlBSnJELENBaUJDMzVDLEdBQUlBLEVBQUVrc0UsSUFBSyxRQUFVNUIsR0FBR3RxRSxFQUFFMnRFLGFBQWEsSUFvUjlCeUQsQ0FBR2x3RSxLQUFLaXNFLEdBQUdoSyxXQUFZMWpFLEdBQUl5QixLQUFLeXZFLGNBQWdCbHhFLElBQU15QixLQUFLeXZFLFlBQVk1UyxRQUFVNzhELEtBQUt5dkUsWUFBWS8zQyxNQUFNMTNCLEtBQUtrbkUsWUFBYzNvRSxHQUFLeUIsS0FBS3l2RSxZQUFZcEcsVUFHL0osR0FBRzlxRSxHQUNDLE1BQU1zRSxFQUFJc2lFLEtBQ1YsSUFBS25ELEdBQUd6bkIsR0FBRzEzQyxHQUFJLE1BQU0sSUFBSXl5QyxFQUFFakIsRUFBRWEsY0FBZSxtRkFDNUMsTUFBTXAyQyxFQUFJdytELEdBQUcvK0QsRUFBRXlrRSxhQUFhcFosV0FBWXJyRCxFQUFFeWtFLGFBQWE5eUIsZ0JBQ3ZELE9BQU8sSUFBSTh4QixHQUFHbi9ELEVBQUd0RSxFQUFFKzZELFdBQVl4NkQsRUFBR1AsRUFBRXF5RCxTQUFVcnlELEVBQUVteEUsY0FPcEQsTUFBTVMsR0FDTixpQkFBaUI1eEUsRUFBR3NFLEdBQ2hCN0MsS0FBS2tuRSxhQUFlbG5FLEtBQUtrbkUsV0FBYTNvRSxFQUFFMm9FLFdBQVlsbkUsS0FBSzBzRSxrQkFBb0JudUUsRUFBRW11RSxrQkFDL0Uxc0UsS0FBS21uRSxVQUFZbm5FLEtBQUtvd0UsZ0JBQWdCdnRFLEdBQUk3QyxLQUFLeXNFLFlBQWN6c0UsS0FBS3F3RSxrQkFBa0J4dEUsR0FDcEY3QyxLQUFLbWlDLGFBQWVuaUMsS0FBS3N3RSxtQkFBbUJ6dEUsR0FBSTdDLEtBQUtpaUUsV0FBYWppRSxLQUFLdXdFLGlCQUFpQjF0RSxHQUNsRXRFLEVBQUVpeEUsaUJBQWtCeHZFLEtBQUswc0Usa0JBQWtCeEssbUJBQXFCM2pFLEdBQUtvdkUsR0FBRzN0RSxLQUFLaWlFLFdBQVkxakUsRUFBRyxHQUNsSHlCLEtBQUt5c0UsWUFBWXJGLGFBQWFvSix1QkFBeUI5QixHQUFHN3ZFLEtBQUssS0FBTW1CLEtBQUtpaUUsa0JBQ3BFbUgsR0FBR3BwRSxLQUFLeXNFLFlBQWF6c0UsS0FBS2lpRSxXQUFXK0ssa0JBRS9DLG1CQUFtQnp1RSxHQUNmLE9BQU8sSUFBSWlzRSxHQUVmLGdCQUFnQmpzRSxHQUNaLE1BQU1zRSxFQUFJd2lFLEdBQUc5bUUsRUFBRXlrRSxhQUFhcFosWUFBYTlxRCxHQUFLTSxFQUFJYixFQUFFeWtFLGFBQWMsSUFBSUQsR0FBRzNqRSxJQUN6RSxJQUFJQSxFQUM2RCxPQUFPLFNBQVNiLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDdEYsT0FBTyxJQUFJeW5FLEdBQUd0b0UsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUQ2QyxDQUV0RWIsRUFBRXVvRSxnQkFBaUJ2b0UsRUFBRXdvRSxvQkFBcUJqb0UsRUFBRytELEdBRW5ELGtCQUFrQnRFLEdBQ2QsT0FBT3NFLEVBQUk3QyxLQUFLa25FLFdBQVlwb0UsRUFBSWtCLEtBQUttbkUsVUFBVy9uRSxFQUFJYixFQUFFKzZELFdBQVlqOEQsRUFBSWtCLEdBQUtvdkUsR0FBRzN0RSxLQUFLaWlFLFdBQVkxakUsRUFBRyxHQUNsR0osRUFBSXNrRSxHQUFHbG9CLEtBQU8sSUFBSWtvQixHQUFLLElBQUlELEdBQUksSUFBSXlFLEdBQUdwa0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxHQUNsRCxJQUFJMEUsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUVwQixpQkFBaUJJLEVBQUdzRSxHQUNoQixPQUFPLFNBQVN0RSxFQUFHc0UsRUFBRy9ELEVBRXRCTSxFQUFHL0IsRUFBR2MsRUFBR0wsR0FDTCxNQUFNdUssRUFBSSxJQUFJbWtFLEdBQUdqdUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsR0FDaEMsT0FBT0wsSUFBTXVLLEVBQUUyaUUsSUFBSyxHQUFLM2lFLEVBSnRCLENBS0xySSxLQUFLa25FLFdBQVlsbkUsS0FBS3lzRSxZQUFhenNFLEtBQUttaUMsYUFBY25pQyxLQUFLMHNFLGtCQUFtQm51RSxFQUFFbXhFLFlBQWFueEUsRUFBRW91RSw4QkFBK0I5cEUsR0FFcEksWUFDSSxPQUFPaU8sZUFBZXZTLEdBQ2xCLE1BQU1zRSxFQUFJdXhDLEVBQUU3MUMsR0FDWm0xQyxFQUFFLGNBQWUsOEJBQStCN3dDLEVBQUUyL0QsR0FBR3ArQyxJQUFJLFNBQXlCa2pELEdBQUd6a0UsR0FDckZBLEVBQUU2L0QsR0FBR3JGLFdBR0x4NkQsRUFBRWlnRSxHQUFHL3pELElBQUksV0FOTitCLENBT0w5USxLQUFLeXNFOzs7Ozs7Ozs7Ozs7Ozs7O0dBK0JmLFNBQVNnRSxHQUFHbHlFLEVBQUdzRSxFQUFJLE9BQ2YsSUFBSS9ELEVBQUksRUFLSixNQUFPLENBRVAsYUFDSSxHQUFJQSxFQUFJUCxFQUFFOHNFLFdBQVksQ0FDbEIsTUFBTWpzRSxFQUFJLENBQ05kLE1BQU9DLEVBQUU0UCxNQUFNclAsRUFBR0EsRUFBSStELEdBQ3RCMHdELE1BQU0sR0FFVixPQUFPejBELEdBQUsrRCxFQUFHekQsRUFFbkIsTUFBTyxDQUNIbTBELE1BQU0sSUFHZCxpQkFDQSxnQkFDQTN2QixPQUFRaGdDLFFBQVFILE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEMvQixNQUFNaXRFLEdBQ0YsWUFBWW55RSxHQUNSeUIsS0FBSzJLLFNBQVdwTSxFQUtoQnlCLEtBQUsyd0UsT0FBUSxFQUVqQixLQUFLcHlFLEdBQ0R5QixLQUFLMkssU0FBU0MsTUFBUTVLLEtBQUtrc0UsR0FBR2xzRSxLQUFLMkssU0FBU0MsS0FBTXJNLEdBRXRELE1BQU1BLEdBQ0Z5QixLQUFLMkssU0FBUzVILE1BQVEvQyxLQUFLa3NFLEdBQUdsc0UsS0FBSzJLLFNBQVM1SCxNQUFPeEUsR0FBS3VFLFFBQVFDLE1BQU0sdUNBQXdDeEUsR0FFbEgsS0FDSXlCLEtBQUsyd0UsT0FBUSxFQUVqQixHQUFHcHlFLEVBQUdzRSxHQUNGN0MsS0FBSzJ3RSxPQUFTMTlELFdBQVcsS0FDckJqVCxLQUFLMndFLE9BQVNweUUsRUFBRXNFLElBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUJSLE1BQU0rdEUsR0FDTixZQUVBcnlFLEVBQUdzRSxHQUNDN0MsS0FBS3VzRSxHQUFLaHVFLEVBQUd5QixLQUFLMEksRUFBSTdGLEVBRXRCN0MsS0FBSzhWLFNBQVcsSUFBSXkvQixFQUtwQnYxQyxLQUFLazVELE9BQVMsSUFBSXhxQixXQUFZMXVDLEtBQUt3c0UsR0FBSyxJQUFJcUUsWUFBWSxTQUV4RDd3RSxLQUFLNHNFLEtBQUtuaUUsS0FBTWxNLElBQ1pBLEdBQUtBLEVBQUVtcEUsS0FBTzFuRSxLQUFLOFYsU0FBU3BTLFFBQVFuRixFQUFFZ0csUUFBUXVSLFVBQVk5VixLQUFLOFYsU0FBU3JTLE9BQU8sSUFBSWxELE1BQU0sMEVBQTBFeUUsS0FBS0MsVUFBVSxNQUFRMUcsT0FBSSxFQUFTQSxFQUFFZ0csWUFDeE1oRyxHQUFLeUIsS0FBSzhWLFNBQVNyUyxPQUFPbEYsSUFFbkMsUUFDSSxPQUFPeUIsS0FBS3VzRSxHQUFHbHBDLFNBRW5CLG9CQUNJLE9BQU9yakMsS0FBSzhWLFNBQVNuUyxRQUV6QixXQUVJLGFBQWEzRCxLQUFLMDdELGNBQWUxN0QsS0FBSzRzRSxLQVduQyxXQUNILE1BQU1ydUUsUUFBVXlCLEtBQUsrc0UsS0FDckIsR0FBSSxPQUFTeHVFLEVBQUcsT0FBTyxLQUN2QixNQUFNc0UsRUFBSTdDLEtBQUt3c0UsR0FBR3NFLE9BQU92eUUsR0FBSU8sRUFBSTRVLE9BQU83USxHQUN4QzhRLE1BQU03VSxJQUFNa0IsS0FBS2t0RSxHQUFHLGtCQUFrQnJxRSwwQkFDdEMsTUFBTXpELFFBQVVZLEtBQUsrd0UsR0FBR2p5RSxHQUN4QixPQUFPLElBQUlzc0UsR0FBR3BtRSxLQUFLbVAsTUFBTS9VLEdBQUliLEVBQUVpQixPQUFTVixHQUVhLEtBQ3JELE9BQU9rQixLQUFLazVELE9BQU84WCxVQUFXenlFLEdBQUtBLElBQU0sSUFBSWtCLFdBQVcsSUFPckQsV0FDSCxLQUFNTyxLQUFLd0csS0FBTyxVQUNKeEcsS0FBSzJ0RSxPQUlYLEdBQUksSUFBTTN0RSxLQUFLazVELE9BQU8xNUQsT0FBUSxPQUFPLEtBQzdDLE1BQU1qQixFQUFJeUIsS0FBS3dHLEtBR1BqSSxFQUFJLEdBQUt5QixLQUFLa3RFLEdBQUcsK0RBQ3pCLE1BQU1ycUUsRUFBSTdDLEtBQUtrNUQsT0FBTy9xRCxNQUFNLEVBQUc1UCxHQUV2QixPQUFPeUIsS0FBS2s1RCxPQUFTbDVELEtBQUtrNUQsT0FBTy9xRCxNQUFNNVAsR0FBSXNFLEVBT2hELFNBQVN0RSxHQUNaLEtBQU15QixLQUFLazVELE9BQU8xNUQsT0FBU2pCLFNBQ2pCeUIsS0FBSzJ0RSxNQUFRM3RFLEtBQUtrdEUsR0FBRyxvREFFL0IsTUFBTXJxRSxFQUFJN0MsS0FBS3dzRSxHQUFHc0UsT0FBTzl3RSxLQUFLazVELE9BQU8vcUQsTUFBTSxFQUFHNVAsSUFFdEMsT0FBT3lCLEtBQUtrNUQsT0FBU2w1RCxLQUFLazVELE9BQU8vcUQsTUFBTTVQLEdBQUlzRSxFQUV2RCxHQUFHdEUsR0FFQyxNQUFNeUIsS0FBS3VzRSxHQUFHbHBDLFNBQVUsSUFBSTlpQyxNQUFNLDBCQUEwQmhDLEdBS3pELFdBQ0gsTUFBTUEsUUFBVXlCLEtBQUt1c0UsR0FBRzBFLE9BQ3hCLElBQUsxeUUsRUFBRWcxRCxLQUFNLENBQ1QsTUFBTTF3RCxFQUFJLElBQUk2ckMsV0FBVzF1QyxLQUFLazVELE9BQU8xNUQsT0FBU2pCLEVBQUVELE1BQU1rQixRQUN0RHFELEVBQUVrTSxJQUFJL08sS0FBS2s1RCxRQUFTcjJELEVBQUVrTSxJQUFJeFEsRUFBRUQsTUFBTzBCLEtBQUtrNUQsT0FBTzE1RCxRQUFTUSxLQUFLazVELE9BQVNyMkQsRUFFMUUsT0FBT3RFLEVBQUVnMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QmpCLE1BQU0yZCxHQUNGLFlBQVkzeUUsR0FDUnlCLEtBQUttbkUsVUFBWTVvRSxFQUVqQnlCLEtBQUtteEUsYUFBZSxJQUFJeGlFLElBQUszTyxLQUFLeXVELFVBQVksR0FBSXp1RCxLQUFLb3hFLFdBQVksRUFLbkVweEUsS0FBS3F4RSxlQUFpQixLQU90QnJ4RSxLQUFLc3hFLFlBQWMsSUFBSXZtRCxJQUUzQixhQUFheHNCLEdBQ1QsR0FBSXlCLEtBQUt1eEUsd0JBQXlCdnhFLEtBQUt5dUQsVUFBVWp2RCxPQUFTLEVBQUcsTUFBTSxJQUFJODFDLEVBQUVqQixFQUFFSSxpQkFBa0IsOEVBQzdGLE1BQU01eEMsUUFBVWlPLGVBQWV2UyxFQUFHc0UsR0FDOUIsTUFBTS9ELEVBQUlzMUMsRUFBRTcxQyxHQUFJYSxFQUFJeXJELEdBQUcvckQsRUFBRTRKLEdBQUssYUFBY3JMLEVBQUksQ0FDNUM0dUQsVUFBV3BwRCxFQUFFMFQsSUFBS2hZLEdBQUtpc0QsR0FBRzFyRCxFQUFFNEosRUFBR25LLEtBQ2hDSixRQUFVVyxFQUFFMjZELEdBQUcsb0JBQXFCcjZELEVBQUcvQixHQUFJUyxFQUFJLElBQUk2USxJQUN0RHhRLEVBQUVnTCxRQUFTNUssSUFDUCxNQUFNc0UsRUF6K1N0QixTQUFZdEUsRUFBR3NFLEdBQ1gsTUFBTyxVQUFXQSxFQUFJLFNBQVN0RSxFQUFHc0UsR0FDOUJxeEMsSUFBSXJ4QyxFQUFFMnVFLE9BQVEzdUUsRUFBRTJ1RSxNQUFNNXpFLEtBQU1pRixFQUFFMnVFLE1BQU03dUIsV0FDcEMsTUFBTTdqRCxFQUFJMnJELEdBQUdsc0QsRUFBR3NFLEVBQUUydUUsTUFBTTV6RSxNQUFPd0IsRUFBSStxRCxHQUFHdG5ELEVBQUUydUUsTUFBTTd1QixZQUFhdGxELEVBQUksSUFBSXUvQyxHQUFHLENBQ2xFM0MsU0FBVSxDQUNOZCxPQUFRdDJDLEVBQUUydUUsTUFBTXI0QixVQUd4QixPQUFPbUUsR0FBR3lOLGlCQUFpQmpzRCxFQUFHTSxFQUFHL0IsR0FQZixDQVFwQmtCLEVBQUdzRSxHQUFLLFlBQWFBLEVBQUksU0FBU3RFLEVBQUdzRSxHQUNuQ3F4QyxJQUFJcnhDLEVBQUU0dUUsU0FBVXY5QixJQUFJcnhDLEVBQUVrc0QsVUFDdEIsTUFBTWp3RCxFQUFJMnJELEdBQUdsc0QsRUFBR3NFLEVBQUU0dUUsU0FBVXJ5RSxFQUFJK3FELEdBQUd0bkQsRUFBRWtzRCxVQUNyQyxPQUFPelIsR0FBRzRMLGNBQWNwcUQsRUFBR00sR0FISixDQUl6QmIsRUFBR3NFLEdBQUt5a0MsSUE0OVNZb3FDLENBQUc1eUUsRUFBRTRKLEVBQUduSyxHQUNsQlQsRUFBRWlSLElBQUlsTSxFQUFFakUsSUFBSThHLFdBQVk3QyxLQUU1QixNQUFNd0YsRUFBSSxHQUNWLE9BQU94RixFQUFFc0csUUFBUzVLLElBQ2QsTUFBTXNFLEVBQUkvRSxFQUFFSSxJQUFJSyxFQUFFbUgsWUFDbEJ3dUMsSUFBSXJ4QyxHQUFJd0YsRUFBRWpILEtBQUt5QixLQUNkd0YsRUFaT3lJLENBYWQ5USxLQUFLbW5FLFVBQVc1b0UsR0FDbEIsT0FBT3NFLEVBQUVzRyxRQUFTNUssR0FBS3lCLEtBQUsyeEUsY0FBY3B6RSxJQUFNc0UsRUFFcEQsSUFBSXRFLEVBQUdzRSxHQUNIN0MsS0FBSzI2QixNQUFNOTNCLEVBQUUrdUUsV0FBV3J6RSxFQUFHeUIsS0FBS3VqRCxhQUFhaGxELEtBQU15QixLQUFLc3hFLFlBQVlsdEQsSUFBSTdsQixFQUFFbUgsWUFFOUUsT0FBT25ILEVBQUdzRSxHQUNOLElBQ0k3QyxLQUFLMjZCLE1BQU05M0IsRUFBRSt1RSxXQUFXcnpFLEVBQUd5QixLQUFLNnhFLHNCQUFzQnR6RSxLQUN4RCxNQUFPQSxHQUNMeUIsS0FBS3F4RSxlQUFpQjl5RSxFQUUxQnlCLEtBQUtzeEUsWUFBWWx0RCxJQUFJN2xCLEVBQUVtSCxZQUUzQixPQUFPbkgsR0FDSHlCLEtBQUsyNkIsTUFBTSxJQUFJd3BCLEdBQUc1bEQsRUFBR3lCLEtBQUt1akQsYUFBYWhsRCxLQUFNeUIsS0FBS3N4RSxZQUFZbHRELElBQUk3bEIsRUFBRW1ILFlBRXhFLGVBQ0ksR0FBSTFGLEtBQUt1eEUsd0JBQXlCdnhFLEtBQUtxeEUsZUFBZ0IsTUFBTXJ4RSxLQUFLcXhFLGVBQ2xFLE1BQU05eUUsRUFBSXlCLEtBQUtteEUsYUFFUG54RSxLQUFLeXVELFVBQVV0bEQsUUFBU3RHLElBQzVCdEUsRUFBRTAyQixPQUFPcHlCLEVBQUVqRSxJQUFJOEcsY0FJbkJuSCxFQUFFNEssUUFBUSxDQUFFNUssRUFBR3NFLEtBQ1gsTUFBTS9ELEVBQUkrN0MsR0FBR3dtQixTQUFTeCtELEdBQ3RCN0MsS0FBS3l1RCxVQUFVcnRELEtBQUssSUFBSWdqRCxHQUFHdGxELEVBQUdrQixLQUFLdWpELGFBQWF6a0QsYUFDekNnUyxlQUFldlMsRUFBR3NFLEdBQ3pCLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FBSWEsRUFBSXlyRCxHQUFHL3JELEVBQUU0SixHQUFLLGFBQWNyTCxFQUFJLENBQzVDdXBFLE9BQVEvakUsRUFBRTBULElBQUtoWSxHQUFLeXNELEdBQUdsc0QsRUFBRTRKLEVBQUduSyxXQUUxQk8sRUFBRWk2RCxHQUFHLFNBQVUzNUQsRUFBRy9CLEdBSmpCeVQsQ0FLVDlRLEtBQUttbkUsVUFBV25uRSxLQUFLeXVELFdBQVl6dUQsS0FBS294RSxXQUFZLEVBRXhELGNBQWM3eUUsR0FDVixJQUFJc0UsRUFDSixHQUFJdEUsRUFBRTBpRCxrQkFBbUJwK0MsRUFBSXRFLEVBQUVpL0MsWUFBYyxDQUN6QyxJQUFLai9DLEVBQUUyMkQsZUFBZ0IsTUFBTTV0QixJQUU3QnprQyxFQUFJazFDLEVBQUdub0MsTUFFWCxNQUFNOVEsRUFBSWtCLEtBQUtteEUsYUFBYWp6RSxJQUFJSyxFQUFFSyxJQUFJOEcsWUFDdEMsR0FBSTVHLEdBQ0EsSUFBSytELEVBQUVxMUMsUUFBUXA1QyxHQUVmLE1BQU0sSUFBSXcyQyxFQUFFakIsRUFBRVcsUUFBUyxvREFDcEJoMUMsS0FBS214RSxhQUFhcGlFLElBQUl4USxFQUFFSyxJQUFJOEcsV0FBWTdDLEdBSzVDLGFBQWF0RSxHQUNoQixNQUFNc0UsRUFBSTdDLEtBQUtteEUsYUFBYWp6RSxJQUFJSyxFQUFFbUgsWUFDbEMsT0FBUTFGLEtBQUtzeEUsWUFBWS9sRCxJQUFJaHRCLEVBQUVtSCxhQUFlN0MsRUFBSTYvQyxHQUFHQyxXQUFXOS9DLEdBQUs2L0MsR0FBR21KLE9BSXJFLHNCQUFzQnR0RCxHQUN6QixNQUFNc0UsRUFBSTdDLEtBQUtteEUsYUFBYWp6RSxJQUFJSyxFQUFFbUgsWUFHMUIsSUFBSzFGLEtBQUtzeEUsWUFBWS9sRCxJQUFJaHRCLEVBQUVtSCxhQUFlN0MsRUFBRyxDQUNsRCxHQUFJQSxFQUFFcTFDLFFBQVFILEVBQUdub0MsT0FVakIsTUFBTSxJQUFJMGxDLEVBQUVqQixFQUFFSSxpQkFBa0IsK0NBRXBCLE9BQU9pTyxHQUFHQyxXQUFXOS9DLEdBSXJDLE9BQU82L0MsR0FBR0UsUUFBTyxHQUVyQixNQUFNcmtELEdBQ0Z5QixLQUFLdXhFLHdCQUF5QnZ4RSxLQUFLeXVELFVBQVVydEQsS0FBSzdDLEdBRXREOzs7Ozs7Ozs7Ozs7Ozs7O0dBdUJKLE1BQU11ekUsR0FDRixZQUFZdnpFLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDakJZLEtBQUtzNUQsV0FBYS82RCxFQUFHeUIsS0FBS21uRSxVQUFZdGtFLEVBQUc3QyxLQUFLK3hFLGVBQWlCanpFLEVBQUdrQixLQUFLeXBFLFNBQVdycUUsRUFDbEZZLEtBQUs2dEUsR0FBSyxFQUFHN3RFLEtBQUtnK0QsR0FBSyxJQUFJc0gsR0FBR3RsRSxLQUFLczVELFdBQVkscUJBRWEsTUFDNUR0NUQsS0FBSzZ0RSxJQUFNLEVBQUc3dEUsS0FBS2d1RSxLQUV2QixLQUNJaHVFLEtBQUtnK0QsR0FBR3ZDLEdBQUcsVUFDUCxNQUFNbDlELEVBQUksSUFBSTJ5RSxHQUFHbHhFLEtBQUttbkUsV0FBWXRrRSxFQUFJN0MsS0FBS3N1RSxHQUFHL3ZFLEdBQzlDc0UsR0FBS0EsRUFBRTRILEtBQU01SCxJQUNUN0MsS0FBS3M1RCxXQUFXeUQsaUJBQWlCLElBQU94K0QsRUFBRXl6RSxTQUFTdm5FLEtBQUssS0FDcER6SyxLQUFLeXBFLFNBQVMvbEUsUUFBUWIsS0FDdEJpQixNQUFPdkYsSUFDUHlCLEtBQUtpeUUsR0FBRzF6RSxRQUVadUYsTUFBT3ZGLElBQ1B5QixLQUFLaXlFLEdBQUcxekUsT0FJcEIsR0FBR0EsR0FDQyxJQUNJLE1BQU1zRSxFQUFJN0MsS0FBSyt4RSxlQUFleHpFLEdBQzlCLE9BQVFnOEMsR0FBRzEzQyxJQUFNQSxFQUFFaUIsT0FBU2pCLEVBQUU0SCxLQUFPNUgsR0FBSzdDLEtBQUt5cEUsU0FBU2htRSxPQUFPbEQsTUFBTSwrQ0FDckUsTUFDRixNQUFPaEMsR0FFTCxPQUFPeUIsS0FBS3lwRSxTQUFTaG1FLE9BQU9sRixHQUFJLE1BR3hDLEdBQUdBLEdBQ0N5QixLQUFLNnRFLEdBQUssR0FBSzd0RSxLQUFLaVAsR0FBRzFRLElBQU15QixLQUFLNnRFLElBQU0sRUFBRzd0RSxLQUFLczVELFdBQVd5RCxpQkFBaUIsS0FBUS84RCxLQUFLZ3VFLEtBQ3pGcHFFLFFBQVFGLGFBQWdCMUQsS0FBS3lwRSxTQUFTaG1FLE9BQU9sRixHQUVqRCxHQUFHQSxHQUNDLEdBQUksa0JBQW9CQSxFQUFFWCxLQUFNLENBRzVCLE1BQU1pRixFQUFJdEUsRUFBRXlJLEtBQ1osTUFBTyxZQUFjbkUsR0FBSyx3QkFBMEJBLElBQU0yaEQsR0FBRzNoRCxHQUVqRSxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBeUJmLE1BQU1xdkUsR0FDRixZQUFZM3pFLEVBQUdzRSxFQVNmL0QsRUFBR00sR0FDQ1ksS0FBSzhtRSxnQkFBa0J2b0UsRUFBR3lCLEtBQUsrbUUsb0JBQXNCbGtFLEVBQUc3QyxLQUFLczVELFdBQWF4NkQsRUFBR2tCLEtBQUtnakUsYUFBZTVqRSxFQUNqR1ksS0FBS3FVLEtBQU8yK0IsRUFBRUUsZ0JBQWlCbHpDLEtBQUs0d0QsU0FBV3RaLEVBQUc2NkIsSUFBS255RSxLQUFLb3lFLHVCQUF5QixJQUFNeHVFLFFBQVFGLFVBQ25HMUQsS0FBSzhtRSxnQkFBZ0JwdkMsTUFBTTU0QixFQUFHLE1BQUNnUyxJQUMzQjRpQyxFQUFFLGtCQUFtQixpQkFBa0JuMUMsRUFBRTJGLFdBQVlsRSxLQUFLb3lFLHVCQUF1Qjd6RSxHQUNqRnlCLEtBQUtxVSxLQUFPOVYsSUFHaEJ5QixLQUFLK21FLG9CQUFvQnJ2QyxNQUFNNTRCLEVBQUcsSUFBTzhFLFFBQVFGLFdBRXJELHlCQUNJLE1BQU8sQ0FDSDQxRCxXQUFZdDVELEtBQUtzNUQsV0FDakIwSixhQUFjaGpFLEtBQUtnakUsYUFDbkJwUyxTQUFVNXdELEtBQUs0d0QsU0FDZmtXLGdCQUFpQjltRSxLQUFLOG1FLGdCQUN0QkMsb0JBQXFCL21FLEtBQUsrbUUsb0JBQzFCMkksWUFBYTF2RSxLQUFLcVUsS0FDbEJzNEQsOEJBQStCLEtBR3ZDLDRCQUE0QnB1RSxHQUN4QnlCLEtBQUtveUUsdUJBQXlCN3pFLEVBSzNCLHNCQUNILEdBQUl5QixLQUFLczVELFdBQVcrWSxlQUFnQixNQUFNLElBQUkvOEIsRUFBRWpCLEVBQUVVLG9CQUFxQiwyQ0FFM0UsWUFDSS8wQyxLQUFLczVELFdBQVc4RCxzQkFDaEIsTUFBTTcrRCxFQUFJLElBQUlnM0MsRUFDZCxPQUFPdjFDLEtBQUtzNUQsV0FBV2daLG9DQUFvQyxVQUN2RCxJQUNJdHlFLEtBQUt1eUUsd0JBQTBCdnlFLEtBQUt1eUUsaUJBQWlCQyxZQUFheHlFLEtBQUt5eUUseUJBQTJCenlFLEtBQUt5eUUsa0JBQWtCRCxZQUl6SHh5RSxLQUFLOG1FLGdCQUFnQnpKLFdBQVlyOUQsS0FBSyttRSxvQkFBb0IxSixXQUFZOStELEVBQUVtRixVQUMxRSxNQUFPYixHQUNMLE1BQU0vRCxFQUFJOHFFLEdBQUcvbUUsRUFBRyxrQ0FDaEJ0RSxFQUFFa0YsT0FBTzNFLE1BRVpQLEVBQUVvRixTQUlmbU4sZUFBZTRoRSxHQUFHbjBFLEVBQUdzRSxHQUNqQnRFLEVBQUUrNkQsV0FBV3FaLDRCQUE2QmovQixFQUFFLGtCQUFtQix5Q0FDL0QsTUFBTTUwQyxRQUFVUCxFQUFFcTBFLHlCQUNaL3ZFLEVBQUVtckMsV0FBV2x2QyxHQUNuQixJQUFJTSxFQUFJTixFQUFFNHdFLFlBQ1ZueEUsRUFBRXMwRSw0QkFBNEIsTUFBQy9oRSxJQUMzQjFSLEVBQUU4NEMsUUFBUTM1QyxXQUFhcWdFLEdBQUcvN0QsRUFBRXFrRSxXQUFZM29FLEdBQUlhLEVBQUliLEtBSXBEc0UsRUFBRTRZLFlBQVlxM0QsMkJBQTJCLElBQU92MEUsRUFBRWkwRSxhQUFlajBFLEVBQUVrMEUsa0JBQW9CNXZFLEVBRzNGaU8sZUFBZWlpRSxHQUFHeDBFLEVBQUdzRSxHQUNqQnRFLEVBQUUrNkQsV0FBV3FaLDRCQUNiLE1BQU03ekUsUUFBVWswRSxHQUFHejBFLEdBQ25CbTFDLEVBQUUsa0JBQW1CLHdDQUNyQixNQUFNdDBDLFFBQVViLEVBQUVxMEUseUJBQ1ovdkUsRUFBRW1yQyxXQUFXbHZDLEVBQUdNLEdBR3RCYixFQUFFczBFLDRCQUE2QnQwRSxHQUFLdVMsZUFBZXZTLEVBQUdzRSxHQUNsRCxNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1pPLEVBQUV3NkQsV0FBV3FaLDRCQUE2QmovQixFQUFFLGNBQWUsd0NBQzNELE1BQU10MEMsRUFBSWlvRSxHQUFHdm9FLEdBSUxBLEVBQUUwakUsR0FBR3ArQyxJQUFJLFNBQWlDa2pELEdBQUd4b0UsR0FBSU0sR0FFekROLEVBQUVna0UsR0FBRy96RCxJQUFJLGlCQUFnQ2pRLEVBQUVzb0UsYUFBYW9KLHVCQUF1QjN0RSxHQUMvRS9ELEVBQUUwakUsR0FBR3Z0QyxPQUFPLFNBQWlDc3lDLEdBQUd6b0UsR0FWaEJnUyxDQVdsQ2pPLEVBQUU0cEUsWUFBYWx1RSxJQUFNQSxFQUFFZzBFLGlCQUFtQjF2RSxFQUdoRGlPLGVBQWVraUUsR0FBR3owRSxHQUNkLE9BQU9BLEVBQUVrMEUsb0JBQXNCLytCLEVBQUUsa0JBQW1CLGdEQUM5Q2cvQixHQUFHbjBFLEVBQUcsSUFBSWd4RSxLQUFNaHhFLEVBQUVrMEUsa0JBRzVCM2hFLGVBQWVtaUUsR0FBRzEwRSxHQUNkLE9BQU9BLEVBQUVnMEUsbUJBQXFCNytCLEVBQUUsa0JBQW1CLCtDQUM3Q3EvQixHQUFHeDBFLEVBQUcsSUFBSTR4RSxLQUFNNXhFLEVBQUVnMEUsaUJBRzVCLFNBQVNXLEdBQUczMEUsR0FDUixPQUFPeTBFLEdBQUd6MEUsR0FBR2tNLEtBQU1sTSxHQUFLQSxFQUFFa2QsYUFHOUIsU0FBUzAzRCxHQUFHNTBFLEdBQ1IsT0FBT3kwRSxHQUFHejBFLEdBQUdrTSxLQUFNbE0sR0FBS0EsRUFBRTJvRSxZQUc5QixTQUFTa00sR0FBRzcwRSxHQUNSLE9BQU8wMEUsR0FBRzEwRSxHQUFHa00sS0FBTWxNLEdBQUtBLEVBQUVrdUUsYUFHOUIsU0FBUzRHLEdBQUc5MEUsR0FDUixPQUFPMDBFLEdBQUcxMEUsR0FBR2tNLEtBQU1sTSxHQUFLQSxFQUFFMGpFLFlBRzlCbnhELGVBQWV3aUUsR0FBRy8wRSxHQUNkLE1BQU1zRSxRQUFVb3dFLEdBQUcxMEUsR0FBSU8sRUFBSStELEVBQUVzL0IsYUFDN0IsT0FBT3JqQyxFQUFFNnJFLFNBQVdpQyxHQUFHL3RFLEtBQUssS0FBTWdFLEVBQUVvL0QsWUFBYW5qRSxFQUFFZ3NFLFdBQWFvQyxHQUFHcnVFLEtBQUssS0FBTWdFLEVBQUVvL0QsWUFDaEZuakUsRUFpREosU0FBU3kwRSxHQUFHaDFFLEVBQUdzRSxFQUFHL0QsRUFBSSxJQUNsQixNQUFNTSxFQUFJLElBQUltMkMsRUFDZCxPQUFPaDNDLEVBQUUrNkQsV0FBV3lELGlCQUFpQixTQUFhLFNBQVN4K0QsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDbkUsTUFBTWMsRUFBSSxJQUFJdXlFLEdBQUcsQ0FDYjlsRSxLQUFNek0sSUFHRjBFLEVBQUVrNkQsaUJBQWlCLElBQU84TixHQUFHdHNFLEVBQUdULElBQ2hDLE1BQU11SyxFQUFJbEssRUFBRXdpRSxLQUFLcDFDLElBQUl6c0IsSUFDcEJ1SixHQUFLbEssRUFBRTgvRCxVQVFSNWdFLEVBQUVvRyxPQUFPLElBQUk2eEMsRUFBRWpCLEVBQUVlLFlBQWEsMERBQTREL3NDLEdBQUtsSyxFQUFFOC9ELFdBQWE3K0QsR0FBSyxXQUFhQSxFQUFFOEQsT0FBUzdGLEVBQUVvRyxPQUFPLElBQUk2eEMsRUFBRWpCLEVBQUVlLFlBQWEsOEtBQWdMLzNDLEVBQUVxRyxRQUFRdkYsSUFFdlc0RSxNQUFPeEUsR0FBS2xCLEVBQUVvRyxPQUFPbEYsS0FDckJULEVBQUksSUFBSW10RSxHQUFHaHJCLEdBQUduaEQsRUFBRWlSLE1BQU81UixFQUFHLENBQzFCK3NFLHdCQUF3QixFQUN4QnBELElBQUksSUFFUixPQUFPNEMsR0FBR25zRSxFQUFHVCxHQXRCaUMsT0F1QjFDdzFFLEdBQUcvMEUsR0FBSUEsRUFBRSs2RCxXQUFZejJELEVBQUcvRCxFQUFHTSxJQUFNQSxFQUFFdUUsUUFzQi9DLFNBQVM2dkUsR0FBR2oxRSxFQUFHc0UsRUFBRy9ELEVBQUksSUFDbEIsTUFBTU0sRUFBSSxJQUFJbTJDLEVBQ2QsT0FBT2gzQyxFQUFFKzZELFdBQVd5RCxpQkFBaUIsU0FBYSxTQUFTeCtELEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEdBQ25FLE1BQU1jLEVBQUksSUFBSXV5RSxHQUFHLENBQ2I5bEUsS0FBTTlMLElBR0YrRCxFQUFFazZELGlCQUFpQixJQUFPOE4sR0FBR3RzRSxFQUFHVCxJQUFNZ0IsRUFBRW0vRCxXQUFhLFdBQWE3K0QsRUFBRThELE9BQVM3RixFQUFFb0csT0FBTyxJQUFJNnhDLEVBQUVqQixFQUFFZSxZQUFhLGlMQUFtTC8zQyxFQUFFcUcsUUFBUTVFLElBRTVTaUUsTUFBT3hFLEdBQUtsQixFQUFFb0csT0FBT2xGLEtBQ3JCVCxFQUFJLElBQUltdEUsR0FBR25zRSxFQUFHWCxFQUFHLENBQ2pCK3NFLHdCQUF3QixFQUN4QnBELElBQUksSUFFUixPQUFPNEMsR0FBR25zRSxFQUFHVCxHQVppQyxPQWExQ3cxRSxHQUFHLzBFLEdBQUlBLEVBQUUrNkQsV0FBWXoyRCxFQUFHL0QsRUFBR00sSUFBTUEsRUFBRXVFLFFBeUMvQyxTQUFTOHZFLEdBQUdsMUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqQixNQUFNL0IsRUFBSSxTQUFTa0IsRUFBR3NFLEdBQ2xCLElBQUkvRCxFQUVKLE9BREFBLEVBQUksaUJBQW1CUCxHQUFJLElBQUs4dkMsYUFBYUMsT0FBTy92QyxHQUFLQSxFQUNsRCxTQUFTQSxFQUFHc0UsR0FDZixPQUFPLElBQUkrdEUsR0FBR3J5RSxFQUFHc0UsR0FEZCxDQUVMLFNBQVN0RSxFQUFHc0UsR0FDVixHQUFJdEUsYUFBYW13QyxXQUFZLE9BQU8raEMsR0FBR2x5RSxFQUFHc0UsR0FDMUMsR0FBSXRFLGFBQWFpd0MsWUFBYSxPQUFPaWlDLEdBQUcsSUFBSS9oQyxXQUFXbndDLEdBQUlzRSxHQUMzRCxHQUFJdEUsYUFBYW0xRSxlQUFnQixPQUFPbjFFLEVBQUVvMUUsWUFDMUMsTUFBTSxJQUFJcHpFLE1BQU0sNEVBSmxCLENBS0F6QixHQUFJK0Q7Ozs7Ozs7Ozs7Ozs7Ozs7R0FWQSxDQTJCVC9ELEVBQUd1bUUsR0FBR3hpRSxJQUNQdEUsRUFBRSs2RCxXQUFXeUQsaUJBQWlCLFdBbDlCOUIsU0FBWXgrRCxFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUlnMUMsRUFBRTcxQyxJQUVSLGVBQWdCQSxFQUFHc0UsRUFBRy9ELEdBQ3RCLElBQ0ksTUFBTU0sUUFBVXlELEVBQUU2NEQsY0FDbEIsU0FBVSxTQUFTbjlELEVBQUdzRSxHQUNsQixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQUlhLEVBQUkrcUQsR0FBR3RuRCxFQUFFb3VELFlBQ3pCLE9BQU9ueUQsRUFBRTJjLFlBQVlraEQsZUFBZSxpQkFBa0IsV0FBYXArRCxHQUFLTyxFQUFFK2pELEdBQUcrd0Isa0JBQWtCcjFFLEVBQUdzRSxFQUFFc0QsS0FBTXNFLEtBQU1sTSxLQUFPQSxHQUFLQSxFQUFFMHlELFdBQVdsVixVQUFVMzhDLElBQU0sR0FGbkosQ0FNakJiLEVBQUUyb0UsV0FBWTluRSxHQUFJLGFBQWF5RCxFQUFFZ0ksYUFBYy9MLEVBQUUrMEUsY0FBYyxTQUFTdDFFLEdBQzdELE1BQU8sQ0FDSHN0RSxVQUFXLFVBQ1hILGdCQUFpQm50RSxFQUFFdXRFLGVBQ25CTCxZQUFhbHRFLEVBQUV3dEUsV0FDZkQsZUFBZ0J2dEUsRUFBRXV0RSxlQUNsQkMsV0FBWXh0RSxFQUFFd3RFLFlBTmtDLENBUXREM3NFLElBQ0ZOLEVBQUVnMUUsZ0JBQWdCdEksR0FBR3BzRSxJQUNyQixNQUFNL0IsRUFBSSxJQUFJa3VFLEdBQUduc0UsRUFBR2IsRUFBRTJvRSxXQUFZcmtFLEVBQUU2RixHQUNwQyxJQUFJdkssUUFBVTBFLEVBQUV1b0UsS0FDaEIsS0FBTWp0RSxHQUFLLENBQ1AsTUFBTUksUUFBVWxCLEVBQUUwcUUsR0FBRzVwRSxHQUNyQkksR0FBS08sRUFBRWcxRSxnQkFBZ0J2MUUsR0FBSUosUUFBVTBFLEVBQUV1b0UsS0FFM0MsTUFBTXR0RSxRQUFVVCxFQUFFeU4saUJBSUE0aUUsR0FBR252RSxFQUFHVCxFQUFFOG9ELFFBQ1IsU0FFWixTQUFTcm9ELEVBQUdzRSxHQUNkLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixPQUFPTyxFQUFFMmMsWUFBWWtoRCxlQUFlLGNBQWUsWUFBY3ArRCxHQUFLTyxFQUFFK2pELEdBQUdreEIsbUJBQW1CeDFFLEVBQUdzRSxJQUYvRixDQU9idEUsRUFBRTJvRSxXQUFZOW5FLEdBQUlOLEVBQUUrMEUsY0FBYy8xRSxFQUFFMi9ELFVBQy9CLE1BQU9sL0QsR0FDTHcxQyxFQUFFLGFBQWMsOEJBQThCeDFDLEdBQU1PLEVBQUVrMUUsVUFBVXoxRTs7Ozs7Ozs7Ozs7Ozs7OztJQXpDcEUsQ0ErREhhLEVBQUd5RCxFQUFHL0QsR0FBRzJMLEtBQUssS0FDWHJMLEVBQUVzdEUsa0JBQWtCdUgsdUJBZzVCcEJDLE9BQVNiLEdBQUc5MEUsR0FBSWxCLEVBQUcrQixLQVczQixNQUFNKzBFLEdBa0JGLFlBQVk1MUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsRUFBR0wsRUFBR3VLLEdBQzdCckksS0FBSzRwRCxXQUFhcnJELEVBQUd5QixLQUFLaWlCLE1BQVFwZixFQUFHN0MsS0FBS2t3QyxlQUFpQnB4QyxFQUFHa0IsS0FBSzZTLEtBQU96VCxFQUFHWSxLQUFLaWpFLElBQU01bEUsRUFDeEYyQyxLQUFLa2pFLGlCQUFtQi9rRSxFQUFHNkIsS0FBS21qRSxzQkFBd0JybEUsRUFBR2tDLEtBQUtvakUsZ0JBQWtCLzZELEdBUzFGLE1BQU0rckUsR0FDRixZQUFZNzFFLEVBQUdzRSxHQUNYN0MsS0FBS2lFLFVBQVkxRixFQUFHeUIsS0FBS3E4QyxTQUFXeDVDLEdBQUssWUFFN0Msd0JBQ0ksTUFBTyxjQUFnQjdDLEtBQUtxOEMsU0FFaEMsUUFBUTk5QyxHQUNKLE9BQU9BLGFBQWE2MUUsSUFBTTcxRSxFQUFFMEYsWUFBY2pFLEtBQUtpRSxXQUFhMUYsRUFBRTg5QyxXQUFhcjhDLEtBQUtxOEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnBGLE1BQU1nNEIsR0FBSyxJQUFJMWxFOzs7Ozs7Ozs7Ozs7Ozs7O0dBc0JuQixTQUFTOEwsR0FBR2xjLEVBQUdzRSxFQUFHL0QsR0FDZCxJQUFLQSxFQUFHLE1BQU0sSUFBSXcyQyxFQUFFakIsRUFBRUksaUJBQWtCLFlBQVlsMkMsc0NBQXNDc0UsTUFNMUYsU0FBU3l4RSxHQUFHLzFFLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FDckIsSUFBSSxJQUFPeUQsSUFBSyxJQUFPekQsRUFBRyxNQUFNLElBQUlrMkMsRUFBRWpCLEVBQUVJLGlCQUFrQixHQUFHbDJDLFNBQVNPLDhCQU10RSxTQUFTeTFFLEdBQUdoMkUsR0FDWixJQUFLczhDLEdBQUdpRSxjQUFjdmdELEdBQUksTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsNkZBQTZGbDJDLFNBQVNBLEVBQUVpQixXQU1sSyxTQUFTZzFFLEdBQUdqMkUsR0FDWixHQUFJczhDLEdBQUdpRSxjQUFjdmdELEdBQUksTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsZ0dBQWdHbDJDLFNBQVNBLEVBQUVpQixXQVF4SyxTQUFTaTFFLEdBQUdsMkUsR0FDUixRQUFJLElBQVdBLEVBQUcsTUFBTyxZQUN6QixHQUFJLE9BQVNBLEVBQUcsTUFBTyxPQUN2QixHQUFJLGlCQUFtQkEsRUFBRyxPQUFPQSxFQUFFaUIsT0FBUyxLQUFPakIsRUFBT0EsRUFBRXNMLFVBQVUsRUFBRyxJQUFsQixPQUN2RDdFLEtBQUtDLFVBQVUxRyxHQUNmLEdBQUksaUJBQW1CQSxHQUFLLGtCQUFvQkEsRUFBRyxNQUFPLEdBQUtBLEVBQy9ELEdBQUksaUJBQW1CQSxFQUFHLENBQ3RCLEdBQUlBLGFBQWE4QixNQUFPLE1BQU8sV0FDL0IsQ0FDSSxNQUFNd0MsRUFFTixTQUFTdEUsR0FDTCxPQUFJQSxFQUFFNEUsWUFBb0I1RSxFQUFFNEUsWUFBWXZGLEtBQ2pDLEtBRlgsQ0FXUFcsR0FDTyxPQUFPc0UsRUFBSSxZQUFZQSxXQUFhLGFBRzVDLE1BQU8sbUJBQXFCdEUsRUFBSSxhQUFlK29DLElBR25ELFNBQVNvdEMsR0FBR24yRSxFQUVac0UsR0FDSSxHQUFJLGNBQWV0RSxJQUduQkEsRUFBSUEsRUFBRW9OLGFBQWNwTixhQUFhc0UsR0FBSSxDQUNqQyxHQUFJQSxFQUFFakYsT0FBU1csRUFBRTRFLFlBQVl2RixLQUFNLE1BQU0sSUFBSTAzQyxFQUFFakIsRUFBRUksaUJBQWtCLHVHQUNuRSxDQUNJLE1BQU0zMUMsRUFBSTIxRSxHQUFHbDJFLEdBQ2IsTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0Isa0JBQWtCNXhDLEVBQUVqRixzQkFBc0JrQixNQUdsRixPQUFPUCxFQUdYLFNBQVNvMkUsR0FBR3AyRSxFQUFHc0UsR0FDWCxHQUFJQSxHQUFLLEVBQUcsTUFBTSxJQUFJeXlDLEVBQUVqQixFQUFFSSxpQkFBa0IsWUFBWWwyQywrQ0FBK0NzRTs7Ozs7Ozs7Ozs7Ozs7OztHQXlCM0csTUFBTSt4RSxHQUNGLFlBQVlyMkUsR0FDUixJQUFJc0UsRUFDSixRQUFJLElBQVd0RSxFQUFFc1UsS0FBTSxDQUNuQixRQUFJLElBQVd0VSxFQUFFMGtFLElBQUssTUFBTSxJQUFJM3RCLEVBQUVqQixFQUFFSSxpQkFBa0Isc0RBQ3REejBDLEtBQUs2UyxLQUFPLDJCQUE0QjdTLEtBQUtpakUsS0FBTSxPQUNoRGpqRSxLQUFLNlMsS0FBT3RVLEVBQUVzVSxLQUFNN1MsS0FBS2lqRSxJQUFNLFFBQVVwZ0UsRUFBSXRFLEVBQUUwa0UsV0FBUSxJQUFXcGdFLEdBQUtBLEVBQzlFLEdBQUk3QyxLQUFLNjBFLFlBQWN0MkUsRUFBRXMyRSxZQUFhNzBFLEtBQUs4MEUsNEJBQThCdjJFLEVBQUV1MkUsK0JBQzNFLElBQVd2MkUsRUFBRXF4RSxlQUFnQjV2RSxLQUFLNHZFLGVBQWlCLGFBQWUsQ0FDOUQsSUFBSyxJQUFNcnhFLEVBQUVxeEUsZ0JBQWtCcnhFLEVBQUVxeEUsZUFBaUIsUUFBUyxNQUFNLElBQUl0NkIsRUFBRWpCLEVBQUVJLGlCQUFrQiwyQ0FDM0Z6MEMsS0FBSzR2RSxlQUFpQnJ4RSxFQUFFcXhFLGVBRTVCNXZFLEtBQUsrMEUsK0JBQWlDeDJFLEVBQUV3MkUsNkJBQThCLzBFLEtBQUtnMUUsb0NBQXNDejJFLEVBQUV5MkUsa0NBQ25IaDFFLEtBQUtvakUsa0JBQW9CN2tFLEVBQUU2a0UsZ0JBQWlCa1IsR0FBRywrQkFBZ0MvMUUsRUFBRXcyRSw2QkFBOEIsb0NBQXFDeDJFLEVBQUV5MkUsbUNBRTFKLFFBQVF6MkUsR0FDSixPQUFPeUIsS0FBSzZTLE9BQVN0VSxFQUFFc1UsTUFBUTdTLEtBQUtpakUsTUFBUTFrRSxFQUFFMGtFLEtBQU9qakUsS0FBSzYwRSxjQUFnQnQyRSxFQUFFczJFLGFBQWU3MEUsS0FBSzR2RSxpQkFBbUJyeEUsRUFBRXF4RSxnQkFBa0I1dkUsS0FBSyswRSwrQkFBaUN4MkUsRUFBRXcyRSw4QkFBZ0MvMEUsS0FBS2cxRSxvQ0FBc0N6MkUsRUFBRXkyRSxtQ0FBcUNoMUUsS0FBSzgwRSw0QkFBOEJ2MkUsRUFBRXUyRSwyQkFBNkI5MEUsS0FBS29qRSxrQkFBb0I3a0UsRUFBRTZrRTs7Ozs7Ozs7Ozs7Ozs7OztHQXdCbFksTUFBTTZSLEdBRU4sWUFBWTEyRSxFQUFHc0UsRUFBRy9ELEdBQ2RrQixLQUFLazFFLGlCQUFtQnJ5RSxFQUFHN0MsS0FBS20xRSxxQkFBdUJyMkUsRUFJdkRrQixLQUFLbUYsS0FBTyxpQkFBa0JuRixLQUFLbzFFLGdCQUFrQixTQUFVcDFFLEtBQUtxMUUsVUFBWSxJQUFJVCxHQUFHLElBQ3ZGNTBFLEtBQUtzMUUsaUJBQWtCLEVBQUkvMkUsYUFBYTYxRSxHQUFLcDBFLEtBQUt1MUUsWUFBY2gzRSxHQUFLeUIsS0FBS3cxRSxLQUFPajNFLEVBQ2pGeUIsS0FBS3UxRSxZQUFjLFNBQVNoM0UsR0FDeEIsSUFBS1IsT0FBT2tCLFVBQVVDLGVBQWVzN0QsTUFBTWo4RCxFQUFFeWpCLFFBQVMsQ0FBRSxjQUFnQixNQUFNLElBQUlzekIsRUFBRWpCLEVBQUVJLGlCQUFrQix1REFDeEcsT0FBTyxJQUFJMi9CLEdBQUc3MUUsRUFBRXlqQixRQUFRL2QsV0FGVCxDQWdCdEIxRixJQUtNLFVBQ0gsSUFBS3lCLEtBQUt3MUUsS0FBTSxNQUFNLElBQUlsZ0MsRUFBRWpCLEVBQUVVLG9CQUFxQixnRkFDbkQsT0FBTy8wQyxLQUFLdzFFLEtBRWhCLG1CQUNJLE9BQU94MUUsS0FBS3MxRSxnQkFFaEIsa0JBQ0ksWUFBTyxJQUFXdDFFLEtBQUt5MUUsZUFFM0IsYUFBYWwzRSxHQUNULEdBQUl5QixLQUFLczFFLGdCQUFpQixNQUFNLElBQUloZ0MsRUFBRWpCLEVBQUVVLG9CQUFxQixzS0FDN0QvMEMsS0FBS3ExRSxVQUFZLElBQUlULEdBQUdyMkUsUUFBSSxJQUFXQSxFQUFFczJFLGNBQWdCNzBFLEtBQUtrMUUsaUJBQW1CLFNBQVMzMkUsR0FDdEYsSUFBS0EsRUFBRyxPQUFPLElBQUlrM0MsRUFDbkIsT0FBUWwzQyxFQUFFNEcsTUFDUixJQUFLLE9BQ0gsTUFBTXRDLEVBQUl0RSxFQUFFbTNFLE9BRUksT0FBT3hoQyxJQUFJLGlCQUFtQnJ4QyxHQUFLLE9BQVNBLElBQU1BLEVBQUVnTCxPQUFTaEwsRUFBRWdMLEtBQUtzb0Msa0NBQ3BGLElBQUlDLEVBQUV2ekMsRUFBR3RFLEVBQUVvM0UsY0FBZ0IsSUFBS3AzRSxFQUFFcTNFLFVBQVksTUFFaEQsSUFBSyxXQUNILE9BQU9yM0UsRUFBRW0zRSxPQUVYLFFBQ0UsTUFBTSxJQUFJcGdDLEVBQUVqQixFQUFFSSxpQkFBa0Isc0VBYnlDLENBZS9FbDJDLEVBQUVzMkUsY0FFUixlQUNJLE9BQU83MEUsS0FBS3ExRSxVQUVoQixrQkFDSSxPQUFPcjFFLEtBQUtzMUUsaUJBQWtCLEVBQUl0MUUsS0FBS3ExRSxVQUUzQyxVQUNJLE9BQU9yMUUsS0FBS3kxRSxpQkFBbUJ6MUUsS0FBS3kxRSxlQUFpQnoxRSxLQUFLNjFFLGNBQWU3MUUsS0FBS3kxRSxlQUVDLFNBQy9FLE1BQU8sQ0FDSHIzRCxJQUFLcGUsS0FBS3cxRSxLQUNWNXJCLFdBQVk1cEQsS0FBS3UxRSxZQUNqQnYyRCxTQUFVaGYsS0FBS3ExRSxXQVNoQixhQUtILE9BQU8sU0FBUzkyRSxHQUNaLE1BQU1zRSxFQUFJd3hFLEdBQUduMkUsSUFBSUssR0FDakJzRSxJQUFNNndDLEVBQUUsb0JBQXFCLHNCQUF1QjJnQyxHQUFHcC9DLE9BQU8xMkIsR0FBSXNFLEVBQUUydkUsYUFGakUsQ0FHTHh5RSxNQUFPNEQsUUFBUUYsV0FJekIsU0FBU295RSxHQUFHdjNFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBSSxJQUNyQixJQUFJL0IsRUFDSixNQUFNYyxHQUFLSSxFQUFJbTJFLEdBQUduMkUsRUFBRzAyRSxLQUFLYyxlQUMxQixHQUFJLDZCQUErQjUzRSxFQUFFMFUsTUFBUTFVLEVBQUUwVSxPQUFTaFEsR0FBS2t4QyxFQUFFLHNGQUMvRHgxQyxFQUFFeTNFLGFBQWFqNEUsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJckcsR0FBSSxDQUMvQzBVLEtBQU0sR0FBR2hRLEtBQUsvRCxJQUNkbWtFLEtBQUssS0FDSjdqRSxFQUFFNjJFLGNBQWUsQ0FDbEIsSUFBSXB6RSxFQUFHL0QsRUFDUCxHQUFJLGlCQUFtQk0sRUFBRTYyRSxjQUFlcHpFLEVBQUl6RCxFQUFFNjJFLGNBQWVuM0UsRUFBSWswQyxFQUFFSyxjQUFnQixDQUcvRXh3QyxFQUFJLFlBQW9CekQsRUFBRTYyRSxjQUFlLFFBQVU1NEUsRUFBSWtCLEVBQUVpM0UsWUFBUyxJQUFXbjRFLE9BQUksRUFBU0EsRUFBRTJrQixRQUFRL2QsV0FDcEcsTUFBTTlGLEVBQUlpQixFQUFFNjJFLGNBQWM1eEUsS0FBT2pGLEVBQUU2MkUsY0FBYzN4RSxRQUNqRCxJQUFLbkcsRUFBRyxNQUFNLElBQUltM0MsRUFBRWpCLEVBQUVJLGlCQUFrQix3REFDeEMzMUMsRUFBSSxJQUFJazBDLEVBQUU3MEMsR0FFZEksRUFBRTIyRSxpQkFBbUIsSUFBSXYvQixFQUFFLElBQUlILEVBQUUzeUMsRUFBRy9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBd0J4QyxNQUFNbzNFLEdBRU4sWUFBWTMzRSxFQUlac0UsRUFBRy9ELEdBQ0NrQixLQUFLbTJFLFVBQVl0ekUsRUFBRzdDLEtBQUtvYixLQUFPdGMsRUFFaENrQixLQUFLbUYsS0FBTyxXQUFZbkYsS0FBS28yRSxVQUFZNzNFLEVBRTdDLFlBQ0ksT0FBT3lCLEtBQUtvYixLQUFLckwsS0FJZCxTQUNILE9BQU8vUCxLQUFLb2IsS0FBS3JMLEtBQUs4c0MsY0FLbkIsV0FDSCxPQUFPNzhDLEtBQUtvYixLQUFLckwsS0FBSytvQyxrQkFJbkIsYUFDSCxPQUFPLElBQUl1OUIsR0FBR3IyRSxLQUFLbzJFLFVBQVdwMkUsS0FBS20yRSxVQUFXbjJFLEtBQUtvYixLQUFLckwsS0FBS2d0QyxXQUVqRSxjQUFjeCtDLEdBQ1YsT0FBTyxJQUFJMjNFLEdBQUdsMkUsS0FBS28yRSxVQUFXNzNFLEVBQUd5QixLQUFLb2IsT0FPMUMsTUFBTWs3RCxHQUdOLFlBQVkvM0UsRUFJWnNFLEVBQUcvRCxHQUNDa0IsS0FBS20yRSxVQUFZdHpFLEVBQUc3QyxLQUFLdTJFLE9BQVN6M0UsRUFFbENrQixLQUFLbUYsS0FBTyxRQUFTbkYsS0FBS28yRSxVQUFZNzNFLEVBRTFDLGNBQWNBLEdBQ1YsT0FBTyxJQUFJKzNFLEdBQUd0MkUsS0FBS28yRSxVQUFXNzNFLEVBQUd5QixLQUFLdTJFLFNBTzFDLE1BQU1GLFdBQVdDLEdBRWpCLFlBQVkvM0UsRUFBR3NFLEVBQUcvRCxHQUNkcUksTUFBTTVJLEVBQUdzRSxFQUFHbzlDLEdBQUduaEQsSUFBS2tCLEtBQUt3MkUsTUFBUTEzRSxFQUVqQ2tCLEtBQUttRixLQUFPLGFBRXVCLFNBQ25DLE9BQU9uRixLQUFLdTJFLE9BQU94bUUsS0FBSzhzQyxjQUtyQixXQUNILE9BQU83OEMsS0FBS3UyRSxPQUFPeG1FLEtBQUsrb0Msa0JBS3JCLGFBQ0gsTUFBTXY2QyxFQUFJeUIsS0FBS3cyRSxNQUFNejVCLFVBQ3JCLE9BQU94K0MsRUFBRTRKLFVBQVksS0FBTyxJQUFJK3RFLEdBQUdsMkUsS0FBS28yRSxVQUN2QixLQUFNLElBQUl2N0IsR0FBR3Q4QyxJQUVsQyxjQUFjQSxHQUNWLE9BQU8sSUFBSTgzRSxHQUFHcjJFLEtBQUtvMkUsVUFBVzczRSxFQUFHeUIsS0FBS3cyRSxRQUk5QyxTQUFTQyxHQUFHbDRFLEVBQUdzRSxLQUFNL0QsR0FDakIsR0FBSVAsRUFBSSxZQUFtQkEsR0FBSWtjLEdBQUcsYUFBYyxPQUFRNVgsR0FBSXRFLGFBQWEwMkUsR0FBSSxDQUN6RSxNQUFNNzFFLEVBQUl3NUMsRUFBR2tDLFdBQVdqNEMsS0FBTS9ELEdBQzlCLE9BQU8wMUUsR0FBR3AxRSxHQUFJLElBQUlpM0UsR0FBRzkzRSxFQUFvQixLQUFNYSxHQUVuRCxDQUNJLEtBQU1iLGFBQWEyM0UsSUFBTTMzRSxhQUFhODNFLElBQUssTUFBTSxJQUFJL2dDLEVBQUVqQixFQUFFSSxpQkFBa0IsaUhBQzNFLE1BQU1yMUMsRUFBSWIsRUFBRWk0RSxNQUFNbjVCLE1BQU16RSxFQUFHa0MsV0FBV2o0QyxLQUFNL0QsSUFDNUMsT0FBTzAxRSxHQUFHcDFFLEdBQUksSUFBSWkzRSxHQUFHOTNFLEVBQUU2M0UsVUFDTixLQUFNaDNFLElBZ0IzQixTQUFTczNFLEdBQUduNEUsRUFBR3NFLEdBQ2YsR0FBSXRFLEVBQUltMkUsR0FBR24yRSxFQUFHMDJFLElBQUt4NkQsR0FBRyxrQkFBbUIsZ0JBQWlCNVgsR0FBSUEsRUFBRXlELFFBQVEsTUFBUSxFQUFHLE1BQU0sSUFBSWd2QyxFQUFFakIsRUFBRUksaUJBQWtCLDBCQUEwQjV4QyxpRkFDN0ksT0FBTyxJQUFJeXpFLEdBQUcvM0UsRUFDRyxLQUtqQixTQUFTQSxHQUNMLE9BQU8sSUFBSW9jLEdBQUdpK0IsRUFBR29FLFlBQWF6K0MsR0FEbEMsQ0FFRXNFLElBR04sU0FBUzh6RSxHQUFHcDRFLEVBQUdzRSxLQUFNL0QsR0FDakIsR0FBSVAsRUFBSSxZQUFtQkEsR0FHM0IsSUFBTXluQixVQUFVeG1CLFNBQVdxRCxFQUFJeTBDLEVBQUc2NkIsS0FBTTEzRCxHQUFHLE1BQU8sT0FBUTVYLEdBQUl0RSxhQUFhMDJFLEdBQUksQ0FDM0UsTUFBTTcxRSxFQUFJdzVDLEVBQUdrQyxXQUFXajRDLEtBQU0vRCxHQUM5QixPQUFPeTFFLEdBQUduMUUsR0FBSSxJQUFJODJFLEdBQUczM0UsRUFDSixLQUFNLElBQUlzOEMsR0FBR3o3QyxJQUVsQyxDQUNJLEtBQU1iLGFBQWEyM0UsSUFBTTMzRSxhQUFhODNFLElBQUssTUFBTSxJQUFJL2dDLEVBQUVqQixFQUFFSSxpQkFBa0IsaUhBQzNFLE1BQU1yMUMsRUFBSWIsRUFBRWk0RSxNQUFNbjVCLE1BQU16RSxFQUFHa0MsV0FBV2o0QyxLQUFNL0QsSUFDNUMsT0FBT3kxRSxHQUFHbjFFLEdBQUksSUFBSTgyRSxHQUFHMzNFLEVBQUU2M0UsVUFBVzczRSxhQUFhODNFLEdBQUs5M0UsRUFBRTQzRSxVQUFZLEtBQU0sSUFBSXQ3QixHQUFHejdDLEtBV25GLFNBQVN3M0UsR0FBR3I0RSxFQUFHc0UsR0FDZixPQUFPdEUsRUFBSSxZQUFtQkEsR0FBSXNFLEVBQUksWUFBbUJBLElBQUt0RSxhQUFhMjNFLElBQU0zM0UsYUFBYTgzRSxNQUFReHpFLGFBQWFxekUsSUFBTXJ6RSxhQUFhd3pFLEtBQVE5M0UsRUFBRTYzRSxZQUFjdnpFLEVBQUV1ekUsV0FBYTczRSxFQUFFd1IsT0FBU2xOLEVBQUVrTixNQUFReFIsRUFBRTQzRSxZQUFjdHpFLEVBQUVzekUsVUFXcE4sU0FBU1UsR0FBR3Q0RSxFQUFHc0UsR0FDZixPQUFPdEUsRUFBSSxZQUFtQkEsR0FBSXNFLEVBQUksWUFBbUJBLEdBQUl0RSxhQUFhKzNFLElBQU16ekUsYUFBYXl6RSxJQUFPLzNFLEVBQUU2M0UsWUFBY3Z6RSxFQUFFdXpFLFdBQWF4MUIsR0FBR3JpRCxFQUFFZzRFLE9BQVExekUsRUFBRTB6RSxTQUFXaDRFLEVBQUU0M0UsWUFBY3R6RSxFQUFFc3pFOzs7Ozs7Ozs7Ozs7Ozs7O0lBa0IvSyxNQUFNVyxHQUNOLGNBRUk5MkUsS0FBS291RSxHQUFLeHFFLFFBQVFGLFVBR2xCMUQsS0FBS3F0RSxHQUFLLEdBR1ZydEUsS0FBS3V1RSxJQUFLLEVBR1Z2dUUsS0FBS2l0RSxHQUFLLEdBRVZqdEUsS0FBS3d1RSxHQUFLLEtBR1Z4dUUsS0FBSyt0RSxJQUFLLEVBRVYvdEUsS0FBSzB0RSxJQUFLLEVBRVYxdEUsS0FBSzB1RSxHQUFLLEdBRVYxdUUsS0FBS2crRCxHQUFLLElBQUlzSCxHQUFHdGxFLEtBQU0scUJBSXZCQSxLQUFLNHVFLEdBQUssS0FDTixNQUFNcndFLEVBQUk2bUUsS0FDVjdtRSxHQUFLbTFDLEVBQUUsYUFBYywrQkFBaUNuMUMsRUFBRXd6QyxpQkFBa0IveEMsS0FBS2crRCxHQUFHMUIsTUFFdEYsTUFBTS85RCxFQUFJNm1FLEtBQ1Y3bUUsR0FBSyxtQkFBcUJBLEVBQUVpbUIsa0JBQW9Cam1CLEVBQUVpbUIsaUJBQWlCLG1CQUFvQnhrQixLQUFLNHVFLElBRWhHLHFCQUNJLE9BQU81dUUsS0FBS3V1RSxHQUtULGlCQUFpQmh3RSxHQUVwQnlCLEtBQUsrMkUsUUFBUXg0RSxHQUVqQixvQ0FBb0NBLEdBQ2hDeUIsS0FBSzZ1RSxLQUVMN3VFLEtBQUs4dUUsR0FBR3Z3RSxHQUVaLG9CQUFvQkEsR0FDaEIsSUFBS3lCLEtBQUt1dUUsR0FBSSxDQUNWdnVFLEtBQUt1dUUsSUFBSyxFQUFJdnVFLEtBQUswdEUsR0FBS252RSxJQUFLLEVBQzdCLE1BQU1zRSxFQUFJdWlFLEtBQ1Z2aUUsR0FBSyxtQkFBcUJBLEVBQUVpeUIscUJBQXVCanlCLEVBQUVpeUIsb0JBQW9CLG1CQUFvQjkwQixLQUFLNHVFLEtBRzFHLFFBQVFyd0UsR0FDSixHQUFJeUIsS0FBSzZ1RSxLQUFNN3VFLEtBQUt1dUUsR0FFcEIsT0FBTyxJQUFJM3FFLFFBQVEsUUFJWCxNQUFNZixFQUFJLElBQUkweUMsRUFDdEIsT0FBT3YxQyxLQUFLOHVFLEdBQUcsSUFBTzl1RSxLQUFLdXVFLElBQU12dUUsS0FBSzB0RSxHQUFLOXBFLFFBQVFGLFdBQWFuRixJQUFJa00sS0FBSzVILEVBQUVhLFFBQVNiLEVBQUVZLFFBQ3RGWixFQUFFYyxVQUFXOEcsS0FBSyxJQUFPNUgsRUFBRWMsU0FFL0IsaUJBQWlCcEYsR0FDYnlCLEtBQUsrOEQsaUJBQWlCLEtBQVEvOEQsS0FBS3F0RSxHQUFHanNFLEtBQUs3QyxHQUFJeUIsS0FBSyt1RSxPQUtqRCxXQUNILEdBQUksSUFBTS91RSxLQUFLcXRFLEdBQUc3dEUsT0FBUSxDQUN0QixVQUNVUSxLQUFLcXRFLEdBQUcsS0FBTXJ0RSxLQUFLcXRFLEdBQUc1TSxRQUFTemdFLEtBQUtnK0QsR0FBR3AvQixRQUMvQyxNQUFPcmdDLEdBQ0wsSUFBSzQwRCxHQUFHNTBELEdBQUksTUFBTUEsRUFFRm0xQyxFQUFFLGFBQWMsMENBQTRDbjFDLEdBRWhGeUIsS0FBS3F0RSxHQUFHN3RFLE9BQVMsR0FXakJRLEtBQUtnK0QsR0FBR3ZDLEdBQUcsSUFBT3o3RCxLQUFLK3VFLE9BRy9CLEdBQUd4d0UsR0FDQyxNQUFNc0UsRUFBSTdDLEtBQUtvdUUsR0FBRzNqRSxLQUFLLEtBQVF6SyxLQUFLK3RFLElBQUssRUFBSXh2RSxJQUFJdUYsTUFBT3ZGLElBQ3BEeUIsS0FBS3d1RSxHQUFLandFLEVBQUd5QixLQUFLK3RFLElBQUssRUErQnZCLE1BQU1qNkIsRUFBRSw2QkF4QlIsU0FBU3YxQyxHQUNMLElBQUlzRSxFQUFJdEUsRUFBRTBJLFNBQVcsR0FFckIsT0FEQTFJLEVBQUV5NEUsUUFBVW4wRSxFQUFJdEUsRUFBRXk0RSxNQUFNcHdFLFNBQVNySSxFQUFFMEksU0FBVzFJLEVBQUV5NEUsTUFBUXo0RSxFQUFFMEksUUFBVSxLQUFPMUksRUFBRXk0RSxPQUN0RW4wRTs7Ozs7Ozs7Ozs7Ozs7OztHQUhYLENBb0JQdEUsSUFJaURBLElBQzFDa00sS0FBTWxNLElBQU15QixLQUFLK3RFLElBQUssRUFBSXh2RSxNQUM5QixPQUFPeUIsS0FBS291RSxHQUFLdnJFLEVBQUdBLEVBRXhCLGtCQUFrQnRFLEVBQUdzRSxFQUFHL0QsR0FDcEJrQixLQUFLNnVFLEtBRUw3dUUsS0FBSzB1RSxHQUFHcG9FLFFBQVEvSCxJQUFNLElBQU1zRSxFQUFJLEdBQ2hDLE1BQU16RCxFQUFJa3FFLEdBQUcyTixrQkFBa0JqM0UsS0FBTXpCLEVBQUdzRSxFQUFHL0QsRUFBSVAsR0FBS3lCLEtBQUtrd0UsR0FBRzN4RSxJQUM1RCxPQUFPeUIsS0FBS2l0RSxHQUFHN3JFLEtBQUtoQyxHQUFJQSxFQUU1QixLQUNJWSxLQUFLd3VFLElBQU1sbkMsSUFFZiw2QkFJTyxXQUtILElBQUkvb0MsRUFDSixHQUNJQSxFQUFJeUIsS0FBS291RSxTQUFVN3ZFLFFBQ2RBLElBQU15QixLQUFLb3VFLElBS2pCLEdBQUc3dkUsR0FDTixJQUFLLE1BQU1zRSxLQUFLN0MsS0FBS2l0RSxHQUFJLEdBQUlwcUUsRUFBRStSLFVBQVlyVyxFQUFHLE9BQU8sRUFDckQsT0FBTyxFQVFKLEdBQUdBLEdBRU4sT0FBT3lCLEtBQUtndkUsS0FBS3ZrRSxLQUFLLEtBRWxCekssS0FBS2l0RSxHQUFHbnJELEtBQUssQ0FBRXZqQixFQUFHc0UsSUFBTXRFLEVBQUVnckUsYUFBZTFtRSxFQUFFMG1FLGNBQzNDLElBQUssTUFBTTFtRSxLQUFLN0MsS0FBS2l0RSxHQUFJLEdBQUlwcUUsRUFBRTBpRSxZQUFhLFFBQW9CaG5FLEdBQUtzRSxFQUFFK1IsVUFBWXJXLEVBQUcsTUFDdEYsT0FBT3lCLEtBQUtndkUsT0FLYixHQUFHendFLEdBQ055QixLQUFLMHVFLEdBQUd0dEUsS0FBSzdDLEdBRTRDLEdBQUdBLEdBRTVELE1BQU1zRSxFQUFJN0MsS0FBS2l0RSxHQUFHM21FLFFBQVEvSCxHQUMxQnlCLEtBQUtpdEUsR0FBRzFYLE9BQU8xeUQsRUFBRyxJQUkxQixTQUFTcTBFLEdBQUczNEUsR0FLUixPQUFPLFNBQVNBLEVBQUdzRSxHQUNmLEdBQUksaUJBQW1CdEUsR0FBSyxPQUFTQSxFQUFHLE9BQU8sRUFDL0MsTUFBTU8sRUFBSVAsRUFDVixJQUFLLE1BQU1BLElBd0JYLENBQUUsT0FBUSxRQUFTLFlBeEJBLEdBQUlBLEtBQUtPLEdBQUssbUJBQXFCQSxFQUFFUCxHQUFJLE9BQU8sRUFDbkUsT0FBTzs7Ozs7Ozs7Ozs7Ozs7OztHQUpKLENBMkJOQSxHQUdMLE1BQU00NEUsR0FDRixjQUNJbjNFLEtBQUtvM0Usa0JBQW9CLEdBQUlwM0UsS0FBS3EzRSx3QkFBMEIsSUFBSTloQyxFQUFHdjFDLEtBQUtzM0UsY0FBZ0IsQ0FDcEZ6TCxVQUFXLFVBQ1hFLFdBQVksRUFDWkQsZUFBZ0IsRUFDaEJMLFlBQWEsRUFDYkMsZ0JBQWlCLEdBVWxCLFdBQVdudEUsRUFBR3NFLEVBQUcvRCxHQUNwQmtCLEtBQUtvM0Usa0JBQW9CLENBQ3JCeHNFLEtBQU1yTSxFQUNOd0UsTUFBT0YsRUFDUGlJLFNBQVVoTSxHQU9YLE1BQU1QLEdBQ1QsT0FBT3lCLEtBQUtxM0Usd0JBQXdCMXpFLFFBQVFHLE1BQU12RixHQVEvQyxLQUFLQSxFQUFHc0UsR0FDWCxPQUFPN0MsS0FBS3EzRSx3QkFBd0IxekUsUUFBUThHLEtBQUtsTSxFQUFHc0UsR0FPakQsY0FBY3RFLEdBQ2pCeUIsS0FBSzh6RSxnQkFBZ0J2MUUsR0FBSXlCLEtBQUtvM0Usa0JBQWtCdHNFLFVBQVk5SyxLQUFLbzNFLGtCQUFrQnRzRSxXQUNuRjlLLEtBQUtxM0Usd0JBQXdCM3pFLFFBQVFuRixHQU9sQyxVQUFVQSxHQUNieUIsS0FBS3MzRSxjQUFjekwsVUFBWSxRQUFTN3JFLEtBQUtvM0Usa0JBQWtCeHNFLE1BQVE1SyxLQUFLbzNFLGtCQUFrQnhzRSxLQUFLNUssS0FBS3MzRSxlQUN4R3QzRSxLQUFLbzNFLGtCQUFrQnIwRSxPQUFTL0MsS0FBS28zRSxrQkFBa0JyMEUsTUFBTXhFLEdBQUl5QixLQUFLcTNFLHdCQUF3QjV6RSxPQUFPbEYsR0FPbEcsZ0JBQWdCQSxHQUNuQnlCLEtBQUtzM0UsY0FBZ0IvNEUsRUFBR3lCLEtBQUtvM0Usa0JBQWtCeHNFLE1BQVE1SyxLQUFLbzNFLGtCQUFrQnhzRSxLQUFLck07Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQmpELE1BQU1nNUUsSUFBTSxFQU90RCxNQUFNQyxXQUFXdkMsR0FFYixZQUFZMTJFLEVBQUdzRSxFQUFHL0QsR0FDZHFJLE1BQU01SSxFQUFHc0UsRUFBRy9ELEdBSVprQixLQUFLbUYsS0FBTyxZQUFhbkYsS0FBS3kzRSxPQUFTLElBQUlYLEdBQUk5MkUsS0FBS28xRSxnQkFBa0IsU0FBVTcyRSxFQUFJQSxFQUFFWCxLQUFPLFlBRWpHLGFBQ0ksT0FBT29DLEtBQUswM0Usa0JBR1pDLEdBQUczM0UsTUFBT0EsS0FBSzAzRSxpQkFBaUJsRixhQWNwQyxTQUFTb0YsR0FBR3I1RSxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSSx1QkFBYVAsRUFBRyxhQUMxQixHQUFJTyxFQUFFKzRFLGdCQUFpQixDQUNuQixNQUFNdDVFLEVBQUlPLEVBQUV3dUMsZUFBZ0JsdUMsRUFBSU4sRUFBRWc1RSxhQUNsQyxHQUFJLFlBQVUxNEUsRUFBR3lELEdBQUksT0FBT3RFLEVBQzVCLE1BQU0sSUFBSSsyQyxFQUFFakIsRUFBRVUsb0JBQXFCLG9QQUV2QyxRQUFJLElBQVdseUMsRUFBRStzRSxpQkFBbUIsSUFBTS9zRSxFQUFFK3NFLGdCQUFrQi9zRSxFQUFFK3NFLGVBQWlCLFFBQVMsTUFBTSxJQUFJdDZCLEVBQUVqQixFQUFFSSxpQkFBa0IsMkNBQzFILE9BQU8zMUMsRUFBRWt2QyxXQUFXLENBQ2hCaHNCLFFBQVNuZixJQVliLFNBQVNrMUUsR0FBR2wxRSxFQUFJLG9CQUNoQixPQUFPLHVCQUFhQSxFQUFHLGFBQWF5cUMsZUFLcEMsU0FBUzBxQyxHQUFHejVFLEdBQ1osT0FBT0EsRUFBRW01RSxrQkFBb0JDLEdBQUdwNUUsR0FBSUEsRUFBRW01RSxpQkFBaUJPLHNCQUF1QjE1RSxFQUFFbTVFLGlCQUdwRixTQUFTQyxHQUFHcDVFLEdBQ1IsSUFBSXNFLEVBQ0osTUFBTS9ELEVBQUlQLEVBQUUyNUUsa0JBQW1COTRFLEVBQUksU0FBU2IsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqRCxPQUFPLElBQUkrMEUsR0FBRzUxRSxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUV5VCxLQUFNelQsRUFBRTZqRSxJQUFLN2pFLEVBQUUyMUUsNkJBQThCMzFFLEVBQUU0MUUsa0NBQW1DNTFFLEVBQUVna0UsaUJBRDlFLENBRWpDN2tFLEVBQUVnM0UsYUFBYyxRQUFVMXlFLEVBQUl0RSxFQUFFaTNFLFlBQVMsSUFBVzN5RSxPQUFJLEVBQVNBLEVBQUVtZixRQUFRQyxRQUFVLEdBQUkxakIsRUFBRTYyRSxnQkFBaUJ0MkUsR0FDOUdQLEVBQUVtNUUsaUJBQW1CLElBQUl4RixHQUFHM3pFLEVBQUUyMkUsaUJBQWtCMzJFLEVBQUU0MkUscUJBQXNCNTJFLEVBQUVrNUUsT0FBUXI0RSxHQXlCbEYsU0FBUys0RSxHQUFHNTVFLEVBQUdzRSxHQUNmdTFFLEdBQUc3NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsS0FDYixNQUFNMTRFLEVBQUlrNUUsR0FBR3o1RSxHQUFJYSxFQUFJYixFQUFFMjVFLGtCQUFtQjc2RSxFQUFJLElBQUk4eUUsR0FDbEQsT0FBT2tJLEdBQUd2NUUsRUFBR3pCLEVBQUcsSUFBSXN5RSxHQUFHdHlFLEVBQUcrQixFQUFFd3dFLGVBQWdCLE1BQVEvc0UsT0FBSSxFQUFTQSxFQUFFZ3RFLGlCQXdCbkUsU0FBU3lJLEdBQUcvNUUsR0FDWjY1RSxHQUFHNzVFLEVBQUltMkUsR0FBR24yRSxFQUFHaTVFLEtBQ2IsTUFBTTMwRSxFQUFJbTFFLEdBQUd6NUUsR0FBSU8sRUFBSVAsRUFBRTI1RSxrQkFBbUI5NEUsRUFBSSxJQUFJK3dFLEdBQ2xELE9BQU9rSSxHQUFHeDFFLEVBQUd6RCxFQUFHLElBQUkyd0UsR0FBRzN3RSxFQUFHTixFQUFFOHdFLGlCQVE1QixTQUFTeUksR0FBRzk1RSxFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUksSUFBSW0yQyxFQUNkLE9BQU9oM0MsRUFBRSs2RCxXQUFXeWQsUUFBUSxVQUN4QixVQUNVckUsR0FBR24wRSxFQUFHTyxTQUFVaTBFLEdBQUd4MEUsRUFBR3NFLEdBQUl6RCxFQUFFc0UsVUFDcEMsTUFBT25GLEdBQ0wsSUFLQSxTQUFTQSxHQUNMLE1BQUksa0JBQW9CQSxFQUFFWCxLQUFhVyxFQUFFeUksT0FBU3F0QyxFQUFFVSxxQkFBdUJ4MkMsRUFBRXlJLE9BQVNxdEMsRUFBRWEsZ0JBQ3BGLG9CQUFzQnFqQyxjQUFnQmg2RSxhQUFhZzZFLGdCQVdoRCxLQUFPaDZFLEVBQUV5SSxNQUFRLEtBQU96SSxFQUFFeUksTUFHakMsS0FBT3pJLEVBQUV5SSxNQWhCYixDQXdDUHpJLEdBQUksTUFBTUEsRUFDSHVFLFFBQVFteEMsS0FBSyw2RUFBK0UxMUMsR0FDNUZhLEVBQUVxRSxPQUFPbEYsTUFFYmtNLEtBQUssSUFBT3JMLEVBQUV1RSxTQUd0QixTQUFTNjBFLEdBQUdqNkUsR0FDUixHQUFJQSxFQUFFazZFLGVBQWlCbDZFLEVBQUVtNkUsWUFBYSxNQUFNLElBQUlwakMsRUFBRWpCLEVBQUVVLG9CQUFxQix5R0FDekUsTUFBTWx5QyxFQUFJLElBQUkweUMsRUFDZCxPQUFPaDNDLEVBQUVrNUUsT0FBT25GLG9DQUFvQyxVQUNoRCxVQUNVeGhFLGVBQWV2UyxHQUNqQixJQUFLazBELEdBQUdsWSxLQUFNLE9BQU8zMkMsUUFBUUYsVUFDN0IsTUFBTWIsRUFBSXRFLEVBQUksYUFDUmswRCxHQUFHeDlCLE9BQU9weUIsR0FIZGlPLENBSUp3c0QsR0FBRy8rRCxFQUFFZzNFLFlBQWFoM0UsRUFBRTYyRSxrQkFBbUJ2eUUsRUFBRWEsVUFDN0MsTUFBT25GLEdBQ0xzRSxFQUFFWSxPQUFPbEYsTUFFWnNFLEVBQUVjLFFBa0JQLFNBQVNnMUUsR0FBR3A2RSxHQUNaLE9BQU8sU0FBU0EsR0FDWixNQUFNc0UsRUFBSSxJQUFJMHlDLEVBQ2QsT0FBT2gzQyxFQUFFKzZELFdBQVd5RCxpQkFBaUIsU0E3M0V6Q2pzRCxlQUFrQnZTLEVBQUdzRSxHQUNyQixNQUFNL0QsRUFBSXMxQyxFQUFFNzFDLEdBQ1o4b0UsR0FBR3ZvRSxFQUFFMnRFLGNBQWdCLzRCLEVBQUUsYUFBYyx3SEFDckMsSUFDSSxNQUFNbjFDLFFBQVUsU0FBU0EsR0FDckIsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLE9BQU9zRSxFQUFFNFksWUFBWWtoRCxlQUFlLHNDQUF1QyxXQUFhcCtELEdBQUtzRSxFQUFFZ2tELEdBQUcreEIsZ0NBQWdDcjZFLElBRnRILENBR2RPLEVBQUVvb0UsWUFDSixJQUFLLElBQU0zb0UsRUFFWCxZQUFZc0UsRUFBRWEsVUFDZCxNQUFNdEUsRUFBSU4sRUFBRStyRSxHQUFHM3NFLElBQUlLLElBQU0sR0FDekJhLEVBQUVnQyxLQUFLeUIsR0FBSS9ELEVBQUUrckUsR0FBRzk3RCxJQUFJeFEsRUFBR2EsR0FDekIsTUFBT2IsR0FDTCxNQUFNTyxFQUFJOHFFLEdBQUdyckUsRUFBRyw2REFDaEJzRSxFQUFFWSxPQUFPM0UsSUE4MkV5Q216RSxPQUFTb0IsR0FBRzkwRSxHQUFJc0UsSUFBTUEsRUFBRWMsUUFGdkUsQ0FHTHEwRSxHQUFHejVFLEVBQUltMkUsR0FBR24yRSxFQUFHaTVFLE1BUWYsU0FBU3FCLEdBQUd0NkUsR0FDWixPQW52QzBFLFNBQVlBLEdBQ3RGLE9BQU9BLEVBQUUrNkQsV0FBV3lkLFFBQVEsVUFDeEIsTUFBTWwwRSxRQUFVcXdFLEdBQUczMEUsR0FBSU8sUUFBVXMwRSxHQUFHNzBFLEdBQ3BDLE9BQU9zRSxFQUFFaTJFLG1CQUFrQixHQUFLLFNBQVN2NkUsR0FDckMsTUFBTXNFLEVBQUl1eEMsRUFBRTcxQyxHQUNaLE9BQU9zRSxFQUFFMi9ELEdBQUd2dEMsT0FBTyxHQUF1QnN5QyxHQUFHMWtFLEdBRmpCLENBRzlCL0QsS0E2dUNDaTZFLENBQUdmLEdBQUd6NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsTUFVdkIsU0FBU3dCLEdBQUd6NkUsR0FDWixPQXB2QzBFLFNBQVlBLEdBQ3RGLE9BQU9BLEVBQUUrNkQsV0FBV3lkLFFBQVEsVUFDeEIsTUFBTWwwRSxRQUFVcXdFLEdBQUczMEUsR0FBSU8sUUFBVXMwRSxHQUFHNzBFLEdBQ3BDLE9BQU9zRSxFQUFFaTJFLG1CQUFrQixHQUFLaG9FLGVBQWV2UyxHQUMzQyxNQUFNc0UsRUFBSXV4QyxFQUFFNzFDLEdBQ1pzRSxFQUFFMi9ELEdBQUdwK0MsSUFBSSxTQUE2QmtqRCxHQUFHemtFLEdBRXpDQSxFQUFFaWdFLEdBQUcvekQsSUFBSSxXQUptQitCLENBSzlCaFMsS0E0dUNDbTZFLENBQUdqQixHQUFHejVFLEVBQUltMkUsR0FBR24yRSxFQUFHaTVFLE1Bd0J2QixTQUFTMEIsR0FBRzM2RSxHQUNaLE9BQU8saUNBQXVCQSxFQUFFNmYsSUFBSyxhQUFjN2YsRUFBRTQ2RSxVQWFyRCxTQUFTQyxHQUFHNzZFLEVBQUdzRSxHQUNmLE1BQU0vRCxFQUFJazVFLEdBQUd6NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsS0FBTXA0RSxFQUFJLElBQUkrM0UsR0FDckMsT0FBTzFELEdBQUczMEUsRUFBR1AsRUFBRWczRSxZQUFhMXlFLEVBQUd6RCxHQUFJQSxFQVNuQyxTQUFTaTZFLEdBQUc5NkUsRUFBR3NFLEdBQ2YsT0F6bkNKLFNBQVl0RSxFQUFHc0UsR0FDWCxPQUFPdEUsRUFBRSs2RCxXQUFXeWQsUUFBUSxTQUFhLFNBQVN4NEUsRUFBR3NFLEdBQ2pELE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixPQUFPTyxFQUFFMmMsWUFBWWtoRCxlQUFlLGtCQUFtQixXQUFhcCtELEdBQUtPLEVBQUUrakQsR0FBR3kyQixjQUFjLzZFLEVBQUdzRSxJQUYxRCxPQUdqQ3N3RSxHQUFHNTBFLEdBQUlzRSxJQXFuQ1IwMkUsQ0FBR3ZCLEdBQUd6NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsS0FBTTMwRSxHQUFHNEgsS0FBTTVILEdBQUtBLEVBQUksSUFBSXl6RSxHQUFHLzNFLEVBQUcsS0FBTXNFLEVBQUVzTyxPQUFTLE1BRzlFLFNBQVNpbkUsR0FBRzc1RSxHQUNSLEdBQUlBLEVBQUVrNkUsY0FBZ0JsNkUsRUFBRW02RSxZQUFhLE1BQU0sSUFBSXBqQyxFQUFFakIsRUFBRVUsb0JBQXFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDNUUsTUFBTXlrQyxHQU9GLGVBQWVqN0UsR0FDWCxJQUFLLElBQUlzRSxFQUFJLEVBQUdBLEVBQUl0RSxFQUFFaUIsU0FBVXFELEVBQUcsR0FBSSxJQUFNdEUsRUFBRXNFLEdBQUdyRCxPQUFRLE1BQU0sSUFBSTgxQyxFQUFFakIsRUFBRUksaUJBQWtCLDJFQUMxRnowQyxLQUFLeTVFLGNBQWdCLElBQUl6Z0MsRUFBR3o2QyxHQU96QixRQUFRQSxHQUNYLE9BQU95QixLQUFLeTVFLGNBQWN2aEMsUUFBUTM1QyxFQUFFazdFLGdCQU94QyxTQUFTQyxLQUNULE9BQU8sSUFBSUYsR0FBRzs7Ozs7Ozs7Ozs7Ozs7OztHQXFCZCxNQUFNRyxHQUVOLFlBQVlwN0UsR0FDUnlCLEtBQUs0NUUsWUFBY3I3RSxFQU9oQix3QkFBd0JBLEdBQzNCLElBQ0ksT0FBTyxJQUFJbzdFLEdBQUdyZ0MsRUFBR1EsaUJBQWlCdjdDLElBQ3BDLE1BQU9BLEdBQ0wsTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsZ0RBQWtEbDJDLElBT25GLHNCQUFzQkEsR0FDekIsT0FBTyxJQUFJbzdFLEdBQUdyZ0MsRUFBR1MsZUFBZXg3QyxJQU03QixXQUNILE9BQU95QixLQUFLNDVFLFlBQVkxOUIsV0FNckIsZUFDSCxPQUFPbDhDLEtBQUs0NUUsWUFBWTV2QixlQU1yQixXQUNILE1BQU8saUJBQW1CaHFELEtBQUtrOEMsV0FBYSxJQU96QyxRQUFRMzlDLEdBQ1gsT0FBT3lCLEtBQUs0NUUsWUFBWTFoQyxRQUFRMzVDLEVBQUVxN0U7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QnRDLE1BQU1DLEdBS04sWUFBWXQ3RSxHQUNSeUIsS0FBSzg1RSxZQUFjdjdFOzs7Ozs7Ozs7Ozs7Ozs7O0dBMEJ2QixNQUFNdzdFLEdBT04sWUFBWXg3RSxFQUFHc0UsR0FDWCxJQUFLbTNFLFNBQVN6N0UsSUFBTUEsR0FBSyxJQUFNQSxFQUFJLEdBQUksTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsMERBQTREbDJDLEdBQ25JLElBQUt5N0UsU0FBU24zRSxJQUFNQSxHQUFLLEtBQU9BLEVBQUksSUFBSyxNQUFNLElBQUl5eUMsRUFBRWpCLEVBQUVJLGlCQUFrQiw2REFBK0Q1eEMsR0FDeEk3QyxLQUFLaTZFLEtBQU8xN0UsRUFBR3lCLEtBQUtrNkUsTUFBUXIzRSxFQUl6QixlQUNILE9BQU83QyxLQUFLaTZFLEtBSVQsZ0JBQ0gsT0FBT2o2RSxLQUFLazZFLE1BT1QsUUFBUTM3RSxHQUNYLE9BQU95QixLQUFLaTZFLE9BQVMxN0UsRUFBRTA3RSxNQUFRajZFLEtBQUtrNkUsUUFBVTM3RSxFQUFFMjdFLE1BRW1CLFNBQ25FLE1BQU8sQ0FDSDUrQixTQUFVdDdDLEtBQUtpNkUsS0FDZjErQixVQUFXdjdDLEtBQUtrNkUsT0FNakIsV0FBVzM3RSxHQUNkLE9BQU9nNUMsRUFBR3YzQyxLQUFLaTZFLEtBQU0xN0UsRUFBRTA3RSxPQUFTMWlDLEVBQUd2M0MsS0FBS2s2RSxNQUFPMzdFLEVBQUUyN0U7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQnJELE1BQU1DLEdBQUssV0FFdUQsTUFBTUMsR0FDeEUsWUFBWTc3RSxFQUFHc0UsRUFBRy9ELEdBQ2RrQixLQUFLMEgsS0FBT25KLEVBQUd5QixLQUFLa2tELFVBQVlyaEQsRUFBRzdDLEtBQUtrakQsZ0JBQWtCcGtELEVBRTlELFdBQVdQLEVBQUdzRSxHQUNWLE9BQU8sT0FBUzdDLEtBQUtra0QsVUFBWSxJQUFJWixHQUFHL2tELEVBQUd5QixLQUFLMEgsS0FBTTFILEtBQUtra0QsVUFBV3JoRCxFQUFHN0MsS0FBS2tqRCxpQkFBbUIsSUFBSUYsR0FBR3prRCxFQUFHeUIsS0FBSzBILEtBQU03RSxFQUFHN0MsS0FBS2tqRCxrQkFJNUQsTUFBTW0zQixHQUM1RSxZQUFZOTdFLEVBRVpzRSxFQUFHL0QsR0FDQ2tCLEtBQUswSCxLQUFPbkosRUFBR3lCLEtBQUtra0QsVUFBWXJoRCxFQUFHN0MsS0FBS2tqRCxnQkFBa0Jwa0QsRUFFOUQsV0FBV1AsRUFBR3NFLEdBQ1YsT0FBTyxJQUFJeWdELEdBQUcva0QsRUFBR3lCLEtBQUswSCxLQUFNMUgsS0FBS2trRCxVQUFXcmhELEVBQUc3QyxLQUFLa2pELGtCQUk1RCxTQUFTbzNCLEdBQUcvN0UsR0FDUixPQUFRQSxHQUNOLEtBQUssRUFFRyxLQUFLLEVBRUwsS0FBSyxFQUNYLE9BQU8sRUFFVCxLQUFLLEVBQ0wsS0FBSyxFQUNILE9BQU8sRUFFVCxRQUNFLE1BQU0rb0MsS0FJbUQsTUFBTWl6QyxHQW1CbkUsWUFBWWg4RSxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxHQUN2QjZCLEtBQUtnZixTQUFXemdCLEVBQUd5QixLQUFLNHBELFdBQWEvbUQsRUFBRzdDLEtBQUswSSxFQUFJNUosRUFBR2tCLEtBQUs4MEUsMEJBQTRCMTFFLE9BR3JGLElBQVcvQixHQUFLMkMsS0FBS3F2RSxLQUFNcnZFLEtBQUtrakQsZ0JBQWtCN2xELEdBQUssR0FBSTJDLEtBQUtra0QsVUFBWS9sRCxHQUFLLEdBRXJGLFdBQ0ksT0FBTzZCLEtBQUtnZixTQUFTalAsS0FFekIsU0FDSSxPQUFPL1AsS0FBS2dmLFNBQVM2dEQsR0FFZ0QsR0FBR3R1RSxHQUN4RSxPQUFPLElBQUlnOEUsR0FBR3g4RSxPQUFPeUcsT0FBT3pHLE9BQU95RyxPQUFPLEdBQUl4RSxLQUFLZ2YsVUFBV3pnQixHQUFJeUIsS0FBSzRwRCxXQUFZNXBELEtBQUswSSxFQUFHMUksS0FBSzgwRSwwQkFBMkI5MEUsS0FBS2tqRCxnQkFBaUJsakQsS0FBS2trRCxXQUUxSixHQUFHM2xELEdBQ0MsSUFBSXNFLEVBQ0osTUFBTS9ELEVBQUksUUFBVStELEVBQUk3QyxLQUFLK1AsWUFBUyxJQUFXbE4sT0FBSSxFQUFTQSxFQUFFdzZDLE1BQU05K0MsR0FBSWEsRUFBSVksS0FBS3N2RSxHQUFHLENBQ2xGdi9ELEtBQU1qUixFQUNOeXdFLElBQUksSUFFUixPQUFPbndFLEVBQUV1d0UsR0FBR3B4RSxHQUFJYSxFQUVwQixHQUFHYixHQUNDLElBQUlzRSxFQUNKLE1BQU0vRCxFQUFJLFFBQVUrRCxFQUFJN0MsS0FBSytQLFlBQVMsSUFBV2xOLE9BQUksRUFBU0EsRUFBRXc2QyxNQUFNOStDLEdBQUlhLEVBQUlZLEtBQUtzdkUsR0FBRyxDQUNsRnYvRCxLQUFNalIsRUFDTnl3RSxJQUFJLElBRVIsT0FBT253RSxFQUFFaXdFLEtBQU1qd0UsRUFFbkIsR0FBR2IsR0FHQyxPQUFPeUIsS0FBS3N2RSxHQUFHLENBQ1h2L0QsVUFBTSxFQUNOdy9ELElBQUksSUFHWixHQUFHaHhFLEdBQ0MsT0FBT2k4RSxHQUFHajhFLEVBQUd5QixLQUFLZ2YsU0FBU3k3RCxXQUFZejZFLEtBQUtnZixTQUFTMHhELEtBQU0sRUFBSTF3RSxLQUFLK1AsS0FBTS9QLEtBQUtnZixTQUFTNHhELElBRVYsU0FBU3J5RSxHQUN2RixZQUFPLElBQVd5QixLQUFLa2tELFVBQVVuMEIsS0FBTWx0QixHQUFLdEUsRUFBRTY2QyxXQUFXdjJDLFVBQVEsSUFBVzdDLEtBQUtrakQsZ0JBQWdCbnpCLEtBQU1sdEIsR0FBS3RFLEVBQUU2NkMsV0FBV3YyQyxFQUFFczZDLFFBRS9ILEtBR0ksR0FBSW45QyxLQUFLK1AsS0FBTSxJQUFLLElBQUl4UixFQUFJLEVBQUdBLEVBQUl5QixLQUFLK1AsS0FBS3ZRLE9BQVFqQixJQUFLeUIsS0FBSzJ2RSxHQUFHM3ZFLEtBQUsrUCxLQUFLN1IsSUFBSUssSUFFcEYsR0FBR0EsR0FDQyxHQUFJLElBQU1BLEVBQUVpQixPQUFRLE1BQU1RLEtBQUt5d0UsR0FBRyxxQ0FDbEMsR0FBSTZKLEdBQUd0NkUsS0FBSzZzRSxLQUFPc04sR0FBRzMwRSxLQUFLakgsR0FBSSxNQUFNeUIsS0FBS3l3RSxHQUFHLG1EQU9qRCxNQUFNaUssR0FDTixZQUFZbjhFLEVBQUdzRSxFQUFHL0QsR0FDZGtCLEtBQUs0cEQsV0FBYXJyRCxFQUFHeUIsS0FBSzgwRSwwQkFBNEJqeUUsRUFBRzdDLEtBQUswSSxFQUFJNUosR0FBS3VtRSxHQUFHOW1FLEdBRTdCLEdBQUdBLEVBQUdzRSxFQUFHL0QsRUFBR00sR0FBSSxHQUM3RCxPQUFPLElBQUltN0UsR0FBRyxDQUNWMU4sR0FBSXR1RSxFQUNKazhFLFdBQVk1M0UsRUFDWit0RSxHQUFJOXhFLEVBQ0ppUixLQUFNaXBDLEVBQUdnRSxZQUNUdXlCLElBQUksRUFDSm1CLEdBQUl0eEUsR0FDTFksS0FBSzRwRCxXQUFZNXBELEtBQUswSSxFQUFHMUksS0FBSzgwRSw0QkFJekMsU0FBUzZGLEdBQUdwOEUsR0FDUixNQUFNc0UsRUFBSXRFLEVBQUUyNUUsa0JBQW1CcDVFLEVBQUl1bUUsR0FBRzltRSxFQUFFZzNFLGFBQ3hDLE9BQU8sSUFBSW1GLEdBQUduOEUsRUFBRWczRSxjQUFlMXlFLEVBQUVpeUUsMEJBQTJCaDJFLEdBR2xCLFNBQVM4N0UsR0FBR3I4RSxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUFJLElBQ3pFLE1BQU1MLEVBQUlTLEVBQUUyeUUsR0FBRy95RSxFQUFFMDhFLE9BQVMxOEUsRUFBRTI4RSxZQUFjLEVBQW1CLEVBQWNqNEUsRUFBRy9ELEVBQUd6QixHQUNqRjA5RSxHQUFHLHNDQUF1Q2o5RSxFQUFHc0IsR0FDN0MsTUFBTWlKLEVBQUkyeUUsR0FBRzU3RSxFQUFHdEIsR0FDaEIsSUFBSUosRUFBR29FLEVBQ1AsR0FBSTNELEVBQUUwOEUsTUFBT245RSxFQUFJLElBQUl3N0MsRUFBR3A3QyxFQUFFb21ELFdBQVlwaUQsRUFBSWhFLEVBQUVvbEQscUJBQXNCLEdBQUkva0QsRUFBRTI4RSxZQUFhLENBQ2pGLE1BQU12OEUsRUFBSSxHQUNWLElBQUssTUFBTWEsS0FBS2pCLEVBQUUyOEUsWUFBYSxDQUMzQixNQUFNejlFLEVBQUk0OUUsR0FBR3A0RSxFQUFHekQsRUFBR04sR0FDbkIsSUFBS2hCLEVBQUVtSyxTQUFTNUssR0FBSSxNQUFNLElBQUlpNEMsRUFBRWpCLEVBQUVJLGlCQUFrQixVQUFVcDNDLHdFQUM5RDY5RSxHQUFHMzhFLEVBQUdsQixJQUFNa0IsRUFBRTZDLEtBQUsvRCxHQUV2QkssRUFBSSxJQUFJdzdDLEVBQUczNkMsR0FBSXVELEVBQUloRSxFQUFFb2xELGdCQUFnQmpzQyxPQUFRMVksR0FBS2IsRUFBRXk5RSxPQUFPNThFLEVBQUU0K0MsYUFDMUR6L0MsRUFBSSxLQUFNb0UsRUFBSWhFLEVBQUVvbEQsZ0JBQ3ZCLE9BQU8sSUFBSWszQixHQUFHLElBQUl4OUIsR0FBR3YwQyxHQUFJM0ssRUFBR29FLEdBR2hDLE1BQU1zNUUsV0FBV3ZCLEdBQ2Isa0JBQWtCdDdFLEdBQ2QsR0FBSSxJQUFxQkEsRUFBRXN1RSxHQUFJLE1BQU0sSUFBbUJ0dUUsRUFBRXN1RSxHQUFLdHVFLEVBQUVreUUsR0FBTXp3RSxLQUFLODVFLFlBQVIsMkRBQWdGdjdFLEVBQUVreUUsR0FBTXp3RSxLQUFLODVFLFlBQVIsNkRBR3pKLE9BQU92N0UsRUFBRTJsRCxVQUFVOWlELEtBQUs3QyxFQUFFd1IsTUFBTyxLQUVyQyxRQUFReFIsR0FDSixPQUFPQSxhQUFhNjhFLElBbUJ4QixTQUFTQyxHQUFHOThFLEVBQUdzRSxFQUFHL0QsR0FDbEIsT0FBTyxJQUFJeTdFLEdBQUcsQ0FDVjFOLEdBQUksRUFDSitELEdBQUkvdEUsRUFBRW1jLFNBQVM0eEQsR0FDZjZKLFdBQVlsOEUsRUFBRXU3RSxZQUNkdkssR0FBSXp3RSxHQUNMK0QsRUFBRSttRCxXQUFZL21ELEVBQUU2RixFQUFHN0YsRUFBRWl5RSwyQkFHNUIsTUFBTXdHLFdBQVd6QixHQUNiLGtCQUFrQnQ3RSxHQUNkLE9BQU8sSUFBSStqRCxHQUFHL2pELEVBQUV3UixLQUFNLElBQUkyeEMsSUFFOUIsUUFBUW5qRCxHQUNKLE9BQU9BLGFBQWErOEUsSUFJNUIsTUFBTUMsV0FBVzFCLEdBQ2IsWUFBWXQ3RSxFQUFHc0UsR0FDWHNFLE1BQU01SSxHQUFJeUIsS0FBSzh4RSxHQUFLanZFLEVBRXhCLGtCQUFrQnRFLEdBQ2QsTUFBTXNFLEVBQUl3NEUsR0FBR3I3RSxLQUFNekIsR0FDUixHQUFLTyxFQUFJa0IsS0FBSzh4RSxHQUFHdjdELElBQUtoWSxHQUFLaTlFLEdBQUdqOUUsRUFBR3NFLElBQU16RCxFQUFJLElBQUl3aUQsR0FBRzlpRCxHQUM3RCxPQUFPLElBQUl3akQsR0FBRy9qRCxFQUFFd1IsS0FBTTNRLEdBRTFCLFFBQVFiLEdBRUosT0FBT3lCLE9BQVN6QixHQUl4QixNQUFNazlFLFdBQVc1QixHQUNiLFlBQVl0N0UsRUFBR3NFLEdBQ1hzRSxNQUFNNUksR0FBSXlCLEtBQUs4eEUsR0FBS2p2RSxFQUV4QixrQkFBa0J0RSxHQUNkLE1BQU1zRSxFQUFJdzRFLEdBQUdyN0UsS0FBTXpCLEdBQ1IsR0FBS08sRUFBSWtCLEtBQUs4eEUsR0FBR3Y3RCxJQUFLaFksR0FBS2k5RSxHQUFHajlFLEVBQUdzRSxJQUFNekQsRUFBSSxJQUFJMGlELEdBQUdoakQsR0FDN0QsT0FBTyxJQUFJd2pELEdBQUcvakQsRUFBRXdSLEtBQU0zUSxHQUUxQixRQUFRYixHQUVKLE9BQU95QixPQUFTekIsR0FJeEIsTUFBTW05RSxXQUFXN0IsR0FDYixZQUFZdDdFLEVBQUdzRSxHQUNYc0UsTUFBTTVJLEdBQUl5QixLQUFLa3lFLEdBQUtydkUsRUFFeEIsa0JBQWtCdEUsR0FDZCxNQUFNc0UsRUFBSSxJQUFJcy9DLEdBQUc1akQsRUFBRW1LLEVBQUc2NEMsR0FBR2hqRCxFQUFFbUssRUFBRzFJLEtBQUtreUUsS0FDbkMsT0FBTyxJQUFJNXZCLEdBQUcvakQsRUFBRXdSLEtBQU1sTixHQUUxQixRQUFRdEUsR0FFSixPQUFPeUIsT0FBU3pCLEdBSXdCLFNBQVNvOUUsR0FBR3A5RSxFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ2pFLE1BQU0vQixFQUFJa0IsRUFBRTJ5RSxHQUFHLEVBQWlCcnVFLEVBQUcvRCxHQUNuQ2k4RSxHQUFHLHNDQUF1QzE5RSxFQUFHK0IsR0FDN0MsTUFBTWpCLEVBQUksR0FBSUwsRUFBSTgrQyxHQUFHYyxRQUNyQnRGLEVBQUdoNUMsRUFBRyxDQUFFYixFQUFHYSxLQUNQLE1BQU1pSixFQUFJdXpFLEdBQUcvNEUsRUFBR3RFLEVBQUdPLEdBR1hNLEVBQUksWUFBbUJBLEdBQy9CLE1BQU0xQixFQUFJTCxFQUFFMHlFLEdBQUcxbkUsR0FDZixHQUFJakosYUFBYWc4RSxHQUVqQmo5RSxFQUFFaUQsS0FBS2lILE9BQVMsQ0FDWixNQUFNOUosRUFBSWk5RSxHQUFHcDhFLEVBQUcxQixHQUNoQixNQUFRYSxJQUFNSixFQUFFaUQsS0FBS2lILEdBQUl2SyxFQUFFaVIsSUFBSTFHLEVBQUc5SixPQUcxQyxNQUFNOEosRUFBSSxJQUFJNndDLEVBQUcvNkMsR0FDakIsT0FBTyxJQUFJazhFLEdBQUd2OEUsRUFBR3VLLEVBQUdoTCxFQUFFNmxELGlCQUdxQyxTQUFTMjRCLEdBQUd0OUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsRUFBR2MsR0FDdEYsTUFBTUwsRUFBSVMsRUFBRTJ5RSxHQUFHLEVBQWlCcnVFLEVBQUcvRCxHQUFJdUosRUFBSSxDQUFFNHlFLEdBQUdwNEUsRUFBR3pELEVBQUdOLElBQU1wQixFQUFJLENBQUVMLEdBQ2xFLEdBQUljLEVBQUVxQixPQUFTLEdBQUssRUFBRyxNQUFNLElBQUk4MUMsRUFBRWpCLEVBQUVJLGlCQUFrQixZQUFZNXhDLDBHQUNuRSxJQUFLLElBQUl0RSxFQUFJLEVBQUdBLEVBQUlKLEVBQUVxQixPQUFRakIsR0FBSyxFQUFHOEosRUFBRWpILEtBQUs2NUUsR0FBR3A0RSxFQUFHMUUsRUFBRUksS0FBTWIsRUFBRTBELEtBQUtqRCxFQUFFSSxFQUFJLElBQ3hFLE1BQU11RCxFQUFJLEdBQUl1MEMsRUFBSXVHLEdBQUdjLFFBR3JCLElBQUssSUFBSW4vQyxFQUFJOEosRUFBRTdJLE9BQVMsRUFBR2pCLEdBQUssSUFBS0EsRUFBRyxJQUFLMjhFLEdBQUdwNUUsRUFBR3VHLEVBQUU5SixJQUFLLENBQ3RELE1BQU1zRSxFQUFJd0YsRUFBRTlKLEdBQ1osSUFBSU8sRUFBSXBCLEVBQUVhLEdBR0ZPLEVBQUksWUFBbUJBLEdBQy9CLE1BQU1NLEVBQUl0QixFQUFFaXlFLEdBQUdsdEUsR0FDZixHQUFJL0QsYUFBYXM4RSxHQUVqQnQ1RSxFQUFFVixLQUFLeUIsT0FBUyxDQUNaLE1BQU10RSxFQUFJaTlFLEdBQUcxOEUsRUFBR00sR0FDaEIsTUFBUWIsSUFBTXVELEVBQUVWLEtBQUt5QixHQUFJd3pDLEVBQUV0bkMsSUFBSWxNLEVBQUd0RSxLQUcxQyxNQUFNakIsRUFBSSxJQUFJNDdDLEVBQUdwM0MsR0FDakIsT0FBTyxJQUFJdTRFLEdBQUdoa0MsRUFBRy80QyxFQUFHUSxFQUFFb2xELGlCQVN0QixTQUFTNDRCLEdBQUd2OUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUFJLEdBQ3pCLE9BQU9vOEUsR0FBRzE4RSxFQUFHUCxFQUFFMnlFLEdBQUc5eEUsRUFBSSxFQUF3QixFQUFtQnlELElBV2pFLFNBQVMyNEUsR0FBR2o5RSxFQUFHc0UsR0FDZixHQUFJazVFLEdBR0p4OUUsRUFBSSxZQUFtQkEsSUFBSyxPQUFPdzhFLEdBQUcsMkJBQTRCbDRFLEVBQUd0RSxHQUFJeThFLEdBQUd6OEUsRUFBR3NFLEdBQy9FLEdBQUl0RSxhQUFhczdFLEdBVWpCLE9BQU8sU0FBU3Q3RSxFQUFHc0UsR0FFZixJQUFLeTNFLEdBQUd6M0UsRUFBRWdxRSxJQUFLLE1BQU1ocUUsRUFBRTR0RSxHQUFNbHlFLEVBQUV1N0UsWUFBTCwrQ0FDMUIsSUFBS2ozRSxFQUFFa04sS0FBTSxNQUFNbE4sRUFBRTR0RSxHQUFNbHlFLEVBQUV1N0UsWUFBTCwrQ0FDeEIsTUFBTWg3RSxFQUFJUCxFQUFFeTlFLGtCQUFrQm41RSxHQUM5Qi9ELEdBQUsrRCxFQUFFcWdELGdCQUFnQjloRCxLQUFLdEMsR0FMekIsQ0FXTlAsRUFBR3NFLEdBQUksS0FDUixRQUFJLElBQVd0RSxHQUFLc0UsRUFBRWl5RSwwQkFJdEIsT0FBTyxLQUNQLEdBR0FqeUUsRUFBRWtOLE1BQVFsTixFQUFFcWhELFVBQVU5aUQsS0FBS3lCLEVBQUVrTixNQUFPeFIsYUFBYThCLE1BQU8sQ0FPcEQsR0FBSXdDLEVBQUVtYyxTQUFTdXdELElBQU0sSUFBMEIxc0UsRUFBRWdxRSxHQUFJLE1BQU1ocUUsRUFBRTR0RSxHQUFHLG1DQUNoRSxPQUFPLFNBQVNseUUsRUFBR3NFLEdBQ2YsTUFBTS9ELEVBQUksR0FDVixJQUFJTSxFQUFJLEVBQ1IsSUFBSyxNQUFNL0IsS0FBS2tCLEVBQUcsQ0FDZixJQUFJQSxFQUFJaTlFLEdBQUduK0UsRUFBR3dGLEVBQUVzdEUsR0FBRy93RSxJQUNuQixNQUFRYixJQUdSQSxFQUFJLENBQ0FraEQsVUFBVyxlQUNYM2dELEVBQUVzQyxLQUFLN0MsR0FBSWEsSUFFbkIsTUFBTyxDQUNIczhDLFdBQVksQ0FDUkMsT0FBUTc4QyxJQWRiLENBaUJMUCxFQUFHc0UsR0FFVCxPQUFPLFNBQVN0RSxFQUFHc0UsR0FDZixHQUFJLFFBQVV0RSxFQUFJLFlBQW1CQSxJQUFLLE1BQU8sQ0FDN0NraEQsVUFBVyxjQUVmLEdBQUksaUJBQW1CbGhELEVBQUcsT0FBT2dqRCxHQUFHMStDLEVBQUU2RixFQUFHbkssR0FDekMsR0FBSSxrQkFBb0JBLEVBQUcsTUFBTyxDQUM5QjI4QyxhQUFjMzhDLEdBRWxCLEdBQUksaUJBQW1CQSxFQUFHLE1BQU8sQ0FDN0I0N0MsWUFBYTU3QyxHQUVqQixHQUFJQSxhQUFhNkUsS0FBTSxDQUNuQixNQUFNdEUsRUFBSTY0QyxFQUFHc2tDLFNBQVMxOUUsR0FDdEIsTUFBTyxDQUNIKzdDLGVBQWdCdVAsR0FBR2huRCxFQUFFNkYsRUFBRzVKLElBR2hDLEdBQUlQLGFBQWFvNUMsRUFBSSxDQUlqQixNQUFNNzRDLEVBQUksSUFBSTY0QyxFQUFHcDVDLEVBQUV1VixRQUFTLElBQU1uRSxLQUFLdW5CLE1BQU0zNEIsRUFBRXE1QyxZQUFjLE1BQzdELE1BQU8sQ0FDSDBDLGVBQWdCdVAsR0FBR2huRCxFQUFFNkYsRUFBRzVKLElBR2hDLEdBQUlQLGFBQWF3N0UsR0FBSSxNQUFPLENBQ3hCMStCLGNBQWUsQ0FDWEMsU0FBVS84QyxFQUFFKzhDLFNBQ1pDLFVBQVdoOUMsRUFBRWc5QyxZQUdyQixHQUFJaDlDLGFBQWFvN0UsR0FBSSxNQUFPLENBQ3hCeCtCLFdBQVk0TyxHQUFHbG5ELEVBQUU2RixFQUFHbkssRUFBRXE3RSxjQUUxQixHQUFJcjdFLGFBQWEyM0UsR0FBSSxDQUNqQixNQUFNcDNFLEVBQUkrRCxFQUFFK21ELFdBQVl4cUQsRUFBSWIsRUFBRTYzRSxVQUFVYixZQUN4QyxJQUFLbjJFLEVBQUU4NEMsUUFBUXA1QyxHQUFJLE1BQU0rRCxFQUFFNHRFLEdBQUcsc0NBQXNDcnhFLEVBQUU2RSxhQUFhN0UsRUFBRWk5Qyx1Q0FBdUN2OUMsRUFBRW1GLGFBQWFuRixFQUFFdTlDLFlBQzdJLE1BQU8sQ0FDSGpCLGVBQWdCaVAsR0FBRzlyRCxFQUFFNjNFLFVBQVViLGFBQWUxeUUsRUFBRSttRCxXQUFZcnJELEVBQUU2YyxLQUFLckwsT0FHM0UsTUFBTWxOLEVBQUU0dEUsR0FBRyw0QkFBNEJnRSxHQUFHbDJFLElBMUN2QyxDQWtETkEsRUFBR3NFLEdBR1IsU0FBU200RSxHQUFHejhFLEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJLEdBQ1YsT0FBT3U1QyxFQUFHOTVDLEdBR1ZzRSxFQUFFa04sTUFBUWxOLEVBQUVrTixLQUFLdlEsT0FBUyxHQUFLcUQsRUFBRXFoRCxVQUFVOWlELEtBQUt5QixFQUFFa04sTUFBUXFvQyxFQUFHNzVDLEVBQUcsQ0FBRUEsRUFBR2EsS0FDakUsTUFBTS9CLEVBQUltK0UsR0FBR3A4RSxFQUFHeUQsRUFBRXF4RSxHQUFHMzFFLElBQ3JCLE1BQVFsQixJQUFNeUIsRUFBRVAsR0FBS2xCLEtBQ3BCLENBQ0Q0OEMsU0FBVSxDQUNOZCxPQUFRcjZDLElBS3BCLFNBQVNpOUUsR0FBR3g5RSxHQUNSLFFBQVMsaUJBQW1CQSxHQUFLLE9BQVNBLEdBQUtBLGFBQWE4QixPQUFTOUIsYUFBYTZFLE1BQVE3RSxhQUFhbzVDLEdBQU1wNUMsYUFBYXc3RSxJQUFNeDdFLGFBQWFvN0UsSUFBTXA3RSxhQUFhMjNFLElBQU0zM0UsYUFBYXM3RSxJQUd2TCxTQUFTa0IsR0FBR3g4RSxFQUFHc0UsRUFBRy9ELEdBQ2QsSUFBS2k5RSxHQUFHajlFLEtBQU8sU0FBU1AsR0FDcEIsTUFBTyxpQkFBbUJBLEdBQUssT0FBU0EsSUFBTVIsT0FBT20rRSxlQUFlMzlFLEtBQU9SLE9BQU9rQixXQUFhLE9BQVNsQixPQUFPbStFLGVBQWUzOUUsSUFEbkgsQ0FFYk8sR0FBSSxDQUNGLE1BQU1NLEVBQUlxMUUsR0FBRzMxRSxHQUNiLEtBQU0sY0FBZ0JNLEVBQUl5RCxFQUFFNHRFLEdBQUdseUUsRUFBSSxvQkFBc0JzRSxFQUFFNHRFLEdBQUdseUUsRUFBSSxJQUFNYSxJQU01RSxTQUFTNjdFLEdBQUcxOEUsRUFBR3NFLEVBQUcvRCxHQUNsQixJQUdBK0QsRUFBSSxZQUFtQkEsY0FBZTIyRSxHQUFJLE9BQU8zMkUsRUFBRTQyRSxjQUNuRCxHQUFJLGlCQUFtQjUyRSxFQUFHLE9BQU8rNEUsR0FBR3I5RSxFQUFHc0UsR0FDdkMsTUFBTTIzRSxHQUFHLDREQUE2RGo4RSxHQUNsRCxPQUNSLEVBQVFPLEdBS3BCLE1BQU1xOUUsR0FBSyxJQUFJcDFDLE9BQU8saUJBVXRCLFNBQVM2MEMsR0FBR3I5RSxFQUFHc0UsRUFBRy9ELEdBQ2xCLEdBQUkrRCxFQUFFdTVFLE9BQU9ELEtBQU8sRUFBRyxNQUFNM0IsR0FBRyx1QkFBdUIzM0Usd0RBQXlEdEUsR0FDNUYsT0FDUixFQUFRTyxHQUNwQixJQUNJLE9BQU8sSUFBSTA2RSxNQUFNMzJFLEVBQUUwRyxNQUFNLE1BQU1rd0UsY0FDakMsTUFBT3I2RSxHQUNMLE1BQU1vN0UsR0FBRyx1QkFBdUIzM0UsNkVBQThFdEUsR0FDMUYsT0FDUixFQUFRTyxJQUk1QixTQUFTMDdFLEdBQUdqOEUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDcEIsTUFBTWMsRUFBSWlCLElBQU1BLEVBQUUrSSxVQUFXckssT0FBSSxJQUFXVCxFQUM1QyxJQUFJZ0wsRUFBSSxZQUFZeEYsK0JBQ3BCL0QsSUFBTXVKLEdBQUssMEJBQTJCQSxHQUFLLEtBQzNDLElBQUkzSyxFQUFJLEdBQ1IsT0FBUVMsR0FBS0wsS0FBT0osR0FBSyxVQUFXUyxJQUFNVCxHQUFLLGFBQWEwQixHQUFNdEIsSUFBTUosR0FBSyxnQkFBZ0JMLEdBQzdGSyxHQUFLLEtBQU0sSUFBSTQzQyxFQUFFakIsRUFBRUksaUJBQWtCcHNDLEVBQUk5SixFQUFJYixHQUd3QixTQUFTdzlFLEdBQUczOEUsRUFBR3NFLEdBQ3BGLE9BQU90RSxFQUFFMlksS0FBTTNZLEdBQUtBLEVBQUUyNUMsUUFBUXIxQzs7Ozs7Ozs7Ozs7Ozs7OztHQTJCOUIsTUFBTXc1RSxHQU1OLFlBQVk5OUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDcEIyQyxLQUFLczhFLFdBQWEvOUUsRUFBR3lCLEtBQUt1OEUsZ0JBQWtCMTVFLEVBQUc3QyxLQUFLb2IsS0FBT3RjLEVBQUdrQixLQUFLdzhFLFVBQVlwOUUsRUFDL0VZLEtBQUt5OEUsV0FBYXAvRSxFQUV3RCxTQUMxRSxPQUFPMkMsS0FBS29iLEtBQUtyTCxLQUFLOHNDLGNBSW5CLFVBQ0gsT0FBTyxJQUFJcTVCLEdBQUdsMkUsS0FBS3M4RSxXQUFZdDhFLEtBQUt5OEUsV0FBWXo4RSxLQUFLb2IsTUFNbEQsU0FDSCxPQUFPLE9BQVNwYixLQUFLdzhFLFVBUWxCLE9BQ0gsR0FBSXg4RSxLQUFLdzhFLFVBQVcsQ0FDaEIsR0FBSXg4RSxLQUFLeThFLFdBQVksQ0FHakIsTUFBTWwrRSxFQUFJLElBQUltK0UsR0FBRzE4RSxLQUFLczhFLFdBQVl0OEUsS0FBS3U4RSxnQkFBaUJ2OEUsS0FBS29iLEtBQU1wYixLQUFLdzhFLFVBQ3ZELE1BQ2pCLE9BQU94OEUsS0FBS3k4RSxXQUFXRSxjQUFjcCtFLEdBRXpDLE9BQU95QixLQUFLdThFLGdCQUFnQkssYUFBYTU4RSxLQUFLdzhFLFVBQVU5MEUsS0FBS3BKLFFBY3JFLElBQUlDLEdBQ0EsR0FBSXlCLEtBQUt3OEUsVUFBVyxDQUNoQixNQUFNMzVFLEVBQUk3QyxLQUFLdzhFLFVBQVU5MEUsS0FBS3kxQyxNQUFNMC9CLEdBQUcsdUJBQXdCdCtFLElBQy9ELEdBQUksT0FBU3NFLEVBQUcsT0FBTzdDLEtBQUt1OEUsZ0JBQWdCSyxhQUFhLzVFLEtBZWpFLE1BQU02NUUsV0FBV0wsR0FPakIsT0FDSSxPQUFPbDFFLE1BQU1PLFFBTWpCLFNBQVNtMUUsR0FBR3QrRSxFQUFHc0UsR0FDZixNQUFPLGlCQUFtQkEsRUFBSSs0RSxHQUFHcjlFLEVBQUdzRSxHQUFLQSxhQUFhMjJFLEdBQUszMkUsRUFBRTQyRSxjQUFnQjUyRSxFQUFFOEksVUFBVTh0RTs7Ozs7Ozs7Ozs7Ozs7OztHQXFCekYsTUFBTXFELEdBRU4sWUFBWXYrRSxFQUFHc0UsR0FDWDdDLEtBQUtxK0QsaUJBQW1COS9ELEVBQUd5QixLQUFLaStELFVBQVlwN0QsRUFPekMsUUFBUXRFLEdBQ1gsT0FBT3lCLEtBQUtxK0QsbUJBQXFCOS9ELEVBQUU4L0Qsa0JBQW9CcitELEtBQUtpK0QsWUFBYzEvRCxFQUFFMC9ELFdBWWhGLE1BQU04ZSxXQUFXVixHQUVqQixZQUFZOTlFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUdjLEdBQ3ZCZ0osTUFBTTVJLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBR2pCLEdBQUk2QixLQUFLczhFLFdBQWEvOUUsRUFBR3lCLEtBQUtnOUUsZUFBaUJ6K0UsRUFBR3lCLEtBQUs4VixTQUFXelksRUFLakYsU0FDSCxPQUFPOEosTUFBTXk3QyxTQWVWLEtBQUtya0QsRUFBSSxJQUNaLEdBQUl5QixLQUFLdzhFLFVBQVcsQ0FDaEIsR0FBSXg4RSxLQUFLeThFLFdBQVksQ0FHakIsTUFBTTU1RSxFQUFJLElBQUlvNkUsR0FBR2o5RSxLQUFLczhFLFdBQVl0OEUsS0FBS3U4RSxnQkFBaUJ2OEUsS0FBS29iLEtBQU1wYixLQUFLdzhFLFVBQVd4OEUsS0FBSzhWLFNBQ3ZFLE1BQ2pCLE9BQU85VixLQUFLeThFLFdBQVdFLGNBQWM5NUUsRUFBR3RFLEdBRTVDLE9BQU95QixLQUFLdThFLGdCQUFnQkssYUFBYTU4RSxLQUFLdzhFLFVBQVU5MEUsS0FBS3BKLE1BQU9DLEVBQUUyK0UsbUJBcUI5RSxJQUFJMytFLEVBQUdzRSxFQUFJLElBQ1AsR0FBSTdDLEtBQUt3OEUsVUFBVyxDQUNoQixNQUFNMTlFLEVBQUlrQixLQUFLdzhFLFVBQVU5MEUsS0FBS3kxQyxNQUFNMC9CLEdBQUcsdUJBQXdCdCtFLElBQy9ELEdBQUksT0FBU08sRUFBRyxPQUFPa0IsS0FBS3U4RSxnQkFBZ0JLLGFBQWE5OUUsRUFBRytELEVBQUVxNkUsb0JBZXRFLE1BQU1ELFdBQVdGLEdBY2pCLEtBQUt4K0UsRUFBSSxJQUNMLE9BQU80SSxNQUFNTyxLQUFLbkosSUFVdEIsTUFBTTQrRSxHQUVOLFlBQVk1K0UsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNqQlksS0FBS3M4RSxXQUFhLzlFLEVBQUd5QixLQUFLdThFLGdCQUFrQjE1RSxFQUFHN0MsS0FBS285RSxVQUFZaCtFLEVBQUdZLEtBQUs4VixTQUFXLElBQUlnbkUsR0FBRzE5RSxFQUFFaS9ELGlCQUFrQmovRCxFQUFFNitELFdBQ2hIaitELEtBQUttUixNQUFRclMsRUFFK0MsV0FDNUQsTUFBTVAsRUFBSSxHQUNWLE9BQU95QixLQUFLbUosUUFBU3RHLEdBQUt0RSxFQUFFNkMsS0FBS3lCLElBQU10RSxFQUVlLFdBQ3RELE9BQU95QixLQUFLbzlFLFVBQVV6YyxLQUFLenJDLEtBRWtDLFlBQzdELE9BQU8sSUFBTWwxQixLQUFLazFCLEtBUWYsUUFBUTMyQixFQUFHc0UsR0FDZDdDLEtBQUtvOUUsVUFBVXpjLEtBQUt4M0QsUUFBU3JLLElBQ3pCUCxFQUFFZixLQUFLcUYsRUFBRyxJQUFJbzZFLEdBQUdqOUUsS0FBS3M4RSxXQUFZdDhFLEtBQUt1OEUsZ0JBQWlCejlFLEVBQUVGLElBQUtFLEVBQUcsSUFBSWcrRSxHQUFHOThFLEtBQUtvOUUsVUFBVWpULFlBQVk1K0MsSUFBSXpzQixFQUFFRixLQUFNb0IsS0FBS285RSxVQUFVbmYsV0FBWWorRCxLQUFLbVIsTUFBTWdsRSxjQVd2SixXQUFXNTNFLEVBQUksSUFDbEIsTUFBTXNFLElBQU10RSxFQUFFMnNFLHVCQUNkLEdBQUlyb0UsR0FBSzdDLEtBQUtvOUUsVUFBVS9TLHdCQUF5QixNQUFNLElBQUkvMEIsRUFBRWpCLEVBQUVJLGlCQUFrQiwrSEFDakYsT0FBT3owQyxLQUFLcTlFLGdCQUFrQnI5RSxLQUFLczlFLHVDQUF5Q3o2RSxJQUFNN0MsS0FBS3E5RSxlQUV2RixTQUFTOStFLEVBQUdzRSxHQUNSLEdBQUl0RSxFQUFFNitFLFVBQVVsVCxRQUFRL2hFLFVBQVcsQ0FDL0IsSUFBSXRGLEVBQUksRUFDUixPQUFPdEUsRUFBRTYrRSxVQUFVbGYsV0FBVzNuRCxJQUFLelgsSUFBSyxDQUNwQ3FHLEtBQU0sUUFDTmc1RCxJQUFLLElBQUk4ZSxHQUFHMStFLEVBQUUrOUUsV0FBWS85RSxFQUFFZytFLGdCQUFpQno5RSxFQUFFcS9ELElBQUl2L0QsSUFBS0UsRUFBRXEvRCxJQUFLLElBQUkyZSxHQUFHditFLEVBQUU2K0UsVUFBVWpULFlBQVk1K0MsSUFBSXpzQixFQUFFcS9ELElBQUl2L0QsS0FBTUwsRUFBRTYrRSxVQUFVbmYsV0FBWTEvRCxFQUFFNFMsTUFBTWdsRSxXQUM5SW9ILFVBQVcsRUFDWEMsU0FBVTM2RSxPQUdsQixDQUdJLElBQUkvRCxFQUFJUCxFQUFFNitFLFVBQVVsVCxRQUNwQixPQUFPM3JFLEVBQUU2K0UsVUFBVWxmLFdBQVdqbkQsT0FBUTFZLEdBQUtzRSxHQUFLLElBQXFCdEUsRUFBRTRHLE1BQU9vUixJQUFLMVQsSUFDL0UsTUFBTXpELEVBQUksSUFBSTY5RSxHQUFHMStFLEVBQUUrOUUsV0FBWS85RSxFQUFFZytFLGdCQUFpQjE1RSxFQUFFczdELElBQUl2L0QsSUFBS2lFLEVBQUVzN0QsSUFBSyxJQUFJMmUsR0FBR3YrRSxFQUFFNitFLFVBQVVqVCxZQUFZNStDLElBQUkxb0IsRUFBRXM3RCxJQUFJdi9ELEtBQU1MLEVBQUU2K0UsVUFBVW5mLFdBQVkxL0QsRUFBRTRTLE1BQU1nbEUsV0FDbkosSUFBSTk0RSxHQUFLLEVBQUdjLEdBQUssRUFDakIsT0FBTyxJQUFrQjBFLEVBQUVzQyxPQUFTOUgsRUFBSXlCLEVBQUV3SCxRQUFRekQsRUFBRXM3RCxJQUFJdi9ELEtBQU1FLEVBQUlBLEVBQUVtMkIsT0FBT3B5QixFQUFFczdELElBQUl2L0QsTUFDakYsSUFBb0JpRSxFQUFFc0MsT0FBU3JHLEVBQUlBLEVBQUVzbEIsSUFBSXZoQixFQUFFczdELEtBQU1oZ0UsRUFBSVcsRUFBRXdILFFBQVF6RCxFQUFFczdELElBQUl2L0QsTUFBTyxDQUN4RXVHLEtBQU1zNEUsR0FBRzU2RSxFQUFFc0MsTUFDWGc1RCxJQUFLLytELEVBQ0xtK0UsU0FBVWxnRixFQUNWbWdGLFNBQVVyL0UsTUF0QjFCLENBMEJFNkIsS0FBTTZDLEdBQUk3QyxLQUFLczlFLHFDQUF1Q3o2RSxHQUFJN0MsS0FBS3E5RSxnQkFJekUsU0FBU0ksR0FBR2wvRSxHQUNSLE9BQVFBLEdBQ04sS0FBSyxFQUNILE1BQU8sUUFFVCxLQUFLLEVBQ0wsS0FBSyxFQUNILE1BQU8sV0FFVCxLQUFLLEVBQ0gsTUFBTyxVQUVULFFBQ0UsT0FBTytvQyxLQVlYLFNBQVNvMkMsR0FBR24vRSxFQUFHc0UsR0FDZixPQUFPdEUsYUFBYXcrRSxJQUFNbDZFLGFBQWFrNkUsR0FBS3grRSxFQUFFKzlFLGFBQWV6NUUsRUFBRXk1RSxZQUFjLzlFLEVBQUU2YyxLQUFLODhCLFFBQVFyMUMsRUFBRXVZLFFBQVUsT0FBUzdjLEVBQUVpK0UsVUFBWSxPQUFTMzVFLEVBQUUyNUUsVUFBWWorRSxFQUFFaStFLFVBQVV0a0MsUUFBUXIxQyxFQUFFMjVFLGFBQWVqK0UsRUFBRWsrRSxhQUFlNTVFLEVBQUU0NUUsV0FBYWwrRSxhQUFhNCtFLElBQU10NkUsYUFBYXM2RSxJQUFPNStFLEVBQUUrOUUsYUFBZXo1RSxFQUFFeTVFLFlBQWN6RixHQUFHdDRFLEVBQUU0UyxNQUFPdE8sRUFBRXNPLFFBQVU1UyxFQUFFdVgsU0FBU29pQyxRQUFRcjFDLEVBQUVpVCxXQUFhdlgsRUFBRTYrRSxVQUFVbGxDLFFBQVFyMUMsRUFBRXU2RTs7Ozs7Ozs7Ozs7Ozs7OztHQWtCblgsU0FBU08sR0FBR3AvRSxHQUNaLEdBQUk0aEQsR0FBRzVoRCxJQUFNLElBQU1BLEVBQUV1aEQsZ0JBQWdCdGdELE9BQVEsTUFBTSxJQUFJODFDLEVBQUVqQixFQUFFYSxjQUFlLDBFQVUxRSxNQUFNMG9DLElBVU4sU0FBU0MsR0FBR3QvRSxLQUFNc0UsR0FDbEIsSUFBSyxNQUFNL0QsS0FBSytELEVBQUd0RSxFQUFJTyxFQUFFZy9FLE9BQU92L0UsR0FDaEMsT0FBT0EsRUFHWCxNQUFNdy9FLFdBQVdILEdBQ2IsWUFBWXIvRSxFQUFHc0UsRUFBRy9ELEdBQ2RxSSxRQUFTbkgsS0FBSzB5RSxHQUFLbjBFLEVBQUd5QixLQUFLK3lFLEdBQUtsd0UsRUFBRzdDLEtBQUtnekUsR0FBS2wwRSxFQUFHa0IsS0FBS21GLEtBQU8sUUFFaEUsT0FBTzVHLEdBQ0gsTUFBTXNFLEVBQUk4M0UsR0FBR3A4RSxFQUFFNjNFLFdBQVl0M0UsRUFBSSxTQUFTUCxFQUFHc0UsRUFBRy9ELEVBQUdNLEVBQUcvQixFQUFHYyxFQUFHTCxHQUN0RCxJQUFJdUssRUFDSixHQUFJaEwsRUFBRTJoRCxhQUFjLENBQ2hCLEdBQUksbUJBQTBDN2dELEdBQUssdUJBQWtEQSxFQUFHLE1BQU0sSUFBSW0zQyxFQUFFakIsRUFBRUksaUJBQWtCLHFDQUFxQ3QyQyx5Q0FDN0ssR0FBSSxPQUFrQkEsR0FBSyxXQUEwQkEsRUFBRyxDQUNwRDYvRSxHQUFHbGdGLEVBQUdLLEdBQ04sTUFBTTBFLEVBQUksR0FDVixJQUFLLE1BQU0vRCxLQUFLaEIsRUFBRytFLEVBQUV6QixLQUFLNjhFLEdBQUc3K0UsRUFBR2IsRUFBR08sSUFDbkN1SixFQUFJLENBQ0FxekMsV0FBWSxDQUNSQyxPQUFROTRDLFNBR2J3RixFQUFJNDFFLEdBQUc3K0UsRUFBR2IsRUFBR1QsT0FDakIsT0FBa0JLLEdBQUssV0FBMEJBLEdBQUssdUJBQWtEQSxHQUFLNi9FLEdBQUdsZ0YsRUFBR0ssR0FDMUhrSyxFQUFJeXpFLEdBQUdoOUUsRUFtREMsUUFuREtoQixFQUNNLE9BQWtCSyxHQUFLLFdBQTBCQSxHQUNwRSxNQUFNVCxFQUFJcWhELEdBQUdwZ0QsT0FBT3RCLEVBQUdjLEVBQUdrSyxHQUMxQixPQUFPLFNBQVM5SixFQUFHc0UsR0FDZixHQUFJQSxFQUFFeTlDLElBQUssQ0FDUCxNQUFNeGhELEVBQUl1aEQsR0FBRzloRCxHQUNiLEdBQUksT0FBU08sSUFBTUEsRUFBRW81QyxRQUFRcjFDLEVBQUVzNkMsT0FBUSxNQUFNLElBQUk3SCxFQUFFakIsRUFBRUksaUJBQWtCLG9KQUFvSjMxQyxFQUFFNEcsb0JBQW9CN0MsRUFBRXM2QyxNQUFNejNDLGVBQ3pQLE1BQU10RyxFQUFJZ2hELEdBQUc3aEQsR0FDYixPQUFTYSxHQUFLOCtFLEdBQUczL0UsRUFBR3NFLEVBQUVzNkMsTUFBTy85QyxHQUVqQyxNQUFNTixFQUFJLFNBQVNQLEVBQUdzRSxHQUNsQixJQUFLLE1BQU0vRCxLQUFLUCxFQUFFMC9DLFFBQVMsR0FBSXA3QyxFQUFFeUQsUUFBUXhILEVBQUU0NkIsS0FBTyxFQUFHLE9BQU81NkIsRUFBRTQ2QixHQUM5RCxPQUFPLEtBRkQsQ0FHUm43QixFQWFGLFNBQVNBLEdBQ0wsT0FBUUEsR0FDTixJQUFLLEtBQ0gsTUFBTyxDQUFFLEtBQXVCLFVBRWxDLElBQUssaUJBQ0gsTUFBTyxDQUFFLGlCQUF3QyxxQkFBZ0QsVUFFbkcsSUFBSyxLQUNILE1BQU8sQ0FBRSxxQkFBZ0QsS0FBZ0IsVUFFM0UsSUFBSyxxQkFDSCxNQUFPLENBQUUsaUJBQXdDLHFCQUFnRCxLQUFnQixVQUVuSCxJQUFLLFNBQ0gsTUFBTyxDQUFFLGlCQUF3QyxxQkFBZ0QsS0FBZ0IsU0FBd0IsTUFFM0ksUUFDRSxNQUFPLElBbEJmLENBb0JFc0UsRUFBRTYyQixLQUNKLEdBQUksT0FBUzU2QixFQUViLE1BQU1BLElBQU0rRCxFQUFFNjJCLEdBQUssSUFBSTRiLEVBQUVqQixFQUFFSSxpQkFBa0IsZ0RBQWdENXhDLEVBQUU2MkIsR0FBR2gwQix1QkFBeUIsSUFBSTR2QyxFQUFFakIsRUFBRUksaUJBQWtCLGtDQUFrQzV4QyxFQUFFNjJCLEdBQUdoMEIsNkJBQTZCNUcsRUFBRTRHLHdCQTlDeE4sQ0ErQ0xuSCxFQUFHYixHQUFJQSxFQWpFa0IsQ0FrRTdCYSxFQUFFZzRFLE9BQVEsRUFBUzF6RSxFQUFHdEUsRUFBRTYzRSxVQUFVYixZQUFhdjFFLEtBQUsweUUsR0FBSTF5RSxLQUFLK3lFLEdBQUkveUUsS0FBS2d6RSxJQUN4RSxPQUFPLElBQUlzRCxHQUFHLzNFLEVBQUU2M0UsVUFBVzczRSxFQUFFNDNFLFVBQVcsU0FBUzUzRSxFQUFHc0UsR0FDaEQsTUFBTS9ELEVBQUlQLEVBQUUwL0MsUUFBUWtQLE9BQU8sQ0FBRXRxRCxJQUM3QixPQUFPLElBQUk4WCxHQUFHcGMsRUFBRXdSLEtBQU14UixFQUFFdy9DLGdCQUFpQngvQyxFQUFFdWhELGdCQUFnQjN4QyxRQUFTclAsRUFBR1AsRUFBRW02QyxNQUFPbjZDLEVBQUV3aEQsVUFBV3hoRCxFQUFFMi9DLFFBQVMzL0MsRUFBRTQvQyxPQUZ0RSxDQUd0QzUvQyxFQUFFZzRFLE9BQVF6M0UsS0FjaEIsU0FBU3EvRSxHQUFHNS9FLEVBQUdzRSxFQUFHL0QsR0FDbEIsTUFBTU0sRUFBSXlELEVBQUd4RixFQUFJdy9FLEdBQUcsUUFBU3QrRSxHQUM3QixPQUFPLElBQUl3L0UsR0FBRzFnRixFQUFHK0IsRUFBR04sR0FHeEIsTUFBTXMvRSxXQUFXUixHQUNiLFlBQVlyL0UsRUFBR3NFLEdBQ1hzRSxRQUFTbkgsS0FBSzB5RSxHQUFLbjBFLEVBQUd5QixLQUFLaXpFLEdBQUtwd0UsRUFBRzdDLEtBQUttRixLQUFPLFVBRW5ELE9BQU81RyxHQUNILE1BQU1zRSxFQUFJLFNBQVN0RSxFQUFHc0UsRUFBRy9ELEdBQ3JCLEdBQUksT0FBU1AsRUFBRTIvQyxRQUFTLE1BQU0sSUFBSTVJLEVBQUVqQixFQUFFSSxpQkFBa0Isd0ZBQ3hELEdBQUksT0FBU2wyQyxFQUFFNC9DLE1BQU8sTUFBTSxJQUFJN0ksRUFBRWpCLEVBQUVJLGlCQUFrQixxRkFDdEQsTUFBTXIxQyxFQUFJLElBQUl3Z0QsR0FBRy84QyxFQUFHL0QsR0FDcEIsT0FBTyxTQUFTUCxFQUFHc0UsR0FDZixHQUFJLE9BQVN1OUMsR0FBRzdoRCxHQUFJLENBRWhCLE1BQU1PLEVBQUl1aEQsR0FBRzloRCxHQUNiLE9BQVNPLEdBQUtvL0UsR0FBRzMvRSxFQUFHTyxFQUFHK0QsRUFBRXM2QyxRQUoxQixDQU1MNStDLEVBQUdhLEdBQUlBLEVBVkgsQ0FzQmJiLEVBQUVnNEUsT0FBUXYyRSxLQUFLMHlFLEdBQUkxeUUsS0FBS2l6RSxJQUNyQixPQUFPLElBQUlxRCxHQUFHLzNFLEVBQUU2M0UsVUFBVzczRSxFQUFFNDNFLFVBQVcsU0FBUzUzRSxFQUFHc0UsR0FFaEQsTUFBTS9ELEVBQUlQLEVBQUV1aEQsZ0JBQWdCcU4sT0FBTyxDQUFFdHFELElBQ3JDLE9BQU8sSUFBSThYLEdBQUdwYyxFQUFFd1IsS0FBTXhSLEVBQUV3L0MsZ0JBQWlCai9DLEVBQUdQLEVBQUUwL0MsUUFBUTl2QyxRQUFTNVAsRUFBRW02QyxNQUFPbjZDLEVBQUV3aEQsVUFBV3hoRCxFQUFFMi9DLFFBQVMzL0MsRUFBRTQvQyxPQUg5RCxDQUl0QzUvQyxFQUFFZzRFLE9BQVExekUsS0FZaEIsU0FBU3c3RSxHQUFHOS9FLEVBQUdzRSxFQUFJLE9BQ25CLE1BQU0vRCxFQUFJK0QsRUFBR3pELEVBQUl5OUUsR0FBRyxVQUFXdCtFLEdBQy9CLE9BQU8sSUFBSTYvRSxHQUFHaC9FLEVBQUdOLEdBR3JCLE1BQU13L0UsV0FBV1YsR0FDYixZQUFZci9FLEVBQUdzRSxFQUFHL0QsR0FDZHFJLFFBQVNuSCxLQUFLbUYsS0FBTzVHLEVBQUd5QixLQUFLa3pFLEdBQUtyd0UsRUFBRzdDLEtBQUttekUsR0FBS3IwRSxFQUVuRCxPQUFPUCxHQUNILE9BQU8sSUFBSSszRSxHQUFHLzNFLEVBQUU2M0UsVUFBVzczRSxFQUFFNDNFLFVBQVd4MUIsR0FBR3BpRCxFQUFFZzRFLE9BQVF2MkUsS0FBS2t6RSxHQUFJbHpFLEtBQUttekUsTUFTdkUsU0FBU29MLEdBQUdoZ0YsR0FDWixPQUFPbzJFLEdBQUcsUUFBU3AyRSxHQUFJLElBQUkrL0UsR0FBRyxRQUFTLy9FLEVBQUcsS0FXMUMsU0FBU2lnRixHQUFHamdGLEdBQ1osT0FBT28yRSxHQUFHLGNBQWVwMkUsR0FBSSxJQUFJKy9FLEdBQUcsY0FBZS8vRSxFQUFHLEtBRzFELE1BQU1rZ0YsV0FBV2IsR0FDYixZQUFZci9FLEVBQUdzRSxFQUFHL0QsR0FDZHFJLFFBQVNuSCxLQUFLbUYsS0FBTzVHLEVBQUd5QixLQUFLb3pFLEdBQUt2d0UsRUFBRzdDLEtBQUtxekUsR0FBS3YwRSxFQUVuRCxPQUFPUCxHQUNILE1BQU1zRSxFQUFJNjdFLEdBQUduZ0YsRUFBR3lCLEtBQUttRixLQUFNbkYsS0FBS296RSxHQUFJcHpFLEtBQUtxekUsSUFDekMsT0FBTyxJQUFJaUQsR0FBRy8zRSxFQUFFNjNFLFVBQVc3M0UsRUFBRTQzRSxVQUFXLFNBQVM1M0UsRUFBR3NFLEdBQ2hELE9BQU8sSUFBSThYLEdBQUdwYyxFQUFFd1IsS0FBTXhSLEVBQUV3L0MsZ0JBQWlCeC9DLEVBQUV1aEQsZ0JBQWdCM3hDLFFBQVM1UCxFQUFFMC9DLFFBQVE5dkMsUUFBUzVQLEVBQUVtNkMsTUFBT242QyxFQUFFd2hELFVBQVdsOUMsRUFBR3RFLEVBQUU0L0MsT0FEOUUsQ0FFdEM1L0MsRUFBRWc0RSxPQUFRMXpFLEtBSXBCLFNBQVM4N0UsTUFBTXBnRixHQUNYLE9BQU8sSUFBSWtnRixHQUFHLFVBQVdsZ0YsR0FBZSxHQUc1QyxTQUFTcWdGLE1BQU1yZ0YsR0FDWCxPQUFPLElBQUlrZ0YsR0FBRyxhQUFjbGdGLEdBQ2hCLEdBR2hCLE1BQU1zZ0YsV0FBV2pCLEdBQ2IsWUFBWXIvRSxFQUFHc0UsRUFBRy9ELEdBQ2RxSSxRQUFTbkgsS0FBS21GLEtBQU81RyxFQUFHeUIsS0FBS296RSxHQUFLdndFLEVBQUc3QyxLQUFLcXpFLEdBQUt2MEUsRUFFbkQsT0FBT1AsR0FDSCxNQUFNc0UsRUFBSTY3RSxHQUFHbmdGLEVBQUd5QixLQUFLbUYsS0FBTW5GLEtBQUtvekUsR0FBSXB6RSxLQUFLcXpFLElBQ3pDLE9BQU8sSUFBSWlELEdBQUcvM0UsRUFBRTYzRSxVQUFXNzNFLEVBQUU0M0UsVUFBVyxTQUFTNTNFLEVBQUdzRSxHQUNoRCxPQUFPLElBQUk4WCxHQUFHcGMsRUFBRXdSLEtBQU14UixFQUFFdy9DLGdCQUFpQngvQyxFQUFFdWhELGdCQUFnQjN4QyxRQUFTNVAsRUFBRTAvQyxRQUFROXZDLFFBQVM1UCxFQUFFbTZDLE1BQU9uNkMsRUFBRXdoRCxVQUFXeGhELEVBQUUyL0MsUUFBU3I3QyxHQURwRixDQUV0Q3RFLEVBQUVnNEUsT0FBUTF6RSxLQUlwQixTQUFTaThFLE1BQU12Z0YsR0FDWCxPQUFPLElBQUlzZ0YsR0FBRyxZQUFhdGdGLEdBQWUsR0FHOUMsU0FBU3dnRixNQUFNeGdGLEdBQ1gsT0FBTyxJQUFJc2dGLEdBQUcsUUFBU3RnRixHQUFlLEdBR3lCLFNBQVNtZ0YsR0FBR25nRixFQUFHc0UsRUFBRy9ELEVBQUdNLEdBQ3BGLEdBQUlOLEVBQUUsR0FBSyxZQUFtQkEsRUFBRSxJQUFLQSxFQUFFLGFBQWN1OUUsR0FBSSxPQUFPLFNBQVM5OUUsRUFBR3NFLEVBQUcvRCxFQUFHTSxFQUFHL0IsR0FDakYsSUFBSytCLEVBQUcsTUFBTSxJQUFJazJDLEVBQUVqQixFQUFFTSxVQUFXLHVEQUF1RDcxQyxRQUN4RixNQUFNWCxFQUFJLEdBUUYsSUFBSyxNQUFNVyxLQUFLMGhELEdBQUdqaUQsR0FBSSxHQUFJTyxFQUFFcStDLE1BQU02QixhQUFjN2dELEVBQUVpRCxLQUFLZzdDLEdBQUd2NUMsRUFBR3pELEVBQUVSLFVBQVksQ0FDaEYsTUFBTUwsRUFBSWEsRUFBRXNJLEtBQUt5MUMsTUFBTXIrQyxFQUFFcStDLE9BQ3pCLEdBQUluRCxHQUFHejdDLEdBQUksTUFBTSxJQUFJKzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsK0ZBQWlHMzFDLEVBQUVxK0MsTUFBUSwySEFDdEosR0FBSSxPQUFTNStDLEVBQUcsQ0FDWixNQUFNQSxFQUFJTyxFQUFFcStDLE1BQU1yRSxrQkFDbEIsTUFBTSxJQUFJeEQsRUFBRWpCLEVBQUVJLGlCQUFrQiwrRkFBK0ZsMkMsNENBRW5JSixFQUFFaUQsS0FBSzdDLEdBRVgsT0FBTyxJQUFJbWhELEdBQUd2aEQsRUFBR2QsR0FuQjJDLENBdUIvRGtCLEVBQUVnNEUsT0FBUWg0RSxFQUFFNjNFLFVBQVViLFlBQWExeUUsRUFBRy9ELEVBQUUsR0FBRzA5RSxVQUFXcDlFLEdBQ3ZELENBQ0ksTUFBTS9CLEVBQUlzOUUsR0FBR3A4RSxFQUFFNjNFLFdBQ2YsT0FBTyxTQUFTNzNFLEVBQUdzRSxFQUFHL0QsRUFBR00sRUFBRy9CLEVBQUdjLEdBRTNCLE1BQU1MLEVBQUlTLEVBQUV1aEQsZ0JBQ1osR0FBSXppRCxFQUFFbUMsT0FBUzFCLEVBQUUwQixPQUFRLE1BQU0sSUFBSTgxQyxFQUFFakIsRUFBRUksaUJBQWtCLGtDQUFrQ3IxQyw4RkFDM0YsTUFBTWlKLEVBQUksR0FDVixJQUFLLElBQUlsSyxFQUFJLEVBQUdBLEVBQUlkLEVBQUVtQyxPQUFRckIsSUFBSyxDQUMvQixNQUFNVCxFQUFJTCxFQUFFYyxHQUNaLEdBQUlMLEVBQUVLLEdBQUdnL0MsTUFBTTZCLGFBQWMsQ0FDekIsR0FBSSxpQkFBbUJ0aEQsRUFBRyxNQUFNLElBQUk0M0MsRUFBRWpCLEVBQUVJLGlCQUFrQix1REFBdURyMUMseUJBQXlCMUIsS0FDMUksSUFBSzZpRCxHQUFHaGlELEtBQU8sSUFBTWIsRUFBRTRJLFFBQVEsS0FBTSxNQUFNLElBQUlndkMsRUFBRWpCLEVBQUVJLGlCQUFrQix5R0FBeUdyMUMseUNBQXlDMUIsd0JBQ3ZOLE1BQU1vQixFQUFJUCxFQUFFd1IsS0FBS3N0QyxNQUFNekUsRUFBR2tDLFdBQVdwOUMsSUFDckMsSUFBS205QyxHQUFHaUUsY0FBY2hnRCxHQUFJLE1BQU0sSUFBSXcyQyxFQUFFakIsRUFBRUksaUJBQWtCLCtHQUErR3IxQyxrREFBa0ROLDREQUMzTixNQUFNekIsRUFBSSxJQUFJdzlDLEdBQUcvN0MsR0FDakJ1SixFQUFFakgsS0FBS2c3QyxHQUFHdjVDLEVBQUd4RixRQUNWLENBQ0gsTUFBTWtCLEVBQUl1OUUsR0FBR2g5RSxFQUFHTSxFQUFHMUIsR0FDbkIySyxFQUFFakgsS0FBSzdDLElBR2YsT0FBTyxJQUFJbWhELEdBQUdyM0MsRUFBR2xLLEdBbkJkLENBeUJWSSxFQUFFZzRFLE9BQVFoNEUsRUFBRTYzRSxVQUFVYixZQUFhbDRFLEVBQUd3RixFQUFHL0QsRUFBR00sSUFJakQsU0FBUzYrRSxHQUFHMS9FLEVBQUdzRSxFQUFHL0QsR0FDZCxHQUFJLGlCQUFvQkEsRUFBSSxZQUFtQkEsSUFBSyxDQUNoRCxHQUFJLEtBQU9BLEVBQUcsTUFBTSxJQUFJdzJDLEVBQUVqQixFQUFFSSxpQkFBa0IsK0hBQzlDLElBQUs4TCxHQUFHMTlDLEtBQU8sSUFBTS9ELEVBQUV3SCxRQUFRLEtBQU0sTUFBTSxJQUFJZ3ZDLEVBQUVqQixFQUFFSSxpQkFBa0IsbUhBQW1IMzFDLGdDQUN4TCxNQUFNTSxFQUFJeUQsRUFBRWtOLEtBQUtzdEMsTUFBTXpFLEVBQUdrQyxXQUFXaDhDLElBQ3JDLElBQUsrN0MsR0FBR2lFLGNBQWMxL0MsR0FBSSxNQUFNLElBQUlrMkMsRUFBRWpCLEVBQUVJLGlCQUFrQiw0SUFBNElyMUMsdURBQXVEQSxFQUFFSSxZQUMvUCxPQUFPNDhDLEdBQUc3OUMsRUFBRyxJQUFJczhDLEdBQUd6N0MsSUFFeEIsR0FBSU4sYUFBYW8zRSxHQUFJLE9BQU85NUIsR0FBRzc5QyxFQUFHTyxFQUFFc2MsTUFDcEMsTUFBTSxJQUFJazZCLEVBQUVqQixFQUFFSSxpQkFBa0IsaUlBQWlJZ2dDLEdBQUczMUUsT0FNcEssU0FBU2svRSxHQUFHei9FLEVBQUdzRSxHQUNmLElBQUt4QyxNQUFNQyxRQUFRL0IsSUFBTSxJQUFNQSxFQUFFaUIsT0FBUSxNQUFNLElBQUk4MUMsRUFBRWpCLEVBQUVJLGlCQUFrQixxREFBcUQ1eEMsRUFBRTZDLHdCQUNoSSxHQUFJbkgsRUFBRWlCLE9BQVMsR0FBSSxNQUFNLElBQUk4MUMsRUFBRWpCLEVBQUVJLGlCQUFrQixtQkFBbUI1eEMsRUFBRTZDLDRFQUc1RSxTQUFTdzRFLEdBQUczL0UsRUFBR3NFLEVBQUcvRCxHQUNkLElBQUtBLEVBQUVvNUMsUUFBUXIxQyxHQUFJLE1BQU0sSUFBSXl5QyxFQUFFakIsRUFBRUksaUJBQWtCLHFHQUFxRzV4QyxFQUFFNkMseUNBQXlDN0MsRUFBRTZDLDBGQUEwRjVHLEVBQUU0Rzs7Ozs7Ozs7Ozs7Ozs7OztHQXdCalMsTUFBTXM1RSxHQUNOLGFBQWF6Z0YsRUFBR3NFLEVBQUksUUFDaEIsT0FBUW00QyxHQUFHejhDLElBQ1QsS0FBSyxFQUNILE9BQU8sS0FFVCxLQUFLLEVBQ0gsT0FBT0EsRUFBRTI4QyxhQUVYLEtBQUssRUFDSCxPQUFPdEIsR0FBR3I3QyxFQUFFaTlDLGNBQWdCajlDLEVBQUVrOUMsYUFFaEMsS0FBSyxFQUNILE9BQU96N0MsS0FBS2kvRSxpQkFBaUIxZ0YsRUFBRSs3QyxnQkFFakMsS0FBSyxFQUNILE9BQU90NkMsS0FBS2svRSx1QkFBdUIzZ0YsRUFBR3NFLEdBRXhDLEtBQUssRUFDSCxPQUFPdEUsRUFBRTQ3QyxZQUVYLEtBQUssRUFDSCxPQUFPbjZDLEtBQUttL0UsYUFBYXRsQyxHQUFHdDdDLEVBQUU0OEMsYUFFaEMsS0FBSyxFQUNILE9BQU9uN0MsS0FBS28vRSxpQkFBaUI3Z0YsRUFBRTY4QyxnQkFFakMsS0FBSyxFQUNILE9BQU9wN0MsS0FBS3EvRSxnQkFBZ0I5Z0YsRUFBRTg4QyxlQUVoQyxLQUFLLEVBQ0gsT0FBT3I3QyxLQUFLcy9FLGFBQWEvZ0YsRUFBRW05QyxXQUFZNzRDLEdBRXpDLEtBQUssR0FDSCxPQUFPN0MsS0FBS3UvRSxjQUFjaGhGLEVBQUUwN0MsU0FBVXAzQyxHQUV4QyxRQUNFLE1BQU15a0MsS0FHZCxjQUFjL29DLEVBQUdzRSxHQUNiLE1BQU0vRCxFQUFJLEdBQ1YsT0FBT3M1QyxFQUFHNzVDLEVBQUU0NkMsT0FBUSxDQUFFNTZDLEVBQUdhLEtBQ3JCTixFQUFFUCxHQUFLeUIsS0FBSzQ4RSxhQUFheDlFLEVBQUd5RCxLQUMzQi9ELEVBRVQsZ0JBQWdCUCxHQUNaLE9BQU8sSUFBSXc3RSxHQUFHbmdDLEdBQUdyN0MsRUFBRSs4QyxVQUFXMUIsR0FBR3I3QyxFQUFFZzlDLFlBRXZDLGFBQWFoOUMsRUFBR3NFLEdBQ1osT0FBUXRFLEVBQUVvOUMsUUFBVSxJQUFJcGxDLElBQUtoWSxHQUFLeUIsS0FBSzQ4RSxhQUFhcitFLEVBQUdzRSxJQUUzRCx1QkFBdUJ0RSxFQUFHc0UsR0FDdEIsT0FBUUEsR0FDTixJQUFLLFdBQ0gsTUFBTS9ELEVBaDhlbEIsU0FBUzR6RCxFQUFHbjBELEdBQ1IsTUFBTXNFLEVBQUl0RSxFQUFFMDdDLFNBQVNkLE9BQU93SSxtQkFDNUIsT0FBTzNILEdBQUduM0MsR0FBSzZ2RCxFQUFHN3ZELEdBQUtBLEVBODdlTDZ2RCxDQUFHbjBELEdBQ2IsT0FBTyxNQUFRTyxFQUFJLEtBQU9rQixLQUFLNDhFLGFBQWE5OUUsRUFBRytELEdBRWpELElBQUssV0FDSCxPQUFPN0MsS0FBS2kvRSxpQkFBaUI3a0MsR0FBRzc3QyxJQUVsQyxRQUNFLE9BQU8sTUFHZixpQkFBaUJBLEdBQ2IsTUFBTXNFLEVBQUk2MkMsRUFBR243QyxHQUNiLE9BQU8sSUFBSW81QyxFQUFHOTBDLEVBQUVpUixRQUFTalIsRUFBRTgyQyxPQUUvQixtQkFBbUJwN0MsRUFBR3NFLEdBQ2xCLE1BQU0vRCxFQUFJODVDLEVBQUdrQyxXQUFXdjhDLEdBQ3hCMjFDLEVBQUVxVyxHQUFHenJELElBQ0wsTUFBTU0sRUFBSSxJQUFJZzFFLEdBQUd0MUUsRUFBRVosSUFBSSxHQUFJWSxFQUFFWixJQUFJLElBQUtiLEVBQUksSUFBSXc5QyxHQUFHLzdDLEVBQUVpOEMsU0FBUyxJQUM1RCxPQUFPMzdDLEVBQUU4NEMsUUFBUXIxQyxJQUVqQml4QyxFQUFFLFlBQVl6MkMsZ0VBQWdFK0IsRUFBRTZFLGFBQWE3RSxFQUFFaTlDLGdHQUFnR3g1QyxFQUFFb0IsYUFBYXBCLEVBQUV3NUMsc0JBQ2hOaC9DOzs7Ozs7Ozs7Ozs7Ozs7O0dBNEJKLFNBQVNtaUYsR0FBR2poRixFQUFHc0UsRUFBRy9ELEdBQ2xCLElBQUlNLEVBSUosT0FBT0EsRUFBSWIsRUFBSU8sSUFBTUEsRUFBRSs3RSxPQUFTLzdFLEVBQUVnOEUsYUFBZXY4RSxFQUFFa2hGLFlBQVk1OEUsRUFBRy9ELEdBQUtQLEVBQUVraEYsWUFBWTU4RSxHQUFLQSxFQUMxRnpELEVBR0osTUFBTXNnRixXQUFXVixHQUNiLFlBQVl6Z0YsR0FDUjRJLFFBQVNuSCxLQUFLbzJFLFVBQVk3M0UsRUFFOUIsYUFBYUEsR0FDVCxPQUFPLElBQUlvN0UsR0FBR3A3RSxHQUVsQixpQkFBaUJBLEdBQ2IsTUFBTXNFLEVBQUk3QyxLQUFLMi9FLG1CQUFtQnBoRixFQUFHeUIsS0FBS28yRSxVQUFVYixhQUNwRCxPQUFPLElBQUlXLEdBQUdsMkUsS0FBS28yRSxVQUE0QixLQUFNdnpFOzs7Ozs7Ozs7Ozs7Ozs7O0dBMkJ6RCxNQUFNKzhFLEdBRU4sWUFBWXJoRixFQUFHc0UsR0FDWDdDLEtBQUtzOEUsV0FBYS85RSxFQUFHeUIsS0FBSzYvRSxlQUFpQmg5RSxFQUFHN0MsS0FBSzgvRSxXQUFhLEdBQUk5L0UsS0FBSysvRSxZQUFhLEVBQ3RGLy9FLEtBQUtnZ0YsWUFBY3JGLEdBQUdwOEUsR0FFMUIsSUFBSUEsRUFBR3NFLEVBQUcvRCxHQUNOa0IsS0FBS2lnRixzQkFDTCxNQUFNN2dGLEVBQUk4Z0YsR0FBRzNoRixFQUFHeUIsS0FBS3M4RSxZQUFhai9FLEVBQUltaUYsR0FBR3BnRixFQUFFKzJFLFVBQVd0ekUsRUFBRy9ELEdBQUlYLEVBQUl5OEUsR0FBRzU2RSxLQUFLZ2dGLFlBQWEsaUJBQWtCNWdGLEVBQUVnYyxLQUFNL2QsRUFBRyxPQUFTK0IsRUFBRSsyRSxVQUFXcjNFLEdBQ3pJLE9BQU9rQixLQUFLOC9FLFdBQVcxK0UsS0FBS2pELEVBQUV5ekUsV0FBV3h5RSxFQUFFZ2MsS0FBTXNuQyxHQUFHbUosU0FBVTdyRCxLQUVsRSxPQUFPekIsRUFBR3NFLEVBQUcvRCxLQUFNTSxHQUNmWSxLQUFLaWdGLHNCQUNMLE1BQU01aUYsRUFBSTZpRixHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBR2IsSUFBSW4rRSxFQUNaLE9BQU9BLEVBQUksaUJBQW9CMEUsRUFBSSxZQUFtQkEsS0FBT0EsYUFBYTIyRSxHQUFLcUMsR0FBRzc3RSxLQUFLZ2dGLFlBQWEsb0JBQXFCM2lGLEVBQUUrZCxLQUFNdlksRUFBRy9ELEVBQUdNLEdBQUt1OEUsR0FBRzM3RSxLQUFLZ2dGLFlBQWEsb0JBQXFCM2lGLEVBQUUrZCxLQUFNdlksR0FDOUw3QyxLQUFLOC9FLFdBQVcxK0UsS0FBS2pELEVBQUV5ekUsV0FBV3YwRSxFQUFFK2QsS0FBTXNuQyxHQUFHRSxRQUFPLEtBQU81aUQsS0FPeEQsT0FBT3pCLEdBQ1Z5QixLQUFLaWdGLHNCQUNMLE1BQU1wOUUsRUFBSXE5RSxHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBQ3JCLE9BQU90OEUsS0FBSzgvRSxXQUFhOS9FLEtBQUs4L0UsV0FBVzN5QixPQUFPLElBQUloSixHQUFHdGhELEVBQUV1WSxLQUFNc25DLEdBQUdtSixTQUFVN3JELEtBYXpFLFNBQ0gsT0FBT0EsS0FBS2lnRixzQkFBdUJqZ0YsS0FBSysvRSxZQUFhLEVBQUkvL0UsS0FBSzgvRSxXQUFXdGdGLE9BQVMsRUFBSVEsS0FBSzYvRSxlQUFlNy9FLEtBQUs4L0UsWUFBY2w4RSxRQUFRRixVQUV6SSxzQkFDSSxHQUFJMUQsS0FBSysvRSxXQUFZLE1BQU0sSUFBSXpxQyxFQUFFakIsRUFBRVUsb0JBQXFCLHdFQUloRSxTQUFTbXJDLEdBQUczaEYsRUFBR3NFLEdBQ1gsSUFBS3RFLEVBQUksWUFBbUJBLElBQUk2M0UsWUFBY3Z6RSxFQUFHLE1BQU0sSUFBSXl5QyxFQUFFakIsRUFBRUksaUJBQWtCLHVFQUNqRixPQUFPbDJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdEWCxTQUFTNGhGLEdBQUc1aEYsR0FDUkEsRUFBSW0yRSxHQUFHbjJFLEVBQUcyM0UsSUFDVixNQUFNcnpFLEVBQUk2eEUsR0FBR24yRSxFQUFFNjNFLFVBQVdvQixJQUMxQixPQUFPakUsR0FBR3lFLEdBQUduMUUsR0FBSXRFLEVBQUU2YyxNQUFNM1EsS0FBTTNMLEdBQUtzaEYsR0FBR3Y5RSxFQUFHdEUsRUFBR08sSUFHakQsTUFBTXVoRixXQUFXckIsR0FDYixZQUFZemdGLEdBQ1I0SSxRQUFTbkgsS0FBS28yRSxVQUFZNzNFLEVBRTlCLGFBQWFBLEdBQ1QsT0FBTyxJQUFJbzdFLEdBQUdwN0UsR0FFbEIsaUJBQWlCQSxHQUNiLE1BQU1zRSxFQUFJN0MsS0FBSzIvRSxtQkFBbUJwaEYsRUFBR3lCLEtBQUtvMkUsVUFBVWIsYUFDcEQsT0FBTyxJQUFJVyxHQUFHbDJFLEtBQUtvMkUsVUFBNEIsS0FBTXZ6RSxJQVV6RCxTQUFTeTlFLEdBQUcvaEYsR0FDWkEsRUFBSW0yRSxHQUFHbjJFLEVBQUcyM0UsSUFDVixNQUFNcnpFLEVBQUk2eEUsR0FBR24yRSxFQUFFNjNFLFVBQVdvQixJQUFLMTRFLEVBQUlrNUUsR0FBR24xRSxHQUFJekQsRUFBSSxJQUFJaWhGLEdBQUd4OUUsR0FDckQsT0E5K0ZBLFNBQVl0RSxFQUFHc0UsR0FDZixNQUFNL0QsRUFBSSxJQUFJeTJDLEVBQ2QsT0FBT2gzQyxFQUFFKzZELFdBQVd5RCxpQkFBaUIsU0FBYWpzRCxlQUFldlMsRUFBR3NFLEVBQUcvRCxHQUNuRSxJQUNJLE1BQU1NLFFBQVUsU0FBU2IsRUFBR3NFLEdBQ3hCLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FDWixPQUFPTyxFQUFFMmMsWUFBWWtoRCxlQUFlLGdCQUFpQixXQUFhcCtELEdBQUtPLEVBQUVtckQsR0FBR25ELEdBQUd2b0QsRUFBR3NFLElBRnRFLENBR2R0RSxFQUFHc0UsR0FDTHpELEVBQUU2aEQsa0JBQW9CbmlELEVBQUU0RSxRQUFRdEUsR0FBS0EsRUFBRTgxRCxlQUFpQnAyRCxFQUFFNEUsUUFBUSxNQUFRNUUsRUFBRTJFLE9BQU8sSUFBSTZ4QyxFQUFFakIsRUFBRWUsWUFBYSxtTUFDMUcsTUFBTzcyQyxHQUNMLE1BQU1hLEVBQUl3cUUsR0FBR3JyRSxFQUFHLDJCQUEyQnNFLGdCQUMzQy9ELEVBQUUyRSxPQUFPckUsSUFUaUMwUixPQWUzQ3FpRSxHQUFHNTBFLEdBQUlzRSxFQUFHL0QsSUFBTUEsRUFBRTZFLFFBNjlGbEI0OEUsQ0FBR3poRixFQUFHUCxFQUFFNmMsTUFBTTNRLEtBQU0zTCxHQUFLLElBQUlpK0UsR0FBR2w2RSxFQUFHekQsRUFBR2IsRUFBRTZjLEtBQU10YyxFQUFHLElBQUlnK0UsR0FBRyxPQUFTaCtFLEdBQUtBLEVBQUU2K0MsbUJBQzlELEdBQUtwL0MsRUFBRTQzRSxZQVN4QixTQUFTcUssR0FBR2ppRixHQUNaQSxFQUFJbTJFLEdBQUduMkUsRUFBRzIzRSxJQUNWLE1BQU1yekUsRUFBSTZ4RSxHQUFHbjJFLEVBQUU2M0UsVUFBV29CLElBQzFCLE9BQU9qRSxHQUFHeUUsR0FBR24xRSxHQUFJdEUsRUFBRTZjLEtBQU0sQ0FDckJsWSxPQUFRLFdBQ1R1SCxLQUFNM0wsR0FBS3NoRixHQUFHdjlFLEVBQUd0RSxFQUFHTyxJQVl2QixTQUFTMmhGLEdBQUdsaUYsR0FDWkEsRUFBSW0yRSxHQUFHbjJFLEVBQUcrM0UsSUFDVixNQUFNenpFLEVBQUk2eEUsR0FBR24yRSxFQUFFNjNFLFVBQVdvQixJQUFLMTRFLEVBQUlrNUUsR0FBR24xRSxHQUFJekQsRUFBSSxJQUFJaWhGLEdBQUd4OUUsR0FDckQsT0FBTzg2RSxHQUFHcC9FLEVBQUVnNEUsUUFBUy9DLEdBQUcxMEUsRUFBR1AsRUFBRWc0RSxRQUFROXJFLEtBQU0zTCxHQUFLLElBQUlxK0UsR0FBR3Q2RSxFQUFHekQsRUFBR2IsRUFBR08sSUFRaEUsU0FBU2djLEdBQUd2YyxHQUNaQSxFQUFJbTJFLEdBQUduMkUsRUFBRyszRSxJQUNWLE1BQU16ekUsRUFBSTZ4RSxHQUFHbjJFLEVBQUU2M0UsVUFBV29CLElBQUsxNEUsRUFBSWs1RSxHQUFHbjFFLEdBQUl6RCxFQUFJLElBQUlpaEYsR0FBR3g5RSxHQUNyRCxPQXYrRkosU0FBWXRFLEVBQUdzRSxHQUNYLE1BQU0vRCxFQUFJLElBQUl5MkMsRUFDZCxPQUFPaDNDLEVBQUUrNkQsV0FBV3lELGlCQUFpQixTQUFhanNELGVBQWV2UyxFQUFHc0UsRUFBRy9ELEdBQ25FLElBQ0ksTUFBTU0sUUFBVXNnRSxHQUFHbmhFLEVBQUdzRSxHQUNJLEdBQUt4RixFQUFJLElBQUk2dUUsR0FBR3JwRSxFQUFHekQsRUFBRWlyRCxJQUFLbHNELEVBQUlkLEVBQUVxckUsR0FBR3RwRSxFQUFFNnNELFdBQVludUQsRUFBSVQsRUFBRTYvQyxhQUFhLytDLEdBQ2xFLEdBQzVCVyxFQUFFNEUsUUFBUTVGLEVBQUV1dUUsVUFDZCxNQUFPOXRFLEdBQ0wsTUFBTWEsRUFBSXdxRSxHQUFHcnJFLEVBQUcsNEJBQTRCc0UsbUJBQzVDL0QsRUFBRTJFLE9BQU9yRSxJQVJpQzBSLE9BYzNDcWlFLEdBQUc1MEUsR0FBSXNFLEVBQUcvRCxJQUFNQSxFQUFFNkUsUUF1OUZsQis4RSxDQUFHNWhGLEVBQUdQLEVBQUVnNEUsUUFBUTlyRSxLQUFNM0wsR0FBSyxJQUFJcStFLEdBQUd0NkUsRUFBR3pELEVBQUdiLEVBQUdPLElBUWxELFNBQVM2aEYsR0FBR3BpRixHQUNaQSxFQUFJbTJFLEdBQUduMkUsRUFBRyszRSxJQUNWLE1BQU16ekUsRUFBSTZ4RSxHQUFHbjJFLEVBQUU2M0UsVUFBV29CLElBQUsxNEUsRUFBSWs1RSxHQUFHbjFFLEdBQUl6RCxFQUFJLElBQUlpaEYsR0FBR3g5RSxHQUNyRCxPQUFPMndFLEdBQUcxMEUsRUFBR1AsRUFBRWc0RSxPQUFRLENBQ25CcnpFLE9BQVEsV0FDVHVILEtBQU0zTCxHQUFLLElBQUlxK0UsR0FBR3Q2RSxFQUFHekQsRUFBR2IsRUFBR08sSUFHbEMsU0FBUzhoRixHQUFHcmlGLEVBQUdzRSxFQUFHL0QsR0FDZFAsRUFBSW0yRSxHQUFHbjJFLEVBQUcyM0UsSUFDVixNQUFNOTJFLEVBQUlzMUUsR0FBR24yRSxFQUFFNjNFLFVBQVdvQixJQUFLbjZFLEVBQUltaUYsR0FBR2poRixFQUFFNDNFLFVBQVd0ekUsRUFBRy9ELEdBQ3RELE9BQU8raEYsR0FBR3poRixFQUFHLENBQUV3N0UsR0FBR0QsR0FBR3Y3RSxHQUFJLFNBQVViLEVBQUU2YyxLQUFNL2QsRUFBRyxPQUFTa0IsRUFBRTQzRSxVQUFXcjNFLEdBQUc4eUUsV0FBV3J6RSxFQUFFNmMsS0FBTXNuQyxHQUFHbUosVUFHakcsU0FBU2kxQixHQUFHdmlGLEVBQUdzRSxFQUFHL0QsS0FBTU0sR0FDcEJiLEVBQUltMkUsR0FBR24yRSxFQUFHMjNFLElBQ1YsTUFBTTc0RSxFQUFJcTNFLEdBQUduMkUsRUFBRTYzRSxVQUFXb0IsSUFBS3I1RSxFQUFJdzhFLEdBQUd0OUUsR0FDdEMsSUFBSVMsRUFLSixPQUpBQSxFQUFJLGlCQUdKK0UsRUFBSSxZQUFtQkEsS0FBT0EsYUFBYTIyRSxHQUFLcUMsR0FBRzE5RSxFQUFHLFlBQWFJLEVBQUU2YyxLQUFNdlksRUFBRy9ELEVBQUdNLEdBQUt1OEUsR0FBR3g5RSxFQUFHLFlBQWFJLEVBQUU2YyxLQUFNdlksR0FDMUdnK0UsR0FBR3hqRixFQUFHLENBQUVTLEVBQUU4ekUsV0FBV3J6RSxFQUFFNmMsS0FBTXNuQyxHQUFHRSxRQUFPLE1BUzlDLFNBQVNtK0IsR0FBR3hpRixHQUNaLE9BQU9zaUYsR0FBR25NLEdBQUduMkUsRUFBRTYzRSxVQUFXb0IsSUFBSyxDQUFFLElBQUlyekIsR0FBRzVsRCxFQUFFNmMsS0FBTXNuQyxHQUFHbUosVUFZbkQsU0FBU20xQixHQUFHemlGLEVBQUdzRSxHQUNmLE1BQU0vRCxFQUFJNDFFLEdBQUduMkUsRUFBRTYzRSxVQUFXb0IsSUFBS3A0RSxFQUFJdTNFLEdBQUdwNEUsR0FBSWxCLEVBQUltaUYsR0FBR2poRixFQUFFNDNFLFVBQVd0ekUsR0FDOUQsT0FBT2crRSxHQUFHL2hGLEVBQUcsQ0FBRTg3RSxHQUFHRCxHQUFHcDhFLEVBQUU2M0UsV0FBWSxTQUFVaDNFLEVBQUVnYyxLQUFNL2QsRUFBRyxPQUFTa0IsRUFBRTQzRSxVQUFXLElBQUl2RSxXQUFXeHlFLEVBQUVnYyxLQUFNc25DLEdBQUdFLFFBQU8sTUFBUW40QyxLQUFLLElBQU9yTCxHQUd2SSxTQUFTNmhGLEdBQUcxaUYsS0FBTXNFLEdBQ2QsSUFBSS9ELEVBQUdNLEVBQUcvQixFQUNWa0IsRUFBSSxZQUFtQkEsR0FDdkIsSUFBSUosRUFBSSxDQUNKK3NFLHdCQUF3QixHQUN6QnB0RSxFQUFJLEVBQ1AsaUJBQW1CK0UsRUFBRS9FLElBQU1vNUUsR0FBR3IwRSxFQUFFL0UsTUFBUUssRUFBSTBFLEVBQUUvRSxHQUFJQSxLQUNsRCxNQUFNdUssRUFBSSxDQUNONmlFLHVCQUF3Qi9zRSxFQUFFK3NFLHdCQUU5QixHQUFJZ00sR0FBR3IwRSxFQUFFL0UsSUFBSyxDQUNWLE1BQU1TLEVBQUlzRSxFQUFFL0UsR0FDWitFLEVBQUUvRSxHQUFLLFFBQVVnQixFQUFJUCxFQUFFcU0sWUFBUyxJQUFXOUwsT0FBSSxFQUFTQSxFQUFFRCxLQUFLTixHQUFJc0UsRUFBRS9FLEVBQUksR0FBSyxRQUFVc0IsRUFBSWIsRUFBRXdFLGFBQVUsSUFBVzNELE9BQUksRUFBU0EsRUFBRVAsS0FBS04sR0FDdklzRSxFQUFFL0UsRUFBSSxHQUFLLFFBQVVULEVBQUlrQixFQUFFdU0sZ0JBQWEsSUFBV3pOLE9BQUksRUFBU0EsRUFBRXdCLEtBQUtOLEdBRTNFLElBQUliLEVBQUdvRSxFQUFHdTBDLEVBQ1YsR0FBSTkzQyxhQUFhMjNFLEdBQUlwMEUsRUFBSTR5RSxHQUFHbjJFLEVBQUU2M0UsVUFBV29CLElBQUtuaEMsRUFBSTRKLEdBQUcxaEQsRUFBRTZjLEtBQUtyTCxNQUFPclMsRUFBSSxDQUNuRWtOLEtBQU05TCxJQUNGK0QsRUFBRS9FLElBQU0rRSxFQUFFL0UsR0FBR3NpRixHQUFHdCtFLEVBQUd2RCxFQUFHTyxLQUUxQmlFLE1BQU9GLEVBQUUvRSxFQUFJLEdBQ2JnTixTQUFVakksRUFBRS9FLEVBQUksUUFDWixDQUNKLE1BQU1nQixFQUFJNDFFLEdBQUduMkUsRUFBRyszRSxJQUNoQngwRSxFQUFJNHlFLEdBQUc1MUUsRUFBRXMzRSxVQUFXb0IsSUFBS25oQyxFQUFJdjNDLEVBQUV5M0UsT0FDL0IsTUFBTW4zRSxFQUFJLElBQUlpaEYsR0FBR3YrRSxHQUNqQnBFLEVBQUksQ0FDQWtOLEtBQU1yTSxJQUNGc0UsRUFBRS9FLElBQU0rRSxFQUFFL0UsR0FBRyxJQUFJcS9FLEdBQUdyN0UsRUFBRzFDLEVBQUdOLEVBQUdQLEtBRWpDd0UsTUFBT0YsRUFBRS9FLEVBQUksR0FDYmdOLFNBQVVqSSxFQUFFL0UsRUFBSSxJQUNqQjYvRSxHQUFHcC9FLEVBQUVnNEUsUUFFWixPQUFPLFNBQVNoNEUsRUFBR3NFLEVBQUcvRCxFQUFHTSxHQUNyQixNQUFNL0IsRUFBSSxJQUFJcXpFLEdBQUd0eEUsR0FBSWpCLEVBQUksSUFBSThzRSxHQUFHcG9FLEVBQUd4RixFQUFHeUIsR0FDdEMsT0FBT1AsRUFBRSs2RCxXQUFXeUQsaUJBQWlCLFNBQWEyTixTQUFTNEksR0FBRy8wRSxHQUFJSixJQUFNLEtBQ3BFZCxFQUFFaXZFLEtBQU0vdEUsRUFBRSs2RCxXQUFXeUQsaUJBQWlCLFNBQWE4TixTQUFTeUksR0FBRy8wRSxHQUFJSixLQUhwRSxDQUtMNjVFLEdBQUdsMkUsR0FBSXUwQyxFQUFHaHVDLEVBQUczSyxHQUduQixTQUFTd2pGLEdBQUczaUYsRUFBR3NFLEdBQ1gsT0F0aUdKLFNBQVl0RSxFQUFHc0UsR0FDWCxNQUFNL0QsRUFBSSxJQUFJNHhFLEdBQUc3dEUsR0FDakIsT0FBT3RFLEVBQUUrNkQsV0FBV3lELGlCQUFpQixTQUFhLFNBQVN4K0QsRUFBR3NFLEdBQzFEdXhDLEVBQUU3MUMsR0FBR2lvRSxHQUFHcGlELElBQUl2aEIsR0FHWkEsRUFBRStILE9BSjRDLE9BSzFDMG9FLEdBQUcvMEUsR0FBSU8sSUFBTSxLQUNqQkEsRUFBRXd0RSxLQUFNL3RFLEVBQUUrNkQsV0FBV3lELGlCQUFpQixTQUFhLFNBQVN4K0QsRUFBR3NFLEdBQzNEdXhDLEVBQUU3MUMsR0FBR2lvRSxHQUFHdnhDLE9BQU9weUIsR0FEZ0MsT0FFM0N5d0UsR0FBRy8wRSxHQUFJTyxLQTRoR1pxaUYsQ0FBR25KLEdBQUd6NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsS0FBTU4sR0FBR3IwRSxHQUFLQSxFQUFJLENBQ3JDK0gsS0FBTS9ILElBT1YsU0FBU2crRSxHQUFHdGlGLEVBQUdzRSxHQUNmLE9BQU8sU0FBU3RFLEVBQUdzRSxHQUNmLE1BQU0vRCxFQUFJLElBQUl5MkMsRUFDZCxPQUFPaDNDLEVBQUUrNkQsV0FBV3lELGlCQUFpQixTQXQrSXpDanNELGVBQWtCdlMsRUFBR3NFLEVBQUcvRCxHQUN4QixNQUFNTSxFQUFJa3dFLEdBQUcvd0UsR0FDYixJQUNJLE1BQU1BLFFBQVUsU0FBU0EsRUFBR3NFLEdBQ3hCLE1BQU0vRCxFQUFJczFDLEVBQUU3MUMsR0FBSWEsRUFBSXU0QyxFQUFHeGlDLE1BQU85WCxFQUFJd0YsRUFBRXdtQyxPQUFPLENBQUU5cUMsRUFBR3NFLElBQU10RSxFQUFFNmxCLElBQUl2aEIsRUFBRWpFLEtBQU91b0QsTUFDckUsSUFBSWhwRCxFQUNKLE9BQU9XLEVBQUUyYyxZQUFZa2hELGVBQWUsMEJBQTJCLFlBQWNwK0QsR0FBS08sRUFBRW1yRCxHQUFHaEQsR0FBRzFvRCxFQUFHbEIsR0FBR3VOLEtBQU12TixJQUNsR2MsRUFBSWQsRUFNSixNQUFNUyxFQUFJLEdBQ1YsSUFBSyxNQUFNUyxLQUFLc0UsRUFBRyxDQUNmLE1BQU1BLEVBQUlraEQsR0FBR3hsRCxFQUFHSixFQUFFRCxJQUFJSyxFQUFFSyxNQUN4QixNQUFRaUUsR0FJUi9FLEVBQUVzRCxLQUFLLElBQUlraUQsR0FBRy9rRCxFQUFFSyxJQUFLaUUsRUFBR3U2QyxHQUFHdjZDLEVBQUV2RSxNQUFNMjdDLFVBQVd5SSxHQUFHRSxRQUFPLEtBRTVELE9BQU85akQsRUFBRStuRCxHQUFHdTZCLGlCQUFpQjdpRixFQUFHYSxFQUFHdEIsRUFBRytFLE1BQ3BDNEgsS0FBTWxNLElBQU1BLEVBQUU4aUYsd0JBQXdCbGpGLEdBQUksQ0FDNUNtd0QsUUFBUy92RCxFQUFFK3ZELFFBQ1gyTSxRQUFTOThELEtBdEJELENBd0JkaUIsRUFBRThuRSxXQUFZcmtFLEdBQ2hCekQsRUFBRXN0RSxrQkFBa0J0SyxtQkFBbUI3akUsRUFBRSt2RCxTQUFVLFNBQVMvdkQsRUFBR3NFLEVBQUcvRCxHQUM5RCxJQUFJTSxFQUFJYixFQUFFbXNFLEdBQUduc0UsRUFBRWlXLFlBQVkwc0QsU0FDM0I5aEUsSUFBTUEsRUFBSSxJQUFJc2xELEdBQUduTixJQUNqQm40QyxFQUFJQSxFQUFFMGxELE9BQU9qaUQsRUFBRy9ELEdBQUlQLEVBQUVtc0UsR0FBR25zRSxFQUFFaVcsWUFBWTBzRCxTQUFXOWhFLEVBSEgsQ0FRdERBLEVBQUdiLEVBQUUrdkQsUUFBU3h2RCxTQUFVNHVFLEdBQUd0dUUsRUFBR2IsRUFBRTA4RCxlQUFnQnNOLEdBQUducEUsRUFBRXF0RSxhQUNwRCxNQUFPbHVFLEdBR0wsTUFBTXNFLEVBQUkrbUUsR0FBR3JyRSxFQUFHLDJCQUNoQk8sRUFBRTJFLE9BQU9aLElBNjdJeUNrdUUsT0FBU3NDLEdBQUc5MEUsR0FBSXNFLEVBQUcvRCxJQUFNQSxFQUFFNkUsUUFGMUUsQ0FHTHEwRSxHQUFHejVFLEdBQUlzRSxHQU1ULFNBQVN1OUUsR0FBRzdoRixFQUFHc0UsRUFBRy9ELEdBQ2xCLE1BQU1NLEVBQUlOLEVBQUU2aEUsS0FBS3ppRSxJQUFJMkUsRUFBRXVZLE1BQU8vZCxFQUFJLElBQUlnakYsR0FBRzloRixHQUN6QyxPQUFPLElBQUl3K0UsR0FBR3grRSxFQUFHbEIsRUFBR3dGLEVBQUV1WSxLQUFNaGMsRUFBRyxJQUFJMDlFLEdBQUdoK0UsRUFBRXUvRCxpQkFBa0J2L0QsRUFBRW0vRCxXQUFZcDdELEVBQUVzekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5QjFFLE1BQU1tTCxXQUFXLE1BRWpCLFlBQVkvaUYsRUFBR3NFLEdBQ1g3QyxLQUFLczhFLFdBQWEvOUUsRUFBR3lCLEtBQUt1aEYsYUFBZTErRSxFQUFHN0MsS0FBS2dnRixZQUFjckYsR0FBR3A4RSxHQU8vRCxJQUFJQSxHQUNQLE1BQU1zRSxFQUFJcTlFLEdBQUczaEYsRUFBR3lCLEtBQUtzOEUsWUFBYXg5RSxFQUFJLElBQUk0Z0YsR0FBRzEvRSxLQUFLczhFLFlBQ2xELE9BQU90OEUsS0FBS3VoRixhQUFhQyxPQUFPLENBQUUzK0UsRUFBRXVZLE9BQVEzUSxLQUFNbE0sSUFDOUMsSUFBS0EsR0FBSyxJQUFNQSxFQUFFaUIsT0FBUSxPQUFPOG5DLElBQ2pDLE1BQU1sb0MsRUFBSWIsRUFBRSxHQUNaLEdBQUlhLEVBQUU2aEQsa0JBQW1CLE9BQU8sSUFBSW83QixHQUFHcjhFLEtBQUtzOEUsV0FBWXg5RSxFQUFHTSxFQUFFUixJQUFLUSxFQUFHeUQsRUFBRXN6RSxXQUN2RSxHQUFJLzJFLEVBQUU4MUQsZUFBZ0IsT0FBTyxJQUFJbW5CLEdBQUdyOEUsS0FBS3M4RSxXQUFZeDlFLEVBQUcrRCxFQUFFdVksS0FBTSxLQUFNdlksRUFBRXN6RSxXQUN4RSxNQUFNN3VDLE1BR2QsSUFBSS9vQyxFQUFHc0UsRUFBRy9ELEdBQ04sTUFBTU0sRUFBSThnRixHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBQWFqL0UsRUFBSW1pRixHQUFHcGdGLEVBQUUrMkUsVUFBV3R6RSxFQUFHL0QsR0FBSVgsRUFBSXk4RSxHQUFHNTZFLEtBQUtnZ0YsWUFBYSxrQkFBbUI1Z0YsRUFBRWdjLEtBQU0vZCxFQUFHLE9BQVMrQixFQUFFKzJFLFVBQVdyM0UsR0FDMUksT0FBT2tCLEtBQUt1aEYsYUFBYXh5RSxJQUFJM1AsRUFBRWdjLEtBQU1qZCxHQUFJNkIsS0FFN0MsT0FBT3pCLEVBQUdzRSxFQUFHL0QsS0FBTU0sR0FDZixNQUFNL0IsRUFBSTZpRixHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBR2IsSUFBSW4rRSxFQUNaLE9BQU9BLEVBQUksaUJBQW9CMEUsRUFBSSxZQUFtQkEsS0FBT0EsYUFBYTIyRSxHQUFLcUMsR0FBRzc3RSxLQUFLZ2dGLFlBQWEscUJBQXNCM2lGLEVBQUUrZCxLQUFNdlksRUFBRy9ELEVBQUdNLEdBQUt1OEUsR0FBRzM3RSxLQUFLZ2dGLFlBQWEscUJBQXNCM2lGLEVBQUUrZCxLQUFNdlksR0FDaE03QyxLQUFLdWhGLGFBQWF0MkIsT0FBTzV0RCxFQUFFK2QsS0FBTWpkLEdBQUk2QixLQU9sQyxPQUFPekIsR0FDVixNQUFNc0UsRUFBSXE5RSxHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBQ3JCLE9BQU90OEUsS0FBS3VoRixhQUFhdHNELE9BQU9weUIsRUFBRXVZLE1BQU9wYixPQU03QyxZQUFZekIsRUFBR3NFLEdBQ1hzRSxNQUFNNUksRUFBR3NFLEdBQUk3QyxLQUFLczhFLFdBQWEvOUUsRUFPNUIsSUFBSUEsR0FDUCxNQUFNc0UsRUFBSXE5RSxHQUFHM2hGLEVBQUd5QixLQUFLczhFLFlBQWF4OUUsRUFBSSxJQUFJdWhGLEdBQUdyZ0YsS0FBS3M4RSxZQUNsRCxPQUFPbjFFLE1BQU1qSixJQUFJSyxHQUFHa00sS0FBTWxNLEdBQUssSUFBSXcrRSxHQUFHLzhFLEtBQUtzOEUsV0FBWXg5RSxFQUFHK0QsRUFBRXVZLEtBQU03YyxFQUFFaStFLFVBQVcsSUFBSU0sSUFDM0QsR0FDUCxHQUFLajZFLEVBQUVzekUsYUFvQjVCLFNBQVNzTCxHQUFHbGpGLEVBQUdzRSxHQUNmLE9Bcm9HQSxTQUFZdEUsRUFBR3NFLEdBQ2YsTUFBTS9ELEVBQUksSUFBSXkyQyxFQUNkLE9BQU9oM0MsRUFBRSs2RCxXQUFXeUQsaUJBQWlCLFVBQ2pDLE1BQU0zOUQsUUFBVSxTQUFTYixHQUNyQixPQUFPMDBFLEdBQUcxMEUsR0FBR2tNLEtBQU1sTSxHQUFLQSxFQUFFNG9FLFdBRGQsQ0FFZDVvRSxHQUNGLElBQUl1ekUsR0FBR3Z6RSxFQUFFKzZELFdBQVlsNkQsRUFBR3lELEVBQUcvRCxHQUFHNGlGLFFBQzdCNWlGLEVBQUU2RSxRQThuR0FnK0UsQ0FBRzNKLEdBQUd6NUUsRUFBSW0yRSxHQUFHbjJFLEVBQUdpNUUsS0FBTzE0RSxHQUFLK0QsRUFBRSxJQUFJeStFLEdBQUcvaUYsRUFBR087Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQi9DLFNBQVM4aUYsS0FDVCxPQUFPLElBQUl4RyxHQUFHLGVBTWQsU0FBU3lHLEtBQ1QsT0FBTyxJQUFJdkcsR0FBRyxtQkFjZCxTQUFTd0csTUFBTXZqRixHQUdmLE9BQU8sSUFBSWc5RSxHQUFHLGFBQWNoOUUsR0FhNUIsU0FBU3dqRixNQUFNeGpGLEdBR2YsT0FBTyxJQUFJazlFLEdBQUcsY0FBZWw5RSxHQXFCN0IsU0FBU3lqRixHQUFHempGLEdBQ1osT0FBTyxJQUFJbTlFLEdBQUcsWUFBYW45RTs7Ozs7Ozs7Ozs7Ozs7OztHQTZCM0IsU0FBUzBqRixHQUFHMWpGLEdBQ1osT0FBT3k1RSxHQUFHejVFLEVBQUltMkUsR0FBR24yRSxFQUFHaTVFLEtBQU0sSUFBSW9JLEdBQUdyaEYsRUFBSXNFLEdBQUtnK0UsR0FBR3RpRixFQUFHc0UsS0FPL0MsU0FBU3RFLEVBQUdzRSxHQUFJLElBQ2hCLFNBQVN0RSxHQUNOKzBDLEVBQUkvMEMsRUFEUCxDQUVDLGVBQWMsNkJBQW1CLElBQUksSUFBVSxZQUFhLENBQUVBLEdBQUl5akIsUUFBU2xqQixNQUN6RSxNQUFNTSxFQUFJYixFQUFFOHVDLFlBQVksT0FBT0MsZUFBZ0Jqd0MsRUFBSSxJQUFJbTZFLEdBQUdwNEUsRUFBRyxJQUFJZ29DLEVBQUU3b0MsRUFBRTh1QyxZQUFZLGtCQUFtQixJQUFJa0osRUFBRWg0QyxFQUFFOHVDLFlBQVksd0JBQ3hILE9BQU92dUMsRUFBSWYsT0FBT3lHLE9BQU8sQ0FDckI0K0QsZ0JBQWlCdmdFLEdBQ2xCL0QsR0FBSXpCLEVBQUUyNEUsYUFBYWwzRSxHQUFJekIsR0FDMUIsV0FBWSwwQkFBZ0IwMUMsRUFBRyxRQUFTeDBDLEdBRTVDLDBCQUFnQncwQyxFQUFHLFFBQVMsV0FWM0IsSywrQ0NsNmlCTDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkEsTUFBTW12QyxFQUNGLFlBQVlsbUQsR0FDUmg4QixLQUFLZzhCLFVBQVlBLEVBSXJCLHdCQUlJLE9BSGtCaDhCLEtBQUtnOEIsVUFBVW1tRCxlQUk1QjVyRSxJQUFJRSxJQUNMLEdBb0JaLFNBQWtDQSxHQUM5QixNQUFNMnJFLEVBQVkzckUsRUFBUzRyRSxlQUMzQixNQUFrRixhQUExRUQsYUFBNkMsRUFBU0EsRUFBVWo5RSxNQXRCNURtOUUsQ0FBeUI3ckUsR0FBVyxDQUNwQyxNQUFNbFAsRUFBVWtQLEVBQVM2MkIsZUFDekIsTUFBTyxHQUFHL2xDLEVBQVFnN0UsV0FBV2g3RSxFQUFRaTJDLFVBR3JDLE9BQU8sT0FHVnZtQyxPQUFPdXJFLEdBQWFBLEdBQ3BCbmhGLEtBQUssTUFnQmxCLE1BQU1vaEYsRUFBUyxnQkFtQlRDLEVBQVMsSUFBSSxJQUFPLGlCQXdFcEJDLEVBQXFCLFlBQ3JCQyxFQUFzQixDQUN4QixDQUFDSCxHQUFTLFlBQ1YsdUJBQVUsbUJBQ1Ysc0JBQVUsaUJBQ1YsNkJBQVUsd0JBQ1Ysc0JBQVUsaUJBQ1YsNkJBQVUsd0JBQ1YsaUJBQVUsWUFDVix3QkFBVSxtQkFDVixxQkFBVSxZQUNWLDRCQUFVLG1CQUNWLHNCQUFVLFVBQ1YsNkJBQVUsaUJBQ1YsMEJBQVUsV0FDVixpQ0FBVSxrQkFDVixzQkFBVSxXQUNWLDZCQUFVLGtCQUNWLHdCQUFVLFlBQ1YsK0JBQVUsbUJBQ1YsMEJBQVUsVUFDVixpQ0FBVSxpQkFDVixvQkFBVSxXQUNWLDJCQUFVLGtCQUNWLHNCQUFVLFdBQ1YsNkJBQVUsa0JBQ1YsVUFBVyxVQUNYLFNBQVEsZUFzQk5JLEVBQVEsSUFBSWwwRSxJQU9abTBFLEVBQWMsSUFBSW4wRSxJQU14QixTQUFTbzBFLEVBQWMza0UsRUFBS2drRSxHQUN4QixJQUNJaGtFLEVBQUk0ZCxVQUFVZ25ELGFBQWFaLEdBRS9CLE1BQU92L0UsR0FDSDYvRSxFQUFPN3VDLE1BQU0sYUFBYXV1QyxFQUFVeGtGLDRDQUE0Q3dnQixFQUFJeGdCLE9BQVFpRixJQU9wRyxTQUFTb2dGLEVBQXlCN2tFLEVBQUtna0UsR0FDbkNoa0UsRUFBSTRkLFVBQVVrbkQsd0JBQXdCZCxHQVMxQyxTQUFTZSxFQUFtQmYsR0FDeEIsTUFBTWdCLEVBQWdCaEIsRUFBVXhrRixLQUNoQyxHQUFJa2xGLEVBQVl2M0QsSUFBSTYzRCxHQUVoQixPQURBVixFQUFPN3VDLE1BQU0sc0RBQXNEdXZDLE9BQzVELEVBRVhOLEVBQVkvekUsSUFBSXEwRSxFQUFlaEIsR0FFL0IsSUFBSyxNQUFNaGtFLEtBQU95a0UsRUFBTWxuQyxTQUNwQm9uQyxFQUFjM2tFLEVBQUtna0UsR0FFdkIsT0FBTyxFQVdYLFNBQVNpQixFQUFhamxFLEVBQUt4Z0IsR0FDdkIsT0FBT3dnQixFQUFJNGQsVUFBVXFSLFlBQVl6dkMsR0FVckMsU0FBUzBsRixFQUF1QmxsRSxFQUFLeGdCLEVBQU0ybEYsRUFBcUJaLEdBQzVEVSxFQUFhamxFLEVBQUt4Z0IsR0FBTTRsRixjQUFjRCxHQU8xQyxTQUFTRSxJQUNMWCxFQUFZMzhDOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJoQixNQUFNdTlDLEVBQVMsQ0FDWCxTQUF5QixvRkFFekIsZUFBcUMsZ0NBQ3JDLGdCQUF1QyxrRkFDdkMsY0FBbUMsa0RBQ25DLHVCQUFxRCw2RUFFckQsdUJBQXFELHlEQUVuREMsRUFBZ0IsSUFBSSxJQUFhLE1BQU8sV0FBWUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0IxRCxNQUFNRSxFQUNGLFlBQVk1aEUsRUFBU2xTLEVBQVFrc0IsR0FDekJoOEIsS0FBSzZqRixZQUFhLEVBQ2xCN2pGLEtBQUs4akYsU0FBVy9sRixPQUFPeUcsT0FBTyxHQUFJd2QsR0FDbENoaUIsS0FBSytqRixRQUFVaG1GLE9BQU95RyxPQUFPLEdBQUlzTCxHQUNqQzlQLEtBQUtna0YsTUFBUWwwRSxFQUFPbFMsS0FDcEJvQyxLQUFLaWtGLGdDQUNEbjBFLEVBQU9vMEUsK0JBQ1hsa0YsS0FBS21rRixXQUFhbm9ELEVBQ2xCaDhCLEtBQUtnOEIsVUFBVWduRCxhQUFhLElBQUksSUFBVSxNQUFPLElBQU1oakYsS0FBTSxXQUVqRSxxQ0FFSSxPQURBQSxLQUFLb2tGLGlCQUNFcGtGLEtBQUtpa0YsZ0NBRWhCLG1DQUFtQ0ksR0FDL0Jya0YsS0FBS29rRixpQkFDTHBrRixLQUFLaWtGLGdDQUFrQ0ksRUFFM0MsV0FFSSxPQURBcmtGLEtBQUtva0YsaUJBQ0Vwa0YsS0FBS2drRixNQUVoQixjQUVJLE9BREFoa0YsS0FBS29rRixpQkFDRXBrRixLQUFLOGpGLFNBRWhCLGFBRUksT0FEQTlqRixLQUFLb2tGLGlCQUNFcGtGLEtBQUsrakYsUUFFaEIsZ0JBQ0ksT0FBTy9qRixLQUFLbWtGLFdBRWhCLGdCQUNJLE9BQU9ua0YsS0FBSzZqRixXQUVoQixjQUFjUSxHQUNWcmtGLEtBQUs2akYsV0FBYVEsRUFNdEIsaUJBQ0ksR0FBSXJrRixLQUFLc2tGLFVBQ0wsTUFBTVgsRUFBY2hsRixPQUFPLGNBQWlDLENBQUVvUCxRQUFTL04sS0FBS2drRjs7Ozs7Ozs7Ozs7Ozs7OztHQTBCeEYsTUFBTU8sRUE1UVUsUUE2UWhCLFNBQVNDLEVBQWN4aUUsRUFBU3lpRSxFQUFZLElBQ3hDLEdBQXlCLGlCQUFkQSxFQUF3QixDQUUvQkEsRUFBWSxDQUFFN21GLEtBREQ2bUYsR0FHakIsTUFBTTMwRSxFQUFTL1IsT0FBT3lHLE9BQU8sQ0FBRTVHLEtBQU0ra0YsRUFBb0J1QixnQ0FBZ0MsR0FBU08sR0FDNUY3bUYsRUFBT2tTLEVBQU9sUyxLQUNwQixHQUFvQixpQkFBVEEsSUFBc0JBLEVBQzdCLE1BQU0rbEYsRUFBY2hsRixPQUFPLGVBQW1DLENBQzFEb1AsUUFBU3BNLE9BQU8vRCxLQUd4QixNQUFNOG1GLEVBQWM3QixFQUFNM2tGLElBQUlOLEdBQzlCLEdBQUk4bUYsRUFBYSxDQUViLEdBQUksWUFBVTFpRSxFQUFTMGlFLEVBQVkxaUUsVUFDL0IsWUFBVWxTLEVBQVE0MEUsRUFBWTUwRSxRQUM5QixPQUFPNDBFLEVBR1AsTUFBTWYsRUFBY2hsRixPQUFPLGdCQUFxQyxDQUFFb1AsUUFBU25RLElBR25GLE1BQU1vK0IsRUFBWSxJQUFJLElBQW1CcCtCLEdBQ3pDLElBQUssTUFBTXdrRixLQUFhVSxFQUFZbm5DLFNBQ2hDM2YsRUFBVWduRCxhQUFhWixHQUUzQixNQUFNdUMsRUFBUyxJQUFJZixFQUFnQjVoRSxFQUFTbFMsRUFBUWtzQixHQUVwRCxPQURBNm1ELEVBQU05ekUsSUFBSW5SLEVBQU0rbUYsR0FDVEEsRUErQlgsU0FBU0MsRUFBT2huRixFQUFPK2tGLEdBQ25CLE1BQU12a0UsRUFBTXlrRSxFQUFNM2tGLElBQUlOLEdBQ3RCLElBQUt3Z0IsRUFDRCxNQUFNdWxFLEVBQWNobEYsT0FBTyxTQUF1QixDQUFFb1AsUUFBU25RLElBRWpFLE9BQU93Z0IsRUFNWCxTQUFTeW1FLElBQ0wsT0FBT3hrRixNQUFNcTBCLEtBQUttdUQsRUFBTWxuQyxVQW1CNUI3cUMsZUFBZWcwRSxFQUFVMW1FLEdBQ3JCLE1BQU14Z0IsRUFBT3dnQixFQUFJeGdCLEtBQ2JpbEYsRUFBTXQzRCxJQUFJM3RCLEtBQ1ZpbEYsRUFBTTV0RCxPQUFPcjNCLFNBQ1BnRyxRQUFRZ1osSUFBSXdCLEVBQUk0ZCxVQUNqQm1tRCxlQUNBNXJFLElBQUlFLEdBQVlBLEVBQVN3ZSxXQUM5QjdXLEVBQUlrbUUsV0FBWSxHQVd4QixTQUFTUyxFQUFnQkMsRUFBa0J4bkMsRUFBU3luQyxHQUNoRCxJQUFJaDJFLEVBR0osSUFBSXN6RSxFQUEyRCxRQUFoRHR6RSxFQUFLMnpFLEVBQW9Cb0MsVUFBc0MsSUFBUC8xRSxFQUFnQkEsRUFBSysxRSxFQUN4RkMsSUFDQTFDLEdBQVcsSUFBSTBDLEdBRW5CLE1BQU1DLEVBQWtCM0MsRUFBUTNrRSxNQUFNLFNBQ2hDdW5FLEVBQWtCM25DLEVBQVE1L0IsTUFBTSxTQUN0QyxHQUFJc25FLEdBQW1CQyxFQUFpQixDQUNwQyxNQUFNQyxFQUFVLENBQ1osK0JBQStCN0Msb0JBQTBCL2tDLE9BWTdELE9BVkkwbkMsR0FDQUUsRUFBUWhrRixLQUFLLGlCQUFpQm1oRixzREFFOUIyQyxHQUFtQkMsR0FDbkJDLEVBQVFoa0YsS0FBSyxPQUViK2pGLEdBQ0FDLEVBQVFoa0YsS0FBSyxpQkFBaUJvOEMsMkRBRWxDa2xDLEVBQU96dUMsS0FBS214QyxFQUFRL2pGLEtBQUssTUFHN0I4aEYsRUFBbUIsSUFBSSxJQUFhWixFQUFILFdBQXNCLEtBQU0sQ0FBR0EsVUFBUy9rQyxZQUFZLFlBU3pGLFNBQVM2bkMsRUFBTUMsRUFBYXRqRSxHQUN4QixHQUFvQixPQUFoQnNqRSxHQUErQyxtQkFBaEJBLEVBQy9CLE1BQU0zQixFQUFjaGxGLE9BQU8sd0JBRS9CLFlBQWtCMm1GLEVBQWF0akUsR0FXbkMsU0FBU3l4QixFQUFZcG1DLEdBQ2pCLFlBQWNBOzs7Ozs7Ozs7Ozs7Ozs7O0dBbUJsQixJQUFnQzQzRSxJQWdCVCxHQWZuQjlCLEVBQW1CLElBQUksSUFBVSxrQkFBbUJubkQsR0FBYSxJQUFJa21ELEVBQTBCbG1ELEdBQVksWUFFM0crb0QsRUFBZ0J0QyxFQXRnQkYsU0FzZ0JxQndDLEdBRW5DRixFQUFnQnRDLEVBeGdCRixTQXdnQnFCLFdBRW5Dc0MsRUFBZ0IsVUFBVyxLLDZCQ3JrQi9COzs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxNQUFNUSxFQUFZLEdBWWxCLElBQUlDLEdBQ0osU0FBV0EsR0FDUEEsRUFBU0EsRUFBZ0IsTUFBSSxHQUFLLFFBQ2xDQSxFQUFTQSxFQUFrQixRQUFJLEdBQUssVUFDcENBLEVBQVNBLEVBQWUsS0FBSSxHQUFLLE9BQ2pDQSxFQUFTQSxFQUFlLEtBQUksR0FBSyxPQUNqQ0EsRUFBU0EsRUFBZ0IsTUFBSSxHQUFLLFFBQ2xDQSxFQUFTQSxFQUFpQixPQUFJLEdBQUssU0FOdkMsQ0FPR0EsSUFBYUEsRUFBVyxLQUMzQixNQUFNQyxFQUFvQixDQUN0QixNQUFTRCxFQUFTN3hDLE1BQ2xCLFFBQVc2eEMsRUFBU0UsUUFDcEIsS0FBUUYsRUFBU0csS0FDakIsS0FBUUgsRUFBU3h4QyxLQUNqQixNQUFTd3hDLEVBQVNsNEUsTUFDbEIsT0FBVWs0RSxFQUFTSSxRQUtqQkMsRUFBa0JMLEVBQVNHLEtBTzNCRyxFQUFnQixDQUNsQixDQUFDTixFQUFTN3hDLE9BQVEsTUFDbEIsQ0FBQzZ4QyxFQUFTRSxTQUFVLE1BQ3BCLENBQUNGLEVBQVNHLE1BQU8sT0FDakIsQ0FBQ0gsRUFBU3h4QyxNQUFPLE9BQ2pCLENBQUN3eEMsRUFBU2w0RSxPQUFRLFNBT2hCeTRFLEVBQW9CLENBQUM5M0UsRUFBVSszRSxLQUFZNTRFLEtBQzdDLEdBQUk0NEUsRUFBVS8zRSxFQUFTWixTQUNuQixPQUVKLE1BQU04SCxHQUFNLElBQUkvUixNQUFPMG1ELGNBQ2pCNytDLEVBQVM2NkUsRUFBY0UsR0FDN0IsSUFBSS82RSxFQUlBLE1BQU0sSUFBSTFLLE1BQU0sOERBQThEeWxGLE1BSDlFbGpGLFFBQVFtSSxHQUFRLElBQUlrSyxPQUFTbEgsRUFBU3JRLFdBQVl3UCxJQU0xRCxNQUFNNjRFLEVBT0YsWUFBWXJvRixHQUNSb0MsS0FBS3BDLEtBQU9BLEVBSVpvQyxLQUFLa21GLFVBQVlMLEVBS2pCN2xGLEtBQUttbUYsWUFBY0osRUFJbkIvbEYsS0FBS29tRixnQkFBa0IsS0FJdkJiLEVBQVVua0YsS0FBS3BCLE1BRW5CLGVBQ0ksT0FBT0EsS0FBS2ttRixVQUVoQixhQUFhN0IsR0FDVCxLQUFNQSxLQUFPbUIsR0FDVCxNQUFNLElBQUlhLFVBQVUsa0JBQWtCaEMsK0JBRTFDcmtGLEtBQUtrbUYsVUFBWTdCLEVBR3JCLFlBQVlBLEdBQ1Jya0YsS0FBS2ttRixVQUEyQixpQkFBUjdCLEVBQW1Cb0IsRUFBa0JwQixHQUFPQSxFQUV4RSxpQkFDSSxPQUFPcmtGLEtBQUttbUYsWUFFaEIsZUFBZTlCLEdBQ1gsR0FBbUIsbUJBQVJBLEVBQ1AsTUFBTSxJQUFJZ0MsVUFBVSxxREFFeEJybUYsS0FBS21tRixZQUFjOUIsRUFFdkIscUJBQ0ksT0FBT3JrRixLQUFLb21GLGdCQUVoQixtQkFBbUIvQixHQUNmcmtGLEtBQUtvbUYsZ0JBQWtCL0IsRUFLM0IsU0FBU2ozRSxHQUNMcE4sS0FBS29tRixpQkFBbUJwbUYsS0FBS29tRixnQkFBZ0JwbUYsS0FBTXdsRixFQUFTN3hDLFNBQVV2bUMsR0FDdEVwTixLQUFLbW1GLFlBQVlubUYsS0FBTXdsRixFQUFTN3hDLFNBQVV2bUMsR0FFOUMsT0FBT0EsR0FDSHBOLEtBQUtvbUYsaUJBQ0RwbUYsS0FBS29tRixnQkFBZ0JwbUYsS0FBTXdsRixFQUFTRSxXQUFZdDRFLEdBQ3BEcE4sS0FBS21tRixZQUFZbm1GLEtBQU13bEYsRUFBU0UsV0FBWXQ0RSxHQUVoRCxRQUFRQSxHQUNKcE4sS0FBS29tRixpQkFBbUJwbUYsS0FBS29tRixnQkFBZ0JwbUYsS0FBTXdsRixFQUFTRyxRQUFTdjRFLEdBQ3JFcE4sS0FBS21tRixZQUFZbm1GLEtBQU13bEYsRUFBU0csUUFBU3Y0RSxHQUU3QyxRQUFRQSxHQUNKcE4sS0FBS29tRixpQkFBbUJwbUYsS0FBS29tRixnQkFBZ0JwbUYsS0FBTXdsRixFQUFTeHhDLFFBQVM1bUMsR0FDckVwTixLQUFLbW1GLFlBQVlubUYsS0FBTXdsRixFQUFTeHhDLFFBQVM1bUMsR0FFN0MsU0FBU0EsR0FDTHBOLEtBQUtvbUYsaUJBQW1CcG1GLEtBQUtvbUYsZ0JBQWdCcG1GLEtBQU13bEYsRUFBU2w0RSxTQUFVRixHQUN0RXBOLEtBQUttbUYsWUFBWW5tRixLQUFNd2xGLEVBQVNsNEUsU0FBVUYsSUFHbEQsU0FBU3FtQyxFQUFZNnlDLEdBQ2pCZixFQUFVcDhFLFFBQVFvOUUsSUFDZEEsRUFBSzl5QyxZQUFZNnlDLEtBR3pCLFNBQVNFLEVBQWtCbEIsRUFBYXRqRSxHQUNwQyxJQUFLLE1BQU0vVCxLQUFZczNFLEVBQVcsQ0FDOUIsSUFBSWtCLEVBQWlCLEtBQ2pCemtFLEdBQVdBLEVBQVFza0UsUUFDbkJHLEVBQWlCaEIsRUFBa0J6akUsRUFBUXNrRSxRQUczQ3I0RSxFQUFTeTRFLGVBRE8sT0FBaEJwQixFQUMwQixLQUdBLENBQUNyM0UsRUFBVXE0RSxLQUFVbDVFLEtBQzNDLE1BQU1uRyxFQUFVbUcsRUFDWG1KLElBQUlvd0UsSUFDTCxHQUFXLE1BQVBBLEVBQ0EsT0FBTyxLQUVOLEdBQW1CLGlCQUFSQSxFQUNaLE9BQU9BLEVBRU4sR0FBbUIsaUJBQVJBLEdBQW1DLGtCQUFSQSxFQUN2QyxPQUFPQSxFQUFJamhGLFdBRVYsR0FBSWloRixhQUFlcG1GLE1BQ3BCLE9BQU9vbUYsRUFBSTEvRSxRQUdYLElBQ0ksT0FBT2pDLEtBQUtDLFVBQVUwaEYsR0FFMUIsTUFBT0MsR0FDSCxPQUFPLFFBSWQzdkUsT0FBTzB2RSxHQUFPQSxHQUNkdGxGLEtBQUssS0FDTmlsRixJQUFVRyxRQUF1REEsRUFBaUJ4NEUsRUFBU1osV0FDM0ZpNEUsRUFBWSxDQUNSZ0IsTUFBT2QsRUFBU2MsR0FBTzd6RSxjQUN2QnhMLFVBQ0FtRyxPQUNBakksS0FBTThJLEVBQVNyUSxXLDZCQ2pOdkMsK0VBS0EsTUFBTWlwRixFQU9GLFlBQVlqcEYsRUFBTWtwRixFQUFpQjNoRixHQUMvQm5GLEtBQUtwQyxLQUFPQSxFQUNab0MsS0FBSzhtRixnQkFBa0JBLEVBQ3ZCOW1GLEtBQUttRixLQUFPQSxFQUNabkYsS0FBSyttRixtQkFBb0IsRUFJekIvbUYsS0FBS2duRixhQUFlLEdBQ3BCaG5GLEtBQUtpbkYsa0JBQW9CLE9BQ3pCam5GLEtBQUtrbkYsa0JBQW9CLEtBRTdCLHFCQUFxQjFvRixHQUVqQixPQURBd0IsS0FBS2luRixrQkFBb0J6b0YsRUFDbEJ3QixLQUVYLHFCQUFxQittRixHQUVqQixPQURBL21GLEtBQUsrbUYsa0JBQW9CQSxFQUNsQi9tRixLQUVYLGdCQUFnQm1uRixHQUVaLE9BREFubkYsS0FBS2duRixhQUFlRyxFQUNibm5GLEtBRVgsMkJBQTJCNkQsR0FFdkIsT0FEQTdELEtBQUtrbkYsa0JBQW9CcmpGLEVBQ2xCN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDZixNQUFNb25GLEVBQ0YsWUFBWXhwRixFQUFNbytCLEdBQ2RoOEIsS0FBS3BDLEtBQU9BLEVBQ1pvQyxLQUFLZzhCLFVBQVlBLEVBQ2pCaDhCLEtBQUtvaUYsVUFBWSxLQUNqQnBpRixLQUFLdWxGLFVBQVksSUFBSTUyRSxJQUNyQjNPLEtBQUtxbkYsa0JBQW9CLElBQUkxNEUsSUFDN0IzTyxLQUFLc25GLGlCQUFtQixJQUFJMzRFLElBQzVCM08sS0FBS3VuRixnQkFBa0IsSUFBSTU0RSxJQU0vQixJQUFJd2dCLEdBRUEsTUFBTXE0RCxFQUF1QnhuRixLQUFLeW5GLDRCQUE0QnQ0RCxHQUM5RCxJQUFLbnZCLEtBQUtxbkYsa0JBQWtCOTdELElBQUlpOEQsR0FBdUIsQ0FDbkQsTUFBTS9kLEVBQVcsSUFBSSxJQUVyQixHQURBenBFLEtBQUtxbkYsa0JBQWtCdDRFLElBQUl5NEUsRUFBc0IvZCxHQUM3Q3pwRSxLQUFLNjNFLGNBQWMyUCxJQUNuQnhuRixLQUFLMG5GLHVCQUVMLElBQ0ksTUFBTXo1RSxFQUFXak8sS0FBSzJuRix1QkFBdUIsQ0FDekNwRSxtQkFBb0JpRSxJQUVwQnY1RSxHQUNBdzdELEVBQVMvbEUsUUFBUXVLLEdBR3pCLE1BQU9wTCxLQU1mLE9BQU83QyxLQUFLcW5GLGtCQUFrQm5wRixJQUFJc3BGLEdBQXNCN2pGLFFBRTVELGFBQWFxZSxHQUNULElBQUkvUyxFQUVKLE1BQU11NEUsRUFBdUJ4bkYsS0FBS3luRiw0QkFBNEJ6bEUsYUFBeUMsRUFBU0EsRUFBUW1OLFlBQ2xING1CLEVBQXlGLFFBQTdFOW1DLEVBQUsrUyxhQUF5QyxFQUFTQSxFQUFRK3pCLGdCQUE2QixJQUFQOW1DLEdBQWdCQSxFQUN2SCxJQUFJalAsS0FBSzYzRSxjQUFjMlAsS0FDbkJ4bkYsS0FBSzBuRix1QkFlSixDQUVELEdBQUkzeEMsRUFDQSxPQUFPLEtBR1AsTUFBTXgxQyxNQUFNLFdBQVdQLEtBQUtwQyx5QkFwQmhDLElBQ0ksT0FBT29DLEtBQUsybkYsdUJBQXVCLENBQy9CcEUsbUJBQW9CaUUsSUFHNUIsTUFBTzNrRixHQUNILEdBQUlrekMsRUFDQSxPQUFPLEtBR1AsTUFBTWx6QyxHQWN0QixlQUNJLE9BQU83QyxLQUFLb2lGLFVBRWhCLGFBQWFBLEdBQ1QsR0FBSUEsRUFBVXhrRixPQUFTb0MsS0FBS3BDLEtBQ3hCLE1BQU0yQyxNQUFNLHlCQUF5QjZoRixFQUFVeGtGLHFCQUFxQm9DLEtBQUtwQyxTQUU3RSxHQUFJb0MsS0FBS29pRixVQUNMLE1BQU03aEYsTUFBTSxpQkFBaUJQLEtBQUtwQyxrQ0FJdEMsR0FGQW9DLEtBQUtvaUYsVUFBWUEsRUFFWnBpRixLQUFLMG5GLHVCQUFWLENBSUEsR0F3S1IsU0FBMEJ0RixHQUN0QixNQUF1QyxVQUFoQ0EsRUFBVTZFOzs7Ozs7Ozs7Ozs7Ozs7O0dBektUVyxDQUFpQnhGLEdBQ2pCLElBQ0lwaUYsS0FBSzJuRix1QkFBdUIsQ0FBRXBFLG1CQTlHbkIsY0FnSGYsTUFBTzFnRixJQVVYLElBQUssTUFBTzBnRixFQUFvQnNFLEtBQXFCN25GLEtBQUtxbkYsa0JBQWtCbitFLFVBQVcsQ0FDbkYsTUFBTXMrRSxFQUF1QnhuRixLQUFLeW5GLDRCQUE0QmxFLEdBQzlELElBRUksTUFBTXQxRSxFQUFXak8sS0FBSzJuRix1QkFBdUIsQ0FDekNwRSxtQkFBb0JpRSxJQUV4QkssRUFBaUJua0YsUUFBUXVLLEdBRTdCLE1BQU9wTCxPQU1mLGNBQWNzc0IsRUF6SVMsYUEwSW5CbnZCLEtBQUtxbkYsa0JBQWtCcHlELE9BQU85RixHQUM5Qm52QixLQUFLc25GLGlCQUFpQnJ5RCxPQUFPOUYsR0FDN0JudkIsS0FBS3VsRixVQUFVdHdELE9BQU85RixHQUkxQixlQUNJLE1BQU0yNEQsRUFBV3puRixNQUFNcTBCLEtBQUsxMEIsS0FBS3VsRixVQUFVNXBDLGdCQUNyQy8zQyxRQUFRZ1osSUFBSSxJQUNYa3JFLEVBQ0U3d0UsT0FBTzFQLEdBQVcsYUFBY0EsR0FFaENnUCxJQUFJaFAsR0FBV0EsRUFBUTR0QyxTQUFTbGdCLGFBQ2xDNnlELEVBQ0U3d0UsT0FBTzFQLEdBQVcsWUFBYUEsR0FFL0JnUCxJQUFJaFAsR0FBV0EsRUFBUTR4RSxhQUdwQyxpQkFDSSxPQUF5QixNQUFsQm41RSxLQUFLb2lGLFVBRWhCLGNBQWNqekQsRUFoS1MsYUFpS25CLE9BQU9udkIsS0FBS3VsRixVQUFVaDZELElBQUk0RCxHQUU5QixXQUFXQSxFQW5LWSxhQW9LbkIsT0FBT252QixLQUFLc25GLGlCQUFpQnBwRixJQUFJaXhCLElBQWUsR0FFcEQsV0FBVzQ0RCxFQUFPLElBQ2QsTUFBTSxRQUFFL2xFLEVBQVUsSUFBTytsRSxFQUNuQlAsRUFBdUJ4bkYsS0FBS3luRiw0QkFBNEJNLEVBQUt4RSxvQkFDbkUsR0FBSXZqRixLQUFLNjNFLGNBQWMyUCxHQUNuQixNQUFNam5GLE1BQU0sR0FBR1AsS0FBS3BDLFFBQVE0cEYsbUNBRWhDLElBQUt4bkYsS0FBS2dvRixpQkFDTixNQUFNem5GLE1BQU0sYUFBYVAsS0FBS3BDLG9DQUVsQyxNQUFNcVEsRUFBV2pPLEtBQUsybkYsdUJBQXVCLENBQ3pDcEUsbUJBQW9CaUUsRUFDcEJ4bEUsWUFHSixJQUFLLE1BQU91aEUsRUFBb0JzRSxLQUFxQjduRixLQUFLcW5GLGtCQUFrQm4rRSxVQUFXLENBRS9FcytFLElBRGlDeG5GLEtBQUt5bkYsNEJBQTRCbEUsSUFFbEVzRSxFQUFpQm5rRixRQUFRdUssR0FHakMsT0FBT0EsRUFVWCxPQUFPcEssRUFBVXNyQixHQUNiLElBQUlsZ0IsRUFDSixNQUFNdTRFLEVBQXVCeG5GLEtBQUt5bkYsNEJBQTRCdDRELEdBQ3hEODRELEVBQThFLFFBQXpEaDVFLEVBQUtqUCxLQUFLdW5GLGdCQUFnQnJwRixJQUFJc3BGLFVBQTBDLElBQVB2NEUsRUFBZ0JBLEVBQUssSUFBSThiLElBQ3JIazlELEVBQWtCN2pFLElBQUl2Z0IsR0FDdEI3RCxLQUFLdW5GLGdCQUFnQng0RSxJQUFJeTRFLEVBQXNCUyxHQUMvQyxNQUFNdHlELEVBQW1CMzFCLEtBQUt1bEYsVUFBVXJuRixJQUFJc3BGLEdBSTVDLE9BSEk3eEQsR0FDQTl4QixFQUFTOHhCLEVBQWtCNnhELEdBRXhCLEtBQ0hTLEVBQWtCaHpELE9BQU9weEIsSUFPakMsc0JBQXNCb0ssRUFBVWtoQixHQUM1QixNQUFNKzRELEVBQVlsb0YsS0FBS3VuRixnQkFBZ0JycEYsSUFBSWl4QixHQUMzQyxHQUFLKzRELEVBR0wsSUFBSyxNQUFNcmtGLEtBQVlxa0YsRUFDbkIsSUFDSXJrRixFQUFTb0ssRUFBVWtoQixHQUV2QixNQUFPbGdCLEtBS2Ysd0JBQXVCLG1CQUFFczBFLEVBQWtCLFFBQUV2aEUsRUFBVSxLQUNuRCxJQUFJL1QsRUFBV2pPLEtBQUt1bEYsVUFBVXJuRixJQUFJcWxGLEdBQ2xDLElBQUt0MUUsR0FBWWpPLEtBQUtvaUYsWUFDbEJuMEUsRUFBV2pPLEtBQUtvaUYsVUFBVTBFLGdCQUFnQjltRixLQUFLZzhCLFVBQVcsQ0FDdER1bkQsb0JBeUN1QnAwRCxFQXpDMkJvMEQsRUF4T3ZDLGNBa1JoQnAwRCxPQUFvQzdyQixFQUFZNnJCLEdBekMzQ25OLFlBRUpoaUIsS0FBS3VsRixVQUFVeDJFLElBQUl3MEUsRUFBb0J0MUUsR0FDdkNqTyxLQUFLc25GLGlCQUFpQnY0RSxJQUFJdzBFLEVBQW9CdmhFLEdBTTlDaGlCLEtBQUttb0Ysc0JBQXNCbDZFLEVBQVVzMUUsR0FNakN2akYsS0FBS29pRixVQUFVOEUsbUJBQ2YsSUFDSWxuRixLQUFLb2lGLFVBQVU4RSxrQkFBa0JsbkYsS0FBS2c4QixVQUFXdW5ELEVBQW9CdDFFLEdBRXpFLE1BQU9nQixJQXFCdkIsSUFBdUNrZ0IsRUFoQi9CLE9BQU9saEIsR0FBWSxLQUV2Qiw0QkFBNEJraEIsRUFuUUwsYUFvUW5CLE9BQUludkIsS0FBS29pRixVQUNFcGlGLEtBQUtvaUYsVUFBVTJFLGtCQUFvQjUzRCxFQXJRM0IsWUF3UVJBLEVBR2YsdUJBQ0ksUUFBVW52QixLQUFLb2lGLFdBQzBCLGFBQXJDcGlGLEtBQUtvaUYsVUFBVTZFLG1CQThCM0IsTUFBTW1CLEVBQ0YsWUFBWXhxRixHQUNSb0MsS0FBS3BDLEtBQU9BLEVBQ1pvQyxLQUFLcW9GLFVBQVksSUFBSTE1RSxJQVd6QixhQUFheXpFLEdBQ1QsTUFBTTNyRSxFQUFXelcsS0FBS3F0QyxZQUFZKzBDLEVBQVV4a0YsTUFDNUMsR0FBSTZZLEVBQVN1eEUsaUJBQ1QsTUFBTSxJQUFJem5GLE1BQU0sYUFBYTZoRixFQUFVeGtGLHlDQUF5Q29DLEtBQUtwQyxRQUV6RjZZLEVBQVM2eEUsYUFBYWxHLEdBRTFCLHdCQUF3QkEsR0FDSHBpRixLQUFLcXRDLFlBQVkrMEMsRUFBVXhrRixNQUMvQm9xRixrQkFFVGhvRixLQUFLcW9GLFVBQVVwekQsT0FBT210RCxFQUFVeGtGLE1BRXBDb0MsS0FBS2dqRixhQUFhWixHQVN0QixZQUFZeGtGLEdBQ1IsR0FBSW9DLEtBQUtxb0YsVUFBVTk4RCxJQUFJM3RCLEdBQ25CLE9BQU9vQyxLQUFLcW9GLFVBQVVucUYsSUFBSU4sR0FHOUIsTUFBTTZZLEVBQVcsSUFBSTJ3RSxFQUFTeHBGLEVBQU1vQyxNQUVwQyxPQURBQSxLQUFLcW9GLFVBQVV0NUUsSUFBSW5SLEVBQU02WSxHQUNsQkEsRUFFWCxlQUNJLE9BQU9wVyxNQUFNcTBCLEtBQUsxMEIsS0FBS3FvRixVQUFVMXNDLGEsOEJDblp6QywyVUFTSWp6QyxFQVRBNi9FLEVBQXVDLG9CQUFmQyxXQUE2QkEsV0FBK0Isb0JBQVhqakYsT0FBeUJBLFlBQTJCLElBQVhJLEVBQXlCQSxFQUF5QixvQkFBVEcsS0FBdUJBLEtBQU8sR0FFekwyaUYsRUFBTSxHQU9KQyxFQUFLQSxHQUFNLEdBQUdwckYsRUFBRWlyRixHQUFnQnppRixLQUFLLFNBQVNvbkUsS0FBTSxTQUFTNEIsRUFBR3ptRSxHQUFHLElBQUlDLFNBQVNELEVBQXNELE1BQU8sVUFBM0RDLEVBQUUsVUFBVUEsRUFBRUEsRUFBRUQsRUFBRWhJLE1BQU1DLFFBQVErSCxHQUFHLFFBQVFDLEVBQUUsU0FBMEIsVUFBVUEsR0FBRyxpQkFBaUJELEVBQUU3SSxPQUFPLFNBQVNMLEVBQUVrSixHQUFHLElBQUlDLFNBQVNELEVBQUUsTUFBTyxVQUFVQyxHQUFHLE1BQU1ELEdBQUcsWUFBWUMsRUFBd0YsSUFBSTRqRSxFQUFHLGdCQUFnQixJQUFJdjhELEtBQUtzbkIsV0FBVyxHQUFHKzJDLEVBQUcsRUFBRSxTQUFTTCxFQUFHdGxFLEVBQUVDLEVBQUU1SyxHQUFHLE9BQU8ySyxFQUFFN0ssS0FBS2c5RCxNQUFNbnlELEVBQUV4SixLQUFLbW5CLFdBQ3JjLFNBQVN3bUQsRUFBR25rRSxFQUFFQyxFQUFFNUssR0FBRyxJQUFJMkssRUFBRSxNQUFNOUgsUUFBUSxHQUFHLEVBQUV5bEIsVUFBVXhtQixPQUFPLENBQUMsSUFBSTdCLEVBQUUwQyxNQUFNcEIsVUFBVWtQLE1BQU0zUSxLQUFLd29CLFVBQVUsR0FBRyxPQUFPLFdBQVcsSUFBSW5qQixFQUFFeEMsTUFBTXBCLFVBQVVrUCxNQUFNM1EsS0FBS3dvQixXQUE4QyxPQUFuQzNsQixNQUFNcEIsVUFBVTBwRixRQUFRbnVCLE1BQU0zM0QsRUFBRWxGLEdBQVUwSyxFQUFFbXlELE1BQU1seUQsRUFBRXpGLElBQUksT0FBTyxXQUFXLE9BQU93RixFQUFFbXlELE1BQU1seUQsRUFBRTBkLFlBQVksU0FBU291QixFQUFFL3JDLEVBQUVDLEVBQUU1SyxHQUFvRyxPQUFWMDJDLEVBQXZGdGxDLFNBQVM3UCxVQUFVSixPQUFPLEdBQUdpUSxTQUFTN1AsVUFBVUosS0FBSzZHLFdBQVdZLFFBQVEsZUFBaUJxbkUsRUFBS25CLEdBQVloUyxNQUFNLEtBQUt4MEMsV0FDeFosU0FBU2tyRCxFQUFHN29FLEVBQUVDLEdBQUcsSUFBSTVLLEVBQUUyQyxNQUFNcEIsVUFBVWtQLE1BQU0zUSxLQUFLd29CLFVBQVUsR0FBRyxPQUFPLFdBQVcsSUFBSXJvQixFQUFFRCxFQUFFeVEsUUFBa0MsT0FBMUJ4USxFQUFFeUQsS0FBS281RCxNQUFNNzhELEVBQUVxb0IsV0FBa0IzZCxFQUFFbXlELE1BQU14NkQsS0FBS3JDLElBQUksU0FBU1ksRUFBRThKLEVBQUVDLEdBQUcsU0FBUzVLLEtBQUtBLEVBQUV1QixVQUFVcUosRUFBRXJKLFVBQVVvSixFQUFFa3VDLEVBQUVqdUMsRUFBRXJKLFVBQVVvSixFQUFFcEosVUFBVSxJQUFJdkIsRUFBRTJLLEVBQUVwSixVQUFVa0UsWUFBWWtGLEVBQUVBLEVBQUV1Z0YsR0FBRyxTQUFTanJGLEVBQUVrRixFQUFFc3BFLEdBQUcsSUFBSSxJQUFJOTFCLEVBQUVoMkMsTUFBTTJsQixVQUFVeG1CLE9BQU8sR0FBR1YsRUFBRSxFQUFFQSxFQUFFa25CLFVBQVV4bUIsT0FBT1YsSUFBSXUzQyxFQUFFdjNDLEVBQUUsR0FBR2tuQixVQUFVbG5CLEdBQUcsT0FBT3dKLEVBQUVySixVQUFVNEQsR0FBRzIzRCxNQUFNNzhELEVBQUUwNEMsSUFBSyxTQUFTaFEsSUFBSXJtQyxLQUFLWixFQUFFWSxLQUFLWixFQUFFWSxLQUFLbEMsRUFBRWtDLEtBQUtsQyxFQUFHLElBQVMrdkUsRUFBRyxHQUFHeG5DLEVBQUVwbkMsVUFBVUcsR0FBRSxFQUFHaW5DLEVBQUVwbkMsVUFBVXF0RSxHQUFHLFdBQVcsSUFBSXRzRSxLQUFLWixJQUFJWSxLQUFLWixHQUFFLEVBQUdZLEtBQUs0ekMsSUFBSSxHQUFPLENBQUMsSUFBSXZyQyxFQUZsUixTQUFZQSxHQUFHLE9BQU90SyxPQUFPa0IsVUFBVUMsZUFBZTFCLEtBQUs2SyxFQUFFNmpFLElBQUs3akUsRUFBRTZqRSxLQUFNN2pFLEVBQUU2akUsS0FBTThCLEdBRWtNTSxDQUFHdHVFLGFBQWE2dEUsRUFBR3hsRSxLQUFNZytCLEVBQUVwbkMsVUFBVTIwQyxFQUFFLFdBQVcsR0FBRzV6QyxLQUFLbEMsRUFBRSxLQUFLa0MsS0FBS2xDLEVBQUUwQixRQUFRUSxLQUFLbEMsRUFBRTJpRSxPQUFQemdFLElBQW1CLE1BQU1vdUUsRUFBRy90RSxNQUFNcEIsVUFBVXFILFFBQVEsU0FBUytCLEVBQUVDLEdBQUcsT0FBT2pJLE1BQU1wQixVQUFVcUgsUUFBUTlJLEtBQUs2SyxFQUFFQyxPQUFFLElBQVMsU0FBU0QsRUFBRUMsR0FBRyxHQUFHLGlCQUFrQkQsRUFBRSxNQUFPLGlCQUFrQkMsR0FBRyxHQUFHQSxFQUFFOUksUUFBUSxFQUFFNkksRUFBRS9CLFFBQVFnQyxFQUFFLEdBQUcsSUFBSSxJQUFJNUssRUFBRSxFQUFFQSxFQUFFMkssRUFBRTdJLE9BQU85QixJQUFJLEdBQUdBLEtBQUsySyxHQUFHQSxFQUFFM0ssS0FBSzRLLEVBQUUsT0FBTzVLLEVBQUUsT0FBUSxHQUFHNHVFLEVBQUdqc0UsTUFBTXBCLFVBQVVrSyxRQUFRLFNBQVNkLEVBQUVDLEVBQUU1SyxHQUFHMkMsTUFBTXBCLFVBQVVrSyxRQUFRM0wsS0FBSzZLLEVBQUVDLEVBQUU1SyxJQUFLLFNBQVMySyxFQUFFQyxFQUFFNUssR0FBRyxNQUFNQyxFQUFFMEssRUFBRTdJLE9BQU9xRCxFQUFFLGlCQUFrQndGLEVBQUVBLEVBQUVrQixNQUFNLElBQUlsQixFQUFFLElBQUksSUFBSThqRSxFQUFFLEVBQUVBLEVBQUV4dUUsRUFBRXd1RSxJQUFJQSxLQUFLdHBFLEdBQUd5RixFQUFFOUssS0FBS0UsRUFBRW1GLEVBQUVzcEUsR0FBR0EsRUFBRTlqRSxJQUMxM0IsU0FBU3FvRSxFQUFHcm9FLEdBQUcsT0FBT2hJLE1BQU1wQixVQUFVa3VELE9BQU9xTixNQUFNLEdBQUd4MEMsV0FBVyxTQUFTNG1ELEVBQUd2a0UsR0FBRyxNQUFNQyxFQUFFRCxFQUFFN0ksT0FBTyxHQUFHLEVBQUU4SSxFQUFFLENBQUMsTUFBTTVLLEVBQUUyQyxNQUFNaUksR0FBRyxJQUFJLElBQUkzSyxFQUFFLEVBQUVBLEVBQUUySyxFQUFFM0ssSUFBSUQsRUFBRUMsR0FBRzBLLEVBQUUxSyxHQUFHLE9BQU9ELEVBQUUsTUFBTyxHQUFHLFNBQVM2dUUsRUFBR2xrRSxHQUFHLE1BQU8sY0FBYzdDLEtBQUs2QyxHQUFHLElBQTZNbXJDLEVBQXpNeTRCLEVBQUd0cUUsT0FBTzFDLFVBQVU0cEYsS0FBSyxTQUFTeGdGLEdBQUcsT0FBT0EsRUFBRXdnRixRQUFRLFNBQVN4Z0YsR0FBRyxNQUFPLGlDQUFpQ29hLEtBQUtwYSxHQUFHLElBQUksU0FBU3lnRixFQUFFemdGLEVBQUVDLEdBQUcsT0FBUSxHQUFHRCxFQUFFL0IsUUFBUWdDLEdBQUcsU0FBUzlCLEVBQUc2QixFQUFFQyxHQUFHLE9BQU9ELEVBQUVDLEdBQUcsRUFBRUQsRUFBRUMsRUFBRSxFQUFFLEVBQVFELEVBQUUsQ0FBQyxJQUFJMG1FLEVBQUd6eEUsRUFBRStILFVBQVUsR0FBRzBwRSxFQUFHLENBQUMsSUFBSWtELEVBQUdsRCxFQUFHcG9FLFVBQVUsR0FBR3NyRSxFQUFHLENBQUN6K0IsRUFBRXkrQixFQUFHLE1BQU01cEUsR0FBR21yQyxFQUFFLEdBQUksU0FBU3E1QixFQUFHeGtFLEVBQUVDLEVBQUU1SyxHQUFHLElBQUksTUFBTUMsS0FBSzBLLEVBQUVDLEVBQUU5SyxLQUFLRSxFQUFFMkssRUFBRTFLLEdBQUdBLEVBQUUwSyxHQUFJLFNBQVNrbUUsRUFBR2xtRSxHQUFHLE1BQU1DLEVBQUUsR0FBRyxJQUFJLE1BQU01SyxLQUFLMkssRUFBRUMsRUFBRTVLLEdBQUcySyxFQUFFM0ssR0FBRyxPQUFPNEssRUFBRSxJQUFJeXFFLEVBQUcsZ0dBQWdHeHBFLE1BQU0sS0FBSyxTQUFTbWxFLEVBQUdybUUsRUFBRUMsR0FBRyxJQUFJNUssRUFBRUMsRUFBRSxJQUFJLElBQUlrRixFQUFFLEVBQUVBLEVBQUVtakIsVUFBVXhtQixPQUFPcUQsSUFBSSxDQUFnQixJQUFJbkYsS0FBbkJDLEVBQUVxb0IsVUFBVW5qQixHQUFZbEYsRUFBRTBLLEVBQUUzSyxHQUFHQyxFQUFFRCxHQUFHLElBQUksSUFBSXl1RSxFQUFFLEVBQUVBLEVBQUU0RyxFQUFHdnpFLE9BQU8yc0UsSUFBSXp1RSxFQUFFcTFFLEVBQUc1RyxHQUFHcHVFLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS0csRUFBRUQsS0FBSzJLLEVBQUUzSyxHQUFHQyxFQUFFRCxLQUFNLFNBQVN3eEUsRUFBRzdtRSxHQUFjLE9BQVg2bUUsRUFBRyxLQUFLN21FLEdBQVVBLEVBQUU2bUUsRUFBRyxLQUFLaEMsRUFBMkYsSUFBcVNpQyxFQUNuL0M5bUUsRUFEa3RDMnFFLEVBQUc4VixFQUFFdDFDLEVBQUUsU0FBU2l4QixFQUFFcWtCLEVBQUV0MUMsRUFBRSxZQUFZczFDLEVBQUV0MUMsRUFBRSxRQUFRazZCLEVBQUdvYixFQUFFdDFDLEVBQUUsUUFBUXkvQixFQUFHdkYsR0FBSWpKLEVBQUVtTSxFQUFHa1ksRUFBRXQxQyxFQUFFLFlBQVlzMUMsRUFBRXQxQyxFQUFFL2dDLGNBQWMsWUFBWXEyRSxFQUFFdDFDLEVBQUUsWUFBWXMxQyxFQUFFdDFDLEVBQUUsWUFBWXMxQyxFQUFFdDFDLEVBQUUsV0FBV3MxQyxFQUFFdDFDLEVBQUUsUUFBUXU4QixFQUFHK1ksRUFBRXQxQyxFQUFFL2dDLGNBQWMsWUFBWXEyRSxFQUFFdDFDLEVBQUUsUUFBUSxTQUFTbThCLElBQUssSUFBSXRuRSxFQUFFL0ssRUFBRThsQixTQUFTLE9BQU8vYSxFQUFFQSxFQUFFbXNCLGtCQUFhLEVBQ3ZnRG5zQixFQUFFLENBQUMsSUFBSWtuRSxFQUFHLEdBQUdWLEdBQWtCeG1FLEVBQUVtckMsRUFBS285QixFQUFVLHFCQUFxQm51RCxLQUFLcGEsR0FBTXFsRSxFQUFVLGtCQUFrQmpyRCxLQUFLcGEsR0FBTW84RCxFQUFTLG1DQUFtQ2hpRCxLQUFLcGEsR0FBTTBuRSxFQUFVLGdCQUFnQnR0RCxLQUFLcGEsR0FBTTJxRSxFQUFVLHlCQUF5QnZ3RCxLQUFLcGEsUUFBM0MsR0FBc0UsR0FBckJ3bUUsSUFBS1UsRUFBR1YsRUFBR0EsRUFBRyxHQUFHLElBQU9wSyxFQUFFLENBQUMsSUFBSXFOLEVBQUduQyxJQUFLLEdBQUcsTUFBTW1DLEdBQUlBLEVBQUdpWCxXQUFXeFosR0FBSSxDQUFDSixFQUFHeHRFLE9BQU9td0UsR0FBSSxNQUFNenBFLEdBQUc4bUUsRUFBR0ksRUFBSSxJQUN5SFAsRUFEckgwRCxFQUFHLEdBQzdXLFNBQVM5RCxJQUFLLE9BRnVvQyxTQUFZdm1FLEdBQUcsSUFBSUMsRUFBRW9xRSxFQUFHLE9BQU8zMEUsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLOEssRUFBRSxHQUFHQSxFQUFFLEdBQUdBLEVBQUUsR0FBR0QsRUFBRSxHQUVydEM2ckUsRUFBRyxXQUFXLElBQUk3ckUsRUFBRSxFQUFFLE1BQU1DLEVBQUUyakUsRUFBR3RxRSxPQUFPd3RFLElBQUs1bEUsTUFBTSxLQUFLN0wsRUFBRXV1RSxFQUFHLEtBQUsxaUUsTUFBTSxLQUFLNUwsRUFBRWdTLEtBQUt5RixJQUFJOU0sRUFBRTlJLE9BQU85QixFQUFFOEIsUUFBUSxJQUFJLElBQUk2MkMsRUFBRSxFQUFFLEdBQUdodUMsR0FBR2d1QyxFQUFFMTRDLEVBQUUwNEMsSUFBSSxDQUFDLElBQUl4ekMsRUFBRXlGLEVBQUUrdEMsSUFBSSxHQUFHODFCLEVBQUV6dUUsRUFBRTI0QyxJQUFJLEdBQUcsRUFBRSxDQUFxRixHQUFwRnh6QyxFQUFFLGlCQUFpQjRmLEtBQUs1ZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSXNwRSxFQUFFLGlCQUFpQjFwRCxLQUFLMHBELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFPLEdBQUd0cEUsRUFBRSxHQUFHckQsUUFBUSxHQUFHMnNFLEVBQUUsR0FBRzNzRSxPQUFPLE1BQU02SSxFQUFFN0IsRUFBRyxHQUFHM0QsRUFBRSxHQUFHckQsT0FBTyxFQUFFd3BGLFNBQVNubUYsRUFBRSxHQUFHLElBQUksR0FBR3NwRSxFQUFFLEdBQUczc0UsT0FBTyxFQUFFd3BGLFNBQVM3YyxFQUFFLEdBQUcsTUFBTTNsRSxFQUFHLEdBQUczRCxFQUFFLEdBQUdyRCxPQUFPLEdBQUcyc0UsRUFBRSxHQUFHM3NFLFNBQVNnSCxFQUFHM0QsRUFBRSxHQUFHc3BFLEVBQUUsSUFBSXRwRSxFQUFFQSxFQUFFLEdBQUdzcEUsRUFBRUEsRUFBRSxTQUFVLEdBQUc5akUsR0FBRyxPQUFPLEdBQUdBLEtBQ3ZkLEdBQUcvSyxFQUFFOGxCLFVBQVVxaEQsRUFBRSxDQUFDLElBQUkrSixFQUFHbUIsSUFBS1gsRUFBR1IsSUFBTXdhLFNBQVM3WixFQUFHLFVBQUssUUFBYUgsT0FBRyxFQUFPLElBQUl5QixFQUFHekIsRUFBT2tCLEVBQUcsV0FBVyxJQUFJNXlFLEVBQUVrbkIsbUJBQW1Cem1CLE9BQU9DLGVBQWUsT0FBTyxFQUFHLElBQUlxSyxHQUFFLEVBQUdDLEVBQUV2SyxPQUFPQyxlQUFlLEdBQUcsVUFBVSxDQUFDRSxJQUFJLFdBQVdtSyxHQUFFLEtBQU8sSUFBSS9LLEVBQUVrbkIsaUJBQWlCLE9BQU8wb0QsRUFBRzVrRSxHQUFHaEwsRUFBRXczQixvQkFBb0IsT0FBT280QyxFQUFHNWtFLEdBQUksTUFBTTVLLElBQUksT0FBTzJLLEVBQXBPLEdBQXlPLFNBQVNzdEMsR0FBRXR0QyxFQUFFQyxHQUFHdEksS0FBS21GLEtBQUtrRCxFQUFFckksS0FBS3cyQyxFQUFFeDJDLEtBQUtpRCxPQUFPcUYsRUFBRXRJLEtBQUtpcEYsa0JBQWlCLEVBQXdELFNBQVM5VyxHQUFFOXBFLEVBQUVDLEdBQTZRLEdBQTFRcXRDLEdBQUVuNEMsS0FBS3dDLEtBQUtxSSxFQUFFQSxFQUFFbEQsS0FBSyxJQUFJbkYsS0FBS2twRixjQUFjbHBGLEtBQUt3MkMsRUFBRXgyQyxLQUFLaUQsT0FBTyxLQUFLakQsS0FBS21wRixPQUFPbnBGLEtBQUtvcEYsUUFBUXBwRixLQUFLcXBGLFFBQVFycEYsS0FBS3NwRixRQUFRdHBGLEtBQUt1cEYsUUFBUSxFQUFFdnBGLEtBQUtwQixJQUFJLEdBQUdvQixLQUFLd3BGLFFBQVF4cEYsS0FBS3lwRixTQUFTenBGLEtBQUswcEYsT0FBTzFwRixLQUFLMnBGLFNBQVEsRUFBRzNwRixLQUFLd29ELE1BQU0sS0FBS3hvRCxLQUFLNHBGLFVBQVUsRUFBRTVwRixLQUFLNnBGLFlBQVksR0FBRzdwRixLQUFLM0MsRUFBRSxLQUFRZ0wsRUFBRSxDQUFDLElBQUkzSyxFQUFFc0MsS0FBS21GLEtBQUtrRCxFQUFFbEQsS0FBS3hILEVBQUUwSyxFQUFFeWhGLGdCQUFnQnpoRixFQUFFeWhGLGVBQWV0cUYsT0FBTzZJLEVBQUV5aEYsZUFBZSxHQUFHLEtBQWlELEdBQTVDOXBGLEtBQUtpRCxPQUFPb0YsRUFBRXBGLFFBQVFvRixFQUFFMGhGLFdBQVcvcEYsS0FBS3cyQyxFQUFFbHVDLEVBQUtBLEVBQUVELEVBQUU2Z0YsZUFBZSxHQUFHdFksRUFBRyxDQUFDdm9FLEVBQUUsQ0FBQyxJQUFJNm1FLEVBQUc1bUUsRUFBRTBoRixVQUFVLElBQUlubkYsR0FBRSxFQUFHLE1BQU13RixFQUFFLE1BQU04akUsSUFBSXRwRSxHQUM5N0IsRUFBSUEsSUFBSXlGLEVBQUUsV0FBYSxhQUFhNUssRUFBRTRLLEVBQUVELEVBQUU0aEYsWUFBWSxZQUFZdnNGLElBQUk0SyxFQUFFRCxFQUFFNmhGLFdBQVdscUYsS0FBS2twRixjQUFjNWdGLEVBQUUzSyxHQUFHcUMsS0FBS3VwRixhQUFRLElBQVM1ckYsRUFBRTRyRixRQUFRNXJGLEVBQUU0ckYsUUFBUTVyRixFQUFFd3NGLE1BQU1ucUYsS0FBS3NwRixhQUFRLElBQVMzckYsRUFBRTJyRixRQUFRM3JGLEVBQUUyckYsUUFBUTNyRixFQUFFeXNGLE1BQU1wcUYsS0FBS3FwRixRQUFRMXJGLEVBQUUwckYsU0FBUyxFQUFFcnBGLEtBQUtvcEYsUUFBUXpyRixFQUFFeXJGLFNBQVMsSUFBSXBwRixLQUFLdXBGLGFBQVEsSUFBU2xoRixFQUFFa2hGLFFBQVFsaEYsRUFBRWtoRixRQUFRbGhGLEVBQUU4aEYsTUFBTW5xRixLQUFLc3BGLGFBQVEsSUFBU2poRixFQUFFaWhGLFFBQVFqaEYsRUFBRWloRixRQUFRamhGLEVBQUUraEYsTUFBTXBxRixLQUFLcXBGLFFBQVFoaEYsRUFBRWdoRixTQUFTLEVBQUVycEYsS0FBS29wRixRQUFRL2dGLEVBQUUrZ0YsU0FBUyxHQUFHcHBGLEtBQUttcEYsT0FBTzlnRixFQUFFOGdGLE9BQU9ucEYsS0FBS3BCLElBQUl5SixFQUFFekosS0FBSyxHQUFHb0IsS0FBSzJwRixRQUFRdGhGLEVBQUVzaEYsUUFBUTNwRixLQUFLMHBGLE9BQU9yaEYsRUFBRXFoRixPQUFPMXBGLEtBQUt5cEYsU0FDemZwaEYsRUFBRW9oRixTQUFTenBGLEtBQUt3cEYsUUFBUW5oRixFQUFFbWhGLFFBQVF4cEYsS0FBSzRwRixVQUFVdmhGLEVBQUV1aEYsV0FBVyxFQUFFNXBGLEtBQUs2cEYsWUFBWSxpQkFBa0J4aEYsRUFBRXdoRixZQUFZeGhGLEVBQUV3aEYsWUFBWTNYLEdBQUc3cEUsRUFBRXdoRixjQUFjLEdBQUc3cEYsS0FBS3dvRCxNQUFNbmdELEVBQUVtZ0QsTUFBTXhvRCxLQUFLM0MsRUFBRWdMLEVBQUVBLEVBQUU0Z0Ysa0JBQWtCOVcsR0FBRTU3QixFQUFFRixFQUFFNzRDLEtBQUt3QyxPQUZvTTIxQyxHQUFFMTJDLFVBQVVvM0MsRUFBRSxXQUFXcjJDLEtBQUtpcEYsa0JBQWlCLEdBRTNPMXFGLEVBQUU0ekUsR0FBRXg4QixJQUFHLElBQUl1OEIsR0FBRyxDQUFDbVksRUFBRSxRQUFRQyxFQUFFLE1BQU1DLEVBQUUsU0FBU3BZLEdBQUVsekUsVUFBVW8zQyxFQUFFLFdBQVc4N0IsR0FBRTU3QixFQUFFRixFQUFFNzRDLEtBQUt3QyxNQUFNLElBQUlxSSxFQUFFckksS0FBSzNDLEVBQUVnTCxFQUFFbWlGLGVBQWVuaUYsRUFBRW1pRixpQkFBaUJuaUYsRUFBRW9pRixhQUFZLEdBQUssSUFBSXYyQyxHQUFFLHVCQUF1QixJQUFJdmtDLEtBQUtzbkIsU0FBUyxHQUFPazhDLEdBQUcsRUFBRSxTQUFTRCxHQUFHN3FFLEVBQUVDLEVBQUU1SyxFQUFFQyxFQUFFa0YsR0FBRzdDLEtBQUt5MEIsU0FBU3BzQixFQUFFckksS0FBS2lLLE1BQU0sS0FBS2pLLEtBQUswcUYsSUFBSXBpRixFQUFFdEksS0FBS21GLEtBQUt6SCxFQUFFc0MsS0FBSzJxRixVQUFVaHRGLEVBQUVxQyxLQUFLd3NFLEdBQUczcEUsRUFBRTdDLEtBQUtwQixNQUFNdTBFLEdBQUduekUsS0FBSyt3RSxHQUFHL3dFLEtBQUtndUUsSUFBRyxFQUFJLFNBQVNvRixHQUFHL3FFLEdBQUdBLEVBQUUwb0UsSUFBRyxFQUFHMW9FLEVBQUVvc0IsU0FBUyxLQUFLcHNCLEVBQUU0QixNQUFNLEtBQUs1QixFQUFFcWlGLElBQUksS0FBS3JpRixFQUFFbWtFLEdBQUcsS0FBTSxTQUFTOEMsR0FBR2puRSxHQUFHckksS0FBSzBxRixJQUFJcmlGLEVBQUVySSxLQUFLdzJDLEVBQUUsR0FBR3gyQyxLQUFLcTJDLEVBQUUsRUFBMk0sU0FBU3UwQyxHQUFHdmlGLEVBQUVDLEdBQUcsSUFBSTVLLEVBQUU0SyxFQUFFbkQsS0FBSyxHQUFHekgsS0FBSzJLLEVBQUVtdUMsRUFBRSxDQUFDLElBQXVCMjFCLEVBQW5CeHVFLEVBQUUwSyxFQUFFbXVDLEVBQUU5NEMsR0FBR21GLEVBQUV1ckUsRUFBR3p3RSxFQUFFMkssSUFBTTZqRSxFQUFFLEdBQUd0cEUsSUFBSXhDLE1BQU1wQixVQUFVczJELE9BQU8vM0QsS0FBS0csRUFBRWtGLEVBQUUsR0FBR3NwRSxJQUFJaUgsR0FBRzlxRSxHQUFHLEdBQUdELEVBQUVtdUMsRUFBRTk0QyxHQUFHOEIsZ0JBQWdCNkksRUFBRW11QyxFQUFFOTRDLEdBQUcySyxFQUFFZ3VDLE9BQ3RoQyxTQUFTdzBDLEdBQUd4aUYsRUFBRUMsRUFBRTVLLEVBQUVDLEdBQUcsSUFBSSxJQUFJa0YsRUFBRSxFQUFFQSxFQUFFd0YsRUFBRTdJLFNBQVNxRCxFQUFFLENBQUMsSUFBSXNwRSxFQUFFOWpFLEVBQUV4RixHQUFHLElBQUlzcEUsRUFBRTRFLElBQUk1RSxFQUFFMTNDLFVBQVVuc0IsR0FBRzZqRSxFQUFFd2UsV0FBV2p0RixHQUFHeXVFLEVBQUVLLElBQUk3dUUsRUFBRSxPQUFPa0YsRUFBRSxPQUFRLEVBRGtqQnlzRSxHQUFHcndFLFVBQVVtbEIsSUFBSSxTQUFTL2IsRUFBRUMsRUFBRTVLLEVBQUVDLEVBQUVrRixHQUFHLElBQUlzcEUsRUFBRTlqRSxFQUFFM0MsWUFBVzJDLEVBQUVySSxLQUFLdzJDLEVBQUUyMUIsTUFBTzlqRSxFQUFFckksS0FBS3cyQyxFQUFFMjFCLEdBQUcsR0FBR25zRSxLQUFLcTJDLEtBQUssSUFBSUEsRUFBRXcwQyxHQUFHeGlGLEVBQUVDLEVBQUUzSyxFQUFFa0YsR0FBOEUsT0FBMUUsRUFBRXd6QyxHQUFHL3RDLEVBQUVELEVBQUVndUMsR0FBRzM0QyxJQUFJNEssRUFBRTBsRSxJQUFHLE1BQU0xbEUsRUFBRSxJQUFJNHFFLEdBQUc1cUUsRUFBRXRJLEtBQUswcUYsSUFBSXZlLElBQUl4dUUsRUFBRWtGLElBQUttckUsR0FBR3R3RSxFQUFFMkssRUFBRWpILEtBQUtrSCxJQUFXQSxHQUNydkIsSUFBSW9aLEdBQUcsZUFBZSxJQUFJL1IsS0FBS3NuQixTQUFTLEdBQUdtQixHQUFHLEdBQUcsU0FBUzB5RCxHQUFHemlGLEVBQUVDLEVBQUU1SyxFQUFFQyxFQUFFa0YsR0FBRyxHQUFHbEYsR0FBR0EsRUFBRW90RixLQUFLLE9BRXJJLFNBQVNDLEVBQUczaUYsRUFBRUMsRUFBRTVLLEVBQUVDLEVBQUVrRixHQUFHLEdBQUd4QyxNQUFNQyxRQUFRZ0ksR0FBRyxDQUFDLElBQUksSUFBSTZqRSxFQUFFLEVBQUVBLEVBQUU3akUsRUFBRTlJLE9BQU8yc0UsSUFBSTZlLEVBQUczaUYsRUFBRUMsRUFBRTZqRSxHQUFHenVFLEVBQUVDLEVBQUVrRixHQUFHLE9BQU8sS0FBYSxPQUFSbkYsRUFBRXV0RixHQUFHdnRGLEdBQVUySyxHQUFHQSxFQUFFNnJDLElBQUc3ckMsRUFBRTByQyxFQUFFenJDLEVBQUU1SyxFQUFFeUIsRUFBRXhCLEtBQUtBLEVBQUVndEYsVUFBVWh0RixFQUFFa0YsR0FBR3FvRixHQUFHN2lGLEVBQUVDLEVBQUU1SyxHQUFFLEVBQUdDLEVBQUVrRixHQUY3Qm1vRixDQUFHM2lGLEVBQUVDLEVBQUU1SyxFQUFFQyxFQUFFa0YsR0FBRyxHQUFHeEMsTUFBTUMsUUFBUWdJLEdBQUcsQ0FBQyxJQUFJLElBQUk2akUsRUFBRSxFQUFFQSxFQUFFN2pFLEVBQUU5SSxPQUFPMnNFLElBQUkyZSxHQUFHemlGLEVBQUVDLEVBQUU2akUsR0FBR3p1RSxFQUFFQyxFQUFFa0YsR0FBRyxPQUFPLEtBQWEsT0FBUm5GLEVBQUV1dEYsR0FBR3Z0RixHQUFVMkssR0FBR0EsRUFBRTZyQyxJQUFHN3JDLEVBQUVrckMsRUFBRWpyQyxFQUFFNUssRUFBRXlCLEVBQUV4QixLQUFLQSxFQUFFZ3RGLFVBQVVodEYsRUFBRWtGLEdBQUdxb0YsR0FBRzdpRixFQUFFQyxFQUFFNUssR0FBRSxFQUFHQyxFQUFFa0YsR0FDNVgsU0FBU3FvRixHQUFHN2lGLEVBQUVDLEVBQUU1SyxFQUFFQyxFQUFFa0YsRUFBRXNwRSxHQUFHLElBQUk3akUsRUFBRSxNQUFNL0gsTUFBTSxzQkFBc0IsSUFBSTgxQyxFQUFFbDNDLEVBQUUwRCxLQUFLQSxFQUFFOG5GLFVBQVU5bkYsRUFBRS9ELEVBQUVxc0YsR0FBRzlpRixHQUE2QyxHQUExQ3ZKLElBQUl1SixFQUFFcVosSUFBSTVpQixFQUFFLElBQUl3d0UsR0FBR2puRSxLQUFJM0ssRUFBRW9CLEVBQUVzbEIsSUFBSTliLEVBQUU1SyxFQUFFQyxFQUFFMDRDLEVBQUU4MUIsSUFBUWxpRSxNQUFNLE9BQU92TSxFQUF3QyxHQUF0Q0MsRUFDbEssV0FBOEQsSUFBSTJLLEVBQUU4aUYsR0FBRyxPQUF6RCxTQUFTL2lGLEVBQUUzSyxHQUFHLE9BQU80SyxFQUFFOUssS0FBSzZLLEVBQUVxaUYsSUFBSXJpRixFQUFFb3NCLFNBQVMvMkIsSUFEeUcydEYsR0FBSzN0RixFQUFFdU0sTUFBTXRNLEVBQUVBLEVBQUUrc0YsSUFBSXJpRixFQUFFMUssRUFBRTgyQixTQUFTLzJCLEVBQUsySyxFQUFFbWMsaUJBQWlCMHJELElBQUtydEUsRUFBRXd6QyxRQUFHLElBQVN4ekMsSUFBSUEsR0FBRSxHQUFJd0YsRUFBRW1jLGlCQUFpQmxjLEVBQUU1QyxXQUFXL0gsRUFBRWtGLFFBQVEsR0FBR3dGLEVBQUVpakYsWUFBWWpqRixFQUFFaWpGLFlBQVlDLEdBQUdqakYsRUFBRTVDLFlBQVkvSCxPQUFRLEtBQUcwSyxFQUFFbWpGLGNBQWFuakYsRUFBRW9qRixlQUFxQyxNQUFNbHJGLE1BQU0scURBQWxDOEgsRUFBRW1qRixZQUFZN3RGLEdBQXlFLE9BQU9ELEVBRzlkLFNBQVNndUYsR0FBR3JqRixHQUFHLEdBQUcsaUJBQWtCQSxHQUFHQSxJQUFJQSxFQUFFMG9FLEdBQUcsQ0FBQyxJQUFJem9FLEVBQUVELEVBQUVxaUYsSUFBSSxHQUFHcGlGLEdBQUdBLEVBQUU0ckMsSUFBRzAyQyxHQUFHdGlGLEVBQUVqTCxFQUFFZ0wsT0FBUSxDQUFDLElBQUkzSyxFQUFFMkssRUFBRWxELEtBQUt4SCxFQUFFMEssRUFBRTRCLE1BQU0zQixFQUFFd3NCLG9CQUFvQnhzQixFQUFFd3NCLG9CQUFvQnAzQixFQUFFQyxFQUFFMEssRUFBRXNpRixTQUFTcmlGLEVBQUVxakYsWUFBWXJqRixFQUFFcWpGLFlBQVlKLEdBQUc3dEYsR0FBR0MsR0FBRzJLLEVBQUVrakYsYUFBYWxqRixFQUFFbWpGLGdCQUFnQm5qRixFQUFFbWpGLGVBQWU5dEYsSUFBSUQsRUFBRXl0RixHQUFHN2lGLEtBQUtzaUYsR0FBR2x0RixFQUFFMkssR0FBRyxHQUFHM0ssRUFBRTI0QyxJQUFJMzRDLEVBQUVndEYsSUFBSSxLQUFLcGlGLEVBQUVvWixJQUFJLE9BQU8weEQsR0FBRy9xRSxLQUFNLFNBQVNrakYsR0FBR2xqRixHQUFHLE9BQU9BLEtBQUsrdkIsR0FBR0EsR0FBRy92QixHQUFHK3ZCLEdBQUcvdkIsR0FBRyxLQUFLQSxFQUFFLFNBQVMraUYsR0FBRy9pRixFQUFFQyxHQUFHLEdBQUdELEVBQUUwb0UsR0FBRzFvRSxHQUFFLE1BQVEsQ0FBQ0MsRUFBRSxJQUFJNnBFLEdBQUU3cEUsRUFBRXRJLE1BQU0sSUFBSXRDLEVBQUUySyxFQUFFb3NCLFNBQVM5MkIsRUFBRTBLLEVBQUVta0UsSUFBSW5rRSxFQUFFcWlGLElBQUlyaUYsRUFBRTJsRSxJQUFJMGQsR0FBR3JqRixHQUFHQSxFQUFFM0ssRUFBRUYsS0FBS0csRUFBRTJLLEdBQUksT0FBT0QsRUFDdmUsU0FBUzhpRixHQUFHOWlGLEdBQVcsT0FBUkEsRUFBRUEsRUFBRXFaLGVBQXdCNHRELEdBQUdqbkUsRUFBRSxLQUFLLElBQUl1akYsR0FBRyx3QkFBd0IsSUFBSWo4RSxLQUFLc25CLFdBQVcsR0FBRyxTQUFTZzBELEdBQUc1aUYsR0FBRyxNQUFHLG1CQUFvQkEsRUFBU0EsR0FBRUEsRUFBRXVqRixNQUFNdmpGLEVBQUV1akYsSUFBSSxTQUFTdGpGLEdBQUcsT0FBT0QsRUFBRXF0QixZQUFZcHRCLEtBQVlELEVBQUV1akYsS0FBSSxTQUFTdDRDLEtBQUlqTixFQUFFN29DLEtBQUt3QyxNQUFNQSxLQUFLM0MsRUFBRSxJQUFJaXlFLEdBQUd0dkUsTUFBTUEsS0FBS2kvQyxFQUFFai9DLEtBQUtBLEtBQUtxM0MsRUFBRSxLQUM5UixTQUFTckUsR0FBRTNxQyxFQUFFQyxHQUFHLElBQUk1SyxFQUFFQyxFQUFFMEssRUFBRWd2QyxFQUFFLEdBQUcxNUMsRUFBRSxJQUFJRCxFQUFFLEdBQUdDLEVBQUVBLEVBQUVBLEVBQUUwNUMsRUFBRTM1QyxFQUFFMEQsS0FBS3pELEdBQXFCLEdBQWxCMEssRUFBRUEsRUFBRTQyQyxFQUFFdGhELEVBQUUySyxFQUFFbkQsTUFBTW1ELEVBQUssaUJBQWtCQSxFQUFFQSxFQUFFLElBQUlxdEMsR0FBRXJ0QyxFQUFFRCxRQUFRLEdBQUdDLGFBQWFxdEMsR0FBRXJ0QyxFQUFFckYsT0FBT3FGLEVBQUVyRixRQUFRb0YsTUFBTyxDQUFDLElBQUl4RixFQUFFeUYsRUFBZW9tRSxFQUFicG1FLEVBQUUsSUFBSXF0QyxHQUFFaDRDLEVBQUUwSyxHQUFReEYsR0FBUyxHQUFMQSxHQUFFLEVBQU1uRixFQUFFLElBQUksSUFBSXl1RSxFQUFFenVFLEVBQUU4QixPQUFPLEVBQUUsR0FBRzJzRSxFQUFFQSxJQUFJLENBQUMsSUFBSTkxQixFQUFFL3RDLEVBQUVrdUMsRUFBRTk0QyxFQUFFeXVFLEdBQUd0cEUsRUFBRWdwRixHQUFHeDFDLEVBQUUxNEMsR0FBRSxFQUFHMkssSUFBSXpGLEVBQStDLEdBQXBDQSxFQUFFZ3BGLEdBQVZ4MUMsRUFBRS90QyxFQUFFa3VDLEVBQUVudUMsRUFBUzFLLEdBQUUsRUFBRzJLLElBQUl6RixFQUFFQSxFQUFFZ3BGLEdBQUd4MUMsRUFBRTE0QyxHQUFFLEVBQUcySyxJQUFJekYsRUFBS25GLEVBQUUsSUFBSXl1RSxFQUFFLEVBQUVBLEVBQUV6dUUsRUFBRThCLE9BQU8yc0UsSUFBZXRwRSxFQUFFZ3BGLEdBQWJ4MUMsRUFBRS90QyxFQUFFa3VDLEVBQUU5NEMsRUFBRXl1RSxHQUFVeHVFLEdBQUUsRUFBRzJLLElBQUl6RixFQUVoWCxTQUFTZ3BGLEdBQUd4akYsRUFBRUMsRUFBRTVLLEVBQUVDLEdBQXNCLEtBQW5CMkssRUFBRUQsRUFBRWhMLEVBQUVtNUMsRUFBRTcwQyxPQUFPMkcsS0FBVSxPQUFPLEVBQUdBLEVBQUVBLEVBQUU2a0QsU0FBUyxJQUFJLElBQUl0cUQsR0FBRSxFQUFHc3BFLEVBQUUsRUFBRUEsRUFBRTdqRSxFQUFFOUksU0FBUzJzRSxFQUFFLENBQUMsSUFBSTkxQixFQUFFL3RDLEVBQUU2akUsR0FBRyxHQUFHOTFCLElBQUlBLEVBQUUwNkIsSUFBSTE2QixFQUFFczBDLFNBQVNqdEYsRUFBRSxDQUFDLElBQUlvQixFQUFFdTNDLEVBQUU1aEIsU0FBUzN5QixFQUFFdTBDLEVBQUVtMkIsSUFBSW4yQixFQUFFcTBDLElBQUlyMEMsRUFBRTIzQixJQUFJNGMsR0FBR3ZpRixFQUFFaEwsRUFBRWc1QyxHQUFHeHpDLEdBQUUsSUFBSy9ELEVBQUV0QixLQUFLc0UsRUFBRW5FLElBQUlrRixHQUFJLE9BQU9BLElBQUlsRixFQUFFc3JGLGlCQUhvRTFxRixFQUFFKzBDLEdBQUVqTixHQUFHaU4sR0FBRXIwQyxVQUFVaTFDLEtBQUcsRUFBR1osR0FBRXIwQyxVQUFVNjFCLG9CQUFvQixTQUFTenNCLEVBQUVDLEVBQUU1SyxFQUFFQyxJQUY1VyxTQUFTbXVGLEVBQUd6akYsRUFBRUMsRUFBRTVLLEVBQUVDLEVBQUVrRixHQUFHLEdBQUd4QyxNQUFNQyxRQUFRZ0ksR0FBRyxJQUFJLElBQUk2akUsRUFBRSxFQUFFQSxFQUFFN2pFLEVBQUU5SSxPQUFPMnNFLElBQUkyZixFQUFHempGLEVBQUVDLEVBQUU2akUsR0FBR3p1RSxFQUFFQyxFQUFFa0YsUUFBU2xGLEVBQUV3QixFQUFFeEIsS0FBS0EsRUFBRWd0RixVQUFVaHRGLEVBQUVELEVBQUV1dEYsR0FBR3Z0RixHQUFHMkssR0FBR0EsRUFBRTZyQyxLQUFLN3JDLEVBQUVBLEVBQUVoTCxHQUFFaUwsRUFBRTNHLE9BQU8yRyxHQUFHNUMsY0FBZ0IyQyxFQUFFbXVDLEtBQTRCLEdBQWY5NEMsRUFBRW10RixHQUFYMWUsRUFBRTlqRSxFQUFFbXVDLEVBQUVsdUMsR0FBVTVLLEVBQUVDLEVBQUVrRixNQUFVdXdFLEdBQUdqSCxFQUFFenVFLElBQUkyQyxNQUFNcEIsVUFBVXMyRCxPQUFPLzNELEtBQUsydUUsRUFBRXp1RSxFQUFFLEdBQUcsR0FBR3l1RSxFQUFFM3NFLGdCQUFnQjZJLEVBQUVtdUMsRUFBRWx1QyxHQUFHRCxFQUFFZ3VDLFFBQVFodUMsSUFBSUEsRUFBRThpRixHQUFHOWlGLE1BQU1DLEVBQUVELEVBQUVtdUMsRUFBRWx1QyxFQUFFNUMsWUFBWTJDLEdBQUcsRUFBRUMsSUFBSUQsRUFBRXdpRixHQUFHdmlGLEVBQUU1SyxFQUFFQyxFQUFFa0YsS0FBS25GLEdBQUcsRUFBRTJLLEVBQUVDLEVBQUVELEdBQUcsT0FBT3FqRixHQUFHaHVGLElBRURvdUYsQ0FBRzlyRixLQUFLcUksRUFBRUMsRUFBRTVLLEVBQUVDLElBRTdYMjFDLEdBQUVyMEMsVUFBVTIwQyxFQUFFLFdBQTRCLEdBQWpCTixHQUFFaUQsRUFBRTNDLEVBQUVwMkMsS0FBS3dDLE1BQVNBLEtBQUszQyxFQUFFLENBQUMsSUFBYUssRUFBVDJLLEVBQUVySSxLQUFLM0MsRUFBSSxJQUFJSyxLQUFLMkssRUFBRW11QyxFQUFFLENBQUMsSUFBSSxJQUFJNzRDLEVBQUUwSyxFQUFFbXVDLEVBQUU5NEMsR0FBR21GLEVBQUUsRUFBRUEsRUFBRWxGLEVBQUU2QixPQUFPcUQsSUFBSXV3RSxHQUFHejFFLEVBQUVrRixXQUFXd0YsRUFBRW11QyxFQUFFOTRDLEdBQUcySyxFQUFFZ3VDLEtBQU1yMkMsS0FBS3EzQyxFQUFFLE1BQU8vRCxHQUFFcjBDLFVBQVVzMEMsRUFBRSxTQUFTbHJDLEVBQUVDLEVBQUU1SyxFQUFFQyxHQUFHLE9BQU9xQyxLQUFLM0MsRUFBRSttQixJQUFJemlCLE9BQU8wRyxHQUFHQyxHQUFFLEVBQUc1SyxFQUFFQyxJQUFJMjFDLEdBQUVyMEMsVUFBVTgwQyxFQUFFLFNBQVMxckMsRUFBRUMsRUFBRTVLLEVBQUVDLEdBQUcsT0FBT3FDLEtBQUszQyxFQUFFK21CLElBQUl6aUIsT0FBTzBHLEdBQUdDLEdBQUUsRUFBRzVLLEVBQUVDLElBQzVELElBQUlvdUYsR0FBR3p1RixFQUFFMEgsS0FBS0MsVUFBVSxTQUFTK21GLEtBQUssSUFBSTNqRixFQUFFNGpGLEdBQUcsSUFBSTNqRixFQUFFLEtBQTJELE9BQXRERCxFQUFFbXVDLElBQUlsdUMsRUFBRUQsRUFBRW11QyxFQUFFbnVDLEVBQUVtdUMsRUFBRW51QyxFQUFFbXVDLEVBQUU1ckMsS0FBS3ZDLEVBQUVtdUMsSUFBSW51QyxFQUFFZ3VDLEVBQUUsTUFBTS90QyxFQUFFc0MsS0FBSyxNQUFhdEMsRUFBMkgsSUFDalA0akYsR0FEcVBDLEdBQUcsSUFBSSxNQUFNLFlBQVk5akYsRUFBRUMsR0FBR3RJLEtBQUszQyxFQUFFZ0wsRUFBRXJJLEtBQUtzMUMsRUFBRWh0QyxFQUFFdEksS0FBS3EyQyxFQUFFLEVBQUVyMkMsS0FBS3cyQyxFQUFFLEtBQU0sTUFBTSxJQUFJbnVDLEVBQW9FLE9BQWxFLEVBQUVySSxLQUFLcTJDLEdBQUdyMkMsS0FBS3EyQyxJQUFJaHVDLEVBQUVySSxLQUFLdzJDLEVBQUV4MkMsS0FBS3cyQyxFQUFFbnVDLEVBQUV1QyxLQUFLdkMsRUFBRXVDLEtBQUssTUFBTXZDLEVBQUVySSxLQUFLM0MsSUFBV2dMLElBQUksSUFBSSxJQUFJK2pGLEdBQUcvakYsR0FBR0EsRUFBRXUyQixTQUN0cEIsTUFBTXd0RCxHQUFHLGNBQWNwc0YsS0FBSzRLLEtBQUs1SyxLQUFLdzJDLEVBQUV4MkMsS0FBS3EyQyxFQUFFLEtBQU0sSUFBSWh1QyxFQUFFQyxHQUFHdEksS0FBS3EyQyxFQUFFaHVDLEVBQUVySSxLQUFLdzJDLEVBQUVsdUMsRUFBRXRJLEtBQUs0SyxLQUFLLEtBQU0sUUFBUTVLLEtBQUs0SyxLQUFLNUssS0FBS3cyQyxFQUFFeDJDLEtBQUtxMkMsRUFBRSxNQUFPLFNBQVNnMkMsR0FBR2hrRixHQUFHL0ssRUFBRTJWLFdBQVcsS0FBSyxNQUFNNUssR0FBSSxHQUFJLFNBQVNpa0YsR0FBR2prRixFQUFFQyxHQUFHNGpGLElBQThDLFdBQWMsSUFBSTdqRixFQUFFL0ssRUFBRXNHLFFBQVFGLGFBQVEsR0FBUXdvRixHQUFHLFdBQVc3akYsRUFBRW9DLEtBQUs4aEYsS0FBN0dDLEdBQUtDLEtBQUtQLEtBQUtPLElBQUcsR0FBSVIsR0FBRzduRSxJQUFJL2IsRUFBRUMsR0FBcUYsSUFBSW1rRixJQUFHLEVBQUdSLEdBQUcsSUFEOEIsTUFBUyxjQUFjanNGLEtBQUtxMkMsRUFBRXIyQyxLQUFLdzJDLEVBQUUsS0FBTSxJQUFJbnVDLEVBQUVDLEdBQUcsTUFBTTVLLEVBQUV5dUYsR0FBR2p1RixNQUFNUixFQUFFcVIsSUFBSTFHLEVBQUVDLEdBQUd0SSxLQUFLcTJDLEVBQUVyMkMsS0FBS3EyQyxFQUFFenJDLEtBQUtsTixFQUFFc0MsS0FBS3cyQyxFQUFFOTRDLEVBQUVzQyxLQUFLcTJDLEVBQUUzNEMsSUFDNUksU0FBUzZ1RixLQUFLLElBQUksSUFBSWxrRixFQUFFQSxFQUFFMmpGLE1BQU0sQ0FBQyxJQUFJM2pGLEVBQUVndUMsRUFBRTc0QyxLQUFLNkssRUFBRW11QyxHQUFJLE1BQU05NEMsR0FBRzJ1RixHQUFHM3VGLEdBQUksSUFBSTRLLEVBQUU2akYsR0FBRzdqRixFQUFFZ3RDLEVBQUVqdEMsR0FBRyxJQUFJQyxFQUFFK3RDLElBQUkvdEMsRUFBRSt0QyxJQUFJaHVDLEVBQUV1QyxLQUFLdEMsRUFBRWt1QyxFQUFFbHVDLEVBQUVrdUMsRUFBRW51QyxHQUFJb2tGLElBQUcsRUFBSSxTQUFTQyxHQUFHcmtGLEVBQUVDLEdBQUdnckMsR0FBRTkxQyxLQUFLd0MsTUFBTUEsS0FBS3EyQyxFQUFFaHVDLEdBQUcsRUFBRXJJLEtBQUt3MkMsRUFBRWx1QyxHQUFHaEwsRUFBRTBDLEtBQUtzMUMsRUFBRWxCLEVBQUVwMEMsS0FBS3FyRixHQUFHcnJGLE1BQU1BLEtBQUsxQyxFQUFFOEYsS0FBSytSLE1BQzFpQixTQUFTdzNFLEdBQUd0a0YsR0FBR0EsRUFBRWltRSxJQUFHLEVBQUdqbUUsRUFBRTBxQyxJQUFJMXFDLEVBQUVtdUMsRUFBRXRqQyxhQUFhN0ssRUFBRTBxQyxHQUFHMXFDLEVBQUUwcUMsRUFBRSxNQUFpRSxTQUFTNjVDLEdBQUd2a0YsRUFBRUMsRUFBRTVLLEdBQUcsR0FBRyxtQkFBb0IySyxFQUFFM0ssSUFBSTJLLEVBQUUrckMsRUFBRS9yQyxFQUFFM0ssUUFBUyxLQUFHMkssR0FBRyxtQkFBbUJBLEVBQUVxdEIsWUFBc0MsTUFBTW4xQixNQUFNLDZCQUF0QzhILEVBQUUrckMsRUFBRS9yQyxFQUFFcXRCLFlBQVlydEIsR0FBaUQsT0FBTyxXQUFXcUwsT0FBT3BMLElBQUksRUFBRWhMLEVBQUUyVixXQUFXNUssRUFBRUMsR0FBRyxHQUQrTi9KLEVBQUVtdUYsR0FBR3A1QyxLQUFHNXFDLEVBQUVna0YsR0FBR3p0RixXQUFZcXZFLElBQUcsRUFBRzVsRSxFQUFFcXFDLEVBQUUsS0FBS3JxQyxFQUFFMmlGLEdBQUcsV0FBVyxHQUFHcnJGLEtBQUtzdUUsR0FBRyxDQUFDLElBQUlqbUUsRUFBRWpGLEtBQUsrUixNQUFNblYsS0FBSzFDLEVBQUUsRUFBRStLLEdBQUdBLEVBQUUsR0FBR3JJLEtBQUtxMkMsRUFBRXIyQyxLQUFLK3lDLEVBQUUveUMsS0FBS3cyQyxFQUFFdmpDLFdBQVdqVCxLQUFLczFDLEVBQUV0MUMsS0FBS3EyQyxFQUFFaHVDLElBQUlySSxLQUFLK3lDLElBQUkveUMsS0FBS3cyQyxFQUFFdGpDLGFBQWFsVCxLQUFLK3lDLEdBQUcveUMsS0FBSyt5QyxFQUFFLE1BQU1DLEdBQUVoekMsS0FBSyxRQUFRQSxLQUFLc3VFLEtBQUtxZSxHQUFHM3NGLE1BQU1BLEtBQUswM0IsWUFBYWh2QixFQUFFZ3ZCLE1BQU0sV0FBVzEzQixLQUFLc3VFLElBQUcsRUFBR3R1RSxLQUFLK3lDLElBQUkveUMsS0FBSyt5QyxFQUFFL3lDLEtBQUt3MkMsRUFBRXZqQyxXQUFXalQsS0FBS3MxQyxFQUFFdDFDLEtBQUtxMkMsR0FBR3IyQyxLQUFLMUMsRUFBRThGLEtBQUsrUixRQUM1MEJ6TSxFQUFFa3JDLEVBQUUsV0FBVzg0QyxHQUFHbjJDLEVBQUUzQyxFQUFFcDJDLEtBQUt3QyxNQUFNMnNGLEdBQUczc0YsYUFBYUEsS0FBS3cyQyxHQUF3VSxNQUFNcTJDLFdBQVd4bUQsRUFBRSxZQUFZaCtCLEVBQUVDLEdBQUduQixRQUFRbkgsS0FBS3ZDLEVBQUU0SyxFQUFFckksS0FBS3MxQyxFQUFFaHRDLEVBQUV0SSxLQUFLcTJDLEVBQUUsS0FBS3IyQyxLQUFLM0MsR0FBRSxFQUFHMkMsS0FBS3cyQyxFQUFFLEtBQU0sRUFBRW51QyxHQUFHckksS0FBS3EyQyxFQUFFcndCLFVBQVVobUIsS0FBS3cyQyxFQUFFeDJDLEtBQUszQyxHQUFFLEVBQTVPLFNBQVN5dkYsRUFBR3prRixHQUFHQSxFQUFFbXVDLEVBQUVvMkMsR0FBRyxLQUFLdmtGLEVBQUVtdUMsRUFBRSxLQUFLbnVDLEVBQUVoTCxJQUFJZ0wsRUFBRWhMLEdBQUUsRUFBR3l2RixFQUFHemtGLEtBQU1BLEVBQUVpdEMsR0FBRyxNQUFNaHRDLEVBQUVELEVBQUVndUMsRUFBRWh1QyxFQUFFZ3VDLEVBQUUsS0FBS2h1QyxFQUFFNUssRUFBRSs4RCxNQUFNLEtBQUtseUQsR0FBNEl3a0YsQ0FBRzlzRixNQUFPLElBQUltSCxNQUFNeXNDLElBQUk1ekMsS0FBS3cyQyxJQUFJbDVDLEVBQUU0VixhQUFhbFQsS0FBS3cyQyxHQUFHeDJDLEtBQUt3MkMsRUFBRSxLQUFLeDJDLEtBQUszQyxHQUFFLEVBQUcyQyxLQUFLcTJDLEVBQUUsT0FBUSxTQUFTMDJDLEdBQUUxa0YsR0FBR2crQixFQUFFN29DLEtBQUt3QyxNQUFNQSxLQUFLcTJDLEVBQUVodUMsRUFBRXJJLEtBQUt3MkMsRUFBRSxHQUFJajRDLEVBQUV3dUYsR0FBRTFtRCxHQUFHLElBQUkybUQsR0FBRyxHQUFHLFNBQVNDLEdBQUc1a0YsRUFBRUMsRUFBRTVLLEVBQUVDLEdBQUcwQyxNQUFNQyxRQUFRNUMsS0FBS0EsSUFBSXN2RixHQUFHLEdBQUd0dkYsRUFBRWdJLFlBQVloSSxFQUFFc3ZGLElBQUksSUFBSSxJQUFJbnFGLEVBQUUsRUFBRUEsRUFBRW5GLEVBQUU4QixPQUFPcUQsSUFBSSxDQUFDLElBQUlzcEUsRUFBRTJlLEdBQUd4aUYsRUFBRTVLLEVBQUVtRixHQUFHbEYsR0FBRzBLLEVBQUVxdEIsYUFBWSxFQUFHcnRCLEVBQUVndUMsR0FBR2h1QyxHQUFHLElBQUk4akUsRUFBRSxNQUFNOWpFLEVBQUVtdUMsRUFBRTIxQixFQUFFdnRFLEtBQUt1dEUsR0FBSSxTQUFTK2dCLEdBQUc3a0YsR0FBR3drRSxFQUFHeGtFLEVBQUVtdUMsR0FBRSxTQUFTbHVDLEVBQUU1SyxHQUFHc0MsS0FBS3cyQyxFQUFFdDNDLGVBQWV4QixJQUFJZ3VGLEdBQUdwakYsS0FBS0QsR0FBR0EsRUFBRW11QyxFQUFFLEdBQXNKLFNBQVMyMkMsS0FBS250RixLQUFLdzJDLEdBQUUsRUFDM2dDLFNBQVMxQyxHQUFFenJDLEVBQUVDLEVBQUU1SyxFQUFFQyxHQUFHMEssRUFBRWljLE1BQUssV0FBVyxNQUFPLGlCQUFpQmhjLEVBQUUsTUFDdkwsU0FBWUQsRUFBRUMsR0FBRyxJQUFJRCxFQUFFbXVDLEVBQUUsT0FBT2x1QyxFQUFFLElBQUlBLEVBQUUsT0FBTyxLQUFLLElBQUksSUFBSTVLLEVBQUVzSCxLQUFLbVAsTUFBTTdMLEdBQUcsR0FBRzVLLEVBQUUsSUFBSTJLLEVBQUUsRUFBRUEsRUFBRTNLLEVBQUU4QixPQUFPNkksSUFBSSxHQUFHaEksTUFBTUMsUUFBUTVDLEVBQUUySyxJQUFJLENBQUMsSUFBSTFLLEVBQUVELEVBQUUySyxHQUFHLEtBQUssRUFBRTFLLEVBQUU2QixRQUFRLENBQUMsSUFBSXFELEVBQUVsRixFQUFFLEdBQUcsR0FBRzBDLE1BQU1DLFFBQVF1QyxNQUFNLEVBQUVBLEVBQUVyRCxRQUFRLENBQUMsSUFBSTJzRSxFQUFFdHBFLEVBQUUsR0FBRyxHQUFHLFFBQVFzcEUsR0FBRyxRQUFRQSxHQUFHLFNBQVNBLEVBQUUsSUFBSSxJQUFJOTFCLEVBQUUsRUFBRUEsRUFBRXh6QyxFQUFFckQsT0FBTzYyQyxJQUFJeHpDLEVBQUV3ekMsR0FBRyxLQUFNLE9BQU8wMUMsR0FBR3J1RixHQUFHLE1BQU1vQixHQUFHLE9BQU93SixHQURqSThrRixDQUFHL2tGLEVBQUUzSyxJQUFJQyxFQUFFLElBQUlBLEVBQUUsT0FENndCb3ZGLEdBQUU5dEYsVUFBVTIwQyxFQUFFLFdBQVdtNUMsR0FBRXgyQyxFQUFFM0MsRUFBRXAyQyxLQUFLd0MsTUFBTWt0RixHQUFHbHRGLE9BQVErc0YsR0FBRTl0RixVQUFVeTJCLFlBQVksV0FBVyxNQUFNbjFCLE1BQU0sNkNBQXVFNHNGLEdBQUdsdUYsVUFBVXl2RSxHQUFHLFdBQVcxdUUsS0FBS3cyQyxHQUFFLEdBQ3g1QjIyQyxHQUFHbHVGLFVBQVVxbEIsS0FBSyxhQUMrQixJQUFJOGlCLEdBQUUsR0FBR2ltRCxHQUFHLEtBQUssU0FBU0MsS0FBSyxPQUFPRCxHQUFHQSxJQUFJLElBQUkvNUMsR0FBNEIsU0FBU2k2QyxHQUFHbGxGLEdBQUdzdEMsR0FBRW40QyxLQUFLd0MsS0FBS29uQyxHQUFFdW9DLEdBQUd0bkUsR0FBWSxTQUFTZ3ZDLEdBQUVodkMsR0FBRyxNQUFNQyxFQUFFZ2xGLEtBQUt0NkMsR0FBRTFxQyxFQUFFLElBQUlpbEYsR0FBR2psRixFQUFFRCxJQUE4QixTQUFTbWxGLEdBQUdubEYsRUFBRUMsR0FBR3F0QyxHQUFFbjRDLEtBQUt3QyxLQUFLb25DLEdBQUUyOUIsV0FBVzE4RCxHQUFHckksS0FBS2dsRSxLQUFLMThELEVBQVcsU0FBUzR0QyxHQUFFN3RDLEdBQUcsTUFBTUMsRUFBRWdsRixLQUFLdDZDLEdBQUUxcUMsRUFBRSxJQUFJa2xGLEdBQUdsbEYsRUFBRUQsSUFBd0IsU0FBU3VnRixHQUFHdmdGLEVBQUVDLEdBQUdxdEMsR0FBRW40QyxLQUFLd0MsS0FBS29uQyxHQUFFK25DLEdBQUc5bUUsR0FBR3JJLEtBQUtrMUIsS0FBSzVzQixFQUNqckIsU0FBUytyQyxHQUFFaHNDLEVBQUVDLEdBQUcsR0FBRyxtQkFBb0JELEVBQUUsTUFBTTlILE1BQU0sOENBQThDLE9BQU9qRCxFQUFFMlYsWUFBVyxXQUFXNUssTUFBTUMsR0FENE84K0IsR0FBRXVvQyxHQUFHLHFCQUF5RHB4RSxFQUFFZ3ZGLEdBQUc1M0MsSUFBZ0R2TyxHQUFFMjlCLFdBQVcsWUFBc0V4bUUsRUFBRWl2RixHQUFHNzNDLElBQWdEdk8sR0FBRStuQyxHQUFHLGNBQWdFNXdFLEVBQUVxcUYsR0FBR2p6QyxJQUM5aUIsSUFBSTgzQyxHQUFHLENBQUNqcUIsU0FBUyxFQUFFK25CLEdBQUcsRUFBRWMsR0FBRyxFQUFFcUIsR0FBRyxFQUFFMUIsR0FBRyxFQUFFSSxHQUFHLEVBQUVFLEdBQUcsRUFBRXJaLEdBQUcsRUFBRXZQLFFBQVEsRUFBRStvQixHQUFHLEdBQU9rQixHQUFHLENBQUM5QixHQUFHLFdBQVdzQixHQUFHLFVBQVV2YyxHQUFHLFFBQVFxQyxHQUFHLFFBQVF5WixHQUFHLFFBQVFDLEdBQUcsbUJBQW1CanBCLFFBQVEsVUFBVXdvQixHQUFHLGtCQUFrQkssR0FBRyxXQUFXTixHQUFHLG1CQUFtQnVCLEdBQUcsa0JBQWtCLFNBQVNJLE1BQTBCLFNBQVNDLEdBQUd4bEYsR0FBRyxPQUFPQSxFQUFFZ3VDLElBQUlodUMsRUFBRWd1QyxFQUFFaHVDLEVBQUVoTCxLQUFLLFNBQVN5d0YsTUFBcEVGLEdBQUczdUYsVUFBVW8zQyxFQUFFLEtBQTJELElBQTBIOHFDLEdBQXRINzVDLEdBQUUsQ0FBQ3M5QixLQUFLLElBQUlnbkIsR0FBRyxJQUFJaGIsR0FBRyxJQUFJNGIsR0FBRyxLQUFLLFNBQVNoWixLQUFLNzlCLEdBQUVuNEMsS0FBS3dDLEtBQUssS0FBYyxTQUFTczJFLEtBQUszZ0MsR0FBRW40QyxLQUFLd0MsS0FBSyxLQUFxQixTQUFTbzBFLE1BQW1ILFNBQVN4Z0MsR0FBRXZyQyxFQUFFQyxFQUFFNUssRUFBRUMsR0FBR3FDLEtBQUsxQyxFQUFFK0ssRUFBRXJJLEtBQUtzMUMsRUFBRWh0QyxFQUFFdEksS0FBS3ZDLEVBQUVDLEVBQUVzQyxLQUFLczJDLEVBQUUzNEMsR0FBRyxFQUFFcUMsS0FBS3NnRCxFQUFFLElBQUl5c0MsR0FBRS9zRixNQUFNQSxLQUFLaS9DLEVBQUVxMEIsR0FBR2pyRSxFQUFFNHFFLEVBQUcsU0FBSSxFQUFPanpFLEtBQUt3MUMsRUFBRSxJQUFJazNDLEdBQUdya0YsR0FBR3JJLEtBQUtvbkMsRUFBRSxLQUFLcG5DLEtBQUszQyxHQUFFLEVBQUcyQyxLQUFLWixFQUFFWSxLQUFLbXlFLEVBQUVueUUsS0FBS3FtQyxFQUFFcm1DLEtBQUtxMEMsRUFBRXIwQyxLQUFLOHpDLEVBQUU5ekMsS0FBS28yQyxFQUFFcDJDLEtBQUtrMEMsRUFBRSxLQUFLbDBDLEtBQUtnekMsRUFBRSxHQUFHaHpDLEtBQUt3MkMsRUFBRSxLQUFLeDJDLEtBQUtzekMsRUFBRSxFQUFFdHpDLEtBQUtsQyxFQUFFa0MsS0FBSzhCLEVBQUUsS0FBSzlCLEtBQUt1ekMsR0FBRyxFQUFFdnpDLEtBQUtxM0MsR0FBRSxFQUFHcjNDLEtBQUsrekMsRUFBRSxFQUFFL3pDLEtBQUtzbkMsRUFBRSxLQUFLdG5DLEtBQUtrdEUsR0FBR2x0RSxLQUFLazJDLEVBQUVsMkMsS0FBSzB6QyxFQUFFMXpDLEtBQUttMEMsR0FBRSxFQUFHbjBDLEtBQUtxMkMsRUFBRSxJQUFJODlCLEdBQUksU0FBU0EsS0FBS24wRSxLQUFLM0MsRUFBRSxLQUFLMkMsS0FBS3cyQyxFQUFFLEdBQUd4MkMsS0FBS3EyQyxHQUFFLEVBQTdpQjkzQyxFQUFFaTFFLEdBQUc3OUIsSUFBbUNwM0MsRUFBRSszRSxHQUFHM2dDLElBQXlCcDNDLEVBQUU2MUUsR0FBR3daLElBQUl4WixHQUFHbjFFLFVBQVV1M0MsRUFBRSxXQUFXLE9BQU8sSUFBSXUzQyxnQkFBZ0IzWixHQUFHbjFFLFVBQVU1QixFQUFFLFdBQVcsTUFBTyxJQUFJOGpGLEdBQUcsSUFBSS9NLEdBQWlZLElBQUlkLEdBQUcsS0FBS2lCLEdBQUcsR0FBR2QsR0FBRyxHQUNobkMsU0FBUzhNLEdBQUdsNEUsRUFBRUMsRUFBRTVLLEdBQUcySyxFQUFFZ3NDLEVBQUUsRUFBRWhzQyxFQUFFZytCLEVBQUVneUMsR0FBRzlrQyxHQUFFanJDLElBQUlELEVBQUVqSixFQUFFMUIsRUFBRTJLLEVBQUU4ckMsR0FBRSxFQUFHMmlDLEdBQUd6dUUsRUFBRSxNQUFPLFNBQVN5dUUsR0FBR3p1RSxFQUFFQyxHQUFHRCxFQUFFeXJDLEVBQUUxd0MsS0FBSytSLE1BQU1va0UsR0FBR2x4RSxHQUFHQSxFQUFFOHBFLEVBQUU1K0IsR0FBRWxyQyxFQUFFZytCLEdBQUcsSUFBSTNvQyxFQUFFMkssRUFBRThwRSxFQUFFeDBFLEVBQUUwSyxFQUFFaXVDLEVBQUVqMkMsTUFBTUMsUUFBUTNDLEtBQUtBLEVBQUUsQ0FBQ2dFLE9BQU9oRSxLQUFLMjJFLEdBQUc1MkUsRUFBRTI0QyxFQUFFLElBQUkxNEMsR0FBRzBLLEVBQUVpckMsRUFBRSxFQUFFNTFDLEVBQUUySyxFQUFFL0ssRUFBRThwQyxFQUFFLytCLEVBQUVndUMsRUFBRSxJQUFJODlCLEdBQUc5ckUsRUFBRW11QyxFQUFFdWlDLEdBQUcxd0UsRUFBRS9LLEVBQUVJLEVBQUU0SyxFQUFFLE1BQU1ELEVBQUVqSixHQUFHLEVBQUVpSixFQUFFMHJDLElBQUkxckMsRUFBRWkvQixFQUFFLElBQUl1bEQsR0FBR3o0QyxFQUFFL3JDLEVBQUVxbEUsR0FBR3JsRSxFQUFFQSxFQUFFbXVDLEdBQUdudUMsRUFBRTByQyxJQUFJazVDLEdBQUc1a0YsRUFBRWk0QyxFQUFFajRDLEVBQUVtdUMsRUFBRSxtQkFBbUJudUMsRUFBRTJpRixJQUFJMWlGLEVBQUVELEVBQUUrK0IsRUFBRW1uQyxFQUFHbG1FLEVBQUUrK0IsR0FBRyxHQUFHLytCLEVBQUVqSixHQUFHaUosRUFBRXZHLElBQUl1RyxFQUFFdkcsRUFBRSxRQUFRd0csRUFBRSxnQkFBZ0Isb0NBQW9DRCxFQUFFbXVDLEVBQUUwMUIsR0FBRzdqRSxFQUFFOHBFLEVBQUU5cEUsRUFBRXZHLEVBQUV1RyxFQUFFakosRUFBRWtKLEtBQUtELEVBQUV2RyxFQUFFLE1BQU11RyxFQUFFbXVDLEVBQUUwMUIsR0FBRzdqRSxFQUFFOHBFLEVBQUU5cEUsRUFBRXZHLEVBQUUsS0FBS3dHLElBQUkrdUMsR0FBRSxHQUpxdUIsU0FBWWh2QyxFQUFFQyxFQUFFNUssRUFBRUMsRUFBRWtGLEVBQUVzcEUsR0FBRzlqRSxFQUFFaWMsTUFBSyxXQUFXLEdBQUdqYyxFQUFFbXVDLEVBQUUsR0FBRzIxQixFQUFZLElBQVQsSUFBSTkxQixFQUFFLEdBQVd2M0MsRUFBRXF0RSxFQUFFNWlFLE1BQU0sS0FBS3pILEVBQUUsRUFBRUEsRUFBRWhELEVBQUVVLE9BQU9zQyxJQUFJLENBQUMsSUFBSXJFLEVBQUVxQixFQUFFZ0QsR0FBR3lILE1BQU0sS0FBSyxHQUFHLEVBQUU5TCxFQUFFK0IsT0FBTyxDQUFDLElBQUlyQixFQUFFVixFQUFFLEdBQUdBLEVBQUVBLEVBQUUsR0FBRyxJQUFJZzRDLEVBQUV0M0MsRUFBRW9MLE1BQU0sS0FBSzhzQyxFQUFFLEdBQUdaLEVBQUVqMkMsUUFBUSxRQUFRaTJDLEVBQUUsR0FBR1ksR0FBR2w0QyxFQUFFLEtBQUlWLEVBQUUsSUFBSzQ0QyxHQUFHbDRDLEVBQUUsb0JBQXNCazRDLEVBQUUsVUFBVUEsRUFBRTgxQixFQUFFLE1BQU8sZ0JBQWdCeHVFLEVBQUUsY0FBY2tGLEVBQUUsTUFBTXlGLEVBQUUsS0FBSzVLLEVBQUUsS0FBSzI0QyxLQUk1aUMyM0MsQ0FBRzNsRixFQUFFaXRDLEVBQUVqdEMsRUFBRXZHLEVBQUV1RyxFQUFFOHBFLEVBQUU5cEUsRUFBRTVLLEVBQUU0SyxFQUFFaXVDLEVBQUVqdUMsRUFBRWpKLEdBSS9PLFNBQVMrNEUsR0FBRzl2RSxHQUFHLFFBQU9BLEVBQUVtdUMsSUFBRSxPQUFPbnVDLEVBQUV2RyxHQUFHLEdBQUd1RyxFQUFFZ3NDLEdBQUdoc0MsRUFBRS9LLEVBQUU2eUUsSUFDdlMsU0FBU2tELEdBQUdockUsRUFBRUMsRUFBRTVLLEdBQUcsSUFBU21GLEVBQUxsRixHQUFFLEVBQUssTUFBTTBLLEVBQUVndkMsR0FBR2h2QyxFQUFFaXJDLEVBQUU1MUMsRUFBRThCLFFBQVEsSUFBR3FELEVBQUV3ekUsR0FBR2h1RSxFQUFFM0ssR0FBR21GLEdBQUc0d0UsR0FBRyxDQUFDLEdBQUduckUsSUFBSUQsRUFBRXZLLEVBQUUsRUFBRW80QyxHQUFFLElBQUl2NEMsR0FBRSxHQUFJbTJDLEdBQUV6ckMsRUFBRWl0QyxFQUFFanRDLEVBQUU1SyxFQUFFLEtBQUsseUJBQXlCLE1BQVcsR0FBR29GLEdBQUcweEUsR0FBRyxDQUFDbHNFLEVBQUV2SyxFQUFFLEVBQUVvNEMsR0FBRSxJQUFJcEMsR0FBRXpyQyxFQUFFaXRDLEVBQUVqdEMsRUFBRTVLLEVBQUVDLEVBQUUsbUJBQW1CQyxHQUFFLEVBQUcsTUFBV20yQyxHQUFFenJDLEVBQUVpdEMsRUFBRWp0QyxFQUFFNUssRUFBRW9GLEVBQUUsTUFBTW8yRSxHQUFHNXdFLEVBQUV4RixHQUFHczFFLEdBQUc5dkUsSUFBSXhGLEdBQUc0d0UsSUFBSTV3RSxHQUFHMHhFLEtBQUtsc0UsRUFBRWd1QyxFQUFFRyxFQUFFLEdBQUdudUMsRUFBRWlyQyxFQUFFLEdBQUcsR0FBR2hyQyxHQUFHLEdBQUc1SyxFQUFFOEIsUUFBUTZJLEVBQUVndUMsRUFBRUEsSUFBSWh1QyxFQUFFdkssRUFBRSxFQUFFbzRDLEdBQUUsSUFBSXY0QyxHQUFFLEdBQUkwSyxFQUFFaEwsRUFBRWdMLEVBQUVoTCxHQUFHTSxFQUFFQSxFQUFFLEVBQUVELEVBQUU4QixTQUFTNkksRUFBRTZrRSxLQUFLN2tFLEVBQUU2a0UsSUFBRyxHQUFHNWtFLEVBQUVELEVBQUUvSyxHQUFJazVDLEdBQUdudUMsR0FBR0MsRUFBRW9yQyxJQUFJcHJDLEVBQUVnL0IsSUFBSWgvQixFQUFFK3RDLEVBQUUveEIsS0FBSyx1REFBdUQ1bUIsRUFBRThCLFFBQVE2MEUsR0FBRy9yRSxHQUFHQSxFQUFFZy9CLEdBQUUsRUFBRzRPLEdBQUUsT0FBT3BDLEdBQUV6ckMsRUFBRWl0QyxFQUFFanRDLEVBQUU1SyxFQUNwZkMsRUFBRSw4QkFBOEJ1aEQsR0FBRTUyQyxHQUFHa3JFLEdBQUdsckUsSUFBaUksU0FBU2d1RSxHQUFHaHVFLEVBQUVDLEdBQUcsSUFBSTVLLEVBQUUySyxFQUFFaXJDLEVBQUUzMUMsRUFBRTJLLEVBQUVoQyxRQUFRLEtBQUs1SSxHQUFHLE9BQUksR0FBR0MsRUFBUzgxRSxJQUFHLzFFLEVBQUVnVyxPQUFPcEwsRUFBRXVCLFVBQVVuTSxFQUFFQyxJQUFPZ1csTUFBTWpXLEdBQVU2MkUsSUFBRzUyRSxHQUFHLEdBQU9ELEVBQUU0SyxFQUFFOUksT0FBY2kwRSxJQUFHbnJFLEVBQUVBLEVBQUVvYSxPQUFPL2tCLEVBQUVELEdBQUcySyxFQUFFaXJDLEVBQUUzMUMsRUFBRUQsRUFBUzRLLElBQTBDLFNBQVNpeEUsR0FBR2x4RSxHQUFHQSxFQUFFK3RDLEVBQUVoekMsS0FBSytSLE1BQU05TSxFQUFFNDJDLEVBQUVpNEIsR0FBRzd1RSxFQUFFQSxFQUFFNDJDLEdBQzdhLFNBQVNpNEIsR0FBRzd1RSxFQUFFQyxHQUFHLEdBQUcsTUFBTUQsRUFBRTZyQyxFQUFFLE1BQU0zekMsTUFBTSwyQkFBMkI4SCxFQUFFNnJDLEVBQUVHLEdBQUVELEVBQUUvckMsRUFBRTRsRixHQUFHNWxGLEdBQUdDLEdBQUksU0FBU21zRSxHQUFHcHNFLEdBQUdBLEVBQUU2ckMsSUFBSTUyQyxFQUFFNFYsYUFBYTdLLEVBQUU2ckMsR0FBRzdyQyxFQUFFNnJDLEVBQUUsTUFBNEosU0FBU3EvQixHQUFHbHJFLEdBQUcsR0FBR0EsRUFBRS9LLEVBQUVtNEMsR0FBR3B0QyxFQUFFZ3ZDLEdBQUdzcUMsR0FBR3Q1RSxFQUFFL0ssRUFBRStLLEdBQUksU0FBUzQyQyxHQUFFNTJDLEdBQUdvc0UsR0FBR3BzRSxHQUFHLElBQUlDLEVBQUVELEVBQUVpL0IsRUFBRWgvQixHQUFHLG1CQUFtQkEsRUFBRWdrRSxJQUFJaGtFLEVBQUVna0UsS0FBS2prRSxFQUFFaS9CLEVBQUUsS0FBS3FsRCxHQUFHdGtGLEVBQUVtdEMsR0FBRzAzQyxHQUFHN2tGLEVBQUVpNEMsR0FBR2o0QyxFQUFFbXVDLElBQUlsdUMsRUFBRUQsRUFBRW11QyxFQUFFbnVDLEVBQUVtdUMsRUFBRSxLQUFLbHVDLEVBQUVpcUQsUUFBUWpxRCxFQUFFZ2tFLE1BQ3RjLFNBQVMyTSxHQUFHNXdFLEVBQUVDLEdBQUcsSUFBSSxJQUFJNUssRUFBRTJLLEVBQUUvSyxFQUFFLEdBQUcsR0FBR0ksRUFBRSszQyxJQUFJLzNDLEVBQUU4NEMsR0FBR251QyxHQUFHbXNFLEdBQUc5MkUsRUFBRUwsRUFBRWdMLElBQUksR0FBRzNLLEVBQUUyNUMsRUFBRWh2QyxFQUFFa3JDLEdBQUdsckMsRUFBRTZ0QyxHQUFHcytCLEdBQUc5MkUsRUFBRUwsRUFBRWdMLElBQUksR0FBRzNLLEVBQUUrM0MsRUFBRSxDQUFDLElBQUksSUFBSTkzQyxFQUFFRCxFQUFFd3hFLEdBQUcxNEIsRUFBRXJpQyxNQUFNN0wsR0FBSSxNQUFNN0ssR0FBR0UsRUFBRSxLQUFNLEdBQUcwQyxNQUFNQyxRQUFRM0MsSUFBSSxHQUFHQSxFQUFFNkIsT0FBTyxDQUFDLElBQUlxRCxFQUFFbEYsRUFBRSxHQUFHLEdBQUdrRixFQUFFLElBQUd3RixFQUFHLElBQUkzSyxFQUFFb0UsRUFBRSxDQUFDLEdBQUdwRSxFQUFFODRDLEVBQUUsTUFBRzk0QyxFQUFFODRDLEVBQUUxQyxFQUFFLElBQUl6ckMsRUFBRXlyQyxHQUFtQixNQUFNenJDLEVBQXZCMndFLEdBQUd0N0UsR0FBR3UzRSxHQUFHdjNFLEdBQWdCczZFLEdBQUd0NkUsR0FBR3c0QyxHQUFFLFVBQVd4NEMsRUFBRXV1RSxHQUFHcHBFLEVBQUUsR0FBRyxFQUFFbkYsRUFBRXV1RSxHQUFHdnVFLEVBQUV5MkMsR0FBRyxNQUFNdHhDLEVBQUUsSUFBSW5GLEVBQUU2MUMsR0FBRyxHQUFHNzFDLEVBQUV5MEUsSUFBSXowRSxFQUFFMm9DLElBQUkzb0MsRUFBRTJvQyxFQUFFZ08sR0FBRUQsRUFBRTEyQyxFQUFFbXRGLEdBQUdudEYsR0FBRyxNQUFNLEdBQUcsR0FBR2s1RSxHQUFHbDVFLEVBQUVMLElBQUlLLEVBQUUyeEUsR0FBRyxDQUFDLElBQUkzeEUsRUFBRTJ4RSxLQUFNLE1BQU01eEUsSUFBSUMsRUFBRTJ4RSxRQUFHLFFBQWM5NUIsR0FBRTczQyxFQUFFLFNBQVUsSUFBSTJLLEVBQUU2dEMsR0FBR3g0QyxFQUFFODRDLEdBQUdudUMsSUFBSTJ3RSxHQUFHdDdFLElBQUk2dUUsRUFBR2prRSxHQUFHLElBQUl6RixFQUFFbkYsRUFBRXd4RSxHQUFHMTRCLEVBQUVyaUMsTUFBTTdMLEdBQUdBLEVBQUUsRUFBRUEsRUFBRXpGLEVBQUVyRCxPQUFPOEksSUFBSSxDQUFDLElBQUk3SyxFQUFFb0YsRUFBRXlGLEdBQzVlLEdBQWhCNUssRUFBRXkyQyxFQUFFMTJDLEVBQUUsR0FBR0EsRUFBRUEsRUFBRSxHQUFNLEdBQUdDLEVBQUUrM0MsRUFBRSxHQUFHLEtBQUtoNEMsRUFBRSxHQUFHLENBQUNDLEVBQUV3NEMsRUFBRXo0QyxFQUFFLEdBQUdDLEVBQUVtd0UsR0FBR3B3RSxFQUFFLEdBQUcsTUFBTVUsRUFBRVYsRUFBRSxHQUFHLE1BQU1VLElBQUlULEVBQUUwd0UsR0FBR2p3RSxFQUFFVCxFQUFFMjRDLEVBQUUveEIsS0FBSyxPQUFPNW1CLEVBQUUwd0UsS0FBSyxNQUFNMzRCLEVBQUVoNEMsRUFBRSxHQUFHLE1BQU1nNEMsSUFBSS8zQyxFQUFFcTFFLEdBQUd0OUIsRUFBRS8zQyxFQUFFMjRDLEVBQUUveEIsS0FBSyxRQUFRNW1CLEVBQUVxMUUsS0FBSyxNQUFNOUQsRUFBR3h4RSxFQUFFLEdBQUcsTUFBTXd4RSxHQUFJLGlCQUFrQkEsR0FBSSxFQUFFQSxJQUFLdHhFLEVBQUUsSUFBSXN4RSxFQUFHdnhFLEVBQUUyMkMsRUFBRTEyQyxFQUFFRCxFQUFFMjRDLEVBQUUveEIsS0FBSyxnQ0FBZ0MzbUIsSUFBSUEsRUFBRUQsRUFBRSxNQUFNcXpFLEVBQUcxb0UsRUFBRW11QyxFQUFFLEdBQUd1NkIsRUFBRyxDQUFDLE1BQU1oRCxFQUFHZ0QsRUFBR3Y2QixFQUFFdTZCLEVBQUd2NkIsRUFBRTAzQyxrQkFBa0IsMEJBQTBCLEtBQUssR0FBR25nQixFQUFHLENBQUMsSUFBSTVCLEVBQUV4dUUsRUFBRU4sR0FBRzh1RSxFQUFFMzFCLElBQUlzeUMsRUFBRS9hLEVBQUcsU0FBUythLEVBQUUvYSxFQUFHLFNBQVMrYSxFQUFFL2EsRUFBRyxTQUFTNUIsRUFBRTcyQixFQUFFNjJCLEVBQUU3dUUsRUFBRTZ1RSxFQUFFMzFCLEVBQUUsSUFBSXpyQixJQUFJb2hELEVBQUU5MUIsSUFBSXNnQyxHQUFHeEssRUFBRUEsRUFBRTkxQixHQUFHODFCLEVBQUU5MUIsRUFBRSxPQUFRLEdBQUcxNEMsRUFBRXExQyxFQUFFLENBQUMsTUFBTTA2QyxFQUNuZjNjLEVBQUd2NkIsRUFBRXU2QixFQUFHdjZCLEVBQUUwM0Msa0JBQWtCLHFCQUFxQixLQUFLUixJQUFLL3ZGLEVBQUU0dUUsR0FBR21oQixFQUFHdHZDLEdBQUV6Z0QsRUFBRW0yQyxFQUFFbjJDLEVBQUVxMUMsRUFBRTA2QyxLQUFPaHdGLEVBQUUrM0MsRUFBRSxFQUFFLzNDLEVBQUU0M0MsR0FBRzUzQyxFQUFFNDNDLEVBQUV1M0IsS0FBS252RSxFQUFFZzJDLElBQUloMkMsRUFBRXEyQyxFQUFFM3dDLEtBQUsrUixNQUFNOU0sRUFBRXlyQyxFQUFFcDJDLEVBQUUyNEMsRUFBRS94QixLQUFLLGtCQUFrQjVtQixFQUFFcTJDLEVBQUUsT0FBVyxJQUFJc0MsRUFBRWh1QyxFQUErQixJQUF6QzFLLEVBQUVELEdBQVlxdkUsR0FBRzRILEdBQUdoM0UsRUFBRUEsRUFBRXlwQyxFQUFFenBDLEVBQUVrd0UsR0FBRyxLQUFLbHdFLEVBQUU2M0MsR0FBTWEsRUFBRUgsRUFBRSxDQUFDcWhDLEdBQUc1NUUsRUFBRU4sRUFBRWc1QyxHQUFHLElBQUl2M0MsRUFBRXUzQyxFQUFFdjBDLEVBQUVuRSxFQUFFMDJDLEVBQUV2eUMsR0FBR2hELEVBQUVtVSxXQUFXblIsR0FBR2hELEVBQUVvMUMsSUFBSXVnQyxHQUFHMzFFLEdBQUd5NkUsR0FBR3o2RSxJQUFJbkIsRUFBRTY0QyxFQUFFSCxPQUFRd2lDLEdBQUdsN0UsR0FBRyxFQUFFRCxFQUFFSixFQUFFa0MsUUFBUTA1RSxHQUFHeDdFLE9BQVMsUUFBUUQsRUFBRSxJQUFJLFNBQVNBLEVBQUUsSUFBSTgzQyxHQUFFNzNDLEVBQUUsUUFBUSxHQUFHQSxFQUFFKzNDLElBQUksUUFBUWg0QyxFQUFFLElBQUksU0FBU0EsRUFBRSxHQUFHLFFBQVFBLEVBQUUsR0FBRzgzQyxHQUFFNzNDLEVBQUUsR0FBR2szRSxHQUFHbDNFLEdBQUcsUUFBUUQsRUFBRSxJQUFJQyxFQUFFNDNDLEdBQUc1M0MsRUFBRTQzQyxFQUFFMjhCLEdBQUd4MEUsR0FBR0MsRUFBRXkwRSxFQUFFLEdBQUk5NkIsR0FBRSxHQUFJLE1BQU01NUMsS0FDM2QsU0FBUzY2RSxHQUFHandFLEVBQUVDLEdBQUcsR0FBR0QsRUFBRWMsU0FBUyxtQkFBbUJkLEVBQUVjLFFBQVFkLEVBQUVjLFFBQVFiLE9BQUUsUUFBYSxHQUFHd21FLEVBQUd6bUUsSUFBSSxpQkFBa0JBLEVBQUVpa0UsRUFBR2prRSxFQUFFQyxPQUFFLE9BQWEsQ0FBQyxHQUFHRCxFQUFFMnVDLEdBQUcsbUJBQW1CM3VDLEVBQUUydUMsRUFBRSxJQUFJdDVDLEVBQUUySyxFQUFFMnVDLFNBQVMsR0FBRzN1QyxFQUFFKzFDLEdBQUcsbUJBQW1CLzFDLEVBQUUrMUMsRUFBRTFnRCxPQUFFLE9BQVksR0FBR294RSxFQUFHem1FLElBQUksaUJBQWtCQSxFQUFFLENBQUMzSyxFQUFFLEdBQUcsSUFBSSxJQUFJQyxFQUFFMEssRUFBRTdJLE9BQU9xRCxFQUFFLEVBQUVBLEVBQUVsRixFQUFFa0YsSUFBSW5GLEVBQUUwRCxLQUFLeUIsUUFBUyxJQUFJQSxLQUFLbkYsRUFBRSxHQUFHQyxFQUFFLEVBQUUwSyxFQUFFM0ssRUFBRUMsS0FBS2tGLEVBQVVBLEdBQVJsRixFQUQySSxTQUFZMEssR0FBRyxHQUFHQSxFQUFFKzFDLEdBQUcsbUJBQW1CLzFDLEVBQUUrMUMsRUFBRSxPQUFPLzFDLEVBQUUrMUMsSUFBSSxHQUFHLGlCQUFrQi8xQyxFQUFFLE9BQU9BLEVBQUVrQixNQUFNLElBQUksR0FBR3VsRSxFQUFHem1FLEdBQUcsQ0FBQyxJQUFJLElBQUlDLEVBQUUsR0FBRzVLLEVBQUUySyxFQUFFN0ksT0FBTzdCLEVBQUUsRUFBRUEsRUFBRUQsRUFBRUMsSUFBSTJLLEVBQUVsSCxLQUFLaUgsRUFBRTFLLElBQUksT0FBTzJLLEVBQVcsSUFBSTNLLEtBQWIySyxFQUFFLEdBQUc1SyxFQUFFLEVBQVcySyxFQUFFQyxFQUFFNUssS0FBSzJLLEVBQUUxSyxHQUFHLE9BQU8ySyxFQUN6Vjh3RSxDQUFHL3dFLElBQU83SSxPQUFPLElBQUksSUFBSTJzRSxFQUFFLEVBQUVBLEVBQUV0cEUsRUFBRXNwRSxJQUFJN2pFLEVBQUU5SyxVQUFLLEVBQU9HLEVBQUV3dUUsR0FBR3p1RSxHQUFHQSxFQUFFeXVFLEdBQUc5akUsSUFBSyxTQUFTMHFDLEdBQUUxcUMsRUFBRUMsR0FBR3RJLEtBQUtxMkMsRUFBRSxHQUFHcjJDLEtBQUt3MkMsRUFBRSxHQUFHeDJDLEtBQUszQyxFQUFFLEVBQUUsSUFBSUssRUFBRXNvQixVQUFVeG1CLE9BQU8sR0FBRyxFQUFFOUIsRUFBRSxDQUFDLEdBQUdBLEVBQUUsRUFBRSxNQUFNNkMsTUFBTSw4QkFBOEIsSUFBSSxJQUFJNUMsRUFBRSxFQUFFQSxFQUFFRCxFQUFFQyxHQUFHLEVBQUVxQyxLQUFLK08sSUFBSWlYLFVBQVVyb0IsR0FBR3FvQixVQUFVcm9CLEVBQUUsU0FBVSxHQUFHMEssRUFBRSxHQUFHQSxhQUFhMHFDLEdBQUUsSUFBSXIxQyxFQUFFMkssRUFBRTJ1QyxJQUFJcjVDLEVBQUUsRUFBRUEsRUFBRUQsRUFBRThCLE9BQU83QixJQUFJcUMsS0FBSytPLElBQUlyUixFQUFFQyxHQUFHMEssRUFBRW5LLElBQUlSLEVBQUVDLFVBQVUsSUFBSUEsS0FBSzBLLEVBQUVySSxLQUFLK08sSUFBSXBSLEVBQUUwSyxFQUFFMUssSUFDeHNCLFNBQVNvNkUsR0FBRzF2RSxHQUFHLEdBQUdBLEVBQUVoTCxHQUFHZ0wsRUFBRW11QyxFQUFFaDNDLE9BQU8sQ0FBQyxJQUFJLElBQUk4SSxFQUFFLEVBQUU1SyxFQUFFLEVBQUU0SyxFQUFFRCxFQUFFbXVDLEVBQUVoM0MsUUFBUSxDQUFDLElBQUk3QixFQUFFMEssRUFBRW11QyxFQUFFbHVDLEdBQUcwdUMsR0FBRTN1QyxFQUFFZ3VDLEVBQUUxNEMsS0FBSzBLLEVBQUVtdUMsRUFBRTk0QyxLQUFLQyxHQUFHMkssSUFBS0QsRUFBRW11QyxFQUFFaDNDLE9BQU85QixFQUFHLEdBQUcySyxFQUFFaEwsR0FBR2dMLEVBQUVtdUMsRUFBRWgzQyxPQUFPLENBQUMsSUFBSXFELEVBQUUsR0FBRyxJQUFJbkYsRUFBRTRLLEVBQUUsRUFBRUEsRUFBRUQsRUFBRW11QyxFQUFFaDNDLFFBQWlCdzNDLEdBQUVuMEMsRUFBWGxGLEVBQUUwSyxFQUFFbXVDLEVBQUVsdUMsTUFBWUQsRUFBRW11QyxFQUFFOTRDLEtBQUtDLEVBQUVrRixFQUFFbEYsR0FBRyxHQUFHMkssSUFBSUQsRUFBRW11QyxFQUFFaDNDLE9BQU85QixHQUNsTyxTQUFTczVDLEdBQUUzdUMsRUFBRUMsR0FBRyxPQUFPdkssT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLNkssRUFBRUMsSUFkcWpDSSxFQUFFa3JDLEdBQUUzMEMsV0FBWWdVLFdBQVcsU0FBUzVLLEdBQUdySSxLQUFLaS9DLEVBQUU1MkMsR0FFanFDSyxFQUFFc2lGLEdBQUcsU0FBUzNpRixHQUFHQSxFQUFFQSxFQUFFcEYsT0FBTyxNQUFNcUYsRUFBRXRJLEtBQUtzbkMsRUFBRWgvQixHQUFHLEdBQUd5ckMsR0FBRTFyQyxHQUFHQyxFQUFFaEwsSUFBSTBDLEtBQUswdEUsR0FBR3JsRSxJQUNwRUssRUFBRWdsRSxHQUFHLFNBQVNybEUsR0FBRyxJQUFJLEdBQUdBLEdBQUdySSxLQUFLdzJDLEVBQUVudUMsRUFBRSxDQUFDLE1BQU1sSyxFQUFFNDFDLEdBQUUvekMsS0FBS3cyQyxHQUFHLElBQUlsdUMsRUFBRXRJLEtBQUt3MkMsRUFBRXk0QixLQUFLLE1BQU14NUIsRUFBRXoxQyxLQUFLdzJDLEVBQUVzNEIsS0FBSyxLQUFLLEVBQUUzd0UsS0FBSyxHQUFHQSxHQUFHODBFLEdBQUlqekUsS0FBS3cyQyxJQUFJeDJDLEtBQUtxMkMsRUFBRUEsR0FBR3IyQyxLQUFLdzJDLEVBQUU2MkIsTUFBTXFULEdBQUcxZ0YsS0FBS3cyQyxLQUFLLENBQUN4MkMsS0FBS3EzQyxHQUFHLEdBQUdsNUMsR0FBRyxHQUFHbUssR0FBZSt1QyxHQUFYLEdBQUcvdUMsR0FBRyxHQUFHbXRDLEVBQUksRUFBSyxHQUFJZy9CLEdBQUd6MEUsTUFBTSxJQUFJdEMsRUFBRXNDLEtBQUt3MkMsRUFBRXM0QixLQUFLOXVFLEtBQUt1ekMsRUFBRTcxQyxFQUFFNEssRUFBRSxHQUFHNnZFLEdBQUduNEUsTUFBTSxDQUFDLElBQUlyQyxFQUFFK2lGLEdBQUcxZ0YsS0FBS3cyQyxHQUFHbnVDLEVBQUUsR0FBRyxJQUFJeEYsRUFBRWxGLEVBQUU2QixPQUFPMnNFLEVBQUUsR0FBR3A0QixHQUFFL3pDLEtBQUt3MkMsR0FBRyxJQUFJeDJDLEtBQUtxMkMsRUFBRWg1QyxFQUFFLENBQUMsR0FBRyxvQkFBcUJ3ekUsWUFBWSxDQUFDNXhCLEdBQUVqL0MsTUFBTXV6RSxHQUFHdnpFLE1BQU0sSUFBSXEyQyxFQUFFLEdBQUcsTUFBTS90QyxFQUFFdEksS0FBS3EyQyxFQUFFaDVDLEVBQUUsSUFBSUMsRUFBRXV6RSxZQUFhLElBQUl2b0UsRUFBRSxFQUFFQSxFQUFFekYsRUFBRXlGLElBQUl0SSxLQUFLcTJDLEVBQUVBLEdBQUUsRUFBR2h1QyxHQUFHckksS0FBS3EyQyxFQUFFaDVDLEVBQUV5ekUsT0FBT256RSxFQUFFMkssR0FBRyxDQUFDcTlELE9BQU93RyxHQUFHN2pFLEdBQUd6RixFQUFFLElBQUlsRixFQUFFNDNELE9BQU8sRUFDcmYxeUQsR0FBRzdDLEtBQUtxMkMsRUFBRUcsR0FBR251QyxFQUFFckksS0FBS3N6QyxFQUFFLEVBQUUrQyxFQUFFcjJDLEtBQUtxMkMsRUFBRUcsT0FBUUgsRUFBRXIyQyxLQUFLdzJDLEVBQUU2MkIsS0FBOEQsR0FBekRydEUsS0FBSzNDLEVBQUUsS0FBS0ssRUFObkUsU0FBWTJLLEVBQUVDLEVBQUU1SyxFQUFFQyxFQUFFa0YsRUFBRXNwRSxFQUFFOTFCLEdBQUdodUMsRUFBRWljLE1BQUssV0FBVyxNQUFPLGlCQUFpQjNtQixFQUFFLGVBQWVrRixFQUFFLE1BQU15RixFQUFFLEtBQUs1SyxFQUFFLEtBQUt5dUUsRUFBRSxJQUFJOTFCLEtBTTdDODNDLENBQUdudUYsS0FBS3MxQyxFQUFFdDFDLEtBQUs4QixFQUFFOUIsS0FBS215RSxFQUFFbnlFLEtBQUt2QyxFQUFFdUMsS0FBS3MyQyxFQUFFbjRDLEVBQUVULEdBQU1zQyxLQUFLM0MsRUFBRSxDQUFDLEdBQUcyQyxLQUFLMHpDLElBQUkxekMsS0FBS2syQyxFQUFFLENBQUM1dEMsRUFBRSxDQUFDLEdBQUd0SSxLQUFLdzJDLEVBQUUsQ0FBQyxJQUFJMTNDLEVBQUVnRCxFQUFFOUIsS0FBS3cyQyxFQUFFLElBQUkxM0MsRUFBRWdELEVBQUUwMEMsRUFBRTEwQyxFQUFFMDBDLEVBQUUwM0Msa0JBQWtCLDJCQUEyQixRQUFRM2hCLEVBQUd6dEUsR0FBRyxDQUFDLElBQUlyQixFQUFFcUIsRUFBRSxNQUFNd0osR0FBRzdLLEVBQUUsS0FBTSxLQUFHQyxFQUFFRCxHQUF3RyxDQUFDdUMsS0FBSzNDLEdBQUUsRUFBRzJDLEtBQUtsQyxFQUFFLEVBQUVvNEMsR0FBRSxJQUFJK0ksR0FBRWovQyxNQUFNdXpFLEdBQUd2ekUsTUFBTSxNQUFNcUksRUFBdkp5ckMsR0FBRTl6QyxLQUFLczFDLEVBQUV0MUMsS0FBS3ZDLEVBQUVDLEVBQUUsMERBQTBEc0MsS0FBS2syQyxHQUFFLEVBQUcraUMsR0FBR2o1RSxLQUFLdEMsR0FBNERzQyxLQUFLbTBDLEdBQUdrL0IsR0FBR3J6RSxLQUFLN0IsRUFBRWs0QyxHQUFHNDhCLEdBQUlqekUsS0FBSzNDLEdBQUcsR0FBR2MsSUFBSTh1RixHQUFHanRGLEtBQUtzZ0QsRUFBRXRnRCxLQUFLdzFDLEVBQUUsT0FBT3gxQyxLQUFLOHFGLElBQ3JmOXFGLEtBQUt3MUMsRUFBRTlkLFdBQVdvYyxHQUFFOXpDLEtBQUtzMUMsRUFBRXQxQyxLQUFLdkMsRUFBRTQ0QyxFQUFFLE1BQU00aUMsR0FBR2o1RSxLQUFLcTJDLElBQUksR0FBR2w0QyxHQUFHOGdELEdBQUVqL0MsTUFBTUEsS0FBSzNDLElBQUkyQyxLQUFLcTNDLElBQUksR0FBR2w1QyxFQUFFd2pGLEdBQUczaEYsS0FBSzFDLEVBQUUwQyxPQUFPQSxLQUFLM0MsR0FBRSxFQUFHazhFLEdBQUd2NUUsYUFBYyxLQUFLdEMsR0FBRyxFQUFFMjRDLEVBQUUvdkMsUUFBUSxnQkFBZ0J0RyxLQUFLbEMsRUFBRSxFQUFFbzRDLEdBQUUsTUFBTWwyQyxLQUFLbEMsRUFBRSxFQUFFbzRDLEdBQUUsS0FBSytJLEdBQUVqL0MsTUFBTXV6RSxHQUFHdnpFLFFBQVMsTUFBTTdCLE1BRXpMdUssRUFBRW9pRixHQUFHLFdBQVcsR0FBRzlxRixLQUFLdzJDLEVBQUUsQ0FBQyxJQUFJbnVDLEVBQUUwckMsR0FBRS96QyxLQUFLdzJDLEdBQUdsdUMsRUFBRXRJLEtBQUt3MkMsRUFBRTYyQixLQUFLcnRFLEtBQUtzekMsRUFBRWhyQyxFQUFFOUksU0FBU2kxRSxHQUFHejBFLE1BQU1xekUsR0FBR3J6RSxLQUFLcUksRUFBRUMsR0FBR3RJLEtBQUszQyxHQUFHLEdBQUdnTCxHQUFHa3hFLEdBQUd2NUUsU0FBNkwwSSxFQUFFMjZCLE9BQU8sV0FBV3JqQyxLQUFLcTNDLEdBQUUsRUFBRzRILEdBQUVqL0MsT0FDL08wSSxFQUFFdWxGLEdBQUcsV0FBV2p1RixLQUFLazBDLEVBQUUsS0FBSyxNQUFNN3JDLEVBQUVqRixLQUFLK1IsTUFBTSxHQUFHOU0sRUFBRXJJLEtBQUtvMkMsR0FWZSxTQUFZL3RDLEVBQUVDLEdBQUdELEVBQUVpYyxNQUFLLFdBQVcsTUFBTyxZQUFZaGMsS0FVbEU4bEYsQ0FBR3B1RixLQUFLczFDLEVBQUV0MUMsS0FBS215RSxHQUFHLEdBQUdueUUsS0FBS3EwQyxJQUFJZ0QsR0FBRSxHQUFHbkIsR0FBRSxLQUFLK0ksR0FBRWovQyxNQUFNQSxLQUFLbEMsRUFBRSxFQUFFeTFFLEdBQUd2ekUsT0FBT2szRSxHQUFHbDNFLEtBQUtBLEtBQUtvMkMsRUFBRS90QyxLQUlnYkssRUFBRXFxQyxHQUFFOXpDLFdBQVltL0MsRUFBRSxXQUFXMjVCLEdBQUcvM0UsTUFBTSxJQUFJLElBQUlxSSxFQUFFLEdBQUdDLEVBQUUsRUFBRUEsRUFBRXRJLEtBQUt3MkMsRUFBRWgzQyxPQUFPOEksSUFBSUQsRUFBRWpILEtBQUtwQixLQUFLcTJDLEVBQUVyMkMsS0FBS3cyQyxFQUFFbHVDLEtBQUssT0FBT0QsR0FBR0ssRUFBRXN1QyxFQUFFLFdBQW9CLE9BQVQrZ0MsR0FBRy8zRSxNQUFhQSxLQUFLdzJDLEVBQUUyVyxVQUM1bkJ6a0QsRUFBRXhLLElBQUksU0FBU21LLEVBQUVDLEdBQUcsT0FBTzB1QyxHQUFFaDNDLEtBQUtxMkMsRUFBRWh1QyxHQUFHckksS0FBS3EyQyxFQUFFaHVDLEdBQUdDLEdBQUdJLEVBQUVxRyxJQUFJLFNBQVMxRyxFQUFFQyxHQUFHMHVDLEdBQUVoM0MsS0FBS3EyQyxFQUFFaHVDLEtBQUtySSxLQUFLM0MsSUFBSTJDLEtBQUt3MkMsRUFBRXAxQyxLQUFLaUgsSUFBSXJJLEtBQUtxMkMsRUFBRWh1QyxHQUFHQyxHQUFJSSxFQUFFUyxRQUFRLFNBQVNkLEVBQUVDLEdBQUcsSUFBSSxJQUFJNUssRUFBRXNDLEtBQUtnM0MsSUFBSXI1QyxFQUFFLEVBQUVBLEVBQUVELEVBQUU4QixPQUFPN0IsSUFBSSxDQUFDLElBQUlrRixFQUFFbkYsRUFBRUMsR0FBR3d1RSxFQUFFbnNFLEtBQUs5QixJQUFJMkUsR0FBR3dGLEVBQUU3SyxLQUFLOEssRUFBRTZqRSxFQUFFdHBFLEVBQUU3QyxRQUN2WSxJQUFJNDNFLEdBQUcsNkhBQTBWLFNBQVN6akMsR0FBRTlyQyxFQUFFQyxHQUFrRSxHQUEvRHRJLEtBQUszQyxFQUFFMkMsS0FBS1osRUFBRVksS0FBS3MxQyxFQUFFLEdBQUd0MUMsS0FBS3ZDLEVBQUUsS0FBS3VDLEtBQUtsQyxFQUFFa0MsS0FBSzFDLEVBQUUsR0FBRzBDLEtBQUt3MkMsR0FBRSxFQUFNbnVDLGFBQWE4ckMsR0FBRSxDQUFDbjBDLEtBQUt3MkMsT0FBRSxJQUFTbHVDLEVBQUVBLEVBQUVELEVBQUVtdUMsRUFBRWdoQyxHQUFHeDNFLEtBQUtxSSxFQUFFaXRDLEdBQUd0MUMsS0FBS1osRUFBRWlKLEVBQUVqSixFQUFFODJFLEdBQUdsMkUsS0FBS3FJLEVBQUVoTCxHQUFHbTdFLEdBQUd4NEUsS0FBS3FJLEVBQUU1SyxHQUFHdUMsS0FBSzFDLEVBQUUrSyxFQUFFL0ssRUFBRWdMLEVBQUVELEVBQUVndUMsRUFBRSxJQUFJMzRDLEVBQUUsSUFBSW80RSxHQUFHcDRFLEVBQUVMLEVBQUVpTCxFQUFFakwsRUFBRWlMLEVBQUVrdUMsSUFBSTk0QyxFQUFFODRDLEVBQUUsSUFBSXpELEdBQUV6cUMsRUFBRWt1QyxHQUFHOTRDLEVBQUUyNEMsRUFBRS90QyxFQUFFK3RDLEdBQUdxZ0MsR0FBRzEyRSxLQUFLdEMsR0FBR3NDLEtBQUtsQyxFQUFFdUssRUFBRXZLLE9BQVF1SyxJQUFJM0ssRUFBRWlFLE9BQU8wRyxHQUFHdVYsTUFBTWc2RCxNQUFNNTNFLEtBQUt3MkMsSUFBSWx1QyxFQUFFa3ZFLEdBQUd4M0UsS0FBS3RDLEVBQUUsSUFBSSxJQUFHLEdBQUlzQyxLQUFLWixFQUFFczFFLEdBQUdoM0UsRUFBRSxJQUFJLElBQUl3NEUsR0FBR2wyRSxLQUFLdEMsRUFBRSxJQUFJLElBQUcsR0FBSTg2RSxHQUFHeDRFLEtBQUt0QyxFQUFFLElBQUlzQyxLQUFLMUMsRUFBRW8zRSxHQUFHaDNFLEVBQUUsSUFBSSxJQUFHLEdBQUlnNUUsR0FBRzEyRSxLQUFLdEMsRUFBRSxJQUFJLElBQUcsR0FBSXNDLEtBQUtsQyxFQUFFNDJFLEdBQUdoM0UsRUFBRSxJQUFJLE1BQU1zQyxLQUFLdzJDLElBQUlsdUMsRUFBRXRJLEtBQUtxMkMsRUFBRSxJQUFJeS9CLEdBQUcsS0FBSzkxRSxLQUFLdzJDLElBQ3BjLFNBQVNqRCxHQUFFbHJDLEdBQUcsT0FBTyxJQUFJOHJDLEdBQUU5ckMsR0FDN2QsU0FBU212RSxHQUFHbnZFLEVBQUVDLEVBQUU1SyxHQUFHMkssRUFBRWl0QyxFQUFFNTNDLEVBQUVnM0UsR0FBR3BzRSxHQUFFLEdBQUlBLEVBQUVELEVBQUVpdEMsSUFBSWp0QyxFQUFFaXRDLEVBQUVqdEMsRUFBRWl0QyxFQUFFNXlDLFFBQVEsS0FBSyxLQUFNLFNBQVN3ekUsR0FBRzd0RSxFQUFFQyxFQUFFNUssR0FBRzJLLEVBQUVoTCxFQUFFSyxFQUFFZzNFLEdBQUdwc0UsR0FBRSxHQUFJQSxFQUFHLFNBQVNrd0UsR0FBR253RSxFQUFFQyxHQUFHLEdBQUdBLEVBQUUsQ0FBYSxHQUFaQSxFQUFFb0wsT0FBT3BMLEdBQU1xTCxNQUFNckwsSUFBSSxFQUFFQSxFQUFFLE1BQU0vSCxNQUFNLG1CQUFtQitILEdBQUdELEVBQUU1SyxFQUFFNkssT0FBUUQsRUFBRTVLLEVBQUUsS0FBTSxTQUFTaTVFLEdBQUdydUUsRUFBRUMsRUFBRTVLLEdBQUc0SyxhQUFhd3RFLElBQUl6dEUsRUFBRWd1QyxFQUFFL3RDLEVBS3dHLFNBQVlELEVBQUVDLEdBQUdBLElBQUlELEVBQUVpdEMsSUFBSWdMLEdBQUVqNEMsR0FBR0EsRUFBRWhMLEVBQUUsS0FBS2dMLEVBQUVtdUMsRUFBRXJ0QyxTQUFRLFNBQVN6TCxFQUFFQyxHQUFHLElBQUlrRixFQUFFbEYsRUFBRThVLGNBQWM5VSxHQUFHa0YsSUFBSXdyRixHQUFHcnVGLEtBQUtyQyxHQUFHMjJFLEdBQUd0MEUsS0FBSzZDLEVBQUVuRixNQUFNMkssSUFBSUEsRUFBRWl0QyxFQUFFaHRDLEVBTHpPa3hFLENBQUdueEUsRUFBRWd1QyxFQUFFaHVDLEVBQUVtdUMsS0FBSzk0QyxJQUFJNEssRUFBRXF2RSxHQUFHcnZFLEVBQUU2dUUsS0FBSzl1RSxFQUFFZ3VDLEVBQUUsSUFBSXkvQixHQUFHeHRFLEVBQUVELEVBQUVtdUMsSUFBSyxTQUFTNEgsR0FBRS8xQyxFQUFFQyxFQUFFNUssR0FBRzJLLEVBQUVndUMsRUFBRXRuQyxJQUFJekcsRUFBRTVLLEdBQUksU0FBUzI2RSxHQUFHaHdFLEdBQXNJLE9BQW5JKzFDLEdBQUUvMUMsRUFBRSxLQUFLc0gsS0FBS3VuQixNQUFNLFdBQVd2bkIsS0FBS3NuQixVQUFVdnhCLFNBQVMsSUFBSWlLLEtBQUsyK0UsSUFBSTMrRSxLQUFLdW5CLE1BQU0sV0FBV3ZuQixLQUFLc25CLFVBQVU3ekIsS0FBSytSLE9BQU96UCxTQUFTLEtBQVkyQyxFQUM5VSxTQUFTcXNFLEdBQUdyc0UsRUFBRUMsR0FBRyxPQUFPRCxFQUFFQyxFQUFFaW1GLFVBQVVsbUYsRUFBRTNGLFFBQVEsT0FBTyxVQUFVOEcsbUJBQW1CbkIsR0FBRyxHQUFHLFNBQVNzdkUsR0FBR3R2RSxFQUFFQyxFQUFFNUssR0FBRyxNQUFPLGlCQUFrQjJLLEdBQUdBLEVBQUVtbUYsVUFBVW5tRixHQUFHM0YsUUFBUTRGLEVBQUVtbUYsSUFBSS93RixJQUFJMkssRUFBRUEsRUFBRTNGLFFBQVEsdUJBQXVCLFFBQVEyRixHQUFHLEtBQUssU0FBU29tRixHQUFHcG1GLEdBQXFCLE1BQU8sTUFBekJBLEVBQUVBLEVBQUU1SSxXQUFXLEtBQWtCLEVBQUUsSUFBSWlHLFNBQVMsS0FBTyxHQUFGMkMsR0FBTTNDLFNBQVMsSUFGN2N5dUMsR0FBRWwxQyxVQUFVeUcsU0FBUyxXQUFXLElBQUkyQyxFQUFFLEdBQUdDLEVBQUV0SSxLQUFLczFDLEVBQUVodEMsR0FBR0QsRUFBRWpILEtBQUt1MkUsR0FBR3J2RSxFQUFFbXVFLElBQUcsR0FBSSxLQUFLLElBQUkvNEUsRUFBRXNDLEtBQUszQyxFQUF1VixPQUFsVkssR0FBRyxRQUFRNEssS0FBRUQsRUFBRWpILEtBQUssT0FBT2tILEVBQUV0SSxLQUFLWixJQUFJaUosRUFBRWpILEtBQUt1MkUsR0FBR3J2RSxFQUFFbXVFLElBQUcsR0FBSSxLQUFLcHVFLEVBQUVqSCxLQUFLaUksbUJBQW1CMUgsT0FBT2pFLElBQUlnRixRQUFRLHVCQUF1QixRQUFpQixPQUFUaEYsRUFBRXNDLEtBQUt2QyxJQUFXNEssRUFBRWpILEtBQUssSUFBSU8sT0FBT2pFLE1BQU9BLEVBQUVzQyxLQUFLMUMsS0FBRTBDLEtBQUszQyxHQUFHLEtBQUtLLEVBQUV5RSxPQUFPLElBQUlrRyxFQUFFakgsS0FBSyxLQUFLaUgsRUFBRWpILEtBQUt1MkUsR0FBR2o2RSxFQUFFLEtBQUtBLEVBQUV5RSxPQUFPLEdBQUd3MkUsR0FBR1AsSUFBRyxNQUFNMTZFLEVBQUVzQyxLQUFLcTJDLEVBQUUzd0MsYUFBYTJDLEVBQUVqSCxLQUFLLElBQUkxRCxJQUFJQSxFQUFFc0MsS0FBS2xDLElBQUl1SyxFQUFFakgsS0FBSyxJQUFJdTJFLEdBQUdqNkUsRUFBRTI3RSxLQUFZaHhFLEVBQUVoSCxLQUFLLEtBRzdiLElBQUlvMUUsR0FBRyxZQUFZMkIsR0FBRyxVQUFVTyxHQUFHLFNBQVN4QixHQUFHLFVBQVVrQyxHQUFHLEtBQUssU0FBU3ZELEdBQUd6dEUsRUFBRUMsR0FBR3RJLEtBQUtxMkMsRUFBRXIyQyxLQUFLdzJDLEVBQUUsS0FBS3gyQyxLQUFLM0MsRUFBRWdMLEdBQUcsS0FBS3JJLEtBQUtzMUMsSUFBSWh0QyxFQUFHLFNBQVNnNEMsR0FBRWo0QyxHQUFHQSxFQUFFbXVDLElBQUludUMsRUFBRW11QyxFQUFFLElBQUl6RCxHQUFFMXFDLEVBQUVndUMsRUFBRSxFQUFFaHVDLEVBQUVoTCxHQUorQixTQUFZZ0wsRUFBRUMsR0FBRyxHQUFHRCxFQUFFLENBQUNBLEVBQUVBLEVBQUVrQixNQUFNLEtBQUssSUFBSSxJQUFJN0wsRUFBRSxFQUFFQSxFQUFFMkssRUFBRTdJLE9BQU85QixJQUFJLENBQUMsSUFBSUMsRUFBRTBLLEVBQUUzSyxHQUFHNEksUUFBUSxLQUFLekQsRUFBRSxLQUFLLEdBQUcsR0FBR2xGLEVBQUUsQ0FBQyxJQUFJd3VFLEVBQUU5akUsRUFBRTNLLEdBQUdtTSxVQUFVLEVBQUVsTSxHQUFHa0YsRUFBRXdGLEVBQUUzSyxHQUFHbU0sVUFBVWxNLEVBQUUsUUFBU3d1RSxFQUFFOWpFLEVBQUUzSyxHQUFHNEssRUFBRTZqRSxFQUFFdHBFLEVBQUUyRyxtQkFBbUIzRyxFQUFFSCxRQUFRLE1BQU0sTUFBTSxNQUlsUG0wRSxDQUFHeHVFLEVBQUVoTCxHQUFFLFNBQVNpTCxFQUFFNUssR0FBRzJLLEVBQUUrYixJQUFJNWEsbUJBQW1CbEIsRUFBRTVGLFFBQVEsTUFBTSxNQUFNaEYsT0FDN08sU0FBUzJ3RixHQUFHaG1GLEVBQUVDLEdBQUdnNEMsR0FBRWo0QyxHQUFHQyxFQUFFa3RDLEdBQUVudEMsRUFBRUMsR0FBRzB1QyxHQUFFM3VDLEVBQUVtdUMsRUFBRUgsRUFBRS90QyxLQUFLRCxFQUFFaEwsRUFBRSxLQUFLZ0wsRUFBRWd1QyxHQUFHaHVDLEVBQUVtdUMsRUFBRXQ0QyxJQUFJb0ssR0FBRzlJLE9BQWF3M0MsSUFBTjN1QyxFQUFFQSxFQUFFbXVDLEdBQU1ILEVBQUUvdEMsWUFBWUQsRUFBRWd1QyxFQUFFL3RDLEdBQUdELEVBQUVoTCxJQUFJZ0wsRUFBRW11QyxFQUFFaDNDLE9BQU8sRUFBRTZJLEVBQUVoTCxHQUFHMDZFLEdBQUcxdkUsS0FBTSxTQUFTcW1GLEdBQUdybUYsRUFBRUMsR0FBaUIsT0FBZGc0QyxHQUFFajRDLEdBQUdDLEVBQUVrdEMsR0FBRW50QyxFQUFFQyxHQUFVMHVDLEdBQUUzdUMsRUFBRW11QyxFQUFFSCxFQUFFL3RDLEdBQ3lNLFNBQVNnc0UsR0FBR2pzRSxFQUFFQyxFQUFFNUssR0FBRzJ3RixHQUFHaG1GLEVBQUVDLEdBQUcsRUFBRTVLLEVBQUU4QixTQUFTNkksRUFBRWhMLEVBQUUsS0FBS2dMLEVBQUVtdUMsRUFBRXpuQyxJQUFJeW1DLEdBQUVudEMsRUFBRUMsR0FBR3NrRSxFQUFHbHZFLElBQUkySyxFQUFFZ3VDLEdBQUczNEMsRUFBRThCLFFBQ3pLLFNBQVNnMkMsR0FBRW50QyxFQUFFQyxHQUF3QyxPQUFyQ0EsRUFBRTNHLE9BQU8yRyxHQUFHRCxFQUFFaXRDLElBQUlodEMsRUFBRUEsRUFBRW1LLGVBQXNCbkssR0FIL0dJLEVBQUVvdEUsR0FBRzcyRSxXQUFZbWxCLElBQUksU0FBUy9iLEVBQUVDLEdBQUdnNEMsR0FBRXRnRCxNQUFNQSxLQUFLM0MsRUFBRSxLQUFLZ0wsRUFBRW10QyxHQUFFeDFDLEtBQUtxSSxHQUFHLElBQUkzSyxFQUFFc0MsS0FBS3cyQyxFQUFFdDRDLElBQUltSyxHQUE2QyxPQUExQzNLLEdBQUdzQyxLQUFLdzJDLEVBQUV6bkMsSUFBSTFHLEVBQUUzSyxFQUFFLElBQUlBLEVBQUUwRCxLQUFLa0gsR0FBR3RJLEtBQUtxMkMsR0FBRyxFQUFTcjJDLE1BQ2hNMEksRUFBRVMsUUFBUSxTQUFTZCxFQUFFQyxHQUFHZzRDLEdBQUV0Z0QsTUFBTUEsS0FBS3cyQyxFQUFFcnRDLFNBQVEsU0FBU3pMLEVBQUVDLEdBQUcydUUsRUFBRzV1RSxHQUFFLFNBQVNtRixHQUFHd0YsRUFBRTdLLEtBQUs4SyxFQUFFekYsRUFBRWxGLEVBQUVxQyxRQUFRQSxRQUFRQSxPQUFRMEksRUFBRXN1QyxFQUFFLFdBQVdzSixHQUFFdGdELE1BQU0sSUFBSSxJQUFJcUksRUFBRXJJLEtBQUt3MkMsRUFBRTRILElBQUk5MUMsRUFBRXRJLEtBQUt3MkMsRUFBRVEsSUFBSXQ1QyxFQUFFLEdBQUdDLEVBQUUsRUFBRUEsRUFBRTJLLEVBQUU5SSxPQUFPN0IsSUFBSSxJQUFJLElBQUlrRixFQUFFd0YsRUFBRTFLLEdBQUd3dUUsRUFBRSxFQUFFQSxFQUFFdHBFLEVBQUVyRCxPQUFPMnNFLElBQUl6dUUsRUFBRTBELEtBQUtrSCxFQUFFM0ssSUFBSSxPQUFPRCxHQUN2YmdMLEVBQUUwMUMsRUFBRSxTQUFTLzFDLEdBQUdpNEMsR0FBRXRnRCxNQUFNLElBQUlzSSxFQUFFLEdBQUcsR0FBRyxpQkFBa0JELEVBQUVxbUYsR0FBRzF1RixLQUFLcUksS0FBS0MsRUFBRW9vRSxFQUFHcG9FLEVBQUV0SSxLQUFLdzJDLEVBQUV0NEMsSUFBSXMzQyxHQUFFeDFDLEtBQUtxSSxVQUFXLENBQUNBLEVBQUVySSxLQUFLdzJDLEVBQUU0SCxJQUFJLElBQUksSUFBSTFnRCxFQUFFLEVBQUVBLEVBQUUySyxFQUFFN0ksT0FBTzlCLElBQUk0SyxFQUFFb29FLEVBQUdwb0UsRUFBRUQsRUFBRTNLLElBQUssT0FBTzRLLEdBQUdJLEVBQUVxRyxJQUFJLFNBQVMxRyxFQUFFQyxHQUEwRyxPQUF2R2c0QyxHQUFFdGdELE1BQU1BLEtBQUszQyxFQUFFLEtBQWlCcXhGLEdBQUcxdUYsS0FBZnFJLEVBQUVtdEMsR0FBRXgxQyxLQUFLcUksTUFBZ0JySSxLQUFLcTJDLEdBQUdyMkMsS0FBS3cyQyxFQUFFdDRDLElBQUltSyxHQUFHN0ksUUFBUVEsS0FBS3cyQyxFQUFFem5DLElBQUkxRyxFQUFFLENBQUNDLElBQUl0SSxLQUFLcTJDLEdBQUcsRUFBU3IyQyxNQUFNMEksRUFBRXhLLElBQUksU0FBU21LLEVBQUVDLEdBQUcsT0FBSUQsR0FBOEIsR0FBbkJBLEVBQUVySSxLQUFLbytDLEVBQUUvMUMsSUFBYzdJLE9BQU9tQyxPQUFPMEcsRUFBRSxJQUF6Q0MsR0FDblZJLEVBQUVoRCxTQUFTLFdBQVcsR0FBRzFGLEtBQUszQyxFQUFFLE9BQU8yQyxLQUFLM0MsRUFBRSxJQUFJMkMsS0FBS3cyQyxFQUFFLE1BQU8sR0FBRyxJQUFJLElBQUludUMsRUFBRSxHQUFHQyxFQUFFdEksS0FBS3cyQyxFQUFFUSxJQUFJdDVDLEVBQUUsRUFBRUEsRUFBRTRLLEVBQUU5SSxPQUFPOUIsSUFBSSxDQUFDLElBQUlDLEVBQUUySyxFQUFFNUssR0FBR21GLEVBQUV3RyxtQkFBbUIxSCxPQUFPaEUsSUFBSUEsRUFBRXFDLEtBQUtvK0MsRUFBRXpnRCxHQUFHLElBQUksSUFBSXd1RSxFQUFFLEVBQUVBLEVBQUV4dUUsRUFBRTZCLE9BQU8yc0UsSUFBSSxDQUFDLElBQUk5MUIsRUFBRXh6QyxFQUFFLEtBQUtsRixFQUFFd3VFLEtBQUs5MUIsR0FBRyxJQUFJaHRDLG1CQUFtQjFILE9BQU9oRSxFQUFFd3VFLE1BQU05akUsRUFBRWpILEtBQUtpMUMsSUFBSyxPQUFPcjJDLEtBQUszQyxFQUFFZ0wsRUFBRWhILEtBQUssTUFBNlAsU0FBU3N0RixHQUFHdG1GLEdBQUdySSxLQUFLMUMsRUFBRStLLEdBQUd1bUYsR0FBR3R4RixFQUFFdXhGLDRCQUE0RXhtRixFQUFFLEdBQWpEQSxFQUFFL0ssRUFBRXd4RixZQUFZQyxpQkFBaUIsZUFBb0J2dkYsU0FBUyxNQUFNNkksRUFBRSxHQUFHMm1GLGlCQUFpQixNQUFNM21GLEVBQUUsR0FBRzJtRixpQkFBa0IzbUYsS0FBSy9LLEVBQUVrNUMsR0FBR2w1QyxFQUFFazVDLEVBQUV1M0IsSUFBSXp3RSxFQUFFazVDLEVBQUV1M0IsTUFBTXp3RSxFQUFFazVDLEVBQUV1M0IsS0FBSzhmLElBQUk3dEYsS0FBS3MxQyxFQUFFanRDLEVBQUVySSxLQUFLMUMsRUFBRSxFQUFFMEMsS0FBS3cyQyxFQUFFLEtBQUssRUFBRXgyQyxLQUFLczFDLElBQUl0MUMsS0FBS3cyQyxFQUFFLElBQUl6ckIsS0FBSy9xQixLQUFLcTJDLEVBQUUsS0FBS3IyQyxLQUFLM0MsRUFBRSxHQUFJLElBQUl1eEYsR0FBRyxHQUFHLFNBQVN6b0YsR0FBR2tDLEdBQUcsUUFBT0EsRUFBRWd1QyxLQUFLaHVDLEVBQUVtdUMsR0FBRW51QyxFQUFFbXVDLEVBQUV0aEIsTUFBTTdzQixFQUFFaXRDLEVBQUssU0FBU3NoQyxHQUFHdnVFLEdBQUcsT0FBT0EsRUFBRWd1QyxFQUFFLEVBQUVodUMsRUFBRW11QyxFQUFFbnVDLEVBQUVtdUMsRUFBRXRoQixLQUFLLEVBQUUsU0FBU3MvQyxHQUFHbnNFLEVBQUVDLEdBQUcsT0FBT0QsRUFBRWd1QyxFQUFFaHVDLEVBQUVndUMsR0FBRy90QyxJQUFFRCxFQUFFbXVDLEdBQUVudUMsRUFBRW11QyxFQUFFanJCLElBQUlqakIsR0FBTSxTQUFTcXVFLEdBQUd0dUUsRUFBRUMsR0FBR0QsRUFBRW11QyxFQUFFbnVDLEVBQUVtdUMsRUFBRXB5QixJQUFJOWIsR0FBR0QsRUFBRWd1QyxFQUFFL3RDLEVBQzFnQyxTQUFTaXZFLEdBQUdsdkUsRUFBRUMsR0FBR0QsRUFBRWd1QyxHQUFHaHVDLEVBQUVndUMsR0FBRy90QyxFQUFFRCxFQUFFZ3VDLEVBQUUsS0FBS2h1QyxFQUFFbXVDLEdBQUdudUMsRUFBRW11QyxFQUFFanJCLElBQUlqakIsSUFBSUQsRUFBRW11QyxFQUFFdmhCLE9BQU8zc0IsR0FBc0wsU0FBUzJtRixHQUFHNW1GLEdBQUcsR0FBRyxNQUFNQSxFQUFFZ3VDLEVBQUUsT0FBT2h1QyxFQUFFaEwsRUFBRTh2RCxPQUFPOWtELEVBQUVndUMsRUFBRXJELEdBQUcsR0FBRyxNQUFNM3FDLEVBQUVtdUMsR0FBRyxJQUFJbnVDLEVBQUVtdUMsRUFBRXRoQixLQUFLLENBQUMsSUFBSTVzQixFQUFFRCxFQUFFaEwsRUFBRSxJQUFJLE1BQU1LLEtBQUsySyxFQUFFbXVDLEVBQUVtRixTQUFTcnpDLEVBQUVBLEVBQUU2a0QsT0FBT3p2RCxFQUFFczFDLEdBQUcsT0FBTzFxQyxFQUFFLE9BQU9za0UsRUFBR3ZrRSxFQUFFaEwsR0FBRyxTQUFTNnhGLE1BQTBJLFNBQVNDLEtBQUtudkYsS0FBS3cyQyxFQUFFLElBQUkwNEMsR0FBSSxTQUFTRSxHQUFHL21GLEVBQUVDLEVBQUU1SyxHQUFHLE1BQU1DLEVBQUVELEdBQUcsR0FBRyxJQUFJNDZFLEdBQUdqd0UsR0FBRSxTQUFTeEYsRUFBRXNwRSxHQUFHLElBQUk5MUIsRUFBRXh6QyxFQUFFMUQsRUFBRTBELEtBQUt3ekMsRUFBRTAxQyxHQUFHbHBGLElBQUl5RixFQUFFbEgsS0FBS3pELEVBQUV3dUUsRUFBRSxJQUFJOWlFLG1CQUFtQmd0QyxPQUFRLE1BQU14ekMsR0FBRyxNQUFNeUYsRUFBRWxILEtBQUt6RCxFQUFFLFFBQVEwTCxtQkFBbUIsWUFBWXhHLEdBQTJWLFNBQVN3c0YsR0FBR2huRixFQUFFQyxFQUFFNUssRUFBRUMsRUFBRWtGLEdBQUcsSUFBSXlGLEVBQUVrekIsT0FBTyxLQUFLbHpCLEVBQUVtekIsUUFBUSxLQUFLbnpCLEVBQUU4cEQsUUFBUSxLQUFLOXBELEVBQUV3L0IsVUFBVSxLQUFLamxDLEVBQUVsRixHQUFJLE1BQU13dUUsS0FBSyxTQUFTN2dELEdBQUdqakIsR0FBR3JJLEtBQUsxQyxFQUFFK0ssRUFBRXlsRixJQUFJLEtBQUs5dEYsS0FBS3MxQyxFQUFFanRDLEVBQUU2aUYsS0FBSSxFQUFpSSxTQUFTb0UsR0FBR2puRixFQUFFQyxHQUFHZ3JDLEdBQUU5MUMsS0FBS3dDLE1BQU1BLEtBQUtnekMsRUFBRTNxQyxFQUFFckksS0FBSzhCLEVBQUV3RyxFQUFFdEksS0FBS3ZDLE9BQUUsRUFBT3VDLEtBQUt1a0IsV0FBV2dyRSxHQUFHdnZGLEtBQUtzMkIsT0FBTyxFQUFFdDJCLEtBQUt3dkYsYUFBYXh2RixLQUFLeXZGLGFBQWF6dkYsS0FBSytSLFNBQVMvUixLQUFLMHZGLFdBQVcsR0FBRzF2RixLQUFLMnZGLG1CQUFtQixLQUFLM3ZGLEtBQUtxbUMsRUFBRSxJQUFJOTFCLFFBQVF2USxLQUFLcTJDLEVBQUUsS0FBS3IyQyxLQUFLc3pDLEVBQUUsTUFBTXR6QyxLQUFLazBDLEVBQUUsR0FBR2wwQyxLQUFLdzJDLEdBQUUsRUFBR3gyQyxLQUFLbXlFLEVBQUVueUUsS0FBS3MxQyxFQUFFdDFDLEtBQUsxQyxFQUFFLEtBQW5rRHF4RixHQUFHMXZGLFVBQVVva0MsT0FBTyxXQUEyQixHQUFoQnJqQyxLQUFLM0MsRUFBRTR4RixHQUFHanZGLE1BQVNBLEtBQUtxMkMsRUFBRXIyQyxLQUFLcTJDLEVBQUVoVCxTQUFTcmpDLEtBQUtxMkMsRUFBRSxVQUFVLEdBQUdyMkMsS0FBS3cyQyxHQUFHLElBQUl4MkMsS0FBS3cyQyxFQUFFdGhCLEtBQUssQ0FBQyxJQUFJLE1BQU03c0IsS0FBS3JJLEtBQUt3MkMsRUFBRW1GLFNBQVN0ekMsRUFBRWc3QixTQUFTcmpDLEtBQUt3MkMsRUFBRXJRLFVBQXlMK29ELEdBQUdqd0YsVUFBVWdHLFVBQVUsU0FBU29ELEdBQUcsT0FBTy9LLEVBQUUwSCxLQUFLQyxVQUFVb0QsT0FBRSxJQUFTNm1GLEdBQUdqd0YsVUFBVWtWLE1BQU0sU0FBUzlMLEdBQUcsT0FBTy9LLEVBQUUwSCxLQUFLbVAsTUFBTTlMLE9BQUUsSUFBcXRCOUosRUFBRStzQixHQUFHc2lFLElBQUl0aUUsR0FBR3JzQixVQUFVdTNDLEVBQUUsV0FBVyxPQUFPLElBQUk4NEMsR0FBR3R2RixLQUFLMUMsRUFBRTBDLEtBQUtzMUMsSUFBSWhxQixHQUFHcnNCLFVBQVU1QixFQUFFLFNBQVNnTCxHQUFHLE9BQU8sV0FBVyxPQUFPQSxHQUFyQyxDQUF5QyxJQUFnUzlKLEVBQUUrd0YsR0FBR2g4QyxJQUFHLElBQUlpOEMsR0FBRyxFQUlyaEQsU0FBU0ssR0FBR3ZuRixHQUFHQSxFQUFFaXRDLEVBQUUyN0IsT0FBT3htRSxLQUFLcEMsRUFBRTJtRSxHQUFHbndFLEtBQUt3SixJQUFJdkUsTUFBTXVFLEVBQUVzbEUsR0FBRzl1RSxLQUFLd0osSUFDckMsU0FBU3duRixHQUFHeG5GLEdBQUdBLEVBQUVrYyxXQUFXLEVBQUVsYyxFQUFFL0ssRUFBRSxLQUFLK0ssRUFBRWl0QyxFQUFFLEtBQUtqdEMsRUFBRThwRSxFQUFFLEtBQUsyZCxHQUFHem5GLEdBQ3hDLFNBQVN5bkYsR0FBR3puRixHQUFHQSxFQUFFc25GLG9CQUFvQnRuRixFQUFFc25GLG1CQUFtQm55RixLQUFLNkssSUFONDZDSyxFQUFFNG1GLEdBQUdyd0YsV0FDbnFEdzVCLEtBQUssU0FBU3B3QixFQUFFQyxHQUFHLEdBQUd0SSxLQUFLdWtCLFlBQVlnckUsR0FBRyxNQUFNdnZGLEtBQUt1eUQsUUFBUWh5RCxNQUFNLGdDQUFnQ1AsS0FBS3N6QyxFQUFFanJDLEVBQUVySSxLQUFLazBDLEVBQUU1ckMsRUFBRXRJLEtBQUt1a0IsV0FBVyxFQUFFdXJFLEdBQUc5dkYsT0FBUTBJLEVBQUVzakMsS0FBSyxTQUFTM2pDLEdBQUcsR0FBRyxHQUFHckksS0FBS3VrQixXQUFXLE1BQU12a0IsS0FBS3V5RCxRQUFRaHlELE1BQU0sK0JBQStCUCxLQUFLdzJDLEdBQUUsRUFBRyxNQUFNbHVDLEVBQUUsQ0FBQytJLFFBQVFyUixLQUFLcW1DLEVBQUVwN0IsT0FBT2pMLEtBQUtzekMsRUFBRXVoQyxZQUFZNzBFLEtBQUt2QyxFQUFFc3lGLFdBQU0sR0FBUTFuRixJQUFJQyxFQUFFNEksS0FBSzdJLElBQUlySSxLQUFLZ3pDLEdBQUcxMUMsR0FBR2dULE1BQU0sSUFBSTAvRSxRQUFRaHdGLEtBQUtrMEMsRUFBRTVyQyxJQUFJbUMsS0FBS3pLLEtBQUtrd0UsR0FBR3J4RSxLQUFLbUIsTUFBTUEsS0FBSzJ0RSxHQUFHOXVFLEtBQUttQixRQUNsYTBJLEVBQUU2cEQsTUFBTSxXQUFXdnlELEtBQUsrUixTQUFTL1IsS0FBS3l2RixhQUFhLEdBQUd6dkYsS0FBS3FtQyxFQUFFLElBQUk5MUIsUUFBUXZRLEtBQUtzMkIsT0FBTyxFQUFFdDJCLEtBQUtzMUMsR0FBR3QxQyxLQUFLczFDLEVBQUVqUyxPQUFPLHdCQUF3QixHQUFHcmpDLEtBQUt1a0IsWUFBWXZrQixLQUFLdzJDLEdBQUcsR0FBR3gyQyxLQUFLdWtCLGFBQWF2a0IsS0FBS3cyQyxHQUFFLEVBQUdxNUMsR0FBRzd2RixPQUFPQSxLQUFLdWtCLFdBQVdnckUsSUFDMU43bUYsRUFBRXduRSxHQUFHLFNBQVM3bkUsR0FBRyxHQUFHckksS0FBS3cyQyxJQUFJeDJDLEtBQUsxQyxFQUFFK0ssRUFBRXJJLEtBQUtxMkMsSUFBSXIyQyxLQUFLczJCLE9BQU90MkIsS0FBSzFDLEVBQUVnNUIsT0FBT3QyQixLQUFLMHZGLFdBQVcxdkYsS0FBSzFDLEVBQUVveUYsV0FBVzF2RixLQUFLcTJDLEVBQUVodUMsRUFBRWdKLFFBQVFyUixLQUFLdWtCLFdBQVcsRUFBRXVyRSxHQUFHOXZGLE9BQU9BLEtBQUt3MkMsSUFBSXgyQyxLQUFLdWtCLFdBQVcsRUFBRXVyRSxHQUFHOXZGLE1BQU1BLEtBQUt3MkMsSUFBSSxHQUFHLGdCQUFnQngyQyxLQUFLd3ZGLGFBQWFubkYsRUFBRTRuRixjQUFjeGxGLEtBQUt6SyxLQUFLd3VFLEdBQUczdkUsS0FBS21CLE1BQU1BLEtBQUsydEUsR0FBRzl1RSxLQUFLbUIsWUFBWSxRQUFHLElBQXFCMUMsRUFBRW8yRSxnQkFBZ0IsU0FBU3JyRSxFQUFFLENBQTJCLEdBQTFCckksS0FBS3MxQyxFQUFFanRDLEVBQUU2SSxLQUFLeWlFLFlBQWUzekUsS0FBSzhCLEVBQUUsQ0FBQyxHQUFHOUIsS0FBS3d2RixhQUFhLE1BQU1qdkYsTUFBTSx1RUFBdUVQLEtBQUsrUixTQUNuZixRQUFTL1IsS0FBSytSLFNBQVMvUixLQUFLeXZGLGFBQWEsR0FBR3p2RixLQUFLbXlFLEVBQUUsSUFBSXRCLFlBQVkrZSxHQUFHNXZGLFdBQVlxSSxFQUFFNm5GLE9BQU96bEYsS0FBS3pLLEtBQUt5d0UsR0FBRzV4RSxLQUFLbUIsTUFBTUEsS0FBSzJ0RSxHQUFHOXVFLEtBQUttQixRQUEyRTBJLEVBQUVzbUUsR0FBRyxTQUFTM21FLEdBQUcsR0FBR3JJLEtBQUt3MkMsRUFBRSxDQUFDLEdBQUd4MkMsS0FBSzhCLEdBQUd1RyxFQUFFL0osTUFBTTBCLEtBQUsrUixTQUFTM1EsS0FBS2lILEVBQUUvSixZQUFZLElBQUkwQixLQUFLOEIsRUFBRSxDQUFDLElBQUl3RyxFQUFFRCxFQUFFL0osTUFBTStKLEVBQUUvSixNQUFNLElBQUlvd0MsV0FBVyxJQUFNcG1DLEVBQUV0SSxLQUFLbXlFLEVBQUVyQixPQUFPeG9FLEVBQUUsQ0FBQ3E5RCxRQUFRdDlELEVBQUVrckQsVUFBT3Z6RCxLQUFLK1IsU0FBUy9SLEtBQUt5dkYsY0FBY25uRixHQUFHRCxFQUFFa3JELEtBQUtzOEIsR0FBRzd2RixNQUFNOHZGLEdBQUc5dkYsTUFBTSxHQUFHQSxLQUFLdWtCLFlBQVlxckUsR0FBRzV2RixRQUMxYzBJLEVBQUUrbkUsR0FBRyxTQUFTcG9FLEdBQUdySSxLQUFLdzJDLElBQUl4MkMsS0FBSytSLFNBQVMvUixLQUFLeXZGLGFBQWFwbkYsRUFBRXduRixHQUFHN3ZGLFFBQVMwSSxFQUFFOGxFLEdBQUcsU0FBU25tRSxHQUFHckksS0FBS3cyQyxJQUFJeDJDLEtBQUsrUixTQUFTMUosRUFBRXduRixHQUFHN3ZGLFFBQVMwSSxFQUFFaWxFLEdBQUcsV0FBVzN0RSxLQUFLdzJDLEdBQUdxNUMsR0FBRzd2RixPQUF3RTBJLEVBQUV5bkYsaUJBQWlCLFNBQVM5bkYsRUFBRUMsR0FBR3RJLEtBQUtxbUMsRUFBRStwRCxPQUFPL25GLEVBQUVDLElBQUtJLEVBQUV3bEYsa0JBQWtCLFNBQVM3bEYsR0FBRyxPQUFPckksS0FBS3EyQyxHQUFFcjJDLEtBQUtxMkMsRUFBRW40QyxJQUFJbUssRUFBRW9LLGdCQUFtQixJQUNyVy9KLEVBQUUybkYsc0JBQXNCLFdBQVcsSUFBSXJ3RixLQUFLcTJDLEVBQUUsTUFBTyxHQUFHLE1BQU1odUMsRUFBRSxHQUFHQyxFQUFFdEksS0FBS3EyQyxFQUFFbnRDLFVBQVUsSUFBSSxJQUFJeEwsRUFBRTRLLEVBQUVzQyxRQUFRbE4sRUFBRTYxRCxNQUFNNzFELEVBQUVBLEVBQUVZLE1BQU0rSixFQUFFakgsS0FBSzFELEVBQUUsR0FBRyxLQUFLQSxFQUFFLElBQUlBLEVBQUU0SyxFQUFFc0MsT0FBTyxPQUFPdkMsRUFBRWhILEtBQUssU0FBNEV0RCxPQUFPQyxlQUFlc3hGLEdBQUdyd0YsVUFBVSxrQkFBa0IsQ0FBQ2YsSUFBSSxXQUFXLE1BQU8sWUFBWThCLEtBQUt2QyxHQUFHc1IsSUFBSSxTQUFTMUcsR0FBR3JJLEtBQUt2QyxFQUFFNEssRUFBRSxVQUFVLGlCQUFrQixJQUFJaW9GLEdBQUdoekYsRUFBRTBILEtBQUttUCxNQUFNLFNBQVNtaUMsR0FBRWp1QyxHQUFHaXJDLEdBQUU5MUMsS0FBS3dDLE1BQU1BLEtBQUtxUixRQUFRLElBQUkwaEMsR0FBRS95QyxLQUFLOEIsRUFBRXVHLEdBQUcsS0FBS3JJLEtBQUtxMkMsR0FBRSxFQUFHcjJDLEtBQUtzekMsRUFBRXR6QyxLQUFLdzJDLEVBQUUsS0FBS3gyQyxLQUFLb25DLEVBQUUsR0FBR3BuQyxLQUFLdkMsRUFBRSxFQUFFdUMsS0FBS3MxQyxFQUFFLEdBQUd0MUMsS0FBSzFDLEVBQUUwQyxLQUFLOHpDLEVBQUU5ekMsS0FBS3FtQyxFQUFFcm1DLEtBQUtnekMsR0FBRSxFQUFHaHpDLEtBQUtrMEMsRUFBRSxFQUFFbDBDLEtBQUtteUUsRUFBRSxLQUFLbnlFLEtBQUtrMkMsRUFBRXE2QyxHQUFHdndGLEtBQUtxMEMsRUFBRXIwQyxLQUFLc25DLEdBQUUsRUFBSS9vQyxFQUFFKzNDLEdBQUVoRCxJQUFHLElBQUlpOUMsR0FBRyxHQUFHQyxHQUFHLFlBQVlDLEdBQUcsQ0FBQyxPQUFPLE9BR2xrQixTQUFTeGpCLEdBQUc1a0UsR0FBRyxNQUFPLGdCQUFnQkEsRUFBRW9LLGNBQTZKLFNBQVNpK0UsR0FBR3JvRixFQUFFQyxHQUFHRCxFQUFFZ3VDLEdBQUUsRUFBR2h1QyxFQUFFbXVDLElBQUludUMsRUFBRS9LLEdBQUUsRUFBRytLLEVBQUVtdUMsRUFBRStiLFFBQVFscUQsRUFBRS9LLEdBQUUsR0FBSStLLEVBQUVpdEMsRUFBRWh0QyxFQUFFRCxFQUFFNUssRUFBRSxFQUFFa3pGLEdBQUd0b0YsR0FBR3VvRixHQUFHdm9GLEdBQUksU0FBU3NvRixHQUFHdG9GLEdBQUdBLEVBQUUycUMsSUFBSTNxQyxFQUFFMnFDLEdBQUUsRUFBR0EsR0FBRTNxQyxFQUFFLFlBQVkycUMsR0FBRTNxQyxFQUFFLFVBRXhaLFNBQVN3b0YsR0FBR3hvRixHQUFHLEdBQUdBLEVBQUVndUMsUUFBRyxJQUFvQnF5QyxLQUFRcmdGLEVBQUVpckMsRUFBRSxJQUFJLEdBQUdTLEdBQUUxckMsSUFBSSxHQUFHQSxFQUFFeW1FLE1BQU0sR0FBR3ptRSxFQUFFZytCLEdBQUcsR0FBRzBOLEdBQUUxckMsR0FBR3VrRixHQUFHdmtGLEVBQUU2ckUsR0FBRyxFQUFFN3JFLFFBQVEsR0FBRzJxQyxHQUFFM3FDLEVBQUUsb0JBQW9CLEdBQUcwckMsR0FBRTFyQyxHQUFHLENBQUNBLEVBQUVndUMsR0FBRSxFQUFHLElBQUksTUFBTXYzQyxFQUFFdUosRUFBRXltRSxLQUFLem1FLEVBQUUsT0FBT3ZKLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLElBQUl3SixHQUFFLEVBQUcsTUFBTUQsRUFBRSxRQUFRQyxHQUFFLEVBQUksSUFBSTVLLEVBQUUsS0FBS0EsRUFBRTRLLEdBQUcsQ0FBQyxJQUFJM0ssRUFBRSxHQUFHQSxFQUFFLElBQUltQixFQUFFLENBQUMsSUFBSStELEVBQUVsQixPQUFPMEcsRUFBRSsrQixHQUFHeHBCLE1BQU1nNkQsSUFBSSxJQUFJLEtBQUssSUFBSS8wRSxHQUFHdkYsRUFBRXdJLE1BQU14SSxFQUFFd0ksS0FBS29KLFNBQVMsQ0FBQyxJQUFJaTlELEVBQUU3dUUsRUFBRXdJLEtBQUtvSixTQUFTSSxTQUFTek0sRUFBRXNwRSxFQUFFenBELE9BQU8sRUFBRXlwRCxFQUFFM3NFLE9BQU8sR0FBSTdCLEdBQUc2eUYsR0FBR2hyRixLQUFLM0MsRUFBRUEsRUFBRTRQLGNBQWMsSUFBSy9VLEVBQUVDLEVBQUcsR0FBR0QsRUFBRXMxQyxHQUFFM3FDLEVBQUUsWUFBWTJxQyxHQUFFM3FDLEVBQ3pmLGVBQWdCLENBQUNBLEVBQUU1SyxFQUFFLEVBQUUsSUFBSSxJQUFJNDRDLEVBQUUsRUFBRXRDLEdBQUUxckMsR0FBR0EsRUFBRW11QyxFQUFFazVDLFdBQVcsR0FBSSxNQUFNNXRGLEdBQUd1MEMsRUFBRSxHQUFJaHVDLEVBQUVpdEMsRUFBRWUsRUFBRSxLQUFLaHVDLEVBQUV5bUUsS0FBSyxJQUFJNmhCLEdBQUd0b0YsSUFBSyxRQUFRdW9GLEdBQUd2b0YsS0FBTSxTQUFTdW9GLEdBQUd2b0YsRUFBRUMsR0FBRyxHQUFHRCxFQUFFbXVDLEVBQUUsQ0FBQ3M2QyxHQUFHem9GLEdBQUcsTUFBTTNLLEVBQUUySyxFQUFFbXVDLEVBQUU3NEMsRUFBRTBLLEVBQUVpckMsRUFBRSxHQUFHNDVCLEVBQUcsS0FBSzdrRSxFQUFFbXVDLEVBQUUsS0FBS251QyxFQUFFaXJDLEVBQUUsS0FBS2hyQyxHQUFHMHFDLEdBQUUzcUMsRUFBRSxTQUFTLElBQUkzSyxFQUFFaXlGLG1CQUFtQmh5RixFQUFHLE1BQU1rRixNQUFNLFNBQVNpdUYsR0FBR3pvRixHQUFHQSxFQUFFbXVDLEdBQUdudUMsRUFBRWdzQyxJQUFJaHNDLEVBQUVtdUMsRUFBRTFPLFVBQVUsTUFBTXovQixFQUFFOHBFLElBQUk3MEUsRUFBRTRWLGFBQWE3SyxFQUFFOHBFLEdBQUc5cEUsRUFBRThwRSxFQUFFLE1BQU8sU0FBU3ArQixHQUFFMXJDLEdBQUcsT0FBT0EsRUFBRW11QyxFQUFFbnVDLEVBQUVtdUMsRUFBRWp5QixXQUFXLEVBQ3pMLFNBQVNtOEQsR0FBR3I0RSxHQUFHLElBQUksSUFBSUEsRUFBRW11QyxFQUFFLE9BQU8sS0FBSyxHQUFHLGFBQWFudUMsRUFBRW11QyxFQUFFLE9BQU9udUMsRUFBRW11QyxFQUFFemtDLFNBQVMsT0FBTzFKLEVBQUU2dEMsR0FBRyxLQUFLcTZDLEdBQUcsSUFBSyxPQUFPLE9BQU9sb0YsRUFBRW11QyxFQUFFaTVDLGFBQWEsSUFBSyxjQUFjLEdBQUcsMkJBQTJCcG5GLEVBQUVtdUMsRUFBRSxPQUFPbnVDLEVBQUVtdUMsRUFBRXU2Qyx1QkFBdUIsT0FBTyxLQUFLLE1BQU16b0YsR0FBRyxPQUFPLE1BQ2xTLFNBQVMwb0YsR0FBRzNvRixFQUFFQyxFQUFFNUssR0FBRzJLLEVBQUUsQ0FBQyxJQUFJMUssS0FBS0QsRUFBRSxDQUFDLElBQUlDLEdBQUUsRUFBRyxNQUFNMEssRUFBRTFLLEdBQUUsRUFBSUEsSUFBSUQsRUFBL0ksU0FBWTJLLEdBQUcsSUFBSUMsRUFBRSxHQUFvRCxPQUFqRHVrRSxFQUFHeGtFLEdBQUUsU0FBUzNLLEVBQUVDLEdBQUcySyxHQUFHM0ssRUFBRTJLLEdBQUcsSUFBSUEsR0FBRzVLLEVBQUU0SyxHQUFHLFVBQWlCQSxFQUFpRTJvRixDQUFHdnpGLEdBQUcsaUJBQWtCMkssRUFBRyxNQUFNM0ssR0FBRzJMLG1CQUFtQjFILE9BQU9qRSxJQUFLMGdELEdBQUUvMUMsRUFBRUMsRUFBRTVLLElBQUssU0FBU3d6RixHQUFHN29GLEVBQUVDLEVBQUU1SyxHQUFHLE9BQU9BLEdBQUdBLEVBQUV5bUUsdUJBQXNCem1FLEVBQUV5bUUsc0JBQXNCOTdELElBQU1DLEVBQ3pYLFNBQVM2b0YsR0FBRzlvRixHQUFHckksS0FBSyt5RSxHQUFHLEVBQUUveUUsS0FBSzFDLEVBQUUsR0FBRzBDLEtBQUtxMkMsRUFBRSxJQUFJODJDLEdBQUdudEYsS0FBSzZ0RSxHQUFHN3RFLEtBQUsrc0UsR0FBRy9zRSxLQUFLOHpDLEVBQUU5ekMsS0FBS3cxQyxFQUFFeDFDLEtBQUt3MkMsRUFBRXgyQyxLQUFLdXNFLEdBQUd2c0UsS0FBS2d6QyxFQUFFaHpDLEtBQUtrdEUsR0FBR2x0RSxLQUFLbEMsRUFBRWtDLEtBQUtpL0MsRUFBRWovQyxLQUFLWixFQUFFLEtBQUtZLEtBQUtvekUsR0FBR3B6RSxLQUFLc2dELEVBQUUsRUFBRXRnRCxLQUFLbXpFLEdBQUcrZCxHQUFHLFlBQVcsRUFBRzdvRixHQUFHckksS0FBS3V6QyxFQUFFdnpDLEtBQUtxbUMsRUFBRXJtQyxLQUFLOEIsRUFBRTlCLEtBQUt2QyxFQUFFdUMsS0FBS3MxQyxFQUFFLEtBQUt0MUMsS0FBS3MyQyxHQUFFLEVBQUd0MkMsS0FBS3EzQyxFQUFFcjNDLEtBQUtpc0UsR0FBR2pzRSxLQUFLbTBDLEdBQUcsRUFBRW4wQyxLQUFLbzJDLEVBQUVwMkMsS0FBS215RSxFQUFFbnlFLEtBQUtzekMsRUFBRSxFQUFFdHpDLEtBQUs2dUUsR0FBR3FpQixHQUFHLG1CQUFtQixJQUFJN29GLEdBQUdySSxLQUFLc3ZFLEdBQUc0aEIsR0FBRyxtQkFBbUIsSUFBSTdvRixHQUFHckksS0FBS2t6RSxHQUFHZ2UsR0FBRywyQkFBMkIsRUFBRTdvRixHQUFHckksS0FBSzRzRSxHQUFHc2tCLEdBQUcsaUNBQWlDLElBQUk3b0YsR0FBR3JJLEtBQUswd0UsR0FBR3JvRSxHQUFHQSxFQUFFaThELHFCQUFnQixFQUFPdGtFLEtBQUttd0UsR0FBRzluRSxHQUFHQSxFQUFFdWxGLEtBQUksRUFDbmY1dEYsS0FBS3EwQyxPQUFFLEVBQU9yMEMsS0FBS29uQyxFQUFFLytCLEdBQUdBLEVBQUU2N0QseUJBQXdCLEVBQUdsa0UsS0FBS2syQyxFQUFFLEdBQUdsMkMsS0FBSzNDLEVBQUUsSUFBSXN4RixHQUFHdG1GLEdBQUdBLEVBQUUrb0Ysd0JBQXdCcHhGLEtBQUtrdkUsR0FBRyxJQUFJaWdCLEdBQUdudkYsS0FBS2t4RSxHQUFHN29FLEdBQUdBLEVBQUVncEYsZ0JBQWUsRUFBR3J4RixLQUFLNHVFLEdBQUd2bUUsR0FBR0EsRUFBRW9sRixLQUFJLEVBQUdwbEYsR0FBR0EsRUFBRXFtRSxJQUFJMXVFLEtBQUtxMkMsRUFBRXE0QixLQUFLcm1FLEdBQUdBLEVBQUU2NkQsbUJBQW1CbGpFLEtBQUtzMkMsR0FBRSxHQUFJdDJDLEtBQUswekMsR0FBRzF6QyxLQUFLa3hFLElBQUlseEUsS0FBS3MyQyxHQUFHanVDLEdBQUdBLEVBQUVnOEQsdUJBQXNCLEVBQUdya0UsS0FBS3F2RSxRQUFHLEVBQU9ydkUsS0FBSyt6QyxFQUFFLEVBQUUvekMsS0FBS3NuQyxHQUFFLEVBQUd0bkMsS0FBS2swQyxFQUFFLEtBQUtsMEMsS0FBS2t5RSxJQUFJN3BFLElBQUcsSUFBS0EsRUFBRXNsRixHQUM1VixTQUFTL1ksR0FBR3ZzRSxHQUFTLEdBQU5pcEYsR0FBR2pwRixHQUFNLEdBQUdBLEVBQUVvdEMsRUFBRSxDQUFDLElBQUludEMsRUFBRUQsRUFBRWk0QyxJQUFJNWlELEVBQUU2MUMsR0FBRWxyQyxFQUFFeXJDLEdBQUdzSyxHQUFFMWdELEVBQUUsTUFBTTJLLEVBQUU2dEMsR0FBR2tJLEdBQUUxZ0QsRUFBRSxNQUFNNEssR0FBRzgxQyxHQUFFMWdELEVBQUUsT0FBTyxhQUFhNnpGLEdBQUdscEYsRUFBRTNLLElBQUc0SyxFQUFFLElBQUlzckMsR0FBRXZyQyxFQUFFQSxFQUFFZ3VDLEVBQUUvdEMsT0FBRSxJQUFVK3JDLEVBQUUsRUFBRS9yQyxFQUFFKzlCLEVBQUVneUMsR0FBRzlrQyxHQUFFNzFDLElBQUlBLEdBQUUsRUFBR0osRUFBRStILFdBQVcvSCxFQUFFK0gsVUFBVW1zRixhQUFhOXpGLEVBQUVKLEVBQUUrSCxVQUFVbXNGLFdBQVdscEYsRUFBRSs5QixFQUFFM2dDLFdBQVcsTUFBTWhJLEdBQUdKLEVBQUVtMEYsU0FBUSxJQUFLQSxPQUFPL0csSUFBSXBpRixFQUFFKzlCLEVBQUUzb0MsR0FBRSxHQUFJQSxJQUFJNEssRUFBRWt1QyxFQUFFdWlDLEdBQUd6d0UsRUFBRWhMLEVBQUUsTUFBTWdMLEVBQUVrdUMsRUFBRTAxQixHQUFHNWpFLEVBQUUrOUIsSUFBSS85QixFQUFFd3JDLEVBQUUxd0MsS0FBSytSLE1BQU1va0UsR0FBR2p4RSxHQUFJb3BGLEdBQUdycEYsR0FBK0UsU0FBUzRzRSxHQUFHNXNFLEdBQUdBLEVBQUVtdUMsSUFBSTY5QixHQUFHaHNFLEdBQUdBLEVBQUVtdUMsRUFBRW5ULFNBQVNoN0IsRUFBRW11QyxFQUFFLE1BQ2xkLFNBQVM4NkMsR0FBR2pwRixHQUFHNHNFLEdBQUc1c0UsR0FBR0EsRUFBRXZHLElBQUl4RSxFQUFFNFYsYUFBYTdLLEVBQUV2RyxHQUFHdUcsRUFBRXZHLEVBQUUsTUFBTWszRSxHQUFHM3dFLEdBQUdBLEVBQUVoTCxFQUFFZ21DLFNBQVNoN0IsRUFBRTVLLElBQUksaUJBQWtCNEssRUFBRTVLLEdBQUdILEVBQUU0VixhQUFhN0ssRUFBRTVLLEdBQUc0SyxFQUFFNUssRUFBRSxNQUFPLFNBQVNrMEYsR0FBR3RwRixFQUFFQyxHQUFHRCxFQUFFL0ssRUFBRThELEtBQUssSUFuQmlWLE1BQU0sWUFBWWlILEVBQUVDLEdBQUd0SSxLQUFLcTJDLEVBQUVodUMsRUFBRXJJLEtBQUt3MkMsRUFBRWx1QyxJQW1CalhELEVBQUUrcUUsS0FBSzlxRSxJQUFJLEdBQUdELEVBQUVvdEMsR0FBR3lqQyxHQUFHN3dFLEdBQUksU0FBUzZ3RSxHQUFHN3dFLEdBQUdsQyxHQUFHa0MsRUFBRWhMLElBQUlnTCxFQUFFNUssSUFBSTRLLEVBQUU1SyxHQUFFLEVBQUc2dUYsR0FBR2prRixFQUFFMnFFLEdBQUczcUUsR0FBR0EsRUFBRWlyQyxFQUFFLEdBR3ZQLFNBQVNzK0MsR0FBR3ZwRixFQUFFQyxHQUFHLElBQUk1SyxFQUFJQSxFQUFGNEssRUFBSUEsRUFBRTdLLEVBQUk0SyxFQUFFaTRDLElBQUksTUFBTTNpRCxFQUFFNDFDLEdBQUVsckMsRUFBRXlyQyxHQUFHc0ssR0FBRXpnRCxFQUFFLE1BQU0wSyxFQUFFNnRDLEdBQUdrSSxHQUFFemdELEVBQUUsTUFBTUQsR0FBRzBnRCxHQUFFemdELEVBQUUsTUFBTTBLLEVBQUU4ckMsR0FBR285QyxHQUFHbHBGLEVBQUUxSyxHQUFHMEssRUFBRXZLLEdBQUd1SyxFQUFFakosR0FBRzR4RixHQUFHcnpGLEVBQUUwSyxFQUFFdkssRUFBRXVLLEVBQUVqSixHQUFHMUIsRUFBRSxJQUFJazJDLEdBQUV2ckMsRUFBRUEsRUFBRWd1QyxFQUFFMzRDLEVBQUUySyxFQUFFaXJDLEVBQUUsR0FBRyxPQUFPanJDLEVBQUV2SyxJQUFJSixFQUFFMHBDLEVBQUUvK0IsRUFBRWpKLEdBQUdrSixJQUFJRCxFQUFFL0ssRUFBRWdMLEVBQUUwcUMsRUFBRW1hLE9BQU85a0QsRUFBRS9LLElBQUlnTCxFQUFFdXBGLEdBQUd4cEYsRUFBRTNLLEVBQUUsS0FBS0EsRUFBRXVWLFdBQVd0RCxLQUFLbWlGLE1BQU0sR0FBR3pwRixFQUFFdWtFLElBQUlqOUQsS0FBS21pRixNQUFNLEdBQUd6cEYsRUFBRXVrRSxHQUFHajlELEtBQUtzbkIsV0FBVzAvQyxHQUFHdHVFLEVBQUVoTCxFQUFFSyxHQUFHNmlGLEdBQUc3aUYsRUFBRUMsRUFBRTJLLEdBQUksU0FBU2lwRixHQUFHbHBGLEVBQUVDLEdBQUdELEVBQUVpdEMsR0FBR2dqQyxHQUFHLElBQUcsU0FBUzU2RSxFQUFFQyxHQUFHeWdELEdBQUU5MUMsRUFBRTNLLEVBQUVELE1BQzlWLFNBQVNtMEYsR0FBR3hwRixFQUFFQyxFQUFFNUssR0FBR0EsRUFBRWlTLEtBQUtDLElBQUl2SCxFQUFFL0ssRUFBRWtDLE9BQU85QixHQUFHLElBQUlDLEVBQUUwSyxFQUFFaXRDLEVBQUVsQixFQUFFL3JDLEVBQUVpdEMsRUFBRWk2QixHQUFHbG5FLEVBQUVpdEMsRUFBRWp0QyxHQUFHLEtBQUtBLEVBQUUsQ0FBQyxJQUFJeEYsRUFBRXdGLEVBQUUvSyxFQUFFLElBQUk2dUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNOTFCLEVBQUUsQ0FBQyxTQUFTMzRDLElBQUksR0FBR3l1RSxFQUFFLEVBQUV6dUUsR0FBR3l1RSxFQUFFdHBFLEVBQUUsR0FBR3d6QyxFQUFFQSxFQUFFajFDLEtBQUssT0FBTytxRSxJQUFJQSxFQUFFLEVBQUU5MUIsRUFBRWoxQyxLQUFLLE9BQU8rcUUsR0FBRyxJQUFJcnRFLEdBQUUsRUFBRyxJQUFJLElBQUlnRCxFQUFFLEVBQUVBLEVBQUVwRSxFQUFFb0UsSUFBSSxDQUFDLElBQUlyRSxFQUFFb0YsRUFBRWYsR0FBR3UwQyxFQUFFLE1BQU1sNEMsRUFBRTBFLEVBQUVmLEdBQUcwMEMsRUFBTyxHQUFMLzRDLEdBQUcwdUUsRUFBSyxFQUFFMXVFLEVBQUUwdUUsRUFBRXg4RCxLQUFLeUYsSUFBSSxFQUFFdlMsRUFBRWYsR0FBR3UwQyxFQUFFLEtBQUt2M0MsR0FBRSxPQUFRLElBQUlzd0YsR0FBR2p4RixFQUFFazRDLEVBQUUsTUFBTTU0QyxFQUFFLEtBQU0sTUFBTWc0QyxHQUFHOTNDLEdBQUdBLEVBQUVRLElBQUssR0FBR1csRUFBRSxDQUFDbkIsRUFBRTA0QyxFQUFFaDFDLEtBQUssS0FBSyxNQUFNZ0gsSUFBNEIsT0FBeEJBLEVBQUVBLEVBQUUvSyxFQUFFaTRELE9BQU8sRUFBRTczRCxHQUFHNEssRUFBRTBxQyxFQUFFM3FDLEVBQVMxSyxFQUFFLFNBQVNrN0UsR0FBR3h3RSxHQUFHQSxFQUFFbXVDLEdBQUdudUMsRUFBRXZHLElBQUl1RyxFQUFFK3RDLEVBQUUsRUFBRWsyQyxHQUFHamtGLEVBQUVxcUUsR0FBR3JxRSxHQUFHQSxFQUFFOHBFLEVBQUUsR0FDNWIsU0FBUzZGLEdBQUczdkUsR0FBRyxRQUFHQSxFQUFFbXVDLEdBQUdudUMsRUFBRXZHLEdBQUcsR0FBR3VHLEVBQUU4cEUsS0FBWTlwRSxFQUFFK3RDLElBQUkvdEMsRUFBRXZHLEVBQUV1eUMsR0FBRUQsRUFBRS9yQyxFQUFFcXFFLEdBQUdycUUsR0FBRzBwRixHQUFHMXBGLEVBQUVBLEVBQUU4cEUsSUFBSTlwRSxFQUFFOHBFLEtBQVcsR0FDM0YsU0FBU2tDLEdBQUdoc0UsR0FBRyxNQUFNQSxFQUFFNnJDLElBQUk1MkMsRUFBRTRWLGFBQWE3SyxFQUFFNnJDLEdBQUc3ckMsRUFBRTZyQyxFQUFFLE1BQU8sU0FBUzg5QyxHQUFHM3BGLEdBQUdBLEVBQUVtdUMsRUFBRSxJQUFJNUMsR0FBRXZyQyxFQUFFQSxFQUFFZ3VDLEVBQUUsTUFBTWh1QyxFQUFFK3RDLEdBQUcsT0FBTy90QyxFQUFFdkssSUFBSXVLLEVBQUVtdUMsRUFBRXBQLEVBQUUvK0IsRUFBRWpKLEdBQUdpSixFQUFFbXVDLEVBQUV6QyxFQUFFLEVBQUUsSUFBSXpyQyxFQUFFaXJDLEdBQUVsckMsRUFBRTBrRSxJQUFJM3VCLEdBQUU5MUMsRUFBRSxNQUFNLE9BQU84MUMsR0FBRTkxQyxFQUFFLE1BQU1ELEVBQUU2dEMsR0FBR2tJLEdBQUU5MUMsRUFBRSxLQUFLRCxFQUFFa3JDLEVBQUUsSUFBSSxLQUFLNkssR0FBRTkxQyxFQUFFLE1BQU1ELEVBQUU4ckMsR0FBR285QyxHQUFHbHBGLEVBQUVDLEdBQUc4MUMsR0FBRTkxQyxFQUFFLE9BQU8sV0FBV0QsRUFBRXZLLEdBQUd1SyxFQUFFakosR0FBRzR4RixHQUFHMW9GLEVBQUVELEVBQUV2SyxFQUFFdUssRUFBRWpKLEdBQUdpSixFQUFFZ3NDLEdBQUdoc0MsRUFBRW11QyxFQUFFdmpDLFdBQVc1SyxFQUFFZ3NDLEdBQUcsSUFBSTMyQyxFQUFFMkssRUFBRW11QyxFQUFFbnVDLEVBQUVBLEVBQUV3bEUsR0FBR253RSxFQUFFMjJDLEVBQUUsRUFBRTMyQyxFQUFFMm9DLEVBQUVneUMsR0FBRzlrQyxHQUFFanJDLElBQUk1SyxFQUFFMEIsRUFBRSxLQUFLMUIsRUFBRXkyQyxHQUFFLEVBQUcyaUMsR0FBR3A1RSxFQUFFMkssR0FBMEUsU0FBUzJ3RSxHQUFHM3dFLEdBQUcsTUFBTUEsRUFBRWcrQixJQUFJL29DLEVBQUU0VixhQUFhN0ssRUFBRWcrQixHQUFHaCtCLEVBQUVnK0IsRUFBRSxNQUM1ZCxTQUFTczdDLEdBQUd0NUUsRUFBRUMsR0FBRyxJQUFJNUssRUFBRSxLQUFLLEdBQUcySyxFQUFFbXVDLEdBQUdsdUMsRUFBRSxDQUFDMHdFLEdBQUczd0UsR0FBR2dzRSxHQUFHaHNFLEdBQUdBLEVBQUVtdUMsRUFBRSxLQUFLLElBQUk3NEMsRUFBRSxNQUFRLEtBQUc2MkUsR0FBR25zRSxFQUFFaEwsRUFBRWlMLEdBQTRCLE9BQXpCNUssRUFBRTRLLEVBQUUwcUMsRUFBRXVrQyxHQUFHbHZFLEVBQUVoTCxFQUFFaUwsR0FBRzNLLEVBQUUsRUFBc0IsR0FBUjBLLEVBQUVndkMsRUFBRS91QyxFQUFFaXJDLEVBQUssR0FBR2xyQyxFQUFFb3RDLEVBQUUsR0FBR250QyxFQUFFakwsRUFBRSxHQUFHLEdBQUdNLEVBQUUsQ0FBQ0QsRUFBRTRLLEVBQUVsSixFQUFFa0osRUFBRWxKLEVBQUVJLE9BQU8sRUFBRThJLEVBQUVsRixLQUFLK1IsTUFBTTdNLEVBQUV3ckMsRUFBRSxJQUFJanhDLEVBQUV3RixFQUFFaXJDLEVBQVNOLEdBQVByMUMsRUFBRTJ2RixLQUFTLElBQUkxRSxHQUFHanJGLEVBQUVELEVBQUU0SyxFQUFFekYsSUFBSXEyRSxHQUFHN3dFLFFBQVN3d0UsR0FBR3h3RSxRQUFRLEdBQVMsSUFBTnhGLEVBQUV5RixFQUFFeEssSUFBUSxHQUFHK0UsR0FBRyxFQUFFd0YsRUFBRWd2QyxLQUFLLEdBQUcxNUMsR0FQaEMsU0FBWTBLLEVBQUVDLEdBQUcsUUFBR3N1RSxHQUFHdnVFLEVBQUVoTCxJQUFJZ0wsRUFBRWhMLEVBQUVpNEMsR0FBR2p0QyxFQUFFNUssRUFBRSxFQUFFLE1BQWdCNEssRUFBRTVLLEdBQVM0SyxFQUFFL0ssRUFBRWdMLEVBQUUwcUMsRUFBRW1hLE9BQU85a0QsRUFBRS9LLElBQUcsS0FBTSxHQUFHK0ssRUFBRW90QyxHQUFHLEdBQUdwdEMsRUFBRW90QyxHQUFHcHRDLEVBQUVpckMsSUFBSWpyQyxFQUFFOHFFLEdBQUcsRUFBRTlxRSxFQUFFNnFFLE9BQWM3cUUsRUFBRTVLLEVBQUU0MkMsR0FBRUQsRUFBRS9yQyxFQUFFMnFFLEdBQUczcUUsRUFBRUMsR0FBR3lwRixHQUFHMXBGLEVBQUVBLEVBQUVpckMsSUFBSWpyQyxFQUFFaXJDLEtBQVcsSUFPbkoyK0MsQ0FBRzVwRixFQUFFQyxJQUFJLEdBQUczSyxHQUFHcTZFLEdBQUczdkUsSUFBSSxPQUFPM0ssR0FBRyxFQUFFQSxFQUFFOEIsU0FBUzhJLEVBQUVELEVBQUVoTCxFQUFFaUwsRUFBRWpMLEVBQUVpTCxFQUFFakwsRUFBRTh2RCxPQUFPenZELElBQUltRixHQUFHLEtBQUssRUFBRTB5QyxHQUFFbHRDLEVBQUUsR0FBRyxNQUFNLEtBQUssRUFBRWt0QyxHQUFFbHRDLEVBQUUsSUFBSSxNQUFNLEtBQUssRUFBRWt0QyxHQUFFbHRDLEVBQUUsR0FBRyxNQUFNLFFBQVFrdEMsR0FBRWx0QyxFQUFFLElBQ2hiLFNBQVMwcEYsR0FBRzFwRixFQUFFQyxHQUFHLElBQUk1SyxFQUFFMkssRUFBRXdtRSxHQUFHbC9ELEtBQUt1bkIsTUFBTXZuQixLQUFLc25CLFNBQVM1dUIsRUFBRWluRSxJQUFnQixPQUFaam5FLEVBQUVpdEMsSUFBSTUzQyxHQUFHLEdBQVVBLEVBQUU0SyxFQUFFLFNBQVNpdEMsR0FBRWx0QyxFQUFFQyxHQUE2QixHQUExQkQsRUFBRWd1QyxFQUFFL3hCLEtBQUssY0FBY2hjLEdBQU0sR0FBR0EsRUFBRSxDQUFDLElBQUk1SyxFQUFFLEtBQUsySyxFQUFFaXRDLElBQUk1M0MsRUFBRSxNQUFNLElBQUlDLEVBQUV5MkMsRUFBRS9yQyxFQUFFOGlGLEdBQUc5aUYsR0FBRzNLLElBQUlBLEVBQUUsSUFBSXkyQyxHQUFFLHdDQUF3QzcyQyxFQUFFNFIsVUFBVSxRQUFRNVIsRUFBRTRSLFNBQVNJLFVBQVVrb0UsR0FBRzk1RSxFQUFFLFNBQVMyNkUsR0FBRzM2RSxJQTFCd2UsU0FBWTJLLEVBQUVDLEdBQUcsTUFBTTVLLEVBQUUsSUFBSXl2RixHQUFHLEdBQUc3dkYsRUFBRW0wRixNQUFNLENBQUMsTUFBTTl6RixFQUFFLElBQUk4ekYsTUFBTTl6RixFQUFFNjlCLE9BQU8wMUMsRUFBR21lLEdBQUczeEYsRUFBRUMsRUFBRSx5QkFBd0IsRUFBRzJLLEdBQUczSyxFQUFFODlCLFFBQVF5MUMsRUFBR21lLEdBQUczeEYsRUFBRUMsRUFBRSx3QkFBdUIsRUFBRzJLLEdBQUczSyxFQUFFeTBELFFBQVE4ZSxFQUFHbWUsR0FBRzN4RixFQUFFQyxFQUFFLHdCQUF1QixFQUFHMkssR0FBRzNLLEVBQUVtcUMsVUFBVW9wQyxFQUFHbWUsR0FBRzN4RixFQUFFQyxFQUFFLDBCQUF5QixFQUFHMkssR0FBR2hMLEVBQUUyVixZQUFXLFdBQWN0VixFQUFFbXFDLFdBQVVucUMsRUFBRW1xQyxjQUFjLEtBQUtucUMsRUFBRStzRixJQUFJcmlGLE9BQVFDLEdBQUUsR0EwQnR6QjRwRixDQUFHeDBGLEVBQUVnSSxXQUFXL0gsUUFBU3U0QyxHQUFFLEdBQUc3dEMsRUFBRW90QyxFQUFFLEVBQUVwdEMsRUFBRWl0QyxHQUFHanRDLEVBQUVpdEMsRUFBRXk1QixHQUFHem1FLEdBQUdvcEYsR0FBR3JwRixHQUFHaXBGLEdBQUdqcEYsR0FDNVYsU0FBU3FwRixHQUFHcnBGLEdBQUdBLEVBQUVvdEMsRUFBRSxFQUFFcHRDLEVBQUVndkMsR0FBRyxFQUFLaHZDLEVBQUVpdEMsSUFBTSxHQUFHMjVDLEdBQUc1bUYsRUFBRWhMLEdBQUdtQyxRQUFRLEdBQUc2SSxFQUFFL0ssRUFBRWtDLFNBQU82SSxFQUFFaEwsRUFBRUEsRUFBRW1DLE9BQU8sRUFBRW90RSxFQUFHdmtFLEVBQUUvSyxHQUFHK0ssRUFBRS9LLEVBQUVrQyxPQUFPLEdBQUU2SSxFQUFFaXRDLEVBQUU5dUMsTUFBTyxTQUFTbXVFLEdBQUd0c0UsRUFBRUMsRUFBRTVLLEdBQUcsSUFBSUMsRUFoQzlJLFNBQVkwSyxHQUFHLE9BQU9BLGFBQWE4ckMsR0FBRVosR0FBRWxyQyxHQUFHLElBQUk4ckMsR0FBRTlyQyxPQUFFLEdBZ0M4RjhwRixDQUFHejBGLEdBQUcsR0FBRyxJQUFJQyxFQUFFTixFQUFFaUwsR0FBRzR0RSxHQUFHdjRFLEVBQUUySyxFQUFFLElBQUkzSyxFQUFFTixHQUFHbTdFLEdBQUc3NkUsRUFBRUEsRUFBRUYsT0FBUSxDQUFDLE1BQU1vRixFQUFFdkYsRUFBRTRSLFNBQVN2UixFQWhDN0osU0FBWTBLLEVBQUVDLEVBQUU1SyxFQUFFQyxHQUFHLElBQUlrRixFQUFFLElBQUlzeEMsR0FBRSxVQUFLLEdBQW9ELE9BQTVDOXJDLEdBQUdtdkUsR0FBRzMwRSxFQUFFd0YsR0FBR0MsR0FBRzR0RSxHQUFHcnpFLEVBQUV5RixHQUFHNUssR0FBRzg2RSxHQUFHMzFFLEVBQUVuRixHQUFHQyxJQUFJa0YsRUFBRXZGLEVBQUVLLEdBQVVrRixFQWdDOER1dkYsQ0FBR3Z2RixFQUFFeU0sU0FBU2hILEVBQUVBLEVBQUUsSUFBSXpGLEVBQUU4akMsU0FBUzlqQyxFQUFFOGpDLFVBQVU5akMsRUFBRTBmLEtBQUs3a0IsR0FBZ0csT0FBNUYySyxFQUFFNmtFLElBQUlMLEVBQUd4a0UsRUFBRTZrRSxJQUFHLFNBQVNycUUsRUFBRXNwRSxHQUFHL3RCLEdBQUV6Z0QsRUFBRXd1RSxFQUFFdHBFLE1BQU15RixFQUFFRCxFQUFFMnFDLEVBQUV0MUMsRUFBRTJLLEVBQUVra0UsR0FBR2prRSxHQUFHNUssR0FBRzBnRCxHQUFFemdELEVBQUUySyxFQUFFNUssR0FBRzBnRCxHQUFFemdELEVBQUUsTUFBTTBLLEVBQUUrbEUsSUFBSW1qQixHQUFHbHBGLEVBQUUxSyxHQUFVQSxFQUNwWCxTQUFTbzdFLEdBQUcxd0UsRUFBRUMsRUFBRTVLLEdBQUcsR0FBRzRLLElBQUlELEVBQUUrK0IsRUFBRSxNQUFNN21DLE1BQU0sdURBQW1ILE9BQTVEK0gsRUFBRTVLLEdBQUcySyxFQUFFOG5FLEtBQUs5bkUsRUFBRXFvRSxHQUFHLElBQUlwNkIsR0FBRSxJQUFJaHJCLEdBQUcsQ0FBQzQvRCxJQUFHLEtBQU0sSUFBSTUwQyxHQUFFanVDLEVBQUVxb0UsS0FBTXBwQyxFQUFFai9CLEVBQUUrK0IsRUFBUzkrQixFQUFFLFNBQVMrcEYsTUFBK0csU0FBU0MsS0FBSyxHQUFHN3RCLEtBQUssSUFBSS93RCxPQUFPKzhELElBQUssTUFBTWx3RSxNQUFNLGdEQUNoVixTQUFTNjFDLEdBQUUvdEMsRUFBRUMsR0FBR2dyQyxHQUFFOTFDLEtBQUt3QyxNQUFNQSxLQUFLdzJDLEVBQUUsSUFBSTI2QyxHQUFHN29GLEdBQUd0SSxLQUFLMUMsRUFBRStLLEVBQUVySSxLQUFLcTJDLEVBQUUvdEMsR0FBR0EsRUFBRTA3RCxrQkFBa0IsS0FBSzM3RCxFQUFFQyxHQUFHQSxFQUFFaXFGLGdCQUFnQixLQUFLanFGLEdBQUdBLEVBQUVrcUYsK0JBQStCbnFGLEVBQUVBLEVBQUUscUJBQXFCLGFBQWFBLEVBQUUsQ0FBQyxvQkFBb0IsZUFBZXJJLEtBQUt3MkMsRUFBRXAzQyxFQUFFaUosRUFBRUEsRUFBRUMsR0FBR0EsRUFBRXk3RCxvQkFBb0IsS0FBS3o3RCxHQUFHQSxFQUFFbXFGLHFCQUFxQnBxRixFQUFFQSxFQUFFLDZCQUE2QkMsRUFBRW1xRixtQkFBbUJwcUYsRUFBRSxDQUFDLDRCQUE0QkMsRUFBRW1xRixxQkFBcUJucUYsR0FBR0EsRUFBRWltRSxLQUFLbG1FLEVBQUVBLEVBQUUsK0JBQStCQyxFQUFFaW1FLEdBQUdsbUUsRUFBRSxDQUFDLDhCQUE4QkMsRUFBRWltRSxLQUFLdnVFLEtBQUt3MkMsRUFBRXlJLEVBQ3hmNTJDLEdBQUdBLEVBQUVDLEdBQUdBLEVBQUVpOEQsNkJBQTZCZ0ksRUFBR2xrRSxLQUFLckksS0FBS3cyQyxFQUFFMTRDLEVBQUV1SyxHQUFHckksS0FBS215RSxFQUFFN3BFLEdBQUdBLEVBQUU0N0QseUJBQXdCLEVBQUdsa0UsS0FBS3FtQyxFQUFFLzlCLEdBQUdBLEVBQUUyN0QsY0FBYSxHQUFJMzdELEVBQUVBLEdBQUdBLEVBQUV3N0Qsc0JBQXNCeUksRUFBR2prRSxLQUFLdEksS0FBS3cyQyxFQUFFeEQsRUFBRTFxQyxFQUFXLFFBQVRELEVBQUVySSxLQUFLcTJDLElBQVkvdEMsS0FBS0QsSUFBYUMsS0FBVEQsRUFBRXJJLEtBQUtxMkMsV0FBaUJodUMsRUFBRUMsS0FBS3RJLEtBQUtzMUMsRUFBRSxJQUFJaUIsR0FBRXYyQyxNQUNBLFNBQVMweUYsR0FBR3JxRixHQUFHbXJFLEdBQUdoMkUsS0FBS3dDLE1BQU0sSUFBSXNJLEVBQUVELEVBQUVzcUYsT0FBTyxHQUFHcnFGLEVBQUUsQ0FBQ0QsRUFBRSxDQUFDLElBQUksTUFBTTNLLEtBQUs0SyxFQUFFLENBQUNELEVBQUUzSyxFQUFFLE1BQU0ySyxFQUFFQSxPQUFFLEdBQVdySSxLQUFLM0MsRUFBRWdMLEtBQUVBLEVBQUVySSxLQUFLM0MsRUFBRWlMLEVBQUUsT0FBT0EsR0FBR0QsS0FBS0MsRUFBRUEsRUFBRUQsUUFBRyxHQUFPckksS0FBSzBILEtBQUtZLE9BQVF0SSxLQUFLMEgsS0FBS1csRUFBWSxTQUFTdXFGLEtBQUt0YyxHQUFHOTRFLEtBQUt3QyxNQUFNQSxLQUFLczJCLE9BQU8sRUFBWSxTQUFTaWdCLEdBQUVsdUMsR0FBR3JJLEtBQUt3MkMsRUFBRW51QyxHQXpCaUtLLEVBQUU0dEMsR0FBRXIzQyxXQUM1cEJpdEUsR0FBRyxTQUFTN2pFLEVBQUVDLEVBQUU1SyxFQUFFQyxHQUFHLEdBQUdxQyxLQUFLdzJDLEVBQUUsTUFBTWoyQyxNQUFNLDBEQUEwRFAsS0FBS29uQyxFQUFFLFlBQVkvK0IsR0FBR0MsRUFBRUEsRUFBRUEsRUFBRXVxRixjQUFjLE1BQU03eUYsS0FBS29uQyxFQUFFLytCLEVBQUVySSxLQUFLczFDLEVBQUUsR0FBR3QxQyxLQUFLdkMsRUFBRSxFQUFFdUMsS0FBS2d6QyxHQUFFLEVBQUdoekMsS0FBS3EyQyxHQUFFLEVBQUdyMkMsS0FBS3cyQyxFQUFFeDJDLEtBQUs4QixFQUFFOUIsS0FBSzhCLEVBQUUwMEMsSUFBSTJxQyxHQUFHM3FDLElBQUl4MkMsS0FBS3N6QyxFQUFFdHpDLEtBQUs4QixFQUFFK3JGLEdBQUc3dEYsS0FBSzhCLEdBQUcrckYsR0FBRzFNLElBQUluaEYsS0FBS3cyQyxFQUFFbTVDLG1CQUFtQnY3QyxFQUFFcDBDLEtBQUtrMEUsR0FBR2wwRSxNQUFNLElBQUlBLEtBQUs4ekMsR0FBRSxFQUFHOXpDLEtBQUt3MkMsRUFBRS9kLEtBQUtud0IsRUFBRTNHLE9BQU8wRyxJQUFHLEdBQUlySSxLQUFLOHpDLEdBQUUsRUFBSSxNQUFNcTRCLEdBQWMsWUFBWHVrQixHQUFHMXdGLEtBQUttc0UsR0FBVTlqRSxFQUFFM0ssR0FBRyxHQUFHLE1BQU1tRixFQUFFLElBQUlrd0MsR0FBRS95QyxLQUFLcVIsU0FBUzFULEdBQUcyNkUsR0FBRzM2RSxHQUFFLFNBQVN3dUUsRUFBRTkxQixHQUFHeHpDLEVBQUVrTSxJQUFJc25DLEVBQUU4MUIsTUFBTXh1RSxFQWhEemMsU0FBWTBLLEdBQUdBLEVBQUUsQ0FBQyxJQUFJQyxFQUFFMmtFLEdBQUcsTUFBTXZ2RSxFQUFFMkssRUFBRTdJLE9BQU83QixFQUFFLGlCQUFrQjBLLEVBQUVBLEVBQUVrQixNQUFNLElBQUlsQixFQUFFLElBQUksSUFBSXhGLEVBQUUsRUFBRUEsRUFBRW5GLEVBQUVtRixJQUFJLEdBQUdBLEtBQUtsRixHQUFHMkssRUFBRTlLLFVBQUssRUFBT0csRUFBRWtGLEdBQUdBLEVBQUV3RixHQUFHLENBQUNDLEVBQUV6RixFQUFFLE1BQU13RixFQUFFQyxHQUFHLEVBQUcsT0FBTyxFQUFFQSxFQUFFLEtBQUssaUJBQWtCRCxFQUFFQSxFQUFFbEcsT0FBT21HLEdBQUdELEVBQUVDLEdBZ0QrUHlrRSxDQUFHbHFFLEVBQUVtMEMsS0FBS3Q1QyxFQUFFSixFQUFFdzFGLFVBQVV6cUYsYUFBYS9LLEVBQUV3MUYsV0FDaGYsR0FBRzFrQixFQUFHcWlCLEdBQUdub0YsS0FBSzNLLEdBQUdELEdBQUdtRixFQUFFa00sSUFBSSxlQUFlLG1EQUFtRGxNLEVBQUVzRyxTQUFRLFNBQVNnakUsRUFBRTkxQixHQUFHcjJDLEtBQUt3MkMsRUFBRTI1QyxpQkFBaUI5NUMsRUFBRTgxQixLQUFLbnNFLE1BQU1BLEtBQUtrMkMsSUFBSWwyQyxLQUFLdzJDLEVBQUVnNUMsYUFBYXh2RixLQUFLazJDLEdBQUcsb0JBQW9CbDJDLEtBQUt3MkMsR0FBR3gyQyxLQUFLdzJDLEVBQUV1OEMsa0JBQWtCL3lGLEtBQUtzbkMsSUFBSXRuQyxLQUFLdzJDLEVBQUV1OEMsZ0JBQWdCL3lGLEtBQUtzbkMsR0FBRyxJQUFJd3BELEdBQUc5d0YsTUFBTSxFQUFFQSxLQUFLazBDLEtBQUtsMEMsS0FBS3EwQyxFQUMzVCxTQUFZaHNDLEdBQUcsT0FBT284RCxHQUFHbUssS0FBTSxpQkFBa0J2bUUsRUFBRWt2QixjQUFTLElBQVNsdkIsRUFBRXkvQixVQURzUGtyRCxDQUFHaHpGLEtBQUt3MkMsS0FBS3gyQyxLQUFLdzJDLEVBQUVqZixRQUFRdjNCLEtBQUtrMEMsRUFBRWwwQyxLQUFLdzJDLEVBQUUxTyxVQUFVc00sRUFBRXAwQyxLQUFLaXRFLEdBQUdqdEUsT0FBT0EsS0FBS215RSxFQUFFeWEsR0FBRzVzRixLQUFLaXRFLEdBQUdqdEUsS0FBS2swQyxFQUFFbDBDLE9BQU9BLEtBQUtxbUMsR0FBRSxFQUFHcm1DLEtBQUt3MkMsRUFBRXhLLEtBQUszakMsR0FBR3JJLEtBQUtxbUMsR0FBRSxFQUFJLE1BQU04bEMsR0FBR3VrQixHQUFHMXdGLEtBQUttc0UsS0FDaFZ6akUsRUFBRXVrRSxHQUFHLGdCQUFXLElBQW9CeWIsR0FBTTFvRixLQUFLdzJDLElBQUl4MkMsS0FBS3MxQyxFQUFFLG1CQUFtQnQxQyxLQUFLazBDLEVBQUUsZUFBZWwwQyxLQUFLdkMsRUFBRSxFQUFFdTFDLEdBQUVoekMsS0FBSyxXQUFXQSxLQUFLdXlELE1BQU0sS0FDaFI3cEQsRUFBRTZwRCxNQUFNLFNBQVNscUQsR0FBR3JJLEtBQUt3MkMsR0FBR3gyQyxLQUFLcTJDLElBQUlyMkMsS0FBS3EyQyxHQUFFLEVBQUdyMkMsS0FBSzFDLEdBQUUsRUFBRzBDLEtBQUt3MkMsRUFBRStiLFFBQVF2eUQsS0FBSzFDLEdBQUUsRUFBRzBDLEtBQUt2QyxFQUFFNEssR0FBRyxFQUFFMnFDLEdBQUVoekMsS0FBSyxZQUFZZ3pDLEdBQUVoekMsS0FBSyxTQUFTNHdGLEdBQUc1d0YsUUFBUzBJLEVBQUVrckMsRUFBRSxXQUFXNXpDLEtBQUt3MkMsSUFBSXgyQyxLQUFLcTJDLElBQUlyMkMsS0FBS3EyQyxHQUFFLEVBQUdyMkMsS0FBSzFDLEdBQUUsRUFBRzBDLEtBQUt3MkMsRUFBRStiLFFBQVF2eUQsS0FBSzFDLEdBQUUsR0FBSXN6RixHQUFHNXdGLE1BQUssSUFBS3MyQyxHQUFFQyxFQUFFM0MsRUFBRXAyQyxLQUFLd0MsT0FBUTBJLEVBQUV3ckUsR0FBRyxXQUFXbDBFLEtBQUtaLElBQUlZLEtBQUs4ekMsR0FBRzl6QyxLQUFLcW1DLEdBQUdybUMsS0FBSzFDLEVBQUV1ekYsR0FBRzd3RixNQUFNQSxLQUFLMGhCLE9BQVFoWixFQUFFZ1osR0FBRyxXQUFXbXZFLEdBQUc3d0YsT0FFdUMwSSxFQUFFb21FLEdBQUcsV0FBVyxJQUFJLE9BQU8sRUFBRS82QixHQUFFL3pDLE1BQU1BLEtBQUt3MkMsRUFBRWxnQixRQUFRLEVBQUUsTUFBTWp1QixHQUFHLE9BQVEsSUFDbmNLLEVBQUUya0UsR0FBRyxXQUFXLElBQUksT0FBT3J0RSxLQUFLdzJDLEVBQUV4MkMsS0FBS3cyQyxFQUFFaTVDLGFBQWEsR0FBRyxNQUFNcG5GLEdBQUcsTUFBTyxLQUFLSyxFQUFFb3BFLEdBQUcsU0FBU3pwRSxHQUFHLEdBQUdySSxLQUFLdzJDLEVBQUUsQ0FBQyxJQUFJbHVDLEVBQUV0SSxLQUFLdzJDLEVBQUVpNUMsYUFBMkQsT0FBOUNwbkYsR0FBRyxHQUFHQyxFQUFFaEMsUUFBUStCLEtBQUtDLEVBQUVBLEVBQUV1QixVQUFVeEIsRUFBRTdJLFNBQWdCOHdGLEdBQUdob0YsS0FBcVFJLEVBQUV1bUUsR0FBRyxXQUFXLE9BQU9qdkUsS0FBS3ZDLEdBQzdkaUwsRUFBRXFuRSxHQUFHLFdBQVcsTUFBTyxpQkFBa0IvdkUsS0FBS3MxQyxFQUFFdDFDLEtBQUtzMUMsRUFBRTN6QyxPQUFPM0IsS0FBS3MxQyxLQUU2UjVzQyxFQUFFeW9GLEdBQUdseUYsV0FBWW12RSxHQUFHLEVBQUUxbEUsRUFBRStzQyxFQUFFLEVBQy9CL3NDLEVBQUV1aUYsR0FBRyxTQUFTNWlGLEdBQUcsSUFBSXJJLEtBQUtxMkMsRUFBRS94QixLQUFLLDBCQUEwQmpjLEdBQUksTUFBTUMsTUFFaGFJLEVBQUVzcUUsR0FBRyxTQUFTM3FFLEdBQUcsR0FBR3JJLEtBQUt2QyxFQUFFLEdBQUd1QyxLQUFLdkMsRUFBRSxLQUFLLEdBQUd1QyxLQUFLeTFDLEdBQUcsSUFBSXB0QyxFQUFFLENBQUNySSxLQUFLc2dELEVBQUUzd0MsS0FBS3VuQixNQUFNLElBQUl2bkIsS0FBS3NuQixVQUFVNXVCLEVBQUVySSxLQUFLc2dELElBQUksTUFBTXo5QyxFQUFFLElBQUkrd0MsR0FBRTV6QyxLQUFLQSxLQUFLcTJDLEVBQUVodUMsT0FBRSxHQUFRLElBQUk4akUsRUFBRW5zRSxLQUFLWixFQUFxRSxHQUFuRVksS0FBS2kvQyxJQUFJa3RCLEdBQUdBLEVBQUVvQyxFQUFHcEMsR0FBR3VDLEVBQUd2QyxFQUFFbnNFLEtBQUtpL0MsSUFBSWt0QixFQUFFbnNFLEtBQUtpL0MsR0FBRyxPQUFPai9DLEtBQUtsQyxJQUFJK0UsRUFBRXVrQyxFQUFFK2tDLEdBQU1uc0UsS0FBS2t4RSxHQUFHN29FLEVBQUUsQ0FBUyxJQUFSLElBQUlDLEVBQUUsRUFBVTVLLEVBQUUsRUFBRUEsRUFBRXNDLEtBQUsxQyxFQUFFa0MsT0FBTzlCLElBQUksQ0FBSSxJQUFJQyxFQUFFcUMsS0FBSzFDLEVBQUVJLEdBQTJGLFFBQUcsS0FBaENDLEVBQXhELGFBQWFBLEVBQUU2NEMsR0FBbUIsaUJBQWY3NEMsRUFBRUEsRUFBRTY0QyxFQUFFeThDLFVBQWlDdDFGLEVBQUU2QixZQUFpQixHQUFzQixNQUFXLEdBQUcsTUFBUjhJLEdBQUczSyxHQUFZLENBQUMySyxFQUFFNUssRUFBRSxNQUFNMkssRUFBRSxHQUFHLE9BQU9DLEdBQUc1SyxJQUFJc0MsS0FBSzFDLEVBQUVrQyxPQUFPLEVBQUUsQ0FBQzhJLEVBQUU1SyxFQUFFLEVBQUUsTUFBTTJLLEdBQUdDLEVBQUUsU0FBVUEsRUFBRSxJQUFJQSxFQUNyZnVwRixHQUFHN3hGLEtBQUs2QyxFQUFFeUYsR0FBZTgxQyxHQUFaMWdELEVBQUU2MUMsR0FBRXZ6QyxLQUFLOHpDLEdBQU8sTUFBTXpyQyxHQUFHKzFDLEdBQUUxZ0QsRUFBRSxPQUFPLElBQUlzQyxLQUFLZ3pDLEdBQUdvTCxHQUFFMWdELEVBQUUsb0JBQW9Cc0MsS0FBS2d6QyxHQUFHdStDLEdBQUd2eEYsS0FBS3RDLEdBQUdzQyxLQUFLbEMsR0FBR3F1RSxHQUFHNmtCLEdBQUd0ekYsRUFBRXNDLEtBQUtsQyxFQUFFcXVFLEdBQUd3SyxHQUFHMzJFLEtBQUszQyxFQUFFd0YsR0FBRzdDLEtBQUs0dUUsSUFBSXh3QixHQUFFMWdELEVBQUUsT0FBTyxRQUFRc0MsS0FBS2t4RSxJQUFJOXlCLEdBQUUxZ0QsRUFBRSxPQUFPNEssR0FBRzgxQyxHQUFFMWdELEVBQUUsTUFBTSxRQUFRbUYsRUFBRTZ3QyxHQUFFLEVBQUc2c0MsR0FBRzE5RSxFQUFFbkYsRUFBRSxPQUFPNmlGLEdBQUcxOUUsRUFBRW5GLEVBQUU0SyxHQUFHdEksS0FBS3kxQyxFQUFFLFFBQVMsR0FBR3oxQyxLQUFLeTFDLElBQUlwdEMsRUFBRXVwRixHQUFHNXhGLEtBQUtxSSxHQUFHLEdBQUdySSxLQUFLMUMsRUFBRWtDLFFBQVEyRyxHQUFHbkcsS0FBSzNDLElBQUl1MEYsR0FBRzV4RixRQUcvTjBJLEVBQUVncUUsR0FBRyxXQUFnQyxHQUFyQjF5RSxLQUFLOEIsRUFBRSxLQUFLa3dGLEdBQUdoeUYsTUFBU0EsS0FBSzB6QyxLQUFLMXpDLEtBQUtzbkMsR0FBRyxNQUFNdG5DLEtBQUt3MkMsR0FBRyxHQUFHeDJDLEtBQUsrekMsR0FBRyxDQUFDLElBQUkxckMsRUFBRSxFQUFFckksS0FBSyt6QyxFQUFFL3pDLEtBQUtxMkMsRUFBRS94QixLQUFLLCtCQUErQmpjLEdBQUdySSxLQUFLazBDLEVBQUVHLEdBQUVELEVBQUVwMEMsS0FBSzRxRixHQUFHNXFGLE1BQU1xSSxLQUFNSyxFQUFFa2lGLEdBQUcsV0FBVzVxRixLQUFLazBDLElBQUlsMEMsS0FBS2swQyxFQUFFLEtBQUtsMEMsS0FBS3EyQyxFQUFFL3hCLEtBQUssaUNBQWlDdGtCLEtBQUtxMkMsRUFBRS94QixLQUFLLHdEQUF3RHRrQixLQUFLdXpDLEdBQUUsRUFBR3Z6QyxLQUFLc25DLEdBQUUsRUFBRzRPLEdBQUUsSUFBSSsrQixHQUFHajFFLE1BQU1neUYsR0FBR2h5RixRQUN2RzBJLEVBQUVtaUYsR0FBRyxXQUFXLE1BQU03cUYsS0FBS3FtQyxJQUFJcm1DLEtBQUtxbUMsRUFBRSxLQUFLNHVDLEdBQUdqMUUsTUFBTWc0RSxHQUFHaDRFLE1BQU1rMkMsR0FBRSxNQUVsRXh0QyxFQUFFeWlGLEdBQUcsU0FBUzlpRixHQUFHQSxHQUFHckksS0FBS3EyQyxFQUFFL3hCLEtBQUssa0NBQWtDNHhCLEdBQUUsS0FBS2wyQyxLQUFLcTJDLEVBQUUveEIsS0FBSyw2QkFBNkI0eEIsR0FBRSxNQUUvUnh0QyxFQUFFMnBGLEdBQUdwekYsV0FBWTR0RSxHQUFHLGFBQWFua0UsRUFBRXVwRSxHQUFHLGFBQWF2cEUsRUFBRXFtRSxHQUFHLGFBQWFybUUsRUFBRWxDLEdBQUcsYUFBYWtDLEVBQUU2bUUsR0FBRyxhQUFnSCtpQixHQUFHcnpGLFVBQVV1M0MsRUFBRSxTQUFTbnVDLEVBQUVDLEdBQUcsT0FBTyxJQUFJOHRDLEdBQUUvdEMsRUFBRUMsSUFFL0svSixFQUFFNjNDLEdBQUU5QyxJQUFHOEMsR0FBRW4zQyxVQUFVeEIsRUFBRSxXQUFXdUMsS0FBS3cyQyxFQUFFbEIsRUFBRXQxQyxLQUFLczFDLEVBQUV0MUMsS0FBS215RSxJQUFJbnlFLEtBQUt3MkMsRUFBRXBQLEdBQUUsR0FBSSxJQUFJLytCLEVBQUVySSxLQUFLdzJDLEVBQUVsdUMsRUFBRXRJLEtBQUsxQyxFQUFFSSxFQUFFc0MsS0FBS3EyQyxRQUFHLEVBQU9odUMsRUFBRTZwRSxLQUFLN3BFLEVBQUVndUMsRUFBRS94QixLQUFLLDBCQUEwQmdvRSxHQUFHbDRDLEVBQUUvckMsRUFBRTRpRixHQUFHNWlGLEVBQUVDLEtBQUs0dEMsR0FBRSxHQUFHN3RDLEVBQUVtdEMsRUFBRWx0QyxFQUFFRCxFQUFFNmtFLEdBQUd4dkUsR0FBRyxHQUFHMkssRUFBRWtyQyxFQUFFbHJDLEVBQUVpdUMsRUFBRWp1QyxFQUFFeXJDLEVBQUU2Z0MsR0FBR3RzRSxFQUFFLEtBQUtBLEVBQUVtdEMsR0FBRzBqQyxHQUFHN3dFLElBQUsrdEMsR0FBRW4zQyxVQUFVNEwsTUFBTSxXQUFXK3BFLEdBQUc1MEUsS0FBS3cyQyxJQUNwZ0JKLEdBQUVuM0MsVUFBVTZDLEVBQUUsU0FBU3VHLEdBQUcsR0FBRyxpQkFBa0JBLEVBQUUsQ0FBQyxJQUFJQyxFQUFFLEdBQUdBLEVBQUUycUYsU0FBUzVxRixFQUFFc3BGLEdBQUczeEYsS0FBS3cyQyxFQUFFbHVDLFFBQVN0SSxLQUFLcW1DLElBQUcvOUIsRUFBRSxJQUFLMnFGLFNBQVNsSCxHQUFHMWpGLEdBQUdzcEYsR0FBRzN4RixLQUFLdzJDLEVBQUVsdUMsSUFBSXFwRixHQUFHM3hGLEtBQUt3MkMsRUFBRW51QyxJQUFLK3RDLEdBQUVuM0MsVUFBVTIwQyxFQUFFLFdBQVc1ekMsS0FBS3cyQyxFQUFFbEIsRUFBRSxZQUFZdDFDLEtBQUtzMUMsRUFBRXMvQixHQUFHNTBFLEtBQUt3MkMsVUFBVXgyQyxLQUFLdzJDLEVBQUVKLEdBQUVHLEVBQUUzQyxFQUFFcDJDLEtBQUt3QyxPQUF3THpCLEVBQUVtMEYsR0FBR2xmLElBQStDajFFLEVBQUVxMEYsR0FBR3RjLElBQ2hlLzNFLEVBQUVnNEMsR0FBRTg3QyxJQUFJOTdDLEdBQUV0M0MsVUFBVTR0RSxHQUFHLFdBQVc3NUIsR0FBRWh6QyxLQUFLdzJDLEVBQUUsTUFBT0QsR0FBRXQzQyxVQUFVZ3pFLEdBQUcsU0FBUzVwRSxHQUFHMnFDLEdBQUVoekMsS0FBS3cyQyxFQUFFLElBQUlrOEMsR0FBR3JxRixLQUFNa3VDLEdBQUV0M0MsVUFBVTh2RSxHQUFHLFNBQVMxbUUsR0FBRzJxQyxHQUFFaHpDLEtBQUt3MkMsRUFBRSxJQUFJbzhDLEdBQUd2cUYsS0FBTWt1QyxHQUFFdDNDLFVBQVV1SCxHQUFHLFdBQVd3c0MsR0FBRWh6QyxLQUFLdzJDLEVBQUUsTUFnQnZMODdDLEdBQUdyekYsVUFBVXVsRSxpQkFBaUI4dEIsR0FBR3J6RixVQUFVdTNDLEVBQUVKLEdBQUVuM0MsVUFBVStzQyxLQUFLb0ssR0FBRW4zQyxVQUFVNkMsRUFBRXMwQyxHQUFFbjNDLFVBQVV3NUIsS0FBSzJkLEdBQUVuM0MsVUFBVXhCLEVBQUUyNEMsR0FBRW4zQyxVQUFVNEwsTUFBTXVyQyxHQUFFbjNDLFVBQVU0TCxNQUFNNGlGLEdBQUdqcUIsU0FBUyxFQUFFaXFCLEdBQUcvcEIsUUFBUSxFQUFFK3BCLEdBQUc5cEIsV0FBVyxFQUFFZ3FCLEdBQUdycUIsU0FBUyxXQUFXd3FCLEdBQUducEIsVUFBVXI5QixHQUFFQSxHQUFFczlCLEtBQUssSUFBSXQ5QixHQUFFdTlCLE1BQU0sSUFBSXY5QixHQUFFaDZCLE1BQU0sSUFBSWc2QixHQUFFdzlCLFFBQVEsSUFBSXh4QixHQUFFcjBDLFVBQVV5bEUsT0FBT3B4QixHQUFFcjBDLFVBQVVzMEMsRUFBRStDLEdBQUVyM0MsVUFBVW9rRSxXQUFXL3NCLEdBQUVyM0MsVUFBVTgwQyxFQUFFdUMsR0FBRXIzQyxVQUFVaTBGLGFBQWE1OEMsR0FBRXIzQyxVQUFVOHdFLEdBQUd6NUIsR0FBRXIzQyxVQUFVc2tFLGlCQUFpQmp0QixHQUFFcjNDLFVBQVVnd0UsR0FBRzM0QixHQUFFcjNDLFVBQVUya0UsVUFBVXR0QixHQUFFcjNDLFVBQVU2dkUsR0FBR3g0QixHQUFFcjNDLFVBQVV3a0UsZ0JBQWdCbnRCLEdBQUVyM0MsVUFBVTZ5RSxHQUN4Zng3QixHQUFFcjNDLFVBQVU0a0UsZ0JBQWdCdnRCLEdBQUVyM0MsVUFBVW91RSxHQUFHLzJCLEdBQUVyM0MsVUFBVStzQyxLQUFLc0ssR0FBRXIzQyxVQUFVaXRFLEdBQUcsSUFBSWluQixHQUE0QjFLLEVBQUkwSywwQkFBMEIsV0FBVyxPQUFPLElBQUliLElBQVFjLEdBQXFCM0ssRUFBSTJLLG1CQUFtQixXQUFXLE9BQU85RixNQUFVK0YsR0FBWTVLLEVBQUk0SyxVQUFVNUYsR0FBTzlvQixHQUFZOGpCLEVBQUk5akIsVUFBVWdwQixHQUFPMkYsR0FBUTdLLEVBQUk2SyxNQUFNbHNELEdBQU1tc0QsR0FBTzlLLEVBQUk4SyxLQUFLLENBQUN4SCxHQUFHLEVBQUV5SCxHQUFHLEVBQUVySCxHQUFHLEVBQUVnQyxHQUFHLEVBQUVaLEdBQUcsRUFBRWEsR0FBRyxFQUFFZixHQUFHLEVBQUVELEdBQUcsRUFBRVksR0FBRyxFQUFFVixHQUFHLEVBQUVyb0IsTUFBTSxHQUFHQyxRQUFRLEdBQUdnb0IsR0FBRyxHQUFHSixHQUFHLEdBQUdELEdBQUcsR0FBR0QsR0FBRyxHQUFHSSxHQUFHLEdBQUdDLEdBQUcsR0FBR25CLEdBQUcsR0FBR1YsR0FBRyxHQUFHTSxHQUFHLElBQVErSCxHQUFzQmhMLEVBQUlnTCxvQkFBb0Jub0UsR0FBT29vRSxHQUFhakwsRUFBSWlMLFdBQVc1RixHQUN4aUI2RixHQUFRbEwsRUFBSWtMLE1BQU1yOUMsSyw4Q0N2R3RCOzs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxNQUFNc3RDLEVBQ0YsWUFBWWo0RSxFQUFXOUcsR0FDbkI3RSxLQUFLMkwsVUFBWUEsRUFDakIzTCxLQUFLNkUsU0FBV0EsRUFFaEIsd0JBQWM4RyxFQUFXLElBQUksSUFBVSxhQUFjLElBQU0zTCxLQUFNLFdBQ2pFQSxLQUFLZzhCLFVBQVlyd0IsRUFBVXF3QixVQUUvQixxQ0FDSSxPQUFPaDhCLEtBQUsyTCxVQUFVdTRFLCtCQUUxQixtQ0FBbUNHLEdBQy9CcmtGLEtBQUsyTCxVQUFVdTRFLCtCQUFpQ0csRUFFcEQsV0FDSSxPQUFPcmtGLEtBQUsyTCxVQUFVL04sS0FFMUIsY0FDSSxPQUFPb0MsS0FBSzJMLFVBQVVxVyxRQUUxQixTQUNJLE9BQU8sSUFBSXBlLFFBQVFGLElBQ2YxRCxLQUFLMkwsVUFBVXk0RSxpQkFDZjFnRixNQUNEK0csS0FBSyxLQUNKekssS0FBSzZFLFNBQVNzd0MsU0FBU3krQyxVQUFVNXpGLEtBQUtwQyxNQUMvQixvQkFBVW9DLEtBQUsyTCxhQWlCOUIsWUFBWS9OLEVBQU0ybEYsRUFBcUIsdUJBQ25DLElBQUl0MEUsRUFDSmpQLEtBQUsyTCxVQUFVeTRFLGlCQUVmLE1BQU0zdEUsRUFBV3pXLEtBQUsyTCxVQUFVcXdCLFVBQVVxUixZQUFZenZDLEdBTXRELE9BTEs2WSxFQUFTb2hFLGlCQUNxRixjQUEzRCxRQUFsQzVvRSxFQUFLd0gsRUFBUzRyRSxzQkFBbUMsSUFBUHB6RSxPQUFnQixFQUFTQSxFQUFHZzRFLG9CQUN4RXh3RSxFQUFTdTNCLGFBR052M0IsRUFBUzYyQixhQUFhLENBQ3pCbmUsV0FBWW8wRCxJQWFwQix1QkFBdUIzbEYsRUFBTTJsRixFQUFxQix1QkFDOUN2akYsS0FBSzJMLFVBQVVxd0IsVUFFVnFSLFlBQVl6dkMsR0FDWjRsRixjQUFjRCxHQU12QixjQUFjbkIsR0FDVix3QkFBY3BpRixLQUFLMkwsVUFBV3kyRSxHQUVsQyx5QkFBeUJBLEdBQ3JCLG1DQUF5QnBpRixLQUFLMkwsVUFBV3kyRSxHQUU3QyxTQUNJLE1BQU8sQ0FDSHhrRixLQUFNb0MsS0FBS3BDLEtBQ1hzbUYsK0JBQWdDbGtGLEtBQUtra0YsK0JBQ3JDbGlFLFFBQVNoaUIsS0FBS2dpQjs7Ozs7Ozs7Ozs7Ozs7OztHQTJCMUIsTUFBTTBoRSxFQUFTLENBQ1gsU0FBeUIsb0ZBRXpCLHVCQUFxRCw4RUFHbkRDLEVBQWdCLElBQUksSUFBYSxhQUFjLFdBQVlELEdBeU1qRSxNQUFNbVE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBakJOLFNBQVNDLElBQ0wsTUFBTUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaEtWLFNBQXFDQyxHQUNqQyxNQUFNQyxFQUFPLEdBSVBGLEVBQVksQ0FJZHQxRixZQUFZLEVBQ1orbEYsY0F3REosU0FBNkJ4aUUsRUFBU3lpRSxFQUFZLElBQzlDLE1BQU1ybUUsRUFBTSxnQkFBMEI0RCxFQUFTeWlFLEdBQy9DLEdBQUksWUFBU3dQLEVBQU03MUUsRUFBSXhnQixNQUNuQixPQUFPcTJGLEVBQUs3MUUsRUFBSXhnQixNQUVwQixNQUFNczJGLEVBQVksSUFBSUYsRUFBZ0I1MUUsRUFBSzIxRSxHQUUzQyxPQURBRSxFQUFLNzFFLEVBQUl4Z0IsTUFBUXMyRixFQUNWQSxHQTdEUDkxRSxNQUNBMm1FLGdCQUFpQixrQkFDakJ0eEMsWUFBYSxjQUNiNHhDLE1BQU8sUUFFUDRPLEtBQU0sS0FDTjFQLFlBQWEsY0FDYnB2QyxTQUFVLENBQ05nL0Msa0JBOERSLFNBQWlDL1IsR0FDN0IsTUFBTWdCLEVBQWdCaEIsRUFBVXhrRixLQUMxQncyRixFQUE2QmhSLEVBQWMxZ0YsUUFBUSxVQUFXLElBQ3BFLEdBQUkscUJBQStCMC9FLElBQ1osV0FBbkJBLEVBQVVqOUUsS0FBZ0MsQ0FHMUMsTUFBTWt2RixFQUFtQixDQUFDQyxFQUFTbDJFLE9BRS9CLEdBQWtELG1CQUF2Q2syRSxFQUFPRixHQUdkLE1BQU16USxFQUFjaGxGLE9BQU8sdUJBQW1ELENBQzFFb1AsUUFBU3ExRSxJQUtqQixPQUFPa1IsRUFBT0YsV0FHYTl3RixJQUEzQjgrRSxFQUFVNEUsY0FDVixZQUFXcU4sRUFBa0JqUyxFQUFVNEUsY0FHM0MrTSxFQUFVSyxHQUE4QkMsRUFHeENMLEVBQWdCLzBGLFVBQVVtMUYsR0FJdEIsWUFBYWhuRixHQUVULE9BRG1CcE4sS0FBS3UwRixZQUFZMTFGLEtBQUttQixLQUFNb2pGLEdBQzdCNW9CLE1BQU14NkQsS0FBTW9pRixFQUFVMkUsa0JBQW9CMzVFLEVBQU8sS0FHL0UsTUFBMEIsV0FBbkJnMUUsRUFBVWo5RSxLQUVUNHVGLEVBQVVLLEdBQ1osTUFyR0ZSLFVBeUJSLFNBQW1CaDJGLFVBQ1JxMkYsRUFBS3IyRixJQXpCUjQyRixhQXdHUixTQUFzQnAyRSxFQUFLeGdCLEdBQ3ZCLEdBQWEsZUFBVEEsRUFDQSxPQUFPLEtBR1gsT0FEbUJBLEdBM0dmNjJGLFlBQUEsSUE2QlIsU0FBU3IyRSxFQUFJeGdCLEdBRVQsR0FEQUEsRUFBT0EsR0FBUSx1QkFDVixZQUFTcTJGLEVBQU1yMkYsR0FDaEIsTUFBTStsRixFQUFjaGxGLE9BQU8sU0FBdUIsQ0FBRW9QLFFBQVNuUSxJQUVqRSxPQUFPcTJGLEVBQUtyMkYsR0E0RWhCLE9BaEdBbTJGLEVBQW1CLFFBQUlBLEVBRXZCaDJGLE9BQU9DLGVBQWUrMUYsRUFBVyxPQUFRLENBQ3JDNzFGLElBc0NKLFdBRUksT0FBT0gsT0FBT3lLLEtBQUt5ckYsR0FBTTE5RSxJQUFJM1ksR0FBUXEyRixFQUFLcjJGLE9BcEI5Q3dnQixFQUFTLElBQUk0MUUsRUF5RU5ELEVBMkJXVyxDQUE0QjlRLEdBYzlDLE9BYkFtUSxFQUFVNStDLFNBQVdwM0MsT0FBT3lHLE9BQU96RyxPQUFPeUcsT0FBTyxHQUFJdXZGLEVBQVU1K0MsVUFBVyxDQUFFMitDLDBCQUN4RWEsZ0JBU0osU0FBeUJ4TixHQUNyQixZQUFXNE0sRUFBVzVNLElBVHRCcjlFLGdCQUFBLElBQ0F4QyxhQUFBLElBQ0F0RSxXQUFBLE1BU0crd0YsRUFFUUQsR0FrQmJwUixFQUFTLElBQUksSUFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEMxQixHQUFJLG9CQUFpQ3AvRSxJQUFsQndDLEtBQUtqQixTQUF3QixDQUM1QzY5RSxFQUFPenVDLEtBQUssbUlBS1osTUFBTTJnRCxFQUFhOXVGLEtBQUtqQixTQUFTMC9FLFlBQzdCcVEsR0FBY0EsRUFBV3R1RixRQUFRLFNBQVcsR0FDNUNvOEUsRUFBT3p1QyxLQUFLLHNOQU1wQixNQUFNcHZDLEVBQVdndkY7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBckNqQixJQUFnQzVPLEVBRTVCLDBCQXJCUyx1QkFDRyxTQW9CbUJBLEksY0N2WW5DLElBQUl6dUMsRUFHSkEsRUFBSSxXQUNILE9BQU94MkMsS0FESixHQUlKLElBRUN3MkMsRUFBSUEsR0FBSyxJQUFJMW5DLFNBQVMsY0FBYixHQUNSLE1BQU9qTSxHQUVjLGlCQUFYMEMsU0FBcUJpeEMsRUFBSWp4QyxRQU9yQ25JLEVBQU9ELFFBQVVxNUMsRyxjQ1pqQixJQUFJWSxFQUFxQyxvQkFBWixRQUEyQnZJLE9BQU91SSxpQkFBbUJ2SSxPQUFPdUksZ0JBQWdCdjRDLEtBQUtnd0MsU0FDbkUsb0JBQWQsVUFBdUUsbUJBQW5DdHBDLE9BQU80eEMsU0FBU0MsaUJBQWlDRCxTQUFTQyxnQkFBZ0J2NEMsS0FBS3M0QyxVQUVoSixHQUFJQyxFQUFpQixDQUVuQixJQUFJeTlDLEVBQVEsSUFBSW5tRCxXQUFXLElBRTNCdHhDLEVBQU9ELFFBQVUsV0FFZixPQURBaTZDLEVBQWdCeTlDLEdBQ1RBLE9BRUosQ0FLTCxJQUFJQyxFQUFPLElBQUl6MEYsTUFBTSxJQUVyQmpELEVBQU9ELFFBQVUsV0FDZixJQUFLLElBQVdnQixFQUFQZCxFQUFJLEVBQU1BLEVBQUksR0FBSUEsSUFDTixJQUFWLEVBQUpBLEtBQWlCYyxFQUFvQixXQUFoQndSLEtBQUtzbkIsVUFDL0I2OUQsRUFBS3ozRixHQUFLYyxNQUFZLEVBQUpkLElBQWEsR0FBSyxJQUd0QyxPQUFPeTNGLEssY0MxQlgsSUFEQSxJQUFJQyxFQUFZLEdBQ1AxM0YsRUFBSSxFQUFHQSxFQUFJLE1BQU9BLEVBQ3pCMDNGLEVBQVUxM0YsSUFBTUEsRUFBSSxLQUFPcUksU0FBUyxJQUFJZ2QsT0FBTyxHQW1CakR0bEIsRUFBT0QsUUFoQlAsU0FBcUJ5eEMsRUFBSzRKLEdBQ3hCLElBQUluN0MsRUFBSW03QyxHQUFVLEVBQ2R3OEMsRUFBTUQsRUFFVixNQUFPLENBQ0xDLEVBQUlwbUQsRUFBSXZ4QyxNQUFPMjNGLEVBQUlwbUQsRUFBSXZ4QyxNQUN2QjIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTzIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTyxJQUM5QjIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTzIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTyxJQUM5QjIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTzIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTyxJQUM5QjIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTzIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTyxJQUM5QjIzRixFQUFJcG1ELEVBQUl2eEMsTUFBTzIzRixFQUFJcG1ELEVBQUl2eEMsTUFDdkIyM0YsRUFBSXBtRCxFQUFJdnhDLE1BQU8yM0YsRUFBSXBtRCxFQUFJdnhDLE1BQ3ZCMjNGLEVBQUlwbUQsRUFBSXZ4QyxNQUFPMjNGLEVBQUlwbUQsRUFBSXZ4QyxPQUN0QmdFLEtBQUssTSwrRkNQVixjQUVBLFFBQ0EsTUFDQSxNQUNBLGNBVUEsZ0JBYUUsWUFDVTg4RCxFQUNBaGhCLEdBREEsS0FBQWdoQixNQUNBLEtBQUFoaEIsUUFkRixLQUFBL2tCLEdBQW1DLEtBQ25DLEtBQUE2OEQsUUFBVSxHQUNWLEtBQUFDLE9BQW9DLEdBQ3BDLEtBQUFDLGNBQStCLEtBYXJDbjFGLEtBQUtvNEIsR0FBSytsQyxFQUFJaVksVUFDZHAyRSxLQUFLaTFGLFFBdUdULFNBQW9CRyxHQUNsQixNQUFNbDFFLEVBQVMsSUFBSTZtQixPQUNqQixXQUFhMTlCLG1CQUFtQityRixHQUFVLFlBQzFDM3lFLEtBQUtXLFNBQVNneUUsUUFDaEIsR0FBSWwxRSxFQUFRLE9BQU9BLEVBQU8sR0FFMUIsTUFBTSswRSxFQUFVSSxFQUFLQyxLQUVmN2hGLEVBQU8sSUFBSXJRLEtBQ2pCcVEsRUFBSzhoRixRQUFROWhGLEVBQUtwUSxVQUFZLFFBQzlCLE1BQU1teUYsRUFBVSxhQUFlL2hGLEVBQUtHLGNBSXBDLE9BRkF3UCxTQUFTZ3lFLE9BQ1AvckYsbUJBQW1CK3JGLEdBQVUsSUFBTUgsRUFBVU8sRUFBVSxXQUNsRFAsRUFySFVRLENBekJDLDhCQTJCaEIsVUFBU2pSLGNBQWN4a0YsS0FBS280QixHQUFHaGEsSUFBSTRELFNBRW5DLE1BQU0wekUsRUFBWSxVQUNmdGYsWUFDQXVmLFdBQVd4M0IsRUFBSXB1RCxLQUFKb3VELHFCQUNkbitELEtBQUtrMUYsT0FBTy8yQixFQUFJcHVELE1BQVEsRUFFeEIvUCxLQUFLazFGLE9BQU9RLEVBQVUzbEYsS0FBTyxJQUFNL1AsS0FBS2kxRixTQUFXLEVBQ25EajFGLEtBQUtrMUYsT0FBT1EsRUFBVTNsRixLQUFWMmxGLE1BQThCMTFGLEtBQUtpMUYsUUFBUXZ5RSxPQUFPLEVBQUcsSUFBTSxFQUN2RTFpQixLQUFLazFGLE9BQU9RLEVBQVUzbEYsS0FBVjJsRixRQUFnQzExRixLQUFLaTFGLFFBQVF2eUUsT0FBTyxFQUFHLElBQU0sRUFDekUxaUIsS0FBS2sxRixPQUNIUSxFQUFVM2xGLEtBQVYybEYsVUFBa0MxMUYsS0FBS2kxRixRQUFRdnlFLE9BQU8sRUFBRyxJQUN2RCxFQUNKMWlCLEtBQUtrMUYsT0FDSFEsRUFBVTNsRixLQUFWMmxGLFVBQWtDMTFGLEtBQUtpMUYsUUFBUXZ5RSxPQUFPLEVBQUcsSUFDdkQsRUFTQyxVQUFVVixHQUNmLE1BQU00ekUsRUFBZ0I3M0YsT0FBT3lLLEtBQUt4SSxLQUFLazFGLFFBQVEzK0UsSUFBSXpGLE1BQU9mLFVBQ3BDL1AsS0FBS280QixHQUFHK2xDLElBQUlwdUQsR0FBTTdSLElBQUk4akIsSUFDckI5akIsSUFBSThCLEtBQUttOUMsUUFBVSxHQUcxQyxhQURxQnY1QyxRQUFRZ1osSUFBSWc1RSxJQUNuQnZzRCxPQUFPLENBQUNoaEMsRUFBR0MsSUFBTUQsRUFBSUMsRUFBRyxHQVNqQyxXQUFXdXRGLEdBQ2hCOTNGLE9BQU95SyxLQUFLeEksS0FBS2sxRixRQUFRL3JGLFFBQVM0RyxJQUNoQyxNQUFNcVQsRUFBVyxVQUFTZ3pELFlBQVlqWSxJQUFJcHVELElBRTFDLElBQUErbEYsWUFBVzF5RSxFQUFXMnlFLElBQ3BCLzFGLEtBQUtrMUYsT0FBT2EsRUFBS0MsSUFBSWptRixNQUFRZ21GLEVBQUs3M0YsSUFBSThCLEtBQUttOUMsUUFBVSxFQUMxQixPQUF2Qm45QyxLQUFLbTFGLGdCQUNUbjFGLEtBQUttMUYsY0E4Q2Jya0YsZUFBMkJtbEYsR0FDekIsT0FBTyxJQUFJcnlGLFFBQVdrTixNQUFPcE4sSUFDM0J1UCxXQUFXbkMsVUFDVCxNQUFNb1AsRUFBUysxRSxJQUNmdnlGLEVBQVF3YyxJQUNQLEtBbkRzQnBMLENBQVMsS0FDNUIsTUFBTW9oRixFQUFNbjRGLE9BQU80OUMsT0FBTzM3QyxLQUFLazFGLFFBQVE3ckQsT0FBTyxDQUFDaGhDLEVBQUdDLElBQU1ELEVBQUlDLEVBQUcsR0FDL0R1dEYsRUFBVyxDQUFFanpDLFFBQVEsRUFBTWw3QyxLQUFNLElBQU13dUYsSUFDdkNsMkYsS0FBS20xRixjQUFnQixZQWF0QixZQUFZOVEsR0FFakIsTUFBTTU0QixFQUFpQixVQUFTMnFCLFVBQVUrZixXQUFXMXFDLFVBQVU0NEIsR0FDekRwNUIsRUFBaUNqckQsS0FBS205QyxNQUN6QzV6QyxNQUFNLEtBQ05tcUQsVUFDQXJxQixPQUFPLENBQUMvcUMsRUFBT1YsS0FBUyxDQUFHLENBQUNBLEdBQU9VLElBQVVtdEQsR0FFMUMycUMsRUFBVyxVQUNkaGdCLFlBQ0F1ZixXQUFXMzFGLEtBQUttK0QsSUFBSXB1RCxLQUFUL1AscUJBRWQsT0FBTyxJQUFBcTJGLFNBQU8sSUFBQWw0QixLQUFJaTRCLEVBQVVwMkYsS0FBS2kxRixTQUFVaHFDLEVBQVEsQ0FBRTR2QixPQUFPLElBYXZELFFBQ0wsT0FBTzc2RSxLQUFLbStELElBQUl3M0IsV0FwSFEsb0JBb0h3QngzQixJQUFJbitELEtBQUtpMUYsWSxnQkMxSTdELElBQUlxQixFQUFLLEVBQVEsSUFDYmhCLEVBQUssRUFBUSxJQUViRCxFQUFPQyxFQUNYRCxFQUFLaUIsR0FBS0EsRUFDVmpCLEVBQUtDLEdBQUtBLEVBRVZsNEYsRUFBT0QsUUFBVWs0RixHLGdCQ1BqQixJQVFJa0IsRUFDQUMsRUFUQUMsRUFBTSxFQUFRLEdBQ2RDLEVBQWMsRUFBUSxJQVd0QkMsRUFBYSxFQUNiQyxFQUFhLEVBK0ZqQng1RixFQUFPRCxRQTVGUCxTQUFZNmtCLEVBQVM0c0IsRUFBSzRKLEdBQ3hCLElBQUluN0MsRUFBSXV4QyxHQUFPNEosR0FBVSxFQUNyQmx3QyxFQUFJc21DLEdBQU8sR0FHWDdQLEdBREovYyxFQUFVQSxHQUFXLElBQ0YrYyxNQUFRdzNELEVBQ3ZCTSxPQUFnQ3Z6RixJQUFyQjBlLEVBQVE2MEUsU0FBeUI3MEUsRUFBUTYwRSxTQUFXTCxFQUtuRSxHQUFZLE1BQVJ6M0QsR0FBNEIsTUFBWjgzRCxFQUFrQixDQUNwQyxJQUFJQyxFQUFZTCxJQUNKLE1BQVIxM0QsSUFFRkEsRUFBT3czRCxFQUFVLENBQ0EsRUFBZk8sRUFBVSxHQUNWQSxFQUFVLEdBQUlBLEVBQVUsR0FBSUEsRUFBVSxHQUFJQSxFQUFVLEdBQUlBLEVBQVUsS0FHdEQsTUFBWkQsSUFFRkEsRUFBV0wsRUFBaUQsT0FBcENNLEVBQVUsSUFBTSxFQUFJQSxFQUFVLEtBUTFELElBQUlDLE9BQTBCenpGLElBQWxCMGUsRUFBUSswRSxNQUFzQi8wRSxFQUFRKzBFLE9BQVEsSUFBSTN6RixNQUFPQyxVQUlqRTJ6RixPQUEwQjF6RixJQUFsQjBlLEVBQVFnMUUsTUFBc0JoMUUsRUFBUWcxRSxNQUFRSixFQUFhLEVBR25FaCtDLEVBQU1tK0MsRUFBUUosR0FBZUssRUFBUUosR0FBWSxJQWNyRCxHQVhJaCtDLEVBQUssUUFBMEJ0MUMsSUFBckIwZSxFQUFRNjBFLFdBQ3BCQSxFQUFXQSxFQUFXLEVBQUksUUFLdkJqK0MsRUFBSyxHQUFLbStDLEVBQVFKLFNBQWlDcnpGLElBQWxCMGUsRUFBUWcxRSxRQUM1Q0EsRUFBUSxHQUlOQSxHQUFTLElBQ1gsTUFBTSxJQUFJejJGLE1BQU0sbURBR2xCbzJGLEVBQWFJLEVBQ2JILEVBQWFJLEVBQ2JSLEVBQVlLLEVBTVosSUFBSUksR0FBNEIsS0FBYixXQUhuQkYsR0FBUyxjQUcrQkMsR0FBUyxXQUNqRDF1RixFQUFFakwsS0FBTzQ1RixJQUFPLEdBQUssSUFDckIzdUYsRUFBRWpMLEtBQU80NUYsSUFBTyxHQUFLLElBQ3JCM3VGLEVBQUVqTCxLQUFPNDVGLElBQU8sRUFBSSxJQUNwQjN1RixFQUFFakwsS0FBWSxJQUFMNDVGLEVBR1QsSUFBSUMsRUFBT0gsRUFBUSxXQUFjLElBQVMsVUFDMUN6dUYsRUFBRWpMLEtBQU82NUYsSUFBUSxFQUFJLElBQ3JCNXVGLEVBQUVqTCxLQUFhLElBQU42NUYsRUFHVDV1RixFQUFFakwsS0FBTzY1RixJQUFRLEdBQUssR0FBTSxHQUM1QjV1RixFQUFFakwsS0FBTzY1RixJQUFRLEdBQUssSUFHdEI1dUYsRUFBRWpMLEtBQU93NUYsSUFBYSxFQUFJLElBRzFCdnVGLEVBQUVqTCxLQUFrQixJQUFYdzVGLEVBR1QsSUFBSyxJQUFJLzNGLEVBQUksRUFBR0EsRUFBSSxJQUFLQSxFQUN2QndKLEVBQUVqTCxFQUFJeUIsR0FBS2lnQyxFQUFLamdDLEdBR2xCLE9BQU84dkMsR0FBWThuRCxFQUFZcHVGLEssZ0JDekdqQyxJQUFJbXVGLEVBQU0sRUFBUSxHQUNkQyxFQUFjLEVBQVEsSUEyQjFCdDVGLEVBQU9ELFFBekJQLFNBQVk2a0IsRUFBUzRzQixFQUFLNEosR0FDeEIsSUFBSW43QyxFQUFJdXhDLEdBQU80SixHQUFVLEVBRUYsaUJBQWIsSUFDUjVKLEVBQWtCLFdBQVo1c0IsRUFBdUIsSUFBSTNoQixNQUFNLElBQU0sS0FDN0MyaEIsRUFBVSxNQUlaLElBQUk4eUUsR0FGSjl5RSxFQUFVQSxHQUFXLElBRUZpVixTQUFXalYsRUFBUXkwRSxLQUFPQSxLQU83QyxHQUpBM0IsRUFBSyxHQUFnQixHQUFWQSxFQUFLLEdBQWEsR0FDN0JBLEVBQUssR0FBZ0IsR0FBVkEsRUFBSyxHQUFhLElBR3pCbG1ELEVBQ0YsSUFBSyxJQUFJb2xCLEVBQUssRUFBR0EsRUFBSyxLQUFNQSxFQUMxQnBsQixFQUFJdnhDLEVBQUkyMkQsR0FBTThnQyxFQUFLOWdDLEdBSXZCLE9BQU9wbEIsR0FBTzhuRCxFQUFZNUIsSyw2QkN6QjVCOzs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxJQUFTL1AsZ0JBbkJFLFdBQ0csUUFrQjBCLGUsNkJDdEJ4QyxjLDhCQ0FBLDRDQXlCQSxTQUFTMTFFLElBQ0wsSUFBSUosRUFDSixPQUE2RSxRQUFwRUEsRUFBYyxPQUFUbkosV0FBMEIsSUFBVEEsVUFBa0IsRUFBU0EsS0FBS29KLGdCQUE2QixJQUFQRCxPQUFnQixFQUFTQSxFQUFHSyxXQUFhLEtBYWxJLFNBQVM2bkYsRUFBNkIzd0YsRUFBSyxlQUN2QyxRQUFtQyxVQUF4QjZJLEtBQTJELFdBQXhCQSxNQUMxQzdJLEVBQUdpTSxjQUFjbUwsTUFBTSw2QkE2Qi9CLFNBQVN3NUUsRUFBK0I1d0YsRUFBSyxlQUN6QyxPQWhCTyxlQUEwRixNQUFsRSxPQUFiNGMsZUFBa0MsSUFBYkEsY0FBc0IsRUFBU0EsU0FBU29SLGVBT25GLFNBQWlCaHVCLEVBQUssZUFDbEIsTUFBTyxZQUFZaEIsS0FBS2dCLEdBUUo2d0YsQ0FBUTd3RixHQUdoQyxTQUFTOHdGLElBQ0wsSUFDSSxNQUFNbjhFLEVBQVVyVixLQUFLcXRCLGFBQ2Z2MEIsRUFBTSxNQUNaLEdBQUl1YyxFQVVBLE9BUEFBLEVBQWlCLFFBQUV2YyxFQUFLLEtBQ3hCdWMsRUFBb0IsV0FBRXZjLElBTWxCdzRGLEtBR08sY0FLbkIsTUFBT3YwRixHQUdILE9BQU9tMUIsS0FBZSxjQUUxQixPQUFPLEVBTVgsU0FBU0EsSUFFTCxZQUEwQixJQUFYcnlCLEdBQ1gsc0JBQXVCQSxHQUN2QixrQkFBbUJBLEVBRTNCLFNBQVM0eEYsSUFDTCxPQWxGK0IsVUFBeEJsb0YsS0FBMkQsV0FBeEJBLEtBbUZ0QyxlQUNBOG5GLFFBcEVHLGVBQW1CLGdCQTBFdEJHLE1BRUN0L0QsSUFHVCxTQUFTdy9ELElBQ0wsT0FBT0wsS0FBc0Qsb0JBQWIvekU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NwRCxNQUFNcTBFLEVBQWMsQ0FDaEJDLE1BQU8sUUFDUEMsS0FBTSxPQUNOQyxRQUFTLFdBRVBDLEVBQVksSUE2QmxCL21GLGVBQWVnbkYsRUFBNEJqcUYsU0FDakNBLEVBQUtnUix1QkFDWCxNQUFNbXlCLEVBQU0rbUQsSUFDTm41RixFQUFNLElBL0JRLGNBK0JpQ2lQLEVBQUtpQyxPQUFPc0IsT0FBUXZELEVBQUtqUSxPQUMxRW96QyxhQUFpQyxFQUFTQSxFQUFJM2IsaUJBQzlDMmIsRUFBSTNiLGVBQWV0QyxRQUFRbjBCLEVBQUtpUCxFQUFLbXFGLG1CQXFCN0MsU0FBU0QsSUFDTCxNQUF5QixvQkFBWHh5RixPQUF5QkEsT0FBUzs7Ozs7Ozs7Ozs7Ozs7OztHQW1CcEQsTUFBTTB5RixFQUFZLElBRWxCLE1BQU1DLEVBQ0YsY0FFSWw0RixLQUFLbTRGLGdCQUFrQixJQUFpQixLQUN4Q240RixLQUFLbzRGLGdCQUFrQixJQUFpQixLQUV4Q3A0RixLQUFLcTRGLG1CQUFxQixLQUMxQnI0RixLQUFLcWhCLHFCQUF1QixJQUM1QnJoQixLQUFLdWdCLG9CQUFzQixJQUUvQixrQkFBa0IxUyxHQUVkLGFBRE03TixLQUFLczRGLDJCQUNKdDRGLEtBQUt1NEYsMkJBQTJCLzRFLFlBQVkzUixHQUV2RCxpQkFBaUJBLEVBQU00SSxFQUFVd3pCLEVBQVVoVSxHQUV2QyxhQURNajJCLEtBQUtzNEYsMkJBQ0p0NEYsS0FBS3U0RiwyQkFBMkJqMUQsV0FBV3oxQixFQUFNNEksRUFBVXd6QixFQUFVaFUsR0FFaEYsb0JBQW9CcG9CLEVBQU00SSxFQUFVd3pCLEVBQVVoVSxHQUUxQyxhQURNajJCLEtBQUtzNEYsMkJBQ0p0NEYsS0FBS3U0RiwyQkFBMkIvekQsY0FBYzMyQixFQUFNNEksRUFBVXd6QixFQUFVaFUsR0FFbkYsNkJBQTZCcG9CLEVBQU02VCxHQUMvQjFoQixLQUFLdTRGLDJCQUEyQjkwRCw2QkFBNkI1MUIsRUFBTTZULEdBRXZFLGtCQUFrQjdULEdBQ2QsT0FBTzdOLEtBQUt1NEYsMkJBQTJCLzBELGtCQUFrQjMxQixHQUU3RCw2QkFDSSxPQUFPMnBGLEtBQXNCeDNGLEtBQUttNEYsZ0JBQWdCNTRFLHVCQUV0RCxpQ0FFSSxPQURBMDRFLEVBQVVqNEYsS0FBS3E0RixtQkFBb0Isa0JBQzVCcjRGLEtBQUtxNEYsbUJBRWhCLGlDQUNJLEdBQUlyNEYsS0FBS3E0RixtQkFDTCxPQUlKLE1BQU1HLFFBM0pkMW5GLGlCQUNJLFFBQUswbUYsS0FHRSxJQUFJNXpGLFFBQVFGLElBQ2YsTUFBTSswRixFQUFZeGxGLFdBQVcsS0FFekJ2UCxHQUFRLElBbEhxQixLQW9IakMwZixTQUFTb0IsaUJBQWlCLGNBQWUsS0FDckN0UixhQUFhdWxGLEdBQ2IvMEYsR0FBUSxPQWdKWWcxRixHQUN4QjE0RixLQUFLcTRGLG1CQUFxQkcsRUFDcEJ4NEYsS0FBS280RixnQkFDTHA0RixLQUFLbTRGOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JuQixTQUFTUSxFQUFPNTVGLEdBQ1osT0FBT0EsRUFBTzQ1RixTQTZDbEIsU0FBU0MsRUFBcUI3NUYsR0FDMUIsTUFBTSxlQUFFdVUsR0FBb0J2VSxhQUFrQixJQUFnQkEsRUFBT21JLFdBQWFuSSxFQUNsRixJQUFLdVUsRUFDRCxPQUFPLEtBS1gsS0FBTXZVLGFBQWtCLE1BQ2hCLG1CQUFvQnVVLEdBQWtCLGdCQUFpQkEsRUFDdkQsT0FBTyxJQUFzQnVsRixxQkFBcUI5NUYsR0FHMUQsTUFBTXlYLEVBQWFsRCxFQUFla0QsV0FHbEMsSUFBS0EsR0FBY0EsSUFBZSxJQUFlckssU0FDN0MsT0FBTyxLQUVYLElBQUlzSyxFQUNKLE9BQVFELEdBQ0osS0FBSyxJQUFldEssT0FDaEJ1SyxFQUFXLElBQ1gsTUFDSixLQUFLLElBQWV6SyxTQUNoQnlLLEVBQVcsSUFDWCxNQUNKLEtBQUssSUFBZXhLLE9BQ2hCd0ssRUFBVyxJQUNYLE1BQ0osS0FBSyxJQUFlcEssUUFDaEJvSyxFQUFXLElBQ1gsTUFDSixRQUNJLE1BQU0sYUFBRTBTLEVBQVksaUJBQUVDLEVBQWdCLGlCQUFFL0MsRUFBZ0IsYUFBRUosRUFBWSxNQUFFRSxHQUFVN1MsRUFDbEYsT0FBSzhWLEdBQ0EvQyxHQUNBOEMsR0FDQWxELEVBSURBLEVBQ0l6UCxFQUFXdkcsV0FBVyxTQUNmLElBQXVCZ2EsUUFBUXpULEVBQVl5UCxHQUkzQyxJQUFvQjRDLFlBQVksQ0FDbkNyUyxhQUNBb08sYUFBY3BPLEVBQ2R5UCxlQUNBalEsUUFBU21ULEVBQ1R2UixZQUFhd1IsSUFJbEIsSUFBSSxJQUFrQjVTLEdBQVlnVCxXQUFXLENBQ2hEeFQsUUFBU21ULEVBQ1R2UixZQUFhd1IsRUFDYkwsU0FBVTVDLElBckJILEtBd0JuQixPQUFPcG5CLGFBQWtCLElBQ25CMFgsRUFBU3FpRixvQkFBb0IvNUYsR0FDN0IwWCxFQUFTb2lGLHFCQUFxQjk1RixHQUV4QyxTQUFTZzZGLEVBQWtCbHJGLEVBQU1tckYsR0FDN0IsT0FBT0EsRUFDRmwxRixNQUFNakIsSUFJUCxNQUhJQSxhQUFhLEtBMUZ6QixTQUFnQ2dMLEVBQU1oTCxHQUNsQyxJQUFJb00sRUFHSixNQUFNOEMsRUFBbUMsUUFBdkI5QyxFQUFLcE0sRUFBRXFFLGtCQUErQixJQUFQK0gsT0FBZ0IsRUFBU0EsRUFBR3FFLGVBQzdFLEdBQWUsb0NBQVh6USxFQUFFbUUsS0FBNEMsQ0FDL0JuRSxFQUNSdWUsU0FBVyxJQUFJNjNFLEVBQW9CcHJGLEVBQU0sSUFBMkJBLEVBQU1oTCxTQUVoRixHQUFJa1AsRUFBVSxDQUNmLE1BQU15WCxFQUFhb3ZFLEVBQXFCLzFGLEdBQ2xDcTJGLEVBQVVyMkYsRUFDWjJtQixJQUNBMHZFLEVBQVExdkUsV0FBYUEsRUFDckIwdkUsRUFBUXJvRixTQUFXa0IsRUFBU2xCLGVBQVl2TixFQUN4QzQxRixFQUFROWxGLE1BQVFyQixFQUFTcUIsWUFBUzlQLEVBQ2xDNDFGLEVBQVE3bEYsWUFBY3RCLEVBQVNzQixrQkFBZS9QLElBMkU5QzYxRixDQUF1QnRyRixFQUFNaEwsR0FFM0JBLElBRUw0SCxLQUFLK2UsSUFDTixNQUFNYyxFQUFnQmQsRUFBV2MsY0FDM0JqVyxFQUFPbVYsRUFBV25WLEtBQ3hCLE1BQU8sQ0FDSGlXLGdCQUNBZCxZQXZHb0JSLEVBdUdlUSxFQXRHcENvdkUsRUFBcUI1dkUsSUF1R3BCb3dFLG1CQUFvQixJQUEwQjV2RSxHQUM5Q25WLEtBQU1nbEYsRUFBS0MsWUFBWWpsRjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF6R25DLElBQWdDMlUsSUE2R2hDbFksZUFBZXlvRixFQUEwQjFyRixFQUFNMnJGLEdBQzNDLE1BQU1DLFFBQThCRCxFQUNwQyxNQUFPLENBQ0gzeUUsZUFBZ0I0eUUsRUFBc0I1eUUsZUFDdEM2eUUsUUFBVTV5RSxHQUFxQml5RSxFQUFrQmxyRixFQUFNNHJGLEVBQXNCQyxRQUFRNXlFLEtBRzdGLE1BQU1teUUsRUFDRixZQUFZcHJGLEVBQU11VCxHQUNkcGhCLEtBQUtvaEIsU0FBV0EsRUFDaEJwaEIsS0FBSzZOLEtBQWVBLEVBMUlWOHJGLFVBNElkLGNBQ0ksT0FBTzM1RixLQUFLb2hCLFNBQVNvUSxRQUV6QixZQUNJLE9BQU94eEIsS0FBS29oQixTQUFTcVEsTUFFekIsY0FBY25qQixHQUNWLE9BQU95cUYsRUFBa0JKLEVBQU8zNEYsS0FBSzZOLE1BQU83TixLQUFLb2hCLFNBQVN3NEUsY0FBY3RyRjs7Ozs7Ozs7Ozs7Ozs7OztHQW9CaEYsTUFBTStxRixFQUNGLFlBQVkxdEYsR0FDUjNMLEtBQUsyTCxVQUFZQSxFQUNqQjNMLEtBQUsweUIsWUFBYyxJQUFnQi9tQixHQUV2QyxtQkFBbUIwSSxHQUlmLE9BSEtnbEYsRUFBS1EsU0FBU3R1RSxJQUFJbFgsSUFDbkJnbEYsRUFBS1EsU0FBUzlxRixJQUFJc0YsRUFBTSxJQUFJZ2xGLEVBQUtobEYsSUFFOUJnbEYsRUFBS1EsU0FBUzM3RixJQUFJbVcsR0FFN0IsU0FDSSxPQUFPclUsS0FBSzJMLFVBQVVzcEIsU0FFMUIsU0FDSSxPQUFPajFCLEtBQUsyTCxVQUFVaU8sU0FFMUIsU0FDSSxPQUFPNVosS0FBSzJMLFVBQVVpTixTQUUxQixpQkFBaUJYLEdBQ2IsT0FBT2pZLEtBQUsyTCxVQUFVZ08saUJBQWlCMUIsR0FFM0MsV0FBV0EsR0FDUCxPQUFPalksS0FBSzJMLFVBQVU0SixXQUFXMEMsR0FFckMsa0NBQWtDdVIsR0FDOUIsT0FBT3hwQixLQUFLZ3NCLG1CQUFtQnhDLEdBRW5DLHlCQUF5QkEsR0FDckIsT0FBT3V2RSxFQUFrQi80RixLQUFLNk4sS0FBTSxJQUF1QjdOLEtBQUsyTCxVQUFXNmQsSUFFL0UsMEJBQTBCblcsRUFBYWd1QixHQUNuQyxPQUFPazRELEVBQTBCdjVGLEtBQUs2TixLQUFNLElBQXdCN04sS0FBSzJMLFVBQVcwSCxFQUFhZ3VCLElBRXJHLG9CQUFvQjVxQixHQUNoQixPQUFPc2lGLEVBQWtCLzRGLEtBQUs2TixLQUFNLElBQWtCN04sS0FBSzJMLFVBQVc4SyxFQUFVeWhGLElBRXBGLHVCQUF1QnpoRixHQUVuQixhQURNcWhGLEVBQTRCLElBQWM5M0YsS0FBSzZOLE9BQzlDLElBQXFCN04sS0FBSzJMLFVBQVc4SyxFQUFVeWhGLEdBRTFELDRDQUE0QzF1RSxHQUN4QyxPQUFPeHBCLEtBQUtpc0IsNkJBQTZCekMsR0FFN0MsbUNBQW1DQSxHQUMvQixPQUFPdXZFLEVBQWtCLzRGLEtBQUs2TixLQUFNLElBQWlDN04sS0FBSzJMLFVBQVc2ZCxJQUV6Riw4QkFBOEJuVyxFQUFhZ3VCLEdBQ3ZDLE9BQU9rNEQsRUFBMEJ2NUYsS0FBSzZOLEtBQU0sSUFBa0M3TixLQUFLMkwsVUFBVzBILEVBQWFndUIsSUFFL0csd0JBQXdCNXFCLEdBQ3BCLE9BQU9zaUYsRUFBa0IvNEYsS0FBSzZOLEtBQU0sSUFBNEI3TixLQUFLMkwsVUFBVzhLLEVBQVV5aEYsSUFFOUYsaUNBQWlDemhGLEdBRTdCLGFBRE1xaEYsRUFBNEIsSUFBYzkzRixLQUFLNk4sT0FDOUMsSUFBK0I3TixLQUFLMkwsVUFBVzhLLEVBQVV5aEYsR0FFcEUsc0JBQXNCbnJFLEdBQ2xCLE9BQU8sSUFBMEIvc0IsS0FBSzJMLFVBQVdvaEIsR0FFckQsYUFBYXZXLEdBRVQsYUFETSxLQUFXeFcsS0FBSzJMLFVBQVc2SyxHQUMxQnhXLEtBRVgsWUFBWXN1QixHQUNSLE9BQU8sS0FBZ0J0dUIsS0FBSzJMLFVBQVcyaUIsR0FFM0MsZUFBZUosR0FDWCxPQUFPLEtBQW1CbHVCLEtBQUsyTCxVQUFXdWlCLEdBRTlDLGtCQUFrQjRyRSxHQUNkLE9BQU8sS0FBc0I5NUYsS0FBSzJMLFVBQVdtdUYsR0FFakQsY0FBY3pwRSxHQUNWLE9BQU8sS0FBa0Jyd0IsS0FBSzJMLFVBQVcwa0IsR0FFN0Msd0JBQXdCL0IsRUFBVXZCLEdBQzlCLE9BQU8sS0FBNEIvc0IsS0FBSzJMLFVBQVcyaUIsRUFBVXZCLEdBRWpFLG9CQUNJLE9BQU8vc0IsS0FBSzJMLFVBQVU4TCxjQUUxQixrQkFDSSxPQUFPelgsS0FBSzJMLFVBQVV5TCxZQUUxQixlQUNJLE9BQU9wWCxLQUFLMkwsVUFBVW1LLFNBRTFCLGtCQUNJLE9BQU85VixLQUFLMkwsVUFBVTBILFlBRTFCLG1CQUNJLE9BQU9yVCxLQUFLMkwsVUFBVW1MLGFBRTFCLG1CQUNJLE9BQU85VyxLQUFLMkwsVUFBVWdNLGFBRTFCLGVBQ0ksT0FBTzNYLEtBQUsyTCxVQUFVa0YsU0FFMUIsa0JBQ0ksT0FBTzdRLEtBQUsyTCxVQUFVZ0wsWUFFMUIsWUFDSSxPQUFPM1csS0FBSzJMLFVBQVV5SCxNQUUxQixlQUNJLE9BQU9wVCxLQUFLMkwsVUFBVWlMLFNBRTFCLGlCQUNJLE9BQU81VyxLQUFLMkwsVUFBVTZLLFdBRTFCLFVBQ0ksT0FBT3hXLEtBQUsyTCxVQUFVekgsSUFFMUIsV0FDSSxPQUFPbEUsS0FBSzJMLFVBQVVrQyxNQUs5QndyRixFQUFLUSxTQUFXLElBQUlwbkU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JwQixNQUFNc25FLEVBQVksSUFDbEIsTUFBTUMsRUFDRixZQUFZNTdFLEVBQUszSCxHQUViLEdBREF6VyxLQUFLb2UsSUFBTUEsRUFDUDNILEVBQVNvaEUsZ0JBR1QsT0FGQTczRSxLQUFLMkwsVUFBWThLLEVBQVM2MkIsb0JBQzFCdHRDLEtBQUtpNkYscUJBR1QsTUFBTSxPQUFFN29GLEdBQVdnTixFQUFJNEQsUUFFdkIrM0UsRUFBVTNvRixFQUFRLGtCQUF5QyxDQUN2RHJELFFBQVNxUSxFQUFJeGdCLE9BRWpCLElBQUlzOEYsRUFBZSxDQUFDLEtBRXBCLEdBQXNCLG9CQUFYMzBGLE9BQXdCLENBSS9CMjBGLEVBbmJaLFNBQXNDOW9GLEVBQVFyRCxHQUMxQyxNQUFNaWpDLEVBQU0rbUQsSUFDWixLQUFNL21ELGFBQWlDLEVBQVNBLEVBQUkzYixnQkFDaEQsTUFBTyxHQUVYLE1BQU16MkIsRUFBTSxJQXpDUSxjQXlDaUN3UyxFQUFRckQsR0FFN0QsT0FEb0JpakMsRUFBSTNiLGVBQWVwQyxRQUFRcjBCLElBRTNDLEtBQUs2NEYsRUFBWUUsS0FDYixNQUFPLENBQUMsS0FDWixLQUFLRixFQUFZQyxNQUNiLE1BQU8sQ0FBQyxJQUErQixLQUMzQyxLQUFLRCxFQUFZRyxRQUNiLE1BQU8sQ0FBQyxLQUNaLFFBQ0ksTUFBTyxJQW9hUXVDLENBQTZCL29GLEVBQVFnTixFQUFJeGdCLE1BQ3hELElBQUssTUFBTTZkLElBQWUsQ0FDdEIsSUFDQSxJQUNBLEtBRUt5K0UsRUFBYXR6RixTQUFTNlUsSUFDdkJ5K0UsRUFBYTk0RixLQUFLcWEsR0FLOUJzK0UsRUFBVTNvRixFQUFRLGtCQUF5QyxDQUN2RHJELFFBQVNxUSxFQUFJeGdCLE9BR2pCLE1BQU13akIsRUFBNkIsb0JBQVg3YixPQUF5QjJ5RixPQUE4QjUwRixFQUMvRXRELEtBQUsyTCxVQUFZOEssRUFBU3UzQixXQUFXLENBQ2pDaHNCLFFBQVMsQ0FDTHZHLFlBQWF5K0UsRUFDYjk2RSxzQkFBdUJnQyxLQUcvQnBoQixLQUFLMkwsVUFBVThoQyxnQkFBZ0IsS0FDL0J6dEMsS0FBS2k2RixxQkFFVCxxQkFDSSxPQUFPajZGLEtBQUsyTCxVQUFVMFMsZUFFMUIsa0JBQ0ksT0FBS3JlLEtBQUsyTCxVQUFVNkksWUFHYjZrRixFQUFLQyxZQUFZdDVGLEtBQUsyTCxVQUFVNkksYUFGNUIsS0FJZixtQkFDSSxPQUFPeFUsS0FBSzJMLFVBQVU0RixhQUUxQixpQkFBaUJBLEdBQ2J2UixLQUFLMkwsVUFBVTRGLGFBQWVBLEVBRWxDLGVBQ0ksT0FBT3ZSLEtBQUsyTCxVQUFVcVQsU0FFMUIsZUFDSSxPQUFPaGYsS0FBSzJMLFVBQVVrRixTQUUxQixhQUFhMDVCLEdBQ1R2cUMsS0FBSzJMLFVBQVVrRixTQUFXMDVCLEVBRTlCLG9CQUNJdnFDLEtBQUsyTCxVQUFVeXVGLG9CQUVuQixVQUNJLE9BQU9wNkYsS0FBSzJMLFVBQVU4SSxVQUUxQixZQUFZL0ssRUFBS3NZLEdBQ2IsSUFBd0JoaUIsS0FBSzJMLFVBQVdqQyxFQUFLc1ksR0FFakQsZ0JBQWdCaGIsR0FDWixPQUFPLElBQW9CaEgsS0FBSzJMLFVBQVczRSxHQUUvQyxnQkFBZ0JBLEdBQ1osT0FBTyxJQUFvQmhILEtBQUsyTCxVQUFXM0UsR0FFL0MscUJBQXFCQSxFQUFNa25CLEdBQ3ZCLE9BQU8sSUFBeUJsdUIsS0FBSzJMLFVBQVczRSxFQUFNa25CLEdBRTFELHFDQUFxQzlhLEVBQU9rUyxHQUN4QyxPQUFPeXpFLEVBQWtCLzRGLEtBQUsyTCxVQUFXLElBQW1DM0wsS0FBSzJMLFVBQVd5SCxFQUFPa1MsSUFFdkcsdUJBQXVCbFMsR0FDbkIsT0FBT3BULEtBQUtrdkIsMkJBQTJCOWIsR0FFM0MsMkJBQTJCQSxHQUN2QixPQUFPLElBQStCcFQsS0FBSzJMLFVBQVd5SCxHQUUxRCxzQkFBc0I0VSxHQUNsQixPQUFPLElBQTBCaG9CLEtBQUsyTCxVQUFXcWMsR0FFckQsMEJBQ0kreEUsRUFBVXhDLElBQTZCdjNGLEtBQUsyTCxVQUFXLCtDQUN2RCxNQUFNNmQsUUFBbUIsSUFBc0J4cEIsS0FBSzJMLFVBQVd1c0YsR0FDL0QsT0FBSzF1RSxFQU1FdXZFLEVBQWtCLzRGLEtBQUsyTCxVQUFXL0gsUUFBUUYsUUFBUThsQixJQUw5QyxDQUNIQSxXQUFZLEtBQ1puVixLQUFNLE1BUWxCLHVCQUF1QndOLEdBQ25CLElBQTJCN2hCLEtBQUsyTCxVQUFXa1csR0FFL0MsbUJBQW1COVcsRUFBZ0JzdkYsRUFBU3A1RSxHQUN4QyxNQUFNLEtBQUVyVyxFQUFJLE1BQUU3SCxFQUFLLFNBQUUrSCxHQUFhd3ZGLEVBQWN2dkYsRUFBZ0JzdkYsRUFBU3A1RSxHQUN6RSxPQUFPamhCLEtBQUsyTCxVQUFVNHVGLG1CQUFtQjN2RixFQUFNN0gsRUFBTytILEdBRTFELGlCQUFpQkMsRUFBZ0JzdkYsRUFBU3A1RSxHQUN0QyxNQUFNLEtBQUVyVyxFQUFJLE1BQUU3SCxFQUFLLFNBQUUrSCxHQUFhd3ZGLEVBQWN2dkYsRUFBZ0JzdkYsRUFBU3A1RSxHQUN6RSxPQUFPamhCLEtBQUsyTCxVQUFVc2hDLGlCQUFpQnJpQyxFQUFNN0gsRUFBTytILEdBRXhELHNCQUFzQnNJLEVBQU8yWixHQUN6QixPQUFPLElBQTBCL3NCLEtBQUsyTCxVQUFXeUgsRUFBTzJaLEdBRTVELHVCQUF1QjNaLEVBQU8yWixHQUMxQixPQUFPLElBQTJCL3NCLEtBQUsyTCxVQUFXeUgsRUFBTzJaLFFBQXNCenBCLEdBRW5GLHFCQUFxQm1ZLEdBRWpCLElBQUkrK0UsRUFDSixPQXBrQlIsU0FBc0Mzc0YsRUFBTTROLEdBQ3hDbzhFLEVBQVU5NUYsT0FBTzQ5QyxPQUFPODdDLEdBQWE3d0YsU0FBUzZVLEdBQWM1TixFQUFNLDRCQUU5RCxjQUVBZ3FGLEVBQVVwOEUsSUFBZ0JnOEUsRUFBWUcsUUFBUy9wRixFQUFNLGdDQUdyRCxjQUVBZ3FGLEVBQVVwOEUsSUFBZ0JnOEUsRUFBWUUsS0FBTTlwRixFQUFNLGdDQUdsRG1xQixJQUdBNi9ELEVBQVVwOEUsSUFBZ0JnOEUsRUFBWUUsTUFDakNsOEUsSUFBZ0JnOEUsRUFBWUMsT0FBUyxjQUF5QjdwRixFQUFNLGdDQUk3RWdxRixFQUFVcDhFLElBQWdCZzhFLEVBQVlFLE1BQVFMLElBQTBCenBGLEVBQU0sZ0NBNmlCMUU0c0YsQ0FBNkJ6NkYsS0FBSzJMLFVBQVc4UCxHQUVyQ0EsR0FDSixLQUFLZzhFLEVBQVlHLFFBQ2I0QyxFQUFZLElBQ1osTUFDSixLQUFLL0MsRUFBWUMsTUFLYjhDLFFBSHdDLElBQ3RCLEtBQ2IzOUUsZUFFQyxJQUNBLElBQ04sTUFDSixLQUFLNDZFLEVBQVlFLEtBQ2I2QyxFQUFZLElBQ1osTUFDSixRQUNJLE9BQU8sSUFBVSxpQkFBdUMsQ0FDcER6c0YsUUFBUy9OLEtBQUsyTCxVQUFVL04sT0FHcEMsT0FBT29DLEtBQUsyTCxVQUFVcVYsZUFBZXc1RSxHQUV6QyxvQ0FBb0NoeEUsR0FDaEMsT0FBT3hwQixLQUFLK3JCLHFCQUFxQnZDLEdBRXJDLG9CQUNJLE9BQU91dkUsRUFBa0IvNEYsS0FBSzJMLFVBQVcsS0FBc0IzTCxLQUFLMkwsWUFFeEUscUJBQXFCNmQsR0FDakIsT0FBT3V2RSxFQUFrQi80RixLQUFLMkwsVUFBVyxLQUF5QjNMLEtBQUsyTCxVQUFXNmQsSUFFdEYsc0JBQXNCeGxCLEdBQ2xCLE9BQU8rMEYsRUFBa0IvNEYsS0FBSzJMLFVBQVcsS0FBMEIzTCxLQUFLMkwsVUFBVzNILElBRXZGLDJCQUEyQm9QLEVBQU9rUyxHQUM5QixPQUFPeXpFLEVBQWtCLzRGLEtBQUsyTCxVQUFXLEtBQStCM0wsS0FBSzJMLFVBQVd5SCxFQUFPa1MsSUFFbkcsb0JBQW9CbFMsRUFBTzRVLEdBQ3ZCLE9BQU8rd0UsRUFBa0IvNEYsS0FBSzJMLFVBQVcsS0FBd0IzTCxLQUFLMkwsVUFBV3lILEVBQU80VSxJQUU1RixzQkFBc0IzVSxFQUFhZ3VCLEdBQy9CLE9BQU9rNEQsRUFBMEJ2NUYsS0FBSzJMLFVBQVcsS0FBMEIzTCxLQUFLMkwsVUFBVzBILEVBQWFndUIsSUFFNUcsc0JBQXNCNXFCLEdBRWxCLE9BREFzakYsRUFBVXhDLElBQTZCdjNGLEtBQUsyTCxVQUFXLCtDQUNoRG90RixFQUFrQi80RixLQUFLMkwsVUFBVyxLQUFvQjNMLEtBQUsyTCxVQUFXOEssRUFBVXloRixJQUUzRix5QkFBeUJ6aEYsR0FHckIsT0FGQXNqRixFQUFVeEMsSUFBNkJ2M0YsS0FBSzJMLFVBQVcscURBQ2pEbXNGLEVBQTRCOTNGLEtBQUsyTCxXQUNoQyxLQUF1QjNMLEtBQUsyTCxVQUFXOEssRUFBVXloRixHQUU1RCxrQkFBa0I3akYsR0FHZCxPQUFPclUsS0FBSzJMLFVBQVUrdUYsa0JBQWtCcm1GLEdBRTVDLHdCQUF3QnJOLEdBQ3BCLE9BQU8sS0FBNEJoSCxLQUFLMkwsVUFBVzNFLEdBRXZELFNBQ0ksT0FBT2hILEtBQUsyTCxVQUVoQixVQUNJLE9BQU8zTCxLQUFLMkwsVUFBVXd0RSxVQUUxQixxQkFDSW41RSxLQUFLMkwsVUFBVWd1RixRQUFVLElBQU0zNUYsTUFJdkMsU0FBU3M2RixFQUFjdnZGLEVBQWdCaEksRUFBTytILEdBQzFDLElBQUlGLEVBQU9HLEVBQ21CLG1CQUFuQkEsS0FDSkgsT0FBTTdILFFBQU8rSCxZQUFhQyxHQUdqQyxNQUFNNHZGLEVBQVUvdkYsRUFFaEIsTUFBTyxDQUNIQSxLQUZheUosR0FBU3NtRixFQUFRdG1GLEdBQVFnbEYsRUFBS0MsWUFBWWpsRixJQUd2RHRSLE1BQU9BLEVBQ1ArSDs7Ozs7Ozs7Ozs7Ozs7OztHQVpSa3ZGLEVBQUt2QyxZQUFjQSxFQWdDbkIsTUFBTW1ELEVBQ0YsY0FDSTU2RixLQUFLd1csV0FBYSxRQUdsQnhXLEtBQUsyTCxVQUFZLElBQUksSUFBc0JndEYsRUFBTyxJQUFTOXFGLFNBRS9ELGtCQUFrQmdaLEVBQWdCQyxHQUM5QixPQUFPLElBQXNCMEMsV0FBVzNDLEVBQWdCQyxHQUU1RCxrQkFBa0IwWixFQUFrQmEsR0FDaEMsT0FBT3JoQyxLQUFLMkwsVUFBVWt2RixrQkFHdEJyNkQsRUFBa0JhLEdBRXRCLFNBQ0ksT0FBT3JoQyxLQUFLMkwsV0FHcEJpdkYsRUFBa0JuNUQscUJBQXVCLElBQXNCQSxxQkFDL0RtNUQsRUFBa0I3eUUsWUFBYyxJQUFzQkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0J0RCxNQUFNMVosRUFBVSxJQUNoQixNQUFNMnZCLEVBQ0YsWUFBWWhDLEVBQVdDLEVBQVk3ZCxFQUFNLElBQVNBLE9BQzlDLElBQUluUCxFQUVKWixFQUErQixRQUF0QlksRUFBS21QLEVBQUk0RCxlQUE0QixJQUFQL1MsT0FBZ0IsRUFBU0EsRUFBR21DLE9BQVEsa0JBQXlDLENBQ2hIckQsUUFBU3FRLEVBQUl4Z0IsT0FFakJvQyxLQUFLMkwsVUFBWSxJQUFJLElBQXNCcXdCLEVBRTNDQyxFQUdBN2QsRUFBSXZRLFFBQ0o3TixLQUFLbUYsS0FBT25GLEtBQUsyTCxVQUFVeEcsS0FFL0IsUUFDSW5GLEtBQUsyTCxVQUFVdzZCLFFBRW5CLFNBQ0ksT0FBT25tQyxLQUFLMkwsVUFBVWd5QixTQUUxQixTQUNJLE9BQU8zOUIsS0FBSzJMLFVBQVU0MEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QjlCLElBQTRCdHlCLEtBb0NULEtBbkNOa25DLFNBQVNnL0Msa0JBQWtCLElBQUksSUFKMUIsY0FJK0NuNEQsSUFFekQsTUFBTTVkLEVBQU00ZCxFQUFVcVIsWUFBWSxjQUFjQyxlQUMxQ3d0RCxFQUFlOStELEVBQVVxUixZQUFZLFFBQzNDLE9BQU8sSUFBSTJzRCxFQUFLNTdFLEVBQUswOEUsSUFDdEIsVUFDRUMsZ0JBQWdCLENBQ2pCQyxlQUFnQixDQUNaQyxVQUFXLENBQ1AxdUYsYUFBYyxJQUF3QkEsYUFDdENDLGVBQWdCLElBQXdCQSxlQUN4Q0MsY0FBZSxJQUF3QkEsY0FDdkNDLDhCQUErQixJQUF3QkEsOEJBQ3ZEQyx3QkFBeUIsSUFBd0JBLHdCQUNqREMsYUFBYyxJQUF3QkEsZUFHOUNrYixrQkFBbUIsSUFDbkJ1QixxQkFBc0IsSUFDdEJPLG1CQUFvQixJQUNwQkgsbUJBQW9CLElBQ3BCYixjQUFlLElBQ2ZtQixpQkFBa0IsSUFDbEI2d0Usa0JBQW1CQSxFQUNuQmx1RCwwQkFBMkIsSUFDM0IxTyxrQkFBbUJBLEVBQ25COVQsb0JBQXFCLElBQ3JCOHZFLE9BQ0FyMUUsZUFBZ0IsSUFDaEJwa0IsTUFBTyxNQUVOcXRDLHFCQUFxQixRQUNyQnN0RCxzQkFBcUIsSUFDMUJqdEYsRUFBUzgyRSxnQkEzOEJGLHdCQUNHLFcsK0JDTGQsSUFPSW9XLEVBQ0FDLEVBUkF4MUYsRUFBVXhJLEVBQU9ELFFBQVUsR0FVL0IsU0FBU2srRixJQUNMLE1BQU0sSUFBSTk2RixNQUFNLG1DQUVwQixTQUFTKzZGLElBQ0wsTUFBTSxJQUFJLzZGLE1BQU0scUNBc0JwQixTQUFTZzdGLEVBQVdDLEdBQ2hCLEdBQUlMLElBQXFCbG9GLFdBRXJCLE9BQU9BLFdBQVd1b0YsRUFBSyxHQUczQixJQUFLTCxJQUFxQkUsSUFBcUJGLElBQXFCbG9GLFdBRWhFLE9BREFrb0YsRUFBbUJsb0YsV0FDWkEsV0FBV3VvRixFQUFLLEdBRTNCLElBRUksT0FBT0wsRUFBaUJLLEVBQUssR0FDL0IsTUFBTTM0RixHQUNKLElBRUksT0FBT3M0RixFQUFpQjM5RixLQUFLLEtBQU1nK0YsRUFBSyxHQUMxQyxNQUFNMzRGLEdBRUosT0FBT3M0RixFQUFpQjM5RixLQUFLd0MsS0FBTXc3RixFQUFLLE1BdkNuRCxXQUNHLElBRVFMLEVBRHNCLG1CQUFmbG9GLFdBQ1lBLFdBRUFvb0YsRUFFekIsTUFBT3g0RixHQUNMczRGLEVBQW1CRSxFQUV2QixJQUVRRCxFQUR3QixtQkFBakJsb0YsYUFDY0EsYUFFQW9vRixFQUUzQixNQUFPejRGLEdBQ0x1NEYsRUFBcUJFLEdBakI3QixHQXdFQSxJQUVJRyxFQUZBcDhFLEVBQVEsR0FDUnE4RSxHQUFXLEVBRVhDLEdBQWMsRUFFbEIsU0FBU0MsSUFDQUYsR0FBYUQsSUFHbEJDLEdBQVcsRUFDUEQsRUFBYWo4RixPQUNiNmYsRUFBUW84RSxFQUFhdHVDLE9BQU85dEMsR0FFNUJzOEUsR0FBYyxFQUVkdDhFLEVBQU03ZixRQUNOcThGLEtBSVIsU0FBU0EsSUFDTCxJQUFJSCxFQUFKLENBR0EsSUFBSW5rRSxFQUFVZ2tFLEVBQVdLLEdBQ3pCRixHQUFXLEVBR1gsSUFEQSxJQUFJNytELEVBQU14ZCxFQUFNN2YsT0FDVnE5QixHQUFLLENBR1AsSUFGQTQrRCxFQUFlcDhFLEVBQ2ZBLEVBQVEsS0FDQ3M4RSxFQUFhOStELEdBQ2Q0K0QsR0FDQUEsRUFBYUUsR0FBWWphLE1BR2pDaWEsR0FBYyxFQUNkOStELEVBQU14ZCxFQUFNN2YsT0FFaEJpOEYsRUFBZSxLQUNmQyxHQUFXLEVBbkVmLFNBQXlCSSxHQUNyQixHQUFJVixJQUF1QmxvRixhQUV2QixPQUFPQSxhQUFhNG9GLEdBR3hCLElBQUtWLElBQXVCRSxJQUF3QkYsSUFBdUJsb0YsYUFFdkUsT0FEQWtvRixFQUFxQmxvRixhQUNkQSxhQUFhNG9GLEdBRXhCLElBRVdWLEVBQW1CVSxHQUM1QixNQUFPajVGLEdBQ0wsSUFFSSxPQUFPdTRGLEVBQW1CNTlGLEtBQUssS0FBTXMrRixHQUN2QyxNQUFPajVGLEdBR0wsT0FBT3U0RixFQUFtQjU5RixLQUFLd0MsS0FBTTg3RixLQWdEN0NDLENBQWdCeGtFLElBaUJwQixTQUFTeWtFLEVBQUtSLEVBQUtTLEdBQ2ZqOEYsS0FBS3c3RixJQUFNQSxFQUNYeDdGLEtBQUtpOEYsTUFBUUEsRUFZakIsU0FBUzl3RixLQTVCVHZGLEVBQVFzMkYsU0FBVyxTQUFVVixHQUN6QixJQUFJcHVGLEVBQU8sSUFBSS9NLE1BQU0ybEIsVUFBVXhtQixPQUFTLEdBQ3hDLEdBQUl3bUIsVUFBVXhtQixPQUFTLEVBQ25CLElBQUssSUFBSW5DLEVBQUksRUFBR0EsRUFBSTJvQixVQUFVeG1CLE9BQVFuQyxJQUNsQytQLEVBQUsvUCxFQUFJLEdBQUsyb0IsVUFBVTNvQixHQUdoQ2dpQixFQUFNamUsS0FBSyxJQUFJNDZGLEVBQUtSLEVBQUtwdUYsSUFDSixJQUFqQmlTLEVBQU03ZixRQUFpQms4RixHQUN2QkgsRUFBV00sSUFTbkJHLEVBQUsvOEYsVUFBVXlpRixJQUFNLFdBQ2pCMWhGLEtBQUt3N0YsSUFBSWhoQyxNQUFNLEtBQU14NkQsS0FBS2k4RixRQUU5QnIyRixFQUFRdTJGLE1BQVEsVUFDaEJ2MkYsRUFBUU0sU0FBVSxFQUNsQk4sRUFBUWd0RCxJQUFNLEdBQ2RodEQsRUFBUXcyRixLQUFPLEdBQ2Z4MkYsRUFBUTQzQyxRQUFVLEdBQ2xCNTNDLEVBQVF5MkYsU0FBVyxHQUluQnoyRixFQUFRMDlDLEdBQUtuNEMsRUFDYnZGLEVBQVE0bEYsWUFBY3JnRixFQUN0QnZGLEVBQVFtbEYsS0FBTzUvRSxFQUNmdkYsRUFBUTAyRixJQUFNbnhGLEVBQ2R2RixFQUFRNmxGLGVBQWlCdGdGLEVBQ3pCdkYsRUFBUTIyRixtQkFBcUJweEYsRUFDN0J2RixFQUFRNDJGLEtBQU9yeEYsRUFDZnZGLEVBQVE2MkYsZ0JBQWtCdHhGLEVBQzFCdkYsRUFBUTgyRixvQkFBc0J2eEYsRUFFOUJ2RixFQUFRMnRCLFVBQVksU0FBVTMxQixHQUFRLE1BQU8sSUFFN0NnSSxFQUFRKzJGLFFBQVUsU0FBVS8rRixHQUN4QixNQUFNLElBQUkyQyxNQUFNLHFDQUdwQnFGLEVBQVFnM0YsSUFBTSxXQUFjLE1BQU8sS0FDbkNoM0YsRUFBUWkzRixNQUFRLFNBQVVyK0MsR0FDdEIsTUFBTSxJQUFJaitDLE1BQU0sbUNBRXBCcUYsRUFBUWszRixNQUFRLFdBQWEsT0FBTyxJLDZCQ3ZMcEMsdXlIOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3dCQSxTQUFTQyxFQUFtQnRpQixFQUFZejRELEdBQ3BDLFFBQWdCMWUsSUFBWjBlLEVBQ0EsTUFBTyxDQUNINjRELE9BQU8sR0FHZixRQUE0QnYzRSxJQUF4QjBlLEVBQVE4NEQsa0JBQStDeDNFLElBQWxCMGUsRUFBUTY0RCxNQUM3QyxNQUFNLElBQUksSUFBZSxtQkFBb0Isc0NBQXNDSiwyREFHdkYsT0FBT3o0RDs7Ozs7Ozs7Ozs7Ozs7OztHQW9CWCxTQUFTZzdFLElBQ0wsR0FBMEIsb0JBQWZ0dUQsV0FDUCxNQUFNLElBQUksSUFBZSxnQkFBaUIsc0RBSWxELFNBQVN1dUQsSUFDTCxJQUFLLGNBQ0QsTUFBTSxJQUFJLElBQWUsZ0JBQWlCLDJEQUlsRCxNQUFNLEVBQ0YsWUFBWXR4RixHQUNSM0wsS0FBSzJMLFVBQVlBLEVBRXJCLHdCQUF3QmpNLEdBRXBCLE9BREF1OUYsSUFDTyxJQUFJLEVBQUssSUFBTW5qRCxpQkFBaUJwNkMsSUFFM0Msc0JBQXNCdThGLEdBRWxCLE9BREFlLElBQ08sSUFBSSxFQUFLLElBQU1qakQsZUFBZWtpRCxJQUV6QyxXQUVJLE9BREFnQixJQUNPajlGLEtBQUsyTCxVQUFVdXdDLFdBRTFCLGVBRUksT0FEQThnRCxJQUNPaDlGLEtBQUsyTCxVQUFVcStDLGVBRTFCLFFBQVFrekMsR0FDSixPQUFPbDlGLEtBQUsyTCxVQUFVdXNDLFFBQVFnbEQsRUFBTXZ4RixXQUV4QyxXQUNJLE1BQU8sZ0JBQWtCM0wsS0FBS2s4QyxXQUFhOzs7Ozs7Ozs7Ozs7Ozs7O0dBb0JuRCxTQUFTaWhELEVBQWtCajFGLEdBQ3ZCLE9BTUosU0FBOEJBLEVBQUs4QyxHQUMvQixHQUFtQixpQkFBUjlDLEdBQTRCLE9BQVJBLEVBQzNCLE9BQU8sRUFFWCxNQUFNbkosRUFBU21KLEVBQ2YsSUFBSyxNQUFNK0MsS0FBVUQsRUFDakIsR0FBSUMsS0FBVWxNLEdBQW9DLG1CQUFuQkEsRUFBT2tNLEdBQ2xDLE9BQU8sRUFHZixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0dBaEJBQyxDQUFxQmhELEVBQUssQ0FBQyxPQUFRLFFBQVMsYUFzQ3ZELE1BQU0sRUFDRiwyQkFBMkJrdUUsRUFBV3ZHLEdBQ2xDLE9BQU8sWUFBMkJ1RyxFQUFVenFFLFVBQVcsQ0FBRWtrRSxtQkFFN0QsbUNBQW1DdUcsR0FDL0IsT0FBTyxZQUFtQ0EsRUFBVXpxRSxXQUV4RCwwQkFBMEJ5cUUsR0FDdEIsT0FBTyxZQUEwQkEsRUFBVXpxRSxZQU9uRCxNQUFNLEVBQ0YsWUFBWXl4RixFQUFpQnp4RixFQUFXMHhGLEdBQ3BDcjlGLEtBQUsyTCxVQUFZQSxFQUNqQjNMLEtBQUtxOUYscUJBQXVCQSxFQUM1QnI5RixLQUFLbTFDLFNBQVcsQ0FDWmxnQixPQUFRLElBQU1qMUIsS0FBS3d5RSxhQUVqQjRxQixhQUEyQixNQUM3QnA5RixLQUFLczlGLFdBQWFGLEdBRzFCLGtCQUNJLE9BQU9wOUYsS0FBSzJMLFVBQVU0cEUsWUFFMUIsU0FBU2dvQixHQUNMLE1BQU1DLEVBQWtCeDlGLEtBQUsyTCxVQUFVb3FFLGVBQ2xDd25CLEVBQWdCMWlCLE9BQ2pCMmlCLEVBQWdCM3FGLE9BQVMwcUYsRUFBZ0IxcUYsTUFDekMsWUFBUyw2R0FHVDBxRixFQUFnQjFpQixjQUNoQjBpQixFQUFrQngvRixPQUFPeUcsT0FBT3pHLE9BQU95RyxPQUFPLEdBQUlnNUYsR0FBa0JELElBRTdDMWlCLE1BRTNCNzZFLEtBQUsyTCxVQUFVcXFFLGFBQWF1bkIsR0FFaEMsWUFBWTFxRixFQUFNMFAsRUFBTVAsRUFBVSxJQUM5QixZQUF5QmhpQixLQUFLMkwsVUFBV2tILEVBQU0wUCxFQUFNUCxHQUV6RCxnQkFDSSxPQUFPLFlBQWNoaUIsS0FBSzJMLFdBRTlCLGlCQUNJLE9BQU8sWUFBZTNMLEtBQUsyTCxXQUUvQixrQkFBa0JxVCxHQUNkLElBQUl3d0QsR0FBa0IsRUFDbEJpdUIsR0FBNkIsRUFNakMsT0FMSXorRSxJQUNBd3dELElBQW9CeHdELEVBQVN3d0QsZ0JBQzdCaXVCLElBQStCeitFLEVBQVN5K0UsMkJBQ3hDLFlBQTJCLGtCQUFtQmp1QixFQUFpQiw2QkFBOEJpdUIsSUFFMUZqdUIsRUFDRHh2RSxLQUFLcTlGLHFCQUFxQkssbUNBQW1DMTlGLE1BQzdEQSxLQUFLcTlGLHFCQUFxQk0sMkJBQTJCMzlGLEtBQU15OUYsR0FFckUsbUJBQ0ksT0FBT3o5RixLQUFLcTlGLHFCQUFxQk8sMEJBQTBCNTlGLE1BRS9ELFlBS0ksT0FKSUEsS0FBS3M5RixhQUNMdDlGLEtBQUtzOUYsV0FBV2hhLHVCQUF1QixvQkFDdkN0akYsS0FBS3M5RixXQUFXaGEsdUJBQXVCLGNBRXBDdGpGLEtBQUsyTCxVQUFVd3RFLFVBRTFCLHVCQUNJLE9BQU8sYUFBcUJuNUUsS0FBSzJMLFdBRXJDLGtCQUFrQmc3RSxHQUNkLE9BQU8sYUFBa0IzbUYsS0FBSzJMLFVBQVdnN0UsR0FFN0MsVUFDSSxJQUFLM21GLEtBQUtzOUYsV0FDTixNQUFNLElBQUksSUFBZSxzQkFBdUIsZ0ZBR3BELE9BQU90OUYsS0FBS3M5RixXQUVoQixXQUFXTyxHQUNQLElBQ0ksT0FBTyxJQUFJLEVBQW9CNzlGLEtBQU0sWUFBV0EsS0FBSzJMLFVBQVdreUYsSUFFcEUsTUFBT2g3RixHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxlQUFnQiwyQkFHckQsSUFBSWc3RixHQUNBLElBQ0ksT0FBTyxJQUFJLEVBQWtCNzlGLEtBQU0sWUFBSUEsS0FBSzJMLFVBQVdreUYsSUFFM0QsTUFBT2g3RixHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxRQUFTLG9CQUc5QyxnQkFBZ0J3cEQsR0FDWixJQUNJLE9BQU8sSUFBSSxFQUFNcnNELEtBQU0sWUFBZ0JBLEtBQUsyTCxVQUFXMGdELElBRTNELE1BQU94cEQsR0FDSCxNQUFNaTdGLEVBQW9CajdGLEVBQUcsb0JBQXFCLGdDQUcxRCxlQUFla3ZFLEdBQ1gsT0FBTyxhQUFlL3hFLEtBQUsyTCxVQUFXMnNCLEdBQWV5NUMsRUFBZSxJQUFJLEVBQVkveEUsS0FBTXM0QixLQUU5RixRQUVJLE9BREEsWUFBMEJ0NEIsS0FBSzJMLFdBQ3hCLElBQUlveUYsRUFBVyxJQUFJLElBQWEvOUYsS0FBSzJMLFVBQVc4aUQsR0FBYSxZQUFhenVELEtBQUsyTCxVQUFXOGlELEtBRXJHLFdBQVd1dkMsR0FDUCxPQUFPLGFBQVdoK0YsS0FBSzJMLFVBQVdxeUYsR0FFdEMsV0FBV3BnRyxHQUNQLE9BQU8sYUFBV29DLEtBQUsyTCxVQUFXL04sR0FBTTZNLEtBQUt3ekYsR0FDcENBLEVBR0UsSUFBSSxFQUFNaitGLEtBR2pCaStGLEdBTFcsT0FTdkIsTUFBTSxVQUF1QixJQUN6QixZQUFZN25CLEdBQ1JqdkUsUUFDQW5ILEtBQUtvMkUsVUFBWUEsRUFFckIsYUFBYTUwRSxHQUNULE9BQU8sSUFBSSxFQUFLLElBQUksSUFBTUEsSUFFOUIsaUJBQWlCNUQsR0FDYixNQUFNZ0IsRUFBTW9CLEtBQUsyL0UsbUJBQW1CL2hGLEVBQU1vQyxLQUFLbzJFLFVBQVViLGFBQ3pELE9BQU8sRUFBa0Iyb0IsT0FBT3QvRixFQUFLb0IsS0FBS28yRSxVQUE0QixPQVM5RSxNQUFNLEVBQ0YsWUFBWWtHLEVBQVkzd0UsR0FDcEIzTCxLQUFLczhFLFdBQWFBLEVBQ2xCdDhFLEtBQUsyTCxVQUFZQSxFQUNqQjNMLEtBQUt1OEUsZ0JBQWtCLElBQUksRUFBZUQsR0FFOUMsSUFBSTZoQixHQUNBLE1BQU1uSSxFQUFNb0ksRUFBY0QsR0FDMUIsT0FBT24rRixLQUFLMkwsVUFDUHpOLElBQUk4M0YsR0FDSnZyRixLQUFLeVYsR0FBVSxJQUFJLEVBQWlCbGdCLEtBQUtzOEUsV0FBWSxJQUFJLElBQW1CdDhFLEtBQUtzOEUsV0FBVzN3RSxVQUFXM0wsS0FBS3U4RSxnQkFBaUJyOEQsRUFBTzlFLEtBQU04RSxFQUFPczhELFVBQVd0OEQsRUFBT3BLLFNBQVVrZ0YsRUFBSTdmLGFBRTFMLElBQUlnb0IsRUFBYXoyRixFQUFNc2EsR0FDbkIsTUFBTWcwRSxFQUFNb0ksRUFBY0QsR0FRMUIsT0FQSW44RSxHQUNBKzZFLEVBQW1CLGtCQUFtQi82RSxHQUN0Q2hpQixLQUFLMkwsVUFBVW9ELElBQUlpbkYsRUFBS3R1RixFQUFNc2EsSUFHOUJoaUIsS0FBSzJMLFVBQVVvRCxJQUFJaW5GLEVBQUt0dUYsR0FFckIxSCxLQUVYLE9BQU9tK0YsRUFBYUUsRUFBYS8vRixLQUFVZ2dHLEdBQ3ZDLE1BQU10SSxFQUFNb0ksRUFBY0QsR0FPMUIsT0FOeUIsSUFBckJuNEUsVUFBVXhtQixPQUNWUSxLQUFLMkwsVUFBVXMvQyxPQUFPK3FDLEVBQUtxSSxHQUczQnIrRixLQUFLMkwsVUFBVXMvQyxPQUFPK3FDLEVBQUtxSSxFQUFhLy9GLEtBQVVnZ0csR0FFL0N0K0YsS0FFWCxPQUFPbStGLEdBQ0gsTUFBTW5JLEVBQU1vSSxFQUFjRCxHQUUxQixPQURBbitGLEtBQUsyTCxVQUFVc3BCLE9BQU8rZ0UsR0FDZmgyRixNQUdmLE1BQU0rOUYsRUFDRixZQUFZcHlGLEdBQ1IzTCxLQUFLMkwsVUFBWUEsRUFFckIsSUFBSXd5RixFQUFhejJGLEVBQU1zYSxHQUNuQixNQUFNZzBFLEVBQU1vSSxFQUFjRCxHQVExQixPQVBJbjhFLEdBQ0ErNkUsRUFBbUIsaUJBQWtCLzZFLEdBQ3JDaGlCLEtBQUsyTCxVQUFVb0QsSUFBSWluRixFQUFLdHVGLEVBQU1zYSxJQUc5QmhpQixLQUFLMkwsVUFBVW9ELElBQUlpbkYsRUFBS3R1RixHQUVyQjFILEtBRVgsT0FBT20rRixFQUFhRSxFQUFhLy9GLEtBQVVnZ0csR0FDdkMsTUFBTXRJLEVBQU1vSSxFQUFjRCxHQU8xQixPQU55QixJQUFyQm40RSxVQUFVeG1CLE9BQ1ZRLEtBQUsyTCxVQUFVcy9DLE9BQU8rcUMsRUFBS3FJLEdBRzNCcitGLEtBQUsyTCxVQUFVcy9DLE9BQU8rcUMsRUFBS3FJLEVBQWEvL0YsS0FBVWdnRyxHQUUvQ3QrRixLQUVYLE9BQU9tK0YsR0FDSCxNQUFNbkksRUFBTW9JLEVBQWNELEdBRTFCLE9BREFuK0YsS0FBSzJMLFVBQVVzcEIsT0FBTytnRSxHQUNmaDJGLEtBRVgsU0FDSSxPQUFPQSxLQUFLMkwsVUFBVXFtRSxVQVE5QixNQUFNLEVBQ0YsWUFBWXNLLEVBQVlDLEVBQWlCNXdFLEdBQ3JDM0wsS0FBS3M4RSxXQUFhQSxFQUNsQnQ4RSxLQUFLdThFLGdCQUFrQkEsRUFDdkJ2OEUsS0FBSzJMLFVBQVlBLEVBRXJCLGNBQWMwZ0UsRUFBVXJxRCxHQUNwQixNQUFNdThFLEVBQWMsSUFBSSxJQUF3QnYrRixLQUFLczhFLFdBQVczd0UsVUFBVzNMLEtBQUt1OEUsZ0JBQWlCbFEsRUFBU2p4RCxLQUFNaXhELEVBQVNtUSxVQUFXblEsRUFBU3YyRCxTQUM1SCxNQUNqQixPQUFPOVYsS0FBSzJMLFVBQVVneEUsY0FBYyxJQUFJLEVBQXNCMzhFLEtBQUtzOEUsV0FBWWlpQixHQUFjdjhFLFFBQXlDQSxFQUFVLElBRXBKLFlBQVl3OEUsRUFBYXg4RSxHQUNyQixPQUFLQSxFQUlNaGlCLEtBQUsyTCxVQUFVOHpFLFlBQVkrZSxFQUFheDhFLEdBSHhDaGlCLEtBQUsyTCxVQUFVOHpFLFlBQVkrZSxHQVMxQyxtQkFBbUJwb0IsRUFBV0QsR0FDMUIsTUFBTXNvQixFQUEwQixFQUF1QkMsVUFDdkQsSUFBSUMsRUFBOEJGLEVBQXdCdmdHLElBQUlrNEUsR0FDekR1b0IsSUFDREEsRUFBOEIsSUFBSWxzRSxRQUNsQ2dzRSxFQUF3QjF2RixJQUFJcW5FLEVBQVd1b0IsSUFFM0MsSUFBSTF3RixFQUFXMHdGLEVBQTRCemdHLElBQUlpNEUsR0FLL0MsT0FKS2xvRSxJQUNEQSxFQUFXLElBQUksRUFBdUJtb0UsRUFBVyxJQUFJLEVBQWVBLEdBQVlELEdBQ2hGd29CLEVBQTRCNXZGLElBQUlvbkUsRUFBV2xvRSxJQUV4Q0EsR0FHZixFQUF1Qnl3RixVQUFZLElBQUlqc0UsUUFJdkMsTUFBTSxFQUNGLFlBQVkyakQsRUFBV3pxRSxHQUNuQjNMLEtBQUtvMkUsVUFBWUEsRUFDakJwMkUsS0FBSzJMLFVBQVlBLEVBQ2pCM0wsS0FBS3U4RSxnQkFBa0IsSUFBSSxFQUFlbkcsR0FFOUMsZUFBZXJtRSxFQUFNcW1FLEVBQVdELEdBQzVCLEdBQUlwbUUsRUFBS3ZRLE9BQVMsR0FBTSxFQUNwQixNQUFNLElBQUksSUFBZSxtQkFFckIsNkZBQUd1USxFQUFLK29DLHlCQUF5Qi9vQyxFQUFLdlEsVUFFOUMsT0FBTyxJQUFJLEVBQWtCNDJFLEVBQVcsSUFBSSxJQUFvQkEsRUFBVXpxRSxVQUFXd3FFLEVBQVcsSUFBSSxJQUFhcG1FLEtBRXJILGNBQWNuUixFQUFLdzNFLEVBQVdELEdBQzFCLE9BQU8sSUFBSSxFQUFrQkMsRUFBVyxJQUFJLElBQW9CQSxFQUFVenFFLFVBQVd3cUUsRUFBV3YzRSxJQUVwRyxTQUNJLE9BQU9vQixLQUFLMkwsVUFBVXhGLEdBRTFCLGFBQ0ksT0FBTyxJQUFJLEVBQW9CbkcsS0FBS28yRSxVQUFXcDJFLEtBQUsyTCxVQUFVeWdELFFBRWxFLFdBQ0ksT0FBT3BzRCxLQUFLMkwsVUFBVW9FLEtBRTFCLFdBQVc4dEYsR0FDUCxJQUNJLE9BQU8sSUFBSSxFQUFvQjc5RixLQUFLbzJFLFVBQVcsWUFBV3AyRSxLQUFLMkwsVUFBV2t5RixJQUU5RSxNQUFPaDdGLEdBQ0gsTUFBTWk3RixFQUFvQmo3RixFQUFHLGVBQWdCLG1DQUdyRCxRQUFRcTZGLEdBRUosT0FEQUEsRUFBUSxZQUFtQkEsY0FDSixLQUdoQixhQUFTbDlGLEtBQUsyTCxVQUFXdXhGLEdBRXBDLElBQUk1K0YsRUFBTzBqQixHQUNQQSxFQUFVKzZFLEVBQW1CLHdCQUF5Qi82RSxHQUN0RCxJQUNJLE9BQUlBLEVBQ08sYUFBT2hpQixLQUFLMkwsVUFBV3JOLEVBQU8wakIsR0FHOUIsYUFBT2hpQixLQUFLMkwsVUFBV3JOLEdBR3RDLE1BQU91RSxHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxXQUFZLDRCQUdqRCxPQUFPKzdGLEVBQW1CdGdHLEtBQVVnZ0csR0FDaEMsSUFDSSxPQUF5QixJQUFyQnQ0RSxVQUFVeG1CLE9BQ0gsYUFBVVEsS0FBSzJMLFVBQVdpekYsR0FHMUIsYUFBVTUrRixLQUFLMkwsVUFBV2l6RixFQUFtQnRnRyxLQUFVZ2dHLEdBR3RFLE1BQU96N0YsR0FDSCxNQUFNaTdGLEVBQW9CajdGLEVBQUcsY0FBZSwrQkFHcEQsU0FDSSxPQUFPLFlBQVU3QyxLQUFLMkwsV0FFMUIsY0FBY3lCLEdBQ1YsTUFBTTRVLEVBQVU2OEUsRUFBdUJ6eEYsR0FDakN6QyxFQUFXbTBGLEVBQWExeEYsRUFBTThTLEdBQVUsSUFBSSxFQUFpQmxnQixLQUFLbzJFLFVBQVcsSUFBSSxJQUFtQnAyRSxLQUFLbzJFLFVBQVV6cUUsVUFBVzNMLEtBQUt1OEUsZ0JBQWlCcjhELEVBQU85RSxLQUFNOEUsRUFBT3M4RCxVQUFXdDhELEVBQU9wSyxTQUFVOVYsS0FBSzJMLFVBQVV3cUUsYUFDek4sT0FBTyxhQUFXbjJFLEtBQUsyTCxVQUFXcVcsRUFBU3JYLEdBRS9DLElBQUlxWCxHQUNBLElBQUkrekUsRUFVSixPQVJJQSxFQUR1RSxXQUF0RS96RSxhQUF5QyxFQUFTQSxFQUFROWUsUUFDcEQsWUFBZ0JsRCxLQUFLMkwsV0FFZ0QsWUFBdEVxVyxhQUF5QyxFQUFTQSxFQUFROWUsUUFDekQsWUFBaUJsRCxLQUFLMkwsV0FHdEIsWUFBTzNMLEtBQUsyTCxXQUVoQm9xRixFQUFLdHJGLEtBQUt5VixHQUFVLElBQUksRUFBaUJsZ0IsS0FBS28yRSxVQUFXLElBQUksSUFBbUJwMkUsS0FBS28yRSxVQUFVenFFLFVBQVczTCxLQUFLdThFLGdCQUFpQnI4RCxFQUFPOUUsS0FBTThFLEVBQU9zOEQsVUFBV3Q4RCxFQUFPcEssU0FBVTlWLEtBQUsyTCxVQUFVd3FFLGFBRTFNLGNBQWNBLEdBQ1YsT0FBTyxJQUFJLEVBQWtCbjJFLEtBQUtvMkUsVUFBV0QsRUFDdkNuMkUsS0FBSzJMLFVBQVVvekYsY0FBYyxFQUF1QkMsWUFBWWgvRixLQUFLbzJFLFVBQVdELElBQ2hGbjJFLEtBQUsyTCxVQUFVb3pGLGNBQWMsUUFPM0MsU0FBU2pCLEVBQW9CajdGLEVBQUdrVSxFQUFVa29GLEdBRXRDLE9BREFwOEYsRUFBRW9FLFFBQVVwRSxFQUFFb0UsUUFBUXZFLFFBQVFxVSxFQUFVa29GLEdBQ2pDcDhGLEVBT1gsU0FBU2c4RixFQUF1Qnp4RixHQUM1QixJQUFLLE1BQU11NUUsS0FBT3Y1RSxFQUNkLEdBQW1CLGlCQUFSdTVFLElBQXFCd1csRUFBa0J4VyxHQUM5QyxPQUFPQSxFQUdmLE1BQU8sR0FXWCxTQUFTbVksRUFBYTF4RixFQUFNOHhGLEdBQ3hCLElBQUlqd0YsRUFBSXVMLEVBQ1IsSUFBSTJrRixFQXFCSixPQW5CSUEsRUFEQWhDLEVBQWtCL3ZGLEVBQUssSUFDUkEsRUFBSyxHQUVmK3ZGLEVBQWtCL3ZGLEVBQUssSUFDYkEsRUFBSyxHQUVJLG1CQUFaQSxFQUFLLEdBQ0YsQ0FDWHhDLEtBQU13QyxFQUFLLEdBQ1hySyxNQUFPcUssRUFBSyxHQUNadEMsU0FBVXNDLEVBQUssSUFJSixDQUNYeEMsS0FBTXdDLEVBQUssR0FDWHJLLE1BQU9xSyxFQUFLLEdBQ1p0QyxTQUFVc0MsRUFBSyxJQUdoQixDQUNIeEMsS0FBTXk1RSxJQUNFOGEsRUFBYXYwRixNQUNidTBGLEVBQWF2MEYsS0FBS3MwRixFQUFRN2EsS0FHbEN0aEYsTUFBcUMsUUFBN0JrTSxFQUFLa3dGLEVBQWFwOEYsYUFBMEIsSUFBUGtNLE9BQWdCLEVBQVNBLEVBQUdwUSxLQUFLc2dHLEdBQzlFcjBGLFNBQTJDLFFBQWhDMFAsRUFBSzJrRixFQUFhcjBGLGdCQUE2QixJQUFQMFAsT0FBZ0IsRUFBU0EsRUFBRzNiLEtBQUtzZ0csSUFHNUYsTUFBTSxFQUNGLFlBQVk3aUIsRUFBWTN3RSxHQUNwQjNMLEtBQUtzOEUsV0FBYUEsRUFDbEJ0OEUsS0FBSzJMLFVBQVlBLEVBRXJCLFVBQ0ksT0FBTyxJQUFJLEVBQWtCM0wsS0FBS3M4RSxXQUFZdDhFLEtBQUsyTCxVQUFVcXFGLEtBRWpFLFNBQ0ksT0FBT2gyRixLQUFLMkwsVUFBVXhGLEdBRTFCLGVBQ0ksT0FBT25HLEtBQUsyTCxVQUFVbUssU0FFMUIsYUFDSSxPQUFPOVYsS0FBSzJMLFVBQVVpM0MsU0FFMUIsS0FBSzVnQyxHQUNELE9BQU9oaUIsS0FBSzJMLFVBQVVqRSxLQUFLc2EsR0FFL0IsSUFBSXFwQyxFQUFXcnBDLEdBSVgsT0FBT2hpQixLQUFLMkwsVUFBVXpOLElBQUltdEQsRUFBV3JwQyxHQUV6QyxRQUFRazdFLEdBQ0osT0FBTyxhQUFjbDlGLEtBQUsyTCxVQUFXdXhGLEVBQU12eEYsWUFHbkQsTUFBTSxVQUE4QixFQUNoQyxLQUFLcVcsR0FDRCxNQUFNdGEsRUFBTzFILEtBQUsyTCxVQUFVakUsS0FBS3NhLEdBRWpDLE9BREEsaUJBQXNCMWUsSUFBVG9FLEVBQW9CLG9EQUMxQkEsR0FHZixNQUFNLEVBQ0YsWUFBWTB1RSxFQUFXenFFLEdBQ25CM0wsS0FBS28yRSxVQUFZQSxFQUNqQnAyRSxLQUFLMkwsVUFBWUEsRUFDakIzTCxLQUFLdThFLGdCQUFrQixJQUFJLEVBQWVuRyxHQUU5QyxNQUFNL3FCLEVBQVcrekMsRUFBTzlnRyxHQUNwQixJQUlJLE9BQU8sSUFBSSxFQUFNMEIsS0FBS28yRSxVQUFXLGFBQU1wMkUsS0FBSzJMLFVBQVcsYUFBTTAvQyxFQUFXK3pDLEVBQU85Z0csS0FFbkYsTUFBT3VFLEdBQ0gsTUFBTWk3RixFQUFvQmo3RixFQUFHLHNCQUF1QixlQUc1RCxRQUFRd29ELEVBQVdnMEMsR0FDZixJQUlJLE9BQU8sSUFBSSxFQUFNci9GLEtBQUtvMkUsVUFBVyxhQUFNcDJFLEtBQUsyTCxVQUFXLGFBQVEwL0MsRUFBV2cwQyxLQUU5RSxNQUFPeDhGLEdBQ0gsTUFBTWk3RixFQUFvQmo3RixFQUFHLHNCQUF1QixlQUc1RCxNQUFNL0QsR0FDRixJQUNJLE9BQU8sSUFBSSxFQUFNa0IsS0FBS28yRSxVQUFXLGFBQU1wMkUsS0FBSzJMLFVBQVcsYUFBTTdNLEtBRWpFLE1BQU8rRCxHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxVQUFXLGtCQUdoRCxZQUFZL0QsR0FDUixJQUNJLE9BQU8sSUFBSSxFQUFNa0IsS0FBS28yRSxVQUFXLGFBQU1wMkUsS0FBSzJMLFVBQVcsYUFBWTdNLEtBRXZFLE1BQU8rRCxHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxnQkFBaUIsd0JBR3RELFdBQVd1SyxHQUNQLElBQ0ksT0FBTyxJQUFJLEVBQU1wTixLQUFLbzJFLFVBQVcsYUFBTXAyRSxLQUFLMkwsVUFBVyxnQkFBV3lCLEtBRXRFLE1BQU92SyxHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxZQUFhLG9CQUdsRCxjQUFjdUssR0FDVixJQUNJLE9BQU8sSUFBSSxFQUFNcE4sS0FBS28yRSxVQUFXLGFBQU1wMkUsS0FBSzJMLFVBQVcsZ0JBQWN5QixLQUV6RSxNQUFPdkssR0FDSCxNQUFNaTdGLEVBQW9CajdGLEVBQUcsZUFBZ0IsdUJBR3JELGFBQWF1SyxHQUNULElBQ0ksT0FBTyxJQUFJLEVBQU1wTixLQUFLbzJFLFVBQVcsYUFBTXAyRSxLQUFLMkwsVUFBVyxlQUFheUIsS0FFeEUsTUFBT3ZLLEdBQ0gsTUFBTWk3RixFQUFvQmo3RixFQUFHLGNBQWUsc0JBR3BELFNBQVN1SyxHQUNMLElBQ0ksT0FBTyxJQUFJLEVBQU1wTixLQUFLbzJFLFVBQVcsYUFBTXAyRSxLQUFLMkwsVUFBVyxlQUFTeUIsS0FFcEUsTUFBT3ZLLEdBQ0gsTUFBTWk3RixFQUFvQmo3RixFQUFHLFVBQVcsa0JBR2hELFFBQVFxNkYsR0FDSixPQUFPLGFBQVdsOUYsS0FBSzJMLFVBQVd1eEYsRUFBTXZ4RixXQUU1QyxJQUFJcVcsR0FDQSxJQUFJN1EsRUFVSixPQVJJQSxFQUR1RSxXQUF0RTZRLGFBQXlDLEVBQVNBLEVBQVE5ZSxRQUNuRCxhQUFpQmxELEtBQUsyTCxXQUU4QyxZQUF0RXFXLGFBQXlDLEVBQVNBLEVBQVE5ZSxRQUN4RCxhQUFrQmxELEtBQUsyTCxXQUd2QixhQUFRM0wsS0FBSzJMLFdBRWxCd0YsRUFBTTFHLEtBQUt5VixHQUFVLElBQUksRUFBY2xnQixLQUFLbzJFLFVBQVcsSUFBSSxJQUFnQnAyRSxLQUFLbzJFLFVBQVV6cUUsVUFBVzNMLEtBQUt1OEUsZ0JBQWlCdjhFLEtBQUsyTCxVQUFXdVUsRUFBT2s5RCxhQUU3SixjQUFjaHdFLEdBQ1YsTUFBTTRVLEVBQVU2OEUsRUFBdUJ6eEYsR0FDakN6QyxFQUFXbTBGLEVBQWExeEYsRUFBTTJvRixHQUFRLElBQUksRUFBYy8xRixLQUFLbzJFLFVBQVcsSUFBSSxJQUFnQnAyRSxLQUFLbzJFLFVBQVV6cUUsVUFBVzNMLEtBQUt1OEUsZ0JBQWlCdjhFLEtBQUsyTCxVQUFXb3FGLEVBQUszWSxhQUN2SyxPQUFPLGFBQVdwOUUsS0FBSzJMLFVBQVdxVyxFQUFTclgsR0FFL0MsY0FBY3dyRSxHQUNWLE9BQU8sSUFBSSxFQUFNbjJFLEtBQUtvMkUsVUFBV0QsRUFDM0JuMkUsS0FBSzJMLFVBQVVvekYsY0FBYyxFQUF1QkMsWUFBWWgvRixLQUFLbzJFLFVBQVdELElBQ2hGbjJFLEtBQUsyTCxVQUFVb3pGLGNBQWMsUUFHM0MsTUFBTU8sRUFDRixZQUFZaGpCLEVBQVkzd0UsR0FDcEIzTCxLQUFLczhFLFdBQWFBLEVBQ2xCdDhFLEtBQUsyTCxVQUFZQSxFQUVyQixXQUNJLE9BQU8zTCxLQUFLMkwsVUFBVXhHLEtBRTFCLFVBQ0ksT0FBTyxJQUFJLEVBQXNCbkYsS0FBS3M4RSxXQUFZdDhFLEtBQUsyTCxVQUFVd3lELEtBRXJFLGVBQ0ksT0FBT24rRCxLQUFLMkwsVUFBVTR4RSxTQUUxQixlQUNJLE9BQU92OUUsS0FBSzJMLFVBQVU2eEUsVUFHOUIsTUFBTSxFQUNGLFlBQVlsQixFQUFZM3dFLEdBQ3BCM0wsS0FBS3M4RSxXQUFhQSxFQUNsQnQ4RSxLQUFLMkwsVUFBWUEsRUFFckIsWUFDSSxPQUFPLElBQUksRUFBTTNMLEtBQUtzOEUsV0FBWXQ4RSxLQUFLMkwsVUFBVXdGLE9BRXJELGVBQ0ksT0FBT25SLEtBQUsyTCxVQUFVbUssU0FFMUIsV0FDSSxPQUFPOVYsS0FBSzJMLFVBQVV1cEIsS0FFMUIsWUFDSSxPQUFPbDFCLEtBQUsyTCxVQUFVK3hDLE1BRTFCLFdBQ0ksT0FBTzE5QyxLQUFLMkwsVUFBVWcxRCxLQUFLcHFELElBQUk0bkQsR0FBTyxJQUFJLEVBQXNCbitELEtBQUtzOEUsV0FBWW5lLElBRXJGLFdBQVduOEMsR0FDUCxPQUFPaGlCLEtBQUsyTCxVQUNQdXlELFdBQVdsOEMsR0FDWHpMLElBQUlncEYsR0FBYSxJQUFJRCxFQUFldC9GLEtBQUtzOEUsV0FBWWlqQixJQUU5RCxRQUFRMTdGLEVBQVUyN0YsR0FDZHgvRixLQUFLMkwsVUFBVXhDLFFBQVFrakUsSUFDbkJ4b0UsRUFBU3JHLEtBQUtnaUcsRUFBUyxJQUFJLEVBQXNCeC9GLEtBQUtzOEUsV0FBWWpRLE1BRzFFLFFBQVE2d0IsR0FDSixPQUFPLGFBQWNsOUYsS0FBSzJMLFVBQVd1eEYsRUFBTXZ4RixZQUduRCxNQUFNLFVBQTRCLEVBQzlCLFlBQVl5cUUsRUFBV3pxRSxHQUNuQnhFLE1BQU1pdkUsRUFBV3pxRSxHQUNqQjNMLEtBQUtvMkUsVUFBWUEsRUFDakJwMkUsS0FBSzJMLFVBQVlBLEVBRXJCLFNBQ0ksT0FBTzNMLEtBQUsyTCxVQUFVeEYsR0FFMUIsV0FDSSxPQUFPbkcsS0FBSzJMLFVBQVVvRSxLQUUxQixhQUNJLE1BQU0wdkYsRUFBU3ovRixLQUFLMkwsVUFBVXlnRCxPQUM5QixPQUFPcXpDLEVBQVMsSUFBSSxFQUFrQnovRixLQUFLbzJFLFVBQVdxcEIsR0FBVSxLQUVwRSxJQUFJQyxHQUNBLElBQ0ksT0FJVyxJQUFJLEVBQWtCMS9GLEtBQUtvMkUsZUFKakI5eUUsSUFBakJvOEYsRUFJNkMsWUFBSTEvRixLQUFLMkwsV0FHVCxZQUFJM0wsS0FBSzJMLFVBQVcrekYsSUFHekUsTUFBTzc4RixHQUNILE1BQU1pN0YsRUFBb0JqN0YsRUFBRyxRQUFTLDhCQUc5QyxJQUFJNkUsR0FDQSxPQUFPLFlBQU8xSCxLQUFLMkwsVUFBV2pFLEdBQU0rQyxLQUFLZzFGLEdBQVUsSUFBSSxFQUFrQnovRixLQUFLbzJFLFVBQVdxcEIsSUFFN0YsUUFBUXZDLEdBQ0osT0FBTyxhQUFTbDlGLEtBQUsyTCxVQUFXdXhGLEVBQU12eEYsV0FFMUMsY0FBY3dxRSxHQUNWLE9BQU8sSUFBSSxFQUFvQm4yRSxLQUFLbzJFLFVBQVdELEVBQ3pDbjJFLEtBQUsyTCxVQUFVb3pGLGNBQWMsRUFBdUJDLFlBQVloL0YsS0FBS28yRSxVQUFXRCxJQUNoRm4yRSxLQUFLMkwsVUFBVW96RixjQUFjLFFBRzNDLFNBQVNYLEVBQWNELEdBQ25CLE9BQU8sWUFBTUEsRUFBYTs7Ozs7Ozs7Ozs7Ozs7OztHQTJCOUIsTUFBTSxFQU9GLGVBQWV3QixHQUNYMy9GLEtBQUsyTCxVQUFZLElBQUksT0FBZWcwRixHQUV4QyxvQkFPSSxPQUFPLElBQUksRUFBVSxJQUFXbC9DLFdBQVczSCxtQkFFL0MsUUFBUW9rRCxHQUVKLE9BREFBLEVBQVEsWUFBbUJBLGNBQ0osS0FHaEJsOUYsS0FBSzJMLFVBQVU4dEUsY0FBY3ZoQyxRQUFRZ2xELEVBQU16akI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQjFELE1BQU0sRUFDRixZQUFZOXRFLEdBQ1IzTCxLQUFLMkwsVUFBWUEsRUFFckIseUJBQ0ksTUFBTWkwRixFQUFXLGVBRWpCLE9BREFBLEVBQVM5bEIsWUFBYyw2QkFDaEIsSUFBSSxFQUFXOGxCLEdBRTFCLGdCQUNJLE1BQU1BLEVBQVcsY0FFakIsT0FEQUEsRUFBUzlsQixZQUFjLG9CQUNoQixJQUFJLEVBQVc4bEIsR0FFMUIscUJBQXFCeDlDLEdBQ2pCLE1BQU13OUMsRUFBVyxlQUFjeDlDLEdBRS9CLE9BREF3OUMsRUFBUzlsQixZQUFjLHdCQUNoQixJQUFJLEVBQVc4bEIsR0FFMUIsc0JBQXNCeDlDLEdBQ2xCLE1BQU13OUMsRUFBVyxlQUFleDlDLEdBRWhDLE9BREF3OUMsRUFBUzlsQixZQUFjLHlCQUNoQixJQUFJLEVBQVc4bEIsR0FFMUIsaUJBQWlCOWdHLEdBQ2IsTUFBTThnRyxFQUFXLGFBQVU5Z0csR0FFM0IsT0FEQThnRyxFQUFTOWxCLFlBQWMsdUJBQ2hCLElBQUksRUFBVzhsQixHQUUxQixRQUFRMUMsR0FDSixPQUFPbDlGLEtBQUsyTCxVQUFVdXNDLFFBQVFnbEQsRUFBTXZ4Rjs7Ozs7Ozs7Ozs7Ozs7OztHQW9CNUMsTUFBTWswRixFQUFxQixDQUN2QkMsVUFBUyxFQUNUQyxTQUFBLElBQ0FDLFVBQUEsSUFDQUMsS0FBSSxFQUNKQyxZQUFXLEVBQ1huQyxhQUNBb0Msa0JBQWlCLEVBQ2pCQyxpQkFBZ0IsRUFDaEJDLE1BQUssRUFDTEMsc0JBQXFCLEVBQ3JCQyxjQUFhLEVBQ2JDLG9CQUFtQixFQUNuQkMsVUFBUyxFQUNUdEssV0FBVSxFQUNWMWlELFlBaHBCSixTQUFxQjZ5QyxHQUNqQixhQUFjQSxJQWdwQmRvYSxxQkFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0osSUFBMkJ6eUYsRUE1QmEweUYsRUE0QmIxeUYsRUFJVCxJQWhDc0IweUYsRUE2QkwsQ0FBQ3ZpRixFQUFLd2lGLElBQWlCLElBQUksRUFBVXhpRixFQUFLd2lGLEVBQWMsSUFBSSxHQUF0RTN5RixFQTVCWmtuQyxTQUFTZy9DLGtCQUFrQixJQUFJLElBQVUsbUJBQW9CbjRELElBQ2xFLE1BQU01ZCxFQUFNNGQsRUFBVXFSLFlBQVksY0FBY0MsZUFDMUNzekQsRUFBZTVrRSxFQUFVcVIsWUFBWSxhQUFhQyxlQUN4RCxPQUFPcXpELEVBQWlCdmlGLEVBQUt3aUYsSUFDOUIsVUFBVTdGLGdCQUFnQmg5RixPQUFPeUcsT0FBTyxHQUFJcTdGLEtBeUIvQzV4RixFQUFTODJFLGdCQTE5QkEsNkJBQ0ciLCJmaWxlIjoic2hhcmRlZC1jb3VudGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDExKTtcbiIsIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IEZpcmViYXNlIGNvbnN0YW50cy4gIFNvbWUgb2YgdGhlc2UgKEBkZWZpbmVzKSBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBjb21waWxlLXRpbWUuXHJcbiAqL1xyXG5jb25zdCBDT05TVEFOVFMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgY2xpZW50IE5vZGUuanMgU0RLLlxyXG4gICAgICovXHJcbiAgICBOT0RFX0NMSUVOVDogZmFsc2UsXHJcbiAgICAvKipcclxuICAgICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgQWRtaW4gTm9kZS5qcyBTREsuXHJcbiAgICAgKi9cclxuICAgIE5PREVfQURNSU46IGZhbHNlLFxyXG4gICAgLyoqXHJcbiAgICAgKiBGaXJlYmFzZSBTREsgVmVyc2lvblxyXG4gICAgICovXHJcbiAgICBTREtfVkVSU0lPTjogJyR7SlNDT1JFX1ZFUlNJT059J1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBwcm92aWRlZCBhc3NlcnRpb24gaXMgZmFsc3lcclxuICovXHJcbmNvbnN0IGFzc2VydCA9IGZ1bmN0aW9uIChhc3NlcnRpb24sIG1lc3NhZ2UpIHtcclxuICAgIGlmICghYXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgdGhyb3cgYXNzZXJ0aW9uRXJyb3IobWVzc2FnZSk7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuXHJcbiAqL1xyXG5jb25zdCBhc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gbmV3IEVycm9yKCdGaXJlYmFzZSBEYXRhYmFzZSAoJyArXHJcbiAgICAgICAgQ09OU1RBTlRTLlNES19WRVJTSU9OICtcclxuICAgICAgICAnKSBJTlRFUk5BTCBBU1NFUlQgRkFJTEVEOiAnICtcclxuICAgICAgICBtZXNzYWdlKTtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkkMSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZiAoYyA8IDEyOCkge1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IGM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPCAyMDQ4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gNikgfCAxOTI7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmXHJcbiAgICAgICAgICAgIGkgKyAxIDwgc3RyLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XHJcbiAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXHJcbiAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM2ZmKSA8PCAxMCkgKyAoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNmZik7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcbi8qKlxyXG4gKiBUdXJucyBhbiBhcnJheSBvZiBudW1iZXJzIGludG8gdGhlIHN0cmluZyBnaXZlbiBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcclxuICogY2hhcmFjdGVycyB0byB3aGljaCB0aGUgbnVtYmVycyBjb3JyZXNwb25kLlxyXG4gKiBAcGFyYW0gYnl0ZXMgQXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRpbmcgY2hhcmFjdGVycy5cclxuICogQHJldHVybiBTdHJpbmdpZmljYXRpb24gb2YgdGhlIGFycmF5LlxyXG4gKi9cclxuY29uc3QgYnl0ZUFycmF5VG9TdHJpbmcgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcclxuICAgIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwb3MgPSAwLCBjID0gMDtcclxuICAgIHdoaWxlIChwb3MgPCBieXRlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjMSA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICBpZiAoYzEgPCAxMjgpIHtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYzEgPiAxOTEgJiYgYzEgPCAyMjQpIHtcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMxICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYzEgPiAyMzkgJiYgYzEgPCAzNjUpIHtcclxuICAgICAgICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBjb25zdCBjNCA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgdSA9ICgoKGMxICYgNykgPDwgMTgpIHwgKChjMiAmIDYzKSA8PCAxMikgfCAoKGMzICYgNjMpIDw8IDYpIHwgKGM0ICYgNjMpKSAtXHJcbiAgICAgICAgICAgICAgICAweDEwMDAwO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkODAwICsgKHUgPj4gMTApKTtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZGMwMCArICh1ICYgMTAyMykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjMSAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0LmpvaW4oJycpO1xyXG59O1xyXG4vLyBXZSBkZWZpbmUgaXQgYXMgYW4gb2JqZWN0IGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNsYXNzIGJlY2F1c2UgYSBjbGFzcyBjb21waWxlZCBkb3duIHRvIGVzNSBjYW4ndFxyXG4vLyBiZSB0cmVlc2hha2VkLiBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTY5MVxyXG4vLyBTdGF0aWMgbG9va3VwIG1hcHMsIGxhemlseSBwb3B1bGF0ZWQgYnkgaW5pdF8oKVxyXG5jb25zdCBiYXNlNjQgPSB7XHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYnl0ZXMgdG8gY2hhcmFjdGVycy5cclxuICAgICAqL1xyXG4gICAgYnl0ZVRvQ2hhck1hcF86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgY2hhcmFjdGVycyB0byBieXRlcy5cclxuICAgICAqL1xyXG4gICAgY2hhclRvQnl0ZU1hcF86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYnl0ZXMgdG8gd2Vic2FmZSBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYnl0ZVRvQ2hhck1hcFdlYlNhZmVfOiBudWxsLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXBzIHdlYnNhZmUgY2hhcmFjdGVycyB0byBieXRlcy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQsIHNoYXJlZCBiZXR3ZWVuXHJcbiAgICAgKiBFTkNPREVEX1ZBTFMgYW5kIEVOQ09ERURfVkFMU19XRUJTQUZFXHJcbiAgICAgKi9cclxuICAgIEVOQ09ERURfVkFMU19CQVNFOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICsgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyArICcwMTIzNDU2Nzg5JyxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQuIFZhbHVlIDY0ICg9KSBpcyBzcGVjaWFsOyBpdCBtZWFucyBcIm5vdGhpbmcuXCJcclxuICAgICAqL1xyXG4gICAgZ2V0IEVOQ09ERURfVkFMUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICcrLz0nO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIHdlYnNhZmUgYWxwaGFiZXQuXHJcbiAgICAgKi9cclxuICAgIGdldCBFTkNPREVEX1ZBTFNfV0VCU0FGRSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICctXy4nO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgdGhlIGF0b2IgYW5kIGJ0b2EgZnVuY3Rpb25zLiBUaGlzIGV4dGVuc2lvblxyXG4gICAgICogc3RhcnRlZCBhdCBNb3ppbGxhIGJ1dCBpcyBub3cgaW1wbGVtZW50ZWQgYnkgbWFueSBicm93c2Vycy4gV2UgdXNlIHRoZVxyXG4gICAgICogQVNTVU1FXyogdmFyaWFibGVzIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgdXNlcmFnZW50IGRldGVjdGlvbiBsaWJyYXJ5XHJcbiAgICAgKiBidXQgc3RpbGwgYWxsb3dpbmcgdGhlIHN0YW5kYXJkIHBlci1icm93c2VyIGNvbXBpbGF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIEhBU19OQVRJVkVfU1VQUE9SVDogdHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbicsXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1lbmNvZGUgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IEFuIGFycmF5IG9mIGJ5dGVzIChudW1iZXJzIHdpdGhcclxuICAgICAqICAgICB2YWx1ZSBpbiBbMCwgMjU1XSkgdG8gZW5jb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgQm9vbGVhbiBpbmRpY2F0aW5nIHdlIHNob3VsZCB1c2UgdGhlXHJcbiAgICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXHJcbiAgICAgKiBAcmV0dXJuIFRoZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIGVuY29kZUJ5dGVBcnJheShpbnB1dCwgd2ViU2FmZSkge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2VuY29kZUJ5dGVBcnJheSB0YWtlcyBhbiBhcnJheSBhcyBhIHBhcmFtZXRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRfKCk7XHJcbiAgICAgICAgY29uc3QgYnl0ZVRvQ2hhck1hcCA9IHdlYlNhZmVcclxuICAgICAgICAgICAgPyB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1xyXG4gICAgICAgICAgICA6IHRoaXMuYnl0ZVRvQ2hhck1hcF87XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMSA9IGlucHV0W2ldO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTIgPSBpICsgMSA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTIgPSBoYXZlQnl0ZTIgPyBpbnB1dFtpICsgMV0gOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpICsgMiA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTMgPSBoYXZlQnl0ZTMgPyBpbnB1dFtpICsgMl0gOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBvdXRCeXRlMSA9IGJ5dGUxID4+IDI7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUyID0gKChieXRlMSAmIDB4MDMpIDw8IDQpIHwgKGJ5dGUyID4+IDQpO1xyXG4gICAgICAgICAgICBsZXQgb3V0Qnl0ZTMgPSAoKGJ5dGUyICYgMHgwZikgPDwgMikgfCAoYnl0ZTMgPj4gNik7XHJcbiAgICAgICAgICAgIGxldCBvdXRCeXRlNCA9IGJ5dGUzICYgMHgzZjtcclxuICAgICAgICAgICAgaWYgKCFoYXZlQnl0ZTMpIHtcclxuICAgICAgICAgICAgICAgIG91dEJ5dGU0ID0gNjQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhdmVCeXRlMikge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dEJ5dGUzID0gNjQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMV0sIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTJdLCBieXRlVG9DaGFyTWFwW291dEJ5dGUzXSwgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlNF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWVuY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgQSBzdHJpbmcgdG8gZW5jb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgSWYgdHJ1ZSwgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgZW5jb2RlU3RyaW5nKGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgLy8gU2hvcnRjdXQgZm9yIE1vemlsbGEgYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnRcclxuICAgICAgICAvLyBhIG5hdGl2ZSBiYXNlNjQgZW5jb2RlciBpbiB0aGUgZm9ybSBvZiBcImJ0b2EvYXRvYlwiXHJcbiAgICAgICAgaWYgKHRoaXMuSEFTX05BVElWRV9TVVBQT1JUICYmICF3ZWJTYWZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBidG9hKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlQnl0ZUFycmF5KHN0cmluZ1RvQnl0ZUFycmF5JDEoaW5wdXQpLCB3ZWJTYWZlKTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1kZWNvZGUgYSBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IHRvIGRlY29kZS5cclxuICAgICAqIEBwYXJhbSB3ZWJTYWZlIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZGVjb2RlU3RyaW5nKGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgLy8gU2hvcnRjdXQgZm9yIE1vemlsbGEgYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnRcclxuICAgICAgICAvLyBhIG5hdGl2ZSBiYXNlNjQgZW5jb2RlciBpbiB0aGUgZm9ybSBvZiBcImJ0b2EvYXRvYlwiXHJcbiAgICAgICAgaWYgKHRoaXMuSEFTX05BVElWRV9TVVBQT1JUICYmICF3ZWJTYWZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhdG9iKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ5dGVBcnJheVRvU3RyaW5nKHRoaXMuZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpKTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1kZWNvZGUgYSBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogSW4gYmFzZS02NCBkZWNvZGluZywgZ3JvdXBzIG9mIGZvdXIgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhyZWVcclxuICAgICAqIGJ5dGVzLiAgSWYgdGhlIGVuY29kZXIgZGlkIG5vdCBhcHBseSBwYWRkaW5nLCB0aGUgaW5wdXQgbGVuZ3RoIG1heSBub3RcclxuICAgICAqIGJlIGEgbXVsdGlwbGUgb2YgNC5cclxuICAgICAqXHJcbiAgICAgKiBJbiB0aGlzIGNhc2UsIHRoZSBsYXN0IGdyb3VwIHdpbGwgaGF2ZSBmZXdlciB0aGFuIDQgY2hhcmFjdGVycywgYW5kXHJcbiAgICAgKiBwYWRkaW5nIHdpbGwgYmUgaW5mZXJyZWQuICBJZiB0aGUgZ3JvdXAgaGFzIG9uZSBvciB0d28gY2hhcmFjdGVycywgaXQgZGVjb2Rlc1xyXG4gICAgICogdG8gb25lIGJ5dGUuICBJZiB0aGUgZ3JvdXAgaGFzIHRocmVlIGNoYXJhY3RlcnMsIGl0IGRlY29kZXMgdG8gdHdvIGJ5dGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbnB1dCBJbnB1dCB0byBkZWNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBUcnVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIHdlYi1zYWZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBieXRlcyByZXByZXNlbnRpbmcgdGhlIGRlY29kZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlY29kZVN0cmluZ1RvQnl0ZUFycmF5KGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgdGhpcy5pbml0XygpO1xyXG4gICAgICAgIGNvbnN0IGNoYXJUb0J5dGVNYXAgPSB3ZWJTYWZlXHJcbiAgICAgICAgICAgID8gdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV9cclxuICAgICAgICAgICAgOiB0aGlzLmNoYXJUb0J5dGVNYXBfO1xyXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOykge1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMSA9IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkrKyldO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTIgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMiA9IGhhdmVCeXRlMiA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDA7XHJcbiAgICAgICAgICAgICsraTtcclxuICAgICAgICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTMgPSBoYXZlQnl0ZTMgPyBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKV0gOiA2NDtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTQgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlNCA9IGhhdmVCeXRlNCA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xyXG4gICAgICAgICAgICArK2k7XHJcbiAgICAgICAgICAgIGlmIChieXRlMSA9PSBudWxsIHx8IGJ5dGUyID09IG51bGwgfHwgYnl0ZTMgPT0gbnVsbCB8fCBieXRlNCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUxID0gKGJ5dGUxIDw8IDIpIHwgKGJ5dGUyID4+IDQpO1xyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMSk7XHJcbiAgICAgICAgICAgIGlmIChieXRlMyAhPT0gNjQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUyID0gKChieXRlMiA8PCA0KSAmIDB4ZjApIHwgKGJ5dGUzID4+IDIpO1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gob3V0Qnl0ZTIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJ5dGU0ICE9PSA2NCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUzID0gKChieXRlMyA8PCA2KSAmIDB4YzApIHwgYnl0ZTQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gob3V0Qnl0ZTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBMYXp5IHN0YXRpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gQ2FsbGVkIGJlZm9yZVxyXG4gICAgICogYWNjZXNzaW5nIGFueSBvZiB0aGUgc3RhdGljIG1hcCB2YXJpYWJsZXMuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBpbml0XygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYnl0ZVRvQ2hhck1hcF8pIHtcclxuICAgICAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwXyA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBfID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfID0ge307XHJcbiAgICAgICAgICAgIC8vIFdlIHdhbnQgcXVpY2sgbWFwcGluZ3MgYmFjayBhbmQgZm9ydGgsIHNvIHdlIHByZWNvbXB1dGUgdHdvIG1hcHMuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5FTkNPREVEX1ZBTFMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcF9baV0gPSB0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBfW3RoaXMuYnl0ZVRvQ2hhck1hcF9baV1dID0gaTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfW2ldID0gdGhpcy5FTkNPREVEX1ZBTFNfV0VCU0FGRS5jaGFyQXQoaSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXV0gPSBpO1xyXG4gICAgICAgICAgICAgICAgLy8gQmUgZm9yZ2l2aW5nIHdoZW4gZGVjb2RpbmcgYW5kIGNvcnJlY3RseSBkZWNvZGUgYm90aCBlbmNvZGluZ3MuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSB0aGlzLkVOQ09ERURfVkFMU19CQVNFLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5FTkNPREVEX1ZBTFNfV0VCU0FGRS5jaGFyQXQoaSldID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSldID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZ1xyXG4gKi9cclxuY29uc3QgYmFzZTY0RW5jb2RlID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgY29uc3QgdXRmOEJ5dGVzID0gc3RyaW5nVG9CeXRlQXJyYXkkMShzdHIpO1xyXG4gICAgcmV0dXJuIGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodXRmOEJ5dGVzLCB0cnVlKTtcclxufTtcclxuLyoqXHJcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyAod2l0aG91dCBcIi5cIiBwYWRkaW5nIGluIHRoZSBlbmQpLlxyXG4gKiBlLmcuIFVzZWQgaW4gSlNPTiBXZWIgVG9rZW4gKEpXVCkgcGFydHMuXHJcbiAqL1xyXG5jb25zdCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIC8vIFVzZSBiYXNlNjR1cmwgZW5jb2RpbmcgYW5kIHJlbW92ZSBwYWRkaW5nIGluIHRoZSBlbmQgKGRvdCBjaGFyYWN0ZXJzKS5cclxuICAgIHJldHVybiBiYXNlNjRFbmNvZGUoc3RyKS5yZXBsYWNlKC9cXC4vZywgJycpO1xyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGRlY29kaW5nXHJcbiAqXHJcbiAqIE5PVEU6IERPIE5PVCB1c2UgdGhlIGdsb2JhbCBhdG9iKCkgZnVuY3Rpb24gLSBpdCBkb2VzIE5PVCBzdXBwb3J0IHRoZVxyXG4gKiBiYXNlNjRVcmwgdmFyaWFudCBlbmNvZGluZy5cclxuICpcclxuICogQHBhcmFtIHN0ciBUbyBiZSBkZWNvZGVkXHJcbiAqIEByZXR1cm4gRGVjb2RlZCByZXN1bHQsIGlmIHBvc3NpYmxlXHJcbiAqL1xyXG5jb25zdCBiYXNlNjREZWNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2RlU3RyaW5nKHN0ciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Jhc2U2NERlY29kZSBmYWlsZWQ6ICcsIGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBEbyBhIGRlZXAtY29weSBvZiBiYXNpYyBKYXZhU2NyaXB0IE9iamVjdHMgb3IgQXJyYXlzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVlcENvcHkodmFsdWUpIHtcclxuICAgIHJldHVybiBkZWVwRXh0ZW5kKHVuZGVmaW5lZCwgdmFsdWUpO1xyXG59XHJcbi8qKlxyXG4gKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IChyZWN1cnNpdmVseSBhbGxvd3MgZXh0ZW5zaW9uXHJcbiAqIG9mIE9iamVjdHMgYW5kIEFycmF5cykuICBTY2FsYXIgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJlIG92ZXItd3JpdHRlbi5cclxuICogSWYgdGFyZ2V0IGlzIHVuZGVmaW5lZCwgYW4gb2JqZWN0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIHdpbGwgYmUgY3JlYXRlZFxyXG4gKiAoYW5kIHJldHVybmVkKS5cclxuICpcclxuICogV2UgcmVjdXJzaXZlbHkgY29weSBhbGwgY2hpbGQgcHJvcGVydGllcyBvZiBwbGFpbiBPYmplY3RzIGluIHRoZSBzb3VyY2UtIHNvXHJcbiAqIHRoYXQgbmFtZXNwYWNlLSBsaWtlIGRpY3Rpb25hcmllcyBhcmUgbWVyZ2VkLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQgdGhlIHRhcmdldCBjYW4gYmUgYSBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydGllcyBpblxyXG4gKiB0aGUgc291cmNlIE9iamVjdCBhcmUgY29waWVkIG9udG8gaXQgYXMgc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIEZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBOb3RlOiB3ZSBkb24ndCBtZXJnZSBfX3Byb3RvX18gdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwRXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XHJcbiAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoc291cmNlLmNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgY2FzZSBEYXRlOlxyXG4gICAgICAgICAgICAvLyBUcmVhdCBEYXRlcyBsaWtlIHNjYWxhcnM7IGlmIHRoZSB0YXJnZXQgZGF0ZSBvYmplY3QgaGFkIGFueSBjaGlsZFxyXG4gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIC0gdGhleSB3aWxsIGJlIGxvc3QhXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHNvdXJjZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVWYWx1ZS5nZXRUaW1lKCkpO1xyXG4gICAgICAgIGNhc2UgT2JqZWN0OlxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQXJyYXk6XHJcbiAgICAgICAgICAgIC8vIEFsd2F5cyBjb3B5IHRoZSBhcnJheSBzb3VyY2UgYW5kIG92ZXJ3cml0ZSB0aGUgdGFyZ2V0LlxyXG4gICAgICAgICAgICB0YXJnZXQgPSBbXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgLy8gTm90IGEgcGxhaW4gT2JqZWN0IC0gdHJlYXQgaXQgYXMgYSBzY2FsYXIuXHJcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XHJcbiAgICAgICAgLy8gdXNlIGlzVmFsaWRLZXkgdG8gZ3VhcmQgYWdhaW5zdCBwcm90b3R5cGUgcG9sbHV0aW9uLiBTZWUgaHR0cHM6Ly9zbnlrLmlvL3Z1bG4vU05ZSy1KUy1MT0RBU0gtNDUwMjAyXHJcbiAgICAgICAgaWYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgIWlzVmFsaWRLZXkocHJvcCkpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhcmdldFtwcm9wXSA9IGRlZXBFeHRlbmQodGFyZ2V0W3Byb3BdLCBzb3VyY2VbcHJvcF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xyXG4gICAgcmV0dXJuIGtleSAhPT0gJ19fcHJvdG9fXyc7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRGVmZXJyZWQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5yZWplY3QgPSAoKSA9PiB7IH07XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlID0gKCkgPT4geyB9O1xyXG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE91ciBBUEkgaW50ZXJuYWxzIGFyZSBub3QgcHJvbWlzZWlmaWVkIGFuZCBjYW5ub3QgYmVjYXVzZSBvdXIgY2FsbGJhY2sgQVBJcyBoYXZlIHN1YnRsZSBleHBlY3RhdGlvbnMgYXJvdW5kXHJcbiAgICAgKiBpbnZva2luZyBwcm9taXNlcyBpbmxpbmUsIHdoaWNoIFByb21pc2VzIGFyZSBmb3JiaWRkZW4gdG8gZG8uIFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gb3B0aW9uYWwgbm9kZS1zdHlsZSBjYWxsYmFja1xyXG4gICAgICogYW5kIHJldHVybnMgYSBub2RlLXN0eWxlIGNhbGxiYWNrIHdoaWNoIHdpbGwgcmVzb2x2ZSBvciByZWplY3QgdGhlIERlZmVycmVkJ3MgcHJvbWlzZS5cclxuICAgICAqL1xyXG4gICAgd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIChlcnJvciwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmUodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIC8vIEF0dGFjaGluZyBub29wIGhhbmRsZXIganVzdCBpbiBjYXNlIGRldmVsb3BlciB3YXNuJ3QgZXhwZWN0aW5nXHJcbiAgICAgICAgICAgICAgICAvLyBwcm9taXNlc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHsgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyBTb21lIG9mIG91ciBjYWxsYmFja3MgZG9uJ3QgZXhwZWN0IGEgdmFsdWUgYW5kIG91ciBvd24gdGVzdHNcclxuICAgICAgICAgICAgICAgIC8vIGFzc2VydCB0aGF0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGlzIDFcclxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVNb2NrVXNlclRva2VuKHRva2VuLCBwcm9qZWN0SWQpIHtcclxuICAgIGlmICh0b2tlbi51aWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcInVpZFwiIGZpZWxkIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgbW9ja1VzZXJUb2tlbi4gUGxlYXNlIHVzZSBcInN1YlwiIGluc3RlYWQgZm9yIEZpcmViYXNlIEF1dGggVXNlciBJRC4nKTtcclxuICAgIH1cclxuICAgIC8vIFVuc2VjdXJlZCBKV1RzIHVzZSBcIm5vbmVcIiBhcyB0aGUgYWxnb3JpdGhtLlxyXG4gICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgIGFsZzogJ25vbmUnLFxyXG4gICAgICAgIHR5cGU6ICdKV1QnXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcHJvamVjdCA9IHByb2plY3RJZCB8fCAnZGVtby1wcm9qZWN0JztcclxuICAgIGNvbnN0IGlhdCA9IHRva2VuLmlhdCB8fCAwO1xyXG4gICAgY29uc3Qgc3ViID0gdG9rZW4uc3ViIHx8IHRva2VuLnVzZXJfaWQ7XHJcbiAgICBpZiAoIXN1Yikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm1vY2tVc2VyVG9rZW4gbXVzdCBjb250YWluICdzdWInIG9yICd1c2VyX2lkJyBmaWVsZCFcIik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7IFxyXG4gICAgICAgIC8vIFNldCBhbGwgcmVxdWlyZWQgZmllbGRzIHRvIGRlY2VudCBkZWZhdWx0c1xyXG4gICAgICAgIGlzczogYGh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS8ke3Byb2plY3R9YCwgYXVkOiBwcm9qZWN0LCBpYXQsIGV4cDogaWF0ICsgMzYwMCwgYXV0aF90aW1lOiBpYXQsIHN1YiwgdXNlcl9pZDogc3ViLCBmaXJlYmFzZToge1xyXG4gICAgICAgICAgICBzaWduX2luX3Byb3ZpZGVyOiAnY3VzdG9tJyxcclxuICAgICAgICAgICAgaWRlbnRpdGllczoge31cclxuICAgICAgICB9IH0sIHRva2VuKTtcclxuICAgIC8vIFVuc2VjdXJlZCBKV1RzIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGFzIGEgc2lnbmF0dXJlLlxyXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gJyc7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KGhlYWRlcikpLFxyXG4gICAgICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKSxcclxuICAgICAgICBzaWduYXR1cmVcclxuICAgIF0uam9pbignLicpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIG5hdmlnYXRvci51c2VyQWdlbnQgc3RyaW5nIG9yICcnIGlmIGl0J3Mgbm90IGRlZmluZWQuXHJcbiAqIEByZXR1cm4gdXNlciBhZ2VudCBzdHJpbmdcclxuICovXHJcbmZ1bmN0aW9uIGdldFVBKCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgdHlwZW9mIG5hdmlnYXRvclsndXNlckFnZW50J10gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvclsndXNlckFnZW50J107XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIERldGVjdCBDb3Jkb3ZhIC8gUGhvbmVHYXAgLyBJb25pYyBmcmFtZXdvcmtzIG9uIGEgbW9iaWxlIGRldmljZS5cclxuICpcclxuICogRGVsaWJlcmF0ZWx5IGRvZXMgbm90IHJlbHkgb24gY2hlY2tpbmcgYGZpbGU6Ly9gIFVSTHMgKGFzIHRoaXMgZmFpbHMgUGhvbmVHYXBcclxuICogaW4gdGhlIFJpcHBsZSBlbXVsYXRvcikgbm9yIENvcmRvdmEgYG9uRGV2aWNlUmVhZHlgLCB3aGljaCB3b3VsZCBub3JtYWxseVxyXG4gKiB3YWl0IGZvciBhIGNhbGxiYWNrLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNNb2JpbGVDb3Jkb3ZhKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgU2V0dGluZyB1cCBhbiBicm9hZGx5IGFwcGxpY2FibGUgaW5kZXggc2lnbmF0dXJlIGZvciBXaW5kb3dcclxuICAgICAgICAvLyBqdXN0IHRvIGRlYWwgd2l0aCB0aGlzIGNhc2Ugd291bGQgcHJvYmFibHkgYmUgYSBiYWQgaWRlYS5cclxuICAgICAgICAhISh3aW5kb3dbJ2NvcmRvdmEnXSB8fCB3aW5kb3dbJ3Bob25lZ2FwJ10gfHwgd2luZG93WydQaG9uZUdhcCddKSAmJlxyXG4gICAgICAgIC9pb3N8aXBob25lfGlwb2R8aXBhZHxhbmRyb2lkfGJsYWNrYmVycnl8aWVtb2JpbGUvaS50ZXN0KGdldFVBKCkpKTtcclxufVxyXG4vKipcclxuICogRGV0ZWN0IE5vZGUuanMuXHJcbiAqXHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBOb2RlLmpzIGVudmlyb25tZW50IGlzIGRldGVjdGVkLlxyXG4gKi9cclxuLy8gTm9kZSBkZXRlY3Rpb24gbG9naWMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2lsaWFrYW4vZGV0ZWN0LW5vZGUvXHJcbmZ1bmN0aW9uIGlzTm9kZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIERldGVjdCBCcm93c2VyIEVudmlyb25tZW50XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Jyb3dzZXIoKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnICYmIHNlbGYuc2VsZiA9PT0gc2VsZjtcclxufVxyXG5mdW5jdGlvbiBpc0Jyb3dzZXJFeHRlbnNpb24oKSB7XHJcbiAgICBjb25zdCBydW50aW1lID0gdHlwZW9mIGNocm9tZSA9PT0gJ29iamVjdCdcclxuICAgICAgICA/IGNocm9tZS5ydW50aW1lXHJcbiAgICAgICAgOiB0eXBlb2YgYnJvd3NlciA9PT0gJ29iamVjdCdcclxuICAgICAgICAgICAgPyBicm93c2VyLnJ1bnRpbWVcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gdHlwZW9mIHJ1bnRpbWUgPT09ICdvYmplY3QnICYmIHJ1bnRpbWUuaWQgIT09IHVuZGVmaW5lZDtcclxufVxyXG4vKipcclxuICogRGV0ZWN0IFJlYWN0IE5hdGl2ZS5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIFJlYWN0TmF0aXZlIGVudmlyb25tZW50IGlzIGRldGVjdGVkLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNSZWFjdE5hdGl2ZSgpIHtcclxuICAgIHJldHVybiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yWydwcm9kdWN0J10gPT09ICdSZWFjdE5hdGl2ZScpO1xyXG59XHJcbi8qKiBEZXRlY3RzIEVsZWN0cm9uIGFwcHMuICovXHJcbmZ1bmN0aW9uIGlzRWxlY3Ryb24oKSB7XHJcbiAgICByZXR1cm4gZ2V0VUEoKS5pbmRleE9mKCdFbGVjdHJvbi8nKSA+PSAwO1xyXG59XHJcbi8qKiBEZXRlY3RzIEludGVybmV0IEV4cGxvcmVyLiAqL1xyXG5mdW5jdGlvbiBpc0lFKCkge1xyXG4gICAgY29uc3QgdWEgPSBnZXRVQSgpO1xyXG4gICAgcmV0dXJuIHVhLmluZGV4T2YoJ01TSUUgJykgPj0gMCB8fCB1YS5pbmRleE9mKCdUcmlkZW50LycpID49IDA7XHJcbn1cclxuLyoqIERldGVjdHMgVW5pdmVyc2FsIFdpbmRvd3MgUGxhdGZvcm0gYXBwcy4gKi9cclxuZnVuY3Rpb24gaXNVV1AoKSB7XHJcbiAgICByZXR1cm4gZ2V0VUEoKS5pbmRleE9mKCdNU0FwcEhvc3QvJykgPj0gMDtcclxufVxyXG4vKipcclxuICogRGV0ZWN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgU0RLIGJ1aWxkIGlzIHRoZSBOb2RlIHZlcnNpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBOb2RlIFNESyBidWlsZC5cclxuICovXHJcbmZ1bmN0aW9uIGlzTm9kZVNkaygpIHtcclxuICAgIHJldHVybiBDT05TVEFOVFMuTk9ERV9DTElFTlQgPT09IHRydWUgfHwgQ09OU1RBTlRTLk5PREVfQURNSU4gPT09IHRydWU7XHJcbn1cclxuLyoqIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBTYWZhcmkuICovXHJcbmZ1bmN0aW9uIGlzU2FmYXJpKCkge1xyXG4gICAgcmV0dXJuICghaXNOb2RlKCkgJiZcclxuICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdTYWZhcmknKSAmJlxyXG4gICAgICAgICFuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKSk7XHJcbn1cclxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBpbmRleGVkREIgaXMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgYnJvd3Nlci9zZXJ2aWNlIHdvcmtlciBjb250ZXh0XHJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGVkREIgaXMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgYnJvd3Nlci9zZXJ2aWNlIHdvcmtlciBjb250ZXh0XHJcbiAqL1xyXG5mdW5jdGlvbiBpc0luZGV4ZWREQkF2YWlsYWJsZSgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgaW5kZXhlZERCID09PSAnb2JqZWN0JztcclxufVxyXG4vKipcclxuICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIGJyb3dzZXIvc3cgY29udGV4dCBmb3IgaW5kZXhlZERCIGJ5IG9wZW5pbmcgYSBkdW1teSBpbmRleGVkREIgZGF0YWJhc2UgYW5kIHJlamVjdFxyXG4gKiBpZiBlcnJvcnMgb2NjdXIgZHVyaW5nIHRoZSBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi5cclxuICpcclxuICogQHRocm93cyBleGNlcHRpb24gaWYgY3VycmVudCBicm93c2VyL3N3IGNvbnRleHQgY2FuJ3QgcnVuIGlkYi5vcGVuIChleDogU2FmYXJpIGlmcmFtZSwgRmlyZWZveFxyXG4gKiBwcml2YXRlIGJyb3dzaW5nKVxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHByZUV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgREJfQ0hFQ0tfTkFNRSA9ICd2YWxpZGF0ZS1icm93c2VyLWNvbnRleHQtZm9yLWluZGV4ZWRkYi1hbmFseXRpY3MtbW9kdWxlJztcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHNlbGYuaW5kZXhlZERCLm9wZW4oREJfQ0hFQ0tfTkFNRSk7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBkYXRhYmFzZSBvbmx5IHdoZW4gaXQgZG9lc24ndCBwcmUtZXhpc3RcclxuICAgICAgICAgICAgICAgIGlmICghcHJlRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShEQl9DSEVDS19OQU1FKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJlRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KCgoX2EgPSByZXF1ZXN0LmVycm9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWVzc2FnZSkgfHwgJycpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICpcclxuICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxyXG4gKiBAcmV0dXJuIHRydWUgaWYgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxyXG4gKi9cclxuZnVuY3Rpb24gYXJlQ29va2llc0VuYWJsZWQoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgIW5hdmlnYXRvci5jb29raWVFbmFibGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIFBvbHlmaWxsIGZvciBgZ2xvYmFsVGhpc2Agb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0R2xvYmFsKCkge1xyXG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBzZWxmO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWw7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdC4nKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGZpbGVvdmVydmlldyBTdGFuZGFyZGl6ZWQgRmlyZWJhc2UgRXJyb3IuXHJcbiAqXHJcbiAqIFVzYWdlOlxyXG4gKlxyXG4gKiAgIC8vIFR5cGVzY3JpcHQgc3RyaW5nIGxpdGVyYWxzIGZvciB0eXBlLXNhZmUgY29kZXNcclxuICogICB0eXBlIEVyciA9XHJcbiAqICAgICAndW5rbm93bicgfFxyXG4gKiAgICAgJ29iamVjdC1ub3QtZm91bmQnXHJcbiAqICAgICA7XHJcbiAqXHJcbiAqICAgLy8gQ2xvc3VyZSBlbnVtIGZvciB0eXBlLXNhZmUgZXJyb3IgY29kZXNcclxuICogICAvLyBhdC1lbnVtIHtzdHJpbmd9XHJcbiAqICAgdmFyIEVyciA9IHtcclxuICogICAgIFVOS05PV046ICd1bmtub3duJyxcclxuICogICAgIE9CSkVDVF9OT1RfRk9VTkQ6ICdvYmplY3Qtbm90LWZvdW5kJyxcclxuICogICB9XHJcbiAqXHJcbiAqICAgbGV0IGVycm9yczogTWFwPEVyciwgc3RyaW5nPiA9IHtcclxuICogICAgICdnZW5lcmljLWVycm9yJzogXCJVbmtub3duIGVycm9yXCIsXHJcbiAqICAgICAnZmlsZS1ub3QtZm91bmQnOiBcIkNvdWxkIG5vdCBmaW5kIGZpbGU6IHskZmlsZX1cIixcclxuICogICB9O1xyXG4gKlxyXG4gKiAgIC8vIFR5cGUtc2FmZSBmdW5jdGlvbiAtIG11c3QgcGFzcyBhIHZhbGlkIGVycm9yIGNvZGUgYXMgcGFyYW0uXHJcbiAqICAgbGV0IGVycm9yID0gbmV3IEVycm9yRmFjdG9yeTxFcnI+KCdzZXJ2aWNlJywgJ1NlcnZpY2UnLCBlcnJvcnMpO1xyXG4gKlxyXG4gKiAgIC4uLlxyXG4gKiAgIHRocm93IGVycm9yLmNyZWF0ZShFcnIuR0VORVJJQyk7XHJcbiAqICAgLi4uXHJcbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5GSUxFX05PVF9GT1VORCwgeydmaWxlJzogZmlsZU5hbWV9KTtcclxuICogICAuLi5cclxuICogICAvLyBTZXJ2aWNlOiBDb3VsZCBub3QgZmlsZSBmaWxlOiBmb28udHh0IChzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kKS5cclxuICpcclxuICogICBjYXRjaCAoZSkge1xyXG4gKiAgICAgYXNzZXJ0KGUubWVzc2FnZSA9PT0gXCJDb3VsZCBub3QgZmluZCBmaWxlOiBmb28udHh0LlwiKTtcclxuICogICAgIGlmIChlLmNvZGUgPT09ICdzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kJykge1xyXG4gKiAgICAgICBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCByZWFkIGZpbGU6IFwiICsgZVsnZmlsZSddKTtcclxuICogICAgIH1cclxuICogICB9XHJcbiAqL1xyXG5jb25zdCBFUlJPUl9OQU1FID0gJ0ZpcmViYXNlRXJyb3InO1xyXG4vLyBCYXNlZCBvbiBjb2RlIGZyb206XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xyXG5jbGFzcyBGaXJlYmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZSwgbWVzc2FnZSwgY3VzdG9tRGF0YSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0gY3VzdG9tRGF0YTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBFUlJPUl9OQU1FO1xyXG4gICAgICAgIC8vIEZpeCBGb3IgRVM1XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmlyZWJhc2VFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgZm9yIHdoZXJlIG91ciBlcnJvciB3YXMgdGhyb3duLlxyXG4gICAgICAgIC8vIE9ubHkgYXZhaWxhYmxlIG9uIFY4LlxyXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xyXG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFcnJvckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmNsYXNzIEVycm9yRmFjdG9yeSB7XHJcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlLCBzZXJ2aWNlTmFtZSwgZXJyb3JzKSB7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7XHJcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XHJcbiAgICB9XHJcbiAgICBjcmVhdGUoY29kZSwgLi4uZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBkYXRhWzBdIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IGZ1bGxDb2RlID0gYCR7dGhpcy5zZXJ2aWNlfS8ke2NvZGV9YDtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZXJyb3JzW2NvZGVdO1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0ZW1wbGF0ZSA/IHJlcGxhY2VUZW1wbGF0ZSh0ZW1wbGF0ZSwgY3VzdG9tRGF0YSkgOiAnRXJyb3InO1xyXG4gICAgICAgIC8vIFNlcnZpY2UgTmFtZTogRXJyb3IgbWVzc2FnZSAoc2VydmljZS9jb2RlKS5cclxuICAgICAgICBjb25zdCBmdWxsTWVzc2FnZSA9IGAke3RoaXMuc2VydmljZU5hbWV9OiAke21lc3NhZ2V9ICgke2Z1bGxDb2RlfSkuYDtcclxuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGaXJlYmFzZUVycm9yKGZ1bGxDb2RlLCBmdWxsTWVzc2FnZSwgY3VzdG9tRGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIGVycm9yO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHJlcGxhY2VUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoUEFUVEVSTiwgKF8sIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKSA6IGA8JHtrZXl9Pz5gO1xyXG4gICAgfSk7XHJcbn1cclxuY29uc3QgUEFUVEVSTiA9IC9cXHtcXCQoW159XSspfS9nO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRXZhbHVhdGVzIGEgSlNPTiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEEgc3RyaW5nIGNvbnRhaW5pbmcgSlNPTi5cclxuICogQHJldHVybiB7Kn0gVGhlIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIEpTT04uXHJcbiAqL1xyXG5mdW5jdGlvbiBqc29uRXZhbChzdHIpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgSlNPTiByZXByZXNlbnRpbmcgYSBqYXZhc2NyaXB0IG9iamVjdC5cclxuICogQHBhcmFtIHsqfSBkYXRhIEphdmFzY3JpcHQgb2JqZWN0IHRvIGJlIHN0cmluZ2lmaWVkLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBKU09OIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gaW50byBjb25zdGl0dWVudCBwYXJ0cy5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiB3aXRoIGludmFsaWQgLyBpbmNvbXBsZXRlIGNsYWltcyBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGRlY29kZSA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgbGV0IGhlYWRlciA9IHt9LCBjbGFpbXMgPSB7fSwgZGF0YSA9IHt9LCBzaWduYXR1cmUgPSAnJztcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xyXG4gICAgICAgIGhlYWRlciA9IGpzb25FdmFsKGJhc2U2NERlY29kZShwYXJ0c1swXSkgfHwgJycpO1xyXG4gICAgICAgIGNsYWltcyA9IGpzb25FdmFsKGJhc2U2NERlY29kZShwYXJ0c1sxXSkgfHwgJycpO1xyXG4gICAgICAgIHNpZ25hdHVyZSA9IHBhcnRzWzJdO1xyXG4gICAgICAgIGRhdGEgPSBjbGFpbXNbJ2QnXSB8fCB7fTtcclxuICAgICAgICBkZWxldGUgY2xhaW1zWydkJ107XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGhlYWRlcixcclxuICAgICAgICBjbGFpbXMsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBzaWduYXR1cmVcclxuICAgIH07XHJcbn07XHJcbi8qKlxyXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgaXRzIHRpbWUtYmFzZWQgY2xhaW1zLiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZVxyXG4gKiB0b2tlbiBpcyB3aXRoaW4gdGhlIHRpbWUgd2luZG93IGF1dGhvcml6ZWQgYnkgdGhlICduYmYnIChub3QtYmVmb3JlKSBhbmQgJ2lhdCcgKGlzc3VlZC1hdCkgY2xhaW1zLlxyXG4gKlxyXG4gKiBOb3RlczpcclxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBpc1ZhbGlkVGltZXN0YW1wID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBjb25zdCBjbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcclxuICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcclxuICAgIGxldCB2YWxpZFNpbmNlID0gMCwgdmFsaWRVbnRpbCA9IDA7XHJcbiAgICBpZiAodHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCduYmYnKSkge1xyXG4gICAgICAgICAgICB2YWxpZFNpbmNlID0gY2xhaW1zWyduYmYnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCdpYXQnKSkge1xyXG4gICAgICAgICAgICB2YWxpZFNpbmNlID0gY2xhaW1zWydpYXQnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnZXhwJykpIHtcclxuICAgICAgICAgICAgdmFsaWRVbnRpbCA9IGNsYWltc1snZXhwJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0b2tlbiB3aWxsIGV4cGlyZSBhZnRlciAyNGggYnkgZGVmYXVsdFxyXG4gICAgICAgICAgICB2YWxpZFVudGlsID0gdmFsaWRTaW5jZSArIDg2NDAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAoISFub3cgJiZcclxuICAgICAgICAhIXZhbGlkU2luY2UgJiZcclxuICAgICAgICAhIXZhbGlkVW50aWwgJiZcclxuICAgICAgICBub3cgPj0gdmFsaWRTaW5jZSAmJlxyXG4gICAgICAgIG5vdyA8PSB2YWxpZFVudGlsKTtcclxufTtcclxuLyoqXHJcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgcmV0dXJucyBpdHMgaXNzdWVkIGF0IHRpbWUgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxyXG4gKlxyXG4gKiBOb3RlczpcclxuICogLSBNYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBpc3N1ZWRBdFRpbWUgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGNsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xyXG4gICAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcclxuICAgICAgICByZXR1cm4gY2xhaW1zWydpYXQnXTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGl0cyBmb3JtYXQuIEV4cGVjdHMgYSB2YWxpZCBpc3N1ZWQtYXQgdGltZS5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNWYWxpZEZvcm1hdCA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZSh0b2tlbiksIGNsYWltcyA9IGRlY29kZWQuY2xhaW1zO1xyXG4gICAgcmV0dXJuICEhY2xhaW1zICYmIHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0Jyk7XHJcbn07XHJcbi8qKlxyXG4gKiBBdHRlbXB0cyB0byBwZWVyIGludG8gYW4gYXV0aCB0b2tlbiBhbmQgZGV0ZXJtaW5lIGlmIGl0J3MgYW4gYWRtaW4gYXV0aCB0b2tlbiBieSBsb29raW5nIGF0IHRoZSBjbGFpbXMgcG9ydGlvbi5cclxuICpcclxuICogTm90ZXM6XHJcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgaXNBZG1pbiA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgY29uc3QgY2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XHJcbiAgICByZXR1cm4gdHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcgJiYgY2xhaW1zWydhZG1pbiddID09PSB0cnVlO1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb250YWlucyhvYmosIGtleSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XHJcbn1cclxuZnVuY3Rpb24gc2FmZUdldChvYmosIGtleSkge1xyXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW2tleV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gbWFwKG9iaiwgZm4sIGNvbnRleHRPYmopIHtcclxuICAgIGNvbnN0IHJlcyA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmVzW2tleV0gPSBmbi5jYWxsKGNvbnRleHRPYmosIG9ialtrZXldLCBrZXksIG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxufVxyXG4vKipcclxuICogRGVlcCBlcXVhbCB0d28gb2JqZWN0cy4gU3VwcG9ydCBBcnJheXMgYW5kIE9iamVjdHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xyXG4gICAgaWYgKGEgPT09IGIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XHJcbiAgICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xyXG4gICAgZm9yIChjb25zdCBrIG9mIGFLZXlzKSB7XHJcbiAgICAgICAgaWYgKCFiS2V5cy5pbmNsdWRlcyhrKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFQcm9wID0gYVtrXTtcclxuICAgICAgICBjb25zdCBiUHJvcCA9IGJba107XHJcbiAgICAgICAgaWYgKGlzT2JqZWN0KGFQcm9wKSAmJiBpc09iamVjdChiUHJvcCkpIHtcclxuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVByb3AsIGJQcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFQcm9wICE9PSBiUHJvcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBrIG9mIGJLZXlzKSB7XHJcbiAgICAgICAgaWYgKCFhS2V5cy5pbmNsdWRlcyhrKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcclxuICAgIHJldHVybiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgcXVlcnlzdHJpbmctZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAmYXJnPXZhbCZhcmcyPXZhbDIpIGZyb20gYVxyXG4gKiBwYXJhbXMgb2JqZWN0IChlLmcuIHthcmc6ICd2YWwnLCBhcmcyOiAndmFsMid9KVxyXG4gKiBOb3RlOiBZb3UgbXVzdCBwcmVwZW5kIGl0IHdpdGggPyB3aGVuIGFkZGluZyBpdCB0byBhIFVSTC5cclxuICovXHJcbmZ1bmN0aW9uIHF1ZXJ5c3RyaW5nKHF1ZXJ5c3RyaW5nUGFyYW1zKSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5c3RyaW5nUGFyYW1zKSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFycmF5VmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFycmF5VmFsKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGFyYW1zLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zLmxlbmd0aCA/ICcmJyArIHBhcmFtcy5qb2luKCcmJykgOiAnJztcclxufVxyXG4vKipcclxuICogRGVjb2RlcyBhIHF1ZXJ5c3RyaW5nIChlLmcuID9hcmc9dmFsJmFyZzI9dmFsMikgaW50byBhIHBhcmFtcyBvYmplY3RcclxuICogKGUuZy4ge2FyZzogJ3ZhbCcsIGFyZzI6ICd2YWwyJ30pXHJcbiAqL1xyXG5mdW5jdGlvbiBxdWVyeXN0cmluZ0RlY29kZShxdWVyeXN0cmluZykge1xyXG4gICAgY29uc3Qgb2JqID0ge307XHJcbiAgICBjb25zdCB0b2tlbnMgPSBxdWVyeXN0cmluZy5yZXBsYWNlKC9eXFw/LywgJycpLnNwbGl0KCcmJyk7XHJcbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XHJcbiAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHRva2VuLnNwbGl0KCc9Jyk7XHJcbiAgICAgICAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQoa2V5KV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9iajtcclxufVxyXG4vKipcclxuICogRXh0cmFjdCB0aGUgcXVlcnkgc3RyaW5nIHBhcnQgb2YgYSBVUkwsIGluY2x1ZGluZyB0aGUgbGVhZGluZyBxdWVzdGlvbiBtYXJrIChpZiBwcmVzZW50KS5cclxuICovXHJcbmZ1bmN0aW9uIGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpIHtcclxuICAgIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xyXG4gICAgaWYgKCFxdWVyeVN0YXJ0KSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZnJhZ21lbnRTdGFydCA9IHVybC5pbmRleE9mKCcjJywgcXVlcnlTdGFydCk7XHJcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhxdWVyeVN0YXJ0LCBmcmFnbWVudFN0YXJ0ID4gMCA/IGZyYWdtZW50U3RhcnQgOiB1bmRlZmluZWQpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IFNIQS0xIGNyeXB0b2dyYXBoaWMgaGFzaC5cclxuICogVmFyaWFibGUgbmFtZXMgZm9sbG93IHRoZSBub3RhdGlvbiBpbiBGSVBTIFBVQiAxODAtMzpcclxuICogaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC0zL2ZpcHMxODAtM19maW5hbC5wZGYuXHJcbiAqXHJcbiAqIFVzYWdlOlxyXG4gKiAgIHZhciBzaGExID0gbmV3IHNoYTEoKTtcclxuICogICBzaGExLnVwZGF0ZShieXRlcyk7XHJcbiAqICAgdmFyIGhhc2ggPSBzaGExLmRpZ2VzdCgpO1xyXG4gKlxyXG4gKiBQZXJmb3JtYW5jZTpcclxuICogICBDaHJvbWUgMjM6ICAgfjQwMCBNYml0L3NcclxuICogICBGaXJlZm94IDE2OiAgfjI1MCBNYml0L3NcclxuICpcclxuICovXHJcbi8qKlxyXG4gKiBTSEEtMSBjcnlwdG9ncmFwaGljIGhhc2ggY29uc3RydWN0b3IuXHJcbiAqXHJcbiAqIFRoZSBwcm9wZXJ0aWVzIGRlY2xhcmVkIGhlcmUgYXJlIGRpc2N1c3NlZCBpbiB0aGUgYWJvdmUgYWxnb3JpdGhtIGRvY3VtZW50LlxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQGZpbmFsXHJcbiAqIEBzdHJ1Y3RcclxuICovXHJcbmNsYXNzIFNoYTEge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9sZHMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiBhY2N1bXVsYXRlZCB2YXJpYWJsZXMgYS1lIGluIHRoZSBjb21wcmVzc19cclxuICAgICAgICAgKiBmdW5jdGlvbi5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2hhaW5fID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBidWZmZXIgaG9sZGluZyB0aGUgcGFydGlhbGx5IGNvbXB1dGVkIGhhc2ggcmVzdWx0LlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5idWZfID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgODAgYnl0ZXMsIGVhY2ggYSBwYXJ0IG9mIHRoZSBtZXNzYWdlIHRvIGJlIGhhc2hlZC4gIFJlZmVycmVkIHRvXHJcbiAgICAgICAgICogYXMgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgaW4gdGhlIGRvY3MuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLldfID0gW107XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udGFpbnMgZGF0YSBuZWVkZWQgdG8gcGFkIG1lc3NhZ2VzIGxlc3MgdGhhbiA2NCBieXRlcy5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFkXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbmJ1Zl8gPSAwO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcml2YXRlIHtudW1iZXJ9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbF8gPSAwO1xyXG4gICAgICAgIHRoaXMuYmxvY2tTaXplID0gNTEyIC8gODtcclxuICAgICAgICB0aGlzLnBhZF9bMF0gPSAxMjg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgKytpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFkX1tpXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgIH1cclxuICAgIHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzBdID0gMHg2NzQ1MjMwMTtcclxuICAgICAgICB0aGlzLmNoYWluX1sxXSA9IDB4ZWZjZGFiODk7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMl0gPSAweDk4YmFkY2ZlO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzNdID0gMHgxMDMyNTQ3NjtcclxuICAgICAgICB0aGlzLmNoYWluX1s0XSA9IDB4YzNkMmUxZjA7XHJcbiAgICAgICAgdGhpcy5pbmJ1Zl8gPSAwO1xyXG4gICAgICAgIHRoaXMudG90YWxfID0gMDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgY29tcHJlc3MgaGVscGVyIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIGJ1ZiBCbG9jayB0byBjb21wcmVzcy5cclxuICAgICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IG9mIHRoZSBibG9jayBpbiB0aGUgYnVmZmVyLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY29tcHJlc3NfKGJ1Ziwgb2Zmc2V0KSB7XHJcbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgVyA9IHRoaXMuV187XHJcbiAgICAgICAgLy8gZ2V0IDE2IGJpZyBlbmRpYW4gd29yZHNcclxuICAgICAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHVzZXIpOiBbYnVnIDgxNDAxMjJdIFJlY2VudCB2ZXJzaW9ucyBvZiBTYWZhcmkgZm9yIE1hYyBPUyBhbmQgaU9TXHJcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgYnVnIHRoYXQgdHVybnMgdGhlIHBvc3QtaW5jcmVtZW50ICsrIG9wZXJhdG9yIGludG8gcHJlLWluY3JlbWVudFxyXG4gICAgICAgICAgICAgICAgLy8gZHVyaW5nIEpJVCBjb21waWxhdGlvbi4gIFdlIGhhdmUgY29kZSB0aGF0IGRlcGVuZHMgaGVhdmlseSBvbiBTSEEtMSBmb3JcclxuICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RuZXNzIGFuZCB3aGljaCBpcyBhZmZlY3RlZCBieSB0aGlzIGJ1Zywgc28gSSd2ZSByZW1vdmVkIGFsbCB1c2VzXHJcbiAgICAgICAgICAgICAgICAvLyBvZiBwb3N0LWluY3JlbWVudCArKyBpbiB3aGljaCB0aGUgcmVzdWx0IHZhbHVlIGlzIHVzZWQuICBXZSBjYW4gcmV2ZXJ0XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGNoYW5nZSBvbmNlIHRoZSBTYWZhcmkgYnVnXHJcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwOTAzNikgaGFzIGJlZW4gZml4ZWQgYW5kXHJcbiAgICAgICAgICAgICAgICAvLyBtb3N0IGNsaWVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQuXHJcbiAgICAgICAgICAgICAgICBXW2ldID1cclxuICAgICAgICAgICAgICAgICAgICAoYnVmLmNoYXJDb2RlQXQob2Zmc2V0KSA8PCAyNCkgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVmLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPDwgMTYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDgpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmNoYXJDb2RlQXQob2Zmc2V0ICsgMyk7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBXW2ldID1cclxuICAgICAgICAgICAgICAgICAgICAoYnVmW29mZnNldF0gPDwgMjQpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXQgKyAxXSA8PCAxNikgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVmW29mZnNldCArIDJdIDw8IDgpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmW29mZnNldCArIDNdO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZXhwYW5kIHRvIDgwIHdvcmRzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE2OyBpIDwgODA7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB0ID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcclxuICAgICAgICAgICAgV1tpXSA9ICgodCA8PCAxKSB8ICh0ID4+PiAzMSkpICYgMHhmZmZmZmZmZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGEgPSB0aGlzLmNoYWluX1swXTtcclxuICAgICAgICBsZXQgYiA9IHRoaXMuY2hhaW5fWzFdO1xyXG4gICAgICAgIGxldCBjID0gdGhpcy5jaGFpbl9bMl07XHJcbiAgICAgICAgbGV0IGQgPSB0aGlzLmNoYWluX1szXTtcclxuICAgICAgICBsZXQgZSA9IHRoaXMuY2hhaW5fWzRdO1xyXG4gICAgICAgIGxldCBmLCBrO1xyXG4gICAgICAgIC8vIFRPRE8odXNlcik6IFRyeSB0byB1bnJvbGwgdGhpcyBsb29wIHRvIHNwZWVkIHVwIHRoZSBjb21wdXRhdGlvbi5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDgwOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGkgPCA0MCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBkIF4gKGIgJiAoYyBeIGQpKTtcclxuICAgICAgICAgICAgICAgICAgICBrID0gMHg1YTgyNzk5OTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4NmVkOWViYTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA8IDYwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZiA9IChiICYgYykgfCAoZCAmIChiIHwgYykpO1xyXG4gICAgICAgICAgICAgICAgICAgIGsgPSAweDhmMWJiY2RjO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZiA9IGIgXiBjIF4gZDtcclxuICAgICAgICAgICAgICAgICAgICBrID0gMHhjYTYyYzFkNjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0ID0gKCgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyBrICsgV1tpXSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgICAgICBlID0gZDtcclxuICAgICAgICAgICAgZCA9IGM7XHJcbiAgICAgICAgICAgIGMgPSAoKGIgPDwgMzApIHwgKGIgPj4+IDIpKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgICAgIGIgPSBhO1xyXG4gICAgICAgICAgICBhID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMF0gPSAodGhpcy5jaGFpbl9bMF0gKyBhKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMV0gPSAodGhpcy5jaGFpbl9bMV0gKyBiKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMl0gPSAodGhpcy5jaGFpbl9bMl0gKyBjKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bM10gPSAodGhpcy5jaGFpbl9bM10gKyBkKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bNF0gPSAodGhpcy5jaGFpbl9bNF0gKyBlKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICB9XHJcbiAgICB1cGRhdGUoYnl0ZXMsIGxlbmd0aCkge1xyXG4gICAgICAgIC8vIFRPRE8oam9obmxlbnopOiB0aWdodGVuIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHJlbW92ZSB0aGlzIGNoZWNrXHJcbiAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZW5ndGhNaW51c0Jsb2NrID0gbGVuZ3RoIC0gdGhpcy5ibG9ja1NpemU7XHJcbiAgICAgICAgbGV0IG4gPSAwO1xyXG4gICAgICAgIC8vIFVzaW5nIGxvY2FsIGluc3RlYWQgb2YgbWVtYmVyIHZhcmlhYmxlcyBnaXZlcyB+NSUgc3BlZWR1cCBvbiBGaXJlZm94IDE2LlxyXG4gICAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuYnVmXztcclxuICAgICAgICBsZXQgaW5idWYgPSB0aGlzLmluYnVmXztcclxuICAgICAgICAvLyBUaGUgb3V0ZXIgd2hpbGUgbG9vcCBzaG91bGQgZXhlY3V0ZSBhdCBtb3N0IHR3aWNlLlxyXG4gICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBubyBkYXRhIGluIHRoZSBibG9jayB0byB0b3AgdXAsIHdlIGNhbiBkaXJlY3RseSBwcm9jZXNzIHRoZVxyXG4gICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgKGFzc3VtaW5nIGl0IGNvbnRhaW5zIHN1ZmZpY2llbnQgZGF0YSkuIFRoaXMgZ2l2ZXMgfjI1JVxyXG4gICAgICAgICAgICAvLyBzcGVlZHVwIG9uIENocm9tZSAyMyBhbmQgfjE1JSBzcGVlZHVwIG9uIEZpcmVmb3ggMTYsIGJ1dCByZXF1aXJlcyB0aGF0XHJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRhIGlzIHByb3ZpZGVkIGluIGxhcmdlIGNodW5rcyAob3IgaW4gbXVsdGlwbGVzIG9mIDY0IGJ5dGVzKS5cclxuICAgICAgICAgICAgaWYgKGluYnVmID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobiA8PSBsZW5ndGhNaW51c0Jsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnl0ZXMsIG4pO1xyXG4gICAgICAgICAgICAgICAgICAgIG4gKz0gdGhpcy5ibG9ja1NpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzLmNoYXJDb2RlQXQobik7XHJcbiAgICAgICAgICAgICAgICAgICAgKytpbmJ1ZjtcclxuICAgICAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXByZXNzXyhidWYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmJ1ZiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG4gPCBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBidWZbaW5idWZdID0gYnl0ZXNbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgKytpbmJ1ZjtcclxuICAgICAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXByZXNzXyhidWYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmJ1ZiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5idWZfID0gaW5idWY7XHJcbiAgICAgICAgdGhpcy50b3RhbF8gKz0gbGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgLyoqIEBvdmVycmlkZSAqL1xyXG4gICAgZGlnZXN0KCkge1xyXG4gICAgICAgIGNvbnN0IGRpZ2VzdCA9IFtdO1xyXG4gICAgICAgIGxldCB0b3RhbEJpdHMgPSB0aGlzLnRvdGFsXyAqIDg7XHJcbiAgICAgICAgLy8gQWRkIHBhZCAweDgwIDB4MDAqLlxyXG4gICAgICAgIGlmICh0aGlzLmluYnVmXyA8IDU2KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMucGFkXywgNTYgLSB0aGlzLmluYnVmXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIHRoaXMuYmxvY2tTaXplIC0gKHRoaXMuaW5idWZfIC0gNTYpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRkICMgYml0cy5cclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5ibG9ja1NpemUgLSAxOyBpID49IDU2OyBpLS0pIHtcclxuICAgICAgICAgICAgdGhpcy5idWZfW2ldID0gdG90YWxCaXRzICYgMjU1O1xyXG4gICAgICAgICAgICB0b3RhbEJpdHMgLz0gMjU2OyAvLyBEb24ndCB1c2UgYml0LXNoaWZ0aW5nIGhlcmUhXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcHJlc3NfKHRoaXMuYnVmXyk7XHJcbiAgICAgICAgbGV0IG4gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAyNDsgaiA+PSAwOyBqIC09IDgpIHtcclxuICAgICAgICAgICAgICAgIGRpZ2VzdFtuXSA9ICh0aGlzLmNoYWluX1tpXSA+PiBqKSAmIDI1NTtcclxuICAgICAgICAgICAgICAgICsrbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlnZXN0O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBIZWxwZXIgdG8gbWFrZSBhIFN1YnNjcmliZSBmdW5jdGlvbiAoanVzdCBsaWtlIFByb21pc2UgaGVscHMgbWFrZSBhXHJcbiAqIFRoZW5hYmxlKS5cclxuICpcclxuICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXHJcbiAqICAgICBhcyBhIHByb3h5LlxyXG4gKiBAcGFyYW0gb25Ob09ic2VydmVycyBDYWxsYmFjayB3aGVuIGNvdW50IG9mIE9ic2VydmVycyBnb2VzIHRvIHplcm8uXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVTdWJzY3JpYmUoZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpIHtcclxuICAgIGNvbnN0IHByb3h5ID0gbmV3IE9ic2VydmVyUHJveHkoZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpO1xyXG4gICAgcmV0dXJuIHByb3h5LnN1YnNjcmliZS5iaW5kKHByb3h5KTtcclxufVxyXG4vKipcclxuICogSW1wbGVtZW50IGZhbi1vdXQgZm9yIGFueSBudW1iZXIgb2YgT2JzZXJ2ZXJzIGF0dGFjaGVkIHZpYSBhIHN1YnNjcmliZVxyXG4gKiBmdW5jdGlvbi5cclxuICovXHJcbmNsYXNzIE9ic2VydmVyUHJveHkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gZXhlY3V0b3IgRnVuY3Rpb24gd2hpY2ggY2FuIG1ha2UgY2FsbHMgdG8gYSBzaW5nbGUgT2JzZXJ2ZXJcclxuICAgICAqICAgICBhcyBhIHByb3h5LlxyXG4gICAgICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvciwgb25Ob09ic2VydmVycykge1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XHJcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZXMgPSBbXTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyQ291bnQgPSAwO1xyXG4gICAgICAgIC8vIE1pY3JvLXRhc2sgc2NoZWR1bGluZyBieSBjYWxsaW5nIHRhc2sudGhlbigpLlxyXG4gICAgICAgIHRoaXMudGFzayA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIHRoaXMuZmluYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vbk5vT2JzZXJ2ZXJzID0gb25Ob09ic2VydmVycztcclxuICAgICAgICAvLyBDYWxsIHRoZSBleGVjdXRvciBhc3luY2hyb25vdXNseSBzbyBzdWJzY3JpYmVycyB0aGF0IGFyZSBjYWxsZWRcclxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3Vic2NyaWJlIGZ1bmN0aW9uXHJcbiAgICAgICAgLy8gY2FuIHN0aWxsIHJlY2VpdmUgdGhlIHZlcnkgZmlyc3QgdmFsdWUgZ2VuZXJhdGVkIGluIHRoZSBleGVjdXRvci5cclxuICAgICAgICB0aGlzLnRhc2tcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBleGVjdXRvcih0aGlzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBuZXh0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZXJyb3IoZXJyb3IpIHtcclxuICAgICAgICB0aGlzLmZvckVhY2hPYnNlcnZlcigob2JzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2xvc2UoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29tcGxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdWJzY3JpYmUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgYW4gT2JzZXJ2ZXIgdG8gdGhlIGZhbi1vdXQgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiAtIFdlIHJlcXVpcmUgdGhhdCBubyBldmVudCBpcyBzZW50IHRvIGEgc3Vic2NyaWJlciBzeWNocm9ub3VzbHkgdG8gdGhlaXJcclxuICAgICAqICAgY2FsbCB0byBzdWJzY3JpYmUoKS5cclxuICAgICAqL1xyXG4gICAgc3Vic2NyaWJlKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXI7XHJcbiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyID09PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgZXJyb3IgPT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICBjb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBPYnNlcnZlci4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQXNzZW1ibGUgYW4gT2JzZXJ2ZXIgb2JqZWN0IHdoZW4gcGFzc2VkIGFzIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAgICBpZiAoaW1wbGVtZW50c0FueU1ldGhvZHMobmV4dE9yT2JzZXJ2ZXIsIFtcclxuICAgICAgICAgICAgJ25leHQnLFxyXG4gICAgICAgICAgICAnZXJyb3InLFxyXG4gICAgICAgICAgICAnY29tcGxldGUnXHJcbiAgICAgICAgXSkpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIgPSBuZXh0T3JPYnNlcnZlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyID0ge1xyXG4gICAgICAgICAgICAgICAgbmV4dDogbmV4dE9yT2JzZXJ2ZXIsXHJcbiAgICAgICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYnNlcnZlci5uZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCA9IG5vb3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYnNlcnZlci5lcnJvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yID0gbm9vcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9ic2VydmVyLmNvbXBsZXRlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUgPSBub29wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB1bnN1YiA9IHRoaXMudW5zdWJzY3JpYmVPbmUuYmluZCh0aGlzLCB0aGlzLm9ic2VydmVycy5sZW5ndGgpO1xyXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gc3Vic2NyaWJlIHRvIGEgdGVybWluYXRlZCBPYnNlcnZhYmxlIC0gd2VcclxuICAgICAgICAvLyBqdXN0IHJlc3BvbmQgdG8gdGhlIE9ic2VydmVyIHdpdGggdGhlIGZpbmFsIGVycm9yIG9yIGNvbXBsZXRlXHJcbiAgICAgICAgLy8gZXZlbnQuXHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICAgICAgdGhpcy50YXNrLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5hbEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHRoaXMuZmluYWxFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XHJcbiAgICAgICAgcmV0dXJuIHVuc3ViO1xyXG4gICAgfVxyXG4gICAgLy8gVW5zdWJzY3JpYmUgaXMgc3luY2hyb25vdXMgLSB3ZSBndWFyYW50ZWUgdGhhdCBubyBldmVudHMgYXJlIHNlbnQgdG9cclxuICAgIC8vIGFueSB1bnN1YnNjcmliZWQgT2JzZXJ2ZXIuXHJcbiAgICB1bnN1YnNjcmliZU9uZShpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJzID09PSB1bmRlZmluZWQgfHwgdGhpcy5vYnNlcnZlcnNbaV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1tpXTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyQ291bnQgLT0gMTtcclxuICAgICAgICBpZiAodGhpcy5vYnNlcnZlckNvdW50ID09PSAwICYmIHRoaXMub25Ob09ic2VydmVycyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25Ob09ic2VydmVycyh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3JFYWNoT2JzZXJ2ZXIoZm4pIHtcclxuICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQpIHtcclxuICAgICAgICAgICAgLy8gQWxyZWFkeSBjbG9zZWQgYnkgcHJldmlvdXMgZXZlbnQuLi4uanVzdCBlYXQgdGhlIGFkZGl0aW9uYWwgdmFsdWVzLlxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNpbmNlIHNlbmRPbmUgY2FsbHMgYXN5bmNocm9ub3VzbHkgLSB0aGVyZSBpcyBubyBjaGFuY2UgdGhhdFxyXG4gICAgICAgIC8vIHRoaXMub2JzZXJ2ZXJzIHdpbGwgYmVjb21lIHVuZGVmaW5lZC5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZE9uZShpLCBmbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQ2FsbCB0aGUgT2JzZXJ2ZXIgdmlhIG9uZSBvZiBpdCdzIGNhbGxiYWNrIGZ1bmN0aW9uLiBXZSBhcmUgY2FyZWZ1bCB0b1xyXG4gICAgLy8gY29uZmlybSB0aGF0IHRoZSBvYnNlcnZlIGhhcyBub3QgYmVlbiB1bnN1YnNjcmliZWQgc2luY2UgdGhpcyBhc3luY2hyb25vdXNcclxuICAgIC8vIGZ1bmN0aW9uIGhhZCBiZWVuIHF1ZXVlZC5cclxuICAgIHNlbmRPbmUoaSwgZm4pIHtcclxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBjYWxsYmFjayBhc3luY2hyb25vdXNseVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9ic2VydmVycyAhPT0gdW5kZWZpbmVkICYmIHRoaXMub2JzZXJ2ZXJzW2ldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm4odGhpcy5vYnNlcnZlcnNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9ucyByYWlzZWQgaW4gT2JzZXJ2ZXJzIG9yIG1pc3NpbmcgbWV0aG9kcyBvZiBhblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ic2VydmVyLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvZyBlcnJvciB0byBjb25zb2xlLiBiLzMxNDA0ODA2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjbG9zZShlcnIpIHtcclxuICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGVyciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxFcnJvciA9IGVycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJveHkgaXMgbm8gbG9uZ2VyIG5lZWRlZCAtIGdhcmJhZ2UgY29sbGVjdCByZWZlcmVuY2VzXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xyXG4gICAgICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4vKiogVHVybiBzeW5jaHJvbm91cyBmdW5jdGlvbiBpbnRvIG9uZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmZ1bmN0aW9uIGFzeW5jKGZuLCBvbkVycm9yKSB7XHJcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgICBQcm9taXNlLnJlc29sdmUodHJ1ZSlcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBmbiguLi5hcmdzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBvbkVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxufVxyXG4vKipcclxuICogUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaW1wbGVtZW50cyBhbnkgb2YgdGhlIG5hbWVkIG1ldGhvZHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBpbXBsZW1lbnRzQW55TWV0aG9kcyhvYmosIG1ldGhvZHMpIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XHJcbiAgICAgICAgaWYgKG1ldGhvZCBpbiBvYmogJiYgdHlwZW9mIG9ialttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5mdW5jdGlvbiBub29wKCkge1xyXG4gICAgLy8gZG8gbm90aGluZ1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGZvciBhIHB1YmxpYyBmdW5jdGlvbi5cclxuICogVGhyb3dzIGFuIGVycm9yIGlmIGl0IGZhaWxzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXHJcbiAqIEBwYXJhbSBtaW5Db3VudCBUaGUgbWluaW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGFsbG93IGZvciB0aGUgZnVuY3Rpb24gY2FsbFxyXG4gKiBAcGFyYW0gbWF4Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50IHRvIGFsbG93IGZvciB0aGUgZnVuY3Rpb24gY2FsbFxyXG4gKiBAcGFyYW0gYXJnQ291bnQgVGhlIGFjdHVhbCBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLlxyXG4gKi9cclxuY29uc3QgdmFsaWRhdGVBcmdDb3VudCA9IGZ1bmN0aW9uIChmbk5hbWUsIG1pbkNvdW50LCBtYXhDb3VudCwgYXJnQ291bnQpIHtcclxuICAgIGxldCBhcmdFcnJvcjtcclxuICAgIGlmIChhcmdDb3VudCA8IG1pbkNvdW50KSB7XHJcbiAgICAgICAgYXJnRXJyb3IgPSAnYXQgbGVhc3QgJyArIG1pbkNvdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXJnQ291bnQgPiBtYXhDb3VudCkge1xyXG4gICAgICAgIGFyZ0Vycm9yID0gbWF4Q291bnQgPT09IDAgPyAnbm9uZScgOiAnbm8gbW9yZSB0aGFuICcgKyBtYXhDb3VudDtcclxuICAgIH1cclxuICAgIGlmIChhcmdFcnJvcikge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gZm5OYW1lICtcclxuICAgICAgICAgICAgJyBmYWlsZWQ6IFdhcyBjYWxsZWQgd2l0aCAnICtcclxuICAgICAgICAgICAgYXJnQ291bnQgK1xyXG4gICAgICAgICAgICAoYXJnQ291bnQgPT09IDEgPyAnIGFyZ3VtZW50LicgOiAnIGFyZ3VtZW50cy4nKSArXHJcbiAgICAgICAgICAgICcgRXhwZWN0cyAnICtcclxuICAgICAgICAgICAgYXJnRXJyb3IgK1xyXG4gICAgICAgICAgICAnLic7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHN0cmluZyB0byBwcmVmaXggYW4gZXJyb3IgbWVzc2FnZSBhYm91dCBmYWlsZWQgYXJndW1lbnQgdmFsaWRhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXHJcbiAqIEBwYXJhbSBhcmdOYW1lIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudFxyXG4gKiBAcmV0dXJuIFRoZSBwcmVmaXggdG8gYWRkIHRvIHRoZSBlcnJvciB0aHJvd24gZm9yIHZhbGlkYXRpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBlcnJvclByZWZpeChmbk5hbWUsIGFyZ05hbWUpIHtcclxuICAgIHJldHVybiBgJHtmbk5hbWV9IGZhaWxlZDogJHthcmdOYW1lfSBhcmd1bWVudCBgO1xyXG59XHJcbi8qKlxyXG4gKiBAcGFyYW0gZm5OYW1lXHJcbiAqIEBwYXJhbSBhcmd1bWVudE51bWJlclxyXG4gKiBAcGFyYW0gbmFtZXNwYWNlXHJcbiAqIEBwYXJhbSBvcHRpb25hbFxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVOYW1lc3BhY2UoZm5OYW1lLCBuYW1lc3BhY2UsIG9wdGlvbmFsKSB7XHJcbiAgICBpZiAob3B0aW9uYWwgJiYgIW5hbWVzcGFjZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vVE9ETzogSSBzaG91bGQgZG8gbW9yZSB2YWxpZGF0aW9uIGhlcmUuIFdlIG9ubHkgYWxsb3cgY2VydGFpbiBjaGFycyBpbiBuYW1lc3BhY2VzLlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsICduYW1lc3BhY2UnKSArICdtdXN0IGJlIGEgdmFsaWQgZmlyZWJhc2UgbmFtZXNwYWNlLicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHZhbGlkYXRlQ2FsbGJhY2soZm5OYW1lLCBhcmd1bWVudE5hbWUsIFxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5jYWxsYmFjaywgb3B0aW9uYWwpIHtcclxuICAgIGlmIChvcHRpb25hbCAmJiAhY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yUHJlZml4KGZuTmFtZSwgYXJndW1lbnROYW1lKSArICdtdXN0IGJlIGEgdmFsaWQgZnVuY3Rpb24uJyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0T2JqZWN0KGZuTmFtZSwgYXJndW1lbnROYW1lLCBjb250ZXh0LCBvcHRpb25hbCkge1xyXG4gICAgaWYgKG9wdGlvbmFsICYmICFjb250ZXh0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0JyB8fCBjb250ZXh0ID09PSBudWxsKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yUHJlZml4KGZuTmFtZSwgYXJndW1lbnROYW1lKSArICdtdXN0IGJlIGEgdmFsaWQgY29udGV4dCBvYmplY3QuJyk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gQ29kZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSBnb29nLmNyeXB0LnN0cmluZ1RvVXRmOEJ5dGVBcnJheSwgYnV0IGZvciBzb21lIHJlYXNvbiB0aGV5XHJcbi8vIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgJ1xcclxcbicgd2l0aCAnXFxuJywgYW5kIHRoZXkgZGlkbid0IGhhbmRsZSBzdXJyb2dhdGUgcGFpcnMsXHJcbi8vIHNvIGl0J3MgYmVlbiBtb2RpZmllZC5cclxuLy8gTm90ZSB0aGF0IG5vdCBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzIGFwcGVhciBhcyBzaW5nbGUgY2hhcmFjdGVycyBpbiBKYXZhU2NyaXB0IHN0cmluZ3MuXHJcbi8vIGZyb21DaGFyQ29kZSByZXR1cm5zIHRoZSBVVEYtMTYgZW5jb2Rpbmcgb2YgYSBjaGFyYWN0ZXIgLSBzbyBzb21lIFVuaWNvZGUgY2hhcmFjdGVyc1xyXG4vLyB1c2UgMiBjaGFyYWN0ZXJzIGluIEphdmFzY3JpcHQuICBBbGwgNC1ieXRlIFVURi04IGNoYXJhY3RlcnMgYmVnaW4gd2l0aCBhIGZpcnN0XHJcbi8vIGNoYXJhY3RlciBpbiB0aGUgcmFuZ2UgMHhEODAwIC0gMHhEQkZGICh0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgc28tY2FsbGVkIHN1cnJvZ2F0ZVxyXG4vLyBwYWlyKS5cclxuLy8gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS4xLjNcclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqL1xyXG5jb25zdCBzdHJpbmdUb0J5dGVBcnJheSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIGNvbnN0IG91dCA9IFtdO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIC8vIElzIHRoaXMgdGhlIGxlYWQgc3Vycm9nYXRlIGluIGEgc3Vycm9nYXRlIHBhaXI/XHJcbiAgICAgICAgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZ2ggPSBjIC0gMHhkODAwOyAvLyB0aGUgaGlnaCAxMCBiaXRzLlxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGFzc2VydChpIDwgc3RyLmxlbmd0aCwgJ1N1cnJvZ2F0ZSBwYWlyIG1pc3NpbmcgdHJhaWwgc3Vycm9nYXRlLicpO1xyXG4gICAgICAgICAgICBjb25zdCBsb3cgPSBzdHIuY2hhckNvZGVBdChpKSAtIDB4ZGMwMDsgLy8gdGhlIGxvdyAxMCBiaXRzLlxyXG4gICAgICAgICAgICBjID0gMHgxMDAwMCArIChoaWdoIDw8IDEwKSArIGxvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSBjO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjID4+IDYpIHwgMTkyO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjIDwgNjU1MzYpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuLyoqXHJcbiAqIENhbGN1bGF0ZSBsZW5ndGggd2l0aG91dCBhY3R1YWxseSBjb252ZXJ0aW5nOyB1c2VmdWwgZm9yIGRvaW5nIGNoZWFwZXIgdmFsaWRhdGlvbi5cclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAqL1xyXG5jb25zdCBzdHJpbmdMZW5ndGggPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZiAoYyA8IDEyOCkge1xyXG4gICAgICAgICAgICBwKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPCAyMDQ4KSB7XHJcbiAgICAgICAgICAgIHAgKz0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA+PSAweGQ4MDAgJiYgYyA8PSAweGRiZmYpIHtcclxuICAgICAgICAgICAgLy8gTGVhZCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci4gIFRoZSBwYWlyIHRvZ2V0aGVyIHdpbGwgdGFrZSA0IGJ5dGVzIHRvIHJlcHJlc2VudC5cclxuICAgICAgICAgICAgcCArPSA0O1xyXG4gICAgICAgICAgICBpKys7IC8vIHNraXAgdHJhaWwgc3Vycm9nYXRlLlxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcCArPSAzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwO1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gZXhwb25lbnRpYWxseSBpbmNyZWFzZS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfSU5URVJWQUxfTUlMTElTID0gMTAwMDtcclxuLyoqXHJcbiAqIFRoZSBmYWN0b3IgdG8gYmFja29mZiBieS5cclxuICogU2hvdWxkIGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUiA9IDI7XHJcbi8qKlxyXG4gKiBUaGUgbWF4aW11bSBtaWxsaXNlY29uZHMgdG8gaW5jcmVhc2UgdG8uXHJcbiAqXHJcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcclxuICovXHJcbmNvbnN0IE1BWF9WQUxVRV9NSUxMSVMgPSA0ICogNjAgKiA2MCAqIDEwMDA7IC8vIEZvdXIgaG91cnMsIGxpa2UgaU9TIGFuZCBBbmRyb2lkLlxyXG4vKipcclxuICogVGhlIHBlcmNlbnRhZ2Ugb2YgYmFja29mZiB0aW1lIHRvIHJhbmRvbWl6ZSBieS5cclxuICogU2VlXHJcbiAqIGh0dHA6Ly9nby9zYWZlLWNsaWVudC1iZWhhdmlvciNzdGVwLTEtZGV0ZXJtaW5lLXRoZS1hcHByb3ByaWF0ZS1yZXRyeS1pbnRlcnZhbC10by1oYW5kbGUtc3Bpa2UtdHJhZmZpY1xyXG4gKiBmb3IgY29udGV4dC5cclxuICpcclxuICogPHA+VmlzaWJsZSBmb3IgdGVzdGluZ1xyXG4gKi9cclxuY29uc3QgUkFORE9NX0ZBQ1RPUiA9IDAuNTtcclxuLyoqXHJcbiAqIEJhc2VkIG9uIHRoZSBiYWNrb2ZmIG1ldGhvZCBmcm9tXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvbWFzdGVyL2Nsb3N1cmUvZ29vZy9tYXRoL2V4cG9uZW50aWFsYmFja29mZi5qcy5cclxuICogRXh0cmFjdGVkIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBwYXNzIG1ldGFkYXRhIGFuZCBhIHN0YXRlZnVsIEV4cG9uZW50aWFsQmFja29mZiBvYmplY3QgYXJvdW5kLlxyXG4gKi9cclxuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZk1pbGxpcyhiYWNrb2ZmQ291bnQsIGludGVydmFsTWlsbGlzID0gREVGQVVMVF9JTlRFUlZBTF9NSUxMSVMsIGJhY2tvZmZGYWN0b3IgPSBERUZBVUxUX0JBQ0tPRkZfRkFDVE9SKSB7XHJcbiAgICAvLyBDYWxjdWxhdGVzIGFuIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZyB2YWx1ZS5cclxuICAgIC8vIERldmlhdGlvbjogY2FsY3VsYXRlcyB2YWx1ZSBmcm9tIGNvdW50IGFuZCBhIGNvbnN0YW50IGludGVydmFsLCBzbyB3ZSBvbmx5IG5lZWQgdG8gc2F2ZSB2YWx1ZVxyXG4gICAgLy8gYW5kIGNvdW50IHRvIHJlc3RvcmUgc3RhdGUuXHJcbiAgICBjb25zdCBjdXJyQmFzZVZhbHVlID0gaW50ZXJ2YWxNaWxsaXMgKiBNYXRoLnBvdyhiYWNrb2ZmRmFjdG9yLCBiYWNrb2ZmQ291bnQpO1xyXG4gICAgLy8gQSByYW5kb20gXCJmdXp6XCIgdG8gYXZvaWQgd2F2ZXMgb2YgcmV0cmllcy5cclxuICAgIC8vIERldmlhdGlvbjogcmFuZG9tRmFjdG9yIGlzIHJlcXVpcmVkLlxyXG4gICAgY29uc3QgcmFuZG9tV2FpdCA9IE1hdGgucm91bmQoXHJcbiAgICAvLyBBIGZyYWN0aW9uIG9mIHRoZSBiYWNrb2ZmIHZhbHVlIHRvIGFkZC9zdWJ0cmFjdC5cclxuICAgIC8vIERldmlhdGlvbjogY2hhbmdlcyBtdWx0aXBsaWNhdGlvbiBvcmRlciB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LlxyXG4gICAgUkFORE9NX0ZBQ1RPUiAqXHJcbiAgICAgICAgY3VyckJhc2VWYWx1ZSAqXHJcbiAgICAgICAgLy8gQSByYW5kb20gZmxvYXQgKHJvdW5kZWQgdG8gaW50IGJ5IE1hdGgucm91bmQgYWJvdmUpIGluIHRoZSByYW5nZSBbLTEsIDFdLiBEZXRlcm1pbmVzXHJcbiAgICAgICAgLy8gaWYgd2UgYWRkIG9yIHN1YnRyYWN0LlxyXG4gICAgICAgIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqXHJcbiAgICAgICAgMik7XHJcbiAgICAvLyBMaW1pdHMgYmFja29mZiB0byBtYXggdG8gYXZvaWQgZWZmZWN0aXZlbHkgcGVybWFuZW50IGJhY2tvZmYuXHJcbiAgICByZXR1cm4gTWF0aC5taW4oTUFYX1ZBTFVFX01JTExJUywgY3VyckJhc2VWYWx1ZSArIHJhbmRvbVdhaXQpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlIEVuZ2xpc2ggb3JkaW5hbCBsZXR0ZXJzIGFmdGVyIGEgbnVtYmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBvcmRpbmFsKGkpIHtcclxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGkpKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke2l9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBpICsgaW5kaWNhdG9yKGkpO1xyXG59XHJcbmZ1bmN0aW9uIGluZGljYXRvcihpKSB7XHJcbiAgICBpID0gTWF0aC5hYnMoaSk7XHJcbiAgICBjb25zdCBjZW50ID0gaSAlIDEwMDtcclxuICAgIGlmIChjZW50ID49IDEwICYmIGNlbnQgPD0gMjApIHtcclxuICAgICAgICByZXR1cm4gJ3RoJztcclxuICAgIH1cclxuICAgIGNvbnN0IGRlYyA9IGkgJSAxMDtcclxuICAgIGlmIChkZWMgPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gJ3N0JztcclxuICAgIH1cclxuICAgIGlmIChkZWMgPT09IDIpIHtcclxuICAgICAgICByZXR1cm4gJ25kJztcclxuICAgIH1cclxuICAgIGlmIChkZWMgPT09IDMpIHtcclxuICAgICAgICByZXR1cm4gJ3JkJztcclxuICAgIH1cclxuICAgIHJldHVybiAndGgnO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldE1vZHVsYXJJbnN0YW5jZShzZXJ2aWNlKSB7XHJcbiAgICBpZiAoc2VydmljZSAmJiBzZXJ2aWNlLl9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHJldHVybiBzZXJ2aWNlLl9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzZXJ2aWNlO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IENPTlNUQU5UUywgRGVmZXJyZWQsIEVycm9yRmFjdG9yeSwgRmlyZWJhc2VFcnJvciwgTUFYX1ZBTFVFX01JTExJUywgUkFORE9NX0ZBQ1RPUiwgU2hhMSwgYXJlQ29va2llc0VuYWJsZWQsIGFzc2VydCwgYXNzZXJ0aW9uRXJyb3IsIGFzeW5jLCBiYXNlNjQsIGJhc2U2NERlY29kZSwgYmFzZTY0RW5jb2RlLCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZywgY2FsY3VsYXRlQmFja29mZk1pbGxpcywgY29udGFpbnMsIGNyZWF0ZU1vY2tVc2VyVG9rZW4sIGNyZWF0ZVN1YnNjcmliZSwgZGVjb2RlLCBkZWVwQ29weSwgZGVlcEVxdWFsLCBkZWVwRXh0ZW5kLCBlcnJvclByZWZpeCwgZXh0cmFjdFF1ZXJ5c3RyaW5nLCBnZXRHbG9iYWwsIGdldE1vZHVsYXJJbnN0YW5jZSwgZ2V0VUEsIGlzQWRtaW4sIGlzQnJvd3NlciwgaXNCcm93c2VyRXh0ZW5zaW9uLCBpc0VsZWN0cm9uLCBpc0VtcHR5LCBpc0lFLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNNb2JpbGVDb3Jkb3ZhLCBpc05vZGUsIGlzTm9kZVNkaywgaXNSZWFjdE5hdGl2ZSwgaXNTYWZhcmksIGlzVVdQLCBpc1ZhbGlkRm9ybWF0LCBpc1ZhbGlkVGltZXN0YW1wLCBpc3N1ZWRBdFRpbWUsIGpzb25FdmFsLCBtYXAsIG9yZGluYWwsIHF1ZXJ5c3RyaW5nLCBxdWVyeXN0cmluZ0RlY29kZSwgc2FmZUdldCwgc3RyaW5nTGVuZ3RoLCBzdHJpbmdUb0J5dGVBcnJheSwgc3RyaW5naWZ5LCB2YWxpZGF0ZUFyZ0NvdW50LCB2YWxpZGF0ZUNhbGxiYWNrLCB2YWxpZGF0ZUNvbnRleHRPYmplY3QsIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUsIHZhbGlkYXRlTmFtZXNwYWNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBFcnJvckZhY3RvcnksIGRlZXBFcXVhbCwgaXNCcm93c2VyRXh0ZW5zaW9uLCBpc01vYmlsZUNvcmRvdmEsIGlzUmVhY3ROYXRpdmUsIEZpcmViYXNlRXJyb3IsIHF1ZXJ5c3RyaW5nLCBnZXRNb2R1bGFySW5zdGFuY2UsIGJhc2U2NERlY29kZSwgZ2V0VUEsIGlzSUUsIGNyZWF0ZVN1YnNjcmliZSwgcXVlcnlzdHJpbmdEZWNvZGUsIGV4dHJhY3RRdWVyeXN0cmluZywgaXNFbXB0eSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFNES19WRVJTSU9OLCBfZ2V0UHJvdmlkZXIsIF9yZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uLCBnZXRBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQW4gZW51bSBvZiBmYWN0b3JzIHRoYXQgbWF5IGJlIHVzZWQgZm9yIG11bHRpZmFjdG9yIGF1dGhlbnRpY2F0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBGYWN0b3JJZCA9IHtcclxuICAgIC8qKiBQaG9uZSBhcyBzZWNvbmQgZmFjdG9yICovXHJcbiAgICBQSE9ORTogJ3Bob25lJ1xyXG59O1xyXG4vKipcclxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHByb3ZpZGVycy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgUHJvdmlkZXJJZCA9IHtcclxuICAgIC8qKiBGYWNlYm9vayBwcm92aWRlciBJRCAqL1xyXG4gICAgRkFDRUJPT0s6ICdmYWNlYm9vay5jb20nLFxyXG4gICAgLyoqIEdpdEh1YiBwcm92aWRlciBJRCAqL1xyXG4gICAgR0lUSFVCOiAnZ2l0aHViLmNvbScsXHJcbiAgICAvKiogR29vZ2xlIHByb3ZpZGVyIElEICovXHJcbiAgICBHT09HTEU6ICdnb29nbGUuY29tJyxcclxuICAgIC8qKiBQYXNzd29yZCBwcm92aWRlciAqL1xyXG4gICAgUEFTU1dPUkQ6ICdwYXNzd29yZCcsXHJcbiAgICAvKiogUGhvbmUgcHJvdmlkZXIgKi9cclxuICAgIFBIT05FOiAncGhvbmUnLFxyXG4gICAgLyoqIFR3aXR0ZXIgcHJvdmlkZXIgSUQgKi9cclxuICAgIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcclxufTtcclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBzaWduLWluIG1ldGhvZHMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IFNpZ25Jbk1ldGhvZCA9IHtcclxuICAgIC8qKiBFbWFpbCBsaW5rIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBFTUFJTF9MSU5LOiAnZW1haWxMaW5rJyxcclxuICAgIC8qKiBFbWFpbC9wYXNzd29yZCBzaWduIGluIG1ldGhvZCAqL1xyXG4gICAgRU1BSUxfUEFTU1dPUkQ6ICdwYXNzd29yZCcsXHJcbiAgICAvKiogRmFjZWJvb2sgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEZBQ0VCT09LOiAnZmFjZWJvb2suY29tJyxcclxuICAgIC8qKiBHaXRIdWIgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEdJVEhVQjogJ2dpdGh1Yi5jb20nLFxyXG4gICAgLyoqIEdvb2dsZSBzaWduIGluIG1ldGhvZCAqL1xyXG4gICAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXHJcbiAgICAvKiogUGhvbmUgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIFBIT05FOiAncGhvbmUnLFxyXG4gICAgLyoqIFR3aXR0ZXIgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcclxufTtcclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBvcGVyYXRpb24gdHlwZXMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IE9wZXJhdGlvblR5cGUgPSB7XHJcbiAgICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBsaW5raW5nIGFuIGFkZGl0aW9uYWwgcHJvdmlkZXIgdG8gYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cclxuICAgIExJTks6ICdsaW5rJyxcclxuICAgIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIHVzaW5nIGEgcHJvdmlkZXIgdG8gcmVhdXRoZW50aWNhdGUgYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cclxuICAgIFJFQVVUSEVOVElDQVRFOiAncmVhdXRoZW50aWNhdGUnLFxyXG4gICAgLyoqIE9wZXJhdGlvbiBpbnZvbHZpbmcgc2lnbmluZyBpbiBhIHVzZXIuICovXHJcbiAgICBTSUdOX0lOOiAnc2lnbkluJ1xyXG59O1xyXG4vKipcclxuICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGVtYWlsIGFjdGlvbiB0eXBlcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgQWN0aW9uQ29kZU9wZXJhdGlvbiA9IHtcclxuICAgIC8qKiBUaGUgZW1haWwgbGluayBzaWduLWluIGFjdGlvbi4gKi9cclxuICAgIEVNQUlMX1NJR05JTjogJ0VNQUlMX1NJR05JTicsXHJcbiAgICAvKiogVGhlIHBhc3N3b3JkIHJlc2V0IGFjdGlvbi4gKi9cclxuICAgIFBBU1NXT1JEX1JFU0VUOiAnUEFTU1dPUkRfUkVTRVQnLFxyXG4gICAgLyoqIFRoZSBlbWFpbCByZXZvY2F0aW9uIGFjdGlvbi4gKi9cclxuICAgIFJFQ09WRVJfRU1BSUw6ICdSRUNPVkVSX0VNQUlMJyxcclxuICAgIC8qKiBUaGUgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb24gZW1haWwgYWN0aW9uLiAqL1xyXG4gICAgUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046ICdSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTicsXHJcbiAgICAvKiogVGhlIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uIGVtYWlsIGFjdGlvbi4gKi9cclxuICAgIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOiAnVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwnLFxyXG4gICAgLyoqIFRoZSBlbWFpbCB2ZXJpZmljYXRpb24gYWN0aW9uLiAqL1xyXG4gICAgVkVSSUZZX0VNQUlMOiAnVkVSSUZZX0VNQUlMJ1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfZGVidWdFcnJvck1hcCgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgW1wiYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb25cIiAvKiBBRE1JTl9PTkxZX09QRVJBVElPTiAqL106ICdUaGlzIG9wZXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGFkbWluaXN0cmF0b3JzIG9ubHkuJyxcclxuICAgICAgICBbXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovXTogJycsXHJcbiAgICAgICAgW1wiYXBwLW5vdC1hdXRob3JpemVkXCIgLyogQVBQX05PVF9BVVRIT1JJWkVEICovXTogXCJUaGlzIGFwcCwgaWRlbnRpZmllZCBieSB0aGUgZG9tYWluIHdoZXJlIGl0J3MgaG9zdGVkLCBpcyBub3QgXCIgK1xyXG4gICAgICAgICAgICAnYXV0aG9yaXplZCB0byB1c2UgRmlyZWJhc2UgQXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgQVBJIGtleS4gJyArXHJcbiAgICAgICAgICAgICdSZXZpZXcgeW91ciBrZXkgY29uZmlndXJhdGlvbiBpbiB0aGUgR29vZ2xlIEFQSSBjb25zb2xlLicsXHJcbiAgICAgICAgW1wiYXBwLW5vdC1pbnN0YWxsZWRcIiAvKiBBUFBfTk9UX0lOU1RBTExFRCAqL106ICdUaGUgcmVxdWVzdGVkIG1vYmlsZSBhcHBsaWNhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZGVudGlmaWVyICgnICtcclxuICAgICAgICAgICAgJ0FuZHJvaWQgcGFja2FnZSBuYW1lIG9yIGlPUyBidW5kbGUgSUQpIHByb3ZpZGVkIGlzIG5vdCBpbnN0YWxsZWQgb24gJyArXHJcbiAgICAgICAgICAgICd0aGlzIGRldmljZS4nLFxyXG4gICAgICAgIFtcImNhcHRjaGEtY2hlY2stZmFpbGVkXCIgLyogQ0FQVENIQV9DSEVDS19GQUlMRUQgKi9dOiAnVGhlIHJlQ0FQVENIQSByZXNwb25zZSB0b2tlbiBwcm92aWRlZCBpcyBlaXRoZXIgaW52YWxpZCwgZXhwaXJlZCwgJyArXHJcbiAgICAgICAgICAgICdhbHJlYWR5IHVzZWQgb3IgdGhlIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGxpc3QgJyArXHJcbiAgICAgICAgICAgICdvZiB3aGl0ZWxpc3RlZCBkb21haW5zLicsXHJcbiAgICAgICAgW1wiY29kZS1leHBpcmVkXCIgLyogQ09ERV9FWFBJUkVEICovXTogJ1RoZSBTTVMgY29kZSBoYXMgZXhwaXJlZC4gUGxlYXNlIHJlLXNlbmQgdGhlIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHRyeSAnICtcclxuICAgICAgICAgICAgJ2FnYWluLicsXHJcbiAgICAgICAgW1wiY29yZG92YS1ub3QtcmVhZHlcIiAvKiBDT1JET1ZBX05PVF9SRUFEWSAqL106ICdDb3Jkb3ZhIGZyYW1ld29yayBpcyBub3QgcmVhZHkuJyxcclxuICAgICAgICBbXCJjb3JzLXVuc3VwcG9ydGVkXCIgLyogQ09SU19VTlNVUFBPUlRFRCAqL106ICdUaGlzIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZC4nLFxyXG4gICAgICAgIFtcImNyZWRlbnRpYWwtYWxyZWFkeS1pbi11c2VcIiAvKiBDUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFICovXTogJ1RoaXMgY3JlZGVudGlhbCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCB1c2VyIGFjY291bnQuJyxcclxuICAgICAgICBbXCJjdXN0b20tdG9rZW4tbWlzbWF0Y2hcIiAvKiBDUkVERU5USUFMX01JU01BVENIICovXTogJ1RoZSBjdXN0b20gdG9rZW4gY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgYXVkaWVuY2UuJyxcclxuICAgICAgICBbXCJyZXF1aXJlcy1yZWNlbnQtbG9naW5cIiAvKiBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4gKi9dOiAnVGhpcyBvcGVyYXRpb24gaXMgc2Vuc2l0aXZlIGFuZCByZXF1aXJlcyByZWNlbnQgYXV0aGVudGljYXRpb24uIExvZyBpbiAnICtcclxuICAgICAgICAgICAgJ2FnYWluIGJlZm9yZSByZXRyeWluZyB0aGlzIHJlcXVlc3QuJyxcclxuICAgICAgICBbXCJkZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoXCIgLyogREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIICovXTogJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xyXG4gICAgICAgICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSBiZSBzdXJlIHRvIGNhbGwgYGluaXRpYWxpemVBdXRoYCBvciBgZ2V0QXV0aGAgYmVmb3JlICcgK1xyXG4gICAgICAgICAgICAnc3RhcnRpbmcgYW55IG90aGVyIEZpcmViYXNlIFNESy4nLFxyXG4gICAgICAgIFtcImR5bmFtaWMtbGluay1ub3QtYWN0aXZhdGVkXCIgLyogRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURUQgKi9dOiAnUGxlYXNlIGFjdGl2YXRlIER5bmFtaWMgTGlua3MgaW4gdGhlIEZpcmViYXNlIENvbnNvbGUgYW5kIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgJyArXHJcbiAgICAgICAgICAgICdjb25kaXRpb25zLicsXHJcbiAgICAgICAgW1wiZW1haWwtY2hhbmdlLW5lZWRzLXZlcmlmaWNhdGlvblwiIC8qIEVNQUlMX0NIQU5HRV9ORUVEU19WRVJJRklDQVRJT04gKi9dOiAnTXVsdGktZmFjdG9yIHVzZXJzIG11c3QgYWx3YXlzIGhhdmUgYSB2ZXJpZmllZCBlbWFpbC4nLFxyXG4gICAgICAgIFtcImVtYWlsLWFscmVhZHktaW4tdXNlXCIgLyogRU1BSUxfRVhJU1RTICovXTogJ1RoZSBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgYWNjb3VudC4nLFxyXG4gICAgICAgIFtcImVtdWxhdG9yLWNvbmZpZy1mYWlsZWRcIiAvKiBFTVVMQVRPUl9DT05GSUdfRkFJTEVEICovXTogJ0F1dGggaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHRvIG1ha2UgYSBuZXR3b3JrIGNhbGwuIEF1dGggY2FuICcgK1xyXG4gICAgICAgICAgICAnbm8gbG9uZ2VyIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBlbXVsYXRvci4gVHJ5IGNhbGxpbmcgJyArXHJcbiAgICAgICAgICAgICdcImNvbm5lY3RBdXRoRW11bGF0b3IoKVwiIHNvb25lci4nLFxyXG4gICAgICAgIFtcImV4cGlyZWQtYWN0aW9uLWNvZGVcIiAvKiBFWFBJUkVEX09PQl9DT0RFICovXTogJ1RoZSBhY3Rpb24gY29kZSBoYXMgZXhwaXJlZC4nLFxyXG4gICAgICAgIFtcImNhbmNlbGxlZC1wb3B1cC1yZXF1ZXN0XCIgLyogRVhQSVJFRF9QT1BVUF9SRVFVRVNUICovXTogJ1RoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBkdWUgdG8gYW5vdGhlciBjb25mbGljdGluZyBwb3B1cCBiZWluZyBvcGVuZWQuJyxcclxuICAgICAgICBbXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWFwcC1jcmVkZW50aWFsXCIgLyogSU5WQUxJRF9BUFBfQ1JFREVOVElBTCAqL106ICdUaGUgcGhvbmUgdmVyaWZpY2F0aW9uIHJlcXVlc3QgY29udGFpbnMgYW4gaW52YWxpZCBhcHBsaWNhdGlvbiB2ZXJpZmllci4nICtcclxuICAgICAgICAgICAgJyBUaGUgcmVDQVBUQ0hBIHRva2VuIHJlc3BvbnNlIGlzIGVpdGhlciBpbnZhbGlkIG9yIGV4cGlyZWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWFwcC1pZFwiIC8qIElOVkFMSURfQVBQX0lEICovXTogJ1RoZSBtb2JpbGUgYXBwIGlkZW50aWZpZXIgaXMgbm90IHJlZ2lzdGVkIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LicsXHJcbiAgICAgICAgW1wiaW52YWxpZC11c2VyLXRva2VuXCIgLyogSU5WQUxJRF9BVVRIICovXTogXCJUaGlzIHVzZXIncyBjcmVkZW50aWFsIGlzbid0IHZhbGlkIGZvciB0aGlzIHByb2plY3QuIFRoaXMgY2FuIGhhcHBlbiBcIiArXHJcbiAgICAgICAgICAgIFwiaWYgdGhlIHVzZXIncyB0b2tlbiBoYXMgYmVlbiB0YW1wZXJlZCB3aXRoLCBvciBpZiB0aGUgdXNlciBpc24ndCBmb3IgXCIgK1xyXG4gICAgICAgICAgICAndGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQVBJIGtleS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtYXV0aC1ldmVudFwiIC8qIElOVkFMSURfQVVUSF9FVkVOVCAqL106ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC12ZXJpZmljYXRpb24tY29kZVwiIC8qIElOVkFMSURfQ09ERSAqL106ICdUaGUgU01TIHZlcmlmaWNhdGlvbiBjb2RlIHVzZWQgdG8gY3JlYXRlIHRoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgaXMgJyArXHJcbiAgICAgICAgICAgICdpbnZhbGlkLiBQbGVhc2UgcmVzZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSBzbXMgYW5kIGJlIHN1cmUgdG8gdXNlIHRoZSAnICtcclxuICAgICAgICAgICAgJ3ZlcmlmaWNhdGlvbiBjb2RlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jb250aW51ZS11cmlcIiAvKiBJTlZBTElEX0NPTlRJTlVFX1VSSSAqL106ICdUaGUgY29udGludWUgVVJMIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGlzIGludmFsaWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvblwiIC8qIElOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OICovXTogJ1RoZSBmb2xsb3dpbmcgQ29yZG92YSBwbHVnaW5zIG11c3QgYmUgaW5zdGFsbGVkIHRvIGVuYWJsZSBPQXV0aCBzaWduLWluOiAnICtcclxuICAgICAgICAgICAgJ2NvcmRvdmEtcGx1Z2luLWJ1aWxkaW5mbywgY29yZG92YS11bml2ZXJzYWwtbGlua3MtcGx1Z2luLCAnICtcclxuICAgICAgICAgICAgJ2NvcmRvdmEtcGx1Z2luLWJyb3dzZXJ0YWIsIGNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlciBhbmQgJyArXHJcbiAgICAgICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1jdXN0b211cmxzY2hlbWUuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWN1c3RvbS10b2tlblwiIC8qIElOVkFMSURfQ1VTVE9NX1RPS0VOICovXTogJ1RoZSBjdXN0b20gdG9rZW4gZm9ybWF0IGlzIGluY29ycmVjdC4gUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluXCIgLyogSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOICovXTogJ1RoZSBwcm92aWRlZCBkeW5hbWljIGxpbmsgZG9tYWluIGlzIG5vdCBjb25maWd1cmVkIG9yIGF1dGhvcml6ZWQgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWVtYWlsXCIgLyogSU5WQUxJRF9FTUFJTCAqL106ICdUaGUgZW1haWwgYWRkcmVzcyBpcyBiYWRseSBmb3JtYXR0ZWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWVtdWxhdG9yLXNjaGVtZVwiIC8qIElOVkFMSURfRU1VTEFUT1JfU0NIRU1FICovXTogJ0VtdWxhdG9yIFVSTCBtdXN0IHN0YXJ0IHdpdGggYSB2YWxpZCBzY2hlbWUgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hcGkta2V5XCIgLyogSU5WQUxJRF9BUElfS0VZICovXTogJ1lvdXIgQVBJIGtleSBpcyBpbnZhbGlkLCBwbGVhc2UgY2hlY2sgeW91IGhhdmUgY29waWVkIGl0IGNvcnJlY3RseS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtY2VydC1oYXNoXCIgLyogSU5WQUxJRF9DRVJUX0hBU0ggKi9dOiAnVGhlIFNIQS0xIGNlcnRpZmljYXRlIGhhc2ggcHJvdmlkZWQgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtY3JlZGVudGlhbFwiIC8qIElOVkFMSURfSURQX1JFU1BPTlNFICovXTogJ1RoZSBzdXBwbGllZCBhdXRoIGNyZWRlbnRpYWwgaXMgbWFsZm9ybWVkIG9yIGhhcyBleHBpcmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1tZXNzYWdlLXBheWxvYWRcIiAvKiBJTlZBTElEX01FU1NBR0VfUEFZTE9BRCAqL106ICdUaGUgZW1haWwgdGVtcGxhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gaXRzIG1lc3NhZ2UuICcgK1xyXG4gICAgICAgICAgICAnUGxlYXNlIGZpeCBieSBnb2luZyB0byB0aGUgQXV0aCBlbWFpbCB0ZW1wbGF0ZXMgc2VjdGlvbiBpbiB0aGUgRmlyZWJhc2UgQ29uc29sZS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtbXVsdGktZmFjdG9yLXNlc3Npb25cIiAvKiBJTlZBTElEX01GQV9TRVNTSU9OICovXTogJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBwcm9vZiBvZiBmaXJzdCBmYWN0b3Igc3VjY2Vzc2Z1bCBzaWduLWluLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1vYXV0aC1wcm92aWRlclwiIC8qIElOVkFMSURfT0FVVEhfUFJPVklERVIgKi9dOiAnRW1haWxBdXRoUHJvdmlkZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uIFRoaXMgb3BlcmF0aW9uICcgK1xyXG4gICAgICAgICAgICAnb25seSBzdXBwb3J0cyBPQXV0aCBwcm92aWRlcnMuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLW9hdXRoLWNsaWVudC1pZFwiIC8qIElOVkFMSURfT0FVVEhfQ0xJRU5UX0lEICovXTogJ1RoZSBPQXV0aCBjbGllbnQgSUQgcHJvdmlkZWQgaXMgZWl0aGVyIGludmFsaWQgb3IgZG9lcyBub3QgbWF0Y2ggdGhlICcgK1xyXG4gICAgICAgICAgICAnc3BlY2lmaWVkIEFQSSBrZXkuJyxcclxuICAgICAgICBbXCJ1bmF1dGhvcml6ZWQtZG9tYWluXCIgLyogSU5WQUxJRF9PUklHSU4gKi9dOiAnVGhpcyBkb21haW4gaXMgbm90IGF1dGhvcml6ZWQgZm9yIE9BdXRoIG9wZXJhdGlvbnMgZm9yIHlvdXIgRmlyZWJhc2UgJyArXHJcbiAgICAgICAgICAgICdwcm9qZWN0LiBFZGl0IHRoZSBsaXN0IG9mIGF1dGhvcml6ZWQgZG9tYWlucyBmcm9tIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hY3Rpb24tY29kZVwiIC8qIElOVkFMSURfT09CX0NPREUgKi9dOiAnVGhlIGFjdGlvbiBjb2RlIGlzIGludmFsaWQuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgY29kZSBpcyBtYWxmb3JtZWQsICcgK1xyXG4gICAgICAgICAgICAnZXhwaXJlZCwgb3IgaGFzIGFscmVhZHkgYmVlbiB1c2VkLicsXHJcbiAgICAgICAgW1wid3JvbmctcGFzc3dvcmRcIiAvKiBJTlZBTElEX1BBU1NXT1JEICovXTogJ1RoZSBwYXNzd29yZCBpcyBpbnZhbGlkIG9yIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgYSBwYXNzd29yZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIElOVkFMSURfUEVSU0lTVEVOQ0UgKi9dOiAnVGhlIHNwZWNpZmllZCBwZXJzaXN0ZW5jZSB0eXBlIGlzIGludmFsaWQuIEl0IGNhbiBvbmx5IGJlIGxvY2FsLCBzZXNzaW9uIG9yIG5vbmUuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXBob25lLW51bWJlclwiIC8qIElOVkFMSURfUEhPTkVfTlVNQkVSICovXTogJ1RoZSBmb3JtYXQgb2YgdGhlIHBob25lIG51bWJlciBwcm92aWRlZCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBlbnRlciB0aGUgJyArXHJcbiAgICAgICAgICAgICdwaG9uZSBudW1iZXIgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFyc2VkIGludG8gRS4xNjQgZm9ybWF0LiBFLjE2NCAnICtcclxuICAgICAgICAgICAgJ3Bob25lIG51bWJlcnMgYXJlIHdyaXR0ZW4gaW4gdGhlIGZvcm1hdCBbK11bY291bnRyeSBjb2RlXVtzdWJzY3JpYmVyICcgK1xyXG4gICAgICAgICAgICAnbnVtYmVyIGluY2x1ZGluZyBhcmVhIGNvZGVdLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1wcm92aWRlci1pZFwiIC8qIElOVkFMSURfUFJPVklERVJfSUQgKi9dOiAnVGhlIHNwZWNpZmllZCBwcm92aWRlciBJRCBpcyBpbnZhbGlkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1yZWNpcGllbnQtZW1haWxcIiAvKiBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTCAqL106ICdUaGUgZW1haWwgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBmYWlsZWQgdG8gc2VuZCBhcyB0aGUgcHJvdmlkZWQgJyArXHJcbiAgICAgICAgICAgICdyZWNpcGllbnQgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1zZW5kZXJcIiAvKiBJTlZBTElEX1NFTkRFUiAqL106ICdUaGUgZW1haWwgdGVtcGxhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBjb250YWlucyBhbiBpbnZhbGlkIHNlbmRlciBlbWFpbCBvciBuYW1lLiAnICtcclxuICAgICAgICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXZlcmlmaWNhdGlvbi1pZFwiIC8qIElOVkFMSURfU0VTU0lPTl9JTkZPICovXTogJ1RoZSB2ZXJpZmljYXRpb24gSUQgdXNlZCB0byBjcmVhdGUgdGhlIHBob25lIGF1dGggY3JlZGVudGlhbCBpcyBpbnZhbGlkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC10ZW5hbnQtaWRcIiAvKiBJTlZBTElEX1RFTkFOVF9JRCAqL106IFwiVGhlIEF1dGggaW5zdGFuY2UncyB0ZW5hbnQgSUQgaXMgaW52YWxpZC5cIixcclxuICAgICAgICBbXCJtaXNzaW5nLWFuZHJvaWQtcGtnLW5hbWVcIiAvKiBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FICovXTogJ0FuIEFuZHJvaWQgUGFja2FnZSBOYW1lIG11c3QgYmUgcHJvdmlkZWQgaWYgdGhlIEFuZHJvaWQgQXBwIGlzIHJlcXVpcmVkIHRvIGJlIGluc3RhbGxlZC4nLFxyXG4gICAgICAgIFtcImF1dGgtZG9tYWluLWNvbmZpZy1yZXF1aXJlZFwiIC8qIE1JU1NJTkdfQVVUSF9ET01BSU4gKi9dOiAnQmUgc3VyZSB0byBpbmNsdWRlIGF1dGhEb21haW4gd2hlbiBjYWxsaW5nIGZpcmViYXNlLmluaXRpYWxpemVBcHAoKSwgJyArXHJcbiAgICAgICAgICAgICdieSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctYXBwLWNyZWRlbnRpYWxcIiAvKiBNSVNTSU5HX0FQUF9DUkVERU5USUFMICovXTogJ1RoZSBwaG9uZSB2ZXJpZmljYXRpb24gcmVxdWVzdCBpcyBtaXNzaW5nIGFuIGFwcGxpY2F0aW9uIHZlcmlmaWVyICcgK1xyXG4gICAgICAgICAgICAnYXNzZXJ0aW9uLiBBIHJlQ0FQVENIQSByZXNwb25zZSB0b2tlbiBuZWVkcyB0byBiZSBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctdmVyaWZpY2F0aW9uLWNvZGVcIiAvKiBNSVNTSU5HX0NPREUgKi9dOiAnVGhlIHBob25lIGF1dGggY3JlZGVudGlhbCB3YXMgY3JlYXRlZCB3aXRoIGFuIGVtcHR5IFNNUyB2ZXJpZmljYXRpb24gY29kZS4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctY29udGludWUtdXJpXCIgLyogTUlTU0lOR19DT05USU5VRV9VUkkgKi9dOiAnQSBjb250aW51ZSBVUkwgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctaWZyYW1lLXN0YXJ0XCIgLyogTUlTU0lOR19JRlJBTUVfU1RBUlQgKi9dOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctaW9zLWJ1bmRsZS1pZFwiIC8qIE1JU1NJTkdfSU9TX0JVTkRMRV9JRCAqL106ICdBbiBpT1MgQnVuZGxlIElEIG11c3QgYmUgcHJvdmlkZWQgaWYgYW4gQXBwIFN0b3JlIElEIGlzIHByb3ZpZGVkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1vci1pbnZhbGlkLW5vbmNlXCIgLyogTUlTU0lOR19PUl9JTlZBTElEX05PTkNFICovXTogJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBub25jZS4gVGhpcyBjYW4gb2NjdXIgaWYgdGhlICcgK1xyXG4gICAgICAgICAgICAnU0hBLTI1NiBoYXNoIG9mIHRoZSBwcm92aWRlZCByYXcgbm9uY2UgZG9lcyBub3QgbWF0Y2ggdGhlIGhhc2hlZCBub25jZSAnICtcclxuICAgICAgICAgICAgJ2luIHRoZSBJRCB0b2tlbiBwYXlsb2FkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mb1wiIC8qIE1JU1NJTkdfTUZBX0lORk8gKi9dOiAnTm8gc2Vjb25kIGZhY3RvciBpZGVudGlmaWVyIGlzIHByb3ZpZGVkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIE1JU1NJTkdfTUZBX1NFU1NJT04gKi9dOiAnVGhlIHJlcXVlc3QgaXMgbWlzc2luZyBwcm9vZiBvZiBmaXJzdCBmYWN0b3Igc3VjY2Vzc2Z1bCBzaWduLWluLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1waG9uZS1udW1iZXJcIiAvKiBNSVNTSU5HX1BIT05FX05VTUJFUiAqL106ICdUbyBzZW5kIHZlcmlmaWNhdGlvbiBjb2RlcywgcHJvdmlkZSBhIHBob25lIG51bWJlciBmb3IgdGhlIHJlY2lwaWVudC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctdmVyaWZpY2F0aW9uLWlkXCIgLyogTUlTU0lOR19TRVNTSU9OX0lORk8gKi9dOiAnVGhlIHBob25lIGF1dGggY3JlZGVudGlhbCB3YXMgY3JlYXRlZCB3aXRoIGFuIGVtcHR5IHZlcmlmaWNhdGlvbiBJRC4nLFxyXG4gICAgICAgIFtcImFwcC1kZWxldGVkXCIgLyogTU9EVUxFX0RFU1RST1lFRCAqL106ICdUaGlzIGluc3RhbmNlIG9mIEZpcmViYXNlQXBwIGhhcyBiZWVuIGRlbGV0ZWQuJyxcclxuICAgICAgICBbXCJtdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmRcIiAvKiBNRkFfSU5GT19OT1RfRk9VTkQgKi9dOiAnVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhIHNlY29uZCBmYWN0b3IgbWF0Y2hpbmcgdGhlIGlkZW50aWZpZXIgcHJvdmlkZWQuJyxcclxuICAgICAgICBbXCJtdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZFwiIC8qIE1GQV9SRVFVSVJFRCAqL106ICdQcm9vZiBvZiBvd25lcnNoaXAgb2YgYSBzZWNvbmQgZmFjdG9yIGlzIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHNpZ24taW4uJyxcclxuICAgICAgICBbXCJhY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsXCIgLyogTkVFRF9DT05GSVJNQVRJT04gKi9dOiAnQW4gYWNjb3VudCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MgYnV0IGRpZmZlcmVudCAnICtcclxuICAgICAgICAgICAgJ3NpZ24taW4gY3JlZGVudGlhbHMuIFNpZ24gaW4gdXNpbmcgYSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyAnICtcclxuICAgICAgICAgICAgJ2VtYWlsIGFkZHJlc3MuJyxcclxuICAgICAgICBbXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqL106ICdBIG5ldHdvcmsgQXV0aEVycm9yIChzdWNoIGFzIHRpbWVvdXQsIGludGVycnVwdGVkIGNvbm5lY3Rpb24gb3IgdW5yZWFjaGFibGUgaG9zdCkgaGFzIG9jY3VycmVkLicsXHJcbiAgICAgICAgW1wibm8tYXV0aC1ldmVudFwiIC8qIE5PX0FVVEhfRVZFTlQgKi9dOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcIm5vLXN1Y2gtcHJvdmlkZXJcIiAvKiBOT19TVUNIX1BST1ZJREVSICovXTogJ1VzZXIgd2FzIG5vdCBsaW5rZWQgdG8gYW4gYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwcm92aWRlci4nLFxyXG4gICAgICAgIFtcIm51bGwtdXNlclwiIC8qIE5VTExfVVNFUiAqL106ICdBIG51bGwgdXNlciBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIHRoZSBhcmd1bWVudCBmb3IgYW4gb3BlcmF0aW9uIHdoaWNoICcgK1xyXG4gICAgICAgICAgICAncmVxdWlyZXMgYSBub24tbnVsbCB1c2VyIG9iamVjdC4nLFxyXG4gICAgICAgIFtcIm9wZXJhdGlvbi1ub3QtYWxsb3dlZFwiIC8qIE9QRVJBVElPTl9OT1RfQUxMT1dFRCAqL106ICdUaGUgZ2l2ZW4gc2lnbi1pbiBwcm92aWRlciBpcyBkaXNhYmxlZCBmb3IgdGhpcyBGaXJlYmFzZSBwcm9qZWN0LiAnICtcclxuICAgICAgICAgICAgJ0VuYWJsZSBpdCBpbiB0aGUgRmlyZWJhc2UgY29uc29sZSwgdW5kZXIgdGhlIHNpZ24taW4gbWV0aG9kIHRhYiBvZiB0aGUgJyArXHJcbiAgICAgICAgICAgICdBdXRoIHNlY3Rpb24uJyxcclxuICAgICAgICBbXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi9dOiAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW52aXJvbm1lbnQgdGhpcyBhcHBsaWNhdGlvbiBpcyAnICtcclxuICAgICAgICAgICAgJ3J1bm5pbmcgb24uIFwibG9jYXRpb24ucHJvdG9jb2xcIiBtdXN0IGJlIGh0dHAsIGh0dHBzIG9yIGNocm9tZS1leHRlbnNpb24nICtcclxuICAgICAgICAgICAgJyBhbmQgd2ViIHN0b3JhZ2UgbXVzdCBiZSBlbmFibGVkLicsXHJcbiAgICAgICAgW1wicG9wdXAtYmxvY2tlZFwiIC8qIFBPUFVQX0JMT0NLRUQgKi9dOiAnVW5hYmxlIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgcG9wdXAuIEl0IG1heSBoYXZlIGJlZW4gYmxvY2tlZCBieSB0aGUgYnJvd3Nlci4nLFxyXG4gICAgICAgIFtcInBvcHVwLWNsb3NlZC1ieS11c2VyXCIgLyogUE9QVVBfQ0xPU0VEX0JZX1VTRVIgKi9dOiAnVGhlIHBvcHVwIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgdXNlciBiZWZvcmUgZmluYWxpemluZyB0aGUgb3BlcmF0aW9uLicsXHJcbiAgICAgICAgW1wicHJvdmlkZXItYWxyZWFkeS1saW5rZWRcIiAvKiBQUk9WSURFUl9BTFJFQURZX0xJTktFRCAqL106ICdVc2VyIGNhbiBvbmx5IGJlIGxpbmtlZCB0byBvbmUgaWRlbnRpdHkgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4nLFxyXG4gICAgICAgIFtcInF1b3RhLWV4Y2VlZGVkXCIgLyogUVVPVEFfRVhDRUVERUQgKi9dOiBcIlRoZSBwcm9qZWN0J3MgcXVvdGEgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGV4Y2VlZGVkLlwiLFxyXG4gICAgICAgIFtcInJlZGlyZWN0LWNhbmNlbGxlZC1ieS11c2VyXCIgLyogUkVESVJFQ1RfQ0FOQ0VMTEVEX0JZX1VTRVIgKi9dOiAnVGhlIHJlZGlyZWN0IG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGZpbmFsaXppbmcuJyxcclxuICAgICAgICBbXCJyZWRpcmVjdC1vcGVyYXRpb24tcGVuZGluZ1wiIC8qIFJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HICovXTogJ0EgcmVkaXJlY3Qgc2lnbi1pbiBvcGVyYXRpb24gaXMgYWxyZWFkeSBwZW5kaW5nLicsXHJcbiAgICAgICAgW1wicmVqZWN0ZWQtY3JlZGVudGlhbFwiIC8qIFJFSkVDVEVEX0NSRURFTlRJQUwgKi9dOiAnVGhlIHJlcXVlc3QgY29udGFpbnMgbWFsZm9ybWVkIG9yIG1pc21hdGNoaW5nIGNyZWRlbnRpYWxzLicsXHJcbiAgICAgICAgW1wic2Vjb25kLWZhY3Rvci1hbHJlYWR5LWluLXVzZVwiIC8qIFNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRCAqL106ICdUaGUgc2Vjb25kIGZhY3RvciBpcyBhbHJlYWR5IGVucm9sbGVkIG9uIHRoaXMgYWNjb3VudC4nLFxyXG4gICAgICAgIFtcIm1heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZFwiIC8qIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgKi9dOiAnVGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygc2Vjb25kIGZhY3RvcnMgb24gYSB1c2VyIGhhcyBiZWVuIGV4Y2VlZGVkLicsXHJcbiAgICAgICAgW1widGVuYW50LWlkLW1pc21hdGNoXCIgLyogVEVOQU5UX0lEX01JU01BVENIICovXTogXCJUaGUgcHJvdmlkZWQgdGVuYW50IElEIGRvZXMgbm90IG1hdGNoIHRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEXCIsXHJcbiAgICAgICAgW1widGltZW91dFwiIC8qIFRJTUVPVVQgKi9dOiAnVGhlIG9wZXJhdGlvbiBoYXMgdGltZWQgb3V0LicsXHJcbiAgICAgICAgW1widXNlci10b2tlbi1leHBpcmVkXCIgLyogVE9LRU5fRVhQSVJFRCAqL106IFwiVGhlIHVzZXIncyBjcmVkZW50aWFsIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhlIHVzZXIgbXVzdCBzaWduIGluIGFnYWluLlwiLFxyXG4gICAgICAgIFtcInRvby1tYW55LXJlcXVlc3RzXCIgLyogVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSICovXTogJ1dlIGhhdmUgYmxvY2tlZCBhbGwgcmVxdWVzdHMgZnJvbSB0aGlzIGRldmljZSBkdWUgdG8gdW51c3VhbCBhY3Rpdml0eS4gJyArXHJcbiAgICAgICAgICAgICdUcnkgYWdhaW4gbGF0ZXIuJyxcclxuICAgICAgICBbXCJ1bmF1dGhvcml6ZWQtY29udGludWUtdXJpXCIgLyogVU5BVVRIT1JJWkVEX0RPTUFJTiAqL106ICdUaGUgZG9tYWluIG9mIHRoZSBjb250aW51ZSBVUkwgaXMgbm90IHdoaXRlbGlzdGVkLiAgUGxlYXNlIHdoaXRlbGlzdCAnICtcclxuICAgICAgICAgICAgJ3RoZSBkb21haW4gaW4gdGhlIEZpcmViYXNlIGNvbnNvbGUuJyxcclxuICAgICAgICBbXCJ1bnN1cHBvcnRlZC1maXJzdC1mYWN0b3JcIiAvKiBVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1IgKi9dOiAnRW5yb2xsaW5nIGEgc2Vjb25kIGZhY3RvciBvciBzaWduaW5nIGluIHdpdGggYSBtdWx0aS1mYWN0b3IgYWNjb3VudCByZXF1aXJlcyBzaWduLWluIHdpdGggYSBzdXBwb3J0ZWQgZmlyc3QgZmFjdG9yLicsXHJcbiAgICAgICAgW1widW5zdXBwb3J0ZWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIFVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFICovXTogJ1RoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW5jZSB0eXBlLicsXHJcbiAgICAgICAgW1widW5zdXBwb3J0ZWQtdGVuYW50LW9wZXJhdGlvblwiIC8qIFVOU1VQUE9SVEVEX1RFTkFOVF9PUEVSQVRJT04gKi9dOiAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBhIG11bHRpLXRlbmFudCBjb250ZXh0LicsXHJcbiAgICAgICAgW1widW52ZXJpZmllZC1lbWFpbFwiIC8qIFVOVkVSSUZJRURfRU1BSUwgKi9dOiAnVGhlIG9wZXJhdGlvbiByZXF1aXJlcyBhIHZlcmlmaWVkIGVtYWlsLicsXHJcbiAgICAgICAgW1widXNlci1jYW5jZWxsZWRcIiAvKiBVU0VSX0NBTkNFTExFRCAqL106ICdUaGUgdXNlciBkaWQgbm90IGdyYW50IHlvdXIgYXBwbGljYXRpb24gdGhlIHBlcm1pc3Npb25zIGl0IHJlcXVlc3RlZC4nLFxyXG4gICAgICAgIFtcInVzZXItbm90LWZvdW5kXCIgLyogVVNFUl9ERUxFVEVEICovXTogJ1RoZXJlIGlzIG5vIHVzZXIgcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZGVudGlmaWVyLiBUaGUgdXNlciBtYXkgJyArXHJcbiAgICAgICAgICAgICdoYXZlIGJlZW4gZGVsZXRlZC4nLFxyXG4gICAgICAgIFtcInVzZXItZGlzYWJsZWRcIiAvKiBVU0VSX0RJU0FCTEVEICovXTogJ1RoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGlzYWJsZWQgYnkgYW4gYWRtaW5pc3RyYXRvci4nLFxyXG4gICAgICAgIFtcInVzZXItbWlzbWF0Y2hcIiAvKiBVU0VSX01JU01BVENIICovXTogJ1RoZSBzdXBwbGllZCBjcmVkZW50aWFscyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgcHJldmlvdXNseSBzaWduZWQgaW4gdXNlci4nLFxyXG4gICAgICAgIFtcInVzZXItc2lnbmVkLW91dFwiIC8qIFVTRVJfU0lHTkVEX09VVCAqL106ICcnLFxyXG4gICAgICAgIFtcIndlYWstcGFzc3dvcmRcIiAvKiBXRUFLX1BBU1NXT1JEICovXTogJ1RoZSBwYXNzd29yZCBtdXN0IGJlIDYgY2hhcmFjdGVycyBsb25nIG9yIG1vcmUuJyxcclxuICAgICAgICBbXCJ3ZWItc3RvcmFnZS11bnN1cHBvcnRlZFwiIC8qIFdFQl9TVE9SQUdFX1VOU1VQUE9SVEVEICovXTogJ1RoaXMgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkIG9yIDNyZCBwYXJ0eSBjb29raWVzIGFuZCBkYXRhIG1heSBiZSBkaXNhYmxlZC4nLFxyXG4gICAgICAgIFtcImFscmVhZHktaW5pdGlhbGl6ZWRcIiAvKiBBTFJFQURZX0lOSVRJQUxJWkVEICovXTogJ2luaXRpYWxpemVBdXRoKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgd2l0aCAnICtcclxuICAgICAgICAgICAgJ2RpZmZlcmVudCBvcHRpb25zLiBUbyBhdm9pZCB0aGlzIGVycm9yLCBjYWxsIGluaXRpYWxpemVBdXRoKCkgd2l0aCB0aGUgJyArXHJcbiAgICAgICAgICAgICdzYW1lIG9wdGlvbnMgYXMgd2hlbiBpdCB3YXMgb3JpZ2luYWxseSBjYWxsZWQsIG9yIGNhbGwgZ2V0QXV0aCgpIHRvIHJldHVybiB0aGUnICtcclxuICAgICAgICAgICAgJyBhbHJlYWR5IGluaXRpYWxpemVkIGluc3RhbmNlLidcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gX3Byb2RFcnJvck1hcCgpIHtcclxuICAgIC8vIFdlIHdpbGwgaW5jbHVkZSB0aGlzIG9uZSBtZXNzYWdlIGluIHRoZSBwcm9kIGVycm9yIG1hcCBzaW5jZSBieSB0aGUgdmVyeVxyXG4gICAgLy8gbmF0dXJlIG9mIHRoaXMgZXJyb3IsIGRldmVsb3BlcnMgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNlZSB0aGUgbWVzc2FnZVxyXG4gICAgLy8gdXNpbmcgdGhlIGRlYnVnRXJyb3JNYXAgKHdoaWNoIGlzIGluc3RhbGxlZCBkdXJpbmcgYXV0aCBpbml0aWFsaXphdGlvbikuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIFtcImRlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGhcIiAvKiBERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEggKi9dOiAnQW5vdGhlciBGaXJlYmFzZSBTREsgd2FzIGluaXRpYWxpemVkIGFuZCBpcyB0cnlpbmcgdG8gdXNlIEF1dGggYmVmb3JlIEF1dGggaXMgJyArXHJcbiAgICAgICAgICAgICdpbml0aWFsaXplZC4gUGxlYXNlIGJlIHN1cmUgdG8gY2FsbCBgaW5pdGlhbGl6ZUF1dGhgIG9yIGBnZXRBdXRoYCBiZWZvcmUgJyArXHJcbiAgICAgICAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLidcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIEEgdmVyYm9zZSBlcnJvciBtYXAgd2l0aCBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgZm9yIG1vc3QgZXJyb3IgY29kZXMuXHJcbiAqXHJcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGRlYnVnRXJyb3JNYXAgPSBfZGVidWdFcnJvck1hcDtcclxuLyoqXHJcbiAqIEEgbWluaW1hbCBlcnJvciBtYXAgd2l0aCBhbGwgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBzdHJpcHBlZC5cclxuICpcclxuICogU2VlIGRpc2N1c3Npb24gYXQge0BsaW5rIEF1dGhFcnJvck1hcH1cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgcHJvZEVycm9yTWFwID0gX3Byb2RFcnJvck1hcDtcclxuY29uc3QgX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZID0gbmV3IEVycm9yRmFjdG9yeSgnYXV0aCcsICdGaXJlYmFzZScsIF9wcm9kRXJyb3JNYXAoKSk7XHJcbi8qKlxyXG4gKiBBIG1hcCBvZiBwb3RlbnRpYWwgYEF1dGhgIGVycm9yIGNvZGVzLCBmb3IgZWFzaWVyIGNvbXBhcmlzb24gd2l0aCBlcnJvcnNcclxuICogdGhyb3duIGJ5IHRoZSBTREsuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIE5vdGUgdGhhdCB5b3UgY2FuJ3QgdHJlZS1zaGFrZSBpbmRpdmlkdWFsIGtleXNcclxuICogaW4gdGhlIG1hcCwgc28gYnkgdXNpbmcgdGhlIG1hcCB5b3UgbWlnaHQgc3Vic3RhbnRpYWxseSBpbmNyZWFzZSB5b3VyXHJcbiAqIGJ1bmRsZSBzaXplLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBBVVRIX0VSUk9SX0NPREVTX01BUF9ET19OT1RfVVNFX0lOVEVSTkFMTFkgPSB7XHJcbiAgICBBRE1JTl9PTkxZX09QRVJBVElPTjogJ2F1dGgvYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb24nLFxyXG4gICAgQVJHVU1FTlRfRVJST1I6ICdhdXRoL2FyZ3VtZW50LWVycm9yJyxcclxuICAgIEFQUF9OT1RfQVVUSE9SSVpFRDogJ2F1dGgvYXBwLW5vdC1hdXRob3JpemVkJyxcclxuICAgIEFQUF9OT1RfSU5TVEFMTEVEOiAnYXV0aC9hcHAtbm90LWluc3RhbGxlZCcsXHJcbiAgICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRDogJ2F1dGgvY2FwdGNoYS1jaGVjay1mYWlsZWQnLFxyXG4gICAgQ09ERV9FWFBJUkVEOiAnYXV0aC9jb2RlLWV4cGlyZWQnLFxyXG4gICAgQ09SRE9WQV9OT1RfUkVBRFk6ICdhdXRoL2NvcmRvdmEtbm90LXJlYWR5JyxcclxuICAgIENPUlNfVU5TVVBQT1JURUQ6ICdhdXRoL2NvcnMtdW5zdXBwb3J0ZWQnLFxyXG4gICAgQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRTogJ2F1dGgvY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZScsXHJcbiAgICBDUkVERU5USUFMX01JU01BVENIOiAnYXV0aC9jdXN0b20tdG9rZW4tbWlzbWF0Y2gnLFxyXG4gICAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOOiAnYXV0aC9yZXF1aXJlcy1yZWNlbnQtbG9naW4nLFxyXG4gICAgREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIOiAnYXV0aC9kZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoJyxcclxuICAgIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEOiAnYXV0aC9keW5hbWljLWxpbmstbm90LWFjdGl2YXRlZCcsXHJcbiAgICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OOiAnYXV0aC9lbWFpbC1jaGFuZ2UtbmVlZHMtdmVyaWZpY2F0aW9uJyxcclxuICAgIEVNQUlMX0VYSVNUUzogJ2F1dGgvZW1haWwtYWxyZWFkeS1pbi11c2UnLFxyXG4gICAgRU1VTEFUT1JfQ09ORklHX0ZBSUxFRDogJ2F1dGgvZW11bGF0b3ItY29uZmlnLWZhaWxlZCcsXHJcbiAgICBFWFBJUkVEX09PQl9DT0RFOiAnYXV0aC9leHBpcmVkLWFjdGlvbi1jb2RlJyxcclxuICAgIEVYUElSRURfUE9QVVBfUkVRVUVTVDogJ2F1dGgvY2FuY2VsbGVkLXBvcHVwLXJlcXVlc3QnLFxyXG4gICAgSU5URVJOQUxfRVJST1I6ICdhdXRoL2ludGVybmFsLWVycm9yJyxcclxuICAgIElOVkFMSURfQVBJX0tFWTogJ2F1dGgvaW52YWxpZC1hcGkta2V5JyxcclxuICAgIElOVkFMSURfQVBQX0NSRURFTlRJQUw6ICdhdXRoL2ludmFsaWQtYXBwLWNyZWRlbnRpYWwnLFxyXG4gICAgSU5WQUxJRF9BUFBfSUQ6ICdhdXRoL2ludmFsaWQtYXBwLWlkJyxcclxuICAgIElOVkFMSURfQVVUSDogJ2F1dGgvaW52YWxpZC11c2VyLXRva2VuJyxcclxuICAgIElOVkFMSURfQVVUSF9FVkVOVDogJ2F1dGgvaW52YWxpZC1hdXRoLWV2ZW50JyxcclxuICAgIElOVkFMSURfQ0VSVF9IQVNIOiAnYXV0aC9pbnZhbGlkLWNlcnQtaGFzaCcsXHJcbiAgICBJTlZBTElEX0NPREU6ICdhdXRoL2ludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGUnLFxyXG4gICAgSU5WQUxJRF9DT05USU5VRV9VUkk6ICdhdXRoL2ludmFsaWQtY29udGludWUtdXJpJyxcclxuICAgIElOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OOiAnYXV0aC9pbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvbicsXHJcbiAgICBJTlZBTElEX0NVU1RPTV9UT0tFTjogJ2F1dGgvaW52YWxpZC1jdXN0b20tdG9rZW4nLFxyXG4gICAgSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOOiAnYXV0aC9pbnZhbGlkLWR5bmFtaWMtbGluay1kb21haW4nLFxyXG4gICAgSU5WQUxJRF9FTUFJTDogJ2F1dGgvaW52YWxpZC1lbWFpbCcsXHJcbiAgICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRTogJ2F1dGgvaW52YWxpZC1lbXVsYXRvci1zY2hlbWUnLFxyXG4gICAgSU5WQUxJRF9JRFBfUkVTUE9OU0U6ICdhdXRoL2ludmFsaWQtY3JlZGVudGlhbCcsXHJcbiAgICBJTlZBTElEX01FU1NBR0VfUEFZTE9BRDogJ2F1dGgvaW52YWxpZC1tZXNzYWdlLXBheWxvYWQnLFxyXG4gICAgSU5WQUxJRF9NRkFfU0VTU0lPTjogJ2F1dGgvaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXHJcbiAgICBJTlZBTElEX09BVVRIX0NMSUVOVF9JRDogJ2F1dGgvaW52YWxpZC1vYXV0aC1jbGllbnQtaWQnLFxyXG4gICAgSU5WQUxJRF9PQVVUSF9QUk9WSURFUjogJ2F1dGgvaW52YWxpZC1vYXV0aC1wcm92aWRlcicsXHJcbiAgICBJTlZBTElEX09PQl9DT0RFOiAnYXV0aC9pbnZhbGlkLWFjdGlvbi1jb2RlJyxcclxuICAgIElOVkFMSURfT1JJR0lOOiAnYXV0aC91bmF1dGhvcml6ZWQtZG9tYWluJyxcclxuICAgIElOVkFMSURfUEFTU1dPUkQ6ICdhdXRoL3dyb25nLXBhc3N3b3JkJyxcclxuICAgIElOVkFMSURfUEVSU0lTVEVOQ0U6ICdhdXRoL2ludmFsaWQtcGVyc2lzdGVuY2UtdHlwZScsXHJcbiAgICBJTlZBTElEX1BIT05FX05VTUJFUjogJ2F1dGgvaW52YWxpZC1waG9uZS1udW1iZXInLFxyXG4gICAgSU5WQUxJRF9QUk9WSURFUl9JRDogJ2F1dGgvaW52YWxpZC1wcm92aWRlci1pZCcsXHJcbiAgICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTDogJ2F1dGgvaW52YWxpZC1yZWNpcGllbnQtZW1haWwnLFxyXG4gICAgSU5WQUxJRF9TRU5ERVI6ICdhdXRoL2ludmFsaWQtc2VuZGVyJyxcclxuICAgIElOVkFMSURfU0VTU0lPTl9JTkZPOiAnYXV0aC9pbnZhbGlkLXZlcmlmaWNhdGlvbi1pZCcsXHJcbiAgICBJTlZBTElEX1RFTkFOVF9JRDogJ2F1dGgvaW52YWxpZC10ZW5hbnQtaWQnLFxyXG4gICAgTUZBX0lORk9fTk9UX0ZPVU5EOiAnYXV0aC9tdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmQnLFxyXG4gICAgTUZBX1JFUVVJUkVEOiAnYXV0aC9tdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZCcsXHJcbiAgICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FOiAnYXV0aC9taXNzaW5nLWFuZHJvaWQtcGtnLW5hbWUnLFxyXG4gICAgTUlTU0lOR19BUFBfQ1JFREVOVElBTDogJ2F1dGgvbWlzc2luZy1hcHAtY3JlZGVudGlhbCcsXHJcbiAgICBNSVNTSU5HX0FVVEhfRE9NQUlOOiAnYXV0aC9hdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWQnLFxyXG4gICAgTUlTU0lOR19DT0RFOiAnYXV0aC9taXNzaW5nLXZlcmlmaWNhdGlvbi1jb2RlJyxcclxuICAgIE1JU1NJTkdfQ09OVElOVUVfVVJJOiAnYXV0aC9taXNzaW5nLWNvbnRpbnVlLXVyaScsXHJcbiAgICBNSVNTSU5HX0lGUkFNRV9TVEFSVDogJ2F1dGgvbWlzc2luZy1pZnJhbWUtc3RhcnQnLFxyXG4gICAgTUlTU0lOR19JT1NfQlVORExFX0lEOiAnYXV0aC9taXNzaW5nLWlvcy1idW5kbGUtaWQnLFxyXG4gICAgTUlTU0lOR19PUl9JTlZBTElEX05PTkNFOiAnYXV0aC9taXNzaW5nLW9yLWludmFsaWQtbm9uY2UnLFxyXG4gICAgTUlTU0lOR19NRkFfSU5GTzogJ2F1dGgvbWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mbycsXHJcbiAgICBNSVNTSU5HX01GQV9TRVNTSU9OOiAnYXV0aC9taXNzaW5nLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcclxuICAgIE1JU1NJTkdfUEhPTkVfTlVNQkVSOiAnYXV0aC9taXNzaW5nLXBob25lLW51bWJlcicsXHJcbiAgICBNSVNTSU5HX1NFU1NJT05fSU5GTzogJ2F1dGgvbWlzc2luZy12ZXJpZmljYXRpb24taWQnLFxyXG4gICAgTU9EVUxFX0RFU1RST1lFRDogJ2F1dGgvYXBwLWRlbGV0ZWQnLFxyXG4gICAgTkVFRF9DT05GSVJNQVRJT046ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnLFxyXG4gICAgTkVUV09SS19SRVFVRVNUX0ZBSUxFRDogJ2F1dGgvbmV0d29yay1yZXF1ZXN0LWZhaWxlZCcsXHJcbiAgICBOVUxMX1VTRVI6ICdhdXRoL251bGwtdXNlcicsXHJcbiAgICBOT19BVVRIX0VWRU5UOiAnYXV0aC9uby1hdXRoLWV2ZW50JyxcclxuICAgIE5PX1NVQ0hfUFJPVklERVI6ICdhdXRoL25vLXN1Y2gtcHJvdmlkZXInLFxyXG4gICAgT1BFUkFUSU9OX05PVF9BTExPV0VEOiAnYXV0aC9vcGVyYXRpb24tbm90LWFsbG93ZWQnLFxyXG4gICAgT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6ICdhdXRoL29wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnQnLFxyXG4gICAgUE9QVVBfQkxPQ0tFRDogJ2F1dGgvcG9wdXAtYmxvY2tlZCcsXHJcbiAgICBQT1BVUF9DTE9TRURfQllfVVNFUjogJ2F1dGgvcG9wdXAtY2xvc2VkLWJ5LXVzZXInLFxyXG4gICAgUFJPVklERVJfQUxSRUFEWV9MSU5LRUQ6ICdhdXRoL3Byb3ZpZGVyLWFscmVhZHktbGlua2VkJyxcclxuICAgIFFVT1RBX0VYQ0VFREVEOiAnYXV0aC9xdW90YS1leGNlZWRlZCcsXHJcbiAgICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUjogJ2F1dGgvcmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXInLFxyXG4gICAgUkVESVJFQ1RfT1BFUkFUSU9OX1BFTkRJTkc6ICdhdXRoL3JlZGlyZWN0LW9wZXJhdGlvbi1wZW5kaW5nJyxcclxuICAgIFJFSkVDVEVEX0NSRURFTlRJQUw6ICdhdXRoL3JlamVjdGVkLWNyZWRlbnRpYWwnLFxyXG4gICAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEOiAnYXV0aC9zZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlJyxcclxuICAgIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQ6ICdhdXRoL21heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZCcsXHJcbiAgICBURU5BTlRfSURfTUlTTUFUQ0g6ICdhdXRoL3RlbmFudC1pZC1taXNtYXRjaCcsXHJcbiAgICBUSU1FT1VUOiAnYXV0aC90aW1lb3V0JyxcclxuICAgIFRPS0VOX0VYUElSRUQ6ICdhdXRoL3VzZXItdG9rZW4tZXhwaXJlZCcsXHJcbiAgICBUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVI6ICdhdXRoL3Rvby1tYW55LXJlcXVlc3RzJyxcclxuICAgIFVOQVVUSE9SSVpFRF9ET01BSU46ICdhdXRoL3VuYXV0aG9yaXplZC1jb250aW51ZS11cmknLFxyXG4gICAgVU5TVVBQT1JURURfRklSU1RfRkFDVE9SOiAnYXV0aC91bnN1cHBvcnRlZC1maXJzdC1mYWN0b3InLFxyXG4gICAgVU5TVVBQT1JURURfUEVSU0lTVEVOQ0U6ICdhdXRoL3Vuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGUnLFxyXG4gICAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTjogJ2F1dGgvdW5zdXBwb3J0ZWQtdGVuYW50LW9wZXJhdGlvbicsXHJcbiAgICBVTlZFUklGSUVEX0VNQUlMOiAnYXV0aC91bnZlcmlmaWVkLWVtYWlsJyxcclxuICAgIFVTRVJfQ0FOQ0VMTEVEOiAnYXV0aC91c2VyLWNhbmNlbGxlZCcsXHJcbiAgICBVU0VSX0RFTEVURUQ6ICdhdXRoL3VzZXItbm90LWZvdW5kJyxcclxuICAgIFVTRVJfRElTQUJMRUQ6ICdhdXRoL3VzZXItZGlzYWJsZWQnLFxyXG4gICAgVVNFUl9NSVNNQVRDSDogJ2F1dGgvdXNlci1taXNtYXRjaCcsXHJcbiAgICBVU0VSX1NJR05FRF9PVVQ6ICdhdXRoL3VzZXItc2lnbmVkLW91dCcsXHJcbiAgICBXRUFLX1BBU1NXT1JEOiAnYXV0aC93ZWFrLXBhc3N3b3JkJyxcclxuICAgIFdFQl9TVE9SQUdFX1VOU1VQUE9SVEVEOiAnYXV0aC93ZWItc3RvcmFnZS11bnN1cHBvcnRlZCcsXHJcbiAgICBBTFJFQURZX0lOSVRJQUxJWkVEOiAnYXV0aC9hbHJlYWR5LWluaXRpYWxpemVkJ1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBsb2dDbGllbnQgPSBuZXcgTG9nZ2VyKCdAZmlyZWJhc2UvYXV0aCcpO1xyXG5mdW5jdGlvbiBfbG9nRXJyb3IobXNnLCAuLi5hcmdzKSB7XHJcbiAgICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLkVSUk9SKSB7XHJcbiAgICAgICAgbG9nQ2xpZW50LmVycm9yKGBBdXRoICgke1NES19WRVJTSU9OfSk6ICR7bXNnfWAsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9mYWlsKGF1dGhPckNvZGUsIC4uLnJlc3QpIHtcclxuICAgIHRocm93IGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XHJcbn1cclxuZnVuY3Rpb24gX2NyZWF0ZUVycm9yKGF1dGhPckNvZGUsIC4uLnJlc3QpIHtcclxuICAgIHJldHVybiBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIGNvZGUsIG1lc3NhZ2UpIHtcclxuICAgIGNvbnN0IGVycm9yTWFwID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9kRXJyb3JNYXAoKSksIHsgW2NvZGVdOiBtZXNzYWdlIH0pO1xyXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBFcnJvckZhY3RvcnkoJ2F1dGgnLCAnRmlyZWJhc2UnLCBlcnJvck1hcCk7XHJcbiAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoY29kZSwge1xyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIF9hc3NlcnRJbnN0YW5jZU9mKGF1dGgsIG9iamVjdCwgaW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGNvbnN0cnVjdG9ySW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9ySW5zdGFuY2UpKSB7XHJcbiAgICAgICAgaWYgKGNvbnN0cnVjdG9ySW5zdGFuY2UubmFtZSAhPT0gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUpIHtcclxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UoYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovLCBgVHlwZSBvZiAke29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBpbnN0YW5jZS5gICtcclxuICAgICAgICAgICAgYERpZCB5b3UgcGFzcyBhIHJlZmVyZW5jZSBmcm9tIGEgZGlmZmVyZW50IEF1dGggU0RLP2ApO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCkge1xyXG4gICAgaWYgKHR5cGVvZiBhdXRoT3JDb2RlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXN0WzBdO1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXJhbXMgPSBbLi4ucmVzdC5zbGljZSgxKV07XHJcbiAgICAgICAgaWYgKGZ1bGxQYXJhbXNbMF0pIHtcclxuICAgICAgICAgICAgZnVsbFBhcmFtc1swXS5hcHBOYW1lID0gYXV0aE9yQ29kZS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXV0aE9yQ29kZS5fZXJyb3JGYWN0b3J5LmNyZWF0ZShjb2RlLCAuLi5mdWxsUGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkuY3JlYXRlKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9hc3NlcnQoYXNzZXJ0aW9uLCBhdXRoT3JDb2RlLCAuLi5yZXN0KSB7XHJcbiAgICBpZiAoIWFzc2VydGlvbikge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gaW50ZXJuYWwgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cclxuICpcclxuICogQHBhcmFtIGZhaWx1cmUgdHlwZSBvZiBmYWlsdXJlIGVuY291bnRlcmVkXHJcbiAqIEB0aHJvd3MgRXJyb3JcclxuICovXHJcbmZ1bmN0aW9uIGRlYnVnRmFpbChmYWlsdXJlKSB7XHJcbiAgICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXHJcbiAgICAvLyBleGNlcHRpb24gaXMgc3dhbGxvd2VkLlxyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBJTlRFUk5BTCBBU1NFUlRJT04gRkFJTEVEOiBgICsgZmFpbHVyZTtcclxuICAgIF9sb2dFcnJvcihtZXNzYWdlKTtcclxuICAgIC8vIE5PVEU6IFdlIGRvbid0IHVzZSBGaXJlYmFzZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcclxuICAgIC8vIHRoYXQgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhlIHVzZXIuIChBbHNvIGl0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyXHJcbiAgICAvLyBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIGVycm9yIGFuZCBhc3NlcnQgbW9kdWxlcyB3aGljaCBkb2Vzbid0IHdvcmsuKVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG59XHJcbi8qKlxyXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcclxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhc3NlcnRpb25cclxuICogQHBhcmFtIG1lc3NhZ2VcclxuICovXHJcbmZ1bmN0aW9uIGRlYnVnQXNzZXJ0KGFzc2VydGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKCFhc3NlcnRpb24pIHtcclxuICAgICAgICBkZWJ1Z0ZhaWwobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgaW5zdGFuY2VDYWNoZSA9IG5ldyBNYXAoKTtcclxuZnVuY3Rpb24gX2dldEluc3RhbmNlKGNscykge1xyXG4gICAgZGVidWdBc3NlcnQoY2xzIGluc3RhbmNlb2YgRnVuY3Rpb24sICdFeHBlY3RlZCBhIGNsYXNzIGRlZmluaXRpb24nKTtcclxuICAgIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlQ2FjaGUuZ2V0KGNscyk7XHJcbiAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydChpbnN0YW5jZSBpbnN0YW5jZW9mIGNscywgJ0luc3RhbmNlIHN0b3JlZCBpbiBjYWNoZSBtaXNtYXRjaGVkIHdpdGggY2xhc3MnKTtcclxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBpbnN0YW5jZSA9IG5ldyBjbHMoKTtcclxuICAgIGluc3RhbmNlQ2FjaGUuc2V0KGNscywgaW5zdGFuY2UpO1xyXG4gICAgcmV0dXJuIGluc3RhbmNlO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBJbml0aWFsaXplcyBhbiB7QGxpbmsgQXV0aH0gaW5zdGFuY2Ugd2l0aCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyXHJcbiAqIHtAbGluayBEZXBlbmRlbmNpZXN9LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRoYW5cclxuICoge0BsaW5rIGdldEF1dGh9LiBgZ2V0QXV0aGAgdXNlcyBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZhdWx0cyB0byBzdXBwbHlcclxuICogdGhlIHtAbGluayBEZXBlbmRlbmNpZXN9LiBJbiBnZW5lcmFsLCBgZ2V0QXV0aGAgaXMgdGhlIGVhc2llc3Qgd2F5IHRvXHJcbiAqIGluaXRpYWxpemUgQXV0aCBhbmQgd29ya3MgZm9yIG1vc3QgdXNlIGNhc2VzLiBVc2UgYGluaXRpYWxpemVBdXRoYCBpZiB5b3VcclxuICogbmVlZCBjb250cm9sIG92ZXIgd2hpY2ggcGVyc2lzdGVuY2UgbGF5ZXIgaXMgdXNlZCwgb3IgdG8gbWluaW1pemUgYnVuZGxlXHJcbiAqIHNpemUgaWYgeW91J3JlIG5vdCB1c2luZyBlaXRoZXIgYHNpZ25JbldpdGhQb3B1cGAgb3IgYHNpZ25JbldpdGhSZWRpcmVjdGAuXHJcbiAqXHJcbiAqIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcCBvbmx5IHVzZXMgYW5vbnltb3VzIGFjY291bnRzIGFuZCB5b3Ugb25seSB3YW50XHJcbiAqIGFjY291bnRzIHNhdmVkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLCBpbml0aWFsaXplIGBBdXRoYCB3aXRoOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhdXRoID0gaW5pdGlhbGl6ZUF1dGgoYXBwLCB7XHJcbiAqICAgcGVyc2lzdGVuY2U6IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UsXHJcbiAqICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiB1bmRlZmluZWQsXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUF1dGgoYXBwLCBkZXBzKSB7XHJcbiAgICBjb25zdCBwcm92aWRlciA9IF9nZXRQcm92aWRlcihhcHAsICdhdXRoJyk7XHJcbiAgICBpZiAocHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgICAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxPcHRpb25zID0gcHJvdmlkZXIuZ2V0T3B0aW9ucygpO1xyXG4gICAgICAgIGlmIChkZWVwRXF1YWwoaW5pdGlhbE9wdGlvbnMsIGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdm9pZCAwID8gZGVwcyA6IHt9KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXV0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiYWxyZWFkeS1pbml0aWFsaXplZFwiIC8qIEFMUkVBRFlfSU5JVElBTElaRUQgKi8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGF1dGggPSBwcm92aWRlci5pbml0aWFsaXplKHsgb3B0aW9uczogZGVwcyB9KTtcclxuICAgIHJldHVybiBhdXRoO1xyXG59XHJcbmZ1bmN0aW9uIF9pbml0aWFsaXplQXV0aEluc3RhbmNlKGF1dGgsIGRlcHMpIHtcclxuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gKGRlcHMgPT09IG51bGwgfHwgZGVwcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVwcy5wZXJzaXN0ZW5jZSkgfHwgW107XHJcbiAgICBjb25zdCBoaWVyYXJjaHkgPSAoQXJyYXkuaXNBcnJheShwZXJzaXN0ZW5jZSkgPyBwZXJzaXN0ZW5jZSA6IFtwZXJzaXN0ZW5jZV0pLm1hcChfZ2V0SW5zdGFuY2UpO1xyXG4gICAgaWYgKGRlcHMgPT09IG51bGwgfHwgZGVwcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVwcy5lcnJvck1hcCkge1xyXG4gICAgICAgIGF1dGguX3VwZGF0ZUVycm9yTWFwKGRlcHMuZXJyb3JNYXApO1xyXG4gICAgfVxyXG4gICAgLy8gVGhpcyBwcm9taXNlIGlzIGludGVuZGVkIHRvIGZsb2F0OyBhdXRoIGluaXRpYWxpemF0aW9uIGhhcHBlbnMgaW4gdGhlXHJcbiAgICAvLyBiYWNrZ3JvdW5kLCBtZWFud2hpbGUgdGhlIGF1dGggb2JqZWN0IG1heSBiZSB1c2VkIGJ5IHRoZSBhcHAuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICBhdXRoLl9pbml0aWFsaXplV2l0aFBlcnNpc3RlbmNlKGhpZXJhcmNoeSwgZGVwcyA9PT0gbnVsbCB8fCBkZXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZXBzLnBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dldEN1cnJlbnRVcmwoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiAoKF9hID0gc2VsZi5sb2NhdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSB8fCAnJztcclxufVxyXG5mdW5jdGlvbiBfaXNIdHRwT3JIdHRwcygpIHtcclxuICAgIHJldHVybiBfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnaHR0cDonIHx8IF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwczonO1xyXG59XHJcbmZ1bmN0aW9uIF9nZXRDdXJyZW50U2NoZW1lKCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgKChfYSA9IHNlbGYubG9jYXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcm90b2NvbCkpIHx8IG51bGw7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBicm93c2VyIGlzIHdvcmtpbmcgb25saW5lXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNPbmxpbmUoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICBuYXZpZ2F0b3IgJiZcclxuICAgICAgICAnb25MaW5lJyBpbiBuYXZpZ2F0b3IgJiZcclxuICAgICAgICB0eXBlb2YgbmF2aWdhdG9yLm9uTGluZSA9PT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgLy8gQXBwbHkgb25seSBmb3IgdHJhZGl0aW9uYWwgd2ViIGFwcHMgYW5kIENocm9tZSBleHRlbnNpb25zLlxyXG4gICAgICAgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciBDb3Jkb3ZhIGFwcHMgd2hpY2ggaGF2ZSB1bnJlbGlhYmxlXHJcbiAgICAgICAgLy8gbmF2aWdhdG9yLm9uTGluZSBiZWhhdmlvciB1bmxlc3MgY29yZG92YS1wbHVnaW4tbmV0d29yay1pbmZvcm1hdGlvbiBpc1xyXG4gICAgICAgIC8vIGluc3RhbGxlZCB3aGljaCBvdmVyd3JpdGVzIHRoZSBuYXRpdmUgbmF2aWdhdG9yLm9uTGluZSB2YWx1ZSBhbmRcclxuICAgICAgICAvLyBkZWZpbmVzIG5hdmlnYXRvci5jb25uZWN0aW9uLlxyXG4gICAgICAgIChfaXNIdHRwT3JIdHRwcygpIHx8IGlzQnJvd3NlckV4dGVuc2lvbigpIHx8ICdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmU7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIHN0YXRlLCBhc3N1bWUgaXQgaXMgb25saW5lLlxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gX2dldFVzZXJMYW5ndWFnZSgpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmF2aWdhdG9yTGFuZ3VhZ2UgPSBuYXZpZ2F0b3I7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgLy8gTW9zdCByZWxpYWJsZSwgYnV0IG9ubHkgc3VwcG9ydGVkIGluIENocm9tZS9GaXJlZm94LlxyXG4gICAgKG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZXNbMF0pIHx8XHJcbiAgICAgICAgLy8gU3VwcG9ydGVkIGluIG1vc3QgYnJvd3NlcnMsIGJ1dCByZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgYnJvd3NlclxyXG4gICAgICAgIC8vIFVJLCBub3QgdGhlIGxhbmd1YWdlIHNldCBpbiBicm93c2VyIHNldHRpbmdzLlxyXG4gICAgICAgIG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlIHx8XHJcbiAgICAgICAgLy8gQ291bGRuJ3QgZGV0ZXJtaW5lIGxhbmd1YWdlLlxyXG4gICAgICAgIG51bGwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBIHN0cnVjdHVyZSB0byBoZWxwIHBpY2sgYmV0d2VlbiBhIHJhbmdlIG9mIGxvbmcgYW5kIHNob3J0IGRlbGF5IGR1cmF0aW9uc1xyXG4gKiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIEluIGdlbmVyYWwsIHRoZSBsb25nIGRlbGF5IGlzIHVzZWQgZm9yXHJcbiAqIG1vYmlsZSBlbnZpcm9ubWVudHMgd2hlcmVhcyBzaG9ydCBkZWxheXMgYXJlIHVzZWQgZm9yIGRlc2t0b3AgZW52aXJvbm1lbnRzLlxyXG4gKi9cclxuY2xhc3MgRGVsYXkge1xyXG4gICAgY29uc3RydWN0b3Ioc2hvcnREZWxheSwgbG9uZ0RlbGF5KSB7XHJcbiAgICAgICAgdGhpcy5zaG9ydERlbGF5ID0gc2hvcnREZWxheTtcclxuICAgICAgICB0aGlzLmxvbmdEZWxheSA9IGxvbmdEZWxheTtcclxuICAgICAgICAvLyBJbnRlcm5hbCBlcnJvciB3aGVuIGltcHJvcGVybHkgaW5pdGlhbGl6ZWQuXHJcbiAgICAgICAgZGVidWdBc3NlcnQobG9uZ0RlbGF5ID4gc2hvcnREZWxheSwgJ1Nob3J0IGRlbGF5IHNob3VsZCBiZSBsZXNzIHRoYW4gbG9uZyBkZWxheSEnKTtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlID0gaXNNb2JpbGVDb3Jkb3ZhKCkgfHwgaXNSZWFjdE5hdGl2ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGlmICghX2lzT25saW5lKCkpIHtcclxuICAgICAgICAgICAgLy8gUGljayB0aGUgc2hvcnRlciB0aW1lb3V0LlxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oNTAwMCAvKiBPRkZMSU5FICovLCB0aGlzLnNob3J0RGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBydW5uaW5nIGluIGEgbW9iaWxlIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGxvbmcgZGVsYXksIG90aGVyd2lzZVxyXG4gICAgICAgIC8vIHJldHVybiB0aGUgc2hvcnQgZGVsYXkuXHJcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiBvdGhlclxyXG4gICAgICAgIC8vIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGp1c3QgcmVhZGluZyB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgICAgICByZXR1cm4gdGhpcy5pc01vYmlsZSA/IHRoaXMubG9uZ0RlbGF5IDogdGhpcy5zaG9ydERlbGF5O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9lbXVsYXRvclVybChjb25maWcsIHBhdGgpIHtcclxuICAgIGRlYnVnQXNzZXJ0KGNvbmZpZy5lbXVsYXRvciwgJ0VtdWxhdG9yIHNob3VsZCBhbHdheXMgYmUgc2V0IGhlcmUnKTtcclxuICAgIGNvbnN0IHsgdXJsIH0gPSBjb25maWcuZW11bGF0b3I7XHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3VybH0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aC5zbGljZSgxKSA6IHBhdGh9YDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBGZXRjaFByb3ZpZGVyIHtcclxuICAgIHN0YXRpYyBpbml0aWFsaXplKGZldGNoSW1wbCwgaGVhZGVyc0ltcGwsIHJlc3BvbnNlSW1wbCkge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hJbXBsID0gZmV0Y2hJbXBsO1xyXG4gICAgICAgIGlmIChoZWFkZXJzSW1wbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnNJbXBsID0gaGVhZGVyc0ltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXNwb25zZUltcGwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZUltcGwgPSByZXNwb25zZUltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGZldGNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZldGNoSW1wbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2ZldGNoJyBpbiBzZWxmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z0ZhaWwoJ0NvdWxkIG5vdCBmaW5kIGZldGNoIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGhlYWRlcnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyc0ltcGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyc0ltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ0hlYWRlcnMnIGluIHNlbGYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuSGVhZGVycztcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVidWdGYWlsKCdDb3VsZCBub3QgZmluZCBIZWFkZXJzIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHJlc3BvbnNlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlSW1wbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1Jlc3BvbnNlJyBpbiBzZWxmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLlJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z0ZhaWwoJ0NvdWxkIG5vdCBmaW5kIFJlc3BvbnNlIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBNYXAgZnJvbSBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciB0byBlcnJvcnMgdG8gZGV2ZWxvcGVyIHZpc2libGUgZXJyb3JzXHJcbiAqL1xyXG5jb25zdCBTRVJWRVJfRVJST1JfTUFQID0ge1xyXG4gICAgLy8gQ3VzdG9tIHRva2VuIGVycm9ycy5cclxuICAgIFtcIkNSRURFTlRJQUxfTUlTTUFUQ0hcIiAvKiBDUkVERU5USUFMX01JU01BVENIICovXTogXCJjdXN0b20tdG9rZW4tbWlzbWF0Y2hcIiAvKiBDUkVERU5USUFMX01JU01BVENIICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19DVVNUT01fVE9LRU5cIiAvKiBNSVNTSU5HX0NVU1RPTV9UT0tFTiAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyxcclxuICAgIC8vIENyZWF0ZSBBdXRoIFVSSSBlcnJvcnMuXHJcbiAgICBbXCJJTlZBTElEX0lERU5USUZJRVJcIiAvKiBJTlZBTElEX0lERU5USUZJRVIgKi9dOiBcImludmFsaWQtZW1haWxcIiAvKiBJTlZBTElEX0VNQUlMICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19DT05USU5VRV9VUklcIiAvKiBNSVNTSU5HX0NPTlRJTlVFX1VSSSAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyxcclxuICAgIC8vIFNpZ24gaW4gd2l0aCBlbWFpbCBhbmQgcGFzc3dvcmQgZXJyb3JzIChzb21lIGFwcGx5IHRvIHNpZ24gdXAgdG9vKS5cclxuICAgIFtcIklOVkFMSURfUEFTU1dPUkRcIiAvKiBJTlZBTElEX1BBU1NXT1JEICovXTogXCJ3cm9uZy1wYXNzd29yZFwiIC8qIElOVkFMSURfUEFTU1dPUkQgKi8sXHJcbiAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXHJcbiAgICBbXCJNSVNTSU5HX1BBU1NXT1JEXCIgLyogTUlTU0lOR19QQVNTV09SRCAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyxcclxuICAgIC8vIFNpZ24gdXAgd2l0aCBlbWFpbCBhbmQgcGFzc3dvcmQgZXJyb3JzLlxyXG4gICAgW1wiRU1BSUxfRVhJU1RTXCIgLyogRU1BSUxfRVhJU1RTICovXTogXCJlbWFpbC1hbHJlYWR5LWluLXVzZVwiIC8qIEVNQUlMX0VYSVNUUyAqLyxcclxuICAgIFtcIlBBU1NXT1JEX0xPR0lOX0RJU0FCTEVEXCIgLyogUEFTU1dPUkRfTE9HSU5fRElTQUJMRUQgKi9dOiBcIm9wZXJhdGlvbi1ub3QtYWxsb3dlZFwiIC8qIE9QRVJBVElPTl9OT1RfQUxMT1dFRCAqLyxcclxuICAgIC8vIFZlcmlmeSBhc3NlcnRpb24gZm9yIHNpZ24gaW4gd2l0aCBjcmVkZW50aWFsIGVycm9yczpcclxuICAgIFtcIklOVkFMSURfSURQX1JFU1BPTlNFXCIgLyogSU5WQUxJRF9JRFBfUkVTUE9OU0UgKi9dOiBcImludmFsaWQtY3JlZGVudGlhbFwiIC8qIElOVkFMSURfSURQX1JFU1BPTlNFICovLFxyXG4gICAgW1wiSU5WQUxJRF9QRU5ESU5HX1RPS0VOXCIgLyogSU5WQUxJRF9QRU5ESU5HX1RPS0VOICovXTogXCJpbnZhbGlkLWNyZWRlbnRpYWxcIiAvKiBJTlZBTElEX0lEUF9SRVNQT05TRSAqLyxcclxuICAgIFtcIkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEXCIgLyogRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRUQgKi9dOiBcImNyZWRlbnRpYWwtYWxyZWFkeS1pbi11c2VcIiAvKiBDUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19SRVFfVFlQRVwiIC8qIE1JU1NJTkdfUkVRX1RZUEUgKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBTZW5kIFBhc3N3b3JkIHJlc2V0IGVtYWlsIGVycm9yczpcclxuICAgIFtcIkVNQUlMX05PVF9GT1VORFwiIC8qIEVNQUlMX05PVF9GT1VORCAqL106IFwidXNlci1ub3QtZm91bmRcIiAvKiBVU0VSX0RFTEVURUQgKi8sXHJcbiAgICBbXCJSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVRcIiAvKiBSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVQgKi9dOiBcInRvby1tYW55LXJlcXVlc3RzXCIgLyogVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSICovLFxyXG4gICAgW1wiRVhQSVJFRF9PT0JfQ09ERVwiIC8qIEVYUElSRURfT09CX0NPREUgKi9dOiBcImV4cGlyZWQtYWN0aW9uLWNvZGVcIiAvKiBFWFBJUkVEX09PQl9DT0RFICovLFxyXG4gICAgW1wiSU5WQUxJRF9PT0JfQ09ERVwiIC8qIElOVkFMSURfT09CX0NPREUgKi9dOiBcImludmFsaWQtYWN0aW9uLWNvZGVcIiAvKiBJTlZBTElEX09PQl9DT0RFICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19PT0JfQ09ERVwiIC8qIE1JU1NJTkdfT09CX0NPREUgKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBJRCB0b2tlbiBpbiByZXF1ZXN0OlxyXG4gICAgW1wiQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOXCIgLyogQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOICovXTogXCJyZXF1aXJlcy1yZWNlbnQtbG9naW5cIiAvKiBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4gKi8sXHJcbiAgICBbXCJJTlZBTElEX0lEX1RPS0VOXCIgLyogSU5WQUxJRF9JRF9UT0tFTiAqL106IFwiaW52YWxpZC11c2VyLXRva2VuXCIgLyogSU5WQUxJRF9BVVRIICovLFxyXG4gICAgW1wiVE9LRU5fRVhQSVJFRFwiIC8qIFRPS0VOX0VYUElSRUQgKi9dOiBcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIFRPS0VOX0VYUElSRUQgKi8sXHJcbiAgICBbXCJVU0VSX05PVF9GT1VORFwiIC8qIFVTRVJfTk9UX0ZPVU5EICovXTogXCJ1c2VyLXRva2VuLWV4cGlyZWRcIiAvKiBUT0tFTl9FWFBJUkVEICovLFxyXG4gICAgLy8gT3RoZXIgZXJyb3JzLlxyXG4gICAgW1wiVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSXCIgLyogVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSICovXTogXCJ0b28tbWFueS1yZXF1ZXN0c1wiIC8qIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqLyxcclxuICAgIC8vIFBob25lIEF1dGggcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJJTlZBTElEX0NPREVcIiAvKiBJTlZBTElEX0NPREUgKi9dOiBcImludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGVcIiAvKiBJTlZBTElEX0NPREUgKi8sXHJcbiAgICBbXCJJTlZBTElEX1NFU1NJT05fSU5GT1wiIC8qIElOVkFMSURfU0VTU0lPTl9JTkZPICovXTogXCJpbnZhbGlkLXZlcmlmaWNhdGlvbi1pZFwiIC8qIElOVkFMSURfU0VTU0lPTl9JTkZPICovLFxyXG4gICAgW1wiSU5WQUxJRF9URU1QT1JBUllfUFJPT0ZcIiAvKiBJTlZBTElEX1RFTVBPUkFSWV9QUk9PRiAqL106IFwiaW52YWxpZC1jcmVkZW50aWFsXCIgLyogSU5WQUxJRF9JRFBfUkVTUE9OU0UgKi8sXHJcbiAgICBbXCJNSVNTSU5HX1NFU1NJT05fSU5GT1wiIC8qIE1JU1NJTkdfU0VTU0lPTl9JTkZPICovXTogXCJtaXNzaW5nLXZlcmlmaWNhdGlvbi1pZFwiIC8qIE1JU1NJTkdfU0VTU0lPTl9JTkZPICovLFxyXG4gICAgW1wiU0VTU0lPTl9FWFBJUkVEXCIgLyogU0VTU0lPTl9FWFBJUkVEICovXTogXCJjb2RlLWV4cGlyZWRcIiAvKiBDT0RFX0VYUElSRUQgKi8sXHJcbiAgICAvLyBPdGhlciBhY3Rpb24gY29kZSBlcnJvcnMgd2hlbiBhZGRpdGlvbmFsIHNldHRpbmdzIHBhc3NlZC5cclxuICAgIC8vIE1JU1NJTkdfQ09OVElOVUVfVVJJIGlzIGdldHRpbmcgbWFwcGVkIHRvIElOVEVSTkFMX0VSUk9SIGFib3ZlLlxyXG4gICAgLy8gVGhpcyBpcyBPSyBhcyB0aGlzIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IGNsaWVudCBzaWRlIHZhbGlkYXRpb24uXHJcbiAgICBbXCJNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FXCIgLyogTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSAqL106IFwibWlzc2luZy1hbmRyb2lkLXBrZy1uYW1lXCIgLyogTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSAqLyxcclxuICAgIFtcIlVOQVVUSE9SSVpFRF9ET01BSU5cIiAvKiBVTkFVVEhPUklaRURfRE9NQUlOICovXTogXCJ1bmF1dGhvcml6ZWQtY29udGludWUtdXJpXCIgLyogVU5BVVRIT1JJWkVEX0RPTUFJTiAqLyxcclxuICAgIC8vIGdldFByb2plY3RDb25maWcgZXJyb3JzIHdoZW4gY2xpZW50SWQgaXMgcGFzc2VkLlxyXG4gICAgW1wiSU5WQUxJRF9PQVVUSF9DTElFTlRfSURcIiAvKiBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCAqL106IFwiaW52YWxpZC1vYXV0aC1jbGllbnQtaWRcIiAvKiBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCAqLyxcclxuICAgIC8vIFVzZXIgYWN0aW9ucyAoc2lnbi11cCBvciBkZWxldGlvbikgZGlzYWJsZWQgZXJyb3JzLlxyXG4gICAgW1wiQURNSU5fT05MWV9PUEVSQVRJT05cIiAvKiBBRE1JTl9PTkxZX09QRVJBVElPTiAqL106IFwiYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb25cIiAvKiBBRE1JTl9PTkxZX09QRVJBVElPTiAqLyxcclxuICAgIC8vIE11bHRpIGZhY3RvciByZWxhdGVkIGVycm9ycy5cclxuICAgIFtcIklOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTFwiIC8qIElOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCAqL106IFwiaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIElOVkFMSURfTUZBX1NFU1NJT04gKi8sXHJcbiAgICBbXCJNRkFfRU5ST0xMTUVOVF9OT1RfRk9VTkRcIiAvKiBNRkFfRU5ST0xMTUVOVF9OT1RfRk9VTkQgKi9dOiBcIm11bHRpLWZhY3Rvci1pbmZvLW5vdC1mb3VuZFwiIC8qIE1GQV9JTkZPX05PVF9GT1VORCAqLyxcclxuICAgIFtcIk1JU1NJTkdfTUZBX0VOUk9MTE1FTlRfSURcIiAvKiBNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEICovXTogXCJtaXNzaW5nLW11bHRpLWZhY3Rvci1pbmZvXCIgLyogTUlTU0lOR19NRkFfSU5GTyAqLyxcclxuICAgIFtcIk1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTFwiIC8qIE1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCAqL106IFwibWlzc2luZy1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIE1JU1NJTkdfTUZBX1NFU1NJT04gKi8sXHJcbiAgICBbXCJTRUNPTkRfRkFDVE9SX0VYSVNUU1wiIC8qIFNFQ09ORF9GQUNUT1JfRVhJU1RTICovXTogXCJzZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlXCIgLyogU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEICovLFxyXG4gICAgW1wiU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRFwiIC8qIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgKi9dOiBcIm1heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZFwiIC8qIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgKi8sXHJcbiAgICAvLyBCbG9ja2luZyBmdW5jdGlvbnMgcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRVwiIC8qIEJMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFICovXTogXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLFxyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0FQSV9USU1FT1VUX01TID0gbmV3IERlbGF5KDMwMDAwLCA2MDAwMCk7XHJcbmZ1bmN0aW9uIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICBpZiAoYXV0aC50ZW5hbnRJZCAmJiAhcmVxdWVzdC50ZW5hbnRJZCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QpLCB7IHRlbmFudElkOiBhdXRoLnRlbmFudElkIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIG1ldGhvZCwgcGF0aCwgcmVxdWVzdCwgY3VzdG9tRXJyb3JNYXAgPSB7fSkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyhhdXRoLCBjdXN0b21FcnJvck1hcCwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGxldCBib2R5ID0ge307XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHt9O1xyXG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgLyogR0VUICovKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXF1ZXN0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBxdWVyeSA9IHF1ZXJ5c3RyaW5nKE9iamVjdC5hc3NpZ24oeyBrZXk6IGF1dGguY29uZmlnLmFwaUtleSB9LCBwYXJhbXMpKS5zbGljZSgxKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYXV0aC5fZ2V0QWRkaXRpb25hbEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCIgLyogQ09OVEVOVF9UWVBFICovXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICBpZiAoYXV0aC5sYW5ndWFnZUNvZGUpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtTG9jYWxlXCIgLyogWF9GSVJFQkFTRV9MT0NBTEUgKi9dID0gYXV0aC5sYW5ndWFnZUNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBGZXRjaFByb3ZpZGVyLmZldGNoKCkoX2dldEZpbmFsVGFyZ2V0KGF1dGgsIGF1dGguY29uZmlnLmFwaUhvc3QsIHBhdGgsIHF1ZXJ5KSwgT2JqZWN0LmFzc2lnbih7IG1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVycywgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicgfSwgYm9keSkpO1xyXG4gICAgfSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nKGF1dGgsIGN1c3RvbUVycm9yTWFwLCBmZXRjaEZuKSB7XHJcbiAgICBhdXRoLl9jYW5Jbml0RW11bGF0b3IgPSBmYWxzZTtcclxuICAgIGNvbnN0IGVycm9yTWFwID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBTRVJWRVJfRVJST1JfTUFQKSwgY3VzdG9tRXJyb3JNYXApO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IG5ldyBOZXR3b3JrVGltZW91dChhdXRoKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgICAgIGZldGNoRm4oKSxcclxuICAgICAgICAgICAgbmV0d29ya1RpbWVvdXQucHJvbWlzZVxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhpcyBwb2ludCwgdGhlIGZldGNoIHN1Y2NlZWRlZCBhbmQgdGhlIG5ldHdvcmtUaW1lb3V0XHJcbiAgICAgICAgLy8gZGlkbid0IHRocm93OyBjbGVhciB0aGUgbmV0d29yayB0aW1lb3V0IGRlbGF5IHNvIHRoYXQgTm9kZSB3b24ndCBoYW5nXHJcbiAgICAgICAgbmV0d29ya1RpbWVvdXQuY2xlYXJOZXR3b3JrVGltZW91dCgpO1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgaWYgKCduZWVkQ29uZmlybWF0aW9uJyBpbiBqc29uKSB7XHJcbiAgICAgICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgXCJhY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsXCIgLyogTkVFRF9DT05GSVJNQVRJT04gKi8sIGpzb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzcG9uc2Uub2sgJiYgISgnZXJyb3JNZXNzYWdlJyBpbiBqc29uKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ganNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLm9rID8ganNvbi5lcnJvck1lc3NhZ2UgOiBqc29uLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIGNvbnN0IFtzZXJ2ZXJFcnJvckNvZGUsIHNlcnZlckVycm9yTWVzc2FnZV0gPSBlcnJvck1lc3NhZ2Uuc3BsaXQoJyA6ICcpO1xyXG4gICAgICAgICAgICBpZiAoc2VydmVyRXJyb3JDb2RlID09PSBcIkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEXCIgLyogRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRUQgKi8pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgXCJjcmVkZW50aWFsLWFscmVhZHktaW4tdXNlXCIgLyogQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSAqLywganNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2VydmVyRXJyb3JDb2RlID09PSBcIkVNQUlMX0VYSVNUU1wiIC8qIEVNQUlMX0VYSVNUUyAqLykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBcImVtYWlsLWFscmVhZHktaW4tdXNlXCIgLyogRU1BSUxfRVhJU1RTICovLCBqc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBhdXRoRXJyb3IgPSBlcnJvck1hcFtzZXJ2ZXJFcnJvckNvZGVdIHx8XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJFcnJvckNvZGVcclxuICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bX1xcc10rL2csICctJyk7XHJcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIGF1dGhFcnJvciwgc2VydmVyRXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF9mYWlsKGF1dGgsIGF1dGhFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfZmFpbChhdXRoLCBcIm5ldHdvcmstcmVxdWVzdC1mYWlsZWRcIiAvKiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovKTtcclxuICAgIH1cclxufVxyXG5hc3luYyBmdW5jdGlvbiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgbWV0aG9kLCBwYXRoLCByZXF1ZXN0LCBjdXN0b21FcnJvck1hcCA9IHt9KSB7XHJcbiAgICBjb25zdCBzZXJ2ZXJSZXNwb25zZSA9IChhd2FpdCBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgbWV0aG9kLCBwYXRoLCByZXF1ZXN0LCBjdXN0b21FcnJvck1hcCkpO1xyXG4gICAgaWYgKCdtZmFQZW5kaW5nQ3JlZGVudGlhbCcgaW4gc2VydmVyUmVzcG9uc2UpIHtcclxuICAgICAgICBfZmFpbChhdXRoLCBcIm11bHRpLWZhY3Rvci1hdXRoLXJlcXVpcmVkXCIgLyogTUZBX1JFUVVJUkVEICovLCB7XHJcbiAgICAgICAgICAgIF9zZXJ2ZXJSZXNwb25zZTogc2VydmVyUmVzcG9uc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZXJ2ZXJSZXNwb25zZTtcclxufVxyXG5mdW5jdGlvbiBfZ2V0RmluYWxUYXJnZXQoYXV0aCwgaG9zdCwgcGF0aCwgcXVlcnkpIHtcclxuICAgIGNvbnN0IGJhc2UgPSBgJHtob3N0fSR7cGF0aH0/JHtxdWVyeX1gO1xyXG4gICAgaWYgKCFhdXRoLmNvbmZpZy5lbXVsYXRvcikge1xyXG4gICAgICAgIHJldHVybiBgJHthdXRoLmNvbmZpZy5hcGlTY2hlbWV9Oi8vJHtiYXNlfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX2VtdWxhdG9yVXJsKGF1dGguY29uZmlnLCBiYXNlKTtcclxufVxyXG5jbGFzcyBOZXR3b3JrVGltZW91dCB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgYXJlIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlLCBidXQgd2VcclxuICAgICAgICAvLyBkb24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBoZXJlXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgXCJ0aW1lb3V0XCIgLyogVElNRU9VVCAqLykpO1xyXG4gICAgICAgICAgICB9LCBERUZBVUxUX0FQSV9USU1FT1VUX01TLmdldCgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyTmV0d29ya1RpbWVvdXQoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgY29kZSwgcmVzcG9uc2UpIHtcclxuICAgIGNvbnN0IGVycm9yUGFyYW1zID0ge1xyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZVxyXG4gICAgfTtcclxuICAgIGlmIChyZXNwb25zZS5lbWFpbCkge1xyXG4gICAgICAgIGVycm9yUGFyYW1zLmVtYWlsID0gcmVzcG9uc2UuZW1haWw7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcG9uc2UucGhvbmVOdW1iZXIpIHtcclxuICAgICAgICBlcnJvclBhcmFtcy5waG9uZU51bWJlciA9IHJlc3BvbnNlLnBob25lTnVtYmVyO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZXJyb3IgPSBfY3JlYXRlRXJyb3IoYXV0aCwgY29kZSwgZXJyb3JQYXJhbXMpO1xyXG4gICAgLy8gV2Uga25vdyBjdXN0b21EYXRhIGlzIGRlZmluZWQgb24gZXJyb3IgYmVjYXVzZSBlcnJvclBhcmFtcyBpcyBkZWZpbmVkXHJcbiAgICBlcnJvci5jdXN0b21EYXRhLl90b2tlblJlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgICByZXR1cm4gZXJyb3I7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWNjb3VudChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOmRlbGV0ZVwiIC8qIERFTEVURV9BQ0NPVU5UICovLCByZXF1ZXN0KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMaW5rZWRBY2NvdW50cyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnVwZGF0ZVwiIC8qIFNFVF9BQ0NPVU5UX0lORk8gKi8sIHJlcXVlc3QpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJbmZvKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6bG9va3VwXCIgLyogR0VUX0FDQ09VTlRfSU5GTyAqLywgcmVxdWVzdCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHV0Y1RpbWVzdGFtcCkge1xyXG4gICAgaWYgKCF1dGNUaW1lc3RhbXApIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBDb252ZXJ0IHRvIGRhdGUgb2JqZWN0LlxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShOdW1iZXIodXRjVGltZXN0YW1wKSk7XHJcbiAgICAgICAgLy8gVGVzdCBkYXRlIGlzIHZhbGlkLlxyXG4gICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gVVRDIGRhdGUgc3RyaW5nLlxyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b1VUQ1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZy4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgSlNPTiBXZWIgVG9rZW4gKEpXVCkgdXNlZCB0byBpZGVudGlmeSB0aGUgdXNlciB0byBhIEZpcmViYXNlIHNlcnZpY2UuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgaXQgaGFzIG5vdCBleHBpcmVkIG9yIGlmIGl0IHdpbGwgbm90IGV4cGlyZSBpbiB0aGUgbmV4dCBmaXZlXHJcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldElkVG9rZW4odXNlciwgZm9yY2VSZWZyZXNoID0gZmFsc2UpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGVzZXJpYWxpemVkIEpTT04gV2ViIFRva2VuIChKV1QpIHVzZWQgdG8gaWRlbnRpdGZ5IHRoZSB1c2VyIHRvIGEgRmlyZWJhc2Ugc2VydmljZS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogUmV0dXJucyB0aGUgY3VycmVudCB0b2tlbiBpZiBpdCBoYXMgbm90IGV4cGlyZWQgb3IgaWYgaXQgd2lsbCBub3QgZXhwaXJlIGluIHRoZSBuZXh0IGZpdmVcclxuICogbWludXRlcy4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgcmVmcmVzaCB0aGUgdG9rZW4gYW5kIHJldHVybiBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBGb3JjZSByZWZyZXNoIHJlZ2FyZGxlc3Mgb2YgdG9rZW4gZXhwaXJhdGlvbi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0SWRUb2tlblJlc3VsdCh1c2VyLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xyXG4gICAgY29uc3QgY2xhaW1zID0gX3BhcnNlVG9rZW4odG9rZW4pO1xyXG4gICAgX2Fzc2VydChjbGFpbXMgJiYgY2xhaW1zLmV4cCAmJiBjbGFpbXMuYXV0aF90aW1lICYmIGNsYWltcy5pYXQsIHVzZXJJbnRlcm5hbC5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgY29uc3QgZmlyZWJhc2UgPSB0eXBlb2YgY2xhaW1zLmZpcmViYXNlID09PSAnb2JqZWN0JyA/IGNsYWltcy5maXJlYmFzZSA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHNpZ25JblByb3ZpZGVyID0gZmlyZWJhc2UgPT09IG51bGwgfHwgZmlyZWJhc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpcmViYXNlWydzaWduX2luX3Byb3ZpZGVyJ107XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsYWltcyxcclxuICAgICAgICB0b2tlbixcclxuICAgICAgICBhdXRoVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhjbGFpbXMuYXV0aF90aW1lKSksXHJcbiAgICAgICAgaXNzdWVkQXRUaW1lOiB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcoc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKGNsYWltcy5pYXQpKSxcclxuICAgICAgICBleHBpcmF0aW9uVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhjbGFpbXMuZXhwKSksXHJcbiAgICAgICAgc2lnbkluUHJvdmlkZXI6IHNpZ25JblByb3ZpZGVyIHx8IG51bGwsXHJcbiAgICAgICAgc2lnbkluU2Vjb25kRmFjdG9yOiAoZmlyZWJhc2UgPT09IG51bGwgfHwgZmlyZWJhc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpcmViYXNlWydzaWduX2luX3NlY29uZF9mYWN0b3InXSkgfHwgbnVsbFxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoc2Vjb25kcykge1xyXG4gICAgcmV0dXJuIE51bWJlcihzZWNvbmRzKSAqIDEwMDA7XHJcbn1cclxuZnVuY3Rpb24gX3BhcnNlVG9rZW4odG9rZW4pIHtcclxuICAgIGNvbnN0IFthbGdvcml0aG0sIHBheWxvYWQsIHNpZ25hdHVyZV0gPSB0b2tlbi5zcGxpdCgnLicpO1xyXG4gICAgaWYgKGFsZ29yaXRobSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgcGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgc2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBfbG9nRXJyb3IoJ0pXVCBtYWxmb3JtZWQsIGNvbnRhaW5lZCBmZXdlciB0aGFuIDMgc2VjdGlvbnMnKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGJhc2U2NERlY29kZShwYXlsb2FkKTtcclxuICAgICAgICBpZiAoIWRlY29kZWQpIHtcclxuICAgICAgICAgICAgX2xvZ0Vycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGJhc2U2NCBKV1QgcGF5bG9hZCcpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIF9sb2dFcnJvcignQ2F1Z2h0IGVycm9yIHBhcnNpbmcgSldUIHBheWxvYWQgYXMgSlNPTicsIGUpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0IGV4cGlyZXNJbiBUVEwgZnJvbSBhIHRva2VuIGJ5IHN1YnRyYWN0aW5nIHRoZSBleHBpcmF0aW9uIGZyb20gdGhlIGlzc3VhbmNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX3Rva2VuRXhwaXJlc0luKHRva2VuKSB7XHJcbiAgICBjb25zdCBwYXJzZWRUb2tlbiA9IF9wYXJzZVRva2VuKHRva2VuKTtcclxuICAgIF9hc3NlcnQocGFyc2VkVG9rZW4sIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICBfYXNzZXJ0KHR5cGVvZiBwYXJzZWRUb2tlbi5leHAgIT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uaWF0ICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIHJldHVybiBOdW1iZXIocGFyc2VkVG9rZW4uZXhwKSAtIE51bWJlcihwYXJzZWRUb2tlbi5pYXQpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIHByb21pc2UsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoYnlwYXNzQXV0aFN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IgJiYgaXNVc2VySW52YWxpZGF0ZWQoZSkpIHtcclxuICAgICAgICAgICAgaWYgKHVzZXIuYXV0aC5jdXJyZW50VXNlciA9PT0gdXNlcikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdXNlci5hdXRoLnNpZ25PdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzVXNlckludmFsaWRhdGVkKHsgY29kZSB9KSB7XHJcbiAgICByZXR1cm4gKGNvZGUgPT09IGBhdXRoLyR7XCJ1c2VyLWRpc2FibGVkXCIgLyogVVNFUl9ESVNBQkxFRCAqL31gIHx8XHJcbiAgICAgICAgY29kZSA9PT0gYGF1dGgvJHtcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIFRPS0VOX0VYUElSRUQgKi99YCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgUHJvYWN0aXZlUmVmcmVzaCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1c2VyKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyByZXR1cm4gZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXHJcbiAgICAgICAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSAzMDAwMCAvKiBSRVRSWV9CQUNLT0ZGX01JTiAqLztcclxuICAgIH1cclxuICAgIF9zdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zY2hlZHVsZSgpO1xyXG4gICAgfVxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRJbnRlcnZhbCh3YXNFcnJvcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBpZiAod2FzRXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmVycm9yQmFja29mZjtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSBNYXRoLm1pbih0aGlzLmVycm9yQmFja29mZiAqIDIsIDk2MDAwMCAvKiBSRVRSWV9CQUNLT0ZGX01BWCAqLyk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlcnJvciBiYWNrb2ZmXHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmID0gMzAwMDAgLyogUkVUUllfQkFDS09GRl9NSU4gKi87XHJcbiAgICAgICAgICAgIGNvbnN0IGV4cFRpbWUgPSAoX2EgPSB0aGlzLnVzZXIuc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGV4cFRpbWUgLSBEYXRlLm5vdygpIC0gMzAwMDAwIC8qIE9GRlNFVCAqLztcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzY2hlZHVsZSh3YXNFcnJvciA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICAvLyBKdXN0IGluIGNhc2UuLi5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuZ2V0SW50ZXJ2YWwod2FzRXJyb3IpO1xyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLml0ZXJhdGlvbigpO1xyXG4gICAgICAgIH0sIGludGVydmFsKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGl0ZXJhdGlvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gT25seSByZXRyeSBvbiBuZXR3b3JrIGVycm9yc1xyXG4gICAgICAgICAgICBpZiAoZS5jb2RlID09PSBgYXV0aC8ke1wibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi99YCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSgvKiB3YXNFcnJvciAqLyB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBVc2VyTWV0YWRhdGEge1xyXG4gICAgY29uc3RydWN0b3IoY3JlYXRlZEF0LCBsYXN0TG9naW5BdCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlZEF0ID0gY3JlYXRlZEF0O1xyXG4gICAgICAgIHRoaXMubGFzdExvZ2luQXQgPSBsYXN0TG9naW5BdDtcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXplVGltZSgpO1xyXG4gICAgfVxyXG4gICAgX2luaXRpYWxpemVUaW1lKCkge1xyXG4gICAgICAgIHRoaXMubGFzdFNpZ25JblRpbWUgPSB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcodGhpcy5sYXN0TG9naW5BdCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGlvblRpbWUgPSB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcodGhpcy5jcmVhdGVkQXQpO1xyXG4gICAgfVxyXG4gICAgX2NvcHkobWV0YWRhdGEpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRBdCA9IG1ldGFkYXRhLmNyZWF0ZWRBdDtcclxuICAgICAgICB0aGlzLmxhc3RMb2dpbkF0ID0gbWV0YWRhdGEubGFzdExvZ2luQXQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxyXG4gICAgICAgICAgICBsYXN0TG9naW5BdDogdGhpcy5sYXN0TG9naW5BdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcikge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgYXV0aCA9IHVzZXIuYXV0aDtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodXNlciwgZ2V0QWNjb3VudEluZm8oYXV0aCwgeyBpZFRva2VuIH0pKTtcclxuICAgIF9hc3NlcnQocmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlLnVzZXJzLmxlbmd0aCwgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIGNvbnN0IGNvcmVBY2NvdW50ID0gcmVzcG9uc2UudXNlcnNbMF07XHJcbiAgICB1c2VyLl9ub3RpZnlSZWxvYWRMaXN0ZW5lcihjb3JlQWNjb3VudCk7XHJcbiAgICBjb25zdCBuZXdQcm92aWRlckRhdGEgPSAoKF9hID0gY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aClcclxuICAgICAgICA/IGV4dHJhY3RQcm92aWRlckRhdGEoY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbylcclxuICAgICAgICA6IFtdO1xyXG4gICAgY29uc3QgcHJvdmlkZXJEYXRhID0gbWVyZ2VQcm92aWRlckRhdGEodXNlci5wcm92aWRlckRhdGEsIG5ld1Byb3ZpZGVyRGF0YSk7XHJcbiAgICAvLyBQcmVzZXJ2ZXMgdGhlIG5vbi1ub255bW91cyBzdGF0dXMgb2YgdGhlIHN0b3JlZCB1c2VyLCBldmVuIGlmIG5vIG1vcmVcclxuICAgIC8vIGNyZWRlbnRpYWxzIChmZWRlcmF0ZWQgb3IgZW1haWwvcGFzc3dvcmQpIGFyZSBsaW5rZWQgdG8gdGhlIHVzZXIuIElmXHJcbiAgICAvLyB0aGUgdXNlciB3YXMgcHJldmlvdXNseSBhbm9ueW1vdXMsIHRoZW4gdXNlIHByb3ZpZGVyIGRhdGEgdG8gdXBkYXRlLlxyXG4gICAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIGl0IHdhcyBub3QgYW5vbnltb3VzIGJlZm9yZSwgaXQgc2hvdWxkIG5ldmVyIGJlXHJcbiAgICAvLyBjb25zaWRlcmVkIGFub255bW91cyBub3cuXHJcbiAgICBjb25zdCBvbGRJc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XHJcbiAgICBjb25zdCBuZXdJc0Fub255bW91cyA9ICEodXNlci5lbWFpbCAmJiBjb3JlQWNjb3VudC5wYXNzd29yZEhhc2gpICYmICEocHJvdmlkZXJEYXRhID09PSBudWxsIHx8IHByb3ZpZGVyRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvdmlkZXJEYXRhLmxlbmd0aCk7XHJcbiAgICBjb25zdCBpc0Fub255bW91cyA9ICFvbGRJc0Fub255bW91cyA/IGZhbHNlIDogbmV3SXNBbm9ueW1vdXM7XHJcbiAgICBjb25zdCB1cGRhdGVzID0ge1xyXG4gICAgICAgIHVpZDogY29yZUFjY291bnQubG9jYWxJZCxcclxuICAgICAgICBkaXNwbGF5TmFtZTogY29yZUFjY291bnQuZGlzcGxheU5hbWUgfHwgbnVsbCxcclxuICAgICAgICBwaG90b1VSTDogY29yZUFjY291bnQucGhvdG9VcmwgfHwgbnVsbCxcclxuICAgICAgICBlbWFpbDogY29yZUFjY291bnQuZW1haWwgfHwgbnVsbCxcclxuICAgICAgICBlbWFpbFZlcmlmaWVkOiBjb3JlQWNjb3VudC5lbWFpbFZlcmlmaWVkIHx8IGZhbHNlLFxyXG4gICAgICAgIHBob25lTnVtYmVyOiBjb3JlQWNjb3VudC5waG9uZU51bWJlciB8fCBudWxsLFxyXG4gICAgICAgIHRlbmFudElkOiBjb3JlQWNjb3VudC50ZW5hbnRJZCB8fCBudWxsLFxyXG4gICAgICAgIHByb3ZpZGVyRGF0YSxcclxuICAgICAgICBtZXRhZGF0YTogbmV3IFVzZXJNZXRhZGF0YShjb3JlQWNjb3VudC5jcmVhdGVkQXQsIGNvcmVBY2NvdW50Lmxhc3RMb2dpbkF0KSxcclxuICAgICAgICBpc0Fub255bW91c1xyXG4gICAgfTtcclxuICAgIE9iamVjdC5hc3NpZ24odXNlciwgdXBkYXRlcyk7XHJcbn1cclxuLyoqXHJcbiAqIFJlbG9hZHMgdXNlciBhY2NvdW50IGRhdGEsIGlmIHNpZ25lZCBpbi5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVsb2FkKHVzZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXJJbnRlcm5hbCk7XHJcbiAgICAvLyBFdmVuIHRob3VnaCB0aGUgY3VycmVudCB1c2VyIGhhc24ndCBjaGFuZ2VkLCB1cGRhdGVcclxuICAgIC8vIGN1cnJlbnQgdXNlciB3aWxsIHRyaWdnZXIgYSBwZXJzaXN0ZW5jZSB1cGRhdGUgdy8gdGhlXHJcbiAgICAvLyBuZXcgaW5mby5cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xyXG4gICAgdXNlckludGVybmFsLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xyXG59XHJcbmZ1bmN0aW9uIG1lcmdlUHJvdmlkZXJEYXRhKG9yaWdpbmFsLCBuZXdEYXRhKSB7XHJcbiAgICBjb25zdCBkZWR1cGVkID0gb3JpZ2luYWwuZmlsdGVyKG8gPT4gIW5ld0RhdGEuc29tZShuID0+IG4ucHJvdmlkZXJJZCA9PT0gby5wcm92aWRlcklkKSk7XHJcbiAgICByZXR1cm4gWy4uLmRlZHVwZWQsIC4uLm5ld0RhdGFdO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RQcm92aWRlckRhdGEocHJvdmlkZXJzKSB7XHJcbiAgICByZXR1cm4gcHJvdmlkZXJzLm1hcCgoX2EpID0+IHtcclxuICAgICAgICB2YXIgeyBwcm92aWRlcklkIH0gPSBfYSwgcHJvdmlkZXIgPSBfX3Jlc3QoX2EsIFtcInByb3ZpZGVySWRcIl0pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgIHVpZDogcHJvdmlkZXIucmF3SWQgfHwgJycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBwcm92aWRlci5kaXNwbGF5TmFtZSB8fCBudWxsLFxyXG4gICAgICAgICAgICBlbWFpbDogcHJvdmlkZXIuZW1haWwgfHwgbnVsbCxcclxuICAgICAgICAgICAgcGhvbmVOdW1iZXI6IHByb3ZpZGVyLnBob25lTnVtYmVyIHx8IG51bGwsXHJcbiAgICAgICAgICAgIHBob3RvVVJMOiBwcm92aWRlci5waG90b1VybCB8fCBudWxsXHJcbiAgICAgICAgfTtcclxuICAgIH0pO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTdHNUb2tlbihhdXRoLCByZWZyZXNoVG9rZW4pIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nKGF1dGgsIHt9LCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHF1ZXJ5c3RyaW5nKHtcclxuICAgICAgICAgICAgJ2dyYW50X3R5cGUnOiAncmVmcmVzaF90b2tlbicsXHJcbiAgICAgICAgICAgICdyZWZyZXNoX3Rva2VuJzogcmVmcmVzaFRva2VuXHJcbiAgICAgICAgfSkuc2xpY2UoMSk7XHJcbiAgICAgICAgY29uc3QgeyB0b2tlbkFwaUhvc3QsIGFwaUtleSB9ID0gYXV0aC5jb25maWc7XHJcbiAgICAgICAgY29uc3QgdXJsID0gX2dldEZpbmFsVGFyZ2V0KGF1dGgsIHRva2VuQXBpSG9zdCwgXCIvdjEvdG9rZW5cIiAvKiBUT0tFTiAqLywgYGtleT0ke2FwaUtleX1gKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYXV0aC5fZ2V0QWRkaXRpb25hbEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCIgLyogQ09OVEVOVF9UWVBFICovXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG4gICAgICAgIHJldHVybiBGZXRjaFByb3ZpZGVyLmZldGNoKCkodXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIgLyogUE9TVCAqLyxcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgYm9keVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICAvLyBUaGUgcmVzcG9uc2UgY29tZXMgYmFjayBpbiBzbmFrZV9jYXNlLiBDb252ZXJ0IHRvIGNhbWVsOlxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBhY2Nlc3NUb2tlbjogcmVzcG9uc2UuYWNjZXNzX3Rva2VuLFxyXG4gICAgICAgIGV4cGlyZXNJbjogcmVzcG9uc2UuZXhwaXJlc19pbixcclxuICAgICAgICByZWZyZXNoVG9rZW46IHJlc3BvbnNlLnJlZnJlc2hfdG9rZW5cclxuICAgIH07XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFdlIG5lZWQgdG8gbWFyayB0aGlzIGNsYXNzIGFzIGludGVybmFsIGV4cGxpY2l0bHkgdG8gZXhjbHVkZSBpdCBpbiB0aGUgcHVibGljIHR5cGluZ3MsIGJlY2F1c2VcclxuICogaXQgcmVmZXJlbmNlcyBBdXRoSW50ZXJuYWwgd2hpY2ggaGFzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIFVzZXJJbnRlcm5hbC5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jbGFzcyBTdHNUb2tlbk1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzRXhwaXJlZCgpIHtcclxuICAgICAgICByZXR1cm4gKCF0aGlzLmV4cGlyYXRpb25UaW1lIHx8XHJcbiAgICAgICAgICAgIERhdGUubm93KCkgPiB0aGlzLmV4cGlyYXRpb25UaW1lIC0gMzAwMDAgLyogVE9LRU5fUkVGUkVTSCAqLyk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UocmVzcG9uc2UpIHtcclxuICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLmlkVG9rZW4sIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVzcG9uc2UuaWRUb2tlbiAhPT0gJ3VuZGVmaW5lZCcsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVzcG9uc2UucmVmcmVzaFRva2VuICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBjb25zdCBleHBpcmVzSW4gPSAnZXhwaXJlc0luJyBpbiByZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJ1xyXG4gICAgICAgICAgICA/IE51bWJlcihyZXNwb25zZS5leHBpcmVzSW4pXHJcbiAgICAgICAgICAgIDogX3Rva2VuRXhwaXJlc0luKHJlc3BvbnNlLmlkVG9rZW4pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihyZXNwb25zZS5pZFRva2VuLCByZXNwb25zZS5yZWZyZXNoVG9rZW4sIGV4cGlyZXNJbik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRUb2tlbihhdXRoLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xyXG4gICAgICAgIF9hc3NlcnQoIXRoaXMuYWNjZXNzVG9rZW4gfHwgdGhpcy5yZWZyZXNoVG9rZW4sIGF1dGgsIFwidXNlci10b2tlbi1leHBpcmVkXCIgLyogVE9LRU5fRVhQSVJFRCAqLyk7XHJcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5hY2Nlc3NUb2tlbiAmJiAhdGhpcy5pc0V4cGlyZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goYXV0aCwgdGhpcy5yZWZyZXNoVG9rZW4pO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NUb2tlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjbGVhclJlZnJlc2hUb2tlbigpIHtcclxuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZWZyZXNoKGF1dGgsIG9sZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgeyBhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuLCBleHBpcmVzSW4gfSA9IGF3YWl0IHJlcXVlc3RTdHNUb2tlbihhdXRoLCBvbGRUb2tlbik7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIE51bWJlcihleHBpcmVzSW4pKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVRva2Vuc0FuZEV4cGlyYXRpb24oYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXhwaXJlc0luU2VjKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW4gfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gRGF0ZS5ub3coKSArIGV4cGlyZXNJblNlYyAqIDEwMDA7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZnJvbUpTT04oYXBwTmFtZSwgb2JqZWN0KSB7XHJcbiAgICAgICAgY29uc3QgeyByZWZyZXNoVG9rZW4sIGFjY2Vzc1Rva2VuLCBleHBpcmF0aW9uVGltZSB9ID0gb2JqZWN0O1xyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgU3RzVG9rZW5NYW5hZ2VyKCk7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHR5cGVvZiByZWZyZXNoVG9rZW4gPT09ICdzdHJpbmcnLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sIHtcclxuICAgICAgICAgICAgICAgIGFwcE5hbWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1hbmFnZXIucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0eXBlb2YgYWNjZXNzVG9rZW4gPT09ICdzdHJpbmcnLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8sIHtcclxuICAgICAgICAgICAgICAgIGFwcE5hbWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1hbmFnZXIuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4cGlyYXRpb25UaW1lKSB7XHJcbiAgICAgICAgICAgIF9hc3NlcnQodHlwZW9mIGV4cGlyYXRpb25UaW1lID09PSAnbnVtYmVyJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovLCB7XHJcbiAgICAgICAgICAgICAgICBhcHBOYW1lXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBtYW5hZ2VyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdGhpcy5yZWZyZXNoVG9rZW4sXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICBleHBpcmF0aW9uVGltZTogdGhpcy5leHBpcmF0aW9uVGltZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBfYXNzaWduKHN0c1Rva2VuTWFuYWdlcikge1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuO1xyXG4gICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBzdHNUb2tlbk1hbmFnZXIuZXhwaXJhdGlvblRpbWU7XHJcbiAgICB9XHJcbiAgICBfY2xvbmUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFN0c1Rva2VuTWFuYWdlcigpLCB0aGlzLnRvSlNPTigpKTtcclxuICAgIH1cclxuICAgIF9wZXJmb3JtUmVmcmVzaCgpIHtcclxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChhc3NlcnRpb24sIGFwcE5hbWUpIHtcclxuICAgIF9hc3NlcnQodHlwZW9mIGFzc2VydGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFzc2VydGlvbiA9PT0gJ3VuZGVmaW5lZCcsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLywgeyBhcHBOYW1lIH0pO1xyXG59XHJcbmNsYXNzIFVzZXJJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKF9hKSB7XHJcbiAgICAgICAgdmFyIHsgdWlkLCBhdXRoLCBzdHNUb2tlbk1hbmFnZXIgfSA9IF9hLCBvcHQgPSBfX3Jlc3QoX2EsIFtcInVpZFwiLCBcImF1dGhcIiwgXCJzdHNUb2tlbk1hbmFnZXJcIl0pO1xyXG4gICAgICAgIC8vIEZvciB0aGUgdXNlciBvYmplY3QsIHByb3ZpZGVyIGlzIGFsd2F5cyBGaXJlYmFzZS5cclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBcImZpcmViYXNlXCIgLyogRklSRUJBU0UgKi87XHJcbiAgICAgICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0Fub255bW91cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudGVuYW50SWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJEYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoID0gbmV3IFByb2FjdGl2ZVJlZnJlc2godGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRVc2VySW5mbyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRMaXN0ZW5lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy51aWQgPSB1aWQ7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLnN0c1Rva2VuTWFuYWdlciA9IHN0c1Rva2VuTWFuYWdlcjtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBvcHQuZGlzcGxheU5hbWUgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmVtYWlsID0gb3B0LmVtYWlsIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gb3B0LmVtYWlsVmVyaWZpZWQgfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IG9wdC5waG9uZU51bWJlciB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMucGhvdG9VUkwgPSBvcHQucGhvdG9VUkwgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmlzQW5vbnltb3VzID0gb3B0LmlzQW5vbnltb3VzIHx8IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudGVuYW50SWQgPSBvcHQudGVuYW50SWQgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IFVzZXJNZXRhZGF0YShvcHQuY3JlYXRlZEF0IHx8IHVuZGVmaW5lZCwgb3B0Lmxhc3RMb2dpbkF0IHx8IHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodGhpcywgdGhpcy5zdHNUb2tlbk1hbmFnZXIuZ2V0VG9rZW4odGhpcy5hdXRoLCBmb3JjZVJlZnJlc2gpKTtcclxuICAgICAgICBfYXNzZXJ0KGFjY2Vzc1Rva2VuLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gIT09IGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5hdXRoLl9ub3RpZnlMaXN0ZW5lcnNJZkN1cnJlbnQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcclxuICAgIH1cclxuICAgIGdldElkVG9rZW5SZXN1bHQoZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldElkVG9rZW5SZXN1bHQodGhpcywgZm9yY2VSZWZyZXNoKTtcclxuICAgIH1cclxuICAgIHJlbG9hZCgpIHtcclxuICAgICAgICByZXR1cm4gcmVsb2FkKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgX2Fzc2lnbih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT09IHVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfYXNzZXJ0KHRoaXMudWlkID09PSB1c2VyLnVpZCwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB1c2VyLmRpc3BsYXlOYW1lO1xyXG4gICAgICAgIHRoaXMucGhvdG9VUkwgPSB1c2VyLnBob3RvVVJMO1xyXG4gICAgICAgIHRoaXMuZW1haWwgPSB1c2VyLmVtYWlsO1xyXG4gICAgICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IHVzZXIuZW1haWxWZXJpZmllZDtcclxuICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gdXNlci5waG9uZU51bWJlcjtcclxuICAgICAgICB0aGlzLmlzQW5vbnltb3VzID0gdXNlci5pc0Fub255bW91cztcclxuICAgICAgICB0aGlzLnRlbmFudElkID0gdXNlci50ZW5hbnRJZDtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyRGF0YSA9IHVzZXIucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoT2JqZWN0LmFzc2lnbih7fSwgdXNlckluZm8pKSk7XHJcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5fY29weSh1c2VyLm1ldGFkYXRhKTtcclxuICAgICAgICB0aGlzLnN0c1Rva2VuTWFuYWdlci5fYXNzaWduKHVzZXIuc3RzVG9rZW5NYW5hZ2VyKTtcclxuICAgIH1cclxuICAgIF9jbG9uZShhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VySW1wbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMpLCB7IGF1dGgsIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Nsb25lKCkgfSkpO1xyXG4gICAgfVxyXG4gICAgX29uUmVsb2FkKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgbGlzdGVuZXIsIGFuZCB0aGF0IGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIE11bHRpRmFjdG9yVXNlclxyXG4gICAgICAgIF9hc3NlcnQoIXRoaXMucmVsb2FkTGlzdGVuZXIsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLnJlbG9hZExpc3RlbmVyID0gY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKHRoaXMucmVsb2FkVXNlckluZm8pIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5UmVsb2FkTGlzdGVuZXIodGhpcy5yZWxvYWRVc2VySW5mbyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkVXNlckluZm8gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9ub3RpZnlSZWxvYWRMaXN0ZW5lcih1c2VySW5mbykge1xyXG4gICAgICAgIGlmICh0aGlzLnJlbG9hZExpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkTGlzdGVuZXIodXNlckluZm8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSWYgbm8gbGlzdGVuZXIgaXMgc3Vic2NyaWJlZCB5ZXQsIHNhdmUgdGhlIHJlc3VsdCBzbyBpdCdzIGF2YWlsYWJsZSB3aGVuIHRoZXkgZG8gc3Vic2NyaWJlXHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkVXNlckluZm8gPSB1c2VySW5mbztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIHRoaXMucHJvYWN0aXZlUmVmcmVzaC5fc3RhcnQoKTtcclxuICAgIH1cclxuICAgIF9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnByb2FjdGl2ZVJlZnJlc2guX3N0b3AoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShyZXNwb25zZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgdG9rZW5zUmVmcmVzaGVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmlkVG9rZW4gJiZcclxuICAgICAgICAgICAgcmVzcG9uc2UuaWRUb2tlbiAhPT0gdGhpcy5zdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIudXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgdG9rZW5zUmVmcmVzaGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlbG9hZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh0aGlzKTtcclxuICAgICAgICBpZiAodG9rZW5zUmVmcmVzaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5fbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGRlbGV0ZSgpIHtcclxuICAgICAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdGhpcy5nZXRJZFRva2VuKCk7XHJcbiAgICAgICAgYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodGhpcywgZGVsZXRlQWNjb3VudCh0aGlzLmF1dGgsIHsgaWRUb2tlbiB9KSk7XHJcbiAgICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuY2xlYXJSZWZyZXNoVG9rZW4oKTtcclxuICAgICAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgY2FuY2VsbGFibGUtcHJvbWlzZXMgYXJlIG5lY2Vzc2FyeSB0byB1c2UgaW4gdGhpcyBjbGFzcyBzbyB0aGF0IGRlbGV0ZSgpXHJcbiAgICAgICAgLy8gICAgICAgY2FuY2VscyBwZW5kaW5nIGFjdGlvbnMuLi5cclxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoLnNpZ25PdXQoKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgdWlkOiB0aGlzLnVpZCwgZW1haWw6IHRoaXMuZW1haWwgfHwgdW5kZWZpbmVkLCBlbWFpbFZlcmlmaWVkOiB0aGlzLmVtYWlsVmVyaWZpZWQsIGRpc3BsYXlOYW1lOiB0aGlzLmRpc3BsYXlOYW1lIHx8IHVuZGVmaW5lZCwgaXNBbm9ueW1vdXM6IHRoaXMuaXNBbm9ueW1vdXMsIHBob3RvVVJMOiB0aGlzLnBob3RvVVJMIHx8IHVuZGVmaW5lZCwgcGhvbmVOdW1iZXI6IHRoaXMucGhvbmVOdW1iZXIgfHwgdW5kZWZpbmVkLCB0ZW5hbnRJZDogdGhpcy50ZW5hbnRJZCB8fCB1bmRlZmluZWQsIHByb3ZpZGVyRGF0YTogdGhpcy5wcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+IChPYmplY3QuYXNzaWduKHt9LCB1c2VySW5mbykpKSwgc3RzVG9rZW5NYW5hZ2VyOiB0aGlzLnN0c1Rva2VuTWFuYWdlci50b0pTT04oKSwgXHJcbiAgICAgICAgICAgIC8vIFJlZGlyZWN0IGV2ZW50IElEIG11c3QgYmUgbWFpbnRhaW5lZCBpbiBjYXNlIHRoZXJlIGlzIGEgcGVuZGluZ1xyXG4gICAgICAgICAgICAvLyByZWRpcmVjdCBldmVudC5cclxuICAgICAgICAgICAgX3JlZGlyZWN0RXZlbnRJZDogdGhpcy5fcmVkaXJlY3RFdmVudElkIH0sIHRoaXMubWV0YWRhdGEudG9KU09OKCkpLCB7IFxyXG4gICAgICAgICAgICAvLyBSZXF1aXJlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBsZWdhY3kgU0RLIChnby9maXJlYmFzZS1hdXRoLXNkay1wZXJzaXN0ZW5jZS1wYXJzaW5nKTpcclxuICAgICAgICAgICAgYXBpS2V5OiB0aGlzLmF1dGguY29uZmlnLmFwaUtleSwgYXBwTmFtZTogdGhpcy5hdXRoLm5hbWUgfSk7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVmcmVzaFRva2VuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0c1Rva2VuTWFuYWdlci5yZWZyZXNoVG9rZW4gfHwgJyc7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21KU09OKGF1dGgsIG9iamVjdCkge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2g7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSAoX2EgPSBvYmplY3QuZGlzcGxheU5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBlbWFpbCA9IChfYiA9IG9iamVjdC5lbWFpbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gKF9jID0gb2JqZWN0LnBob25lTnVtYmVyKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgcGhvdG9VUkwgPSAoX2QgPSBvYmplY3QucGhvdG9VUkwpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCB0ZW5hbnRJZCA9IChfZSA9IG9iamVjdC50ZW5hbnRJZCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IF9yZWRpcmVjdEV2ZW50SWQgPSAoX2YgPSBvYmplY3QuX3JlZGlyZWN0RXZlbnRJZCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IChfZyA9IG9iamVjdC5jcmVhdGVkQXQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBsYXN0TG9naW5BdCA9IChfaCA9IG9iamVjdC5sYXN0TG9naW5BdCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHsgdWlkLCBlbWFpbFZlcmlmaWVkLCBpc0Fub255bW91cywgcHJvdmlkZXJEYXRhLCBzdHNUb2tlbk1hbmFnZXI6IHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyIH0gPSBvYmplY3Q7XHJcbiAgICAgICAgX2Fzc2VydCh1aWQgJiYgcGxhaW5PYmplY3RUb2tlbk1hbmFnZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3Qgc3RzVG9rZW5NYW5hZ2VyID0gU3RzVG9rZW5NYW5hZ2VyLmZyb21KU09OKHRoaXMubmFtZSwgcGxhaW5PYmplY3RUb2tlbk1hbmFnZXIpO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIHVpZCA9PT0gJ3N0cmluZycsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoZGlzcGxheU5hbWUsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoZW1haWwsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgZW1haWxWZXJpZmllZCA9PT0gJ2Jvb2xlYW4nLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGlzQW5vbnltb3VzID09PSAnYm9vbGVhbicsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQocGhvbmVOdW1iZXIsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQocGhvdG9VUkwsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQodGVuYW50SWQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoX3JlZGlyZWN0RXZlbnRJZCwgYXV0aC5uYW1lKTtcclxuICAgICAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChjcmVhdGVkQXQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQobGFzdExvZ2luQXQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VySW1wbCh7XHJcbiAgICAgICAgICAgIHVpZCxcclxuICAgICAgICAgICAgYXV0aCxcclxuICAgICAgICAgICAgZW1haWwsXHJcbiAgICAgICAgICAgIGVtYWlsVmVyaWZpZWQsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgICBpc0Fub255bW91cyxcclxuICAgICAgICAgICAgcGhvdG9VUkwsXHJcbiAgICAgICAgICAgIHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZCxcclxuICAgICAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIGxhc3RMb2dpbkF0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyRGF0YSAmJiBBcnJheS5pc0FycmF5KHByb3ZpZGVyRGF0YSkpIHtcclxuICAgICAgICAgICAgdXNlci5wcm92aWRlckRhdGEgPSBwcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+IChPYmplY3QuYXNzaWduKHt9LCB1c2VySW5mbykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKF9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgdXNlci5fcmVkaXJlY3RFdmVudElkID0gX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgYSBVc2VyIGZyb20gYW4gaWRUb2tlbiBzZXJ2ZXIgcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBhdXRoXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlblJlc3BvbnNlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhc3luYyBfZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoLCBpZFRva2VuUmVzcG9uc2UsIGlzQW5vbnltb3VzID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBzdHNUb2tlbk1hbmFnZXIgPSBuZXcgU3RzVG9rZW5NYW5hZ2VyKCk7XHJcbiAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLnVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEZpcmViYXNlIEF1dGggdXNlci5cclxuICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcclxuICAgICAgICAgICAgdWlkOiBpZFRva2VuUmVzcG9uc2UubG9jYWxJZCxcclxuICAgICAgICAgICAgYXV0aCxcclxuICAgICAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxyXG4gICAgICAgICAgICBpc0Fub255bW91c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFVwZGF0ZXMgdGhlIHVzZXIgaW5mbyBhbmQgZGF0YSBhbmQgcmVzb2x2ZXMgd2l0aCBhIHVzZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XHJcbiAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgSW5NZW1vcnlQZXJzaXN0ZW5jZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSBcIk5PTkVcIiAvKiBOT05FICovO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2lzQXZhaWxhYmxlKCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3NldChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlW2tleV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9nZXQoa2V5KSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnN0b3JhZ2Vba2V5XTtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9yZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXldO1xyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKF9rZXksIF9saXN0ZW5lcikge1xyXG4gICAgICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3JlbW92ZUxpc3RlbmVyKF9rZXksIF9saXN0ZW5lcikge1xyXG4gICAgICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG59XHJcbkluTWVtb3J5UGVyc2lzdGVuY2UudHlwZSA9ICdOT05FJztcclxuLyoqXHJcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSAnTk9ORScuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGluTWVtb3J5UGVyc2lzdGVuY2UgPSBJbk1lbW9yeVBlcnNpc3RlbmNlO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfcGVyc2lzdGVuY2VLZXlOYW1lKGtleSwgYXBpS2V5LCBhcHBOYW1lKSB7XHJcbiAgICByZXR1cm4gYCR7XCJmaXJlYmFzZVwiIC8qIFBFUlNJU1RFTkNFICovfToke2tleX06JHthcGlLZXl9OiR7YXBwTmFtZX1gO1xyXG59XHJcbmNsYXNzIFBlcnNpc3RlbmNlVXNlck1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IocGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpIHtcclxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLnVzZXJLZXkgPSB1c2VyS2V5O1xyXG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCBuYW1lIH0gPSB0aGlzLmF1dGg7XHJcbiAgICAgICAgdGhpcy5mdWxsVXNlcktleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUodGhpcy51c2VyS2V5LCBjb25maWcuYXBpS2V5LCBuYW1lKTtcclxuICAgICAgICB0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUoXCJwZXJzaXN0ZW5jZVwiIC8qIFBFUlNJU1RFTkNFX1VTRVIgKi8sIGNvbmZpZy5hcGlLZXksIG5hbWUpO1xyXG4gICAgICAgIHRoaXMuYm91bmRFdmVudEhhbmRsZXIgPSBhdXRoLl9vblN0b3JhZ2VFdmVudC5iaW5kKGF1dGgpO1xyXG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2UuX2FkZExpc3RlbmVyKHRoaXMuZnVsbFVzZXJLZXksIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgc2V0Q3VycmVudFVzZXIodXNlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9zZXQodGhpcy5mdWxsVXNlcktleSwgdXNlci50b0pTT04oKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRDdXJyZW50VXNlcigpIHtcclxuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5fZ2V0KHRoaXMuZnVsbFVzZXJLZXkpO1xyXG4gICAgICAgIHJldHVybiBibG9iID8gVXNlckltcGwuX2Zyb21KU09OKHRoaXMuYXV0aCwgYmxvYikgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmVtb3ZlQ3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuX3JlbW92ZSh0aGlzLmZ1bGxVc2VyS2V5KTtcclxuICAgIH1cclxuICAgIHNhdmVQZXJzaXN0ZW5jZUZvclJlZGlyZWN0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9zZXQodGhpcy5mdWxsUGVyc2lzdGVuY2VLZXksIHRoaXMucGVyc2lzdGVuY2UudHlwZSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBzZXRQZXJzaXN0ZW5jZShuZXdQZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlID09PSBuZXdQZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gbmV3UGVyc2lzdGVuY2U7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnRVc2VyKGN1cnJlbnRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5fcmVtb3ZlTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgY3JlYXRlKGF1dGgsIHBlcnNpc3RlbmNlSGllcmFyY2h5LCB1c2VyS2V5ID0gXCJhdXRoVXNlclwiIC8qIEFVVEhfVVNFUiAqLykge1xyXG4gICAgICAgIGlmICghcGVyc2lzdGVuY2VIaWVyYXJjaHkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VVc2VyTWFuYWdlcihfZ2V0SW5zdGFuY2UoaW5NZW1vcnlQZXJzaXN0ZW5jZSksIGF1dGgsIHVzZXJLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBFbGltaW5hdGUgYW55IHBlcnNpc3RlbmNlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlXHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUGVyc2lzdGVuY2VzID0gKGF3YWl0IFByb21pc2UuYWxsKHBlcnNpc3RlbmNlSGllcmFyY2h5Lm1hcChhc3luYyAocGVyc2lzdGVuY2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IHBlcnNpc3RlbmNlLl9pc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9KSkpLmZpbHRlcihwZXJzaXN0ZW5jZSA9PiBwZXJzaXN0ZW5jZSk7XHJcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBwZXJzaXN0ZW5jZSBsaXN0ZWQsIG9yIGluIG1lbW9yeSBpZiBub25lIGF2YWlsYWJsZVxyXG4gICAgICAgIGxldCBzZWxlY3RlZFBlcnNpc3RlbmNlID0gYXZhaWxhYmxlUGVyc2lzdGVuY2VzWzBdIHx8XHJcbiAgICAgICAgICAgIF9nZXRJbnN0YW5jZShpbk1lbW9yeVBlcnNpc3RlbmNlKTtcclxuICAgICAgICBjb25zdCBrZXkgPSBfcGVyc2lzdGVuY2VLZXlOYW1lKHVzZXJLZXksIGF1dGguY29uZmlnLmFwaUtleSwgYXV0aC5uYW1lKTtcclxuICAgICAgICAvLyBQdWxsIG91dCB0aGUgZXhpc3RpbmcgdXNlciwgc2V0dGluZyB0aGUgY2hvc2VuIHBlcnNpc3RlbmNlIHRvIHRoYXRcclxuICAgICAgICAvLyBwZXJzaXN0ZW5jZSBpZiB0aGUgdXNlciBleGlzdHMuXHJcbiAgICAgICAgbGV0IHVzZXJUb01pZ3JhdGUgPSBudWxsO1xyXG4gICAgICAgIC8vIE5vdGUsIGhlcmUgd2UgY2hlY2sgZm9yIGEgdXNlciBpbiBfYWxsXyBwZXJzaXN0ZW5jZXMsIG5vdCBqdXN0IHRoZVxyXG4gICAgICAgIC8vIG9uZXMgZGVlbWVkIGF2YWlsYWJsZS4gSWYgd2UgY2FuIG1pZ3JhdGUgYSB1c2VyIG91dCBvZiBhIGJyb2tlblxyXG4gICAgICAgIC8vIHBlcnNpc3RlbmNlLCB3ZSB3aWxsIChidXQgb25seSBpZiB0aGF0IHBlcnNpc3RlbmNlIHN1cHBvcnRzIG1pZ3JhdGlvbikuXHJcbiAgICAgICAgZm9yIChjb25zdCBwZXJzaXN0ZW5jZSBvZiBwZXJzaXN0ZW5jZUhpZXJhcmNoeSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHBlcnNpc3RlbmNlLl9nZXQoa2V5KTtcclxuICAgICAgICAgICAgICAgIGlmIChibG9iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IFVzZXJJbXBsLl9mcm9tSlNPTihhdXRoLCBibG9iKTsgLy8gdGhyb3dzIGZvciB1bnBhcnNhYmxlIGJsb2IgKHdyb25nIGZvcm1hdClcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVyc2lzdGVuY2UgIT09IHNlbGVjdGVkUGVyc2lzdGVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlclRvTWlncmF0ZSA9IHVzZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiB3ZSBmaW5kIHRoZSB1c2VyIGluIGEgcGVyc2lzdGVuY2UgdGhhdCBkb2VzIHN1cHBvcnQgbWlncmF0aW9uLCB1c2VcclxuICAgICAgICAvLyB0aGF0IG1pZ3JhdGlvbiBwYXRoIChvZiBvbmx5IHBlcnNpc3RlbmNlcyB0aGF0IHN1cHBvcnQgbWlncmF0aW9uKVxyXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkhpZXJhcmNoeSA9IGF2YWlsYWJsZVBlcnNpc3RlbmNlcy5maWx0ZXIocCA9PiBwLl9zaG91bGRBbGxvd01pZ3JhdGlvbik7XHJcbiAgICAgICAgLy8gSWYgdGhlIHBlcnNpc3RlbmNlIGRvZXMgX25vdF8gYWxsb3cgbWlncmF0aW9uLCBqdXN0IGZpbmlzaCBvZmYgaGVyZVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRQZXJzaXN0ZW5jZS5fc2hvdWxkQWxsb3dNaWdyYXRpb24gfHxcclxuICAgICAgICAgICAgIW1pZ3JhdGlvbkhpZXJhcmNoeS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxlY3RlZFBlcnNpc3RlbmNlID0gbWlncmF0aW9uSGllcmFyY2h5WzBdO1xyXG4gICAgICAgIGlmICh1c2VyVG9NaWdyYXRlKSB7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgbm9ybWFsbHkgc2hvdWxkbid0IHRocm93IHNpbmNlIGNob3NlblBlcnNpc3RlbmNlLmlzQXZhaWxhYmxlKCkgaXMgdHJ1ZSwgYnV0IGlmIGl0IGRvZXNcclxuICAgICAgICAgICAgLy8gd2UnbGwganVzdCBsZXQgaXQgYnViYmxlIHRvIHN1cmZhY2UgdGhlIGVycm9yLlxyXG4gICAgICAgICAgICBhd2FpdCBzZWxlY3RlZFBlcnNpc3RlbmNlLl9zZXQoa2V5LCB1c2VyVG9NaWdyYXRlLnRvSlNPTigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBjbGVhciB0aGUga2V5IGluIG90aGVyIHBlcnNpc3RlbmNlcyBidXQgaWdub3JlIGVycm9ycy4gVGhpcyBoZWxwcyBwcmV2ZW50IGlzc3Vlc1xyXG4gICAgICAgIC8vIHN1Y2ggYXMgdXNlcnMgZ2V0dGluZyBzdHVjayB3aXRoIGEgcHJldmlvdXMgYWNjb3VudCBhZnRlciBzaWduaW5nIG91dCBhbmQgcmVmcmVzaGluZyB0aGUgdGFiLlxyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBlcnNpc3RlbmNlSGllcmFyY2h5Lm1hcChhc3luYyAocGVyc2lzdGVuY2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBlcnNpc3RlbmNlLl9yZW1vdmUoa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkgeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgdGhlIGJyb3dzZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBvcnRpbmcgdXNhZ2UgdG8gdGhlIEFQSVxyXG4gKi9cclxuZnVuY3Rpb24gX2dldEJyb3dzZXJOYW1lKHVzZXJBZ2VudCkge1xyXG4gICAgY29uc3QgdWEgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmICh1YS5pbmNsdWRlcygnb3BlcmEvJykgfHwgdWEuaW5jbHVkZXMoJ29wci8nKSB8fCB1YS5pbmNsdWRlcygnb3Bpb3MvJykpIHtcclxuICAgICAgICByZXR1cm4gXCJPcGVyYVwiIC8qIE9QRVJBICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzSUVNb2JpbGUodWEpKSB7XHJcbiAgICAgICAgLy8gV2luZG93cyBwaG9uZSBJRU1vYmlsZSBicm93c2VyLlxyXG4gICAgICAgIHJldHVybiBcIklFTW9iaWxlXCIgLyogSUVNT0JJTEUgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh1YS5pbmNsdWRlcygnbXNpZScpIHx8IHVhLmluY2x1ZGVzKCd0cmlkZW50LycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiSUVcIiAvKiBJRSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdlZGdlLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiRWRnZVwiIC8qIEVER0UgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNGaXJlZm94KHVhKSkge1xyXG4gICAgICAgIHJldHVybiBcIkZpcmVmb3hcIiAvKiBGSVJFRk9YICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodWEuaW5jbHVkZXMoJ3NpbGsvJykpIHtcclxuICAgICAgICByZXR1cm4gXCJTaWxrXCIgLyogU0lMSyAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc0JsYWNrQmVycnkodWEpKSB7XHJcbiAgICAgICAgLy8gQmxhY2tiZXJyeSBicm93c2VyLlxyXG4gICAgICAgIHJldHVybiBcIkJsYWNrYmVycnlcIiAvKiBCTEFDS0JFUlJZICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzV2ViT1ModWEpKSB7XHJcbiAgICAgICAgLy8gV2ViT1MgZGVmYXVsdCBicm93c2VyLlxyXG4gICAgICAgIHJldHVybiBcIldlYm9zXCIgLyogV0VCT1MgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNTYWZhcmkodWEpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiU2FmYXJpXCIgLyogU0FGQVJJICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoKHVhLmluY2x1ZGVzKCdjaHJvbWUvJykgfHwgX2lzQ2hyb21lSU9TKHVhKSkgJiZcclxuICAgICAgICAhdWEuaW5jbHVkZXMoJ2VkZ2UvJykpIHtcclxuICAgICAgICByZXR1cm4gXCJDaHJvbWVcIiAvKiBDSFJPTUUgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNBbmRyb2lkKHVhKSkge1xyXG4gICAgICAgIC8vIEFuZHJvaWQgc3RvY2sgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJBbmRyb2lkXCIgLyogQU5EUk9JRCAqLztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIE1vc3QgbW9kZXJuIGJyb3dzZXJzIGhhdmUgbmFtZS92ZXJzaW9uIGF0IGVuZCBvZiB1c2VyIGFnZW50IHN0cmluZy5cclxuICAgICAgICBjb25zdCByZSA9IC8oW2EtekEtWlxcZFxcLl0rKVxcL1thLXpBLVpcXGRcXC5dKiQvO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB1c2VyQWdlbnQubWF0Y2gocmUpO1xyXG4gICAgICAgIGlmICgobWF0Y2hlcyA9PT0gbnVsbCB8fCBtYXRjaGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtYXRjaGVzLmxlbmd0aCkgPT09IDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNbMV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiT3RoZXJcIiAvKiBPVEhFUiAqLztcclxufVxyXG5mdW5jdGlvbiBfaXNGaXJlZm94KHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9maXJlZm94XFwvL2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzU2FmYXJpKHVzZXJBZ2VudCA9IGdldFVBKCkpIHtcclxuICAgIGNvbnN0IHVhID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gKHVhLmluY2x1ZGVzKCdzYWZhcmkvJykgJiZcclxuICAgICAgICAhdWEuaW5jbHVkZXMoJ2Nocm9tZS8nKSAmJlxyXG4gICAgICAgICF1YS5pbmNsdWRlcygnY3Jpb3MvJykgJiZcclxuICAgICAgICAhdWEuaW5jbHVkZXMoJ2FuZHJvaWQnKSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzQ2hyb21lSU9TKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9jcmlvc1xcLy9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lFTW9iaWxlKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9pZW1vYmlsZS9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0FuZHJvaWQodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gL2FuZHJvaWQvaS50ZXN0KHVhKTtcclxufVxyXG5mdW5jdGlvbiBfaXNCbGFja0JlcnJ5KHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9ibGFja2JlcnJ5L2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzV2ViT1ModWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gL3dlYm9zL2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzSU9TKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9pcGhvbmV8aXBhZHxpcG9kL2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzSU9TN09yOCh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAoLyhpUGFkfGlQaG9uZXxpUG9kKS4qT1MgN19cXGQvaS50ZXN0KHVhKSB8fFxyXG4gICAgICAgIC8oaVBhZHxpUGhvbmV8aVBvZCkuKk9TIDhfXFxkL2kudGVzdCh1YSkpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lPU1N0YW5kYWxvbmUodWEgPSBnZXRVQSgpKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gX2lzSU9TKHVhKSAmJiAhISgoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhbmRhbG9uZSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzSUUxMCgpIHtcclxuICAgIHJldHVybiBpc0lFKCkgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAxMDtcclxufVxyXG5mdW5jdGlvbiBfaXNNb2JpbGVCcm93c2VyKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IGdldEJyb3dzZXJOYW1lIGVxdWl2YWxlbnQgZm9yIE9TLlxyXG4gICAgcmV0dXJuIChfaXNJT1ModWEpIHx8XHJcbiAgICAgICAgX2lzQW5kcm9pZCh1YSkgfHxcclxuICAgICAgICBfaXNXZWJPUyh1YSkgfHxcclxuICAgICAgICBfaXNCbGFja0JlcnJ5KHVhKSB8fFxyXG4gICAgICAgIC93aW5kb3dzIHBob25lL2kudGVzdCh1YSkgfHxcclxuICAgICAgICBfaXNJRU1vYmlsZSh1YSkpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lmcmFtZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY3VycmVudCB3aW5kb3cgaXMgbm90IHRoZSB0b3Agd2luZG93LlxyXG4gICAgICAgIC8vIElmIHNvLCByZXR1cm4gdHJ1ZS5cclxuICAgICAgICByZXR1cm4gISEod2luZG93ICYmIHdpbmRvdyAhPT0gd2luZG93LnRvcCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKlxyXG4gKiBEZXRlcm1pbmUgdGhlIFNESyB2ZXJzaW9uIHN0cmluZ1xyXG4gKi9cclxuZnVuY3Rpb24gX2dldENsaWVudFZlcnNpb24oY2xpZW50UGxhdGZvcm0sIGZyYW1ld29ya3MgPSBbXSkge1xyXG4gICAgbGV0IHJlcG9ydGVkUGxhdGZvcm07XHJcbiAgICBzd2l0Y2ggKGNsaWVudFBsYXRmb3JtKSB7XHJcbiAgICAgICAgY2FzZSBcIkJyb3dzZXJcIiAvKiBCUk9XU0VSICovOlxyXG4gICAgICAgICAgICAvLyBJbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIHJlcG9ydCB0aGUgYnJvd3NlciBuYW1lLlxyXG4gICAgICAgICAgICByZXBvcnRlZFBsYXRmb3JtID0gX2dldEJyb3dzZXJOYW1lKGdldFVBKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiV29ya2VyXCIgLyogV09SS0VSICovOlxyXG4gICAgICAgICAgICAvLyBUZWNobmljYWxseSBhIHdvcmtlciBydW5zIGZyb20gYSBicm93c2VyIGJ1dCB3ZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgYVxyXG4gICAgICAgICAgICAvLyB3b3JrZXIgZnJvbSBhIGJyb3dzZXIuXHJcbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBDaHJvbWUtV29ya2VyL0pzQ29yZS80LjkuMS9GaXJlYmFzZUNvcmUtd2ViLlxyXG4gICAgICAgICAgICByZXBvcnRlZFBsYXRmb3JtID0gYCR7X2dldEJyb3dzZXJOYW1lKGdldFVBKCkpfS0ke2NsaWVudFBsYXRmb3JtfWA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJlcG9ydGVkUGxhdGZvcm0gPSBjbGllbnRQbGF0Zm9ybTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcG9ydGVkRnJhbWV3b3JrcyA9IGZyYW1ld29ya3MubGVuZ3RoXHJcbiAgICAgICAgPyBmcmFtZXdvcmtzLmpvaW4oJywnKVxyXG4gICAgICAgIDogJ0ZpcmViYXNlQ29yZS13ZWInOyAvKiBkZWZhdWx0IHZhbHVlIGlmIG5vIG90aGVyIGZyYW1ld29yayBpcyB1c2VkICovXHJcbiAgICByZXR1cm4gYCR7cmVwb3J0ZWRQbGF0Zm9ybX0vJHtcIkpzQ29yZVwiIC8qIENPUkUgKi99LyR7U0RLX1ZFUlNJT059LyR7cmVwb3J0ZWRGcmFtZXdvcmtzfWA7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgQXV0aEltcGwge1xyXG4gICAgY29uc3RydWN0b3IoYXBwLCBjb25maWcpIHtcclxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmVtdWxhdG9yQ29uZmlnID0gbnVsbDtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0ZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24odGhpcyk7XHJcbiAgICAgICAgdGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICB0aGlzLnJlZGlyZWN0VXNlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gQW55IG5ldHdvcmsgY2FsbHMgd2lsbCBzZXQgdGhpcyB0byB0cnVlIGFuZCBwcmV2ZW50IHN1YnNlcXVlbnQgZW11bGF0b3JcclxuICAgICAgICAvLyBpbml0aWFsaXphdGlvblxyXG4gICAgICAgIHRoaXMuX2NhbkluaXRFbXVsYXRvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXJyb3JGYWN0b3J5ID0gX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZO1xyXG4gICAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub3RpZmllZCBVSUQgZm9yIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMgdG8gcHJldmVudFxyXG4gICAgICAgIC8vIHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBjYWxsYmFja3MuIFVuZGVmaW5lZCBtZWFucyBpdCdzIG5ldmVyIGJlZW5cclxuICAgICAgICAvLyBjYWxsZWQsIHdoZXJlYXMgbnVsbCBtZWFucyBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYSBzaWduZWQgb3V0IHVzZXJcclxuICAgICAgICB0aGlzLmxhc3ROb3RpZmllZFVpZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHsgYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nOiBmYWxzZSB9O1xyXG4gICAgICAgIHRoaXMuZnJhbWV3b3JrcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGFwcC5uYW1lO1xyXG4gICAgICAgIHRoaXMuY2xpZW50VmVyc2lvbiA9IGNvbmZpZy5zZGtDbGllbnRWZXJzaW9uO1xyXG4gICAgfVxyXG4gICAgX2luaXRpYWxpemVXaXRoUGVyc2lzdGVuY2UocGVyc2lzdGVuY2VIaWVyYXJjaHksIHBvcHVwUmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIGlmIChwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyID0gX2dldEluc3RhbmNlKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGFwcCBkZWxldGlvbiB0aHJvdWdob3V0IGluaXRpYWxpemF0aW9uIChhZnRlciBlYWNoXHJcbiAgICAgICAgLy8gcHJvbWlzZSByZXNvbHV0aW9uKVxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2VNYW5hZ2VyID0gYXdhaXQgUGVyc2lzdGVuY2VVc2VyTWFuYWdlci5jcmVhdGUodGhpcywgcGVyc2lzdGVuY2VIaWVyYXJjaHkpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHJlc29sdmVyIGVhcmx5IGlmIG5lY2Vzc2FyeSAob25seSBhcHBsaWNhYmxlIHRvIHdlYjpcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBpZnJhbWUgdG8gbG9hZCBpbW1lZGlhdGVseSBpbiBjZXJ0YWluIGNhc2VzKVxyXG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3Nob3VsZEluaXRQcm9hY3RpdmVseSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBmYWlscywgZG9uJ3QgaGFsdCBhdXRoIGxvYWRpbmdcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9pbml0aWFsaXplKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgLyogSWdub3JlIHRoZSBlcnJvciAqLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ3VycmVudFVzZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgICAgICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSAoKF9iID0gdGhpcy5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnVpZCkgfHwgbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgcGVyc2lzdGVuY2UgaXMgY2hhbmdlZCBpbiBhbm90aGVyIHdpbmRvdywgdGhlIHVzZXIgbWFuYWdlciB3aWxsIGxldCB1cyBrbm93XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIF9vblN0b3JhZ2VFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIgJiYgIXVzZXIpIHtcclxuICAgICAgICAgICAgLy8gTm8gY2hhbmdlLCBkbyBub3RoaW5nICh3YXMgc2lnbmVkIG91dCBhbmQgcmVtYWluZWQgc2lnbmVkIG91dCkuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgdGhlIHNhbWUgdXNlciBpcyB0byBiZSBzeW5jaHJvbml6ZWQuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdXNlciAmJiB0aGlzLmN1cnJlbnRVc2VyLnVpZCA9PT0gdXNlci51aWQpIHtcclxuICAgICAgICAgICAgLy8gRGF0YSB1cGRhdGUsIHNpbXBseSBjb3B5IGRhdGEgY2hhbmdlcy5cclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFVzZXIuX2Fzc2lnbih1c2VyKTtcclxuICAgICAgICAgICAgLy8gSWYgdG9rZW5zIGNoYW5nZWQgZnJvbSBwcmV2aW91cyB1c2VyIHRva2VucywgdGhpcyB3aWxsIHRyaWdnZXJcclxuICAgICAgICAgICAgLy8gbm90aWZ5QXV0aExpc3RlbmVyc18uXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBjdXJyZW50IEF1dGggc3RhdGUuIEVpdGhlciBhIG5ldyBsb2dpbiBvciBsb2dvdXQuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpbml0aWFsaXplQ3VycmVudFVzZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcGVuZGluZyByZWRpcmVjdCBldmVudC5cclxuICAgICAgICBsZXQgc3RvcmVkVXNlciA9IChhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UuZ2V0Q3VycmVudFVzZXIoKSk7XHJcbiAgICAgICAgaWYgKHBvcHVwUmVkaXJlY3RSZXNvbHZlciAmJiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVc2VyRXZlbnRJZCA9IChfYSA9IHRoaXMucmVkaXJlY3RVc2VyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVXNlckV2ZW50SWQgPSBzdG9yZWRVc2VyID09PSBudWxsIHx8IHN0b3JlZFVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3JlZFVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cnlSZWRpcmVjdFNpZ25Jbihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIHVzZXIgKGkuZS4gdGhlIG9sZCBcImN1cnJlbnRVc2VyXCIpIGhhcyBhIHJlZGlyZWN0SWQgdGhhdFxyXG4gICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSByZWRpcmVjdCB1c2VyLCB0aGVuIHdlIHdhbnQgdG8gaW5pdGlhbGx5IHNpZ24gaW4gd2l0aCB0aGVcclxuICAgICAgICAgICAgLy8gbmV3IHVzZXIgb2JqZWN0IGZyb20gcmVzdWx0LlxyXG4gICAgICAgICAgICAvLyBUT0RPKHNhbWdobyk6IE1vcmUgdGhvcm91Z2hseSB0ZXN0IGFsbCBvZiB0aGlzXHJcbiAgICAgICAgICAgIGlmICgoIXJlZGlyZWN0VXNlckV2ZW50SWQgfHwgcmVkaXJlY3RVc2VyRXZlbnRJZCA9PT0gc3RvcmVkVXNlckV2ZW50SWQpICYmXHJcbiAgICAgICAgICAgICAgICAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0LnVzZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9yZWRVc2VyID0gcmVzdWx0LnVzZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm8gdXNlciBpbiBwZXJzaXN0ZW5jZSwgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLiBTZXQgdG8gbnVsbC5cclxuICAgICAgICBpZiAoIXN0b3JlZFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzdG9yZWRVc2VyLl9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBhIHJlZGlyZWN0IHVzZXIsIHdlIGNhbiByZWxvYWQgYW5kIGJhaWxcclxuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gY2F0Y2ggdGhlIHJlZGlyZWN0ZWQgdXNlciwgaWYgYXZhaWxhYmxlLCBhcyB0aGF0IG1ldGhvZFxyXG4gICAgICAgICAgICAvLyBzdHJpcHMgdGhlIF9yZWRpcmVjdEV2ZW50SWRcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKHN0b3JlZFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfYXNzZXJ0KHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciwgdGhpcywgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKCk7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHVzZXIncyBldmVudCBJRCBtYXRjaGVzIHRoZSBjdXJyZW50IHVzZXIncyBldmVudCBJRCxcclxuICAgICAgICAvLyBETyBOT1QgcmVsb2FkIHRoZSBjdXJyZW50IHVzZXIsIG90aGVyd2lzZSB0aGV5J2xsIGJlIGNsZWFyZWQgZnJvbSBzdG9yYWdlLlxyXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoKSBmbG93LlxyXG4gICAgICAgIGlmICh0aGlzLnJlZGlyZWN0VXNlciAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXNlci5fcmVkaXJlY3RFdmVudElkID09PSBzdG9yZWRVc2VyLl9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihzdG9yZWRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKHN0b3JlZFVzZXIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdHJ5UmVkaXJlY3RTaWduSW4ocmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIC8vIFRoZSByZWRpcmVjdCB1c2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQgKGFuZCBzaWduZWQgaW4gaWYgYXZhaWxhYmxlKVxyXG4gICAgICAgIC8vIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uLiBBbGwgb2YgdGhlIG5vcm1hbCBzaWduIGluIGFuZCBsaW5rL3JlYXV0aFxyXG4gICAgICAgIC8vIGZsb3dzIGNhbGwgYmFjayBpbnRvIGF1dGggYW5kIHB1c2ggdGhpbmdzIG9udG8gdGhlIHByb21pc2UgcXVldWUuIFdlXHJcbiAgICAgICAgLy8gbmVlZCB0byBhd2FpdCB0aGUgcmVzdWx0IG9mIHRoZSByZWRpcmVjdCBzaWduIGluICppbnNpZGUgdGhlIHByb21pc2VcclxuICAgICAgICAvLyBxdWV1ZSouIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiB3ZSBydW4gaW50byBkZWFkbG9jay4gU2VlOlxyXG4gICAgICAgIC8vICAgIOKUjD4gW0luaXRpYWxpemF0aW9uXSDilIDilIDilIDilIDilIDilJBcclxuICAgICAgICAvLyAgICDilIw+IFs8b3RoZXIgcXVldWUgdGFza3M+XSDilIJcclxuICAgICAgICAvLyAgICDilJTilIAgW2dldFJlZGlyZWN0UmVzdWx0XSA84pSA4pSYXHJcbiAgICAgICAgLy8gICAgd2hlcmUgW10gYXJlIHRhc2tzIG9uIHRoZSBxdWV1ZSBhbmQgYXJyb3dzIGRlbm90ZSBhd2FpdHNcclxuICAgICAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIG5ldmVyIGNvbXBsZXRlIGJlY2F1c2UgaXQncyB3YWl0aW5nIG9uIHNvbWV0aGluZ1xyXG4gICAgICAgIC8vIHRoYXQncyB3YWl0aW5nIGZvciBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSFcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIEluc3RlYWQsIHRoaXMgbWV0aG9kIGNhbGxzIGdldFJlZGlyZWN0UmVzdWx0KCkgKHN0b3JlZCBpblxyXG4gICAgICAgIC8vIF9jb21wbGV0ZVJlZGlyZWN0Rm4pIHdpdGggYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgaW5zdHJ1Y3RzIGFsbCBvZlxyXG4gICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGF1dGggb3BlcmF0aW9ucyB0byBza2lwIGFueXRoaW5nIHRoYXQgbXV0YXRlcyBhdXRoIHN0YXRlLlxyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyIGlzIHNldCBzaW5jZSByZWRpcmVjdFJlc29sdmVyXHJcbiAgICAgICAgICAgIC8vIGlzIHBhc3NlZCBpbi4gVGhlIF9jb21wbGV0ZVJlZGlyZWN0Rm4gZXhwZWN0cyB0aGUgdW53cmFwcGVkIGV4dGVybi5cclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9jb21wbGV0ZVJlZGlyZWN0Rm4odGhpcywgcmVkaXJlY3RSZXNvbHZlciwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFN3YWxsb3cgYW55IGVycm9ycyBoZXJlOyB0aGUgY29kZSBjYW4gcmV0cmlldmUgdGhlbSBpblxyXG4gICAgICAgICAgICAvLyBnZXRSZWRpcmVjdFJlc3VsdCgpLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIodXNlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBgYXV0aC8ke1wibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi99YCkge1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nJ3Mgd3Jvbmcgd2l0aCB0aGUgdXNlcidzIHRva2VuLiBMb2cgdGhlbSBvdXQgYW5kIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgLy8gdGhlbSBmcm9tIHN0b3JhZ2VcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyKTtcclxuICAgIH1cclxuICAgIHVzZURldmljZUxhbmd1YWdlKCkge1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX2dldFVzZXJMYW5ndWFnZSgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2RlbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLl9kZWxldGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIHVwZGF0ZUN1cnJlbnRVc2VyKHVzZXJFeHRlcm4pIHtcclxuICAgICAgICAvLyBUaGUgcHVibGljIHVwZGF0ZUN1cnJlbnRVc2VyIG1ldGhvZCBuZWVkcyB0byBtYWtlIGEgY29weSBvZiB0aGUgdXNlcixcclxuICAgICAgICAvLyBhbmQgYWxzbyBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IG1hdGNoZXNcclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlckV4dGVyblxyXG4gICAgICAgICAgICA/IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyRXh0ZXJuKVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh1c2VyLmF1dGguY29uZmlnLmFwaUtleSA9PT0gdGhpcy5jb25maWcuYXBpS2V5LCB0aGlzLCBcImludmFsaWQtdXNlci10b2tlblwiIC8qIElOVkFMSURfQVVUSCAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyICYmIHVzZXIuX2Nsb25lKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF91cGRhdGVDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHRoaXMudGVuYW50SWQgPT09IHVzZXIudGVuYW50SWQsIHRoaXMsIFwidGVuYW50LWlkLW1pc21hdGNoXCIgLyogVEVOQU5UX0lEX01JU01BVENIICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QXV0aExpc3RlbmVycygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbk91dCgpIHtcclxuICAgICAgICAvLyBDbGVhciB0aGUgcmVkaXJlY3QgdXNlciB3aGVuIHNpZ25PdXQgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgfHwgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldFJlZGlyZWN0VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUN1cnJlbnRVc2VyKG51bGwpO1xyXG4gICAgfVxyXG4gICAgc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5zZXRQZXJzaXN0ZW5jZShfZ2V0SW5zdGFuY2UocGVyc2lzdGVuY2UpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9nZXRQZXJzaXN0ZW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnR5cGU7XHJcbiAgICB9XHJcbiAgICBfdXBkYXRlRXJyb3JNYXAoZXJyb3JNYXApIHtcclxuICAgICAgICB0aGlzLl9lcnJvckZhY3RvcnkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhdXRoJywgJ0ZpcmViYXNlJywgZXJyb3JNYXAoKSk7XHJcbiAgICB9XHJcbiAgICBvbkF1dGhTdGF0ZUNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIodGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24sIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKTtcclxuICAgIH1cclxuICAgIG9uSWRUb2tlbkNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIodGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFwaUtleTogdGhpcy5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgICAgICBhdXRoRG9tYWluOiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluLFxyXG4gICAgICAgICAgICBhcHBOYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRVc2VyOiAoX2EgPSB0aGlzLl9jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvSlNPTigpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9zZXRSZWRpcmVjdFVzZXIodXNlciwgcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RNYW5hZ2VyID0gYXdhaXQgdGhpcy5nZXRPckluaXRSZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgIHJldHVybiB1c2VyID09PSBudWxsXHJcbiAgICAgICAgICAgID8gcmVkaXJlY3RNYW5hZ2VyLnJlbW92ZUN1cnJlbnRVc2VyKClcclxuICAgICAgICAgICAgOiByZWRpcmVjdE1hbmFnZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRPckluaXRSZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyO1xyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc29sdmVyLCB0aGlzLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyID0gYXdhaXQgUGVyc2lzdGVuY2VVc2VyTWFuYWdlci5jcmVhdGUodGhpcywgW19nZXRJbnN0YW5jZShyZXNvbHZlci5fcmVkaXJlY3RQZXJzaXN0ZW5jZSldLCBcInJlZGlyZWN0VXNlclwiIC8qIFJFRElSRUNUX1VTRVIgKi8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXNlciA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlZGlyZWN0VXNlckZvcklkKGlkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UndmUgY2xlYXJlZCBhbnkgcGVuZGluZyBwZXJzaXN0ZW5jZSBhY3Rpb25zIGlmIHdlJ3JlIG5vdCBpblxyXG4gICAgICAgIC8vIHRoZSBpbml0aWFsaXplclxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUoYXN5bmMgKCkgPT4geyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLl9jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9yZWRpcmVjdEV2ZW50SWQpID09PSBpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFVzZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoKF9iID0gdGhpcy5yZWRpcmVjdFVzZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5fcmVkaXJlY3RFdmVudElkKSA9PT0gaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RVc2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGFzeW5jIF9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIgPT09IHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogTm90aWZpZXMgbGlzdGVuZXJzIG9ubHkgaWYgdGhlIHVzZXIgaXMgY3VycmVudCAqL1xyXG4gICAgX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VyKSB7XHJcbiAgICAgICAgaWYgKHVzZXIgPT09IHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlBdXRoTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2tleSgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXV0aERvbWFpbn06JHt0aGlzLmNvbmZpZy5hcGlLZXl9OiR7dGhpcy5uYW1lfWA7XHJcbiAgICB9XHJcbiAgICBfc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFVzZXIuX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLmlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB1c2VyIGNhc3QgYXMgdGhlIGludGVybmFsIHR5cGUgKi9cclxuICAgIGdldCBfY3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXI7XHJcbiAgICB9XHJcbiAgICBub3RpZnlBdXRoTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uLm5leHQodGhpcy5jdXJyZW50VXNlcik7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVpZCA9IChfYiA9IChfYSA9IHRoaXMuY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51aWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdE5vdGlmaWVkVWlkICE9PSBjdXJyZW50VWlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5vdGlmaWVkVWlkID0gY3VycmVudFVpZDtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZWdpc3RlclN0YXRlTGlzdGVuZXIoc3Vic2NyaXB0aW9uLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNiID0gdHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nXHJcbiAgICAgICAgICAgID8gbmV4dE9yT2JzZXJ2ZXJcclxuICAgICAgICAgICAgOiBuZXh0T3JPYnNlcnZlci5uZXh0LmJpbmQobmV4dE9yT2JzZXJ2ZXIpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLl9pc0luaXRpYWxpemVkXHJcbiAgICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcclxuICAgICAgICAgICAgOiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XHJcbiAgICAgICAgX2Fzc2VydChwcm9taXNlLCB0aGlzLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIC8vIFRoZSBjYWxsYmFjayBuZWVkcyB0byBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgcGVyIHRoZSBzcGVjLlxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4gY2IodGhpcy5jdXJyZW50VXNlcikpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmFkZE9ic2VydmVyKG5leHRPck9ic2VydmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVucHJvdGVjdGVkIChmcm9tIHJhY2UgY29uZGl0aW9ucykgbWV0aG9kIHRvIHNldCB0aGUgY3VycmVudCB1c2VyLiBUaGlzXHJcbiAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBxdWV1ZWQgY2FsbGJhY2suIFRoaXMgaXMgbmVjZXNzYXJ5XHJcbiAgICAgKiBiZWNhdXNlIHRoZSBxdWV1ZSBzaG91bGRuJ3QgcmVseSBvbiBhbm90aGVyIHF1ZXVlZCBjYWxsYmFjay5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdGhpcy5jdXJyZW50VXNlciAhPT0gdXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICAgICAgaWYgKHVzZXIgJiYgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICB1c2VyLl9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2Uuc2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucmVtb3ZlQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBxdWV1ZShhY3Rpb24pIHtcclxuICAgICAgICAvLyBJbiBjYXNlIHNvbWV0aGluZyBlcnJvcnMsIHRoZSBjYWxsYmFjayBzdGlsbCBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyXHJcbiAgICAgICAgLy8gdG8ga2VlcCB0aGUgcHJvbWlzZSBjaGFpbiBhbGl2ZVxyXG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMub3BlcmF0aW9ucy50aGVuKGFjdGlvbiwgYWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFzc2VydGVkUGVyc2lzdGVuY2UoKSB7XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLnBlcnNpc3RlbmNlTWFuYWdlciwgdGhpcywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfbG9nRnJhbWV3b3JrKGZyYW1ld29yaykge1xyXG4gICAgICAgIGlmICghZnJhbWV3b3JrIHx8IHRoaXMuZnJhbWV3b3Jrcy5pbmNsdWRlcyhmcmFtZXdvcmspKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnB1c2goZnJhbWV3b3JrKTtcclxuICAgICAgICAvLyBTb3J0IGFscGhhYmV0aWNhbGx5IHNvIHRoYXQgXCJGaXJlYmFzZUNvcmUtd2ViLEZpcmViYXNlVUktd2ViXCIgYW5kXHJcbiAgICAgICAgLy8gXCJGaXJlYmFzZVVJLXdlYixGaXJlYmFzZUNvcmUtd2ViXCIgYXJlbid0IHZpZXdlZCBhcyBkaWZmZXJlbnQuXHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnNvcnQoKTtcclxuICAgICAgICB0aGlzLmNsaWVudFZlcnNpb24gPSBfZ2V0Q2xpZW50VmVyc2lvbih0aGlzLmNvbmZpZy5jbGllbnRQbGF0Zm9ybSwgdGhpcy5fZ2V0RnJhbWV3b3JrcygpKTtcclxuICAgIH1cclxuICAgIF9nZXRGcmFtZXdvcmtzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyYW1ld29ya3M7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0QWRkaXRpb25hbEhlYWRlcnMoKSB7XHJcbiAgICAgICAgLy8gQWRkaXRpb25hbCBoZWFkZXJzIG9uIGV2ZXJ5IHJlcXVlc3RcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICAgICBbXCJYLUNsaWVudC1WZXJzaW9uXCIgLyogWF9DTElFTlRfVkVSU0lPTiAqL106IHRoaXMuY2xpZW50VmVyc2lvbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh0aGlzLmFwcC5vcHRpb25zLmFwcElkKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbXCJYLUZpcmViYXNlLWdtcGlkXCIgLyogWF9GSVJFQkFTRV9HTVBJRCAqL10gPSB0aGlzLmFwcC5vcHRpb25zLmFwcElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH1cclxufVxyXG4vKipcclxuICogTWV0aG9kIHRvIGJlIHVzZWQgdG8gY2FzdCBkb3duIHRvIG91ciBwcml2YXRlIGltcGxtZW50YXRpb24gb2YgQXV0aC5cclxuICogSXQgd2lsbCBhbHNvIGhhbmRsZSB1bndyYXBwaW5nIGZyb20gdGhlIGNvbXBhdCB0eXBlIGlmIG5lY2Vzc2FyeVxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCBBdXRoIG9iamVjdCBwYXNzZWQgaW4gZnJvbSBkZXZlbG9wZXJcclxuICovXHJcbmZ1bmN0aW9uIF9jYXN0QXV0aChhdXRoKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xyXG59XHJcbi8qKiBIZWxwZXIgY2xhc3MgdG8gd3JhcCBzdWJzY3JpYmVyIGxvZ2ljICovXHJcbmNsYXNzIFN1YnNjcmlwdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFkZE9ic2VydmVyID0gY3JlYXRlU3Vic2NyaWJlKG9ic2VydmVyID0+ICh0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXIpKTtcclxuICAgIH1cclxuICAgIGdldCBuZXh0KCkge1xyXG4gICAgICAgIF9hc3NlcnQodGhpcy5vYnNlcnZlciwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVyLm5leHQuYmluZCh0aGlzLm9ic2VydmVyKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQ2hhbmdlcyB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEZpcmViYXNlIEF1dGggRW11bGF0b3IsIGluc3RlYWQgb2YgcHJvZHVjdGlvblxyXG4gKiBGaXJlYmFzZSBBdXRoIHNlcnZpY2VzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBmaXJzdCBjYWxsIHRvXHJcbiAqIHtAbGluayBpbml0aWFsaXplQXV0aH0uICBEbyBub3QgdXNlIHdpdGggcHJvZHVjdGlvbiBjcmVkZW50aWFscyBhcyBlbXVsYXRvclxyXG4gKiB0cmFmZmljIGlzIG5vdCBlbmNyeXB0ZWQuXHJcbiAqXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29ubmVjdEF1dGhFbXVsYXRvcihhdXRoLCAnaHR0cDovLzEyNy4wLjAuMTo5MDk5JywgeyBkaXNhYmxlV2FybmluZ3M6IHRydWUgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIGF0IHdoaWNoIHRoZSBlbXVsYXRvciBpcyBydW5uaW5nIChlZywgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5OScpLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBgb3B0aW9ucy5kaXNhYmxlV2FybmluZ3NgIGRlZmF1bHRzIHRvIGBmYWxzZWAuIFNldCBpdCB0b1xyXG4gKiBgdHJ1ZWAgdG8gZGlzYWJsZSB0aGUgd2FybmluZyBiYW5uZXIgYXR0YWNoZWQgdG8gdGhlIERPTS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gY29ubmVjdEF1dGhFbXVsYXRvcihhdXRoLCB1cmwsIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIF9hc3NlcnQoYXV0aEludGVybmFsLl9jYW5Jbml0RW11bGF0b3IsIGF1dGhJbnRlcm5hbCwgXCJlbXVsYXRvci1jb25maWctZmFpbGVkXCIgLyogRU1VTEFUT1JfQ09ORklHX0ZBSUxFRCAqLyk7XHJcbiAgICBfYXNzZXJ0KC9eaHR0cHM/OlxcL1xcLy8udGVzdCh1cmwpLCBhdXRoSW50ZXJuYWwsIFwiaW52YWxpZC1lbXVsYXRvci1zY2hlbWVcIiAvKiBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRSAqLyk7XHJcbiAgICBjb25zdCBkaXNhYmxlV2FybmluZ3MgPSAhIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzKTtcclxuICAgIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XHJcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IGV4dHJhY3RIb3N0QW5kUG9ydCh1cmwpO1xyXG4gICAgY29uc3QgcG9ydFN0ciA9IHBvcnQgPT09IG51bGwgPyAnJyA6IGA6JHtwb3J0fWA7XHJcbiAgICAvLyBBbHdheXMgcmVwbGFjZSBwYXRoIHdpdGggXCIvXCIgKGV2ZW4gaWYgaW5wdXQgdXJsIGhhZCBubyBwYXRoIGF0IGFsbCwgb3IgaGFkIGEgZGlmZmVyZW50IG9uZSkuXHJcbiAgICBhdXRoSW50ZXJuYWwuY29uZmlnLmVtdWxhdG9yID0geyB1cmw6IGAke3Byb3RvY29sfS8vJHtob3N0fSR7cG9ydFN0cn0vYCB9O1xyXG4gICAgYXV0aEludGVybmFsLnNldHRpbmdzLmFwcFZlcmlmaWNhdGlvbkRpc2FibGVkRm9yVGVzdGluZyA9IHRydWU7XHJcbiAgICBhdXRoSW50ZXJuYWwuZW11bGF0b3JDb25maWcgPSBPYmplY3QuZnJlZXplKHtcclxuICAgICAgICBob3N0LFxyXG4gICAgICAgIHBvcnQsXHJcbiAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLnJlcGxhY2UoJzonLCAnJyksXHJcbiAgICAgICAgb3B0aW9uczogT2JqZWN0LmZyZWV6ZSh7IGRpc2FibGVXYXJuaW5ncyB9KVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWRpc2FibGVXYXJuaW5ncykge1xyXG4gICAgICAgIGVtaXRFbXVsYXRvcldhcm5pbmcoKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wodXJsKSB7XHJcbiAgICBjb25zdCBwcm90b2NvbEVuZCA9IHVybC5pbmRleE9mKCc6Jyk7XHJcbiAgICByZXR1cm4gcHJvdG9jb2xFbmQgPCAwID8gJycgOiB1cmwuc3Vic3RyKDAsIHByb3RvY29sRW5kICsgMSk7XHJcbn1cclxuZnVuY3Rpb24gZXh0cmFjdEhvc3RBbmRQb3J0KHVybCkge1xyXG4gICAgY29uc3QgcHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2wodXJsKTtcclxuICAgIGNvbnN0IGF1dGhvcml0eSA9IC8oXFwvXFwvKT8oW14/Iy9dKykvLmV4ZWModXJsLnN1YnN0cihwcm90b2NvbC5sZW5ndGgpKTsgLy8gQmV0d2VlbiAvLyBhbmQgLywgPyBvciAjLlxyXG4gICAgaWYgKCFhdXRob3JpdHkpIHtcclxuICAgICAgICByZXR1cm4geyBob3N0OiAnJywgcG9ydDogbnVsbCB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgaG9zdEFuZFBvcnQgPSBhdXRob3JpdHlbMl0uc3BsaXQoJ0AnKS5wb3AoKSB8fCAnJzsgLy8gU3RyaXAgb3V0IFwidXNlcm5hbWU6cGFzc3dvcmRAXCIuXHJcbiAgICBjb25zdCBicmFja2V0ZWRJUHY2ID0gL14oXFxbW15cXF1dK1xcXSkoOnwkKS8uZXhlYyhob3N0QW5kUG9ydCk7XHJcbiAgICBpZiAoYnJhY2tldGVkSVB2Nikge1xyXG4gICAgICAgIGNvbnN0IGhvc3QgPSBicmFja2V0ZWRJUHY2WzFdO1xyXG4gICAgICAgIHJldHVybiB7IGhvc3QsIHBvcnQ6IHBhcnNlUG9ydChob3N0QW5kUG9ydC5zdWJzdHIoaG9zdC5sZW5ndGggKyAxKSkgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IFtob3N0LCBwb3J0XSA9IGhvc3RBbmRQb3J0LnNwbGl0KCc6Jyk7XHJcbiAgICAgICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VQb3J0KHBvcnQpIH07XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRTdHIpIHtcclxuICAgIGlmICghcG9ydFN0cikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0U3RyKTtcclxuICAgIGlmIChpc05hTihwb3J0KSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvcnQ7XHJcbn1cclxuZnVuY3Rpb24gZW1pdEVtdWxhdG9yV2FybmluZygpIHtcclxuICAgIGZ1bmN0aW9uIGF0dGFjaEJhbm5lcigpIHtcclxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICAgICBjb25zdCBzdHkgPSBlbC5zdHlsZTtcclxuICAgICAgICBlbC5pbm5lclRleHQgPVxyXG4gICAgICAgICAgICAnUnVubmluZyBpbiBlbXVsYXRvciBtb2RlLiBEbyBub3QgdXNlIHdpdGggcHJvZHVjdGlvbiBjcmVkZW50aWFscy4nO1xyXG4gICAgICAgIHN0eS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgc3R5LndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIHN0eS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZic7XHJcbiAgICAgICAgc3R5LmJvcmRlciA9ICcuMWVtIHNvbGlkICMwMDAwMDAnO1xyXG4gICAgICAgIHN0eS5jb2xvciA9ICcjYjUwMDAwJztcclxuICAgICAgICBzdHkuYm90dG9tID0gJzBweCc7XHJcbiAgICAgICAgc3R5LmxlZnQgPSAnMHB4JztcclxuICAgICAgICBzdHkubWFyZ2luID0gJzBweCc7XHJcbiAgICAgICAgc3R5LnpJbmRleCA9ICcxMDAwMCc7XHJcbiAgICAgICAgc3R5LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZpcmViYXNlLWVtdWxhdG9yLXdhcm5pbmcnKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuaW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnV0FSTklORzogWW91IGFyZSB1c2luZyB0aGUgQXV0aCBFbXVsYXRvciwnICtcclxuICAgICAgICAgICAgJyB3aGljaCBpcyBpbnRlbmRlZCBmb3IgbG9jYWwgdGVzdGluZyBvbmx5LiAgRG8gbm90IHVzZSB3aXRoJyArXHJcbiAgICAgICAgICAgICcgcHJvZHVjdGlvbiBjcmVkZW50aWFscy4nKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgYXR0YWNoQmFubmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF0dGFjaEJhbm5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIEF1dGhQcm92aWRlcn0uXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEltcGxlbWVudGF0aW9ucyBzcGVjaWZ5IHRoZSBkZXRhaWxzIGFib3V0IGVhY2ggYXV0aCBwcm92aWRlcidzIGNyZWRlbnRpYWwgcmVxdWlyZW1lbnRzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIElEIGZvciB0aGUgY3JlZGVudGlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIGV4YW1wbGUsICdmYWNlYm9vay5jb20nLCBvciAnZ29vZ2xlLmNvbScuXHJcbiAgICAgKi9cclxuICAgIHByb3ZpZGVySWQsIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gc2lnbiBpbiBtZXRob2QgZm9yIHRoZSBjcmVkZW50aWFsLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfUEFTU1dPUkQsIG9yXHJcbiAgICAgKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBzaWduLWluIG1ldGhvZFxyXG4gICAgICogaWRlbnRpZmllciBhcyByZXR1cm5lZCBpbiB7QGxpbmsgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWx9LlxyXG4gICAgICovXHJcbiAgICBzaWduSW5NZXRob2QpIHtcclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBwcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMuc2lnbkluTWV0aG9kID0gc2lnbkluTWV0aG9kO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldElkVG9rZW5SZXNwb25zZShfYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2xpbmtUb0lkVG9rZW4oX2F1dGgsIF9pZFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKF9hdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVzZXRQYXNzd29yZChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnJlc2V0UGFzc3dvcmRcIiAvKiBSRVNFVF9QQVNTV09SRCAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbFBhc3N3b3JkKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6dXBkYXRlXCIgLyogU0VUX0FDQ09VTlRfSU5GTyAqLywgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gYXBwbHlBY3Rpb25Db2RlJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czp1cGRhdGVcIiAvKiBTRVRfQUNDT1VOVF9JTkZPICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhQYXNzd29yZChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhQYXNzd29yZFwiIC8qIFNJR05fSU5fV0lUSF9QQVNTV09SRCAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNlbmRPb2JDb2RlXCIgLyogU0VORF9PT0JfQ09ERSAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzZW5kRW1haWxWZXJpZmljYXRpb24kMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QW5kQ2hhbmdlRW1haWwoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmskMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhFbWFpbExpbmtcIiAvKiBTSUdOX0lOX1dJVEhfRU1BSUxfTElOSyAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhFbWFpbExpbmtcIiAvKiBTSUdOX0lOX1dJVEhfRU1BSUxfTElOSyAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSBmb3JcclxuICoge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JEXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIENvdmVycyBib3RoIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxyXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBFbWFpbEF1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZW1haWwsIFxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3Bhc3N3b3JkLCBzaWduSW5NZXRob2QsIFxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3RlbmFudElkID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKFwicGFzc3dvcmRcIiAvKiBQQVNTV09SRCAqLywgc2lnbkluTWV0aG9kKTtcclxuICAgICAgICB0aGlzLl9lbWFpbCA9IF9lbWFpbDtcclxuICAgICAgICB0aGlzLl9wYXNzd29yZCA9IF9wYXNzd29yZDtcclxuICAgICAgICB0aGlzLl90ZW5hbnRJZCA9IF90ZW5hbnRJZDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbUVtYWlsQW5kUGFzc3dvcmQoZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBFbWFpbEF1dGhDcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCwgXCJwYXNzd29yZFwiIC8qIEVNQUlMX1BBU1NXT1JEICovKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbUVtYWlsQW5kQ29kZShlbWFpbCwgb29iQ29kZSwgdGVuYW50SWQgPSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBFbWFpbEF1dGhDcmVkZW50aWFsKGVtYWlsLCBvb2JDb2RlLCBcImVtYWlsTGlua1wiIC8qIEVNQUlMX0xJTksgKi8sIHRlbmFudElkKTtcclxuICAgIH1cclxuICAgIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAqL1xyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcclxuICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkLFxyXG4gICAgICAgICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZDogdGhpcy5fdGVuYW50SWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGRlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW50byBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIEVpdGhlciBgb2JqZWN0YCBvciB0aGUgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4gV2hlbiBzdHJpbmcgaXNcclxuICAgICAqIHByb3ZpZGVkLCBgSlNPTi5wYXJzZWAgd291bGQgYmUgY2FsbGVkIGZpcnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIElmIHRoZSBKU09OIGlucHV0IGRvZXMgbm90IHJlcHJlc2VudCBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xyXG4gICAgICAgIGlmICgob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmVtYWlsKSAmJiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLnBhc3N3b3JkKSkge1xyXG4gICAgICAgICAgICBpZiAob2JqLnNpZ25Jbk1ldGhvZCA9PT0gXCJwYXNzd29yZFwiIC8qIEVNQUlMX1BBU1NXT1JEICovKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJvbUVtYWlsQW5kUGFzc3dvcmQob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9iai5zaWduSW5NZXRob2QgPT09IFwiZW1haWxMaW5rXCIgLyogRU1BSUxfTElOSyAqLykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZENvZGUob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQsIG9iai50ZW5hbnRJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhc3luYyBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2lnbkluTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiIC8qIEVNQUlMX1BBU1NXT1JEICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhQYXNzd29yZChhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbExpbmtcIiAvKiBFTUFJTF9MSU5LICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhFbWFpbExpbmskMShhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXN5bmMgX2xpbmtUb0lkVG9rZW4oYXV0aCwgaWRUb2tlbikge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5zaWduSW5NZXRob2QpIHtcclxuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCIgLyogRU1BSUxfUEFTU1dPUkQgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRW1haWxQYXNzd29yZChhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSBcImVtYWlsTGlua1wiIC8qIEVNQUlMX0xJTksgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmcoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldElkVG9rZW5SZXNwb25zZShhdXRoKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aElkcFwiIC8qIFNJR05fSU5fV0lUSF9JRFAgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgSURQX1JFUVVFU1RfVVJJJDEgPSAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBPQXV0aCBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEltcGxlbWVudGF0aW9ucyBzcGVjaWZ5IHRoZSBkZXRhaWxzIGFib3V0IGVhY2ggYXV0aCBwcm92aWRlcidzIGNyZWRlbnRpYWwgcmVxdWlyZW1lbnRzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBPQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Rva2VuID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbVBhcmFtcyhwYXJhbXMpIHtcclxuICAgICAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLnNpZ25Jbk1ldGhvZCk7XHJcbiAgICAgICAgaWYgKHBhcmFtcy5pZFRva2VuIHx8IHBhcmFtcy5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICAvLyBPQXV0aCAyIGFuZCBlaXRoZXIgSUQgdG9rZW4gb3IgYWNjZXNzIHRva2VuLlxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmlkVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQuaWRUb2tlbiA9IHBhcmFtcy5pZFRva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQWRkIG5vbmNlIGlmIGF2YWlsYWJsZSBhbmQgbm8gcGVuZGluZ1Rva2VuIGlzIHByZXNlbnQuXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMubm9uY2UgJiYgIXBhcmFtcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQubm9uY2UgPSBwYXJhbXMubm9uY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcGFyYW1zLnBlbmRpbmdUb2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwYXJhbXMub2F1dGhUb2tlbiAmJiBwYXJhbXMub2F1dGhUb2tlblNlY3JldCkge1xyXG4gICAgICAgICAgICAvLyBPQXV0aCAxIGFuZCBPQXV0aCB0b2tlbiB3aXRoIHRva2VuIHNlY3JldFxyXG4gICAgICAgICAgICBjcmVkLmFjY2Vzc1Rva2VuID0gcGFyYW1zLm9hdXRoVG9rZW47XHJcbiAgICAgICAgICAgIGNyZWQuc2VjcmV0ID0gcGFyYW1zLm9hdXRoVG9rZW5TZWNyZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBfZmFpbChcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3JlZDtcclxuICAgIH1cclxuICAgIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAgKi9cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpZFRva2VuOiB0aGlzLmlkVG9rZW4sXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LFxyXG4gICAgICAgICAgICBub25jZTogdGhpcy5ub25jZSxcclxuICAgICAgICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBlbmRpbmdUb2tlbixcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxyXG4gICAgICAgICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW5cclxuICAgICAqIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBqc29uIC0gSW5wdXQgY2FuIGJlIGVpdGhlciBPYmplY3Qgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXHJcbiAgICAgKiBXaGVuIHN0cmluZyBpcyBwcm92aWRlZCwgSlNPTi5wYXJzZSB3b3VsZCBiZSBjYWxsZWQgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xyXG4gICAgICAgIGNvbnN0IHsgcHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kIH0gPSBvYmosIHJlc3QgPSBfX3Jlc3Qob2JqLCBbXCJwcm92aWRlcklkXCIsIFwic2lnbkluTWV0aG9kXCJdKTtcclxuICAgICAgICBpZiAoIXByb3ZpZGVySWQgfHwgIXNpZ25Jbk1ldGhvZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3JlZCA9IG5ldyBPQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kKTtcclxuICAgICAgICBjcmVkLmlkVG9rZW4gPSByZXN0LmlkVG9rZW4gfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSByZXN0LmFjY2Vzc1Rva2VuIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBjcmVkLnNlY3JldCA9IHJlc3Quc2VjcmV0O1xyXG4gICAgICAgIGNyZWQubm9uY2UgPSByZXN0Lm5vbmNlO1xyXG4gICAgICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcmVzdC5wZW5kaW5nVG9rZW4gfHwgbnVsbDtcclxuICAgICAgICByZXR1cm4gY3JlZDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2xpbmtUb0lkVG9rZW4oYXV0aCwgaWRUb2tlbikge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGgpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXF1ZXN0LmF1dG9DcmVhdGUgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIGJ1aWxkUmVxdWVzdCgpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICByZXF1ZXN0VXJpOiBJRFBfUkVRVUVTVF9VUkkkMSxcclxuICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdUb2tlbiA9IHRoaXMucGVuZGluZ1Rva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zdEJvZHkgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaWRUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcG9zdEJvZHlbJ2lkX3Rva2VuJ10gPSB0aGlzLmlkVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5WydhY2Nlc3NfdG9rZW4nXSA9IHRoaXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VjcmV0KSB7XHJcbiAgICAgICAgICAgICAgICBwb3N0Qm9keVsnb2F1dGhfdG9rZW5fc2VjcmV0J10gPSB0aGlzLnNlY3JldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwb3N0Qm9keVsncHJvdmlkZXJJZCddID0gdGhpcy5wcm92aWRlcklkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ub25jZSAmJiAhdGhpcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5Wydub25jZSddID0gdGhpcy5ub25jZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXF1ZXN0LnBvc3RCb2R5ID0gcXVlcnlzdHJpbmcocG9zdEJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2VuZFZlcmlmaWNhdGlvbkNvZGVcIiAvKiBTRU5EX1ZFUklGSUNBVElPTl9DT0RFICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhQaG9uZU51bWJlciQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBob25lTnVtYmVyXCIgLyogU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBob25lTnVtYmVyJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBob25lTnVtYmVyXCIgLyogU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxuICAgIGlmIChyZXNwb25zZS50ZW1wb3JhcnlQcm9vZikge1xyXG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgXCJhY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsXCIgLyogTkVFRF9DT05GSVJNQVRJT04gKi8sIHJlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxufVxyXG5jb25zdCBWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfID0ge1xyXG4gICAgW1wiVVNFUl9OT1RfRk9VTkRcIiAvKiBVU0VSX05PVF9GT1VORCAqL106IFwidXNlci1ub3QtZm91bmRcIiAvKiBVU0VSX0RFTEVURUQgKi9cclxufTtcclxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICBjb25zdCBhcGlSZXF1ZXN0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0KSwgeyBvcGVyYXRpb246ICdSRUFVVEgnIH0pO1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoUGhvbmVOdW1iZXJcIiAvKiBTSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgYXBpUmVxdWVzdCksIFZFUklGWV9QSE9ORV9OVU1CRVJfRk9SX0VYSVNUSU5HX0VSUk9SX01BUF8pO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBQaG9uZUF1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgc3VwZXIoXCJwaG9uZVwiIC8qIFBIT05FICovLCBcInBob25lXCIgLyogUEhPTkUgKi8pO1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tVmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQaG9uZUF1dGhDcmVkZW50aWFsKHsgdmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21Ub2tlblJlc3BvbnNlKHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7IHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoUGhvbmVOdW1iZXIkMShhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gbGlua1dpdGhQaG9uZU51bWJlciQxKGF1dGgsIE9iamVjdC5hc3NpZ24oeyBpZFRva2VuIH0sIHRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkpKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiB2ZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nKGF1dGgsIHRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkge1xyXG4gICAgICAgIGNvbnN0IHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyLCB2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSB9ID0gdGhpcy5wYXJhbXM7XHJcbiAgICAgICAgaWYgKHRlbXBvcmFyeVByb29mICYmIHBob25lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHRlbXBvcmFyeVByb29mLCBwaG9uZU51bWJlciB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZXNzaW9uSW5mbzogdmVyaWZpY2F0aW9uSWQsXHJcbiAgICAgICAgICAgIGNvZGU6IHZlcmlmaWNhdGlvbkNvZGVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICovXHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5waG9uZU51bWJlcikge1xyXG4gICAgICAgICAgICBvYmoucGhvbmVOdW1iZXIgPSB0aGlzLnBhcmFtcy5waG9uZU51bWJlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLnRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgICAgIG9iai50ZW1wb3JhcnlQcm9vZiA9IHRoaXMucGFyYW1zLnRlbXBvcmFyeVByb29mO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uQ29kZSkge1xyXG4gICAgICAgICAgICBvYmoudmVyaWZpY2F0aW9uQ29kZSA9IHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25JZCkge1xyXG4gICAgICAgICAgICBvYmoudmVyaWZpY2F0aW9uSWQgPSB0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25JZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIC8qKiBHZW5lcmF0ZXMgYSBwaG9uZSBjcmVkZW50aWFsIGJhc2VkIG9uIGEgcGxhaW4gb2JqZWN0IG9yIGEgSlNPTiBzdHJpbmcuICovXHJcbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUsIHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9ID0ganNvbjtcclxuICAgICAgICBpZiAoIXZlcmlmaWNhdGlvbkNvZGUgJiZcclxuICAgICAgICAgICAgIXZlcmlmaWNhdGlvbklkICYmXHJcbiAgICAgICAgICAgICFwaG9uZU51bWJlciAmJlxyXG4gICAgICAgICAgICAhdGVtcG9yYXJ5UHJvb2YpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7XHJcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbklkLFxyXG4gICAgICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxyXG4gICAgICAgICAgICBwaG9uZU51bWJlcixcclxuICAgICAgICAgICAgdGVtcG9yYXJ5UHJvb2ZcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogTWFwcyB0aGUgbW9kZSBzdHJpbmcgaW4gYWN0aW9uIGNvZGUgVVJMIHRvIEFjdGlvbiBDb2RlIEluZm8gb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0gbW9kZVxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VNb2RlKG1vZGUpIHtcclxuICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICAgIGNhc2UgJ3JlY292ZXJFbWFpbCc6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlJFQ09WRVJfRU1BSUxcIiAvKiBSRUNPVkVSX0VNQUlMICovO1xyXG4gICAgICAgIGNhc2UgJ3Jlc2V0UGFzc3dvcmQnOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJQQVNTV09SRF9SRVNFVFwiIC8qIFBBU1NXT1JEX1JFU0VUICovO1xyXG4gICAgICAgIGNhc2UgJ3NpZ25Jbic6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkVNQUlMX1NJR05JTlwiIC8qIEVNQUlMX1NJR05JTiAqLztcclxuICAgICAgICBjYXNlICd2ZXJpZnlFbWFpbCc6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlZFUklGWV9FTUFJTFwiIC8qIFZFUklGWV9FTUFJTCAqLztcclxuICAgICAgICBjYXNlICd2ZXJpZnlBbmRDaGFuZ2VFbWFpbCc6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXCIgLyogVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi87XHJcbiAgICAgICAgY2FzZSAncmV2ZXJ0U2Vjb25kRmFjdG9yQWRkaXRpb24nOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTlwiIC8qIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OICovO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gcGFyc2UgRkRMIGxpbmtzXHJcbiAqXHJcbiAqIEBwYXJhbSB1cmxcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRGVlcExpbmsodXJsKSB7XHJcbiAgICBjb25zdCBsaW5rID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKHVybCkpWydsaW5rJ107XHJcbiAgICAvLyBEb3VibGUgbGluayBjYXNlIChhdXRvbWF0aWMgcmVkaXJlY3QpLlxyXG4gICAgY29uc3QgZG91YmxlRGVlcExpbmsgPSBsaW5rXHJcbiAgICAgICAgPyBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcobGluaykpWydkZWVwX2xpbmtfaWQnXVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIC8vIGlPUyBjdXN0b20gc2NoZW1lIGxpbmtzLlxyXG4gICAgY29uc3QgaU9TRGVlcExpbmsgPSBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcodXJsKSlbJ2RlZXBfbGlua19pZCddO1xyXG4gICAgY29uc3QgaU9TRG91YmxlRGVlcExpbmsgPSBpT1NEZWVwTGlua1xyXG4gICAgICAgID8gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGlPU0RlZXBMaW5rKSlbJ2xpbmsnXVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIHJldHVybiBpT1NEb3VibGVEZWVwTGluayB8fCBpT1NEZWVwTGluayB8fCBkb3VibGVEZWVwTGluayB8fCBsaW5rIHx8IHVybDtcclxufVxyXG4vKipcclxuICogQSB1dGlsaXR5IGNsYXNzIHRvIHBhcnNlIGVtYWlsIGFjdGlvbiBVUkxzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQsIGVtYWlsIHZlcmlmaWNhdGlvbixcclxuICogZW1haWwgbGluayBzaWduIGluLCBldGMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIEFjdGlvbkNvZGVVUkwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTGluayAtIFRoZSBsaW5rIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgVVJMLlxyXG4gICAgICogQHJldHVybnMgVGhlIHtAbGluayBBY3Rpb25Db2RlVVJMfSBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxpbmsgaXMgaW52YWxpZC5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYWN0aW9uTGluaykge1xyXG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhhY3Rpb25MaW5rKSk7XHJcbiAgICAgICAgY29uc3QgYXBpS2V5ID0gKF9hID0gc2VhcmNoUGFyYW1zW1wiYXBpS2V5XCIgLyogQVBJX0tFWSAqL10pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IChfYiA9IHNlYXJjaFBhcmFtc1tcIm9vYkNvZGVcIiAvKiBDT0RFICovXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDtcclxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBwYXJzZU1vZGUoKF9jID0gc2VhcmNoUGFyYW1zW1wibW9kZVwiIC8qIE1PREUgKi9dKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBudWxsKTtcclxuICAgICAgICAvLyBWYWxpZGF0ZSBBUEkga2V5LCBjb2RlIGFuZCBtb2RlLlxyXG4gICAgICAgIF9hc3NlcnQoYXBpS2V5ICYmIGNvZGUgJiYgb3BlcmF0aW9uLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIHRoaXMuYXBpS2V5ID0gYXBpS2V5O1xyXG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgdGhpcy5jb250aW51ZVVybCA9IChfZCA9IHNlYXJjaFBhcmFtc1tcImNvbnRpbnVlVXJsXCIgLyogQ09OVElOVUVfVVJMICovXSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogbnVsbDtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IChfZSA9IHNlYXJjaFBhcmFtc1tcImxhbmd1YWdlQ29kZVwiIC8qIExBTkdVQUdFX0NPREUgKi9dKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBudWxsO1xyXG4gICAgICAgIHRoaXMudGVuYW50SWQgPSAoX2YgPSBzZWFyY2hQYXJhbXNbXCJ0ZW5hbnRJZFwiIC8qIFRFTkFOVF9JRCAqL10pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZiB0aGUgbGluayBpcyB2YWxpZCxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxpbmsgIC0gVGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZy5cclxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsaW5rIGlzIGludmFsaWQuXHJcbiAgICAgKlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VMaW5rKGxpbmspIHtcclxuICAgICAgICBjb25zdCBhY3Rpb25MaW5rID0gcGFyc2VEZWVwTGluayhsaW5rKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkNvZGVVUkwoYWN0aW9uTGluayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZlxyXG4gKiB0aGUgbGluayBpcyB2YWxpZCwgb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VBY3Rpb25Db2RlVVJMKGxpbmspIHtcclxuICAgIHJldHVybiBBY3Rpb25Db2RlVVJMLnBhcnNlTGluayhsaW5rKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcge0BsaW5rIEVtYWlsQXV0aENyZWRlbnRpYWx9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBFbWFpbEF1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5QQVNTV09SRCwgZXZlbiBmb3IgZW1haWwgbGluay5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBFbWFpbEF1dGhQcm92aWRlci5QUk9WSURFUl9JRDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZSBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IHVzaW5nIGFuIGVtYWlsIGFuZCBwYXNzd29yZC5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCk7XHJcbiAgICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZW1haWwgLSBFbWFpbCBhZGRyZXNzLlxyXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBhY2NvdW50IHBhc3N3b3JkLlxyXG4gICAgICogQHJldHVybnMgVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwoZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIEVtYWlsQXV0aENyZWRlbnRpYWwuX2Zyb21FbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgYW4gZW1haWwgbGluayBhZnRlciBhIHNpZ24gaW4gd2l0aFxyXG4gICAgICogZW1haWwgbGluayBvcGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKGF1dGgsIGVtYWlsLCBlbWFpbExpbmspO1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsIGVtYWlsKTtcclxuICAgICAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB1c2VyLlxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsLCBlbWFpbExpbmspO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHVzZWQgdG8gdmVyaWZ5IHRoZSBsaW5rLlxyXG4gICAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cclxuICAgICAqIEBwYXJhbSBlbWFpbExpbmsgLSBTaWduLWluIGVtYWlsIGxpbmsuXHJcbiAgICAgKiBAcmV0dXJucyAtIFRoZSBhdXRoIHByb3ZpZGVyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsV2l0aExpbmsoZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgICAgIGNvbnN0IGFjdGlvbkNvZGVVcmwgPSBBY3Rpb25Db2RlVVJMLnBhcnNlTGluayhlbWFpbExpbmspO1xyXG4gICAgICAgIF9hc3NlcnQoYWN0aW9uQ29kZVVybCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gRW1haWxBdXRoQ3JlZGVudGlhbC5fZnJvbUVtYWlsQW5kQ29kZShlbWFpbCwgYWN0aW9uQ29kZVVybC5jb2RlLCBhY3Rpb25Db2RlVXJsLnRlbmFudElkKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXHJcbiAqL1xyXG5FbWFpbEF1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IFwicGFzc3dvcmRcIiAvKiBQQVNTV09SRCAqLztcclxuLyoqXHJcbiAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfUEFTU1dPUkQuXHJcbiAqL1xyXG5FbWFpbEF1dGhQcm92aWRlci5FTUFJTF9QQVNTV09SRF9TSUdOX0lOX01FVEhPRCA9IFwicGFzc3dvcmRcIiAvKiBFTUFJTF9QQVNTV09SRCAqLztcclxuLyoqXHJcbiAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cclxuICovXHJcbkVtYWlsQXV0aFByb3ZpZGVyLkVNQUlMX0xJTktfU0lHTl9JTl9NRVRIT0QgPSBcImVtYWlsTGlua1wiIC8qIEVNQUlMX0xJTksgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIEZlZGVyYXRlZCBwcm92aWRlcnMgKE9BdXRoIChpbmNsdWRpbmcgT0lEQyksIFNBTUwpLlxyXG4gKlxyXG4gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdG9yIGZvciBnZW5lcmljIE9BdXRoIHByb3ZpZGVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFByb3ZpZGVyIGZvciB3aGljaCBjcmVkZW50aWFscyBzaG91bGQgYmUgZ2VuZXJhdGVkLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcklkKSB7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0TGFuZ3VhZ2VDb2RlID0gbnVsbDtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgdGhpcy5jdXN0b21QYXJhbWV0ZXJzID0ge307XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgbGFuZ3VhZ2UgZ29kZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIC0gbGFuZ3VhZ2UgY29kZVxyXG4gICAgICovXHJcbiAgICBzZXREZWZhdWx0TGFuZ3VhZ2UobGFuZ3VhZ2VDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0TGFuZ3VhZ2VDb2RlID0gbGFuZ3VhZ2VDb2RlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBPQXV0aCBjdXN0b20gcGFyYW1ldGVycyB0byBwYXNzIGluIGFuIE9BdXRoIHJlcXVlc3QgZm9yIHBvcHVwIGFuZCByZWRpcmVjdCBzaWduLWluXHJcbiAgICAgKiBvcGVyYXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBGb3IgYSBkZXRhaWxlZCBsaXN0LCBjaGVjayB0aGUgcmVzZXJ2ZWQgcmVxdWlyZWQgT0F1dGggMi4wIHBhcmFtZXRlcnMgc3VjaCBhcyBgY2xpZW50X2lkYCxcclxuICAgICAqIGByZWRpcmVjdF91cmlgLCBgc2NvcGVgLCBgcmVzcG9uc2VfdHlwZWAsIGFuZCBgc3RhdGVgIGFyZSBub3QgYWxsb3dlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjdXN0b21PQXV0aFBhcmFtZXRlcnMgLSBUaGUgY3VzdG9tIE9BdXRoIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiB0aGUgT0F1dGggcmVxdWVzdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q3VzdG9tUGFyYW1ldGVycyhjdXN0b21PQXV0aFBhcmFtZXRlcnMpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVBhcmFtZXRlcnMgPSBjdXN0b21PQXV0aFBhcmFtZXRlcnM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2Yge0BsaW5rIEN1c3RvbVBhcmFtZXRlcnN9LlxyXG4gICAgICovXHJcbiAgICBnZXRDdXN0b21QYXJhbWV0ZXJzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVBhcmFtZXRlcnM7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIENvbW1vbiBjb2RlIHRvIGFsbCBPQXV0aCBwcm92aWRlcnMuIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGVcclxuICoge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHNvIHRoYXQgY2hpbGQgcHJvdmlkZXJzIChsaWtlXHJcbiAqIHtAbGluayBHb29nbGVBdXRoUHJvdmlkZXJ9KSBkb24ndCBpbmhlcml0IHRoZSBgY3JlZGVudGlhbGAgaW5zdGFuY2UgbWV0aG9kLlxyXG4gKiBJbnN0ZWFkLCB0aGV5IHJlbHkgb24gYSBzdGF0aWMgYGNyZWRlbnRpYWxgIG1ldGhvZC5cclxuICovXHJcbmNsYXNzIEJhc2VPQXV0aFByb3ZpZGVyIGV4dGVuZHMgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuc2NvcGVzID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBPQXV0aCBzY29wZSB0byB0aGUgY3JlZGVudGlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2NvcGUgLSBQcm92aWRlciBPQXV0aCBzY29wZSB0byBhZGQuXHJcbiAgICAgKi9cclxuICAgIGFkZFNjb3BlKHNjb3BlKSB7XHJcbiAgICAgICAgLy8gSWYgbm90IGFscmVhZHkgYWRkZWQsIGFkZCBzY29wZSB0byBsaXN0LlxyXG4gICAgICAgIGlmICghdGhpcy5zY29wZXMuaW5jbHVkZXMoc2NvcGUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NvcGVzLnB1c2goc2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbGlzdCBvZiBPQXV0aCBzY29wZXMuXHJcbiAgICAgKi9cclxuICAgIGdldFNjb3BlcygpIHtcclxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVzXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgZ2VuZXJpYyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBwcm92aWRlci5hZGRTY29wZSgncHJvZmlsZScpO1xyXG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgT0F1dGggQWNjZXNzIFRva2VuIGZvciB0aGUgcHJvdmlkZXIuXHJcbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGBgYFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBPQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBKU09OIHN0cmluZyBvciBhIHBsYWluIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBqc29uIC0gQSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcclxuICAgICAgICBfYXNzZXJ0KCdwcm92aWRlcklkJyBpbiBvYmogJiYgJ3NpZ25Jbk1ldGhvZCcgaW4gb2JqLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMob2JqKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBnZW5lcmljIE9BdXRoIHByb3ZpZGVyJ3MgYWNjZXNzIHRva2VuIG9yIElEIHRva2VuLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBUaGUgcmF3IG5vbmNlIGlzIHJlcXVpcmVkIHdoZW4gYW4gSUQgdG9rZW4gd2l0aCBhIG5vbmNlIGZpZWxkIGlzIHByb3ZpZGVkLiBUaGUgU0hBLTI1NiBoYXNoIG9mXHJcbiAgICAgKiB0aGUgcmF3IG5vbmNlIG11c3QgbWF0Y2ggdGhlIG5vbmNlIGZpZWxkIGluIHRoZSBJRCB0b2tlbi5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogLy8gYGdvb2dsZVVzZXJgIGZyb20gdGhlIG9uc3VjY2VzcyBHb29nbGUgU2lnbiBJbiBjYWxsYmFjay5cclxuICAgICAqIC8vIEluaXRpYWxpemUgYSBnZW5lcmF0ZSBPQXV0aCBwcm92aWRlciB3aXRoIGEgYGdvb2dsZS5jb21gIHByb3ZpZGVySWQuXHJcbiAgICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAgICAgKiBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbCh7XHJcbiAgICAgKiAgIGlkVG9rZW46IGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4sXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBhcmFtcyAtIEVpdGhlciB0aGUgb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgSUQgdG9rZW4sIGFjY2VzcyB0b2tlbiBhbmQgcmF3IG5vbmNlXHJcbiAgICAgKiBvciB0aGUgSUQgdG9rZW4gc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBjcmVkZW50aWFsKHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVkZW50aWFsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgeyBub25jZTogcGFyYW1zLnJhd05vbmNlIH0pKTtcclxuICAgIH1cclxuICAgIC8qKiBBbiBpbnRlcm5hbCBjcmVkZW50aWFsIG1ldGhvZCB0aGF0IGFjY2VwdHMgbW9yZSBwZXJtaXNzaXZlIG9wdGlvbnMgKi9cclxuICAgIF9jcmVkZW50aWFsKHBhcmFtcykge1xyXG4gICAgICAgIF9hc3NlcnQocGFyYW1zLmlkVG9rZW4gfHwgcGFyYW1zLmFjY2Vzc1Rva2VuLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIC8vIEZvciBPQXV0aENyZWRlbnRpYWwsIHNpZ24gaW4gbWV0aG9kIGlzIHNhbWUgYXMgcHJvdmlkZXJJZC5cclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgeyBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZDogdGhpcy5wcm92aWRlcklkIH0pKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBPQXV0aFByb3ZpZGVyLm9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBPQXV0aFByb3ZpZGVyLm9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoKGVycm9yLmN1c3RvbURhdGEgfHwge30pKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBvYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYXV0aElkVG9rZW4sIG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQsIHBlbmRpbmdUb2tlbiwgbm9uY2UsIHByb3ZpZGVySWQgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFvYXV0aEFjY2Vzc1Rva2VuICYmXHJcbiAgICAgICAgICAgICFvYXV0aFRva2VuU2VjcmV0ICYmXHJcbiAgICAgICAgICAgICFvYXV0aElkVG9rZW4gJiZcclxuICAgICAgICAgICAgIXBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwcm92aWRlcklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9BdXRoUHJvdmlkZXIocHJvdmlkZXJJZCkuX2NyZWRlbnRpYWwoe1xyXG4gICAgICAgICAgICAgICAgaWRUb2tlbjogb2F1dGhJZFRva2VuLFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IG9hdXRoQWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBub25jZSxcclxuICAgICAgICAgICAgICAgIHBlbmRpbmdUb2tlblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkZBQ0VCT09LLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgRmFjZWJvb2tBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihcImZhY2Vib29rLmNvbVwiIC8qIEZBQ0VCT09LICovKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEZhY2Vib29rLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiAvLyBgZXZlbnRgIGZyb20gdGhlIEZhY2Vib29rIGF1dGguYXV0aFJlc3BvbnNlQ2hhbmdlIGNhbGxiYWNrLlxyXG4gICAgICogY29uc3QgY3JlZGVudGlhbCA9IEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwoZXZlbnQuYXV0aFJlc3BvbnNlLmFjY2Vzc1Rva2VuKTtcclxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gRmFjZWJvb2sgYWNjZXNzIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbChhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBGYWNlYm9va0F1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBGYWNlYm9va0F1dGhQcm92aWRlci5GQUNFQk9PS19TSUdOX0lOX01FVEhPRCxcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW5cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoeyBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZSB9KSB7XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlIHx8ICEoJ29hdXRoQWNjZXNzVG9rZW4nIGluIHRva2VuUmVzcG9uc2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5GQUNFQk9PSy4gKi9cclxuRmFjZWJvb2tBdXRoUHJvdmlkZXIuRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0QgPSBcImZhY2Vib29rLmNvbVwiIC8qIEZBQ0VCT09LICovO1xyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uRkFDRUJPT0suICovXHJcbkZhY2Vib29rQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJmYWNlYm9vay5jb21cIiAvKiBGQUNFQk9PSyAqLztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR29vZ2xlQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XHJcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiBpZiAocmVzdWx0KSB7XHJcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBHb29nbGUgQWNjZXNzIFRva2VuLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHb29nbGVBdXRoUHJvdmlkZXIoKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBHb29nbGVBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihcImdvb2dsZS5jb21cIiAvKiBHT09HTEUgKi8pO1xyXG4gICAgICAgIHRoaXMuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdvb2dsZS4gQXQgbGVhc3Qgb25lIG9mIElEIHRva2VuIGFuZCBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIC8vIFxcYGdvb2dsZVVzZXJcXGAgZnJvbSB0aGUgb25zdWNjZXNzIEdvb2dsZSBTaWduIEluIGNhbGxiYWNrLlxyXG4gICAgICogY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4pO1xyXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlbiAtIEdvb2dsZSBJRCB0b2tlbi5cclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEdvb2dsZSBhY2Nlc3MgdG9rZW4uXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKGlkVG9rZW4sIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IEdvb2dsZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBHb29nbGVBdXRoUHJvdmlkZXIuR09PR0xFX1NJR05fSU5fTUVUSE9ELFxyXG4gICAgICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYXV0aElkVG9rZW4sIG9hdXRoQWNjZXNzVG9rZW4gfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFvYXV0aElkVG9rZW4gJiYgIW9hdXRoQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiBvYXV0aCAxIGNyZWRlbnRpYWwgb3IgYSBwaG9uZSBjcmVkZW50aWFsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HT09HTEUuICovXHJcbkdvb2dsZUF1dGhQcm92aWRlci5HT09HTEVfU0lHTl9JTl9NRVRIT0QgPSBcImdvb2dsZS5jb21cIiAvKiBHT09HTEUgKi87XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5HT09HTEUuICovXHJcbkdvb2dsZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IFwiZ29vZ2xlLmNvbVwiIC8qIEdPT0dMRSAqLztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR0lUSFVCLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBHaXRIdWIgcmVxdWlyZXMgYW4gT0F1dGggMi4wIHJlZGlyZWN0LCBzbyB5b3UgY2FuIGVpdGhlciBoYW5kbGUgdGhlIHJlZGlyZWN0IGRpcmVjdGx5LCBvciB1c2VcclxuICogdGhlIHtAbGluayBzaWduSW5XaXRoUG9wdXB9IGhhbmRsZXI6XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHaXRodWJBdXRoUHJvdmlkZXIoKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdyZXBvJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGBgYFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBHaXRodWJBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihcImdpdGh1Yi5jb21cIiAvKiBHSVRIVUIgKi8pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCBmb3IgR2l0aHViLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEdpdGh1YiBhY2Nlc3MgdG9rZW4uXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IEdpdGh1YkF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBHaXRodWJBdXRoUHJvdmlkZXIuR0lUSFVCX1NJR05fSU5fTUVUSE9ELFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSB8fCAhKCdvYXV0aEFjY2Vzc1Rva2VuJyBpbiB0b2tlblJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkdJVEhVQi4gKi9cclxuR2l0aHViQXV0aFByb3ZpZGVyLkdJVEhVQl9TSUdOX0lOX01FVEhPRCA9IFwiZ2l0aHViLmNvbVwiIC8qIEdJVEhVQiAqLztcclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi4gKi9cclxuR2l0aHViQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJnaXRodWIuY29tXCIgLyogR0lUSFVCICovO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBJRFBfUkVRVUVTVF9VUkkgPSAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbi8qKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBTQU1MQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICBzdXBlcihwcm92aWRlcklkLCBwcm92aWRlcklkKTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdUb2tlbiA9IHBlbmRpbmdUb2tlbjtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2xpbmtUb0lkVG9rZW4oYXV0aCwgaWRUb2tlbikge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGgpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcclxuICAgICAgICByZXF1ZXN0LmF1dG9DcmVhdGUgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAgKi9cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGRlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW50byBhblxyXG4gICAgICoge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGpzb24gLSBJbnB1dCBjYW4gYmUgZWl0aGVyIE9iamVjdCBvciB0aGUgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cclxuICAgICAqIFdoZW4gc3RyaW5nIGlzIHByb3ZpZGVkLCBKU09OLnBhcnNlIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgSlNPTiBpbnB1dCBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XHJcbiAgICAgICAgY29uc3QgeyBwcm92aWRlcklkLCBzaWduSW5NZXRob2QsIHBlbmRpbmdUb2tlbiB9ID0gb2JqO1xyXG4gICAgICAgIGlmICghcHJvdmlkZXJJZCB8fFxyXG4gICAgICAgICAgICAhc2lnbkluTWV0aG9kIHx8XHJcbiAgICAgICAgICAgICFwZW5kaW5nVG9rZW4gfHxcclxuICAgICAgICAgICAgcHJvdmlkZXJJZCAhPT0gc2lnbkluTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFNBTUxBdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgc3RhdGljIG1ldGhvZCB0byBhdm9pZCBleHBvc2luZyB0aGUgY29uc3RydWN0b3IgdG8gZW5kIHVzZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgX2NyZWF0ZShwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IFNBTUxBdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xyXG4gICAgfVxyXG4gICAgYnVpbGRSZXF1ZXN0KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RVcmk6IElEUF9SRVFVRVNUX1VSSSxcclxuICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFNBTUxfUFJPVklERVJfUFJFRklYID0gJ3NhbWwuJztcclxuLyoqXHJcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGZvciBTQU1MLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBTQU1MQXV0aFByb3ZpZGVyIGV4dGVuZHMgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0b3IuIFRoZSBwcm92aWRlcklkIG11c3Qgc3RhcnQgd2l0aCBcInNhbWwuXCJcclxuICAgICAqIEBwYXJhbSBwcm92aWRlcklkIC0gU0FNTCBwcm92aWRlciBJRC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXJJZCkge1xyXG4gICAgICAgIF9hc3NlcnQocHJvdmlkZXJJZC5zdGFydHNXaXRoKFNBTUxfUFJPVklERVJfUFJFRklYKSwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBzdXBlcihwcm92aWRlcklkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0gYWZ0ZXIgYVxyXG4gICAgICogc3VjY2Vzc2Z1bCBTQU1MIGZsb3cgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKlxyXG4gICAgICogRm9yIGV4YW1wbGUsIHRvIGdldCBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9LCB5b3UgY291bGQgd3JpdGUgdGhlXHJcbiAgICAgKiBmb2xsb3dpbmcgY29kZTpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgc2FtbFByb3ZpZGVyKTtcclxuICAgICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBTQU1MQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBTQU1MQXV0aFByb3ZpZGVyLnNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIFNBTUxBdXRoUHJvdmlkZXIuc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSBmcm9tIGEgSlNPTiBzdHJpbmcgb3IgYSBwbGFpbiBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIEEgcGxhaW4gb2JqZWN0IG9yIGEgSlNPTiBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbCA9IFNBTUxBdXRoQ3JlZGVudGlhbC5mcm9tSlNPTihqc29uKTtcclxuICAgICAgICBfYXNzZXJ0KGNyZWRlbnRpYWwsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBwZW5kaW5nVG9rZW4sIHByb3ZpZGVySWQgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFwZW5kaW5nVG9rZW4gfHwgIXByb3ZpZGVySWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTQU1MQXV0aENyZWRlbnRpYWwuX2NyZWF0ZShwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uVFdJVFRFUi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgVHdpdHRlciBBY2Nlc3MgVG9rZW4gYW5kIFNlY3JldC5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogICBjb25zdCBzZWNyZXQgPSBjcmVkZW50aWFsLnNlY3JldDtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcclxuICpcclxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXHJcbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBUd2l0dGVyIEFjY2VzcyBUb2tlbiBhbmQgU2VjcmV0LlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGNvbnN0IHNlY3JldCA9IGNyZWRlbnRpYWwuc2VjcmV0O1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgVHdpdHRlckF1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKFwidHdpdHRlci5jb21cIiAvKiBUV0lUVEVSICovKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIFR3aXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHRva2VuIC0gVHdpdHRlciBhY2Nlc3MgdG9rZW4uXHJcbiAgICAgKiBAcGFyYW0gc2VjcmV0IC0gVHdpdHRlciBzZWNyZXQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKHRva2VuLCBzZWNyZXQpIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogVHdpdHRlckF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlRXSVRURVJfU0lHTl9JTl9NRVRIT0QsXHJcbiAgICAgICAgICAgIG9hdXRoVG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICBvYXV0aFRva2VuU2VjcmV0OiBzZWNyZXRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHVzZXJDcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcclxuICAgICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYXV0aEFjY2Vzc1Rva2VuLCBvYXV0aFRva2VuU2VjcmV0IH0gPSB0b2tlblJlc3BvbnNlO1xyXG4gICAgICAgIGlmICghb2F1dGhBY2Nlc3NUb2tlbiB8fCAhb2F1dGhUb2tlblNlY3JldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChvYXV0aEFjY2Vzc1Rva2VuLCBvYXV0aFRva2VuU2VjcmV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5UV0lUVEVSLiAqL1xyXG5Ud2l0dGVyQXV0aFByb3ZpZGVyLlRXSVRURVJfU0lHTl9JTl9NRVRIT0QgPSBcInR3aXR0ZXIuY29tXCIgLyogVFdJVFRFUiAqLztcclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlRXSVRURVIuICovXHJcblR3aXR0ZXJBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcInR3aXR0ZXIuY29tXCIgLyogVFdJVFRFUiAqLztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnblVwKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnblVwXCIgLyogU0lHTl9VUCAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBVc2VyQ3JlZGVudGlhbEltcGwge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gcGFyYW1zLnVzZXI7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gcGFyYW1zLnByb3ZpZGVySWQ7XHJcbiAgICAgICAgdGhpcy5fdG9rZW5SZXNwb25zZSA9IHBhcmFtcy5fdG9rZW5SZXNwb25zZTtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBwYXJhbXMub3BlcmF0aW9uVHlwZTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBfZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoLCBvcGVyYXRpb25UeXBlLCBpZFRva2VuUmVzcG9uc2UsIGlzQW5vbnltb3VzID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgVXNlckltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aCwgaWRUb2tlblJlc3BvbnNlLCBpc0Fub255bW91cyk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXJJZCA9IHByb3ZpZGVySWRGb3JSZXNwb25zZShpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJDcmVkID0gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XHJcbiAgICAgICAgICAgIHVzZXIsXHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgIF90b2tlblJlc3BvbnNlOiBpZFRva2VuUmVzcG9uc2UsXHJcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGVcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdXNlckNyZWQ7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgX2Zvck9wZXJhdGlvbih1c2VyLCBvcGVyYXRpb25UeXBlLCByZXNwb25zZSkge1xyXG4gICAgICAgIGF3YWl0IHVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KHJlc3BvbnNlLCAvKiByZWxvYWQgKi8gdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXJJZCA9IHByb3ZpZGVySWRGb3JSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyQ3JlZGVudGlhbEltcGwoe1xyXG4gICAgICAgICAgICB1c2VyLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICBfdG9rZW5SZXNwb25zZTogcmVzcG9uc2UsXHJcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGVcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBwcm92aWRlcklkRm9yUmVzcG9uc2UocmVzcG9uc2UpIHtcclxuICAgIGlmIChyZXNwb25zZS5wcm92aWRlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnByb3ZpZGVySWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoJ3Bob25lTnVtYmVyJyBpbiByZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiBcInBob25lXCIgLyogUEhPTkUgKi87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gYXMgYW4gYW5vbnltb3VzIHVzZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gYW5vbnltb3VzIHVzZXIgc2lnbmVkIGluLCB0aGF0IHVzZXIgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhXHJcbiAqIG5ldyBhbm9ueW1vdXMgdXNlciBpZGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbkFub255bW91c2x5KGF1dGgpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgaWYgKChfYSA9IGF1dGhJbnRlcm5hbC5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzQW5vbnltb3VzKSB7XHJcbiAgICAgICAgLy8gSWYgYW4gYW5vbnltb3VzIHVzZXIgaXMgYWxyZWFkeSBzaWduZWQgaW4sIG5vIG5lZWQgdG8gc2lnbiB0aGVtIGluIGFnYWluLlxyXG4gICAgICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcclxuICAgICAgICAgICAgdXNlcjogYXV0aEludGVybmFsLmN1cnJlbnRVc2VyLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBudWxsLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiBcInNpZ25JblwiIC8qIFNJR05fSU4gKi9cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnblVwKGF1dGhJbnRlcm5hbCwge1xyXG4gICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGhJbnRlcm5hbCwgXCJzaWduSW5cIiAvKiBTSUdOX0lOICovLCByZXNwb25zZSwgdHJ1ZSk7XHJcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xyXG4gICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIE11bHRpRmFjdG9yRXJyb3IgZXh0ZW5kcyBGaXJlYmFzZUVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHN1cGVyKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IG9wZXJhdGlvblR5cGU7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNdWx0aUZhY3RvckVycm9yLnByb3RvdHlwZSk7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0ge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiAoX2EgPSBhdXRoLnRlbmFudElkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIF9zZXJ2ZXJSZXNwb25zZTogZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2UsXHJcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBfZnJvbUVycm9yQW5kT3BlcmF0aW9uKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvckVycm9yKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoYXV0aCwgb3BlcmF0aW9uVHlwZSwgY3JlZGVudGlhbCwgdXNlcikge1xyXG4gICAgY29uc3QgaWRUb2tlblByb3ZpZGVyID0gb3BlcmF0aW9uVHlwZSA9PT0gXCJyZWF1dGhlbnRpY2F0ZVwiIC8qIFJFQVVUSEVOVElDQVRFICovXHJcbiAgICAgICAgPyBjcmVkZW50aWFsLl9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aClcclxuICAgICAgICA6IGNyZWRlbnRpYWwuX2dldElkVG9rZW5SZXNwb25zZShhdXRoKTtcclxuICAgIHJldHVybiBpZFRva2VuUHJvdmlkZXIuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBgYXV0aC8ke1wibXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWRcIiAvKiBNRkFfUkVRVUlSRUQgKi99YCkge1xyXG4gICAgICAgICAgICB0aHJvdyBNdWx0aUZhY3RvckVycm9yLl9mcm9tRXJyb3JBbmRPcGVyYXRpb24oYXV0aCwgZXJyb3IsIG9wZXJhdGlvblR5cGUsIHVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0pO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUYWtlcyBhIHNldCBvZiBVc2VySW5mbyBwcm92aWRlciBkYXRhIGFuZCBjb252ZXJ0cyBpdCB0byBhIHNldCBvZiBuYW1lc1xyXG4gKi9cclxuZnVuY3Rpb24gcHJvdmlkZXJEYXRhQXNOYW1lcyhwcm92aWRlckRhdGEpIHtcclxuICAgIHJldHVybiBuZXcgU2V0KHByb3ZpZGVyRGF0YVxyXG4gICAgICAgIC5tYXAoKHsgcHJvdmlkZXJJZCB9KSA9PiBwcm92aWRlcklkKVxyXG4gICAgICAgIC5maWx0ZXIocGlkID0+ICEhcGlkKSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFVubGlua3MgYSBwcm92aWRlciBmcm9tIGEgdXNlciBhY2NvdW50LlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFRoZSBwcm92aWRlciB0byB1bmxpbmsuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHVubGluayh1c2VyLCBwcm92aWRlcklkKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKHRydWUsIHVzZXJJbnRlcm5hbCwgcHJvdmlkZXJJZCk7XHJcbiAgICBjb25zdCB7IHByb3ZpZGVyVXNlckluZm8gfSA9IGF3YWl0IGRlbGV0ZUxpbmtlZEFjY291bnRzKHVzZXJJbnRlcm5hbC5hdXRoLCB7XHJcbiAgICAgICAgaWRUb2tlbjogYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oKSxcclxuICAgICAgICBkZWxldGVQcm92aWRlcjogW3Byb3ZpZGVySWRdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHByb3ZpZGVyc0xlZnQgPSBwcm92aWRlckRhdGFBc05hbWVzKHByb3ZpZGVyVXNlckluZm8gfHwgW10pO1xyXG4gICAgdXNlckludGVybmFsLnByb3ZpZGVyRGF0YSA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmlsdGVyKHBkID0+IHByb3ZpZGVyc0xlZnQuaGFzKHBkLnByb3ZpZGVySWQpKTtcclxuICAgIGlmICghcHJvdmlkZXJzTGVmdC5oYXMoXCJwaG9uZVwiIC8qIFBIT05FICovKSkge1xyXG4gICAgICAgIHVzZXJJbnRlcm5hbC5waG9uZU51bWJlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcclxuICAgIHJldHVybiB1c2VySW50ZXJuYWw7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2xpbmskMSh1c2VyLCBjcmVkZW50aWFsLCBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh1c2VyLCBjcmVkZW50aWFsLl9saW5rVG9JZFRva2VuKHVzZXIuYXV0aCwgYXdhaXQgdXNlci5nZXRJZFRva2VuKCkpLCBieXBhc3NBdXRoU3RhdGUpO1xyXG4gICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIFwibGlua1wiIC8qIExJTksgKi8sIHJlc3BvbnNlKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfYXNzZXJ0TGlua2VkU3RhdHVzKGV4cGVjdGVkLCB1c2VyLCBwcm92aWRlcikge1xyXG4gICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XHJcbiAgICBjb25zdCBwcm92aWRlcklkcyA9IHByb3ZpZGVyRGF0YUFzTmFtZXModXNlci5wcm92aWRlckRhdGEpO1xyXG4gICAgY29uc3QgY29kZSA9IGV4cGVjdGVkID09PSBmYWxzZVxyXG4gICAgICAgID8gXCJwcm92aWRlci1hbHJlYWR5LWxpbmtlZFwiIC8qIFBST1ZJREVSX0FMUkVBRFlfTElOS0VEICovXHJcbiAgICAgICAgOiBcIm5vLXN1Y2gtcHJvdmlkZXJcIiAvKiBOT19TVUNIX1BST1ZJREVSICovO1xyXG4gICAgX2Fzc2VydChwcm92aWRlcklkcy5oYXMocHJvdmlkZXIpID09PSBleHBlY3RlZCwgdXNlci5hdXRoLCBjb2RlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfcmVhdXRoZW50aWNhdGUodXNlciwgY3JlZGVudGlhbCwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHsgYXV0aCB9ID0gdXNlcjtcclxuICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBcInJlYXV0aGVudGljYXRlXCIgLyogUkVBVVRIRU5USUNBVEUgKi87XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodXNlciwgX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5KGF1dGgsIG9wZXJhdGlvblR5cGUsIGNyZWRlbnRpYWwsIHVzZXIpLCBieXBhc3NBdXRoU3RhdGUpO1xyXG4gICAgICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBfcGFyc2VUb2tlbihyZXNwb25zZS5pZFRva2VuKTtcclxuICAgICAgICBfYXNzZXJ0KHBhcnNlZCwgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBjb25zdCB7IHN1YjogbG9jYWxJZCB9ID0gcGFyc2VkO1xyXG4gICAgICAgIF9hc3NlcnQodXNlci51aWQgPT09IGxvY2FsSWQsIGF1dGgsIFwidXNlci1taXNtYXRjaFwiIC8qIFVTRVJfTUlTTUFUQ0ggKi8pO1xyXG4gICAgICAgIHJldHVybiBVc2VyQ3JlZGVudGlhbEltcGwuX2Zvck9wZXJhdGlvbih1c2VyLCBvcGVyYXRpb25UeXBlLCByZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIENvbnZlcnQgdXNlciBkZWxldGVkIGVycm9yIGludG8gdXNlciBtaXNtYXRjaFxyXG4gICAgICAgIGlmICgoZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLmNvZGUpID09PSBgYXV0aC8ke1widXNlci1ub3QtZm91bmRcIiAvKiBVU0VSX0RFTEVURUQgKi99YCkge1xyXG4gICAgICAgICAgICBfZmFpbChhdXRoLCBcInVzZXItbWlzbWF0Y2hcIiAvKiBVU0VSX01JU01BVENIICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgY3JlZGVudGlhbCwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBcInNpZ25JblwiIC8qIFNJR05fSU4gKi87XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShhdXRoLCBvcGVyYXRpb25UeXBlLCBjcmVkZW50aWFsKTtcclxuICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGgsIG9wZXJhdGlvblR5cGUsIHJlc3BvbnNlKTtcclxuICAgIGlmICghYnlwYXNzQXV0aFN0YXRlKSB7XHJcbiAgICAgICAgYXdhaXQgYXV0aC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XHJcbn1cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBBbiB7QGxpbmsgQXV0aFByb3ZpZGVyfSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY3JlZGVudGlhbC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGNyZWRlbnRpYWwpIHtcclxuICAgIHJldHVybiBfc2lnbkluV2l0aENyZWRlbnRpYWwoX2Nhc3RBdXRoKGF1dGgpLCBjcmVkZW50aWFsKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhDcmVkZW50aWFsKHVzZXIsIGNyZWRlbnRpYWwpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbC5wcm92aWRlcklkKTtcclxuICAgIHJldHVybiBfbGluayQxKHVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbCk7XHJcbn1cclxuLyoqXHJcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggY3JlZGVudGlhbC5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW5cclxuICogYXR0ZW1wdHMuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHJlY292ZXIgZnJvbSBhIGBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU5gIGVycm9yLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwodXNlciwgY3JlZGVudGlhbCkge1xyXG4gICAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZShnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIGNyZWRlbnRpYWwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDdXN0b21Ub2tlbiQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aEN1c3RvbVRva2VuXCIgLyogU0lHTl9JTl9XSVRIX0NVU1RPTV9UT0tFTiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBjdXN0b20gdG9rZW4uXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEN1c3RvbSB0b2tlbnMgYXJlIHVzZWQgdG8gaW50ZWdyYXRlIEZpcmViYXNlIEF1dGggd2l0aCBleGlzdGluZyBhdXRoIHN5c3RlbXMsIGFuZCBtdXN0XHJcbiAqIGJlIGdlbmVyYXRlZCBieSBhbiBhdXRoIGJhY2tlbmQgdXNpbmcgdGhlXHJcbiAqIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9yZWZlcmVuY2UvYWRtaW4vbm9kZS9hZG1pbi5hdXRoLkF1dGgjY3JlYXRlY3VzdG9tdG9rZW4gfCBjcmVhdGVDdXN0b21Ub2tlbn1cclxuICogbWV0aG9kIGluIHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC9hZG1pbiB8IEFkbWluIFNES30gLlxyXG4gKlxyXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSB0b2tlbiBpcyBpbnZhbGlkLCBleHBpcmVkLCBvciBub3QgYWNjZXB0ZWQgYnkgdGhlIEZpcmViYXNlIEF1dGggc2VydmljZS5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gY3VzdG9tVG9rZW4gLSBUaGUgY3VzdG9tIHRva2VuIHRvIHNpZ24gaW4gd2l0aC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEN1c3RvbVRva2VuKGF1dGgsIGN1c3RvbVRva2VuKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNpZ25JbldpdGhDdXN0b21Ub2tlbiQxKGF1dGhJbnRlcm5hbCwge1xyXG4gICAgICAgIHRva2VuOiBjdXN0b21Ub2tlbixcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBjcmVkID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGhJbnRlcm5hbCwgXCJzaWduSW5cIiAvKiBTSUdOX0lOICovLCByZXNwb25zZSk7XHJcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKGNyZWQudXNlcik7XHJcbiAgICByZXR1cm4gY3JlZDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBNdWx0aUZhY3RvckluZm9JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGZhY3RvcklkLCByZXNwb25zZSkge1xyXG4gICAgICAgIHRoaXMuZmFjdG9ySWQgPSBmYWN0b3JJZDtcclxuICAgICAgICB0aGlzLnVpZCA9IHJlc3BvbnNlLm1mYUVucm9sbG1lbnRJZDtcclxuICAgICAgICB0aGlzLmVucm9sbG1lbnRUaW1lID0gbmV3IERhdGUocmVzcG9uc2UuZW5yb2xsZWRBdCkudG9VVENTdHJpbmcoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KSB7XHJcbiAgICAgICAgaWYgKCdwaG9uZUluZm8nIGluIGVucm9sbG1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JJbmZvLl9mcm9tU2VydmVyUmVzcG9uc2UoYXV0aCwgZW5yb2xsbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFBob25lTXVsdGlGYWN0b3JJbmZvIGV4dGVuZHMgTXVsdGlGYWN0b3JJbmZvSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xyXG4gICAgICAgIHN1cGVyKFwicGhvbmVcIiAvKiBQSE9ORSAqLywgcmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZUluZm87XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShfYXV0aCwgZW5yb2xsbWVudCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckluZm8oZW5yb2xsbWVudCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIHZhciBfYTtcclxuICAgIF9hc3NlcnQoKChfYSA9IGFjdGlvbkNvZGVTZXR0aW5ncy51cmwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCwgYXV0aCwgXCJpbnZhbGlkLWNvbnRpbnVlLXVyaVwiIC8qIElOVkFMSURfQ09OVElOVUVfVVJJICovKTtcclxuICAgIF9hc3NlcnQodHlwZW9mIGFjdGlvbkNvZGVTZXR0aW5ncy5keW5hbWljTGlua0RvbWFpbiA9PT0gJ3VuZGVmaW5lZCcgfHxcclxuICAgICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW4ubGVuZ3RoID4gMCwgYXV0aCwgXCJpbnZhbGlkLWR5bmFtaWMtbGluay1kb21haW5cIiAvKiBJTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU4gKi8pO1xyXG4gICAgcmVxdWVzdC5jb250aW51ZVVybCA9IGFjdGlvbkNvZGVTZXR0aW5ncy51cmw7XHJcbiAgICByZXF1ZXN0LmR5bmFtaWNMaW5rRG9tYWluID0gYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluO1xyXG4gICAgcmVxdWVzdC5jYW5IYW5kbGVDb2RlSW5BcHAgPSBhY3Rpb25Db2RlU2V0dGluZ3MuaGFuZGxlQ29kZUluQXBwO1xyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MpIHtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MuYnVuZGxlSWQubGVuZ3RoID4gMCwgYXV0aCwgXCJtaXNzaW5nLWlvcy1idW5kbGUtaWRcIiAvKiBNSVNTSU5HX0lPU19CVU5ETEVfSUQgKi8pO1xyXG4gICAgICAgIHJlcXVlc3QuaU9TQnVuZGxlSWQgPSBhY3Rpb25Db2RlU2V0dGluZ3MuaU9TLmJ1bmRsZUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkKSB7XHJcbiAgICAgICAgX2Fzc2VydChhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5wYWNrYWdlTmFtZS5sZW5ndGggPiAwLCBhdXRoLCBcIm1pc3NpbmctYW5kcm9pZC1wa2ctbmFtZVwiIC8qIE1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUgKi8pO1xyXG4gICAgICAgIHJlcXVlc3QuYW5kcm9pZEluc3RhbGxBcHAgPSBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5pbnN0YWxsQXBwO1xyXG4gICAgICAgIHJlcXVlc3QuYW5kcm9pZE1pbmltdW1WZXJzaW9uQ29kZSA9XHJcbiAgICAgICAgICAgIGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLm1pbmltdW1WZXJzaW9uO1xyXG4gICAgICAgIHJlcXVlc3QuYW5kcm9pZFBhY2thZ2VOYW1lID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQucGFja2FnZU5hbWU7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFNlbmRzIGEgcGFzc3dvcmQgcmVzZXQgZW1haWwgdG8gdGhlIGdpdmVuIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGNvbXBsZXRlIHRoZSBwYXNzd29yZCByZXNldCwgY2FsbCB7QGxpbmsgY29uZmlybVBhc3N3b3JkUmVzZXR9IHdpdGggdGhlIGNvZGUgc3VwcGxpZWQgaW5cclxuICogdGhlIGVtYWlsIHNlbnQgdG8gdGhlIHVzZXIsIGFsb25nIHdpdGggdGhlIG5ldyBwYXNzd29yZCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB1c2VyLlxyXG4gKiBhd2FpdCBjb25maXJtUGFzc3dvcmRSZXNldCgndXNlckBleGFtcGxlLmNvbScsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoYXV0aCwgZW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIHJlcXVlc3RUeXBlOiBcIlBBU1NXT1JEX1JFU0VUXCIgLyogUEFTU1dPUkRfUkVTRVQgKi8sXHJcbiAgICAgICAgZW1haWxcclxuICAgIH07XHJcbiAgICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoTW9kdWxhciwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHNlbmRQYXNzd29yZFJlc2V0RW1haWwkMShhdXRoTW9kdWxhciwgcmVxdWVzdCk7XHJcbn1cclxuLyoqXHJcbiAqIENvbXBsZXRlcyB0aGUgcGFzc3dvcmQgcmVzZXQgcHJvY2VzcywgZ2l2ZW4gYSBjb25maXJtYXRpb24gY29kZSBhbmQgbmV3IHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSBjb25maXJtYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjb25maXJtUGFzc3dvcmRSZXNldChhdXRoLCBvb2JDb2RlLCBuZXdQYXNzd29yZCkge1xyXG4gICAgYXdhaXQgcmVzZXRQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCksIHtcclxuICAgICAgICBvb2JDb2RlLFxyXG4gICAgICAgIG5ld1Bhc3N3b3JkXHJcbiAgICB9KTtcclxuICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIGVtYWlsLlxyXG59XHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIG9vYkNvZGUgLSBBIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGFwcGx5QWN0aW9uQ29kZShhdXRoLCBvb2JDb2RlKSB7XHJcbiAgICBhd2FpdCBhcHBseUFjdGlvbkNvZGUkMShnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCksIHsgb29iQ29kZSB9KTtcclxufVxyXG4vKipcclxuICogQ2hlY2tzIGEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXHJcbiAqXHJcbiAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBjb2RlLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjaGVja0FjdGlvbkNvZGUoYXV0aCwgb29iQ29kZSkge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc2V0UGFzc3dvcmQoYXV0aE1vZHVsYXIsIHsgb29iQ29kZSB9KTtcclxuICAgIC8vIEVtYWlsIGNvdWxkIGJlIGVtcHR5IG9ubHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcyBFTUFJTF9TSUdOSU4gb3JcclxuICAgIC8vIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLlxyXG4gICAgLy8gTmV3IGVtYWlsIHNob3VsZCBub3QgYmUgZW1wdHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpc1xyXG4gICAgLy8gVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwuXHJcbiAgICAvLyBNdWx0aS1mYWN0b3IgaW5mbyBjb3VsZCBub3QgYmUgZW1wdHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpc1xyXG4gICAgLy8gUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04uXHJcbiAgICBjb25zdCBvcGVyYXRpb24gPSByZXNwb25zZS5yZXF1ZXN0VHlwZTtcclxuICAgIF9hc3NlcnQob3BlcmF0aW9uLCBhdXRoTW9kdWxhciwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcIkVNQUlMX1NJR05JTlwiIC8qIEVNQUlMX1NJR05JTiAqLzpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXCIgLyogVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi86XHJcbiAgICAgICAgICAgIF9hc3NlcnQocmVzcG9uc2UubmV3RW1haWwsIGF1dGhNb2R1bGFyLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT05cIiAvKiBSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTiAqLzpcclxuICAgICAgICAgICAgX2Fzc2VydChyZXNwb25zZS5tZmFJbmZvLCBhdXRoTW9kdWxhciwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAvLyBmYWxsIHRocm91Z2hcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLmVtYWlsLCBhdXRoTW9kdWxhciwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIH1cclxuICAgIC8vIFRoZSBtdWx0aS1mYWN0b3IgaW5mbyBmb3IgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb25cclxuICAgIGxldCBtdWx0aUZhY3RvckluZm8gPSBudWxsO1xyXG4gICAgaWYgKHJlc3BvbnNlLm1mYUluZm8pIHtcclxuICAgICAgICBtdWx0aUZhY3RvckluZm8gPSBNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UoX2Nhc3RBdXRoKGF1dGhNb2R1bGFyKSwgcmVzcG9uc2UubWZhSW5mbyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgZW1haWw6IChyZXNwb25zZS5yZXF1ZXN0VHlwZSA9PT0gXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMICovXHJcbiAgICAgICAgICAgICAgICA/IHJlc3BvbnNlLm5ld0VtYWlsXHJcbiAgICAgICAgICAgICAgICA6IHJlc3BvbnNlLmVtYWlsKSB8fCBudWxsLFxyXG4gICAgICAgICAgICBwcmV2aW91c0VtYWlsOiAocmVzcG9uc2UucmVxdWVzdFR5cGUgPT09IFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTCAqL1xyXG4gICAgICAgICAgICAgICAgPyByZXNwb25zZS5lbWFpbFxyXG4gICAgICAgICAgICAgICAgOiByZXNwb25zZS5uZXdFbWFpbCkgfHwgbnVsbCxcclxuICAgICAgICAgICAgbXVsdGlGYWN0b3JJbmZvXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcGVyYXRpb25cclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcyBpZiB2YWxpZC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gY29kZSAtIEEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUoYXV0aCwgY29kZSkge1xyXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBjaGVja0FjdGlvbkNvZGUoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCBjb2RlKTtcclxuICAgIC8vIEVtYWlsIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBzaW5jZSBhIGNvZGUgd2FzIHNlbnQgdG8gaXRcclxuICAgIHJldHVybiBkYXRhLmVtYWlsO1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHVzZXIgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzIGFuZCBwYXNzd29yZC5cclxuICpcclxuICogQHJlbWFya3NcclxuICogT24gc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgdXNlciBhY2NvdW50LCB0aGlzIHVzZXIgd2lsbCBhbHNvIGJlIHNpZ25lZCBpbiB0byB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBVc2VyIGFjY291bnQgY3JlYXRpb24gY2FuIGZhaWwgaWYgdGhlIGFjY291bnQgYWxyZWFkeSBleGlzdHMgb3IgdGhlIHBhc3N3b3JkIGlzIGludmFsaWQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBlbWFpbCBhZGRyZXNzIGFjdHMgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgYW5kIGVuYWJsZXMgYW4gZW1haWwtYmFzZWRcclxuICogcGFzc3dvcmQgcmVzZXQuIFRoaXMgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgdXNlciBhY2NvdW50IGFuZCBzZXQgdGhlIGluaXRpYWwgdXNlciBwYXNzd29yZC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFRoZSB1c2VyJ3MgY2hvc2VuIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNpZ25VcChhdXRoSW50ZXJuYWwsIHtcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcclxuICAgICAgICBlbWFpbCxcclxuICAgICAgICBwYXNzd29yZFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoSW50ZXJuYWwsIFwic2lnbkluXCIgLyogU0lHTl9JTiAqLywgcmVzcG9uc2UpO1xyXG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcclxuICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYW4gZW1haWwgYW5kIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGFuZCBwYXNzd29yZCBkbyBub3QgbWF0Y2guXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSB1c2VyJ3MgcGFzc3dvcmQgaXMgTk9UIHRoZSBwYXNzd29yZCB1c2VkIHRvIGFjY2VzcyB0aGUgdXNlcidzIGVtYWlsIGFjY291bnQuIFRoZVxyXG4gKiBlbWFpbCBhZGRyZXNzIHNlcnZlcyBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciwgYW5kIHRoZSBwYXNzd29yZCBpcyB1c2VkIHRvIGFjY2Vzc1xyXG4gKiB0aGUgdXNlcidzIGFjY291bnQgaW4geW91ciBGaXJlYmFzZSBwcm9qZWN0LiBTZWUgYWxzbzoge0BsaW5rIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZH0uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MuXHJcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFRoZSB1c2VycyBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICByZXR1cm4gc2lnbkluV2l0aENyZWRlbnRpYWwoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTZW5kcyBhIHNpZ24taW4gZW1haWwgbGluayB0byB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoZSBzaWduLWluIG9wZXJhdGlvbiBoYXMgdG8gYWx3YXlzIGJlIGNvbXBsZXRlZCBpbiB0aGUgYXBwIHVubGlrZSBvdGhlciBvdXQgb2YgYmFuZCBlbWFpbFxyXG4gKiBhY3Rpb25zIChwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9ucykuIFRoaXMgaXMgYmVjYXVzZSwgYXQgdGhlIGVuZCBvZiB0aGUgZmxvdyxcclxuICogdGhlIHVzZXIgaXMgZXhwZWN0ZWQgdG8gYmUgc2lnbmVkIGluIGFuZCB0aGVpciBBdXRoIHN0YXRlIHBlcnNpc3RlZCB3aXRoaW4gdGhlIGFwcC5cclxuICpcclxuICogVG8gY29tcGxldGUgc2lnbiBpbiB3aXRoIHRoZSBlbWFpbCBsaW5rLCBjYWxsIHtAbGluayBzaWduSW5XaXRoRW1haWxMaW5rfSB3aXRoIHRoZSBlbWFpbFxyXG4gKiBhZGRyZXNzIGFuZCB0aGUgZW1haWwgbGluayBzdXBwbGllZCBpbiB0aGUgZW1haWwgc2VudCB0byB0aGUgdXNlci5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBhY3Rpb25Db2RlU2V0dGluZ3MgPSB7XHJcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxyXG4gKiAgIGlPUzoge1xyXG4gKiAgICAgIGJ1bmRsZUlkOiAnY29tLmV4YW1wbGUuaW9zJ1xyXG4gKiAgIH0sXHJcbiAqICAgYW5kcm9pZDoge1xyXG4gKiAgICAgcGFja2FnZU5hbWU6ICdjb20uZXhhbXBsZS5hbmRyb2lkJyxcclxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXHJcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xyXG4gKiAgIH0sXHJcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXHJcbiAqIH07XHJcbiAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB0aGUgdXNlci5cclxuICogaWYoaXNTaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsTGluaykpIHtcclxuICogICBhd2FpdCBzaWduSW5XaXRoRW1haWxMaW5rKCd1c2VyQGV4YW1wbGUuY29tJywgJ3VzZXJAZXhhbXBsZS5jb20nLCBlbWFpbExpbmspO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aEludGVybmFsIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwoYXV0aCwgZW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIHJlcXVlc3RUeXBlOiBcIkVNQUlMX1NJR05JTlwiIC8qIEVNQUlMX1NJR05JTiAqLyxcclxuICAgICAgICBlbWFpbFxyXG4gICAgfTtcclxuICAgIF9hc3NlcnQoYWN0aW9uQ29kZVNldHRpbmdzLmhhbmRsZUNvZGVJbkFwcCwgYXV0aE1vZHVsYXIsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoTW9kdWxhciwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbCQxKGF1dGhNb2R1bGFyLCByZXF1ZXN0KTtcclxufVxyXG4vKipcclxuICogQ2hlY2tzIGlmIGFuIGluY29taW5nIGxpbmsgaXMgYSBzaWduLWluIHdpdGggZW1haWwgbGluayBzdWl0YWJsZSBmb3Ige0BsaW5rIHNpZ25JbldpdGhFbWFpbExpbmt9LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbExpbmsgLSBUaGUgbGluayBzZW50IHRvIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gaXNTaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsTGluaykge1xyXG4gICAgY29uc3QgYWN0aW9uQ29kZVVybCA9IEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGVtYWlsTGluayk7XHJcbiAgICByZXR1cm4gKGFjdGlvbkNvZGVVcmwgPT09IG51bGwgfHwgYWN0aW9uQ29kZVVybCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWN0aW9uQ29kZVVybC5vcGVyYXRpb24pID09PSBcIkVNQUlMX1NJR05JTlwiIC8qIEVNQUlMX1NJR05JTiAqLztcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYW4gZW1haWwgYW5kIHNpZ24taW4gZW1haWwgbGluay5cclxuICpcclxuICogQHJlbWFya3NcclxuICogSWYgbm8gbGluayBpcyBwYXNzZWQsIHRoZSBsaW5rIGlzIGluZmVycmVkIGZyb20gdGhlIGN1cnJlbnQgVVJMLlxyXG4gKlxyXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQgb3IgT1RQIGluIGVtYWlsIGxpbmsgZXhwaXJlcy5cclxuICpcclxuICogTm90ZTogQ29uZmlybSB0aGUgbGluayBpcyBhIHNpZ24taW4gZW1haWwgbGluayBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCBmaXJlYmFzZS5hdXRoLkF1dGguaXNTaWduSW5XaXRoRW1haWxMaW5rLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGVtYWlsTGluayBmcm9tIHRoZSB1c2VyLlxyXG4gKiBpZihpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWxMaW5rKSkge1xyXG4gKiAgIGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoJ3VzZXJAZXhhbXBsZS5jb20nLCAndXNlckBleGFtcGxlLmNvbScsIGVtYWlsTGluayk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gZW1haWxMaW5rIC0gVGhlIGxpbmsgc2VudCB0byB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCBjcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKGVtYWlsLCBlbWFpbExpbmsgfHwgX2dldEN1cnJlbnRVcmwoKSk7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgdGVuYW50IElEIGluIHRoZSBlbWFpbCBsaW5rIG1hdGNoZXMgdGhlIHRlbmFudCBJRCBvbiBBdXRoXHJcbiAgICAvLyBpbnN0YW5jZS5cclxuICAgIF9hc3NlcnQoY3JlZGVudGlhbC5fdGVuYW50SWQgPT09IChhdXRoTW9kdWxhci50ZW5hbnRJZCB8fCBudWxsKSwgYXV0aE1vZHVsYXIsIFwidGVuYW50LWlkLW1pc21hdGNoXCIgLyogVEVOQU5UX0lEX01JU01BVENIICovKTtcclxuICAgIHJldHVybiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoTW9kdWxhciwgY3JlZGVudGlhbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFVyaShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIFBPU1QgKi8sIFwiL3YxL2FjY291bnRzOmNyZWF0ZUF1dGhVcmlcIiAvKiBDUkVBVEVfQVVUSF9VUkkgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEdldHMgdGhlIGxpc3Qgb2YgcG9zc2libGUgc2lnbiBpbiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBpcyB1c2VmdWwgdG8gZGlmZmVyZW50aWF0ZSBtZXRob2RzIG9mIHNpZ24taW4gZm9yIHRoZSBzYW1lIHByb3ZpZGVyLCBlZy5cclxuICoge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aGljaCBoYXMgMiBtZXRob2RzIG9mIHNpZ24taW4sXHJcbiAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxyXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbCAtIFRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoYXV0aCwgZW1haWwpIHtcclxuICAgIC8vIGNyZWF0ZUF1dGhVcmkgcmV0dXJucyBhbiBlcnJvciBpZiBjb250aW51ZSBVUkkgaXMgbm90IGh0dHAgb3IgaHR0cHMuXHJcbiAgICAvLyBGb3IgZW52aXJvbm1lbnRzIGxpa2UgQ29yZG92YSwgQ2hyb21lIGV4dGVuc2lvbnMsIG5hdGl2ZSBmcmFtZXdvcmtzLCBmaWxlXHJcbiAgICAvLyBzeXN0ZW1zLCBldGMsIHVzZSBodHRwOi8vbG9jYWxob3N0IGFzIGNvbnRpbnVlIFVSTC5cclxuICAgIGNvbnN0IGNvbnRpbnVlVXJpID0gX2lzSHR0cE9ySHR0cHMoKSA/IF9nZXRDdXJyZW50VXJsKCkgOiAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkZW50aWZpZXI6IGVtYWlsLFxyXG4gICAgICAgIGNvbnRpbnVlVXJpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgeyBzaWduaW5NZXRob2RzIH0gPSBhd2FpdCBjcmVhdGVBdXRoVXJpKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgcmVxdWVzdCk7XHJcbiAgICByZXR1cm4gc2lnbmluTWV0aG9kcyB8fCBbXTtcclxufVxyXG4vKipcclxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kRW1haWxWZXJpZmljYXRpb24odXNlciwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2VuZEVtYWlsVmVyaWZpY2F0aW9uKHVzZXIsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICByZXF1ZXN0VHlwZTogXCJWRVJJRllfRU1BSUxcIiAvKiBWRVJJRllfRU1BSUwgKi8sXHJcbiAgICAgICAgaWRUb2tlblxyXG4gICAgfTtcclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uJDEodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xyXG4gICAgaWYgKGVtYWlsICE9PSB1c2VyLmVtYWlsKSB7XHJcbiAgICAgICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSBuZXcgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhlIHVzZXIncyBlbWFpbCB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBvbmUgYWZ0ZXIgYmVpbmcgdmVyaWZpZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIGEgY3VzdG9tIGVtYWlsIGFjdGlvbiBoYW5kbGVyLCB5b3UgY2FuIGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjYWxsaW5nXHJcbiAqIHtAbGluayBhcHBseUFjdGlvbkNvZGV9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodXNlciwgJ25ld2VtYWlsQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSB1cGRhdGUuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsKHVzZXIsIG5ld0VtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTCAqLyxcclxuICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgIG5ld0VtYWlsXHJcbiAgICB9O1xyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IGVtYWlsIH0gPSBhd2FpdCB2ZXJpZnlBbmRDaGFuZ2VFbWFpbCh1c2VySW50ZXJuYWwuYXV0aCwgcmVxdWVzdCk7XHJcbiAgICBpZiAoZW1haWwgIT09IHVzZXIuZW1haWwpIHtcclxuICAgICAgICAvLyBJZiB0aGUgbG9jYWwgY29weSBvZiB0aGUgZW1haWwgb24gdXNlciBpcyBvdXRkYXRlZCwgcmVsb2FkIHRoZVxyXG4gICAgICAgIC8vIHVzZXIuXHJcbiAgICAgICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9maWxlJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92MS9hY2NvdW50czp1cGRhdGVcIiAvKiBTRVRfQUNDT1VOVF9JTkZPICovLCByZXF1ZXN0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVXBkYXRlcyBhIHVzZXIncyBwcm9maWxlIGRhdGEuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm9maWxlIC0gVGhlIHByb2ZpbGUncyBgZGlzcGxheU5hbWVgIGFuZCBgcGhvdG9VUkxgIHRvIHVwZGF0ZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZSh1c2VyLCB7IGRpc3BsYXlOYW1lLCBwaG90b1VSTDogcGhvdG9VcmwgfSkge1xyXG4gICAgaWYgKGRpc3BsYXlOYW1lID09PSB1bmRlZmluZWQgJiYgcGhvdG9VcmwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbigpO1xyXG4gICAgY29uc3QgcHJvZmlsZVJlcXVlc3QgPSB7XHJcbiAgICAgICAgaWRUb2tlbixcclxuICAgICAgICBkaXNwbGF5TmFtZSxcclxuICAgICAgICBwaG90b1VybCxcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodXNlckludGVybmFsLCB1cGRhdGVQcm9maWxlJDEodXNlckludGVybmFsLmF1dGgsIHByb2ZpbGVSZXF1ZXN0KSk7XHJcbiAgICB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWUgPSByZXNwb25zZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xyXG4gICAgdXNlckludGVybmFsLnBob3RvVVJMID0gcmVzcG9uc2UucGhvdG9VcmwgfHwgbnVsbDtcclxuICAgIC8vIFVwZGF0ZSB0aGUgcGFzc3dvcmQgcHJvdmlkZXIgYXMgd2VsbFxyXG4gICAgY29uc3QgcGFzc3dvcmRQcm92aWRlciA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmluZCgoeyBwcm92aWRlcklkIH0pID0+IHByb3ZpZGVySWQgPT09IFwicGFzc3dvcmRcIiAvKiBQQVNTV09SRCAqLyk7XHJcbiAgICBpZiAocGFzc3dvcmRQcm92aWRlcikge1xyXG4gICAgICAgIHBhc3N3b3JkUHJvdmlkZXIuZGlzcGxheU5hbWUgPSB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWU7XHJcbiAgICAgICAgcGFzc3dvcmRQcm92aWRlci5waG90b1VSTCA9IHVzZXJJbnRlcm5hbC5waG90b1VSTDtcclxuICAgIH1cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UpO1xyXG59XHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQW4gZW1haWwgd2lsbCBiZSBzZW50IHRvIHRoZSBvcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChpZiBpdCB3YXMgc2V0KSB0aGF0IGFsbG93cyB0byByZXZva2UgdGhlXHJcbiAqIGVtYWlsIGFkZHJlc3MgY2hhbmdlLCBpbiBvcmRlciB0byBwcm90ZWN0IHRoZW0gZnJvbSBhY2NvdW50IGhpamFja2luZy5cclxuICpcclxuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXHJcbiAqIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXHJcbiAqIHtAbGluayByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVFbWFpbCh1c2VyLCBuZXdFbWFpbCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG5ld0VtYWlsLCBudWxsKTtcclxufVxyXG4vKipcclxuICogVXBkYXRlcyB0aGUgdXNlcidzIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseSBzaWduZWRcclxuICogaW4uIElmIHRoaXMgcmVxdWlyZW1lbnQgaXNuJ3QgbWV0LCBhc2sgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIGFnYWluIGFuZCB0aGVuIGNhbGxcclxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVQYXNzd29yZCh1c2VyLCBuZXdQYXNzd29yZCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG51bGwsIG5ld1Bhc3N3b3JkKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbE9yUGFzc3dvcmQodXNlciwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH07XHJcbiAgICBpZiAoZW1haWwpIHtcclxuICAgICAgICByZXF1ZXN0LmVtYWlsID0gZW1haWw7XHJcbiAgICB9XHJcbiAgICBpZiAocGFzc3dvcmQpIHtcclxuICAgICAgICByZXF1ZXN0LnBhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwgcmVxdWVzdCkpO1xyXG4gICAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUGFyc2UgdGhlIGBBZGRpdGlvbmFsVXNlckluZm9gIGZyb20gdGhlIElEIHRva2VuIHJlc3BvbnNlLlxyXG4gKlxyXG4gKi9cclxuZnVuY3Rpb24gX2Zyb21JZFRva2VuUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKSB7XHJcbiAgICB2YXIgX2EsIF9iO1xyXG4gICAgaWYgKCFpZFRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCB9ID0gaWRUb2tlblJlc3BvbnNlO1xyXG4gICAgY29uc3QgcHJvZmlsZSA9IGlkVG9rZW5SZXNwb25zZS5yYXdVc2VySW5mb1xyXG4gICAgICAgID8gSlNPTi5wYXJzZShpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm8pXHJcbiAgICAgICAgOiB7fTtcclxuICAgIGNvbnN0IGlzTmV3VXNlciA9IGlkVG9rZW5SZXNwb25zZS5pc05ld1VzZXIgfHxcclxuICAgICAgICBpZFRva2VuUmVzcG9uc2Uua2luZCA9PT0gXCJpZGVudGl0eXRvb2xraXQjU2lnbnVwTmV3VXNlclJlc3BvbnNlXCIgLyogU2lnbnVwTmV3VXNlciAqLztcclxuICAgIGlmICghcHJvdmlkZXJJZCAmJiAoaWRUb2tlblJlc3BvbnNlID09PSBudWxsIHx8IGlkVG9rZW5SZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaWRUb2tlblJlc3BvbnNlLmlkVG9rZW4pKSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbkluUHJvdmlkZXIgPSAoX2IgPSAoX2EgPSBfcGFyc2VUb2tlbihpZFRva2VuUmVzcG9uc2UuaWRUb2tlbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maXJlYmFzZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iWydzaWduX2luX3Byb3ZpZGVyJ107XHJcbiAgICAgICAgaWYgKHNpZ25JblByb3ZpZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUHJvdmlkZXJJZCA9IHNpZ25JblByb3ZpZGVyICE9PSBcImFub255bW91c1wiIC8qIEFOT05ZTU9VUyAqLyAmJlxyXG4gICAgICAgICAgICAgICAgc2lnbkluUHJvdmlkZXIgIT09IFwiY3VzdG9tXCIgLyogQ1VTVE9NICovXHJcbiAgICAgICAgICAgICAgICA/IHNpZ25JblByb3ZpZGVyXHJcbiAgICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICAgIC8vIFVzZXMgZ2VuZXJpYyBjbGFzcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGxlZ2FjeSBTREsuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIGZpbHRlcmVkUHJvdmlkZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFwcm92aWRlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHByb3ZpZGVySWQpIHtcclxuICAgICAgICBjYXNlIFwiZmFjZWJvb2suY29tXCIgLyogRkFDRUJPT0sgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwiZ2l0aHViLmNvbVwiIC8qIEdJVEhVQiAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHaXRodWJBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwiZ29vZ2xlLmNvbVwiIC8qIEdPT0dMRSAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHb29nbGVBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwidHdpdHRlci5jb21cIiAvKiBUV0lUVEVSICovOlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFR3aXR0ZXJBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlLCBpZFRva2VuUmVzcG9uc2Uuc2NyZWVuTmFtZSB8fCBudWxsKTtcclxuICAgICAgICBjYXNlIFwiY3VzdG9tXCIgLyogQ1VTVE9NICovOlxyXG4gICAgICAgIGNhc2UgXCJhbm9ueW1vdXNcIiAvKiBBTk9OWU1PVVMgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIG51bGwpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xyXG4gICAgY29uc3RydWN0b3IoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlID0ge30pIHtcclxuICAgICAgICB0aGlzLmlzTmV3VXNlciA9IGlzTmV3VXNlcjtcclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBwcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUsIHVzZXJuYW1lKSB7XHJcbiAgICAgICAgc3VwZXIoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlKTtcclxuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8gZXh0ZW5kcyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvIHtcclxuICAgIGNvbnN0cnVjdG9yKGlzTmV3VXNlciwgcHJvZmlsZSkge1xyXG4gICAgICAgIHN1cGVyKGlzTmV3VXNlciwgXCJmYWNlYm9vay5jb21cIiAvKiBGQUNFQk9PSyAqLywgcHJvZmlsZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgR2l0aHViQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIHtcclxuICAgIGNvbnN0cnVjdG9yKGlzTmV3VXNlciwgcHJvZmlsZSkge1xyXG4gICAgICAgIHN1cGVyKGlzTmV3VXNlciwgXCJnaXRodWIuY29tXCIgLyogR0lUSFVCICovLCBwcm9maWxlLCB0eXBlb2YgKHByb2ZpbGUgPT09IG51bGwgfHwgcHJvZmlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvZmlsZS5sb2dpbikgPT09ICdzdHJpbmcnID8gcHJvZmlsZSA9PT0gbnVsbCB8fCBwcm9maWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9maWxlLmxvZ2luIDogbnVsbCk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgR29vZ2xlQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb2ZpbGUpIHtcclxuICAgICAgICBzdXBlcihpc05ld1VzZXIsIFwiZ29vZ2xlLmNvbVwiIC8qIEdPT0dMRSAqLywgcHJvZmlsZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb2ZpbGUsIHNjcmVlbk5hbWUpIHtcclxuICAgICAgICBzdXBlcihpc05ld1VzZXIsIFwidHdpdHRlci5jb21cIiAvKiBUV0lUVEVSICovLCBwcm9maWxlLCBzY3JlZW5OYW1lKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRXh0cmFjdHMgcHJvdmlkZXIgc3BlY2lmaWMge0BsaW5rIEFkZGl0aW9uYWxVc2VySW5mb30gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsVXNlckluZm8odXNlckNyZWRlbnRpYWwpIHtcclxuICAgIGNvbnN0IHsgdXNlciwgX3Rva2VuUmVzcG9uc2UgfSA9IHVzZXJDcmVkZW50aWFsO1xyXG4gICAgaWYgKHVzZXIuaXNBbm9ueW1vdXMgJiYgIV90b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgc2lnbkluQW5vbnltb3VzbHkoKSBnZXRzIGNhbGxlZCB0d2ljZS5cclxuICAgICAgICAvLyBObyBuZXR3b3JrIGNhbGwgaXMgbWFkZSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gYWN0dWFsbHkgZmlsbCB0aGlzIGluXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogbnVsbCxcclxuICAgICAgICAgICAgaXNOZXdVc2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgcHJvZmlsZTogbnVsbFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX2Zyb21JZFRva2VuUmVzcG9uc2UoX3Rva2VuUmVzcG9uc2UpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIE5vbi1vcHRpb25hbCBhdXRoIG1ldGhvZHMuXHJcbi8qKlxyXG4gKiBDaGFuZ2VzIHRoZSB0eXBlIG9mIHBlcnNpc3RlbmNlIG9uIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50bHkgc2F2ZWRcclxuICogYEF1dGhgIHNlc3Npb24gYW5kIGFwcGxpZXMgdGhpcyB0eXBlIG9mIHBlcnNpc3RlbmNlIGZvciBmdXR1cmUgc2lnbi1pbiByZXF1ZXN0cywgaW5jbHVkaW5nXHJcbiAqIHNpZ24taW4gd2l0aCByZWRpcmVjdCByZXF1ZXN0cy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBtYWtlcyBpdCBlYXN5IGZvciBhIHVzZXIgc2lnbmluZyBpbiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlaXIgc2Vzc2lvbiBzaG91bGQgYmVcclxuICogcmVtZW1iZXJlZCBvciBub3QuIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIG5ldmVyIHBlcnNpc3QgdGhlIGBBdXRoYCBzdGF0ZSBmb3IgYXBwbGljYXRpb25zXHJcbiAqIHRoYXQgYXJlIHNoYXJlZCBieSBvdGhlciB1c2VycyBvciBoYXZlIHNlbnNpdGl2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHNldFBlcnNpc3RlbmNlKGF1dGgsIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gcGVyc2lzdGVuY2UgLSBUaGUge0BsaW5rIFBlcnNpc3RlbmNlfSB0byB1c2UuXHJcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGVyc2lzdGVuY2UgY2hhbmdlIGhhcyBjb21wbGV0ZWRcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2V0UGVyc2lzdGVuY2UoYXV0aCwgcGVyc2lzdGVuY2UpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGFuIG9ic2VydmVyIGZvciBjaGFuZ2VzIHRvIHRoZSBzaWduZWQtaW4gdXNlcidzIElEIHRva2VuLCB3aGljaCBpbmNsdWRlcyBzaWduLWluLFxyXG4gKiBzaWduLW91dCwgYW5kIHRva2VuIHJlZnJlc2ggZXZlbnRzLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBuZXh0T3JPYnNlcnZlciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBjaGFuZ2UuXHJcbiAqIEBwYXJhbSBlcnJvciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBlcnJvci5cclxuICogQHBhcmFtIGNvbXBsZXRlZCAtIGNhbGxiYWNrIHRyaWdnZXJlZCB3aGVuIG9ic2VydmVyIGlzIHJlbW92ZWQuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIG9uSWRUb2tlbkNoYW5nZWQoYXV0aCwgbmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkub25JZFRva2VuQ2hhbmdlZChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbn1cclxuLyoqXHJcbiAqIEFkZHMgYW4gb2JzZXJ2ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHVzZXIncyBzaWduLWluIHN0YXRlLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUbyBrZWVwIHRoZSBvbGQgYmVoYXZpb3IsIHNlZSB7QGxpbmsgb25JZFRva2VuQ2hhbmdlZH0uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIG5leHRPck9ic2VydmVyIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGNoYW5nZS5cclxuICogQHBhcmFtIGVycm9yIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGVycm9yLlxyXG4gKiBAcGFyYW0gY29tcGxldGVkIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gb2JzZXJ2ZXIgaXMgcmVtb3ZlZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gb25BdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLm9uQXV0aFN0YXRlQ2hhbmdlZChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGRlZmF1bHQgZGV2aWNlL2Jyb3dzZXIgcHJlZmVyZW5jZS5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1c2VEZXZpY2VMYW5ndWFnZShhdXRoKSB7XHJcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkudXNlRGV2aWNlTGFuZ3VhZ2UoKTtcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2V0cyB0aGUgcHJvdmlkZWQgdXNlciBhcyB7QGxpbmsgQXV0aC5jdXJyZW50VXNlcn0gb24gdGhlXHJcbiAqIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQSBuZXcgaW5zdGFuY2UgY29weSBvZiB0aGUgdXNlciBwcm92aWRlZCB3aWxsIGJlIG1hZGUgYW5kIHNldCBhcyBjdXJyZW50VXNlci5cclxuICpcclxuICogVGhpcyB3aWxsIHRyaWdnZXIge0BsaW5rIG9uQXV0aFN0YXRlQ2hhbmdlZH0gYW5kIHtAbGluayBvbklkVG9rZW5DaGFuZ2VkfSBsaXN0ZW5lcnNcclxuICogbGlrZSBvdGhlciBzaWduIGluIG1ldGhvZHMuXHJcbiAqXHJcbiAqIFRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgRmlyZWJhc2VcclxuICogcHJvamVjdC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSBuZXcge0BsaW5rIFVzZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVDdXJyZW50VXNlcihhdXRoLCB1c2VyKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVwZGF0ZUN1cnJlbnRVc2VyKHVzZXIpO1xyXG59XHJcbi8qKlxyXG4gKiBTaWducyBvdXQgdGhlIGN1cnJlbnQgdXNlci5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzaWduT3V0KGF1dGgpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2lnbk91dCgpO1xyXG59XHJcbi8qKlxyXG4gKiBEZWxldGVzIGFuZCBzaWducyBvdXQgdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEltcG9ydGFudDogdGhpcyBpcyBhIHNlY3VyaXR5LXNlbnNpdGl2ZSBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyB0aGUgdXNlciB0byBoYXZlIHJlY2VudGx5XHJcbiAqIHNpZ25lZCBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxyXG4gKiB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbH0uXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVVzZXIodXNlcikge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKS5kZWxldGUoKTtcclxufVxuXG5jbGFzcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGNyZWRlbnRpYWwpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21JZHRva2VuKGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXCJlbnJvbGxcIiAvKiBFTlJPTEwgKi8sIGlkVG9rZW4pO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIF9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwobWZhUGVuZGluZ0NyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXCJzaWduaW5cIiAvKiBTSUdOX0lOICovLCBtZmFQZW5kaW5nQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50eXBlID09PSBcImVucm9sbFwiIC8qIEVOUk9MTCAqL1xyXG4gICAgICAgICAgICA/ICdpZFRva2VuJ1xyXG4gICAgICAgICAgICA6ICdwZW5kaW5nQ3JlZGVudGlhbCc7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbXVsdGlGYWN0b3JTZXNzaW9uOiB7XHJcbiAgICAgICAgICAgICAgICBba2V5XTogdGhpcy5jcmVkZW50aWFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKG9iaikge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5tdWx0aUZhY3RvclNlc3Npb24pIHtcclxuICAgICAgICAgICAgaWYgKChfYSA9IG9iai5tdWx0aUZhY3RvclNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChvYmoubXVsdGlGYWN0b3JTZXNzaW9uLnBlbmRpbmdDcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoX2IgPSBvYmoubXVsdGlGYWN0b3JTZXNzaW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWRUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21JZHRva2VuKG9iai5tdWx0aUZhY3RvclNlc3Npb24uaWRUb2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwge1xyXG4gICAgY29uc3RydWN0b3Ioc2Vzc2lvbiwgaGludHMsIHNpZ25JblJlc29sdmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuICAgICAgICB0aGlzLmhpbnRzID0gaGludHM7XHJcbiAgICAgICAgdGhpcy5zaWduSW5SZXNvbHZlciA9IHNpZ25JblJlc29sdmVyO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tRXJyb3IoYXV0aEV4dGVybiwgZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xyXG4gICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U7XHJcbiAgICAgICAgY29uc3QgaGludHMgPSAoc2VydmVyUmVzcG9uc2UubWZhSW5mbyB8fCBbXSkubWFwKGVucm9sbG1lbnQgPT4gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpKTtcclxuICAgICAgICBfYXNzZXJ0KHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwoc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWwpO1xyXG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwoc2Vzc2lvbiwgaGludHMsIGFzeW5jIChhc3NlcnRpb24pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWZhUmVzcG9uc2UgPSBhd2FpdCBhc3NlcnRpb24uX3Byb2Nlc3MoYXV0aCwgc2Vzc2lvbik7XHJcbiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgdW5uZWVkZWQgZmllbGRzIGZyb20gdGhlIG9sZCBsb2dpbiByZXNwb25zZVxyXG4gICAgICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhSW5mbztcclxuICAgICAgICAgICAgZGVsZXRlIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsO1xyXG4gICAgICAgICAgICAvLyBVc2UgaW4gdGhlIG5ldyB0b2tlbiAmIHJlZnJlc2ggdG9rZW4gaW4gdGhlIG9sZCByZXNwb25zZVxyXG4gICAgICAgICAgICBjb25zdCBpZFRva2VuUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNlcnZlclJlc3BvbnNlKSwgeyBpZFRva2VuOiBtZmFSZXNwb25zZS5pZFRva2VuLCByZWZyZXNoVG9rZW46IG1mYVJlc3BvbnNlLnJlZnJlc2hUb2tlbiB9KTtcclxuICAgICAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGNvbGxhcHNlIHRoaXMgc3dpdGNoIHN0YXRlbWVudCBpbnRvIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uIGFuZCBoYXZlIGl0IHN1cHBvcnQgdGhlIFNJR05fSU4gY2FzZVxyXG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yLm9wZXJhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJzaWduSW5cIiAvKiBTSUdOX0lOICovOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGgsIGVycm9yLm9wZXJhdGlvblR5cGUsIGlkVG9rZW5SZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXV0aC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInJlYXV0aGVudGljYXRlXCIgLyogUkVBVVRIRU5USUNBVEUgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgX2Fzc2VydChlcnJvci51c2VyLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBVc2VyQ3JlZGVudGlhbEltcGwuX2Zvck9wZXJhdGlvbihlcnJvci51c2VyLCBlcnJvci5vcGVyYXRpb25UeXBlLCBpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXNvbHZlU2lnbkluKGFzc2VydGlvbkV4dGVybikge1xyXG4gICAgICAgIGNvbnN0IGFzc2VydGlvbiA9IGFzc2VydGlvbkV4dGVybjtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5SZXNvbHZlcihhc3NlcnRpb24pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQcm92aWRlcyBhIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyfSBzdWl0YWJsZSBmb3IgY29tcGxldGlvbiBvZiBhXHJcbiAqIG11bHRpLWZhY3RvciBmbG93LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSB7QGxpbmsgTXVsdGlGYWN0b3JFcnJvcn0gcmFpc2VkIGR1cmluZyBhIHNpZ24taW4sIG9yXHJcbiAqIHJlYXV0aGVudGljYXRpb24gb3BlcmF0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRNdWx0aUZhY3RvclJlc29sdmVyKGF1dGgsIGVycm9yKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcclxuICAgIGNvbnN0IGVycm9ySW50ZXJuYWwgPSBlcnJvcjtcclxuICAgIF9hc3NlcnQoZXJyb3IuY3VzdG9tRGF0YS5vcGVyYXRpb25UeXBlLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIF9hc3NlcnQoKF9hID0gZXJyb3JJbnRlcm5hbC5jdXN0b21EYXRhLl9zZXJ2ZXJSZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIHJldHVybiBNdWx0aUZhY3RvclJlc29sdmVySW1wbC5fZnJvbUVycm9yKGF1dGhNb2R1bGFyLCBlcnJvckludGVybmFsKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBzdGFydEVucm9sbFBob25lTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhRW5yb2xsbWVudDpzdGFydFwiIC8qIFNUQVJUX1BIT05FX01GQV9FTlJPTExNRU5UICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XHJcbmZ1bmN0aW9uIGZpbmFsaXplRW5yb2xsUGhvbmVNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplXCIgLyogRklOQUxJWkVfUEhPTkVfTUZBX0VOUk9MTE1FTlQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gd2l0aGRyYXdNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OndpdGhkcmF3XCIgLyogV0lUSERSQVdfTUZBICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XG5cbmNsYXNzIE11bHRpRmFjdG9yVXNlckltcGwge1xyXG4gICAgY29uc3RydWN0b3IodXNlcikge1xyXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5lbnJvbGxlZEZhY3RvcnMgPSBbXTtcclxuICAgICAgICB1c2VyLl9vblJlbG9hZCh1c2VySW5mbyA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VySW5mby5tZmFJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IHVzZXJJbmZvLm1mYUluZm8ubWFwKGVucm9sbG1lbnQgPT4gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKHVzZXIuYXV0aCwgZW5yb2xsbWVudCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21Vc2VyKHVzZXIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yVXNlckltcGwodXNlcik7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRTZXNzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tSWR0b2tlbihhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGVucm9sbChhc3NlcnRpb25FeHRlcm4sIGRpc3BsYXlOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuO1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCkpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsaXplTWZhUmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh0aGlzLnVzZXIsIGFzc2VydGlvbi5fcHJvY2Vzcyh0aGlzLnVzZXIuYXV0aCwgc2Vzc2lvbiwgZGlzcGxheU5hbWUpKTtcclxuICAgICAgICAvLyBOZXcgdG9rZW5zIHdpbGwgYmUgaXNzdWVkIGFmdGVyIGVucm9sbG1lbnQgb2YgdGhlIG5ldyBzZWNvbmQgZmFjdG9ycy5cclxuICAgICAgICAvLyBUaGV5IG5lZWQgdG8gYmUgdXBkYXRlZCBvbiB0aGUgdXNlci5cclxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGZpbmFsaXplTWZhUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIGdldCB0aGUgbmV3IG11bHRpLWZhY3RvciBpbmZvcm1hdGlvblxyXG4gICAgICAgIC8vIGZyb20gc2VydmVyLiBVU0VSX1JFTE9BREVEIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIGFuZCBgZW5yb2xsZWRGYWN0b3JzYFxyXG4gICAgICAgIC8vIHdpbGwgYmUgdXBkYXRlZC5cclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdW5lbnJvbGwoaW5mb09yVWlkKSB7XHJcbiAgICAgICAgY29uc3QgbWZhRW5yb2xsbWVudElkID0gdHlwZW9mIGluZm9PclVpZCA9PT0gJ3N0cmluZycgPyBpbmZvT3JVaWQgOiBpbmZvT3JVaWQudWlkO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMudXNlciwgd2l0aGRyYXdNZmEodGhpcy51c2VyLmF1dGgsIHtcclxuICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgbWZhRW5yb2xsbWVudElkXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgc2Vjb25kIGZhY3RvciBmcm9tIHRoZSB1c2VyJ3MgbGlzdC5cclxuICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IHRoaXMuZW5yb2xsZWRGYWN0b3JzLmZpbHRlcigoeyB1aWQgfSkgPT4gdWlkICE9PSBtZmFFbnJvbGxtZW50SWQpO1xyXG4gICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBiYWNrZW5kIGRlY2lkZWQgdG8gcmV2b2tlIHRoZSB1c2VyJ3Mgc2Vzc2lvbixcclxuICAgICAgICAvLyB0aGUgdG9rZW5SZXNwb25zZSBtYXkgYmUgZW1wdHkuIElmIHRoZSB0b2tlbnMgd2VyZSBub3QgdXBkYXRlZCAoYW5kIHRoZXlcclxuICAgICAgICAvLyBhcmUgbm93IGludmFsaWQpLCByZWxvYWRpbmcgdGhlIHVzZXIgd2lsbCBkaXNjb3ZlciB0aGlzIGFuZCBpbnZhbGlkYXRlXHJcbiAgICAgICAgLy8gdGhlIHVzZXIncyBzdGF0ZSBhY2NvcmRpbmdseS5cclxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGlkVG9rZW5SZXNwb25zZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyLnJlbG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5jb2RlICE9PSBgYXV0aC8ke1widXNlci10b2tlbi1leHBpcmVkXCIgLyogVE9LRU5fRVhQSVJFRCAqL31gKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IG11bHRpRmFjdG9yVXNlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuLyoqXHJcbiAqIFRoZSB7QGxpbmsgTXVsdGlGYWN0b3JVc2VyfSBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBtdWx0aS1mYWN0b3IgcHJvcGVydGllcyBhbmQgb3BlcmF0aW9ucyByZWxhdGVkIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBtdWx0aUZhY3Rvcih1c2VyKSB7XHJcbiAgICBjb25zdCB1c2VyTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGlmICghbXVsdGlGYWN0b3JVc2VyQ2FjaGUuaGFzKHVzZXJNb2R1bGFyKSkge1xyXG4gICAgICAgIG11bHRpRmFjdG9yVXNlckNhY2hlLnNldCh1c2VyTW9kdWxhciwgTXVsdGlGYWN0b3JVc2VySW1wbC5fZnJvbVVzZXIodXNlck1vZHVsYXIpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtdWx0aUZhY3RvclVzZXJDYWNoZS5nZXQodXNlck1vZHVsYXIpO1xyXG59XG5cbmNvbnN0IFNUT1JBR0VfQVZBSUxBQkxFX0tFWSA9ICdfX3Nhayc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGJyb3dzZXIgcGVyc2lzdGVuY2UgdHlwZXM6IGxvY2FsIGFuZCBzZXNzaW9uLlxyXG4vLyBCb3RoIGhhdmUgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYnV0IHVzZSBhIGRpZmZlcmVudCB1bmRlcmx5aW5nIHN0b3JhZ2VcclxuLy8gb2JqZWN0LlxyXG5jbGFzcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB7XHJcbiAgICBjb25zdHJ1Y3RvcihzdG9yYWdlUmV0cmlldmVyLCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlUmV0cmlldmVyID0gc3RvcmFnZVJldHJpZXZlcjtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG4gICAgX2lzQXZhaWxhYmxlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yYWdlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBqc29uID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGpzb24gPyBKU09OLnBhcnNlKGpzb24pIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHN0b3JhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVJldHJpZXZlcigpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSgpIHtcclxuICAgIGNvbnN0IHVhID0gZ2V0VUEoKTtcclxuICAgIHJldHVybiBfaXNTYWZhcmkodWEpIHx8IF9pc0lPUyh1YSk7XHJcbn1cclxuLy8gVGhlIHBvbGxpbmcgcGVyaW9kIGluIGNhc2UgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkXHJcbmNvbnN0IF9QT0xMSU5HX0lOVEVSVkFMX01TJDEgPSAxMDAwO1xyXG4vLyBUaGUgSUUgMTAgbG9jYWxTdG9yYWdlIGNyb3NzIHRhYiBzeW5jaHJvbml6YXRpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXHJcbmNvbnN0IElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZID0gMTA7XHJcbmNsYXNzIEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKCkgPT4gd2luZG93LmxvY2FsU3RvcmFnZSwgXCJMT0NBTFwiIC8qIExPQ0FMICovKTtcclxuICAgICAgICB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyID0gKGV2ZW50LCBwb2xsKSA9PiB0aGlzLm9uU3RvcmFnZUV2ZW50KGV2ZW50LCBwb2xsKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZSA9IHt9O1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQgcmV0dXJuIHZhbHVlIGlzIHBsYXRmb3JtIHNwZWNpZmljXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgLy8gU2FmYXJpIG9yIGlPUyBicm93c2VyIGFuZCBlbWJlZGRlZCBpbiBhbiBpZnJhbWUuXHJcbiAgICAgICAgdGhpcy5zYWZhcmlMb2NhbFN0b3JhZ2VOb3RTeW5jZWQgPSBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKSAmJiBfaXNJZnJhbWUoKTtcclxuICAgICAgICAvLyBXaGV0aGVyIHRvIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgZGVwZW5kaW5nIG9uIHdpbmRvdyBldmVudHNcclxuICAgICAgICB0aGlzLmZhbGxiYWNrVG9Qb2xsaW5nID0gX2lzTW9iaWxlQnJvd3NlcigpO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvckFsbENoYW5nZWRLZXlzKGNiKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgYWxsIGtleXMgd2l0aCBsaXN0ZW5lcnMgb24gdGhlbS5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykpIHtcclxuICAgICAgICAgICAgLy8gR2V0IHZhbHVlIGZyb20gbG9jYWxTdG9yYWdlLlxyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2NhbENhY2hlW2tleV07XHJcbiAgICAgICAgICAgIC8vIElmIGxvY2FsIG1hcCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgdHJpZ2dlciBsaXN0ZW5lciB3aXRoIHN0b3JhZ2UgZXZlbnQuXHJcbiAgICAgICAgICAgIC8vIERpZmZlcmVudGlhdGUgdGhpcyBzaW11bGF0ZWQgZXZlbnQgZnJvbSB0aGUgcmVhbCBzdG9yYWdlIGV2ZW50LlxyXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjYihrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvblN0b3JhZ2VFdmVudChldmVudCwgcG9sbCA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gS2V5IHdvdWxkIGJlIG51bGwgaW4gc29tZSBzaXR1YXRpb25zLCBsaWtlIHdoZW4gbG9jYWxTdG9yYWdlIGlzIGNsZWFyZWRcclxuICAgICAgICBpZiAoIWV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvckFsbENoYW5nZWRLZXlzKChrZXksIF9vbGRWYWx1ZSwgbmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhlIG1lY2hhbmlzbSBob3cgdGhpcyBldmVudCB3YXMgZGV0ZWN0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IGV2ZW50IHdpbGwgZGljdGF0ZSB0aGUgbWVjaGFuaXNtIHRvIGJlIHVzZWQuXHJcbiAgICAgICAgaWYgKHBvbGwpIHtcclxuICAgICAgICAgICAgLy8gRW52aXJvbm1lbnQgZGV0ZWN0cyBzdG9yYWdlIGNoYW5nZXMgdmlhIHBvbGxpbmcuXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyIHRvIHByZXZlbnQgcG9zc2libGUgZXZlbnQgZHVwbGljYXRpb24uXHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyLlxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgcG9sbGluZyBsaXN0ZW5lciB0byBwcmV2ZW50IHBvc3NpYmxlIGV2ZW50IGR1cGxpY2F0aW9uLlxyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhZmFyaSBlbWJlZGRlZCBpZnJhbWUuIFN0b3JhZ2UgZXZlbnQgd2lsbCB0cmlnZ2VyIHdpdGggdGhlIGRlbHRhXHJcbiAgICAgICAgLy8gY2hhbmdlcyBidXQgbm8gY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGlmcmFtZSBsb2NhbFN0b3JhZ2UuXHJcbiAgICAgICAgaWYgKHRoaXMuc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkKSB7XHJcbiAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IGlmcmFtZSBwYWdlIHZhbHVlLlxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIC8vIFZhbHVlIG5vdCBzeW5jaHJvbml6ZWQsIHN5bmNocm9uaXplIG1hbnVhbGx5LlxyXG4gICAgICAgICAgICBpZiAoZXZlbnQubmV3VmFsdWUgIT09IHN0b3JlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubmV3VmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWYWx1ZSBjaGFuZ2VkIGZyb20gY3VycmVudCB2YWx1ZS5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIGV2ZW50Lm5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgdmFsdWUgZGVsZXRlZC5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9jYWxDYWNoZVtrZXldID09PSBldmVudC5uZXdWYWx1ZSAmJiAhcG9sbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBkZXRlY3RlZCBhbmQgcHJvY2Vzc2VkLCBkbyBub3QgdHJpZ2dlciBsaXN0ZW5lcnMgYWdhaW4uXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdHJpZ2dlckxpc3RlbmVycyA9ICgpID0+IHtcclxuICAgICAgICAgICAgLy8gS2VlcCBsb2NhbCBtYXAgdXAgdG8gZGF0ZSBpbiBjYXNlIHN0b3JhZ2UgZXZlbnQgaXMgdHJpZ2dlcmVkIGJlZm9yZVxyXG4gICAgICAgICAgICAvLyBwb2xsLlxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGlmICghcG9sbCAmJiB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9PT0gc3RvcmVkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlYWwgc3RvcmFnZSBldmVudCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkLCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyB0byB0cmlnZ2VyIGluIHNvbWUgSUUgYnJvd3NlcnMgZm9yIHNvbWUgcmVhc29uLlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgc3RvcmVkVmFsdWUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIGlmIChfaXNJRTEwKCkgJiZcclxuICAgICAgICAgICAgc3RvcmVkVmFsdWUgIT09IGV2ZW50Lm5ld1ZhbHVlICYmXHJcbiAgICAgICAgICAgIGV2ZW50Lm5ld1ZhbHVlICE9PSBldmVudC5vbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBJRSAxMCBoYXMgdGhpcyB3ZWlyZCBidWcgd2hlcmUgYSBzdG9yYWdlIGV2ZW50IHdvdWxkIHRyaWdnZXIgd2l0aCB0aGVcclxuICAgICAgICAgICAgLy8gY29ycmVjdCBrZXksIG9sZFZhbHVlIGFuZCBuZXdWYWx1ZSBidXQgbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSBkb2VzXHJcbiAgICAgICAgICAgIC8vIG5vdCB5aWVsZCB0aGUgdXBkYXRlZCB2YWx1ZSB1bnRpbCBhIGZldyBtaWxsaXNlY29uZHMuIFRoaXMgZW5zdXJlc1xyXG4gICAgICAgICAgICAvLyB0aGlzIHJlY292ZXJzIGZyb20gdGhhdCBzaXR1YXRpb24uXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQodHJpZ2dlckxpc3RlbmVycywgSUUxMF9MT0NBTF9TVE9SQUdFX1NZTkNfREVMQVkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdHJpZ2dlckxpc3RlbmVycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG5vdGlmeUxpc3RlbmVycyhrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1trZXldO1xyXG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBBcnJheS5mcm9tKGxpc3RlbmVycykpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHZhbHVlID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGFydFBvbGxpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvckFsbENoYW5nZWRLZXlzKChrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblN0b3JhZ2VFdmVudChuZXcgU3RvcmFnZUV2ZW50KCdzdG9yYWdlJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZVxyXG4gICAgICAgICAgICAgICAgfSksIFxyXG4gICAgICAgICAgICAgICAgLyogcG9sbCAqLyB0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgX1BPTExJTkdfSU5URVJWQUxfTVMkMSk7XHJcbiAgICB9XHJcbiAgICBzdG9wUG9sbGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhdHRhY2hMaXN0ZW5lcigpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZGV0YWNoTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIF9hZGRMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgLy8gV2hldGhlciBicm93c2VyIGNhbiBkZXRlY3Qgc3RvcmFnZSBldmVudCB3aGVuIGl0IGhhZCBhbHJlYWR5IGJlZW4gcHVzaGVkIHRvIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgICAgICAvLyBUaGlzIG1heSBoYXBwZW4gaW4gc29tZSBtb2JpbGUgYnJvd3NlcnMuIEEgbG9jYWxTdG9yYWdlIGNoYW5nZSBpbiB0aGUgZm9yZWdyb3VuZCB3aW5kb3dcclxuICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgZGV0ZWN0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2luZG93IHZpYSB0aGUgc3RvcmFnZSBldmVudC5cclxuICAgICAgICAgICAgLy8gVGhpcyB3YXMgZGV0ZWN0ZWQgaW4gaU9TIDcueCBtb2JpbGUgYnJvd3NlcnNcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmFsbGJhY2tUb1BvbGxpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaExpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBjYWNoZSB0byBhdm9pZCBzcHVyaW91c2x5IHRyaWdnZXJpbmcgb24gZmlyc3QgcG9sbC5cclxuICAgICAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldLmFkZChsaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlTGlzdGVuZXIoa2V5LCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubGlzdGVuZXJzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kZXRhY2hMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlIG9uIGJhc2Ugb3BlcmF0aW9uczpcclxuICAgIGFzeW5jIF9zZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLl9zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0KGtleSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgc3VwZXIuX2dldChrZXkpO1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9yZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgYXdhaXQgc3VwZXIuX3JlbW92ZShrZXkpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcclxuICAgIH1cclxufVxyXG5Ccm93c2VyTG9jYWxQZXJzaXN0ZW5jZS50eXBlID0gJ0xPQ0FMJztcclxuLyoqXHJcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBsb2NhbFN0b3JhZ2VgXHJcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSA9IEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBCcm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKCkgPT4gd2luZG93LnNlc3Npb25TdG9yYWdlLCBcIlNFU1NJT05cIiAvKiBTRVNTSU9OICovKTtcclxuICAgIH1cclxuICAgIF9hZGRMaXN0ZW5lcihfa2V5LCBfbGlzdGVuZXIpIHtcclxuICAgICAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHNlc3Npb24gc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3JlbW92ZUxpc3RlbmVyKF9rZXksIF9saXN0ZW5lcikge1xyXG4gICAgICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cclxuQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZS50eXBlID0gJ1NFU1NJT04nO1xyXG4vKipcclxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiBgU0VTU0lPTmAgdXNpbmcgYHNlc3Npb25TdG9yYWdlYFxyXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSA9IEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTaGltIGZvciBQcm9taXNlLmFsbFNldHRsZWQsIG5vdGUgdGhlIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtYXQgb2YgYGZ1bGZpbGxlZGAgdnMgYHN0YXR1c2AuXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm9taXNlcyAtIEFycmF5IG9mIHByb21pc2VzIHRvIHdhaXQgb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBfYWxsU2V0dGxlZChwcm9taXNlcykge1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcChhc3luYyAocHJvbWlzZSkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvbWlzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChyZWFzb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGZ1bGZpbGxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZWFzb25cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEludGVyZmFjZSBjbGFzcyBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLlxyXG4gKlxyXG4gKi9cclxuY2xhc3MgUmVjZWl2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoZXZlbnRUYXJnZXQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJnZXQ7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVyc01hcCA9IHt9O1xyXG4gICAgICAgIHRoaXMuYm91bmRFdmVudEhhbmRsZXIgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9idGFpbiBhbiBpbnN0YW5jZSBvZiBhIFJlY2VpdmVyIGZvciBhIGdpdmVuIGV2ZW50IHRhcmdldCwgaWYgbm9uZSBleGlzdHMgaXQgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudFRhcmdldCAtIEFuIGV2ZW50IHRhcmdldCAoc3VjaCBhcyB3aW5kb3cgb3Igc2VsZikgdGhyb3VnaCB3aGljaCB0aGUgdW5kZXJseWluZ1xyXG4gICAgICogbWVzc2FnZXMgd2lsbCBiZSByZWNlaXZlZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIF9nZXRJbnN0YW5jZShldmVudFRhcmdldCkge1xyXG4gICAgICAgIC8vIFRoZSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgc2luY2Ugb2JqZWN0cyBjYW4ndCBiZSBrZXlzIGZvciBvdGhlclxyXG4gICAgICAgIC8vIG9iamVjdHMuIEluIGFkZGl0aW9uLCBzZXR0aW5nIGEgdW5pcXVlIHByb3BlcnR5IG9uIGFuIGV2ZW50IHRhcmdldCBhcyBhXHJcbiAgICAgICAgLy8gaGFzaCBtYXAga2V5IG1heSBub3QgYmUgYWxsb3dlZCBkdWUgdG8gQ09SUyByZXN0cmljdGlvbnMuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMucmVjZWl2ZXJzLmZpbmQocmVjZWl2ZXIgPT4gcmVjZWl2ZXIuaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldCkpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBSZWNlaXZlcihldmVudFRhcmdldCk7XHJcbiAgICAgICAgdGhpcy5yZWNlaXZlcnMucHVzaChuZXdJbnN0YW5jZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmV2ZW50VGFyZ2V0ID09PSBldmVudFRhcmdldDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmFucyBvdXQgYSBNZXNzYWdlRXZlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogU2VuZHMgYW4ge0BsaW5rIFN0YXR1cy5BQ0t9IHVwb24gcmVjZWlwdCBhbmQgYSB7QGxpbmsgU3RhdHVzLkRPTkV9IG9uY2UgYWxsIGhhbmRsZXJzIGhhdmVcclxuICAgICAqIGZpbmlzaGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIE1lc3NhZ2VFdmVudC5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGhhbmRsZUV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQ7XHJcbiAgICAgICAgY29uc3QgeyBldmVudElkLCBldmVudFR5cGUsIGRhdGEgfSA9IG1lc3NhZ2VFdmVudC5kYXRhO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdO1xyXG4gICAgICAgIGlmICghKGhhbmRsZXJzID09PSBudWxsIHx8IGhhbmRsZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoYW5kbGVycy5zaXplKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lc3NhZ2VFdmVudC5wb3J0c1swXS5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIHN0YXR1czogXCJhY2tcIiAvKiBBQ0sgKi8sXHJcbiAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShoYW5kbGVycykubWFwKGFzeW5jIChoYW5kbGVyKSA9PiBoYW5kbGVyKG1lc3NhZ2VFdmVudC5vcmlnaW4sIGRhdGEpKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9hbGxTZXR0bGVkKHByb21pc2VzKTtcclxuICAgICAgICBtZXNzYWdlRXZlbnQucG9ydHNbMF0ucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBzdGF0dXM6IFwiZG9uZVwiIC8qIERPTkUgKi8sXHJcbiAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgcmVzcG9uc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIF9zdWJzY3JpYmUoZXZlbnRUeXBlLCBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0gPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5hZGQoZXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgYW4gZXZlbnQgaGFuZGxlciBmcm9tIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byB1bnN1YnNjcmliZSBmcm9tLlxyXG4gICAgICogQHBhcmFtIGV2ZW50SGFuZGxlciAtIE9wdGlub2FsIGV2ZW50IGhhbmRsZXIsIGlmIG5vbmUgcHJvdmlkZWQsIHVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBvbiB0aGlzIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgX3Vuc3Vic2NyaWJlKGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSAmJiBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLmRlbGV0ZShldmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWV2ZW50SGFuZGxlciB8fCB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0uc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5SZWNlaXZlci5yZWNlaXZlcnMgPSBbXTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dlbmVyYXRlRXZlbnRJZChwcmVmaXggPSAnJywgZGlnaXRzID0gMTApIHtcclxuICAgIGxldCByYW5kb20gPSAnJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcclxuICAgICAgICByYW5kb20gKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByZWZpeCArIHJhbmRvbTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGFuZCB3YWl0aW5nIGZvciBhIGNvbXBsZXRpb24gcmVzcG9uc2UuXHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBTZW5kZXIge1xyXG4gICAgY29uc3RydWN0b3IodGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgdGhlIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBmcm9tIG91ciB0cmFja2luZyBTZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciB0byB1bnN1YnNjcmliZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xyXG4gICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VDaGFubmVsKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIubWVzc2FnZUNoYW5uZWwucG9ydDEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIub25NZXNzYWdlKTtcclxuICAgICAgICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFJlY2VpdmVyIGxvY2F0ZWQgYXQge0BsaW5rIHRhcmdldH0uXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIFdlJ2xsIGZpcnN0IHdhaXQgYSBiaXQgZm9yIGFuIEFDSyAsIGlmIHdlIGdldCBvbmUgd2Ugd2lsbCB3YWl0IHNpZ25pZmljYW50bHkgbG9uZ2VyIHVudGlsIHRoZVxyXG4gICAgICogcmVjZWl2ZXIgaGFzIGhhZCBhIGNoYW5jZSB0byBmdWxseSBwcm9jZXNzIHRoZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBldmVudCB0byBzZW5kLlxyXG4gICAgICogQHBhcmFtIGRhdGEgLSBUaGUgcGF5bG9hZCBvZiB0aGUgZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gdGltZW91dCAtIFRpbWVvdXQgZm9yIHdhaXRpbmcgb24gYW4gQUNLIGZyb20gdGhlIHJlY2VpdmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHNldHRsZWQgcHJvbWlzZXMgZnJvbSBhbGwgdGhlIGhhbmRsZXJzIHRoYXQgd2VyZSBsaXN0ZW5pbmcgb24gdGhlIHJlY2VpdmVyLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBfc2VuZChldmVudFR5cGUsIGRhdGEsIHRpbWVvdXQgPSA1MCAvKiBBQ0sgKi8pIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlQ2hhbm5lbCA9IHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgTWVzc2FnZUNoYW5uZWwoKSA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlQ2hhbm5lbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uX3VuYXZhaWxhYmxlXCIgLyogQ09OTkVDVElPTl9VTkFWQUlMQUJMRSAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyByZXR1cm4gZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXHJcbiAgICAgICAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGxldCBjb21wbGV0aW9uVGltZXI7XHJcbiAgICAgICAgbGV0IGhhbmRsZXI7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoJycsIDIwKTtcclxuICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEuc3RhcnQoKTtcclxuICAgICAgICAgICAgY29uc3QgYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZF9ldmVudFwiIC8qIFVOU1VQUE9SVEVEX0VWRU5UICovKSk7XHJcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICBoYW5kbGVyID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwsXHJcbiAgICAgICAgICAgICAgICBvbk1lc3NhZ2UoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBldmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUV2ZW50LmRhdGEuZXZlbnRJZCAhPT0gZXZlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZUV2ZW50LmRhdGEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhY2tcIiAvKiBBQ0sgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgc2hvdWxkIEFDSyBmaXJzdC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY2tUaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidGltZW91dFwiIC8qIFRJTUVPVVQgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDAgLyogQ09NUExFVElPTiAqLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRvbmVcIiAvKiBET05FICovOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgcmVjZWl2ZXIncyBoYW5kbGVycyBhcmUgZmluaXNoZWQgd2Ugd2lsbCBnZXQgdGhlIHJlc3VsdHMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZUV2ZW50LmRhdGEucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWNrVGltZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbXBsZXRpb25UaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiaW52YWxpZF9yZXNwb25zZVwiIC8qIElOVkFMSURfUkVTUE9OU0UgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQoaGFuZGxlcik7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLm9uTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgICAgIH0sIFttZXNzYWdlQ2hhbm5lbC5wb3J0Ml0pO1xyXG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVNZXNzYWdlSGFuZGxlcihoYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBMYXp5IGFjY2Vzc29yIGZvciB3aW5kb3csIHNpbmNlIHRoZSBjb21wYXQgbGF5ZXIgd29uJ3QgdHJlZSBzaGFrZSB0aGlzIG91dCxcclxuICogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm90IHRvIG1lc3Mgd2l0aCB3aW5kb3cgdW5sZXNzIHdlIGhhdmUgdG9cclxuICovXHJcbmZ1bmN0aW9uIF93aW5kb3coKSB7XHJcbiAgICByZXR1cm4gd2luZG93O1xyXG59XHJcbmZ1bmN0aW9uIF9zZXRXaW5kb3dMb2NhdGlvbih1cmwpIHtcclxuICAgIF93aW5kb3coKS5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNXb3JrZXIoKSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBfd2luZG93KClbJ1dvcmtlckdsb2JhbFNjb3BlJ10gIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgdHlwZW9mIF93aW5kb3coKVsnaW1wb3J0U2NyaXB0cyddID09PSAnZnVuY3Rpb24nKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfZ2V0QWN0aXZlU2VydmljZVdvcmtlcigpIHtcclxuICAgIGlmICghKG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyKSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeTtcclxuICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uLmFjdGl2ZTtcclxuICAgIH1cclxuICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9nZXRTZXJ2aWNlV29ya2VyQ29udHJvbGxlcigpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiAoKF9hID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250cm9sbGVyKSB8fCBudWxsO1xyXG59XHJcbmZ1bmN0aW9uIF9nZXRXb3JrZXJHbG9iYWxTY29wZSgpIHtcclxuICAgIHJldHVybiBfaXNXb3JrZXIoKSA/IHNlbGYgOiBudWxsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERCX05BTUUgPSAnZmlyZWJhc2VMb2NhbFN0b3JhZ2VEYic7XHJcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xyXG5jb25zdCBEQl9PQkpFQ1RTVE9SRV9OQU1FID0gJ2ZpcmViYXNlTG9jYWxTdG9yYWdlJztcclxuY29uc3QgREJfREFUQV9LRVlQQVRIID0gJ2ZiYXNlX2tleSc7XHJcbi8qKlxyXG4gKiBQcm9taXNlIHdyYXBwZXIgZm9yIElEQlJlcXVlc3RcclxuICpcclxuICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBjbGVhbmx5IGV4dGVuZCBQcm9taXNlPFQ+IHNpbmNlIHByb21pc2VzIGFyZSBub3QgY2FsbGFibGUgaW4gRVM2XHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBEQlByb21pc2Uge1xyXG4gICAgY29uc3RydWN0b3IocmVxdWVzdCkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XHJcbiAgICB9XHJcbiAgICB0b1Byb21pc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucmVxdWVzdC5yZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMucmVxdWVzdC5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldE9iamVjdFN0b3JlKGRiLCBpc1JlYWRXcml0ZSkge1xyXG4gICAgcmV0dXJuIGRiXHJcbiAgICAgICAgLnRyYW5zYWN0aW9uKFtEQl9PQkpFQ1RTVE9SRV9OQU1FXSwgaXNSZWFkV3JpdGUgPyAncmVhZHdyaXRlJyA6ICdyZWFkb25seScpXHJcbiAgICAgICAgLm9iamVjdFN0b3JlKERCX09CSkVDVFNUT1JFX05BTUUpO1xyXG59XHJcbmZ1bmN0aW9uIF9kZWxldGVEYXRhYmFzZSgpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfTkFNRSk7XHJcbiAgICByZXR1cm4gbmV3IERCUHJvbWlzZShyZXF1ZXN0KS50b1Byb21pc2UoKTtcclxufVxyXG5mdW5jdGlvbiBfb3BlbkRhdGFiYXNlKCkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QocmVxdWVzdC5lcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCd1cGdyYWRlbmVlZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYiA9IHJlcXVlc3QucmVzdWx0O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREJfT0JKRUNUU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiBEQl9EQVRBX0tFWVBBVEggfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGIgPSByZXF1ZXN0LnJlc3VsdDtcclxuICAgICAgICAgICAgLy8gU3RyYW5nZSBidWcgdGhhdCBvY2N1cnMgaW4gRmlyZWZveCB3aGVuIG11bHRpcGxlIHRhYnMgYXJlIG9wZW5lZCBhdCB0aGVcclxuICAgICAgICAgICAgLy8gc2FtZSB0aW1lLiBUaGUgb25seSB3YXkgdG8gcmVjb3ZlciBzZWVtcyB0byBiZSBkZWxldGluZyB0aGUgZGF0YWJhc2VcclxuICAgICAgICAgICAgLy8gYW5kIHJlLWluaXRpYWxpemluZyBpdC5cclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjM0XHJcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhEQl9PQkpFQ1RTVE9SRV9OQU1FKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjbG9zZSB0aGUgZGF0YWJhc2Ugb3IgZWxzZSB5b3UgZ2V0IGEgYGJsb2NrZWRgIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgX2RlbGV0ZURhdGFiYXNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGF3YWl0IF9vcGVuRGF0YWJhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX3B1dE9iamVjdChkYiwga2V5LCB2YWx1ZSkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5wdXQoe1xyXG4gICAgICAgIFtEQl9EQVRBX0tFWVBBVEhdOiBrZXksXHJcbiAgICAgICAgdmFsdWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gZ2V0T2JqZWN0KGRiLCBrZXkpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRPYmplY3RTdG9yZShkYiwgZmFsc2UpLmdldChrZXkpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbiAgICByZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEudmFsdWU7XHJcbn1cclxuZnVuY3Rpb24gX2RlbGV0ZU9iamVjdChkYiwga2V5KSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIHRydWUpLmRlbGV0ZShrZXkpO1xyXG4gICAgcmV0dXJuIG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbn1cclxuY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSA4MDA7XHJcbmNvbnN0IF9UUkFOU0FDVElPTl9SRVRSWV9DT1VOVCA9IDM7XHJcbmNsYXNzIEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJMT0NBTFwiIC8qIExPQ0FMICovO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZSA9IHt9O1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQgcmV0dXJuIHZhbHVlIGlzIHBsYXRmb3JtIHNwZWNpZmljXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzID0gMDtcclxuICAgICAgICB0aGlzLnJlY2VpdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbmRlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIEZpcmUgJiBmb3JnZXQgdGhlIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBhcyBpdCBtYXkgbmV2ZXIgcmVzb2x2ZVxyXG4gICAgICAgIHRoaXMuX3dvcmtlckluaXRpYWxpemF0aW9uUHJvbWlzZSA9XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKS50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuRGIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfd2l0aFJldHJpZXMob3ApIHtcclxuICAgICAgICBsZXQgbnVtQXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuX29wZW5EYigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG9wKGRiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bUF0dGVtcHRzKysgPiBfVFJBTlNBQ1RJT05fUkVUUllfQ09VTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRiLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBleHBvbmVudGlhbCBiYWNrb2ZmXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluZGV4ZWREQiBldmVudHMgZG8gbm90IHByb3BhZ2F0ZSBmcm9tIHRoZSBtYWluIHdpbmRvdyB0byB0aGUgd29ya2VyIGNvbnRleHQuICBXZSByZWx5IG9uIGFcclxuICAgICAqIHBvc3RNZXNzYWdlIGludGVyZmFjZSB0byBzZW5kIHRoZXNlIGV2ZW50cyB0byB0aGUgd29ya2VyIG91cnNlbHZlcy5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9pc1dvcmtlcigpID8gdGhpcy5pbml0aWFsaXplUmVjZWl2ZXIoKSA6IHRoaXMuaW5pdGlhbGl6ZVNlbmRlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcyB0aGUgd29ya2VyIHdlIHNob3VsZCBsaXN0ZW4gdG8gZXZlbnRzIGZyb20gdGhlIG1haW4gd2luZG93LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplUmVjZWl2ZXIoKSB7XHJcbiAgICAgICAgdGhpcy5yZWNlaXZlciA9IFJlY2VpdmVyLl9nZXRJbnN0YW5jZShfZ2V0V29ya2VyR2xvYmFsU2NvcGUoKSk7XHJcbiAgICAgICAgLy8gUmVmcmVzaCBmcm9tIHBlcnNpc3RlbmNlIGlmIHdlIHJlY2VpdmUgYSBLZXlDaGFuZ2VkIG1lc3NhZ2UuXHJcbiAgICAgICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovLCBhc3luYyAoX29yaWdpbiwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5fcG9sbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAga2V5UHJvY2Vzc2VkOiBrZXlzLmluY2x1ZGVzKGRhdGEua2V5KVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIExldCB0aGUgc2VuZGVyIGtub3cgdGhhdCB3ZSBhcmUgbGlzdGVuaW5nIHNvIHRoZXkgZ2l2ZSB1cyBtb3JlIHRpbWVvdXQuXHJcbiAgICAgICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFwicGluZ1wiIC8qIFBJTkcgKi8sIGFzeW5jIChfb3JpZ2luLCBfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gW1wia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQXMgdGhlIG1haW4gd2luZG93LCB3ZSBzaG91bGQgbGV0IHRoZSB3b3JrZXIga25vdyB3aGVuIGtleXMgY2hhbmdlIChzZXQgYW5kIHJlbW92ZSkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmljZVdvcmtlckNvbnRhaW5lci9yZWFkeSB8IFNlcnZpY2VXb3JrZXJDb250YWluZXIucmVhZHl9XHJcbiAgICAgKiBtYXkgbm90IHJlc29sdmUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRpYWxpemVTZW5kZXIoKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBhY3RpdmUgc2VydmljZSB3b3JrZXIuXHJcbiAgICAgICAgdGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyID0gYXdhaXQgX2dldEFjdGl2ZVNlcnZpY2VXb3JrZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlU2VydmljZVdvcmtlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VuZGVyID0gbmV3IFNlbmRlcih0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIpO1xyXG4gICAgICAgIC8vIFBpbmcgdGhlIHNlcnZpY2Ugd29ya2VyIHRvIGNoZWNrIHdoYXQgZXZlbnRzIHRoZXkgY2FuIGhhbmRsZS5cclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5zZW5kZXIuX3NlbmQoXCJwaW5nXCIgLyogUElORyAqLywge30sIDgwMCAvKiBMT05HX0FDSyAqLyk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2EgPSByZXN1bHRzWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZnVsZmlsbGVkKSAmJlxyXG4gICAgICAgICAgICAoKF9iID0gcmVzdWx0c1swXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlLmluY2x1ZGVzKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTGV0IHRoZSB3b3JrZXIga25vdyBhYm91dCBhIGNoYW5nZWQga2V5LCB0aGUgZXhhY3Qga2V5IGRvZXNuJ3QgdGVjaG5pY2FsbHkgbWF0dGVyIHNpbmNlIHRoZVxyXG4gICAgICogd29ya2VyIHdpbGwganVzdCB0cmlnZ2VyIGEgZnVsbCBzeW5jIGFueXdheS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG9uZSBzZXJ2aWNlIHdvcmtlciBwZXIgcGFnZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ga2V5IC0gU3RvcmFnZSBrZXkgd2hpY2ggY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgbm90aWZ5U2VydmljZVdvcmtlcihrZXkpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VuZGVyIHx8XHJcbiAgICAgICAgICAgICF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgfHxcclxuICAgICAgICAgICAgX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyKCkgIT09IHRoaXMuYWN0aXZlU2VydmljZVdvcmtlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZGVyLl9zZW5kKFwia2V5Q2hhbmdlZFwiIC8qIEtFWV9DSEFOR0VEICovLCB7IGtleSB9LCBcclxuICAgICAgICAgICAgLy8gVXNlIGxvbmcgdGltZW91dCBpZiByZWNlaXZlciBoYXMgcHJldmlvdXNseSByZXNwb25kZWQgdG8gYSBwaW5nIGZyb20gdXMuXHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZVdvcmtlclJlY2VpdmVyQXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICA/IDgwMCAvKiBMT05HX0FDSyAqL1xyXG4gICAgICAgICAgICAgICAgOiA1MCAvKiBBQ0sgKi8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGJlc3QgZWZmb3J0IGFwcHJvYWNoLiBJZ25vcmUgZXJyb3JzLlxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9pc0F2YWlsYWJsZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWluZGV4ZWREQikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgX29wZW5EYXRhYmFzZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBfcHV0T2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IF9kZWxldGVPYmplY3QoZGIsIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHsgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGFzeW5jIF93aXRoUGVuZGluZ1dyaXRlKHdyaXRlKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzKys7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgd3JpdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1dyaXRlcy0tO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIF9zZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aXRoUGVuZGluZ1dyaXRlKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiKSA9PiBfcHV0T2JqZWN0KGRiLCBrZXksIHZhbHVlKSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9nZXQoa2V5KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gKGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYikgPT4gZ2V0T2JqZWN0KGRiLCBrZXkpKSk7XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBvYmo7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICAgIGFzeW5jIF9yZW1vdmUoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpdGhQZW5kaW5nV3JpdGUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGIpID0+IF9kZWxldGVPYmplY3QoZGIsIGtleSkpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9wb2xsKCkge1xyXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gZmFsbGJhY2sgaWYgZ2V0QWxsIGlzIG5vdCBzdXBwb3J0ZWRcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ2V0QWxsUmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0QWxsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgREJQcm9taXNlKGdldEFsbFJlcXVlc3QpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdyaXRlcyBpbiBwcm9ncmVzcyBhYm9ydCwgd2UnbGwgZ2V0IHBpY2tlZCB1cCBvbiB0aGUgbmV4dCBwb2xsXHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlcyAhPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcclxuICAgICAgICBjb25zdCBrZXlzSW5SZXN1bHQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgZm9yIChjb25zdCB7IGZiYXNlX2tleToga2V5LCB2YWx1ZSB9IG9mIHJlc3VsdCkge1xyXG4gICAgICAgICAgICBrZXlzSW5SZXN1bHQuYWRkKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsQ2FjaGVba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGxvY2FsS2V5IG9mIE9iamVjdC5rZXlzKHRoaXMubG9jYWxDYWNoZSkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubG9jYWxDYWNoZVtsb2NhbEtleV0gJiYgIWtleXNJblJlc3VsdC5oYXMobG9jYWxLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhsb2NhbEtleSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2gobG9jYWxLZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBrZXlzO1xyXG4gICAgfVxyXG4gICAgbm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW2tleV07XHJcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20obGlzdGVuZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnRQb2xsaW5nKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHRoaXMuX3BvbGwoKSwgX1BPTExJTkdfSU5URVJWQUxfTVMpO1xyXG4gICAgfVxyXG4gICAgc3RvcFBvbGxpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKGtleSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XSA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIGNhY2hlIHRvIGF2b2lkIHNwdXJpb3VzbHkgdHJpZ2dlcmluZyBvbiBmaXJzdCBwb2xsLlxyXG4gICAgICAgICAgICB2b2lkIHRoaXMuX2dldChrZXkpOyAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQgYXN5bmMgYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIF9yZW1vdmVMaXN0ZW5lcihrZXksIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5kZWxldGUobGlzdGVuZXIpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XS5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbkluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UudHlwZSA9ICdMT0NBTCc7XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgYExPQ0FMYCB1c2luZyBgaW5kZXhlZERCYFxyXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSA9IEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2U7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHN0YXJ0U2lnbkluUGhvbmVNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBQT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFTaWduSW46c3RhcnRcIiAvKiBTVEFSVF9QSE9ORV9NRkFfU0lHTl9JTiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5mdW5jdGlvbiBmaW5hbGl6ZVNpZ25JblBob25lTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhU2lnbkluOmZpbmFsaXplXCIgLyogRklOQUxJWkVfUEhPTkVfTUZBX1NJR05fSU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhUGFyYW1zKGF1dGgpIHtcclxuICAgIHJldHVybiAoKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIkdFVFwiIC8qIEdFVCAqLywgXCIvdjEvcmVjYXB0Y2hhUGFyYW1zXCIgLyogR0VUX1JFQ0FQVENIQV9QQVJBTSAqLykpLnJlY2FwdGNoYVNpdGVLZXkgfHwgJycpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKSB7XHJcbiAgICB2YXIgX2EsIF9iO1xyXG4gICAgcmV0dXJuIChfYiA9IChfYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVswXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZG9jdW1lbnQ7XHJcbn1cclxuZnVuY3Rpb24gX2xvYWRKUyh1cmwpIHtcclxuICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyB0aW1lb3V0IHN1cHBvcnQgJiBjYW5jZWxsYXRpb25cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7XHJcbiAgICAgICAgZWwub25sb2FkID0gcmVzb2x2ZTtcclxuICAgICAgICBlbC5vbmVycm9yID0gZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgICAgIGVycm9yLmN1c3RvbURhdGEgPSBlO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZWwudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgICAgIGVsLmNoYXJzZXQgPSAnVVRGLTgnO1xyXG4gICAgICAgIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfZ2VuZXJhdGVDYWxsYmFja05hbWUocHJlZml4KSB7XHJcbiAgICByZXR1cm4gYF9fJHtwcmVmaXh9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKX1gO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9TT0xWRV9USU1FX01TID0gNTAwO1xyXG5jb25zdCBfRVhQSVJBVElPTl9USU1FX01TID0gNjAwMDA7XHJcbmNvbnN0IF9XSURHRVRfSURfU1RBUlQgPSAxMDAwMDAwMDAwMDAwO1xyXG5jbGFzcyBNb2NrUmVDYXB0Y2hhIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuY291bnRlciA9IF9XSURHRVRfSURfU1RBUlQ7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0cyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIHJlbmRlcihjb250YWluZXIsIHBhcmFtZXRlcnMpIHtcclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuY291bnRlcjtcclxuICAgICAgICB0aGlzLl93aWRnZXRzLnNldChpZCwgbmV3IE1vY2tXaWRnZXQoY29udGFpbmVyLCB0aGlzLmF1dGgubmFtZSwgcGFyYW1ldGVycyB8fCB7fSkpO1xyXG4gICAgICAgIHRoaXMuY291bnRlcisrO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuICAgIHJlc2V0KG9wdFdpZGdldElkKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcclxuICAgICAgICB2b2lkICgoX2EgPSB0aGlzLl93aWRnZXRzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWxldGUoKSk7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0cy5kZWxldGUoaWQpO1xyXG4gICAgfVxyXG4gICAgZ2V0UmVzcG9uc2Uob3B0V2lkZ2V0SWQpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3QgaWQgPSBvcHRXaWRnZXRJZCB8fCBfV0lER0VUX0lEX1NUQVJUO1xyXG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0UmVzcG9uc2UoKSkgfHwgJyc7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleGVjdXRlKG9wdFdpZGdldElkKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcclxuICAgICAgICB2b2lkICgoX2EgPSB0aGlzLl93aWRnZXRzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5leGVjdXRlKCkpO1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxufVxyXG5jbGFzcyBNb2NrV2lkZ2V0IHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lck9ySWQsIGFwcE5hbWUsIHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kZWxldGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZVRva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNsaWNrSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leGVjdXRlKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxyXG4gICAgICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XHJcbiAgICAgICAgX2Fzc2VydChjb250YWluZXIsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLywgeyBhcHBOYW1lIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdGhpcy5wYXJhbXMuc2l6ZSAhPT0gJ2ludmlzaWJsZSc7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVG9rZW47XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXJJZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBleGVjdXRlKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcclxuICAgICAgICBpZiAodGhpcy50aW1lcklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg1MCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssICdleHBpcmVkLWNhbGxiYWNrJzogZXhwaXJlZENhbGxiYWNrIH0gPSB0aGlzLnBhcmFtcztcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMucmVzcG9uc2VUb2tlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUb2tlbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBfRVhQSVJBVElPTl9USU1FX01TKTtcclxuICAgICAgICB9LCBfU09MVkVfVElNRV9NUyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0lmRGVsZXRlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVDQVBUQ0hBIG1vY2sgd2FzIGFscmVhZHkgZGVsZXRlZCEnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcobGVuKSB7XHJcbiAgICBjb25zdCBjaGFycyA9IFtdO1xyXG4gICAgY29uc3QgYWxsb3dlZENoYXJzID0gJzEyMzQ1Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjaGFycy5wdXNoKGFsbG93ZWRDaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsb3dlZENoYXJzLmxlbmd0aCkpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBSZUNhcHRjaGEgd2lsbCBsb2FkIHVzaW5nIHRoZSBzYW1lIGNhbGxiYWNrLCBzbyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbmVlZHNcclxuLy8gdG8gYmUga2VwdCBhcm91bmRcclxuY29uc3QgX0pTTE9BRF9DQUxMQkFDSyA9IF9nZW5lcmF0ZUNhbGxiYWNrTmFtZSgncmNiJyk7XHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVF9ERUxBWSA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG5jb25zdCBSRUNBUFRDSEFfQkFTRSA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanM/JztcclxuLyoqXHJcbiAqIExvYWRlciBmb3IgdGhlIEdSZUNhcHRjaGEgbGlicmFyeS4gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgb2YgdGhpcy5cclxuICovXHJcbmNsYXNzIFJlQ2FwdGNoYUxvYWRlckltcGwge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0TGFuZ3VhZ2UgPSAnJztcclxuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xyXG4gICAgICAgIHRoaXMubGlicmFyeVNlcGFyYXRlbHlMb2FkZWQgPSAhIV93aW5kb3coKS5ncmVjYXB0Y2hhO1xyXG4gICAgfVxyXG4gICAgbG9hZChhdXRoLCBobCA9ICcnKSB7XHJcbiAgICAgICAgX2Fzc2VydChpc0hvc3RMYW5ndWFnZVZhbGlkKGhsKSwgYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBpZiAodGhpcy5zaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3dpbmRvdygpLmdyZWNhcHRjaGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqLykpO1xyXG4gICAgICAgICAgICB9LCBORVRXT1JLX1RJTUVPVVRfREVMQVkuZ2V0KCkpO1xyXG4gICAgICAgICAgICBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS10gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS107XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBfd2luZG93KCkuZ3JlY2FwdGNoYTtcclxuICAgICAgICAgICAgICAgIGlmICghcmVjYXB0Y2hhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBncmVwdGNoYSByZW5kZXIgZnVuY3Rpb24gc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBkZXZlbG9wZXIgaGFzXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsZWQgaXQgc2VwYXJhdGVseVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyID0gcmVjYXB0Y2hhLnJlbmRlcjtcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYS5yZW5kZXIgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHJlbmRlcihjb250YWluZXIsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldElkO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gaGw7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlY2FwdGNoYSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke1JFQ0FQVENIQV9CQVNFfT8ke3F1ZXJ5c3RyaW5nKHtcclxuICAgICAgICAgICAgICAgIG9ubG9hZDogX0pTTE9BRF9DQUxMQkFDSyxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogJ2V4cGxpY2l0JyxcclxuICAgICAgICAgICAgICAgIGhsXHJcbiAgICAgICAgICAgIH0pfWA7XHJcbiAgICAgICAgICAgIF9sb2FkSlModXJsKS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQobmV0d29ya1RpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjbGVhcmVkT25lSW5zdGFuY2UoKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudGVyLS07XHJcbiAgICB9XHJcbiAgICBzaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpIHtcclxuICAgICAgICAvLyBXZSBjYW4gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZjpcclxuICAgICAgICAvLyAgIOKAoiBncmVjYXB0Y2hhIGlzIGFscmVhZHkgZGVmaW5lZCBBTkQgKFxyXG4gICAgICAgIC8vICAgICAxLiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIGNvZGVzIGFyZSB0aGUgc2FtZSBPUlxyXG4gICAgICAgIC8vICAgICAyLiB0aGVyZSBleGlzdHMgYWxyZWFkeSBhIFJlQ2FwdGNoYSBvbiB0aGUgcGFnZVxyXG4gICAgICAgIC8vICAgICAzLiB0aGUgbGlicmFyeSB3YXMgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGFwcFxyXG4gICAgICAgIC8vIEluIGNhc2VzICgyKSBhbmQgKDMpLCB3ZSBfY2FuJ3RfIHJlbG9hZCBhcyBpdCB3b3VsZCBicmVhayB0aGUgcmVjYXB0Y2hhc1xyXG4gICAgICAgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBhZ2VcclxuICAgICAgICByZXR1cm4gKCEhX3dpbmRvdygpLmdyZWNhcHRjaGEgJiZcclxuICAgICAgICAgICAgKGhsID09PSB0aGlzLmhvc3RMYW5ndWFnZSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID4gMCB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5saWJyYXJ5U2VwYXJhdGVseUxvYWRlZCkpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGlzSG9zdExhbmd1YWdlVmFsaWQoaGwpIHtcclxuICAgIHJldHVybiBobC5sZW5ndGggPD0gNiAmJiAvXlxccypbYS16QS1aMC05XFwtXSpcXHMqJC8udGVzdChobCk7XHJcbn1cclxuY2xhc3MgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwge1xyXG4gICAgYXN5bmMgbG9hZChhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNb2NrUmVDYXB0Y2hhKGF1dGgpO1xyXG4gICAgfVxyXG4gICAgY2xlYXJlZE9uZUluc3RhbmNlKCkgeyB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhJztcclxuY29uc3QgREVGQVVMVF9QQVJBTVMgPSB7XHJcbiAgICB0aGVtZTogJ2xpZ2h0JyxcclxuICAgIHR5cGU6ICdpbWFnZSdcclxufTtcclxuLyoqXHJcbiAqIEFuIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS8gfCByZUNBUFRDSEF9LWJhc2VkIGFwcGxpY2F0aW9uIHZlcmlmaWVyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBSZWNhcHRjaGFWZXJpZmllciB7XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyT3JJZCAtIFRoZSByZUNBUFRDSEEgY29udGFpbmVyIHBhcmFtZXRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhpcyBoYXMgZGlmZmVyZW50IG1lYW5pbmcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJlQ0FQVENIQSBpcyBoaWRkZW4gb3IgdmlzaWJsZS4gRm9yIGFcclxuICAgICAqIHZpc2libGUgcmVDQVBUQ0hBIHRoZSBjb250YWluZXIgbXVzdCBiZSBlbXB0eS4gSWYgYSBzdHJpbmcgaXMgdXNlZCwgaXQgaGFzIHRvIGNvcnJlc3BvbmQgdG9cclxuICAgICAqIGFuIGVsZW1lbnQgSUQuIFRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgbXVzdCBhbHNvIG11c3QgYmUgaW4gdGhlIERPTSBhdCB0aGUgdGltZSBvZlxyXG4gICAgICogaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBUaGUgb3B0aW9uYWwgcmVDQVBUQ0hBIHBhcmFtZXRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIENoZWNrIHRoZSByZUNBUFRDSEEgZG9jcyBmb3IgYSBjb21wcmVoZW5zaXZlIGxpc3QuIEFsbCBwYXJhbWV0ZXJzIGFyZSBhY2NlcHRlZCBleGNlcHQgZm9yXHJcbiAgICAgKiB0aGUgc2l0ZWtleS4gRmlyZWJhc2UgQXV0aCBiYWNrZW5kIHByb3Zpc2lvbnMgYSByZUNBUFRDSEEgZm9yIGVhY2ggcHJvamVjdCBhbmQgd2lsbFxyXG4gICAgICogY29uZmlndXJlIHRoaXMgdXBvbiByZW5kZXJpbmcuIEZvciBhbiBpbnZpc2libGUgcmVDQVBUQ0hBLCBhIHNpemUga2V5IG11c3QgaGF2ZSB0aGUgdmFsdWVcclxuICAgICAqICdpbnZpc2libGUnLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhdXRoRXh0ZXJuIC0gVGhlIGNvcnJlc3BvbmRpbmcgRmlyZWJhc2Uge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBJZiBub25lIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaXMgdXNlZC4gQSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2VcclxuICAgICAqIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBBUEkga2V5LCBvdGhlcndpc2UgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lck9ySWQsIHBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUyksIGF1dGhFeHRlcm4pIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiB2ZXJpZmllciB0eXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJlbWFya3NcclxuICAgICAgICAgKiBGb3IgYSByZUNBUFRDSEEgdmVyaWZpZXIsIHRoaXMgaXMgJ3JlY2FwdGNoYScuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEU7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLndpZGdldElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWNhcHRjaGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoRXh0ZXJuKTtcclxuICAgICAgICB0aGlzLmlzSW52aXNpYmxlID0gdGhpcy5wYXJhbWV0ZXJzLnNpemUgPT09ICdpbnZpc2libGUnO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJywgdGhpcy5hdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHlwZW9mIGNvbnRhaW5lck9ySWQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyT3JJZClcclxuICAgICAgICAgICAgOiBjb250YWluZXJPcklkO1xyXG4gICAgICAgIF9hc3NlcnQoY29udGFpbmVyLCB0aGlzLmF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLmNhbGxiYWNrID0gdGhpcy5tYWtlVG9rZW5DYWxsYmFjayh0aGlzLnBhcmFtZXRlcnMuY2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMuX3JlY2FwdGNoYUxvYWRlciA9IHRoaXMuYXV0aC5zZXR0aW5ncy5hcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmdcclxuICAgICAgICAgICAgPyBuZXcgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwoKVxyXG4gICAgICAgICAgICA6IG5ldyBSZUNhcHRjaGFMb2FkZXJJbXBsKCk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZVN0YXJ0aW5nU3RhdGUoKTtcclxuICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IGlmIHNkayB2ZXJzaW9uIGlzIG5lZWRlZFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBXYWl0cyBmb3IgdGhlIHVzZXIgdG8gc29sdmUgdGhlIHJlQ0FQVENIQSBhbmQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVDQVBUQ0hBIHRva2VuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIHJlQ0FQVENIQSB0b2tlbi5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmVyaWZ5KCkge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnJlbmRlcigpO1xyXG4gICAgICAgIGNvbnN0IHJlY2FwdGNoYSA9IHRoaXMuZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEoKTtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlY2FwdGNoYS5nZXRSZXNwb25zZShpZCk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0b2tlbkNoYW5nZSA9ICh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIHRva2VuIGV4cGlyYXRpb25zLlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5kZWxldGUodG9rZW5DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuYWRkKHRva2VuQ2hhbmdlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYS5leGVjdXRlKGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSByZUNBUFRDSEEgd2lkZ2V0IG9uIHRoZSBwYWdlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB3aWRnZXQgSUQuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZS4gU2luY2UgaXQncyBub3QgYXN5bmMgKHdlIHdhbnQgdG8gcmV0dXJuIHRoZVxyXG4gICAgICAgICAgICAvLyBfc2FtZV8gcHJvbWlzZSBpZiByZW5kZXJpbmcgaXMgc3RpbGwgb2NjdXJyaW5nKSwgdGhlIEFQSSBzdXJmYWNlIHNob3VsZFxyXG4gICAgICAgICAgICAvLyByZWplY3Qgd2l0aCB0aGUgZXJyb3IgcmF0aGVyIHRoYW4ganVzdCB0aHJvd1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclByb21pc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9taXNlID0gdGhpcy5tYWtlUmVuZGVyUHJvbWlzZSgpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlclByb21pc2UgPSBudWxsO1xyXG4gICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcclxuICAgICAgICBpZiAodGhpcy53aWRnZXRJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCkucmVzZXQodGhpcy53aWRnZXRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIHJlQ0FQVENIQSB3aWRnZXQgZnJvbSB0aGUgcGFnZSBhbmQgZGVzdHJveXMgdGhlIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIuY2xlYXJlZE9uZUluc3RhbmNlKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB2YWxpZGF0ZVN0YXJ0aW5nU3RhdGUoKSB7XHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXksIHRoaXMuYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMuaXNJbnZpc2libGUgfHwgIXRoaXMuY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSwgdGhpcy5hdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJywgdGhpcy5hdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICB9XHJcbiAgICBtYWtlVG9rZW5DYWxsYmFjayhleGlzdGluZykge1xyXG4gICAgICAgIHJldHVybiB0b2tlbiA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lcih0b2tlbikpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZyh0b2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsRnVuYyA9IF93aW5kb3coKVtleGlzdGluZ107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdsb2JhbEZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGdW5jKHRva2VuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3NlcnROb3REZXN0cm95ZWQoKSB7XHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5kZXN0cm95ZWQsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG1ha2VSZW5kZXJQcm9taXNlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy53aWRnZXRJZCkge1xyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3VhcmFudGVlZEVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ3VhcmFudGVlZEVtcHR5KTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGd1YXJhbnRlZWRFbXB0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLndpZGdldElkID0gdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlbmRlcihjb250YWluZXIsIHRoaXMucGFyYW1ldGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLndpZGdldElkO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICBfYXNzZXJ0KF9pc0h0dHBPckh0dHBzKCkgJiYgIV9pc1dvcmtlcigpLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgYXdhaXQgZG9tUmVhZHkoKTtcclxuICAgICAgICB0aGlzLnJlY2FwdGNoYSA9IGF3YWl0IHRoaXMuX3JlY2FwdGNoYUxvYWRlci5sb2FkKHRoaXMuYXV0aCwgdGhpcy5hdXRoLmxhbmd1YWdlQ29kZSB8fCB1bmRlZmluZWQpO1xyXG4gICAgICAgIGNvbnN0IHNpdGVLZXkgPSBhd2FpdCBnZXRSZWNhcHRjaGFQYXJhbXModGhpcy5hdXRoKTtcclxuICAgICAgICBfYXNzZXJ0KHNpdGVLZXksIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMuc2l0ZWtleSA9IHNpdGVLZXk7XHJcbiAgICB9XHJcbiAgICBnZXRBc3NlcnRlZFJlY2FwdGNoYSgpIHtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMucmVjYXB0Y2hhLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjYXB0Y2hhO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGRvbVJlYWR5KCkge1xyXG4gICAgbGV0IHJlc29sdmVyID0gbnVsbDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG9jdW1lbnQgbm90IHJlYWR5LCB3YWl0IGZvciBsb2FkIGJlZm9yZSByZXNvbHZpbmcuXHJcbiAgICAgICAgLy8gU2F2ZSByZXNvbHZlciwgc28gd2UgY2FuIHJlbW92ZSBsaXN0ZW5lciBpbiBjYXNlIGl0IHdhcyBleHRlcm5hbGx5XHJcbiAgICAgICAgLy8gY2FuY2VsbGVkLlxyXG4gICAgICAgIHJlc29sdmVyID0gKCkgPT4gcmVzb2x2ZSgpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2ZXJpZmljYXRpb25JZCwgb25Db25maXJtYXRpb24pIHtcclxuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbklkID0gdmVyaWZpY2F0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy5vbkNvbmZpcm1hdGlvbiA9IG9uQ29uZmlybWF0aW9uO1xyXG4gICAgfVxyXG4gICAgY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKHRoaXMudmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uQ29uZmlybWF0aW9uKGF1dGhDcmVkZW50aWFsKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgY29kZSB2aWEgU01TIHRvIHRoZSBnaXZlblxyXG4gKiBwaG9uZSBudW1iZXIsIGFuZCByZXR1cm5zIGEge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdH0uIEFmdGVyIHRoZSB1c2VyXHJcbiAqIHByb3ZpZGVzIHRoZSBjb2RlIHNlbnQgdG8gdGhlaXIgcGhvbmUsIGNhbGwge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtfVxyXG4gKiB3aXRoIHRoZSBjb2RlIHRvIHNpZ24gdGhlIHVzZXIgaW4uXHJcbiAqXHJcbiAqIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbiwge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfS5cclxuICogVGhpcyBmdW5jdGlvbiBjYW4gd29yayBvbiBvdGhlciBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVcclxuICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfSAobGlrZSBSZWFjdCBOYXRpdmUpLCBidXQgeW91IG5lZWQgdG8gdXNlIGFcclxuICogdGhpcmQtcGFydHkge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9IGltcGxlbWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxyXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IGZpcmViYXNlLmF1dGguUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcclxuICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICogLy8gT2J0YWluIGEgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIsIGFwcFZlcmlmaWVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihhdXRoSW50ZXJuYWwsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoSW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBob25lTnVtYmVyKHVzZXIsIHBob25lTnVtYmVyLCBhcHBWZXJpZmllcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBcInBob25lXCIgLyogUEhPTkUgKi8pO1xyXG4gICAgY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBfdmVyaWZ5UGhvbmVOdW1iZXIodXNlckludGVybmFsLmF1dGgsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiBsaW5rV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKSk7XHJcbn1cclxuLyoqXHJcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggcGhvbmUgY3JlZGVudGlhbC5cclxuICpcclxuICogQHJlbWFya3MgVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW4gYXR0ZW1wdHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlcih1c2VyLCBwaG9uZU51bWJlciwgYXBwVmVyaWZpZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKHVzZXJJbnRlcm5hbC5hdXRoLCBwaG9uZU51bWJlciwgZ2V0TW9kdWxhckluc3RhbmNlKGFwcFZlcmlmaWVyKSk7XHJcbiAgICByZXR1cm4gbmV3IENvbmZpcm1hdGlvblJlc3VsdEltcGwodmVyaWZpY2F0aW9uSWQsIGNyZWQgPT4gcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCh1c2VySW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBhIHZlcmlmaWNhdGlvbiBJRCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNNUyBjb2RlIHRoYXQgaXMgc2VudC5cclxuICpcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF92ZXJpZnlQaG9uZU51bWJlcihhdXRoLCBvcHRpb25zLCB2ZXJpZmllcikge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgcmVjYXB0Y2hhVG9rZW4gPSBhd2FpdCB2ZXJpZmllci52ZXJpZnkoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVjYXB0Y2hhVG9rZW4gPT09ICdzdHJpbmcnLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodmVyaWZpZXIudHlwZSA9PT0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUsIGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgbGV0IHBob25lSW5mb09wdGlvbnM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwaG9uZUluZm9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IG9wdGlvbnNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBob25lSW5mb09wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJ3Nlc3Npb24nIGluIHBob25lSW5mb09wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHBob25lSW5mb09wdGlvbnMuc2Vzc2lvbjtcclxuICAgICAgICAgICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChzZXNzaW9uLnR5cGUgPT09IFwiZW5yb2xsXCIgLyogRU5ST0xMICovLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydEVucm9sbFBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgICAgICAgICBpZFRva2VuOiBzZXNzaW9uLmNyZWRlbnRpYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmVFbnJvbGxtZW50SW5mbzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVNlc3Npb25JbmZvLnNlc3Npb25JbmZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChzZXNzaW9uLnR5cGUgPT09IFwic2lnbmluXCIgLyogU0lHTl9JTiAqLywgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1mYUVucm9sbG1lbnRJZCA9ICgoX2EgPSBwaG9uZUluZm9PcHRpb25zLm11bHRpRmFjdG9ySGludCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVpZCkgfHxcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZUluZm9PcHRpb25zLm11bHRpRmFjdG9yVWlkO1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChtZmFFbnJvbGxtZW50SWQsIGF1dGgsIFwibWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mb1wiIC8qIE1JU1NJTkdfTUZBX0lORk8gKi8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydFNpZ25JblBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc2Vzc2lvbi5jcmVkZW50aWFsLFxyXG4gICAgICAgICAgICAgICAgICAgIG1mYUVucm9sbG1lbnRJZCxcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZVNpZ25JbkluZm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVJlc3BvbnNlSW5mby5zZXNzaW9uSW5mbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uSW5mbyB9ID0gYXdhaXQgc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZShhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbkluZm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdmVyaWZpZXIuX3Jlc2V0KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYFxyXG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcclxuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBwaG9uZUNyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICogYXdhaXQgdXBkYXRlUGhvbmVOdW1iZXIodXNlciwgcGhvbmVDcmVkZW50aWFsKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIGF1dGhlbnRpY2F0aW5nIHRoZSBuZXcgcGhvbmUgbnVtYmVyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQaG9uZU51bWJlcih1c2VyLCBjcmVkZW50aWFsKSB7XHJcbiAgICBhd2FpdCBfbGluayQxKGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSwgY3JlZGVudGlhbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBQaG9uZUF1dGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcclxuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBwaG9uZUNyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBwaG9uZUNyZWRlbnRpYWwpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgUGhvbmVBdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gYXV0aCAtIFRoZSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaW4gd2hpY2ggc2lnbi1pbnMgc2hvdWxkIG9jY3VyLlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5QSE9ORS4gKi9cclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBQaG9uZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRDtcclxuICAgICAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBTdGFydHMgYSBwaG9uZSBudW1iZXIgYXV0aGVudGljYXRpb24gZmxvdyBieSBzZW5kaW5nIGEgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdGhlIGdpdmVuIHBob25lXHJcbiAgICAgKiBudW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xyXG4gICAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIEFuIGFsdGVybmF0aXZlIGZsb3cgaXMgcHJvdmlkZWQgdXNpbmcgdGhlIGBzaWduSW5XaXRoUGhvbmVOdW1iZXJgIG1ldGhvZC5cclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwaG9uZUluZm9PcHRpb25zIC0gVGhlIHVzZXIncyB7QGxpbmsgUGhvbmVJbmZvT3B0aW9uc30uIFRoZSBwaG9uZSBudW1iZXIgc2hvdWxkIGJlIGluXHJcbiAgICAgKiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cclxuICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvblZlcmlmaWVyIC0gRm9yIGFidXNlIHByZXZlbnRpb24sIHRoaXMgbWV0aG9kIGFsc28gcmVxdWlyZXMgYVxyXG4gICAgICoge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbixcclxuICAgICAqIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhIHZlcmlmaWNhdGlvbiBJRCB0aGF0IGNhbiBiZSBwYXNzZWQgdG9cclxuICAgICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfSB0byBpZGVudGlmeSB0aGlzIGZsb3cuLlxyXG4gICAgICovXHJcbiAgICB2ZXJpZnlQaG9uZU51bWJlcihwaG9uZU9wdGlvbnMsIGFwcGxpY2F0aW9uVmVyaWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gX3ZlcmlmeVBob25lTnVtYmVyKHRoaXMuYXV0aCwgcGhvbmVPcHRpb25zLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwbGljYXRpb25WZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcGhvbmUgYXV0aCBjcmVkZW50aWFsLCBnaXZlbiB0aGUgdmVyaWZpY2F0aW9uIElEIGZyb21cclxuICAgICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0gYW5kIHRoZSBjb2RlIHRoYXQgd2FzIHNlbnQgdG8gdGhlIHVzZXInc1xyXG4gICAgICogbW9iaWxlIGRldmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAgICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICAgICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXHJcbiAgICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgZmxvdyBpcyBwcm92aWRlZCB1c2luZyB0aGUgYHNpZ25JbldpdGhQaG9uZU51bWJlcmAgbWV0aG9kLlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICAgICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXHJcbiAgICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IGNvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtKHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbklkIC0gVGhlIHZlcmlmaWNhdGlvbiBJRCByZXR1cm5lZCBmcm9tIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0uXHJcbiAgICAgKiBAcGFyYW0gdmVyaWZpY2F0aW9uQ29kZSAtIFRoZSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyJ3MgbW9iaWxlIGRldmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSkge1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICBjb25zdCBjcmVkZW50aWFsID0gdXNlckNyZWRlbnRpYWw7XHJcbiAgICAgICAgcmV0dXJuIFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gd2hlbiBwYXNzZWQgYW4gZXJyb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBmb3IgZXJyb3JzIGxpa2VcclxuICAgICAqIGBhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWxzYC4gVGhpcyBpcyB1c2VmdWwgZm9yXHJcbiAgICAgKiByZWNvdmVyaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgYSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGJ1dCB0aGUgbnVtYmVyXHJcbiAgICAgKiBpbiBxdWVzdGlvbiBpcyBhbHJlYWR5IHRpZWQgdG8gYW5vdGhlciBhY2NvdW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xyXG4gICAgICogY29kZSB0cmllcyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgdXNlcidzIHBob25lIG51bWJlciwgYW5kIGlmIHRoYXRcclxuICAgICAqIGZhaWxzLCBsaW5rcyB0aGUgdXNlciB3aXRoIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGF0IG51bWJlcjpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqc1xyXG4gICAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAgICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKG51bWJlciwgdmVyaWZpZXIpO1xyXG4gICAgICogdHJ5IHtcclxuICAgICAqICAgY29uc3QgY29kZSA9ICcnOyAvLyBQcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSB2ZXJpZmljYXRpb24gY29kZVxyXG4gICAgICogICBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcihcclxuICAgICAqICAgICAgIGF1dGguY3VycmVudFVzZXIsXHJcbiAgICAgKiAgICAgICBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCBjb2RlKSk7XHJcbiAgICAgKiB9IGNhdGNoIChlKSB7XHJcbiAgICAgKiAgIGlmIChlLmNvZGUgPT09ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnKSB7XHJcbiAgICAgKiAgICAgY29uc3QgY3JlZCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tRXJyb3IoZSk7XHJcbiAgICAgKiAgICAgYXdhaXQgbGlua1dpdGhDcmVkZW50aWFsKGF1dGguY3VycmVudFVzZXIsIGNyZWQpO1xyXG4gICAgICogICB9XHJcbiAgICAgKiB9XHJcbiAgICAgKlxyXG4gICAgICogLy8gQXQgdGhpcyBwb2ludCwgYXV0aC5jdXJyZW50VXNlci5waG9uZU51bWJlciA9PT0gbnVtYmVyLlxyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGdlbmVyYXRlIGEgY3JlZGVudGlhbCBmcm9tLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKHBob25lTnVtYmVyICYmIHRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVG9rZW5SZXNwb25zZShwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXHJcblBob25lQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJwaG9uZVwiIC8qIFBIT05FICovO1xyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5QSE9ORS4gKi9cclxuUGhvbmVBdXRoUHJvdmlkZXIuUEhPTkVfU0lHTl9JTl9NRVRIT0QgPSBcInBob25lXCIgLyogUEhPTkUgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDaG9vc2VzIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgdG8gdXNlLiBUaGlzIHByZWZlcnMgdGhlIG92ZXJyaWRlICh3aGljaFxyXG4gKiBpcyBkaXJlY3RseSBwYXNzZWQgaW4pLCBhbmQgZmFsbHMgYmFjayB0byB0aGUgcHJvcGVydHkgc2V0IG9uIHRoZSBhdXRoXHJcbiAqIG9iamVjdC4gSWYgbmVpdGhlciBhcmUgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIGVycm9ycyB3LyBhbiBhcmd1bWVudCBlcnJvci5cclxuICovXHJcbmZ1bmN0aW9uIF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGgsIHJlc29sdmVyT3ZlcnJpZGUpIHtcclxuICAgIGlmIChyZXNvbHZlck92ZXJyaWRlKSB7XHJcbiAgICAgICAgcmV0dXJuIF9nZXRJbnN0YW5jZShyZXNvbHZlck92ZXJyaWRlKTtcclxuICAgIH1cclxuICAgIF9hc3NlcnQoYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIGF1dGguX3BvcHVwUmVkaXJlY3RSZXNvbHZlcjtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBJZHBDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XHJcbiAgICAgICAgc3VwZXIoXCJjdXN0b21cIiAvKiBDVVNUT00gKi8sIFwiY3VzdG9tXCIgLyogQ1VTVE9NICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIH1cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcclxuICAgIH1cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCB0aGlzLl9idWlsZElkcFJlcXVlc3QoaWRUb2tlbikpO1xyXG4gICAgfVxyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgdGhpcy5fYnVpbGRJZHBSZXF1ZXN0KCkpO1xyXG4gICAgfVxyXG4gICAgX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogdGhpcy5wYXJhbXMucmVxdWVzdFVyaSxcclxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnBhcmFtcy5zZXNzaW9uSWQsXHJcbiAgICAgICAgICAgIHBvc3RCb2R5OiB0aGlzLnBhcmFtcy5wb3N0Qm9keSxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRoaXMucGFyYW1zLnRlbmFudElkLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGFyYW1zLnBlbmRpbmdUb2tlbixcclxuICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgIHJldHVybklkcENyZWRlbnRpYWw6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpZFRva2VuKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9zaWduSW4ocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gX3NpZ25JbldpdGhDcmVkZW50aWFsKHBhcmFtcy5hdXRoLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcclxufVxyXG5mdW5jdGlvbiBfcmVhdXRoKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XHJcbiAgICBfYXNzZXJ0KHVzZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gX3JlYXV0aGVudGljYXRlKHVzZXIsIG5ldyBJZHBDcmVkZW50aWFsKHBhcmFtcyksIHBhcmFtcy5ieXBhc3NBdXRoU3RhdGUpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9saW5rKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XHJcbiAgICBfYXNzZXJ0KHVzZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gX2xpbmskMSh1c2VyLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUG9wdXAgZXZlbnQgbWFuYWdlci4gSGFuZGxlcyB0aGUgcG9wdXAncyBlbnRpcmUgbGlmZWN5Y2xlOyBsaXN0ZW5zIHRvIGF1dGhcclxuICogZXZlbnRzXHJcbiAqL1xyXG5jbGFzcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgZmlsdGVyLCByZXNvbHZlciwgdXNlciwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjtcclxuICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xyXG4gICAgICAgIHRoaXMuYnlwYXNzQXV0aFN0YXRlID0gYnlwYXNzQXV0aFN0YXRlO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGZpbHRlciA6IFtmaWx0ZXJdO1xyXG4gICAgfVxyXG4gICAgZXhlY3V0ZSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0geyByZXNvbHZlLCByZWplY3QgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gYXdhaXQgdGhpcy5yZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzLmF1dGgpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkV4ZWN1dGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIucmVnaXN0ZXJDb25zdW1lcih0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uQXV0aEV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgeyB1cmxSZXNwb25zZSwgc2Vzc2lvbklkLCBwb3N0Qm9keSwgdGVuYW50SWQsIGVycm9yLCB0eXBlIH0gPSBldmVudDtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgYXV0aDogdGhpcy5hdXRoLFxyXG4gICAgICAgICAgICByZXF1ZXN0VXJpOiB1cmxSZXNwb25zZSxcclxuICAgICAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnRJZCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHBvc3RCb2R5OiBwb3N0Qm9keSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlcixcclxuICAgICAgICAgICAgYnlwYXNzQXV0aFN0YXRlOiB0aGlzLmJ5cGFzc0F1dGhTdGF0ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKGF3YWl0IHRoaXMuZ2V0SWRwVGFzayh0eXBlKShwYXJhbXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcclxuICAgIH1cclxuICAgIGdldElkcFRhc2sodHlwZSkge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwic2lnbkluVmlhUG9wdXBcIiAvKiBTSUdOX0lOX1ZJQV9QT1BVUCAqLzpcclxuICAgICAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NpZ25JbjtcclxuICAgICAgICAgICAgY2FzZSBcImxpbmtWaWFQb3B1cFwiIC8qIExJTktfVklBX1BPUFVQICovOlxyXG4gICAgICAgICAgICBjYXNlIFwibGlua1ZpYVJlZGlyZWN0XCIgLyogTElOS19WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbms7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhWaWFQb3B1cFwiIC8qIFJFQVVUSF9WSUFfUE9QVVAgKi86XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3JlYXV0aDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIF9mYWlsKHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXNvbHZlKGNyZWQpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCh0aGlzLnBlbmRpbmdQcm9taXNlLCAnUGVuZGluZyBwcm9taXNlIHdhcyBuZXZlciBzZXQnKTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlLnJlc29sdmUoY3JlZCk7XHJcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpO1xyXG4gICAgfVxyXG4gICAgcmVqZWN0KGVycm9yKSB7XHJcbiAgICAgICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcclxuICAgIH1cclxuICAgIHVucmVnaXN0ZXJBbmRDbGVhblVwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmV2ZW50TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlci51bnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VUID0gbmV3IERlbGF5KDIwMDAsIDEwMDAwKTtcclxuLyoqXHJcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBwb3B1cC1iYXNlZCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiBzdWNjZWVkcywgcmV0dXJucyB0aGUgc2lnbmVkIGluIHVzZXIgYWxvbmcgd2l0aCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLiBJZiBzaWduIGluIHdhc1xyXG4gKiB1bnN1Y2Nlc3NmdWwsIHJldHVybnMgYW4gZXJyb3Igb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XHJcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcihhdXRoSW50ZXJuYWwsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbihhdXRoSW50ZXJuYWwsIFwic2lnbkluVmlhUG9wdXBcIiAvKiBTSUdOX0lOX1ZJQV9QT1BVUCAqLywgcHJvdmlkZXIsIHJlc29sdmVySW50ZXJuYWwpO1xyXG4gICAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xyXG59XHJcbi8qKlxyXG4gKiBSZWF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHVzaW5nIGEgcG9wLXVwIGJhc2VkXHJcbiAqIE9BdXRoIGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZSByZWF1dGhlbnRpY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBjb250YWluIHRoZSB1c2VyIGFuZCB0aGVcclxuICogcHJvdmlkZXIncyBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gUmVhdXRoZW50aWNhdGUgdXNpbmcgYSBwb3B1cC5cclxuICogYXdhaXQgcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbih1c2VySW50ZXJuYWwuYXV0aCwgXCJyZWF1dGhWaWFQb3B1cFwiIC8qIFJFQVVUSF9WSUFfUE9QVVAgKi8sIHByb3ZpZGVyLCByZXNvbHZlckludGVybmFsLCB1c2VySW50ZXJuYWwpO1xyXG4gICAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xyXG59XHJcbi8qKlxyXG4gKiBMaW5rcyB0aGUgYXV0aGVudGljYXRlZCBwcm92aWRlciB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgcG9wLXVwIGJhc2VkIE9BdXRoIGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZSBsaW5raW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBjb250YWluIHRoZSB1c2VyIGFuZCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgc29tZSBvdGhlciBwcm92aWRlci5cclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKTtcclxuICogLy8gTGluayB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBhd2FpdCBsaW5rV2l0aFBvcHVwKHJlc3VsdC51c2VyLCBwcm92aWRlcik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cclxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXHJcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUG9wdXAodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbih1c2VySW50ZXJuYWwuYXV0aCwgXCJsaW5rVmlhUG9wdXBcIiAvKiBMSU5LX1ZJQV9QT1BVUCAqLywgcHJvdmlkZXIsIHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XHJcbn1cclxuLyoqXHJcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXHJcbiAqIGV2ZW50c1xyXG4gKlxyXG4gKi9cclxuY2xhc3MgUG9wdXBPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgZmlsdGVyLCBwcm92aWRlciwgcmVzb2x2ZXIsIHVzZXIpIHtcclxuICAgICAgICBzdXBlcihhdXRoLCBmaWx0ZXIsIHJlc29sdmVyLCB1c2VyKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBvbGxJZCA9IG51bGw7XHJcbiAgICAgICAgaWYgKFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbikge1xyXG4gICAgICAgICAgICBQb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24uY2FuY2VsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleGVjdXRlTm90TnVsbCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcclxuICAgICAgICBfYXNzZXJ0KHJlc3VsdCwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4ZWN1dGlvbigpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCh0aGlzLmZpbHRlci5sZW5ndGggPT09IDEsICdQb3B1cCBvcGVyYXRpb25zIG9ubHkgaGFuZGxlIG9uZSBldmVudCcpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKCk7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93ID0gYXdhaXQgdGhpcy5yZXNvbHZlci5fb3BlblBvcHVwKHRoaXMuYXV0aCwgdGhpcy5wcm92aWRlciwgdGhpcy5maWx0ZXJbMF0sIC8vIFRoZXJlJ3MgYWx3YXlzIG9uZSwgc2VlIGNvbnN0cnVjdG9yXHJcbiAgICAgICAgZXZlbnRJZCk7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93LmFzc29jaWF0ZWRFdmVudCA9IGV2ZW50SWQ7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHdlYiBzdG9yYWdlIHN1cHBvcnQgYW5kIG9yaWdpbiB2YWxpZGF0aW9uIF9hZnRlcl8gdGhlIHBvcHVwIGlzXHJcbiAgICAgICAgLy8gbG9hZGVkLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBzbG93ICh+MSBzZWNvbmQgb3Igc28pIFJhdGhlciB0aGFuXHJcbiAgICAgICAgLy8gd2FpdGluZyBvbiB0aGVtIGJlZm9yZSBvcGVuaW5nIHRoZSB3aW5kb3csIG9wdGltaXN0aWNhbGx5IG9wZW4gdGhlIHBvcHVwXHJcbiAgICAgICAgLy8gYW5kIGNoZWNrIGZvciBzdG9yYWdlIHN1cHBvcnQgYXQgdGhlIHNhbWUgdGltZS4gSWYgc3RvcmFnZSBzdXBwb3J0IGlzXHJcbiAgICAgICAgLy8gbm90IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGNhdXNlIHRoZSB3aG9sZSB0aGluZyB0byByZWplY3QgcHJvcGVybHkuIEl0XHJcbiAgICAgICAgLy8gd2lsbCBhbHNvIGNsb3NlIHRoZSBwb3B1cCwgYnV0IHNpbmNlIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkLFxyXG4gICAgICAgIC8vIHRoZSBwb3B1cCBjbG9zZWQgYnkgdXNlciBwb2xsIHdpbGwgcmVqZWN0IGludG8gdGhlIHZvaWQuXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlci5fb3JpZ2luVmFsaWRhdGlvbih0aGlzLmF1dGgpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlamVjdChlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlc29sdmVyLl9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQodGhpcy5hdXRoLCBpc1N1cHBvcnRlZCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwid2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWRcIiAvKiBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRCAqLykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gSGFuZGxlIHVzZXIgY2xvc3VyZS4gTm90aWNlIHRoaXMgZG9lcyAqbm90KiB1c2UgYXdhaXRcclxuICAgICAgICB0aGlzLnBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgZXZlbnRJZCgpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmF1dGhXaW5kb3cpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc3NvY2lhdGVkRXZlbnQpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBjYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5yZWplY3QoX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgXCJjYW5jZWxsZWQtcG9wdXAtcmVxdWVzdFwiIC8qIEVYUElSRURfUE9QVVBfUkVRVUVTVCAqLykpO1xyXG4gICAgfVxyXG4gICAgY2xlYW5VcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRoV2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFdpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wb2xsSWQpIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnBvbGxJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXV0aFdpbmRvdyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBwb2xsVXNlckNhbmNlbGxhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBwb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgICAgICBpZiAoKF9iID0gKF9hID0gdGhpcy5hdXRoV2luZG93KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2luZG93KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHRpbWUgZm9yIHdoYXRldmVyIGFjdGlvbiB0b1xyXG4gICAgICAgICAgICAgICAgLy8gY29tcGxldGUuIFRoZSB3aW5kb3cgY291bGQgaGF2ZSBjbG9zZWQgYnV0IHRoZSBzaWduIGluIG5ldHdvcmtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgY291bGQgc3RpbGwgYmUgaW4gZmxpZ2h0LlxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwicG9wdXAtY2xvc2VkLWJ5LXVzZXJcIiAvKiBQT1BVUF9DTE9TRURfQllfVVNFUiAqLykpO1xyXG4gICAgICAgICAgICAgICAgfSwgMjAwMCAvKiBBVVRIX0VWRU5UICovKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvbGxJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHBvbGwsIF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VULmdldCgpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHBvbGwoKTtcclxuICAgIH1cclxufVxyXG4vLyBPbmx5IG9uZSBwb3B1cCBpcyBldmVyIHNob3duIGF0IG9uY2UuIFRoZSBsaWZlY3ljbGUgb2YgdGhlIGN1cnJlbnQgcG9wdXBcclxuLy8gY2FuIGJlIG1hbmFnZWQgLyBjYW5jZWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxyXG5Qb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24gPSBudWxsO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBQRU5ESU5HX1JFRElSRUNUX0tFWSA9ICdwZW5kaW5nUmVkaXJlY3QnO1xyXG4vLyBXZSBvbmx5IGdldCBvbmUgcmVkaXJlY3Qgb3V0Y29tZSBmb3IgYW55IG9uZSBhdXRoLCBzbyBqdXN0IHN0b3JlIGl0XHJcbi8vIGluIGhlcmUuXHJcbmNvbnN0IHJlZGlyZWN0T3V0Y29tZU1hcCA9IG5ldyBNYXAoKTtcclxuY2xhc3MgUmVkaXJlY3RBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgcmVzb2x2ZXIsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgc3VwZXIoYXV0aCwgW1xyXG4gICAgICAgICAgICBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwibGlua1ZpYVJlZGlyZWN0XCIgLyogTElOS19WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwicmVhdXRoVmlhUmVkaXJlY3RcIiAvKiBSRUFVVEhfVklBX1JFRElSRUNUICovLFxyXG4gICAgICAgICAgICBcInVua25vd25cIiAvKiBVTktOT1dOICovXHJcbiAgICAgICAgXSwgcmVzb2x2ZXIsIHVuZGVmaW5lZCwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgICAgICB0aGlzLmV2ZW50SWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkZSB0aGUgZXhlY3V0ZSBmdW5jdGlvbjsgaWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVkaXJlY3QgcmVzdWx0LCB0aGVuXHJcbiAgICAgKiBqdXN0IHJldHVybiBpdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcclxuICAgICAgICBsZXQgcmVhZHlPdXRjb21lID0gcmVkaXJlY3RPdXRjb21lTWFwLmdldCh0aGlzLmF1dGguX2tleSgpKTtcclxuICAgICAgICBpZiAoIXJlYWR5T3V0Y29tZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gYXdhaXQgX2dldEFuZENsZWFyUGVuZGluZ1JlZGlyZWN0U3RhdHVzKHRoaXMucmVzb2x2ZXIsIHRoaXMuYXV0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYXNQZW5kaW5nUmVkaXJlY3QgPyBhd2FpdCBzdXBlci5leGVjdXRlKCkgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgcmVhZHlPdXRjb21lID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5zZXQodGhpcy5hdXRoLl9rZXkoKSwgcmVhZHlPdXRjb21lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGJ5cGFzc2luZyBhdXRoIHN0YXRlLCB0aGUgcmVhZHkgb3V0Y29tZSBzaG91bGQgYmUgc2V0IHRvXHJcbiAgICAgICAgLy8gbnVsbC5cclxuICAgICAgICBpZiAoIXRoaXMuYnlwYXNzQXV0aFN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5zZXQodGhpcy5hdXRoLl9rZXkoKSwgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKG51bGwpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlYWR5T3V0Y29tZSgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25BdXRoRXZlbnQoZXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJzaWduSW5WaWFSZWRpcmVjdFwiIC8qIFNJR05fSU5fVklBX1JFRElSRUNUICovKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwidW5rbm93blwiIC8qIFVOS05PV04gKi8pIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNlbnRpbmVsIHZhbHVlIGluZGljYXRpbmcgdGhlcmUncyBubyBwZW5kaW5nIHJlZGlyZWN0XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLl9yZWRpcmVjdFVzZXJGb3JJZChldmVudC5ldmVudElkKTtcclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25BdXRoRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgb25FeGVjdXRpb24oKSB7IH1cclxuICAgIGNsZWFuVXAoKSB7IH1cclxufVxyXG5hc3luYyBmdW5jdGlvbiBfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXIsIGF1dGgpIHtcclxuICAgIGNvbnN0IGtleSA9IHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKTtcclxuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcik7XHJcbiAgICBpZiAoIShhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoYXNQZW5kaW5nUmVkaXJlY3QgPSAoYXdhaXQgcGVyc2lzdGVuY2UuX2dldChrZXkpKSA9PT0gJ3RydWUnO1xyXG4gICAgYXdhaXQgcGVyc2lzdGVuY2UuX3JlbW92ZShrZXkpO1xyXG4gICAgcmV0dXJuIGhhc1BlbmRpbmdSZWRpcmVjdDtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVyLCBhdXRoKSB7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcikuX3NldChwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aCksICd0cnVlJyk7XHJcbn1cclxuZnVuY3Rpb24gX2NsZWFyUmVkaXJlY3RPdXRjb21lcygpIHtcclxuICAgIHJlZGlyZWN0T3V0Y29tZU1hcC5jbGVhcigpO1xyXG59XHJcbmZ1bmN0aW9uIHJlc29sdmVyUGVyc2lzdGVuY2UocmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfZ2V0SW5zdGFuY2UocmVzb2x2ZXIuX3JlZGlyZWN0UGVyc2lzdGVuY2UpO1xyXG59XHJcbmZ1bmN0aW9uIHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKSB7XHJcbiAgICByZXR1cm4gX3BlcnNpc3RlbmNlS2V5TmFtZShQRU5ESU5HX1JFRElSRUNUX0tFWSwgYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLm5hbWUpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdXRoZW50aWNhdGVzIGEgRmlyZWJhc2UgY2xpZW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgc2NvcGVzIHRvIHRoZSBwcm92aWRlcjpcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiAvLyBBcyB0aGlzIEFQSSBjYW4gYmUgdXNlZCBmb3Igc2lnbi1pbiwgbGlua2luZyBhbmQgcmVhdXRoZW50aWNhdGlvbixcclxuICogLy8gY2hlY2sgdGhlIG9wZXJhdGlvblR5cGUgdG8gZGV0ZXJtaW5lIHdoYXQgdHJpZ2dlcmVkIHRoaXMgcmVkaXJlY3RcclxuICogLy8gb3BlcmF0aW9uLlxyXG4gKiBjb25zdCBvcGVyYXRpb25UeXBlID0gcmVzdWx0Lm9wZXJhdGlvblR5cGU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgcmV0dXJuIF9zaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YoYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlcik7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIGF1dGhJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KGF1dGhJbnRlcm5hbCwgcHJvdmlkZXIsIFwic2lnbkluVmlhUmVkaXJlY3RcIiAvKiBTSUdOX0lOX1ZJQV9SRURJUkVDVCAqLyk7XHJcbn1cclxuLyoqXHJcbiAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgT0F1dGhQcm92aWRlcn0gdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiAvLyBMaW5rIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGF3YWl0IGxpbmtXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIGFnYWluIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cclxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXHJcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHVzZXIsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIC8vIEFsbG93IHRoZSByZXNvbHZlciB0byBlcnJvciBiZWZvcmUgcGVyc2lzdGluZyB0aGUgcmVkaXJlY3QgdXNlclxyXG4gICAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcclxuICAgIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi8sIGV2ZW50SWQpO1xyXG59XHJcbi8qKlxyXG4gKiBMaW5rcyB0aGUge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHRvIHRoZSB1c2VyIGFjY291bnQgdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XHJcbiAqIC8vIExpbmsgdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogYXdhaXQgbGlua1dpdGhSZWRpcmVjdChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9saW5rV2l0aFJlZGlyZWN0KHVzZXIsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xyXG4gICAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgcHJvdmlkZXIucHJvdmlkZXJJZCk7XHJcbiAgICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcclxuICAgIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgXCJsaW5rVmlhUmVkaXJlY3RcIiAvKiBMSU5LX1ZJQV9SRURJUkVDVCAqLywgZXZlbnRJZCk7XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybnMgYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGZyb20gdGhlIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4gZmxvdy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogSWYgc2lnbi1pbiBzdWNjZWVkZWQsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyLiBJZiBzaWduLWluIHdhcyB1bnN1Y2Nlc3NmdWwsIGZhaWxzIHdpdGggYW5cclxuICogZXJyb3IuIElmIG5vIHJlZGlyZWN0IG9wZXJhdGlvbiB3YXMgY2FsbGVkLCByZXR1cm5zIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfVxyXG4gKiB3aXRoIGEgbnVsbCBgdXNlcmAuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXHJcbiAqIC8vIGNoZWNrIHRoZSBvcGVyYXRpb25UeXBlIHRvIGRldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGlzIHJlZGlyZWN0XHJcbiAqIC8vIG9wZXJhdGlvbi5cclxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzb2x2ZXIpIHtcclxuICAgIGF3YWl0IF9jYXN0QXV0aChhdXRoKS5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgcmV0dXJuIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlciwgZmFsc2UpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlckV4dGVybiwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGNvbnN0IHJlc29sdmVyID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBuZXcgUmVkaXJlY3RBY3Rpb24oYXV0aEludGVybmFsLCByZXNvbHZlciwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5leGVjdXRlKCk7XHJcbiAgICBpZiAocmVzdWx0ICYmICFieXBhc3NBdXRoU3RhdGUpIHtcclxuICAgICAgICBkZWxldGUgcmVzdWx0LnVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3BlcnNpc3RVc2VySWZDdXJyZW50KHJlc3VsdC51c2VyKTtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3NldFJlZGlyZWN0VXNlcihudWxsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlcikge1xyXG4gICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoYCR7dXNlci51aWR9Ojo6YCk7XHJcbiAgICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBldmVudElkO1xyXG4gICAgYXdhaXQgdXNlci5hdXRoLl9zZXRSZWRpcmVjdFVzZXIodXNlcik7XHJcbiAgICBhd2FpdCB1c2VyLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXIpO1xyXG4gICAgcmV0dXJuIGV2ZW50SWQ7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0b3JlIHRoZSBVSURzIG9mIHNlZW4gZXZlbnRzOyB0aGlzIGlzXHJcbi8vIHNldCB0byAxMCBtaW4gYnkgZGVmYXVsdFxyXG5jb25zdCBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUyA9IDEwICogNjAgKiAxMDAwO1xyXG5jbGFzcyBBdXRoRXZlbnRNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgfVxyXG4gICAgcmVnaXN0ZXJDb25zdW1lcihhdXRoRXZlbnRDb25zdW1lcikge1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzLmFkZChhdXRoRXZlbnRDb25zdW1lcik7XHJcbiAgICAgICAgaWYgKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmlzRXZlbnRGb3JDb25zdW1lcih0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQsIGF1dGhFdmVudENvbnN1bWVyKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRUb0NvbnN1bWVyKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCwgYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1bnJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnN1bWVycy5kZWxldGUoYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgfVxyXG4gICAgb25FdmVudChldmVudCkge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWRcclxuICAgICAgICBpZiAodGhpcy5oYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25zdW1lcnMuZm9yRWFjaChjb25zdW1lciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXZlbnRGb3JDb25zdW1lcihldmVudCwgY29uc3VtZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUV2ZW50VG9DYWNoZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgfHwgIWlzUmVkaXJlY3RFdmVudChldmVudCkpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgcmVkaXJlY3QgYmVmb3JlLCBvciB0aGlzIGlzIGEgcG9wdXAgZXZlbnQsXHJcbiAgICAgICAgICAgIC8vIGJhaWwgbm93XHJcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IHRydWU7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHdhc24ndCBoYW5kbGVkLCBoYW5nIG9uIHRvIGl0XHJcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IGV2ZW50O1xyXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XHJcbiAgICB9XHJcbiAgICBzZW5kVG9Db25zdW1lcihldmVudCwgY29uc3VtZXIpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yICYmICFpc051bGxSZWRpcmVjdEV2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlID0gKChfYSA9IGV2ZW50LmVycm9yLmNvZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zcGxpdCgnYXV0aC8nKVsxXSkgfHxcclxuICAgICAgICAgICAgICAgIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBJTlRFUk5BTF9FUlJPUiAqLztcclxuICAgICAgICAgICAgY29uc3VtZXIub25FcnJvcihfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBjb2RlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdW1lci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaXNFdmVudEZvckNvbnN1bWVyKGV2ZW50LCBjb25zdW1lcikge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SWRNYXRjaGVzID0gY29uc3VtZXIuZXZlbnRJZCA9PT0gbnVsbCB8fFxyXG4gICAgICAgICAgICAoISFldmVudC5ldmVudElkICYmIGV2ZW50LmV2ZW50SWQgPT09IGNvbnN1bWVyLmV2ZW50SWQpO1xyXG4gICAgICAgIHJldHVybiBjb25zdW1lci5maWx0ZXIuaW5jbHVkZXMoZXZlbnQudHlwZSkgJiYgZXZlbnRJZE1hdGNoZXM7XHJcbiAgICB9XHJcbiAgICBoYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPj1cclxuICAgICAgICAgICAgRVZFTlRfRFVQTElDQVRJT05fQ0FDSEVfRFVSQVRJT05fTVMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRFdmVudFVpZHMuY2xlYXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmhhcyhldmVudFVpZChldmVudCkpO1xyXG4gICAgfVxyXG4gICAgc2F2ZUV2ZW50VG9DYWNoZShldmVudCkge1xyXG4gICAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmFkZChldmVudFVpZChldmVudCkpO1xyXG4gICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZXZlbnRVaWQoZSkge1xyXG4gICAgcmV0dXJuIFtlLnR5cGUsIGUuZXZlbnRJZCwgZS5zZXNzaW9uSWQsIGUudGVuYW50SWRdLmZpbHRlcih2ID0+IHYpLmpvaW4oJy0nKTtcclxufVxyXG5mdW5jdGlvbiBpc051bGxSZWRpcmVjdEV2ZW50KHsgdHlwZSwgZXJyb3IgfSkge1xyXG4gICAgcmV0dXJuICh0eXBlID09PSBcInVua25vd25cIiAvKiBVTktOT1dOICovICYmXHJcbiAgICAgICAgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKSA9PT0gYGF1dGgvJHtcIm5vLWF1dGgtZXZlbnRcIiAvKiBOT19BVVRIX0VWRU5UICovfWApO1xyXG59XHJcbmZ1bmN0aW9uIGlzUmVkaXJlY3RFdmVudChldmVudCkge1xyXG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgY2FzZSBcImxpbmtWaWFSZWRpcmVjdFwiIC8qIExJTktfVklBX1JFRElSRUNUICovOlxyXG4gICAgICAgIGNhc2UgXCJyZWF1dGhWaWFSZWRpcmVjdFwiIC8qIFJFQVVUSF9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGNhc2UgXCJ1bmtub3duXCIgLyogVU5LTk9XTiAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIGlzTnVsbFJlZGlyZWN0RXZlbnQoZXZlbnQpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfZ2V0UHJvamVjdENvbmZpZyhhdXRoLCByZXF1ZXN0ID0ge30pIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJHRVRcIiAvKiBHRVQgKi8sIFwiL3YxL3Byb2plY3RzXCIgLyogR0VUX1BST0pFQ1RfQ09ORklHICovLCByZXF1ZXN0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBJUF9BRERSRVNTX1JFR0VYID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xyXG5jb25zdCBIVFRQX1JFR0VYID0gL15odHRwcz8vO1xyXG5hc3luYyBmdW5jdGlvbiBfdmFsaWRhdGVPcmlnaW4oYXV0aCkge1xyXG4gICAgLy8gU2tpcCBvcmlnaW4gdmFsaWRhdGlvbiBpZiB3ZSBhcmUgaW4gYW4gZW11bGF0ZWQgZW52aXJvbm1lbnRcclxuICAgIGlmIChhdXRoLmNvbmZpZy5lbXVsYXRvcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgYXV0aG9yaXplZERvbWFpbnMgfSA9IGF3YWl0IF9nZXRQcm9qZWN0Q29uZmlnKGF1dGgpO1xyXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgYXV0aG9yaXplZERvbWFpbnMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAobWF0Y2hEb21haW4oZG9tYWluKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3MgYSBVUkwgZXJyb3I7IGp1c3QgY29udGludWUgc2VhcmNoaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSW4gdGhlIG9sZCBTREssIHRoaXMgZXJyb3IgYWxzbyBwcm92aWRlcyBoZWxwZnVsIG1lc3NhZ2VzLlxyXG4gICAgX2ZhaWwoYXV0aCwgXCJ1bmF1dGhvcml6ZWQtZG9tYWluXCIgLyogSU5WQUxJRF9PUklHSU4gKi8pO1xyXG59XHJcbmZ1bmN0aW9uIG1hdGNoRG9tYWluKGV4cGVjdGVkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXJsID0gX2dldEN1cnJlbnRVcmwoKTtcclxuICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xyXG4gICAgaWYgKGV4cGVjdGVkLnN0YXJ0c1dpdGgoJ2Nocm9tZS1leHRlbnNpb246Ly8nKSkge1xyXG4gICAgICAgIGNvbnN0IGNlVXJsID0gbmV3IFVSTChleHBlY3RlZCk7XHJcbiAgICAgICAgaWYgKGNlVXJsLmhvc3RuYW1lID09PSAnJyAmJiBob3N0bmFtZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIG5vdCBwYXJzaW5nIGNocm9tZSBVUkxzIHByb3Blcmx5XHJcbiAgICAgICAgICAgIHJldHVybiAocHJvdG9jb2wgPT09ICdjaHJvbWUtZXh0ZW5zaW9uOicgJiZcclxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJykgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVybC5yZXBsYWNlKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJywgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmIGNlVXJsLmhvc3RuYW1lID09PSBob3N0bmFtZTtcclxuICAgIH1cclxuICAgIGlmICghSFRUUF9SRUdFWC50ZXN0KHByb3RvY29sKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChJUF9BRERSRVNTX1JFR0VYLnRlc3QoZXhwZWN0ZWQpKSB7XHJcbiAgICAgICAgLy8gVGhlIGRvbWFpbiBoYXMgdG8gYmUgZXhhY3RseSBlcXVhbCB0byB0aGUgcGF0dGVybiwgYXMgYW4gSVAgZG9tYWluIHdpbGxcclxuICAgICAgICAvLyBvbmx5IGNvbnRhaW4gdGhlIElQLCBubyBleHRyYSBjaGFyYWN0ZXIuXHJcbiAgICAgICAgcmV0dXJuIGhvc3RuYW1lID09PSBleHBlY3RlZDtcclxuICAgIH1cclxuICAgIC8vIERvdHMgaW4gcGF0dGVybiBzaG91bGQgYmUgZXNjYXBlZC5cclxuICAgIGNvbnN0IGVzY2FwZWREb21haW5QYXR0ZXJuID0gZXhwZWN0ZWQucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xyXG4gICAgLy8gTm9uIGlwIGFkZHJlc3MgZG9tYWlucy5cclxuICAgIC8vIGRvbWFpbi5jb20gPSAqLmRvbWFpbi5jb20gT1IgZG9tYWluLmNvbVxyXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeKC4rXFxcXC4nICsgZXNjYXBlZERvbWFpblBhdHRlcm4gKyAnfCcgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICcpJCcsICdpJyk7XHJcbiAgICByZXR1cm4gcmUudGVzdChob3N0bmFtZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVCA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG4vKipcclxuICogUmVzZXQgdW5sYW9kZWQgR0FwaSBtb2R1bGVzLiBJZiBnYXBpLmxvYWQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBlcnJvcixcclxuICogaXQgd2lsbCBzdG9wIHdvcmtpbmcgYWZ0ZXIgYSByZXRyaWFsLiBUaGlzIGlzIGEgaGFjayB0byBmaXggdGhpcyBpc3N1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpIHtcclxuICAgIC8vIENsZWFyIGxhc3QgZmFpbGVkIGdhcGkubG9hZCBzdGF0ZSB0byBmb3JjZSBuZXh0IGdhcGkubG9hZCB0byBmaXJzdFxyXG4gICAgLy8gbG9hZCB0aGUgZmFpbGVkIGdhcGkuaWZyYW1lcyBtb2R1bGUuXHJcbiAgICAvLyBHZXQgZ2FwaXguYmVhY29uIGNvbnRleHQuXHJcbiAgICBjb25zdCBiZWFjb24gPSBfd2luZG93KCkuX19fanNsO1xyXG4gICAgLy8gR2V0IGN1cnJlbnQgaGludC5cclxuICAgIGlmIChiZWFjb24gPT09IG51bGwgfHwgYmVhY29uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiZWFjb24uSCkge1xyXG4gICAgICAgIC8vIEdldCBnYXBpIGhpbnQuXHJcbiAgICAgICAgZm9yIChjb25zdCBoaW50IG9mIE9iamVjdC5rZXlzKGJlYWNvbi5IKSkge1xyXG4gICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgbW9kdWxlcy5cclxuICAgICAgICAgICAgYmVhY29uLkhbaGludF0uciA9IGJlYWNvbi5IW2hpbnRdLnIgfHwgW107XHJcbiAgICAgICAgICAgIC8vIExvYWRlZCBtb2R1bGVzLlxyXG4gICAgICAgICAgICBiZWFjb24uSFtoaW50XS5MID0gYmVhY29uLkhbaGludF0uTCB8fCBbXTtcclxuICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3RlZCBtb2R1bGVzIHRvIGEgY29weSBvZiB0aGUgbG9hZGVkIG1vZHVsZXMuXHJcbiAgICAgICAgICAgIGJlYWNvbi5IW2hpbnRdLnIgPSBbLi4uYmVhY29uLkhbaGludF0uTF07XHJcbiAgICAgICAgICAgIC8vIENsZWFyIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICBpZiAoYmVhY29uLkNQKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJlYWNvbi5DUC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZmFpbGVkIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICAgICAgICAgIGJlYWNvbi5DUFtpXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbG9hZEdhcGkoYXV0aCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAvLyBGdW5jdGlvbiB0byBydW4gd2hlbiBnYXBpLmxvYWQgaXMgcmVhZHkuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZEdhcGlJZnJhbWUoKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBkZXZlbG9wZXIgbWF5IGhhdmUgdHJpZWQgdG8gcHJldmlvdXNseSBydW4gZ2FwaS5sb2FkIGFuZCBmYWlsZWQuXHJcbiAgICAgICAgICAgIC8vIFJ1biB0aGlzIHRvIGZpeCB0aGF0LlxyXG4gICAgICAgICAgICByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTtcclxuICAgICAgICAgICAgZ2FwaS5sb2FkKCdnYXBpLmlmcmFtZXMnLCB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb250aW1lb3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIHJlc2V0IG1heSBiZSBzdWZmaWNpZW50LCBidXQgaGF2aW5nIHRoaXMgcmVzZXQgYWZ0ZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIGVuc3VyZXMgdGhhdCBpZiB0aGUgZGV2ZWxvcGVyIGNhbGxzIGdhcGkubG9hZCBhZnRlciB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkIGFuZCBiZWZvcmUgYW5vdGhlciBhdHRlbXB0IHRvIGVtYmVkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSwgaXQgd291bGQgd29yayBhbmQgd291bGQgbm90IGJlIGJyb2tlbiBiZWNhdXNlIG9mIG91clxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBhdHRlbXB0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgd2hlbiBnYXBpLmlmcmFtZXMuSWZyYW1lIG5vdCBsb2FkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRVbmxvYWRlZEdhcGlNb2R1bGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcIm5ldHdvcmstcmVxdWVzdC1mYWlsZWRcIiAvKiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogTkVUV09SS19USU1FT1VULmdldCgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKF9iID0gKF9hID0gX3dpbmRvdygpLmdhcGkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZnJhbWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuSWZyYW1lKSB7XHJcbiAgICAgICAgICAgIC8vIElmIGdhcGkuaWZyYW1lcy5JZnJhbWUgYXZhaWxhYmxlLCByZXNvbHZlLlxyXG4gICAgICAgICAgICByZXNvbHZlKGdhcGkuaWZyYW1lcy5nZXRDb250ZXh0KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghISgoX2MgPSBfd2luZG93KCkuZ2FwaSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxvYWQpKSB7XHJcbiAgICAgICAgICAgIC8vIEdhcGkgbG9hZGVyIHJlYWR5LCBsb2FkIGdhcGkuaWZyYW1lcy5cclxuICAgICAgICAgICAgbG9hZEdhcGlJZnJhbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpZnJhbWUgY2FsbGJhY2sgd2hlbiB0aGlzIGlzIGNhbGxlZCBzbyBhcyBub3QgdG8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgIC8vIGFueSBwcmV2aW91cyBkZWZpbmVkIGNhbGxiYWNrLiBUaGlzIGhhcHBlbnMgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkXHJcbiAgICAgICAgICAgIC8vIG11bHRpcGxlIHRpbWVzIGluIHBhcmFsbGVsIGFuZCBjb3VsZCByZXN1bHQgaW4gdGhlIGxhdGVyIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgd291bGQgZW5kIHVwIHdpdGggYSBpZnJhbWVcclxuICAgICAgICAgICAgLy8gdGltZW91dC5cclxuICAgICAgICAgICAgY29uc3QgY2JOYW1lID0gX2dlbmVyYXRlQ2FsbGJhY2tOYW1lKCdpZnJhbWVmY2InKTtcclxuICAgICAgICAgICAgLy8gR0FwaSBsb2FkZXIgbm90IGF2YWlsYWJsZSwgZHluYW1pY2FsbHkgbG9hZCBwbGF0Zm9ybS5qcy5cclxuICAgICAgICAgICAgX3dpbmRvdygpW2NiTmFtZV0gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBHQXBpIGxvYWRlciBzaG91bGQgYmUgcmVhZHkuXHJcbiAgICAgICAgICAgICAgICBpZiAoISFnYXBpLmxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkR2FwaUlmcmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gR2FwaSBsb2FkZXIgZmFpbGVkLCB0aHJvdyBlcnJvci5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy8gTG9hZCBHQXBpIGxvYWRlci5cclxuICAgICAgICAgICAgcmV0dXJuIF9sb2FkSlMoYGh0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL2FwaS5qcz9vbmxvYWQ9JHtjYk5hbWV9YCkuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAvLyBSZXNldCBjYWNoZWQgcHJvbWlzZSB0byBhbGxvdyBmb3IgcmV0cmlhbC5cclxuICAgICAgICBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0pO1xyXG59XHJcbmxldCBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuZnVuY3Rpb24gX2xvYWRHYXBpKGF1dGgpIHtcclxuICAgIGNhY2hlZEdBcGlMb2FkZXIgPSBjYWNoZWRHQXBpTG9hZGVyIHx8IGxvYWRHYXBpKGF1dGgpO1xyXG4gICAgcmV0dXJuIGNhY2hlZEdBcGlMb2FkZXI7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFBJTkdfVElNRU9VVCA9IG5ldyBEZWxheSg1MDAwLCAxNTAwMCk7XHJcbmNvbnN0IElGUkFNRV9QQVRIID0gJ19fL2F1dGgvaWZyYW1lJztcclxuY29uc3QgRU1VTEFURURfSUZSQU1FX1BBVEggPSAnZW11bGF0b3IvYXV0aC9pZnJhbWUnO1xyXG5jb25zdCBJRlJBTUVfQVRUUklCVVRFUyA9IHtcclxuICAgIHN0eWxlOiB7XHJcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgdG9wOiAnLTEwMHB4JyxcclxuICAgICAgICB3aWR0aDogJzFweCcsXHJcbiAgICAgICAgaGVpZ2h0OiAnMXB4J1xyXG4gICAgfSxcclxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJyxcclxuICAgIHRhYmluZGV4OiAnLTEnXHJcbn07XHJcbi8vIE1hcCBmcm9tIGFwaUhvc3QgdG8gZW5kcG9pbnQgSUQgZm9yIHBhc3NpbmcgaW50byBpZnJhbWUuIEluIGN1cnJlbnQgU0RLLCBhcGlIb3N0IGNhbiBiZSBzZXQgdG9cclxuLy8gYW55dGhpbmcgKG5vdCBmcm9tIGEgbGlzdCBvZiBlbmRwb2ludHMgd2l0aCBJRHMgYXMgaW4gbGVnYWN5KSwgc28gdGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0LlxyXG5jb25zdCBFSURfRlJPTV9BUElIT1NUID0gbmV3IE1hcChbXHJcbiAgICBbXCJpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb21cIiAvKiBBUElfSE9TVCAqLywgJ3AnXSxcclxuICAgIFsnc3RhZ2luZy1pZGVudGl0eXRvb2xraXQuc2FuZGJveC5nb29nbGVhcGlzLmNvbScsICdzJ10sXHJcbiAgICBbJ3Rlc3QtaWRlbnRpdHl0b29sa2l0LnNhbmRib3guZ29vZ2xlYXBpcy5jb20nLCAndCddIC8vIHRlc3RcclxuXSk7XHJcbmZ1bmN0aW9uIGdldElmcmFtZVVybChhdXRoKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSBhdXRoLmNvbmZpZztcclxuICAgIF9hc3NlcnQoY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIFwiYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkXCIgLyogTUlTU0lOR19BVVRIX0RPTUFJTiAqLyk7XHJcbiAgICBjb25zdCB1cmwgPSBjb25maWcuZW11bGF0b3JcclxuICAgICAgICA/IF9lbXVsYXRvclVybChjb25maWcsIEVNVUxBVEVEX0lGUkFNRV9QQVRIKVxyXG4gICAgICAgIDogYGh0dHBzOi8vJHthdXRoLmNvbmZpZy5hdXRoRG9tYWlufS8ke0lGUkFNRV9QQVRIfWA7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcclxuICAgICAgICB2OiBTREtfVkVSU0lPTlxyXG4gICAgfTtcclxuICAgIGNvbnN0IGVpZCA9IEVJRF9GUk9NX0FQSUhPU1QuZ2V0KGF1dGguY29uZmlnLmFwaUhvc3QpO1xyXG4gICAgaWYgKGVpZCkge1xyXG4gICAgICAgIHBhcmFtcy5laWQgPSBlaWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcmFtZXdvcmtzID0gYXV0aC5fZ2V0RnJhbWV3b3JrcygpO1xyXG4gICAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSB7XHJcbiAgICAgICAgcGFyYW1zLmZ3ID0gZnJhbWV3b3Jrcy5qb2luKCcsJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7dXJsfT8ke3F1ZXJ5c3RyaW5nKHBhcmFtcykuc2xpY2UoMSl9YDtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfb3BlbklmcmFtZShhdXRoKSB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgX2xvYWRHYXBpKGF1dGgpO1xyXG4gICAgY29uc3QgZ2FwaSA9IF93aW5kb3coKS5nYXBpO1xyXG4gICAgX2Fzc2VydChnYXBpLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIGNvbnRleHQub3Blbih7XHJcbiAgICAgICAgd2hlcmU6IGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgdXJsOiBnZXRJZnJhbWVVcmwoYXV0aCksXHJcbiAgICAgICAgbWVzc2FnZUhhbmRsZXJzRmlsdGVyOiBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IElGUkFNRV9BVFRSSUJVVEVTLFxyXG4gICAgICAgIGRvbnRjbGVhcjogdHJ1ZVxyXG4gICAgfSwgKGlmcmFtZSkgPT4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGlmcmFtZS5yZXN0eWxlKHtcclxuICAgICAgICAgICAgLy8gUHJldmVudCBpZnJhbWUgZnJvbSBjbG9zaW5nIG9uIG1vdXNlIG91dC5cclxuICAgICAgICAgICAgc2V0SGlkZU9uTGVhdmU6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbmV0d29ya0Vycm9yID0gX2NyZWF0ZUVycm9yKGF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pO1xyXG4gICAgICAgIC8vIENvbmZpcm0gaWZyYW1lIGlzIGNvcnJlY3RseSBsb2FkZWQuXHJcbiAgICAgICAgLy8gVG8gZmFsbGJhY2sgb24gZmFpbHVyZSwgc2V0IGEgdGltZW91dC5cclxuICAgICAgICBjb25zdCBuZXR3b3JrRXJyb3JUaW1lciA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XHJcbiAgICAgICAgfSwgUElOR19USU1FT1VULmdldCgpKTtcclxuICAgICAgICAvLyBDbGVhciB0aW1lciBhbmQgcmVzb2x2ZSBwZW5kaW5nIGlmcmFtZSByZWFkeSBwcm9taXNlLlxyXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFyVGltZXJBbmRSZXNvbHZlKCkge1xyXG4gICAgICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtFcnJvclRpbWVyKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShpZnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUaGlzIHJldHVybnMgYW4gSVRoZW5hYmxlLiBIb3dldmVyIHRoZSByZWplY3QgcGFydCBkb2VzIG5vdCBjYWxsXHJcbiAgICAgICAgLy8gd2hlbiB0aGUgaWZyYW1lIGlzIG5vdCBsb2FkZWQuXHJcbiAgICAgICAgaWZyYW1lLnBpbmcoY2xlYXJUaW1lckFuZFJlc29sdmUpLnRoZW4oY2xlYXJUaW1lckFuZFJlc29sdmUsICgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEJBU0VfUE9QVVBfT1BUSU9OUyA9IHtcclxuICAgIGxvY2F0aW9uOiAneWVzJyxcclxuICAgIHJlc2l6YWJsZTogJ3llcycsXHJcbiAgICBzdGF0dXNiYXI6ICd5ZXMnLFxyXG4gICAgdG9vbGJhcjogJ25vJ1xyXG59O1xyXG5jb25zdCBERUZBVUxUX1dJRFRIID0gNTAwO1xyXG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDYwMDtcclxuY29uc3QgVEFSR0VUX0JMQU5LID0gJ19ibGFuayc7XHJcbmNvbnN0IEZJUkVGT1hfRU1QVFlfVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG5jbGFzcyBBdXRoUG9wdXAge1xyXG4gICAgY29uc3RydWN0b3Iod2luZG93KSB7XHJcbiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7XHJcbiAgICAgICAgdGhpcy5hc3NvY2lhdGVkRXZlbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gX29wZW4oYXV0aCwgdXJsLCBuYW1lLCB3aWR0aCA9IERFRkFVTFRfV0lEVEgsIGhlaWdodCA9IERFRkFVTFRfSEVJR0hUKSB7XHJcbiAgICBjb25zdCB0b3AgPSBNYXRoLm1heCgod2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAtIGhlaWdodCkgLyAyLCAwKS50b1N0cmluZygpO1xyXG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KCh3aW5kb3cuc2NyZWVuLmF2YWlsV2lkdGggLSB3aWR0aCkgLyAyLCAwKS50b1N0cmluZygpO1xyXG4gICAgbGV0IHRhcmdldCA9ICcnO1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgQkFTRV9QT1BVUF9PUFRJT05TKSwgeyB3aWR0aDogd2lkdGgudG9TdHJpbmcoKSwgaGVpZ2h0OiBoZWlnaHQudG9TdHJpbmcoKSwgdG9wLFxyXG4gICAgICAgIGxlZnQgfSk7XHJcbiAgICAvLyBDaHJvbWUgaU9TIDcgYW5kIDggaXMgcmV0dXJuaW5nIGFuIHVuZGVmaW5lZCBwb3B1cCB3aW4gd2hlbiB0YXJnZXQgaXNcclxuICAgIC8vIHNwZWNpZmllZCwgZXZlbiB0aG91Z2ggdGhlIHBvcHVwIGlzIG5vdCBuZWNlc3NhcmlseSBibG9ja2VkLlxyXG4gICAgY29uc3QgdWEgPSBnZXRVQSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICAgIHRhcmdldCA9IF9pc0Nocm9tZUlPUyh1YSkgPyBUQVJHRVRfQkxBTksgOiBuYW1lO1xyXG4gICAgfVxyXG4gICAgaWYgKF9pc0ZpcmVmb3godWEpKSB7XHJcbiAgICAgICAgLy8gRmlyZWZveCBjb21wbGFpbnMgd2hlbiBpbnZhbGlkIFVSTHMgYXJlIHBvcHBlZCBvdXQuIEhhY2t5IHdheSB0byBieXBhc3MuXHJcbiAgICAgICAgdXJsID0gdXJsIHx8IEZJUkVGT1hfRU1QVFlfVVJMO1xyXG4gICAgICAgIC8vIEZpcmVmb3ggZGlzYWJsZXMgYnkgZGVmYXVsdCBzY3JvbGxpbmcgb24gcG9wdXAgd2luZG93cywgd2hpY2ggY2FuIGNyZWF0ZVxyXG4gICAgICAgIC8vIGlzc3VlcyB3aGVuIHRoZSB1c2VyIGhhcyBtYW55IEdvb2dsZSBhY2NvdW50cywgZm9yIGluc3RhbmNlLlxyXG4gICAgICAgIG9wdGlvbnMuc2Nyb2xsYmFycyA9ICd5ZXMnO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3B0aW9uc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLnJlZHVjZSgoYWNjdW0sIFtrZXksIHZhbHVlXSkgPT4gYCR7YWNjdW19JHtrZXl9PSR7dmFsdWV9LGAsICcnKTtcclxuICAgIGlmIChfaXNJT1NTdGFuZGFsb25lKHVhKSAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcclxuICAgICAgICBvcGVuQXNOZXdXaW5kb3dJT1ModXJsIHx8ICcnLCB0YXJnZXQpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQXV0aFBvcHVwKG51bGwpO1xyXG4gICAgfVxyXG4gICAgLy8gYWJvdXQ6YmxhbmsgZ2V0dGluZyBzYW5pdGl6ZWQgY2F1c2luZyBicm93c2VycyBsaWtlIElFL0VkZ2UgdG8gZGlzcGxheVxyXG4gICAgLy8gYnJpZWYgZXJyb3IgbWVzc2FnZSBiZWZvcmUgcmVkaXJlY3RpbmcgdG8gaGFuZGxlci5cclxuICAgIGNvbnN0IG5ld1dpbiA9IHdpbmRvdy5vcGVuKHVybCB8fCAnJywgdGFyZ2V0LCBvcHRpb25zU3RyaW5nKTtcclxuICAgIF9hc3NlcnQobmV3V2luLCBhdXRoLCBcInBvcHVwLWJsb2NrZWRcIiAvKiBQT1BVUF9CTE9DS0VEICovKTtcclxuICAgIC8vIEZsYWt5IG9uIElFIGVkZ2UsIGVuY2Fwc3VsYXRlIHdpdGggYSB0cnkgYW5kIGNhdGNoLlxyXG4gICAgdHJ5IHtcclxuICAgICAgICBuZXdXaW4uZm9jdXMoKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7IH1cclxuICAgIHJldHVybiBuZXcgQXV0aFBvcHVwKG5ld1dpbik7XHJcbn1cclxuZnVuY3Rpb24gb3BlbkFzTmV3V2luZG93SU9TKHVybCwgdGFyZ2V0KSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGVsLmhyZWYgPSB1cmw7XHJcbiAgICBlbC50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICBjb25zdCBjbGljayA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XHJcbiAgICBjbGljay5pbml0TW91c2VFdmVudCgnY2xpY2snLCB0cnVlLCB0cnVlLCB3aW5kb3csIDEsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAxLCBudWxsKTtcclxuICAgIGVsLmRpc3BhdGNoRXZlbnQoY2xpY2spO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBVUkwgZm9yIEF1dGhlbnRpY2F0aW9uIHdpZGdldCB3aGljaCB3aWxsIGluaXRpYXRlIHRoZSBPQXV0aCBoYW5kc2hha2VcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBXSURHRVRfUEFUSCA9ICdfXy9hdXRoL2hhbmRsZXInO1xyXG4vKipcclxuICogVVJMIGZvciBlbXVsYXRlZCBlbnZpcm9ubWVudFxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IEVNVUxBVE9SX1dJREdFVF9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaGFuZGxlcic7XHJcbmZ1bmN0aW9uIF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIHJlZGlyZWN0VXJsLCBldmVudElkLCBhZGRpdGlvbmFsUGFyYW1zKSB7XHJcbiAgICBfYXNzZXJ0KGF1dGguY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIFwiYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkXCIgLyogTUlTU0lOR19BVVRIX0RPTUFJTiAqLyk7XHJcbiAgICBfYXNzZXJ0KGF1dGguY29uZmlnLmFwaUtleSwgYXV0aCwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBJTlZBTElEX0FQSV9LRVkgKi8pO1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIGFwaUtleTogYXV0aC5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcclxuICAgICAgICBhdXRoVHlwZSxcclxuICAgICAgICByZWRpcmVjdFVybCxcclxuICAgICAgICB2OiBTREtfVkVSU0lPTixcclxuICAgICAgICBldmVudElkXHJcbiAgICB9O1xyXG4gICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKSB7XHJcbiAgICAgICAgcHJvdmlkZXIuc2V0RGVmYXVsdExhbmd1YWdlKGF1dGgubGFuZ3VhZ2VDb2RlKTtcclxuICAgICAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVyLnByb3ZpZGVySWQgfHwgJyc7XHJcbiAgICAgICAgaWYgKCFpc0VtcHR5KHByb3ZpZGVyLmdldEN1c3RvbVBhcmFtZXRlcnMoKSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmN1c3RvbVBhcmFtZXRlcnMgPSBKU09OLnN0cmluZ2lmeShwcm92aWRlci5nZXRDdXN0b21QYXJhbWV0ZXJzKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHNldCBhZGRpdGlvbmFsUGFyYW1zIGZyb20gdGhlIHByb3ZpZGVyIGFzIHdlbGw/XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbFBhcmFtcyB8fCB7fSkpIHtcclxuICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBCYXNlT0F1dGhQcm92aWRlcikge1xyXG4gICAgICAgIGNvbnN0IHNjb3BlcyA9IHByb3ZpZGVyLmdldFNjb3BlcygpLmZpbHRlcihzY29wZSA9PiBzY29wZSAhPT0gJycpO1xyXG4gICAgICAgIGlmIChzY29wZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuc2NvcGVzID0gc2NvcGVzLmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYXV0aC50ZW5hbnRJZCkge1xyXG4gICAgICAgIHBhcmFtcy50aWQgPSBhdXRoLnRlbmFudElkO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogbWF5YmUgc2V0IGVpZCBhcyBlbmRpcG9pbnRJZFxyXG4gICAgLy8gVE9ETzogbWF5YmUgc2V0IGZ3IGFzIEZyYW1ld29ya3Muam9pbihcIixcIilcclxuICAgIGNvbnN0IHBhcmFtc0RpY3QgPSBwYXJhbXM7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhbXNEaWN0KSkge1xyXG4gICAgICAgIGlmIChwYXJhbXNEaWN0W2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgcGFyYW1zRGljdFtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBgJHtnZXRIYW5kbGVyQmFzZShhdXRoKX0/JHtxdWVyeXN0cmluZyhwYXJhbXNEaWN0KS5zbGljZSgxKX1gO1xyXG59XHJcbmZ1bmN0aW9uIGdldEhhbmRsZXJCYXNlKHsgY29uZmlnIH0pIHtcclxuICAgIGlmICghY29uZmlnLmVtdWxhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGBodHRwczovLyR7Y29uZmlnLmF1dGhEb21haW59LyR7V0lER0VUX1BBVEh9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBfZW11bGF0b3JVcmwoY29uZmlnLCBFTVVMQVRPUl9XSURHRVRfUEFUSCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBzcGVjaWFsIHdlYiBzdG9yYWdlIGV2ZW50XHJcbiAqXHJcbiAqL1xyXG5jb25zdCBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSA9ICd3ZWJTdG9yYWdlU3VwcG9ydCc7XHJcbmNsYXNzIEJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5pZnJhbWVzID0ge307XHJcbiAgICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXMgPSB7fTtcclxuICAgICAgICB0aGlzLl9yZWRpcmVjdFBlcnNpc3RlbmNlID0gYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcclxuICAgICAgICB0aGlzLl9jb21wbGV0ZVJlZGlyZWN0Rm4gPSBfZ2V0UmVkaXJlY3RSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICAvLyBXcmFwcGluZyBpbiBhc3luYyBldmVuIHRob3VnaCB3ZSBkb24ndCBhd2FpdCBhbnl3aGVyZSBpbiBvcmRlclxyXG4gICAgLy8gdG8gbWFrZSBzdXJlIGVycm9ycyBhcmUgcmFpc2VkIGFzIHByb21pc2UgcmVqZWN0aW9uc1xyXG4gICAgYXN5bmMgX29wZW5Qb3B1cChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIGV2ZW50SWQpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgZGVidWdBc3NlcnQoKF9hID0gdGhpcy5ldmVudE1hbmFnZXJzW2F1dGguX2tleSgpXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hbmFnZXIsICdfaW5pdGlhbGl6ZSgpIG5vdCBjYWxsZWQgYmVmb3JlIF9vcGVuUG9wdXAoKScpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIF9nZXRDdXJyZW50VXJsKCksIGV2ZW50SWQpO1xyXG4gICAgICAgIHJldHVybiBfb3BlbihhdXRoLCB1cmwsIF9nZW5lcmF0ZUV2ZW50SWQoKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfb3BlblJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XHJcbiAgICAgICAgX3NldFdpbmRvd0xvY2F0aW9uKF9nZXRSZWRpcmVjdFVybChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIF9nZXRDdXJyZW50VXJsKCksIGV2ZW50SWQpKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4geyB9KTtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgY29uc3QgeyBtYW5hZ2VyLCBwcm9taXNlIH0gPSB0aGlzLmV2ZW50TWFuYWdlcnNba2V5XTtcclxuICAgICAgICAgICAgaWYgKG1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFuYWdlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWJ1Z0Fzc2VydChwcm9taXNlLCAnSWYgbWFuYWdlciBpcyBub3Qgc2V0LCBwcm9taXNlIHNob3VsZCBiZScpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuaW5pdEFuZEdldE1hbmFnZXIoYXV0aCk7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2tleV0gPSB7IHByb21pc2UgfTtcclxuICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCwgdGhlIGtleSBzaG91bGQgYmUgcmVtb3ZlZCBzbyB0aGF0IHRoZVxyXG4gICAgICAgIC8vIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZCBsYXRlci5cclxuICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdEFuZEdldE1hbmFnZXIoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGF3YWl0IF9vcGVuSWZyYW1lKGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcclxuICAgICAgICBpZnJhbWUucmVnaXN0ZXIoJ2F1dGhFdmVudCcsIChpZnJhbWVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KGlmcmFtZUV2ZW50ID09PSBudWxsIHx8IGlmcmFtZUV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpZnJhbWVFdmVudC5hdXRoRXZlbnQsIGF1dGgsIFwiaW52YWxpZC1hdXRoLWV2ZW50XCIgLyogSU5WQUxJRF9BVVRIX0VWRU5UICovKTtcclxuICAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgc3BsaXR0aW5nIHJlZGlyZWN0IGFuZCBwb3B1cCBldmVudHMgZWFybGllciBvblxyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gbWFuYWdlci5vbkV2ZW50KGlmcmFtZUV2ZW50LmF1dGhFdmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogaGFuZGxlZCA/IFwiQUNLXCIgLyogQUNLICovIDogXCJFUlJPUlwiIC8qIEVSUk9SICovIH07XHJcbiAgICAgICAgfSwgZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUik7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2F1dGguX2tleSgpXSA9IHsgbWFuYWdlciB9O1xyXG4gICAgICAgIHRoaXMuaWZyYW1lc1thdXRoLl9rZXkoKV0gPSBpZnJhbWU7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfaXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkKGF1dGgsIGNiKSB7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXTtcclxuICAgICAgICBpZnJhbWUuc2VuZChXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSwgeyB0eXBlOiBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSB9LCByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gKF9hID0gcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0WzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVldO1xyXG4gICAgICAgICAgICBpZiAoaXNTdXBwb3J0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2IoISFpc1N1cHBvcnRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIElOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB9LCBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSKTtcclxuICAgIH1cclxuICAgIF9vcmlnaW5WYWxpZGF0aW9uKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBpZiAoIXRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSA9IF92YWxpZGF0ZU9yaWdpbihhdXRoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzW2tleV07XHJcbiAgICB9XHJcbiAgICBnZXQgX3Nob3VsZEluaXRQcm9hY3RpdmVseSgpIHtcclxuICAgICAgICAvLyBNb2JpbGUgYnJvd3NlcnMgYW5kIFNhZmFyaSBuZWVkIHRvIG9wdGltaXN0aWNhbGx5IGluaXRpYWxpemVcclxuICAgICAgICByZXR1cm4gX2lzTW9iaWxlQnJvd3NlcigpIHx8IF9pc1NhZmFyaSgpIHx8IF9pc0lPUygpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSBzdWl0YWJsZSBmb3IgYnJvd3NlclxyXG4gKiBiYXNlZCBhcHBsaWNhdGlvbnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBCcm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyO1xuXG5jbGFzcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwge1xyXG4gICAgY29uc3RydWN0b3IoZmFjdG9ySWQpIHtcclxuICAgICAgICB0aGlzLmZhY3RvcklkID0gZmFjdG9ySWQ7XHJcbiAgICB9XHJcbiAgICBfcHJvY2VzcyhhdXRoLCBzZXNzaW9uLCBkaXNwbGF5TmFtZSkge1xyXG4gICAgICAgIHN3aXRjaCAoc2Vzc2lvbi50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbnJvbGxcIiAvKiBFTlJPTEwgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVFbnJvbGwoYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsLCBkaXNwbGF5TmFtZSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzaWduaW5cIiAvKiBTSUdOX0lOICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplU2lnbkluKGF1dGgsIHNlc3Npb24uY3JlZGVudGlhbCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdGYWlsKCd1bmV4cGVjdGVkIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIHtAaW5oZXJpdGRvYyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCBleHRlbmRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgc3VwZXIoXCJwaG9uZVwiIC8qIFBIT05FICovKTtcclxuICAgICAgICB0aGlzLmNyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9maW5hbGl6ZUVucm9sbChhdXRoLCBpZFRva2VuLCBkaXNwbGF5TmFtZSkge1xyXG4gICAgICAgIHJldHVybiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgIHBob25lVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5jcmVkZW50aWFsLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZmluYWxpemVTaWduSW4oYXV0aCwgbWZhUGVuZGluZ0NyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gZmluYWxpemVTaWduSW5QaG9uZU1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsLFxyXG4gICAgICAgICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm92aWRlcyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGhvbmVBdXRoQ3JlZGVudGlhbCAtIEEgY3JlZGVudGlhbCBwcm92aWRlZCBieSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbH0uXHJcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXHJcbiAgICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXNzZXJ0aW9uKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwuX2Zyb21DcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3RvcjogYHBob25lYC5cclxuICovXHJcblBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IuRkFDVE9SX0lEID0gJ3Bob25lJztcblxudmFyIG5hbWUgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG52YXIgdmVyc2lvbiA9IFwiMC4xOS40XCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEF1dGhJbnRlcm9wIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICBnZXRVaWQoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVpZCkgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFRva2VuKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgICAgICBpZiAoIXRoaXMuYXV0aC5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudFVzZXIuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xyXG4gICAgICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuIH07XHJcbiAgICB9XHJcbiAgICBhZGRBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbExpc3RlbmVycy5oYXMobGlzdGVuZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmF1dGgub25JZFRva2VuQ2hhbmdlZCh1c2VyID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICBsaXN0ZW5lcigoKF9hID0gdXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0c1Rva2VuTWFuYWdlci5hY2Nlc3NUb2tlbikgfHwgbnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbExpc3RlbmVycy5zZXQobGlzdGVuZXIsIHVuc3Vic2NyaWJlKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIHJlbW92ZUF1dGhUb2tlbkxpc3RlbmVyKGxpc3RlbmVyKSB7XHJcbiAgICAgICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xyXG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5pbnRlcm5hbExpc3RlbmVycy5nZXQobGlzdGVuZXIpO1xyXG4gICAgICAgIGlmICghdW5zdWJzY3JpYmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVybmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XHJcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIGFzc2VydEF1dGhDb25maWd1cmVkKCkge1xyXG4gICAgICAgIF9hc3NlcnQodGhpcy5hdXRoLl9pbml0aWFsaXphdGlvblByb21pc2UsIFwiZGVwZW5kZW50LXNkay1pbml0aWFsaXplZC1iZWZvcmUtYXV0aFwiIC8qIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSCAqLyk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsTGlzdGVuZXJzLnNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFZlcnNpb25Gb3JQbGF0Zm9ybShjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgICAgIGNhc2UgXCJOb2RlXCIgLyogTk9ERSAqLzpcclxuICAgICAgICAgICAgcmV0dXJuICdub2RlJztcclxuICAgICAgICBjYXNlIFwiUmVhY3ROYXRpdmVcIiAvKiBSRUFDVF9OQVRJVkUgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAncm4nO1xyXG4gICAgICAgIGNhc2UgXCJXb3JrZXJcIiAvKiBXT1JLRVIgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAnd2Vid29ya2VyJztcclxuICAgICAgICBjYXNlIFwiQ29yZG92YVwiIC8qIENPUkRPVkEgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAnY29yZG92YSc7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG4vKiogQGludGVybmFsICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyQXV0aChjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoXCJhdXRoXCIgLyogQVVUSCAqLywgKGNvbnRhaW5lciwgeyBvcHRpb25zOiBkZXBzIH0pID0+IHtcclxuICAgICAgICBjb25zdCBhcHAgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcCcpLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IHsgYXBpS2V5LCBhdXRoRG9tYWluIH0gPSBhcHAub3B0aW9ucztcclxuICAgICAgICByZXR1cm4gKGFwcCA9PiB7XHJcbiAgICAgICAgICAgIF9hc3NlcnQoYXBpS2V5ICYmICFhcGlLZXkuaW5jbHVkZXMoJzonKSwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBJTlZBTElEX0FQSV9LRVkgKi8sIHsgYXBwTmFtZTogYXBwLm5hbWUgfSk7XHJcbiAgICAgICAgICAgIC8vIEF1dGggZG9tYWluIGlzIG9wdGlvbmFsIGlmIElkUCBzaWduIGluIGlzbid0IGJlaW5nIHVzZWRcclxuICAgICAgICAgICAgX2Fzc2VydCghKGF1dGhEb21haW4gPT09IG51bGwgfHwgYXV0aERvbWFpbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXV0aERvbWFpbi5pbmNsdWRlcygnOicpKSwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEFSR1VNRU5UX0VSUk9SICovLCB7XHJcbiAgICAgICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgYXBpS2V5LFxyXG4gICAgICAgICAgICAgICAgYXV0aERvbWFpbixcclxuICAgICAgICAgICAgICAgIGNsaWVudFBsYXRmb3JtLFxyXG4gICAgICAgICAgICAgICAgYXBpSG9zdDogXCJpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb21cIiAvKiBBUElfSE9TVCAqLyxcclxuICAgICAgICAgICAgICAgIHRva2VuQXBpSG9zdDogXCJzZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbVwiIC8qIFRPS0VOX0FQSV9IT1NUICovLFxyXG4gICAgICAgICAgICAgICAgYXBpU2NoZW1lOiBcImh0dHBzXCIgLyogQVBJX1NDSEVNRSAqLyxcclxuICAgICAgICAgICAgICAgIHNka0NsaWVudFZlcnNpb246IF9nZXRDbGllbnRWZXJzaW9uKGNsaWVudFBsYXRmb3JtKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoSW5zdGFuY2UgPSBuZXcgQXV0aEltcGwoYXBwLCBjb25maWcpO1xyXG4gICAgICAgICAgICBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZShhdXRoSW5zdGFuY2UsIGRlcHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gYXV0aEluc3RhbmNlO1xyXG4gICAgICAgIH0pKGFwcCk7XHJcbiAgICB9LCBcIlBVQkxJQ1wiIC8qIFBVQkxJQyAqLylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBdXRoIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyBnZXRBdXRoKCkgb3IgaW5pdGlhbGl6ZUF1dGgoKVxyXG4gICAgICAgICAqIEZvciB3aHkgd2UgZG8gdGhpcywgU2VlIGdvL2ZpcmViYXNlLW5leHQtYXV0aC1pbml0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLnNldEluc3RhbnRpYXRpb25Nb2RlKFwiRVhQTElDSVRcIiAvKiBFWFBMSUNJVCAqLylcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCZWNhdXNlIGFsbCBmaXJlYmFzZSBwcm9kdWN0cyB0aGF0IGRlcGVuZCBvbiBhdXRoIGRlcGVuZCBvbiBhdXRoLWludGVybmFsIGRpcmVjdGx5LFxyXG4gICAgICAgICAqIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhdXRoLWludGVybmFsIGFmdGVyIGF1dGggaXMgaW5pdGlhbGl6ZWQgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gb3RoZXIgZmlyZWJhc2UgcHJvZHVjdHMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgLnNldEluc3RhbmNlQ3JlYXRlZENhbGxiYWNrKChjb250YWluZXIsIF9pbnN0YW5jZUlkZW50aWZpZXIsIF9pbnN0YW5jZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGhJbnRlcm5hbFByb3ZpZGVyID0gY29udGFpbmVyLmdldFByb3ZpZGVyKFwiYXV0aC1pbnRlcm5hbFwiIC8qIEFVVEhfSU5URVJOQUwgKi8pO1xyXG4gICAgICAgIGF1dGhJbnRlcm5hbFByb3ZpZGVyLmluaXRpYWxpemUoKTtcclxuICAgIH0pKTtcclxuICAgIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KFwiYXV0aC1pbnRlcm5hbFwiIC8qIEFVVEhfSU5URVJOQUwgKi8sIGNvbnRhaW5lciA9PiB7XHJcbiAgICAgICAgY29uc3QgYXV0aCA9IF9jYXN0QXV0aChjb250YWluZXIuZ2V0UHJvdmlkZXIoXCJhdXRoXCIgLyogQVVUSCAqLykuZ2V0SW1tZWRpYXRlKCkpO1xyXG4gICAgICAgIHJldHVybiAoYXV0aCA9PiBuZXcgQXV0aEludGVyb3AoYXV0aCkpKGF1dGgpO1xyXG4gICAgfSwgXCJQUklWQVRFXCIgLyogUFJJVkFURSAqLykuc2V0SW5zdGFudGlhdGlvbk1vZGUoXCJFWFBMSUNJVFwiIC8qIEVYUExJQ0lUICovKSk7XHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgZ2V0VmVyc2lvbkZvclBsYXRmb3JtKGNsaWVudFBsYXRmb3JtKSk7XHJcbiAgICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdlc20yMDE3Jyk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIEF1dGggaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0uXHJcbiAqIElmIG5vIGluc3RhbmNlIGV4aXN0cywgaW5pdGlhbGl6ZXMgYW4gQXV0aCBpbnN0YW5jZSB3aXRoIHBsYXRmb3JtLXNwZWNpZmljIGRlZmF1bHQgZGVwZW5kZW5jaWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gVGhlIEZpcmViYXNlIEFwcC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXV0aChhcHAgPSBnZXRBcHAoKSkge1xyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xyXG4gICAgaWYgKHByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRJbW1lZGlhdGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbml0aWFsaXplQXV0aChhcHAsIHtcclxuICAgICAgICBwb3B1cFJlZGlyZWN0UmVzb2x2ZXI6IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXHJcbiAgICAgICAgcGVyc2lzdGVuY2U6IFtcclxuICAgICAgICAgICAgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSxcclxuICAgICAgICAgICAgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsXHJcbiAgICAgICAgICAgIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcclxuICAgICAgICBdXHJcbiAgICB9KTtcclxufVxyXG5yZWdpc3RlckF1dGgoXCJCcm93c2VyXCIgLyogQlJPV1NFUiAqLyk7XG5cbmV4cG9ydCB7IHNlbmRQYXNzd29yZFJlc2V0RW1haWwgYXMgJCwgQWN0aW9uQ29kZU9wZXJhdGlvbiBhcyBBLCBwcm9kRXJyb3JNYXAgYXMgQiwgQVVUSF9FUlJPUl9DT0RFU19NQVBfRE9fTk9UX1VTRV9JTlRFUk5BTExZIGFzIEMsIGluaXRpYWxpemVBdXRoIGFzIEQsIGNvbm5lY3RBdXRoRW11bGF0b3IgYXMgRSwgRmFjdG9ySWQgYXMgRiwgQXV0aENyZWRlbnRpYWwgYXMgRywgRW1haWxBdXRoQ3JlZGVudGlhbCBhcyBILCBPQXV0aENyZWRlbnRpYWwgYXMgSSwgUGhvbmVBdXRoQ3JlZGVudGlhbCBhcyBKLCBpbk1lbW9yeVBlcnNpc3RlbmNlIGFzIEssIEVtYWlsQXV0aFByb3ZpZGVyIGFzIEwsIEZhY2Vib29rQXV0aFByb3ZpZGVyIGFzIE0sIEdvb2dsZUF1dGhQcm92aWRlciBhcyBOLCBPcGVyYXRpb25UeXBlIGFzIE8sIFBob25lQXV0aFByb3ZpZGVyIGFzIFAsIEdpdGh1YkF1dGhQcm92aWRlciBhcyBRLCBSZWNhcHRjaGFWZXJpZmllciBhcyBSLCBTaWduSW5NZXRob2QgYXMgUywgT0F1dGhQcm92aWRlciBhcyBULCBTQU1MQXV0aFByb3ZpZGVyIGFzIFUsIFR3aXR0ZXJBdXRoUHJvdmlkZXIgYXMgViwgc2lnbkluQW5vbnltb3VzbHkgYXMgVywgc2lnbkluV2l0aENyZWRlbnRpYWwgYXMgWCwgbGlua1dpdGhDcmVkZW50aWFsIGFzIFksIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwgYXMgWiwgc2lnbkluV2l0aEN1c3RvbVRva2VuIGFzIF8sIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UgYXMgYSwgY29uZmlybVBhc3N3b3JkUmVzZXQgYXMgYTAsIGFwcGx5QWN0aW9uQ29kZSBhcyBhMSwgY2hlY2tBY3Rpb25Db2RlIGFzIGEyLCB2ZXJpZnlQYXNzd29yZFJlc2V0Q29kZSBhcyBhMywgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkIGFzIGE0LCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZCBhcyBhNSwgc2VuZFNpZ25JbkxpbmtUb0VtYWlsIGFzIGE2LCBpc1NpZ25JbldpdGhFbWFpbExpbmsgYXMgYTcsIHNpZ25JbldpdGhFbWFpbExpbmsgYXMgYTgsIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsIGFzIGE5LCBfZ2V0UmVkaXJlY3RSZXN1bHQgYXMgYUEsIF9jbGVhclJlZGlyZWN0T3V0Y29tZXMgYXMgYUIsIF9jYXN0QXV0aCBhcyBhQywgVXNlckltcGwgYXMgYUQsIEF1dGhJbXBsIGFzIGFFLCBfZ2V0Q2xpZW50VmVyc2lvbiBhcyBhRiwgX2dlbmVyYXRlRXZlbnRJZCBhcyBhRywgQXV0aFBvcHVwIGFzIGFILCBGZXRjaFByb3ZpZGVyIGFzIGFJLCBTQU1MQXV0aENyZWRlbnRpYWwgYXMgYUosIHNlbmRFbWFpbFZlcmlmaWNhdGlvbiBhcyBhYSwgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwgYXMgYWIsIEFjdGlvbkNvZGVVUkwgYXMgYWMsIHBhcnNlQWN0aW9uQ29kZVVSTCBhcyBhZCwgdXBkYXRlUHJvZmlsZSBhcyBhZSwgdXBkYXRlRW1haWwgYXMgYWYsIHVwZGF0ZVBhc3N3b3JkIGFzIGFnLCBnZXRJZFRva2VuIGFzIGFoLCBnZXRJZFRva2VuUmVzdWx0IGFzIGFpLCB1bmxpbmsgYXMgYWosIGdldEFkZGl0aW9uYWxVc2VySW5mbyBhcyBhaywgcmVsb2FkIGFzIGFsLCBnZXRNdWx0aUZhY3RvclJlc29sdmVyIGFzIGFtLCBtdWx0aUZhY3RvciBhcyBhbiwgX2lzSU9TN09yOCBhcyBhbywgZGVidWdBc3NlcnQgYXMgYXAsIF9pc0lPUyBhcyBhcSwgX2lzQW5kcm9pZCBhcyBhciwgX2ZhaWwgYXMgYXMsIF9nZXRSZWRpcmVjdFVybCBhcyBhdCwgX2dldFByb2plY3RDb25maWcgYXMgYXUsIF9jcmVhdGVFcnJvciBhcyBhdiwgX2Fzc2VydCBhcyBhdywgX2dldEluc3RhbmNlIGFzIGF4LCBfcGVyc2lzdGVuY2VLZXlOYW1lIGFzIGF5LCBBdXRoRXZlbnRNYW5hZ2VyIGFzIGF6LCBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSBhcyBiLCBzaWduSW5XaXRoUG9wdXAgYXMgYywgbGlua1dpdGhQb3B1cCBhcyBkLCByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cCBhcyBlLCBzaWduSW5XaXRoUmVkaXJlY3QgYXMgZiwgbGlua1dpdGhSZWRpcmVjdCBhcyBnLCByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCBhcyBoLCBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIGFzIGksIGdldFJlZGlyZWN0UmVzdWx0IGFzIGosIGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgYXMgaywgbGlua1dpdGhQaG9uZU51bWJlciBhcyBsLCBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yIGFzIG0sIGdldEF1dGggYXMgbiwgUHJvdmlkZXJJZCBhcyBvLCBzZXRQZXJzaXN0ZW5jZSBhcyBwLCBvbklkVG9rZW5DaGFuZ2VkIGFzIHEsIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyIGFzIHIsIHNpZ25JbldpdGhQaG9uZU51bWJlciBhcyBzLCBvbkF1dGhTdGF0ZUNoYW5nZWQgYXMgdCwgdXBkYXRlUGhvbmVOdW1iZXIgYXMgdSwgdXNlRGV2aWNlTGFuZ3VhZ2UgYXMgdiwgdXBkYXRlQ3VycmVudFVzZXIgYXMgdywgc2lnbk91dCBhcyB4LCBkZWxldGVVc2VyIGFzIHksIGRlYnVnRXJyb3JNYXAgYXMgeiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgtODM5ZGU1MTAuanMubWFwXG4iLCJpbXBvcnQgeyBhbyBhcyBfaXNJT1M3T3I4LCBhcCBhcyBkZWJ1Z0Fzc2VydCwgYXEgYXMgX2lzSU9TLCBhciBhcyBfaXNBbmRyb2lkLCBhcyBhcyBfZmFpbCwgYXQgYXMgX2dldFJlZGlyZWN0VXJsLCBhdSBhcyBfZ2V0UHJvamVjdENvbmZpZywgYXYgYXMgX2NyZWF0ZUVycm9yLCBhdyBhcyBfYXNzZXJ0LCBheCBhcyBfZ2V0SW5zdGFuY2UsIGIgYXMgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsIGF5IGFzIF9wZXJzaXN0ZW5jZUtleU5hbWUsIGF6IGFzIEF1dGhFdmVudE1hbmFnZXIsIGEgYXMgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSwgYUEgYXMgX2dldFJlZGlyZWN0UmVzdWx0LCBhQiBhcyBfY2xlYXJSZWRpcmVjdE91dGNvbWVzLCBhQyBhcyBfY2FzdEF1dGggfSBmcm9tICcuL2luZGV4LTgzOWRlNTEwLmpzJztcbmV4cG9ydCB7IEEgYXMgQWN0aW9uQ29kZU9wZXJhdGlvbiwgYWMgYXMgQWN0aW9uQ29kZVVSTCwgRyBhcyBBdXRoQ3JlZGVudGlhbCwgQyBhcyBBdXRoRXJyb3JDb2RlcywgYUUgYXMgQXV0aEltcGwsIGFIIGFzIEF1dGhQb3B1cCwgSCBhcyBFbWFpbEF1dGhDcmVkZW50aWFsLCBMIGFzIEVtYWlsQXV0aFByb3ZpZGVyLCBNIGFzIEZhY2Vib29rQXV0aFByb3ZpZGVyLCBGIGFzIEZhY3RvcklkLCBhSSBhcyBGZXRjaFByb3ZpZGVyLCBRIGFzIEdpdGh1YkF1dGhQcm92aWRlciwgTiBhcyBHb29nbGVBdXRoUHJvdmlkZXIsIEkgYXMgT0F1dGhDcmVkZW50aWFsLCBUIGFzIE9BdXRoUHJvdmlkZXIsIE8gYXMgT3BlcmF0aW9uVHlwZSwgSiBhcyBQaG9uZUF1dGhDcmVkZW50aWFsLCBQIGFzIFBob25lQXV0aFByb3ZpZGVyLCBtIGFzIFBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IsIG8gYXMgUHJvdmlkZXJJZCwgUiBhcyBSZWNhcHRjaGFWZXJpZmllciwgYUogYXMgU0FNTEF1dGhDcmVkZW50aWFsLCBVIGFzIFNBTUxBdXRoUHJvdmlkZXIsIFMgYXMgU2lnbkluTWV0aG9kLCBWIGFzIFR3aXR0ZXJBdXRoUHJvdmlkZXIsIGFEIGFzIFVzZXJJbXBsLCBhdyBhcyBfYXNzZXJ0LCBhQyBhcyBfY2FzdEF1dGgsIGFzIGFzIF9mYWlsLCBhRyBhcyBfZ2VuZXJhdGVFdmVudElkLCBhRiBhcyBfZ2V0Q2xpZW50VmVyc2lvbiwgYXggYXMgX2dldEluc3RhbmNlLCBhQSBhcyBfZ2V0UmVkaXJlY3RSZXN1bHQsIGF5IGFzIF9wZXJzaXN0ZW5jZUtleU5hbWUsIGExIGFzIGFwcGx5QWN0aW9uQ29kZSwgYiBhcyBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSwgayBhcyBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhIGFzIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UsIGEyIGFzIGNoZWNrQWN0aW9uQ29kZSwgYTAgYXMgY29uZmlybVBhc3N3b3JkUmVzZXQsIEUgYXMgY29ubmVjdEF1dGhFbXVsYXRvciwgYTQgYXMgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkLCB6IGFzIGRlYnVnRXJyb3JNYXAsIHkgYXMgZGVsZXRlVXNlciwgYTkgYXMgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwsIGFrIGFzIGdldEFkZGl0aW9uYWxVc2VySW5mbywgbiBhcyBnZXRBdXRoLCBhaCBhcyBnZXRJZFRva2VuLCBhaSBhcyBnZXRJZFRva2VuUmVzdWx0LCBhbSBhcyBnZXRNdWx0aUZhY3RvclJlc29sdmVyLCBqIGFzIGdldFJlZGlyZWN0UmVzdWx0LCBLIGFzIGluTWVtb3J5UGVyc2lzdGVuY2UsIGkgYXMgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSwgRCBhcyBpbml0aWFsaXplQXV0aCwgYTcgYXMgaXNTaWduSW5XaXRoRW1haWxMaW5rLCBZIGFzIGxpbmtXaXRoQ3JlZGVudGlhbCwgbCBhcyBsaW5rV2l0aFBob25lTnVtYmVyLCBkIGFzIGxpbmtXaXRoUG9wdXAsIGcgYXMgbGlua1dpdGhSZWRpcmVjdCwgYW4gYXMgbXVsdGlGYWN0b3IsIHQgYXMgb25BdXRoU3RhdGVDaGFuZ2VkLCBxIGFzIG9uSWRUb2tlbkNoYW5nZWQsIGFkIGFzIHBhcnNlQWN0aW9uQ29kZVVSTCwgQiBhcyBwcm9kRXJyb3JNYXAsIFogYXMgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCwgciBhcyByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlciwgZSBhcyByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cCwgaCBhcyByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCwgYWwgYXMgcmVsb2FkLCBhYSBhcyBzZW5kRW1haWxWZXJpZmljYXRpb24sICQgYXMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCwgYTYgYXMgc2VuZFNpZ25JbkxpbmtUb0VtYWlsLCBwIGFzIHNldFBlcnNpc3RlbmNlLCBXIGFzIHNpZ25JbkFub255bW91c2x5LCBYIGFzIHNpZ25JbldpdGhDcmVkZW50aWFsLCBfIGFzIHNpZ25JbldpdGhDdXN0b21Ub2tlbiwgYTUgYXMgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQsIGE4IGFzIHNpZ25JbldpdGhFbWFpbExpbmssIHMgYXMgc2lnbkluV2l0aFBob25lTnVtYmVyLCBjIGFzIHNpZ25JbldpdGhQb3B1cCwgZiBhcyBzaWduSW5XaXRoUmVkaXJlY3QsIHggYXMgc2lnbk91dCwgYWogYXMgdW5saW5rLCB3IGFzIHVwZGF0ZUN1cnJlbnRVc2VyLCBhZiBhcyB1cGRhdGVFbWFpbCwgYWcgYXMgdXBkYXRlUGFzc3dvcmQsIHUgYXMgdXBkYXRlUGhvbmVOdW1iZXIsIGFlIGFzIHVwZGF0ZVByb2ZpbGUsIHYgYXMgdXNlRGV2aWNlTGFuZ3VhZ2UsIGFiIGFzIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsLCBhMyBhcyB2ZXJpZnlQYXNzd29yZFJlc2V0Q29kZSB9IGZyb20gJy4vaW5kZXgtODM5ZGU1MTAuanMnO1xuaW1wb3J0IHsgcXVlcnlzdHJpbmdEZWNvZGUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0ICd0c2xpYic7XG5pbXBvcnQgJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0ICdAZmlyZWJhc2UvY29tcG9uZW50JztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2NvcmRvdmFXaW5kb3coKSB7XHJcbiAgICByZXR1cm4gd2luZG93O1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBIb3cgbG9uZyB0byB3YWl0IGFmdGVyIHRoZSBhcHAgY29tZXMgYmFjayBpbnRvIGZvY3VzIGJlZm9yZSBjb25jbHVkaW5nIHRoYXRcclxuICogdGhlIHVzZXIgY2xvc2VkIHRoZSBzaWduIGluIHRhYi5cclxuICovXHJcbmNvbnN0IFJFRElSRUNUX1RJTUVPVVRfTVMgPSAyMDAwO1xyXG4vKipcclxuICogR2VuZXJhdGVzIHRoZSBVUkwgZm9yIHRoZSBPQXV0aCBoYW5kbGVyLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX2dlbmVyYXRlSGFuZGxlclVybChhdXRoLCBldmVudCwgcHJvdmlkZXIpIHtcclxuICAgIHZhciBfYTtcclxuICAgIC8vIEdldCB0aGUgY29yZG92YSBwbHVnaW5zXHJcbiAgICBjb25zdCB7IEJ1aWxkSW5mbyB9ID0gX2NvcmRvdmFXaW5kb3coKTtcclxuICAgIGRlYnVnQXNzZXJ0KGV2ZW50LnNlc3Npb25JZCwgJ0F1dGhFdmVudCBkaWQgbm90IGNvbnRhaW4gYSBzZXNzaW9uIElEJyk7XHJcbiAgICBjb25zdCBzZXNzaW9uRGlnZXN0ID0gYXdhaXQgY29tcHV0ZVNoYTI1NihldmVudC5zZXNzaW9uSWQpO1xyXG4gICAgY29uc3QgYWRkaXRpb25hbFBhcmFtcyA9IHt9O1xyXG4gICAgaWYgKF9pc0lPUygpKSB7XHJcbiAgICAgICAgLy8gaU9TIGFwcCBpZGVudGlmaWVyXHJcbiAgICAgICAgYWRkaXRpb25hbFBhcmFtc1snaWJpJ10gPSBCdWlsZEluZm8ucGFja2FnZU5hbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNBbmRyb2lkKCkpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIGFwcCBpZGVudGlmaWVyXHJcbiAgICAgICAgYWRkaXRpb25hbFBhcmFtc1snYXBuJ10gPSBCdWlsZEluZm8ucGFja2FnZU5hbWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBfZmFpbChhdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICB9XHJcbiAgICAvLyBBZGQgdGhlIGRpc3BsYXkgbmFtZSBpZiBhdmFpbGFibGVcclxuICAgIGlmIChCdWlsZEluZm8uZGlzcGxheU5hbWUpIHtcclxuICAgICAgICBhZGRpdGlvbmFsUGFyYW1zWydhcHBEaXNwbGF5TmFtZSddID0gQnVpbGRJbmZvLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG4gICAgLy8gQXR0YWNoZWQgdGhlIGhhc2hlZCBzZXNzaW9uIElEXHJcbiAgICBhZGRpdGlvbmFsUGFyYW1zWydzZXNzaW9uSWQnXSA9IHNlc3Npb25EaWdlc3Q7XHJcbiAgICByZXR1cm4gX2dldFJlZGlyZWN0VXJsKGF1dGgsIHByb3ZpZGVyLCBldmVudC50eXBlLCB1bmRlZmluZWQsIChfYSA9IGV2ZW50LmV2ZW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZCwgYWRkaXRpb25hbFBhcmFtcyk7XHJcbn1cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyB0aGF0IHRoaXMgYXBwIGlzIHZhbGlkIGZvciB0aGlzIHByb2plY3QgY29uZmlndXJhdGlvblxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpIHtcclxuICAgIGNvbnN0IHsgQnVpbGRJbmZvIH0gPSBfY29yZG92YVdpbmRvdygpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHt9O1xyXG4gICAgaWYgKF9pc0lPUygpKSB7XHJcbiAgICAgICAgcmVxdWVzdC5pb3NCdW5kbGVJZCA9IEJ1aWxkSW5mby5wYWNrYWdlTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc0FuZHJvaWQoKSkge1xyXG4gICAgICAgIHJlcXVlc3QuYW5kcm9pZFBhY2thZ2VOYW1lID0gQnVpbGRJbmZvLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi8pO1xyXG4gICAgfVxyXG4gICAgLy8gV2lsbCBmYWlsIGF1dG9tYXRpY2FsbHkgaWYgcGFja2FnZSBuYW1lIGlzIG5vdCBhdXRob3JpemVkXHJcbiAgICBhd2FpdCBfZ2V0UHJvamVjdENvbmZpZyhhdXRoLCByZXF1ZXN0KTtcclxufVxyXG5mdW5jdGlvbiBfcGVyZm9ybVJlZGlyZWN0KGhhbmRsZXJVcmwpIHtcclxuICAgIC8vIEdldCB0aGUgY29yZG92YSBwbHVnaW5zXHJcbiAgICBjb25zdCB7IGNvcmRvdmEgfSA9IF9jb3Jkb3ZhV2luZG93KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIuaXNBdmFpbGFibGUoYnJvd3NlclRhYklzQXZhaWxhYmxlID0+IHtcclxuICAgICAgICAgICAgbGV0IGlhYlJlZiA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChicm93c2VyVGFiSXNBdmFpbGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiLm9wZW5VcmwoaGFuZGxlclVybCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gdGhlIGluYXBwYnJvd3NlciByZWYgdGhhdCdzIHJldHVybmVkIGZyb20gdGhlIG9wZW4gY2FsbFxyXG4gICAgICAgICAgICAgICAgaWFiUmVmID0gY29yZG92YS5JbkFwcEJyb3dzZXIub3BlbihoYW5kbGVyVXJsLCBfaXNJT1M3T3I4KCkgPyAnX2JsYW5rJyA6ICdfc3lzdGVtJywgJ2xvY2F0aW9uPXllcycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc29sdmUoaWFiUmVmKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhcHAgYWN0aXZpdHkgdG8gYmUgc2VlbiBiZWZvcmUgcmVzb2x2aW5nLiBJdCBkb2VzXHJcbiAqIHRoaXMgYnkgYXR0YWNoaW5nIGxpc3RlbmVycyB0byB2YXJpb3VzIGRvbSBldmVudHMuIE9uY2UgdGhlIGFwcCBpcyBkZXRlcm1pbmVkXHJcbiAqIHRvIGJlIHZpc2libGUsIHRoaXMgcHJvbWlzZSByZXNvbHZlcy4gQUZURVIgdGhhdCByZXNvbHV0aW9uLCB0aGUgbGlzdGVuZXJzXHJcbiAqIGFyZSBkZXRhY2hlZCBhbmQgYW55IGJyb3dzZXIgdGFicyBsZWZ0IG9wZW4gd2lsbCBiZSBjbG9zZWQuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfd2FpdEZvckFwcFJlc3VtZShhdXRoLCBldmVudExpc3RlbmVyLCBpYWJSZWYpIHtcclxuICAgIC8vIEdldCB0aGUgY29yZG92YSBwbHVnaW5zXHJcbiAgICBjb25zdCB7IGNvcmRvdmEgfSA9IF9jb3Jkb3ZhV2luZG93KCk7XHJcbiAgICBsZXQgY2xlYW51cCA9ICgpID0+IHsgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb25DbG9zZVRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgLy8gREVGSU5FIEFMTCBUSEUgQ0FMTEJBQ0tTID09PT09XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF1dGhFdmVudFNlZW4oKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgICAgICAvLyBBdXRoIGV2ZW50IHdhcyBkZXRlY3RlZC4gUmVzb2x2ZSB0aGlzIHByb21pc2UgYW5kIGNsb3NlIHRoZSBleHRyYVxyXG4gICAgICAgICAgICAgICAgLy8gd2luZG93IGlmIGl0J3Mgc3RpbGwgb3Blbi5cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NlQnJvd3NlclRhYiA9IChfYSA9IGNvcmRvdmEucGx1Z2lucy5icm93c2VydGFiKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNsb3NlQnJvd3NlclRhYiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQnJvd3NlclRhYigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgaW5hcHBicm93c2VyIGVtZWJlZGRlZCB3ZWJ2aWV3IGluIGlPUzcgYW5kIDggY2FzZSBpZiBzdGlsbFxyXG4gICAgICAgICAgICAgICAgLy8gb3Blbi5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGlhYlJlZiA9PT0gbnVsbCB8fCBpYWJSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlhYlJlZi5jbG9zZSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpYWJSZWYuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZXN1bWVkKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9uQ2xvc2VUaW1lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBhbHJlYWR5IHJhbjsgZG8gbm90IHJlcnVuLlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9uQ2xvc2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IHR3byBzZWVjb25kcyBhZnRlciByZXN1bWUgdGhlbiByZWplY3QuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcInJlZGlyZWN0LWNhbmNlbGxlZC1ieS11c2VyXCIgLyogUkVESVJFQ1RfQ0FOQ0VMTEVEX0JZX1VTRVIgKi8pKTtcclxuICAgICAgICAgICAgICAgIH0sIFJFRElSRUNUX1RJTUVPVVRfTVMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZpc2liaWxpdHlDaGFuZ2VkKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChkb2N1bWVudCA9PT0gbnVsbCB8fCBkb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1lZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEFUVEFDSCBBTEwgVEhFIExJU1RFTkVSUyA9PT09PVxyXG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHRoZSBhdXRoIGV2ZW50XHJcbiAgICAgICAgICAgIGV2ZW50TGlzdGVuZXIuYWRkUGFzc2l2ZUxpc3RlbmVyKGF1dGhFdmVudFNlZW4pO1xyXG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHJlc3VtZSBhbmQgdmlzaWJpbGl0eSBldmVudHNcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzdW1lJywgcmVzdW1lZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoX2lzQW5kcm9pZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBTRVRVUCBUSEUgQ0xFQU5VUCBGVU5DVElPTiA9PT09PVxyXG4gICAgICAgICAgICBjbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRMaXN0ZW5lci5yZW1vdmVQYXNzaXZlTGlzdGVuZXIoYXV0aEV2ZW50U2Vlbik7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXN1bWUnLCByZXN1bWVkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChvbkNsb3NlVGltZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KG9uQ2xvc2VUaW1lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICBjbGVhbnVwKCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQ29yZG92YSBlbnZpcm9ubWVudC4gVGhpcyBoYXMgbm8gc2lkZSBlZmZlY3RcclxuICogaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29ycmVjdDsgb3RoZXJ3aXNlIGl0IHRocm93cyBhbiBlcnJvciB3aXRoIHRoZVxyXG4gKiBtaXNzaW5nIHBsdWdpbi5cclxuICovXHJcbmZ1bmN0aW9uIF9jaGVja0NvcmRvdmFDb25maWd1cmF0aW9uKGF1dGgpIHtcclxuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaztcclxuICAgIGNvbnN0IHdpbiA9IF9jb3Jkb3ZhV2luZG93KCk7XHJcbiAgICAvLyBDaGVjayBhbGwgZGVwZW5kZW5jaWVzIGluc3RhbGxlZC5cclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3JkbmV0L2NvcmRvdmEtdW5pdmVyc2FsLWxpbmtzLXBsdWdpblxyXG4gICAgLy8gTm90ZSB0aGF0IGNvcmRvdmEtdW5pdmVyc2FsLWxpbmtzLXBsdWdpbiBoYXMgYmVlbiBhYmFuZG9uZWQuXHJcbiAgICAvLyBBIGZvcmsgd2l0aCBsYXRlc3QgZml4ZXMgaXMgYXZhaWxhYmxlIGF0OlxyXG4gICAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY29yZG92YS11bml2ZXJzYWwtbGlua3MtcGx1Z2luLWZpeFxyXG4gICAgX2Fzc2VydCh0eXBlb2YgKChfYSA9IHdpbiA9PT0gbnVsbCB8fCB3aW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbi51bml2ZXJzYWxMaW5rcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN1YnNjcmliZSkgPT09ICdmdW5jdGlvbicsIGF1dGgsIFwiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqLywge1xyXG4gICAgICAgIG1pc3NpbmdQbHVnaW46ICdjb3Jkb3ZhLXVuaXZlcnNhbC1saW5rcy1wbHVnaW4tZml4J1xyXG4gICAgfSk7XHJcbiAgICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jb3Jkb3ZhLXBsdWdpbi1idWlsZGluZm9cclxuICAgIF9hc3NlcnQodHlwZW9mICgoX2IgPSB3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uQnVpbGRJbmZvKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFja2FnZU5hbWUpICE9PSAndW5kZWZpbmVkJywgYXV0aCwgXCJpbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvblwiIC8qIElOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OICovLCB7XHJcbiAgICAgICAgbWlzc2luZ1BsdWdpbjogJ2NvcmRvdmEtcGx1Z2luLWJ1aWxkSW5mbydcclxuICAgIH0pO1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiXHJcbiAgICBfYXNzZXJ0KHR5cGVvZiAoKF9lID0gKF9kID0gKF9jID0gd2luID09PSBudWxsIHx8IHdpbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luLmNvcmRvdmEpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wbHVnaW5zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuYnJvd3NlcnRhYikgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm9wZW5VcmwpID09PSAnZnVuY3Rpb24nLCBhdXRoLCBcImludmFsaWQtY29yZG92YS1jb25maWd1cmF0aW9uXCIgLyogSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT04gKi8sIHtcclxuICAgICAgICBtaXNzaW5nUGx1Z2luOiAnY29yZG92YS1wbHVnaW4tYnJvd3NlcnRhYidcclxuICAgIH0pO1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgKChfaCA9IChfZyA9IChfZiA9IHdpbiA9PT0gbnVsbCB8fCB3aW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbi5jb3Jkb3ZhKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YucGx1Z2lucykgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLmJyb3dzZXJ0YWIpID09PSBudWxsIHx8IF9oID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaC5pc0F2YWlsYWJsZSkgPT09ICdmdW5jdGlvbicsIGF1dGgsIFwiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqLywge1xyXG4gICAgICAgIG1pc3NpbmdQbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiJ1xyXG4gICAgfSk7XHJcbiAgICAvLyBodHRwczovL2NvcmRvdmEuYXBhY2hlLm9yZy9kb2NzL2VuL2xhdGVzdC9yZWZlcmVuY2UvY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyL1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgKChfayA9IChfaiA9IHdpbiA9PT0gbnVsbCB8fCB3aW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbi5jb3Jkb3ZhKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouSW5BcHBCcm93c2VyKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2sub3BlbikgPT09ICdmdW5jdGlvbicsIGF1dGgsIFwiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqLywge1xyXG4gICAgICAgIG1pc3NpbmdQbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXInXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQ29tcHV0ZXMgdGhlIFNIQS0yNTYgb2YgYSBzZXNzaW9uIElELiBUaGUgU3VidGxlQ3J5cHRvIGludGVyZmFjZSBpcyBvbmx5XHJcbiAqIGF2YWlsYWJsZSBpbiBcInNlY3VyZVwiIGNvbnRleHRzLCB3aGljaCBjb3ZlcnMgQ29yZG92YSAod2hpY2ggaXMgc2VydmVkIG9uIGEgZmlsZVxyXG4gKiBwcm90b2NvbCkuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2hhMjU2KHNlc3Npb25JZCkge1xyXG4gICAgY29uc3QgYnl0ZXMgPSBzdHJpbmdUb0FycmF5QnVmZmVyKHNlc3Npb25JZCk7XHJcbiAgICAvLyBUT0RPOiBGb3IgSUUxMSBjcnlwdG8gaGFzIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRoaXMgb3BlcmF0aW9uIGNvbWVzIGJhY2tcclxuICAgIC8vICAgICAgIGFzIGFuIG9iamVjdCwgbm90IGEgcHJvbWlzZS4gVGhpcyBpcyB0aGUgb2xkIHByb3Bvc2VkIHN0YW5kYXJkIHRoYXRcclxuICAgIC8vICAgICAgIGlzIHVzZWQgYnkgSUUxMTpcclxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELVdlYkNyeXB0b0FQSS0yMDEzMDEwOC8jY3J5cHRvb3BlcmF0aW9uLWludGVyZmFjZVxyXG4gICAgY29uc3QgYnVmID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBieXRlcyk7XHJcbiAgICBjb25zdCBhcnIgPSBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGJ1ZikpO1xyXG4gICAgcmV0dXJuIGFyci5tYXAobnVtID0+IG51bS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XHJcbn1cclxuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUJ1ZmZlcihzdHIpIHtcclxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBtZWFudCB0byBkZWFsIHdpdGggYW4gQVNDSUkgY2hhcnNldCBhbmQgbWFrZXNcclxuICAgIC8vIGNlcnRhaW4gc2ltcGxpZnlpbmcgYXNzdW1wdGlvbnMuXHJcbiAgICBkZWJ1Z0Fzc2VydCgvWzAtOWEtekEtWl0rLy50ZXN0KHN0ciksICdDYW4gb25seSBjb252ZXJ0IGFscGhhLW51bWVyaWMgc3RyaW5ncycpO1xyXG4gICAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBidWZmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpO1xyXG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2aWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmlldztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBTRVNTSU9OX0lEX0xFTkdUSCA9IDIwO1xyXG4vKiogQ3VzdG9tIEF1dGhFdmVudE1hbmFnZXIgdGhhdCBhZGRzIHBhc3NpdmUgbGlzdGVuZXJzIHRvIGV2ZW50cyAqL1xyXG5jbGFzcyBDb3Jkb3ZhQXV0aEV2ZW50TWFuYWdlciBleHRlbmRzIEF1dGhFdmVudE1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLnBhc3NpdmVMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdmVJbmlhbGl6ZWQgPSByZXNvbHZlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYWRkUGFzc2l2ZUxpc3RlbmVyKGNiKSB7XHJcbiAgICAgICAgdGhpcy5wYXNzaXZlTGlzdGVuZXJzLmFkZChjYik7XHJcbiAgICB9XHJcbiAgICByZW1vdmVQYXNzaXZlTGlzdGVuZXIoY2IpIHtcclxuICAgICAgICB0aGlzLnBhc3NpdmVMaXN0ZW5lcnMuZGVsZXRlKGNiKTtcclxuICAgIH1cclxuICAgIC8vIEluIGEgQ29yZG92YSBlbnZpcm9ubWVudCwgdGhpcyBtYW5hZ2VyIGNhbiBsaXZlIHRocm91Z2ggbXVsdGlwbGUgcmVkaXJlY3RcclxuICAgIC8vIG9wZXJhdGlvbnNcclxuICAgIHJlc2V0UmVkaXJlY3QoKSB7XHJcbiAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqIE92ZXJyaWRlIHRoZSBvbkV2ZW50IG1ldGhvZCAqL1xyXG4gICAgb25FdmVudChldmVudCkge1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZUluaWFsaXplZCgpO1xyXG4gICAgICAgIHRoaXMucGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKGNiID0+IGNiKGV2ZW50KSk7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZWQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgKHBhcnRpYWwpIHtAbGluayBBdXRoRXZlbnR9LlxyXG4gKi9cclxuZnVuY3Rpb24gX2dlbmVyYXRlTmV3RXZlbnQoYXV0aCwgdHlwZSwgZXZlbnRJZCA9IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdHlwZSxcclxuICAgICAgICBldmVudElkLFxyXG4gICAgICAgIHVybFJlc3BvbnNlOiBudWxsLFxyXG4gICAgICAgIHNlc3Npb25JZDogZ2VuZXJhdGVTZXNzaW9uSWQoKSxcclxuICAgICAgICBwb3N0Qm9keTogbnVsbCxcclxuICAgICAgICB0ZW5hbnRJZDogYXV0aC50ZW5hbnRJZCxcclxuICAgICAgICBlcnJvcjogX2NyZWF0ZUVycm9yKGF1dGgsIFwibm8tYXV0aC1ldmVudFwiIC8qIE5PX0FVVEhfRVZFTlQgKi8pXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIF9zYXZlUGFydGlhbEV2ZW50KGF1dGgsIGV2ZW50KSB7XHJcbiAgICByZXR1cm4gc3RvcmFnZSgpLl9zZXQocGVyc2lzdGVuY2VLZXkoYXV0aCksIGV2ZW50KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfZ2V0QW5kUmVtb3ZlRXZlbnQoYXV0aCkge1xyXG4gICAgY29uc3QgZXZlbnQgPSAoYXdhaXQgc3RvcmFnZSgpLl9nZXQocGVyc2lzdGVuY2VLZXkoYXV0aCkpKTtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICAgIGF3YWl0IHN0b3JhZ2UoKS5fcmVtb3ZlKHBlcnNpc3RlbmNlS2V5KGF1dGgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBldmVudDtcclxufVxyXG5mdW5jdGlvbiBfZXZlbnRGcm9tUGFydGlhbEFuZFVybChwYXJ0aWFsRXZlbnQsIHVybCkge1xyXG4gICAgdmFyIF9hLCBfYjtcclxuICAgIC8vIFBhcnNlIHRoZSBkZWVwIGxpbmsgd2l0aGluIHRoZSBkeW5hbWljIGxpbmsgVVJMLlxyXG4gICAgY29uc3QgY2FsbGJhY2tVcmwgPSBfZ2V0RGVlcExpbmtGcm9tQ2FsbGJhY2sodXJsKTtcclxuICAgIC8vIENvbmZpcm0gaXQgaXMgYWN0dWFsbHkgYSBjYWxsYmFjayBVUkwuXHJcbiAgICAvLyBDdXJyZW50bHkgdGhlIHVuaXZlcnNhbCBsaW5rIHdpbGwgYmUgb2YgdGhpcyBmb3JtYXQ6XHJcbiAgICAvLyBodHRwczovLzxBVVRIX0RPTUFJTj4vX18vYXV0aC9jYWxsYmFjazxPQVVUSF9SRVNQT05TRT5cclxuICAgIC8vIFRoaXMgaXMgYSBmYWtlIFVSTCBidXQgaXMgbm90IGludGVuZGVkIHRvIHRha2UgdGhlIHVzZXIgYW55d2hlcmVcclxuICAgIC8vIGFuZCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBhcHAuXHJcbiAgICBpZiAoY2FsbGJhY2tVcmwuaW5jbHVkZXMoJy9fXy9hdXRoL2NhbGxiYWNrJykpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgVVJMLlxyXG4gICAgICAgIC8vIFRoaXMgbWVjaGFuaXNtIGlzIGFsc28gdXNlZCB0byBwYXNzIGVycm9ycyBiYWNrIHRvIHRoZSBhcHA6XHJcbiAgICAgICAgLy8gaHR0cHM6Ly88QVVUSF9ET01BSU4+L19fL2F1dGgvY2FsbGJhY2s/ZmlyZWJhc2VFcnJvcj08U1RSSU5HSUZJRURfRVJST1I+XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gc2VhcmNoUGFyYW1zT3JFbXB0eShjYWxsYmFja1VybCk7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBlcnJvciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3RyaW5naWZpZWQgZXJyb3IgaWYgZm91bmQuXHJcbiAgICAgICAgY29uc3QgZXJyb3JPYmplY3QgPSBwYXJhbXNbJ2ZpcmViYXNlRXJyb3InXVxyXG4gICAgICAgICAgICA/IHBhcnNlSnNvbk9yTnVsbChkZWNvZGVVUklDb21wb25lbnQocGFyYW1zWydmaXJlYmFzZUVycm9yJ10pKVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IChfYiA9IChfYSA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdFsnY29kZSddKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3BsaXQoJ2F1dGgvJykpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlsxXTtcclxuICAgICAgICBjb25zdCBlcnJvciA9IGNvZGUgPyBfY3JlYXRlRXJyb3IoY29kZSkgOiBudWxsO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogcGFydGlhbEV2ZW50LnR5cGUsXHJcbiAgICAgICAgICAgICAgICBldmVudElkOiBwYXJ0aWFsRXZlbnQuZXZlbnRJZCxcclxuICAgICAgICAgICAgICAgIHRlbmFudElkOiBwYXJ0aWFsRXZlbnQudGVuYW50SWQsXHJcbiAgICAgICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgICAgIHVybFJlc3BvbnNlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcG9zdEJvZHk6IG51bGxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBwYXJ0aWFsRXZlbnQudHlwZSxcclxuICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHBhcnRpYWxFdmVudC5ldmVudElkLFxyXG4gICAgICAgICAgICAgICAgdGVuYW50SWQ6IHBhcnRpYWxFdmVudC50ZW5hbnRJZCxcclxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFydGlhbEV2ZW50LnNlc3Npb25JZCxcclxuICAgICAgICAgICAgICAgIHVybFJlc3BvbnNlOiBjYWxsYmFja1VybCxcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5OiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuZnVuY3Rpb24gZ2VuZXJhdGVTZXNzaW9uSWQoKSB7XHJcbiAgICBjb25zdCBjaGFycyA9IFtdO1xyXG4gICAgY29uc3QgYWxsb3dlZENoYXJzID0gJzEyMzQ1Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgU0VTU0lPTl9JRF9MRU5HVEg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGlkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFsbG93ZWRDaGFycy5sZW5ndGgpO1xyXG4gICAgICAgIGNoYXJzLnB1c2goYWxsb3dlZENoYXJzLmNoYXJBdChpZHgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcclxufVxyXG5mdW5jdGlvbiBzdG9yYWdlKCkge1xyXG4gICAgcmV0dXJuIF9nZXRJbnN0YW5jZShicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSk7XHJcbn1cclxuZnVuY3Rpb24gcGVyc2lzdGVuY2VLZXkoYXV0aCkge1xyXG4gICAgcmV0dXJuIF9wZXJzaXN0ZW5jZUtleU5hbWUoXCJhdXRoRXZlbnRcIiAvKiBBVVRIX0VWRU5UICovLCBhdXRoLmNvbmZpZy5hcGlLZXksIGF1dGgubmFtZSk7XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKGpzb24pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nXHJcbmZ1bmN0aW9uIF9nZXREZWVwTGlua0Zyb21DYWxsYmFjayh1cmwpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHNlYXJjaFBhcmFtc09yRW1wdHkodXJsKTtcclxuICAgIGNvbnN0IGxpbmsgPSBwYXJhbXNbJ2xpbmsnXSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJhbXNbJ2xpbmsnXSkgOiB1bmRlZmluZWQ7XHJcbiAgICAvLyBEb3VibGUgbGluayBjYXNlIChhdXRvbWF0aWMgcmVkaXJlY3QpXHJcbiAgICBjb25zdCBkb3VibGVEZWVwTGluayA9IHNlYXJjaFBhcmFtc09yRW1wdHkobGluaylbJ2xpbmsnXTtcclxuICAgIC8vIGlPUyBjdXN0b20gc2NoZW1lIGxpbmtzLlxyXG4gICAgY29uc3QgaU9TRGVlcExpbmsgPSBwYXJhbXNbJ2RlZXBfbGlua19pZCddXHJcbiAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zWydkZWVwX2xpbmtfaWQnXSlcclxuICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlPU0RvdWJsZURlZXBMaW5rID0gc2VhcmNoUGFyYW1zT3JFbXB0eShpT1NEZWVwTGluaylbJ2xpbmsnXTtcclxuICAgIHJldHVybiBpT1NEb3VibGVEZWVwTGluayB8fCBpT1NEZWVwTGluayB8fCBkb3VibGVEZWVwTGluayB8fCBsaW5rIHx8IHVybDtcclxufVxyXG4vKipcclxuICogT3B0aW1pc3RpY2FsbHkgdHJpZXMgdG8gZ2V0IHNlYXJjaCBwYXJhbXMgZnJvbSBhIHN0cmluZywgb3IgZWxzZSByZXR1cm5zIGFuXHJcbiAqIGVtcHR5IHNlYXJjaCBwYXJhbXMgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gc2VhcmNoUGFyYW1zT3JFbXB0eSh1cmwpIHtcclxuICAgIGlmICghKHVybCA9PT0gbnVsbCB8fCB1cmwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVybC5pbmNsdWRlcygnPycpKSkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IFtfLCAuLi5yZXN0XSA9IHVybC5zcGxpdCgnPycpO1xyXG4gICAgcmV0dXJuIHF1ZXJ5c3RyaW5nRGVjb2RlKHJlc3Quam9pbignPycpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGluaXRpYWwgYXV0aCBldmVudCBiZWZvcmUgY29uY2x1ZGluZyBub1xyXG4gKiByZWRpcmVjdCBwZW5kaW5nXHJcbiAqL1xyXG5jb25zdCBJTklUSUFMX0VWRU5UX1RJTUVPVVRfTVMgPSA1MDA7XHJcbmNsYXNzIENvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkSW5pdFByb2FjdGl2ZWx5ID0gdHJ1ZTsgLy8gVGhpcyBpcyBsaWdodHdlaWdodCBmb3IgQ29yZG92YVxyXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VycyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlUmVkaXJlY3RGbiA9IF9nZXRSZWRpcmVjdFJlc3VsdDtcclxuICAgIH1cclxuICAgIGFzeW5jIF9pbml0aWFsaXplKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBsZXQgbWFuYWdlciA9IHRoaXMuZXZlbnRNYW5hZ2Vycy5nZXQoa2V5KTtcclxuICAgICAgICBpZiAoIW1hbmFnZXIpIHtcclxuICAgICAgICAgICAgbWFuYWdlciA9IG5ldyBDb3Jkb3ZhQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzLnNldChrZXksIG1hbmFnZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmF0dGFjaENhbGxiYWNrTGlzdGVuZXJzKGF1dGgsIG1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgIH1cclxuICAgIF9vcGVuUG9wdXAoYXV0aCkge1xyXG4gICAgICAgIF9mYWlsKGF1dGgsIFwib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBldmVudElkKSB7XHJcbiAgICAgICAgX2NoZWNrQ29yZG92YUNvbmZpZ3VyYXRpb24oYXV0aCk7XHJcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IGF3YWl0IHRoaXMuX2luaXRpYWxpemUoYXV0aCk7XHJcbiAgICAgICAgYXdhaXQgbWFuYWdlci5pbml0aWFsaXplZCgpO1xyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwZXJzaXN0ZWQgcmVkaXJlY3Qgc3RhdGVzLiBUaGlzIGRvZXMgbm90IG1hdHRlciBvbiBXZWIgd2hlcmVcclxuICAgICAgICAvLyB0aGUgcmVkaXJlY3QgYWx3YXlzIGJsb3dzIGF3YXkgYXBwbGljYXRpb24gc3RhdGUgZW50aXJlbHkuIE9uIENvcmRvdmEsXHJcbiAgICAgICAgLy8gdGhlIGFwcCBtYWludGFpbnMgY29udHJvbCBmbG93IHRocm91Z2ggdGhlIHJlZGlyZWN0LlxyXG4gICAgICAgIG1hbmFnZXIucmVzZXRSZWRpcmVjdCgpO1xyXG4gICAgICAgIF9jbGVhclJlZGlyZWN0T3V0Y29tZXMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9vcmlnaW5WYWxpZGF0aW9uKGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gX2dlbmVyYXRlTmV3RXZlbnQoYXV0aCwgYXV0aFR5cGUsIGV2ZW50SWQpO1xyXG4gICAgICAgIGF3YWl0IF9zYXZlUGFydGlhbEV2ZW50KGF1dGgsIGV2ZW50KTtcclxuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBfZ2VuZXJhdGVIYW5kbGVyVXJsKGF1dGgsIGV2ZW50LCBwcm92aWRlcik7XHJcbiAgICAgICAgY29uc3QgaWFiUmVmID0gYXdhaXQgX3BlcmZvcm1SZWRpcmVjdCh1cmwpO1xyXG4gICAgICAgIHJldHVybiBfd2FpdEZvckFwcFJlc3VtZShhdXRoLCBtYW5hZ2VyLCBpYWJSZWYpO1xyXG4gICAgfVxyXG4gICAgX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChfYXV0aCwgX2NiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xyXG4gICAgfVxyXG4gICAgX29yaWdpblZhbGlkYXRpb24oYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF1dGguX2tleSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldID0gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XTtcclxuICAgIH1cclxuICAgIGF0dGFjaENhbGxiYWNrTGlzdGVuZXJzKGF1dGgsIG1hbmFnZXIpIHtcclxuICAgICAgICAvLyBHZXQgdGhlIGdsb2JhbCBwbHVnaW5zXHJcbiAgICAgICAgY29uc3QgeyB1bml2ZXJzYWxMaW5rcywgaGFuZGxlT3BlblVSTCwgQnVpbGRJbmZvIH0gPSBfY29yZG92YVdpbmRvdygpO1xyXG4gICAgICAgIGNvbnN0IG5vRXZlbnRUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBzZWUgdGhhdCBpbml0aWFsIGV2ZW50LiBDbGVhciBhbnkgcGVuZGluZyBvYmplY3QgYW5kXHJcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoIG5vIGV2ZW50XHJcbiAgICAgICAgICAgIGF3YWl0IF9nZXRBbmRSZW1vdmVFdmVudChhdXRoKTtcclxuICAgICAgICAgICAgbWFuYWdlci5vbkV2ZW50KGdlbmVyYXRlTm9FdmVudCgpKTtcclxuICAgICAgICB9LCBJTklUSUFMX0VWRU5UX1RJTUVPVVRfTVMpO1xyXG4gICAgICAgIGNvbnN0IHVuaXZlcnNhbExpbmtzQ2IgPSBhc3luYyAoZXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYW4gZXZlbnQgc28gd2UgY2FuIGNsZWFyIHRoZSBubyBldmVudCB0aW1lb3V0XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChub0V2ZW50VGltZW91dCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxFdmVudCA9IGF3YWl0IF9nZXRBbmRSZW1vdmVFdmVudChhdXRoKTtcclxuICAgICAgICAgICAgbGV0IGZpbmFsRXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocGFydGlhbEV2ZW50ICYmIChldmVudERhdGEgPT09IG51bGwgfHwgZXZlbnREYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBldmVudERhdGFbJ3VybCddKSkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxFdmVudCA9IF9ldmVudEZyb21QYXJ0aWFsQW5kVXJsKHBhcnRpYWxFdmVudCwgZXZlbnREYXRhWyd1cmwnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gSWYgZmluYWxFdmVudCBpcyBuZXZlciBmaWxsZWQsIHRyaWdnZXIgd2l0aCBubyBldmVudFxyXG4gICAgICAgICAgICBtYW5hZ2VyLm9uRXZlbnQoZmluYWxFdmVudCB8fCBnZW5lcmF0ZU5vRXZlbnQoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBVbml2ZXJzYWwgbGlua3Mgc3Vic2NyaWJlciBkb2Vzbid0IGV4aXN0IGZvciBpT1MsIHNvIHdlIG5lZWQgdG8gY2hlY2tcclxuICAgICAgICBpZiAodHlwZW9mIHVuaXZlcnNhbExpbmtzICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICB0eXBlb2YgdW5pdmVyc2FsTGlua3Muc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHVuaXZlcnNhbExpbmtzLnN1YnNjcmliZShudWxsLCB1bml2ZXJzYWxMaW5rc0NiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaU9TIDcgb3IgOCBjdXN0b20gVVJMIHNjaGVtZXMuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBhbHNvIHRoZSBjdXJyZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGlPUyA5Ky5cclxuICAgICAgICAvLyBGb3IgdGhpcyB0byB3b3JrLCBjb3Jkb3ZhLXBsdWdpbi1jdXN0b211cmxzY2hlbWUgbmVlZHMgdG8gYmUgaW5zdGFsbGVkLlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FZGR5VmVyYnJ1Z2dlbi9DdXN0b20tVVJMLXNjaGVtZVxyXG4gICAgICAgIC8vIERvIG5vdCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRldmVsb3BlcidzIFVSTCBoYW5kbGVyLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSGFuZGxlT3BlblVSTCA9IGhhbmRsZU9wZW5VUkw7XHJcbiAgICAgICAgY29uc3QgcGFja2FnZVByZWZpeCA9IGAke0J1aWxkSW5mby5wYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpfTovL2A7XHJcbiAgICAgICAgX2NvcmRvdmFXaW5kb3coKS5oYW5kbGVPcGVuVVJMID0gYXN5bmMgKHVybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwYWNrYWdlUHJlZml4KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0aGlzIGludGVudGlvbmFsbHkgdG8gZmxvYXRcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICAgICAgICAgIHVuaXZlcnNhbExpbmtzQ2IoeyB1cmwgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgZGV2ZWxvcGVyJ3MgaGFuZGxlciBpZiBpdCBpcyBwcmVzZW50LlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nSGFuZGxlT3BlblVSTCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0hhbmRsZU9wZW5VUkwodXJsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRldmVsb3BlciBlcnJvci4gRG9uJ3Qgc3RvcCB0aGUgZmxvdyBvZiB0aGUgU0RLLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSBzdWl0YWJsZSBmb3IgQ29yZG92YVxyXG4gKiBiYXNlZCBhcHBsaWNhdGlvbnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGNvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBDb3Jkb3ZhUG9wdXBSZWRpcmVjdFJlc29sdmVyO1xyXG5mdW5jdGlvbiBnZW5lcmF0ZU5vRXZlbnQoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwidW5rbm93blwiIC8qIFVOS05PV04gKi8sXHJcbiAgICAgICAgZXZlbnRJZDogbnVsbCxcclxuICAgICAgICBzZXNzaW9uSWQ6IG51bGwsXHJcbiAgICAgICAgdXJsUmVzcG9uc2U6IG51bGwsXHJcbiAgICAgICAgcG9zdEJvZHk6IG51bGwsXHJcbiAgICAgICAgdGVuYW50SWQ6IG51bGwsXHJcbiAgICAgICAgZXJyb3I6IF9jcmVhdGVFcnJvcihcIm5vLWF1dGgtZXZlbnRcIiAvKiBOT19BVVRIX0VWRU5UICovKVxyXG4gICAgfTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBmcmFtZXdvcmtzIChlLmcuIEZpcmViYXNlVUktd2ViKSB0byBsb2cgdGhlaXIgdXNhZ2UuXHJcbi8vIEl0IGlzIG5vdCBpbnRlbmRlZCBmb3IgZGlyZWN0IHVzZSBieSBkZXZlbG9wZXIgYXBwcy4gTk8ganNkb2MgaGVyZSB0byBpbnRlbnRpb25hbGx5IGxlYXZlIGl0IG91dFxyXG4vLyBvZiBhdXRvZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gcGFnZXMgdG8gcmVkdWNlIGFjY2lkZW50YWwgbWlzdXNlLlxyXG5mdW5jdGlvbiBhZGRGcmFtZXdvcmtGb3JMb2dnaW5nKGF1dGgsIGZyYW1ld29yaykge1xyXG4gICAgX2Nhc3RBdXRoKGF1dGgpLl9sb2dGcmFtZXdvcmsoZnJhbWV3b3JrKTtcclxufVxuXG5leHBvcnQgeyBhZGRGcmFtZXdvcmtGb3JMb2dnaW5nLCBjb3Jkb3ZhUG9wdXBSZWRpcmVjdFJlc29sdmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcm5hbC5qcy5tYXBcbiIsImltcG9ydCB7IF9yZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uLCBfZ2V0UHJvdmlkZXIsIGdldEFwcCwgX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSwgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1VzZXJUb2tlbiwgZ2V0TW9kdWxhckluc3RhbmNlLCBkZWVwRXF1YWwsIGdldFVBLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNTYWZhcmksIGlzTW9iaWxlQ29yZG92YSwgaXNSZWFjdE5hdGl2ZSwgaXNFbGVjdHJvbiwgaXNJRSwgaXNVV1AsIGlzQnJvd3NlckV4dGVuc2lvbiB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFhocklvLCBFdmVudFR5cGUsIEVycm9yQ29kZSwgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCwgZ2V0U3RhdEV2ZW50VGFyZ2V0LCBGZXRjaFhtbEh0dHBGYWN0b3J5LCBXZWJDaGFubmVsLCBFdmVudCwgU3RhdCB9IGZyb20gJ0BmaXJlYmFzZS93ZWJjaGFubmVsLXdyYXBwZXInO1xuXG5jb25zdCBTID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIG51bGxhYmxlIFVJRC4gTW9zdGx5IGV4aXN0cyB0byBtYWtlIGNvZGUgbW9yZVxuICogcmVhZGFibGUuXG4gKi9cbmNsYXNzIEQge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51aWQgPSB0O1xuICAgIH1cbiAgICBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsICE9IHRoaXMudWlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEga2V5IHJlcHJlc2VudGluZyB0aGlzIHVzZXIsIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICovICAgIHRvS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSA/IFwidWlkOlwiICsgdGhpcy51aWQgOiBcImFub255bW91cy11c2VyXCI7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdC51aWQgPT09IHRoaXMudWlkO1xuICAgIH1cbn1cblxuLyoqIEEgdXNlciB3aXRoIGEgbnVsbCBVSUQuICovIEQuVU5BVVRIRU5USUNBVEVEID0gbmV3IEQobnVsbCksIFxuLy8gVE9ETyhtaWtlbGVoZW4pOiBMb29rIGludG8gZ2V0dGluZyBhIHByb3BlciB1aWQtZXF1aXZhbGVudCBmb3Jcbi8vIG5vbi1GaXJlYmFzZUF1dGggcHJvdmlkZXJzLlxuRC5HT09HTEVfQ1JFREVOVElBTFMgPSBuZXcgRChcImdvb2dsZS1jcmVkZW50aWFscy11aWRcIiksIEQuRklSU1RfUEFSVFkgPSBuZXcgRChcImZpcnN0LXBhcnR5LXVpZFwiKSwgXG5ELk1PQ0tfVVNFUiA9IG5ldyBEKFwibW9jay11c2VyXCIpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IEMgPSBcIjkuNi4xXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jb25zdCBOID0gbmV3IExvZ2dlcihcIkBmaXJlYmFzZS9maXJlc3RvcmVcIik7XG5cbi8vIEhlbHBlciBtZXRob2RzIGFyZSBuZWVkZWQgYmVjYXVzZSB2YXJpYWJsZXMgY2FuJ3QgYmUgZXhwb3J0ZWQgYXMgcmVhZC93cml0ZVxuZnVuY3Rpb24gaygpIHtcbiAgICByZXR1cm4gTi5sb2dMZXZlbDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2ZXJib3NpdHkgb2YgQ2xvdWQgRmlyZXN0b3JlIGxvZ3MgKGRlYnVnLCBlcnJvciwgb3Igc2lsZW50KS5cbiAqXG4gKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgdmVyYm9zaXR5IHlvdSBzZXQgZm9yIGFjdGl2aXR5IGFuZCBlcnJvciBsb2dnaW5nLiBDYW5cbiAqICAgYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICpcbiAqICAgPHVsPlxuICogICAgIDxsaT5gZGVidWdgIGZvciB0aGUgbW9zdCB2ZXJib3NlIGxvZ2dpbmcgbGV2ZWwsIHByaW1hcmlseSBmb3JcbiAqICAgICBkZWJ1Z2dpbmcuPC9saT5cbiAqICAgICA8bGk+YGVycm9yYCB0byBsb2cgZXJyb3JzIG9ubHkuPC9saT5cbiAqICAgICA8bGk+PGNvZGU+YHNpbGVudGAgdG8gdHVybiBvZmYgbG9nZ2luZy48L2xpPlxuICogICA8L3VsPlxuICovIGZ1bmN0aW9uIHgodCkge1xuICAgIE4uc2V0TG9nTGV2ZWwodCk7XG59XG5cbmZ1bmN0aW9uICQodCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcChNKTtcbiAgICAgICAgTi5kZWJ1ZyhgRmlyZXN0b3JlICgke0N9KTogJHt0fWAsIC4uLm4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gRih0LCAuLi5lKSB7XG4gICAgaWYgKE4ubG9nTGV2ZWwgPD0gTG9nTGV2ZWwuRVJST1IpIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKE0pO1xuICAgICAgICBOLmVycm9yKGBGaXJlc3RvcmUgKCR7Q30pOiAke3R9YCwgLi4ubik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovIGZ1bmN0aW9uIE8odCwgLi4uZSkge1xuICAgIGlmIChOLmxvZ0xldmVsIDw9IExvZ0xldmVsLldBUk4pIHtcbiAgICAgICAgY29uc3QgbiA9IGUubWFwKE0pO1xuICAgICAgICBOLndhcm4oYEZpcmVzdG9yZSAoJHtDfSk6ICR7dH1gLCAuLi5uKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWRkaXRpb25hbCBsb2cgcGFyYW1ldGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovIGZ1bmN0aW9uIE0odCkge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0KSByZXR1cm4gdDtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZSA9IHQsIEpTT04uc3RyaW5naWZ5KGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ29udmVydGluZyB0byBKU09OIGZhaWxlZCwganVzdCBsb2cgdGhlIG9iamVjdCBkaXJlY3RseVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKiogRm9ybWF0cyBhbiBvYmplY3QgYXMgYSBKU09OIHN0cmluZywgc3VpdGFibGUgZm9yIGxvZ2dpbmcuICovXG4gICAgdmFyIGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAqIE1lc3NhZ2VzIGFyZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqXG4gKiBSZXR1cm5zIGBuZXZlcmAgYW5kIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zOlxuICogQGV4YW1wbGVcbiAqIGxldCBmdXR1cmVWYXIgPSBmYWlsKCdub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gKi8gZnVuY3Rpb24gTCh0ID0gXCJVbmV4cGVjdGVkIHN0YXRlXCIpIHtcbiAgICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXG4gICAgLy8gZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC5cbiAgICBjb25zdCBlID0gYEZJUkVTVE9SRSAoJHtDfSkgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIHQ7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgdXNlIEZpcmVzdG9yZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcbiAgICAvLyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyLiAoQWxzbyBpdCB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhclxuICAgIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgZXJyb3IgYW5kIGFzc2VydCBtb2R1bGVzIHdoaWNoIGRvZXNuJ3Qgd29yay4pXG4gICAgdGhyb3cgRihlKSwgbmV3IEVycm9yKGUpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogTWVzc2FnZXMgYXJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICovIGZ1bmN0aW9uIEIodCwgZSkge1xuICAgIHQgfHwgTCgpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogVGhlIGNvZGUgb2YgY2FsbHNpdGVzIGludm9raW5nIHRoaXMgZnVuY3Rpb24gYXJlIHN0cmlwcGVkIG91dCBpbiBwcm9kdWN0aW9uXG4gKiBidWlsZHMuIEFueSBzaWRlLWVmZmVjdHMgb2YgY29kZSB3aXRoaW4gdGhlIGRlYnVnQXNzZXJ0KCkgaW52b2NhdGlvbiB3aWxsIG5vdFxuICogaGFwcGVuIGluIHRoaXMgY2FzZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBVKHQsIGUpIHtcbiAgICB0IHx8IEwoKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBgb2JqYCB0byBgVGAuIEluIG5vbi1wcm9kdWN0aW9uIGJ1aWxkcywgdmVyaWZpZXMgdGhhdCBgb2JqYCBpcyBhblxuICogaW5zdGFuY2Ugb2YgYFRgIGJlZm9yZSBjYXN0aW5nLlxuICovIGZ1bmN0aW9uIHEodCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIHJldHVybiB0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBLID0ge1xuICAgIC8vIENhdXNlcyBhcmUgY29waWVkIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL2JjZWVjOTRlYTRmYzVmMDA4NWQ4MTIzNWQ4ZTFjMDY3OThkYzM0MWEvaW5jbHVkZS9ncnBjJTJCJTJCL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmhcbiAgICAvKiogTm90IGFuIGVycm9yOyByZXR1cm5lZCBvbiBzdWNjZXNzLiAqL1xuICAgIE9LOiBcIm9rXCIsXG4gICAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBjYWxsZXIpLiAqL1xuICAgIENBTkNFTExFRDogXCJjYW5jZWxsZWRcIixcbiAgICAvKiogVW5rbm93biBlcnJvciBvciBhbiBlcnJvciBmcm9tIGEgZGlmZmVyZW50IGVycm9yIGRvbWFpbi4gKi9cbiAgICBVTktOT1dOOiBcInVua25vd25cIixcbiAgICAvKipcbiAgICAgKiBDbGllbnQgc3BlY2lmaWVkIGFuIGludmFsaWQgYXJndW1lbnQuIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbVxuICAgICAqIEZBSUxFRF9QUkVDT05ESVRJT04uIElOVkFMSURfQVJHVU1FTlQgaW5kaWNhdGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICAgICAqIHByb2JsZW1hdGljIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKGUuZy4sIGEgbWFsZm9ybWVkIGZpbGVcbiAgICAgKiBuYW1lKS5cbiAgICAgKi9cbiAgICBJTlZBTElEX0FSR1VNRU5UOiBcImludmFsaWQtYXJndW1lbnRcIixcbiAgICAvKipcbiAgICAgKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuIEZvciBvcGVyYXRpb25zIHRoYXRcbiAgICAgKiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0sIHRoaXMgZXJyb3IgbWF5IGJlIHJldHVybmVkIGV2ZW4gaWYgdGhlXG4gICAgICogb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBGb3IgZXhhbXBsZSwgYSBzdWNjZXNzZnVsIHJlc3BvbnNlXG4gICAgICogZnJvbSBhIHNlcnZlciBjb3VsZCBoYXZlIGJlZW4gZGVsYXllZCBsb25nIGVub3VnaCBmb3IgdGhlIGRlYWRsaW5lIHRvXG4gICAgICogZXhwaXJlLlxuICAgICAqL1xuICAgIERFQURMSU5FX0VYQ0VFREVEOiBcImRlYWRsaW5lLWV4Y2VlZGVkXCIsXG4gICAgLyoqIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG4gICAgTk9UX0ZPVU5EOiBcIm5vdC1mb3VuZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgZW50aXR5IHRoYXQgd2UgYXR0ZW1wdGVkIHRvIGNyZWF0ZSAoZS5nLiwgZmlsZSBvciBkaXJlY3RvcnkpIGFscmVhZHlcbiAgICAgKiBleGlzdHMuXG4gICAgICovXG4gICAgQUxSRUFEWV9FWElTVFM6IFwiYWxyZWFkeS1leGlzdHNcIixcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgICAqIFBFUk1JU1NJT05fREVOSUVEIG11c3Qgbm90IGJlIHVzZWQgZm9yIHJlamVjdGlvbnMgY2F1c2VkIGJ5IGV4aGF1c3RpbmdcbiAgICAgKiBzb21lIHJlc291cmNlICh1c2UgUkVTT1VSQ0VfRVhIQVVTVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICogUEVSTUlTU0lPTl9ERU5JRUQgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgY2FsbGVyIGNhbiBub3QgYmUgaWRlbnRpZmllZFxuICAgICAqICh1c2UgVU5BVVRIRU5USUNBVEVEIGluc3RlYWQgZm9yIHRob3NlIGVycm9ycykuXG4gICAgICovXG4gICAgUEVSTUlTU0lPTl9ERU5JRUQ6IFwicGVybWlzc2lvbi1kZW5pZWRcIixcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGVcbiAgICAgKiBvcGVyYXRpb24uXG4gICAgICovXG4gICAgVU5BVVRIRU5USUNBVEVEOiBcInVuYXV0aGVudGljYXRlZFwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlXG4gICAgICogZW50aXJlIGZpbGUgc3lzdGVtIGlzIG91dCBvZiBzcGFjZS5cbiAgICAgKi9cbiAgICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwicmVzb3VyY2UtZXhoYXVzdGVkXCIsXG4gICAgLyoqXG4gICAgICogT3BlcmF0aW9uIHdhcyByZWplY3RlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gaXMgbm90IGluIGEgc3RhdGUgcmVxdWlyZWQgZm9yXG4gICAgICogdGhlIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gRm9yIGV4YW1wbGUsIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIG1heSBiZVxuICAgICAqIG5vbi1lbXB0eSwgYW4gcm1kaXIgb3BlcmF0aW9uIGlzIGFwcGxpZWQgdG8gYSBub24tZGlyZWN0b3J5LCBldGMuXG4gICAgICpcbiAgICAgKiBBIGxpdG11cyB0ZXN0IHRoYXQgbWF5IGhlbHAgYSBzZXJ2aWNlIGltcGxlbWVudG9yIGluIGRlY2lkaW5nXG4gICAgICogYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OLCBBQk9SVEVELCBhbmQgVU5BVkFJTEFCTEU6XG4gICAgICogIChhKSBVc2UgVU5BVkFJTEFCTEUgaWYgdGhlIGNsaWVudCBjYW4gcmV0cnkganVzdCB0aGUgZmFpbGluZyBjYWxsLlxuICAgICAqICAoYikgVXNlIEFCT1JURUQgaWYgdGhlIGNsaWVudCBzaG91bGQgcmV0cnkgYXQgYSBoaWdoZXItbGV2ZWxcbiAgICAgKiAgICAgIChlLmcuLCByZXN0YXJ0aW5nIGEgcmVhZC1tb2RpZnktd3JpdGUgc2VxdWVuY2UpLlxuICAgICAqICAoYykgVXNlIEZBSUxFRF9QUkVDT05ESVRJT04gaWYgdGhlIGNsaWVudCBzaG91bGQgbm90IHJldHJ5IHVudGlsXG4gICAgICogICAgICB0aGUgc3lzdGVtIHN0YXRlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZml4ZWQuIEUuZy4sIGlmIGFuIFwicm1kaXJcIlxuICAgICAqICAgICAgZmFpbHMgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGlzIG5vbi1lbXB0eSwgRkFJTEVEX1BSRUNPTkRJVElPTlxuICAgICAqICAgICAgc2hvdWxkIGJlIHJldHVybmVkIHNpbmNlIHRoZSBjbGllbnQgc2hvdWxkIG5vdCByZXRyeSB1bmxlc3NcbiAgICAgKiAgICAgIHRoZXkgaGF2ZSBmaXJzdCBmaXhlZCB1cCB0aGUgZGlyZWN0b3J5IGJ5IGRlbGV0aW5nIGZpbGVzIGZyb20gaXQuXG4gICAgICogIChkKSBVc2UgRkFJTEVEX1BSRUNPTkRJVElPTiBpZiB0aGUgY2xpZW50IHBlcmZvcm1zIGNvbmRpdGlvbmFsXG4gICAgICogICAgICBSRVNUIEdldC9VcGRhdGUvRGVsZXRlIG9uIGEgcmVzb3VyY2UgYW5kIHRoZSByZXNvdXJjZSBvbiB0aGVcbiAgICAgKiAgICAgIHNlcnZlciBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZGl0aW9uLiBFLmcuLCBjb25mbGljdGluZ1xuICAgICAqICAgICAgcmVhZC1tb2RpZnktd3JpdGUgb24gdGhlIHNhbWUgcmVzb3VyY2UuXG4gICAgICovXG4gICAgRkFJTEVEX1BSRUNPTkRJVElPTjogXCJmYWlsZWQtcHJlY29uZGl0aW9uXCIsXG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5IGlzc3VlIGxpa2VcbiAgICAgKiBzZXF1ZW5jZXIgY2hlY2sgZmFpbHVyZXMsIHRyYW5zYWN0aW9uIGFib3J0cywgZXRjLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIEFCT1JURUQ6IFwiYWJvcnRlZFwiLFxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHBhc3QgdGhlIHZhbGlkIHJhbmdlLiBFLmcuLCBzZWVraW5nIG9yIHJlYWRpbmdcbiAgICAgKiBwYXN0IGVuZCBvZiBmaWxlLlxuICAgICAqXG4gICAgICogVW5saWtlIElOVkFMSURfQVJHVU1FTlQsIHRoaXMgZXJyb3IgaW5kaWNhdGVzIGEgcHJvYmxlbSB0aGF0IG1heSBiZSBmaXhlZFxuICAgICAqIGlmIHRoZSBzeXN0ZW0gc3RhdGUgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIGEgMzItYml0IGZpbGUgc3lzdGVtIHdpbGxcbiAgICAgKiBnZW5lcmF0ZSBJTlZBTElEX0FSR1VNRU5UIGlmIGFza2VkIHRvIHJlYWQgYXQgYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGluIHRoZVxuICAgICAqIHJhbmdlIFswLDJeMzItMV0sIGJ1dCBpdCB3aWxsIGdlbmVyYXRlIE9VVF9PRl9SQU5HRSBpZiBhc2tlZCB0byByZWFkIGZyb21cbiAgICAgKiBhbiBvZmZzZXQgcGFzdCB0aGUgY3VycmVudCBmaWxlIHNpemUuXG4gICAgICpcbiAgICAgKiBUaGVyZSBpcyBhIGZhaXIgYml0IG9mIG92ZXJsYXAgYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OIGFuZFxuICAgICAqIE9VVF9PRl9SQU5HRS4gV2UgcmVjb21tZW5kIHVzaW5nIE9VVF9PRl9SQU5HRSAodGhlIG1vcmUgc3BlY2lmaWMgZXJyb3IpXG4gICAgICogd2hlbiBpdCBhcHBsaWVzIHNvIHRoYXQgY2FsbGVycyB3aG8gYXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgc3BhY2UgY2FuXG4gICAgICogZWFzaWx5IGxvb2sgZm9yIGFuIE9VVF9PRl9SQU5HRSBlcnJvciB0byBkZXRlY3Qgd2hlbiB0aGV5IGFyZSBkb25lLlxuICAgICAqL1xuICAgIE9VVF9PRl9SQU5HRTogXCJvdXQtb2YtcmFuZ2VcIixcbiAgICAvKiogT3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvciBub3Qgc3VwcG9ydGVkL2VuYWJsZWQgaW4gdGhpcyBzZXJ2aWNlLiAqL1xuICAgIFVOSU1QTEVNRU5URUQ6IFwidW5pbXBsZW1lbnRlZFwiLFxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGVycm9ycy4gTWVhbnMgc29tZSBpbnZhcmlhbnRzIGV4cGVjdGVkIGJ5IHVuZGVybHlpbmcgU3lzdGVtIGhhc1xuICAgICAqIGJlZW4gYnJva2VuLiBJZiB5b3Ugc2VlIG9uZSBvZiB0aGVzZSBlcnJvcnMsIFNvbWV0aGluZyBpcyB2ZXJ5IGJyb2tlbi5cbiAgICAgKi9cbiAgICBJTlRFUk5BTDogXCJpbnRlcm5hbFwiLFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gVGhpcyBpcyBhIG1vc3QgbGlrZWx5IGEgdHJhbnNpZW50XG4gICAgICogY29uZGl0aW9uIGFuZCBtYXkgYmUgY29ycmVjdGVkIGJ5IHJldHJ5aW5nIHdpdGggYSBiYWNrb2ZmLlxuICAgICAqXG4gICAgICogU2VlIGxpdG11cyB0ZXN0IGFib3ZlIGZvciBkZWNpZGluZyBiZXR3ZWVuIEZBSUxFRF9QUkVDT05ESVRJT04sIEFCT1JURUQsXG4gICAgICogYW5kIFVOQVZBSUxBQkxFLlxuICAgICAqL1xuICAgIFVOQVZBSUxBQkxFOiBcInVuYXZhaWxhYmxlXCIsXG4gICAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24uICovXG4gICAgREFUQV9MT1NTOiBcImRhdGEtbG9zc1wiXG59O1xuXG4vKiogQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBGaXJlc3RvcmUgb3BlcmF0aW9uLiAqLyBjbGFzcyBqIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGJhY2tlbmQgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBIGN1c3RvbSBlcnJvciBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICBlKSB7XG4gICAgICAgIHN1cGVyKGUpLCB0aGlzLmNvZGUgPSB0LCB0aGlzLm1lc3NhZ2UgPSBlLCBcbiAgICAgICAgLyoqIFRoZSBjdXN0b20gbmFtZSBmb3IgYWxsIEZpcmVzdG9yZUVycm9ycy4gKi9cbiAgICAgICAgdGhpcy5uYW1lID0gXCJGaXJlYmFzZUVycm9yXCIsIFxuICAgICAgICAvLyBIQUNLOiBXZSB3cml0ZSBhIHRvU3RyaW5nIHByb3BlcnR5IGRpcmVjdGx5IGJlY2F1c2UgRXJyb3IgaXMgbm90IGEgcmVhbFxuICAgICAgICAvLyBjbGFzcyBhbmQgc28gaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuIFdlIGNvdWxkIGFsdGVybmF0aXZlbHlcbiAgICAgICAgLy8gZG8gdGhlIHNhbWUgXCJiYWNrLWRvb3IgaW5oZXJpdGFuY2VcIiB0cmljayB0aGF0IEZpcmViYXNlRXJyb3IgZG9lcy5cbiAgICAgICAgdGhpcy50b1N0cmluZyA9ICgpID0+IGAke3RoaXMubmFtZX06IFtjb2RlPSR7dGhpcy5jb2RlfV06ICR7dGhpcy5tZXNzYWdlfWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBRIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSB0LCB0aGlzLnJlamVjdCA9IGU7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIFcge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy51c2VyID0gZSwgdGhpcy50eXBlID0gXCJPQXV0aFwiLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7dH1gKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHlpZWxkcyBhbiBlbXB0eSB0b2tlbi5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIEcge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7fVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdXNlci5cbiAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBlKEQuVU5BVVRIRU5USUNBVEVEKSkpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG59XG5cbi8qKlxuICogQSBDcmVkZW50aWFsc1Byb3ZpZGVyIHRoYXQgYWx3YXlzIHJldHVybnMgYSBjb25zdGFudCB0b2tlbi4gVXNlZCBmb3JcbiAqIGVtdWxhdG9yIHRva2VuIG1vY2tpbmcuXG4gKi8gY2xhc3MgeiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnRva2VuID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZXMgdGhlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgd2l0aCBzZXRDaGFuZ2VMaXN0ZW5lcigpXG4gICAgICAgICAqIFRoaXMgaXNuJ3QgYWN0dWFsbHkgbmVjZXNzYXJ5IHNpbmNlIHRoZSBVSUQgbmV2ZXIgY2hhbmdlcywgYnV0IHdlIHVzZSB0aGlzXG4gICAgICAgICAqIHRvIHZlcmlmeSB0aGUgbGlzdGVuIGNvbnRyYWN0IGlzIGFkaGVyZWQgdG8gaW4gdGVzdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b2tlbik7XG4gICAgfVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gZSwgXG4gICAgICAgIC8vIEZpcmUgd2l0aCBpbml0aWFsIHVzZXIuXG4gICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gZSh0aGlzLnRva2VuLnVzZXIpKSk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVyID0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEgge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50ID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgdGhlIGN1cnJlbnQgVXNlci4gKi9cbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IEQuVU5BVVRIRU5USUNBVEVELCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdW50ZXIgdXNlZCB0byBkZXRlY3QgaWYgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgYSBnZXRUb2tlbiByZXF1ZXN0IHdhc1xuICAgICAgICAgKiBvdXRzdGFuZGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaSA9IDAsIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLmk7XG4gICAgICAgIC8vIEEgY2hhbmdlIGxpc3RlbmVyIHRoYXQgcHJldmVudHMgZG91YmxlLWZpcmluZyBmb3IgdGhlIHNhbWUgdG9rZW4gY2hhbmdlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID0+IHRoaXMuaSAhPT0gbiA/IChuID0gdGhpcy5pLCBlKHQpKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAvLyBBIHByb21pc2UgdGhhdCBjYW4gYmUgd2FpdGVkIG9uIHRvIGJsb2NrIG9uIHRoZSBuZXh0IHRva2VuIGNoYW5nZS5cbiAgICAgICAgLy8gVGhpcyBwcm9taXNlIGlzIHJlLWNyZWF0ZWQgYWZ0ZXIgZWFjaCBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBuZXcgUTtcbiAgICAgICAgdGhpcy5vID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pKyssIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnUoKSwgaS5yZXNvbHZlKCksIGkgPSBuZXcgUSwgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiBzKHRoaXMuY3VycmVudFVzZXIpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gaTtcbiAgICAgICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUucHJvbWlzZSwgYXdhaXQgcyh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgbyA9IHQgPT4ge1xuICAgICAgICAgICAgJChcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIGRldGVjdGVkXCIpLCB0aGlzLmF1dGggPSB0LCB0aGlzLmF1dGguYWRkQXV0aFRva2VuTGlzdGVuZXIodGhpcy5vKSwgXG4gICAgICAgICAgICByKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudC5vbkluaXQoKHQgPT4gbyh0KSkpLCBcbiAgICAgICAgLy8gT3VyIHVzZXJzIGNhbiBpbml0aWFsaXplIEF1dGggcmlnaHQgYWZ0ZXIgRmlyZXN0b3JlLCBzbyB3ZSBnaXZlIGl0XG4gICAgICAgIC8vIGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBjb21wb25lbnQgZnJhbWV3b3JrIGJlZm9yZSB3ZVxuICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byBzdGFydCB1cCBpbiB1bmF1dGhlbnRpY2F0ZWQgbW9kZS5cbiAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy50LmdldEltbWVkaWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHQgPyBvKHQpIDogKFxuICAgICAgICAgICAgICAgIC8vIElmIGF1dGggaXMgc3RpbGwgbm90IGF2YWlsYWJsZSwgcHJvY2VlZCB3aXRoIGBudWxsYCB1c2VyXG4gICAgICAgICAgICAgICAgJChcIkZpcmViYXNlQXV0aENyZWRlbnRpYWxzUHJvdmlkZXJcIiwgXCJBdXRoIG5vdCB5ZXQgZGV0ZWN0ZWRcIiksIGkucmVzb2x2ZSgpLCBpID0gbmV3IFEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgMCksIHIoKTtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIC8vIFRha2Ugbm90ZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdG9rZW5Db3VudGVyIHNvIHRoYXQgdGhpcyBtZXRob2RcbiAgICAgICAgLy8gY2FuIGZhaWwgKHdpdGggYW4gQUJPUlRFRCBlcnJvcikgaWYgdGhlcmUgaXMgYSB0b2tlbiBjaGFuZ2Ugd2hpbGUgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgaXMgb3V0c3RhbmRpbmcuXG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmksIGUgPSB0aGlzLmZvcmNlUmVmcmVzaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXV0aCA/IHRoaXMuYXV0aC5nZXRUb2tlbihlKS50aGVuKChlID0+IFxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJlcXVlc3Qgc2luY2UgdGhlIHRva2VuIGNoYW5nZWQgd2hpbGUgdGhlIHJlcXVlc3Qgd2FzXG4gICAgICAgIC8vIG91dHN0YW5kaW5nIHNvIHRoZSByZXNwb25zZSBpcyBwb3RlbnRpYWxseSBmb3IgYSBwcmV2aW91cyB1c2VyICh3aGljaFxuICAgICAgICAvLyB1c2VyLCB3ZSBjYW4ndCBiZSBzdXJlKS5cbiAgICAgICAgdGhpcy5pICE9PSB0ID8gKCQoXCJGaXJlYmFzZUF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyXCIsIFwiZ2V0VG9rZW4gYWJvcnRlZCBkdWUgdG8gdG9rZW4gY2hhbmdlLlwiKSwgXG4gICAgICAgIHRoaXMuZ2V0VG9rZW4oKSkgOiBlID8gKEIoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS5hY2Nlc3NUb2tlbiksIG5ldyBXKGUuYWNjZXNzVG9rZW4sIHRoaXMuY3VycmVudFVzZXIpKSA6IG51bGwpKSA6IFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge1xuICAgICAgICB0aGlzLmZvcmNlUmVmcmVzaCA9ICEwO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5hdXRoICYmIHRoaXMuYXV0aC5yZW1vdmVBdXRoVG9rZW5MaXN0ZW5lcih0aGlzLm8pO1xuICAgIH1cbiAgICAvLyBBdXRoLmdldFVpZCgpIGNhbiByZXR1cm4gbnVsbCBldmVuIHdpdGggYSB1c2VyIGxvZ2dlZCBpbi4gSXQgaXMgYmVjYXVzZVxuICAgIC8vIGdldFVpZCgpIGlzIHN5bmNocm9ub3VzLCBidXQgdGhlIGF1dGggY29kZSBwb3B1bGF0aW5nIFVpZCBpcyBhc3luY2hyb25vdXMuXG4gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBBdXRoVG9rZW5MaXN0ZW5lciBjYWxsYmFja1xuICAgIC8vIHRvIGd1YXJhbnRlZSB0byBnZXQgdGhlIGFjdHVhbCB1c2VyLlxuICAgIHUoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmF1dGggJiYgdGhpcy5hdXRoLmdldFVpZCgpO1xuICAgICAgICByZXR1cm4gQihudWxsID09PSB0IHx8IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpLCBuZXcgRCh0KTtcbiAgICB9XG59XG5cbi8qXG4gKiBGaXJzdFBhcnR5VG9rZW4gcHJvdmlkZXMgYSBmcmVzaCB0b2tlbiBlYWNoIHRpbWUgaXRzIHZhbHVlXG4gKiBpcyByZXF1ZXN0ZWQsIGJlY2F1c2UgaWYgdGhlIHRva2VuIGlzIHRvbyBvbGQsIHJlcXVlc3RzIHdpbGwgYmUgcmVqZWN0ZWQuXG4gKiBUZWNobmljYWxseSB0aGlzIG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBTREsgc2hvdWxkIGdyYWNlZnVsbHlcbiAqIHJlY292ZXIgZnJvbSB1bmF1dGhlbnRpY2F0ZWQgZXJyb3JzIChzZWUgYi8zMzE0NzgxOCBmb3IgY29udGV4dCksIGJ1dCBpdCdzXG4gKiBzYWZlciB0byBrZWVwIHRoZSBpbXBsZW1lbnRhdGlvbiBhcy1pcy5cbiAqLyBjbGFzcyBKIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiRmlyc3RQYXJ0eVwiLCB0aGlzLnVzZXIgPSBELkZJUlNUX1BBUlRZLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0aGlzLmhlYWRlcnMuc2V0KFwiWC1Hb29nLUF1dGhVc2VyXCIsIGUpO1xuICAgICAgICBjb25zdCBzID0gdC5hdXRoLmdldEF1dGhIZWFkZXJWYWx1ZUZvckZpcnN0UGFydHkoW10pO1xuICAgICAgICBzICYmIHRoaXMuaGVhZGVycy5zZXQoXCJBdXRob3JpemF0aW9uXCIsIHMpLCBuICYmIHRoaXMuaGVhZGVycy5zZXQoXCJYLUdvb2ctSWFtLUF1dGhvcml6YXRpb24tVG9rZW5cIiwgbik7XG4gICAgfVxufVxuXG4vKlxuICogUHJvdmlkZXMgdXNlciBjcmVkZW50aWFscyByZXF1aXJlZCBmb3IgdGhlIEZpcmVzdG9yZSBKYXZhU2NyaXB0IFNES1xuICogdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCB1c2luZyB0ZWNobmlxdWUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZVxuICogdG8gYXBwbGljYXRpb25zIGhvc3RlZCBieSBHb29nbGUuXG4gKi8gY2xhc3MgWSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmggPSB0LCB0aGlzLmwgPSBlLCB0aGlzLm0gPSBuO1xuICAgIH1cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgSih0aGlzLmgsIHRoaXMubCwgdGhpcy5tKSk7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyZSB3aXRoIGluaXRpYWwgdWlkLlxuICAgICAgICB0LmVucXVldWVSZXRyeWFibGUoKCgpID0+IGUoRC5GSVJTVF9QQVJUWSkpKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7fVxuICAgIGludmFsaWRhdGVUb2tlbigpIHt9XG59XG5cbmNsYXNzIFgge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHQsIHRoaXMudHlwZSA9IFwiQXBwQ2hlY2tcIiwgdGhpcy5oZWFkZXJzID0gbmV3IE1hcCwgdCAmJiB0Lmxlbmd0aCA+IDAgJiYgdGhpcy5oZWFkZXJzLnNldChcIngtZmlyZWJhc2UtYXBwY2hlY2tcIiwgdGhpcy52YWx1ZSk7XG4gICAgfVxufVxuXG5jbGFzcyBaIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZyA9IHQsIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXBwQ2hlY2sgPSBudWxsO1xuICAgIH1cbiAgICBzdGFydCh0LCBlKSB7XG4gICAgICAgIHRoaXMubyA9IG4gPT4ge1xuICAgICAgICAgICAgdC5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiAodCA9PiAobnVsbCAhPSB0LmVycm9yICYmICQoXCJGaXJlYmFzZUFwcENoZWNrVG9rZW5Qcm92aWRlclwiLCBgRXJyb3IgZ2V0dGluZyBBcHAgQ2hlY2sgdG9rZW47IHVzaW5nIHBsYWNlaG9sZGVyIHRva2VuIGluc3RlYWQuIEVycm9yOiAke3QuZXJyb3IubWVzc2FnZX1gKSwgXG4gICAgICAgICAgICBlKHQudG9rZW4pKSkobikpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbiA9IHQgPT4ge1xuICAgICAgICAgICAgJChcIkZpcmViYXNlQXBwQ2hlY2tUb2tlblByb3ZpZGVyXCIsIFwiQXBwQ2hlY2sgZGV0ZWN0ZWRcIiksIHRoaXMuYXBwQ2hlY2sgPSB0LCB0aGlzLmFwcENoZWNrLmFkZFRva2VuTGlzdGVuZXIodGhpcy5vKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nLm9uSW5pdCgodCA9PiBuKHQpKSksIFxuICAgICAgICAvLyBPdXIgdXNlcnMgY2FuIGluaXRpYWxpemUgQXBwQ2hlY2sgYWZ0ZXIgRmlyZXN0b3JlLCBzbyB3ZSBnaXZlIGl0XG4gICAgICAgIC8vIGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBjb21wb25lbnQgZnJhbWV3b3JrLlxuICAgICAgICBzZXRUaW1lb3V0KCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXBwQ2hlY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nLmdldEltbWVkaWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiAhMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHQgPyBuKHQpIDogXG4gICAgICAgICAgICAgICAgLy8gSWYgQXBwQ2hlY2sgaXMgc3RpbGwgbm90IGF2YWlsYWJsZSwgcHJvY2VlZCB3aXRob3V0IGl0LlxuICAgICAgICAgICAgICAgICQoXCJGaXJlYmFzZUFwcENoZWNrVG9rZW5Qcm92aWRlclwiLCBcIkFwcENoZWNrIG5vdCB5ZXQgZGV0ZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCAwKTtcbiAgICB9XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmZvcmNlUmVmcmVzaDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yY2VSZWZyZXNoID0gITEsIHRoaXMuYXBwQ2hlY2sgPyB0aGlzLmFwcENoZWNrLmdldFRva2VuKHQpLnRoZW4oKHQgPT4gdCA/IChCKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQudG9rZW4pLCBcbiAgICAgICAgbmV3IFgodC50b2tlbikpIDogbnVsbCkpIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7XG4gICAgICAgIHRoaXMuZm9yY2VSZWZyZXNoID0gITA7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLmFwcENoZWNrICYmIHRoaXMuYXBwQ2hlY2sucmVtb3ZlVG9rZW5MaXN0ZW5lcih0aGlzLm8pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBBcHBDaGVjayB0b2tlbiBwcm92aWRlciB0aGF0IGFsd2F5cyB5aWVsZHMgYW4gZW1wdHkgdG9rZW4uXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyB0dCB7XG4gICAgZ2V0VG9rZW4oKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFgoXCJcIikpO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7fVxuICAgIHN0YXJ0KHQsIGUpIHt9XG4gICAgc2h1dGRvd24oKSB7fVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIENyZWRlbnRpYWxzUHJvdmlkZXIgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mXG4gKiB0aGUgY3JlZGVudGlhbHMgcGFzc2VkIGluLlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBgTGlzdGVuU2VxdWVuY2VgIGlzIGEgbW9ub3RvbmljIHNlcXVlbmNlLiBJdCBpcyBpbml0aWFsaXplZCB3aXRoIGEgbWluaW11bSB2YWx1ZSB0b1xuICogZXhjZWVkLiBBbGwgc3Vic2VxdWVudCBjYWxscyB0byBuZXh0IHdpbGwgcmV0dXJuIGluY3JlYXNpbmcgdmFsdWVzLiBJZiBwcm92aWRlZCB3aXRoIGFcbiAqIGBTZXF1ZW5jZU51bWJlclN5bmNlcmAsIGl0IHdpbGwgYWRkaXRpb25hbGx5IGJ1bXAgaXRzIG5leHQgdmFsdWUgd2hlbiB0b2xkIG9mIGEgbmV3IHZhbHVlLCBhc1xuICogd2VsbCBhcyB3cml0ZSBvdXQgc2VxdWVuY2UgbnVtYmVycyB0aGF0IGl0IHByb2R1Y2VzIHZpYSBgbmV4dCgpYC5cbiAqL1xuY2xhc3MgZXQge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdCwgZSAmJiAoZS5zZXF1ZW5jZU51bWJlckhhbmRsZXIgPSB0ID0+IHRoaXMucCh0KSwgdGhpcy5UID0gdCA9PiBlLndyaXRlU2VxdWVuY2VOdW1iZXIodCkpO1xuICAgIH1cbiAgICBwKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNWYWx1ZSA9IE1hdGgubWF4KHQsIHRoaXMucHJldmlvdXNWYWx1ZSksIHRoaXMucHJldmlvdXNWYWx1ZTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdCA9ICsrdGhpcy5wcmV2aW91c1ZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5UICYmIHRoaXMuVCh0KSwgdDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEdlbmVyYXRlcyBgbkJ5dGVzYCBvZiByYW5kb20gYnl0ZXMuXG4gKlxuICogSWYgYG5CeXRlcyA8IDBgICwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIG50KHQpIHtcbiAgICAvLyBQb2x5ZmlsbHMgZm9yIElFIGFuZCBXZWJXb3JrZXIgYnkgdXNpbmcgYHNlbGZgIGFuZCBgbXNDcnlwdG9gIHdoZW4gYGNyeXB0b2AgaXMgbm90IGF2YWlsYWJsZS5cbiAgICBjb25zdCBlID0gXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBzZWxmICYmIChzZWxmLmNyeXB0byB8fCBzZWxmLm1zQ3J5cHRvKSwgbiA9IG5ldyBVaW50OEFycmF5KHQpO1xuICAgIGlmIChlICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZS5nZXRSYW5kb21WYWx1ZXMpIGUuZ2V0UmFuZG9tVmFsdWVzKG4pOyBlbHNlIFxuICAgIC8vIEZhbGxzIGJhY2sgdG8gTWF0aC5yYW5kb21cbiAgICBmb3IgKGxldCBlID0gMDsgZSA8IHQ7IGUrKykgbltlXSA9IE1hdGguZmxvb3IoMjU2ICogTWF0aC5yYW5kb20oKSk7XG4gICAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGV0LkkgPSAtMTtcblxuY2xhc3Mgc3Qge1xuICAgIHN0YXRpYyBBKCkge1xuICAgICAgICAvLyBBbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCB0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiLCBlID0gTWF0aC5mbG9vcigyNTYgLyB0Lmxlbmd0aCkgKiB0Lmxlbmd0aDtcbiAgICAgICAgLy8gVGhlIGxhcmdlc3QgYnl0ZSB2YWx1ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgYGNoYXIubGVuZ3RoYC5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IFwiXCI7XG4gICAgICAgIGZvciAoO24ubGVuZ3RoIDwgMjA7ICkge1xuICAgICAgICAgICAgY29uc3QgcyA9IG50KDQwKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkgXG4gICAgICAgICAgICAvLyBPbmx5IGFjY2VwdCB2YWx1ZXMgdGhhdCBhcmUgWzAsIG1heE11bHRpcGxlKSwgdGhpcyBlbnN1cmVzIHRoZXkgY2FuXG4gICAgICAgICAgICAvLyBiZSBldmVubHkgbWFwcGVkIHRvIGluZGljZXMgb2YgYGNoYXJzYCB2aWEgYSBtb2R1bG8gb3BlcmF0aW9uLlxuICAgICAgICAgICAgbi5sZW5ndGggPCAyMCAmJiBzW2ldIDwgZSAmJiAobiArPSB0LmNoYXJBdChzW2ldICUgdC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGl0KHQsIGUpIHtcbiAgICByZXR1cm4gdCA8IGUgPyAtMSA6IHQgPiBlID8gMSA6IDA7XG59XG5cbi8qKiBIZWxwZXIgdG8gY29tcGFyZSBhcnJheXMgdXNpbmcgaXNFcXVhbCgpLiAqLyBmdW5jdGlvbiBydCh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIHQubGVuZ3RoID09PSBlLmxlbmd0aCAmJiB0LmV2ZXJ5KCgodCwgcykgPT4gbih0LCBlW3NdKSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGltbWVkaWF0ZSBsZXhpY29ncmFwaGljYWxseS1mb2xsb3dpbmcgc3RyaW5nLiBUaGlzIGlzIHVzZWZ1bCB0b1xuICogY29uc3RydWN0IGFuIGluY2x1c2l2ZSByYW5nZSBmb3IgaW5kZXhlZGRiIGl0ZXJhdG9ycy5cbiAqLyBmdW5jdGlvbiBvdCh0KSB7XG4gICAgLy8gUmV0dXJuIHRoZSBpbnB1dCBzdHJpbmcsIHdpdGggYW4gYWRkaXRpb25hbCBOVUwgYnl0ZSBhcHBlbmRlZC5cbiAgICByZXR1cm4gdCArIFwiXFwwXCI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBUaGUgZWFybGllc3QgZGF0ZSBzdXBwb3J0ZWQgYnkgRmlyZXN0b3JlIHRpbWVzdGFtcHMgKDAwMDEtMDEtMDFUMDA6MDA6MDBaKS5cbi8qKlxuICogQSBgVGltZXN0YW1wYCByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGltZSBpbmRlcGVuZGVudCBvZiBhbnkgdGltZSB6b25lIG9yXG4gKiBjYWxlbmRhciwgcmVwcmVzZW50ZWQgYXMgc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZFxuICogcmVzb2x1dGlvbiBpbiBVVEMgRXBvY2ggdGltZS5cbiAqXG4gKiBJdCBpcyBlbmNvZGVkIHVzaW5nIHRoZSBQcm9sZXB0aWMgR3JlZ29yaWFuIENhbGVuZGFyIHdoaWNoIGV4dGVuZHMgdGhlXG4gKiBHcmVnb3JpYW4gY2FsZW5kYXIgYmFja3dhcmRzIHRvIHllYXIgb25lLiBJdCBpcyBlbmNvZGVkIGFzc3VtaW5nIGFsbCBtaW51dGVzXG4gKiBhcmUgNjAgc2Vjb25kcyBsb25nLCBpLmUuIGxlYXAgc2Vjb25kcyBhcmUgXCJzbWVhcmVkXCIgc28gdGhhdCBubyBsZWFwIHNlY29uZFxuICogdGFibGUgaXMgbmVlZGVkIGZvciBpbnRlcnByZXRhdGlvbi4gUmFuZ2UgaXMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0b1xuICogOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaLlxuICpcbiAqIEZvciBleGFtcGxlcyBhbmQgZnVydGhlciBzcGVjaWZpY2F0aW9ucywgcmVmZXIgdG8gdGhlXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9ibG9iL21hc3Rlci9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byB8IFRpbWVzdGFtcCBkZWZpbml0aW9ufS5cbiAqL1xuY2xhc3MgYXQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlY29uZHMgLSBUaGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgVVRDIHRpbWUgc2luY2UgVW5peCBlcG9jaFxuICAgICAqICAgICAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvXG4gICAgICogICAgIDk5OTktMTItMzFUMjM6NTk6NTlaIGluY2x1c2l2ZS5cbiAgICAgKiBAcGFyYW0gbmFub3NlY29uZHMgLSBUaGUgbm9uLW5lZ2F0aXZlIGZyYWN0aW9ucyBvZiBhIHNlY29uZCBhdCBuYW5vc2Vjb25kXG4gICAgICogICAgIHJlc29sdXRpb24uIE5lZ2F0aXZlIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlXG4gICAgICogICAgIG5vbi1uZWdhdGl2ZSBuYW5vc2Vjb25kcyB2YWx1ZXMgdGhhdCBjb3VudCBmb3J3YXJkIGluIHRpbWUuIE11c3QgYmVcbiAgICAgKiAgICAgZnJvbSAwIHRvIDk5OSw5OTksOTk5IGluY2x1c2l2ZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgb2YgVVRDIHRpbWUgc2luY2UgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4qXG4gICAgICovXG4gICAgZSkge1xuICAgICAgICBpZiAodGhpcy5zZWNvbmRzID0gdCwgdGhpcy5uYW5vc2Vjb25kcyA9IGUsIGUgPCAwKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIG5hbm9zZWNvbmRzIG91dCBvZiByYW5nZTogXCIgKyBlKTtcbiAgICAgICAgaWYgKGUgPj0gMWU5KSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIG5hbm9zZWNvbmRzIG91dCBvZiByYW5nZTogXCIgKyBlKTtcbiAgICAgICAgaWYgKHQgPCAtNjIxMzU1OTY4MDApIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJUaW1lc3RhbXAgc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgdCk7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBicmVhayBpbiB0aGUgeWVhciAxMCwwMDAuXG4gICAgICAgICAgICAgICAgaWYgKHQgPj0gMjUzNDAyMzAwODAwKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIHNlY29uZHMgb3V0IG9mIHJhbmdlOiBcIiArIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSBjdXJyZW50IGRhdGUsIHdpdGggbWlsbGlzZWNvbmQgcHJlY2lzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYSBuZXcgdGltZXN0YW1wIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqLyAgICBzdGF0aWMgbm93KCkge1xuICAgICAgICByZXR1cm4gYXQuZnJvbU1pbGxpcyhEYXRlLm5vdygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gaW5pdGlhbGl6ZSB0aGUgYFRpbWVzdGFtcGAgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBgVGltZXN0YW1wYCByZXByZXNlbnRpbmcgdGhlIHNhbWUgcG9pbnQgaW4gdGltZSBhcyB0aGUgZ2l2ZW5cbiAgICAgKiAgICAgZGF0ZS5cbiAgICAgKi8gICAgc3RhdGljIGZyb21EYXRlKHQpIHtcbiAgICAgICAgcmV0dXJuIGF0LmZyb21NaWxsaXModC5nZXRUaW1lKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRpbWVzdGFtcCBmcm9tIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgVW5peCBlcG9jaFxuICAgICAqICAgICAxOTcwLTAxLTAxVDAwOjAwOjAwWi5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBgVGltZXN0YW1wYCByZXByZXNlbnRpbmcgdGhlIHNhbWUgcG9pbnQgaW4gdGltZSBhcyB0aGUgZ2l2ZW5cbiAgICAgKiAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICAgKi8gICAgc3RhdGljIGZyb21NaWxsaXModCkge1xuICAgICAgICBjb25zdCBlID0gTWF0aC5mbG9vcih0IC8gMWUzKSwgbiA9IE1hdGguZmxvb3IoMWU2ICogKHQgLSAxZTMgKiBlKSk7XG4gICAgICAgIHJldHVybiBuZXcgYXQoZSwgbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QuIFRoaXMgY29udmVyc2lvblxuICAgICAqIGNhdXNlcyBhIGxvc3Mgb2YgcHJlY2lzaW9uIHNpbmNlIGBEYXRlYCBvYmplY3RzIG9ubHkgc3VwcG9ydCBtaWxsaXNlY29uZFxuICAgICAqIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEphdmFTY3JpcHQgYERhdGVgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNhbWUgcG9pbnQgaW4gdGltZSBhc1xuICAgICAqICAgICB0aGlzIGBUaW1lc3RhbXBgLCB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi5cbiAgICAgKi8gICAgdG9EYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy50b01pbGxpcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBgVGltZXN0YW1wYCB0byBhIG51bWVyaWMgdGltZXN0YW1wIChpbiBtaWxsaXNlY29uZHMgc2luY2VcbiAgICAgKiBlcG9jaCkuIFRoaXMgb3BlcmF0aW9uIGNhdXNlcyBhIGxvc3Mgb2YgcHJlY2lzaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHBvaW50IGluIHRpbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIHRpbWVzdGFtcCwgcmVwcmVzZW50ZWQgYXNcbiAgICAgKiAgICAgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi5cbiAgICAgKi8gICAgdG9NaWxsaXMoKSB7XG4gICAgICAgIHJldHVybiAxZTMgKiB0aGlzLnNlY29uZHMgKyB0aGlzLm5hbm9zZWNvbmRzIC8gMWU2O1xuICAgIH1cbiAgICBfY29tcGFyZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kcyA9PT0gdC5zZWNvbmRzID8gaXQodGhpcy5uYW5vc2Vjb25kcywgdC5uYW5vc2Vjb25kcykgOiBpdCh0aGlzLnNlY29uZHMsIHQuc2Vjb25kcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBUaW1lc3RhbXBgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYFRpbWVzdGFtcGAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgVGltZXN0YW1wYCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuc2Vjb25kcyA9PT0gdGhpcy5zZWNvbmRzICYmIHQubmFub3NlY29uZHMgPT09IHRoaXMubmFub3NlY29uZHM7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBUaW1lc3RhbXBgLiAqLyAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFwiVGltZXN0YW1wKHNlY29uZHM9XCIgKyB0aGlzLnNlY29uZHMgKyBcIiwgbmFub3NlY29uZHM9XCIgKyB0aGlzLm5hbm9zZWNvbmRzICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgVGltZXN0YW1wYC4gKi8gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vjb25kczogdGhpcy5zZWNvbmRzLFxuICAgICAgICAgICAgbmFub3NlY29uZHM6IHRoaXMubmFub3NlY29uZHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBwcmltaXRpdmUgc3RyaW5nLCB3aGljaCBhbGxvd3MgYFRpbWVzdGFtcGAgb2JqZWN0c1xuICAgICAqIHRvIGJlIGNvbXBhcmVkIHVzaW5nIHRoZSBgPmAsIGA8PWAsIGA+PWAgYW5kIGA+YCBvcGVyYXRvcnMuXG4gICAgICovICAgIHZhbHVlT2YoKSB7XG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGZvcm0gPHNlY29uZHM+LjxuYW5vc2Vjb25kcz4gd2hlcmVcbiAgICAgICAgLy8gPHNlY29uZHM+IGlzIHRyYW5zbGF0ZWQgdG8gaGF2ZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhbmQgYm90aCA8c2Vjb25kcz5cbiAgICAgICAgLy8gYW5kIDxuYW5vc2Vjb25kcz4gYXJlIGxlZnQtcGFkZGVkIHdpdGggemVyb2VzIHRvIGJlIGEgY29uc2lzdGVudCBsZW5ndGguXG4gICAgICAgIC8vIFN0cmluZ3Mgd2l0aCB0aGlzIGZvcm1hdCB0aGVuIGhhdmUgYSBsZXhpb2dyYXBoaWNhbCBvcmRlcmluZyB0aGF0IG1hdGNoZXNcbiAgICAgICAgLy8gdGhlIGV4cGVjdGVkIG9yZGVyaW5nLiBUaGUgPHNlY29uZHM+IHRyYW5zbGF0aW9uIGlzIGRvbmUgdG8gYXZvaWQgaGF2aW5nXG4gICAgICAgIC8vIGEgbGVhZGluZyBuZWdhdGl2ZSBzaWduIChpLmUuIGEgbGVhZGluZyAnLScgY2hhcmFjdGVyKSBpbiBpdHMgc3RyaW5nXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB3aGljaCB3b3VsZCBhZmZlY3QgaXRzIGxleGlvZ3JhcGhpY2FsIG9yZGVyaW5nLlxuICAgICAgICBjb25zdCB0ID0gdGhpcy5zZWNvbmRzIC0gLTYyMTM1NTk2ODAwO1xuICAgICAgICAvLyBOb3RlOiBVcCB0byAxMiBkZWNpbWFsIGRpZ2l0cyBhcmUgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGFsbCB2YWxpZFxuICAgICAgICAvLyAnc2Vjb25kcycgdmFsdWVzLlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodCkucGFkU3RhcnQoMTIsIFwiMFwiKSArIFwiLlwiICsgU3RyaW5nKHRoaXMubmFub3NlY29uZHMpLnBhZFN0YXJ0KDksIFwiMFwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGluIEZpcmVzdG9yZS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgdmVyc2lvblxuICogdGltZXN0YW1wLCBzdWNoIGFzIHVwZGF0ZV90aW1lIG9yIHJlYWRfdGltZS5cbiAqLyBjbGFzcyBjdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tVGltZXN0YW1wKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjdCh0KTtcbiAgICB9XG4gICAgc3RhdGljIG1pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjdChuZXcgYXQoMCwgMCkpO1xuICAgIH1cbiAgICBjb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lc3RhbXAuX2NvbXBhcmVUbyh0LnRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lc3RhbXAuaXNFcXVhbCh0LnRpbWVzdGFtcCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgbnVtYmVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uIGZvciB1c2UgaW4gc3BlYyB0ZXN0cy4gKi8gICAgdG9NaWNyb3NlY29uZHMoKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdG8gbWljcm9zZWNvbmRzLlxuICAgICAgICByZXR1cm4gMWU2ICogdGhpcy50aW1lc3RhbXAuc2Vjb25kcyArIHRoaXMudGltZXN0YW1wLm5hbm9zZWNvbmRzIC8gMWUzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFwiU25hcHNob3RWZXJzaW9uKFwiICsgdGhpcy50aW1lc3RhbXAudG9TdHJpbmcoKSArIFwiKVwiO1xuICAgIH1cbiAgICB0b1RpbWVzdGFtcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gdXQodCkge1xuICAgIGxldCBlID0gMDtcbiAgICBmb3IgKGNvbnN0IG4gaW4gdCkgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIGUrKztcbiAgICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gaHQodCwgZSkge1xuICAgIGZvciAoY29uc3QgbiBpbiB0KSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgZShuLCB0W25dKTtcbn1cblxuZnVuY3Rpb24gbHQodCkge1xuICAgIGZvciAoY29uc3QgZSBpbiB0KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIGUpKSByZXR1cm4gITE7XG4gICAgcmV0dXJuICEwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBQYXRoIHJlcHJlc2VudHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBzdHJpbmcgc2VnbWVudHMuXG4gKi9cbmNsYXNzIGZ0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHZvaWQgMCA9PT0gZSA/IGUgPSAwIDogZSA+IHQubGVuZ3RoICYmIEwoKSwgdm9pZCAwID09PSBuID8gbiA9IHQubGVuZ3RoIC0gZSA6IG4gPiB0Lmxlbmd0aCAtIGUgJiYgTCgpLCBcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IHQsIHRoaXMub2Zmc2V0ID0gZSwgdGhpcy5sZW4gPSBuO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW47XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gMCA9PT0gZnQuY29tcGFyYXRvcih0aGlzLCB0KTtcbiAgICB9XG4gICAgY2hpbGQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5zZWdtZW50cy5zbGljZSh0aGlzLm9mZnNldCwgdGhpcy5saW1pdCgpKTtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBmdCA/IHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBlLnB1c2godCk7XG4gICAgICAgIH0pKSA6IGUucHVzaCh0KSwgdGhpcy5jb25zdHJ1Y3QoZSk7XG4gICAgfVxuICAgIC8qKiBUaGUgaW5kZXggb2Ygb25lIHBhc3QgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgcGF0aC4gKi8gICAgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgICBwb3BGaXJzdCh0KSB7XG4gICAgICAgIHJldHVybiB0ID0gdm9pZCAwID09PSB0ID8gMSA6IHQsIHRoaXMuY29uc3RydWN0KHRoaXMuc2VnbWVudHMsIHRoaXMub2Zmc2V0ICsgdCwgdGhpcy5sZW5ndGggLSB0KTtcbiAgICB9XG4gICAgcG9wTGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0KHRoaXMuc2VnbWVudHMsIHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmaXJzdFNlZ21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzW3RoaXMub2Zmc2V0XTtcbiAgICB9XG4gICAgbGFzdFNlZ21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBnZXQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50c1t0aGlzLm9mZnNldCArIHRdO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gMCA9PT0gdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIGlzUHJlZml4T2YodCkge1xuICAgICAgICBpZiAodC5sZW5ndGggPCB0aGlzLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IHRoaXMubGVuZ3RoOyBlKyspIGlmICh0aGlzLmdldChlKSAhPT0gdC5nZXQoZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBpc0ltbWVkaWF0ZVBhcmVudE9mKHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICsgMSAhPT0gdC5sZW5ndGgpIHJldHVybiAhMTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0aGlzLmxlbmd0aDsgZSsrKSBpZiAodGhpcy5nZXQoZSkgIT09IHQuZ2V0KGUpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIGZvciAobGV0IGUgPSB0aGlzLm9mZnNldCwgbiA9IHRoaXMubGltaXQoKTsgZSA8IG47IGUrKykgdCh0aGlzLnNlZ21lbnRzW2VdKTtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMubGltaXQoKSk7XG4gICAgfVxuICAgIHN0YXRpYyBjb21wYXJhdG9yKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IE1hdGgubWluKHQubGVuZ3RoLCBlLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgbjsgcysrKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5nZXQocyksIGkgPSBlLmdldChzKTtcbiAgICAgICAgICAgIGlmIChuIDwgaSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKG4gPiBpKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdC5sZW5ndGggPCBlLmxlbmd0aCA/IC0xIDogdC5sZW5ndGggPiBlLmxlbmd0aCA/IDEgOiAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHNsYXNoLXNlcGFyYXRlZCBwYXRoIGZvciBuYXZpZ2F0aW5nIHJlc291cmNlcyAoZG9jdW1lbnRzIGFuZCBjb2xsZWN0aW9ucylcbiAqIHdpdGhpbiBGaXJlc3RvcmUuXG4gKlxuICogQGludGVybmFsXG4gKi8gY2xhc3MgZHQgZXh0ZW5kcyBmdCB7XG4gICAgY29uc3RydWN0KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdCh0LCBlLCBuKTtcbiAgICB9XG4gICAgY2Fub25pY2FsU3RyaW5nKCkge1xuICAgICAgICAvLyBOT1RFOiBUaGUgY2xpZW50IGlzIGlnbm9yYW50IG9mIGFueSBwYXRoIHNlZ21lbnRzIGNvbnRhaW5pbmcgZXNjYXBlXG4gICAgICAgIC8vIHNlcXVlbmNlcyAoZS5nLiBfX2lkMTIzX18pIGFuZCBqdXN0IHBhc3NlcyB0aGVtIHRocm91Z2ggcmF3ICh0aGV5IGV4aXN0XG4gICAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZyZXF1ZW50bHkpLlxuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KCkuam9pbihcIi9cIik7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlc291cmNlIHBhdGggZnJvbSB0aGUgZ2l2ZW4gc2xhc2gtZGVsaW1pdGVkIHN0cmluZy4gSWYgbXVsdGlwbGVcbiAgICAgKiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBhbGwgY29tcG9uZW50cyBhcmUgY29tYmluZWQuIExlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICAgICogc2xhc2hlcyBmcm9tIGFsbCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVN0cmluZyguLi50KSB7XG4gICAgICAgIC8vIE5PVEU6IFRoZSBjbGllbnQgaXMgaWdub3JhbnQgb2YgYW55IHBhdGggc2VnbWVudHMgY29udGFpbmluZyBlc2NhcGVcbiAgICAgICAgLy8gc2VxdWVuY2VzIChlLmcuIF9faWQxMjNfXykgYW5kIGp1c3QgcGFzc2VzIHRoZW0gdGhyb3VnaCByYXcgKHRoZXkgZXhpc3RcbiAgICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJlcXVlbnRseSkuXG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQpIHtcbiAgICAgICAgICAgIGlmIChuLmluZGV4T2YoXCIvL1wiKSA+PSAwKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHNlZ21lbnQgKCR7bn0pLiBQYXRocyBtdXN0IG5vdCBjb250YWluIC8vIGluIHRoZW0uYCk7XG4gICAgICAgICAgICAvLyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFsaW5nIHNsYXNoZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goLi4ubi5zcGxpdChcIi9cIikuZmlsdGVyKCh0ID0+IHQubGVuZ3RoID4gMCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IGR0KGUpO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHlQYXRoKCkge1xuICAgICAgICByZXR1cm4gbmV3IGR0KFtdKTtcbiAgICB9XG59XG5cbmNvbnN0IHd0ID0gL15bX2EtekEtWl1bX2EtekEtWjAtOV0qJC87XG5cbi8qKlxuICogQSBkb3Qtc2VwYXJhdGVkIHBhdGggZm9yIG5hdmlnYXRpbmcgc3ViLW9iamVjdHMgd2l0aGluIGEgZG9jdW1lbnQuXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBfdCBleHRlbmRzIGZ0IHtcbiAgICBjb25zdHJ1Y3QodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3IF90KHQsIGUsIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBjb3VsZCBiZSB1c2VkIGFzIGEgc2VnbWVudCBpbiBhIGZpZWxkIHBhdGhcbiAgICAgKiB3aXRob3V0IGVzY2FwaW5nLlxuICAgICAqLyAgICBzdGF0aWMgaXNWYWxpZElkZW50aWZpZXIodCkge1xuICAgICAgICByZXR1cm4gd3QudGVzdCh0KTtcbiAgICB9XG4gICAgY2Fub25pY2FsU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KCkubWFwKCh0ID0+ICh0ID0gdC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvYC9nLCBcIlxcXFxgXCIpLCBcbiAgICAgICAgX3QuaXNWYWxpZElkZW50aWZpZXIodCkgfHwgKHQgPSBcImBcIiArIHQgKyBcImBcIiksIHQpKSkuam9pbihcIi5cIik7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmllbGQgcmVmZXJlbmNlcyB0aGUga2V5IG9mIGEgZG9jdW1lbnQuXG4gICAgICovICAgIGlzS2V5RmllbGQoKSB7XG4gICAgICAgIHJldHVybiAxID09PSB0aGlzLmxlbmd0aCAmJiBcIl9fbmFtZV9fXCIgPT09IHRoaXMuZ2V0KDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgZGVzaWduYXRpbmcgdGhlIGtleSBvZiBhIGRvY3VtZW50LlxuICAgICAqLyAgICBzdGF0aWMga2V5RmllbGQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgX3QoWyBcIl9fbmFtZV9fXCIgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGZpZWxkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBzZXJ2ZXItZm9ybWF0dGVkIHN0cmluZy5cbiAgICAgKlxuICAgICAqIC0gU3BsaXR0aW5nIHRoZSBlbXB0eSBzdHJpbmcgaXMgbm90IGFsbG93ZWQgKGZvciBub3cgYXQgbGVhc3QpLlxuICAgICAqIC0gRW1wdHkgc2VnbWVudHMgd2l0aGluIHRoZSBzdHJpbmcgKGUuZy4gaWYgdGhlcmUgYXJlIHR3byBjb25zZWN1dGl2ZVxuICAgICAqICAgc2VwYXJhdG9ycykgYXJlIG5vdCBhbGxvd2VkLlxuICAgICAqXG4gICAgICogVE9ETyhiLzM3MjQ0MTU3KTogd2Ugc2hvdWxkIG1ha2UgdGhpcyBtb3JlIHN0cmljdC4gUmlnaHQgbm93LCBpdCBhbGxvd3NcbiAgICAgKiBub24taWRlbnRpZmllciBwYXRoIGNvbXBvbmVudHMsIGV2ZW4gaWYgdGhleSBhcmVuJ3QgZXNjYXBlZC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21TZXJ2ZXJGb3JtYXQodCkge1xuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGxldCBuID0gXCJcIiwgcyA9IDA7XG4gICAgICAgIGNvbnN0IGkgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gbi5sZW5ndGgpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgZmllbGQgcGF0aCAoJHt0fSkuIFBhdGhzIG11c3Qgbm90IGJlIGVtcHR5LCBiZWdpbiB3aXRoICcuJywgZW5kIHdpdGggJy4nLCBvciBjb250YWluICcuLidgKTtcbiAgICAgICAgICAgIGUucHVzaChuKSwgbiA9IFwiXCI7XG4gICAgICAgIH07XG4gICAgICAgIGxldCByID0gITE7XG4gICAgICAgIGZvciAoO3MgPCB0Lmxlbmd0aDsgKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdFtzXTtcbiAgICAgICAgICAgIGlmIChcIlxcXFxcIiA9PT0gZSkge1xuICAgICAgICAgICAgICAgIGlmIChzICsgMSA9PT0gdC5sZW5ndGgpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJQYXRoIGhhcyB0cmFpbGluZyBlc2NhcGUgY2hhcmFjdGVyOiBcIiArIHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0W3MgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoXCJcXFxcXCIgIT09IGUgJiYgXCIuXCIgIT09IGUgJiYgXCJgXCIgIT09IGUpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJQYXRoIGhhcyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZTogXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBuICs9IGUsIHMgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBcImBcIiA9PT0gZSA/IChyID0gIXIsIHMrKykgOiBcIi5cIiAhPT0gZSB8fCByID8gKG4gKz0gZSwgcysrKSA6IChpKCksIHMrKyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkoKSwgcikgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcIlVudGVybWluYXRlZCBgIGluIHBhdGg6IFwiICsgdCk7XG4gICAgICAgIHJldHVybiBuZXcgX3QoZSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBuZXcgX3QoW10pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgZmllbGRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFydGlhbGx5IHBhdGNoIGEgZG9jdW1lbnQuXG4gKiBGaWVsZE1hc2sgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIE9iamVjdFZhbHVlLlxuICogRXhhbXBsZXM6XG4gKiAgIGZvbyAtIE92ZXJ3cml0ZXMgZm9vIGVudGlyZWx5IHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLiBJZiBmb28gaXMgbm90XG4gKiAgICAgICAgIHByZXNlbnQgaW4gdGhlIGNvbXBhbmlvbiBPYmplY3RWYWx1ZSwgdGhlIGZpZWxkIGlzIGRlbGV0ZWQuXG4gKiAgIGZvby5iYXIgLSBPdmVyd3JpdGVzIG9ubHkgdGhlIGZpZWxkIGJhciBvZiB0aGUgb2JqZWN0IGZvby5cbiAqICAgICAgICAgICAgIElmIGZvbyBpcyBub3QgYW4gb2JqZWN0LCBmb28gaXMgcmVwbGFjZWQgd2l0aCBhbiBvYmplY3RcbiAqICAgICAgICAgICAgIGNvbnRhaW5pbmcgZm9vXG4gKi8gY2xhc3MgbXQge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5maWVsZHMgPSB0LCBcbiAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiB2YWxpZGF0aW9uIG9mIEZpZWxkTWFza1xuICAgICAgICAvLyBTb3J0IHRoZSBmaWVsZCBtYXNrIHRvIHN1cHBvcnQgYEZpZWxkTWFzay5pc0VxdWFsKClgIGFuZCBhc3NlcnQgYmVsb3cuXG4gICAgICAgIHQuc29ydChfdC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCBgZmllbGRQYXRoYCBpcyBpbmNsdWRlZCBieSBhdCBsZWFzdCBvbmUgZmllbGQgaW4gdGhpcyBmaWVsZFxuICAgICAqIG1hc2suXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIE8obikgb3BlcmF0aW9uLCB3aGVyZSBgbmAgaXMgdGhlIHNpemUgb2YgdGhlIGZpZWxkIG1hc2suXG4gICAgICovICAgIGNvdmVycyh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmZpZWxkcykgaWYgKGUuaXNQcmVmaXhPZih0KSkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gcnQodGhpcy5maWVsZHMsIHQuZmllbGRzLCAoKHQsIGUpID0+IHQuaXNFcXVhbChlKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBDb252ZXJ0cyBhIEJhc2U2NCBlbmNvZGVkIHN0cmluZyB0byBhIGJpbmFyeSBzdHJpbmcuICovXG4vKiogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgQmFzZTY0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuICovXG5mdW5jdGlvbiBndCgpIHtcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgYXRvYjtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSW1tdXRhYmxlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIFwicHJvdG9cIiBieXRlIHN0cmluZy5cbiAqXG4gKiBQcm90byBieXRlIHN0cmluZ3MgY2FuIGVpdGhlciBiZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmdzIG9yIFVpbnQ4QXJyYXlzIHdoZW5cbiAqIHNlbnQgb24gdGhlIHdpcmUuIFRoaXMgY2xhc3MgYWJzdHJhY3RzIGF3YXkgdGhpcyBkaWZmZXJlbnRpYXRpb24gYnkgaG9sZGluZ1xuICogdGhlIHByb3RvIGJ5dGUgc3RyaW5nIGluIGEgY29tbW9uIGNsYXNzIHRoYXQgbXVzdCBiZSBjb252ZXJ0ZWQgaW50byBhIHN0cmluZ1xuICogYmVmb3JlIGJlaW5nIHNlbnQgYXMgYSBwcm90by5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIHl0IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuYmluYXJ5U3RyaW5nID0gdDtcbiAgICB9XG4gICAgc3RhdGljIGZyb21CYXNlNjRTdHJpbmcodCkge1xuICAgICAgICBjb25zdCBlID0gYXRvYih0KTtcbiAgICAgICAgcmV0dXJuIG5ldyB5dChlKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21VaW50OEFycmF5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGFuIFVpbnQ4YXJyYXkgdG8gYSBiaW5hcnkgc3RyaW5nLlxuICovXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbikgZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRbbl0pO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIGJpbmFyeSBzdHJpbmcgdG8gYW4gVWludDhBcnJheS5cbiAqLyAodCk7XG4gICAgICAgIHJldHVybiBuZXcgeXQoZSk7XG4gICAgfVxuICAgIHRvQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gdCA9IHRoaXMuYmluYXJ5U3RyaW5nLCBidG9hKHQpO1xuICAgICAgICAvKiogQ29udmVydHMgYSBiaW5hcnkgc3RyaW5nIHRvIGEgQmFzZTY0IGVuY29kZWQgc3RyaW5nLiAqL1xuICAgICAgICB2YXIgdDtcbiAgICB9XG4gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgZVtuXSA9IHQuY2hhckNvZGVBdChuKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgICAgIC8vIEEgUmVnRXhwIG1hdGNoaW5nIElTTyA4NjAxIFVUQyB0aW1lc3RhbXBzIHdpdGggb3B0aW9uYWwgZnJhY3Rpb24uXG4gICAgICAgICh0aGlzLmJpbmFyeVN0cmluZyk7XG4gICAgfVxuICAgIGFwcHJveGltYXRlQnl0ZVNpemUoKSB7XG4gICAgICAgIHJldHVybiAyICogdGhpcy5iaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gaXQodGhpcy5iaW5hcnlTdHJpbmcsIHQuYmluYXJ5U3RyaW5nKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVN0cmluZyA9PT0gdC5iaW5hcnlTdHJpbmc7XG4gICAgfVxufVxuXG55dC5FTVBUWV9CWVRFX1NUUklORyA9IG5ldyB5dChcIlwiKTtcblxuY29uc3QgcHQgPSBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZFxcZC1cXGRcXGRUXFxkXFxkOlxcZFxcZDpcXGRcXGQoPzpcXC4oXFxkKykpP1okLyk7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHZhbHVlcyBmb3IgYSB0aW1lc3RhbXAgdmFsdWUgaW50byBhIFwic2Vjb25kcyBhbmRcbiAqIG5hbm9zXCIgcmVwcmVzZW50YXRpb24uXG4gKi8gZnVuY3Rpb24gVHQodCkge1xuICAgIC8vIFRoZSBqc29uIGludGVyZmFjZSAoZm9yIHRoZSBicm93c2VyKSB3aWxsIHJldHVybiBhbiBpc28gdGltZXN0YW1wIHN0cmluZyxcbiAgICAvLyB3aGlsZSB0aGUgcHJvdG8ganMgbGlicmFyeSAoZm9yIG5vZGUpIHdpbGwgcmV0dXJuIGFcbiAgICAvLyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGluc3RhbmNlLlxuICAgIGlmIChCKCEhdCksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgLy8gVGhlIGRhdGUgc3RyaW5nIGNhbiBoYXZlIGhpZ2hlciBwcmVjaXNpb24gKG5hbm9zKSB0aGFuIHRoZSBEYXRlIGNsYXNzXG4gICAgICAgIC8vIChtaWxsaXMpLCBzbyB3ZSBkbyBzb21lIGN1c3RvbSBwYXJzaW5nIGhlcmUuXG4gICAgICAgIC8vIFBhcnNlIHRoZSBuYW5vcyByaWdodCBvdXQgb2YgdGhlIHN0cmluZy5cbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICBjb25zdCBuID0gcHQuZXhlYyh0KTtcbiAgICAgICAgaWYgKEIoISFuKSwgblsxXSkge1xuICAgICAgICAgICAgLy8gUGFkIHRoZSBmcmFjdGlvbiBvdXQgdG8gOSBkaWdpdHMgKG5hbm9zKS5cbiAgICAgICAgICAgIGxldCB0ID0gblsxXTtcbiAgICAgICAgICAgIHQgPSAodCArIFwiMDAwMDAwMDAwXCIpLnN1YnN0cigwLCA5KSwgZSA9IE51bWJlcih0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSB0aGUgZGF0ZSB0byBnZXQgdGhlIHNlY29uZHMuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBEYXRlKHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2Vjb25kczogTWF0aC5mbG9vcihzLmdldFRpbWUoKSAvIDFlMyksXG4gICAgICAgICAgICBuYW5vczogZVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBFdCh0LnNlY29uZHMpLFxuICAgICAgICBuYW5vczogRXQodC5uYW5vcylcbiAgICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBwb3NzaWJsZSBQcm90byB0eXBlcyBmb3IgbnVtYmVycyBpbnRvIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gKiBSZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIG5vdCBudW1lcmljLlxuICovIGZ1bmN0aW9uIEV0KHQpIHtcbiAgICAvLyBUT0RPKGJqb3JuaWNrKTogSGFuZGxlIGludDY0IGdyZWF0ZXIgdGhhbiA1MyBiaXRzLlxuICAgIHJldHVybiBcIm51bWJlclwiID09IHR5cGVvZiB0ID8gdCA6IFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyBOdW1iZXIodCkgOiAwO1xufVxuXG4vKiogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHR5cGVzIGZvciBCbG9icyBpbnRvIGEgQnl0ZVN0cmluZy4gKi8gZnVuY3Rpb24gSXQodCkge1xuICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ID8geXQuZnJvbUJhc2U2NFN0cmluZyh0KSA6IHl0LmZyb21VaW50OEFycmF5KHQpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgbG9jYWxseS1hcHBsaWVkIFNlcnZlclRpbWVzdGFtcC5cbiAqXG4gKiBTZXJ2ZXIgVGltZXN0YW1wcyBhcmUgYmFja2VkIGJ5IE1hcFZhbHVlcyB0aGF0IGNvbnRhaW4gYW4gaW50ZXJuYWwgZmllbGRcbiAqIGBfX3R5cGVfX2Agd2l0aCBhIHZhbHVlIG9mIGBzZXJ2ZXJfdGltZXN0YW1wYC4gVGhlIHByZXZpb3VzIHZhbHVlIGFuZCBsb2NhbFxuICogd3JpdGUgdGltZSBhcmUgc3RvcmVkIGluIGl0cyBgX19wcmV2aW91c192YWx1ZV9fYCBhbmQgYF9fbG9jYWxfd3JpdGVfdGltZV9fYFxuICogZmllbGRzIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gU2VydmVyVGltZXN0YW1wVmFsdWUgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYVxuICogICB0cmFuc2Zvcm0uIFRoZXkgY2FuIG9ubHkgZXhpc3QgaW4gdGhlIGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gVGhlcmVmb3JlXG4gKiAgIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgcGFyc2VkIG9yIHNlcmlhbGl6ZWQuXG4gKiAtIFdoZW4gZXZhbHVhdGVkIGxvY2FsbHkgKGUuZy4gZm9yIHNuYXBzaG90LmRhdGEoKSksIHRoZXkgYnkgZGVmYXVsdFxuICogICBldmFsdWF0ZSB0byBgbnVsbGAuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgcGFzc2luZyBjdXN0b21cbiAqICAgRmllbGRWYWx1ZU9wdGlvbnMgdG8gdmFsdWUoKS5cbiAqIC0gV2l0aCByZXNwZWN0IHRvIG90aGVyIFNlcnZlclRpbWVzdGFtcFZhbHVlcywgdGhleSBzb3J0IGJ5IHRoZWlyXG4gKiAgIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIEF0KHQpIHtcbiAgICB2YXIgZSwgbjtcbiAgICByZXR1cm4gXCJzZXJ2ZXJfdGltZXN0YW1wXCIgPT09IChudWxsID09PSAobiA9ICgobnVsbCA9PT0gKGUgPSBudWxsID09IHQgPyB2b2lkIDAgOiB0Lm1hcFZhbHVlKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLmZpZWxkcykgfHwge30pLl9fdHlwZV9fKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnN0cmluZ1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFNlcnZlclRpbWVzdGFtcCBwcm90byB2YWx1ZSAodXNpbmcgdGhlIGludGVybmFsIGZvcm1hdCkuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGJlZm9yZSB0aGlzIFNlcnZlclRpbWVzdGFtcCB3YXMgc2V0LlxuICpcbiAqIFByZXNlcnZpbmcgdGhlIHByZXZpb3VzIHZhbHVlcyBhbGxvd3MgdGhlIHVzZXIgdG8gZGlzcGxheSB0aGUgbGFzdCByZXNvbGVkXG4gKiB2YWx1ZSB1bnRpbCB0aGUgYmFja2VuZCByZXNwb25kcyB3aXRoIHRoZSB0aW1lc3RhbXAuXG4gKi9cbmZ1bmN0aW9uIFJ0KHQpIHtcbiAgICBjb25zdCBlID0gdC5tYXBWYWx1ZS5maWVsZHMuX19wcmV2aW91c192YWx1ZV9fO1xuICAgIHJldHVybiBBdChlKSA/IFJ0KGUpIDogZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoaXMgdGltZXN0YW1wIHdhcyBmaXJzdCBzZXQuXG4gKi8gZnVuY3Rpb24gUHQodCkge1xuICAgIGNvbnN0IGUgPSBUdCh0Lm1hcFZhbHVlLmZpZWxkcy5fX2xvY2FsX3dyaXRlX3RpbWVfXy50aW1lc3RhbXBWYWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBhdChlLnNlY29uZHMsIGUubmFub3MpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFNlbnRpbmVsIHZhbHVlIHRoYXQgc29ydHMgYmVmb3JlIGFueSBNdXRhdGlvbiBCYXRjaCBJRC4gKi9cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZWl0aGVyIHVuZGVmaW5lZCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBidCh0KSB7XG4gICAgcmV0dXJuIG51bGwgPT0gdDtcbn1cblxuLyoqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgcmVwcmVzZW50cyAtMC4gKi8gZnVuY3Rpb24gdnQodCkge1xuICAgIC8vIERldGVjdCBpZiB0aGUgdmFsdWUgaXMgLTAuMC4gQmFzZWQgb24gcG9seWZpbGwgZnJvbVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgIHJldHVybiAwID09PSB0ICYmIDEgLyB0ID09IC0xIC8gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGFuZCBpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdCBmb3IgYmVpbmcgYW4gaW50ZWdlciBhbmQgaW4gdGhlIHNhZmUgcmFuZ2VcbiAqLyBmdW5jdGlvbiBWdCh0KSB7XG4gICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgJiYgTnVtYmVyLmlzSW50ZWdlcih0KSAmJiAhdnQodCkgJiYgdCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiB0ID49IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBTdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBhdGggPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVBhdGgodCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0KGR0LmZyb21TdHJpbmcodCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5hbWUodCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0KGR0LmZyb21TdHJpbmcodCkucG9wRmlyc3QoNSkpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkb2N1bWVudCBpcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25JZC4gKi8gICAgaGFzQ29sbGVjdGlvbklkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5sZW5ndGggPj0gMiAmJiB0aGlzLnBhdGguZ2V0KHRoaXMucGF0aC5sZW5ndGggLSAyKSA9PT0gdDtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmIDAgPT09IGR0LmNvbXBhcmF0b3IodGhpcy5wYXRoLCB0LnBhdGgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgY29tcGFyYXRvcih0LCBlKSB7XG4gICAgICAgIHJldHVybiBkdC5jb21wYXJhdG9yKHQucGF0aCwgZS5wYXRoKTtcbiAgICB9XG4gICAgc3RhdGljIGlzRG9jdW1lbnRLZXkodCkge1xuICAgICAgICByZXR1cm4gdC5sZW5ndGggJSAyID09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgZG9jdW1lbnQga2V5IHdpdGggdGhlIGdpdmVuIHNlZ21lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIG9mIHRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIERvY3VtZW50S2V5XG4gICAgICovICAgIHN0YXRpYyBmcm9tU2VnbWVudHModCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0KG5ldyBkdCh0LnNsaWNlKCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogRXh0cmFjdHMgdGhlIGJhY2tlbmQncyB0eXBlIG9yZGVyIGZvciB0aGUgcHJvdmlkZWQgdmFsdWUuICovIGZ1bmN0aW9uIER0KHQpIHtcbiAgICByZXR1cm4gXCJudWxsVmFsdWVcIiBpbiB0ID8gMCAvKiBOdWxsVmFsdWUgKi8gOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyAxIC8qIEJvb2xlYW5WYWx1ZSAqLyA6IFwiaW50ZWdlclZhbHVlXCIgaW4gdCB8fCBcImRvdWJsZVZhbHVlXCIgaW4gdCA/IDIgLyogTnVtYmVyVmFsdWUgKi8gOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IDMgLyogVGltZXN0YW1wVmFsdWUgKi8gOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IDUgLyogU3RyaW5nVmFsdWUgKi8gOiBcImJ5dGVzVmFsdWVcIiBpbiB0ID8gNiAvKiBCbG9iVmFsdWUgKi8gOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gdCA/IDcgLyogUmVmVmFsdWUgKi8gOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8gOCAvKiBHZW9Qb2ludFZhbHVlICovIDogXCJhcnJheVZhbHVlXCIgaW4gdCA/IDkgLyogQXJyYXlWYWx1ZSAqLyA6IFwibWFwVmFsdWVcIiBpbiB0ID8gQXQodCkgPyA0IC8qIFNlcnZlclRpbWVzdGFtcFZhbHVlICovIDogMTAgLyogT2JqZWN0VmFsdWUgKi8gOiBMKCk7XG59XG5cbi8qKiBUZXN0cyBgbGVmdGAgYW5kIGByaWdodGAgZm9yIGVxdWFsaXR5IGJhc2VkIG9uIHRoZSBiYWNrZW5kIHNlbWFudGljcy4gKi8gZnVuY3Rpb24gQ3QodCwgZSkge1xuICAgIGNvbnN0IG4gPSBEdCh0KTtcbiAgICBpZiAobiAhPT0gRHQoZSkpIHJldHVybiAhMTtcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgMCAvKiBOdWxsVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gITA7XG5cbiAgICAgIGNhc2UgMSAvKiBCb29sZWFuVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gdC5ib29sZWFuVmFsdWUgPT09IGUuYm9vbGVhblZhbHVlO1xuXG4gICAgICBjYXNlIDQgLyogU2VydmVyVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gUHQodCkuaXNFcXVhbChQdChlKSk7XG5cbiAgICAgIGNhc2UgMyAvKiBUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdC50aW1lc3RhbXBWYWx1ZSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBlLnRpbWVzdGFtcFZhbHVlICYmIHQudGltZXN0YW1wVmFsdWUubGVuZ3RoID09PSBlLnRpbWVzdGFtcFZhbHVlLmxlbmd0aCkgXG4gICAgICAgICAgICAvLyBVc2Ugc3RyaW5nIGVxdWFsaXR5IGZvciBJU08gODYwMSB0aW1lc3RhbXBzXG4gICAgICAgICAgICByZXR1cm4gdC50aW1lc3RhbXBWYWx1ZSA9PT0gZS50aW1lc3RhbXBWYWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBUdCh0LnRpbWVzdGFtcFZhbHVlKSwgcyA9IFR0KGUudGltZXN0YW1wVmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG4uc2Vjb25kcyA9PT0gcy5zZWNvbmRzICYmIG4ubmFub3MgPT09IHMubmFub3M7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgNSAvKiBTdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiB0LnN0cmluZ1ZhbHVlID09PSBlLnN0cmluZ1ZhbHVlO1xuXG4gICAgICBjYXNlIDYgLyogQmxvYlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBJdCh0LmJ5dGVzVmFsdWUpLmlzRXF1YWwoSXQoZS5ieXRlc1ZhbHVlKSk7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgNyAvKiBSZWZWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiB0LnJlZmVyZW5jZVZhbHVlID09PSBlLnJlZmVyZW5jZVZhbHVlO1xuXG4gICAgICBjYXNlIDggLyogR2VvUG9pbnRWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gRXQodC5nZW9Qb2ludFZhbHVlLmxhdGl0dWRlKSA9PT0gRXQoZS5nZW9Qb2ludFZhbHVlLmxhdGl0dWRlKSAmJiBFdCh0Lmdlb1BvaW50VmFsdWUubG9uZ2l0dWRlKSA9PT0gRXQoZS5nZW9Qb2ludFZhbHVlLmxvbmdpdHVkZSk7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgMiAvKiBOdW1iZXJWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBpZiAoXCJpbnRlZ2VyVmFsdWVcIiBpbiB0ICYmIFwiaW50ZWdlclZhbHVlXCIgaW4gZSkgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlKSA9PT0gRXQoZS5pbnRlZ2VyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKFwiZG91YmxlVmFsdWVcIiBpbiB0ICYmIFwiZG91YmxlVmFsdWVcIiBpbiBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IEV0KHQuZG91YmxlVmFsdWUpLCBzID0gRXQoZS5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gPT09IHMgPyB2dChuKSA9PT0gdnQocykgOiBpc05hTihuKSAmJiBpc05hTihzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA5IC8qIEFycmF5VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gcnQodC5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSwgZS5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSwgQ3QpO1xuXG4gICAgICBjYXNlIDEwIC8qIE9iamVjdFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0Lm1hcFZhbHVlLmZpZWxkcyB8fCB7fSwgcyA9IGUubWFwVmFsdWUuZmllbGRzIHx8IHt9O1xuICAgICAgICAgICAgaWYgKHV0KG4pICE9PSB1dChzKSkgcmV0dXJuICExO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IGluIG4pIGlmIChuLmhhc093blByb3BlcnR5KHQpICYmICh2b2lkIDAgPT09IHNbdF0gfHwgIUN0KG5bdF0sIHNbdF0pKSkgcmV0dXJuICExO1xuICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFycmF5VmFsdWUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LiAqLyAodCwgZSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBMKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBOdCh0LCBlKSB7XG4gICAgcmV0dXJuIHZvaWQgMCAhPT0gKHQudmFsdWVzIHx8IFtdKS5maW5kKCh0ID0+IEN0KHQsIGUpKSk7XG59XG5cbmZ1bmN0aW9uIGt0KHQsIGUpIHtcbiAgICBjb25zdCBuID0gRHQodCksIHMgPSBEdChlKTtcbiAgICBpZiAobiAhPT0gcykgcmV0dXJuIGl0KG4sIHMpO1xuICAgIHN3aXRjaCAobikge1xuICAgICAgY2FzZSAwIC8qIE51bGxWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiAwO1xuXG4gICAgICBjYXNlIDEgLyogQm9vbGVhblZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGl0KHQuYm9vbGVhblZhbHVlLCBlLmJvb2xlYW5WYWx1ZSk7XG5cbiAgICAgIGNhc2UgMiAvKiBOdW1iZXJWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gRXQodC5pbnRlZ2VyVmFsdWUgfHwgdC5kb3VibGVWYWx1ZSksIHMgPSBFdChlLmludGVnZXJWYWx1ZSB8fCBlLmRvdWJsZVZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuIDwgcyA/IC0xIDogbiA+IHMgPyAxIDogbiA9PT0gcyA/IDAgOiBcbiAgICAgICAgICAgIC8vIG9uZSBvciBib3RoIGFyZSBOYU4uXG4gICAgICAgICAgICBpc05hTihuKSA/IGlzTmFOKHMpID8gMCA6IC0xIDogMTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSAzIC8qIFRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHh0KHQudGltZXN0YW1wVmFsdWUsIGUudGltZXN0YW1wVmFsdWUpO1xuXG4gICAgICBjYXNlIDQgLyogU2VydmVyVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4geHQoUHQodCksIFB0KGUpKTtcblxuICAgICAgY2FzZSA1IC8qIFN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGl0KHQuc3RyaW5nVmFsdWUsIGUuc3RyaW5nVmFsdWUpO1xuXG4gICAgICBjYXNlIDYgLyogQmxvYlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBJdCh0KSwgcyA9IEl0KGUpO1xuICAgICAgICAgICAgcmV0dXJuIG4uY29tcGFyZVRvKHMpO1xuICAgICAgICB9KHQuYnl0ZXNWYWx1ZSwgZS5ieXRlc1ZhbHVlKTtcblxuICAgICAgY2FzZSA3IC8qIFJlZlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnNwbGl0KFwiL1wiKSwgcyA9IGUuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBuLmxlbmd0aCAmJiB0IDwgcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBpdChuW3RdLCBzW3RdKTtcbiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gZSkgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXQobi5sZW5ndGgsIHMubGVuZ3RoKTtcbiAgICAgICAgfSh0LnJlZmVyZW5jZVZhbHVlLCBlLnJlZmVyZW5jZVZhbHVlKTtcblxuICAgICAgY2FzZSA4IC8qIEdlb1BvaW50VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGl0KEV0KHQubGF0aXR1ZGUpLCBFdChlLmxhdGl0dWRlKSk7XG4gICAgICAgICAgICBpZiAoMCAhPT0gbikgcmV0dXJuIG47XG4gICAgICAgICAgICByZXR1cm4gaXQoRXQodC5sb25naXR1ZGUpLCBFdChlLmxvbmdpdHVkZSkpO1xuICAgICAgICB9KHQuZ2VvUG9pbnRWYWx1ZSwgZS5nZW9Qb2ludFZhbHVlKTtcblxuICAgICAgY2FzZSA5IC8qIEFycmF5VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQudmFsdWVzIHx8IFtdLCBzID0gZS52YWx1ZXMgfHwgW107XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IG4ubGVuZ3RoICYmIHQgPCBzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGt0KG5bdF0sIHNbdF0pO1xuICAgICAgICAgICAgICAgIGlmIChlKSByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdChuLmxlbmd0aCwgcy5sZW5ndGgpO1xuICAgICAgICB9KHQuYXJyYXlWYWx1ZSwgZS5hcnJheVZhbHVlKTtcblxuICAgICAgY2FzZSAxMCAvKiBPYmplY3RWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5maWVsZHMgfHwge30sIHMgPSBPYmplY3Qua2V5cyhuKSwgaSA9IGUuZmllbGRzIHx8IHt9LCByID0gT2JqZWN0LmtleXMoaSk7XG4gICAgICAgICAgICAvLyBFdmVuIHRob3VnaCBNYXBWYWx1ZXMgYXJlIGxpa2VseSBzb3J0ZWQgY29ycmVjdGx5IGJhc2VkIG9uIHRoZWlyIGluc2VydGlvblxuICAgICAgICAgICAgLy8gb3JkZXIgKGUuZy4gd2hlbiByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kKSwgbG9jYWwgbW9kaWZpY2F0aW9ucyBjYW4gYnJpbmdcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIG91dCBvZiBvcmRlci4gV2UgbmVlZCB0byByZS1zb3J0IHRoZSBlbGVtZW50cyB0byBlbnN1cmUgdGhhdFxuICAgICAgICAgICAgLy8gY2Fub25pY2FsIElEcyBhcmUgaW5kZXBlbmRlbnQgb2YgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAgICAgICAgcy5zb3J0KCksIHIuc29ydCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBzLmxlbmd0aCAmJiB0IDwgci5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBpdChzW3RdLCByW3RdKTtcbiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gZSkgcmV0dXJuIGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IGt0KG5bc1t0XV0sIGlbclt0XV0pO1xuICAgICAgICAgICAgICAgIGlmICgwICE9PSBvKSByZXR1cm4gbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdChzLmxlbmd0aCwgci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogR2VuZXJhdGVzIHRoZSBjYW5vbmljYWwgSUQgZm9yIHRoZSBwcm92aWRlZCBmaWVsZCB2YWx1ZSAoYXMgdXNlZCBpbiBUYXJnZXRcbiAqIHNlcmlhbGl6YXRpb24pLlxuICovICh0Lm1hcFZhbHVlLCBlLm1hcFZhbHVlKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24geHQodCwgZSkge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgJiYgdC5sZW5ndGggPT09IGUubGVuZ3RoKSByZXR1cm4gaXQodCwgZSk7XG4gICAgY29uc3QgbiA9IFR0KHQpLCBzID0gVHQoZSksIGkgPSBpdChuLnNlY29uZHMsIHMuc2Vjb25kcyk7XG4gICAgcmV0dXJuIDAgIT09IGkgPyBpIDogaXQobi5uYW5vcywgcy5uYW5vcyk7XG59XG5cbmZ1bmN0aW9uICR0KHQpIHtcbiAgICByZXR1cm4gRnQodCk7XG59XG5cbmZ1bmN0aW9uIEZ0KHQpIHtcbiAgICByZXR1cm4gXCJudWxsVmFsdWVcIiBpbiB0ID8gXCJudWxsXCIgOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyBcIlwiICsgdC5ib29sZWFuVmFsdWUgOiBcImludGVnZXJWYWx1ZVwiIGluIHQgPyBcIlwiICsgdC5pbnRlZ2VyVmFsdWUgOiBcImRvdWJsZVZhbHVlXCIgaW4gdCA/IFwiXCIgKyB0LmRvdWJsZVZhbHVlIDogXCJ0aW1lc3RhbXBWYWx1ZVwiIGluIHQgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBUdCh0KTtcbiAgICAgICAgcmV0dXJuIGB0aW1lKCR7ZS5zZWNvbmRzfSwke2UubmFub3N9KWA7XG4gICAgfSh0LnRpbWVzdGFtcFZhbHVlKSA6IFwic3RyaW5nVmFsdWVcIiBpbiB0ID8gdC5zdHJpbmdWYWx1ZSA6IFwiYnl0ZXNWYWx1ZVwiIGluIHQgPyBJdCh0LmJ5dGVzVmFsdWUpLnRvQmFzZTY0KCkgOiBcInJlZmVyZW5jZVZhbHVlXCIgaW4gdCA/IChuID0gdC5yZWZlcmVuY2VWYWx1ZSwgXG4gICAgU3QuZnJvbU5hbWUobikudG9TdHJpbmcoKSkgOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8gYGdlbygkeyhlID0gdC5nZW9Qb2ludFZhbHVlKS5sYXRpdHVkZX0sJHtlLmxvbmdpdHVkZX0pYCA6IFwiYXJyYXlWYWx1ZVwiIGluIHQgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIGxldCBlID0gXCJbXCIsIG4gPSAhMDtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHQudmFsdWVzIHx8IFtdKSBuID8gbiA9ICExIDogZSArPSBcIixcIiwgZSArPSBGdChzKTtcbiAgICAgICAgcmV0dXJuIGUgKyBcIl1cIjtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBkYXRhYmFzZSBhbmQga2V5LiAqLyAodC5hcnJheVZhbHVlKSA6IFwibWFwVmFsdWVcIiBpbiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICAvLyBJdGVyYXRpb24gb3JkZXIgaW4gSmF2YVNjcmlwdCBpcyBub3QgZ3VhcmFudGVlZC4gVG8gZW5zdXJlIHRoYXQgd2UgZ2VuZXJhdGVcbiAgICAgICAgLy8gbWF0Y2hpbmcgY2Fub25pY2FsIElEcyBmb3IgaWRlbnRpY2FsIG1hcHMsIHdlIG5lZWQgdG8gc29ydCB0aGUga2V5cy5cbiAgICAgICAgY29uc3QgZSA9IE9iamVjdC5rZXlzKHQuZmllbGRzIHx8IHt9KS5zb3J0KCk7XG4gICAgICAgIGxldCBuID0gXCJ7XCIsIHMgPSAhMDtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGUpIHMgPyBzID0gITEgOiBuICs9IFwiLFwiLCBuICs9IGAke2l9OiR7RnQodC5maWVsZHNbaV0pfWA7XG4gICAgICAgIHJldHVybiBuICsgXCJ9XCI7XG4gICAgfSh0Lm1hcFZhbHVlKSA6IEwoKTtcbiAgICB2YXIgZSwgbjtcbn1cblxuZnVuY3Rpb24gT3QodCwgZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlZmVyZW5jZVZhbHVlOiBgcHJvamVjdHMvJHt0LnByb2plY3RJZH0vZGF0YWJhc2VzLyR7dC5kYXRhYmFzZX0vZG9jdW1lbnRzLyR7ZS5wYXRoLmNhbm9uaWNhbFN0cmluZygpfWBcbiAgICB9O1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gSW50ZWdlclZhbHVlIC4gKi8gZnVuY3Rpb24gTXQodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJpbnRlZ2VyVmFsdWVcIiBpbiB0O1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBEb3VibGVWYWx1ZS4gKi9cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBBcnJheVZhbHVlLiAqL1xuZnVuY3Rpb24gTHQodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJhcnJheVZhbHVlXCIgaW4gdDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgTnVsbFZhbHVlLiAqLyBmdW5jdGlvbiBCdCh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcIm51bGxWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBOYU4uICovIGZ1bmN0aW9uIFV0KHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwiZG91YmxlVmFsdWVcIiBpbiB0ICYmIGlzTmFOKE51bWJlcih0LmRvdWJsZVZhbHVlKSk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIE1hcFZhbHVlLiAqLyBmdW5jdGlvbiBxdCh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcIm1hcFZhbHVlXCIgaW4gdDtcbn1cblxuLyoqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYHNvdXJjZWAuICovIGZ1bmN0aW9uIEt0KHQpIHtcbiAgICBpZiAodC5nZW9Qb2ludFZhbHVlKSByZXR1cm4ge1xuICAgICAgICBnZW9Qb2ludFZhbHVlOiBPYmplY3QuYXNzaWduKHt9LCB0Lmdlb1BvaW50VmFsdWUpXG4gICAgfTtcbiAgICBpZiAodC50aW1lc3RhbXBWYWx1ZSAmJiBcIm9iamVjdFwiID09IHR5cGVvZiB0LnRpbWVzdGFtcFZhbHVlKSByZXR1cm4ge1xuICAgICAgICB0aW1lc3RhbXBWYWx1ZTogT2JqZWN0LmFzc2lnbih7fSwgdC50aW1lc3RhbXBWYWx1ZSlcbiAgICB9O1xuICAgIGlmICh0Lm1hcFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGh0KHQubWFwVmFsdWUuZmllbGRzLCAoKHQsIG4pID0+IGUubWFwVmFsdWUuZmllbGRzW3RdID0gS3QobikpKSwgZTtcbiAgICB9XG4gICAgaWYgKHQuYXJyYXlWYWx1ZSkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgIHZhbHVlczogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCAodC5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSkubGVuZ3RoOyArK24pIGUuYXJyYXlWYWx1ZS52YWx1ZXNbbl0gPSBLdCh0LmFycmF5VmFsdWUudmFsdWVzW25dKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gT2JqZWN0VmFsdWUgcmVwcmVzZW50cyBhIE1hcFZhbHVlIGluIHRoZSBGaXJlc3RvcmUgUHJvdG8gYW5kIG9mZmVycyB0aGVcbiAqIGFiaWxpdHkgdG8gYWRkIGFuZCByZW1vdmUgZmllbGRzICh2aWEgdGhlIE9iamVjdFZhbHVlQnVpbGRlcikuXG4gKi8gY2xhc3MganQge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqdCh7XG4gICAgICAgICAgICBtYXBWYWx1ZToge31cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoIG9yIG51bGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCAtIHRoZSBwYXRoIHRvIHNlYXJjaFxuICAgICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhdCB0aGUgcGF0aCBvciBudWxsIGlmIHRoZSBwYXRoIGlzIG5vdCBzZXQuXG4gICAgICovICAgIGZpZWxkKHQpIHtcbiAgICAgICAgaWYgKHQuaXNFbXB0eSgpKSByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aCAtIDE7ICsrbikgaWYgKGUgPSAoZS5tYXBWYWx1ZS5maWVsZHMgfHwge30pW3QuZ2V0KG4pXSwgXG4gICAgICAgICAgICAhcXQoZSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGUgPSAoZS5tYXBWYWx1ZS5maWVsZHMgfHwge30pW3QubGFzdFNlZ21lbnQoKV0sIGUgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBmaWVsZCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBmaWVsZCBwYXRoIHRvIHNldC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqLyAgICBzZXQodCwgZSkge1xuICAgICAgICB0aGlzLmdldEZpZWxkc01hcCh0LnBvcExhc3QoKSlbdC5sYXN0U2VnbWVudCgpXSA9IEt0KGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm92aWRlZCBmaWVsZHMgdG8gdGhlIHByb3ZpZGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhIC0gQSBtYXAgb2YgZmllbGRzIHRvIHZhbHVlcyAob3IgbnVsbCBmb3IgZGVsZXRlcykuXG4gICAgICovICAgIHNldEFsbCh0KSB7XG4gICAgICAgIGxldCBlID0gX3QuZW1wdHlQYXRoKCksIG4gPSB7fSwgcyA9IFtdO1xuICAgICAgICB0LmZvckVhY2goKCh0LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUuaXNJbW1lZGlhdGVQYXJlbnRPZihpKSkge1xuICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgYWNjdW11bGF0ZWQgY2hhbmdlcyBhdCB0aGlzIHBhcmVudCBsb2NhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmdldEZpZWxkc01hcChlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5Q2hhbmdlcyh0LCBuLCBzKSwgbiA9IHt9LCBzID0gW10sIGUgPSBpLnBvcExhc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQgPyBuW2kubGFzdFNlZ21lbnQoKV0gPSBLdCh0KSA6IHMucHVzaChpLmxhc3RTZWdtZW50KCkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldEZpZWxkc01hcChlKTtcbiAgICAgICAgdGhpcy5hcHBseUNoYW5nZXMoaSwgbiwgcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZpZWxkIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gSWYgdGhlcmUgaXMgbm8gZmllbGQgYXQgdGhlXG4gICAgICogc3BlY2lmaWVkIHBhdGgsIG5vdGhpbmcgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIC0gVGhlIGZpZWxkIHBhdGggdG8gcmVtb3ZlLlxuICAgICAqLyAgICBkZWxldGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5maWVsZCh0LnBvcExhc3QoKSk7XG4gICAgICAgIHF0KGUpICYmIGUubWFwVmFsdWUuZmllbGRzICYmIGRlbGV0ZSBlLm1hcFZhbHVlLmZpZWxkc1t0Lmxhc3RTZWdtZW50KCldO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIEN0KHRoaXMudmFsdWUsIHQudmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAgdGhhdCBjb250YWlucyB0aGUgbGVhZiBlbGVtZW50IG9mIGBwYXRoYC4gSWYgdGhlIHBhcmVudFxuICAgICAqIGVudHJ5IGRvZXMgbm90IHlldCBleGlzdCwgb3IgaWYgaXQgaXMgbm90IGEgbWFwLCBhIG5ldyBtYXAgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqLyAgICBnZXRGaWVsZHNNYXAodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGUubWFwVmFsdWUuZmllbGRzIHx8IChlLm1hcFZhbHVlID0ge1xuICAgICAgICAgICAgZmllbGRzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICBsZXQgcyA9IGUubWFwVmFsdWUuZmllbGRzW3QuZ2V0KG4pXTtcbiAgICAgICAgICAgIHF0KHMpICYmIHMubWFwVmFsdWUuZmllbGRzIHx8IChzID0ge1xuICAgICAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczoge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlLm1hcFZhbHVlLmZpZWxkc1t0LmdldChuKV0gPSBzKSwgZSA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGUubWFwVmFsdWUuZmllbGRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb2RpZmllcyBgZmllbGRzTWFwYCBieSBhZGRpbmcsIHJlcGxhY2luZyBvciBkZWxldGluZyB0aGUgc3BlY2lmaWVkXG4gICAgICogZW50cmllcy5cbiAgICAgKi8gICAgYXBwbHlDaGFuZ2VzKHQsIGUsIG4pIHtcbiAgICAgICAgaHQoZSwgKChlLCBuKSA9PiB0W2VdID0gbikpO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbikgZGVsZXRlIHRbZV07XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IGp0KEt0KHRoaXMudmFsdWUpKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEZpZWxkTWFzayBidWlsdCBmcm9tIGFsbCBmaWVsZHMgaW4gYSBNYXBWYWx1ZS5cbiAqLyBmdW5jdGlvbiBRdCh0KSB7XG4gICAgY29uc3QgZSA9IFtdO1xuICAgIHJldHVybiBodCh0LmZpZWxkcywgKCh0LCBuKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgX3QoWyB0IF0pO1xuICAgICAgICBpZiAocXQobikpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBRdChuLm1hcFZhbHVlKS5maWVsZHM7XG4gICAgICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIFxuICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIGVtcHR5IG1hcCBieSBhZGRpbmcgaXQgdG8gdGhlIEZpZWxkTWFzay5cbiAgICAgICAgICAgIGUucHVzaChzKTsgZWxzZSBcbiAgICAgICAgICAgIC8vIEZvciBuZXN0ZWQgYW5kIG5vbi1lbXB0eSBPYmplY3RWYWx1ZXMsIGFkZCB0aGUgRmllbGRQYXRoIG9mIHRoZVxuICAgICAgICAgICAgLy8gbGVhZiBub2Rlcy5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBlLnB1c2gocy5jaGlsZChuKSk7XG4gICAgICAgIH0gZWxzZSBcbiAgICAgICAgLy8gRm9yIG5lc3RlZCBhbmQgbm9uLWVtcHR5IE9iamVjdFZhbHVlcywgYWRkIHRoZSBGaWVsZFBhdGggb2YgdGhlIGxlYWZcbiAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgIGUucHVzaChzKTtcbiAgICB9KSksIG5ldyBtdChlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhIGRvY3VtZW50IGluIEZpcmVzdG9yZSB3aXRoIGEga2V5LCB2ZXJzaW9uLCBkYXRhIGFuZCB3aGV0aGVyIGl0XG4gKiBoYXMgbG9jYWwgbXV0YXRpb25zIGFwcGxpZWQgdG8gaXQuXG4gKlxuICogRG9jdW1lbnRzIGNhbiB0cmFuc2l0aW9uIGJldHdlZW4gc3RhdGVzIHZpYSBgY29udmVydFRvRm91bmREb2N1bWVudCgpYCxcbiAqIGBjb252ZXJ0VG9Ob0RvY3VtZW50KClgIGFuZCBgY29udmVydFRvVW5rbm93bkRvY3VtZW50KClgLiBJZiBhIGRvY3VtZW50IGRvZXNcbiAqIG5vdCB0cmFuc2l0aW9uIHRvIG9uZSBvZiB0aGVzZSBzdGF0ZXMgZXZlbiBhZnRlciBhbGwgbXV0YXRpb25zIGhhdmUgYmVlblxuICogYXBwbGllZCwgYGlzVmFsaWREb2N1bWVudCgpYCByZXR1cm5zIGZhbHNlIGFuZCB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIHJlbW92ZWRcbiAqIGZyb20gYWxsIHZpZXdzLlxuICovIGNsYXNzIFd0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy5kb2N1bWVudFR5cGUgPSBlLCB0aGlzLnZlcnNpb24gPSBuLCB0aGlzLmRhdGEgPSBzLCB0aGlzLmRvY3VtZW50U3RhdGUgPSBpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCBubyBrbm93biB2ZXJzaW9uIG9yIGRhdGEsIGJ1dCB3aGljaCBjYW4gc2VydmUgYXNcbiAgICAgKiBiYXNlIGRvY3VtZW50IGZvciBtdXRhdGlvbnMuXG4gICAgICovICAgIHN0YXRpYyBuZXdJbnZhbGlkRG9jdW1lbnQodCkge1xuICAgICAgICByZXR1cm4gbmV3IFd0KHQsIDAgLyogSU5WQUxJRCAqLyAsIGN0Lm1pbigpLCBqdC5lbXB0eSgpLCAwIC8qIFNZTkNFRCAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdGhhdCBpcyBrbm93biB0byBleGlzdCB3aXRoIHRoZSBnaXZlbiBkYXRhIGF0IHRoZVxuICAgICAqIGdpdmVuIHZlcnNpb24uXG4gICAgICovICAgIHN0YXRpYyBuZXdGb3VuZERvY3VtZW50KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXdCh0LCAxIC8qIEZPVU5EX0RPQ1VNRU5UICovICwgZSwgbiwgMCAvKiBTWU5DRUQgKi8pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIG5vdCBleGlzdCBhdCB0aGUgZ2l2ZW4gdmVyc2lvbi4gKi8gICAgc3RhdGljIG5ld05vRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IFd0KHQsIDIgLyogTk9fRE9DVU1FTlQgKi8gLCBlLCBqdC5lbXB0eSgpLCAwIC8qIFNZTkNFRCAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdGhhdCBpcyBrbm93biB0byBleGlzdCBhdCB0aGUgZ2l2ZW4gdmVyc2lvbiBidXRcbiAgICAgKiB3aG9zZSBkYXRhIGlzIG5vdCBrbm93biAoZS5nLiBhIGRvY3VtZW50IHRoYXQgd2FzIHVwZGF0ZWQgd2l0aG91dCBhIGtub3duXG4gICAgICogYmFzZSBkb2N1bWVudCkuXG4gICAgICovICAgIHN0YXRpYyBuZXdVbmtub3duRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IFd0KHQsIDMgLyogVU5LTk9XTl9ET0NVTUVOVCAqLyAsIGUsIGp0LmVtcHR5KCksIDIgLyogSEFTX0NPTU1JVFRFRF9NVVRBVElPTlMgKi8pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBkb2N1bWVudCB0eXBlIHRvIGluZGljYXRlIHRoYXQgaXQgZXhpc3RzIGFuZCB0aGF0IGl0cyB2ZXJzaW9uXG4gICAgICogYW5kIGRhdGEgYXJlIGtub3duLlxuICAgICAqLyAgICBjb252ZXJ0VG9Gb3VuZERvY3VtZW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbiA9IHQsIHRoaXMuZG9jdW1lbnRUeXBlID0gMSAvKiBGT1VORF9ET0NVTUVOVCAqLyAsIHRoaXMuZGF0YSA9IGUsIFxuICAgICAgICB0aGlzLmRvY3VtZW50U3RhdGUgPSAwIC8qIFNZTkNFRCAqLyAsIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGRvY3VtZW50IHR5cGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0IGV4aXN0IGF0IHRoZSBnaXZlblxuICAgICAqIHZlcnNpb24uXG4gICAgICovICAgIGNvbnZlcnRUb05vRG9jdW1lbnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uID0gdCwgdGhpcy5kb2N1bWVudFR5cGUgPSAyIC8qIE5PX0RPQ1VNRU5UICovICwgdGhpcy5kYXRhID0ganQuZW1wdHkoKSwgXG4gICAgICAgIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDAgLyogU1lOQ0VEICovICwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgZG9jdW1lbnQgdHlwZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGV4aXN0cyBhdCBhIGdpdmVuIHZlcnNpb24gYnV0XG4gICAgICogdGhhdCBpdHMgZGF0YSBpcyBub3Qga25vd24gKGUuZy4gYSBkb2N1bWVudCB0aGF0IHdhcyB1cGRhdGVkIHdpdGhvdXQgYSBrbm93blxuICAgICAqIGJhc2UgZG9jdW1lbnQpLlxuICAgICAqLyAgICBjb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uID0gdCwgdGhpcy5kb2N1bWVudFR5cGUgPSAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gLCB0aGlzLmRhdGEgPSBqdC5lbXB0eSgpLCBcbiAgICAgICAgdGhpcy5kb2N1bWVudFN0YXRlID0gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyAsIHRoaXM7XG4gICAgfVxuICAgIHNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDIgLyogSEFTX0NPTU1JVFRFRF9NVVRBVElPTlMgKi8gLCB0aGlzO1xuICAgIH1cbiAgICBzZXRIYXNMb2NhbE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDEgLyogSEFTX0xPQ0FMX01VVEFUSU9OUyAqLyAsIHRoaXM7XG4gICAgfVxuICAgIGdldCBoYXNMb2NhbE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogSEFTX0xPQ0FMX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBIQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyA9PT0gdGhpcy5kb2N1bWVudFN0YXRlO1xuICAgIH1cbiAgICBnZXQgaGFzUGVuZGluZ1dyaXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTG9jYWxNdXRhdGlvbnMgfHwgdGhpcy5oYXNDb21taXR0ZWRNdXRhdGlvbnM7XG4gICAgfVxuICAgIGlzVmFsaWREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDAgLyogSU5WQUxJRCAqLyAhPT0gdGhpcy5kb2N1bWVudFR5cGU7XG4gICAgfVxuICAgIGlzRm91bmREb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogRk9VTkRfRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc05vRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIE5PX0RPQ1VNRU5UICovID09PSB0aGlzLmRvY3VtZW50VHlwZTtcbiAgICB9XG4gICAgaXNVbmtub3duRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAzIC8qIFVOS05PV05fRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBXdCAmJiB0aGlzLmtleS5pc0VxdWFsKHQua2V5KSAmJiB0aGlzLnZlcnNpb24uaXNFcXVhbCh0LnZlcnNpb24pICYmIHRoaXMuZG9jdW1lbnRUeXBlID09PSB0LmRvY3VtZW50VHlwZSAmJiB0aGlzLmRvY3VtZW50U3RhdGUgPT09IHQuZG9jdW1lbnRTdGF0ZSAmJiB0aGlzLmRhdGEuaXNFcXVhbCh0LmRhdGEpO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXdCh0aGlzLmtleSwgdGhpcy5kb2N1bWVudFR5cGUsIHRoaXMudmVyc2lvbiwgdGhpcy5kYXRhLmNsb25lKCksIHRoaXMuZG9jdW1lbnRTdGF0ZSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYERvY3VtZW50KCR7dGhpcy5rZXl9LCAke3RoaXMudmVyc2lvbn0sICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnZhbHVlKX0sIHtkb2N1bWVudFR5cGU6ICR7dGhpcy5kb2N1bWVudFR5cGV9fSksIHtkb2N1bWVudFN0YXRlOiAke3RoaXMuZG9jdW1lbnRTdGF0ZX19KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHRoZSB2YWx1ZSBmb3IgZmllbGQgYGZpZWxkYCBpbiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiBUaHJvd3MgaWZcbiAqIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBpbiBib3RoIGRvY3VtZW50cy5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmdcbmNsYXNzIEd0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gdCwgdGhpcy5jb2xsZWN0aW9uR3JvdXAgPSBlLCB0aGlzLm9yZGVyQnkgPSBuLCB0aGlzLmZpbHRlcnMgPSBzLCB0aGlzLmxpbWl0ID0gaSwgXG4gICAgICAgIHRoaXMuc3RhcnRBdCA9IHIsIHRoaXMuZW5kQXQgPSBvLCB0aGlzLlIgPSBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIFRhcmdldCB3aXRoIGEgcGF0aCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gKlxuICogTk9URTogeW91IHNob3VsZCBhbHdheXMgY29uc3RydWN0IGBUYXJnZXRgIGZyb20gYFF1ZXJ5LnRvVGFyZ2V0YCBpbnN0ZWFkIG9mXG4gKiB1c2luZyB0aGlzIGZhY3RvcnkgbWV0aG9kLCBiZWNhdXNlIGBRdWVyeWAgcHJvdmlkZXMgYW4gaW1wbGljaXQgYG9yZGVyQnlgXG4gKiBwcm9wZXJ0eS5cbiAqLyBmdW5jdGlvbiB6dCh0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IEd0KHQsIGUsIG4sIHMsIGksIHIsIG8pO1xufVxuXG5mdW5jdGlvbiBIdCh0KSB7XG4gICAgY29uc3QgZSA9IHEodCk7XG4gICAgaWYgKG51bGwgPT09IGUuUikge1xuICAgICAgICBsZXQgdCA9IGUucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICAgICAgbnVsbCAhPT0gZS5jb2xsZWN0aW9uR3JvdXAgJiYgKHQgKz0gXCJ8Y2c6XCIgKyBlLmNvbGxlY3Rpb25Hcm91cCksIHQgKz0gXCJ8ZjpcIiwgdCArPSBlLmZpbHRlcnMubWFwKCh0ID0+IHRlKHQpKSkuam9pbihcIixcIiksIFxuICAgICAgICB0ICs9IFwifG9iOlwiLCB0ICs9IGUub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgLy8gVE9ETyhiLzI5MTgzMTY1KTogTWFrZSB0aGlzIGNvbGxpc2lvbiByb2J1c3QuXG4gICAgICAgICAgICByZXR1cm4gdC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSArIHQuZGlyO1xuICAgICAgICB9KHQpKSkuam9pbihcIixcIiksIGJ0KGUubGltaXQpIHx8ICh0ICs9IFwifGw6XCIsIHQgKz0gZS5saW1pdCksIGUuc3RhcnRBdCAmJiAodCArPSBcInxsYjpcIiwgXG4gICAgICAgIHQgKz0gaGUoZS5zdGFydEF0KSksIGUuZW5kQXQgJiYgKHQgKz0gXCJ8dWI6XCIsIHQgKz0gaGUoZS5lbmRBdCkpLCBlLlIgPSB0O1xuICAgIH1cbiAgICByZXR1cm4gZS5SO1xufVxuXG5mdW5jdGlvbiBKdCh0KSB7XG4gICAgbGV0IGUgPSB0LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgcmV0dXJuIG51bGwgIT09IHQuY29sbGVjdGlvbkdyb3VwICYmIChlICs9IFwiIGNvbGxlY3Rpb25Hcm91cD1cIiArIHQuY29sbGVjdGlvbkdyb3VwKSwgXG4gICAgdC5maWx0ZXJzLmxlbmd0aCA+IDAgJiYgKGUgKz0gYCwgZmlsdGVyczogWyR7dC5maWx0ZXJzLm1hcCgodCA9PiB7XG4gICAgICAgIHJldHVybiBgJHsoZSA9IHQpLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpfSAke2Uub3B9ICR7JHQoZS52YWx1ZSl9YDtcbiAgICAgICAgLyoqIFJldHVybnMgYSBkZWJ1ZyBkZXNjcmlwdGlvbiBmb3IgYGZpbHRlcmAuICovXG4gICAgICAgIHZhciBlO1xuICAgICAgICAvKiogRmlsdGVyIHRoYXQgbWF0Y2hlcyBvbiBrZXkgZmllbGRzIChpLmUuICdfX25hbWVfXycpLiAqLyAgICB9KSkuam9pbihcIiwgXCIpfV1gKSwgXG4gICAgYnQodC5saW1pdCkgfHwgKGUgKz0gXCIsIGxpbWl0OiBcIiArIHQubGltaXQpLCB0Lm9yZGVyQnkubGVuZ3RoID4gMCAmJiAoZSArPSBgLCBvcmRlckJ5OiBbJHt0Lm9yZGVyQnkubWFwKCh0ID0+IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIGAke3QuZmllbGQuY2Fub25pY2FsU3RyaW5nKCl9ICgke3QuZGlyfSlgO1xuICAgIH0odCkpKS5qb2luKFwiLCBcIil9XWApLCB0LnN0YXJ0QXQgJiYgKGUgKz0gXCIsIHN0YXJ0QXQ6IFwiICsgaGUodC5zdGFydEF0KSksIHQuZW5kQXQgJiYgKGUgKz0gXCIsIGVuZEF0OiBcIiArIGhlKHQuZW5kQXQpKSwgXG4gICAgYFRhcmdldCgke2V9KWA7XG59XG5cbmZ1bmN0aW9uIFl0KHQsIGUpIHtcbiAgICBpZiAodC5saW1pdCAhPT0gZS5saW1pdCkgcmV0dXJuICExO1xuICAgIGlmICh0Lm9yZGVyQnkubGVuZ3RoICE9PSBlLm9yZGVyQnkubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lm9yZGVyQnkubGVuZ3RoOyBuKyspIGlmICghZmUodC5vcmRlckJ5W25dLCBlLm9yZGVyQnlbbl0pKSByZXR1cm4gITE7XG4gICAgaWYgKHQuZmlsdGVycy5sZW5ndGggIT09IGUuZmlsdGVycy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuZmlsdGVycy5sZW5ndGg7IGkrKykgaWYgKG4gPSB0LmZpbHRlcnNbaV0sIHMgPSBlLmZpbHRlcnNbaV0sIFxuICAgIG4ub3AgIT09IHMub3AgfHwgIW4uZmllbGQuaXNFcXVhbChzLmZpZWxkKSB8fCAhQ3Qobi52YWx1ZSwgcy52YWx1ZSkpIHJldHVybiAhMTtcbiAgICB2YXIgbiwgcztcbiAgICByZXR1cm4gdC5jb2xsZWN0aW9uR3JvdXAgPT09IGUuY29sbGVjdGlvbkdyb3VwICYmICghIXQucGF0aC5pc0VxdWFsKGUucGF0aCkgJiYgKCEhd2UodC5zdGFydEF0LCBlLnN0YXJ0QXQpICYmIHdlKHQuZW5kQXQsIGUuZW5kQXQpKSk7XG59XG5cbmZ1bmN0aW9uIFh0KHQpIHtcbiAgICByZXR1cm4gU3QuaXNEb2N1bWVudEtleSh0LnBhdGgpICYmIG51bGwgPT09IHQuY29sbGVjdGlvbkdyb3VwICYmIDAgPT09IHQuZmlsdGVycy5sZW5ndGg7XG59XG5cbmNsYXNzIFp0IGV4dGVuZHMgY2xhc3Mge30ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5maWVsZCA9IHQsIHRoaXMub3AgPSBlLCB0aGlzLnZhbHVlID0gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZpbHRlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqLyAgICBzdGF0aWMgY3JlYXRlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHQuaXNLZXlGaWVsZCgpID8gXCJpblwiIC8qIElOICovID09PSBlIHx8IFwibm90LWluXCIgLyogTk9UX0lOICovID09PSBlID8gdGhpcy5QKHQsIGUsIG4pIDogbmV3IGVlKHQsIGUsIG4pIDogXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovID09PSBlID8gbmV3IHJlKHQsIG4pIDogXCJpblwiIC8qIElOICovID09PSBlID8gbmV3IG9lKHQsIG4pIDogXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IGUgPyBuZXcgYWUodCwgbikgOiBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyA9PT0gZSA/IG5ldyBjZSh0LCBuKSA6IG5ldyBadCh0LCBlLCBuKTtcbiAgICB9XG4gICAgc3RhdGljIFAodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gXCJpblwiIC8qIElOICovID09PSBlID8gbmV3IG5lKHQsIG4pIDogbmV3IHNlKHQsIG4pO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZGF0YS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgLy8gVHlwZXMgZG8gbm90IGhhdmUgdG8gbWF0Y2ggaW4gTk9UX0VRVUFMIGZpbHRlcnMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gPT09IHRoaXMub3AgPyBudWxsICE9PSBlICYmIHRoaXMudihrdChlLCB0aGlzLnZhbHVlKSkgOiBudWxsICE9PSBlICYmIER0KHRoaXMudmFsdWUpID09PSBEdChlKSAmJiB0aGlzLnYoa3QoZSwgdGhpcy52YWx1ZSkpO1xuICAgICAgICAvLyBPbmx5IGNvbXBhcmUgdHlwZXMgd2l0aCBtYXRjaGluZyBiYWNrZW5kIG9yZGVyIChzdWNoIGFzIGRvdWJsZSBhbmQgaW50KS5cbiAgICAgICAgfVxuICAgIHYodCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMub3ApIHtcbiAgICAgICAgICBjYXNlIFwiPFwiIC8qIExFU1NfVEhBTiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA8IDA7XG5cbiAgICAgICAgICBjYXNlIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMDtcblxuICAgICAgICAgIGNhc2UgXCI9PVwiIC8qIEVRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiAwID09PSB0O1xuXG4gICAgICAgICAgY2FzZSBcIiE9XCIgLyogTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiAwICE9PSB0O1xuXG4gICAgICAgICAgY2FzZSBcIj5cIiAvKiBHUkVBVEVSX1RIQU4gKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPiAwO1xuXG4gICAgICAgICAgY2FzZSBcIj49XCIgLyogR1JFQVRFUl9USEFOX09SX0VRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiB0ID49IDA7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBWKCkge1xuICAgICAgICByZXR1cm4gWyBcIjxcIiAvKiBMRVNTX1RIQU4gKi8gLCBcIjw9XCIgLyogTEVTU19USEFOX09SX0VRVUFMICovICwgXCI+XCIgLyogR1JFQVRFUl9USEFOICovICwgXCI+PVwiIC8qIEdSRUFURVJfVEhBTl9PUl9FUVVBTCAqLyAsIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gLCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyBdLmluZGV4T2YodGhpcy5vcCkgPj0gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRlKHQpIHtcbiAgICAvLyBUT0RPKGIvMjkxODMxNjUpOiBUZWNobmljYWxseSwgdGhpcyB3b24ndCBiZSB1bmlxdWUgaWYgdHdvIHZhbHVlcyBoYXZlXG4gICAgLy8gdGhlIHNhbWUgZGVzY3JpcHRpb24sIHN1Y2ggYXMgdGhlIGludCAzIGFuZCB0aGUgc3RyaW5nIFwiM1wiLiBTbyB3ZSBzaG91bGRcbiAgICAvLyBhZGQgdGhlIHR5cGVzIGluIGhlcmUgc29tZWhvdywgdG9vLlxuICAgIHJldHVybiB0LmZpZWxkLmNhbm9uaWNhbFN0cmluZygpICsgdC5vcC50b1N0cmluZygpICsgJHQodC52YWx1ZSk7XG59XG5cbmNsYXNzIGVlIGV4dGVuZHMgWnQge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIodCwgZSwgbiksIHRoaXMua2V5ID0gU3QuZnJvbU5hbWUobi5yZWZlcmVuY2VWYWx1ZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gU3QuY29tcGFyYXRvcih0LmtleSwgdGhpcy5rZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy52KGUpO1xuICAgIH1cbn1cblxuLyoqIEZpbHRlciB0aGF0IG1hdGNoZXMgb24ga2V5IGZpZWxkcyB3aXRoaW4gYW4gYXJyYXkuICovIGNsYXNzIG5lIGV4dGVuZHMgWnQge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJpblwiIC8qIElOICovICwgZSksIHRoaXMua2V5cyA9IGllKFwiaW5cIiAvKiBJTiAqLyAsIGUpO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5cy5zb21lKChlID0+IGUuaXNFcXVhbCh0LmtleSkpKTtcbiAgICB9XG59XG5cbi8qKiBGaWx0ZXIgdGhhdCBtYXRjaGVzIG9uIGtleSBmaWVsZHMgbm90IHByZXNlbnQgd2l0aGluIGFuIGFycmF5LiAqLyBjbGFzcyBzZSBleHRlbmRzIFp0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibm90LWluXCIgLyogTk9UX0lOICovICwgZSksIHRoaXMua2V5cyA9IGllKFwibm90LWluXCIgLyogTk9UX0lOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICByZXR1cm4gIXRoaXMua2V5cy5zb21lKChlID0+IGUuaXNFcXVhbCh0LmtleSkpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGllKHQsIGUpIHtcbiAgICB2YXIgbjtcbiAgICByZXR1cm4gKChudWxsID09PSAobiA9IGUuYXJyYXlWYWx1ZSkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi52YWx1ZXMpIHx8IFtdKS5tYXAoKHQgPT4gU3QuZnJvbU5hbWUodC5yZWZlcmVuY2VWYWx1ZSkpKTtcbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYXJyYXktY29udGFpbnMgb3BlcmF0b3IuICovIGNsYXNzIHJlIGV4dGVuZHMgWnQge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gTHQoZSkgJiYgTnQoZS5hcnJheVZhbHVlLCB0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5cbi8qKiBBIEZpbHRlciB0aGF0IGltcGxlbWVudHMgdGhlIElOIG9wZXJhdG9yLiAqLyBjbGFzcyBvZSBleHRlbmRzIFp0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwiaW5cIiAvKiBJTiAqLyAsIGUpO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZGF0YS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgTnQodGhpcy52YWx1ZS5hcnJheVZhbHVlLCBlKTtcbiAgICB9XG59XG5cbi8qKiBBIEZpbHRlciB0aGF0IGltcGxlbWVudHMgdGhlIG5vdC1pbiBvcGVyYXRvci4gKi8gY2xhc3MgYWUgZXh0ZW5kcyBadCB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyAsIGUpO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgaWYgKE50KHRoaXMudmFsdWUuYXJyYXlWYWx1ZSwge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9KSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiAhTnQodGhpcy52YWx1ZS5hcnJheVZhbHVlLCBlKTtcbiAgICB9XG59XG5cbi8qKiBBIEZpbHRlciB0aGF0IGltcGxlbWVudHMgdGhlIGFycmF5LWNvbnRhaW5zLWFueSBvcGVyYXRvci4gKi8gY2xhc3MgY2UgZXh0ZW5kcyBadCB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIGUpO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZGF0YS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuICEoIUx0KGUpIHx8ICFlLmFycmF5VmFsdWUudmFsdWVzKSAmJiBlLmFycmF5VmFsdWUudmFsdWVzLnNvbWUoKHQgPT4gTnQodGhpcy52YWx1ZS5hcnJheVZhbHVlLCB0KSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgYm91bmQgb2YgYSBxdWVyeS5cbiAqXG4gKiBUaGUgYm91bmQgaXMgc3BlY2lmaWVkIHdpdGggdGhlIGdpdmVuIGNvbXBvbmVudHMgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gYW5kXG4gKiB3aGV0aGVyIGl0J3MganVzdCBiZWZvcmUgb3IganVzdCBhZnRlciB0aGUgcG9zaXRpb24gKHJlbGF0aXZlIHRvIHdoYXRldmVyIHRoZVxuICogcXVlcnkgb3JkZXIgaXMpLlxuICpcbiAqIFRoZSBwb3NpdGlvbiByZXByZXNlbnRzIGEgbG9naWNhbCBpbmRleCBwb3NpdGlvbiBmb3IgYSBxdWVyeS4gSXQncyBhIHByZWZpeFxuICogb2YgdmFsdWVzIGZvciB0aGUgKHBvdGVudGlhbGx5IGltcGxpY2l0KSBvcmRlciBieSBjbGF1c2VzIG9mIGEgcXVlcnkuXG4gKlxuICogQm91bmQgcHJvdmlkZXMgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRvY3VtZW50IGNvbWVzIGJlZm9yZSBvclxuICogYWZ0ZXIgYSBib3VuZC4gVGhpcyBpcyBpbmZsdWVuY2VkIGJ5IHdoZXRoZXIgdGhlIHBvc2l0aW9uIGlzIGp1c3QgYmVmb3JlIG9yXG4gKiBqdXN0IGFmdGVyIHRoZSBwcm92aWRlZCB2YWx1ZXMuXG4gKi8gY2xhc3MgdWUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHQsIHRoaXMuYmVmb3JlID0gZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhlKHQpIHtcbiAgICAvLyBUT0RPKGIvMjkxODMxNjUpOiBNYWtlIHRoaXMgY29sbGlzaW9uIHJvYnVzdC5cbiAgICByZXR1cm4gYCR7dC5iZWZvcmUgPyBcImJcIiA6IFwiYVwifToke3QucG9zaXRpb24ubWFwKCh0ID0+ICR0KHQpKSkuam9pbihcIixcIil9YDtcbn1cblxuLyoqXG4gKiBBbiBvcmRlcmluZyBvbiBhIGZpZWxkLCBpbiBzb21lIERpcmVjdGlvbi4gRGlyZWN0aW9uIGRlZmF1bHRzIHRvIEFTQ0VORElORy5cbiAqLyBjbGFzcyBsZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSA9IFwiYXNjXCIgLyogQVNDRU5ESU5HICovKSB7XG4gICAgICAgIHRoaXMuZmllbGQgPSB0LCB0aGlzLmRpciA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuZGlyID09PSBlLmRpciAmJiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZG9jdW1lbnQgc29ydHMgYmVmb3JlIGEgYm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIHNvcnRcbiAqIG9yZGVyLlxuICovIGZ1bmN0aW9uIGRlKHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LnBvc2l0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHIgPSBlW2ldLCBvID0gdC5wb3NpdGlvbltpXTtcbiAgICAgICAgaWYgKHIuZmllbGQuaXNLZXlGaWVsZCgpKSBzID0gU3QuY29tcGFyYXRvcihTdC5mcm9tTmFtZShvLnJlZmVyZW5jZVZhbHVlKSwgbi5rZXkpOyBlbHNlIHtcbiAgICAgICAgICAgIHMgPSBrdChvLCBuLmRhdGEuZmllbGQoci5maWVsZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcImRlc2NcIiAvKiBERVNDRU5ESU5HICovID09PSByLmRpciAmJiAocyAqPSAtMSksIDAgIT09IHMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdC5iZWZvcmUgPyBzIDw9IDAgOiBzIDwgMDtcbn1cblxuZnVuY3Rpb24gd2UodCwgZSkge1xuICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gbnVsbCA9PT0gZTtcbiAgICBpZiAobnVsbCA9PT0gZSkgcmV0dXJuICExO1xuICAgIGlmICh0LmJlZm9yZSAhPT0gZS5iZWZvcmUgfHwgdC5wb3NpdGlvbi5sZW5ndGggIT09IGUucG9zaXRpb24ubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0LnBvc2l0aW9uLmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGlmICghQ3QodC5wb3NpdGlvbltuXSwgZS5wb3NpdGlvbltuXSkpIHJldHVybiAhMTtcbiAgICB9XG4gICAgcmV0dXJuICEwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBRdWVyeSBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBxdWVyeSBhdHRyaWJ1dGVzIHdlIHN1cHBvcnQgaW4gdGhlIFNESy4gSXQgY2FuXG4gKiBiZSBydW4gYWdhaW5zdCB0aGUgTG9jYWxTdG9yZSwgYXMgd2VsbCBhcyBiZSBjb252ZXJ0ZWQgdG8gYSBgVGFyZ2V0YCB0b1xuICogcXVlcnkgdGhlIFJlbW90ZVN0b3JlIHJlc3VsdHMuXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqLyBjbGFzcyBfZSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYSBRdWVyeSB3aXRoIGEgcGF0aCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAgICAgKiBQYXRoIG11c3QgY3VycmVudGx5IGJlIGVtcHR5IGlmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJ5LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUgPSBudWxsLCBuID0gW10sIHMgPSBbXSwgaSA9IG51bGwsIHIgPSBcIkZcIiAvKiBGaXJzdCAqLyAsIG8gPSBudWxsLCBhID0gbnVsbCkge1xuICAgICAgICB0aGlzLnBhdGggPSB0LCB0aGlzLmNvbGxlY3Rpb25Hcm91cCA9IGUsIHRoaXMuZXhwbGljaXRPcmRlckJ5ID0gbiwgdGhpcy5maWx0ZXJzID0gcywgXG4gICAgICAgIHRoaXMubGltaXQgPSBpLCB0aGlzLmxpbWl0VHlwZSA9IHIsIHRoaXMuc3RhcnRBdCA9IG8sIHRoaXMuZW5kQXQgPSBhLCB0aGlzLlMgPSBudWxsLCBcbiAgICAgICAgLy8gVGhlIGNvcnJlc3BvbmRpbmcgYFRhcmdldGAgb2YgdGhpcyBgUXVlcnlgIGluc3RhbmNlLlxuICAgICAgICB0aGlzLkQgPSBudWxsLCB0aGlzLnN0YXJ0QXQsIHRoaXMuZW5kQXQ7XG4gICAgfVxufVxuXG4vKiogQ3JlYXRlcyBhIG5ldyBRdWVyeSBpbnN0YW5jZSB3aXRoIHRoZSBvcHRpb25zIHByb3ZpZGVkLiAqLyBmdW5jdGlvbiBtZSh0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgcmV0dXJuIG5ldyBfZSh0LCBlLCBuLCBzLCBpLCByLCBvLCBhKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBuZXcgUXVlcnkgZm9yIGEgcXVlcnkgdGhhdCBtYXRjaGVzIGFsbCBkb2N1bWVudHMgYXQgYHBhdGhgICovIGZ1bmN0aW9uIGdlKHQpIHtcbiAgICByZXR1cm4gbmV3IF9lKHQpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IGEgY29sbGVjdGlvbiBncm91cCBxdWVyeSBpbnRvIGEgY29sbGVjdGlvbiBxdWVyeSBhdCBhXG4gKiBzcGVjaWZpYyBwYXRoLiBUaGlzIGlzIHVzZWQgd2hlbiBleGVjdXRpbmcgY29sbGVjdGlvbiBncm91cCBxdWVyaWVzLCBzaW5jZVxuICogd2UgaGF2ZSB0byBzcGxpdCB0aGUgcXVlcnkgaW50byBhIHNldCBvZiBjb2xsZWN0aW9uIHF1ZXJpZXMgYXQgbXVsdGlwbGVcbiAqIHBhdGhzLlxuICovIGZ1bmN0aW9uIHllKHQpIHtcbiAgICByZXR1cm4gIWJ0KHQubGltaXQpICYmIFwiRlwiIC8qIEZpcnN0ICovID09PSB0LmxpbWl0VHlwZTtcbn1cblxuZnVuY3Rpb24gcGUodCkge1xuICAgIHJldHVybiAhYnQodC5saW1pdCkgJiYgXCJMXCIgLyogTGFzdCAqLyA9PT0gdC5saW1pdFR5cGU7XG59XG5cbmZ1bmN0aW9uIFRlKHQpIHtcbiAgICByZXR1cm4gdC5leHBsaWNpdE9yZGVyQnkubGVuZ3RoID4gMCA/IHQuZXhwbGljaXRPcmRlckJ5WzBdLmZpZWxkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gRWUodCkge1xuICAgIGZvciAoY29uc3QgZSBvZiB0LmZpbHRlcnMpIGlmIChlLlYoKSkgcmV0dXJuIGUuZmllbGQ7XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFueSBvZiB0aGUgcHJvdmlkZWQgT3BlcmF0b3JzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kXG4gKiByZXR1cm5zIHRoZSBmaXJzdCBvbmUgdGhhdCBpcywgb3IgbnVsbCBpZiBub25lIGFyZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHF1ZXJ5IG1hdGNoZXMgYSBjb2xsZWN0aW9uIGdyb3VwIHJhdGhlciB0aGFuIGEgc3BlY2lmaWNcbiAqIGNvbGxlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIEllKHQpIHtcbiAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wbGljaXQgb3JkZXIgYnkgY29uc3RyYWludCB0aGF0IGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgUXVlcnksXG4gKiB3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGVyIGJ5IGNvbnN0cmFpbnRzIHRoZSB1c2VyIHByb3ZpZGVkIChlLmcuXG4gKiB0aGUgU0RLIGFuZCBiYWNrZW5kIGFsd2F5cyBvcmRlcnMgYnkgYF9fbmFtZV9fYCkuXG4gKi8gZnVuY3Rpb24gQWUodCkge1xuICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgIGlmIChudWxsID09PSBlLlMpIHtcbiAgICAgICAgZS5TID0gW107XG4gICAgICAgIGNvbnN0IHQgPSBFZShlKSwgbiA9IFRlKGUpO1xuICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiBudWxsID09PSBuKSBcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gaW1wbGljaXRseSBhZGQga2V5IG9yZGVyaW5nLCB3ZSBtdXN0IGFsc28gYWRkIHRoZVxuICAgICAgICAvLyBpbmVxdWFsaXR5IGZpbHRlciBmaWVsZCBmb3IgaXQgdG8gYmUgYSB2YWxpZCBxdWVyeS5cbiAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGluZXF1YWxpdHkgZmllbGQgYW5kIGtleSBvcmRlcmluZyBpcyBhc2NlbmRpbmcuXG4gICAgICAgIHQuaXNLZXlGaWVsZCgpIHx8IGUuUy5wdXNoKG5ldyBsZSh0KSksIGUuUy5wdXNoKG5ldyBsZShfdC5rZXlGaWVsZCgpLCBcImFzY1wiIC8qIEFTQ0VORElORyAqLykpOyBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0ID0gITE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgZS5leHBsaWNpdE9yZGVyQnkpIGUuUy5wdXNoKG4pLCBuLmZpZWxkLmlzS2V5RmllbGQoKSAmJiAodCA9ICEwKTtcbiAgICAgICAgICAgIGlmICghdCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgaW1wbGljaXQga2V5IG9yZGVyaW5nIGFsd2F5cyBtYXRjaGVzIHRoZSBsYXN0XG4gICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgb3JkZXIgYnlcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS5leHBsaWNpdE9yZGVyQnkubGVuZ3RoID4gMCA/IGUuZXhwbGljaXRPcmRlckJ5W2UuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCAtIDFdLmRpciA6IFwiYXNjXCIgLyogQVNDRU5ESU5HICovO1xuICAgICAgICAgICAgICAgIGUuUy5wdXNoKG5ldyBsZShfdC5rZXlGaWVsZCgpLCB0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGUuUztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIGBRdWVyeWAgaW5zdGFuY2UgdG8gaXQncyBjb3JyZXNwb25kaW5nIGBUYXJnZXRgIHJlcHJlc2VudGF0aW9uLlxuICovIGZ1bmN0aW9uIFJlKHQpIHtcbiAgICBjb25zdCBlID0gcSh0KTtcbiAgICBpZiAoIWUuRCkgaWYgKFwiRlwiIC8qIEZpcnN0ICovID09PSBlLmxpbWl0VHlwZSkgZS5EID0genQoZS5wYXRoLCBlLmNvbGxlY3Rpb25Hcm91cCwgQWUoZSksIGUuZmlsdGVycywgZS5saW1pdCwgZS5zdGFydEF0LCBlLmVuZEF0KTsgZWxzZSB7XG4gICAgICAgIC8vIEZsaXAgdGhlIG9yZGVyQnkgZGlyZWN0aW9ucyBzaW5jZSB3ZSB3YW50IHRoZSBsYXN0IHJlc3VsdHNcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgQWUoZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovID09PSBuLmRpciA/IFwiYXNjXCIgLyogQVNDRU5ESU5HICovIDogXCJkZXNjXCIgLyogREVTQ0VORElORyAqLztcbiAgICAgICAgICAgIHQucHVzaChuZXcgbGUobi5maWVsZCwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gc3dhcCB0aGUgY3Vyc29ycyB0byBtYXRjaCB0aGUgbm93LWZsaXBwZWQgcXVlcnkgb3JkZXJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IGUuZW5kQXQgPyBuZXcgdWUoZS5lbmRBdC5wb3NpdGlvbiwgIWUuZW5kQXQuYmVmb3JlKSA6IG51bGwsIHMgPSBlLnN0YXJ0QXQgPyBuZXcgdWUoZS5zdGFydEF0LnBvc2l0aW9uLCAhZS5zdGFydEF0LmJlZm9yZSkgOiBudWxsO1xuICAgICAgICAvLyBOb3cgcmV0dXJuIGFzIGEgTGltaXRUeXBlLkZpcnN0IHF1ZXJ5LlxuICAgICAgICBlLkQgPSB6dChlLnBhdGgsIGUuY29sbGVjdGlvbkdyb3VwLCB0LCBlLmZpbHRlcnMsIGUubGltaXQsIG4sIHMpO1xuICAgIH1cbiAgICByZXR1cm4gZS5EO1xufVxuXG5mdW5jdGlvbiBQZSh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIG5ldyBfZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0LmV4cGxpY2l0T3JkZXJCeS5zbGljZSgpLCB0LmZpbHRlcnMuc2xpY2UoKSwgZSwgbiwgdC5zdGFydEF0LCB0LmVuZEF0KTtcbn1cblxuZnVuY3Rpb24gYmUodCwgZSkge1xuICAgIHJldHVybiBZdChSZSh0KSwgUmUoZSkpICYmIHQubGltaXRUeXBlID09PSBlLmxpbWl0VHlwZTtcbn1cblxuLy8gVE9ETyhiLzI5MTgzMTY1KTogVGhpcyBpcyB1c2VkIHRvIGdldCBhIHVuaXF1ZSBzdHJpbmcgZnJvbSBhIHF1ZXJ5IHRvLCBmb3Jcbi8vIGV4YW1wbGUsIHVzZSBhcyBhIGRpY3Rpb25hcnkga2V5LCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIHN1YmplY3QgdG9cbi8vIGNvbGxpc2lvbnMuIE1ha2UgaXQgY29sbGlzaW9uLWZyZWUuXG5mdW5jdGlvbiB2ZSh0KSB7XG4gICAgcmV0dXJuIGAke0h0KFJlKHQpKX18bHQ6JHt0LmxpbWl0VHlwZX1gO1xufVxuXG5mdW5jdGlvbiBWZSh0KSB7XG4gICAgcmV0dXJuIGBRdWVyeSh0YXJnZXQ9JHtKdChSZSh0KSl9OyBsaW1pdFR5cGU9JHt0LmxpbWl0VHlwZX0pYDtcbn1cblxuLyoqIFJldHVybnMgd2hldGhlciBgZG9jYCBtYXRjaGVzIHRoZSBjb25zdHJhaW50cyBvZiBgcXVlcnlgLiAqLyBmdW5jdGlvbiBTZSh0LCBlKSB7XG4gICAgcmV0dXJuIGUuaXNGb3VuZERvY3VtZW50KCkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5rZXkucGF0aDtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHQuY29sbGVjdGlvbkdyb3VwID8gZS5rZXkuaGFzQ29sbGVjdGlvbklkKHQuY29sbGVjdGlvbkdyb3VwKSAmJiB0LnBhdGguaXNQcmVmaXhPZihuKSA6IFN0LmlzRG9jdW1lbnRLZXkodC5wYXRoKSA/IHQucGF0aC5pc0VxdWFsKG4pIDogdC5wYXRoLmlzSW1tZWRpYXRlUGFyZW50T2Yobik7XG4gICAgfVxuICAgIC8qKlxuICogQSBkb2N1bWVudCBtdXN0IGhhdmUgYSB2YWx1ZSBmb3IgZXZlcnkgb3JkZXJpbmcgY2xhdXNlIGluIG9yZGVyIHRvIHNob3cgdXBcbiAqIGluIHRoZSByZXN1bHRzLlxuICovICh0LCBlKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmV4cGxpY2l0T3JkZXJCeSkgXG4gICAgICAgIC8vIG9yZGVyIGJ5IGtleSBhbHdheXMgbWF0Y2hlc1xuICAgICAgICBpZiAoIW4uZmllbGQuaXNLZXlGaWVsZCgpICYmIG51bGwgPT09IGUuZGF0YS5maWVsZChuLmZpZWxkKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfSh0LCBlKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmZpbHRlcnMpIGlmICghbi5tYXRjaGVzKGUpKSByZXR1cm4gITE7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgLyoqIE1ha2VzIHN1cmUgYSBkb2N1bWVudCBpcyB3aXRoaW4gdGhlIGJvdW5kcywgaWYgcHJvdmlkZWQuICovICh0LCBlKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGlmICh0LnN0YXJ0QXQgJiYgIWRlKHQuc3RhcnRBdCwgQWUodCksIGUpKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0LmVuZEF0ICYmIGRlKHQuZW5kQXQsIEFlKHQpLCBlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyBhIG5ldyBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0d28gZG9jdW1lbnRzXG4gKiBiYXNlZCBvbiB0aGUgUXVlcnkncyBvcmRlcmluZyBjb25zdHJhaW50LlxuICovICh0LCBlKTtcbn1cblxuZnVuY3Rpb24gRGUodCkge1xuICAgIHJldHVybiAoZSwgbikgPT4ge1xuICAgICAgICBsZXQgcyA9ICExO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgQWUodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBDZShpLCBlLCBuKTtcbiAgICAgICAgICAgIGlmICgwICE9PSB0KSByZXR1cm4gdDtcbiAgICAgICAgICAgIHMgPSBzIHx8IGkuZmllbGQuaXNLZXlGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIENlKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gdC5maWVsZC5pc0tleUZpZWxkKCkgPyBTdC5jb21wYXJhdG9yKGUua2V5LCBuLmtleSkgOiBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBlLmRhdGEuZmllbGQodCksIGkgPSBuLmRhdGEuZmllbGQodCk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSBzICYmIG51bGwgIT09IGkgPyBrdChzLCBpKSA6IEwoKTtcbiAgICB9KHQuZmllbGQsIGUsIG4pO1xuICAgIHN3aXRjaCAodC5kaXIpIHtcbiAgICAgIGNhc2UgXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi8gOlxuICAgICAgICByZXR1cm4gcztcblxuICAgICAgY2FzZSBcImRlc2NcIiAvKiBERVNDRU5ESU5HICovIDpcbiAgICAgICAgcmV0dXJuIC0xICogcztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIEwoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJldHVybnMgYW4gRG91YmxlVmFsdWUgZm9yIGB2YWx1ZWAgdGhhdCBpcyBlbmNvZGVkIGJhc2VkIHRoZSBzZXJpYWxpemVyJ3NcbiAqIGB1c2VQcm90bzNKc29uYCBzZXR0aW5nLlxuICovIGZ1bmN0aW9uIE5lKHQsIGUpIHtcbiAgICBpZiAodC5DKSB7XG4gICAgICAgIGlmIChpc05hTihlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIk5hTlwiXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlID09PSAxIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIkluZmluaXR5XCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGUgPT09IC0xIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIi1JbmZpbml0eVwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRvdWJsZVZhbHVlOiB2dChlKSA/IFwiLTBcIiA6IGVcbiAgICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSW50ZWdlclZhbHVlIGZvciBgdmFsdWVgLlxuICovIGZ1bmN0aW9uIGtlKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnRlZ2VyVmFsdWU6IFwiXCIgKyB0XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgZm9yIGEgbnVtYmVyIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50byBhIHByb3RvLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBJbnRlZ2VyVmFsdWUgaWYgaXQgY2FuIHNhZmVseSByZXByZXNlbnQgdGhlIHZhbHVlLFxuICogb3RoZXJ3aXNlIGEgRG91YmxlVmFsdWUgaXMgcmV0dXJuZWQuXG4gKi8gZnVuY3Rpb24geGUodCwgZSkge1xuICAgIHJldHVybiBWdChlKSA/IGtlKGUpIDogTmUodCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVXNlZCB0byByZXByZXNlbnQgYSBmaWVsZCB0cmFuc2Zvcm0gb24gYSBtdXRhdGlvbi4gKi8gY2xhc3MgJGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJhbCB0eXBlIG9mIGBUcmFuc2Zvcm1PcGVyYXRpb25gIGlzIHVuaXF1ZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTQ1MVxuICAgICAgICB0aGlzLl8gPSB2b2lkIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2NhbCB0cmFuc2Zvcm0gcmVzdWx0IGFnYWluc3QgdGhlIHByb3ZpZGVkIGBwcmV2aW91c1ZhbHVlYCxcbiAqIG9wdGlvbmFsbHkgdXNpbmcgdGhlIHByb3ZpZGVkIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIEZlKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIExlID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic2VydmVyX3RpbWVzdGFtcFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfX2xvY2FsX3dyaXRlX3RpbWVfXzoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFub3M6IHQubmFub3NlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGUgJiYgKG4uZmllbGRzLl9fcHJldmlvdXNfdmFsdWVfXyA9IGUpLCB7XG4gICAgICAgICAgICBtYXBWYWx1ZTogblxuICAgICAgICB9O1xuICAgIH0obiwgZSkgOiB0IGluc3RhbmNlb2YgQmUgPyBVZSh0LCBlKSA6IHQgaW5zdGFuY2VvZiBxZSA/IEtlKHQsIGUpIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFNpbmNlIEphdmFTY3JpcHQncyBpbnRlZ2VyIGFyaXRobWV0aWMgaXMgbGltaXRlZCB0byA1MyBiaXRcbiAgICAgICAgLy8gcHJlY2lzaW9uIGFuZCByZXNvbHZlcyBvdmVyZmxvd3MgYnkgcmVkdWNpbmcgcHJlY2lzaW9uLCB3ZSBkbyBub3RcbiAgICAgICAgLy8gbWFudWFsbHkgY2FwIG92ZXJmbG93cyBhdCAyXjYzLlxuICAgICAgICBjb25zdCBuID0gTWUodCwgZSksIHMgPSBRZShuKSArIFFlKHQuTik7XG4gICAgICAgIHJldHVybiBNdChuKSAmJiBNdCh0Lk4pID8ga2UocykgOiBOZSh0LmssIHMpO1xuICAgIH0odCwgZSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBmaW5hbCB0cmFuc2Zvcm0gcmVzdWx0IGFmdGVyIHRoZSB0cmFuc2Zvcm0gaGFzIGJlZW4gYWNrbm93bGVkZ2VkXG4gKiBieSB0aGUgc2VydmVyLCBwb3RlbnRpYWxseSB1c2luZyB0aGUgc2VydmVyLXByb3ZpZGVkIHRyYW5zZm9ybVJlc3VsdC5cbiAqLyBmdW5jdGlvbiBPZSh0LCBlLCBuKSB7XG4gICAgLy8gVGhlIHNlcnZlciBqdXN0IHNlbmRzIG51bGwgYXMgdGhlIHRyYW5zZm9ybSByZXN1bHQgZm9yIGFycmF5IG9wZXJhdGlvbnMsXG4gICAgLy8gc28gd2UgaGF2ZSB0byBjYWxjdWxhdGUgYSByZXN1bHQgdGhlIHNhbWUgYXMgd2UgZG8gZm9yIGxvY2FsXG4gICAgLy8gYXBwbGljYXRpb25zLlxuICAgIHJldHVybiB0IGluc3RhbmNlb2YgQmUgPyBVZSh0LCBlKSA6IHQgaW5zdGFuY2VvZiBxZSA/IEtlKHQsIGUpIDogbjtcbn1cblxuLyoqXG4gKiBJZiB0aGlzIHRyYW5zZm9ybSBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG9cbiAqIHBlcnNpc3QgZm9yIHRoaXMgdHJhbnNmb3JtLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSB0cmFuc2Zvcm1cbiAqIG9wZXJhdGlvbiBpcyBhbHdheXMgYXBwbGllZCB0byB0aGlzIGJhc2UgdmFsdWUsIGV2ZW4gaWYgZG9jdW1lbnQgaGFzXG4gKiBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBCYXNlIHZhbHVlcyBwcm92aWRlIGNvbnNpc3RlbnQgYmVoYXZpb3IgZm9yIG5vbi1pZGVtcG90ZW50IHRyYW5zZm9ybXMgYW5kXG4gKiBhbGxvdyB1cyB0byByZXR1cm4gdGhlIHNhbWUgbGF0ZW5jeS1jb21wZW5zYXRlZCB2YWx1ZSBldmVuIGlmIHRoZSBiYWNrZW5kXG4gKiBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSB0cmFuc2Zvcm0gb3BlcmF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvclxuICogaWRlbXBvdGVudCB0cmFuc2Zvcm1zLCBhcyB0aGV5IGNhbiBiZSByZS1wbGF5ZWQgZXZlbiBpZiB0aGUgYmFja2VuZCBoYXNcbiAqIGFscmVhZHkgYXBwbGllZCB0aGVtLlxuICpcbiAqIEByZXR1cm5zIGEgYmFzZSB2YWx1ZSB0byBzdG9yZSBhbG9uZyB3aXRoIHRoZSBtdXRhdGlvbiwgb3IgbnVsbCBmb3JcbiAqIGlkZW1wb3RlbnQgdHJhbnNmb3Jtcy5cbiAqLyBmdW5jdGlvbiBNZSh0LCBlKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBqZSA/IE10KG4gPSBlKSB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiAhIXQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIHQ7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBlaXRoZXIgYW4gSW50ZWdlclZhbHVlIG9yIGEgRG91YmxlVmFsdWUuICovIChuKSA/IGUgOiB7XG4gICAgICAgIGludGVnZXJWYWx1ZTogMFxuICAgIH0gOiBudWxsO1xuICAgIHZhciBuO1xufVxuXG4vKiogVHJhbnNmb3JtcyBhIHZhbHVlIGludG8gYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcC4gKi9cbmNsYXNzIExlIGV4dGVuZHMgJGUge31cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgdW5pb24gb3BlcmF0aW9uLiAqLyBjbGFzcyBCZSBleHRlbmRzICRlIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZWxlbWVudHMgPSB0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gVWUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBXZShlKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5lbGVtZW50cykgbi5zb21lKCh0ID0+IEN0KHQsIGUpKSkgfHwgbi5wdXNoKGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgIHZhbHVlczogblxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqIFRyYW5zZm9ybXMgYW4gYXJyYXkgdmFsdWUgdmlhIGEgcmVtb3ZlIG9wZXJhdGlvbi4gKi8gY2xhc3MgcWUgZXh0ZW5kcyAkZSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmVsZW1lbnRzID0gdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEtlKHQsIGUpIHtcbiAgICBsZXQgbiA9IFdlKGUpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0LmVsZW1lbnRzKSBuID0gbi5maWx0ZXIoKHQgPT4gIUN0KHQsIGUpKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgdmFsdWVzOiBuXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGJhY2tlbmQgc2VtYW50aWNzIGZvciBsb2NhbGx5IGNvbXB1dGVkIE5VTUVSSUNfQUREIChpbmNyZW1lbnQpXG4gKiB0cmFuc2Zvcm1zLiBDb252ZXJ0cyBhbGwgZmllbGQgdmFsdWVzIHRvIGludGVnZXJzIG9yIGRvdWJsZXMsIGJ1dCB1bmxpa2UgdGhlXG4gKiBiYWNrZW5kIGRvZXMgbm90IGNhcCBpbnRlZ2VyIHZhbHVlcyBhdCAyXjYzLiBJbnN0ZWFkLCBKYXZhU2NyaXB0IG51bWJlclxuICogYXJpdGhtZXRpYyBpcyB1c2VkIGFuZCBwcmVjaXNpb24gbG9zcyBjYW4gb2NjdXIgZm9yIHZhbHVlcyBncmVhdGVyIHRoYW4gMl41My5cbiAqLyBjbGFzcyBqZSBleHRlbmRzICRlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuayA9IHQsIHRoaXMuTiA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBRZSh0KSB7XG4gICAgcmV0dXJuIEV0KHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBXZSh0KSB7XG4gICAgcmV0dXJuIEx0KHQpICYmIHQuYXJyYXlWYWx1ZS52YWx1ZXMgPyB0LmFycmF5VmFsdWUudmFsdWVzLnNsaWNlKCkgOiBbXTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBBIGZpZWxkIHBhdGggYW5kIHRoZSBUcmFuc2Zvcm1PcGVyYXRpb24gdG8gcGVyZm9ybSB1cG9uIGl0LiAqLyBjbGFzcyBHZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmZpZWxkID0gdCwgdGhpcy50cmFuc2Zvcm0gPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gemUodCwgZSkge1xuICAgIHJldHVybiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEJlICYmIGUgaW5zdGFuY2VvZiBCZSB8fCB0IGluc3RhbmNlb2YgcWUgJiYgZSBpbnN0YW5jZW9mIHFlID8gcnQodC5lbGVtZW50cywgZS5lbGVtZW50cywgQ3QpIDogdCBpbnN0YW5jZW9mIGplICYmIGUgaW5zdGFuY2VvZiBqZSA/IEN0KHQuTiwgZS5OKSA6IHQgaW5zdGFuY2VvZiBMZSAmJiBlIGluc3RhbmNlb2YgTGU7XG4gICAgfSh0LnRyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xufVxuXG4vKiogVGhlIHJlc3VsdCBvZiBzdWNjZXNzZnVsbHkgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byB0aGUgYmFja2VuZC4gKi9cbmNsYXNzIEhlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBhdCB3aGljaCB0aGUgbXV0YXRpb24gd2FzIGNvbW1pdHRlZDpcbiAgICAgKlxuICAgICAqIC0gRm9yIG1vc3Qgb3BlcmF0aW9ucywgdGhpcyBpcyB0aGUgdXBkYXRlVGltZSBpbiB0aGUgV3JpdGVSZXN1bHQuXG4gICAgICogLSBGb3IgZGVsZXRlcywgdGhlIGNvbW1pdFRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgKGJlY2F1c2UgZGVsZXRlcyBhcmVcbiAgICAgKiAgIG5vdCBzdG9yZWQgYW5kIGhhdmUgbm8gdXBkYXRlVGltZSkuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlc2UgdmVyc2lvbnMgY2FuIGJlIGRpZmZlcmVudDogTm8tb3Agd3JpdGVzIHdpbGwgbm90IGNoYW5nZVxuICAgICAqIHRoZSB1cGRhdGVUaW1lIGV2ZW4gdGhvdWdoIHRoZSBjb21taXRUaW1lIGFkdmFuY2VzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHRpbmcgZmllbGRzIHJldHVybmVkIGZyb20gdGhlIGJhY2tlbmQgYWZ0ZXIgYSBtdXRhdGlvblxuICAgICAqIGNvbnRhaW5pbmcgZmllbGQgdHJhbnNmb3JtcyBoYXMgYmVlbiBjb21taXR0ZWQuIENvbnRhaW5zIG9uZSBGaWVsZFZhbHVlXG4gICAgICogZm9yIGVhY2ggRmllbGRUcmFuc2Zvcm0gdGhhdCB3YXMgaW4gdGhlIG11dGF0aW9uLlxuICAgICAqXG4gICAgICogV2lsbCBiZSBlbXB0eSBpZiB0aGUgbXV0YXRpb24gZGlkIG5vdCBjb250YWluIGFueSBmaWVsZCB0cmFuc2Zvcm1zLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdCwgdGhpcy50cmFuc2Zvcm1SZXN1bHRzID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHByZWNvbmRpdGlvbiBmb3IgYSBtdXRhdGlvbi4gVGhpcyBmb2xsb3dzIHRoZSBtb2RlbCB0aGF0IHRoZVxuICogYmFja2VuZCBhY2NlcHRzIHdpdGggdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBleHBsaWNpdCBcImVtcHR5XCIgcHJlY29uZGl0aW9uXG4gKiAobWVhbmluZyBubyBwcmVjb25kaXRpb24pLlxuICovIGNsYXNzIEplIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZSA9IHQsIHRoaXMuZXhpc3RzID0gZTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgZW1wdHkgUHJlY29uZGl0aW9uLiAqLyAgICBzdGF0aWMgbm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKZTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgUHJlY29uZGl0aW9uIHdpdGggYW4gZXhpc3RzIGZsYWcuICovICAgIHN0YXRpYyBleGlzdHModCkge1xuICAgICAgICByZXR1cm4gbmV3IEplKHZvaWQgMCwgdCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IFByZWNvbmRpdGlvbiBiYXNlZCBvbiBhIHZlcnNpb24gYSBkb2N1bWVudCBleGlzdHMgYXQuICovICAgIHN0YXRpYyB1cGRhdGVUaW1lKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKZSh0KTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgd2hldGhlciB0aGlzIFByZWNvbmRpdGlvbiBpcyBlbXB0eS4gKi8gICAgZ2V0IGlzTm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdGhpcy51cGRhdGVUaW1lICYmIHZvaWQgMCA9PT0gdGhpcy5leGlzdHM7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGlzdHMgPT09IHQuZXhpc3RzICYmICh0aGlzLnVwZGF0ZVRpbWUgPyAhIXQudXBkYXRlVGltZSAmJiB0aGlzLnVwZGF0ZVRpbWUuaXNFcXVhbCh0LnVwZGF0ZVRpbWUpIDogIXQudXBkYXRlVGltZSk7XG4gICAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBwcmVjb25kaXRpb25zIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuICovIGZ1bmN0aW9uIFllKHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSB0LnVwZGF0ZVRpbWUgPyBlLmlzRm91bmREb2N1bWVudCgpICYmIGUudmVyc2lvbi5pc0VxdWFsKHQudXBkYXRlVGltZSkgOiB2b2lkIDAgPT09IHQuZXhpc3RzIHx8IHQuZXhpc3RzID09PSBlLmlzRm91bmREb2N1bWVudCgpO1xufVxuXG4vKipcbiAqIEEgbXV0YXRpb24gZGVzY3JpYmVzIGEgc2VsZi1jb250YWluZWQgY2hhbmdlIHRvIGEgZG9jdW1lbnQuIE11dGF0aW9ucyBjYW5cbiAqIGNyZWF0ZSwgcmVwbGFjZSwgZGVsZXRlLCBhbmQgdXBkYXRlIHN1YnNldHMgb2YgZG9jdW1lbnRzLlxuICpcbiAqIE11dGF0aW9ucyBub3Qgb25seSBhY3Qgb24gdGhlIHZhbHVlIG9mIHRoZSBkb2N1bWVudCBidXQgYWxzbyBpdHMgdmVyc2lvbi5cbiAqXG4gKiBGb3IgbG9jYWwgbXV0YXRpb25zIChtdXRhdGlvbnMgdGhhdCBoYXZlbid0IGJlZW4gY29tbWl0dGVkIHlldCksIHdlIHByZXNlcnZlXG4gKiB0aGUgZXhpc3RpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEZvciBEZWxldGUgbXV0YXRpb25zLCB3ZVxuICogcmVzZXQgdGhlIHZlcnNpb24gdG8gMC5cbiAqXG4gKiBIZXJlJ3MgdGhlIGV4cGVjdGVkIHRyYW5zaXRpb24gdGFibGUuXG4gKlxuICogTVVUQVRJT04gICAgICAgICAgIEFQUExJRUQgVE8gICAgICAgICAgICBSRVNVTFRTIElOXG4gKlxuICogU2V0TXV0YXRpb24gICAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFNldE11dGF0aW9uICAgICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgRG9jdW1lbnQodjApXG4gKiBTZXRNdXRhdGlvbiAgICAgICAgSW52YWxpZERvY3VtZW50KHYwKSAgIERvY3VtZW50KHYwKVxuICogUGF0Y2hNdXRhdGlvbiAgICAgIERvY3VtZW50KHYzKSAgICAgICAgICBEb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBOb0RvY3VtZW50KHYzKSAgICAgICAgTm9Eb2N1bWVudCh2MylcbiAqIFBhdGNoTXV0YXRpb24gICAgICBJbnZhbGlkRG9jdW1lbnQodjApICAgVW5rbm93bkRvY3VtZW50KHYzKVxuICogRGVsZXRlTXV0YXRpb24gICAgIERvY3VtZW50KHYzKSAgICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIE5vRG9jdW1lbnQodjMpICAgICAgICBOb0RvY3VtZW50KHYwKVxuICogRGVsZXRlTXV0YXRpb24gICAgIEludmFsaWREb2N1bWVudCh2MCkgICBOb0RvY3VtZW50KHYwKVxuICpcbiAqIEZvciBhY2tub3dsZWRnZWQgbXV0YXRpb25zLCB3ZSB1c2UgdGhlIHVwZGF0ZVRpbWUgb2YgdGhlIFdyaXRlUmVzcG9uc2UgYXNcbiAqIHRoZSByZXN1bHRpbmcgdmVyc2lvbiBmb3IgU2V0IGFuZCBQYXRjaCBtdXRhdGlvbnMuIEFzIGRlbGV0ZXMgaGF2ZSBub1xuICogZXhwbGljaXQgdXBkYXRlIHRpbWUsIHdlIHVzZSB0aGUgY29tbWl0VGltZSBvZiB0aGUgV3JpdGVSZXNwb25zZSBmb3JcbiAqIERlbGV0ZSBtdXRhdGlvbnMuXG4gKlxuICogSWYgYSBtdXRhdGlvbiBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQgYnV0IGZhaWxzIHRoZSBwcmVjb25kaXRpb24gY2hlY2tcbiAqIGxvY2FsbHksIHdlIHRyYW5zaXRpb24gdG8gYW4gYFVua25vd25Eb2N1bWVudGAgYW5kIHJlbHkgb24gV2F0Y2ggdG8gc2VuZCB1c1xuICogdGhlIHVwZGF0ZWQgdmVyc2lvbi5cbiAqXG4gKiBGaWVsZCB0cmFuc2Zvcm1zIGFyZSB1c2VkIG9ubHkgd2l0aCBQYXRjaCBhbmQgU2V0IE11dGF0aW9ucy4gV2UgdXNlIHRoZVxuICogYHVwZGF0ZVRyYW5zZm9ybXNgIG1lc3NhZ2UgdG8gc3RvcmUgdHJhbnNmb3JtcywgcmF0aGVyIHRoYW4gdGhlIGB0cmFuc2Zvcm1zYHNcbiAqIG1lc3NhZ2VzLlxuICpcbiAqICMjIFN1YmNsYXNzaW5nIE5vdGVzXG4gKlxuICogRXZlcnkgdHlwZSBvZiBtdXRhdGlvbiBuZWVkcyB0byBpbXBsZW1lbnQgaXRzIG93biBhcHBseVRvUmVtb3RlRG9jdW1lbnQoKSBhbmRcbiAqIGFwcGx5VG9Mb2NhbFZpZXcoKSB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCBiZWhhdmlvciBvZiBhcHBseWluZyB0aGUgbXV0YXRpb25cbiAqIHRvIHNvbWUgc291cmNlIGRvY3VtZW50IChzZWUgYHNldE11dGF0aW9uQXBwbHlUb1JlbW90ZURvY3VtZW50KClgIGZvciBhblxuICogZXhhbXBsZSkuXG4gKi8gY2xhc3MgWGUge31cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nIGFcbiAqIG5ldyByZW1vdGUgZG9jdW1lbnQuIElmIHRoZSBpbnB1dCBkb2N1bWVudCBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBzdGF0ZVxuICogKGUuZy4gaXQgaXMgaW52YWxpZCBvciBvdXRkYXRlZCksIHRoZSBkb2N1bWVudCB0eXBlIG1heSB0cmFuc2l0aW9uIHRvXG4gKiB1bmtub3duLlxuICpcbiAqIEBwYXJhbSBtdXRhdGlvbiAtIFRoZSBtdXRhdGlvbiB0byBhcHBseS5cbiAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBtdXRhdGUuIFRoZSBpbnB1dCBkb2N1bWVudCBjYW4gYmUgYW5cbiAqICAgICBpbnZhbGlkIGRvY3VtZW50IGlmIHRoZSBjbGllbnQgaGFzIG5vIGtub3dsZWRnZSBvZiB0aGUgcHJlLW11dGF0aW9uIHN0YXRlXG4gKiAgICAgb2YgdGhlIGRvY3VtZW50LlxuICogQHBhcmFtIG11dGF0aW9uUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgbXV0YXRpb24gZnJvbSB0aGUgYmFja2VuZC5cbiAqLyBmdW5jdGlvbiBaZSh0LCBlLCBuKSB7XG4gICAgdCBpbnN0YW5jZW9mIHJuID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2Ugc2V0TXV0YXRpb25BcHBseVRvTG9jYWxWaWV3LCBpZiB3ZSdyZSBhcHBseWluZyBhIG11dGF0aW9uIHRvIGFcbiAgICAgICAgLy8gcmVtb3RlIGRvY3VtZW50IHRoZSBzZXJ2ZXIgaGFzIGFjY2VwdGVkIHRoZSBtdXRhdGlvbiBzbyB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgIC8vIG11c3QgaGF2ZSBoZWxkLlxuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gY24odC5maWVsZFRyYW5zZm9ybXMsIGUsIG4udHJhbnNmb3JtUmVzdWx0cyk7XG4gICAgICAgIHMuc2V0QWxsKGkpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBzKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogdCBpbnN0YW5jZW9mIG9uID8gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBpZiAoIVllKHQucHJlY29uZGl0aW9uLCBlKSkgXG4gICAgICAgIC8vIFNpbmNlIHRoZSBtdXRhdGlvbiB3YXMgbm90IHJlamVjdGVkLCB3ZSBrbm93IHRoYXQgdGhlIHByZWNvbmRpdGlvblxuICAgICAgICAvLyBtYXRjaGVkIG9uIHRoZSBiYWNrZW5kLiBXZSB0aGVyZWZvcmUgbXVzdCBub3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdmVyc2lvblxuICAgICAgICAvLyBvZiB0aGUgZG9jdW1lbnQgaW4gb3VyIGNhY2hlIGFuZCBjb252ZXJ0IHRvIGFuIFVua25vd25Eb2N1bWVudCB3aXRoIGFcbiAgICAgICAgLy8ga25vd24gdXBkYXRlVGltZS5cbiAgICAgICAgcmV0dXJuIHZvaWQgZS5jb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQobi52ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgcyA9IGNuKHQuZmllbGRUcmFuc2Zvcm1zLCBlLCBuLnRyYW5zZm9ybVJlc3VsdHMpLCBpID0gZS5kYXRhO1xuICAgICAgICBpLnNldEFsbChhbih0KSksIGkuc2V0QWxsKHMpLCBlLmNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQobi52ZXJzaW9uLCBpKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAvLyBVbmxpa2UgYXBwbHlUb0xvY2FsVmlldywgaWYgd2UncmUgYXBwbHlpbmcgYSBtdXRhdGlvbiB0byBhIHJlbW90ZVxuICAgICAgICAvLyBkb2N1bWVudCB0aGUgc2VydmVyIGhhcyBhY2NlcHRlZCB0aGUgbXV0YXRpb24gc28gdGhlIHByZWNvbmRpdGlvbiBtdXN0XG4gICAgICAgIC8vIGhhdmUgaGVsZC5cbiAgICAgICAgZS5jb252ZXJ0VG9Ob0RvY3VtZW50KG4udmVyc2lvbikuc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCk7XG4gICAgfSgwLCBlLCBuKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoaXMgbXV0YXRpb24gdG8gdGhlIGdpdmVuIGRvY3VtZW50IGZvciB0aGUgcHVycG9zZXMgb2YgY29tcHV0aW5nXG4gKiB0aGUgbmV3IGxvY2FsIHZpZXcgb2YgYSBkb2N1bWVudC4gSWYgdGhlIGlucHV0IGRvY3VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlXG4gKiBleHBlY3RlZCBzdGF0ZSwgdGhlIGRvY3VtZW50IGlzIG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAcGFyYW0gbXV0YXRpb24gLSBUaGUgbXV0YXRpb24gdG8gYXBwbHkuXG4gKiBAcGFyYW0gZG9jdW1lbnQgLSBUaGUgZG9jdW1lbnQgdG8gbXV0YXRlLiBUaGUgaW5wdXQgZG9jdW1lbnQgY2FuIGJlIGFuXG4gKiAgICAgaW52YWxpZCBkb2N1bWVudCBpZiB0aGUgY2xpZW50IGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIHByZS1tdXRhdGlvbiBzdGF0ZVxuICogICAgIG9mIHRoZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBsb2NhbFdyaXRlVGltZSAtIEEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIGxvY2FsIHdyaXRlIHRpbWUgb2YgdGhlXG4gKiAgICAgYmF0Y2ggdGhpcyBtdXRhdGlvbiBpcyBhIHBhcnQgb2YuXG4gKi8gZnVuY3Rpb24gdG4odCwgZSwgbikge1xuICAgIHQgaW5zdGFuY2VvZiBybiA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFZZSh0LnByZWNvbmRpdGlvbiwgZSkpIFxuICAgICAgICAvLyBUaGUgbXV0YXRpb24gZmFpbGVkIHRvIGFwcGx5IChlLmcuIGEgZG9jdW1lbnQgSUQgY3JlYXRlZCB3aXRoIGFkZCgpXG4gICAgICAgIC8vIGNhdXNlZCBhIG5hbWUgY29sbGlzaW9uKS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdC52YWx1ZS5jbG9uZSgpLCBpID0gdW4odC5maWVsZFRyYW5zZm9ybXMsIG4sIGUpO1xuICAgICAgICBzLnNldEFsbChpKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KHNuKGUpLCBzKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCBtb2RpZmllcyBmaWVsZHMgb2YgdGhlIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBrZXkgd2l0aCB0aGVcbiAqIGdpdmVuIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgYXBwbGllZCB0aHJvdWdoIGEgZmllbGQgbWFzazpcbiAqXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gYm90aCB0aGUgbWFzayBhbmQgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRcbiAqICAgIGlzIHVwZGF0ZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gbmVpdGhlciB0aGUgbWFzayBub3IgdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgIGZpZWxkIGlzIHVubW9kaWZpZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgaW4gdGhlIG1hc2sgYnV0IG5vdCBpbiB0aGUgdmFsdWVzLCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZFxuICogICAgaXMgZGVsZXRlZC5cbiAqICAqIFdoZW4gYSBmaWVsZCBpcyBub3QgaW4gdGhlIG1hc2sgYnV0IGlzIGluIHRoZSB2YWx1ZXMsIHRoZSB2YWx1ZXMgbWFwIGlzXG4gKiAgICBpZ25vcmVkLlxuICovICh0LCBlLCBuKSA6IHQgaW5zdGFuY2VvZiBvbiA/IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKCFZZSh0LnByZWNvbmRpdGlvbiwgZSkpIHJldHVybjtcbiAgICAgICAgY29uc3QgcyA9IHVuKHQuZmllbGRUcmFuc2Zvcm1zLCBuLCBlKSwgaSA9IGUuZGF0YTtcbiAgICAgICAgaS5zZXRBbGwoYW4odCkpLCBpLnNldEFsbChzKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KHNuKGUpLCBpKS5zZXRIYXNMb2NhbE11dGF0aW9ucygpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBGaWVsZFBhdGgvVmFsdWUgbWFwIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIFBhdGNoTXV0YXRpb24uXG4gKi8gKHQsIGUsIG4pIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBZZSh0LnByZWNvbmRpdGlvbiwgZSkgJiYgXG4gICAgICAgIC8vIFdlIGRvbid0IGNhbGwgYHNldEhhc0xvY2FsTXV0YXRpb25zKClgIHNpbmNlIHdlIHdhbnQgdG8gYmUgYmFja3dhcmRzXG4gICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgU0RLIGJlaGF2aW9yLlxuICAgICAgICBlLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCB2ZXJpZmllcyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGhcbiAqIHRoZSBwcm92aWRlZCBwcmVjb25kaXRpb24uXG4gKlxuICogVGhlIGB2ZXJpZnlgIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgaW4gVHJhbnNhY3Rpb25zLCBhbmQgdGhpcyBjbGFzcyBzZXJ2ZXNcbiAqIHByaW1hcmlseSB0byBmYWNpbGl0YXRlIHNlcmlhbGl6YXRpb24gaW50byBwcm90b3MuXG4gKi8gKHQsIGUpO1xufVxuXG4vKipcbiAqIElmIHRoaXMgbXV0YXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG8gcGVyc2lzdCB3aXRoXG4gKiB0aGlzIG11dGF0aW9uLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSBtdXRhdGlvbiBpcyBhbHdheXMgYXBwbGllZFxuICogdG8gdGhpcyBiYXNlIHZhbHVlLCBldmVuIGlmIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBUaGUgYmFzZSB2YWx1ZSBpcyBhIHNwYXJzZSBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBvbmx5IHRoZSBkb2N1bWVudFxuICogZmllbGRzIGZvciB3aGljaCB0aGlzIG11dGF0aW9uIGNvbnRhaW5zIGEgbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtYXRpb25cbiAqIChlLmcuIGEgbnVtZXJpYyBpbmNyZW1lbnQpLiBUaGUgcHJvdmlkZWQgdmFsdWUgZ3VhcmFudGVlcyBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBmb3Igbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtcyBhbmQgYWxsb3cgdXMgdG8gcmV0dXJuIHRoZSBzYW1lXG4gKiBsYXRlbmN5LWNvbXBlbnNhdGVkIHZhbHVlIGV2ZW4gaWYgdGhlIGJhY2tlbmQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGVcbiAqIG11dGF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvciBpZGVtcG90ZW50IG11dGF0aW9ucywgYXMgdGhleSBjYW4gYmVcbiAqIHJlLXBsYXllZCBldmVuIGlmIHRoZSBiYWNrZW5kIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlbS5cbiAqXG4gKiBAcmV0dXJucyBhIGJhc2UgdmFsdWUgdG8gc3RvcmUgYWxvbmcgd2l0aCB0aGUgbXV0YXRpb24sIG9yIG51bGwgZm9yXG4gKiBpZGVtcG90ZW50IG11dGF0aW9ucy5cbiAqLyBmdW5jdGlvbiBlbih0LCBlKSB7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGZvciAoY29uc3QgcyBvZiB0LmZpZWxkVHJhbnNmb3Jtcykge1xuICAgICAgICBjb25zdCB0ID0gZS5kYXRhLmZpZWxkKHMuZmllbGQpLCBpID0gTWUocy50cmFuc2Zvcm0sIHQgfHwgbnVsbCk7XG4gICAgICAgIG51bGwgIT0gaSAmJiAobnVsbCA9PSBuICYmIChuID0ganQuZW1wdHkoKSksIG4uc2V0KHMuZmllbGQsIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG4gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gbm4odCwgZSkge1xuICAgIHJldHVybiB0LnR5cGUgPT09IGUudHlwZSAmJiAoISF0LmtleS5pc0VxdWFsKGUua2V5KSAmJiAoISF0LnByZWNvbmRpdGlvbi5pc0VxdWFsKGUucHJlY29uZGl0aW9uKSAmJiAoISFmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgJiYgdm9pZCAwID09PSBlIHx8ICEoIXQgfHwgIWUpICYmIHJ0KHQsIGUsICgodCwgZSkgPT4gemUodCwgZSkpKTtcbiAgICB9KHQuZmllbGRUcmFuc2Zvcm1zLCBlLmZpZWxkVHJhbnNmb3JtcykgJiYgKDAgLyogU2V0ICovID09PSB0LnR5cGUgPyB0LnZhbHVlLmlzRXF1YWwoZS52YWx1ZSkgOiAxIC8qIFBhdGNoICovICE9PSB0LnR5cGUgfHwgdC5kYXRhLmlzRXF1YWwoZS5kYXRhKSAmJiB0LmZpZWxkTWFzay5pc0VxdWFsKGUuZmllbGRNYXNrKSkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBmb3IgdXNlIGFzIHRoZSByZXN1bHQgb2YgYVxuICogbXV0YXRpb24uIE11dGF0aW9ucyBhcmUgZGVmaW5lZCB0byByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnRcbiAqIG9ubHkgaWYgaXQgaXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQuIERlbGV0ZWQgYW5kIHVua25vd24gZG9jdW1lbnRzIGhhdmUgYVxuICogcG9zdC1tdXRhdGlvbiB2ZXJzaW9uIG9mIFNuYXBzaG90VmVyc2lvbi5taW4oKS5cbiAqLyBmdW5jdGlvbiBzbih0KSB7XG4gICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgPyB0LnZlcnNpb24gOiBjdC5taW4oKTtcbn1cblxuLyoqXG4gKiBBIG11dGF0aW9uIHRoYXQgY3JlYXRlcyBvciByZXBsYWNlcyB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIGtleSB3aXRoIHRoZVxuICogb2JqZWN0IHZhbHVlIGNvbnRlbnRzLlxuICovIGNsYXNzIHJuIGV4dGVuZHMgWGUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMgPSBbXSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmtleSA9IHQsIHRoaXMudmFsdWUgPSBlLCB0aGlzLnByZWNvbmRpdGlvbiA9IG4sIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gcywgXG4gICAgICAgIHRoaXMudHlwZSA9IDAgLyogU2V0ICovO1xuICAgIH1cbn1cblxuY2xhc3Mgb24gZXh0ZW5kcyBYZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5kYXRhID0gZSwgdGhpcy5maWVsZE1hc2sgPSBuLCB0aGlzLnByZWNvbmRpdGlvbiA9IHMsIFxuICAgICAgICB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGksIHRoaXMudHlwZSA9IDEgLyogUGF0Y2ggKi87XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhbih0KSB7XG4gICAgY29uc3QgZSA9IG5ldyBNYXA7XG4gICAgcmV0dXJuIHQuZmllbGRNYXNrLmZpZWxkcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgaWYgKCFuLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHQuZGF0YS5maWVsZChuKTtcbiAgICAgICAgICAgIGUuc2V0KG4sIHMpO1xuICAgICAgICB9XG4gICAgfSkpLCBlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsaXN0IG9mIFwidHJhbnNmb3JtIHJlc3VsdHNcIiAoYSB0cmFuc2Zvcm0gcmVzdWx0IGlzIGEgZmllbGQgdmFsdWVcbiAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGEgdHJhbnNmb3JtKSBmb3IgdXNlIGFmdGVyIGEgbXV0YXRpb25cbiAqIGNvbnRhaW5pbmcgdHJhbnNmb3JtcyBoYXMgYmVlbiBhY2tub3dsZWRnZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0gZmllbGRUcmFuc2Zvcm1zIC0gVGhlIGZpZWxkIHRyYW5zZm9ybXMgdG8gYXBwbHkgdGhlIHJlc3VsdCB0by5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiBwcmV2aW91cyBtdXRhdGlvbnMuXG4gKiBAcGFyYW0gc2VydmVyVHJhbnNmb3JtUmVzdWx0cyAtIFRoZSB0cmFuc2Zvcm0gcmVzdWx0cyByZWNlaXZlZCBieSB0aGUgc2VydmVyLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gY24odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIEIodC5sZW5ndGggPT09IG4ubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IHRbaV0sIG8gPSByLnRyYW5zZm9ybSwgYSA9IGUuZGF0YS5maWVsZChyLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoci5maWVsZCwgT2UobywgYSwgbltpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGlzdCBvZiBcInRyYW5zZm9ybSByZXN1bHRzXCIgKGEgdHJhbnNmb3JtIHJlc3VsdCBpcyBhIGZpZWxkIHZhbHVlXG4gKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIHRyYW5zZm9ybSkgZm9yIHVzZSB3aGVuIGFwcGx5aW5nIGFcbiAqIHRyYW5zZm9ybSBsb2NhbGx5LlxuICpcbiAqIEBwYXJhbSBmaWVsZFRyYW5zZm9ybXMgLSBUaGUgZmllbGQgdHJhbnNmb3JtcyB0byBhcHBseSB0aGUgcmVzdWx0IHRvLlxuICogQHBhcmFtIGxvY2FsV3JpdGVUaW1lIC0gVGhlIGxvY2FsIHRpbWUgb2YgdGhlIG11dGF0aW9uICh1c2VkIHRvXG4gKiAgICAgZ2VuZXJhdGUgU2VydmVyVGltZXN0YW1wVmFsdWVzKS5cbiAqIEBwYXJhbSBtdXRhYmxlRG9jdW1lbnQgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYXBwbHlpbmcgYWxsXG4gKiAgICAgcHJldmlvdXMgbXV0YXRpb25zLlxuICogQHJldHVybnMgVGhlIHRyYW5zZm9ybSByZXN1bHRzIGxpc3QuXG4gKi8gZnVuY3Rpb24gdW4odCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuZXcgTWFwO1xuICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICAgIGNvbnN0IHQgPSBpLnRyYW5zZm9ybSwgciA9IG4uZGF0YS5maWVsZChpLmZpZWxkKTtcbiAgICAgICAgcy5zZXQoaS5maWVsZCwgRmUodCwgciwgZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqIEEgbXV0YXRpb24gdGhhdCBkZWxldGVzIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5LiAqLyBjbGFzcyBobiBleHRlbmRzIFhlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAyIC8qIERlbGV0ZSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBsbiBleHRlbmRzIFhlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMua2V5ID0gdCwgdGhpcy5wcmVjb25kaXRpb24gPSBlLCB0aGlzLnR5cGUgPSAzIC8qIFZlcmlmeSAqLyAsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBmbiB7XG4gICAgLy8gVE9ETyhiLzMzMDc4MTYzKToganVzdCB1c2Ugc2ltcGxlc3QgZm9ybSBvZiBleGlzdGVuY2UgZmlsdGVyIGZvciBub3dcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY291bnQgPSB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRXJyb3IgQ29kZXMgZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHdheXMgR1JQQyBjYW4gZmFpbC4gVGhlc2UgYXJlIGNvcGllZFxuICogZGlyZWN0bHkgZnJvbSBHUlBDJ3Mgc291cmNlcyBoZXJlOlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ncnBjL2dycGMvYmxvYi9iY2VlYzk0ZWE0ZmM1ZjAwODVkODEyMzVkOGUxYzA2Nzk4ZGMzNDFhL2luY2x1ZGUvZ3JwYyUyQiUyQi9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oXG4gKlxuICogSW1wb3J0YW50ISBUaGUgbmFtZXMgb2YgdGhlc2UgaWRlbnRpZmllcnMgbWF0dGVyIGJlY2F1c2UgdGhlIHN0cmluZyBmb3Jtc1xuICogYXJlIHVzZWQgZm9yIHJldmVyc2UgbG9va3VwcyBmcm9tIHRoZSB3ZWJjaGFubmVsIHN0cmVhbS4gRG8gTk9UIGNoYW5nZSB0aGVcbiAqIG5hbWVzIG9mIHRoZXNlIGlkZW50aWZpZXJzIG9yIGNoYW5nZSB0aGlzIGludG8gYSBjb25zdCBlbnVtLlxuICovIHZhciBkbiwgd247XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIGNvZGUgcmVwcmVzZW50cyBhIHBlcm1hbmVudCBlcnJvciB3aGVuIHJlY2VpdmVkXG4gKiBpbiByZXNwb25zZSB0byBhIG5vbi13cml0ZSBvcGVyYXRpb24uXG4gKlxuICogU2VlIGlzUGVybWFuZW50V3JpdGVFcnJvciBmb3IgY2xhc3NpZnlpbmcgd3JpdGUgZXJyb3JzLlxuICovXG5mdW5jdGlvbiBfbih0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuXG4gICAgICBjYXNlIEsuQ0FOQ0VMTEVEOlxuICAgICAgY2FzZSBLLlVOS05PV046XG4gICAgICBjYXNlIEsuREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICBjYXNlIEsuUkVTT1VSQ0VfRVhIQVVTVEVEOlxuICAgICAgY2FzZSBLLklOVEVSTkFMOlxuICAgICAgY2FzZSBLLlVOQVZBSUxBQkxFOlxuIC8vIFVuYXV0aGVudGljYXRlZCBtZWFucyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIG91ciB0b2tlbiBhbmQgd2UgbmVlZFxuICAgICAgICAvLyB0byByZXRyeSB3aXRoIG5ldyBjcmVkZW50aWFscyB3aGljaCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgICBjYXNlIEsuVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gITE7XG5cbiAgICAgIGNhc2UgSy5JTlZBTElEX0FSR1VNRU5UOlxuICAgICAgY2FzZSBLLk5PVF9GT1VORDpcbiAgICAgIGNhc2UgSy5BTFJFQURZX0VYSVNUUzpcbiAgICAgIGNhc2UgSy5QRVJNSVNTSU9OX0RFTklFRDpcbiAgICAgIGNhc2UgSy5GQUlMRURfUFJFQ09ORElUSU9OOlxuIC8vIEFib3J0ZWQgbWlnaHQgYmUgcmV0cmllZCBpbiBzb21lIHNjZW5hcmlvcywgYnV0IHRoYXQgaXMgZGVwZW5kYW50IG9uXG4gICAgICAgIC8vIHRoZSBjb250ZXh0IGFuZCBzaG91bGQgaGFuZGxlZCBpbmRpdmlkdWFsbHkgYnkgdGhlIGNhbGxpbmcgY29kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcGlzL2Rlc2lnbi9lcnJvcnMuXG4gICAgICAgICAgICAgIGNhc2UgSy5BQk9SVEVEOlxuICAgICAgY2FzZSBLLk9VVF9PRl9SQU5HRTpcbiAgICAgIGNhc2UgSy5VTklNUExFTUVOVEVEOlxuICAgICAgY2FzZSBLLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXJyb3IgY29kZSByZXByZXNlbnRzIGEgcGVybWFuZW50IGVycm9yIHdoZW4gcmVjZWl2ZWRcbiAqIGluIHJlc3BvbnNlIHRvIGEgd3JpdGUgb3BlcmF0aW9uLlxuICpcbiAqIFdyaXRlIG9wZXJhdGlvbnMgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIGFzIG9mIGIvMTE5NDM3NzY0LCBBQk9SVEVEXG4gKiBlcnJvcnMgb24gdGhlIHdyaXRlIHN0cmVhbSBzaG91bGQgYmUgcmV0cmllZCB0b28gKGV2ZW4gdGhvdWdoIEFCT1JURUQgZXJyb3JzXG4gKiBhcmUgbm90IGdlbmVyYWxseSByZXRyeWFibGUpLlxuICpcbiAqIE5vdGUgdGhhdCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlIG9uIHRoZSB3cml0ZSBzdHJlYW0gYW4gQUJPUlRFRCBlcnJvclxuICogc2lnbmFscyB0aGF0IHdlIHNob3VsZCBkaXNjYXJkIG91ciBzdHJlYW0gdG9rZW4gKGkuZS4gaXQgaXMgcGVybWFuZW50KS4gVGhpc1xuICogbWVhbnMgYSBoYW5kc2hha2UgZXJyb3Igc2hvdWxkIGJlIGNsYXNzaWZpZWQgd2l0aCBpc1Blcm1hbmVudEVycm9yLCBhYm92ZS5cbiAqL1xuLyoqXG4gKiBNYXBzIGFuIGVycm9yIENvZGUgZnJvbSBHUlBDIHN0YXR1cyBjb2RlIG51bWJlciwgbGlrZSAwLCAxLCBvciAxNC4gVGhlc2VcbiAqIGFyZSBub3QgdGhlIHNhbWUgYXMgSFRUUCBzdGF0dXMgY29kZXMuXG4gKlxuICogQHJldHVybnMgVGhlIENvZGUgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gR1JQQyBzdGF0dXMgY29kZS4gRmFpbHMgaWYgdGhlcmVcbiAqICAgICBpcyBubyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gbW4odCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIFxuICAgIC8vIFRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGluIGNlcnRhaW4gZXJyb3IgY2FzZXMgKGxpa2UgdHJ5aW5nXG4gICAgLy8gdG8gc2VuZCBpbnZhbGlkIHByb3RvIG1lc3NhZ2VzKSB3ZSBtYXkgZ2V0IGFuIGVycm9yIHdpdGggbm8gR1JQQyBjb2RlLlxuICAgIHJldHVybiBGKFwiR1JQQyBlcnJvciBoYXMgbm8gLmNvZGVcIiksIEsuVU5LTk9XTjtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGNhc2UgZG4uT0s6XG4gICAgICAgIHJldHVybiBLLk9LO1xuXG4gICAgICBjYXNlIGRuLkNBTkNFTExFRDpcbiAgICAgICAgcmV0dXJuIEsuQ0FOQ0VMTEVEO1xuXG4gICAgICBjYXNlIGRuLlVOS05PV046XG4gICAgICAgIHJldHVybiBLLlVOS05PV047XG5cbiAgICAgIGNhc2UgZG4uREVBRExJTkVfRVhDRUVERUQ6XG4gICAgICAgIHJldHVybiBLLkRFQURMSU5FX0VYQ0VFREVEO1xuXG4gICAgICBjYXNlIGRuLlJFU09VUkNFX0VYSEFVU1RFRDpcbiAgICAgICAgcmV0dXJuIEsuUkVTT1VSQ0VfRVhIQVVTVEVEO1xuXG4gICAgICBjYXNlIGRuLklOVEVSTkFMOlxuICAgICAgICByZXR1cm4gSy5JTlRFUk5BTDtcblxuICAgICAgY2FzZSBkbi5VTkFWQUlMQUJMRTpcbiAgICAgICAgcmV0dXJuIEsuVU5BVkFJTEFCTEU7XG5cbiAgICAgIGNhc2UgZG4uVU5BVVRIRU5USUNBVEVEOlxuICAgICAgICByZXR1cm4gSy5VTkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgIGNhc2UgZG4uSU5WQUxJRF9BUkdVTUVOVDpcbiAgICAgICAgcmV0dXJuIEsuSU5WQUxJRF9BUkdVTUVOVDtcblxuICAgICAgY2FzZSBkbi5OT1RfRk9VTkQ6XG4gICAgICAgIHJldHVybiBLLk5PVF9GT1VORDtcblxuICAgICAgY2FzZSBkbi5BTFJFQURZX0VYSVNUUzpcbiAgICAgICAgcmV0dXJuIEsuQUxSRUFEWV9FWElTVFM7XG5cbiAgICAgIGNhc2UgZG4uUEVSTUlTU0lPTl9ERU5JRUQ6XG4gICAgICAgIHJldHVybiBLLlBFUk1JU1NJT05fREVOSUVEO1xuXG4gICAgICBjYXNlIGRuLkZBSUxFRF9QUkVDT05ESVRJT046XG4gICAgICAgIHJldHVybiBLLkZBSUxFRF9QUkVDT05ESVRJT047XG5cbiAgICAgIGNhc2UgZG4uQUJPUlRFRDpcbiAgICAgICAgcmV0dXJuIEsuQUJPUlRFRDtcblxuICAgICAgY2FzZSBkbi5PVVRfT0ZfUkFOR0U6XG4gICAgICAgIHJldHVybiBLLk9VVF9PRl9SQU5HRTtcblxuICAgICAgY2FzZSBkbi5VTklNUExFTUVOVEVEOlxuICAgICAgICByZXR1cm4gSy5VTklNUExFTUVOVEVEO1xuXG4gICAgICBjYXNlIGRuLkRBVEFfTE9TUzpcbiAgICAgICAgcmV0dXJuIEsuREFUQV9MT1NTO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBIVFRQIHJlc3BvbnNlJ3MgZXJyb3Igc3RhdHVzIHRvIHRoZSBlcXVpdmFsZW50IGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIEFuIEhUVFAgZXJyb3IgcmVzcG9uc2Ugc3RhdHVzIChcIkZBSUxFRF9QUkVDT05ESVRJT05cIixcbiAqIFwiVU5LTk9XTlwiLCBldGMuKVxuICogQHJldHVybnMgVGhlIGVxdWl2YWxlbnQgQ29kZS4gTm9uLW1hdGNoaW5nIHJlc3BvbnNlcyBhcmUgbWFwcGVkIHRvXG4gKiAgICAgQ29kZS5VTktOT1dOLlxuICovICh3biA9IGRuIHx8IChkbiA9IHt9KSlbd24uT0sgPSAwXSA9IFwiT0tcIiwgd25bd24uQ0FOQ0VMTEVEID0gMV0gPSBcIkNBTkNFTExFRFwiLCBcbnduW3duLlVOS05PV04gPSAyXSA9IFwiVU5LTk9XTlwiLCB3blt3bi5JTlZBTElEX0FSR1VNRU5UID0gM10gPSBcIklOVkFMSURfQVJHVU1FTlRcIiwgXG53blt3bi5ERUFETElORV9FWENFRURFRCA9IDRdID0gXCJERUFETElORV9FWENFRURFRFwiLCB3blt3bi5OT1RfRk9VTkQgPSA1XSA9IFwiTk9UX0ZPVU5EXCIsIFxud25bd24uQUxSRUFEWV9FWElTVFMgPSA2XSA9IFwiQUxSRUFEWV9FWElTVFNcIiwgd25bd24uUEVSTUlTU0lPTl9ERU5JRUQgPSA3XSA9IFwiUEVSTUlTU0lPTl9ERU5JRURcIiwgXG53blt3bi5VTkFVVEhFTlRJQ0FURUQgPSAxNl0gPSBcIlVOQVVUSEVOVElDQVRFRFwiLCB3blt3bi5SRVNPVVJDRV9FWEhBVVNURUQgPSA4XSA9IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsIFxud25bd24uRkFJTEVEX1BSRUNPTkRJVElPTiA9IDldID0gXCJGQUlMRURfUFJFQ09ORElUSU9OXCIsIHduW3duLkFCT1JURUQgPSAxMF0gPSBcIkFCT1JURURcIiwgXG53blt3bi5PVVRfT0ZfUkFOR0UgPSAxMV0gPSBcIk9VVF9PRl9SQU5HRVwiLCB3blt3bi5VTklNUExFTUVOVEVEID0gMTJdID0gXCJVTklNUExFTUVOVEVEXCIsIFxud25bd24uSU5URVJOQUwgPSAxM10gPSBcIklOVEVSTkFMXCIsIHduW3duLlVOQVZBSUxBQkxFID0gMTRdID0gXCJVTkFWQUlMQUJMRVwiLCB3blt3bi5EQVRBX0xPU1MgPSAxNV0gPSBcIkRBVEFfTE9TU1wiO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gQW4gaW1tdXRhYmxlIHNvcnRlZCBtYXAgaW1wbGVtZW50YXRpb24sIGJhc2VkIG9uIGEgTGVmdC1sZWFuaW5nIFJlZC1CbGFja1xuLy8gdHJlZS5cbmNsYXNzIGduIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IHQsIHRoaXMucm9vdCA9IGUgfHwgcG4uRU1QVFk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBtYXAsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgYWRkZWQgb3IgcmVwbGFjZWQuXG4gICAgaW5zZXJ0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBnbih0aGlzLmNvbXBhcmF0b3IsIHRoaXMucm9vdC5pbnNlcnQodCwgZSwgdGhpcy5jb21wYXJhdG9yKS5jb3B5KG51bGwsIG51bGwsIHBuLkJMQUNLLCBudWxsLCBudWxsKSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBtYXAsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgcmVtb3ZlZC5cbiAgICByZW1vdmUodCkge1xuICAgICAgICByZXR1cm4gbmV3IGduKHRoaXMuY29tcGFyYXRvciwgdGhpcy5yb290LnJlbW92ZSh0LCB0aGlzLmNvbXBhcmF0b3IpLmNvcHkobnVsbCwgbnVsbCwgcG4uQkxBQ0ssIG51bGwsIG51bGwpKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciBudWxsLlxuICAgIGdldCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy5yb290O1xuICAgICAgICBmb3IgKDshZS5pc0VtcHR5KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuY29tcGFyYXRvcih0LCBlLmtleSk7XG4gICAgICAgICAgICBpZiAoMCA9PT0gbikgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgICAgICBuIDwgMCA/IGUgPSBlLmxlZnQgOiBuID4gMCAmJiAoZSA9IGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGlzIHNvcnRlZCBtYXAsIG9yIC0xIGlmIGl0IGRvZXNuJ3RcbiAgICAvLyBleGlzdC5cbiAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5vZGVzIHRoYXQgd2VyZSBwcnVuZWQgd2hlbiBkZXNjZW5kaW5nIHJpZ2h0XG4gICAgICAgIGxldCBlID0gMCwgbiA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yICg7IW4uaXNFbXB0eSgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmNvbXBhcmF0b3IodCwgbi5rZXkpO1xuICAgICAgICAgICAgaWYgKDAgPT09IHMpIHJldHVybiBlICsgbi5sZWZ0LnNpemU7XG4gICAgICAgICAgICBzIDwgMCA/IG4gPSBuLmxlZnQgOiAoXG4gICAgICAgICAgICAvLyBDb3VudCBhbGwgbm9kZXMgbGVmdCBvZiB0aGUgbm9kZSBwbHVzIHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgICAgZSArPSBuLmxlZnQuc2l6ZSArIDEsIG4gPSBuLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb2RlIG5vdCBmb3VuZFxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbWFwLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LnNpemU7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1pbmltdW0ga2V5IGluIHRoZSBtYXAuXG4gICAgbWluS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290Lm1pbktleSgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGtleSBpbiB0aGUgbWFwLlxuICAgIG1heEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5tYXhLZXkoKTtcbiAgICB9XG4gICAgLy8gVHJhdmVyc2VzIHRoZSBtYXAgaW4ga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBmdW5jdGlvblxuICAgIC8vIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXMgYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgaW5vcmRlclRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuaW5vcmRlclRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0KGUsIG4pLCAhMSkpKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0LnB1c2goYCR7ZX06JHtufWApLCAhMSkpKSwgYHske3Quam9pbihcIiwgXCIpfX1gO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIG1hcCBpbiByZXZlcnNlIGtleSBvcmRlciBhbmQgY2FsbHMgdGhlIHNwZWNpZmllZCBhY3Rpb25cbiAgICAvLyBmdW5jdGlvbiBmb3IgZWFjaCBrZXkvdmFsdWUgcGFpci4gSWYgYWN0aW9uIHJldHVybnMgdHJ1ZSwgdHJhdmVyc2FsIGlzXG4gICAgLy8gYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgcmV2ZXJzZVRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QucmV2ZXJzZVRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBTb3J0ZWRNYXAuXG4gICAgZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBuZXcgeW4odGhpcy5yb290LCBudWxsLCB0aGlzLmNvbXBhcmF0b3IsICExKTtcbiAgICB9XG4gICAgZ2V0SXRlcmF0b3JGcm9tKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB5bih0aGlzLnJvb3QsIHQsIHRoaXMuY29tcGFyYXRvciwgITEpO1xuICAgIH1cbiAgICBnZXRSZXZlcnNlSXRlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBuZXcgeW4odGhpcy5yb290LCBudWxsLCB0aGlzLmNvbXBhcmF0b3IsICEwKTtcbiAgICB9XG4gICAgZ2V0UmV2ZXJzZUl0ZXJhdG9yRnJvbSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgeW4odGhpcy5yb290LCB0LCB0aGlzLmNvbXBhcmF0b3IsICEwKTtcbiAgICB9XG59XG5cbiAvLyBlbmQgU29ydGVkTWFwXG4vLyBBbiBpdGVyYXRvciBvdmVyIGFuIExMUkJOb2RlLlxuY2xhc3MgeW4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5pc1JldmVyc2UgPSBzLCB0aGlzLm5vZGVTdGFjayA9IFtdO1xuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGZvciAoOyF0LmlzRW1wdHkoKTsgKSBpZiAoaSA9IGUgPyBuKHQua2V5LCBlKSA6IDEsIFxuICAgICAgICAvLyBmbGlwIHRoZSBjb21wYXJpc29uIGlmIHdlJ3JlIGdvaW5nIGluIHJldmVyc2VcbiAgICAgICAgcyAmJiAoaSAqPSAtMSksIGkgPCAwKSBcbiAgICAgICAgLy8gVGhpcyBub2RlIGlzIGxlc3MgdGhhbiBvdXIgc3RhcnQga2V5LiBpZ25vcmUgaXRcbiAgICAgICAgdCA9IHRoaXMuaXNSZXZlcnNlID8gdC5sZWZ0IDogdC5yaWdodDsgZWxzZSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBleGFjdGx5IGVxdWFsIHRvIG91ciBzdGFydCBrZXkuIFB1c2ggaXQgb24gdGhlIHN0YWNrLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBzdG9wIGl0ZXJhdGluZztcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKHQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGdyZWF0ZXIgdGhhbiBvdXIgc3RhcnQga2V5LCBhZGQgaXQgdG8gdGhlIHN0YWNrIGFuZCBtb3ZlXG4gICAgICAgICAgICAvLyB0byB0aGUgbmV4dCBvbmVcbiAgICAgICAgICAgIHRoaXMubm9kZVN0YWNrLnB1c2godCksIHQgPSB0aGlzLmlzUmV2ZXJzZSA/IHQucmlnaHQgOiB0LmxlZnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TmV4dCgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGtleTogdC5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5pc1JldmVyc2UpIGZvciAodCA9IHQubGVmdDsgIXQuaXNFbXB0eSgpOyApIHRoaXMubm9kZVN0YWNrLnB1c2godCksIHQgPSB0LnJpZ2h0OyBlbHNlIGZvciAodCA9IHQucmlnaHQ7ICF0LmlzRW1wdHkoKTsgKSB0aGlzLm5vZGVTdGFjay5wdXNoKHQpLCBcbiAgICAgICAgdCA9IHQubGVmdDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGhhc05leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVTdGFjay5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBwZWVrKCkge1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy5ub2RlU3RhY2subGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMubm9kZVN0YWNrW3RoaXMubm9kZVN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0LnZhbHVlXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4gLy8gZW5kIFNvcnRlZE1hcEl0ZXJhdG9yXG4vLyBSZXByZXNlbnRzIGEgbm9kZSBpbiBhIExlZnQtbGVhbmluZyBSZWQtQmxhY2sgdHJlZS5cbmNsYXNzIHBuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy52YWx1ZSA9IGUsIHRoaXMuY29sb3IgPSBudWxsICE9IG4gPyBuIDogcG4uUkVELCB0aGlzLmxlZnQgPSBudWxsICE9IHMgPyBzIDogcG4uRU1QVFksIFxuICAgICAgICB0aGlzLnJpZ2h0ID0gbnVsbCAhPSBpID8gaSA6IHBuLkVNUFRZLCB0aGlzLnNpemUgPSB0aGlzLmxlZnQuc2l6ZSArIDEgKyB0aGlzLnJpZ2h0LnNpemU7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG5vZGUsIG9wdGlvbmFsbHkgcmVwbGFjaW5nIHBpZWNlcyBvZiBpdC5cbiAgICBjb3B5KHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwbihudWxsICE9IHQgPyB0IDogdGhpcy5rZXksIG51bGwgIT0gZSA/IGUgOiB0aGlzLnZhbHVlLCBudWxsICE9IG4gPyBuIDogdGhpcy5jb2xvciwgbnVsbCAhPSBzID8gcyA6IHRoaXMubGVmdCwgbnVsbCAhPSBpID8gaSA6IHRoaXMucmlnaHQpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8vIFRyYXZlcnNlcyB0aGUgdHJlZSBpbiBrZXkgb3JkZXIgYW5kIGNhbGxzIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGZ1bmN0aW9uXG4gICAgLy8gZm9yIGVhY2ggbm9kZS4gSWYgYWN0aW9uIHJldHVybnMgdHJ1ZSwgdHJhdmVyc2FsIGlzIGFib3J0ZWQuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3QgdHJ1dGh5IHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbiwgb3IgdGhlIGxhc3QgZmFsc2V5XG4gICAgLy8gdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLlxuICAgIGlub3JkZXJUcmF2ZXJzYWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Lmlub3JkZXJUcmF2ZXJzYWwodCkgfHwgdCh0aGlzLmtleSwgdGhpcy52YWx1ZSkgfHwgdGhpcy5yaWdodC5pbm9yZGVyVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHRyZWUgaW4gcmV2ZXJzZSBrZXkgb3JkZXIgYW5kIGNhbGxzIHRoZSBzcGVjaWZpZWQgYWN0aW9uXG4gICAgLy8gZnVuY3Rpb24gZm9yIGVhY2ggbm9kZS4gSWYgYWN0aW9uIHJldHVybnMgdHJ1ZSwgdHJhdmVyc2FsIGlzIGFib3J0ZWQuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3QgdHJ1dGh5IHZhbHVlIHJldHVybmVkIGJ5IGFjdGlvbiwgb3IgdGhlIGxhc3QgZmFsc2V5XG4gICAgLy8gdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLlxuICAgIHJldmVyc2VUcmF2ZXJzYWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZXZlcnNlVHJhdmVyc2FsKHQpIHx8IHQodGhpcy5rZXksIHRoaXMudmFsdWUpIHx8IHRoaXMubGVmdC5yZXZlcnNlVHJhdmVyc2FsKHQpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtaW5pbXVtIG5vZGUgaW4gdGhlIHRyZWUuXG4gICAgbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmlzRW1wdHkoKSA/IHRoaXMgOiB0aGlzLmxlZnQubWluKCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1heGltdW0ga2V5IGluIHRoZSB0cmVlLlxuICAgIG1pbktleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKCkua2V5O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGtleSBpbiB0aGUgdHJlZS5cbiAgICBtYXhLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmlzRW1wdHkoKSA/IHRoaXMua2V5IDogdGhpcy5yaWdodC5tYXhLZXkoKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBuZXcgdHJlZSwgd2l0aCB0aGUga2V5L3ZhbHVlIGFkZGVkLlxuICAgIGluc2VydCh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gdGhpcztcbiAgICAgICAgY29uc3QgaSA9IG4odCwgcy5rZXkpO1xuICAgICAgICByZXR1cm4gcyA9IGkgPCAwID8gcy5jb3B5KG51bGwsIG51bGwsIG51bGwsIHMubGVmdC5pbnNlcnQodCwgZSwgbiksIG51bGwpIDogMCA9PT0gaSA/IHMuY29weShudWxsLCBlLCBudWxsLCBudWxsLCBudWxsKSA6IHMuY29weShudWxsLCBudWxsLCBudWxsLCBudWxsLCBzLnJpZ2h0Lmluc2VydCh0LCBlLCBuKSksIFxuICAgICAgICBzLmZpeFVwKCk7XG4gICAgfVxuICAgIHJlbW92ZU1pbigpIHtcbiAgICAgICAgaWYgKHRoaXMubGVmdC5pc0VtcHR5KCkpIHJldHVybiBwbi5FTVBUWTtcbiAgICAgICAgbGV0IHQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdC5sZWZ0LmlzUmVkKCkgfHwgdC5sZWZ0LmxlZnQuaXNSZWQoKSB8fCAodCA9IHQubW92ZVJlZExlZnQoKSksIHQgPSB0LmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgdC5sZWZ0LnJlbW92ZU1pbigpLCBudWxsKSwgXG4gICAgICAgIHQuZml4VXAoKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBuZXcgdHJlZSwgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZW0gcmVtb3ZlZC5cbiAgICByZW1vdmUodCwgZSkge1xuICAgICAgICBsZXQgbiwgcyA9IHRoaXM7XG4gICAgICAgIGlmIChlKHQsIHMua2V5KSA8IDApIHMubGVmdC5pc0VtcHR5KCkgfHwgcy5sZWZ0LmlzUmVkKCkgfHwgcy5sZWZ0LmxlZnQuaXNSZWQoKSB8fCAocyA9IHMubW92ZVJlZExlZnQoKSksIFxuICAgICAgICBzID0gcy5jb3B5KG51bGwsIG51bGwsIG51bGwsIHMubGVmdC5yZW1vdmUodCwgZSksIG51bGwpOyBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzLmxlZnQuaXNSZWQoKSAmJiAocyA9IHMucm90YXRlUmlnaHQoKSksIHMucmlnaHQuaXNFbXB0eSgpIHx8IHMucmlnaHQuaXNSZWQoKSB8fCBzLnJpZ2h0LmxlZnQuaXNSZWQoKSB8fCAocyA9IHMubW92ZVJlZFJpZ2h0KCkpLCBcbiAgICAgICAgICAgIDAgPT09IGUodCwgcy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHMucmlnaHQuaXNFbXB0eSgpKSByZXR1cm4gcG4uRU1QVFk7XG4gICAgICAgICAgICAgICAgbiA9IHMucmlnaHQubWluKCksIHMgPSBzLmNvcHkobi5rZXksIG4udmFsdWUsIG51bGwsIG51bGwsIHMucmlnaHQucmVtb3ZlTWluKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcyA9IHMuY29weShudWxsLCBudWxsLCBudWxsLCBudWxsLCBzLnJpZ2h0LnJlbW92ZSh0LCBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMuZml4VXAoKTtcbiAgICB9XG4gICAgaXNSZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIG5ldyB0cmVlIGFmdGVyIHBlcmZvcm1pbmcgYW55IG5lZWRlZCByb3RhdGlvbnMuXG4gICAgZml4VXAoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHQucmlnaHQuaXNSZWQoKSAmJiAhdC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LnJvdGF0ZUxlZnQoKSksIHQubGVmdC5pc1JlZCgpICYmIHQubGVmdC5sZWZ0LmlzUmVkKCkgJiYgKHQgPSB0LnJvdGF0ZVJpZ2h0KCkpLCBcbiAgICAgICAgdC5sZWZ0LmlzUmVkKCkgJiYgdC5yaWdodC5pc1JlZCgpICYmICh0ID0gdC5jb2xvckZsaXAoKSksIHQ7XG4gICAgfVxuICAgIG1vdmVSZWRMZWZ0KCkge1xuICAgICAgICBsZXQgdCA9IHRoaXMuY29sb3JGbGlwKCk7XG4gICAgICAgIHJldHVybiB0LnJpZ2h0LmxlZnQuaXNSZWQoKSAmJiAodCA9IHQuY29weShudWxsLCBudWxsLCBudWxsLCBudWxsLCB0LnJpZ2h0LnJvdGF0ZVJpZ2h0KCkpLCBcbiAgICAgICAgdCA9IHQucm90YXRlTGVmdCgpLCB0ID0gdC5jb2xvckZsaXAoKSksIHQ7XG4gICAgfVxuICAgIG1vdmVSZWRSaWdodCgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLmNvbG9yRmxpcCgpO1xuICAgICAgICByZXR1cm4gdC5sZWZ0LmxlZnQuaXNSZWQoKSAmJiAodCA9IHQucm90YXRlUmlnaHQoKSwgdCA9IHQuY29sb3JGbGlwKCkpLCB0O1xuICAgIH1cbiAgICByb3RhdGVMZWZ0KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5jb3B5KG51bGwsIG51bGwsIHBuLlJFRCwgbnVsbCwgdGhpcy5yaWdodC5sZWZ0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuY29weShudWxsLCBudWxsLCB0aGlzLmNvbG9yLCB0LCBudWxsKTtcbiAgICB9XG4gICAgcm90YXRlUmlnaHQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvcHkobnVsbCwgbnVsbCwgcG4uUkVELCB0aGlzLmxlZnQucmlnaHQsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmNvcHkobnVsbCwgbnVsbCwgdGhpcy5jb2xvciwgbnVsbCwgdCk7XG4gICAgfVxuICAgIGNvbG9yRmxpcCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMubGVmdC5jb3B5KG51bGwsIG51bGwsICF0aGlzLmxlZnQuY29sb3IsIG51bGwsIG51bGwpLCBlID0gdGhpcy5yaWdodC5jb3B5KG51bGwsIG51bGwsICF0aGlzLnJpZ2h0LmNvbG9yLCBudWxsLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weShudWxsLCBudWxsLCAhdGhpcy5jb2xvciwgdCwgZSk7XG4gICAgfVxuICAgIC8vIEZvciB0ZXN0aW5nLlxuICAgIGNoZWNrTWF4RGVwdGgoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmNoZWNrKCk7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCB0KSA8PSB0aGlzLnNpemUgKyAxO1xuICAgIH1cbiAgICAvLyBJbiBhIGJhbGFuY2VkIFJCIHRyZWUsIHRoZSBibGFjay1kZXB0aCAobnVtYmVyIG9mIGJsYWNrIG5vZGVzKSBmcm9tIHJvb3QgdG9cbiAgICAvLyBsZWF2ZXMgaXMgZXF1YWwgb24gYm90aCBzaWRlcy4gIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhhdCBvciBhc3NlcnRzLlxuICAgIGNoZWNrKCkge1xuICAgICAgICBpZiAodGhpcy5pc1JlZCgpICYmIHRoaXMubGVmdC5pc1JlZCgpKSB0aHJvdyBMKCk7XG4gICAgICAgIGlmICh0aGlzLnJpZ2h0LmlzUmVkKCkpIHRocm93IEwoKTtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMubGVmdC5jaGVjaygpO1xuICAgICAgICBpZiAodCAhPT0gdGhpcy5yaWdodC5jaGVjaygpKSB0aHJvdyBMKCk7XG4gICAgICAgIHJldHVybiB0ICsgKHRoaXMuaXNSZWQoKSA/IDAgOiAxKTtcbiAgICB9XG59XG5cbiAvLyBlbmQgTExSQk5vZGVcbi8vIEVtcHR5IG5vZGUgaXMgc2hhcmVkIGJldHdlZW4gYWxsIExMUkIgdHJlZXMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxucG4uRU1QVFkgPSBudWxsLCBwbi5SRUQgPSAhMCwgcG4uQkxBQ0sgPSAhMTtcblxuLy8gZW5kIExMUkJFbXB0eU5vZGVcbnBuLkVNUFRZID0gbmV3IFxuLy8gUmVwcmVzZW50cyBhbiBlbXB0eSBub2RlIChhIGxlYWYgbm9kZSBpbiB0aGUgUmVkLUJsYWNrIFRyZWUpLlxuY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cbiAgICBnZXQga2V5KCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgdGhyb3cgTCgpO1xuICAgIH1cbiAgICBnZXQgY29sb3IoKSB7XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG4gICAgZ2V0IGxlZnQoKSB7XG4gICAgICAgIHRocm93IEwoKTtcbiAgICB9XG4gICAgZ2V0IHJpZ2h0KCkge1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgY29weSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgdHJlZSwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBhZGRlZC5cbiAgICBpbnNlcnQodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3IHBuKHQsIGUpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgdHJlZSwgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSByZW1vdmVkLlxuICAgIHJlbW92ZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGlub3JkZXJUcmF2ZXJzYWwodCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIHJldmVyc2VUcmF2ZXJzYWwodCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIG1pbktleSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1heEtleSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlzUmVkKCkge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8vIEZvciB0ZXN0aW5nLlxuICAgIGNoZWNrTWF4RGVwdGgoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgY2hlY2soKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn07XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNvcnRlZFNldCBpcyBhbiBpbW11dGFibGUgKGNvcHktb24td3JpdGUpIGNvbGxlY3Rpb24gdGhhdCBob2xkcyBlbGVtZW50c1xuICogaW4gb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBwcm92aWRlZCBjb21wYXJhdG9yLlxuICpcbiAqIE5PVEU6IGlmIHByb3ZpZGVkIGNvbXBhcmF0b3IgcmV0dXJucyAwIGZvciB0d28gZWxlbWVudHMsIHdlIGNvbnNpZGVyIHRoZW0gdG9cbiAqIGJlIGVxdWFsIVxuICovXG5jbGFzcyBUbiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSB0LCB0aGlzLmRhdGEgPSBuZXcgZ24odGhpcy5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuZGF0YS5nZXQodCk7XG4gICAgfVxuICAgIGZpcnN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1pbktleSgpO1xuICAgIH1cbiAgICBsYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1heEtleSgpO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICAgIH1cbiAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5pbmRleE9mKHQpO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgZWxlbWVudHMgaW4gb3JkZXIgZGVmaW5lZCBieSBcImNvbXBhcmF0b3JcIiAqLyAgICBmb3JFYWNoKHQpIHtcbiAgICAgICAgdGhpcy5kYXRhLmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiAodChlKSwgITEpKSk7XG4gICAgfVxuICAgIC8qKiBJdGVyYXRlcyBvdmVyIGBlbGVtYHMgc3VjaCB0aGF0OiByYW5nZVswXSAmbHQ7PSBlbGVtICZsdDsgcmFuZ2VbMV0uICovICAgIGZvckVhY2hJblJhbmdlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuZGF0YS5nZXRJdGVyYXRvckZyb20odFswXSk7XG4gICAgICAgIGZvciAoO24uaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLmdldE5leHQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmF0b3Iocy5rZXksIHRbMV0pID49IDApIHJldHVybjtcbiAgICAgICAgICAgIGUocy5rZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgYGVsZW1gcyBzdWNoIHRoYXQ6IHN0YXJ0ICZsdDs9IGVsZW0gdW50aWwgZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAgICovICAgIGZvckVhY2hXaGlsZSh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBmb3IgKG4gPSB2b2lkIDAgIT09IGUgPyB0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKGUpIDogdGhpcy5kYXRhLmdldEl0ZXJhdG9yKCk7IG4uaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGlmICghdChuLmdldE5leHQoKS5rZXkpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEZpbmRzIHRoZSBsZWFzdCBlbGVtZW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgZWxlbWAuICovICAgIGZpcnN0QWZ0ZXJPckVxdWFsKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZGF0YS5nZXRJdGVyYXRvckZyb20odCk7XG4gICAgICAgIHJldHVybiBlLmhhc05leHQoKSA/IGUuZ2V0TmV4dCgpLmtleSA6IG51bGw7XG4gICAgfVxuICAgIGdldEl0ZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gbmV3IEVuKHRoaXMuZGF0YS5nZXRJdGVyYXRvcigpKTtcbiAgICB9XG4gICAgZ2V0SXRlcmF0b3JGcm9tKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbih0aGlzLmRhdGEuZ2V0SXRlcmF0b3JGcm9tKHQpKTtcbiAgICB9XG4gICAgLyoqIEluc2VydHMgb3IgdXBkYXRlcyBhbiBlbGVtZW50ICovICAgIGFkZCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5kYXRhLnJlbW92ZSh0KS5pbnNlcnQodCwgITApKTtcbiAgICB9XG4gICAgLyoqIERlbGV0ZXMgYW4gZWxlbWVudCAqLyAgICBkZWxldGUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXModCkgPyB0aGlzLmNvcHkodGhpcy5kYXRhLnJlbW92ZSh0KSkgOiB0aGlzO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmlzRW1wdHkoKTtcbiAgICB9XG4gICAgdW5pb25XaXRoKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzO1xuICAgICAgICAvLyBNYWtlIHN1cmUgYHJlc3VsdGAgYWx3YXlzIHJlZmVycyB0byB0aGUgbGFyZ2VyIG9uZSBvZiB0aGUgdHdvIHNldHMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuc2l6ZSA8IHQuc2l6ZSAmJiAoZSA9IHQsIHQgPSB0aGlzKSwgdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGUgPSBlLmFkZCh0KTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIFRuKSkgcmV0dXJuICExO1xuICAgICAgICBpZiAodGhpcy5zaXplICE9PSB0LnNpemUpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZGF0YS5nZXRJdGVyYXRvcigpLCBuID0gdC5kYXRhLmdldEl0ZXJhdG9yKCk7XG4gICAgICAgIGZvciAoO2UuaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmdldE5leHQoKS5rZXksIHMgPSBuLmdldE5leHQoKS5rZXk7XG4gICAgICAgICAgICBpZiAoMCAhPT0gdGhpcy5jb21wYXJhdG9yKHQsIHMpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICB0b0FycmF5KCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgdC5wdXNoKGUpO1xuICAgICAgICB9KSksIHQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmZvckVhY2goKGUgPT4gdC5wdXNoKGUpKSksIFwiU29ydGVkU2V0KFwiICsgdC50b1N0cmluZygpICsgXCIpXCI7XG4gICAgfVxuICAgIGNvcHkodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IFRuKHRoaXMuY29tcGFyYXRvcik7XG4gICAgICAgIHJldHVybiBlLmRhdGEgPSB0LCBlO1xuICAgIH1cbn1cblxuY2xhc3MgRW4ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5pdGVyID0gdDtcbiAgICB9XG4gICAgZ2V0TmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlci5nZXROZXh0KCkua2V5O1xuICAgIH1cbiAgICBoYXNOZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVyLmhhc05leHQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IEluID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpO1xuXG5mdW5jdGlvbiBBbigpIHtcbiAgICByZXR1cm4gSW47XG59XG5cbmNvbnN0IFJuID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpO1xuXG5mdW5jdGlvbiBQbigpIHtcbiAgICByZXR1cm4gUm47XG59XG5cbmNvbnN0IGJuID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpO1xuXG5mdW5jdGlvbiB2bigpIHtcbiAgICByZXR1cm4gYm47XG59XG5cbmNvbnN0IFZuID0gbmV3IFRuKFN0LmNvbXBhcmF0b3IpO1xuXG5mdW5jdGlvbiBTbiguLi50KSB7XG4gICAgbGV0IGUgPSBWbjtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZSA9IGUuYWRkKG4pO1xuICAgIHJldHVybiBlO1xufVxuXG5jb25zdCBEbiA9IG5ldyBUbihpdCk7XG5cbmZ1bmN0aW9uIENuKCkge1xuICAgIHJldHVybiBEbjtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQW4gZXZlbnQgZnJvbSB0aGUgUmVtb3RlU3RvcmUuIEl0IGlzIHNwbGl0IGludG8gdGFyZ2V0Q2hhbmdlcyAoY2hhbmdlcyB0byB0aGVcbiAqIHN0YXRlIG9yIHRoZSBzZXQgb2YgZG9jdW1lbnRzIGluIG91ciB3YXRjaGVkIHRhcmdldHMpIGFuZCBkb2N1bWVudFVwZGF0ZXNcbiAqIChjaGFuZ2VzIHRvIHRoZSBhY3R1YWwgZG9jdW1lbnRzKS5cbiAqLyBjbGFzcyBObiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIHNuYXBzaG90IHZlcnNpb24gdGhpcyBldmVudCBicmluZ3MgdXMgdXAgdG8sIG9yIE1JTiBpZiBub3Qgc2V0LlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIEEgbWFwIGZyb20gdGFyZ2V0IHRvIGNoYW5nZXMgdG8gdGhlIHRhcmdldC4gU2VlIFRhcmdldENoYW5nZS5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiB0YXJnZXRzIHRoYXQgaXMga25vd24gdG8gYmUgaW5jb25zaXN0ZW50LiBMaXN0ZW5zIGZvciB0aGVzZVxuICAgICAqIHRhcmdldHMgc2hvdWxkIGJlIHJlLWVzdGFibGlzaGVkIHdpdGhvdXQgcmVzdW1lIHRva2Vucy5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiB3aGljaCBkb2N1bWVudHMgaGF2ZSBjaGFuZ2VkIG9yIGJlZW4gZGVsZXRlZCwgYWxvbmcgd2l0aCB0aGVcbiAgICAgKiBkb2MncyBuZXcgdmFsdWVzIChpZiBub3QgZGVsZXRlZCkuXG4gICAgICovXG4gICAgcywgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2Ygd2hpY2ggZG9jdW1lbnQgdXBkYXRlcyBhcmUgZHVlIG9ubHkgdG8gbGltYm8gcmVzb2x1dGlvbiB0YXJnZXRzLlxuICAgICAqL1xuICAgIGkpIHtcbiAgICAgICAgdGhpcy5zbmFwc2hvdFZlcnNpb24gPSB0LCB0aGlzLnRhcmdldENoYW5nZXMgPSBlLCB0aGlzLnRhcmdldE1pc21hdGNoZXMgPSBuLCB0aGlzLmRvY3VtZW50VXBkYXRlcyA9IHMsIFxuICAgICAgICB0aGlzLnJlc29sdmVkTGltYm9Eb2N1bWVudHMgPSBpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIQUNLOiBWaWV3cyByZXF1aXJlIFJlbW90ZUV2ZW50cyBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgdmlldyBpc1xuICAgICAqIENVUlJFTlQsIGJ1dCBzZWNvbmRhcnkgdGFicyBkb24ndCByZWNlaXZlIHJlbW90ZSBldmVudHMuIFNvIHRoaXMgbWV0aG9kIGlzXG4gICAgICogdXNlZCB0byBjcmVhdGUgYSBzeW50aGVzaXplZCBSZW1vdGVFdmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IGFcbiAgICAgKiBDVVJSRU5UIHN0YXR1cyBjaGFuZ2UgdG8gYSBWaWV3LCBmb3IgcXVlcmllcyBleGVjdXRlZCBpbiBhIGRpZmZlcmVudCB0YWIuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seVxuICAgIHN0YXRpYyBjcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTWFwO1xuICAgICAgICByZXR1cm4gbi5zZXQodCwga24uY3JlYXRlU3ludGhlc2l6ZWRUYXJnZXRDaGFuZ2VGb3JDdXJyZW50Q2hhbmdlKHQsIGUpKSwgbmV3IE5uKGN0Lm1pbigpLCBuLCBDbigpLCBBbigpLCBTbigpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBUYXJnZXRDaGFuZ2Ugc3BlY2lmaWVzIHRoZSBzZXQgb2YgY2hhbmdlcyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYXMgcGFydCBvZlxuICogYSBSZW1vdGVFdmVudC4gVGhlc2UgY2hhbmdlcyB0cmFjayB3aGljaCBkb2N1bWVudHMgYXJlIGFkZGVkLCBtb2RpZmllZCBvclxuICogcmVtb3ZlZCwgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0J3MgcmVzdW1lIHRva2VuIGFuZCB3aGV0aGVyIHRoZSB0YXJnZXQgaXNcbiAqIG1hcmtlZCBDVVJSRU5ULlxuICogVGhlIGFjdHVhbCBjaGFuZ2VzICp0byogZG9jdW1lbnRzIGFyZSBub3QgcGFydCBvZiB0aGUgVGFyZ2V0Q2hhbmdlIHNpbmNlXG4gKiBkb2N1bWVudHMgbWF5IGJlIHBhcnQgb2YgbXVsdGlwbGUgdGFyZ2V0cy5cbiAqLyBjbGFzcyBrbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQW4gb3BhcXVlLCBzZXJ2ZXItYXNzaWduZWQgdG9rZW4gdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgYSBxdWVyeSB0byBiZSByZXN1bWVkXG4gICAgICogYWZ0ZXIgZGlzY29ubmVjdGluZyB3aXRob3V0IHJldHJhbnNtaXR0aW5nIGFsbCB0aGUgZGF0YSB0aGF0IG1hdGNoZXMgdGhlXG4gICAgICogcXVlcnkuIFRoZSByZXN1bWUgdG9rZW4gZXNzZW50aWFsbHkgaWRlbnRpZmllcyBhIHBvaW50IGluIHRpbWUgZnJvbSB3aGljaFxuICAgICAqIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3VtZSBzZW5kaW5nIHJlc3VsdHMuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIFwiY3VycmVudFwiIChzeW5jZWQpIHN0YXR1cyBvZiB0aGlzIHRhcmdldC4gTm90ZSB0aGF0IFwiY3VycmVudFwiXG4gICAgICogaGFzIHNwZWNpYWwgbWVhbmluZyBpbiB0aGUgUlBDIHByb3RvY29sIHRoYXQgaW1wbGllcyB0aGF0IGEgdGFyZ2V0IGlzXG4gICAgICogYm90aCB1cC10by1kYXRlIGFuZCBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHdhdGNoIHN0cmVhbS5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IHdlcmUgbmV3bHkgYXNzaWduZWQgdG8gdGhpcyB0YXJnZXQgYXMgcGFydCBvZlxuICAgICAqIHRoaXMgcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIG4sIFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSBhbHJlYWR5IGFzc2lnbmVkIHRvIHRoaXMgdGFyZ2V0IGJ1dCByZWNlaXZlZFxuICAgICAqIGFuIHVwZGF0ZSBkdXJpbmcgdGhpcyByZW1vdGUgZXZlbnQuXG4gICAgICovXG4gICAgcywgXG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBkb2N1bWVudHMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIHRhcmdldCBhcyBwYXJ0IG9mIHRoaXNcbiAgICAgKiByZW1vdGUgZXZlbnQuXG4gICAgICovXG4gICAgaSkge1xuICAgICAgICB0aGlzLnJlc3VtZVRva2VuID0gdCwgdGhpcy5jdXJyZW50ID0gZSwgdGhpcy5hZGRlZERvY3VtZW50cyA9IG4sIHRoaXMubW9kaWZpZWREb2N1bWVudHMgPSBzLCBcbiAgICAgICAgdGhpcy5yZW1vdmVkRG9jdW1lbnRzID0gaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgYSBzeW50aGVzaXplZCBUYXJnZXRDaGFuZ2VzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiBhcHBseSBhIENVUlJFTlQgc3RhdHVzIGNoYW5nZSB0byBhIFZpZXcgKGZvciBxdWVyaWVzIGV4ZWN1dGVkIGluIGEgZGlmZmVyZW50XG4gICAgICogdGFiKSBvciBmb3IgbmV3IHF1ZXJpZXMgKHRvIHJhaXNlIHNuYXBzaG90cyB3aXRoIGNvcnJlY3QgQ1VSUkVOVCBzdGF0dXMpLlxuICAgICAqLyAgICBzdGF0aWMgY3JlYXRlU3ludGhlc2l6ZWRUYXJnZXRDaGFuZ2VGb3JDdXJyZW50Q2hhbmdlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBrbih5dC5FTVBUWV9CWVRFX1NUUklORywgZSwgU24oKSwgU24oKSwgU24oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hhbmdlZCBkb2N1bWVudCBhbmQgYSBsaXN0IG9mIHRhcmdldCBpZHMgdG8gd2hpY2ggdGhpcyBjaGFuZ2VcbiAqIGFwcGxpZXMuXG4gKlxuICogSWYgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZCBOb0RvY3VtZW50IHdpbGwgYmUgcHJvdmlkZWQuXG4gKi8gY2xhc3MgeG4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgbmV3IGRvY3VtZW50IGFwcGxpZXMgdG8gYWxsIG9mIHRoZXNlIHRhcmdldHMuICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSBuZXcgZG9jdW1lbnQgaXMgcmVtb3ZlZCBmcm9tIGFsbCBvZiB0aGVzZSB0YXJnZXRzLiAqL1xuICAgIGUsIFxuICAgIC8qKiBUaGUga2V5IG9mIHRoZSBkb2N1bWVudCBmb3IgdGhpcyBjaGFuZ2UuICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogVGhlIG5ldyBkb2N1bWVudCBvciBOb0RvY3VtZW50IGlmIGl0IHdhcyBkZWxldGVkLiBJcyBudWxsIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IHdlbnQgb3V0IG9mIHZpZXcgd2l0aG91dCB0aGUgc2VydmVyIHNlbmRpbmcgYSBuZXcgZG9jdW1lbnQuXG4gICAgICovXG4gICAgcykge1xuICAgICAgICB0aGlzLiQgPSB0LCB0aGlzLnJlbW92ZWRUYXJnZXRJZHMgPSBlLCB0aGlzLmtleSA9IG4sIHRoaXMuRiA9IHM7XG4gICAgfVxufVxuXG5jbGFzcyAkbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnRhcmdldElkID0gdCwgdGhpcy5PID0gZTtcbiAgICB9XG59XG5cbmNsYXNzIEZuIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogV2hhdCBraW5kIG9mIGNoYW5nZSBvY2N1cnJlZCB0byB0aGUgd2F0Y2ggdGFyZ2V0LiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgdGFyZ2V0IElEcyB0aGF0IHdlcmUgYWRkZWQvcmVtb3ZlZC9zZXQuICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogQW4gb3BhcXVlLCBzZXJ2ZXItYXNzaWduZWQgdG9rZW4gdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgYSB0YXJnZXQgdG8gYmVcbiAgICAgKiByZXN1bWVkIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdFxuICAgICAqIG1hdGNoZXMgdGhlIHRhcmdldC4gVGhlIHJlc3VtZSB0b2tlbiBlc3NlbnRpYWxseSBpZGVudGlmaWVzIGEgcG9pbnQgaW5cbiAgICAgKiB0aW1lIGZyb20gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVzdW1lIHNlbmRpbmcgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBuID0geXQuRU1QVFlfQllURV9TVFJJTkdcbiAgICAvKiogQW4gUlBDIGVycm9yIGluZGljYXRpbmcgd2h5IHRoZSB3YXRjaCBmYWlsZWQuICovICwgcyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHQsIHRoaXMudGFyZ2V0SWRzID0gZSwgdGhpcy5yZXN1bWVUb2tlbiA9IG4sIHRoaXMuY2F1c2UgPSBzO1xuICAgIH1cbn1cblxuLyoqIFRyYWNrcyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBXYXRjaCB0YXJnZXQuICovIGNsYXNzIE9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgcGVuZGluZyByZXNwb25zZXMgKGFkZHMgb3IgcmVtb3ZlcykgdGhhdCB3ZSBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgICogV2Ugb25seSBjb25zaWRlciB0YXJnZXRzIGFjdGl2ZSB0aGF0IGhhdmUgbm8gcGVuZGluZyByZXNwb25zZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLk0gPSAwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBkb2N1bWVudCBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHJhaXNlZCBzbmFwc2hvdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlc2UgY2hhbmdlcyBhcmUgY29udGludW91c2x5IHVwZGF0ZWQgYXMgd2UgcmVjZWl2ZSBkb2N1bWVudCB1cGRhdGVzIGFuZFxuICAgICAgICAgKiBhbHdheXMgcmVmbGVjdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhZ2FpbnN0IHRoZSBsYXN0IGlzc3VlZCBzbmFwc2hvdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuTCA9IEJuKCksIFxuICAgICAgICAvKiogU2VlIHB1YmxpYyBnZXR0ZXJzIGZvciBleHBsYW5hdGlvbnMgb2YgdGhlc2UgZmllbGRzLiAqL1xuICAgICAgICB0aGlzLkIgPSB5dC5FTVBUWV9CWVRFX1NUUklORywgdGhpcy5VID0gITEsIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aGlzIHRhcmdldCBzdGF0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG5leHQgc25hcHNob3QuIFdlXG4gICAgICAgICAqIGluaXRpYWxpemUgdG8gdHJ1ZSBzbyB0aGF0IG5ld2x5LWFkZGVkIHRhcmdldHMgYXJlIGluY2x1ZGVkIGluIHRoZSBuZXh0XG4gICAgICAgICAqIFJlbW90ZUV2ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5xID0gITA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyB0YXJnZXQgaGFzIGJlZW4gbWFya2VkICdjdXJyZW50Jy5cbiAgICAgKlxuICAgICAqICdDdXJyZW50JyBoYXMgc3BlY2lhbCBtZWFuaW5nIGluIHRoZSBSUEMgcHJvdG9jb2w6IEl0IGltcGxpZXMgdGhhdCB0aGVcbiAgICAgKiBXYXRjaCBiYWNrZW5kIGhhcyBzZW50IHVzIGFsbCBjaGFuZ2VzIHVwIHRvIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgdGFyZ2V0XG4gICAgICogd2FzIGFkZGVkIGFuZCB0aGF0IHRoZSB0YXJnZXQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB3YXRjaFxuICAgICAqIHN0cmVhbS5cbiAgICAgKi8gICAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlU7XG4gICAgfVxuICAgIC8qKiBUaGUgbGFzdCByZXN1bWUgdG9rZW4gc2VudCB0byB1cyBmb3IgdGhpcyB0YXJnZXQuICovICAgIGdldCByZXN1bWVUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQjtcbiAgICB9XG4gICAgLyoqIFdoZXRoZXIgdGhpcyB0YXJnZXQgaGFzIHBlbmRpbmcgdGFyZ2V0IGFkZHMgb3IgdGFyZ2V0IHJlbW92ZXMuICovICAgIGdldCBLKCkge1xuICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy5NO1xuICAgIH1cbiAgICAvKiogV2hldGhlciB3ZSBoYXZlIG1vZGlmaWVkIGFueSBzdGF0ZSB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgc25hcHNob3QuICovICAgIGdldCBqKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSByZXN1bWUgdG9rZW4gdG8gdGhlIFRhcmdldENoYW5nZSwgYnV0IG9ubHkgd2hlbiBpdCBoYXMgYSBuZXdcbiAgICAgKiB2YWx1ZS4gRW1wdHkgcmVzdW1lVG9rZW5zIGFyZSBkaXNjYXJkZWQuXG4gICAgICovICAgIFcodCkge1xuICAgICAgICB0LmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDAgJiYgKHRoaXMucSA9ICEwLCB0aGlzLkIgPSB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRhcmdldCBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIFRvIHJlc2V0IHRoZSBkb2N1bWVudCBjaGFuZ2VzIGFmdGVyIHJhaXNpbmcgdGhpcyBzbmFwc2hvdCwgY2FsbFxuICAgICAqIGBjbGVhclBlbmRpbmdDaGFuZ2VzKClgLlxuICAgICAqLyAgICBHKCkge1xuICAgICAgICBsZXQgdCA9IFNuKCksIGUgPSBTbigpLCBuID0gU24oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuTC5mb3JFYWNoKCgocywgaSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgICAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICAgICAgdCA9IHQuYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMiAvKiBNb2RpZmllZCAqLyA6XG4gICAgICAgICAgICAgICAgZSA9IGUuYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMSAvKiBSZW1vdmVkICovIDpcbiAgICAgICAgICAgICAgICBuID0gbi5hZGQocyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSwgbmV3IGtuKHRoaXMuQiwgdGhpcy5VLCB0LCBlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBkb2N1bWVudCBjaGFuZ2VzIGFuZCBzZXRzIGBoYXNQZW5kaW5nQ2hhbmdlc2AgdG8gZmFsc2UuXG4gICAgICovICAgIEgoKSB7XG4gICAgICAgIHRoaXMucSA9ICExLCB0aGlzLkwgPSBCbigpO1xuICAgIH1cbiAgICBKKHQsIGUpIHtcbiAgICAgICAgdGhpcy5xID0gITAsIHRoaXMuTCA9IHRoaXMuTC5pbnNlcnQodCwgZSk7XG4gICAgfVxuICAgIFkodCkge1xuICAgICAgICB0aGlzLnEgPSAhMCwgdGhpcy5MID0gdGhpcy5MLnJlbW92ZSh0KTtcbiAgICB9XG4gICAgWCgpIHtcbiAgICAgICAgdGhpcy5NICs9IDE7XG4gICAgfVxuICAgIFooKSB7XG4gICAgICAgIHRoaXMuTSAtPSAxO1xuICAgIH1cbiAgICB0dCgpIHtcbiAgICAgICAgdGhpcy5xID0gITAsIHRoaXMuVSA9ICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciBjbGFzcyB0byBhY2N1bXVsYXRlIHdhdGNoIGNoYW5nZXMgaW50byBhIFJlbW90ZUV2ZW50LlxuICovXG5jbGFzcyBNbiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmV0ID0gdCwgXG4gICAgICAgIC8qKiBUaGUgaW50ZXJuYWwgc3RhdGUgb2YgYWxsIHRyYWNrZWQgdGFyZ2V0cy4gKi9cbiAgICAgICAgdGhpcy5udCA9IG5ldyBNYXAsIFxuICAgICAgICAvKiogS2VlcHMgdHJhY2sgb2YgdGhlIGRvY3VtZW50cyB0byB1cGRhdGUgc2luY2UgdGhlIGxhc3QgcmFpc2VkIHNuYXBzaG90LiAqL1xuICAgICAgICB0aGlzLnN0ID0gQW4oKSwgXG4gICAgICAgIC8qKiBBIG1hcHBpbmcgb2YgZG9jdW1lbnQga2V5cyB0byB0aGVpciBzZXQgb2YgdGFyZ2V0IElEcy4gKi9cbiAgICAgICAgdGhpcy5pdCA9IExuKCksIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIHRhcmdldHMgd2l0aCBleGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoZXMuIFRoZXNlIHRhcmdldHMgYXJlXG4gICAgICAgICAqIGtub3duIHRvIGJlIGluY29uc2lzdGVudCBhbmQgdGhlaXIgbGlzdGVucyBuZWVkcyB0byBiZSByZS1lc3RhYmxpc2hlZCBieVxuICAgICAgICAgKiBSZW1vdGVTdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucnQgPSBuZXcgVG4oaXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW5kIGFkZHMgdGhlIERvY3VtZW50V2F0Y2hDaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMuXG4gICAgICovICAgIG90KHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuJCkgdC5GICYmIHQuRi5pc0ZvdW5kRG9jdW1lbnQoKSA/IHRoaXMuYXQoZSwgdC5GKSA6IHRoaXMuY3QoZSwgdC5rZXksIHQuRik7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LnJlbW92ZWRUYXJnZXRJZHMpIHRoaXMuY3QoZSwgdC5rZXksIHQuRik7XG4gICAgfVxuICAgIC8qKiBQcm9jZXNzZXMgYW5kIGFkZHMgdGhlIFdhdGNoVGFyZ2V0Q2hhbmdlIHRvIHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzLiAqLyAgICB1dCh0KSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRhcmdldCh0LCAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5odChlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodC5zdGF0ZSkge1xuICAgICAgICAgICAgICBjYXNlIDAgLyogTm9DaGFuZ2UgKi8gOlxuICAgICAgICAgICAgICAgIHRoaXMubHQoZSkgJiYgbi5XKHQucmVzdW1lVG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMSAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLlooKSwgbi5LIHx8IFxuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBmcmVzaGx5IGFkZGVkIHRhcmdldCwgc28gd2UgbmVlZCB0byByZXNldCBhbnkgc3RhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIGhhZCBwcmV2aW91c2x5LiBUaGlzIGNhbiBoYXBwZW4gZS5nLiB3aGVuIHJlbW92ZSBhbmQgYWRkXG4gICAgICAgICAgICAgICAgLy8gYmFjayBhIHRhcmdldCBmb3IgZXhpc3RlbmNlIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAgICAgICAgICAgIG4uSCgpLCBuLlcodC5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiByZW1vdmVkIHRhcmdldHMgdG8gd2UgY2FuIHBvc3QtZmlsdGVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgdGFyZ2V0IGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLlooKSwgbi5LIHx8IHRoaXMucmVtb3ZlVGFyZ2V0KGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMyAvKiBDdXJyZW50ICovIDpcbiAgICAgICAgICAgICAgICB0aGlzLmx0KGUpICYmIChuLnR0KCksIG4uVyh0LnJlc3VtZVRva2VuKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSA0IC8qIFJlc2V0ICovIDpcbiAgICAgICAgICAgICAgICB0aGlzLmx0KGUpICYmIChcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgdGFyZ2V0IGFuZCBzeW50aGVzaXplcyByZW1vdmVzIGZvciBhbGwgZXhpc3RpbmdcbiAgICAgICAgICAgICAgICAvLyBkb2N1bWVudHMuIFRoZSBiYWNrZW5kIHdpbGwgcmUtYWRkIGFueSBkb2N1bWVudHMgdGhhdCBzdGlsbFxuICAgICAgICAgICAgICAgIC8vIG1hdGNoIHRoZSB0YXJnZXQgYmVmb3JlIGl0IHNlbmRzIHRoZSBuZXh0IGdsb2JhbCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICB0aGlzLmZ0KGUpLCBuLlcodC5yZXN1bWVUb2tlbikpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgYWxsIHRhcmdldElkcyB0aGF0IHRoZSB3YXRjaCBjaGFuZ2UgYXBwbGllcyB0bzogZWl0aGVyIHRoZVxuICAgICAqIHRhcmdldElkcyBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgY2hhbmdlIG9yIHRoZSB0YXJnZXRJZHMgb2YgYWxsIGN1cnJlbnRseVxuICAgICAqIGFjdGl2ZSB0YXJnZXRzLlxuICAgICAqLyAgICBmb3JFYWNoVGFyZ2V0KHQsIGUpIHtcbiAgICAgICAgdC50YXJnZXRJZHMubGVuZ3RoID4gMCA/IHQudGFyZ2V0SWRzLmZvckVhY2goZSkgOiB0aGlzLm50LmZvckVhY2goKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmx0KG4pICYmIGUobik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBleGlzdGVuY2UgZmlsdGVycyBhbmQgc3ludGhlc2l6ZXMgZGVsZXRlcyBmb3IgZmlsdGVyIG1pc21hdGNoZXMuXG4gICAgICogVGFyZ2V0cyB0aGF0IGFyZSBpbnZhbGlkYXRlZCBieSBmaWx0ZXIgbWlzbWF0Y2hlcyBhcmUgYWRkZWQgdG9cbiAgICAgKiBgcGVuZGluZ1RhcmdldFJlc2V0c2AuXG4gICAgICovICAgIGR0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQudGFyZ2V0SWQsIG4gPSB0Lk8uY291bnQsIHMgPSB0aGlzLnd0KGUpO1xuICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHMudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKFh0KHQpKSBpZiAoMCA9PT0gbikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBleGlzdGVuY2UgZmlsdGVyIHRvbGQgdXMgdGhlIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0LiBXZSBkZWR1Y2VcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHRoaXMgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3QgYW5kIGFwcGx5IGEgZGVsZXRlZCBkb2N1bWVudCB0b1xuICAgICAgICAgICAgICAgIC8vIG91ciB1cGRhdGVzLiBXaXRob3V0IGFwcGx5aW5nIHRoaXMgZGVsZXRlZCBkb2N1bWVudCB0aGVyZSBtaWdodCBiZVxuICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgcXVlcnkgdGhhdCB3aWxsIHJhaXNlIHRoaXMgZG9jdW1lbnQgYXMgcGFydCBvZiBhIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgLy8gdW50aWwgaXQgaXMgcmVzb2x2ZWQsIGVzc2VudGlhbGx5IGV4cG9zaW5nIGluY29uc2lzdGVuY3kgYmV0d2VlblxuICAgICAgICAgICAgICAgIC8vIHF1ZXJpZXMuXG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBTdCh0LnBhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3QoZSwgbiwgV3QubmV3Tm9Eb2N1bWVudChuLCBjdC5taW4oKSkpO1xuICAgICAgICAgICAgfSBlbHNlIEIoMSA9PT0gbik7IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3QoZSkgIT09IG4gJiYgKFxuICAgICAgICAgICAgICAgIC8vIEV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2g6IFdlIHJlc2V0IHRoZSBtYXBwaW5nIGFuZCByYWlzZSBhIG5ld1xuICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IHdpdGggYGlzRnJvbUNhY2hlOnRydWVgLlxuICAgICAgICAgICAgICAgIHRoaXMuZnQoZSksIHRoaXMucnQgPSB0aGlzLnJ0LmFkZChlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGN1cnJlbnRseSBhY2N1bXVsYXRlZCBzdGF0ZSBpbnRvIGEgcmVtb3RlIGV2ZW50IGF0IHRoZVxuICAgICAqIHByb3ZpZGVkIHNuYXBzaG90IHZlcnNpb24uIFJlc2V0cyB0aGUgYWNjdW11bGF0ZWQgY2hhbmdlcyBiZWZvcmUgcmV0dXJuaW5nLlxuICAgICAqLyAgICBndCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgTWFwO1xuICAgICAgICB0aGlzLm50LmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy53dChzKTtcbiAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4uY3VycmVudCAmJiBYdChpLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9jdW1lbnQgcXVlcmllcyBmb3IgZG9jdW1lbnQgdGhhdCBkb24ndCBleGlzdCBjYW4gcHJvZHVjZSBhbiBlbXB0eVxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQgc2V0LiBUbyB1cGRhdGUgb3VyIGxvY2FsIGNhY2hlLCB3ZSBzeW50aGVzaXplIGEgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlmIHdlIGhhdmUgbm90IHByZXZpb3VzbHkgcmVjZWl2ZWQgdGhlIGRvY3VtZW50LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVzIHRoZSBsaW1ibyBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQsIHJlbW92aW5nIGl0IGZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gbGltYm9Eb2N1bWVudFJlZnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGFuIGV4cGxpY2l0IGxvb2t1cCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCByZXN1bHRpbmcgaW4gYW4gZXhwbGljaXQgZGVsZXRlIG1lc3NhZ2UgYW5kIHdlIGNvdWxkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGlzIHNwZWNpYWwgbG9naWMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgU3QoaS50YXJnZXQucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHRoaXMuc3QuZ2V0KGUpIHx8IHRoaXMueXQocywgZSkgfHwgdGhpcy5jdChzLCBlLCBXdC5uZXdOb0RvY3VtZW50KGUsIHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbi5qICYmIChlLnNldChzLCBuLkcoKSksIG4uSCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICBsZXQgbiA9IFNuKCk7XG4gICAgICAgIC8vIFdlIGV4dHJhY3QgdGhlIHNldCBvZiBsaW1iby1vbmx5IGRvY3VtZW50IHVwZGF0ZXMgYXMgdGhlIEdDIGxvZ2ljXG4gICAgICAgIC8vIHNwZWNpYWwtY2FzZXMgZG9jdW1lbnRzIHRoYXQgZG8gbm90IGFwcGVhciBpbiB0aGUgdGFyZ2V0IGNhY2hlLlxuICAgICAgICBcbiAgICAgICAgLy8gVE9ETyhnc29sdGlzKTogRXhwYW5kIG9uIHRoaXMgY29tbWVudCBvbmNlIEdDIGlzIGF2YWlsYWJsZSBpbiB0aGUgSlNcbiAgICAgICAgLy8gY2xpZW50LlxuICAgICAgICAgICAgICAgIHRoaXMuaXQuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICBlLmZvckVhY2hXaGlsZSgodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMud3QodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFlIHx8IDIgLyogTGltYm9SZXNvbHV0aW9uICovID09PSBlLnB1cnBvc2UgfHwgKHMgPSAhMSwgITEpO1xuICAgICAgICAgICAgfSkpLCBzICYmIChuID0gbi5hZGQodCkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgTm4odCwgZSwgdGhpcy5ydCwgdGhpcy5zdCwgbik7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ID0gQW4oKSwgdGhpcy5pdCA9IExuKCksIHRoaXMucnQgPSBuZXcgVG4oaXQpLCBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBwcm92aWRlZCBkb2N1bWVudCB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkb2N1bWVudCB1cGRhdGVzIGFuZFxuICAgICAqIGl0cyBkb2N1bWVudCBrZXkgdG8gdGhlIGdpdmVuIHRhcmdldCdzIG1hcHBpbmcuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICBhdCh0LCBlKSB7XG4gICAgICAgIGlmICghdGhpcy5sdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuID0gdGhpcy55dCh0LCBlLmtleSkgPyAyIC8qIE1vZGlmaWVkICovIDogMCAvKiBBZGRlZCAqLztcbiAgICAgICAgdGhpcy5odCh0KS5KKGUua2V5LCBuKSwgdGhpcy5zdCA9IHRoaXMuc3QuaW5zZXJ0KGUua2V5LCBlKSwgdGhpcy5pdCA9IHRoaXMuaXQuaW5zZXJ0KGUua2V5LCB0aGlzLlR0KGUua2V5KS5hZGQodCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm92aWRlZCBkb2N1bWVudCBmcm9tIHRoZSB0YXJnZXQgbWFwcGluZy4gSWYgdGhlXG4gICAgICogZG9jdW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIHRhcmdldCwgYnV0IHRoZSBkb2N1bWVudCdzIHN0YXRlIGlzIHN0aWxsXG4gICAgICoga25vd24gKGUuZy4gd2Uga25vdyB0aGF0IHRoZSBkb2N1bWVudCB3YXMgZGVsZXRlZCBvciB3ZSByZWNlaXZlZCB0aGUgY2hhbmdlXG4gICAgICogdGhhdCBjYXVzZWQgdGhlIGZpbHRlciBtaXNtYXRjaCksIHRoZSBuZXcgZG9jdW1lbnQgY2FuIGJlIHByb3ZpZGVkXG4gICAgICogdG8gdXBkYXRlIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICBjdCh0LCBlLCBuKSB7XG4gICAgICAgIGlmICghdGhpcy5sdCh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5odCh0KTtcbiAgICAgICAgdGhpcy55dCh0LCBlKSA/IHMuSihlLCAxIC8qIFJlbW92ZWQgKi8pIDogXG4gICAgICAgIC8vIFRoZSBkb2N1bWVudCBtYXkgaGF2ZSBlbnRlcmVkIGFuZCBsZWZ0IHRoZSB0YXJnZXQgYmVmb3JlIHdlIHJhaXNlZCBhXG4gICAgICAgIC8vIHNuYXBzaG90LCBzbyB3ZSBjYW4ganVzdCBpZ25vcmUgdGhlIGNoYW5nZS5cbiAgICAgICAgcy5ZKGUpLCB0aGlzLml0ID0gdGhpcy5pdC5pbnNlcnQoZSwgdGhpcy5UdChlKS5kZWxldGUodCkpLCBuICYmICh0aGlzLnN0ID0gdGhpcy5zdC5pbnNlcnQoZSwgbikpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCkge1xuICAgICAgICB0aGlzLm50LmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBvZiBkb2N1bWVudHMgaW4gdGhlIHRhcmdldC4gVGhpcyBpbmNsdWRlcyBib3RoXG4gICAgICogdGhlIG51bWJlciBvZiBkb2N1bWVudHMgdGhhdCB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdG8gYmUgcGFydCBvZiB0aGVcbiAgICAgKiB0YXJnZXQgYXMgd2VsbCBhcyBhbnkgYWNjdW11bGF0ZWQgY2hhbmdlcy5cbiAgICAgKi8gICAgX3QodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5odCh0KS5HKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmV0LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuc2l6ZSArIGUuYWRkZWREb2N1bWVudHMuc2l6ZSAtIGUucmVtb3ZlZERvY3VtZW50cy5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY2tzIG5lZWRlZCBmcm9tIHdhdGNoIGJlZm9yZSB3ZSBjYW4gY29uc2lkZXIgdGhlXG4gICAgICogc2VydmVyIHRvIGJlICdpbi1zeW5jJyB3aXRoIHRoZSBjbGllbnQncyBhY3RpdmUgdGFyZ2V0cy5cbiAgICAgKi8gICAgWCh0KSB7XG4gICAgICAgIHRoaXMuaHQodCkuWCgpO1xuICAgIH1cbiAgICBodCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy5udC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlIHx8IChlID0gbmV3IE9uLCB0aGlzLm50LnNldCh0LCBlKSksIGU7XG4gICAgfVxuICAgIFR0KHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLml0LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcgVG4oaXQpLCB0aGlzLml0ID0gdGhpcy5pdC5pbnNlcnQodCwgZSkpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIGlzIHN0aWxsIGludGVyZXN0ZWQgaW4gdGhpcyB0YXJnZXQgKGJ5IGNhbGxpbmdcbiAgICAgKiBgZ2V0VGFyZ2V0RGF0YUZvclRhcmdldCgpYCkgYW5kIHRoYXQgd2UgYXJlIG5vdCB3YWl0aW5nIGZvciBwZW5kaW5nIEFERHNcbiAgICAgKiBmcm9tIHdhdGNoLlxuICAgICAqLyAgICBsdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBudWxsICE9PSB0aGlzLnd0KHQpO1xuICAgICAgICByZXR1cm4gZSB8fCAkKFwiV2F0Y2hDaGFuZ2VBZ2dyZWdhdG9yXCIsIFwiRGV0ZWN0ZWQgaW5hY3RpdmUgdGFyZ2V0XCIsIHQpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBUYXJnZXREYXRhIGZvciBhbiBhY3RpdmUgdGFyZ2V0IChpLmUuIGEgdGFyZ2V0IHRoYXQgdGhlIHVzZXJcbiAgICAgKiBpcyBzdGlsbCBpbnRlcmVzdGVkIGluIHRoYXQgaGFzIG5vIG91dHN0YW5kaW5nIHRhcmdldCBjaGFuZ2UgcmVxdWVzdHMpLlxuICAgICAqLyAgICB3dCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm50LmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgJiYgZS5LID8gbnVsbCA6IHRoaXMuZXQuRXQodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgYSBXYXRjaCB0YXJnZXQgdG8gaXRzIGluaXRpYWwgc3RhdGUgKGUuZy4gc2V0c1xuICAgICAqICdjdXJyZW50JyB0byBmYWxzZSwgY2xlYXJzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHJlbW92ZXMgaXRzIHRhcmdldCBtYXBwaW5nXG4gICAgICogZnJvbSBhbGwgZG9jdW1lbnRzKS5cbiAgICAgKi8gICAgZnQodCkge1xuICAgICAgICB0aGlzLm50LnNldCh0LCBuZXcgT24pO1xuICAgICAgICB0aGlzLmV0LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN0KHQsIGUsIC8qdXBkYXRlZERvY3VtZW50PSovIG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgTG9jYWxTdG9yZSBjb25zaWRlcnMgdGhlIGRvY3VtZW50IHRvIGJlIHBhcnQgb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIHRhcmdldC5cbiAgICAgKi8gICAgeXQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ldC5nZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KHQpLmhhcyhlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIExuKCkge1xuICAgIHJldHVybiBuZXcgZ24oU3QuY29tcGFyYXRvcik7XG59XG5cbmZ1bmN0aW9uIEJuKCkge1xuICAgIHJldHVybiBuZXcgZ24oU3QuY29tcGFyYXRvcik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IFVuID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBhc2M6IFwiQVNDRU5ESU5HXCIsXG4gICAgICAgIGRlc2M6IFwiREVTQ0VORElOR1wiXG4gICAgfTtcbiAgICByZXR1cm4gdDtcbn0pKCksIHFuID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBcIjxcIjogXCJMRVNTX1RIQU5cIixcbiAgICAgICAgXCI8PVwiOiBcIkxFU1NfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj5cIjogXCJHUkVBVEVSX1RIQU5cIixcbiAgICAgICAgXCI+PVwiOiBcIkdSRUFURVJfVEhBTl9PUl9FUVVBTFwiLFxuICAgICAgICBcIj09XCI6IFwiRVFVQUxcIixcbiAgICAgICAgXCIhPVwiOiBcIk5PVF9FUVVBTFwiLFxuICAgICAgICBcImFycmF5LWNvbnRhaW5zXCI6IFwiQVJSQVlfQ09OVEFJTlNcIixcbiAgICAgICAgaW46IFwiSU5cIixcbiAgICAgICAgXCJub3QtaW5cIjogXCJOT1RfSU5cIixcbiAgICAgICAgXCJhcnJheS1jb250YWlucy1hbnlcIjogXCJBUlJBWV9DT05UQUlOU19BTllcIlxuICAgIH07XG4gICAgcmV0dXJuIHQ7XG59KSgpO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIEpzb25PYmplY3QgdmFsdWVzIGZvciB0aGUgRGF0YXN0b3JlIEFQSSBzdWl0YWJsZSBmb3JcbiAqIHNlbmRpbmcgdG8gZWl0aGVyIEdSUEMgc3R1YiBtZXRob2RzIG9yIHZpYSB0aGUgSlNPTi9IVFRQIFJFU1QgQVBJLlxuICpcbiAqIFRoZSBzZXJpYWxpemVyIHN1cHBvcnRzIGJvdGggUHJvdG9idWYuanMgYW5kIFByb3RvMyBKU09OIGZvcm1hdHMuIEJ5XG4gKiBzZXR0aW5nIGB1c2VQcm90bzNKc29uYCB0byB0cnVlLCB0aGUgc2VyaWFsaXplciB3aWxsIHVzZSB0aGUgUHJvdG8zIEpTT05cbiAqIGZvcm1hdC5cbiAqXG4gKiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgUHJvdG8zIEpTT04gZm9ybWF0IGNoZWNrXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqXG4gKiBUT0RPKGtsaW10KTogV2UgY2FuIHJlbW92ZSB0aGUgZGF0YWJhc2VJZCBhcmd1bWVudCBpZiB3ZSBrZWVwIHRoZSBmdWxsXG4gKiByZXNvdXJjZSBuYW1lIGluIGRvY3VtZW50cy5cbiAqL1xuY2xhc3MgS24ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5kYXRhYmFzZUlkID0gdCwgdGhpcy5DID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBhIERhdGUgdGhhdCdzIGFwcHJvcHJpYXRlIHRvIHB1dCBpbnRvIGEgcHJvdG8uXG4gKi9cbmZ1bmN0aW9uIGpuKHQsIGUpIHtcbiAgICBpZiAodC5DKSB7XG4gICAgICAgIHJldHVybiBgJHtuZXcgRGF0ZSgxZTMgKiBlLnNlY29uZHMpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkKi8sIFwiXCIpLnJlcGxhY2UoXCJaXCIsIFwiXCIpfS4keyhcIjAwMDAwMDAwMFwiICsgZS5uYW5vc2Vjb25kcykuc2xpY2UoLTkpfVpgO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBcIlwiICsgZS5zZWNvbmRzLFxuICAgICAgICBuYW5vczogZS5uYW5vc2Vjb25kc1xuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZhbHVlIGZvciBieXRlcyB0aGF0J3MgYXBwcm9wcmlhdGUgdG8gcHV0IGluIGEgcHJvdG8uXG4gKlxuICogVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAqL1xuZnVuY3Rpb24gUW4odCwgZSkge1xuICAgIHJldHVybiB0LkMgPyBlLnRvQmFzZTY0KCkgOiBlLnRvVWludDhBcnJheSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBCeXRlU3RyaW5nIGJhc2VkIG9uIHRoZSBwcm90byBzdHJpbmcgdmFsdWUuXG4gKi8gZnVuY3Rpb24gV24odCwgZSkge1xuICAgIHJldHVybiBqbih0LCBlLnRvVGltZXN0YW1wKCkpO1xufVxuXG5mdW5jdGlvbiBHbih0KSB7XG4gICAgcmV0dXJuIEIoISF0KSwgY3QuZnJvbVRpbWVzdGFtcChmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBUdCh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBhdChlLnNlY29uZHMsIGUubmFub3MpO1xuICAgIH0odCkpO1xufVxuXG5mdW5jdGlvbiB6bih0LCBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkdChbIFwicHJvamVjdHNcIiwgdC5wcm9qZWN0SWQsIFwiZGF0YWJhc2VzXCIsIHQuZGF0YWJhc2UgXSk7XG4gICAgfSh0KS5jaGlsZChcImRvY3VtZW50c1wiKS5jaGlsZChlKS5jYW5vbmljYWxTdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gSG4odCkge1xuICAgIGNvbnN0IGUgPSBkdC5mcm9tU3RyaW5nKHQpO1xuICAgIHJldHVybiBCKEFzKGUpKSwgZTtcbn1cblxuZnVuY3Rpb24gSm4odCwgZSkge1xuICAgIHJldHVybiB6bih0LmRhdGFiYXNlSWQsIGUucGF0aCk7XG59XG5cbmZ1bmN0aW9uIFluKHQsIGUpIHtcbiAgICBjb25zdCBuID0gSG4oZSk7XG4gICAgaWYgKG4uZ2V0KDEpICE9PSB0LmRhdGFiYXNlSWQucHJvamVjdElkKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IHByb2plY3Q6IFwiICsgbi5nZXQoMSkgKyBcIiB2cyBcIiArIHQuZGF0YWJhc2VJZC5wcm9qZWN0SWQpO1xuICAgIGlmIChuLmdldCgzKSAhPT0gdC5kYXRhYmFzZUlkLmRhdGFiYXNlKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVHJpZWQgdG8gZGVzZXJpYWxpemUga2V5IGZyb20gZGlmZmVyZW50IGRhdGFiYXNlOiBcIiArIG4uZ2V0KDMpICsgXCIgdnMgXCIgKyB0LmRhdGFiYXNlSWQuZGF0YWJhc2UpO1xuICAgIHJldHVybiBuZXcgU3QoZXMobikpO1xufVxuXG5mdW5jdGlvbiBYbih0LCBlKSB7XG4gICAgcmV0dXJuIHpuKHQuZGF0YWJhc2VJZCwgZSk7XG59XG5cbmZ1bmN0aW9uIFpuKHQpIHtcbiAgICBjb25zdCBlID0gSG4odCk7XG4gICAgLy8gSW4gdjFiZXRhMSBxdWVyaWVzIGZvciBjb2xsZWN0aW9ucyBhdCB0aGUgcm9vdCBkaWQgbm90IGhhdmUgYSB0cmFpbGluZ1xuICAgIC8vIFwiL2RvY3VtZW50c1wiLiBJbiB2MSBhbGwgcmVzb3VyY2UgcGF0aHMgY29udGFpbiBcIi9kb2N1bWVudHNcIi4gUHJlc2VydmUgdGhlXG4gICAgLy8gYWJpbGl0eSB0byByZWFkIHRoZSB2MWJldGExIGZvcm0gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBxdWVyaWVzIHBlcnNpc3RlZFxuICAgIC8vIGluIHRoZSBsb2NhbCB0YXJnZXQgY2FjaGUuXG4gICAgICAgIHJldHVybiA0ID09PSBlLmxlbmd0aCA/IGR0LmVtcHR5UGF0aCgpIDogZXMoZSk7XG59XG5cbmZ1bmN0aW9uIHRzKHQpIHtcbiAgICByZXR1cm4gbmV3IGR0KFsgXCJwcm9qZWN0c1wiLCB0LmRhdGFiYXNlSWQucHJvamVjdElkLCBcImRhdGFiYXNlc1wiLCB0LmRhdGFiYXNlSWQuZGF0YWJhc2UgXSkuY2Fub25pY2FsU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGVzKHQpIHtcbiAgICByZXR1cm4gQih0Lmxlbmd0aCA+IDQgJiYgXCJkb2N1bWVudHNcIiA9PT0gdC5nZXQoNCkpLCB0LnBvcEZpcnN0KDUpO1xufVxuXG4vKiogQ3JlYXRlcyBhIERvY3VtZW50IHByb3RvIGZyb20ga2V5IGFuZCBmaWVsZHMgKGJ1dCBubyBjcmVhdGUvdXBkYXRlIHRpbWUpICovIGZ1bmN0aW9uIG5zKHQsIGUsIG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBKbih0LCBlKSxcbiAgICAgICAgZmllbGRzOiBuLnZhbHVlLm1hcFZhbHVlLmZpZWxkc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNzKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gWW4odCwgZS5uYW1lKSwgaSA9IEduKGUudXBkYXRlVGltZSksIHIgPSBuZXcganQoe1xuICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgZmllbGRzOiBlLmZpZWxkc1xuICAgICAgICB9XG4gICAgfSksIG8gPSBXdC5uZXdGb3VuZERvY3VtZW50KHMsIGksIHIpO1xuICAgIHJldHVybiBuICYmIG8uc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCksIG4gPyBvLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpIDogbztcbn1cblxuZnVuY3Rpb24gaXModCwgZSkge1xuICAgIHJldHVybiBcImZvdW5kXCIgaW4gZSA/IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgQighIWUuZm91bmQpLCBlLmZvdW5kLm5hbWUsIGUuZm91bmQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgbiA9IFluKHQsIGUuZm91bmQubmFtZSksIHMgPSBHbihlLmZvdW5kLnVwZGF0ZVRpbWUpLCBpID0gbmV3IGp0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBlLmZvdW5kLmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFd0Lm5ld0ZvdW5kRG9jdW1lbnQobiwgcywgaSk7XG4gICAgfSh0LCBlKSA6IFwibWlzc2luZ1wiIGluIGUgPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEIoISFlLm1pc3NpbmcpLCBCKCEhZS5yZWFkVGltZSk7XG4gICAgICAgIGNvbnN0IG4gPSBZbih0LCBlLm1pc3NpbmcpLCBzID0gR24oZS5yZWFkVGltZSk7XG4gICAgICAgIHJldHVybiBXdC5uZXdOb0RvY3VtZW50KG4sIHMpO1xuICAgIH0odCwgZSkgOiBMKCk7XG59XG5cbmZ1bmN0aW9uIHJzKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoXCJ0YXJnZXRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUudGFyZ2V0Q2hhbmdlO1xuICAgICAgICAvLyBwcm90bzMgZGVmYXVsdCB2YWx1ZSBpcyB1bnNldCBpbiBKU09OICh1bmRlZmluZWQpLCBzbyB1c2UgJ05PX0NIQU5HRSdcbiAgICAgICAgLy8gaWYgdW5zZXRcbiAgICAgICAgY29uc3QgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5PX0NIQU5HRVwiID09PSB0ID8gMCAvKiBOb0NoYW5nZSAqLyA6IFwiQUREXCIgPT09IHQgPyAxIC8qIEFkZGVkICovIDogXCJSRU1PVkVcIiA9PT0gdCA/IDIgLyogUmVtb3ZlZCAqLyA6IFwiQ1VSUkVOVFwiID09PSB0ID8gMyAvKiBDdXJyZW50ICovIDogXCJSRVNFVFwiID09PSB0ID8gNCAvKiBSZXNldCAqLyA6IEwoKTtcbiAgICAgICAgfShlLnRhcmdldENoYW5nZS50YXJnZXRDaGFuZ2VUeXBlIHx8IFwiTk9fQ0hBTkdFXCIpLCBpID0gZS50YXJnZXRDaGFuZ2UudGFyZ2V0SWRzIHx8IFtdLCByID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIHQuQyA/IChCKHZvaWQgMCA9PT0gZSB8fCBcInN0cmluZ1wiID09IHR5cGVvZiBlKSwgeXQuZnJvbUJhc2U2NFN0cmluZyhlIHx8IFwiXCIpKSA6IChCKHZvaWQgMCA9PT0gZSB8fCBlIGluc3RhbmNlb2YgVWludDhBcnJheSksIFxuICAgICAgICAgICAgeXQuZnJvbVVpbnQ4QXJyYXkoZSB8fCBuZXcgVWludDhBcnJheSkpO1xuICAgICAgICB9KHQsIGUudGFyZ2V0Q2hhbmdlLnJlc3VtZVRva2VuKSwgbyA9IGUudGFyZ2V0Q2hhbmdlLmNhdXNlLCBhID0gbyAmJiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdm9pZCAwID09PSB0LmNvZGUgPyBLLlVOS05PV04gOiBtbih0LmNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBqKGUsIHQubWVzc2FnZSB8fCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYSBudW1iZXIgKG9yIG51bGwpIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50b1xuICogYSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBwcm90by5cbiAqIERPIE5PVCBVU0UgVEhJUyBGT1IgQU5ZVEhJTkcgRUxTRS5cbiAqIFRoaXMgbWV0aG9kIGNoZWF0cy4gSXQncyB0eXBlZCBhcyByZXR1cm5pbmcgXCJudW1iZXJcIiBiZWNhdXNlIHRoYXQncyB3aGF0XG4gKiBvdXIgZ2VuZXJhdGVkIHByb3RvIGludGVyZmFjZXMgc2F5IEludDMyVmFsdWUgbXVzdCBiZS4gQnV0IEdSUEMgYWN0dWFsbHlcbiAqIGV4cGVjdHMgYSB7IHZhbHVlOiA8bnVtYmVyPiB9IHN0cnVjdC5cbiAqLyAobyk7XG4gICAgICAgIG4gPSBuZXcgRm4ocywgaSwgciwgYSB8fCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKFwiZG9jdW1lbnRDaGFuZ2VcIiBpbiBlKSB7XG4gICAgICAgIGUuZG9jdW1lbnRDaGFuZ2U7XG4gICAgICAgIGNvbnN0IHMgPSBlLmRvY3VtZW50Q2hhbmdlO1xuICAgICAgICBzLmRvY3VtZW50LCBzLmRvY3VtZW50Lm5hbWUsIHMuZG9jdW1lbnQudXBkYXRlVGltZTtcbiAgICAgICAgY29uc3QgaSA9IFluKHQsIHMuZG9jdW1lbnQubmFtZSksIHIgPSBHbihzLmRvY3VtZW50LnVwZGF0ZVRpbWUpLCBvID0gbmV3IGp0KHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBzLmRvY3VtZW50LmZpZWxkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgYSA9IFd0Lm5ld0ZvdW5kRG9jdW1lbnQoaSwgciwgbyksIGMgPSBzLnRhcmdldElkcyB8fCBbXSwgdSA9IHMucmVtb3ZlZFRhcmdldElkcyB8fCBbXTtcbiAgICAgICAgbiA9IG5ldyB4bihjLCB1LCBhLmtleSwgYSk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50RGVsZXRlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50RGVsZXRlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudERlbGV0ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IFluKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZWFkVGltZSA/IEduKHMucmVhZFRpbWUpIDogY3QubWluKCksIG8gPSBXdC5uZXdOb0RvY3VtZW50KGksIHIpLCBhID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IHhuKFtdLCBhLCBvLmtleSwgbyk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50UmVtb3ZlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50UmVtb3ZlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudFJlbW92ZTtcbiAgICAgICAgcy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgaSA9IFluKHQsIHMuZG9jdW1lbnQpLCByID0gcy5yZW1vdmVkVGFyZ2V0SWRzIHx8IFtdO1xuICAgICAgICBuID0gbmV3IHhuKFtdLCByLCBpLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShcImZpbHRlclwiIGluIGUpKSByZXR1cm4gTCgpO1xuICAgICAgICB7XG4gICAgICAgICAgICBlLmZpbHRlcjtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZpbHRlcjtcbiAgICAgICAgICAgIHQudGFyZ2V0SWQ7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5jb3VudCB8fCAwLCBpID0gbmV3IGZuKHMpLCByID0gdC50YXJnZXRJZDtcbiAgICAgICAgICAgIG4gPSBuZXcgJG4ociwgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIG9zKHQsIGUpIHtcbiAgICBsZXQgbjtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHJuKSBuID0ge1xuICAgICAgICB1cGRhdGU6IG5zKHQsIGUua2V5LCBlLnZhbHVlKVxuICAgIH07IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBobikgbiA9IHtcbiAgICAgICAgZGVsZXRlOiBKbih0LCBlLmtleSlcbiAgICB9OyBlbHNlIGlmIChlIGluc3RhbmNlb2Ygb24pIG4gPSB7XG4gICAgICAgIHVwZGF0ZTogbnModCwgZS5rZXksIGUuZGF0YSksXG4gICAgICAgIHVwZGF0ZU1hc2s6IElzKGUuZmllbGRNYXNrKVxuICAgIH07IGVsc2Uge1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgbG4pKSByZXR1cm4gTCgpO1xuICAgICAgICBuID0ge1xuICAgICAgICAgICAgdmVyaWZ5OiBKbih0LCBlLmtleSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGUuZmllbGRUcmFuc2Zvcm1zLmxlbmd0aCA+IDAgJiYgKG4udXBkYXRlVHJhbnNmb3JtcyA9IGUuZmllbGRUcmFuc2Zvcm1zLm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBMZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIHNldFRvU2VydmVyVmFsdWU6IFwiUkVRVUVTVF9USU1FXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBCZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcGVuZE1pc3NpbmdFbGVtZW50czoge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbi5lbGVtZW50c1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAobiBpbnN0YW5jZW9mIHFlKSByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRQYXRoOiBlLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpLFxuICAgICAgICAgICAgcmVtb3ZlQWxsRnJvbUFycmF5OiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBuLmVsZW1lbnRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2YgamUpIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZFBhdGg6IGUuZmllbGQuY2Fub25pY2FsU3RyaW5nKCksXG4gICAgICAgICAgICBpbmNyZW1lbnQ6IG4uTlxuICAgICAgICB9O1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfSgwLCB0KSkpKSwgZS5wcmVjb25kaXRpb24uaXNOb25lIHx8IChuLmN1cnJlbnREb2N1bWVudCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZS51cGRhdGVUaW1lID8ge1xuICAgICAgICAgICAgdXBkYXRlVGltZTogV24odCwgZS51cGRhdGVUaW1lKVxuICAgICAgICB9IDogdm9pZCAwICE9PSBlLmV4aXN0cyA/IHtcbiAgICAgICAgICAgIGV4aXN0czogZS5leGlzdHNcbiAgICAgICAgfSA6IEwoKTtcbiAgICB9KHQsIGUucHJlY29uZGl0aW9uKSksIG47XG59XG5cbmZ1bmN0aW9uIGFzKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZS5jdXJyZW50RG9jdW1lbnQgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQudXBkYXRlVGltZSA/IEplLnVwZGF0ZVRpbWUoR24odC51cGRhdGVUaW1lKSkgOiB2b2lkIDAgIT09IHQuZXhpc3RzID8gSmUuZXhpc3RzKHQuZXhpc3RzKSA6IEplLm5vbmUoKTtcbiAgICB9KGUuY3VycmVudERvY3VtZW50KSA6IEplLm5vbmUoKSwgcyA9IGUudXBkYXRlVHJhbnNmb3JtcyA/IGUudXBkYXRlVHJhbnNmb3Jtcy5tYXAoKGUgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgIGlmIChcInNldFRvU2VydmVyVmFsdWVcIiBpbiBlKSBCKFwiUkVRVUVTVF9USU1FXCIgPT09IGUuc2V0VG9TZXJ2ZXJWYWx1ZSksIG4gPSBuZXcgTGU7IGVsc2UgaWYgKFwiYXBwZW5kTWlzc2luZ0VsZW1lbnRzXCIgaW4gZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuYXBwZW5kTWlzc2luZ0VsZW1lbnRzLnZhbHVlcyB8fCBbXTtcbiAgICAgICAgICAgIG4gPSBuZXcgQmUodCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJyZW1vdmVBbGxGcm9tQXJyYXlcIiBpbiBlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5yZW1vdmVBbGxGcm9tQXJyYXkudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgbiA9IG5ldyBxZSh0KTtcbiAgICAgICAgfSBlbHNlIFwiaW5jcmVtZW50XCIgaW4gZSA/IG4gPSBuZXcgamUodCwgZS5pbmNyZW1lbnQpIDogTCgpO1xuICAgICAgICBjb25zdCBzID0gX3QuZnJvbVNlcnZlckZvcm1hdChlLmZpZWxkUGF0aCk7XG4gICAgICAgIHJldHVybiBuZXcgR2Uocywgbik7XG4gICAgfSh0LCBlKSkpIDogW107XG4gICAgaWYgKGUudXBkYXRlKSB7XG4gICAgICAgIGUudXBkYXRlLm5hbWU7XG4gICAgICAgIGNvbnN0IGkgPSBZbih0LCBlLnVwZGF0ZS5uYW1lKSwgciA9IG5ldyBqdCh7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczogZS51cGRhdGUuZmllbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZS51cGRhdGVNYXNrKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmZpZWxkUGF0aHMgfHwgW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBtdChlLm1hcCgodCA9PiBfdC5mcm9tU2VydmVyRm9ybWF0KHQpKSkpO1xuICAgICAgICAgICAgfShlLnVwZGF0ZU1hc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBvbihpLCByLCB0LCBuLCBzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHJuKGksIHIsIG4sIHMpO1xuICAgIH1cbiAgICBpZiAoZS5kZWxldGUpIHtcbiAgICAgICAgY29uc3QgcyA9IFluKHQsIGUuZGVsZXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBobihzLCBuKTtcbiAgICB9XG4gICAgaWYgKGUudmVyaWZ5KSB7XG4gICAgICAgIGNvbnN0IHMgPSBZbih0LCBlLnZlcmlmeSk7XG4gICAgICAgIHJldHVybiBuZXcgbG4ocywgbik7XG4gICAgfVxuICAgIHJldHVybiBMKCk7XG59XG5cbmZ1bmN0aW9uIGNzKHQsIGUpIHtcbiAgICByZXR1cm4gdCAmJiB0Lmxlbmd0aCA+IDAgPyAoQih2b2lkIDAgIT09IGUpLCB0Lm1hcCgodCA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIE5PVEU6IERlbGV0ZXMgZG9uJ3QgaGF2ZSBhbiB1cGRhdGVUaW1lLlxuICAgICAgICBsZXQgbiA9IHQudXBkYXRlVGltZSA/IEduKHQudXBkYXRlVGltZSkgOiBHbihlKTtcbiAgICAgICAgcmV0dXJuIG4uaXNFcXVhbChjdC5taW4oKSkgJiYgKFxuICAgICAgICAvLyBUaGUgRmlyZXN0b3JlIEVtdWxhdG9yIGN1cnJlbnRseSByZXR1cm5zIGFuIHVwZGF0ZSB0aW1lIG9mIDAgZm9yXG4gICAgICAgIC8vIGRlbGV0ZXMgb2Ygbm9uLWV4aXN0aW5nIGRvY3VtZW50cyAocmF0aGVyIHRoYW4gbnVsbCkuIFRoaXMgYnJlYWtzIHRoZVxuICAgICAgICAvLyB0ZXN0IFwiZ2V0IGRlbGV0ZWQgZG9jIHdoaWxlIG9mZmxpbmUgd2l0aCBzb3VyY2U9Y2FjaGVcIiBhcyBOb0RvY3VtZW50c1xuICAgICAgICAvLyB3aXRoIHZlcnNpb24gMCBhcmUgZmlsdGVyZWQgYnkgSW5kZXhlZERiJ3MgUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAgICAgICAgLy8gVE9ETygjMjE0OSk6IFJlbW92ZSB0aGlzIHdoZW4gRW11bGF0b3IgaXMgZml4ZWRcbiAgICAgICAgbiA9IEduKGUpKSwgbmV3IEhlKG4sIHQudHJhbnNmb3JtUmVzdWx0cyB8fCBbXSk7XG4gICAgfSh0LCBlKSkpKSA6IFtdO1xufVxuXG5mdW5jdGlvbiB1cyh0LCBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZG9jdW1lbnRzOiBbIFhuKHQsIGUucGF0aCkgXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhzKHQsIGUpIHtcbiAgICAvLyBEaXNzZWN0IHRoZSBwYXRoIGludG8gcGFyZW50LCBjb2xsZWN0aW9uSWQsIGFuZCBvcHRpb25hbCBrZXkgZmlsdGVyLlxuICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIHN0cnVjdHVyZWRRdWVyeToge31cbiAgICB9LCBzID0gZS5wYXRoO1xuICAgIG51bGwgIT09IGUuY29sbGVjdGlvbkdyb3VwID8gKG4ucGFyZW50ID0gWG4odCwgcyksIG4uc3RydWN0dXJlZFF1ZXJ5LmZyb20gPSBbIHtcbiAgICAgICAgY29sbGVjdGlvbklkOiBlLmNvbGxlY3Rpb25Hcm91cCxcbiAgICAgICAgYWxsRGVzY2VuZGFudHM6ICEwXG4gICAgfSBdKSA6IChuLnBhcmVudCA9IFhuKHQsIHMucG9wTGFzdCgpKSwgbi5zdHJ1Y3R1cmVkUXVlcnkuZnJvbSA9IFsge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6IHMubGFzdFNlZ21lbnQoKVxuICAgIH0gXSk7XG4gICAgY29uc3QgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgaWYgKDAgPT09IHQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGUgPSB0Lm1hcCgodCA9PiBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAoXCI9PVwiIC8qIEVRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKFV0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHlzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTkFOXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKEJ0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHlzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTlVMTFwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIiE9XCIgLyogTk9UX0VRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKFV0KHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1bmFyeUZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHlzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTk9UX05BTlwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChCdCh0LnZhbHVlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdW5hcnlGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB5cyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wOiBcIklTX05PVF9OVUxMXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpZWxkRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiB5cyh0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IGdzKHQub3ApLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odCkpKTtcbiAgICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gZVswXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgIG9wOiBcIkFORFwiLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KGUuZmlsdGVycyk7XG4gICAgaSAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkud2hlcmUgPSBpKTtcbiAgICBjb25zdCByID0gZnVuY3Rpb24odCkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIHQubWFwKCh0ID0+IFxuICAgICAgICAvLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmllbGQ6IHlzKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogbXModC5kaXIpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQpKSk7XG4gICAgfShlLm9yZGVyQnkpO1xuICAgIHIgJiYgKG4uc3RydWN0dXJlZFF1ZXJ5Lm9yZGVyQnkgPSByKTtcbiAgICBjb25zdCBvID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdC5DIHx8IGJ0KGUpID8gZSA6IHtcbiAgICAgICAgICAgIHZhbHVlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyBhIG51bWJlciAob3IgbnVsbCkgZnJvbSBhIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIHByb3RvLlxuICovICh0LCBlLmxpbWl0KTtcbiAgICByZXR1cm4gbnVsbCAhPT0gbyAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkubGltaXQgPSBvKSwgZS5zdGFydEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5zdGFydEF0ID0gd3MoZS5zdGFydEF0KSksIFxuICAgIGUuZW5kQXQgJiYgKG4uc3RydWN0dXJlZFF1ZXJ5LmVuZEF0ID0gd3MoZS5lbmRBdCkpLCBuO1xufVxuXG5mdW5jdGlvbiBscyh0KSB7XG4gICAgbGV0IGUgPSBabih0LnBhcmVudCk7XG4gICAgY29uc3QgbiA9IHQuc3RydWN0dXJlZFF1ZXJ5LCBzID0gbi5mcm9tID8gbi5mcm9tLmxlbmd0aCA6IDA7XG4gICAgbGV0IGkgPSBudWxsO1xuICAgIGlmIChzID4gMCkge1xuICAgICAgICBCKDEgPT09IHMpO1xuICAgICAgICBjb25zdCB0ID0gbi5mcm9tWzBdO1xuICAgICAgICB0LmFsbERlc2NlbmRhbnRzID8gaSA9IHQuY29sbGVjdGlvbklkIDogZSA9IGUuY2hpbGQodC5jb2xsZWN0aW9uSWQpO1xuICAgIH1cbiAgICBsZXQgciA9IFtdO1xuICAgIG4ud2hlcmUgJiYgKHIgPSBkcyhuLndoZXJlKSk7XG4gICAgbGV0IG8gPSBbXTtcbiAgICBuLm9yZGVyQnkgJiYgKG8gPSBuLm9yZGVyQnkubWFwKCh0ID0+IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBsZShwcyh0LmZpZWxkKSwgXG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJBU0NFTkRJTkdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhc2NcIiAvKiBBU0NFTkRJTkcgKi87XG5cbiAgICAgICAgICAgICAgY2FzZSBcIkRFU0NFTkRJTkdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkZXNjXCIgLyogREVTQ0VORElORyAqLztcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgICAgICh0LmRpcmVjdGlvbikpO1xuICAgIH0odCkpKSk7XG4gICAgbGV0IGEgPSBudWxsO1xuICAgIG4ubGltaXQgJiYgKGEgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICByZXR1cm4gZSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgPyB0LnZhbHVlIDogdCwgYnQoZSkgPyBudWxsIDogZTtcbiAgICB9KG4ubGltaXQpKTtcbiAgICBsZXQgYyA9IG51bGw7XG4gICAgbi5zdGFydEF0ICYmIChjID0gX3Mobi5zdGFydEF0KSk7XG4gICAgbGV0IHUgPSBudWxsO1xuICAgIHJldHVybiBuLmVuZEF0ICYmICh1ID0gX3Mobi5lbmRBdCkpLCBtZShlLCBpLCBvLCByLCBhLCBcIkZcIiAvKiBGaXJzdCAqLyAsIGMsIHUpO1xufVxuXG5mdW5jdGlvbiBmcyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgc3dpdGNoIChlKSB7XG4gICAgICAgICAgY2FzZSAwIC8qIExpc3RlbiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAgIGNhc2UgMSAvKiBFeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaCAqLyA6XG4gICAgICAgICAgICByZXR1cm4gXCJleGlzdGVuY2UtZmlsdGVyLW1pc21hdGNoXCI7XG5cbiAgICAgICAgICBjYXNlIDIgLyogTGltYm9SZXNvbHV0aW9uICovIDpcbiAgICAgICAgICAgIHJldHVybiBcImxpbWJvLWRvY3VtZW50XCI7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEwoKTtcbiAgICAgICAgfVxuICAgIH0oMCwgZS5wdXJwb3NlKTtcbiAgICByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IHtcbiAgICAgICAgXCJnb29nLWxpc3Rlbi10YWdzXCI6IG5cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBkcyh0KSB7XG4gICAgcmV0dXJuIHQgPyB2b2lkIDAgIT09IHQudW5hcnlGaWx0ZXIgPyBbIEVzKHQpIF0gOiB2b2lkIDAgIT09IHQuZmllbGRGaWx0ZXIgPyBbIFRzKHQpIF0gOiB2b2lkIDAgIT09IHQuY29tcG9zaXRlRmlsdGVyID8gdC5jb21wb3NpdGVGaWx0ZXIuZmlsdGVycy5tYXAoKHQgPT4gZHModCkpKS5yZWR1Y2UoKCh0LCBlKSA9PiB0LmNvbmNhdChlKSkpIDogTCgpIDogW107XG59XG5cbmZ1bmN0aW9uIHdzKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBiZWZvcmU6IHQuYmVmb3JlLFxuICAgICAgICB2YWx1ZXM6IHQucG9zaXRpb25cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBfcyh0KSB7XG4gICAgY29uc3QgZSA9ICEhdC5iZWZvcmUsIG4gPSB0LnZhbHVlcyB8fCBbXTtcbiAgICByZXR1cm4gbmV3IHVlKG4sIGUpO1xufVxuXG4vLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBtcyh0KSB7XG4gICAgcmV0dXJuIFVuW3RdO1xufVxuXG5mdW5jdGlvbiBncyh0KSB7XG4gICAgcmV0dXJuIHFuW3RdO1xufVxuXG5mdW5jdGlvbiB5cyh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGRQYXRoOiB0LmNhbm9uaWNhbFN0cmluZygpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcHModCkge1xuICAgIHJldHVybiBfdC5mcm9tU2VydmVyRm9ybWF0KHQuZmllbGRQYXRoKTtcbn1cblxuZnVuY3Rpb24gVHModCkge1xuICAgIHJldHVybiBadC5jcmVhdGUocHModC5maWVsZEZpbHRlci5maWVsZCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSBcIkVRVUFMXCI6XG4gICAgICAgICAgICByZXR1cm4gXCI9PVwiIC8qIEVRVUFMICovO1xuXG4gICAgICAgICAgY2FzZSBcIk5PVF9FUVVBTFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi87XG5cbiAgICAgICAgICBjYXNlIFwiR1JFQVRFUl9USEFOXCI6XG4gICAgICAgICAgICByZXR1cm4gXCI+XCIgLyogR1JFQVRFUl9USEFOICovO1xuXG4gICAgICAgICAgY2FzZSBcIkdSRUFURVJfVEhBTl9PUl9FUVVBTFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPj1cIiAvKiBHUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi87XG5cbiAgICAgICAgICBjYXNlIFwiTEVTU19USEFOXCI6XG4gICAgICAgICAgICByZXR1cm4gXCI8XCIgLyogTEVTU19USEFOICovO1xuXG4gICAgICAgICAgY2FzZSBcIkxFU1NfVEhBTl9PUl9FUVVBTFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiPD1cIiAvKiBMRVNTX1RIQU5fT1JfRVFVQUwgKi87XG5cbiAgICAgICAgICBjYXNlIFwiQVJSQVlfQ09OVEFJTlNcIjpcbiAgICAgICAgICAgIHJldHVybiBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi87XG5cbiAgICAgICAgICBjYXNlIFwiSU5cIjpcbiAgICAgICAgICAgIHJldHVybiBcImluXCIgLyogSU4gKi87XG5cbiAgICAgICAgICBjYXNlIFwiTk9UX0lOXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJub3QtaW5cIiAvKiBOT1RfSU4gKi87XG5cbiAgICAgICAgICBjYXNlIFwiQVJSQVlfQ09OVEFJTlNfQU5ZXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi87XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEwoKTtcbiAgICAgICAgfVxuICAgIH0odC5maWVsZEZpbHRlci5vcCksIHQuZmllbGRGaWx0ZXIudmFsdWUpO1xufVxuXG5mdW5jdGlvbiBFcyh0KSB7XG4gICAgc3dpdGNoICh0LnVuYXJ5RmlsdGVyLm9wKSB7XG4gICAgICBjYXNlIFwiSVNfTkFOXCI6XG4gICAgICAgIGNvbnN0IGUgPSBwcyh0LnVuYXJ5RmlsdGVyLmZpZWxkKTtcbiAgICAgICAgcmV0dXJuIFp0LmNyZWF0ZShlLCBcIj09XCIgLyogRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlIFwiSVNfTlVMTFwiOlxuICAgICAgICBjb25zdCBuID0gcHModC51bmFyeUZpbHRlci5maWVsZCk7XG4gICAgICAgIHJldHVybiBadC5jcmVhdGUobiwgXCI9PVwiIC8qIEVRVUFMICovICwge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBcIklTX05PVF9OQU5cIjpcbiAgICAgICAgY29uc3QgcyA9IHBzKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICByZXR1cm4gWnQuY3JlYXRlKHMsIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICBkb3VibGVWYWx1ZTogTmFOXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlIFwiSVNfTk9UX05VTExcIjpcbiAgICAgICAgY29uc3QgaSA9IHBzKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICByZXR1cm4gWnQuY3JlYXRlKGksIFwiIT1cIiAvKiBOT1RfRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICBudWxsVmFsdWU6IFwiTlVMTF9WQUxVRVwiXG4gICAgICAgIH0pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gSXModCkge1xuICAgIGNvbnN0IGUgPSBbXTtcbiAgICByZXR1cm4gdC5maWVsZHMuZm9yRWFjaCgodCA9PiBlLnB1c2godC5jYW5vbmljYWxTdHJpbmcoKSkpKSwge1xuICAgICAgICBmaWVsZFBhdGhzOiBlXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gQXModCkge1xuICAgIC8vIFJlc291cmNlIG5hbWVzIGhhdmUgYXQgbGVhc3QgNCBjb21wb25lbnRzIChwcm9qZWN0IElELCBkYXRhYmFzZSBJRClcbiAgICByZXR1cm4gdC5sZW5ndGggPj0gNCAmJiBcInByb2plY3RzXCIgPT09IHQuZ2V0KDApICYmIFwiZGF0YWJhc2VzXCIgPT09IHQuZ2V0KDIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBFbmNvZGVzIGEgcmVzb3VyY2UgcGF0aCBpbnRvIGEgSW5kZXhlZERiLWNvbXBhdGlibGUgc3RyaW5nIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIFJzKHQpIHtcbiAgICBsZXQgZSA9IFwiXCI7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSBlLmxlbmd0aCA+IDAgJiYgKGUgPSBicyhlKSksIGUgPSBQcyh0LmdldChuKSwgZSk7XG4gICAgcmV0dXJuIGJzKGUpO1xufVxuXG4vKiogRW5jb2RlcyBhIHNpbmdsZSBzZWdtZW50IG9mIGEgcmVzb3VyY2UgcGF0aCBpbnRvIHRoZSBnaXZlbiByZXN1bHQgKi8gZnVuY3Rpb24gUHModCwgZSkge1xuICAgIGxldCBuID0gZTtcbiAgICBjb25zdCBzID0gdC5sZW5ndGg7XG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCBzOyBlKyspIHtcbiAgICAgICAgY29uc3QgcyA9IHQuY2hhckF0KGUpO1xuICAgICAgICBzd2l0Y2ggKHMpIHtcbiAgICAgICAgICBjYXNlIFwiXFwwXCI6XG4gICAgICAgICAgICBuICs9IFwiXHUwMDAxXHUwMDEwXCI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJcdTAwMDFcIjpcbiAgICAgICAgICAgIG4gKz0gXCJcdTAwMDFcdTAwMTFcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG4gKz0gcztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cblxuLyoqIEVuY29kZXMgYSBwYXRoIHNlcGFyYXRvciBpbnRvIHRoZSBnaXZlbiByZXN1bHQgKi8gZnVuY3Rpb24gYnModCkge1xuICAgIHJldHVybiB0ICsgXCJcdTAwMDFcdTAwMDFcIjtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBnaXZlbiBJbmRleGVkRGItY29tcGF0aWJsZSBzdHJpbmcgZm9ybSBvZiBhIHJlc291cmNlIHBhdGggaW50b1xuICogYSBSZXNvdXJjZVBhdGggaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSB3aXRoXG4gKiBkZWNvZGluZyByZXNvdXJjZSBuYW1lcyBmcm9tIHRoZSBzZXJ2ZXI7IHRob3NlIGFyZSBPbmUgUGxhdGZvcm0gZm9ybWF0XG4gKiBzdHJpbmdzLlxuICovIGZ1bmN0aW9uIHZzKHQpIHtcbiAgICAvLyBFdmVudCB0aGUgZW1wdHkgcGF0aCBtdXN0IGVuY29kZSBhcyBhIHBhdGggb2YgYXQgbGVhc3QgbGVuZ3RoIDIuIEEgcGF0aFxuICAgIC8vIHdpdGggZXhhY3RseSAyIG11c3QgYmUgdGhlIGVtcHR5IHBhdGguXG4gICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgIGlmIChCKGUgPj0gMiksIDIgPT09IGUpIHJldHVybiBCKFwiXHUwMDAxXCIgPT09IHQuY2hhckF0KDApICYmIFwiXHUwMDAxXCIgPT09IHQuY2hhckF0KDEpKSwgZHQuZW1wdHlQYXRoKCk7XG4gICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgY2Fubm90IGV4aXN0IHBhc3QgdGhlIHNlY29uZC10by1sYXN0IHBvc2l0aW9uIGluIHRoZVxuICAgIC8vIHNvdXJjZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgbiA9IGUgLSAyLCBzID0gW107XG4gICAgbGV0IGkgPSBcIlwiO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgZTsgKSB7XG4gICAgICAgIC8vIFRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIGEgdmFsaWQgZW5jb2RlZCBwYXRoIG11c3QgYmUgYSBzZXBhcmF0b3IsIHNvXG4gICAgICAgIC8vIHRoZXJlIG11c3QgYmUgYW4gZW5kIHRvIHRoaXMgc2VnbWVudC5cbiAgICAgICAgY29uc3QgZSA9IHQuaW5kZXhPZihcIlx1MDAwMVwiLCByKTtcbiAgICAgICAgKGUgPCAwIHx8IGUgPiBuKSAmJiBMKCk7XG4gICAgICAgIHN3aXRjaCAodC5jaGFyQXQoZSArIDEpKSB7XG4gICAgICAgICAgY2FzZSBcIlx1MDAwMVwiOlxuICAgICAgICAgICAgY29uc3QgbiA9IHQuc3Vic3RyaW5nKHIsIGUpO1xuICAgICAgICAgICAgbGV0IG87XG4gICAgICAgICAgICAwID09PSBpLmxlbmd0aCA/IFxuICAgICAgICAgICAgLy8gQXZvaWQgY29weWluZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGEgc2VnbWVudCB0aGF0IGV4Y2x1ZGVzIFxcMFxuICAgICAgICAgICAgLy8gYW5kIFxcMDAxXG4gICAgICAgICAgICBvID0gbiA6IChpICs9IG4sIG8gPSBpLCBpID0gXCJcIiksIHMucHVzaChvKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIlx1MDAxMFwiOlxuICAgICAgICAgICAgaSArPSB0LnN1YnN0cmluZyhyLCBlKSwgaSArPSBcIlxcMFwiO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiXHUwMDExXCI6XG4gICAgICAgICAgICAvLyBUaGUgZXNjYXBlIGNoYXJhY3RlciBjYW4gYmUgdXNlZCBpbiB0aGUgb3V0cHV0IHRvIGVuY29kZSBpdHNlbGYuXG4gICAgICAgICAgICBpICs9IHQuc3Vic3RyaW5nKHIsIGUgKyAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEwoKTtcbiAgICAgICAgfVxuICAgICAgICByID0gZSArIDI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZHQocyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNjaGVtYSBWZXJzaW9uIGZvciB0aGUgV2ViIGNsaWVudDpcbiAqIDEuICBJbml0aWFsIHZlcnNpb24gaW5jbHVkaW5nIE11dGF0aW9uIFF1ZXVlLCBRdWVyeSBDYWNoZSwgYW5kIFJlbW90ZVxuICogICAgIERvY3VtZW50IENhY2hlXG4gKiAyLiAgVXNlZCB0byBlbnN1cmUgYSB0YXJnZXRHbG9iYWwgb2JqZWN0IGV4aXN0cyBhbmQgYWRkIHRhcmdldENvdW50IHRvIGl0LiBOb1xuICogICAgIGxvbmdlciByZXF1aXJlZCBiZWNhdXNlIG1pZ3JhdGlvbiAzIHVuY29uZGl0aW9uYWxseSBjbGVhcnMgaXQuXG4gKiAzLiAgRHJvcHBlZCBhbmQgcmUtY3JlYXRlZCBRdWVyeSBDYWNoZSB0byBkZWFsIHdpdGggY2FjaGUgY29ycnVwdGlvbiByZWxhdGVkXG4gKiAgICAgdG8gbGltYm8gcmVzb2x1dGlvbi4gQWRkcmVzc2VzXG4gKiAgICAgaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWlvcy1zZGsvaXNzdWVzLzE1NDhcbiAqIDQuICBNdWx0aS1UYWIgU3VwcG9ydC5cbiAqIDUuICBSZW1vdmFsIG9mIGhlbGQgd3JpdGUgYWNrcy5cbiAqIDYuICBDcmVhdGUgZG9jdW1lbnQgZ2xvYmFsIGZvciB0cmFja2luZyBkb2N1bWVudCBjYWNoZSBzaXplLlxuICogNy4gIEVuc3VyZSBldmVyeSBjYWNoZWQgZG9jdW1lbnQgaGFzIGEgc2VudGluZWwgcm93IHdpdGggYSBzZXF1ZW5jZSBudW1iZXIuXG4gKiA4LiAgQWRkIGNvbGxlY3Rpb24tcGFyZW50IGluZGV4IGZvciBDb2xsZWN0aW9uIEdyb3VwIHF1ZXJpZXMuXG4gKiA5LiAgQ2hhbmdlIFJlbW90ZURvY3VtZW50Q2hhbmdlcyBzdG9yZSB0byBiZSBrZXllZCBieSByZWFkVGltZSByYXRoZXIgdGhhblxuICogICAgIGFuIGF1dG8taW5jcmVtZW50aW5nIElELiBUaGlzIGlzIHJlcXVpcmVkIGZvciBJbmRleC1GcmVlIHF1ZXJpZXMuXG4gKiAxMC4gUmV3cml0ZSB0aGUgY2Fub25pY2FsIElEcyB0byB0aGUgZXhwbGljaXQgUHJvdG9idWYtYmFzZWQgZm9ybWF0LlxuICogMTEuIEFkZCBidW5kbGVzIGFuZCBuYW1lZF9xdWVyaWVzIGZvciBidW5kbGUgc3VwcG9ydC5cbiAqL1xuLyoqXG4gKiBXcmFwcGVyIGNsYXNzIHRvIHN0b3JlIHRpbWVzdGFtcHMgKHNlY29uZHMgYW5kIG5hbm9zKSBpbiBJbmRleGVkRGIgb2JqZWN0cy5cbiAqL1xuY2xhc3MgVnMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzID0gdCwgdGhpcy5uYW5vc2Vjb25kcyA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgc2luZ2xldG9uIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlICdvd25lcicgc3RvcmUgaW4gSW5kZXhlZERiLlxuICpcbiAqIEEgZ2l2ZW4gZGF0YWJhc2UgY2FuIGhhdmUgYSBzaW5nbGUgcHJpbWFyeSB0YWIgYXNzaWduZWQgYXQgYSBnaXZlbiB0aW1lLiBUaGF0XG4gKiB0YWIgbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIHN0aWxsIGhvbGRpbmcgdGhlIHByaW1hcnkgbGVhc2UgYmVmb3JlIGV2ZXJ5XG4gKiBvcGVyYXRpb24gdGhhdCByZXF1aXJlcyBsb2NrZWQgYWNjZXNzLiBUaGUgcHJpbWFyeSB0YWIgc2hvdWxkIHJlZ3VsYXJseVxuICogd3JpdGUgYW4gdXBkYXRlZCB0aW1lc3RhbXAgdG8gdGhpcyBsZWFzZSB0byBwcmV2ZW50IG90aGVyIHRhYnMgZnJvbVxuICogXCJzdGVhbGluZ1wiIHRoZSBwcmltYXJ5IGxlYXNlXG4gKi8gY2xhc3MgU3Mge1xuICAgIGNvbnN0cnVjdG9yKHQsIFxuICAgIC8qKiBXaGV0aGVyIHRvIGFsbG93IHNoYXJlZCBhY2Nlc3MgZnJvbSBtdWx0aXBsZSB0YWJzLiAqL1xuICAgIGUsIG4pIHtcbiAgICAgICAgdGhpcy5vd25lcklkID0gdCwgdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbiA9IGUsIHRoaXMubGVhc2VUaW1lc3RhbXBNcyA9IG47XG4gICAgfVxufVxuXG4vKipcbiAqIE5hbWUgb2YgdGhlIEluZGV4ZWREYiBvYmplY3Qgc3RvcmUuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBuYW1lICdvd25lcicgaXMgY2hvc2VuIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoXG4gKiBvbGRlciBjbGllbnRzIHRoYXQgb25seSBzdXBwb3J0ZWQgc2luZ2xlIGxvY2tlZCBhY2Nlc3MgdG8gdGhlIHBlcnNpc3RlbmNlXG4gKiBsYXllci5cbiAqLyBTcy5zdG9yZSA9IFwib3duZXJcIiwgXG4vKipcbiAqIFRoZSBrZXkgc3RyaW5nIHVzZWQgZm9yIHRoZSBzaW5nbGUgb2JqZWN0IHRoYXQgZXhpc3RzIGluIHRoZVxuICogRGJQcmltYXJ5Q2xpZW50IHN0b3JlLlxuICovXG5Tcy5rZXkgPSBcIm93bmVyXCI7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgJ211dGF0aW9uUXVldWVzJyBzdG9yZSBpbiBJbmRleGVkRGIuXG4gKlxuICogRWFjaCB1c2VyIGdldHMgYSBzaW5nbGUgcXVldWUgb2YgTXV0YXRpb25CYXRjaGVzIHRvIGFwcGx5IHRvIHRoZSBzZXJ2ZXIuXG4gKiBEYk11dGF0aW9uUXVldWUgdHJhY2tzIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgcXVldWUuXG4gKi9cbmNsYXNzIERzIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgbm9ybWFsaXplZCB1c2VyIElEIHRvIHdoaWNoIHRoaXMgcXVldWUgYmVsb25ncy5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgaGlnaGVzdCBudW1iZXJlZCBiYXRjaCB0aGF0IGhhcyBiZWVuIGFja25vd2xlZGdlZFxuICAgICAqIGJ5IHRoZSBzZXJ2ZXIuIEFsbCBNdXRhdGlvbkJhdGNoZXMgaW4gdGhpcyBxdWV1ZSB3aXRoIGJhdGNoSWRzIGxlc3NcbiAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgdmFsdWUgYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIGFja25vd2xlZGdlZCBieVxuICAgICAqIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBOT1RFOiB0aGlzIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciB1c2VkIGJ5IHRoZSBjb2RlLlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIEEgc3RyZWFtIHRva2VuIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCBieSB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogU2VlIFN0cmVhbWluZ1dyaXRlUmVxdWVzdCBpbiBkYXRhc3RvcmUucHJvdG8gZm9yIG1vcmUgZGV0YWlscyBhYm91dFxuICAgICAqIHVzYWdlLlxuICAgICAqXG4gICAgICogQWZ0ZXIgc2VuZGluZyB0aGlzIHRva2VuLCBlYXJsaWVyIHRva2VucyBtYXkgbm90IGJlIHVzZWQgYW55bW9yZSBzb1xuICAgICAqIG9ubHkgYSBzaW5nbGUgc3RyZWFtIHRva2VuIGlzIHJldGFpbmVkLlxuICAgICAqXG4gICAgICogTk9URTogdGhpcyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgdXNlZCBieSB0aGUgY29kZS5cbiAgICAgKi9cbiAgICBuKSB7XG4gICAgICAgIHRoaXMudXNlcklkID0gdCwgdGhpcy5sYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZCA9IGUsIHRoaXMubGFzdFN0cmVhbVRva2VuID0gbjtcbiAgICB9XG59XG5cbi8qKiBOYW1lIG9mIHRoZSBJbmRleGVkRGIgb2JqZWN0IHN0b3JlLiAgKi8gRHMuc3RvcmUgPSBcIm11dGF0aW9uUXVldWVzXCIsIFxuLyoqIEtleXMgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdmlhIHRoZSB1c2VySWQgcHJvcGVydHkuICovXG5Ecy5rZXlQYXRoID0gXCJ1c2VySWRcIjtcblxuLyoqXG4gKiBBbiBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSAnbXV0YXRpb25zJyBzdG9yZSBpbiBJbmRleGVkRGIuXG4gKlxuICogUmVwcmVzZW50cyBhIGJhdGNoIG9mIHVzZXItbGV2ZWwgbXV0YXRpb25zIGludGVuZGVkIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlclxuICogaW4gYSBzaW5nbGUgd3JpdGUuIEVhY2ggdXNlci1sZXZlbCBiYXRjaCBnZXRzIGEgc2VwYXJhdGUgRGJNdXRhdGlvbkJhdGNoXG4gKiB3aXRoIGEgbmV3IGJhdGNoSWQuXG4gKi9cbmNsYXNzIENzIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgbm9ybWFsaXplZCB1c2VyIElEIHRvIHdoaWNoIHRoaXMgYmF0Y2ggYmVsb25ncy5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGlzIGJhdGNoLCBhbGxvY2F0ZWQgdXNpbmcgYW4gYXV0by1nZW5lcmF0ZWQga2V5LlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhbCB3cml0ZSB0aW1lIG9mIHRoZSBiYXRjaCwgc3RvcmVkIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGVcbiAgICAgKiBlcG9jaC5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgXCJtdXRhdGlvbnNcIiB0aGF0IHJlcHJlc2VudCBhIHBhcnRpYWwgYmFzZSBzdGF0ZSBmcm9tIHdoZW4gdGhpc1xuICAgICAqIHdyaXRlIGJhdGNoIHdhcyBpbml0aWFsbHkgY3JlYXRlZC4gRHVyaW5nIGxvY2FsIGFwcGxpY2F0aW9uIG9mIHRoZSB3cml0ZVxuICAgICAqIGJhdGNoLCB0aGVzZSBiYXNlTXV0YXRpb25zIGFyZSBhcHBsaWVkIHByaW9yIHRvIHRoZSByZWFsIHdyaXRlcyBpbiBvcmRlclxuICAgICAqIHRvIG92ZXJyaWRlIGNlcnRhaW4gZG9jdW1lbnQgZmllbGRzIGZyb20gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZS4gVGhpc1xuICAgICAqIGlzIG5lY2Vzc2FyeSBpbiB0aGUgY2FzZSBvZiBub24taWRlbXBvdGVudCB3cml0ZXMgKGUuZy4gYGluY3JlbWVudCgpYFxuICAgICAqIHRyYW5zZm9ybXMpIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBtb2RpZmllZCBkb2N1bWVudHNcbiAgICAgKiBkb2Vzbid0IGZsaWNrZXIgaWYgdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZSByZWNlaXZlcyB0aGUgcmVzdWx0IG9mIHRoZVxuICAgICAqIG5vbi1pZGVtcG90ZW50IHdyaXRlIGJlZm9yZSB0aGUgd3JpdGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIFRoZXNlIG11dGF0aW9ucyBhcmUgbmV2ZXIgc2VudCB0byB0aGUgYmFja2VuZC5cbiAgICAgKi9cbiAgICBzLCBcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbXV0YXRpb25zIHRvIGFwcGx5LiBBbGwgbXV0YXRpb25zIHdpbGwgYmUgYXBwbGllZCBhdG9taWNhbGx5LlxuICAgICAqXG4gICAgICogTXV0YXRpb25zIGFyZSBzZXJpYWxpemVkIHZpYSB0b011dGF0aW9uKCkuXG4gICAgICovXG4gICAgaSkge1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHQsIHRoaXMuYmF0Y2hJZCA9IGUsIHRoaXMubG9jYWxXcml0ZVRpbWVNcyA9IG4sIHRoaXMuYmFzZU11dGF0aW9ucyA9IHMsIFxuICAgICAgICB0aGlzLm11dGF0aW9ucyA9IGk7XG4gICAgfVxufVxuXG4vKiogTmFtZSBvZiB0aGUgSW5kZXhlZERiIG9iamVjdCBzdG9yZS4gICovIENzLnN0b3JlID0gXCJtdXRhdGlvbnNcIiwgXG4vKiogS2V5cyBhcmUgYXV0b21hdGljYWxseSBhc3NpZ25lZCB2aWEgdGhlIHVzZXJJZCwgYmF0Y2hJZCBwcm9wZXJ0aWVzLiAqL1xuQ3Mua2V5UGF0aCA9IFwiYmF0Y2hJZFwiLCBcbi8qKiBUaGUgaW5kZXggbmFtZSBmb3IgbG9va3VwIG9mIG11dGF0aW9ucyBieSB1c2VyLiAqL1xuQ3MudXNlck11dGF0aW9uc0luZGV4ID0gXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgXG4vKiogVGhlIHVzZXIgbXV0YXRpb25zIGluZGV4IGlzIGtleWVkIGJ5IFt1c2VySWQsIGJhdGNoSWRdIHBhaXJzLiAqL1xuQ3MudXNlck11dGF0aW9uc0tleVBhdGggPSBbIFwidXNlcklkXCIsIFwiYmF0Y2hJZFwiIF07XG5cbi8qKlxuICogQW4gb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgJ2RvY3VtZW50TXV0YXRpb25zJyBzdG9yZSBpbiBJbmRleGVkRGIuXG4gKlxuICogQSBtYW51YWxseSBtYWludGFpbmVkIGluZGV4IG9mIGFsbCB0aGUgbXV0YXRpb24gYmF0Y2hlcyB0aGF0IGFmZmVjdCBhIGdpdmVuXG4gKiBkb2N1bWVudCBrZXkuIFRoZSByb3dzIGluIHRoaXMgdGFibGUgYXJlIHJlZmVyZW5jZXMgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mXG4gKiBEYk11dGF0aW9uQmF0Y2gubXV0YXRpb25zLlxuICovXG5jbGFzcyBOcyB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBbdXNlcklkXSBrZXkgZm9yIHVzZSBpbiB0aGUgRGJEb2N1bWVudE11dGF0aW9ucyBpbmRleCB0byBpdGVyYXRlXG4gICAgICogb3ZlciBhbGwgb2YgYSB1c2VyJ3MgZG9jdW1lbnQgbXV0YXRpb25zLlxuICAgICAqLyAgICBzdGF0aWMgcHJlZml4Rm9yVXNlcih0KSB7XG4gICAgICAgIHJldHVybiBbIHQgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFt1c2VySWQsIGVuY29kZWRQYXRoXSBrZXkgZm9yIHVzZSBpbiB0aGUgRGJEb2N1bWVudE11dGF0aW9uc1xuICAgICAqIGluZGV4IHRvIGl0ZXJhdGUgb3ZlciBhbGwgYXQgZG9jdW1lbnQgbXV0YXRpb25zIGZvciBhIGdpdmVuIHBhdGggb3IgbG93ZXIuXG4gICAgICovICAgIHN0YXRpYyBwcmVmaXhGb3JQYXRoKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFsgdCwgUnMoZSkgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bGwgaW5kZXgga2V5IG9mIFt1c2VySWQsIGVuY29kZWRQYXRoLCBiYXRjaElkXSBmb3IgaW5zZXJ0aW5nXG4gICAgICogYW5kIGRlbGV0aW5nIGludG8gdGhlIERiRG9jdW1lbnRNdXRhdGlvbnMgaW5kZXguXG4gICAgICovICAgIHN0YXRpYyBrZXkodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gWyB0LCBScyhlKSwgbiBdO1xuICAgIH1cbn1cblxuTnMuc3RvcmUgPSBcImRvY3VtZW50TXV0YXRpb25zXCIsIFxuLyoqXG4gKiBCZWNhdXNlIHdlIHN0b3JlIGFsbCB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGZvciB0aGlzIHN0b3JlIGluIHRoZSBrZXksXG4gKiB0aGVyZSBpcyBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gc3RvcmUgYXMgdGhlIHZhbHVlLiBUaGUgcmF3ICh1bmVuY29kZWQpXG4gKiBwYXRoIGNhbm5vdCBiZSBzdG9yZWQgYmVjYXVzZSBJbmRleGVkRGIgZG9lc24ndCBzdG9yZSBwcm90b3R5cGVcbiAqIGluZm9ybWF0aW9uLlxuICovXG5Ocy5QTEFDRUhPTERFUiA9IG5ldyBOcztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBrbm93biBhYnNlbmNlIG9mIGEgZG9jdW1lbnQgYXQgYSBwYXJ0aWN1bGFyIHZlcnNpb24uXG4gKiBTdG9yZWQgaW4gSW5kZXhlZERiIGFzIHBhcnQgb2YgYSBEYlJlbW90ZURvY3VtZW50IG9iamVjdC5cbiAqL1xuY2xhc3Mga3Mge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5wYXRoID0gdCwgdGhpcy5yZWFkVGltZSA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIGV4aXN0IGJ1dCB3aG9zZSBkYXRhIGlzIHVua25vd24uXG4gKiBTdG9yZWQgaW4gSW5kZXhlZERiIGFzIHBhcnQgb2YgYSBEYlJlbW90ZURvY3VtZW50IG9iamVjdC5cbiAqLyBjbGFzcyB4cyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnBhdGggPSB0LCB0aGlzLnZlcnNpb24gPSBlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSAncmVtb3RlRG9jdW1lbnRzJyBzdG9yZSBpbiBJbmRleGVkRGIuXG4gKiBJdCByZXByZXNlbnRzIGVpdGhlcjpcbiAqXG4gKiAtIEEgY29tcGxldGUgZG9jdW1lbnQuXG4gKiAtIEEgXCJubyBkb2N1bWVudFwiIHJlcHJlc2VudGluZyBhIGRvY3VtZW50IHRoYXQgaXMga25vd24gbm90IHRvIGV4aXN0IChhdFxuICogc29tZSB2ZXJzaW9uKS5cbiAqIC0gQW4gXCJ1bmtub3duIGRvY3VtZW50XCIgcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgdGhhdCBpcyBrbm93biB0byBleGlzdCAoYXRcbiAqIHNvbWUgdmVyc2lvbikgYnV0IHdob3NlIGNvbnRlbnRzIGFyZSB1bmtub3duLlxuICpcbiAqIE5vdGU6IFRoaXMgaXMgdGhlIHBlcnNpc3RlZCBlcXVpdmFsZW50IG9mIGEgTWF5YmVEb2N1bWVudCBhbmQgY291bGQgcGVyaGFwc1xuICogYmUgbWFkZSBtb3JlIGdlbmVyYWwgaWYgbmVjZXNzYXJ5LlxuICovIGNsYXNzICRzIHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgY3VycmVudGx5IHN0b3JpbmcgZnVsbCBkb2N1bWVudCBrZXlzIGFsbW9zdCB0aHJlZSB0aW1lc1xuICAgIC8vIChvbmNlIGFzIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5LCBvbmNlIC0gcGFydGx5IC0gYXMgYHBhcmVudFBhdGhgIGFuZCBvbmNlXG4gICAgLy8gaW5zaWRlIHRoZSBlbmNvZGVkIGRvY3VtZW50cykuIER1cmluZyBvdXIgbmV4dCBtaWdyYXRpb24sIHdlIHNob3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIHByaW1hcnkga2V5IGFzIHBhcmVudFBhdGggKyBkb2N1bWVudCBJRCB3aGljaCB3b3VsZCBhbGxvdyB1c1xuICAgIC8vIHRvIGRyb3Agb25lIHZhbHVlLlxuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFNldCB0byBhbiBpbnN0YW5jZSBvZiBEYlVua25vd25Eb2N1bWVudCBpZiB0aGUgZGF0YSBmb3IgYSBkb2N1bWVudCBpc1xuICAgICAqIG5vdCBrbm93biwgYnV0IGl0IGlzIGtub3duIHRoYXQgYSBkb2N1bWVudCBleGlzdHMgYXQgdGhlIHNwZWNpZmllZFxuICAgICAqIHZlcnNpb24gKGUuZy4gaXQgaGFkIGEgc3VjY2Vzc2Z1bCB1cGRhdGUgYXBwbGllZCB0byBpdClcbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBEYk5vRG9jdW1lbnQgaWYgaXQgaXMga25vd24gdGhhdCBubyBkb2N1bWVudFxuICAgICAqIGV4aXN0cy5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBEb2N1bWVudCBpZiB0aGVyZSdzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlXG4gICAgICogZG9jdW1lbnQuXG4gICAgICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIHRoYXQgd2VyZSB3cml0dGVuIHRvIHRoZSByZW1vdGUgZG9jdW1lbnQgc3RvcmUgYmFzZWQgb25cbiAgICAgKiBhIHdyaXRlIGFja25vd2xlZGdtZW50IGFyZSBtYXJrZWQgd2l0aCBgaGFzQ29tbWl0dGVkTXV0YXRpb25zYC4gVGhlc2VcbiAgICAgKiBkb2N1bWVudHMgYXJlIHBvdGVudGlhbGx5IGluY29uc2lzdGVudCB3aXRoIHRoZSBiYWNrZW5kJ3MgY29weSBhbmQgdXNlXG4gICAgICogdGhlIHdyaXRlJ3MgY29tbWl0IHZlcnNpb24gYXMgdGhlaXIgZG9jdW1lbnQgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBzLCBcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBkb2N1bWVudCB3YXMgcmVhZCBmcm9tIHRoZSBiYWNrZW5kLiBVbmRlZmluZWQgZm9yIGRhdGEgd3JpdHRlblxuICAgICAqIHByaW9yIHRvIHNjaGVtYSB2ZXJzaW9uIDkuXG4gICAgICovXG4gICAgaSwgXG4gICAgLyoqXG4gICAgICogVGhlIHBhdGggb2YgdGhlIGNvbGxlY3Rpb24gdGhpcyBkb2N1bWVudCBpcyBwYXJ0IG9mLiBVbmRlZmluZWQgZm9yIGRhdGFcbiAgICAgKiB3cml0dGVuIHByaW9yIHRvIHNjaGVtYSB2ZXJzaW9uIDkuXG4gICAgICovXG4gICAgcikge1xuICAgICAgICB0aGlzLnVua25vd25Eb2N1bWVudCA9IHQsIHRoaXMubm9Eb2N1bWVudCA9IGUsIHRoaXMuZG9jdW1lbnQgPSBuLCB0aGlzLmhhc0NvbW1pdHRlZE11dGF0aW9ucyA9IHMsIFxuICAgICAgICB0aGlzLnJlYWRUaW1lID0gaSwgdGhpcy5wYXJlbnRQYXRoID0gcjtcbiAgICB9XG59XG5cbiRzLnN0b3JlID0gXCJyZW1vdGVEb2N1bWVudHNcIiwgXG4vKipcbiAqIEFuIGluZGV4IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBlbnRyaWVzIHNvcnRlZCBieSByZWFkIHRpbWUgKHdoaWNoXG4gKiBjb3JyZXNwb25kcyB0byB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBlYWNoIHJvdykuXG4gKlxuICogVGhpcyBpbmRleCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBjaGFuZ2Vsb2cgZm9yIE11bHRpLVRhYi5cbiAqL1xuJHMucmVhZFRpbWVJbmRleCA9IFwicmVhZFRpbWVJbmRleFwiLCAkcy5yZWFkVGltZUluZGV4UGF0aCA9IFwicmVhZFRpbWVcIiwgXG4vKipcbiAqIEFuIGluZGV4IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGRvY3VtZW50cyBpbiBhIGNvbGxlY3Rpb24gc29ydGVkIGJ5IHJlYWRcbiAqIHRpbWUuXG4gKlxuICogVGhpcyBpbmRleCBpcyB1c2VkIHRvIGFsbG93IHRoZSBSZW1vdGVEb2N1bWVudENhY2hlIHRvIGZldGNoIG5ld2x5IGNoYW5nZWRcbiAqIGRvY3VtZW50cyBpbiBhIGNvbGxlY3Rpb24uXG4gKi9cbiRzLmNvbGxlY3Rpb25SZWFkVGltZUluZGV4ID0gXCJjb2xsZWN0aW9uUmVhZFRpbWVJbmRleFwiLCAkcy5jb2xsZWN0aW9uUmVhZFRpbWVJbmRleFBhdGggPSBbIFwicGFyZW50UGF0aFwiLCBcInJlYWRUaW1lXCIgXTtcblxuLyoqXG4gKiBDb250YWlucyBhIHNpbmdsZSBlbnRyeSB0aGF0IGhhcyBtZXRhZGF0YSBhYm91dCB0aGUgcmVtb3RlIGRvY3VtZW50IGNhY2hlLlxuICovXG5jbGFzcyBGcyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIC0gQXBwcm94aW1hdGVseSB0aGUgdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBhbGwgdGhlXG4gICAgICogZG9jdW1lbnRzIGluIHRoZSBkb2N1bWVudCBjYWNoZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuYnl0ZVNpemUgPSB0O1xuICAgIH1cbn1cblxuRnMuc3RvcmUgPSBcInJlbW90ZURvY3VtZW50R2xvYmFsXCIsIEZzLmtleSA9IFwicmVtb3RlRG9jdW1lbnRHbG9iYWxLZXlcIjtcblxuLyoqXG4gKiBBbiBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSAndGFyZ2V0cycgc3RvcmUgaW4gSW5kZXhlZERiLlxuICpcbiAqIFRoaXMgaXMgYmFzZWQgb24gYW5kIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcHJvdG8gdXNlZCBpbiB0aGUgaU9TXG4gKiBjbGllbnQuXG4gKlxuICogRWFjaCBxdWVyeSB0aGUgY2xpZW50IGxpc3RlbnMgdG8gYWdhaW5zdCB0aGUgc2VydmVyIGlzIHRyYWNrZWQgb24gZGlzayBzb1xuICogdGhhdCB0aGUgcXVlcnkgY2FuIGJlIGVmZmljaWVudGx5IHJlc3VtZWQgb24gcmVzdGFydC5cbiAqL1xuY2xhc3MgT3Mge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEFuIGF1dG8tZ2VuZXJhdGVkIHNlcXVlbnRpYWwgbnVtZXJpYyBpZGVudGlmaWVyIGZvciB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBRdWVyaWVzIGFyZSBzdG9yZWQgdXNpbmcgdGhlaXIgY2Fub25pY2FsSWQgYXMgdGhlIGtleSwgYnV0IHRoZXNlXG4gICAgICogY2Fub25pY2FsSWRzIGNhbiBiZSBxdWl0ZSBsb25nIHNvIHdlIGFkZGl0aW9uYWxseSBhc3NpZ24gYSB1bmlxdWVcbiAgICAgKiBxdWVyeUlkIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IHJlZmVyZW5jZWQgZGF0YSBzdHJ1Y3R1cmVzIChlLmcuXG4gICAgICogaW5kZXhlcykgdG8gbWluaW1pemUgdGhlIG9uLWRpc2sgY29zdC5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBxdWVyeS4gVGhpcyBpcyBub3QgdW5pcXVlLlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHJlYWRUaW1lIHJlY2VpdmVkIGZyb20gdGhlIFdhdGNoIFNlcnZpY2UgZm9yIHRoaXMgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzIFRhcmdldENoYW5nZS5yZWFkX3RpbWUgaW4gdGhlIHByb3Rvcy5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBBbiBvcGFxdWUsIHNlcnZlci1hc3NpZ25lZCB0b2tlbiB0aGF0IGFsbG93cyB3YXRjaGluZyBhIHF1ZXJ5IHRvIGJlXG4gICAgICogcmVzdW1lZCBhZnRlciBkaXNjb25uZWN0aW5nIHdpdGhvdXQgcmV0cmFuc21pdHRpbmcgYWxsIHRoZSBkYXRhXG4gICAgICogdGhhdCBtYXRjaGVzIHRoZSBxdWVyeS4gVGhlIHJlc3VtZSB0b2tlbiBlc3NlbnRpYWxseSBpZGVudGlmaWVzIGFcbiAgICAgKiBwb2ludCBpbiB0aW1lIGZyb20gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVzdW1lIHNlbmRpbmcgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgcmVsYXRlZCB0byB0aGUgc25hcHNob3RWZXJzaW9uIGluIHRoYXQgdGhlIHJlc3VtZVRva2VuXG4gICAgICogZWZmZWN0aXZlbHkgYWxzbyBlbmNvZGVzIHRoYXQgdmFsdWUsIGJ1dCB0aGUgcmVzdW1lVG9rZW4gaXMgb3BhcXVlXG4gICAgICogYW5kIHNvbWV0aW1lcyBlbmNvZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBBIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCB0aGUgcmVzdW1lVG9rZW4gc2hvdWxkIGJlIHVzZWQgd2hlblxuICAgICAqIGFza2luZyB0aGUgc2VydmVyIHRvIHJlYXNvbiBhYm91dCB3aGVyZSB0aGlzIGNsaWVudCBpcyBpbiB0aGUgd2F0Y2hcbiAgICAgKiBzdHJlYW0sIGJ1dCB0aGUgY2xpZW50IHNob3VsZCB1c2UgdGhlIHNuYXBzaG90VmVyc2lvbiBmb3IgaXRzIG93blxuICAgICAqIHB1cnBvc2VzLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcyBUYXJnZXRDaGFuZ2UucmVzdW1lX3Rva2VuIGluIHRoZSBwcm90b3MuXG4gICAgICovXG4gICAgcywgXG4gICAgLyoqXG4gICAgICogQSBzZXF1ZW5jZSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBsYXN0IHRpbWUgdGhpcyBxdWVyeSB3YXNcbiAgICAgKiBsaXN0ZW5lZCB0bywgdXNlZCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHB1cnBvc2VzLlxuICAgICAqXG4gICAgICogQ29udmVudGlvbmFsbHkgdGhpcyB3b3VsZCBiZSBhIHRpbWVzdGFtcCB2YWx1ZSwgYnV0IGRldmljZS1sb2NhbFxuICAgICAqIGNsb2NrcyBhcmUgdW5yZWxpYWJsZSBhbmQgdGhleSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBsaXN0ZW5zXG4gICAgICogZXZlbiB3aGlsZSBkaXNjb25uZWN0ZWQuIEluc3RlYWQgdGhpcyBzaG91bGQgYmUgYSBtb25vdG9uaWNhbGx5XG4gICAgICogaW5jcmVhc2luZyBudW1iZXIgdGhhdCdzIGluY3JlbWVudGVkIG9uIGVhY2ggbGlzdGVuIGNhbGwuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBxdWVyeUlkIHNpbmNlIHRoZSBxdWVyeUlkIGlzIGFuXG4gICAgICogaW1tdXRhYmxlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIFF1ZXJ5IG9uIGZpcnN0IHVzZSB3aGlsZVxuICAgICAqIGxhc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciBpcyB1cGRhdGVkIGV2ZXJ5IHRpbWUgdGhlIHF1ZXJ5IGlzXG4gICAgICogbGlzdGVuZWQgdG8uXG4gICAgICovXG4gICAgaSwgXG4gICAgLyoqXG4gICAgICogRGVub3RlcyB0aGUgbWF4aW11bSBzbmFwc2hvdCB2ZXJzaW9uIGF0IHdoaWNoIHRoZSBhc3NvY2lhdGVkIHF1ZXJ5IHZpZXdcbiAgICAgKiBjb250YWluZWQgbm8gbGltYm8gZG9jdW1lbnRzLiAgVW5kZWZpbmVkIGZvciBkYXRhIHdyaXR0ZW4gcHJpb3IgdG9cbiAgICAgKiBzY2hlbWEgdmVyc2lvbiA5LlxuICAgICAqL1xuICAgIHIsIFxuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSBmb3IgdGhpcyB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGNhbm9uaWNhbCBpZHMgYXJlIG5vdCB1bmlxdWUgd2UgbXVzdCBzdG9yZSB0aGUgYWN0dWFsIHF1ZXJ5LiBXZVxuICAgICAqIHVzZSB0aGUgcHJvdG8gdG8gaGF2ZSBhbiBvYmplY3Qgd2UgY2FuIHBlcnNpc3Qgd2l0aG91dCBoYXZpbmcgdG9cbiAgICAgKiBkdXBsaWNhdGUgdHJhbnNsYXRpb24gbG9naWMgdG8gYW5kIGZyb20gYSBgUXVlcnlgIG9iamVjdC5cbiAgICAgKi9cbiAgICBvKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0SWQgPSB0LCB0aGlzLmNhbm9uaWNhbElkID0gZSwgdGhpcy5yZWFkVGltZSA9IG4sIHRoaXMucmVzdW1lVG9rZW4gPSBzLCBcbiAgICAgICAgdGhpcy5sYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBpLCB0aGlzLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24gPSByLCB0aGlzLnF1ZXJ5ID0gbztcbiAgICB9XG59XG5cbk9zLnN0b3JlID0gXCJ0YXJnZXRzXCIsIFxuLyoqIEtleXMgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdmlhIHRoZSB0YXJnZXRJZCBwcm9wZXJ0eS4gKi9cbk9zLmtleVBhdGggPSBcInRhcmdldElkXCIsIFxuLyoqIFRoZSBuYW1lIG9mIHRoZSBxdWVyeVRhcmdldHMgaW5kZXguICovXG5Pcy5xdWVyeVRhcmdldHNJbmRleE5hbWUgPSBcInF1ZXJ5VGFyZ2V0c0luZGV4XCIsIFxuLyoqXG4gKiBUaGUgaW5kZXggb2YgYWxsIGNhbm9uaWNhbElkcyB0byB0aGUgdGFyZ2V0cyB0aGF0IHRoZXkgbWF0Y2guIFRoaXMgaXMgbm90XG4gKiBhIHVuaXF1ZSBtYXBwaW5nIGJlY2F1c2UgY2Fub25pY2FsSWQgZG9lcyBub3QgcHJvbWlzZSBhIHVuaXF1ZSBuYW1lIGZvciBhbGxcbiAqIHBvc3NpYmxlIHF1ZXJpZXMsIHNvIHdlIGFwcGVuZCB0aGUgdGFyZ2V0SWQgdG8gbWFrZSB0aGUgbWFwcGluZyB1bmlxdWUuXG4gKi9cbk9zLnF1ZXJ5VGFyZ2V0c0tleVBhdGggPSBbIFwiY2Fub25pY2FsSWRcIiwgXCJ0YXJnZXRJZFwiIF07XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgdGFyZ2V0IGFuZCBhIGRvY3VtZW50LCBvciBhXG4gKiBzZW50aW5lbCByb3cgbWFya2luZyB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgYXQgd2hpY2ggYSBkb2N1bWVudCB3YXMgdXNlZC5cbiAqIEVhY2ggZG9jdW1lbnQgY2FjaGVkIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc2VudGluZWwgcm93IGJlZm9yZSBscnVcbiAqIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBlbmFibGVkLlxuICpcbiAqIFRoZSB0YXJnZXQgYXNzb2NpYXRpb25zIGFuZCBzZW50aW5lbCByb3dzIGFyZSBjby1sb2NhdGVkIHNvIHRoYXQgb3JwaGFuZWRcbiAqIGRvY3VtZW50cyBhbmQgdGhlaXIgc2VxdWVuY2UgbnVtYmVycyBjYW4gYmUgaWRlbnRpZmllZCBlZmZpY2llbnRseSB2aWEgYSBzY2FuXG4gKiBvZiB0aGlzIHN0b3JlLlxuICovXG5jbGFzcyBNcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldElkIGlkZW50aWZ5aW5nIGEgdGFyZ2V0IG9yIDAgZm9yIGEgc2VudGluZWwgcm93LlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBwYXRoIHRvIHRoZSBkb2N1bWVudCwgYXMgZW5jb2RlZCBpbiB0aGUga2V5LlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgaXMgYSBzZW50aW5lbCByb3csIHRoaXMgc2hvdWxkIGJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3RcbiAgICAgKiB0aW1lIHRoZSBkb2N1bWVudCBzcGVjaWZpZWQgYnkgYHBhdGhgIHdhcyB1c2VkLiBPdGhlcndpc2UsIGl0IHNob3VsZCBiZVxuICAgICAqIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIG4pIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMucGF0aCA9IGUsIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSBuO1xuICAgIH1cbn1cblxuLyoqIE5hbWUgb2YgdGhlIEluZGV4ZWREYiBvYmplY3Qgc3RvcmUuICAqLyBNcy5zdG9yZSA9IFwidGFyZ2V0RG9jdW1lbnRzXCIsIFxuLyoqIEtleXMgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdmlhIHRoZSB0YXJnZXRJZCwgcGF0aCBwcm9wZXJ0aWVzLiAqL1xuTXMua2V5UGF0aCA9IFsgXCJ0YXJnZXRJZFwiLCBcInBhdGhcIiBdLCBcbi8qKiBUaGUgaW5kZXggbmFtZSBmb3IgdGhlIHJldmVyc2UgaW5kZXguICovXG5Ncy5kb2N1bWVudFRhcmdldHNJbmRleCA9IFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIiwgXG4vKiogV2UgYWxzbyBuZWVkIHRvIGNyZWF0ZSB0aGUgcmV2ZXJzZSBpbmRleCBmb3IgdGhlc2UgcHJvcGVydGllcy4gKi9cbk1zLmRvY3VtZW50VGFyZ2V0c0tleVBhdGggPSBbIFwicGF0aFwiLCBcInRhcmdldElkXCIgXTtcblxuLyoqXG4gKiBBIHJlY29yZCBvZiBnbG9iYWwgc3RhdGUgdHJhY2tlZCBhY3Jvc3MgYWxsIFRhcmdldHMsIHRyYWNrZWQgc2VwYXJhdGVseVxuICogdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGV4dHJhIGluZGV4ZXMuXG4gKlxuICogVGhpcyBzaG91bGQgYmUga2VwdCBpbi1zeW5jIHdpdGggdGhlIHByb3RvIHVzZWQgaW4gdGhlIGlPUyBjbGllbnQuXG4gKi9cbmNsYXNzIExzIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgaGlnaGVzdCBudW1iZXJlZCB0YXJnZXQgaWQgYWNyb3NzIGFsbCB0YXJnZXRzLlxuICAgICAqXG4gICAgICogU2VlIERiVGFyZ2V0LnRhcmdldElkLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBoaWdoZXN0IG51bWJlcmVkIGxhc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciBhY3Jvc3MgYWxsIHRhcmdldHMuXG4gICAgICpcbiAgICAgKiBTZWUgRGJUYXJnZXQubGFzdExpc3RlblNlcXVlbmNlTnVtYmVyLlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIEEgZ2xvYmFsIHNuYXBzaG90IHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSBsYXN0IGNvbnNpc3RlbnQgc25hcHNob3Qgd2VcbiAgICAgKiByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kLiBUaGlzIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBhbmQgYW55XG4gICAgICogc25hcHNob3RzIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQgcHJpb3IgdG8gdGhpcyB2ZXJzaW9uIChlLmcuIGZvclxuICAgICAqIHRhcmdldHMgcmVzdW1lZCB3aXRoIGEgcmVzdW1lVG9rZW4pIHNob3VsZCBiZSBzdXBwcmVzc2VkIChidWZmZXJlZClcbiAgICAgKiB1bnRpbCB0aGUgYmFja2VuZCBoYXMgY2F1Z2h0IHVwIHRvIHRoaXMgc25hcHNob3QgdmVyc2lvbiBhZ2Fpbi4gVGhpc1xuICAgICAqIHByZXZlbnRzIG91ciBjYWNoZSBmcm9tIGV2ZXIgZ29pbmcgYmFja3dhcmRzIGluIHRpbWUuXG4gICAgICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0YXJnZXRzIHBlcnNpc3RlZC5cbiAgICAgKi9cbiAgICBzKSB7XG4gICAgICAgIHRoaXMuaGlnaGVzdFRhcmdldElkID0gdCwgdGhpcy5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBlLCB0aGlzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuLCBcbiAgICAgICAgdGhpcy50YXJnZXRDb3VudCA9IHM7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBrZXkgc3RyaW5nIHVzZWQgZm9yIHRoZSBzaW5nbGUgb2JqZWN0IHRoYXQgZXhpc3RzIGluIHRoZVxuICogRGJUYXJnZXRHbG9iYWwgc3RvcmUuXG4gKi8gTHMua2V5ID0gXCJ0YXJnZXRHbG9iYWxLZXlcIiwgTHMuc3RvcmUgPSBcInRhcmdldEdsb2JhbFwiO1xuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIENvbGxlY3Rpb24gaWQgKGUuZy4gJ21lc3NhZ2VzJylcbiAqIHRvIGEgcGFyZW50IHBhdGggKGUuZy4gJy9jaGF0cy8xMjMnKSB0aGF0IGNvbnRhaW5zIGl0IGFzIGEgKHN1Yiljb2xsZWN0aW9uLlxuICogVGhpcyBpcyB1c2VkIHRvIGVmZmljaWVudGx5IGZpbmQgYWxsIGNvbGxlY3Rpb25zIHRvIHF1ZXJ5IHdoZW4gcGVyZm9ybWluZ1xuICogYSBDb2xsZWN0aW9uIEdyb3VwIHF1ZXJ5LlxuICovXG5jbGFzcyBCcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGNvbGxlY3Rpb25JZCAoZS5nLiAnbWVzc2FnZXMnKVxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBwYXRoIHRvIHRoZSBwYXJlbnQgKGVpdGhlciBhIGRvY3VtZW50IGxvY2F0aW9uIG9yIGFuIGVtcHR5IHBhdGggZm9yXG4gICAgICogYSByb290LWxldmVsIGNvbGxlY3Rpb24pLlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWQgPSB0LCB0aGlzLnBhcmVudCA9IGU7XG4gICAgfVxufVxuXG4vKiogTmFtZSBvZiB0aGUgSW5kZXhlZERiIG9iamVjdCBzdG9yZS4gKi8gQnMuc3RvcmUgPSBcImNvbGxlY3Rpb25QYXJlbnRzXCIsIFxuLyoqIEtleXMgYXJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdmlhIHRoZSBjb2xsZWN0aW9uSWQsIHBhcmVudCBwcm9wZXJ0aWVzLiAqL1xuQnMua2V5UGF0aCA9IFsgXCJjb2xsZWN0aW9uSWRcIiwgXCJwYXJlbnRcIiBdO1xuXG4vKipcbiAqIEEgcmVjb3JkIG9mIHRoZSBtZXRhZGF0YSBzdGF0ZSBvZiBlYWNoIGNsaWVudC5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSBtdWx0aS10YWIgc3RhdGUgYW5kIGRvZXMgbm90IG5lZWRcbiAqIHRvIGJlIHBvcnRlZCB0byBpT1Mgb3IgQW5kcm9pZC5cbiAqL1xuY2xhc3MgVXMge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIE5vdGU6IFByZXZpb3VzIHNjaGVtYSB2ZXJzaW9ucyBpbmNsdWRlZCBhIGZpZWxkXG4gICAgLy8gXCJsYXN0UHJvY2Vzc2VkRG9jdW1lbnRDaGFuZ2VJZFwiLiBEb24ndCB1c2UgYW55bW9yZS5cbiAgICAvKiogVGhlIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCBpZCBhc3NpZ25lZCBhdCBjbGllbnQgc3RhcnR1cC4gKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGxhc3QgdGltZSB0aGlzIHN0YXRlIHdhcyB1cGRhdGVkLiAqL1xuICAgIGUsIFxuICAgIC8qKiBXaGV0aGVyIHRoZSBjbGllbnQncyBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZW5hYmxlZC4gKi9cbiAgICBuLCBcbiAgICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBydW5uaW5nIGluIGEgZm9yZWdyb3VuZCB0YWIuICovXG4gICAgcykge1xuICAgICAgICB0aGlzLmNsaWVudElkID0gdCwgdGhpcy51cGRhdGVUaW1lTXMgPSBlLCB0aGlzLm5ldHdvcmtFbmFibGVkID0gbiwgdGhpcy5pbkZvcmVncm91bmQgPSBzO1xuICAgIH1cbn1cblxuLyoqIE5hbWUgb2YgdGhlIEluZGV4ZWREYiBvYmplY3Qgc3RvcmUuICovIFVzLnN0b3JlID0gXCJjbGllbnRNZXRhZGF0YVwiLCBcbi8qKiBLZXlzIGFyZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHZpYSB0aGUgY2xpZW50SWQgcHJvcGVydGllcy4gKi9cblVzLmtleVBhdGggPSBcImNsaWVudElkXCI7XG5cbi8qKlxuICogQSBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnVuZGxlIGxvYWRlZCBieSB0aGUgU0RLLlxuICovXG5jbGFzcyBxcyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRoZSBJRCBvZiB0aGUgbG9hZGVkIGJ1bmRsZS4gKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGNyZWF0ZSB0aW1lIG9mIHRoZSBsb2FkZWQgYnVuZGxlLiAqL1xuICAgIGUsIFxuICAgIC8qKiBUaGUgc2NoZW1hIHZlcnNpb24gb2YgdGhlIGxvYWRlZCBidW5kbGUuICovXG4gICAgbikge1xuICAgICAgICB0aGlzLmJ1bmRsZUlkID0gdCwgdGhpcy5jcmVhdGVUaW1lID0gZSwgdGhpcy52ZXJzaW9uID0gbjtcbiAgICB9XG59XG5cbi8qKiBOYW1lIG9mIHRoZSBJbmRleGVkRGIgb2JqZWN0IHN0b3JlLiAqLyBxcy5zdG9yZSA9IFwiYnVuZGxlc1wiLCBxcy5rZXlQYXRoID0gXCJidW5kbGVJZFwiO1xuXG4vKipcbiAqIEEgb2JqZWN0IHJlcHJlc2VudGluZyBhIG5hbWVkIHF1ZXJ5IGxvYWRlZCBieSB0aGUgU0RLIHZpYSBhIGJ1bmRsZS5cbiAqL1xuY2xhc3MgS3Mge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcXVlcnkuICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSByZWFkIHRpbWUgb2YgdGhlIHJlc3VsdHMgc2F2ZWQgaW4gdGhlIGJ1bmRsZSBmcm9tIHRoZSBuYW1lZCBxdWVyeS4gKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIHF1ZXJ5IHNhdmVkIGluIHRoZSBidW5kbGUuICovXG4gICAgbikge1xuICAgICAgICB0aGlzLm5hbWUgPSB0LCB0aGlzLnJlYWRUaW1lID0gZSwgdGhpcy5idW5kbGVkUXVlcnkgPSBuO1xuICAgIH1cbn1cblxuLyoqIE5hbWUgb2YgdGhlIEluZGV4ZWREYiBvYmplY3Qgc3RvcmUuICovIEtzLnN0b3JlID0gXCJuYW1lZFF1ZXJpZXNcIiwgS3Mua2V5UGF0aCA9IFwibmFtZVwiO1xuXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nXG5jb25zdCBqcyA9IFsgLi4uWyAuLi5bIC4uLlsgLi4uWyBEcy5zdG9yZSwgQ3Muc3RvcmUsIE5zLnN0b3JlLCAkcy5zdG9yZSwgT3Muc3RvcmUsIFNzLnN0b3JlLCBMcy5zdG9yZSwgTXMuc3RvcmUgXSwgVXMuc3RvcmUgXSwgRnMuc3RvcmUgXSwgQnMuc3RvcmUgXSwgcXMuc3RvcmUsIEtzLnN0b3JlIF0sIFFzID0gXCJUaGUgY3VycmVudCB0YWIgaXMgbm90IGluIHRoZSByZXF1aXJlZCBzdGF0ZSB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLiBJdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gcmVmcmVzaCB0aGUgYnJvd3NlciB0YWIuXCI7XG5cbi8vIFYyIGlzIG5vIGxvbmdlciB1c2FibGUgKHNlZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlKVxuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuLyoqXG4gKiBBIGJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGVyc2lzdGVuY2UgdHJhbnNhY3Rpb24sIGVuY2Fwc3VsYXRpbmcgYm90aCB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2VxdWVuY2UgbnVtYmVycyBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBvbkNvbW1pdHRlZCBsaXN0ZW5lcnMuXG4gKlxuICogV2hlbiB5b3UgY2FsbCBQZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbigpLCBpdCB3aWxsIGNyZWF0ZSBhIHRyYW5zYWN0aW9uIGFuZFxuICogcGFzcyBpdCB0byB5b3VyIGNhbGxiYWNrLiBZb3UgdGhlbiBwYXNzIGl0IHRvIGFueSBtZXRob2QgdGhhdCBvcGVyYXRlc1xuICogb24gcGVyc2lzdGVuY2UuXG4gKi9cbmNsYXNzIFdzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vbkNvbW1pdHRlZExpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgICBhZGRPbkNvbW1pdHRlZExpc3RlbmVyKHQpIHtcbiAgICAgICAgdGhpcy5vbkNvbW1pdHRlZExpc3RlbmVycy5wdXNoKHQpO1xuICAgIH1cbiAgICByYWlzZU9uQ29tbWl0dGVkRXZlbnQoKSB7XG4gICAgICAgIHRoaXMub25Db21taXR0ZWRMaXN0ZW5lcnMuZm9yRWFjaCgodCA9PiB0KCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFBlcnNpc3RlbmNlUHJvbWlzZSBpcyBlc3NlbnRpYWxseSBhIHJlLWltcGxlbWVudGF0aW9uIG9mIFByb21pc2UgZXhjZXB0XG4gKiBpdCBoYXMgYSAubmV4dCgpIG1ldGhvZCBpbnN0ZWFkIG9mIC50aGVuKCkgYW5kIC5uZXh0KCkgYW5kIC5jYXRjaCgpIGNhbGxiYWNrc1xuICogYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgd2hlbiBhIFBlcnNpc3RlbmNlUHJvbWlzZSByZXNvbHZlcyByYXRoZXIgdGhhblxuICogYXN5bmNocm9ub3VzbHkgKFByb21pc2UgaW1wbGVtZW50YXRpb25zIHVzZSBzZXRJbW1lZGlhdGUoKSBvciBzaW1pbGFyKS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBpbnRlcm9wZXJhdGUgd2l0aCBJbmRleGVkREIgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5XG4gKiBjb21taXQgdHJhbnNhY3Rpb25zIGlmIGNvbnRyb2wgaXMgcmV0dXJuZWQgdG8gdGhlIGV2ZW50IGxvb3Agd2l0aG91dFxuICogc3luY2hyb25vdXNseSBpbml0aWF0aW5nIGFub3RoZXIgb3BlcmF0aW9uIG9uIHRoZSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBOT1RFOiAudGhlbigpIGFuZCAuY2F0Y2goKSBvbmx5IGFsbG93IGEgc2luZ2xlIGNvbnN1bWVyLCB1bmxpa2Ugbm9ybWFsXG4gKiBQcm9taXNlcy5cbiAqLyBjbGFzcyBHcyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAvLyBOT1RFOiBuZXh0L2NhdGNoQ2FsbGJhY2sgd2lsbCBhbHdheXMgcG9pbnQgdG8gb3VyIG93biB3cmFwcGVyIGZ1bmN0aW9ucyxcbiAgICAgICAgLy8gbm90IHRoZSB1c2VyJ3MgcmF3IG5leHQoKSBvciBjYXRjaCgpIGNhbGxiYWNrcy5cbiAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsLCB0aGlzLmNhdGNoQ2FsbGJhY2sgPSBudWxsLCBcbiAgICAgICAgLy8gV2hlbiB0aGUgb3BlcmF0aW9uIHJlc29sdmVzLCB3ZSdsbCBzZXQgcmVzdWx0IG9yIGVycm9yIGFuZCBtYXJrIGlzRG9uZS5cbiAgICAgICAgdGhpcy5yZXN1bHQgPSB2b2lkIDAsIHRoaXMuZXJyb3IgPSB2b2lkIDAsIHRoaXMuaXNEb25lID0gITEsIFxuICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIC50aGVuKCkgb3IgLmNhdGNoKCkgYXJlIGNhbGxlZCBhbmQgcHJldmVudHMgYWRkaXRpb25hbFxuICAgICAgICAvLyBjaGFpbmluZy5cbiAgICAgICAgdGhpcy5jYWxsYmFja0F0dGFjaGVkID0gITEsIHQoKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0RvbmUgPSAhMCwgdGhpcy5yZXN1bHQgPSB0LCB0aGlzLm5leHRDYWxsYmFjayAmJiBcbiAgICAgICAgICAgIC8vIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkIHVubGVzcyBUIGlzIFZvaWQsIGJ1dCB3ZSBjYW4ndCBleHByZXNzXG4gICAgICAgICAgICAvLyB0aGF0IGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICAgICAgICAgIHRoaXMubmV4dENhbGxiYWNrKHQpO1xuICAgICAgICB9KSwgKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0RvbmUgPSAhMCwgdGhpcy5lcnJvciA9IHQsIHRoaXMuY2F0Y2hDYWxsYmFjayAmJiB0aGlzLmNhdGNoQ2FsbGJhY2sodCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY2F0Y2godCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHZvaWQgMCwgdCk7XG4gICAgfVxuICAgIG5leHQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsYmFja0F0dGFjaGVkICYmIEwoKSwgdGhpcy5jYWxsYmFja0F0dGFjaGVkID0gITAsIHRoaXMuaXNEb25lID8gdGhpcy5lcnJvciA/IHRoaXMud3JhcEZhaWx1cmUoZSwgdGhpcy5lcnJvcikgOiB0aGlzLndyYXBTdWNjZXNzKHQsIHRoaXMucmVzdWx0KSA6IG5ldyBHcygoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmV4dENhbGxiYWNrID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwU3VjY2Vzcyh0LCBlKS5uZXh0KG4sIHMpO1xuICAgICAgICAgICAgfSwgdGhpcy5jYXRjaENhbGxiYWNrID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwRmFpbHVyZShlLCB0KS5uZXh0KG4sIHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB0b1Byb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmV4dCh0LCBlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB3cmFwVXNlckZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0KCk7XG4gICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEdzID8gZSA6IEdzLnJlc29sdmUoZSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBHcy5yZWplY3QodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JhcFN1Y2Nlc3ModCwgZSkge1xuICAgICAgICByZXR1cm4gdCA/IHRoaXMud3JhcFVzZXJGdW5jdGlvbigoKCkgPT4gdChlKSkpIDogR3MucmVzb2x2ZShlKTtcbiAgICB9XG4gICAgd3JhcEZhaWx1cmUodCwgZSkge1xuICAgICAgICByZXR1cm4gdCA/IHRoaXMud3JhcFVzZXJGdW5jdGlvbigoKCkgPT4gdChlKSkpIDogR3MucmVqZWN0KGUpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVzb2x2ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgR3MoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBlKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHN0YXRpYyByZWplY3QodCkge1xuICAgICAgICByZXR1cm4gbmV3IEdzKCgoZSwgbikgPT4ge1xuICAgICAgICAgICAgbih0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvcihcbiAgICAvLyBBY2NlcHQgYWxsIFByb21pc2UgdHlwZXMgaW4gd2FpdEZvcigpLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdCkge1xuICAgICAgICByZXR1cm4gbmV3IEdzKCgoZSwgbikgPT4ge1xuICAgICAgICAgICAgbGV0IHMgPSAwLCBpID0gMCwgciA9ICExO1xuICAgICAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICArK3MsIHQubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICArK2ksIHIgJiYgaSA9PT0gcyAmJiBlKCk7XG4gICAgICAgICAgICAgICAgfSksICh0ID0+IG4odCkpKTtcbiAgICAgICAgICAgIH0pKSwgciA9ICEwLCBpID09PSBzICYmIGUoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIHRoYXQgYXN5bmNocm9ub3VzbHkgZXZhbHVhdGUgdG8gYVxuICAgICAqIGJvb2xlYW4sIGltcGxlbWVudHMgYSBzaG9ydC1jaXJjdWl0aW5nIGBvcmAgYmV0d2VlbiB0aGUgcmVzdWx0cy4gUHJlZGljYXRlc1xuICAgICAqIHdpbGwgYmUgZXZhbHVhdGVkIHVudGlsIG9uZSBvZiB0aGVtIHJldHVybnMgYHRydWVgLCB0aGVuIHN0b3AuIFRoZSBmaW5hbFxuICAgICAqIHJlc3VsdCB3aWxsIGJlIHdoZXRoZXIgYW55IG9mIHRoZW0gcmV0dXJuZWQgYHRydWVgLlxuICAgICAqLyAgICBzdGF0aWMgb3IodCkge1xuICAgICAgICBsZXQgZSA9IEdzLnJlc29sdmUoITEpO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZSA9IGUubmV4dCgodCA9PiB0ID8gR3MucmVzb2x2ZSh0KSA6IG4oKSkpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgc3RhdGljIGZvckVhY2godCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBuLnB1c2goZS5jYWxsKHRoaXMsIHQsIHMpKTtcbiAgICAgICAgfSkpLCB0aGlzLndhaXRGb3Iobik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gUmVmZXJlbmNlcyB0byBgd2luZG93YCBhcmUgZ3VhcmRlZCBieSBTaW1wbGVEYi5pc0F2YWlsYWJsZSgpXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbi8qKlxuICogV3JhcHMgYW4gSURCVHJhbnNhY3Rpb24gYW5kIGV4cG9zZXMgYSBzdG9yZSgpIG1ldGhvZCB0byBnZXQgYSBoYW5kbGUgdG8gYVxuICogc3BlY2lmaWMgb2JqZWN0IHN0b3JlLlxuICovXG5jbGFzcyB6cyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmFjdGlvbiA9IHQsIHRoaXMudHJhbnNhY3Rpb24gPSBlLCB0aGlzLmFib3J0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgSW5kZXhlZERiIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5JdCA9IG5ldyBRLCB0aGlzLnRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkl0LnJlc29sdmUoKTtcbiAgICAgICAgfSwgdGhpcy50cmFuc2FjdGlvbi5vbmFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgZS5lcnJvciA/IHRoaXMuSXQucmVqZWN0KG5ldyBZcyh0LCBlLmVycm9yKSkgOiB0aGlzLkl0LnJlc29sdmUoKTtcbiAgICAgICAgfSwgdGhpcy50cmFuc2FjdGlvbi5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmkoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5JdC5yZWplY3QobmV3IFlzKHQsIG4pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIG9wZW4odCwgZSwgbiwgcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB6cyhlLCB0LnRyYW5zYWN0aW9uKHMsIG4pKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFlzKGUsIHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBBdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSXQucHJvbWlzZTtcbiAgICB9XG4gICAgYWJvcnQodCkge1xuICAgICAgICB0ICYmIHRoaXMuSXQucmVqZWN0KHQpLCB0aGlzLmFib3J0ZWQgfHwgKCQoXCJTaW1wbGVEYlwiLCBcIkFib3J0aW5nIHRyYW5zYWN0aW9uOlwiLCB0ID8gdC5tZXNzYWdlIDogXCJDbGllbnQtaW5pdGlhdGVkIGFib3J0XCIpLCBcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gITAsIHRoaXMudHJhbnNhY3Rpb24uYWJvcnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBTaW1wbGVEYlN0b3JlPEtleVR5cGUsIFZhbHVlVHlwZT4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmUuIEFsbFxuICAgICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBTaW1wbGVEYlN0b3JlIGhhcHBlbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpc1xuICAgICAqIHRyYW5zYWN0aW9uIGFuZCBpdCBjYW5ub3QgYmUgdXNlZCBhbnltb3JlIG9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogY29tcGxldGVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdlIGNhbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhhdCB0aGUgS2V5VHlwZSBhbmQgVmFsdWVUeXBlIGFyZVxuICAgICAqIGNvcnJlY3QsIGJ1dCB0aGV5IGFsbG93IHR5cGUgc2FmZXR5IHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvbnN1bWluZyBjb2RlLlxuICAgICAqLyAgICBzdG9yZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHQpO1xuICAgICAgICByZXR1cm4gbmV3IFpzKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIEluZGV4ZWREYiB3aXRoIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdGhhdCB1c2VzXG4gKiBQcm9taXNlLWxpa2UgcmV0dXJuIHZhbHVlcyB0byBjaGFpbiBvcGVyYXRpb25zLiBSZWFsIHByb21pc2VzIGNhbm5vdCBiZSB1c2VkXG4gKiBzaW5jZSAudGhlbigpIGNvbnRpbnVhdGlvbnMgYXJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IChlLmcuIHZpYVxuICogLnNldEltbWVkaWF0ZSksIHdoaWNoIHdvdWxkIGNhdXNlIEluZGV4ZWREQiB0byBlbmQgdGhlIHRyYW5zYWN0aW9uLlxuICogU2VlIFBlcnNpc3RlbmNlUHJvbWlzZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovIGNsYXNzIEhzIHtcbiAgICAvKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2ltcGxlRGIgd3JhcHBlciBmb3IgSW5kZXhlZERiIGRhdGFiYXNlIGBuYW1lYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgdmVyc2lvbmAgbXVzdCBub3QgYmUgYSBkb3duZ3JhZGUuIEluZGV4ZWREQiBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICogZG93bmdyYWRpbmcgdGhlIHNjaGVtYSB2ZXJzaW9uLiBXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgYW55IHdheSB0byBkb1xuICAgICAqIHZlcnNpb25pbmcgb3V0c2lkZSBvZiBJbmRleGVkREIncyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYXMgb25seVxuICAgICAqIHZlcnNpb24tdXBncmFkZSB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gZG8gdGhpbmdzIGxpa2UgY3JlYXRlXG4gICAgICogb2JqZWN0c3RvcmVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy52ZXJzaW9uID0gZSwgdGhpcy5SdCA9IG47XG4gICAgICAgIC8vIE5PVEU6IEFjY29yZGluZyB0byBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk3MDUwLCB0aGVcbiAgICAgICAgLy8gYnVnIHdlJ3JlIGNoZWNraW5nIGZvciBzaG91bGQgZXhpc3QgaW4gaU9TID49IDEyLjIgYW5kIDwgMTMsIGJ1dCBmb3JcbiAgICAgICAgLy8gd2hhdGV2ZXIgcmVhc29uIGl0J3MgbXVjaCBoYXJkZXIgdG8gaGl0IGFmdGVyIDEyLjIgc28gd2Ugb25seSBwcm9hY3RpdmVseVxuICAgICAgICAvLyBsb2cgb24gMTIuMi5cbiAgICAgICAgMTIuMiA9PT0gSHMuUHQoZ2V0VUEoKSkgJiYgRihcIkZpcmVzdG9yZSBwZXJzaXN0ZW5jZSBzdWZmZXJzIGZyb20gYSBidWcgaW4gaU9TIDEyLjIgU2FmYXJpIHRoYXQgbWF5IGNhdXNlIHlvdXIgYXBwIHRvIHN0b3Agd29ya2luZy4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS81NjQ5NjI5Ni8xMTA5MTUgZm9yIGRldGFpbHMgYW5kIGEgcG90ZW50aWFsIHdvcmthcm91bmQuXCIpO1xuICAgIH1cbiAgICAvKiogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLiAqLyAgICBzdGF0aWMgZGVsZXRlKHQpIHtcbiAgICAgICAgcmV0dXJuICQoXCJTaW1wbGVEYlwiLCBcIlJlbW92aW5nIGRhdGFiYXNlOlwiLCB0KSwgdGkod2luZG93LmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZSh0KSkudG9Qcm9taXNlKCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgSW5kZXhlZERCIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gKi8gICAgc3RhdGljIGJ0KCkge1xuICAgICAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKEhzLnZ0KCkpIHJldHVybiAhMDtcbiAgICAgICAgLy8gV2UgZXh0ZW5zaXZlbHkgdXNlIGluZGV4ZWQgYXJyYXkgdmFsdWVzIGFuZCBjb21wb3VuZCBrZXlzLFxuICAgICAgICAvLyB3aGljaCBJRSBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydC4gSG93ZXZlciwgdGhleSBzdGlsbCBoYXZlIGluZGV4ZWREQlxuICAgICAgICAvLyBkZWZpbmVkIG9uIHRoZSB3aW5kb3csIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoZW0gaGVyZSBhbmQgbWFrZSBzdXJlXG4gICAgICAgIC8vIHRvIHJldHVybiB0aGF0IHBlcnNpc3RlbmNlIGlzIG5vdCBlbmFibGVkIGZvciB0aG9zZSBicm93c2Vycy5cbiAgICAgICAgLy8gRm9yIHRyYWNraW5nIHN1cHBvcnQgb2YgdGhpcyBmZWF0dXJlLCBzZWUgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9zdGF0dXMvaW5kZXhlZGRiYXJyYXlzYW5kbXVsdGllbnRyeXN1cHBvcnQvXG4gICAgICAgIC8vIENoZWNrIHRoZSBVQSBzdHJpbmcgdG8gZmluZCBvdXQgdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGdldFVBKCksIGUgPSBIcy5QdCh0KSwgbiA9IDAgPCBlICYmIGUgPCAxMCwgcyA9IEhzLlZ0KHQpLCBpID0gMCA8IHMgJiYgcyA8IDQuNTtcbiAgICAgICAgLy8gSUUgMTBcbiAgICAgICAgLy8gdWEgPSAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNi4wKSc7XG4gICAgICAgIC8vIElFIDExXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMzsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nO1xuICAgICAgICAvLyBFZGdlXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLFxuICAgICAgICAvLyBsaWtlIEdlY2tvKSBDaHJvbWUvMzkuMC4yMTcxLjcxIFNhZmFyaS81MzcuMzYgRWRnZS8xMi4wJztcbiAgICAgICAgLy8gaU9TIFNhZmFyaTogRGlzYWJsZSBmb3IgdXNlcnMgcnVubmluZyBpT1MgdmVyc2lvbiA8IDEwLlxuICAgICAgICAgICAgICAgIHJldHVybiAhKHQuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB0LmluZGV4T2YoXCJUcmlkZW50L1wiKSA+IDAgfHwgdC5pbmRleE9mKFwiRWRnZS9cIikgPiAwIHx8IG4gfHwgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmFja2luZyBJbmRleGVkREIgc3RvcmUgaXMgdGhlIE5vZGUgSW5kZXhlZERCU2hpbVxuICAgICAqIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4ZW1jbGlvbi9JbmRleGVkREJTaGltKS5cbiAgICAgKi8gICAgc3RhdGljIHZ0KCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJZRVNcIiA9PT0gKG51bGwgPT09ICh0ID0gcHJvY2Vzcy5lbnYpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuU3QpO1xuICAgIH1cbiAgICAvKiogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZnJvbSBhIHRyYW5zYWN0aW9uLiAqLyAgICBzdGF0aWMgRHQodCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zdG9yZShlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIC8qKiBQYXJzZSBVc2VyIEFnZW50IHRvIGRldGVybWluZSBpT1MgdmVyc2lvbi4gUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICovXG4gICAgc3RhdGljIFB0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL2koPzpwaG9uZXxwYWR8cG9kKSBvcyAoW1xcZF9dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIl9cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAvKiogUGFyc2UgVXNlciBBZ2VudCB0byBkZXRlcm1pbmUgQW5kcm9pZCB2ZXJzaW9uLiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZC4gKi9cbiAgICBzdGF0aWMgVnQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5tYXRjaCgvQW5kcm9pZCAoW1xcZC5dKykvaSksIG4gPSBlID8gZVsxXS5zcGxpdChcIi5cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIikgOiBcIi0xXCI7XG4gICAgICAgIHJldHVybiBOdW1iZXIobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UsIGNyZWF0aW5nIG9yIHVwZ3JhZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAgICovICAgIGFzeW5jIEN0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIgfHwgKCQoXCJTaW1wbGVEYlwiLCBcIk9wZW5pbmcgZGF0YWJhc2U6XCIsIHRoaXMubmFtZSksIHRoaXMuZGIgPSBhd2FpdCBuZXcgUHJvbWlzZSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogSW52ZXN0aWdhdGUgYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkvVXNpbmdfSW5kZXhlZERCXG4gICAgICAgICAgICAvLyBzdWdnZXN0cyBJRTkgYW5kIG9sZGVyIFdlYktpdCBicm93c2VycyBoYW5kbGUgdXBncmFkZVxuICAgICAgICAgICAgLy8gZGlmZmVyZW50bHkuIFRoZXkgZXhwZWN0IHNldFZlcnNpb24sIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQlZlcnNpb25DaGFuZ2VSZXF1ZXN0L3NldFZlcnNpb25cbiAgICAgICAgICAgIGNvbnN0IHMgPSBpbmRleGVkREIub3Blbih0aGlzLm5hbWUsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICBzLm9uc3VjY2VzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZShuKTtcbiAgICAgICAgICAgIH0sIHMub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG4obmV3IFlzKHQsIFwiQ2Fubm90IHVwZ3JhZGUgSW5kZXhlZERCIHNjaGVtYSB3aGlsZSBhbm90aGVyIHRhYiBpcyBvcGVuLiBDbG9zZSBhbGwgdGFicyB0aGF0IGFjY2VzcyBGaXJlc3RvcmUgYW5kIHJlbG9hZCB0aGlzIHBhZ2UgdG8gcHJvY2VlZC5cIikpO1xuICAgICAgICAgICAgfSwgcy5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LmVycm9yO1xuICAgICAgICAgICAgICAgIFwiVmVyc2lvbkVycm9yXCIgPT09IHMubmFtZSA/IG4obmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgRmlyZXN0b3JlIFNESyB3YXMgcHJldmlvdXNseSB1c2VkIGFuZCBzbyB0aGUgcGVyc2lzdGVkIGRhdGEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHlvdSBhcmUgbm93IHVzaW5nLiBUaGUgU0RLIHdpbGwgb3BlcmF0ZSB3aXRoIHBlcnNpc3RlbmNlIGRpc2FibGVkLiBJZiB5b3UgbmVlZCBwZXJzaXN0ZW5jZSwgcGxlYXNlIHJlLXVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBTREsgb3IgZWxzZSBjbGVhciB0aGUgcGVyc2lzdGVkIEluZGV4ZWREQiBkYXRhIGZvciB5b3VyIGFwcCB0byBzdGFydCBmcmVzaC5cIikpIDogXCJJbnZhbGlkU3RhdGVFcnJvclwiID09PSBzLm5hbWUgPyBuKG5ldyBqKEsuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJVbmFibGUgdG8gb3BlbiBhbiBJbmRleGVkREIgY29ubmVjdGlvbi4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gcnVubmluZyBpbiBhIHByaXZhdGUgYnJvd3Npbmcgc2Vzc2lvbiBvbiBhIGJyb3dzZXIgd2hvc2UgcHJpdmF0ZSBicm93c2luZyBzZXNzaW9ucyBkbyBub3Qgc3VwcG9ydCBJbmRleGVkREI6IFwiICsgcykpIDogbihuZXcgWXModCwgcykpO1xuICAgICAgICAgICAgfSwgcy5vbnVwZ3JhZGVuZWVkZWQgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICAkKFwiU2ltcGxlRGJcIiwgJ0RhdGFiYXNlIFwiJyArIHRoaXMubmFtZSArICdcIiByZXF1aXJlcyB1cGdyYWRlIGZyb20gdmVyc2lvbjonLCB0Lm9sZFZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5SdC5OdChlLCBzLnRyYW5zYWN0aW9uLCB0Lm9sZFZlcnNpb24sIHRoaXMudmVyc2lvbikubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAkKFwiU2ltcGxlRGJcIiwgXCJEYXRhYmFzZSB1cGdyYWRlIHRvIHZlcnNpb24gXCIgKyB0aGlzLnZlcnNpb24gKyBcIiBjb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSkpLCB0aGlzLmt0ICYmICh0aGlzLmRiLm9udmVyc2lvbmNoYW5nZSA9IHQgPT4gdGhpcy5rdCh0KSksIHRoaXMuZGI7XG4gICAgfVxuICAgIHh0KHQpIHtcbiAgICAgICAgdGhpcy5rdCA9IHQsIHRoaXMuZGIgJiYgKHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gZSA9PiB0KGUpKTtcbiAgICB9XG4gICAgYXN5bmMgcnVuVHJhbnNhY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gXCJyZWFkb25seVwiID09PSBlO1xuICAgICAgICBsZXQgciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICsrcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYiA9IGF3YWl0IHRoaXMuQ3QodCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHpzLm9wZW4odGhpcy5kYiwgdCwgaSA/IFwicmVhZG9ubHlcIiA6IFwicmVhZHdyaXRlXCIsIG4pLCByID0gcyhlKS5jYXRjaCgodCA9PiAoXG4gICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIHRyYW5zYWN0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvci5cbiAgICAgICAgICAgICAgICBlLmFib3J0KHQpLCBHcy5yZWplY3QodCkpKSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gQXMgbm90ZWQgYWJvdmUsIGVycm9ycyBhcmUgcHJvcGFnYXRlZCBieSBhYm9ydGluZyB0aGUgdHJhbnNhY3Rpb24uIFNvXG4gICAgICAgICAgICAgICAgLy8gd2Ugc3dhbGxvdyBhbnkgZXJyb3IgaGVyZSB0byBhdm9pZCB0aGUgYnJvd3NlciBsb2dnaW5nIGl0IGFzIHVuaGFuZGxlZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gci5jYXRjaCgoKCkgPT4ge30pKSwgXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlIChpLmUuIEluZGV4ZWREYidzIG9uc3VjY2VzcyBldmVudCB0b1xuICAgICAgICAgICAgICAgIC8vIGZpcmUpLCBidXQgc3RpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCB0cmFuc2FjdGlvbkZuUmVzdWx0IGJhY2sgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gY2FsbGVyLlxuICAgICAgICAgICAgICAgIGF3YWl0IGUuQXQsIHI7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzY2htaWR0LXNlYmFzdGlhbik6IFdlIGNvdWxkIHByb2JhYmx5IGJlIHNtYXJ0ZXIgYWJvdXQgdGhpcyBhbmRcbiAgICAgICAgICAgICAgICAvLyBub3QgcmV0cnkgZXhjZXB0aW9ucyB0aGF0IGFyZSBsaWtlbHkgdW5yZWNvdmVyYWJsZSAoc3VjaCBhcyBxdW90YVxuICAgICAgICAgICAgICAgIC8vIGV4Y2VlZGVkIGVycm9ycykuXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2Fubm90IHVzZSBhbiBpbnN0YW5jZW9mIGNoZWNrIGZvciBGaXJlc3RvcmVFeGNlcHRpb24sIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBpcyB3cmFwcGVkIGluIGEgZ2VuZXJpYyBlcnJvciBieSBvdXIgYXN5bmMvYXdhaXQgaGFuZGxpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IFwiRmlyZWJhc2VFcnJvclwiICE9PSB0Lm5hbWUgJiYgciA8IDM7XG4gICAgICAgICAgICAgICAgaWYgKCQoXCJTaW1wbGVEYlwiLCBcIlRyYW5zYWN0aW9uIGZhaWxlZCB3aXRoIGVycm9yOlwiLCB0Lm1lc3NhZ2UsIFwiUmV0cnlpbmc6XCIsIGUpLCBcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCksICFlKSByZXR1cm4gUHJvbWlzZS5yZWplY3QodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuZGIgJiYgdGhpcy5kYi5jbG9zZSgpLCB0aGlzLmRiID0gdm9pZCAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZm9yIGl0ZXJhdGluZyBvdmVyIGEga2V5IHJhbmdlIG9yIGluZGV4LiBJdCBhbGxvd3MgYW4gaXRlcmF0ZVxuICogY2FsbGJhY2sgdG8gZGVsZXRlIHRoZSBjdXJyZW50bHktcmVmZXJlbmNlZCBvYmplY3QsIG9yIGp1bXAgdG8gYSBuZXcga2V5XG4gKiB3aXRoaW4gdGhlIGtleSByYW5nZSBvciBpbmRleC5cbiAqLyBjbGFzcyBKcyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLiR0ID0gdCwgdGhpcy5GdCA9ICExLCB0aGlzLk90ID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0IGlzRG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRnQ7XG4gICAgfVxuICAgIGdldCBNdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuT3Q7XG4gICAgfVxuICAgIHNldCBjdXJzb3IodCkge1xuICAgICAgICB0aGlzLiR0ID0gdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHN0b3AgaXRlcmF0aW9uIGF0IGFueSBwb2ludC5cbiAgICAgKi8gICAgZG9uZSgpIHtcbiAgICAgICAgdGhpcy5GdCA9ICEwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gc2tpcCB0byB0aGF0IG5leHQga2V5LCB3aGljaCBjb3VsZCBiZVxuICAgICAqIGFuIGluZGV4IG9yIGEgcHJpbWFyeSBrZXkuXG4gICAgICovICAgIEx0KHQpIHtcbiAgICAgICAgdGhpcy5PdCA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0aGUgY3VycmVudCBjdXJzb3IgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IHN0b3JlLlxuICAgICAqXG4gICAgICogTk9URTogWW91IENBTk5PVCBkbyB0aGlzIHdpdGggYSBrZXlzT25seSBxdWVyeS5cbiAgICAgKi8gICAgZGVsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGkodGhpcy4kdC5kZWxldGUoKSk7XG4gICAgfVxufVxuXG4vKiogQW4gZXJyb3IgdGhhdCB3cmFwcyBleGNlcHRpb25zIHRoYXQgdGhyb3duIGR1cmluZyBJbmRleGVkREIgZXhlY3V0aW9uLiAqLyBjbGFzcyBZcyBleHRlbmRzIGoge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoSy5VTkFWQUlMQUJMRSwgYEluZGV4ZWREQiB0cmFuc2FjdGlvbiAnJHt0fScgZmFpbGVkOiAke2V9YCksIHRoaXMubmFtZSA9IFwiSW5kZXhlZERiVHJhbnNhY3Rpb25FcnJvclwiO1xuICAgIH1cbn1cblxuLyoqIFZlcmlmaWVzIHdoZXRoZXIgYGVgIGlzIGFuIEluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3IuICovIGZ1bmN0aW9uIFhzKHQpIHtcbiAgICAvLyBVc2UgbmFtZSBlcXVhbGl0eSwgYXMgaW5zdGFuY2VvZiBjaGVja3Mgb24gZXJyb3JzIGRvbid0IHdvcmsgd2l0aCBlcnJvcnNcbiAgICAvLyB0aGF0IHdyYXAgb3RoZXIgZXJyb3JzLlxuICAgIHJldHVybiBcIkluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3JcIiA9PT0gdC5uYW1lO1xufVxuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgYW4gSURCT2JqZWN0U3RvcmUgcHJvdmlkaW5nIGFuIEFQSSB0aGF0OlxuICpcbiAqIDEpIEhhcyBnZW5lcmljIEtleVR5cGUgLyBWYWx1ZVR5cGUgcGFyYW1ldGVycyB0byBwcm92aWRlIHN0cm9uZ2x5LXR5cGVkXG4gKiBtZXRob2RzIGZvciBhY3RpbmcgYWdhaW5zdCB0aGUgb2JqZWN0IHN0b3JlLlxuICogMikgRGVhbHMgd2l0aCBJbmRleGVkREIncyBvbnN1Y2Nlc3MgLyBvbmVycm9yIGV2ZW50IGNhbGxiYWNrcywgbWFraW5nIGV2ZXJ5XG4gKiBtZXRob2QgcmV0dXJuIGEgUGVyc2lzdGVuY2VQcm9taXNlIGluc3RlYWQuXG4gKiAzKSBQcm92aWRlcyBhIGhpZ2hlci1sZXZlbCBBUEkgdG8gYXZvaWQgbmVlZGluZyB0byBkbyBleGNlc3NpdmUgd3JhcHBpbmcgb2ZcbiAqIGludGVybWVkaWF0ZSBJbmRleGVkREIgdHlwZXMgKElEQkN1cnNvcldpdGhWYWx1ZSwgZXRjLilcbiAqLyBjbGFzcyBacyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnN0b3JlID0gdDtcbiAgICB9XG4gICAgcHV0KHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUgPyAoJChcIlNpbXBsZURiXCIsIFwiUFVUXCIsIHRoaXMuc3RvcmUubmFtZSwgdCwgZSksIG4gPSB0aGlzLnN0b3JlLnB1dChlLCB0KSkgOiAoJChcIlNpbXBsZURiXCIsIFwiUFVUXCIsIHRoaXMuc3RvcmUubmFtZSwgXCI8YXV0by1rZXk+XCIsIHQpLCBcbiAgICAgICAgbiA9IHRoaXMuc3RvcmUucHV0KHQpKSwgdGkobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgdmFsdWUgaW50byBhbiBPYmplY3QgU3RvcmUgYW5kIHJldHVybnMgdGhlIG5ldyBrZXkuIFNpbWlsYXIgdG9cbiAgICAgKiBJbmRleGVkRGIncyBgYWRkKClgLCB0aGlzIG1ldGhvZCB3aWxsIGZhaWwgb24gcHJpbWFyeSBrZXkgY29sbGlzaW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gd3JpdGUuXG4gICAgICogQHJldHVybnMgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gYWRkLlxuICAgICAqLyAgICBhZGQodCkge1xuICAgICAgICAkKFwiU2ltcGxlRGJcIiwgXCJBRERcIiwgdGhpcy5zdG9yZS5uYW1lLCB0LCB0KTtcbiAgICAgICAgcmV0dXJuIHRpKHRoaXMuc3RvcmUuYWRkKHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgc3BlY2lmaWVkIHN0b3JlLCBvciBudWxsXG4gICAgICogaWYgbm8gb2JqZWN0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqXG4gICAgICogQGtleSBUaGUga2V5IG9mIHRoZSBvYmplY3QgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBvciBudWxsIGlmIG5vIG9iamVjdCBleGlzdHMuXG4gICAgICovICAgIGdldCh0KSB7XG4gICAgICAgIC8vIFdlJ3JlIGRvaW5nIGFuIHVuc2FmZSBjYXN0IHRvIFZhbHVlVHlwZS5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRpKHRoaXMuc3RvcmUuZ2V0KHQpKS5uZXh0KChlID0+IChcbiAgICAgICAgLy8gTm9ybWFsaXplIG5vbmV4aXN0ZW5jZSB0byBudWxsLlxuICAgICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBudWxsKSwgJChcIlNpbXBsZURiXCIsIFwiR0VUXCIsIHRoaXMuc3RvcmUubmFtZSwgdCwgZSksIGUpKSk7XG4gICAgfVxuICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgICQoXCJTaW1wbGVEYlwiLCBcIkRFTEVURVwiLCB0aGlzLnN0b3JlLm5hbWUsIHQpO1xuICAgICAgICByZXR1cm4gdGkodGhpcy5zdG9yZS5kZWxldGUodCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB3ZSBldmVyIG5lZWQgbW9yZSBvZiB0aGUgY291bnQgdmFyaWFudHMsIHdlIGNhbiBhZGQgb3ZlcmxvYWRzLiBGb3Igbm93LFxuICAgICAqIGFsbCB3ZSBuZWVkIGlzIHRvIGNvdW50IGV2ZXJ5dGhpbmcgaW4gYSBzdG9yZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBzdG9yZS5cbiAgICAgKi8gICAgY291bnQoKSB7XG4gICAgICAgICQoXCJTaW1wbGVEYlwiLCBcIkNPVU5UXCIsIHRoaXMuc3RvcmUubmFtZSk7XG4gICAgICAgIHJldHVybiB0aSh0aGlzLnN0b3JlLmNvdW50KCkpO1xuICAgIH1cbiAgICBCdCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnNvcih0aGlzLm9wdGlvbnModCwgZSkpLCBzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLlV0KG4sICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgcy5wdXNoKGUpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gcykpO1xuICAgIH1cbiAgICBxdCh0LCBlKSB7XG4gICAgICAgICQoXCJTaW1wbGVEYlwiLCBcIkRFTEVURSBBTExcIiwgdGhpcy5zdG9yZS5uYW1lKTtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMub3B0aW9ucyh0LCBlKTtcbiAgICAgICAgbi5LdCA9ICExO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5jdXJzb3Iobik7XG4gICAgICAgIHJldHVybiB0aGlzLlV0KHMsICgodCwgZSwgbikgPT4gbi5kZWxldGUoKSkpO1xuICAgIH1cbiAgICBqdCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBlID8gbiA9IHQgOiAobiA9IHt9LCBlID0gdCk7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmN1cnNvcihuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuVXQocywgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgYSBzdG9yZSwgYnV0IHdhaXRzIGZvciB0aGUgZ2l2ZW4gY2FsbGJhY2sgdG8gY29tcGxldGUgZm9yXG4gICAgICogZWFjaCBlbnRyeSBiZWZvcmUgaXRlcmF0aW5nIHRoZSBuZXh0IGVudHJ5LiBUaGlzIGFsbG93cyB0aGUgY2FsbGJhY2sgdG8gZG9cbiAgICAgKiBhc3luY2hyb25vdXMgd29yayB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlLlxuICAgICAqXG4gICAgICogVGhlIHByb3ZpZGVkIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiwgYW5kXG4gICAgICogYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovICAgIFF0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY3Vyc29yKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBHcygoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGUub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcyhlKTtcbiAgICAgICAgICAgIH0sIGUub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzID8gdChzLnByaW1hcnlLZXksIHMudmFsdWUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ID8gcy5jb250aW51ZSgpIDogbigpO1xuICAgICAgICAgICAgICAgIH0pKSA6IG4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgVXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIHJldHVybiBuZXcgR3MoKChzLCBpKSA9PiB7XG4gICAgICAgICAgICB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBpKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIHQub25zdWNjZXNzID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWkpIHJldHVybiB2b2lkIHMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gbmV3IEpzKGkpLCBvID0gZShpLnByaW1hcnlLZXksIGkudmFsdWUsIHIpO1xuICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgR3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG8uY2F0Y2goKHQgPT4gKHIuZG9uZSgpLCBHcy5yZWplY3QodCkpKSk7XG4gICAgICAgICAgICAgICAgICAgIG4ucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgci5pc0RvbmUgPyBzKCkgOiBudWxsID09PSByLk10ID8gaS5jb250aW51ZSgpIDogaS5jb250aW51ZShyLk10KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBHcy53YWl0Rm9yKG4pKSk7XG4gICAgfVxuICAgIG9wdGlvbnModCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IG4gPSB0IDogZSA9IHQpLCB7XG4gICAgICAgICAgICBpbmRleDogbixcbiAgICAgICAgICAgIHJhbmdlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGN1cnNvcih0KSB7XG4gICAgICAgIGxldCBlID0gXCJuZXh0XCI7XG4gICAgICAgIGlmICh0LnJldmVyc2UgJiYgKGUgPSBcInByZXZcIiksIHQuaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmluZGV4KHQuaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuS3QgPyBuLm9wZW5LZXlDdXJzb3IodC5yYW5nZSwgZSkgOiBuLm9wZW5DdXJzb3IodC5yYW5nZSwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUub3BlbkN1cnNvcih0LnJhbmdlLCBlKTtcbiAgICB9XG59XG5cbi8qKlxuICogV3JhcHMgYW4gSURCUmVxdWVzdCBpbiBhIFBlcnNpc3RlbmNlUHJvbWlzZSwgdXNpbmcgdGhlIG9uc3VjY2VzcyAvIG9uZXJyb3JcbiAqIGhhbmRsZXJzIHRvIHJlc29sdmUgLyByZWplY3QgdGhlIFBlcnNpc3RlbmNlUHJvbWlzZSBhcyBhcHByb3ByaWF0ZS5cbiAqLyBmdW5jdGlvbiB0aSh0KSB7XG4gICAgcmV0dXJuIG5ldyBHcygoKGUsIG4pID0+IHtcbiAgICAgICAgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICBlKG4pO1xuICAgICAgICB9LCB0Lm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuaSh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICBuKGUpO1xuICAgICAgICB9O1xuICAgIH0pKTtcbn1cblxuLy8gR3VhcmQgc28gd2Ugb25seSByZXBvcnQgdGhlIGVycm9yIG9uY2UuXG5sZXQgZWkgPSAhMTtcblxuZnVuY3Rpb24gbmkodCkge1xuICAgIGNvbnN0IGUgPSBIcy5QdChnZXRVQSgpKTtcbiAgICBpZiAoZSA+PSAxMi4yICYmIGUgPCAxMykge1xuICAgICAgICBjb25zdCBlID0gXCJBbiBpbnRlcm5hbCBlcnJvciB3YXMgZW5jb3VudGVyZWQgaW4gdGhlIEluZGV4ZWQgRGF0YWJhc2Ugc2VydmVyXCI7XG4gICAgICAgIGlmICh0Lm1lc3NhZ2UuaW5kZXhPZihlKSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGVycm9yIGluIGEgbW9yZSBkZXNjcmlwdGl2ZSBvbmUuXG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IGooXCJpbnRlcm5hbFwiLCBgSU9TX0lOREVYRUREQl9CVUcxOiBJbmRleGVkRGIgaGFzIHRocm93biAnJHtlfScuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBhbiB1bmF2b2lkYWJsZSBidWcgaW4gaU9TLiBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzU2NDk2Mjk2LzExMDkxNSBmb3IgZGV0YWlscyBhbmQgYSBwb3RlbnRpYWwgd29ya2Fyb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBlaSB8fCAoZWkgPSAhMCwgXG4gICAgICAgICAgICAvLyBUaHJvdyBhIGdsb2JhbCBleGNlcHRpb24gb3V0c2lkZSBvZiB0aGlzIHByb21pc2UgY2hhaW4sIGZvciB0aGUgdXNlciB0b1xuICAgICAgICAgICAgLy8gcG90ZW50aWFsbHkgY2F0Y2guXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgIH0pLCAwKSksIHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIHNpIGV4dGVuZHMgV3Mge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5XdCA9IHQsIHRoaXMuY3VycmVudFNlcXVlbmNlTnVtYmVyID0gZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlpKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KTtcbiAgICByZXR1cm4gSHMuRHQobi5XdCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYmF0Y2ggb2YgbXV0YXRpb25zIHRoYXQgd2lsbCBiZSBzZW50IGFzIG9uZSB1bml0IHRvIHRoZSBiYWNrZW5kLlxuICovIGNsYXNzIHJpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyBtdXRhdGlvbiBiYXRjaC5cbiAgICAgKiBAcGFyYW0gbG9jYWxXcml0ZVRpbWUgLSBUaGUgb3JpZ2luYWwgd3JpdGUgdGltZSBvZiB0aGlzIG11dGF0aW9uLlxuICAgICAqIEBwYXJhbSBiYXNlTXV0YXRpb25zIC0gTXV0YXRpb25zIHRoYXQgYXJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGJhc2VcbiAgICAgKiB2YWx1ZXMgd2hlbiB0aGlzIG11dGF0aW9uIGlzIGFwcGxpZWQgbG9jYWxseS4gVGhpcyBjYW4gYmUgdXNlZCB0byBsb2NhbGx5XG4gICAgICogb3ZlcndyaXRlIHZhbHVlcyB0aGF0IGFyZSBwZXJzaXN0ZWQgaW4gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZS4gQmFzZVxuICAgICAqIG11dGF0aW9ucyBhcmUgbmV2ZXIgc2VudCB0byB0aGUgYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gbXV0YXRpb25zIC0gVGhlIHVzZXItcHJvdmlkZWQgbXV0YXRpb25zIGluIHRoaXMgbXV0YXRpb24gYmF0Y2guXG4gICAgICogVXNlci1wcm92aWRlZCBtdXRhdGlvbnMgYXJlIGFwcGxpZWQgYm90aCBsb2NhbGx5IGFuZCByZW1vdGVseSBvbiB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5iYXRjaElkID0gdCwgdGhpcy5sb2NhbFdyaXRlVGltZSA9IGUsIHRoaXMuYmFzZU11dGF0aW9ucyA9IG4sIHRoaXMubXV0YXRpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbGwgdGhlIG11dGF0aW9ucyBpbiB0aGlzIE11dGF0aW9uQmF0Y2ggdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudFxuICAgICAqIHRvIGNvbXB1dGUgdGhlIHN0YXRlIG9mIHRoZSByZW1vdGUgZG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIGJhdGNoUmVzdWx0IC0gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgTXV0YXRpb25CYXRjaCB0byB0aGVcbiAgICAgKiBiYWNrZW5kLlxuICAgICAqLyAgICBhcHBseVRvUmVtb3RlRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5tdXRhdGlvblJlc3VsdHM7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5tdXRhdGlvbnMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLm11dGF0aW9uc1tlXTtcbiAgICAgICAgICAgIGlmIChzLmtleS5pc0VxdWFsKHQua2V5KSkge1xuICAgICAgICAgICAgICAgIFplKHMsIHQsIG5bZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsb2NhbCB2aWV3IG9mIGEgZG9jdW1lbnQgZ2l2ZW4gYWxsIHRoZSBtdXRhdGlvbnMgaW4gdGhpc1xuICAgICAqIGJhdGNoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50IC0gVGhlIGRvY3VtZW50IHRvIGFwcGx5IG11dGF0aW9ucyB0by5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsVmlldyh0KSB7XG4gICAgICAgIC8vIEZpcnN0LCBhcHBseSB0aGUgYmFzZSBzdGF0ZS4gVGhpcyBhbGxvd3MgdXMgdG8gYXBwbHkgbm9uLWlkZW1wb3RlbnRcbiAgICAgICAgLy8gdHJhbnNmb3JtIGFnYWluc3QgYSBjb25zaXN0ZW50IHNldCBvZiB2YWx1ZXMuXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmJhc2VNdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIHRuKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgICAgICAvLyBTZWNvbmQsIGFwcGx5IGFsbCB1c2VyLXByb3ZpZGVkIG11dGF0aW9ucy5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5tdXRhdGlvbnMpIGUua2V5LmlzRXF1YWwodC5rZXkpICYmIHRuKGUsIHQsIHRoaXMubG9jYWxXcml0ZVRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbG9jYWwgdmlldyBmb3IgYWxsIHByb3ZpZGVkIGRvY3VtZW50cyBnaXZlbiB0aGUgbXV0YXRpb25zIGluXG4gICAgICogdGhpcyBiYXRjaC5cbiAgICAgKi8gICAgYXBwbHlUb0xvY2FsRG9jdW1lbnRTZXQodCkge1xuICAgICAgICAvLyBUT0RPKG1yc2NobWlkdCk6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgTyhuXjIpLiBJZiB3ZSBhcHBseSB0aGUgbXV0YXRpb25zXG4gICAgICAgIC8vIGRpcmVjdGx5IChhcyBkb25lIGluIGBhcHBseVRvTG9jYWxWaWV3KClgKSwgd2UgY2FuIHJlZHVjZSB0aGUgY29tcGxleGl0eVxuICAgICAgICAvLyB0byBPKG4pLlxuICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmdldChlLmtleSksIHMgPSBuO1xuICAgICAgICAgICAgLy8gVE9ETyhtdXRhYmxlZG9jdW1lbnRzKTogVGhpcyBtZXRob2Qgc2hvdWxkIHRha2UgYSBNdXRhYmxlRG9jdW1lbnRNYXBcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgcmVtb3ZlIHRoaXMgY2FzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlUb0xvY2FsVmlldyhzKSwgbi5pc1ZhbGlkRG9jdW1lbnQoKSB8fCBzLmNvbnZlcnRUb05vRG9jdW1lbnQoY3QubWluKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9ucy5yZWR1Y2UoKCh0LCBlKSA9PiB0LmFkZChlLmtleSkpLCBTbigpKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoSWQgPT09IHQuYmF0Y2hJZCAmJiBydCh0aGlzLm11dGF0aW9ucywgdC5tdXRhdGlvbnMsICgodCwgZSkgPT4gbm4odCwgZSkpKSAmJiBydCh0aGlzLmJhc2VNdXRhdGlvbnMsIHQuYmFzZU11dGF0aW9ucywgKCh0LCBlKSA9PiBubih0LCBlKSkpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSBtdXRhdGlvbiBiYXRjaCB0byB0aGUgYmFja2VuZC4gKi8gY2xhc3Mgb2kge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIFxuICAgIC8qKlxuICAgICAqIEEgcHJlLWNvbXB1dGVkIG1hcHBpbmcgZnJvbSBlYWNoIG11dGF0ZWQgZG9jdW1lbnQgdG8gdGhlIHJlc3VsdGluZ1xuICAgICAqIHZlcnNpb24uXG4gICAgICovXG4gICAgcykge1xuICAgICAgICB0aGlzLmJhdGNoID0gdCwgdGhpcy5jb21taXRWZXJzaW9uID0gZSwgdGhpcy5tdXRhdGlvblJlc3VsdHMgPSBuLCB0aGlzLmRvY1ZlcnNpb25zID0gcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBNdXRhdGlvbkJhdGNoUmVzdWx0IGZvciB0aGUgZ2l2ZW4gYmF0Y2ggYW5kIHJlc3VsdHMuIFRoZXJlXG4gICAgICogbXVzdCBiZSBvbmUgcmVzdWx0IGZvciBlYWNoIG11dGF0aW9uIGluIHRoZSBiYXRjaC4gVGhpcyBzdGF0aWMgZmFjdG9yeVxuICAgICAqIGNhY2hlcyBhIGRvY3VtZW50PSZndDt2ZXJzaW9uIG1hcHBpbmcgKGRvY1ZlcnNpb25zKS5cbiAgICAgKi8gICAgc3RhdGljIGZyb20odCwgZSwgbikge1xuICAgICAgICBCKHQubXV0YXRpb25zLmxlbmd0aCA9PT0gbi5sZW5ndGgpO1xuICAgICAgICBsZXQgcyA9IHZuKCk7XG4gICAgICAgIGNvbnN0IGkgPSB0Lm11dGF0aW9ucztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBpLmxlbmd0aDsgdCsrKSBzID0gcy5pbnNlcnQoaVt0XS5rZXksIG5bdF0udmVyc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgb2kodCwgZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbW11dGFibGUgc2V0IG9mIG1ldGFkYXRhIHRoYXQgdGhlIGxvY2FsIHN0b3JlIHRyYWNrcyBmb3IgZWFjaCB0YXJnZXQuXG4gKi8gY2xhc3MgYWkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgdGFyZ2V0IGJlaW5nIGxpc3RlbmVkIHRvLiAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgSUQgdG8gd2hpY2ggdGhlIHRhcmdldCBjb3JyZXNwb25kczsgQXNzaWduZWQgYnkgdGhlXG4gICAgICogTG9jYWxTdG9yZSBmb3IgdXNlciBsaXN0ZW5zIGFuZCBieSB0aGUgU3luY0VuZ2luZSBmb3IgbGltYm8gd2F0Y2hlcy5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIHB1cnBvc2Ugb2YgdGhlIHRhcmdldC4gKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGR1cmluZyB3aGljaCB0aGlzIHRhcmdldCBkYXRhXG4gICAgICogd2FzIG1vZGlmaWVkLlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKiBUaGUgbGF0ZXN0IHNuYXBzaG90IHZlcnNpb24gc2VlbiBmb3IgdGhpcyB0YXJnZXQuICovXG4gICAgaSA9IGN0Lm1pbigpXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gc25hcHNob3QgdmVyc2lvbiBhdCB3aGljaCB0aGUgYXNzb2NpYXRlZCB2aWV3XG4gICAgICogY29udGFpbmVkIG5vIGxpbWJvIGRvY3VtZW50cy5cbiAgICAgKi8gLCByID0gY3QubWluKClcbiAgICAvKipcbiAgICAgKiBBbiBvcGFxdWUsIHNlcnZlci1hc3NpZ25lZCB0b2tlbiB0aGF0IGFsbG93cyB3YXRjaGluZyBhIHRhcmdldCB0byBiZVxuICAgICAqIHJlc3VtZWQgYWZ0ZXIgZGlzY29ubmVjdGluZyB3aXRob3V0IHJldHJhbnNtaXR0aW5nIGFsbCB0aGUgZGF0YSB0aGF0XG4gICAgICogbWF0Y2hlcyB0aGUgdGFyZ2V0LiBUaGUgcmVzdW1lIHRva2VuIGVzc2VudGlhbGx5IGlkZW50aWZpZXMgYSBwb2ludCBpblxuICAgICAqIHRpbWUgZnJvbSB3aGljaCB0aGUgc2VydmVyIHNob3VsZCByZXN1bWUgc2VuZGluZyByZXN1bHRzLlxuICAgICAqLyAsIG8gPSB5dC5FTVBUWV9CWVRFX1NUUklORykge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHQsIHRoaXMudGFyZ2V0SWQgPSBlLCB0aGlzLnB1cnBvc2UgPSBuLCB0aGlzLnNlcXVlbmNlTnVtYmVyID0gcywgdGhpcy5zbmFwc2hvdFZlcnNpb24gPSBpLCBcbiAgICAgICAgdGhpcy5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID0gciwgdGhpcy5yZXN1bWVUb2tlbiA9IG87XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCBzZXF1ZW5jZSBudW1iZXIuICovICAgIHdpdGhTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYWkodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdCwgdGhpcy5zbmFwc2hvdFZlcnNpb24sIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiwgdGhpcy5yZXN1bWVUb2tlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFyZ2V0IGRhdGEgaW5zdGFuY2Ugd2l0aCBhbiB1cGRhdGVkIHJlc3VtZSB0b2tlbiBhbmRcbiAgICAgKiBzbmFwc2hvdCB2ZXJzaW9uLlxuICAgICAqLyAgICB3aXRoUmVzdW1lVG9rZW4odCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IGFpKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldElkLCB0aGlzLnB1cnBvc2UsIHRoaXMuc2VxdWVuY2VOdW1iZXIsIGUsIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFyZ2V0IGRhdGEgaW5zdGFuY2Ugd2l0aCBhbiB1cGRhdGVkIGxhc3QgbGltYm8gZnJlZVxuICAgICAqIHNuYXBzaG90IHZlcnNpb24gbnVtYmVyLlxuICAgICAqLyAgICB3aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYWkodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdGhpcy5zZXF1ZW5jZU51bWJlciwgdGhpcy5zbmFwc2hvdFZlcnNpb24sIHQsIHRoaXMucmVzdW1lVG9rZW4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTZXJpYWxpemVyIGZvciB2YWx1ZXMgc3RvcmVkIGluIHRoZSBMb2NhbFN0b3JlLiAqLyBjbGFzcyBjaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkd0ID0gdDtcbiAgICB9XG59XG5cbi8qKiBEZWNvZGVzIGEgcmVtb3RlIGRvY3VtZW50IGZyb20gc3RvcmFnZSBsb2NhbGx5IHRvIGEgRG9jdW1lbnQuICovIGZ1bmN0aW9uIHVpKHQsIGUpIHtcbiAgICBpZiAoZS5kb2N1bWVudCkgcmV0dXJuIHNzKHQuR3QsIGUuZG9jdW1lbnQsICEhZS5oYXNDb21taXR0ZWRNdXRhdGlvbnMpO1xuICAgIGlmIChlLm5vRG9jdW1lbnQpIHtcbiAgICAgICAgY29uc3QgdCA9IFN0LmZyb21TZWdtZW50cyhlLm5vRG9jdW1lbnQucGF0aCksIG4gPSB3aShlLm5vRG9jdW1lbnQucmVhZFRpbWUpLCBzID0gV3QubmV3Tm9Eb2N1bWVudCh0LCBuKTtcbiAgICAgICAgcmV0dXJuIGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zID8gcy5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKSA6IHM7XG4gICAgfVxuICAgIGlmIChlLnVua25vd25Eb2N1bWVudCkge1xuICAgICAgICBjb25zdCB0ID0gU3QuZnJvbVNlZ21lbnRzKGUudW5rbm93bkRvY3VtZW50LnBhdGgpLCBuID0gd2koZS51bmtub3duRG9jdW1lbnQudmVyc2lvbik7XG4gICAgICAgIHJldHVybiBXdC5uZXdVbmtub3duRG9jdW1lbnQodCwgbik7XG4gICAgfVxuICAgIHJldHVybiBMKCk7XG59XG5cbi8qKiBFbmNvZGVzIGEgZG9jdW1lbnQgZm9yIHN0b3JhZ2UgbG9jYWxseS4gKi8gZnVuY3Rpb24gaGkodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBsaShuKSwgaSA9IGUua2V5LnBhdGgucG9wTGFzdCgpLnRvQXJyYXkoKTtcbiAgICBpZiAoZS5pc0ZvdW5kRG9jdW1lbnQoKSkge1xuICAgICAgICBjb25zdCBuID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBKbih0LCBlLmtleSksXG4gICAgICAgICAgICAgICAgZmllbGRzOiBlLmRhdGEudmFsdWUubWFwVmFsdWUuZmllbGRzLFxuICAgICAgICAgICAgICAgIHVwZGF0ZVRpbWU6IGpuKHQsIGUudmVyc2lvbi50b1RpbWVzdGFtcCgpKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSh0Lkd0LCBlKSwgciA9IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zO1xuICAgICAgICByZXR1cm4gbmV3ICRzKFxuICAgICAgICAvKiB1bmtub3duRG9jdW1lbnQ9ICovIG51bGwsIFxuICAgICAgICAvKiBub0RvY3VtZW50PSAqLyBudWxsLCBuLCByLCBzLCBpKTtcbiAgICB9XG4gICAgaWYgKGUuaXNOb0RvY3VtZW50KCkpIHtcbiAgICAgICAgY29uc3QgdCA9IGUua2V5LnBhdGgudG9BcnJheSgpLCBuID0gZGkoZS52ZXJzaW9uKSwgciA9IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zO1xuICAgICAgICByZXR1cm4gbmV3ICRzKFxuICAgICAgICAvKiB1bmtub3duRG9jdW1lbnQ9ICovIG51bGwsIG5ldyBrcyh0LCBuKSwgXG4gICAgICAgIC8qIGRvY3VtZW50PSAqLyBudWxsLCByLCBzLCBpKTtcbiAgICB9XG4gICAgaWYgKGUuaXNVbmtub3duRG9jdW1lbnQoKSkge1xuICAgICAgICBjb25zdCB0ID0gZS5rZXkucGF0aC50b0FycmF5KCksIG4gPSBkaShlLnZlcnNpb24pO1xuICAgICAgICByZXR1cm4gbmV3ICRzKG5ldyB4cyh0LCBuKSwgXG4gICAgICAgIC8qIG5vRG9jdW1lbnQ9ICovIG51bGwsIFxuICAgICAgICAvKiBkb2N1bWVudD0gKi8gbnVsbCwgXG4gICAgICAgIC8qIGhhc0NvbW1pdHRlZE11dGF0aW9ucz0gKi8gITAsIHMsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gTCgpO1xufVxuXG5mdW5jdGlvbiBsaSh0KSB7XG4gICAgY29uc3QgZSA9IHQudG9UaW1lc3RhbXAoKTtcbiAgICByZXR1cm4gWyBlLnNlY29uZHMsIGUubmFub3NlY29uZHMgXTtcbn1cblxuZnVuY3Rpb24gZmkodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgYXQodFswXSwgdFsxXSk7XG4gICAgcmV0dXJuIGN0LmZyb21UaW1lc3RhbXAoZSk7XG59XG5cbmZ1bmN0aW9uIGRpKHQpIHtcbiAgICBjb25zdCBlID0gdC50b1RpbWVzdGFtcCgpO1xuICAgIHJldHVybiBuZXcgVnMoZS5zZWNvbmRzLCBlLm5hbm9zZWNvbmRzKTtcbn1cblxuZnVuY3Rpb24gd2kodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgYXQodC5zZWNvbmRzLCB0Lm5hbm9zZWNvbmRzKTtcbiAgICByZXR1cm4gY3QuZnJvbVRpbWVzdGFtcChlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBiYXRjaCBvZiBtdXRhdGlvbnMgaW50byBhIERiTXV0YXRpb25CYXRjaCBmb3IgbG9jYWwgc3RvcmFnZS4gKi9cbi8qKiBEZWNvZGVzIGEgRGJNdXRhdGlvbkJhdGNoIGludG8gYSBNdXRhdGlvbkJhdGNoICovXG5mdW5jdGlvbiBfaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IChlLmJhc2VNdXRhdGlvbnMgfHwgW10pLm1hcCgoZSA9PiBhcyh0Lkd0LCBlKSkpO1xuICAgIC8vIFNxdWFzaCBvbGQgdHJhbnNmb3JtIG11dGF0aW9ucyBpbnRvIGV4aXN0aW5nIHBhdGNoIG9yIHNldCBtdXRhdGlvbnMuXG4gICAgLy8gVGhlIHJlcGxhY2VtZW50IG9mIHJlcHJlc2VudGluZyBgdHJhbnNmb3Jtc2Agd2l0aCBgdXBkYXRlX3RyYW5zZm9ybXNgXG4gICAgLy8gb24gdGhlIFNESyBtZWFucyB0aGF0IG9sZCBgdHJhbnNmb3JtYCBtdXRhdGlvbnMgc3RvcmVkIGluIEluZGV4ZWREQiBuZWVkXG4gICAgLy8gdG8gYmUgdXBkYXRlZCB0byBgdXBkYXRlX3RyYW5zZm9ybXNgLlxuICAgIC8vIFRPRE8oYi8xNzQ2MDgzNzQpOiBSZW1vdmUgdGhpcyBjb2RlIG9uY2Ugd2UgcGVyZm9ybSBhIHNjaGVtYSBtaWdyYXRpb24uXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5tdXRhdGlvbnMubGVuZ3RoIC0gMTsgKyt0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm11dGF0aW9uc1t0XTtcbiAgICAgICAgaWYgKHQgKyAxIDwgZS5tdXRhdGlvbnMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZS5tdXRhdGlvbnNbdCArIDFdLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGUubXV0YXRpb25zW3QgKyAxXTtcbiAgICAgICAgICAgIG4udXBkYXRlVHJhbnNmb3JtcyA9IHMudHJhbnNmb3JtLmZpZWxkVHJhbnNmb3JtcywgZS5tdXRhdGlvbnMuc3BsaWNlKHQgKyAxLCAxKSwgXG4gICAgICAgICAgICArK3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcyA9IGUubXV0YXRpb25zLm1hcCgoZSA9PiBhcyh0Lkd0LCBlKSkpLCBpID0gYXQuZnJvbU1pbGxpcyhlLmxvY2FsV3JpdGVUaW1lTXMpO1xuICAgIHJldHVybiBuZXcgcmkoZS5iYXRjaElkLCBpLCBuLCBzKTtcbn1cblxuLyoqIERlY29kZXMgYSBEYlRhcmdldCBpbnRvIFRhcmdldERhdGEgKi8gZnVuY3Rpb24gbWkodCkge1xuICAgIGNvbnN0IGUgPSB3aSh0LnJlYWRUaW1lKSwgbiA9IHZvaWQgMCAhPT0gdC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID8gd2kodC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uKSA6IGN0Lm1pbigpO1xuICAgIGxldCBzO1xuICAgIHZhciBpO1xuICAgIHJldHVybiB2b2lkIDAgIT09IHQucXVlcnkuZG9jdW1lbnRzID8gKEIoMSA9PT0gKGkgPSB0LnF1ZXJ5KS5kb2N1bWVudHMubGVuZ3RoKSwgXG4gICAgcyA9IFJlKGdlKFpuKGkuZG9jdW1lbnRzWzBdKSkpKSA6IHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBSZShscyh0KSk7XG4gICAgfSh0LnF1ZXJ5KSwgbmV3IGFpKHMsIHQudGFyZ2V0SWQsIDAgLyogTGlzdGVuICovICwgdC5sYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIsIGUsIG4sIHl0LmZyb21CYXNlNjRTdHJpbmcodC5yZXN1bWVUb2tlbikpO1xufVxuXG4vKiogRW5jb2RlcyBUYXJnZXREYXRhIGludG8gYSBEYlRhcmdldCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBnaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGRpKGUuc25hcHNob3RWZXJzaW9uKSwgcyA9IGRpKGUubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbik7XG4gICAgbGV0IGk7XG4gICAgaSA9IFh0KGUudGFyZ2V0KSA/IHVzKHQuR3QsIGUudGFyZ2V0KSA6IGhzKHQuR3QsIGUudGFyZ2V0KTtcbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGUgcmVzdW1lVG9rZW4gYXMgYSBCeXRlU3RyaW5nIGluIEluZGV4ZWREYiwgc28gd2VcbiAgICAvLyBjb252ZXJ0IGl0IHRvIGEgYmFzZTY0IHN0cmluZyBmb3Igc3RvcmFnZS5cbiAgICAgICAgY29uc3QgciA9IGUucmVzdW1lVG9rZW4udG9CYXNlNjQoKTtcbiAgICAvLyBsYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgaXMgYWx3YXlzIDAgdW50aWwgd2UgZG8gcmVhbCBHQy5cbiAgICAgICAgcmV0dXJuIG5ldyBPcyhlLnRhcmdldElkLCBIdChlLnRhcmdldCksIG4sIHIsIGUuc2VxdWVuY2VOdW1iZXIsIHMsIGkpO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBmaWd1cmluZyBvdXQgd2hhdCBraW5kIG9mIHF1ZXJ5IGhhcyBiZWVuIHN0b3JlZC5cbiAqL1xuLyoqXG4gKiBFbmNvZGVzIGEgYEJ1bmRsZWRRdWVyeWAgZnJvbSBidW5kbGUgcHJvdG8gdG8gYSBRdWVyeSBvYmplY3QuXG4gKlxuICogVGhpcyByZWNvbnN0cnVjdHMgdGhlIG9yaWdpbmFsIHF1ZXJ5IHVzZWQgdG8gYnVpbGQgdGhlIGJ1bmRsZSBiZWluZyBsb2FkZWQsXG4gKiBpbmNsdWRpbmcgZmVhdHVyZXMgZXhpc3RzIG9ubHkgaW4gU0RLcyAoZm9yIGV4YW1wbGU6IGxpbWl0LXRvLWxhc3QpLlxuICovXG5mdW5jdGlvbiB5aSh0KSB7XG4gICAgY29uc3QgZSA9IGxzKHtcbiAgICAgICAgcGFyZW50OiB0LnBhcmVudCxcbiAgICAgICAgc3RydWN0dXJlZFF1ZXJ5OiB0LnN0cnVjdHVyZWRRdWVyeVxuICAgIH0pO1xuICAgIHJldHVybiBcIkxBU1RcIiA9PT0gdC5saW1pdFR5cGUgPyBQZShlLCBlLmxpbWl0LCBcIkxcIiAvKiBMYXN0ICovKSA6IGU7XG59XG5cbi8qKiBFbmNvZGVzIGEgTmFtZWRRdWVyeSBwcm90byBvYmplY3QgdG8gYSBOYW1lZFF1ZXJ5IG1vZGVsIG9iamVjdC4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5jbGFzcyBwaSB7XG4gICAgZ2V0QnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gVGkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IChlID0gdCkuYnVuZGxlSWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlVGltZTogd2koZS5jcmVhdGVUaW1lKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlLnZlcnNpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIERiQnVuZGxlIHRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIEJ1bmRsZU1ldGFkYXRhIHRvIGEgRGJCdW5kbGUuICovICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNhdmVCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBUaSh0KS5wdXQoe1xuICAgICAgICAgICAgYnVuZGxlSWQ6IChuID0gZSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVUaW1lOiBkaShHbihuLmNyZWF0ZVRpbWUpKSxcbiAgICAgICAgICAgIHZlcnNpb246IG4udmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIC8qKiBFbmNvZGVzIGEgRGJOYW1lZFF1ZXJ5IHRvIGEgTmFtZWRRdWVyeS4gKi8gICAgfVxuICAgIGdldE5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gRWkodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogKGUgPSB0KS5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB5aShlLmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IHdpKGUucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIE5hbWVkUXVlcnkgZnJvbSBhIGJ1bmRsZSBwcm90byB0byBhIERiTmFtZWRRdWVyeS4gKi8gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2F2ZU5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gRWkodCkucHV0KGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBkaShHbih0LnJlYWRUaW1lKSksXG4gICAgICAgICAgICAgICAgYnVuZGxlZFF1ZXJ5OiB0LmJ1bmRsZWRRdWVyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgYnVuZGxlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gVGkodCkge1xuICAgIHJldHVybiBpaSh0LCBxcy5zdG9yZSk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBuYW1lZFF1ZXJpZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIEVpKHQpIHtcbiAgICByZXR1cm4gaWkodCwgS3Muc3RvcmUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgSW5kZXhNYW5hZ2VyLlxuICovIGNsYXNzIElpIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy56dCA9IG5ldyBBaTtcbiAgICB9XG4gICAgYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy56dC5hZGQoZSksIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0Q29sbGVjdGlvblBhcmVudHModCwgZSkge1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZSh0aGlzLnp0LmdldEVudHJpZXMoZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29sbGVjdGlvbi1wYXJlbnQgaW5kZXggZXhwb3NlZCBieSBNZW1vcnlJbmRleE1hbmFnZXIuXG4gKiBBbHNvIHVzZWQgZm9yIGluLW1lbW9yeSBjYWNoaW5nIGJ5IEluZGV4ZWREYkluZGV4TWFuYWdlciBhbmQgaW5pdGlhbCBpbmRleCBwb3B1bGF0aW9uXG4gKiBpbiBpbmRleGVkZGJfc2NoZW1hLnRzXG4gKi8gY2xhc3MgQWkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ID0ge307XG4gICAgfVxuICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RlZC5cbiAgICBhZGQodCkge1xuICAgICAgICBjb25zdCBlID0gdC5sYXN0U2VnbWVudCgpLCBuID0gdC5wb3BMYXN0KCksIHMgPSB0aGlzLmluZGV4W2VdIHx8IG5ldyBUbihkdC5jb21wYXJhdG9yKSwgaSA9ICFzLmhhcyhuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbZV0gPSBzLmFkZChuKSwgaTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgbiA9IHQucG9wTGFzdCgpLCBzID0gdGhpcy5pbmRleFtlXTtcbiAgICAgICAgcmV0dXJuIHMgJiYgcy5oYXMobik7XG4gICAgfVxuICAgIGdldEVudHJpZXModCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW5kZXhbdF0gfHwgbmV3IFRuKGR0LmNvbXBhcmF0b3IpKS50b0FycmF5KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHBlcnNpc3RlZCBpbXBsZW1lbnRhdGlvbiBvZiBJbmRleE1hbmFnZXIuXG4gKi8gY2xhc3MgUmkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW4tbWVtb3J5IGNvcHkgb2YgdGhlIGluZGV4IGVudHJpZXMgd2UndmUgYWxyZWFkeSB3cml0dGVuIHNpbmNlIHRoZSBTREtcbiAgICAgICAgICogbGF1bmNoZWQuIFVzZWQgdG8gYXZvaWQgcmUtd3JpdGluZyB0aGUgc2FtZSBlbnRyeSByZXBlYXRlZGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGlzICpOT1QqIGEgY29tcGxldGUgY2FjaGUgb2Ygd2hhdCdzIGluIHBlcnNpc3RlbmNlIGFuZCBzbyBjYW4gbmV2ZXIgYmUgdXNlZCB0b1xuICAgICAgICAgKiBzYXRpc2Z5IHJlYWRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5IdCA9IG5ldyBBaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgY29sbGVjdGlvbiBwYXJlbnQgaW5kZXguXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBjYWxscyBmb3IgdGhlIHNhbWUgY29sbGVjdGlvblBhdGggc2hvdWxkIGJlIGF2b2lkZWQgd2l0aGluIGFcbiAgICAgKiB0cmFuc2FjdGlvbiBhcyBJbmRleGVkRGJJbmRleE1hbmFnZXIgb25seSBjYWNoZXMgd3JpdGVzIG9uY2UgYSB0cmFuc2FjdGlvblxuICAgICAqIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKi8gICAgYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkge1xuICAgICAgICBpZiAoIXRoaXMuSHQuaGFzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gZS5sYXN0U2VnbWVudCgpLCBzID0gZS5wb3BMYXN0KCk7XG4gICAgICAgICAgICB0LmFkZE9uQ29tbWl0dGVkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbGxlY3Rpb24gdG8gdGhlIGluIG1lbW9yeSBjYWNoZSBvbmx5IGlmIHRoZSB0cmFuc2FjdGlvbiB3YXNcbiAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsbHkgY29tbWl0dGVkLlxuICAgICAgICAgICAgICAgIHRoaXMuSHQuYWRkKGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IG4sXG4gICAgICAgICAgICAgICAgcGFyZW50OiBScyhzKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBQaSh0KS5wdXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0Q29sbGVjdGlvblBhcmVudHModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW10sIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIGUsIFwiXCIgXSwgWyBvdChlKSwgXCJcIiBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBQaSh0KS5CdChzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjb2xsZWN0aW9uSWQgZ3VhcmQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSAoYW5kIGlzbid0IGFzIGxvbmdcbiAgICAgICAgICAgICAgICAvLyBhcyB3ZSdyZSBydW5uaW5nIGluIGEgcmVhbCBicm93c2VyKSwgYnV0IHRoZXJlJ3MgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAvLyBpbmRleGVkZGJzaGltIHRoYXQgYnJlYWtzIG91ciByYW5nZSBpbiBvdXIgdGVzdHMgcnVubmluZyBpbiBub2RlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9heGVtY2xpb24vSW5kZXhlZERCU2hpbS9pc3N1ZXMvMzM0XG4gICAgICAgICAgICAgICAgaWYgKHMuY29sbGVjdGlvbklkICE9PSBlKSBicmVhaztcbiAgICAgICAgICAgICAgICBuLnB1c2godnMocy5wYXJlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgY29sbGVjdGlvblBhcmVudHNcbiAqIGRvY3VtZW50IHN0b3JlLlxuICovIGZ1bmN0aW9uIFBpKHQpIHtcbiAgICByZXR1cm4gaWkodCwgQnMuc3RvcmUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBiaSA9IHtcbiAgICBkaWRSdW46ICExLFxuICAgIHNlcXVlbmNlTnVtYmVyc0NvbGxlY3RlZDogMCxcbiAgICB0YXJnZXRzUmVtb3ZlZDogMCxcbiAgICBkb2N1bWVudHNSZW1vdmVkOiAwXG59O1xuXG5jbGFzcyB2aSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gV2hlbiB3ZSBhdHRlbXB0IHRvIGNvbGxlY3QsIHdlIHdpbGwgb25seSBkbyBzbyBpZiB0aGUgY2FjaGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhpc1xuICAgIC8vIHRocmVzaG9sZC4gUGFzc2luZyBgQ09MTEVDVElPTl9ESVNBQkxFRGAgaGVyZSB3aWxsIGNhdXNlIGNvbGxlY3Rpb24gdG8gYWx3YXlzIGJlIHNraXBwZWQuXG4gICAgdCwgXG4gICAgLy8gVGhlIHBlcmNlbnRhZ2Ugb2Ygc2VxdWVuY2UgbnVtYmVycyB0aGF0IHdlIHdpbGwgYXR0ZW1wdCB0byBjb2xsZWN0XG4gICAgZSwgXG4gICAgLy8gQSBjYXAgb24gdGhlIHRvdGFsIG51bWJlciBvZiBzZXF1ZW5jZSBudW1iZXJzIHRoYXQgd2lsbCBiZSBjb2xsZWN0ZWQuIFRoaXMgcHJldmVudHNcbiAgICAvLyB1cyBmcm9tIGNvbGxlY3RpbmcgYSBodWdlIG51bWJlciBvZiBzZXF1ZW5jZSBudW1iZXJzIGlmIHRoZSBjYWNoZSBoYXMgZ3Jvd24gdmVyeSBsYXJnZS5cbiAgICBuKSB7XG4gICAgICAgIHRoaXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCA9IHQsIHRoaXMucGVyY2VudGlsZVRvQ29sbGVjdCA9IGUsIHRoaXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdCA9IG47XG4gICAgfVxuICAgIHN0YXRpYyB3aXRoQ2FjaGVTaXplKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB2aSh0LCB2aS5ERUZBVUxUX0NPTExFQ1RJT05fUEVSQ0VOVElMRSwgdmkuREVGQVVMVF9NQVhfU0VRVUVOQ0VfTlVNQkVSU19UT19DT0xMRUNUKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERlbGV0ZSBhIG11dGF0aW9uIGJhdGNoIGFuZCB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCBtdXRhdGlvbnMuXG4gKiBAcmV0dXJucyBBIFBlcnNpc3RlbmNlUHJvbWlzZSBvZiB0aGUgZG9jdW1lbnQgbXV0YXRpb25zIHRoYXQgd2VyZSByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBWaSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQuc3RvcmUoQ3Muc3RvcmUpLCBpID0gdC5zdG9yZShOcy5zdG9yZSksIHIgPSBbXSwgbyA9IElEQktleVJhbmdlLm9ubHkobi5iYXRjaElkKTtcbiAgICBsZXQgYSA9IDA7XG4gICAgY29uc3QgYyA9IHMuanQoe1xuICAgICAgICByYW5nZTogb1xuICAgIH0sICgodCwgZSwgbikgPT4gKGErKywgbi5kZWxldGUoKSkpKTtcbiAgICByLnB1c2goYy5uZXh0KCgoKSA9PiB7XG4gICAgICAgIEIoMSA9PT0gYSk7XG4gICAgfSkpKTtcbiAgICBjb25zdCB1ID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIG4ubXV0YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHMgPSBOcy5rZXkoZSwgdC5rZXkucGF0aCwgbi5iYXRjaElkKTtcbiAgICAgICAgci5wdXNoKGkuZGVsZXRlKHMpKSwgdS5wdXNoKHQua2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIEdzLndhaXRGb3IocikubmV4dCgoKCkgPT4gdSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXBwcm94aW1hdGUgc2l6ZSBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICovIGZ1bmN0aW9uIFNpKHQpIHtcbiAgICBpZiAoIXQpIHJldHVybiAwO1xuICAgIGxldCBlO1xuICAgIGlmICh0LmRvY3VtZW50KSBlID0gdC5kb2N1bWVudDsgZWxzZSBpZiAodC51bmtub3duRG9jdW1lbnQpIGUgPSB0LnVua25vd25Eb2N1bWVudDsgZWxzZSB7XG4gICAgICAgIGlmICghdC5ub0RvY3VtZW50KSB0aHJvdyBMKCk7XG4gICAgICAgIGUgPSB0Lm5vRG9jdW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKS5sZW5ndGg7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogQSBtdXRhdGlvbiBxdWV1ZSBmb3IgYSBzcGVjaWZpYyB1c2VyLCBiYWNrZWQgYnkgSW5kZXhlZERCLiAqLyB2aS5ERUZBVUxUX0NPTExFQ1RJT05fUEVSQ0VOVElMRSA9IDEwLCBcbnZpLkRFRkFVTFRfTUFYX1NFUVVFTkNFX05VTUJFUlNfVE9fQ09MTEVDVCA9IDFlMywgdmkuREVGQVVMVCA9IG5ldyB2aSg0MTk0MzA0MCwgdmkuREVGQVVMVF9DT0xMRUNUSU9OX1BFUkNFTlRJTEUsIHZpLkRFRkFVTFRfTUFYX1NFUVVFTkNFX05VTUJFUlNfVE9fQ09MTEVDVCksIFxudmkuRElTQUJMRUQgPSBuZXcgdmkoLTEsIDAsIDApO1xuXG5jbGFzcyBEaSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG5vcm1hbGl6ZWQgdXNlcklkIChlLmcuIG51bGwgVUlEID0+IFwiXCIgdXNlcklkKSB1c2VkIHRvIHN0b3JlIC9cbiAgICAgKiByZXRyaWV2ZSBtdXRhdGlvbnMuXG4gICAgICovXG4gICAgdCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHQsIHRoaXMuayA9IGUsIHRoaXMuSnQgPSBuLCB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gcywgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZXMgdGhlIGRvY3VtZW50IGtleXMgZm9yIHBlbmRpbmcgbXV0YXRpb24gYmF0Y2hlcy4gSWYgdGhlIG11dGF0aW9uXG4gICAgICAgICAqIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBJbmRleGVkRGIsIHRoZSBjYWNoZWQgdmFsdWUgbWF5IGNvbnRpbnVlIHRvXG4gICAgICAgICAqIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGJhdGNoJ3MgZG9jdW1lbnQga2V5cy4gVG8gcmVtb3ZlIGEgY2FjaGVkIHZhbHVlXG4gICAgICAgICAqIGxvY2FsbHksIGByZW1vdmVDYWNoZWRNdXRhdGlvbktleXMoKWAgc2hvdWxkIGJlIGludm9rZWQgZWl0aGVyIGRpcmVjdGx5XG4gICAgICAgICAqIG9yIHRocm91Z2ggYHJlbW92ZU11dGF0aW9uQmF0Y2hlcygpYC5cbiAgICAgICAgICpcbiAgICAgICAgICogV2l0aCBtdWx0aS10YWIsIHdoZW4gdGhlIHByaW1hcnkgY2xpZW50IGFja25vd2xlZGdlcyBvciByZWplY3RzIGEgbXV0YXRpb24sXG4gICAgICAgICAqIHRoaXMgY2FjaGUgaXMgdXNlZCBieSBzZWNvbmRhcnkgY2xpZW50cyB0byBpbnZhbGlkYXRlIHRoZSBsb2NhbFxuICAgICAgICAgKiB2aWV3IG9mIHRoZSBkb2N1bWVudHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgYWZmZWN0ZWQgYnkgdGhlIG11dGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICAgICAgdGhpcy5ZdCA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGF0aW9uIHF1ZXVlIGZvciB0aGUgZ2l2ZW4gdXNlci5cbiAgICAgKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyIGZvciB3aGljaCB0byBjcmVhdGUgYSBtdXRhdGlvbiBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gc2VyaWFsaXplciAtIFRoZSBzZXJpYWxpemVyIHRvIHVzZSB3aGVuIHBlcnNpc3RpbmcgdG8gSW5kZXhlZERiLlxuICAgICAqLyAgICBzdGF0aWMgWHQodCwgZSwgbiwgcykge1xuICAgICAgICAvLyBUT0RPKG1jZyk6IEZpZ3VyZSBvdXQgd2hhdCBjb25zdHJhaW50cyB0aGVyZSBhcmUgb24gdXNlcklEc1xuICAgICAgICAvLyBJbiBwYXJ0aWN1bGFyLCBhcmUgdGhlcmUgYW55IHJlc2VydmVkIGNoYXJhY3RlcnM/IGFyZSBlbXB0eSBpZHMgYWxsb3dlZD9cbiAgICAgICAgLy8gRm9yIHRoZSBtb21lbnQgc3RvcmUgdGhlc2UgdG9nZXRoZXIgaW4gdGhlIHNhbWUgbXV0YXRpb25zIHRhYmxlIGFzc3VtaW5nXG4gICAgICAgIC8vIHRoYXQgZW1wdHkgdXNlcklEcyBhcmVuJ3QgYWxsb3dlZC5cbiAgICAgICAgQihcIlwiICE9PSB0LnVpZCk7XG4gICAgICAgIGNvbnN0IGkgPSB0LmlzQXV0aGVudGljYXRlZCgpID8gdC51aWQgOiBcIlwiO1xuICAgICAgICByZXR1cm4gbmV3IERpKGksIGUsIG4sIHMpO1xuICAgIH1cbiAgICBjaGVja0VtcHR5KHQpIHtcbiAgICAgICAgbGV0IGUgPSAhMDtcbiAgICAgICAgY29uc3QgbiA9IElEQktleVJhbmdlLmJvdW5kKFsgdGhpcy51c2VySWQsIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSBdLCBbIHRoaXMudXNlcklkLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSk7XG4gICAgICAgIHJldHVybiBOaSh0KS5qdCh7XG4gICAgICAgICAgICBpbmRleDogQ3MudXNlck11dGF0aW9uc0luZGV4LFxuICAgICAgICAgICAgcmFuZ2U6IG5cbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBlID0gITEsIHMuZG9uZSgpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgIH1cbiAgICBhZGRNdXRhdGlvbkJhdGNoKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IGtpKHQpLCByID0gTmkodCk7XG4gICAgICAgIC8vIFRoZSBJbmRleGVkRGIgaW1wbGVtZW50YXRpb24gaW4gQ2hyb21lIChhbmQgRmlyZWZveCkgZG9lcyBub3QgaGFuZGxlXG4gICAgICAgIC8vIGNvbXBvdW5kIGluZGljZXMgdGhhdCBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkIGtleXMgY29ycmVjdGx5LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgaW5kZXggZW50cnkgaXMgYWRkZWQgY29ycmVjdGx5IGluIGFsbCBicm93c2Vycywgd2UgcGVyZm9ybSB0d29cbiAgICAgICAgLy8gd3JpdGVzOiBUaGUgZmlyc3Qgd3JpdGUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbmV4dCBhdXRvLWdlbmVyYXRlZCBCYXRjaFxuICAgICAgICAvLyBJRCwgYW5kIHRoZSBzZWNvbmQgd3JpdGUgcG9wdWxhdGVzIHRoZSBpbmRleCBhbmQgc3RvcmVzIHRoZSBhY3R1YWxcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2guXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzAxOTcyXG4gICAgICAgIC8vIFdlIHdyaXRlIGFuIGVtcHR5IG9iamVjdCB0byBvYnRhaW4ga2V5XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiByLmFkZCh7fSkubmV4dCgobyA9PiB7XG4gICAgICAgICAgICBCKFwibnVtYmVyXCIgPT0gdHlwZW9mIG8pO1xuICAgICAgICAgICAgY29uc3QgYSA9IG5ldyByaShvLCBlLCBuLCBzKSwgYyA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbi5iYXNlTXV0YXRpb25zLm1hcCgoZSA9PiBvcyh0Lkd0LCBlKSkpLCBpID0gbi5tdXRhdGlvbnMubWFwKChlID0+IG9zKHQuR3QsIGUpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDcyhlLCBuLmJhdGNoSWQsIG4ubG9jYWxXcml0ZVRpbWUudG9NaWxsaXMoKSwgcywgaSk7XG4gICAgICAgICAgICB9KHRoaXMuaywgdGhpcy51c2VySWQsIGEpLCB1ID0gW107XG4gICAgICAgICAgICBsZXQgaCA9IG5ldyBUbigoKHQsIGUpID0+IGl0KHQuY2Fub25pY2FsU3RyaW5nKCksIGUuY2Fub25pY2FsU3RyaW5nKCkpKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBOcy5rZXkodGhpcy51c2VySWQsIHQua2V5LnBhdGgsIG8pO1xuICAgICAgICAgICAgICAgIGggPSBoLmFkZCh0LmtleS5wYXRoLnBvcExhc3QoKSksIHUucHVzaChyLnB1dChjKSksIHUucHVzaChpLnB1dChlLCBOcy5QTEFDRUhPTERFUikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGguZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgdS5wdXNoKHRoaXMuSnQuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkpO1xuICAgICAgICAgICAgfSkpLCB0LmFkZE9uQ29tbWl0dGVkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLll0W29dID0gYS5rZXlzKCk7XG4gICAgICAgICAgICB9KSksIEdzLndhaXRGb3IodSkubmV4dCgoKCkgPT4gYSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkge1xuICAgICAgICByZXR1cm4gTmkodCkuZ2V0KGUpLm5leHQoKHQgPT4gdCA/IChCKHQudXNlcklkID09PSB0aGlzLnVzZXJJZCksIF9pKHRoaXMuaywgdCkpIDogbnVsbCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBrZXlzIGZvciB0aGUgbXV0YXRpb24gYmF0Y2ggd2l0aCB0aGUgZ2l2ZW4gYmF0Y2hJZC5cbiAgICAgKiBGb3IgcHJpbWFyeSBjbGllbnRzLCB0aGlzIG1ldGhvZCByZXR1cm5zIGBudWxsYCBhZnRlclxuICAgICAqIGByZW1vdmVNdXRhdGlvbkJhdGNoZXMoKWAgaGFzIGJlZW4gY2FsbGVkLiBTZWNvbmRhcnkgY2xpZW50cyByZXR1cm4gYVxuICAgICAqIGNhY2hlZCByZXN1bHQgdW50aWwgYHJlbW92ZUNhY2hlZE11dGF0aW9uS2V5cygpYCBpcyBpbnZva2VkLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgWnQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ZdFtlXSA/IEdzLnJlc29sdmUodGhpcy5ZdFtlXSkgOiB0aGlzLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LmtleXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ZdFtlXSA9IG4sIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXROZXh0TXV0YXRpb25CYXRjaEFmdGVyQmF0Y2hJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlICsgMSwgcyA9IElEQktleVJhbmdlLmxvd2VyQm91bmQoWyB0aGlzLnVzZXJJZCwgbiBdKTtcbiAgICAgICAgbGV0IGkgPSBudWxsO1xuICAgICAgICByZXR1cm4gTmkodCkuanQoe1xuICAgICAgICAgICAgaW5kZXg6IENzLnVzZXJNdXRhdGlvbnNJbmRleCxcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgZS51c2VySWQgPT09IHRoaXMudXNlcklkICYmIChCKGUuYmF0Y2hJZCA+PSBuKSwgaSA9IF9pKHRoaXMuaywgZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS51cHBlckJvdW5kKFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgbGV0IG4gPSAtMTtcbiAgICAgICAgcmV0dXJuIE5pKHQpLmp0KHtcbiAgICAgICAgICAgIGluZGV4OiBDcy51c2VyTXV0YXRpb25zSW5kZXgsXG4gICAgICAgICAgICByYW5nZTogZSxcbiAgICAgICAgICAgIHJldmVyc2U6ICEwXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgbiA9IGUuYmF0Y2hJZCwgcy5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS5ib3VuZChbIHRoaXMudXNlcklkLCAtMSBdLCBbIHRoaXMudXNlcklkLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSk7XG4gICAgICAgIHJldHVybiBOaSh0KS5CdChDcy51c2VyTXV0YXRpb25zSW5kZXgsIGUpLm5leHQoKHQgPT4gdC5tYXAoKHQgPT4gX2kodGhpcy5rLCB0KSkpKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgLy8gU2NhbiB0aGUgZG9jdW1lbnQtbXV0YXRpb24gaW5kZXggc3RhcnRpbmcgd2l0aCBhIHByZWZpeCBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIHRoZSBnaXZlbiBkb2N1bWVudEtleS5cbiAgICAgICAgY29uc3QgbiA9IE5zLnByZWZpeEZvclBhdGgodGhpcy51c2VySWQsIGUucGF0aCksIHMgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKG4pLCBpID0gW107XG4gICAgICAgIHJldHVybiBraSh0KS5qdCh7XG4gICAgICAgICAgICByYW5nZTogc1xuICAgICAgICB9LCAoKG4sIHMsIHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvLCBhLCBjXSA9IG4sIHUgPSB2cyhhKTtcbiAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgIC8vIG9yZGVyIHRlcm1pbmF0b3JzIGJlZm9yZSBwYXRoIHNlcGFyYXRvcnMsIHdlJ2xsIGVuY291bnRlciBhbGxcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgLy8gZG9jdW1lbnRzIG5lc3RlZCBpbiBhIHN1YmNvbGxlY3Rpb24gYmVuZWF0aCBkb2N1bWVudEtleSBzbyB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKHUpKSBcbiAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG11dGF0aW9uIGJhdGNoIGluIHRoZSBzdG9yZS5cbiAgICAgICAgICAgIHJldHVybiBOaSh0KS5nZXQoYykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0KSB0aHJvdyBMKCk7XG4gICAgICAgICAgICAgICAgQih0LnVzZXJJZCA9PT0gdGhpcy51c2VySWQpLCBpLnB1c2goX2kodGhpcy5rLCB0KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBuZXcgVG4oaXQpO1xuICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IE5zLnByZWZpeEZvclBhdGgodGhpcy51c2VySWQsIGUucGF0aCksIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKGkpLCBvID0ga2kodCkuanQoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiByXG4gICAgICAgICAgICB9LCAoKHQsIHMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbciwgbywgYV0gPSB0LCBjID0gdnMobyk7XG4gICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciByb3dzIG1hdGNoaW5nIGV4YWN0bHkgdGhlIHNwZWNpZmljIGtleSBvZlxuICAgICAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgICAgICAvLyBvcmRlciB0ZXJtaW5hdG9ycyBiZWZvcmUgcGF0aCBzZXBhcmF0b3JzLCB3ZSdsbCBlbmNvdW50ZXIgYWxsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IHJvd3MgZm9yIGRvY3VtZW50S2V5IGNvbnRpZ3VvdXNseS4gSW4gcGFydGljdWxhciwgYWxsXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50cyBuZXN0ZWQgaW4gYSBzdWJjb2xsZWN0aW9uIGJlbmVhdGggZG9jdW1lbnRLZXkgc28gd2VcbiAgICAgICAgICAgICAgICAvLyBjYW4gc3RvcCBhcyBzb29uIGFzIHdlIGhpdCBhbnkgc3VjaCByb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKGMpID8gbiA9IG4uYWRkKGEpIDogaS5kb25lKCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBzLnB1c2gobyk7XG4gICAgICAgIH0pKSwgR3Mud2FpdEZvcihzKS5uZXh0KCgoKSA9PiB0aGlzLnRlKHQsIG4pKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ1F1ZXJ5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUucGF0aCwgcyA9IG4ubGVuZ3RoICsgMSwgaSA9IE5zLnByZWZpeEZvclBhdGgodGhpcy51c2VySWQsIG4pLCByID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChpKTtcbiAgICAgICAgLy8gQ29sbGVjdCB1cCB1bmlxdWUgYmF0Y2hJRHMgZW5jb3VudGVyZWQgZHVyaW5nIGEgc2NhbiBvZiB0aGUgaW5kZXguIFVzZSBhXG4gICAgICAgIC8vIFNvcnRlZFNldCB0byBhY2N1bXVsYXRlIGJhdGNoIElEcyBzbyB0aGV5IGNhbiBiZSB0cmF2ZXJzZWQgaW4gb3JkZXIgaW4gYVxuICAgICAgICAvLyBzY2FuIG9mIHRoZSBtYWluIHRhYmxlLlxuICAgICAgICBsZXQgbyA9IG5ldyBUbihpdCk7XG4gICAgICAgIHJldHVybiBraSh0KS5qdCh7XG4gICAgICAgICAgICByYW5nZTogclxuICAgICAgICB9LCAoKHQsIGUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtyLCBhLCBjXSA9IHQsIHUgPSB2cyhhKTtcbiAgICAgICAgICAgIHIgPT09IHRoaXMudXNlcklkICYmIG4uaXNQcmVmaXhPZih1KSA/IFxuICAgICAgICAgICAgLy8gUm93cyB3aXRoIGRvY3VtZW50IGtleXMgbW9yZSB0aGFuIG9uZSBzZWdtZW50IGxvbmdlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gcXVlcnkgcGF0aCBjYW4ndCBiZSBtYXRjaGVzLiBGb3IgZXhhbXBsZSwgYSBxdWVyeSBvbiAncm9vbXMnXG4gICAgICAgICAgICAvLyBjYW4ndCBtYXRjaCB0aGUgZG9jdW1lbnQgL3Jvb21zL2FiYy9tZXNzYWdlcy94eXguXG4gICAgICAgICAgICAvLyBUT0RPKG1jZyk6IHdlJ2xsIG5lZWQgYSBkaWZmZXJlbnQgc2Nhbm5lciB3aGVuIHdlIGltcGxlbWVudFxuICAgICAgICAgICAgLy8gYW5jZXN0b3IgcXVlcmllcy5cbiAgICAgICAgICAgIHUubGVuZ3RoID09PSBzICYmIChvID0gby5hZGQoYykpIDogaS5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB0aGlzLnRlKHQsIG8pKSk7XG4gICAgfVxuICAgIHRlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtdLCBzID0gW107XG4gICAgICAgIC8vIFRPRE8ocm9ja3dvb2QpOiBJbXBsZW1lbnQgdGhpcyB1c2luZyBpdGVyYXRlLlxuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHMucHVzaChOaSh0KS5nZXQoZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHQpIHRocm93IEwoKTtcbiAgICAgICAgICAgICAgICBCKHQudXNlcklkID09PSB0aGlzLnVzZXJJZCksIG4ucHVzaChfaSh0aGlzLmssIHQpKTtcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pKSwgR3Mud2FpdEZvcihzKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIHJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkge1xuICAgICAgICByZXR1cm4gVmkodC5XdCwgdGhpcy51c2VySWQsIGUpLm5leHQoKG4gPT4gKHQuYWRkT25Db21taXR0ZWRMaXN0ZW5lcigoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZShlLmJhdGNoSWQpO1xuICAgICAgICB9KSksIEdzLmZvckVhY2gobiwgKGUgPT4gdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBlKSkpKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlZCBrZXlzIGZvciBhIG11dGF0aW9uIGJhdGNoLiBUaGlzIG1ldGhvZCBzaG91bGQgYmVcbiAgICAgKiBjYWxsZWQgYnkgc2Vjb25kYXJ5IGNsaWVudHMgYWZ0ZXIgdGhleSBwcm9jZXNzIG11dGF0aW9uIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgZnJvbSBwcmltYXJ5IGNsaWVudHMgYXNcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBlbnRyaWVzIGFyZSBjbGVhcmVkIHdoZW4gYW4gYWNrbm93bGVkZ2VkIG9yXG4gICAgICogcmVqZWN0ZWQgYmF0Y2ggaXMgcmVtb3ZlZCBmcm9tIHRoZSBtdXRhdGlvbiBxdWV1ZS5cbiAgICAgKi9cbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5XG4gICAgZWUodCkge1xuICAgICAgICBkZWxldGUgdGhpcy5ZdFt0XTtcbiAgICB9XG4gICAgcGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0VtcHR5KHQpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFlKSByZXR1cm4gR3MucmVzb2x2ZSgpO1xuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGVudHJpZXMgaW4gdGhlIGRvY3VtZW50TXV0YXRpb25zIGluZGV4IGlmXG4gICAgICAgICAgICAvLyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChOcy5wcmVmaXhGb3JVc2VyKHRoaXMudXNlcklkKSksIHMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiBraSh0KS5qdCh7XG4gICAgICAgICAgICAgICAgcmFuZ2U6IG5cbiAgICAgICAgICAgIH0sICgodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0WzBdID09PSB0aGlzLnVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdnModFsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHMucHVzaChlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugbi5kb25lKCk7XG4gICAgICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgIEIoMCA9PT0gcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnRhaW5zS2V5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIENpKHQsIHRoaXMudXNlcklkLCBlKTtcbiAgICB9XG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seSAoc3RhdGUgaXMgaGVsZCBpbiBtZW1vcnkgaW4gb3RoZXIgY2xpZW50cykuXG4gICAgLyoqIFJldHVybnMgdGhlIG11dGF0aW9uIHF1ZXVlJ3MgbWV0YWRhdGEgZnJvbSBJbmRleGVkRGIuICovXG4gICAgbmUodCkge1xuICAgICAgICByZXR1cm4geGkodCkuZ2V0KHRoaXMudXNlcklkKS5uZXh0KCh0ID0+IHQgfHwgbmV3IERzKHRoaXMudXNlcklkLCAtMSwgXG4gICAgICAgIC8qbGFzdFN0cmVhbVRva2VuPSovIFwiXCIpKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG11dGF0aW9uIHF1ZXVlIGZvciB0aGUgZ2l2ZW4gdXNlciBjb250YWlucyBhIHBlbmRpbmdcbiAqICAgICAgICAgbXV0YXRpb24gZm9yIHRoZSBnaXZlbiBrZXkuXG4gKi8gZnVuY3Rpb24gQ2kodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBOcy5wcmVmaXhGb3JQYXRoKGUsIG4ucGF0aCksIGkgPSBzWzFdLCByID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChzKTtcbiAgICBsZXQgbyA9ICExO1xuICAgIHJldHVybiBraSh0KS5qdCh7XG4gICAgICAgIHJhbmdlOiByLFxuICAgICAgICBLdDogITBcbiAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgY29uc3QgW3IsIGEsIC8qYmF0Y2hJRCovIGNdID0gdDtcbiAgICAgICAgciA9PT0gZSAmJiBhID09PSBpICYmIChvID0gITApLCBzLmRvbmUoKTtcbiAgICB9KSkubmV4dCgoKCkgPT4gbykpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGFueSBtdXRhdGlvbiBxdWV1ZSBjb250YWlucyB0aGUgZ2l2ZW4gZG9jdW1lbnQuICovXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgbXV0YXRpb25zIG9iamVjdCBzdG9yZS5cbiAqL1xuZnVuY3Rpb24gTmkodCkge1xuICAgIHJldHVybiBpaSh0LCBDcy5zdG9yZSk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBtdXRhdGlvblF1ZXVlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24ga2kodCkge1xuICAgIHJldHVybiBpaSh0LCBOcy5zdG9yZSk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBtdXRhdGlvblF1ZXVlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24geGkodCkge1xuICAgIHJldHVybiBpaSh0LCBEcy5zdG9yZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogT2Zmc2V0IHRvIGVuc3VyZSBub24tb3ZlcmxhcHBpbmcgdGFyZ2V0IGlkcy4gKi9cbi8qKlxuICogR2VuZXJhdGVzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0YXJnZXQgSURzIGZvciBzZW5kaW5nIHRhcmdldHMgdG8gdGhlXG4gKiB3YXRjaCBzdHJlYW0uXG4gKlxuICogVGhlIGNsaWVudCBjb25zdHJ1Y3RzIHR3byBnZW5lcmF0b3JzLCBvbmUgZm9yIHRoZSB0YXJnZXQgY2FjaGUsIGFuZCBvbmUgZm9yXG4gKiBmb3IgdGhlIHN5bmMgZW5naW5lICh0byBnZW5lcmF0ZSBsaW1ibyBkb2N1bWVudHMgdGFyZ2V0cykuIFRoZXNlXG4gKiBnZW5lcmF0b3JzIHByb2R1Y2Ugbm9uLW92ZXJsYXBwaW5nIElEcyAoYnkgdXNpbmcgZXZlbiBhbmQgb2RkIElEc1xuICogcmVzcGVjdGl2ZWx5KS5cbiAqXG4gKiBCeSBzZXBhcmF0aW5nIHRoZSB0YXJnZXQgSUQgc3BhY2UsIHRoZSBxdWVyeSBjYWNoZSBjYW4gZ2VuZXJhdGUgdGFyZ2V0IElEc1xuICogdGhhdCBwZXJzaXN0IGFjcm9zcyBjbGllbnQgcmVzdGFydHMsIHdoaWxlIHN5bmMgZW5naW5lIGNhbiBpbmRlcGVuZGVudGx5XG4gKiBnZW5lcmF0ZSBpbi1tZW1vcnkgdGFyZ2V0IElEcyB0aGF0IGFyZSB0cmFuc2llbnQgYW5kIGNhbiBiZSByZXVzZWQgYWZ0ZXIgYVxuICogcmVzdGFydC5cbiAqL1xuY2xhc3MgJGkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5zZSA9IHQ7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlICs9IDIsIHRoaXMuc2U7XG4gICAgfVxuICAgIHN0YXRpYyBpZSgpIHtcbiAgICAgICAgLy8gVGhlIHRhcmdldCBjYWNoZSBnZW5lcmF0b3IgbXVzdCByZXR1cm4gJzInIGluIGl0cyBmaXJzdCBjYWxsIHRvIGBuZXh0KClgXG4gICAgICAgIC8vIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVudGlhdGlvbiBpbiB0aGUgcHJvdG9jb2wgbGF5ZXIgYmV0d2VlbiBhbiB1bnNldFxuICAgICAgICAvLyBudW1iZXIgYW5kIHRoZSBudW1iZXIgJzAnLiBJZiB3ZSB3ZXJlIHRvIHNlbnQgYSB0YXJnZXQgd2l0aCB0YXJnZXQgSURcbiAgICAgICAgLy8gJzAnLCB0aGUgYmFja2VuZCB3b3VsZCBjb25zaWRlciBpdCB1bnNldCBhbmQgcmVwbGFjZSBpdCB3aXRoIGl0cyBvd24gSUQuXG4gICAgICAgIHJldHVybiBuZXcgJGkoMCk7XG4gICAgfVxuICAgIHN0YXRpYyByZSgpIHtcbiAgICAgICAgLy8gU3luYyBlbmdpbmUgYXNzaWducyB0YXJnZXQgSURzIGZvciBsaW1ibyBkb2N1bWVudCBkZXRlY3Rpb24uXG4gICAgICAgIHJldHVybiBuZXcgJGkoLTEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgRmkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IHQsIHRoaXMuayA9IGU7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogV2UgZG9uJ3QgY2FjaGUgZ2xvYmFsIG1ldGFkYXRhIGZvciB0aGUgdGFyZ2V0IGNhY2hlLCBzaW5jZVxuICAgIC8vIHNvbWUgb2YgaXQgKGluIHBhcnRpY3VsYXIgYGhpZ2hlc3RUYXJnZXRJZGApIGNhbiBiZSBtb2RpZmllZCBieSBzZWNvbmRhcnlcbiAgICAvLyB0YWJzLiBXZSBjb3VsZCBwZXJoYXBzIGJlIG1vcmUgZ3JhbnVsYXIgKGFuZCBlLmcuIHN0aWxsIGNhY2hlXG4gICAgLy8gYGxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb25gIGluIG1lbW9yeSkgYnV0IGZvciBzaW1wbGljaXR5IHdlIGN1cnJlbnRseSBnb1xuICAgIC8vIHRvIEluZGV4ZWREYiB3aGVuZXZlciB3ZSBuZWVkIHRvIHJlYWQgbWV0YWRhdGEuIFdlIGNhbiByZXZpc2l0IGlmIGl0IHR1cm5zXG4gICAgLy8gb3V0IHRvIGhhdmUgYSBtZWFuaW5nZnVsIHBlcmZvcm1hbmNlIGltcGFjdC5cbiAgICBhbGxvY2F0ZVRhcmdldElkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2UodCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3ICRpKGUuaGlnaGVzdFRhcmdldElkKTtcbiAgICAgICAgICAgIHJldHVybiBlLmhpZ2hlc3RUYXJnZXRJZCA9IG4ubmV4dCgpLCB0aGlzLmFlKHQsIGUpLm5leHQoKCgpID0+IGUuaGlnaGVzdFRhcmdldElkKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0TGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9lKHQpLm5leHQoKHQgPT4gY3QuZnJvbVRpbWVzdGFtcChuZXcgYXQodC5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uLnNlY29uZHMsIHQubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbi5uYW5vc2Vjb25kcykpKSk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9lKHQpLm5leHQoKHQgPT4gdC5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIpKTtcbiAgICB9XG4gICAgc2V0VGFyZ2V0c01ldGFkYXRhKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2UodCkubmV4dCgocyA9PiAocy5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBlLCBuICYmIChzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuLnRvVGltZXN0YW1wKCkpLCBcbiAgICAgICAgZSA+IHMuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyICYmIChzLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciA9IGUpLCB0aGlzLmFlKHQsIHMpKSkpO1xuICAgIH1cbiAgICBhZGRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2UodCwgZSkubmV4dCgoKCkgPT4gdGhpcy5vZSh0KS5uZXh0KChuID0+IChuLnRhcmdldENvdW50ICs9IDEsIHRoaXMudWUoZSwgbiksIFxuICAgICAgICB0aGlzLmFlKHQsIG4pKSkpKSk7XG4gICAgfVxuICAgIHVwZGF0ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZSh0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUudGFyZ2V0SWQpLm5leHQoKCgpID0+IE9pKHQpLmRlbGV0ZShlLnRhcmdldElkKSkpLm5leHQoKCgpID0+IHRoaXMub2UodCkpKS5uZXh0KChlID0+IChCKGUudGFyZ2V0Q291bnQgPiAwKSwgXG4gICAgICAgIGUudGFyZ2V0Q291bnQgLT0gMSwgdGhpcy5hZSh0LCBlKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcHMgYW55IHRhcmdldHMgd2l0aCBzZXF1ZW5jZSBudW1iZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB1cHBlciBib3VuZCwgZXhjZXB0aW5nIHRob3NlXG4gICAgICogcHJlc2VudCBpbiBgYWN0aXZlVGFyZ2V0SWRzYC4gRG9jdW1lbnQgYXNzb2NpYXRpb25zIGZvciB0aGUgcmVtb3ZlZCB0YXJnZXRzIGFyZSBhbHNvIHJlbW92ZWQuXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRhcmdldHMgcmVtb3ZlZC5cbiAgICAgKi8gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gT2kodCkuanQoKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gbWkobyk7XG4gICAgICAgICAgICBhLnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQoYS50YXJnZXRJZCkgJiYgKHMrKywgaS5wdXNoKHRoaXMucmVtb3ZlVGFyZ2V0RGF0YSh0LCBhKSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gR3Mud2FpdEZvcihpKSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggYFRhcmdldERhdGFgIHRoYXQgd2UgaGF2ZSBjYWNoZWQuXG4gICAgICovICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICByZXR1cm4gT2kodCkuanQoKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gbWkobik7XG4gICAgICAgICAgICBlKHMpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIG9lKHQpIHtcbiAgICAgICAgcmV0dXJuIE1pKHQpLmdldChMcy5rZXkpLm5leHQoKHQgPT4gKEIobnVsbCAhPT0gdCksIHQpKSk7XG4gICAgfVxuICAgIGFlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIE1pKHQpLnB1dChMcy5rZXksIGUpO1xuICAgIH1cbiAgICBjZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBPaSh0KS5wdXQoZ2kodGhpcy5rLCBlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluLXBsYWNlIHVwZGF0ZXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIHRvIGFjY291bnQgZm9yIHZhbHVlcyBpbiB0aGUgZ2l2ZW5cbiAgICAgKiBUYXJnZXREYXRhLiBTYXZpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5LiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2VyZSBhbnlcbiAgICAgKiBjaGFuZ2VzIHRvIHRoZSBtZXRhZGF0YS5cbiAgICAgKi8gICAgdWUodCwgZSkge1xuICAgICAgICBsZXQgbiA9ICExO1xuICAgICAgICByZXR1cm4gdC50YXJnZXRJZCA+IGUuaGlnaGVzdFRhcmdldElkICYmIChlLmhpZ2hlc3RUYXJnZXRJZCA9IHQudGFyZ2V0SWQsIG4gPSAhMCksIFxuICAgICAgICB0LnNlcXVlbmNlTnVtYmVyID4gZS5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgJiYgKGUuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyID0gdC5zZXF1ZW5jZU51bWJlciwgXG4gICAgICAgIG4gPSAhMCksIG47XG4gICAgfVxuICAgIGdldFRhcmdldENvdW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2UodCkubmV4dCgodCA9PiB0LnRhcmdldENvdW50KSk7XG4gICAgfVxuICAgIGdldFRhcmdldERhdGEodCwgZSkge1xuICAgICAgICAvLyBJdGVyYXRpbmcgYnkgdGhlIGNhbm9uaWNhbElkIG1heSB5aWVsZCBtb3JlIHRoYW4gb25lIHJlc3VsdCBiZWNhdXNlXG4gICAgICAgIC8vIGNhbm9uaWNhbElkIHZhbHVlcyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIHVuaXF1ZSBwZXIgdGFyZ2V0LiBUaGlzIHF1ZXJ5XG4gICAgICAgIC8vIGRlcGVuZHMgb24gdGhlIHF1ZXJ5VGFyZ2V0cyBpbmRleCB0byBiZSBlZmZpY2llbnQuXG4gICAgICAgIGNvbnN0IG4gPSBIdChlKSwgcyA9IElEQktleVJhbmdlLmJvdW5kKFsgbiwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIF0sIFsgbiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0pO1xuICAgICAgICBsZXQgaSA9IG51bGw7XG4gICAgICAgIHJldHVybiBPaSh0KS5qdCh7XG4gICAgICAgICAgICByYW5nZTogcyxcbiAgICAgICAgICAgIGluZGV4OiBPcy5xdWVyeVRhcmdldHNJbmRleE5hbWVcbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gbWkobik7XG4gICAgICAgICAgICAvLyBBZnRlciBmaW5kaW5nIGEgcG90ZW50aWFsIG1hdGNoLCBjaGVjayB0aGF0IHRoZSB0YXJnZXQgaXNcbiAgICAgICAgICAgIC8vIGFjdHVhbGx5IGVxdWFsIHRvIHRoZSByZXF1ZXN0ZWQgdGFyZ2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgWXQoZSwgci50YXJnZXQpICYmIChpID0gciwgcy5kb25lKCkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBhZGRNYXRjaGluZ0tleXModCwgZSwgbikge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFRoZSByZXZlcnNlIGluZGV4IChkb2N1bWVudHNUYXJnZXRzKSBpcyBtYWludGFpbmVkIGJ5XG4gICAgICAgIC8vIEluZGV4ZWREYi5cbiAgICAgICAgY29uc3QgcyA9IFtdLCBpID0gTGkodCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IFJzKGUucGF0aCk7XG4gICAgICAgICAgICBzLnB1c2goaS5wdXQobmV3IE1zKG4sIHIpKSksIHMucHVzaCh0aGlzLnJlZmVyZW5jZURlbGVnYXRlLmFkZFJlZmVyZW5jZSh0LCBuLCBlKSk7XG4gICAgICAgIH0pKSwgR3Mud2FpdEZvcihzKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBUaGUgcmV2ZXJzZSBpbmRleCAoZG9jdW1lbnRzVGFyZ2V0cykgaXMgbWFpbnRhaW5lZCBieVxuICAgICAgICAvLyBJbmRleGVkRGIuXG4gICAgICAgIGNvbnN0IHMgPSBMaSh0KTtcbiAgICAgICAgcmV0dXJuIEdzLmZvckVhY2goZSwgKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IFJzKGUucGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gR3Mud2FpdEZvcihbIHMuZGVsZXRlKFsgbiwgaSBdKSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5yZW1vdmVSZWZlcmVuY2UodCwgbiwgZSkgXSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gTGkodCksIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIGUgXSwgWyBlICsgMSBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBuLmRlbGV0ZShzKTtcbiAgICB9XG4gICAgZ2V0TWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlIF0sIFsgZSArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApLCBzID0gTGkodCk7XG4gICAgICAgIGxldCBpID0gU24oKTtcbiAgICAgICAgcmV0dXJuIHMuanQoe1xuICAgICAgICAgICAgcmFuZ2U6IG4sXG4gICAgICAgICAgICBLdDogITBcbiAgICAgICAgfSwgKCh0LCBlLCBuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdnModFsxXSksIHIgPSBuZXcgU3Qocyk7XG4gICAgICAgICAgICBpID0gaS5hZGQocik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIGNvbnRhaW5zS2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFJzKGUucGF0aCksIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIG4gXSwgWyBvdChuKSBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgcmV0dXJuIExpKHQpLmp0KHtcbiAgICAgICAgICAgIGluZGV4OiBNcy5kb2N1bWVudFRhcmdldHNJbmRleCxcbiAgICAgICAgICAgIEt0OiAhMCxcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgoW3QsIGVdLCBuLCBzKSA9PiB7XG4gICAgICAgICAgICAvLyBIYXZpbmcgYSBzZW50aW5lbCByb3cgZm9yIGEgZG9jdW1lbnQgZG9lcyBub3QgY291bnQgYXMgY29udGFpbmluZyB0aGF0IGRvY3VtZW50O1xuICAgICAgICAgICAgLy8gRm9yIHRoZSB0YXJnZXQgY2FjaGUsIGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50IG1lYW5zIHRoZSBkb2N1bWVudCBpcyBwYXJ0IG9mIHNvbWVcbiAgICAgICAgICAgIC8vIHRhcmdldC5cbiAgICAgICAgICAgIDAgIT09IHQgJiYgKGkrKywgcy5kb25lKCkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSA+IDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgYSBUYXJnZXREYXRhIGVudHJ5IGJ5IHRhcmdldCBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXRJZCAtIFRoZSB0YXJnZXQgSUQgb2YgdGhlIFRhcmdldERhdGEgZW50cnkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIFRhcmdldERhdGEgZW50cnksIG9yIG51bGwgaWYgdGhlIGNhY2hlIGhhcyBubyBlbnRyeSBmb3JcbiAgICAgKiB0aGUgdGFyZ2V0LlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgRXQodCwgZSkge1xuICAgICAgICByZXR1cm4gT2kodCkuZ2V0KGUpLm5leHQoKHQgPT4gdCA/IG1pKHQpIDogbnVsbCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIHF1ZXJpZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIE9pKHQpIHtcbiAgICByZXR1cm4gaWkodCwgT3Muc3RvcmUpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgdGFyZ2V0IGdsb2JhbHMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIE1pKHQpIHtcbiAgICByZXR1cm4gaWkodCwgTHMuc3RvcmUpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgZG9jdW1lbnQgdGFyZ2V0IG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBMaSh0KSB7XG4gICAgcmV0dXJuIGlpKHQsIE1zLnN0b3JlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVmVyaWZpZXMgdGhlIGVycm9yIHRocm93biBieSBhIExvY2FsU3RvcmUgb3BlcmF0aW9uLiBJZiBhIExvY2FsU3RvcmVcbiAqIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBwcmltYXJ5IGxlYXNlIGhhcyBiZWVuIHRha2VuIGJ5IGFub3RoZXIgY2xpZW50LFxuICogd2UgaWdub3JlIHRoZSBlcnJvciAodGhlIHBlcnNpc3RlbmNlIGxheWVyIHdpbGwgaW1tZWRpYXRlbHkgY2FsbFxuICogYGFwcGx5UHJpbWFyeUxlYXNlYCB0byBwcm9wYWdhdGUgdGhlIHByaW1hcnkgc3RhdGUgY2hhbmdlKS4gQWxsIG90aGVyIGVycm9yc1xuICogYXJlIHJlLXRocm93bi5cbiAqXG4gKiBAcGFyYW0gZXJyIC0gQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBMb2NhbFN0b3JlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHdlIHJlY292ZXJlZCwgb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICovIGFzeW5jIGZ1bmN0aW9uIEJpKHQpIHtcbiAgICBpZiAodC5jb2RlICE9PSBLLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5tZXNzYWdlICE9PSBRcykgdGhyb3cgdDtcbiAgICAkKFwiTG9jYWxTdG9yZVwiLCBcIlVuZXhwZWN0ZWRseSBsb3N0IHByaW1hcnkgbGVhc2VcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIFVpKFt0LCBlXSwgW24sIHNdKSB7XG4gICAgY29uc3QgaSA9IGl0KHQsIG4pO1xuICAgIHJldHVybiAwID09PSBpID8gaXQoZSwgcykgOiBpO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudGggc2VxdWVuY2UgbnVtYmVyLiBLZWVwcyBhIHJvbGxpbmcgYnVmZmVyIG9mIHRoZVxuICogbG93ZXN0IG4gdmFsdWVzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAsIGFuZCBmaW5hbGx5IHJlcG9ydHMgdGhlIGxhcmdlc3Qgb2ZcbiAqIHRoZW0gaW4gYG1heFZhbHVlYC5cbiAqLyBjbGFzcyBxaSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmhlID0gdCwgdGhpcy5idWZmZXIgPSBuZXcgVG4oVWkpLCB0aGlzLmxlID0gMDtcbiAgICB9XG4gICAgZmUoKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMubGU7XG4gICAgfVxuICAgIGRlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFsgdCwgdGhpcy5mZSgpIF07XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5zaXplIDwgdGhpcy5oZSkgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5hZGQoZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYnVmZmVyLmxhc3QoKTtcbiAgICAgICAgICAgIFVpKGUsIHQpIDwgMCAmJiAodGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5kZWxldGUodCkuYWRkKGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIC8vIEd1YXJhbnRlZWQgdG8gYmUgbm9uLWVtcHR5LiBJZiB3ZSBkZWNpZGUgd2UgYXJlIG5vdCBjb2xsZWN0aW5nIGFueVxuICAgICAgICAvLyBzZXF1ZW5jZSBudW1iZXJzLCBudGhTZXF1ZW5jZU51bWJlciBiZWxvdyBzaG9ydC1jaXJjdWl0cy4gSWYgd2UgaGF2ZVxuICAgICAgICAvLyBkZWNpZGVkIHRoYXQgd2UgYXJlIGNvbGxlY3RpbmcgbiBzZXF1ZW5jZSBudW1iZXJzLCBpdCdzIGJlY2F1c2UgbiBpcyBzb21lXG4gICAgICAgIC8vIHBlcmNlbnRhZ2Ugb2YgdGhlIGV4aXN0aW5nIHNlcXVlbmNlIG51bWJlcnMuIFRoYXQgbWVhbnMgd2Ugc2hvdWxkIG5ldmVyXG4gICAgICAgIC8vIGJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBjb2xsZWN0aW5nIHNlcXVlbmNlIG51bWJlcnMgYnV0IGRvbid0XG4gICAgICAgIC8vIGFjdHVhbGx5IGhhdmUgYW55LlxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIubGFzdCgpWzBdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2NoZWR1bGluZyBvZiBMUlUgZ2FyYmFnZSBjb2xsZWN0aW9uLiBJdCBoYW5kbGVzIGNoZWNraW5nXG4gKiB3aGV0aGVyIG9yIG5vdCBHQyBpcyBlbmFibGVkLCBhcyB3ZWxsIGFzIHdoaWNoIGRlbGF5IHRvIHVzZSBiZWZvcmUgdGhlIG5leHQgcnVuLlxuICovIGNsYXNzIEtpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RvciA9IHQsIHRoaXMuYXN5bmNRdWV1ZSA9IGUsIHRoaXMud2UgPSAhMSwgdGhpcy5fZSA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgLTEgIT09IHRoaXMuZ2FyYmFnZUNvbGxlY3Rvci5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCAmJiB0aGlzLm1lKHQpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLl9lICYmICh0aGlzLl9lLmNhbmNlbCgpLCB0aGlzLl9lID0gbnVsbCk7XG4gICAgfVxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5fZTtcbiAgICB9XG4gICAgbWUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy53ZSA/IDNlNSA6IDZlNDtcbiAgICAgICAgJChcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYEdhcmJhZ2UgY29sbGVjdGlvbiBzY2hlZHVsZWQgaW4gJHtlfW1zYCksIHRoaXMuX2UgPSB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFmdGVyRGVsYXkoXCJscnVfZ2FyYmFnZV9jb2xsZWN0aW9uXCIgLyogTHJ1R2FyYmFnZUNvbGxlY3Rpb24gKi8gLCBlLCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZSA9IG51bGwsIHRoaXMud2UgPSAhMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdC5jb2xsZWN0R2FyYmFnZSh0aGlzLmdhcmJhZ2VDb2xsZWN0b3IpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIFhzKHQpID8gJChcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgXCJJZ25vcmluZyBJbmRleGVkREIgZXJyb3IgZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbjogXCIsIHQpIDogYXdhaXQgQmkodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKiogSW1wbGVtZW50cyB0aGUgc3RlcHMgZm9yIExSVSBnYXJiYWdlIGNvbGxlY3Rpb24uICovIGNsYXNzIGppIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZ2UgPSB0LCB0aGlzLnBhcmFtcyA9IGU7XG4gICAgfVxuICAgIGNhbGN1bGF0ZVRhcmdldENvdW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2UueWUodCkubmV4dCgodCA9PiBNYXRoLmZsb29yKGUgLyAxMDAgKiB0KSkpO1xuICAgIH1cbiAgICBudGhTZXF1ZW5jZU51bWJlcih0LCBlKSB7XG4gICAgICAgIGlmICgwID09PSBlKSByZXR1cm4gR3MucmVzb2x2ZShldC5JKTtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBxaShlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2UuZm9yRWFjaFRhcmdldCh0LCAodCA9PiBuLmRlKHQuc2VxdWVuY2VOdW1iZXIpKSkubmV4dCgoKCkgPT4gdGhpcy5nZS5wZSh0LCAodCA9PiBuLmRlKHQpKSkpKS5uZXh0KCgoKSA9PiBuLm1heFZhbHVlKSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZS5yZW1vdmVUYXJnZXRzKHQsIGUsIG4pO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlLnJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzKHQsIGUpO1xuICAgIH1cbiAgICBjb2xsZWN0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIC0xID09PSB0aGlzLnBhcmFtcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID8gKCQoXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIFwiR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IGRpc2FibGVkXCIpLCBcbiAgICAgICAgR3MucmVzb2x2ZShiaSkpIDogdGhpcy5nZXRDYWNoZVNpemUodCkubmV4dCgobiA9PiBuIDwgdGhpcy5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZCA/ICgkKFwiTHJ1R2FyYmFnZUNvbGxlY3RvclwiLCBgR2FyYmFnZSBjb2xsZWN0aW9uIHNraXBwZWQ7IENhY2hlIHNpemUgJHtufSBpcyBsb3dlciB0aGFuIHRocmVzaG9sZCAke3RoaXMucGFyYW1zLmNhY2hlU2l6ZUNvbGxlY3Rpb25UaHJlc2hvbGR9YCksIFxuICAgICAgICBiaSkgOiB0aGlzLlRlKHQsIGUpKSk7XG4gICAgfVxuICAgIGdldENhY2hlU2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlLmdldENhY2hlU2l6ZSh0KTtcbiAgICB9XG4gICAgVGUodCwgZSkge1xuICAgICAgICBsZXQgbiwgcywgaSwgciwgbywgYywgdTtcbiAgICAgICAgY29uc3QgaCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVRhcmdldENvdW50KHQsIHRoaXMucGFyYW1zLnBlcmNlbnRpbGVUb0NvbGxlY3QpLm5leHQoKGUgPT4gKFxuICAgICAgICAvLyBDYXAgYXQgdGhlIGNvbmZpZ3VyZWQgbWF4XG4gICAgICAgIGUgPiB0aGlzLnBhcmFtcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID8gKCQoXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBDYXBwaW5nIHNlcXVlbmNlIG51bWJlcnMgdG8gY29sbGVjdCBkb3duIHRvIHRoZSBtYXhpbXVtIG9mICR7dGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdH0gZnJvbSAke2V9YCksIFxuICAgICAgICBzID0gdGhpcy5wYXJhbXMubWF4aW11bVNlcXVlbmNlTnVtYmVyc1RvQ29sbGVjdCkgOiBzID0gZSwgciA9IERhdGUubm93KCksIHRoaXMubnRoU2VxdWVuY2VOdW1iZXIodCwgcykpKSkubmV4dCgocyA9PiAobiA9IHMsIFxuICAgICAgICBvID0gRGF0ZS5ub3coKSwgdGhpcy5yZW1vdmVUYXJnZXRzKHQsIG4sIGUpKSkpLm5leHQoKGUgPT4gKGkgPSBlLCBjID0gRGF0ZS5ub3coKSwgXG4gICAgICAgIHRoaXMucmVtb3ZlT3JwaGFuZWREb2N1bWVudHModCwgbikpKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAodSA9IERhdGUubm93KCksIGsoKSA8PSBMb2dMZXZlbC5ERUJVRykge1xuICAgICAgICAgICAgICAgICQoXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBMUlUgR2FyYmFnZSBDb2xsZWN0aW9uXFxuXFx0Q291bnRlZCB0YXJnZXRzIGluICR7ciAtIGh9bXNcXG5cXHREZXRlcm1pbmVkIGxlYXN0IHJlY2VudGx5IHVzZWQgJHtzfSBpbiBgICsgKG8gLSByKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7aX0gdGFyZ2V0cyBpbiBgICsgKGMgLSBvKSArIFwibXNcXG5cIiArIGBcXHRSZW1vdmVkICR7dH0gZG9jdW1lbnRzIGluIGAgKyAodSAtIGMpICsgXCJtc1xcblwiICsgYFRvdGFsIER1cmF0aW9uOiAke3UgLSBofW1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gR3MucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZGlkUnVuOiAhMCxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcnNDb2xsZWN0ZWQ6IHMsXG4gICAgICAgICAgICAgICAgdGFyZ2V0c1JlbW92ZWQ6IGksXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzUmVtb3ZlZDogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogUHJvdmlkZXMgTFJVIGZ1bmN0aW9uYWxpdHkgZm9yIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS4gKi9cbmNsYXNzIFFpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZGIgPSB0LCB0aGlzLmdhcmJhZ2VDb2xsZWN0b3IgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGppKHQsIGUpO1xuICAgICAgICB9KHRoaXMsIGUpO1xuICAgIH1cbiAgICB5ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkVlKHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLmdldFRhcmdldENvdW50KHQpLm5leHQoKHQgPT4gZS5uZXh0KChlID0+IHQgKyBlKSkpKTtcbiAgICB9XG4gICAgRWUodCkge1xuICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLnBlKHQsICh0ID0+IHtcbiAgICAgICAgICAgIGUrKztcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkuZm9yRWFjaFRhcmdldCh0LCBlKTtcbiAgICB9XG4gICAgcGUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5JZSh0LCAoKHQsIG4pID0+IGUobikpKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIFdpKHQsIG4pO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gV2kodCwgbik7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnJlbW92ZVRhcmdldHModCwgZSwgbik7XG4gICAgfVxuICAgIG1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFdpKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd291bGQgcHJldmVudCB0aGlzIGRvY3VtZW50IGZyb20gYmVpbmcgZ2FyYmFnZVxuICAgICAqIGNvbGxlY3RlZCwgZ2l2ZW4gdGhhdCB0aGUgZG9jdW1lbnQgaW4gcXVlc3Rpb24gaXMgbm90IHByZXNlbnQgaW4gYW55XG4gICAgICogdGFyZ2V0cyBhbmQgaGFzIGEgc2VxdWVuY2UgbnVtYmVyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdXBwZXIgYm91bmQgZm9yXG4gICAgICogdGhlIGNvbGxlY3Rpb24gcnVuLlxuICAgICAqLyAgICBBZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBsZXQgbiA9ICExO1xuICAgICAgICAgICAgcmV0dXJuIHhpKHQpLlF0KChzID0+IENpKHQsIHMsIGUpLm5leHQoKHQgPT4gKHQgJiYgKG4gPSAhMCksIEdzLnJlc29sdmUoIXQpKSkpKSkubmV4dCgoKCkgPT4gbikpO1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRiLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKSwgcyA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLkllKHQsICgociwgbykgPT4ge1xuICAgICAgICAgICAgaWYgKG8gPD0gZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkFlKHQsIHIpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIFxuICAgICAgICAgICAgICAgICAgICAvLyBPdXIgc2l6ZSBhY2NvdW50aW5nIHJlcXVpcmVzIHVzIHRvIHJlYWQgYWxsIGRvY3VtZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrKywgbi5nZXRFbnRyeSh0LCByKS5uZXh0KCgoKSA9PiAobi5yZW1vdmVFbnRyeShyKSwgTGkodCkuZGVsZXRlKFsgMCwgUnMoci5wYXRoKSBdKSkpKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcy5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkubmV4dCgoKCkgPT4gR3Mud2FpdEZvcihzKSkpLm5leHQoKCgpID0+IG4uYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLndpdGhTZXF1ZW5jZU51bWJlcih0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkudXBkYXRlVGFyZ2V0RGF0YSh0LCBuKTtcbiAgICB9XG4gICAgdXBkYXRlTGltYm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBXaSh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiBmb3IgZWFjaCBkb2N1bWVudCBpbiB0aGUgY2FjaGUgdGhhdCBpcyAnb3JwaGFuZWQnLiBPcnBoYW5lZFxuICAgICAqIG1lYW5zIG5vdCBhIHBhcnQgb2YgYW55IHRhcmdldCwgc28gdGhlIG9ubHkgZW50cnkgaW4gdGhlIHRhcmdldC1kb2N1bWVudCBpbmRleCBmb3JcbiAgICAgKiB0aGF0IGRvY3VtZW50IHdpbGwgYmUgdGhlIHNlbnRpbmVsIHJvdyAodGFyZ2V0SWQgMCksIHdoaWNoIHdpbGwgYWxzbyBoYXZlIHRoZSBzZXF1ZW5jZVxuICAgICAqIG51bWJlciBmb3IgdGhlIGxhc3QgdGltZSB0aGUgZG9jdW1lbnQgd2FzIGFjY2Vzc2VkLlxuICAgICAqLyAgICBJZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBMaSh0KTtcbiAgICAgICAgbGV0IHMsIGkgPSBldC5JO1xuICAgICAgICByZXR1cm4gbi5qdCh7XG4gICAgICAgICAgICBpbmRleDogTXMuZG9jdW1lbnRUYXJnZXRzSW5kZXhcbiAgICAgICAgfSwgKChbdCwgbl0sIHtwYXRoOiByLCBzZXF1ZW5jZU51bWJlcjogb30pID0+IHtcbiAgICAgICAgICAgIDAgPT09IHQgPyAoXG4gICAgICAgICAgICAvLyBpZiBuZXh0VG9SZXBvcnQgaXMgdmFsaWQsIHJlcG9ydCBpdCwgdGhpcyBpcyBhIG5ldyBrZXkgc28gdGhlXG4gICAgICAgICAgICAvLyBsYXN0IG9uZSBtdXN0IG5vdCBiZSBhIG1lbWJlciBvZiBhbnkgdGFyZ2V0cy5cbiAgICAgICAgICAgIGkgIT09IGV0LkkgJiYgZShuZXcgU3QodnMocykpLCBpKSwgXG4gICAgICAgICAgICAvLyBzZXQgbmV4dFRvUmVwb3J0IHRvIGJlIHRoaXMgc2VxdWVuY2UgbnVtYmVyLiBJdCdzIHRoZSBuZXh0IG9uZSB3ZVxuICAgICAgICAgICAgLy8gbWlnaHQgcmVwb3J0LCBpZiB3ZSBkb24ndCBmaW5kIGFueSB0YXJnZXRzIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBzZXF1ZW5jZSBudW1iZXIgbXVzdCBiZSBkZWZpbmVkIHdoZW4gdGhlIHRhcmdldElkXG4gICAgICAgICAgICAvLyBpcyAwLlxuICAgICAgICAgICAgaSA9IG8sIHMgPSByKSA6IFxuICAgICAgICAgICAgLy8gc2V0IG5leHRUb1JlcG9ydCB0byBiZSBpbnZhbGlkLCB3ZSBrbm93IHdlIGRvbid0IG5lZWQgdG8gcmVwb3J0XG4gICAgICAgICAgICAvLyB0aGlzIG9uZSBzaW5jZSB3ZSBmb3VuZCBhIHRhcmdldCBmb3IgaXQuXG4gICAgICAgICAgICBpID0gZXQuSTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJlcG9ydCBzZXF1ZW5jZSBudW1iZXJzIGFmdGVyIGdldHRpbmcgdG8gdGhlIG5leHQga2V5LCB3ZVxuICAgICAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpZiB0aGUgbGFzdCBrZXkgd2UgaXRlcmF0ZWQgb3ZlciB3YXMgYW4gb3JwaGFuZWRcbiAgICAgICAgICAgIC8vIGRvY3VtZW50IGFuZCByZXBvcnQgaXQuXG4gICAgICAgICAgICBpICE9PSBldC5JICYmIGUobmV3IFN0KHZzKHMpKSwgaSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0Q2FjaGVTaXplKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIuZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpLmdldFNpemUodCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBXaSh0LCBlKSB7XG4gICAgcmV0dXJuIExpKHQpLnB1dChcbiAgICAvKipcbiAqIEByZXR1cm5zIEEgdmFsdWUgc3VpdGFibGUgZm9yIHdyaXRpbmcgYSBzZW50aW5lbCByb3cgaW4gdGhlIHRhcmdldC1kb2N1bWVudFxuICogc3RvcmUuXG4gKi9cbiAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTXMoMCwgUnModC5wYXRoKSwgZSk7XG4gICAgfShlLCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcikpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIG1hcCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgb2JqZWN0cyBhcyBrZXlzLiBPYmplY3RzIG11c3QgaGF2ZSBhblxuICogYXNzb2NpYXRlZCBlcXVhbHMgZnVuY3Rpb24gYW5kIG11c3QgYmUgaW1tdXRhYmxlLiBFbnRyaWVzIGluIHRoZSBtYXAgYXJlXG4gKiBzdG9yZWQgdG9nZXRoZXIgd2l0aCB0aGUga2V5IGJlaW5nIHByb2R1Y2VkIGZyb20gdGhlIG1hcEtleUZuLiBUaGlzIG1hcFxuICogYXV0b21hdGljYWxseSBoYW5kbGVzIGNvbGxpc2lvbnMgb2Yga2V5cy5cbiAqLyBjbGFzcyBHaSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLm1hcEtleUZuID0gdCwgdGhpcy5lcXVhbHNGbiA9IGUsIFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGlubmVyIG1hcCBmb3IgYSBrZXkvdmFsdWUgcGFpci4gRHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBjb2xsaXNpb25zIHdlXG4gICAgICAgICAqIGtlZXAgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCB3ZSBkbyBhIGxpbmVhciBzZWFyY2ggdGhyb3VnaCB0byBmaW5kIGFuIGFjdHVhbFxuICAgICAgICAgKiBtYXRjaC4gTm90ZSB0aGF0IGNvbGxpc2lvbnMgc2hvdWxkIGJlIHJhcmUsIHNvIHdlIHN0aWxsIGV4cGVjdCBuZWFyXG4gICAgICAgICAqIGNvbnN0YW50IHRpbWUgbG9va3VwcyBpbiBwcmFjdGljZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5uZXIgPSB7fTtcbiAgICB9XG4gICAgLyoqIEdldCBhIHZhbHVlIGZvciB0aGlzIGtleSwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5tYXBLZXlGbih0KSwgbiA9IHRoaXMuaW5uZXJbZV07XG4gICAgICAgIGlmICh2b2lkIDAgIT09IG4pIGZvciAoY29uc3QgW2UsIHNdIG9mIG4pIGlmICh0aGlzLmVxdWFsc0ZuKGUsIHQpKSByZXR1cm4gcztcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5nZXQodCk7XG4gICAgfVxuICAgIC8qKiBQdXQgdGhpcyBrZXkgYW5kIHZhbHVlIGluIHRoZSBtYXAuICovICAgIHNldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLm1hcEtleUZuKHQpLCBzID0gdGhpcy5pbm5lcltuXTtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gcykge1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBzLmxlbmd0aDsgbisrKSBpZiAodGhpcy5lcXVhbHNGbihzW25dWzBdLCB0KSkgcmV0dXJuIHZvaWQgKHNbbl0gPSBbIHQsIGUgXSk7XG4gICAgICAgICAgICBzLnB1c2goWyB0LCBlIF0pO1xuICAgICAgICB9IGVsc2UgdGhpcy5pbm5lcltuXSA9IFsgWyB0LCBlIF0gXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoaXMga2V5IGZyb20gdGhlIG1hcC4gUmV0dXJucyBhIGJvb2xlYW4gaWYgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm1hcEtleUZuKHQpLCBuID0gdGhpcy5pbm5lcltlXTtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gbikgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IG4ubGVuZ3RoOyBzKyspIGlmICh0aGlzLmVxdWFsc0ZuKG5bc11bMF0sIHQpKSByZXR1cm4gMSA9PT0gbi5sZW5ndGggPyBkZWxldGUgdGhpcy5pbm5lcltlXSA6IG4uc3BsaWNlKHMsIDEpLCBcbiAgICAgICAgITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIGh0KHRoaXMuaW5uZXIsICgoZSwgbikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZSwgc10gb2YgbikgdChlLCBzKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gbHQodGhpcy5pbm5lcik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgYnVmZmVyIG9mIGVudHJpZXMgdG8gYmUgd3JpdHRlbiB0byBhIFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKiBJdCBjYW4gYmUgdXNlZCB0byBiYXRjaCB1cCBhIHNldCBvZiBjaGFuZ2VzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNhY2hlLCBidXRcbiAqIGFkZGl0aW9uYWxseSBzdXBwb3J0cyByZWFkaW5nIGVudHJpZXMgYmFjayB3aXRoIHRoZSBgZ2V0RW50cnkoKWAgbWV0aG9kLFxuICogZmFsbGluZyBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIFJlbW90ZURvY3VtZW50Q2FjaGUgaWYgbm8gZW50cnkgaXNcbiAqIGJ1ZmZlcmVkLlxuICpcbiAqIEVudHJpZXMgYWRkZWQgdG8gdGhlIGNhY2hlICptdXN0KiBiZSByZWFkIGZpcnN0LiBUaGlzIGlzIHRvIGZhY2lsaXRhdGVcbiAqIGNhbGN1bGF0aW5nIHRoZSBzaXplIGRlbHRhIG9mIHRoZSBwZW5kaW5nIGNoYW5nZXMuXG4gKlxuICogUE9SVElORyBOT1RFOiBUaGlzIGNsYXNzIHdhcyBpbXBsZW1lbnRlZCB0aGVuIHJlbW92ZWQgZnJvbSBvdGhlciBwbGF0Zm9ybXMuXG4gKiBJZiBieXRlLWNvdW50aW5nIGVuZHMgdXAgYmVpbmcgbmVlZGVkIG9uIHRoZSBvdGhlciBwbGF0Zm9ybXMsIGNvbnNpZGVyXG4gKiBwb3J0aW5nIHRoaXMgY2xhc3MgYXMgcGFydCBvZiB0aGF0IGltcGxlbWVudGF0aW9uIHdvcmsuXG4gKi8gY2xhc3Mgemkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBBIG1hcHBpbmcgb2YgZG9jdW1lbnQga2V5IHRvIHRoZSBuZXcgY2FjaGUgZW50cnkgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAob3IgbnVsbCBpZiBhbnlcbiAgICAgICAgLy8gZXhpc3RpbmcgY2FjaGUgZW50cnkgc2hvdWxkIGJlIHJlbW92ZWQpLlxuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgR2koKHQgPT4gdC50b1N0cmluZygpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKSwgdGhpcy5jaGFuZ2VzQXBwbGllZCA9ICExO1xuICAgIH1cbiAgICBnZXRSZWFkVGltZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmNoYW5nZXMuZ2V0KHQpO1xuICAgICAgICByZXR1cm4gZSA/IGUucmVhZFRpbWUgOiBjdC5taW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVmZmVycyBhIGBSZW1vdGVEb2N1bWVudENhY2hlLmFkZEVudHJ5KClgIGNhbGwuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9ubHkgbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCB2aWFcbiAgICAgKiBgZ2V0RW50cnkoKS9nZXRFbnRyaWVzKClgIChlbmZvcmNlZCB2aWEgSW5kZXhlZERicyBgYXBwbHkoKWApLlxuICAgICAqLyAgICBhZGRFbnRyeSh0LCBlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQua2V5LCB7XG4gICAgICAgICAgICBkb2N1bWVudDogdCxcbiAgICAgICAgICAgIHJlYWRUaW1lOiBlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWZmZXJzIGEgYFJlbW90ZURvY3VtZW50Q2FjaGUucmVtb3ZlRW50cnkoKWAgY2FsbC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb25seSByZW1vdmUgZG9jdW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkIHZpYVxuICAgICAqIGBnZXRFbnRyeSgpL2dldEVudHJpZXMoKWAgKGVuZm9yY2VkIHZpYSBJbmRleGVkRGJzIGBhcHBseSgpYCkuXG4gICAgICovICAgIHJlbW92ZUVudHJ5KHQsIGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpLCB0aGlzLmNoYW5nZXMuc2V0KHQsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBXdC5uZXdJbnZhbGlkRG9jdW1lbnQodCksXG4gICAgICAgICAgICByZWFkVGltZTogZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgYW4gZW50cnkgaW4gdGhlIGNhY2hlLiBUaGUgYnVmZmVyZWQgY2hhbmdlcyB3aWxsIGZpcnN0IGJlIGNoZWNrZWQsXG4gICAgICogYW5kIGlmIG5vIGJ1ZmZlcmVkIGNoYW5nZSBhcHBsaWVzLCB0aGlzIHdpbGwgZm9yd2FyZCB0b1xuICAgICAqIGBSZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJ5KClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIHBlcmZvcm0gYW55IHBlcnNpc3RlbmNlXG4gICAgICogICAgIG9wZXJhdGlvbnMuXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5IC0gVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIGRvY3VtZW50IG9yIGFuIGludmFsaWQgZG9jdW1lbnQgaWYgd2UgaGF2ZSBub3RoaW5nXG4gICAgICogY2FjaGVkLlxuICAgICAqLyAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5jaGFuZ2VzLmdldChlKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gbiA/IEdzLnJlc29sdmUobi5kb2N1bWVudCkgOiB0aGlzLmdldEZyb21DYWNoZSh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgc2V2ZXJhbCBlbnRyaWVzIGluIHRoZSBjYWNoZSwgZm9yd2FyZGluZyB0b1xuICAgICAqIGBSZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJ5KClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIHBlcmZvcm0gYW55IHBlcnNpc3RlbmNlXG4gICAgICogICAgIG9wZXJhdGlvbnMuXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBlbnRyaWVzIHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgQSBtYXAgb2YgY2FjaGVkIGRvY3VtZW50cywgaW5kZXhlZCBieSBrZXkuIElmIGFuIGVudHJ5IGNhbm5vdCBiZVxuICAgICAqICAgICBmb3VuZCwgdGhlIGNvcnJlc3BvbmRpbmcga2V5IHdpbGwgYmUgbWFwcGVkIHRvIGFuIGludmFsaWQgZG9jdW1lbnQuXG4gICAgICovICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxGcm9tQ2FjaGUodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYnVmZmVyZWQgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBSZW1vdGVEb2N1bWVudENhY2hlLCB1c2luZ1xuICAgICAqIHRoZSBwcm92aWRlZCB0cmFuc2FjdGlvbi5cbiAgICAgKi8gICAgYXBwbHkodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnROb3RBcHBsaWVkKCksIHRoaXMuY2hhbmdlc0FwcGxpZWQgPSAhMCwgdGhpcy5hcHBseUNoYW5nZXModCk7XG4gICAgfVxuICAgIC8qKiBIZWxwZXIgdG8gYXNzZXJ0IHRoaXMuY2hhbmdlcyBpcyBub3QgbnVsbCAgKi8gICAgYXNzZXJ0Tm90QXBwbGllZCgpIHt9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBSZW1vdGVEb2N1bWVudENhY2hlIGZvciBJbmRleGVkRGIuIFRvIGNvbnN0cnVjdCwgaW52b2tlXG4gKiBgbmV3SW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZSgpYC5cbiAqLyBjbGFzcyBIaSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgZG9jdW1lbnQgc2VyaWFsaXplci5cbiAgICAgKiBAcGFyYW0gaW5kZXhNYW5hZ2VyIC0gVGhlIHF1ZXJ5IGluZGV4ZXMgdGhhdCBuZWVkIHRvIGJlIG1haW50YWluZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmsgPSB0LCB0aGlzLkp0ID0gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgc3VwcGxpZWQgZW50cmllcyB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYGFkZEVudHJ5YCBhcmUgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGUgUmVtb3RlRG9jdW1lbnRDaGFuZ2VCdWZmZXJcbiAgICAgKiByZXR1cm5lZCBieSBgbmV3Q2hhbmdlQnVmZmVyKClgIHRvIGVuc3VyZSBwcm9wZXIgYWNjb3VudGluZyBvZiBtZXRhZGF0YS5cbiAgICAgKi8gICAgYWRkRW50cnkodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gWGkodCkucHV0KFppKGUpLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGRvY3VtZW50IGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQWxsIGNhbGxzIG9mIGByZW1vdmVFbnRyeWAgIGFyZSByZXF1aXJlZCB0byBnbyB0aHJvdWdoIHRoZSBSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlclxuICAgICAqIHJldHVybmVkIGJ5IGBuZXdDaGFuZ2VCdWZmZXIoKWAgdG8gZW5zdXJlIHByb3BlciBhY2NvdW50aW5nIG9mIG1ldGFkYXRhLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBYaSh0KSwgcyA9IFppKGUpO1xuICAgICAgICByZXR1cm4gbi5kZWxldGUocyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2FjaGUgc2l6ZS5cbiAgICAgKlxuICAgICAqIENhbGxlcnMgdG8gYGFkZEVudHJ5KClgIGFuZCBgcmVtb3ZlRW50cnkoKWAgKm11c3QqIGNhbGwgdGhpcyBhZnRlcndhcmRzIHRvIHVwZGF0ZSB0aGVcbiAgICAgKiBjYWNoZSdzIG1ldGFkYXRhLlxuICAgICAqLyAgICB1cGRhdGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKHQpLm5leHQoKG4gPT4gKG4uYnl0ZVNpemUgKz0gZSwgdGhpcy5SZSh0LCBuKSkpKTtcbiAgICB9XG4gICAgZ2V0RW50cnkodCwgZSkge1xuICAgICAgICByZXR1cm4gWGkodCkuZ2V0KFppKGUpKS5uZXh0KCh0ID0+IHRoaXMuUGUoZSwgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgYW4gZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5IC0gVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIGRvY3VtZW50IGVudHJ5IGFuZCBpdHMgc2l6ZS5cbiAgICAgKi8gICAgYmUodCwgZSkge1xuICAgICAgICByZXR1cm4gWGkodCkuZ2V0KFppKGUpKS5uZXh0KCh0ID0+ICh7XG4gICAgICAgICAgICBkb2N1bWVudDogdGhpcy5QZShlLCB0KSxcbiAgICAgICAgICAgIHNpemU6IFNpKHQpXG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IEFuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZlKHQsIGUsICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuUGUodCwgZSk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgcyk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHNldmVyYWwgZW50cmllcyBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRLZXlzIC0gVGhlIHNldCBvZiBrZXlzIGVudHJpZXMgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBBIG1hcCBvZiBkb2N1bWVudHMgaW5kZXhlZCBieSBrZXkgYW5kIGEgbWFwIG9mIHNpemVzIGluZGV4ZWQgYnlcbiAgICAgKiAgICAga2V5ICh6ZXJvIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdCkuXG4gICAgICovICAgIFZlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBBbigpLCBzID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpO1xuICAgICAgICByZXR1cm4gdGhpcy52ZSh0LCBlLCAoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlBlKHQsIGUpO1xuICAgICAgICAgICAgbiA9IG4uaW5zZXJ0KHQsIGkpLCBzID0gcy5pbnNlcnQodCwgU2koZSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gKHtcbiAgICAgICAgICAgIGRvY3VtZW50czogbixcbiAgICAgICAgICAgIFNlOiBzXG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIHZlKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKGUuaXNFbXB0eSgpKSByZXR1cm4gR3MucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoZS5maXJzdCgpLnBhdGgudG9BcnJheSgpLCBlLmxhc3QoKS5wYXRoLnRvQXJyYXkoKSksIGkgPSBlLmdldEl0ZXJhdG9yKCk7XG4gICAgICAgIGxldCByID0gaS5nZXROZXh0KCk7XG4gICAgICAgIHJldHVybiBYaSh0KS5qdCh7XG4gICAgICAgICAgICByYW5nZTogc1xuICAgICAgICB9LCAoKHQsIGUsIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG8gPSBTdC5mcm9tU2VnbWVudHModCk7XG4gICAgICAgICAgICAvLyBHbyB0aHJvdWdoIGtleXMgbm90IGZvdW5kIGluIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ciAmJiBTdC5jb21wYXJhdG9yKHIsIG8pIDwgMDsgKSBuKHIsIG51bGwpLCByID0gaS5nZXROZXh0KCk7XG4gICAgICAgICAgICByICYmIHIuaXNFcXVhbChvKSAmJiAoXG4gICAgICAgICAgICAvLyBLZXkgZm91bmQgaW4gY2FjaGUuXG4gICAgICAgICAgICBuKHIsIGUpLCByID0gaS5oYXNOZXh0KCkgPyBpLmdldE5leHQoKSA6IG51bGwpLCBcbiAgICAgICAgICAgIC8vIFNraXAgdG8gdGhlIG5leHQga2V5IChpZiB0aGVyZSBpcyBvbmUpLlxuICAgICAgICAgICAgciA/IHMuTHQoci5wYXRoLnRvQXJyYXkoKSkgOiBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSBrZXlzIGFyZSBub3QgaW4gdGhlIGNhY2hlLiBPbmUgY2FzZSB3aGVyZSBgaXRlcmF0ZWBcbiAgICAgICAgICAgIC8vIGFib3ZlIHdvbid0IGdvIHRocm91Z2ggdGhlbSBpcyB3aGVuIHRoZSBjYWNoZSBpcyBlbXB0eS5cbiAgICAgICAgICAgIGZvciAoO3I7ICkgbihyLCBudWxsKSwgciA9IGkuaGFzTmV4dCgpID8gaS5nZXROZXh0KCkgOiBudWxsO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbikge1xuICAgICAgICBsZXQgcyA9IEFuKCk7XG4gICAgICAgIGNvbnN0IGkgPSBlLnBhdGgubGVuZ3RoICsgMSwgciA9IHt9O1xuICAgICAgICBpZiAobi5pc0VxdWFsKGN0Lm1pbigpKSkge1xuICAgICAgICAgICAgLy8gRG9jdW1lbnRzIGFyZSBvcmRlcmVkIGJ5IGtleSwgc28gd2UgY2FuIHVzZSBhIHByZWZpeCBzY2FuIHRvIG5hcnJvd1xuICAgICAgICAgICAgLy8gZG93biB0aGUgZG9jdW1lbnRzIHdlIG5lZWQgdG8gbWF0Y2ggdGhlIHF1ZXJ5IGFnYWluc3QuXG4gICAgICAgICAgICBjb25zdCB0ID0gZS5wYXRoLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIHIucmFuZ2UgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRXhlY3V0ZSBhbiBpbmRleC1mcmVlIHF1ZXJ5IGFuZCBmaWx0ZXIgYnkgcmVhZCB0aW1lLiBUaGlzIGlzIHNhZmVcbiAgICAgICAgICAgIC8vIHNpbmNlIGFsbCBkb2N1bWVudCBjaGFuZ2VzIHRvIHF1ZXJpZXMgdGhhdCBoYXZlIGFcbiAgICAgICAgICAgIC8vIGxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24gKGBzaW5jZVJlYWRUaW1lYCkgaGF2ZSBhIHJlYWQgdGltZSBzZXQuXG4gICAgICAgICAgICBjb25zdCB0ID0gZS5wYXRoLnRvQXJyYXkoKSwgcyA9IGxpKG4pO1xuICAgICAgICAgICAgci5yYW5nZSA9IElEQktleVJhbmdlLmxvd2VyQm91bmQoWyB0LCBzIF0sIFxuICAgICAgICAgICAgLyogb3Blbj0gKi8gITApLCByLmluZGV4ID0gJHMuY29sbGVjdGlvblJlYWRUaW1lSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFhpKHQpLmp0KHIsICgodCwgbiwgcikgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIHF1ZXJ5IGlzIGFjdHVhbGx5IHJldHVybmluZyBhbnkgcGF0aCB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBxdWVyeVxuICAgICAgICAgICAgLy8gcGF0aCBwcmVmaXggd2hpY2ggbWF5IGluY2x1ZGUgZG9jdW1lbnRzIGluIHN1YmNvbGxlY3Rpb25zLiBGb3JcbiAgICAgICAgICAgIC8vIGV4YW1wbGUsIGEgcXVlcnkgb24gJ3Jvb21zJyB3aWxsIHJldHVybiByb29tcy9hYmMvbWVzc2FnZXMveHl4IGJ1dCB3ZVxuICAgICAgICAgICAgLy8gc2hvdWxkbid0IG1hdGNoIGl0LiBGaXggdGhpcyBieSBkaXNjYXJkaW5nIHJvd3Mgd2l0aCBkb2N1bWVudCBrZXlzXG4gICAgICAgICAgICAvLyBtb3JlIHRoYW4gb25lIHNlZ21lbnQgbG9uZ2VyIHRoYW4gdGhlIHF1ZXJ5IHBhdGguXG4gICAgICAgICAgICBpZiAodC5sZW5ndGggIT09IGkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG8gPSB1aSh0aGlzLmssIG4pO1xuICAgICAgICAgICAgZS5wYXRoLmlzUHJlZml4T2Yoby5rZXkucGF0aCkgPyBTZShlLCBvKSAmJiAocyA9IHMuaW5zZXJ0KG8ua2V5LCBvKSkgOiByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgbmV3Q2hhbmdlQnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKaSh0aGlzLCAhIXQgJiYgdC50cmFja1JlbW92YWxzKTtcbiAgICB9XG4gICAgZ2V0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGFkYXRhKHQpLm5leHQoKHQgPT4gdC5ieXRlU2l6ZSkpO1xuICAgIH1cbiAgICBnZXRNZXRhZGF0YSh0KSB7XG4gICAgICAgIHJldHVybiBZaSh0KS5nZXQoRnMua2V5KS5uZXh0KCh0ID0+IChCKCEhdCksIHQpKSk7XG4gICAgfVxuICAgIFJlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFlpKHQpLnB1dChGcy5rZXksIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGByZW1vdGVEb2NgIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCAob3IgbnVsbCwgaWYgdGhlIGRvY3VtZW50XG4gICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGZvcm1hdCB1c2VkIGZvciBzZW50aW5lbCBkZWxldGVzKS5cbiAgICAgKi8gICAgUGUodCwgZSkge1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHVpKHRoaXMuaywgZSk7XG4gICAgICAgICAgICAvLyBXaGV0aGVyIHRoZSBkb2N1bWVudCBpcyBhIHNlbnRpbmVsIHJlbW92YWwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gdGhlXG4gICAgICAgICAgICAvLyBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0LmlzTm9Eb2N1bWVudCgpICYmIHQudmVyc2lvbi5pc0VxdWFsKGN0Lm1pbigpKSkpIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBXdC5uZXdJbnZhbGlkRG9jdW1lbnQodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAqXG4gKiBAcGFyYW0gc2VyaWFsaXplciAtIFRoZSBkb2N1bWVudCBzZXJpYWxpemVyLlxuICogQHBhcmFtIGluZGV4TWFuYWdlciAtIFRoZSBxdWVyeSBpbmRleGVzIHRoYXQgbmVlZCB0byBiZSBtYWludGFpbmVkLlxuICovXG4vKipcbiAqIEhhbmRsZXMgdGhlIGRldGFpbHMgb2YgYWRkaW5nIGFuZCB1cGRhdGluZyBkb2N1bWVudHMgaW4gdGhlIEluZGV4ZWREYlJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKlxuICogVW5saWtlIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlciwgdGhlIEluZGV4ZWREYiBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGUgc2l6ZVxuICogZGVsdGEgZm9yIGFsbCBzdWJtaXR0ZWQgY2hhbmdlcy4gVGhpcyBhdm9pZHMgaGF2aW5nIHRvIHJlLXJlYWQgYWxsIGRvY3VtZW50cyBmcm9tIEluZGV4ZWREYlxuICogd2hlbiB3ZSBhcHBseSB0aGUgY2hhbmdlcy5cbiAqL1xuY2xhc3MgSmkgZXh0ZW5kcyB6aSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGRvY3VtZW50Q2FjaGUgLSBUaGUgSW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZSB0byBhcHBseSB0aGUgY2hhbmdlcyB0by5cbiAgICAgKiBAcGFyYW0gdHJhY2tSZW1vdmFscyAtIFdoZXRoZXIgdG8gY3JlYXRlIHNlbnRpbmVsIGRlbGV0ZXMgdGhhdCBjYW4gYmUgdHJhY2tlZCBieVxuICAgICAqIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLkRlID0gdCwgdGhpcy50cmFja1JlbW92YWxzID0gZSwgXG4gICAgICAgIC8vIEEgbWFwIG9mIGRvY3VtZW50IHNpemVzIHByaW9yIHRvIGFwcGx5aW5nIHRoZSBjaGFuZ2VzIGluIHRoaXMgYnVmZmVyLlxuICAgICAgICB0aGlzLkNlID0gbmV3IEdpKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSk7XG4gICAgfVxuICAgIGFwcGx5Q2hhbmdlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgbGV0IG4gPSAwLCBzID0gbmV3IFRuKCgodCwgZSkgPT4gaXQodC5jYW5vbmljYWxTdHJpbmcoKSwgZS5jYW5vbmljYWxTdHJpbmcoKSkpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlcy5mb3JFYWNoKCgoaSwgcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IHRoaXMuQ2UuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKHIuZG9jdW1lbnQuaXNWYWxpZERvY3VtZW50KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gaGkodGhpcy5EZS5rLCByLmRvY3VtZW50LCB0aGlzLmdldFJlYWRUaW1lKGkpKTtcbiAgICAgICAgICAgICAgICBzID0gcy5hZGQoaS5wYXRoLnBvcExhc3QoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IFNpKGEpO1xuICAgICAgICAgICAgICAgIG4gKz0gYyAtIG8sIGUucHVzaCh0aGlzLkRlLmFkZEVudHJ5KHQsIGksIGEpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobiAtPSBvLCB0aGlzLnRyYWNrUmVtb3ZhbHMpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byB0cmFjayByZW1vdmFscywgd2Ugc3RvcmUgYSBcInNlbnRpbmVsIGRlbGV0ZVwiIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIFJlbW90ZURvY3VtZW50Q2FjaGUuIFRoaXMgZW50cnkgaXMgcmVwcmVzZW50ZWQgYnkgYSBOb0RvY3VtZW50XG4gICAgICAgICAgICAgICAgLy8gd2l0aCBhIHZlcnNpb24gb2YgMCBhbmQgaWdub3JlZCBieSBgbWF5YmVEZWNvZGVEb2N1bWVudCgpYCBidXRcbiAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZWQgaW4gYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYC5cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gaGkodGhpcy5EZS5rLCBXdC5uZXdOb0RvY3VtZW50KGksIGN0Lm1pbigpKSwgdGhpcy5nZXRSZWFkVGltZShpKSk7XG4gICAgICAgICAgICAgICAgZS5wdXNoKHRoaXMuRGUuYWRkRW50cnkodCwgaSwgbikpO1xuICAgICAgICAgICAgfSBlbHNlIGUucHVzaCh0aGlzLkRlLnJlbW92ZUVudHJ5KHQsIGkpKTtcbiAgICAgICAgfSkpLCBzLmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgZS5wdXNoKHRoaXMuRGUuSnQuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgbikpO1xuICAgICAgICB9KSksIGUucHVzaCh0aGlzLkRlLnVwZGF0ZU1ldGFkYXRhKHQsIG4pKSwgR3Mud2FpdEZvcihlKTtcbiAgICB9XG4gICAgZ2V0RnJvbUNhY2hlKHQsIGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSBzaXplIG9mIGV2ZXJ5dGhpbmcgd2UgbG9hZCBmcm9tIHRoZSBjYWNoZSBzbyB3ZSBjYW4gY29tcHV0ZSBhIGRlbHRhIGxhdGVyLlxuICAgICAgICByZXR1cm4gdGhpcy5EZS5iZSh0LCBlKS5uZXh0KCh0ID0+ICh0aGlzLkNlLnNldChlLCB0LnNpemUpLCB0LmRvY3VtZW50KSkpO1xuICAgIH1cbiAgICBnZXRBbGxGcm9tQ2FjaGUodCwgZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHNpemUgb2YgZXZlcnl0aGluZyB3ZSBsb2FkIGZyb20gdGhlIGNhY2hlIHNvIHdlIGNhbiBjb21wdXRlXG4gICAgICAgIC8vIGEgZGVsdGEgbGF0ZXIuXG4gICAgICAgIHJldHVybiB0aGlzLkRlLlZlKHQsIGUpLm5leHQoKCh7ZG9jdW1lbnRzOiB0LCBTZTogZX0pID0+IChcbiAgICAgICAgLy8gTm90ZTogYGdldEFsbEZyb21DYWNoZWAgcmV0dXJucyB0d28gbWFwcyBpbnN0ZWFkIG9mIGEgc2luZ2xlIG1hcCBmcm9tXG4gICAgICAgIC8vIGtleXMgdG8gYERvY3VtZW50U2l6ZUVudHJ5YHMuIFRoaXMgaXMgdG8gYWxsb3cgcmV0dXJuaW5nIHRoZVxuICAgICAgICAvLyBgTXV0YWJsZURvY3VtZW50TWFwYCBkaXJlY3RseSwgd2l0aG91dCBhIGNvbnZlcnNpb24uXG4gICAgICAgIGUuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ2Uuc2V0KHQsIGUpO1xuICAgICAgICB9KSksIHQpKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBZaSh0KSB7XG4gICAgcmV0dXJuIGlpKHQsIEZzLnN0b3JlKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIHJlbW90ZURvY3VtZW50cyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gWGkodCkge1xuICAgIHJldHVybiBpaSh0LCAkcy5zdG9yZSk7XG59XG5cbmZ1bmN0aW9uIFppKHQpIHtcbiAgICByZXR1cm4gdC5wYXRoLnRvQXJyYXkoKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBQZXJmb3JtcyBkYXRhYmFzZSBjcmVhdGlvbiBhbmQgc2NoZW1hIHVwZ3JhZGVzLiAqLyBjbGFzcyB0ciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmsgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBkYXRhYmFzZSBjcmVhdGlvbiBhbmQgc2NoZW1hIHVwZ3JhZGVzLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGluIHByb2R1Y3Rpb24sIHRoaXMgbWV0aG9kIGlzIG9ubHkgZXZlciB1c2VkIHRvIHVwZ3JhZGUgdGhlIHNjaGVtYVxuICAgICAqIHRvIFNDSEVNQV9WRVJTSU9OLiBEaWZmZXJlbnQgdmFsdWVzIG9mIHRvVmVyc2lvbiBhcmUgb25seSB1c2VkIGZvciB0ZXN0aW5nXG4gICAgICogYW5kIGxvY2FsIGZlYXR1cmUgZGV2ZWxvcG1lbnQuXG4gICAgICovICAgIE50KHQsIGUsIG4sIHMpIHtcbiAgICAgICAgQihuIDwgcyAmJiBuID49IDAgJiYgcyA8PSAxMSk7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgenMoXCJjcmVhdGVPclVwZ3JhZGVcIiwgZSk7XG4gICAgICAgIG4gPCAxICYmIHMgPj0gMSAmJiAoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShTcy5zdG9yZSk7XG4gICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoRHMuc3RvcmUsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBEcy5rZXlQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoQ3Muc3RvcmUsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBDcy5rZXlQYXRoLFxuICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6ICEwXG4gICAgICAgICAgICB9KS5jcmVhdGVJbmRleChDcy51c2VyTXV0YXRpb25zSW5kZXgsIENzLnVzZXJNdXRhdGlvbnNLZXlQYXRoLCB7XG4gICAgICAgICAgICAgICAgdW5pcXVlOiAhMFxuICAgICAgICAgICAgfSksIHQuY3JlYXRlT2JqZWN0U3RvcmUoTnMuc3RvcmUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogVXBncmFkZSBmdW5jdGlvbiB0byBtaWdyYXRlIHRoZSAnbXV0YXRpb25zJyBzdG9yZSBmcm9tIFYxIHRvIFYzLiBMb2Fkc1xuICogYW5kIHJld3JpdGVzIGFsbCBkYXRhLlxuICovICh0KSwgZXIodCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoJHMuc3RvcmUpO1xuICAgICAgICB9KHQpKTtcbiAgICAgICAgLy8gTWlncmF0aW9uIDIgdG8gcG9wdWxhdGUgdGhlIHRhcmdldEdsb2JhbCBvYmplY3Qgbm8gbG9uZ2VyIG5lZWRlZCBzaW5jZVxuICAgICAgICAvLyBtaWdyYXRpb24gMyB1bmNvbmRpdGlvbmFsbHkgY2xlYXJzIGl0LlxuICAgICAgICAgICAgICAgIGxldCByID0gR3MucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm4gbiA8IDMgJiYgcyA+PSAzICYmIChcbiAgICAgICAgLy8gQnJhbmQgbmV3IGNsaWVudHMgZG9uJ3QgbmVlZCB0byBkcm9wIGFuZCByZWNyZWF0ZS0tb25seSBjbGllbnRzIHRoYXRcbiAgICAgICAgLy8gcG90ZW50aWFsbHkgaGF2ZSBjb3JydXB0IGRhdGEuXG4gICAgICAgIDAgIT09IG4gJiYgKCFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmRlbGV0ZU9iamVjdFN0b3JlKE1zLnN0b3JlKSwgdC5kZWxldGVPYmplY3RTdG9yZShPcy5zdG9yZSksIHQuZGVsZXRlT2JqZWN0U3RvcmUoTHMuc3RvcmUpO1xuICAgICAgICB9KHQpLCBlcih0KSksIHIgPSByLm5leHQoKCgpID0+IFxuICAgICAgICAvKipcbiAqIENyZWF0ZXMgdGhlIHRhcmdldCBnbG9iYWwgc2luZ2xldG9uIHJvdy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVGhlIHZlcnNpb24gdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgaW5kZXhlZGRiXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoTHMuc3RvcmUpLCBuID0gbmV3IExzKFxuICAgICAgICAgICAgLypoaWdoZXN0VGFyZ2V0SWQ9Ki8gMCwgXG4gICAgICAgICAgICAvKmxhc3RMaXN0ZW5TZXF1ZW5jZU51bWJlcj0qLyAwLCBjdC5taW4oKS50b1RpbWVzdGFtcCgpLCBcbiAgICAgICAgICAgIC8qdGFyZ2V0Q291bnQ9Ki8gMCk7XG4gICAgICAgICAgICByZXR1cm4gZS5wdXQoTHMua2V5LCBuKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIENyZWF0ZXMgaW5kaWNlcyBvbiB0aGUgUmVtb3RlRG9jdW1lbnRzIHN0b3JlIHVzZWQgZm9yIGJvdGggbXVsdGktdGFiXG4gKiBhbmQgSW5kZXgtRnJlZSBxdWVyaWVzLlxuICovIChpKSkpKSwgbiA8IDQgJiYgcyA+PSA0ICYmICgwICE9PSBuICYmIChcbiAgICAgICAgLy8gU2NoZW1hIHZlcnNpb24gMyB1c2VzIGF1dG8tZ2VuZXJhdGVkIGtleXMgdG8gZ2VuZXJhdGUgZ2xvYmFsbHkgdW5pcXVlXG4gICAgICAgIC8vIG11dGF0aW9uIGJhdGNoIElEcyAodGhpcyB3YXMgcHJldmlvdXNseSBlbnN1cmVkIGludGVybmFsbHkgYnkgdGhlXG4gICAgICAgIC8vIGNsaWVudCkuIFRvIG1pZ3JhdGUgdG8gdGhlIG5ldyBzY2hlbWEsIHdlIGhhdmUgdG8gcmVhZCBhbGwgbXV0YXRpb25zXG4gICAgICAgIC8vIGFuZCB3cml0ZSB0aGVtIGJhY2sgb3V0LiBXZSBwcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgYmF0Y2ggSURzIHRvIGd1YXJhbnRlZVxuICAgICAgICAvLyBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIG9iamVjdCBzdG9yZXMuIEFueSBmdXJ0aGVyIG11dGF0aW9uIGJhdGNoIElEcyB3aWxsXG4gICAgICAgIC8vIGJlIGF1dG8tZ2VuZXJhdGVkLlxuICAgICAgICByID0gci5uZXh0KCgoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZS5zdG9yZShDcy5zdG9yZSkuQnQoKS5uZXh0KChuID0+IHtcbiAgICAgICAgICAgICAgICB0LmRlbGV0ZU9iamVjdFN0b3JlKENzLnN0b3JlKTtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKENzLnN0b3JlLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IENzLmtleVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6ICEwXG4gICAgICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoQ3MudXNlck11dGF0aW9uc0luZGV4LCBDcy51c2VyTXV0YXRpb25zS2V5UGF0aCwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUuc3RvcmUoQ3Muc3RvcmUpLCBpID0gbi5tYXAoKHQgPT4gcy5wdXQodCkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gR3Mud2FpdEZvcihpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSh0LCBpKSkpKSwgciA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFVzLnN0b3JlLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFVzLmtleVBhdGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIG4gPCA1ICYmIHMgPj0gNSAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy5OZShpKSkpKSwgbiA8IDYgJiYgcyA+PSA2ICYmIChyID0gci5uZXh0KCgoKSA9PiAoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShGcy5zdG9yZSk7XG4gICAgICAgIH0odCksIHRoaXMua2UoaSkpKSkpLCBuIDwgNyAmJiBzID49IDcgJiYgKHIgPSByLm5leHQoKCgpID0+IHRoaXMueGUoaSkpKSksIG4gPCA4ICYmIHMgPj0gOCAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy4kZSh0LCBpKSkpKSwgXG4gICAgICAgIG4gPCA5ICYmIHMgPj0gOSAmJiAociA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTXVsdGktVGFiIHVzZWQgdG8gbWFuYWdlIGl0cyBvd24gY2hhbmdlbG9nLCBidXQgdGhpcyBoYXMgYmVlbiBtb3ZlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIERiUmVtb3RlRG9jdW1lbnQgb2JqZWN0IHN0b3JlIGl0c2VsZi4gU2luY2UgdGhlIHByZXZpb3VzIGNoYW5nZVxuICAgICAgICAgICAgLy8gbG9nIG9ubHkgY29udGFpbmVkIHRyYW5zaWVudCBkYXRhLCB3ZSBjYW4gZHJvcCBpdHMgb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0Lm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoXCJyZW1vdGVEb2N1bWVudENoYW5nZXNcIikgJiYgdC5kZWxldGVPYmplY3RTdG9yZShcInJlbW90ZURvY3VtZW50Q2hhbmdlc1wiKTtcbiAgICAgICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5vYmplY3RTdG9yZSgkcy5zdG9yZSk7XG4gICAgICAgICAgICAgICAgZS5jcmVhdGVJbmRleCgkcy5yZWFkVGltZUluZGV4LCAkcy5yZWFkVGltZUluZGV4UGF0aCwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSksIGUuY3JlYXRlSW5kZXgoJHMuY29sbGVjdGlvblJlYWRUaW1lSW5kZXgsICRzLmNvbGxlY3Rpb25SZWFkVGltZUluZGV4UGF0aCwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KGUpO1xuICAgICAgICB9KSkpLCBuIDwgMTAgJiYgcyA+PSAxMCAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy5GZShpKSkpKSwgbiA8IDExICYmIHMgPj0gMTEgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShxcy5zdG9yZSwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBxcy5rZXlQYXRoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KHQpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShLcy5zdG9yZSwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBLcy5rZXlQYXRoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodCk7XG4gICAgICAgIH0pKSksIHI7XG4gICAgfVxuICAgIGtlKHQpIHtcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICByZXR1cm4gdC5zdG9yZSgkcy5zdG9yZSkuanQoKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICBlICs9IFNpKG4pO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBGcyhlKTtcbiAgICAgICAgICAgIHJldHVybiB0LnN0b3JlKEZzLnN0b3JlKS5wdXQoRnMua2V5LCBuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBOZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKERzLnN0b3JlKSwgbiA9IHQuc3RvcmUoQ3Muc3RvcmUpO1xuICAgICAgICByZXR1cm4gZS5CdCgpLm5leHQoKGUgPT4gR3MuZm9yRWFjaChlLCAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlLnVzZXJJZCwgLTEgXSwgWyBlLnVzZXJJZCwgZS5sYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZCBdKTtcbiAgICAgICAgICAgIHJldHVybiBuLkJ0KENzLnVzZXJNdXRhdGlvbnNJbmRleCwgcykubmV4dCgobiA9PiBHcy5mb3JFYWNoKG4sIChuID0+IHtcbiAgICAgICAgICAgICAgICBCKG4udXNlcklkID09PSBlLnVzZXJJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IF9pKHRoaXMuaywgbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFZpKHQsIGUudXNlcklkLCBzKS5uZXh0KCgoKSA9PiB7fSkpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgIH0pKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIHRoYXQgZXZlcnkgZG9jdW1lbnQgaW4gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZSBoYXMgYSBjb3JyZXNwb25kaW5nIHNlbnRpbmVsIHJvd1xuICAgICAqIHdpdGggYSBzZXF1ZW5jZSBudW1iZXIuIE1pc3Npbmcgcm93cyBhcmUgZ2l2ZW4gdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBzZXF1ZW5jZSBudW1iZXIuXG4gICAgICovICAgIHhlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoTXMuc3RvcmUpLCBuID0gdC5zdG9yZSgkcy5zdG9yZSk7XG4gICAgICAgIHJldHVybiB0LnN0b3JlKExzLnN0b3JlKS5nZXQoTHMua2V5KS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiBuLmp0KCgobiwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuZXcgZHQobiksIG8gPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbIDAsIFJzKHQpIF07XG4gICAgICAgICAgICAgICAgfShyKTtcbiAgICAgICAgICAgICAgICBzLnB1c2goZS5nZXQobykubmV4dCgobiA9PiBuID8gR3MucmVzb2x2ZSgpIDogKG4gPT4gZS5wdXQobmV3IE1zKDAsIFJzKG4pLCB0LmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlcikpKShyKSkpKTtcbiAgICAgICAgICAgIH0pKS5uZXh0KCgoKSA9PiBHcy53YWl0Rm9yKHMpKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgJGUodCwgZSkge1xuICAgICAgICAvLyBDcmVhdGUgdGhlIGluZGV4LlxuICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKEJzLnN0b3JlLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiBCcy5rZXlQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuID0gZS5zdG9yZShCcy5zdG9yZSksIHMgPSBuZXcgQWksIGkgPSB0ID0+IHtcbiAgICAgICAgICAgIGlmIChzLmFkZCh0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0Lmxhc3RTZWdtZW50KCksIHMgPSB0LnBvcExhc3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5wdXQoe1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogUnMocylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGVscGVyIHRvIGFkZCBhbiBpbmRleCBlbnRyeSBpZmYgd2UgaGF2ZW4ndCBhbHJlYWR5IHdyaXR0ZW4gaXQuXG4gICAgICAgICAgICAgICAgLy8gSW5kZXggZXhpc3RpbmcgcmVtb3RlIGRvY3VtZW50cy5cbiAgICAgICAgcmV0dXJuIGUuc3RvcmUoJHMuc3RvcmUpLmp0KHtcbiAgICAgICAgICAgIEt0OiAhMFxuICAgICAgICB9LCAoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgZHQodCk7XG4gICAgICAgICAgICByZXR1cm4gaShuLnBvcExhc3QoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBlLnN0b3JlKE5zLnN0b3JlKS5qdCh7XG4gICAgICAgICAgICBLdDogITBcbiAgICAgICAgfSwgKChbdCwgZSwgbl0sIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB2cyhlKTtcbiAgICAgICAgICAgIHJldHVybiBpKHIucG9wTGFzdCgpKTtcbiAgICAgICAgfSkpKSk7XG4gICAgfVxuICAgIEZlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoT3Muc3RvcmUpO1xuICAgICAgICByZXR1cm4gZS5qdCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBtaShuKSwgaSA9IGdpKHRoaXMuaywgcyk7XG4gICAgICAgICAgICByZXR1cm4gZS5wdXQoaSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVyKHQpIHtcbiAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKE1zLnN0b3JlLCB7XG4gICAgICAgIGtleVBhdGg6IE1zLmtleVBhdGhcbiAgICB9KS5jcmVhdGVJbmRleChNcy5kb2N1bWVudFRhcmdldHNJbmRleCwgTXMuZG9jdW1lbnRUYXJnZXRzS2V5UGF0aCwge1xuICAgICAgICB1bmlxdWU6ICEwXG4gICAgfSk7XG4gICAgLy8gTk9URTogVGhpcyBpcyB1bmlxdWUgb25seSBiZWNhdXNlIHRoZSBUYXJnZXRJZCBpcyB0aGUgc3VmZml4LlxuICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoT3Muc3RvcmUsIHtcbiAgICAgICAga2V5UGF0aDogT3Mua2V5UGF0aFxuICAgIH0pLmNyZWF0ZUluZGV4KE9zLnF1ZXJ5VGFyZ2V0c0luZGV4TmFtZSwgT3MucXVlcnlUYXJnZXRzS2V5UGF0aCwge1xuICAgICAgICB1bmlxdWU6ICEwXG4gICAgfSksIHQuY3JlYXRlT2JqZWN0U3RvcmUoTHMuc3RvcmUpO1xufVxuXG5jb25zdCBuciA9IFwiRmFpbGVkIHRvIG9idGFpbiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVG8gYWxsb3cgc2hhcmVkIGFjY2VzcywgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbiBoYXMgdG8gYmUgZW5hYmxlZCBpbiBhbGwgdGFicy4gSWYgeW91IGFyZSB1c2luZyBgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWI6dHJ1ZWAsIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIHRhYiBoYXMgcGVyc2lzdGVuY2UgZW5hYmxlZCBhdCBhbnkgZ2l2ZW4gdGltZS5cIjtcblxuLyoqXG4gKiBPbGRlc3QgYWNjZXB0YWJsZSBhZ2UgaW4gbWlsbGlzZWNvbmRzIGZvciBjbGllbnQgbWV0YWRhdGEgYmVmb3JlIHRoZSBjbGllbnRcbiAqIGlzIGNvbnNpZGVyZWQgaW5hY3RpdmUgYW5kIGl0cyBhc3NvY2lhdGVkIGRhdGEgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKi9cbi8qKlxuICogQW4gSW5kZXhlZERCLWJhY2tlZCBpbnN0YW5jZSBvZiBQZXJzaXN0ZW5jZS4gRGF0YSBpcyBzdG9yZWQgcGVyc2lzdGVudGx5XG4gKiBhY3Jvc3Mgc2Vzc2lvbnMuXG4gKlxuICogT24gV2ViIG9ubHksIHRoZSBGaXJlc3RvcmUgU0RLcyBzdXBwb3J0IHNoYXJlZCBhY2Nlc3MgdG8gaXRzIHBlcnNpc3RlbmNlXG4gKiBsYXllci4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgYnJvd3NlciB0YWJzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIEluZGV4ZWREYiBhbmRcbiAqIHRvIHN5bmNocm9uaXplIHN0YXRlIGV2ZW4gd2l0aG91dCBuZXR3b3JrIGNvbm5lY3Rpdml0eS4gU2hhcmVkIGFjY2VzcyBpc1xuICogY3VycmVudGx5IG9wdGlvbmFsIGFuZCBub3QgZW5hYmxlZCB1bmxlc3MgYWxsIGNsaWVudHMgaW52b2tlXG4gKiBgZW5hYmxlUGVyc2lzdGVuY2UoKWAgd2l0aCBge3N5bmNocm9uaXplVGFiczp0cnVlfWAuXG4gKlxuICogSW4gbXVsdGktdGFiIG1vZGUsIGlmIG11bHRpcGxlIGNsaWVudHMgYXJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgU0RLXG4gKiB3aWxsIGRlc2lnbmF0ZSBvbmUgY2xpZW50IGFzIHRoZSDigJxwcmltYXJ5IGNsaWVudOKAnS4gQW4gZWZmb3J0IGlzIG1hZGUgdG8gcGlja1xuICogYSB2aXNpYmxlLCBuZXR3b3JrLWNvbm5lY3RlZCBhbmQgYWN0aXZlIGNsaWVudCwgYW5kIHRoaXMgY2xpZW50IGlzXG4gKiByZXNwb25zaWJsZSBmb3IgbGV0dGluZyBvdGhlciBjbGllbnRzIGtub3cgYWJvdXQgaXRzIHByZXNlbmNlLiBUaGUgcHJpbWFyeVxuICogY2xpZW50IHdyaXRlcyBhIHVuaXF1ZSBjbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIgKHRoZSBjbGllbnQgSUQpIHRvXG4gKiBJbmRleGVkRGLigJlzIOKAnG93bmVy4oCdIHN0b3JlIGV2ZXJ5IDQgc2Vjb25kcy4gSWYgdGhlIHByaW1hcnkgY2xpZW50IGZhaWxzIHRvXG4gKiB1cGRhdGUgdGhpcyBlbnRyeSwgYW5vdGhlciBjbGllbnQgY2FuIGFjcXVpcmUgdGhlIGxlYXNlIGFuZCB0YWtlIG92ZXIgYXNcbiAqIHByaW1hcnkuXG4gKlxuICogU29tZSBwZXJzaXN0ZW5jZSBvcGVyYXRpb25zIGluIHRoZSBTREsgYXJlIGRlc2lnbmF0ZWQgYXMgcHJpbWFyeS1jbGllbnQgb25seVxuICogb3BlcmF0aW9ucy4gVGhpcyBpbmNsdWRlcyB0aGUgYWNrbm93bGVkZ21lbnQgb2YgbXV0YXRpb25zIGFuZCBhbGwgdXBkYXRlcyBvZlxuICogcmVtb3RlIGRvY3VtZW50cy4gVGhlIGVmZmVjdHMgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgd3JpdHRlbiB0byBwZXJzaXN0ZW5jZVxuICogYW5kIHRoZW4gYnJvYWRjYXN0IHRvIG90aGVyIHRhYnMgdmlhIExvY2FsU3RvcmFnZSAoc2VlXG4gKiBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCksIHdoaWNoIHRoZW4gcmVmcmVzaCB0aGVpciBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS5cbiAqXG4gKiBTaW1pbGFybHksIHRoZSBwcmltYXJ5IGNsaWVudCBsaXN0ZW5zIHRvIG5vdGlmaWNhdGlvbnMgc2VudCBieSBzZWNvbmRhcnlcbiAqIGNsaWVudHMgdG8gZGlzY292ZXIgcGVyc2lzdGVuY2UgY2hhbmdlcyB3cml0dGVuIGJ5IHNlY29uZGFyeSBjbGllbnRzLCBzdWNoIGFzXG4gKiB0aGUgYWRkaXRpb24gb2YgbmV3IG11dGF0aW9ucyBhbmQgcXVlcnkgdGFyZ2V0cy5cbiAqXG4gKiBJZiBtdWx0aS10YWIgaXMgbm90IGVuYWJsZWQgYW5kIGFub3RoZXIgdGFiIGFscmVhZHkgb2J0YWluZWQgdGhlIHByaW1hcnlcbiAqIGxlYXNlLCBJbmRleGVkRGJQZXJzaXN0ZW5jZSBlbnRlcnMgYSBmYWlsZWQgc3RhdGUgYW5kIGFsbCBzdWJzZXF1ZW50XG4gKiBvcGVyYXRpb25zIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2hlbiBhIHRhYiBpcyBjbG9zZWQsIHRoZVxuICogcHJpbWFyeSBsZWFzZSBpcyByZWxlYXNlZCBpbW1lZGlhdGVseSAodGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byBtYWtlXG4gKiBzdXJlIHRoYXQgYSByZWZyZXNoZWQgdGFiIGlzIGFibGUgdG8gaW1tZWRpYXRlbHkgcmUtYWNxdWlyZSB0aGUgcHJpbWFyeVxuICogbGVhc2UpLiBVbmZvcnR1bmF0ZWx5LCBJbmRleGVkREIgY2Fubm90IGJlIHJlbGlhYmx5IHVzZWQgaW4gd2luZG93LnVubG9hZFxuICogc2luY2UgaXQgaXMgYW4gYXN5bmNocm9ub3VzIEFQSS4gU28gaW4gYWRkaXRpb24gdG8gYXR0ZW1wdGluZyB0byBnaXZlIHVwIHRoZVxuICogbGVhc2UsIHRoZSBsZWFzZWhvbGRlciB3cml0ZXMgaXRzIGNsaWVudCBJRCB0byBhIFwiem9tYmllZENsaWVudFwiIGVudHJ5IGluXG4gKiBMb2NhbFN0b3JhZ2Ugd2hpY2ggYWN0cyBhcyBhbiBpbmRpY2F0b3IgdGhhdCBhbm90aGVyIHRhYiBzaG91bGQgZ28gYWhlYWQgYW5kXG4gKiB0YWtlIHRoZSBwcmltYXJ5IGxlYXNlIGltbWVkaWF0ZWx5IHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgbGVhc2UgdGltZXN0YW1wLlxuICpcbiAqIFRPRE8oYi8xMTQyMjYyMzQpOiBSZW1vdmUgYHN5bmNocm9uaXplVGFic2Agc2VjdGlvbiB3aGVuIG11bHRpLXRhYiBpcyBub1xuICogbG9uZ2VyIG9wdGlvbmFsLlxuICovXG5jbGFzcyBzciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBzeW5jaHJvbml6ZSB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIG11bHRpcGxlIHRhYnMgYW5kIHNoYXJlXG4gICAgICogYWNjZXNzIHRvIGxvY2FsIHBlcnNpc3RlbmNlLlxuICAgICAqL1xuICAgIHQsIGUsIG4sIHMsIGksIHIsIG8sIGEsIGMsIFxuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlLCBmb3JjZWZ1bGx5IG9idGFpbnMgZGF0YWJhc2UgYWNjZXNzLiBFeGlzdGluZyB0YWJzIHdpbGxcbiAgICAgKiBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3MgSW5kZXhlZERCLlxuICAgICAqL1xuICAgIHUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dUYWJTeW5jaHJvbml6YXRpb24gPSB0LCB0aGlzLnBlcnNpc3RlbmNlS2V5ID0gZSwgdGhpcy5jbGllbnRJZCA9IG4sIFxuICAgICAgICB0aGlzLk9lID0gaSwgdGhpcy53aW5kb3cgPSByLCB0aGlzLmRvY3VtZW50ID0gbywgdGhpcy5NZSA9IGMsIHRoaXMuTGUgPSB1LCB0aGlzLkJlID0gbnVsbCwgXG4gICAgICAgIHRoaXMuVWUgPSAhMSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5uZXR3b3JrRW5hYmxlZCA9ICEwLCBcbiAgICAgICAgLyoqIE91ciB3aW5kb3cudW5sb2FkIGhhbmRsZXIsIGlmIHJlZ2lzdGVyZWQuICovXG4gICAgICAgIHRoaXMucWUgPSBudWxsLCB0aGlzLmluRm9yZWdyb3VuZCA9ICExLCBcbiAgICAgICAgLyoqIE91ciAndmlzaWJpbGl0eWNoYW5nZScgbGlzdGVuZXIgaWYgcmVnaXN0ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5LZSA9IG51bGwsIFxuICAgICAgICAvKiogVGhlIGNsaWVudCBtZXRhZGF0YSByZWZyZXNoIHRhc2suICovXG4gICAgICAgIHRoaXMuamUgPSBudWxsLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IHRpbWUgd2UgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhlIGNsaWVudCBtZXRhZGF0YSBvYmplY3Qgc3RvcmUuICovXG4gICAgICAgIHRoaXMuUWUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIFxuICAgICAgICAvKiogQSBsaXN0ZW5lciB0byBub3RpZnkgb24gcHJpbWFyeSBzdGF0ZSBjaGFuZ2VzLiAqL1xuICAgICAgICB0aGlzLldlID0gdCA9PiBQcm9taXNlLnJlc29sdmUoKSwgIXNyLmJ0KCkpIHRocm93IG5ldyBqKEsuVU5JTVBMRU1FTlRFRCwgXCJUaGlzIHBsYXRmb3JtIGlzIGVpdGhlciBtaXNzaW5nIEluZGV4ZWREQiBvciBpcyBrbm93biB0byBoYXZlIGFuIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24uIE9mZmxpbmUgcGVyc2lzdGVuY2UgaGFzIGJlZW4gZGlzYWJsZWQuXCIpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZURlbGVnYXRlID0gbmV3IFFpKHRoaXMsIHMpLCB0aGlzLkdlID0gZSArIFwibWFpblwiLCB0aGlzLmsgPSBuZXcgY2koYSksIFxuICAgICAgICB0aGlzLnplID0gbmV3IEhzKHRoaXMuR2UsIDExLCBuZXcgdHIodGhpcy5rKSksIHRoaXMuSGUgPSBuZXcgRmkodGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSwgdGhpcy5rKSwgXG4gICAgICAgIHRoaXMuSnQgPSBuZXcgUmksIHRoaXMuSmUgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhpKHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgc3BlY2lmaWVkIHJlYWRcbiAqIHRpbWUuXG4gKi9cbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgbXVsdGktdGFiIHN5bmNocm9uaXphdGlvbi5cbiAgICAgICAgKHRoaXMuaywgdGhpcy5KdCksIHRoaXMuWWUgPSBuZXcgcGksIHRoaXMud2luZG93ICYmIHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSA/IHRoaXMuWGUgPSB0aGlzLndpbmRvdy5sb2NhbFN0b3JhZ2UgOiAodGhpcy5YZSA9IG51bGwsIFxuICAgICAgICAhMSA9PT0gdSAmJiBGKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJMb2NhbFN0b3JhZ2UgaXMgdW5hdmFpbGFibGUuIEFzIGEgcmVzdWx0LCBwZXJzaXN0ZW5jZSBtYXkgbm90IHdvcmsgcmVsaWFibHkuIEluIHBhcnRpY3VsYXIgZW5hYmxlUGVyc2lzdGVuY2UoKSBjb3VsZCBmYWlsIGltbWVkaWF0ZWx5IGFmdGVyIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBzdGFydCBJbmRleGVkRGIgcGVyc2lzdGVuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHBlcnNpc3RlbmNlIHdhcyBlbmFibGVkLlxuICAgICAqLyAgICBzdGFydCgpIHtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsIHNvbWV0aW1lcyAoaW4gdGhlIGNhc2Ugb2YgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gYWxyZWFkeSBoYXZpbmcgdGhlIHBlcnNpc3RlbmNlIGxvY2spLCBzbyBpdCdzIHRoZSBmaXJzdCB0aGluZyB3ZSBzaG91bGRcbiAgICAgICAgLy8gZG8uXG4gICAgICAgIHJldHVybiB0aGlzLlplKCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJpbWFyeSAmJiAhdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbikgXG4gICAgICAgICAgICAvLyBGYWlsIGBzdGFydCgpYCBpZiBgc3luY2hyb25pemVUYWJzYCBpcyBkaXNhYmxlZCBhbmQgd2UgY2Fubm90XG4gICAgICAgICAgICAvLyBvYnRhaW4gdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgICAgICAgICB0aHJvdyBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIG5yKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRuKCksIHRoaXMuZW4oKSwgdGhpcy5ubigpLCB0aGlzLnJ1blRyYW5zYWN0aW9uKFwiZ2V0SGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gdGhpcy5IZS5nZXRIaWdoZXN0U2VxdWVuY2VOdW1iZXIodCkpKTtcbiAgICAgICAgfSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5CZSA9IG5ldyBldCh0LCB0aGlzLk1lKTtcbiAgICAgICAgfSkpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuVWUgPSAhMDtcbiAgICAgICAgfSkpLmNhdGNoKCh0ID0+ICh0aGlzLnplICYmIHRoaXMuemUuY2xvc2UoKSwgUHJvbWlzZS5yZWplY3QodCkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgcHJpbWFyeSBzdGF0ZSBvZiB0aGVcbiAgICAgKiBpbnN0YW5jZSBjaGFuZ2VzLiBVcG9uIHJlZ2lzdGVyaW5nLCB0aGlzIGxpc3RlbmVyIGlzIGludm9rZWQgaW1tZWRpYXRlbHlcbiAgICAgKiB3aXRoIHRoZSBjdXJyZW50IHByaW1hcnkgc3RhdGUuXG4gICAgICpcbiAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBXZWIgbXVsdGktdGFiLlxuICAgICAqLyAgICBzbih0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLldlID0gYXN5bmMgZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydGVkKSByZXR1cm4gdChlKTtcbiAgICAgICAgfSwgdCh0aGlzLmlzUHJpbWFyeSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZGF0YWJhc2UgcmVjZWl2ZXMgYVxuICAgICAqIHZlcnNpb24gY2hhbmdlIGV2ZW50IGluZGljYXRpbmcgdGhhdCBpdCBoYXMgZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyKHQpIHtcbiAgICAgICAgdGhpcy56ZS54dCgoYXN5bmMgZSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIEluZGV4ZWREQi5cbiAgICAgICAgICAgIG51bGwgPT09IGUubmV3VmVyc2lvbiAmJiBhd2FpdCB0KCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRqdXN0cyB0aGUgY3VycmVudCBuZXR3b3JrIHN0YXRlIGluIHRoZSBjbGllbnQncyBtZXRhZGF0YSwgcG90ZW50aWFsbHlcbiAgICAgKiBhZmZlY3RpbmcgdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgICpcbiAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBXZWIgbXVsdGktdGFiLlxuICAgICAqLyAgICBzZXROZXR3b3JrRW5hYmxlZCh0KSB7XG4gICAgICAgIHRoaXMubmV0d29ya0VuYWJsZWQgIT09IHQgJiYgKHRoaXMubmV0d29ya0VuYWJsZWQgPSB0LCBcbiAgICAgICAgLy8gU2NoZWR1bGUgYSBwcmltYXJ5IGxlYXNlIHJlZnJlc2ggZm9yIGltbWVkaWF0ZSBleGVjdXRpb24uIFRoZSBldmVudHVhbFxuICAgICAgICAvLyBsZWFzZSB1cGRhdGUgd2lsbCBiZSBwcm9wYWdhdGVkIHZpYSBgcHJpbWFyeVN0YXRlTGlzdGVuZXJgLlxuICAgICAgICB0aGlzLk9lLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCAmJiBhd2FpdCB0aGlzLlplKCk7XG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNsaWVudCBtZXRhZGF0YSBpbiBJbmRleGVkRGIgYW5kIGF0dGVtcHRzIHRvIGVpdGhlciBvYnRhaW4gb3JcbiAgICAgKiBleHRlbmQgdGhlIHByaW1hcnkgbGVhc2UgZm9yIHRoZSBsb2NhbCBjbGllbnQuIEFzeW5jaHJvbm91c2x5IG5vdGlmaWVzIHRoZVxuICAgICAqIHByaW1hcnkgc3RhdGUgbGlzdGVuZXIgaWYgdGhlIGNsaWVudCBlaXRoZXIgbmV3bHkgb2J0YWluZWQgb3IgcmVsZWFzZWQgaXRzXG4gICAgICogcHJpbWFyeSBsZWFzZS5cbiAgICAgKi8gICAgWmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1blRyYW5zYWN0aW9uKFwidXBkYXRlQ2xpZW50TWV0YWRhdGFBbmRUcnlCZWNvbWVQcmltYXJ5XCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IHJyKHQpLnB1dChuZXcgVXModGhpcy5jbGllbnRJZCwgRGF0ZS5ub3coKSwgdGhpcy5uZXR3b3JrRW5hYmxlZCwgdGhpcy5pbkZvcmVncm91bmQpKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ByaW1hcnkpIHJldHVybiB0aGlzLnJuKHQpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIHQgfHwgKHRoaXMuaXNQcmltYXJ5ID0gITEsIHRoaXMuT2UuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gdGhpcy5XZSghMSkpKSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB0aGlzLm9uKHQpKSkubmV4dCgoZSA9PiB0aGlzLmlzUHJpbWFyeSAmJiAhZSA/IHRoaXMuYW4odCkubmV4dCgoKCkgPT4gITEpKSA6ICEhZSAmJiB0aGlzLmNuKHQpLm5leHQoKCgpID0+ICEwKSkpKSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgIGlmIChYcyh0KSkgXG4gICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRlLiBBbnkgc3Vic2VxdWVudCBhY2Nlc3MgdG9cbiAgICAgICAgICAgIC8vIEluZGV4ZWREQiB3aWxsIHZlcmlmeSB0aGUgbGVhc2UuXG4gICAgICAgICAgICByZXR1cm4gJChcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIFwiRmFpbGVkIHRvIGV4dGVuZCBvd25lciBsZWFzZTogXCIsIHQpLCB0aGlzLmlzUHJpbWFyeTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbikgdGhyb3cgdDtcbiAgICAgICAgICAgIHJldHVybiAkKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJSZWxlYXNpbmcgb3duZXIgbGVhc2UgYWZ0ZXIgZXJyb3IgZHVyaW5nIGxlYXNlIHJlZnJlc2hcIiwgdCksIFxuICAgICAgICAgICAgLyogaXNQcmltYXJ5PSAqLyAhMTtcbiAgICAgICAgfSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgIT09IHQgJiYgdGhpcy5PZS5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiB0aGlzLldlKHQpKSksIHRoaXMuaXNQcmltYXJ5ID0gdDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBybih0KSB7XG4gICAgICAgIHJldHVybiBpcih0KS5nZXQoU3Mua2V5KS5uZXh0KCh0ID0+IEdzLnJlc29sdmUodGhpcy51bih0KSkpKTtcbiAgICB9XG4gICAgaG4odCkge1xuICAgICAgICByZXR1cm4gcnIodCkuZGVsZXRlKHRoaXMuY2xpZW50SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIHRocmVzaG9sZCBoYXMgcGFzc2VkLCBwcnVuZXMgdGhlXG4gICAgICogUmVtb3RlRG9jdW1lbnRDaGFuZ2VzIGFuZCB0aGUgQ2xpZW50TWV0YWRhdGEgc3RvcmUgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlXG4gICAgICogdGltZSBvZiBhbGwgY2xpZW50cy5cbiAgICAgKi8gICAgYXN5bmMgbG4oKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUHJpbWFyeSAmJiAhdGhpcy5mbih0aGlzLlFlLCAxOGU1KSkge1xuICAgICAgICAgICAgdGhpcy5RZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5ydW5UcmFuc2FjdGlvbihcIm1heWJlR2FyYmFnZUNvbGxlY3RNdWx0aUNsaWVudFN0YXRlXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBpaSh0LCBVcy5zdG9yZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuQnQoKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuZG4odCwgMThlNSksIHMgPSB0LmZpbHRlcigodCA9PiAtMSA9PT0gbi5pbmRleE9mKHQpKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBtZXRhZGF0YSBmb3IgY2xpZW50cyB0aGF0IGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCBhY3RpdmUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBHcy5mb3JFYWNoKHMsICh0ID0+IGUuZGVsZXRlKHQuY2xpZW50SWQpKSkubmV4dCgoKCkgPT4gcykpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgoKCkgPT4gW10pKTtcbiAgICAgICAgICAgIC8vIERlbGV0ZSBwb3RlbnRpYWwgbGVmdG92ZXIgZW50cmllcyB0aGF0IG1heSBjb250aW51ZSB0byBtYXJrIHRoZVxuICAgICAgICAgICAgLy8gaW5hY3RpdmUgY2xpZW50cyBhcyB6b21iaWVkIGluIExvY2FsU3RvcmFnZS5cbiAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBkZWxldGUgdGhlIEluZGV4ZWREYiBhbmQgTG9jYWxTdG9yYWdlIHpvbWJpZSBlbnRyaWVzIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBhdG9taWNhbGx5LCBidXQgd2UgY2FuJ3QuIFNvIHdlIG9wdCB0byBkZWxldGUgdGhlIEluZGV4ZWREYlxuICAgICAgICAgICAgLy8gZW50cmllcyBmaXJzdCB0byBhdm9pZCBwb3RlbnRpYWxseSByZXZpdmluZyBhIHpvbWJpZWQgY2xpZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuWGUpIGZvciAoY29uc3QgZSBvZiB0KSB0aGlzLlhlLnJlbW92ZUl0ZW0odGhpcy53bihlLmNsaWVudElkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGEgcmVjdXJyaW5nIHRpbWVyIHRvIHVwZGF0ZSB0aGUgY2xpZW50IG1ldGFkYXRhIGFuZCB0byBlaXRoZXJcbiAgICAgKiBleHRlbmQgb3IgYWNxdWlyZSB0aGUgcHJpbWFyeSBsZWFzZSBpZiB0aGUgY2xpZW50IGlzIGVsaWdpYmxlLlxuICAgICAqLyAgICBubigpIHtcbiAgICAgICAgdGhpcy5qZSA9IHRoaXMuT2UuZW5xdWV1ZUFmdGVyRGVsYXkoXCJjbGllbnRfbWV0YWRhdGFfcmVmcmVzaFwiIC8qIENsaWVudE1ldGFkYXRhUmVmcmVzaCAqLyAsIDRlMywgKCgpID0+IHRoaXMuWmUoKS50aGVuKCgoKSA9PiB0aGlzLmxuKCkpKS50aGVuKCgoKSA9PiB0aGlzLm5uKCkpKSkpO1xuICAgIH1cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYGNsaWVudGAgaXMgdGhlIGxvY2FsIGNsaWVudC4gKi8gICAgdW4odCkge1xuICAgICAgICByZXR1cm4gISF0ICYmIHQub3duZXJJZCA9PT0gdGhpcy5jbGllbnRJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGUgdGhlIHN0YXRlIG9mIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGxvY2FsXG4gICAgICogY2xpZW50IGlzIG9yIGNhbiBhY3QgYXMgdGhlIGhvbGRlciBvZiB0aGUgcHJpbWFyeSBsZWFzZS4gUmV0dXJucyB3aGV0aGVyXG4gICAgICogdGhlIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIGxlYXNlLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgYWNxdWlyZSBpdC5cbiAgICAgKiBNYXkgcmV0dXJuICdmYWxzZScgZXZlbiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgbGVhc2Vob2xkZXIgYW5kIGFub3RoZXJcbiAgICAgKiAoZm9yZWdyb3VuZCkgY2xpZW50IHNob3VsZCBiZWNvbWUgbGVhc2Vob2xkZXIgaW5zdGVhZC5cbiAgICAgKi8gICAgb24odCkge1xuICAgICAgICBpZiAodGhpcy5MZSkgcmV0dXJuIEdzLnJlc29sdmUoITApO1xuICAgICAgICByZXR1cm4gaXIodCkuZ2V0KFNzLmtleSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAvLyBBIGNsaWVudCBpcyBlbGlnaWJsZSBmb3IgdGhlIHByaW1hcnkgbGVhc2UgaWY6XG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIHRoZSBjbGllbnQncyB0YWIgaXMgaW4gdGhlIGZvcmVncm91bmQuXG4gICAgICAgICAgICAvLyAtIGl0cyBuZXR3b3JrIGlzIGVuYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpbiB0aGVcbiAgICAgICAgICAgIC8vICAgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gZXZlcnkgY2xpZW50cyBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCB0aGUgY2xpZW50J3MgdGFiIGlzIGluIHRoZVxuICAgICAgICAgICAgLy8gICBmb3JlZ3JvdW5kLlxuICAgICAgICAgICAgLy8gLSBldmVyeSBjbGllbnRzIG5ldHdvcmsgaXMgZGlzYWJsZWQgYW5kIG5vIG90aGVyIGNsaWVudCdzIHRhYiBpcyBpblxuICAgICAgICAgICAgLy8gICB0aGUgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gdGhlIGBmb3JjZU93bmluZ1RhYmAgc2V0dGluZyB3YXMgcGFzc2VkIGluLlxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGUgJiYgdGhpcy5mbihlLmxlYXNlVGltZXN0YW1wTXMsIDVlMykgJiYgIXRoaXMuX24oZS5vd25lcklkKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuKGUpICYmIHRoaXMubmV0d29ya0VuYWJsZWQpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudW4oZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSBcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgYGNhbkFjdEFzUHJpbWFyeWAgY2hlY2sgaWYgdGhlIGN1cnJlbnQgbGVhc2Vob2xkZXIgaGFzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uIElmIHRoaXMgaGFwcGVucyBhdFxuICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgc3RhcnR1cCwgd2UgcmVqZWN0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBlbmFibGVQZXJzaXN0ZW5jZSgpYCBhbmQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHRvIHVzZSBGaXJlc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpbi1tZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMgZHVyaW5nIGEgbGVhc2UgcmVmcmVzaCwgd2Ugd2lsbCBpbnN0ZWFkIGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBBc3luY1F1ZXVlIGZyb20gZXhlY3V0aW5nIGZ1cnRoZXIgb3BlcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0YWJsZSBzaW5jZSBtaXhpbmcgJiBtYXRjaGluZyBkaWZmZXJlbnQgYHN5bmNocm9uaXplVGFic2BcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZ3MgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBiZSB0dXJuZWQgb2ZmLlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIG5yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhKCF0aGlzLm5ldHdvcmtFbmFibGVkIHx8ICF0aGlzLmluRm9yZWdyb3VuZCkgfHwgcnIodCkuQnQoKS5uZXh0KCh0ID0+IHZvaWQgMCA9PT0gdGhpcy5kbih0LCA1ZTMpLmZpbmQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudElkICE9PSB0LmNsaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAhdGhpcy5uZXR3b3JrRW5hYmxlZCAmJiB0Lm5ldHdvcmtFbmFibGVkLCBuID0gIXRoaXMuaW5Gb3JlZ3JvdW5kICYmIHQuaW5Gb3JlZ3JvdW5kLCBzID0gdGhpcy5uZXR3b3JrRW5hYmxlZCA9PT0gdC5uZXR3b3JrRW5hYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgfHwgbiAmJiBzKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkubmV4dCgodCA9PiAodGhpcy5pc1ByaW1hcnkgIT09IHQgJiYgJChcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJHt0ID8gXCJpc1wiIDogXCJpcyBub3RcIn0gZWxpZ2libGUgZm9yIGEgcHJpbWFyeSBsZWFzZS5gKSwgXG4gICAgICAgIHQpKSk7XG4gICAgfVxuICAgIGFzeW5jIHNodXRkb3duKCkge1xuICAgICAgICAvLyBUaGUgc2h1dGRvd24oKSBvcGVyYXRpb25zIGFyZSBpZGVtcG90ZW50IGFuZCBjYW4gYmUgY2FsbGVkIGV2ZW4gd2hlblxuICAgICAgICAvLyBzdGFydCgpIGFib3J0ZWQgKGUuZy4gYmVjYXVzZSBpdCBjb3VsZG4ndCBhY3F1aXJlIHRoZSBwZXJzaXN0ZW5jZSBsZWFzZSkuXG4gICAgICAgIHRoaXMuVWUgPSAhMSwgdGhpcy5tbigpLCB0aGlzLmplICYmICh0aGlzLmplLmNhbmNlbCgpLCB0aGlzLmplID0gbnVsbCksIHRoaXMuZ24oKSwgXG4gICAgICAgIHRoaXMueW4oKSwgXG4gICAgICAgIC8vIFVzZSBgU2ltcGxlRGIucnVuVHJhbnNhY3Rpb25gIGRpcmVjdGx5IHRvIGF2b2lkIGZhaWxpbmcgaWYgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gaGFzIG9idGFpbmVkIHRoZSBwcmltYXJ5IGxlYXNlLlxuICAgICAgICBhd2FpdCB0aGlzLnplLnJ1blRyYW5zYWN0aW9uKFwic2h1dGRvd25cIiwgXCJyZWFkd3JpdGVcIiwgWyBTcy5zdG9yZSwgVXMuc3RvcmUgXSwgKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBzaSh0LCBldC5JKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFuKGUpLm5leHQoKCgpID0+IHRoaXMuaG4oZSkpKTtcbiAgICAgICAgfSkpLCB0aGlzLnplLmNsb3NlKCksIFxuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudHJ5IG1hcmtpbmcgdGhlIGNsaWVudCBhcyB6b21iaWVkIGZyb20gTG9jYWxTdG9yYWdlIHNpbmNlXG4gICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGl0cyBtZXRhZGF0YSBmcm9tIEluZGV4ZWREYi5cbiAgICAgICAgdGhpcy5wbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNsaWVudHMgdGhhdCBhcmUgbm90IHpvbWJpZWQgYW5kIGhhdmUgYW4gdXBkYXRlVGltZSB3aXRoaW4gdGhlXG4gICAgICogcHJvdmlkZWQgdGhyZXNob2xkLlxuICAgICAqLyAgICBkbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LmZpbHRlcigodCA9PiB0aGlzLmZuKHQudXBkYXRlVGltZU1zLCBlKSAmJiAhdGhpcy5fbih0LmNsaWVudElkKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBJRHMgb2YgdGhlIGNsaWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZS4gSWYgbXVsdGktdGFiXG4gICAgICogaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJucyBhbiBhcnJheSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxvY2FsIGNsaWVudCdzXG4gICAgICogSUQuXG4gICAgICpcbiAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBXZWIgbXVsdGktdGFiLlxuICAgICAqLyAgICBUbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJnZXRBY3RpdmVDbGllbnRzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gcnIodCkuQnQoKS5uZXh0KCh0ID0+IHRoaXMuZG4odCwgMThlNSkubWFwKCh0ID0+IHQuY2xpZW50SWQpKSkpKSk7XG4gICAgfVxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5VZTtcbiAgICB9XG4gICAgZ2V0TXV0YXRpb25RdWV1ZSh0KSB7XG4gICAgICAgIHJldHVybiBEaS5YdCh0LCB0aGlzLmssIHRoaXMuSnQsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUpO1xuICAgIH1cbiAgICBnZXRUYXJnZXRDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSGU7XG4gICAgfVxuICAgIGdldFJlbW90ZURvY3VtZW50Q2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkplO1xuICAgIH1cbiAgICBnZXRJbmRleE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkp0O1xuICAgIH1cbiAgICBnZXRCdW5kbGVDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuWWU7XG4gICAgfVxuICAgIHJ1blRyYW5zYWN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgJChcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIFwiU3RhcnRpbmcgdHJhbnNhY3Rpb246XCIsIHQpO1xuICAgICAgICBjb25zdCBzID0gXCJyZWFkb25seVwiID09PSBlID8gXCJyZWFkb25seVwiIDogXCJyZWFkd3JpdGVcIjtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIC8vIERvIGFsbCB0cmFuc2FjdGlvbnMgYXMgcmVhZHdyaXRlIGFnYWluc3QgYWxsIG9iamVjdCBzdG9yZXMsIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSB0aGUgb25seSByZWFkZXIvd3JpdGVyLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnplLnJ1blRyYW5zYWN0aW9uKHQsIHMsIGpzLCAocyA9PiAoaSA9IG5ldyBzaShzLCB0aGlzLkJlID8gdGhpcy5CZS5uZXh0KCkgOiBldC5JKSwgXG4gICAgICAgIFwicmVhZHdyaXRlLXByaW1hcnlcIiA9PT0gZSA/IHRoaXMucm4oaSkubmV4dCgodCA9PiAhIXQgfHwgdGhpcy5vbihpKSkpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFlKSB0aHJvdyBGKGBGYWlsZWQgdG8gb2J0YWluIHByaW1hcnkgbGVhc2UgZm9yIGFjdGlvbiAnJHt0fScuYCksIHRoaXMuaXNQcmltYXJ5ID0gITEsIFxuICAgICAgICAgICAgdGhpcy5PZS5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiB0aGlzLldlKCExKSkpLCBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIFFzKTtcbiAgICAgICAgICAgIHJldHVybiBuKGkpO1xuICAgICAgICB9KSkubmV4dCgodCA9PiB0aGlzLmNuKGkpLm5leHQoKCgpID0+IHQpKSkpIDogdGhpcy5FbihpKS5uZXh0KCgoKSA9PiBuKGkpKSkpKSkudGhlbigodCA9PiAoaS5yYWlzZU9uQ29tbWl0dGVkRXZlbnQoKSwgXG4gICAgICAgIHQpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgdGFiIGlzIHRoZSBwcmltYXJ5IGxlYXNlaG9sZGVyIG9yIGFsdGVybmF0aXZlbHlcbiAgICAgKiB0aGF0IHRoZSBsZWFzZWhvbGRlciBoYXMgb3B0ZWQgaW50byBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAqL1xuICAgIC8vIFRPRE8oYi8xMTQyMjYyMzQpOiBSZW1vdmUgdGhpcyBjaGVjayB3aGVuIGBzeW5jaHJvbml6ZVRhYnNgIGNhbiBubyBsb25nZXJcbiAgICAvLyBiZSB0dXJuZWQgb2ZmLlxuICAgIEVuKHQpIHtcbiAgICAgICAgcmV0dXJuIGlyKHQpLmdldChTcy5rZXkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHQgJiYgdGhpcy5mbih0LmxlYXNlVGltZXN0YW1wTXMsIDVlMykgJiYgIXRoaXMuX24odC5vd25lcklkKSAmJiAhdGhpcy51bih0KSAmJiAhKHRoaXMuTGUgfHwgdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbiAmJiB0LmFsbG93VGFiU3luY2hyb25pemF0aW9uKSkgdGhyb3cgbmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBucik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT2J0YWlucyBvciBleHRlbmRzIHRoZSBuZXcgcHJpbWFyeSBsZWFzZSBmb3IgdGhlIGxvY2FsIGNsaWVudC4gVGhpc1xuICAgICAqIG1ldGhvZCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgY2xpZW50IGlzIGVsaWdpYmxlIGZvciB0aGlzIGxlYXNlLlxuICAgICAqLyAgICBjbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgU3ModGhpcy5jbGllbnRJZCwgdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbiwgRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBpcih0KS5wdXQoU3Mua2V5LCBlKTtcbiAgICB9XG4gICAgc3RhdGljIGJ0KCkge1xuICAgICAgICByZXR1cm4gSHMuYnQoKTtcbiAgICB9XG4gICAgLyoqIENoZWNrcyB0aGUgcHJpbWFyeSBsZWFzZSBhbmQgcmVtb3ZlcyBpdCBpZiB3ZSBhcmUgdGhlIGN1cnJlbnQgcHJpbWFyeS4gKi8gICAgYW4odCkge1xuICAgICAgICBjb25zdCBlID0gaXIodCk7XG4gICAgICAgIHJldHVybiBlLmdldChTcy5rZXkpLm5leHQoKHQgPT4gdGhpcy51bih0KSA/ICgkKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJSZWxlYXNpbmcgcHJpbWFyeSBsZWFzZS5cIiksIFxuICAgICAgICBlLmRlbGV0ZShTcy5rZXkpKSA6IEdzLnJlc29sdmUoKSkpO1xuICAgIH1cbiAgICAvKiogVmVyaWZpZXMgdGhhdCBgdXBkYXRlVGltZU1zYCBpcyB3aXRoaW4gYG1heEFnZU1zYC4gKi8gICAgZm4odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuICEodCA8IG4gLSBlKSAmJiAoISh0ID4gbikgfHwgKEYoYERldGVjdGVkIGFuIHVwZGF0ZSB0aW1lIHRoYXQgaXMgaW4gdGhlIGZ1dHVyZTogJHt0fSA+ICR7bn1gKSwgXG4gICAgICAgICExKSk7XG4gICAgfVxuICAgIHRuKCkge1xuICAgICAgICBudWxsICE9PSB0aGlzLmRvY3VtZW50ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICYmICh0aGlzLktlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5PZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiAodGhpcy5pbkZvcmVncm91bmQgPSBcInZpc2libGVcIiA9PT0gdGhpcy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUsIFxuICAgICAgICAgICAgdGhpcy5aZSgpKSkpO1xuICAgICAgICB9LCB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMuS2UpLCB0aGlzLmluRm9yZWdyb3VuZCA9IFwidmlzaWJsZVwiID09PSB0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSk7XG4gICAgfVxuICAgIGduKCkge1xuICAgICAgICB0aGlzLktlICYmICh0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMuS2UpLCB0aGlzLktlID0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgd2luZG93LnVubG9hZCBoYW5kbGVyIHRoYXQgd2lsbCBzeW5jaHJvbm91c2x5IHdyaXRlIG91clxuICAgICAqIGNsaWVudElkIHRvIGEgXCJ6b21iaWUgY2xpZW50IGlkXCIgbG9jYXRpb24gaW4gTG9jYWxTdG9yYWdlLiBUaGlzIGNhbiBiZSB1c2VkXG4gICAgICogYnkgdGFicyB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgcHJpbWFyeSBsZWFzZSB0byBkZXRlcm1pbmUgdGhhdCB0aGUgbGVhc2VcbiAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQgZXZlbiBpZiB0aGUgdGltZXN0YW1wIGlzIHJlY2VudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHlcbiAgICAgKiBpbXBvcnRhbnQgZm9yIHRoZSByZWZyZXNoIGNhc2UgKHNvIHRoZSB0YWIgY29ycmVjdGx5IHJlLWFjcXVpcmVzIHRoZVxuICAgICAqIHByaW1hcnkgbGVhc2UpLiBMb2NhbFN0b3JhZ2UgaXMgdXNlZCBmb3IgdGhpcyByYXRoZXIgdGhhbiBJbmRleGVkRGIgYmVjYXVzZVxuICAgICAqIGl0IGlzIGEgc3luY2hyb25vdXMgQVBJIGFuZCBzbyBjYW4gYmUgdXNlZCByZWxpYWJseSBmcm9tICBhbiB1bmxvYWRcbiAgICAgKiBoYW5kbGVyLlxuICAgICAqLyAgICBlbigpIHtcbiAgICAgICAgdmFyIHQ7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgKG51bGwgPT09ICh0ID0gdGhpcy53aW5kb3cpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuYWRkRXZlbnRMaXN0ZW5lcikgJiYgKHRoaXMucWUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBOb3RlOiBJbiB0aGVvcnksIHRoaXMgc2hvdWxkIGJlIHNjaGVkdWxlZCBvbiB0aGUgQXN5bmNRdWV1ZSBzaW5jZSBpdFxuICAgICAgICAgICAgLy8gYWNjZXNzZXMgaW50ZXJuYWwgc3RhdGUuIFdlIGV4ZWN1dGUgdGhpcyBjb2RlIGRpcmVjdGx5IGR1cmluZyBzaHV0ZG93blxuICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIGl0IGdldHMgYSBjaGFuY2UgdG8gcnVuLlxuICAgICAgICAgICAgdGhpcy5tbigpLCBpc1NhZmFyaSgpICYmIG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXFwvMVs0NV0vKSAmJiBcbiAgICAgICAgICAgIC8vIE9uIFNhZmFyaSAxNCBhbmQgMTUsIHdlIGRvIG5vdCBydW4gYW55IGNsZWFudXAgYWN0aW9ucyBhcyBpdCBtaWdodFxuICAgICAgICAgICAgLy8gdHJpZ2dlciBhIGJ1ZyB0aGF0IHByZXZlbnRzIFNhZmFyaSBmcm9tIHJlLW9wZW5pbmcgSW5kZXhlZERCIGR1cmluZ1xuICAgICAgICAgICAgLy8gdGhlIG5leHQgcGFnZSBsb2FkLlxuICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjY1NDdcbiAgICAgICAgICAgIHRoaXMuT2UuZW50ZXJSZXN0cmljdGVkTW9kZSgvKiBwdXJnZUV4aXN0aW5nVGFza3M9ICovICEwKSwgdGhpcy5PZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiB0aGlzLnNodXRkb3duKCkpKTtcbiAgICAgICAgfSwgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMucWUpKTtcbiAgICB9XG4gICAgeW4oKSB7XG4gICAgICAgIHRoaXMucWUgJiYgKHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLnFlKSwgdGhpcy5xZSA9IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBjbGllbnQgaXMgXCJ6b21iaWVkXCIgYmFzZWQgb24gaXRzIExvY2FsU3RvcmFnZSBlbnRyeS5cbiAgICAgKiBDbGllbnRzIGJlY29tZSB6b21iaWVkIHdoZW4gdGhlaXIgdGFiIGNsb3NlcyB3aXRob3V0IHJ1bm5pbmcgYWxsIG9mIHRoZVxuICAgICAqIGNsZWFudXAgbG9naWMgaW4gYHNodXRkb3duKClgLlxuICAgICAqLyAgICBfbih0KSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbiA9IG51bGwgIT09IChudWxsID09PSAoZSA9IHRoaXMuWGUpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZ2V0SXRlbSh0aGlzLnduKHQpKSk7XG4gICAgICAgICAgICByZXR1cm4gJChcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJyR7dH0nICR7biA/IFwiaXNcIiA6IFwiaXMgbm90XCJ9IHpvbWJpZWQgaW4gTG9jYWxTdG9yYWdlYCksIFxuICAgICAgICAgICAgbjtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgaWYgTG9jYWxTdG9yYWdlIGlzbid0IHdvcmtpbmcuXG4gICAgICAgICAgICByZXR1cm4gRihcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIFwiRmFpbGVkIHRvIGdldCB6b21iaWVkIGNsaWVudCBpZC5cIiwgdCksICExO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY29yZCBjbGllbnQgYXMgem9tYmllZCAoYSBjbGllbnQgdGhhdCBoYWQgaXRzIHRhYiBjbG9zZWQpLiBab21iaWVkXG4gICAgICogY2xpZW50cyBhcmUgaWdub3JlZCBkdXJpbmcgcHJpbWFyeSB0YWIgc2VsZWN0aW9uLlxuICAgICAqLyAgICBtbigpIHtcbiAgICAgICAgaWYgKHRoaXMuWGUpIHRyeSB7XG4gICAgICAgICAgICB0aGlzLlhlLnNldEl0ZW0odGhpcy53bih0aGlzLmNsaWVudElkKSwgU3RyaW5nKERhdGUubm93KCkpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgaWYgTG9jYWxTdG9yYWdlIGlzbid0IGF2YWlsYWJsZSAvIHdvcmtpbmcuXG4gICAgICAgICAgICBGKFwiRmFpbGVkIHRvIHNldCB6b21iaWUgY2xpZW50IGlkLlwiLCB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogUmVtb3ZlcyB0aGUgem9tYmllZCBjbGllbnQgZW50cnkgaWYgaXQgZXhpc3RzLiAqLyAgICBwbigpIHtcbiAgICAgICAgaWYgKHRoaXMuWGUpIHRyeSB7XG4gICAgICAgICAgICB0aGlzLlhlLnJlbW92ZUl0ZW0odGhpcy53bih0aGlzLmNsaWVudElkKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZVxuICAgICAgICB9XG4gICAgfVxuICAgIHduKHQpIHtcbiAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfem9tYmllXyR7dGhpcy5wZXJzaXN0ZW5jZUtleX1fJHt0fWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcHJpbWFyeSBjbGllbnQgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIGlyKHQpIHtcbiAgICByZXR1cm4gaWkodCwgU3Muc3RvcmUpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgY2xpZW50IG1ldGFkYXRhIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBycih0KSB7XG4gICAgcmV0dXJuIGlpKHQsIFVzLnN0b3JlKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdXNlZCBhcyBhIHByZWZpeCB3aGVuIHN0b3JpbmcgZGF0YSBpbiBJbmRleGVkREIgYW5kXG4gKiBMb2NhbFN0b3JhZ2UuXG4gKi8gZnVuY3Rpb24gb3IodCwgZSkge1xuICAgIC8vIFVzZSB0d28gZGlmZmVyZW50IHByZWZpeCBmb3JtYXRzOlxuICAgIC8vICAgKiBmaXJlc3RvcmUgLyBwZXJzaXN0ZW5jZUtleSAvIHByb2plY3RJRCAuIGRhdGFiYXNlSUQgLyAuLi5cbiAgICAvLyAgICogZmlyZXN0b3JlIC8gcGVyc2lzdGVuY2VLZXkgLyBwcm9qZWN0SUQgLyAuLi5cbiAgICAvLyBwcm9qZWN0SURzIGFyZSBETlMtY29tcGF0aWJsZSBuYW1lcyBhbmQgY2Fubm90IGNvbnRhaW4gZG90c1xuICAgIC8vIHNvIHRoZXJlJ3Mgbm8gZGFuZ2VyIG9mIGNvbGxpc2lvbnMuXG4gICAgbGV0IG4gPSB0LnByb2plY3RJZDtcbiAgICByZXR1cm4gdC5pc0RlZmF1bHREYXRhYmFzZSB8fCAobiArPSBcIi5cIiArIHQuZGF0YWJhc2UpLCBcImZpcmVzdG9yZS9cIiArIGUgKyBcIi9cIiArIG4gKyBcIi9cIjtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNsYXNzIGFyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0LCB0aGlzLkluID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgcmVhZG9ubHkgdmlldyBvZiB0aGUgbG9jYWwgc3RhdGUgb2YgYWxsIGRvY3VtZW50cyB3ZSdyZSB0cmFja2luZyAoaS5lLiB3ZVxuICogaGF2ZSBhIGNhY2hlZCB2ZXJzaW9uIGluIHJlbW90ZURvY3VtZW50Q2FjaGUgb3IgbG9jYWwgbXV0YXRpb25zIGZvciB0aGVcbiAqIGRvY3VtZW50KS4gVGhlIHZpZXcgaXMgY29tcHV0ZWQgYnkgYXBwbHlpbmcgdGhlIG11dGF0aW9ucyBpbiB0aGVcbiAqIE11dGF0aW9uUXVldWUgdG8gdGhlIFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKi8gY2xhc3MgY3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5KZSA9IHQsIHRoaXMuQW4gPSBlLCB0aGlzLkp0ID0gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsb2NhbCB2aWV3IG9mIHRoZSBkb2N1bWVudCBpZGVudGlmaWVkIGJ5IGBrZXlgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTG9jYWwgdmlldyBvZiB0aGUgZG9jdW1lbnQgb3IgbnVsbCBpZiB3ZSBkb24ndCBoYXZlIGFueSBjYWNoZWRcbiAgICAgKiBzdGF0ZSBmb3IgaXQuXG4gICAgICovICAgIFJuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQW4uZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXkodCwgZSkubmV4dCgobiA9PiB0aGlzLlBuKHQsIGUsIG4pKSk7XG4gICAgfVxuICAgIC8qKiBJbnRlcm5hbCB2ZXJzaW9uIG9mIGBnZXREb2N1bWVudGAgdGhhdCBhbGxvd3MgcmV1c2luZyBiYXRjaGVzLiAqLyAgICBQbih0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkplLmdldEVudHJ5KHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIG4pIGUuYXBwbHlUb0xvY2FsVmlldyh0KTtcbiAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIHZpZXcgb2YgdGhlIGdpdmVuIGBkb2NzYCBhcyB0aGV5IHdvdWxkIGFwcGVhciBhZnRlciBhcHBseWluZ1xuICAgIC8vIGFsbCBtdXRhdGlvbnMgaW4gdGhlIGdpdmVuIGBiYXRjaGVzYC5cbiAgICBibih0LCBlKSB7XG4gICAgICAgIHQuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB0LmFwcGx5VG9Mb2NhbFZpZXcobik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG9jYWwgdmlldyBvZiB0aGUgZG9jdW1lbnRzIGlkZW50aWZpZWQgYnkgYGtleXNgLlxuICAgICAqXG4gICAgICogSWYgd2UgZG9uJ3QgaGF2ZSBjYWNoZWQgc3RhdGUgZm9yIGEgZG9jdW1lbnQgaW4gYGtleXNgLCBhIE5vRG9jdW1lbnQgd2lsbFxuICAgICAqIGJlIHN0b3JlZCBmb3IgdGhhdCBrZXkgaW4gdGhlIHJlc3VsdGluZyBzZXQuXG4gICAgICovICAgIHZuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSmUuZ2V0RW50cmllcyh0LCBlKS5uZXh0KChlID0+IHRoaXMuVm4odCwgZSkubmV4dCgoKCkgPT4gZSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGxvY2FsIHZpZXcgdGhlIGdpdmVuIGBiYXNlRG9jc2Agd2l0aG91dCByZXRyaWV2aW5nIGRvY3VtZW50c1xuICAgICAqIGZyb20gdGhlIGxvY2FsIHN0b3JlLlxuICAgICAqLyAgICBWbih0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkFuLmdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5cyh0LCBlKS5uZXh0KCh0ID0+IHRoaXMuYm4oZSwgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBxdWVyeSBhZ2FpbnN0IHRoZSBsb2NhbCB2aWV3IG9mIGFsbCBkb2N1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgcGVyc2lzdGVuY2UgdHJhbnNhY3Rpb24uXG4gICAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIG1hdGNoIGRvY3VtZW50cyBhZ2FpbnN0LlxuICAgICAqIEBwYXJhbSBzaW5jZVJlYWRUaW1lIC0gSWYgbm90IHNldCB0byBTbmFwc2hvdFZlcnNpb24ubWluKCksIHJldHVybiBvbmx5XG4gICAgICogICAgIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWFkIHNpbmNlIHRoaXMgc25hcHNob3QgdmVyc2lvbiAoZXhjbHVzaXZlKS5cbiAgICAgKi8gICAgZ2V0RG9jdW1lbnRzTWF0Y2hpbmdRdWVyeSh0LCBlLCBuKSB7XG4gICAgICAgIC8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGEgc2luZ2xlIGRvY3VtZW50IGJ5IHBhdGggKHJhdGhlciB0aGFuIGFcbiAqIGNvbGxlY3Rpb24pLlxuICovXG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gU3QuaXNEb2N1bWVudEtleSh0LnBhdGgpICYmIG51bGwgPT09IHQuY29sbGVjdGlvbkdyb3VwICYmIDAgPT09IHQuZmlsdGVycy5sZW5ndGg7XG4gICAgICAgIH0oZSkgPyB0aGlzLlNuKHQsIGUucGF0aCkgOiBJZShlKSA/IHRoaXMuRG4odCwgZSwgbikgOiB0aGlzLkNuKHQsIGUsIG4pO1xuICAgIH1cbiAgICBTbih0LCBlKSB7XG4gICAgICAgIC8vIEp1c3QgZG8gYSBzaW1wbGUgZG9jdW1lbnQgbG9va3VwLlxuICAgICAgICByZXR1cm4gdGhpcy5Sbih0LCBuZXcgU3QoZSkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgbGV0IGUgPSBQbigpO1xuICAgICAgICAgICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgJiYgKGUgPSBlLmluc2VydCh0LmtleSwgdCkpLCBlO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIERuKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IGUuY29sbGVjdGlvbkdyb3VwO1xuICAgICAgICBsZXQgaSA9IFBuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLkp0LmdldENvbGxlY3Rpb25QYXJlbnRzKHQsIHMpLm5leHQoKHIgPT4gR3MuZm9yRWFjaChyLCAociA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgX2UoZSwgXG4gICAgICAgICAgICAgICAgLypjb2xsZWN0aW9uR3JvdXA9Ki8gbnVsbCwgdC5leHBsaWNpdE9yZGVyQnkuc2xpY2UoKSwgdC5maWx0ZXJzLnNsaWNlKCksIHQubGltaXQsIHQubGltaXRUeXBlLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBxdWVyeSBkb2VzIG5vdCBzcGVjaWZ5IGFueSBxdWVyeSBjb25zdHJhaW50cyB0aGF0XG4gKiBjb3VsZCByZW1vdmUgcmVzdWx0cy5cbiAqLyAoZSwgci5jaGlsZChzKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Dbih0LCBvLCBuKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBpLmluc2VydCh0LCBlKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSkpKTtcbiAgICB9XG4gICAgQ24odCwgZSwgbikge1xuICAgICAgICAvLyBRdWVyeSB0aGUgcmVtb3RlIGRvY3VtZW50cyBhbmQgb3ZlcmxheSBtdXRhdGlvbnMuXG4gICAgICAgIGxldCBzLCBpO1xuICAgICAgICByZXR1cm4gdGhpcy5KZS5nZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIGUsIG4pLm5leHQoKG4gPT4gKHMgPSBuLCB0aGlzLkFuLmdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ1F1ZXJ5KHQsIGUpKSkpLm5leHQoKGUgPT4gKGkgPSBlLCBcbiAgICAgICAgdGhpcy5Obih0LCBpLCBzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHMgPSB0O1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGkpIGZvciAoY29uc3QgZSBvZiB0Lm11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBlLmtleTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IHMuZ2V0KG4pO1xuICAgICAgICAgICAgICAgIG51bGwgPT0gaSAmJiAoXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGludmFsaWQgZG9jdW1lbnQgdG8gYXBwbHkgbXV0YXRpb25zIG9uIHRvcCBvZlxuICAgICAgICAgICAgICAgIGkgPSBXdC5uZXdJbnZhbGlkRG9jdW1lbnQobiksIHMgPSBzLmluc2VydChuLCBpKSksIHRuKGUsIGksIHQubG9jYWxXcml0ZVRpbWUpLCBpLmlzRm91bmREb2N1bWVudCgpIHx8IChzID0gcy5yZW1vdmUobikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkpKSkubmV4dCgoKCkgPT4gKFxuICAgICAgICAvLyBGaW5hbGx5LCBmaWx0ZXIgb3V0IGFueSBkb2N1bWVudHMgdGhhdCBkb24ndCBhY3R1YWxseSBtYXRjaFxuICAgICAgICAvLyB0aGUgcXVlcnkuXG4gICAgICAgIHMuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIFNlKGUsIG4pIHx8IChzID0gcy5yZW1vdmUodCkpO1xuICAgICAgICB9KSksIHMpKSk7XG4gICAgfVxuICAgIE5uKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBTbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkgZm9yIChjb25zdCBlIG9mIHQubXV0YXRpb25zKSBlIGluc3RhbmNlb2Ygb24gJiYgbnVsbCA9PT0gbi5nZXQoZS5rZXkpICYmIChzID0gcy5hZGQoZS5rZXkpKTtcbiAgICAgICAgbGV0IGkgPSBuO1xuICAgICAgICByZXR1cm4gdGhpcy5KZS5nZXRFbnRyaWVzKHQsIHMpLm5leHQoKHQgPT4gKHQuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGUuaXNGb3VuZERvY3VtZW50KCkgJiYgKGkgPSBpLmluc2VydCh0LCBlKSk7XG4gICAgICAgIH0pKSwgaSkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgc2V0IG9mIGNoYW5nZXMgdG8gd2hhdCBkb2N1bWVudHMgYXJlIGN1cnJlbnRseSBpbiB2aWV3IGFuZCBvdXQgb2YgdmlldyBmb3JcbiAqIGEgZ2l2ZW4gcXVlcnkuIFRoZXNlIGNoYW5nZXMgYXJlIHNlbnQgdG8gdGhlIExvY2FsU3RvcmUgYnkgdGhlIFZpZXcgKHZpYVxuICogdGhlIFN5bmNFbmdpbmUpIGFuZCBhcmUgdXNlZCB0byBwaW4gLyB1bnBpbiBkb2N1bWVudHMgYXMgYXBwcm9wcmlhdGUuXG4gKi8gY2xhc3MgdXIge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy50YXJnZXRJZCA9IHQsIHRoaXMuZnJvbUNhY2hlID0gZSwgdGhpcy5rbiA9IG4sIHRoaXMueG4gPSBzO1xuICAgIH1cbiAgICBzdGF0aWMgJG4odCwgZSkge1xuICAgICAgICBsZXQgbiA9IFNuKCksIHMgPSBTbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZS5kb2NDaGFuZ2VzKSBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICBuID0gbi5hZGQodC5kb2Mua2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgcyA9IHMuYWRkKHQuZG9jLmtleSk7XG4gLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB1cih0LCBlLmZyb21DYWNoZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHF1ZXJ5IGVuZ2luZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50IG1hcHBpbmcgaW4gdGhlXG4gKiBRdWVyeUNhY2hlLiBRdWVyeSBleGVjdXRpb24gaXMgb3B0aW1pemVkIGJ5IG9ubHkgcmVhZGluZyB0aGUgZG9jdW1lbnRzIHRoYXRcbiAqIHByZXZpb3VzbHkgbWF0Y2hlZCBhIHF1ZXJ5IHBsdXMgYW55IGRvY3VtZW50cyB0aGF0IHdlcmUgZWRpdGVkIGFmdGVyIHRoZVxuICogcXVlcnkgd2FzIGxhc3QgbGlzdGVuZWQgdG8uXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlbiB0aGlzIG9wdGltaXphdGlvbiBpcyBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlXG4gKiB0aGUgc2FtZSByZXN1bHRzIGFzIGZ1bGwgY29sbGVjdGlvbiBzY2Fucy4gSW4gdGhlc2UgY2FzZXMsIHF1ZXJ5XG4gKiBwcm9jZXNzaW5nIGZhbGxzIGJhY2sgdG8gZnVsbCBzY2Fucy4gVGhlc2UgY2FzZXMgYXJlOlxuICpcbiAqIC0gTGltaXQgcXVlcmllcyB3aGVyZSBhIGRvY3VtZW50IHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgcHJldmlvdXNseSBubyBsb25nZXJcbiAqICAgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gKlxuICogLSBMaW1pdCBxdWVyaWVzIHdoZXJlIGEgZG9jdW1lbnQgZWRpdCBtYXkgY2F1c2UgdGhlIGRvY3VtZW50IHRvIHNvcnQgYmVsb3dcbiAqICAgYW5vdGhlciBkb2N1bWVudCB0aGF0IGlzIGluIHRoZSBsb2NhbCBjYWNoZS5cbiAqXG4gKiAtIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gQ1VSUkVOVCBvciBmcmVlIG9mIGxpbWJvIGRvY3VtZW50cy5cbiAqLyBjbGFzcyBociB7XG4gICAgLyoqIFNldHMgdGhlIGRvY3VtZW50IHZpZXcgdG8gcXVlcnkgYWdhaW5zdC4gKi9cbiAgICBGbih0KSB7XG4gICAgICAgIHRoaXMuT24gPSB0O1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhbGwgbG9jYWwgZG9jdW1lbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcXVlcnkuICovICAgIGdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbiwgcykge1xuICAgICAgICAvLyBRdWVyaWVzIHRoYXQgbWF0Y2ggYWxsIGRvY3VtZW50cyBkb24ndCBiZW5lZml0IGZyb20gdXNpbmdcbiAgICAgICAgLy8ga2V5LWJhc2VkIGxvb2t1cHMuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIHNjYW4gYWxsIGRvY3VtZW50cyBpbiBhXG4gICAgICAgIC8vIGNvbGxlY3Rpb24sIHJhdGhlciB0aGFuIHRvIHBlcmZvcm0gaW5kaXZpZHVhbCBsb29rdXBzLlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQuZmlsdGVycy5sZW5ndGggJiYgbnVsbCA9PT0gdC5saW1pdCAmJiBudWxsID09IHQuc3RhcnRBdCAmJiBudWxsID09IHQuZW5kQXQgJiYgKDAgPT09IHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCB8fCAxID09PSB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggJiYgdC5leHBsaWNpdE9yZGVyQnlbMF0uZmllbGQuaXNLZXlGaWVsZCgpKTtcbiAgICAgICAgfShlKSB8fCBuLmlzRXF1YWwoY3QubWluKCkpID8gdGhpcy5Nbih0LCBlKSA6IHRoaXMuT24udm4odCwgcykubmV4dCgoaSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gdGhpcy5MbihlLCBpKTtcbiAgICAgICAgICAgIHJldHVybiAoeWUoZSkgfHwgcGUoZSkpICYmIHRoaXMuQm4oZS5saW1pdFR5cGUsIHIsIHMsIG4pID8gdGhpcy5Nbih0LCBlKSA6IChrKCkgPD0gTG9nTGV2ZWwuREVCVUcgJiYgJChcIlF1ZXJ5RW5naW5lXCIsIFwiUmUtdXNpbmcgcHJldmlvdXMgcmVzdWx0IGZyb20gJXMgdG8gZXhlY3V0ZSBxdWVyeTogJXNcIiwgbi50b1N0cmluZygpLCBWZShlKSksIFxuICAgICAgICAgICAgdGhpcy5Pbi5nZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIGUsIG4pLm5leHQoKHQgPT4gKFxuICAgICAgICAgICAgLy8gV2UgbWVyZ2UgYHByZXZpb3VzUmVzdWx0c2AgaW50byBgdXBkYXRlUmVzdWx0c2AsIHNpbmNlXG4gICAgICAgICAgICAvLyBgdXBkYXRlUmVzdWx0c2AgaXMgYWxyZWFkeSBhIERvY3VtZW50TWFwLiBJZiBhIGRvY3VtZW50IGlzXG4gICAgICAgICAgICAvLyBjb250YWluZWQgaW4gYm90aCBsaXN0cywgdGhlbiBpdHMgY29udGVudHMgYXJlIHRoZSBzYW1lLlxuICAgICAgICAgICAgci5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgICAgICB0ID0gdC5pbnNlcnQoZS5rZXksIGUpO1xuICAgICAgICAgICAgfSkpLCB0KSkpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyBRdWVyaWVzIHRoYXQgaGF2ZSBuZXZlciBzZWVuIGEgc25hcHNob3Qgd2l0aG91dCBsaW1ibyBmcmVlIGRvY3VtZW50c1xuICAgICAgICAvLyBzaG91bGQgYWxzbyBiZSBydW4gYXMgYSBmdWxsIGNvbGxlY3Rpb24gc2Nhbi5cbiAgICAgICAgfVxuICAgIC8qKiBBcHBsaWVzIHRoZSBxdWVyeSBmaWx0ZXIgYW5kIHNvcnRpbmcgdG8gdGhlIHByb3ZpZGVkIGRvY3VtZW50cy4gICovICAgIExuKHQsIGUpIHtcbiAgICAgICAgLy8gU29ydCB0aGUgZG9jdW1lbnRzIGFuZCByZS1hcHBseSB0aGUgcXVlcnkgZmlsdGVyIHNpbmNlIHByZXZpb3VzbHlcbiAgICAgICAgLy8gbWF0Y2hpbmcgZG9jdW1lbnRzIGRvIG5vdCBuZWNlc3NhcmlseSBzdGlsbCBtYXRjaCB0aGUgcXVlcnkuXG4gICAgICAgIGxldCBuID0gbmV3IFRuKERlKHQpKTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgoKGUsIHMpID0+IHtcbiAgICAgICAgICAgIFNlKHQsIHMpICYmIChuID0gbi5hZGQocykpO1xuICAgICAgICB9KSksIG47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBsaW1pdCBxdWVyeSBuZWVkcyB0byBiZSByZWZpbGxlZCBmcm9tIGNhY2hlLCBtYWtpbmcgaXRcbiAgICAgKiBpbmVsaWdpYmxlIGZvciBpbmRleC1mcmVlIGV4ZWN1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3J0ZWRQcmV2aW91c1Jlc3VsdHMgLSBUaGUgZG9jdW1lbnRzIHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgd2hlbiBpdFxuICAgICAqIHdhcyBsYXN0IHN5bmNocm9uaXplZCwgc29ydGVkIGJ5IHRoZSBxdWVyeSdzIGNvbXBhcmF0b3IuXG4gICAgICogQHBhcmFtIHJlbW90ZUtleXMgLSBUaGUgZG9jdW1lbnQga2V5cyB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5IGF0IHRoZSBsYXN0XG4gICAgICogc25hcHNob3QuXG4gICAgICogQHBhcmFtIGxpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIG9mIHRoZSBzbmFwc2hvdCB3aGVuIHRoZVxuICAgICAqIHF1ZXJ5IHdhcyBsYXN0IHN5bmNocm9uaXplZC5cbiAgICAgKi8gICAgQm4odCwgZSwgbiwgcykge1xuICAgICAgICAvLyBUaGUgcXVlcnkgbmVlZHMgdG8gYmUgcmVmaWxsZWQgaWYgYSBwcmV2aW91c2x5IG1hdGNoaW5nIGRvY3VtZW50IG5vXG4gICAgICAgIC8vIGxvbmdlciBtYXRjaGVzLlxuICAgICAgICBpZiAobi5zaXplICE9PSBlLnNpemUpIHJldHVybiAhMDtcbiAgICAgICAgLy8gTGltaXQgcXVlcmllcyBhcmUgbm90IGVsaWdpYmxlIGZvciBpbmRleC1mcmVlIHF1ZXJ5IGV4ZWN1dGlvbiBpZiB0aGVyZSBpc1xuICAgICAgICAvLyBhIHBvdGVudGlhbCB0aGF0IGFuIG9sZGVyIGRvY3VtZW50IGZyb20gY2FjaGUgbm93IHNvcnRzIGJlZm9yZSBhIGRvY3VtZW50XG4gICAgICAgIC8vIHRoYXQgd2FzIHByZXZpb3VzbHkgcGFydCBvZiB0aGUgbGltaXQuIFRoaXMsIGhvd2V2ZXIsIGNhbiBvbmx5IGhhcHBlbiBpZlxuICAgICAgICAvLyB0aGUgZG9jdW1lbnQgYXQgdGhlIGVkZ2Ugb2YgdGhlIGxpbWl0IGdvZXMgb3V0IG9mIGxpbWl0LlxuICAgICAgICAvLyBJZiBhIGRvY3VtZW50IHRoYXQgaXMgbm90IHRoZSBsaW1pdCBib3VuZGFyeSBzb3J0cyBkaWZmZXJlbnRseSxcbiAgICAgICAgLy8gdGhlIGJvdW5kYXJ5IG9mIHRoZSBsaW1pdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2UgYW5kIGRvY3VtZW50cyBmcm9tIGNhY2hlXG4gICAgICAgIC8vIHdpbGwgY29udGludWUgdG8gYmUgXCJyZWplY3RlZFwiIGJ5IHRoaXMgYm91bmRhcnkuIFRoZXJlZm9yZSwgd2UgY2FuIGlnbm9yZVxuICAgICAgICAvLyBhbnkgbW9kaWZpY2F0aW9ucyB0aGF0IGRvbid0IGFmZmVjdCB0aGUgbGFzdCBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBpID0gXCJGXCIgLyogRmlyc3QgKi8gPT09IHQgPyBlLmxhc3QoKSA6IGUuZmlyc3QoKTtcbiAgICAgICAgcmV0dXJuICEhaSAmJiAoaS5oYXNQZW5kaW5nV3JpdGVzIHx8IGkudmVyc2lvbi5jb21wYXJlVG8ocykgPiAwKTtcbiAgICB9XG4gICAgTW4odCwgZSkge1xuICAgICAgICByZXR1cm4gaygpIDw9IExvZ0xldmVsLkRFQlVHICYmICQoXCJRdWVyeUVuZ2luZVwiLCBcIlVzaW5nIGZ1bGwgY29sbGVjdGlvbiBzY2FuIHRvIGV4ZWN1dGUgcXVlcnk6XCIsIFZlKGUpKSwgXG4gICAgICAgIHRoaXMuT24uZ2V0RG9jdW1lbnRzTWF0Y2hpbmdRdWVyeSh0LCBlLCBjdC5taW4oKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRzIGBMb2NhbFN0b3JlYCBpbnRlcmZhY2UuXG4gKlxuICogTm90ZTogc29tZSBmaWVsZCBkZWZpbmVkIGluIHRoaXMgY2xhc3MgbWlnaHQgaGF2ZSBwdWJsaWMgYWNjZXNzIGxldmVsLCBidXRcbiAqIHRoZSBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgc28gdGhleSBhcmUgb25seSBhY2Nlc3NpYmxlIGZyb20gdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgb3B0aW9uYWwgZmVhdHVyZXMgKGxpa2UgYnVuZGxlcykgaW4gZnJlZVxuICogZnVuY3Rpb25zLCBzdWNoIHRoYXQgdGhleSBhcmUgdHJlZS1zaGFrZWFibGUuXG4gKi9cbmNsYXNzIGxyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogTWFuYWdlcyBvdXIgaW4tbWVtb3J5IG9yIGR1cmFibGUgcGVyc2lzdGVuY2UuICovXG4gICAgdCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgdGhpcy5VbiA9IGUsIHRoaXMuayA9IHMsIFxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIHRhcmdldElEIHRvIGRhdGEgYWJvdXQgaXRzIHRhcmdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogUE9SVElORyBOT1RFOiBXZSBhcmUgdXNpbmcgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIG9uIFdlYiB0byBtYWtlIHJlLXJ1bnNcbiAgICAgICAgICogb2YgYGFwcGx5UmVtb3RlRXZlbnQoKWAgaWRlbXBvdGVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucW4gPSBuZXcgZ24oaXQpLCBcbiAgICAgICAgLyoqIE1hcHMgYSB0YXJnZXQgdG8gaXRzIHRhcmdldElELiAqL1xuICAgICAgICAvLyBUT0RPKHd1YW5keSk6IEV2YWx1YXRlIGlmIFRhcmdldElkIGNhbiBiZSBwYXJ0IG9mIFRhcmdldC5cbiAgICAgICAgdGhpcy5LbiA9IG5ldyBHaSgodCA9PiBIdCh0KSksIFl0KSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVhZCB0aW1lIG9mIHRoZSBsYXN0IGVudHJ5IHByb2Nlc3NlZCBieSBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qbiA9IGN0Lm1pbigpLCB0aGlzLkFuID0gdC5nZXRNdXRhdGlvblF1ZXVlKG4pLCB0aGlzLlFuID0gdC5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCksIFxuICAgICAgICB0aGlzLkhlID0gdC5nZXRUYXJnZXRDYWNoZSgpLCB0aGlzLlduID0gbmV3IGNyKHRoaXMuUW4sIHRoaXMuQW4sIHRoaXMucGVyc2lzdGVuY2UuZ2V0SW5kZXhNYW5hZ2VyKCkpLCBcbiAgICAgICAgdGhpcy5ZZSA9IHQuZ2V0QnVuZGxlQ2FjaGUoKSwgdGhpcy5Vbi5Gbih0aGlzLlduKTtcbiAgICB9XG4gICAgY29sbGVjdEdhcmJhZ2UodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkNvbGxlY3QgZ2FyYmFnZVwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsIChlID0+IHQuY29sbGVjdChlLCB0aGlzLnFuKSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZnIoXG4vKiogTWFuYWdlcyBvdXIgaW4tbWVtb3J5IG9yIGR1cmFibGUgcGVyc2lzdGVuY2UuICovXG50LCBlLCBuLCBzKSB7XG4gICAgcmV0dXJuIG5ldyBscih0LCBlLCBuLCBzKTtcbn1cblxuLyoqXG4gKiBUZWxscyB0aGUgTG9jYWxTdG9yZSB0aGF0IHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCB1c2VyIGhhcyBjaGFuZ2VkLlxuICpcbiAqIEluIHJlc3BvbnNlIHRoZSBsb2NhbCBzdG9yZSBzd2l0Y2hlcyB0aGUgbXV0YXRpb24gcXVldWUgdG8gdGhlIG5ldyB1c2VyIGFuZFxuICogcmV0dXJucyBhbnkgcmVzdWx0aW5nIGRvY3VtZW50IGNoYW5nZXMuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogQW5kcm9pZCBhbmQgaU9TIG9ubHkgcmV0dXJuIHRoZSBkb2N1bWVudHMgYWZmZWN0ZWQgYnkgdGhlXG4vLyBjaGFuZ2UuXG5hc3luYyBmdW5jdGlvbiBkcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCk7XG4gICAgbGV0IHMgPSBuLkFuLCBpID0gbi5XbjtcbiAgICBjb25zdCByID0gYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkhhbmRsZSB1c2VyIGNoYW5nZVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IHtcbiAgICAgICAgLy8gU3dhcCBvdXQgdGhlIG11dGF0aW9uIHF1ZXVlLCBncmFiYmluZyB0aGUgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzXG4gICAgICAgIC8vIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gICAgICAgIGxldCByO1xuICAgICAgICByZXR1cm4gbi5Bbi5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkubmV4dCgobyA9PiAociA9IG8sIHMgPSBuLnBlcnNpc3RlbmNlLmdldE11dGF0aW9uUXVldWUoZSksIFxuICAgICAgICAvLyBSZWNyZWF0ZSBvdXIgTG9jYWxEb2N1bWVudHNWaWV3IHVzaW5nIHRoZSBuZXdcbiAgICAgICAgLy8gTXV0YXRpb25RdWV1ZS5cbiAgICAgICAgaSA9IG5ldyBjcihuLlFuLCBzLCBuLnBlcnNpc3RlbmNlLmdldEluZGV4TWFuYWdlcigpKSwgcy5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkpKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gW10sIHMgPSBbXTtcbiAgICAgICAgICAgIC8vIFVuaW9uIHRoZSBvbGQvbmV3IGNoYW5nZWQga2V5cy5cbiAgICAgICAgICAgIGxldCBvID0gU24oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSB7XG4gICAgICAgICAgICAgICAgbi5wdXNoKHQuYmF0Y2hJZCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQubXV0YXRpb25zKSBvID0gby5hZGQoZS5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgICAgICBzLnB1c2godC5iYXRjaElkKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5tdXRhdGlvbnMpIG8gPSBvLmFkZChlLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHNldCBvZiBhbGwgKHBvdGVudGlhbGx5KSBjaGFuZ2VkIGRvY3VtZW50cyBhbmQgdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIG9mIG11dGF0aW9uIGJhdGNoIElEcyB0aGF0IHdlcmUgYWZmZWN0ZWQgYnkgY2hhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkudm4odCwgbykubmV4dCgodCA9PiAoe1xuICAgICAgICAgICAgICAgIEduOiB0LFxuICAgICAgICAgICAgICAgIHJlbW92ZWRCYXRjaElkczogbixcbiAgICAgICAgICAgICAgICBhZGRlZEJhdGNoSWRzOiBzXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICB9KSk7XG4gICAgfSkpO1xuICAgIHJldHVybiBuLkFuID0gcywgbi5XbiA9IGksIG4uVW4uRm4obi5XbiksIHI7XG59XG5cbi8qIEFjY2VwdHMgbG9jYWxseSBnZW5lcmF0ZWQgTXV0YXRpb25zIGFuZCBjb21taXQgdGhlbSB0byBzdG9yYWdlLiAqL1xuLyoqXG4gKiBBY2tub3dsZWRnZXMgdGhlIGdpdmVuIGJhdGNoLlxuICpcbiAqIE9uIHRoZSBoYXBweSBwYXRoIHdoZW4gYSBiYXRjaCBpcyBhY2tub3dsZWRnZWQsIHRoZSBsb2NhbCBzdG9yZSB3aWxsXG4gKlxuICogICsgcmVtb3ZlIHRoZSBiYXRjaCBmcm9tIHRoZSBtdXRhdGlvbiBxdWV1ZTtcbiAqICArIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGU7XG4gKiAgKyByZWNhbGN1bGF0ZSB0aGUgbGF0ZW5jeSBjb21wZW5zYXRlZCB2aWV3IGltcGxpZWQgYnkgdGhvc2UgY2hhbmdlcyAodGhlcmVcbiAqICAgIG1heSBiZSBtdXRhdGlvbnMgaW4gdGhlIHF1ZXVlIHRoYXQgYWZmZWN0IHRoZSBkb2N1bWVudHMgYnV0IGhhdmVuJ3QgYmVlblxuICogICAgYWNrbm93bGVkZ2VkIHlldCk7IGFuZFxuICogICsgZ2l2ZSB0aGUgY2hhbmdlZCBkb2N1bWVudHMgYmFjayB0aGUgc3luYyBlbmdpbmVcbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIChtb2RpZmllZCkgZG9jdW1lbnRzLlxuICovXG5mdW5jdGlvbiB3cih0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBY2tub3dsZWRnZSBiYXRjaFwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsICh0ID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGUuYmF0Y2gua2V5cygpLCBpID0gbi5Rbi5uZXdDaGFuZ2VCdWZmZXIoe1xuICAgICAgICAgICAgdHJhY2tSZW1vdmFsczogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gbi5iYXRjaCwgciA9IGkua2V5cygpO1xuICAgICAgICAgICAgbGV0IG8gPSBHcy5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm4gci5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBvID0gby5uZXh0KCgoKSA9PiBzLmdldEVudHJ5KGUsIHQpKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuLmRvY1ZlcnNpb25zLmdldCh0KTtcbiAgICAgICAgICAgICAgICAgICAgQihudWxsICE9PSByKSwgZS52ZXJzaW9uLmNvbXBhcmVUbyhyKSA8IDAgJiYgKGkuYXBwbHlUb1JlbW90ZURvY3VtZW50KGUsIG4pLCBlLmlzVmFsaWREb2N1bWVudCgpICYmIFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGNvbW1pdFZlcnNpb24gYXMgdGhlIHJlYWRUaW1lIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudCdzIHVwZGF0ZVRpbWUgc2luY2UgdGhlIHVwZGF0ZVRpbWUgaXMgbm90IGFkdmFuY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB1cGRhdGVzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAgICAgcy5hZGRFbnRyeShlLCBuLmNvbW1pdFZlcnNpb24pKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSksIG8ubmV4dCgoKCkgPT4gdC5Bbi5yZW1vdmVNdXRhdGlvbkJhdGNoKGUsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFJldHVybnMgdGhlIGxvY2FsIHZpZXcgb2YgdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSBhIG11dGF0aW9uIGJhdGNoLiAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuICAgICAgICAobiwgdCwgZSwgaSkubmV4dCgoKCkgPT4gaS5hcHBseSh0KSkpLm5leHQoKCgpID0+IG4uQW4ucGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkpKS5uZXh0KCgoKSA9PiBuLlduLnZuKHQsIHMpKSk7XG4gICAgfSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgbXV0YXRpb25zIGZyb20gdGhlIE11dGF0aW9uUXVldWUgZm9yIHRoZSBzcGVjaWZpZWQgYmF0Y2g7XG4gKiBMb2NhbERvY3VtZW50cyB3aWxsIGJlIHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIG1vZGlmaWVkIGRvY3VtZW50cy5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNvbnNpc3RlbnQgc25hcHNob3QgcHJvY2Vzc2VkICh1c2VkIGJ5IHRoZSBSZW1vdGVTdG9yZSB0b1xuICogZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYnVmZmVyIGluY29taW5nIHNuYXBzaG90cyBmcm9tIHRoZSBiYWNrZW5kKS5cbiAqL1xuZnVuY3Rpb24gX3IodCkge1xuICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgIHJldHVybiBlLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IGxhc3QgcmVtb3RlIHNuYXBzaG90IHZlcnNpb25cIiwgXCJyZWFkb25seVwiLCAodCA9PiBlLkhlLmdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24odCkpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBcImdyb3VuZC1zdGF0ZVwiIChyZW1vdGUpIGRvY3VtZW50cy4gV2UgYXNzdW1lIHRoYXQgdGhlIHJlbW90ZVxuICogZXZlbnQgcmVmbGVjdHMgYW55IHdyaXRlIGJhdGNoZXMgdGhhdCBoYXZlIGJlZW4gYWNrbm93bGVkZ2VkIG9yIHJlamVjdGVkXG4gKiAoaS5lLiB3ZSBkbyBub3QgcmUtYXBwbHkgbG9jYWwgbXV0YXRpb25zIHRvIHVwZGF0ZXMgZnJvbSB0aGlzIGV2ZW50KS5cbiAqXG4gKiBMb2NhbERvY3VtZW50cyBhcmUgcmUtY2FsY3VsYXRlZCBpZiB0aGVyZSBhcmUgcmVtYWluaW5nIG11dGF0aW9ucyBpbiB0aGVcbiAqIHF1ZXVlLlxuICovIGZ1bmN0aW9uIG1yKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KSwgcyA9IGUuc25hcHNob3RWZXJzaW9uO1xuICAgIGxldCBpID0gbi5xbjtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFwcGx5IHJlbW90ZSBldmVudFwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsICh0ID0+IHtcbiAgICAgICAgY29uc3QgciA9IG4uUW4ubmV3Q2hhbmdlQnVmZmVyKHtcbiAgICAgICAgICAgIHRyYWNrUmVtb3ZhbHM6ICEwXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZXNldCBuZXdUYXJnZXREYXRhQnlUYXJnZXRNYXAgaW4gY2FzZSB0aGlzIHRyYW5zYWN0aW9uIGdldHMgcmUtcnVuLlxuICAgICAgICAgICAgICAgIGkgPSBuLnFuO1xuICAgICAgICBjb25zdCBvID0gW107XG4gICAgICAgIGUudGFyZ2V0Q2hhbmdlcy5mb3JFYWNoKCgoZSwgcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGkuZ2V0KHIpO1xuICAgICAgICAgICAgaWYgKCFhKSByZXR1cm47XG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgcmVtb3RlIGtleXMgaWYgdGhlIHRhcmdldCBpcyBzdGlsbCBhY3RpdmUuIFRoaXNcbiAgICAgICAgICAgIC8vIGVuc3VyZXMgdGhhdCB3ZSBjYW4gcGVyc2lzdCB0aGUgdXBkYXRlZCB0YXJnZXQgZGF0YSBhbG9uZyB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgdXBkYXRlZCBhc3NpZ25tZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKG4uSGUucmVtb3ZlTWF0Y2hpbmdLZXlzKHQsIGUucmVtb3ZlZERvY3VtZW50cywgcikubmV4dCgoKCkgPT4gbi5IZS5hZGRNYXRjaGluZ0tleXModCwgZS5hZGRlZERvY3VtZW50cywgcikpKSk7XG4gICAgICAgICAgICBjb25zdCBjID0gZS5yZXN1bWVUb2tlbjtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVzdW1lIHRva2VuIGlmIHRoZSBjaGFuZ2UgaW5jbHVkZXMgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBhLndpdGhSZXN1bWVUb2tlbihjLCBzKS53aXRoU2VxdWVuY2VOdW1iZXIodC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpO1xuICAgICAgICAgICAgICAgIGkgPSBpLmluc2VydChyLCB1KSwgXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0YXJnZXQgZGF0YSBpZiB0aGVyZSBhcmUgdGFyZ2V0IGNoYW5nZXMgKG9yIGlmXG4gICAgICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlKS5cbiAgICAgICAgICAgICAgICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV3VGFyZ2V0RGF0YSBzaG91bGQgYmUgcGVyc2lzdGVkIGR1cmluZyBhbiB1cGRhdGUgb2ZcbiAqIGFuIGFjdGl2ZSB0YXJnZXQuIFRhcmdldERhdGEgc2hvdWxkIGFsd2F5cyBiZSBwZXJzaXN0ZWQgd2hlbiBhIHRhcmdldCBpc1xuICogYmVpbmcgcmVsZWFzZWQgYW5kIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLlxuICpcbiAqIFdoaWxlIHRoZSB0YXJnZXQgaXMgYWN0aXZlLCBUYXJnZXREYXRhIHVwZGF0ZXMgY2FuIGJlIG9taXR0ZWQgd2hlbiBub3RoaW5nXG4gKiBhYm91dCB0aGUgdGFyZ2V0IGhhcyBjaGFuZ2VkIGV4Y2VwdCBtZXRhZGF0YSBsaWtlIHRoZSByZXN1bWUgdG9rZW4gb3JcbiAqIHNuYXBzaG90IHZlcnNpb24uIE9jY2FzaW9uYWxseSBpdCdzIHdvcnRoIHRoZSBleHRyYSB3cml0ZSB0byBwcmV2ZW50IHRoZXNlXG4gKiB2YWx1ZXMgZnJvbSBnZXR0aW5nIHRvbyBzdGFsZSBhZnRlciBhIGNyYXNoLCBidXQgdGhpcyBkb2Vzbid0IGhhdmUgdG8gYmVcbiAqIHRvbyBmcmVxdWVudC5cbiAqL1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIHBlcnNpc3QgdGFyZ2V0IGRhdGEgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgcmVzdW1lIHRva2VuLlxuICAgICAgICAgICAgICAgICAgICBpZiAoQihlLnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDApLCAwID09PSB0LnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSkgcmV0dXJuICEwO1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyByZXN1bWUgdG9rZW4gY2hhbmdlcyB0byBiZSBidWZmZXJlZCBpbmRlZmluaXRlbHkuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3dzIHVzIHRvIGJlIHJlYXNvbmFibHkgdXAtdG8tZGF0ZSBhZnRlciBhIGNyYXNoIGFuZCBhdm9pZHMgbmVlZGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBsb29wIG92ZXIgYWxsIGFjdGl2ZSBxdWVyaWVzIG9uIHNodXRkb3duLiBFc3BlY2lhbGx5IGluIHRoZSBicm93c2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIG1heSBub3QgZ2V0IHRpbWUgdG8gZG8gYW55dGhpbmcgaW50ZXJlc3Rpbmcgd2hpbGUgdGhlIGN1cnJlbnQgdGFiIGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsb3NpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc25hcHNob3RWZXJzaW9uLnRvTWljcm9zZWNvbmRzKCkgLSB0LnNuYXBzaG90VmVyc2lvbi50b01pY3Jvc2Vjb25kcygpID49IDNlOCkgcmV0dXJuICEwO1xuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaWYgdGhlIG9ubHkgdGhpbmcgdGhhdCBoYXMgY2hhbmdlZCBhYm91dCBhIHRhcmdldCBpcyBpdHMgcmVzdW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIGl0J3Mgbm90IHdvcnRoIHBlcnNpc3RpbmcuIE5vdGUgdGhhdCB0aGUgUmVtb3RlU3RvcmUga2VlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW4tbWVtb3J5IHZpZXcgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0cyB3aGljaCBpbmNsdWRlcyB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgdG9rZW4sIHNvIHN0cmVhbSBmYWlsdXJlIG9yIHVzZXIgY2hhbmdlcyB3aWxsIHN0aWxsIHVzZSBhblxuICAgICAgICAgICAgICAgICAgICAvLyB1cC10by1kYXRlIHJlc3VtZSB0b2tlbiByZWdhcmRsZXNzIG9mIHdoYXQgd2UgZG8gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZGRlZERvY3VtZW50cy5zaXplICsgbi5tb2RpZmllZERvY3VtZW50cy5zaXplICsgbi5yZW1vdmVkRG9jdW1lbnRzLnNpemUgPiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKipcbiAqIE5vdGlmaWVzIGxvY2FsIHN0b3JlIG9mIHRoZSBjaGFuZ2VkIHZpZXdzIHRvIGxvY2FsbHkgcGluIGRvY3VtZW50cy5cbiAqLyAoYSwgdSwgZSkgJiYgby5wdXNoKG4uSGUudXBkYXRlVGFyZ2V0RGF0YSh0LCB1KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IGEgPSBBbigpO1xuICAgICAgICAvLyBIQUNLOiBUaGUgb25seSByZWFzb24gd2UgYWxsb3cgYSBudWxsIHNuYXBzaG90IHZlcnNpb24gaXMgc28gdGhhdCB3ZVxuICAgICAgICAvLyBjYW4gc3ludGhlc2l6ZSByZW1vdGUgZXZlbnRzIHdoZW4gd2UgZ2V0IHBlcm1pc3Npb24gZGVuaWVkIGVycm9ycyB3aGlsZVxuICAgICAgICAvLyB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgc3RhdGUgb2YgYSBsb2NhbGx5IGNhY2hlZCBkb2N1bWVudCB0aGF0IGlzIGluXG4gICAgICAgIC8vIGxpbWJvLlxuICAgICAgICBpZiAoZS5kb2N1bWVudFVwZGF0ZXMuZm9yRWFjaCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIGUucmVzb2x2ZWRMaW1ib0RvY3VtZW50cy5oYXMocykgJiYgby5wdXNoKG4ucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUudXBkYXRlTGltYm9Eb2N1bWVudCh0LCBzKSk7XG4gICAgICAgIH0pKSwgXG4gICAgICAgIC8vIEVhY2ggbG9vcCBpdGVyYXRpb24gb25seSBhZmZlY3RzIGl0cyBcIm93blwiIGRvYywgc28gaXQncyBzYWZlIHRvIGdldCBhbGwgdGhlIHJlbW90ZVxuICAgICAgICAvLyBkb2N1bWVudHMgaW4gYWR2YW5jZSBpbiBhIHNpbmdsZSBjYWxsLlxuICAgICAgICBvLnB1c2goZ3IodCwgciwgZS5kb2N1bWVudFVwZGF0ZXMsIHMsIHZvaWQgMCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBhID0gdDtcbiAgICAgICAgfSkpKSwgIXMuaXNFcXVhbChjdC5taW4oKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuLkhlLmdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24odCkubmV4dCgoZSA9PiBuLkhlLnNldFRhcmdldHNNZXRhZGF0YSh0LCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlciwgcykpKTtcbiAgICAgICAgICAgIG8ucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gR3Mud2FpdEZvcihvKS5uZXh0KCgoKSA9PiByLmFwcGx5KHQpKSkubmV4dCgoKCkgPT4gbi5Xbi5Wbih0LCBhKSkpLm5leHQoKCgpID0+IGEpKTtcbiAgICB9KSkudGhlbigodCA9PiAobi5xbiA9IGksIHQpKSk7XG59XG5cbi8qKlxuICogUG9wdWxhdGVzIGRvY3VtZW50IGNoYW5nZSBidWZmZXIgd2l0aCBkb2N1bWVudHMgZnJvbSBiYWNrZW5kIG9yIGEgYnVuZGxlLlxuICogUmV0dXJucyB0aGUgZG9jdW1lbnQgY2hhbmdlcyByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aG9zZSBkb2N1bWVudHMuXG4gKlxuICogQHBhcmFtIHR4biAtIFRyYW5zYWN0aW9uIHRvIHVzZSB0byByZWFkIGV4aXN0aW5nIGRvY3VtZW50cyBmcm9tIHN0b3JhZ2UuXG4gKiBAcGFyYW0gZG9jdW1lbnRCdWZmZXIgLSBEb2N1bWVudCBidWZmZXIgdG8gY29sbGVjdCB0aGUgcmVzdWx0ZWQgY2hhbmdlcyB0byBiZVxuICogICAgICAgIGFwcGxpZWQgdG8gc3RvcmFnZS5cbiAqIEBwYXJhbSBkb2N1bWVudHMgLSBEb2N1bWVudHMgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBnbG9iYWxWZXJzaW9uIC0gQSBgU25hcHNob3RWZXJzaW9uYCByZXByZXNlbnRpbmcgdGhlIHJlYWQgdGltZSBpZiBhbGxcbiAqICAgICAgICBkb2N1bWVudHMgaGF2ZSB0aGUgc2FtZSByZWFkIHRpbWUuXG4gKiBAcGFyYW0gZG9jdW1lbnRWZXJzaW9ucyAtIEEgRG9jdW1lbnRLZXktdG8tU25hcHNob3RWZXJzaW9uIG1hcCBpZiBkb2N1bWVudHNcbiAqICAgICAgICBoYXZlIHRoZWlyIG93biByZWFkIHRpbWUuXG4gKlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiB3aWxsIHVzZSBgZG9jdW1lbnRWZXJzaW9uc2AgaWYgaXQgaXMgZGVmaW5lZDtcbiAqIHdoZW4gaXQgaXMgbm90IGRlZmluZWQsIHJlc29ydHMgdG8gYGdsb2JhbFZlcnNpb25gLlxuICovIGZ1bmN0aW9uIGdyKHQsIGUsIG4sIHMsIFxuLy8gVE9ETyh3dWFuZHkpOiBXZSBjb3VsZCBhZGQgYHJlYWRUaW1lYCB0byBNYXliZURvY3VtZW50IGluc3RlYWQgdG8gcmVtb3ZlXG4vLyB0aGlzIHBhcmFtZXRlci5cbmkpIHtcbiAgICBsZXQgciA9IFNuKCk7XG4gICAgcmV0dXJuIG4uZm9yRWFjaCgodCA9PiByID0gci5hZGQodCkpKSwgZS5nZXRFbnRyaWVzKHQsIHIpLm5leHQoKHQgPT4ge1xuICAgICAgICBsZXQgciA9IEFuKCk7XG4gICAgICAgIHJldHVybiBuLmZvckVhY2goKChuLCBvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gdC5nZXQobiksIGMgPSAobnVsbCA9PSBpID8gdm9pZCAwIDogaS5nZXQobikpIHx8IHM7XG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIHN0ZXBzIGJlbG93IGlzIGltcG9ydGFudCwgc2luY2Ugd2Ugd2FudFxuICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgcmVqZWN0ZWQgbGltYm8gcmVzb2x1dGlvbnMgKHdoaWNoIGZhYnJpY2F0ZVxuICAgICAgICAgICAgLy8gTm9Eb2N1bWVudHMgd2l0aCBTbmFwc2hvdFZlcnNpb24ubWluKCkpIG5ldmVyIGFkZCBkb2N1bWVudHMgdG9cbiAgICAgICAgICAgIC8vIGNhY2hlLlxuICAgICAgICAgICAgby5pc05vRG9jdW1lbnQoKSAmJiBvLnZlcnNpb24uaXNFcXVhbChjdC5taW4oKSkgPyAoXG4gICAgICAgICAgICAvLyBOb0RvY3VtZW50cyB3aXRoIFNuYXBzaG90VmVyc2lvbi5taW4oKSBhcmUgdXNlZCBpbiBtYW51ZmFjdHVyZWRcbiAgICAgICAgICAgIC8vIGV2ZW50cy4gV2UgcmVtb3ZlIHRoZXNlIGRvY3VtZW50cyBmcm9tIGNhY2hlIHNpbmNlIHdlIGxvc3RcbiAgICAgICAgICAgIC8vIGFjY2Vzcy5cbiAgICAgICAgICAgIGUucmVtb3ZlRW50cnkobiwgYyksIHIgPSByLmluc2VydChuLCBvKSkgOiAhYS5pc1ZhbGlkRG9jdW1lbnQoKSB8fCBvLnZlcnNpb24uY29tcGFyZVRvKGEudmVyc2lvbikgPiAwIHx8IDAgPT09IG8udmVyc2lvbi5jb21wYXJlVG8oYS52ZXJzaW9uKSAmJiBhLmhhc1BlbmRpbmdXcml0ZXMgPyAoZS5hZGRFbnRyeShvLCBjKSwgXG4gICAgICAgICAgICByID0gci5pbnNlcnQobiwgbykpIDogJChcIkxvY2FsU3RvcmVcIiwgXCJJZ25vcmluZyBvdXRkYXRlZCB3YXRjaCB1cGRhdGUgZm9yIFwiLCBuLCBcIi4gQ3VycmVudCB2ZXJzaW9uOlwiLCBhLnZlcnNpb24sIFwiIFdhdGNoIHZlcnNpb246XCIsIG8udmVyc2lvbik7XG4gICAgICAgIH0pKSwgcjtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbXV0YXRpb24gYmF0Y2ggYWZ0ZXIgdGhlIHBhc3NlZCBpbiBiYXRjaElkIGluIHRoZSBtdXRhdGlvbiBxdWV1ZVxuICogb3IgbnVsbCBpZiBlbXB0eS5cbiAqIEBwYXJhbSBhZnRlckJhdGNoSWQgLSBJZiBwcm92aWRlZCwgdGhlIGJhdGNoIHRvIHNlYXJjaCBhZnRlci5cbiAqIEByZXR1cm5zIFRoZSBuZXh0IG11dGF0aW9uIG9yIG51bGwgaWYgdGhlcmUgd2Fzbid0IG9uZS5cbiAqL1xuZnVuY3Rpb24geXIodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpO1xuICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IG5leHQgbXV0YXRpb24gYmF0Y2hcIiwgXCJyZWFkb25seVwiLCAodCA9PiAodm9pZCAwID09PSBlICYmIChlID0gLTEpLCBcbiAgICBuLkFuLmdldE5leHRNdXRhdGlvbkJhdGNoQWZ0ZXJCYXRjaElkKHQsIGUpKSkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgRG9jdW1lbnQgd2l0aCBhIGdpdmVuIGtleSBvciBudWxsIGlmIG5vdFxuICogZm91bmQgLSB1c2VkIGZvciB0ZXN0aW5nLlxuICovXG4vKipcbiAqIEFzc2lnbnMgdGhlIGdpdmVuIHRhcmdldCBhbiBpbnRlcm5hbCBJRCBzbyB0aGF0IGl0cyByZXN1bHRzIGNhbiBiZSBwaW5uZWQgc29cbiAqIHRoZXkgZG9uJ3QgZ2V0IEdDJ2QuIEEgdGFyZ2V0IG11c3QgYmUgYWxsb2NhdGVkIGluIHRoZSBsb2NhbCBzdG9yZSBiZWZvcmVcbiAqIHRoZSBzdG9yZSBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgaXRzIHZpZXcuXG4gKlxuICogQWxsb2NhdGluZyBhbiBhbHJlYWR5IGFsbG9jYXRlZCBgVGFyZ2V0YCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgYFRhcmdldERhdGFgXG4gKiBmb3IgdGhhdCBgVGFyZ2V0YC5cbiAqL1xuZnVuY3Rpb24gcHIodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpO1xuICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQWxsb2NhdGUgdGFyZ2V0XCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IHtcbiAgICAgICAgbGV0IHM7XG4gICAgICAgIHJldHVybiBuLkhlLmdldFRhcmdldERhdGEodCwgZSkubmV4dCgoaSA9PiBpID8gKFxuICAgICAgICAvLyBUaGlzIHRhcmdldCBoYXMgYmVlbiBsaXN0ZW5lZCB0byBwcmV2aW91c2x5LCBzbyByZXVzZSB0aGVcbiAgICAgICAgLy8gcHJldmlvdXMgdGFyZ2V0SUQuXG4gICAgICAgIC8vIFRPRE8obWNnKTogZnJlc2hlbiBsYXN0IGFjY2Vzc2VkIGRhdGU/XG4gICAgICAgIHMgPSBpLCBHcy5yZXNvbHZlKHMpKSA6IG4uSGUuYWxsb2NhdGVUYXJnZXRJZCh0KS5uZXh0KChpID0+IChzID0gbmV3IGFpKGUsIGksIDAgLyogTGlzdGVuICovICwgdC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpLCBcbiAgICAgICAgbi5IZS5hZGRUYXJnZXREYXRhKHQsIHMpLm5leHQoKCgpID0+IHMpKSkpKSkpO1xuICAgIH0pKS50aGVuKCh0ID0+IHtcbiAgICAgICAgLy8gSWYgTXVsdGktVGFiIGlzIGVuYWJsZWQsIHRoZSBleGlzdGluZyB0YXJnZXQgZGF0YSBtYXkgYmUgbmV3ZXIgdGhhblxuICAgICAgICAvLyB0aGUgaW4tbWVtb3J5IGRhdGFcbiAgICAgICAgY29uc3QgcyA9IG4ucW4uZ2V0KHQudGFyZ2V0SWQpO1xuICAgICAgICByZXR1cm4gKG51bGwgPT09IHMgfHwgdC5zbmFwc2hvdFZlcnNpb24uY29tcGFyZVRvKHMuc25hcHNob3RWZXJzaW9uKSA+IDApICYmIChuLnFuID0gbi5xbi5pbnNlcnQodC50YXJnZXRJZCwgdCksIFxuICAgICAgICBuLktuLnNldChlLCB0LnRhcmdldElkKSksIHQ7XG4gICAgfSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIFRhcmdldERhdGEgYXMgc2VlbiBieSB0aGUgTG9jYWxTdG9yZSwgaW5jbHVkaW5nIHVwZGF0ZXMgdGhhdCBtYXlcbiAqIGhhdmUgbm90IHlldCBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVGFyZ2V0Q2FjaGUuXG4gKi9cbi8vIFZpc2libGUgZm9yIHRlc3RpbmcuXG4vKipcbiAqIFVucGlucyBhbGwgdGhlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhcmdldC4gSWZcbiAqIGBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YWAgaXMgc2V0IHRvIGZhbHNlIGFuZCBFYWdlciBHQyBlbmFibGVkLCB0aGUgbWV0aG9kXG4gKiBkaXJlY3RseSByZW1vdmVzIHRoZSBhc3NvY2lhdGVkIHRhcmdldCBkYXRhIGZyb20gdGhlIHRhcmdldCBjYWNoZS5cbiAqXG4gKiBSZWxlYXNpbmcgYSBub24tZXhpc3RpbmcgYFRhcmdldGAgaXMgYSBuby1vcC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBga2VlcFBlcnNpc3RlZFRhcmdldERhdGFgIGlzIG11bHRpLXRhYiBvbmx5LlxuYXN5bmMgZnVuY3Rpb24gVHIodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBxKHQpLCBpID0gcy5xbi5nZXQoZSksIHIgPSBuID8gXCJyZWFkd3JpdGVcIiA6IFwicmVhZHdyaXRlLXByaW1hcnlcIjtcbiAgICB0cnkge1xuICAgICAgICBuIHx8IGF3YWl0IHMucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJSZWxlYXNlIHRhcmdldFwiLCByLCAodCA9PiBzLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnJlbW92ZVRhcmdldCh0LCBpKSkpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgaWYgKCFYcyh0KSkgdGhyb3cgdDtcbiAgICAgICAgLy8gQWxsIGByZWxlYXNlVGFyZ2V0YCBkb2VzIGlzIHJlY29yZCB0aGUgZmluYWwgbWV0YWRhdGEgc3RhdGUgZm9yIHRoZVxuICAgICAgICAvLyB0YXJnZXQsIGJ1dCB3ZSd2ZSBiZWVuIHJlY29yZGluZyB0aGlzIHBlcmlvZGljYWxseSBkdXJpbmcgdGFyZ2V0XG4gICAgICAgIC8vIGFjdGl2aXR5LiBJZiB3ZSBsb3NlIHRoaXMgd3JpdGUgdGhpcyBjb3VsZCBjYXVzZSBhIHZlcnkgc2xpZ2h0XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gdGhlIG9yZGVyIG9mIHRhcmdldCBkZWxldGlvbiBkdXJpbmcgR0MsIGJ1dCB3ZVxuICAgICAgICAvLyBkb24ndCBkZWZpbmUgZXhhY3QgTFJVIHNlbWFudGljcyBzbyB0aGlzIGlzIGFjY2VwdGFibGUuXG4gICAgICAgICQoXCJMb2NhbFN0b3JlXCIsIGBGYWlsZWQgdG8gdXBkYXRlIHNlcXVlbmNlIG51bWJlcnMgZm9yIHRhcmdldCAke2V9OiAke3R9YCk7XG4gICAgfVxuICAgIHMucW4gPSBzLnFuLnJlbW92ZShlKSwgcy5Lbi5kZWxldGUoaS50YXJnZXQpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHNwZWNpZmllZCBxdWVyeSBhZ2FpbnN0IHRoZSBsb2NhbCBzdG9yZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyxcbiAqIHBvdGVudGlhbGx5IHRha2luZyBhZHZhbnRhZ2Ugb2YgcXVlcnkgZGF0YSBmcm9tIHByZXZpb3VzIGV4ZWN1dGlvbnMgKHN1Y2hcbiAqIGFzIHRoZSBzZXQgb2YgcmVtb3RlIGtleXMpLlxuICpcbiAqIEBwYXJhbSB1c2VQcmV2aW91c1Jlc3VsdHMgLSBXaGV0aGVyIHJlc3VsdHMgZnJvbSBwcmV2aW91cyBleGVjdXRpb25zIGNhblxuICogYmUgdXNlZCB0byBvcHRpbWl6ZSB0aGlzIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAqLyBmdW5jdGlvbiBFcih0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHEodCk7XG4gICAgbGV0IGkgPSBjdC5taW4oKSwgciA9IFNuKCk7XG4gICAgcmV0dXJuIHMucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJFeGVjdXRlIHF1ZXJ5XCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcSh0KSwgaSA9IHMuS24uZ2V0KG4pO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBpID8gR3MucmVzb2x2ZShzLnFuLmdldChpKSkgOiBzLkhlLmdldFRhcmdldERhdGEoZSwgbik7XG4gICAgfShzLCB0LCBSZShlKSkubmV4dCgoZSA9PiB7XG4gICAgICAgIGlmIChlKSByZXR1cm4gaSA9IGUubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiwgcy5IZS5nZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHIgPSB0O1xuICAgICAgICB9KSk7XG4gICAgfSkpLm5leHQoKCgpID0+IHMuVW4uZ2V0RG9jdW1lbnRzTWF0Y2hpbmdRdWVyeSh0LCBlLCBuID8gaSA6IGN0Lm1pbigpLCBuID8gciA6IFNuKCkpKSkubmV4dCgodCA9PiAoe1xuICAgICAgICBkb2N1bWVudHM6IHQsXG4gICAgICAgIHpuOiByXG4gICAgfSkpKSkpO1xufVxuXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gSXIodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gcShuLkhlKSwgaSA9IG4ucW4uZ2V0KGUpO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKGkudGFyZ2V0KSA6IG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgdGFyZ2V0IGRhdGFcIiwgXCJyZWFkb25seVwiLCAodCA9PiBzLkV0KHQsIGUpLm5leHQoKHQgPT4gdCA/IHQudGFyZ2V0IDogbnVsbCkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwuXG4gKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCByZXR1cm5zIHRoZSBzZXQgb2YgY2hhbmdlcyBzaW5jZSBjbGllbnRcbiAqIGluaXRpYWxpemF0aW9uLiBGdXJ0aGVyIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkXG4gKiBzaW5jZSB0aGUgcHJpb3IgY2FsbC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmZ1bmN0aW9uIEFyKHQpIHtcbiAgICBjb25zdCBlID0gcSh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkdldCBuZXcgZG9jdW1lbnQgY2hhbmdlc1wiLCBcInJlYWRvbmx5XCIsICh0ID0+IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IHEodCk7XG4gICAgICAgIGxldCBpID0gQW4oKSwgciA9IGxpKG4pO1xuICAgICAgICBjb25zdCBvID0gWGkoZSksIGEgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHIsICEwKTtcbiAgICAgICAgcmV0dXJuIG8uanQoe1xuICAgICAgICAgICAgaW5kZXg6ICRzLnJlYWRUaW1lSW5kZXgsXG4gICAgICAgICAgICByYW5nZTogYVxuICAgICAgICB9LCAoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIC8vIFVubGlrZSBgZ2V0RW50cnkoKWAgYW5kIG90aGVycywgYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYCBwYXJzZXNcbiAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudHMgZGlyZWN0bHkgc2luY2Ugd2Ugd2FudCB0byBrZWVwIHNlbnRpbmVsIGRlbGV0ZXMuXG4gICAgICAgICAgICBjb25zdCBuID0gdWkocy5rLCBlKTtcbiAgICAgICAgICAgIGkgPSBpLmluc2VydChuLmtleSwgbiksIHIgPSBlLnJlYWRUaW1lO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gKHtcbiAgICAgICAgICAgIEluOiBpLFxuICAgICAgICAgICAgcmVhZFRpbWU6IGZpKHIpXG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyB0aGUgcmVhZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgZG9jdW1lbnQgaW4gdGhlIGNhY2hlLCBvclxuICogU25hcHNob3RWZXJzaW9uLm1pbigpIGlmIG5vdCBhdmFpbGFibGUuXG4gKi9cbiAgICAvLyBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgIChlLlFuLCB0LCBlLmpuKSkpLnRoZW4oKCh7SW46IHQsIHJlYWRUaW1lOiBufSkgPT4gKGUuam4gPSBuLCB0KSkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBuZXdlc3QgZG9jdW1lbnQgY2hhbmdlIGZyb20gcGVyc2lzdGVuY2UgYW5kIG1vdmVzIHRoZSBpbnRlcm5hbFxuICogc3luY2hyb25pemF0aW9uIG1hcmtlciBmb3J3YXJkIHNvIHRoYXQgY2FsbHMgdG8gYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYFxuICogb25seSByZXR1cm4gY2hhbmdlcyB0aGF0IGhhcHBlbmVkIGFmdGVyIGNsaWVudCBpbml0aWFsaXphdGlvbi5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIFJyKHQpIHtcbiAgICBjb25zdCBlID0gcSh0KTtcbiAgICByZXR1cm4gZS5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlN5bmNocm9uaXplIGxhc3QgZG9jdW1lbnQgY2hhbmdlIHJlYWQgdGltZVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFhpKHQpO1xuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgZW50cmllcywgd2UgcmV0dXJuIFNuYXBzaG90VmVyc2lvbi5taW4oKS5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IGN0Lm1pbigpO1xuICAgICAgICByZXR1cm4gZS5qdCh7XG4gICAgICAgICAgICBpbmRleDogJHMucmVhZFRpbWVJbmRleCxcbiAgICAgICAgICAgIHJldmVyc2U6ICEwXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgZS5yZWFkVGltZSAmJiAobiA9IGZpKGUucmVhZFRpbWUpKSwgcy5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfSh0KSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICBlLmpuID0gdDtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgdXNpbmcgdGhlIGdpdmVuIGJ1bmRsZSBuYW1lLCB3aGljaCB3aWxsIGJlIHVzZWQgdG9cbiAqIGhvbGQgdGhlIGtleXMgb2YgYWxsIGRvY3VtZW50cyBmcm9tIHRoZSBidW5kbGUgaW4gcXVlcnktZG9jdW1lbnQgbWFwcGluZ3MuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbG9hZGVkIGRvY3VtZW50cyBkbyBub3QgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkXG4gKiByaWdodCBhd2F5LlxuICovXG4vKipcbiAqIEFwcGxpZXMgdGhlIGRvY3VtZW50cyBmcm9tIGEgYnVuZGxlIHRvIHRoZSBcImdyb3VuZC1zdGF0ZVwiIChyZW1vdGUpXG4gKiBkb2N1bWVudHMuXG4gKlxuICogTG9jYWxEb2N1bWVudHMgYXJlIHJlLWNhbGN1bGF0ZWQgaWYgdGhlcmUgYXJlIHJlbWFpbmluZyBtdXRhdGlvbnMgaW4gdGhlXG4gKiBxdWV1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gUHIodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBxKHQpO1xuICAgIGxldCByID0gU24oKSwgbyA9IEFuKCksIGEgPSB2bigpO1xuICAgIGZvciAoY29uc3QgdCBvZiBuKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLkhuKHQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgIHQuZG9jdW1lbnQgJiYgKHIgPSByLmFkZChuKSksIG8gPSBvLmluc2VydChuLCBlLkpuKHQpKSwgYSA9IGEuaW5zZXJ0KG4sIGUuWW4odC5tZXRhZGF0YS5yZWFkVGltZSkpO1xuICAgIH1cbiAgICBjb25zdCBjID0gaS5Rbi5uZXdDaGFuZ2VCdWZmZXIoe1xuICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgIH0pLCB1ID0gYXdhaXQgcHIoaSwgZnVuY3Rpb24odCkge1xuICAgICAgICAvLyBJdCBpcyBPSyB0aGF0IHRoZSBwYXRoIHVzZWQgZm9yIHRoZSBxdWVyeSBpcyBub3QgdmFsaWQsIGJlY2F1c2UgdGhpcyB3aWxsXG4gICAgICAgIC8vIG5vdCBiZSByZWFkIGFuZCBxdWVyaWVkLlxuICAgICAgICByZXR1cm4gUmUoZ2UoZHQuZnJvbVN0cmluZyhgX19idW5kbGVfXy9kb2NzLyR7dH1gKSkpO1xuICAgIH0ocykpO1xuICAgIC8vIEFsbG9jYXRlcyBhIHRhcmdldCB0byBob2xkIGFsbCBkb2N1bWVudCBrZXlzIGZyb20gdGhlIGJ1bmRsZSwgc3VjaCB0aGF0XG4gICAgLy8gdGhleSB3aWxsIG5vdCBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQgcmlnaHQgYXdheS5cbiAgICAgICAgcmV0dXJuIGkucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJBcHBseSBidW5kbGUgZG9jdW1lbnRzXCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IGdyKHQsIGMsIG8sIGN0Lm1pbigpLCBhKS5uZXh0KChlID0+IChjLmFwcGx5KHQpLCBcbiAgICBlKSkpLm5leHQoKGUgPT4gaS5IZS5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCB1LnRhcmdldElkKS5uZXh0KCgoKSA9PiBpLkhlLmFkZE1hdGNoaW5nS2V5cyh0LCByLCB1LnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkuV24uVm4odCwgZSkpKS5uZXh0KCgoKSA9PiBlKSkpKSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgZ2l2ZW4gYnVuZGxlIGhhcyBhbHJlYWR5XG4gKiBiZWVuIGxvYWRlZCBhbmQgdGhlIGNyZWF0ZSB0aW1lIGlzIG5ld2VyIHRoYW4gdGhlIGN1cnJlbnQgbG9hZGluZyBidW5kbGUuXG4gKi9cbi8qKlxuICogU2F2ZXMgdGhlIGdpdmVuIGBOYW1lZFF1ZXJ5YCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnIodCwgZSwgbiA9IFNuKCkpIHtcbiAgICAvLyBBbGxvY2F0ZSBhIHRhcmdldCBmb3IgdGhlIG5hbWVkIHF1ZXJ5IHN1Y2ggdGhhdCBpdCBjYW4gYmUgcmVzdW1lZFxuICAgIC8vIGZyb20gYXNzb2NpYXRlZCByZWFkIHRpbWUgaWYgdXNlcnMgdXNlIGl0IHRvIGxpc3Rlbi5cbiAgICAvLyBOT1RFOiB0aGlzIGFsc28gbWVhbnMgaWYgbm8gY29ycmVzcG9uZGluZyB0YXJnZXQgZXhpc3RzLCB0aGUgbmV3IHRhcmdldFxuICAgIC8vIHdpbGwgcmVtYWluIGFjdGl2ZSBhbmQgd2lsbCBub3QgZ2V0IGNvbGxlY3RlZCwgdW5sZXNzIHVzZXJzIGhhcHBlbiB0b1xuICAgIC8vIHVubGlzdGVuIHRoZSBxdWVyeSBzb21laG93LlxuICAgIGNvbnN0IHMgPSBhd2FpdCBwcih0LCBSZSh5aShlLmJ1bmRsZWRRdWVyeSkpKSwgaSA9IHEodCk7XG4gICAgcmV0dXJuIGkucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJTYXZlIG5hbWVkIHF1ZXJ5XCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IHtcbiAgICAgICAgY29uc3QgciA9IEduKGUucmVhZFRpbWUpO1xuICAgICAgICAvLyBTaW1wbHkgc2F2ZSB0aGUgcXVlcnkgaXRzZWxmIGlmIGl0IGlzIG9sZGVyIHRoYW4gd2hhdCB0aGUgU0RLIGFscmVhZHlcbiAgICAgICAgLy8gaGFzLlxuICAgICAgICAgICAgICAgIGlmIChzLnNuYXBzaG90VmVyc2lvbi5jb21wYXJlVG8ocikgPj0gMCkgcmV0dXJuIGkuWWUuc2F2ZU5hbWVkUXVlcnkodCwgZSk7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyB0YXJnZXQgZGF0YSBiZWNhdXNlIHRoZSBxdWVyeSBmcm9tIHRoZSBidW5kbGUgaXMgbmV3ZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IHMud2l0aFJlc3VtZVRva2VuKHl0LkVNUFRZX0JZVEVfU1RSSU5HLCByKTtcbiAgICAgICAgcmV0dXJuIGkucW4gPSBpLnFuLmluc2VydChvLnRhcmdldElkLCBvKSwgaS5IZS51cGRhdGVUYXJnZXREYXRhKHQsIG8pLm5leHQoKCgpID0+IGkuSGUucmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgcy50YXJnZXRJZCkpKS5uZXh0KCgoKSA9PiBpLkhlLmFkZE1hdGNoaW5nS2V5cyh0LCBuLCBzLnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkuWWUuc2F2ZU5hbWVkUXVlcnkodCwgZSkpKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIHZyIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuayA9IHQsIHRoaXMuWG4gPSBuZXcgTWFwLCB0aGlzLlpuID0gbmV3IE1hcDtcbiAgICB9XG4gICAgZ2V0QnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZSh0aGlzLlhuLmdldChlKSk7XG4gICAgfVxuICAgIHNhdmVCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIC8qKiBEZWNvZGVzIGEgQnVuZGxlTWV0YWRhdGEgcHJvdG8gaW50byBhIEJ1bmRsZU1ldGFkYXRhIG9iamVjdC4gKi9cbiAgICAgICAgdmFyIG47XG4gICAgICAgIHJldHVybiB0aGlzLlhuLnNldChlLmlkLCB7XG4gICAgICAgICAgICBpZDogKG4gPSBlKS5pZCxcbiAgICAgICAgICAgIHZlcnNpb246IG4udmVyc2lvbixcbiAgICAgICAgICAgIGNyZWF0ZVRpbWU6IEduKG4uY3JlYXRlVGltZSlcbiAgICAgICAgfSksIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0TmFtZWRRdWVyeSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHRoaXMuWm4uZ2V0KGUpKTtcbiAgICB9XG4gICAgc2F2ZU5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5abi5zZXQoZS5uYW1lLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHQubmFtZSxcbiAgICAgICAgICAgICAgICBxdWVyeTogeWkodC5idW5kbGVkUXVlcnkpLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBHbih0LnJlYWRUaW1lKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKSksIEdzLnJlc29sdmUoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIGEgZG9jdW1lbnQgZnJvbSBzb21lIGtpbmQgb2YgbnVtYmVyZWQgZW50aXR5XG4gKiAoZWl0aGVyIGEgdGFyZ2V0IElEIG9yIGJhdGNoIElEKS4gQXMgcmVmZXJlbmNlcyBhcmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tXG4gKiB0aGUgc2V0IGNvcnJlc3BvbmRpbmcgZXZlbnRzIGFyZSBlbWl0dGVkIHRvIGEgcmVnaXN0ZXJlZCBnYXJiYWdlIGNvbGxlY3Rvci5cbiAqXG4gKiBFYWNoIHJlZmVyZW5jZSBpcyByZXByZXNlbnRlZCBieSBhIERvY3VtZW50UmVmZXJlbmNlIG9iamVjdC4gRWFjaCBvZiB0aGVtXG4gKiBjb250YWlucyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHJlZmVyZW5jZS4gVGhleSBhcmUgYWxsXG4gKiBzdG9yZWQgcHJpbWFyaWx5IGluIGEgc2V0IHNvcnRlZCBieSBrZXkuIEEgZG9jdW1lbnQgaXMgY29uc2lkZXJlZCBnYXJiYWdlIGlmXG4gKiB0aGVyZSdzIG5vIHJlZmVyZW5jZXMgaW4gdGhhdCBzZXQgKHRoaXMgY2FuIGJlIGVmZmljaWVudGx5IGNoZWNrZWQgdGhhbmtzIHRvXG4gKiBzb3J0aW5nIGJ5IGtleSkuXG4gKlxuICogUmVmZXJlbmNlU2V0IGFsc28ga2VlcHMgYSBzZWNvbmRhcnkgc2V0IHRoYXQgY29udGFpbnMgcmVmZXJlbmNlcyBzb3J0ZWQgYnlcbiAqIElEcy4gVGhpcyBvbmUgaXMgdXNlZCB0byBlZmZpY2llbnRseSBpbXBsZW1lbnQgcmVtb3ZhbCBvZiBhbGwgcmVmZXJlbmNlcyBieVxuICogc29tZSB0YXJnZXQgSUQuXG4gKi8gY2xhc3MgVnIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBBIHNldCBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIGEgZG9jdW1lbnQgc29ydGVkIGJ5IGtleS5cbiAgICAgICAgdGhpcy50cyA9IG5ldyBUbihTci5lcyksIFxuICAgICAgICAvLyBBIHNldCBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIGEgZG9jdW1lbnQgc29ydGVkIGJ5IHRhcmdldCBpZC5cbiAgICAgICAgdGhpcy5ucyA9IG5ldyBUbihTci5zcyk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlZmVyZW5jZSBzZXQgY29udGFpbnMgbm8gcmVmZXJlbmNlcy4gKi8gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHMuaXNFbXB0eSgpO1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQga2V5IGZvciB0aGUgZ2l2ZW4gSUQuICovICAgIGFkZFJlZmVyZW5jZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgU3IodCwgZSk7XG4gICAgICAgIHRoaXMudHMgPSB0aGlzLnRzLmFkZChuKSwgdGhpcy5ucyA9IHRoaXMubnMuYWRkKG4pO1xuICAgIH1cbiAgICAvKiogQWRkIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGRvY3VtZW50IGtleXMgZm9yIHRoZSBnaXZlbiBJRC4gKi8gICAgcnModCwgZSkge1xuICAgICAgICB0LmZvckVhY2goKHQgPT4gdGhpcy5hZGRSZWZlcmVuY2UodCwgZSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQga2V5IGZvciB0aGUgZ2l2ZW5cbiAgICAgKiBJRC5cbiAgICAgKi8gICAgcmVtb3ZlUmVmZXJlbmNlKHQsIGUpIHtcbiAgICAgICAgdGhpcy5vcyhuZXcgU3IodCwgZSkpO1xuICAgIH1cbiAgICBjcyh0LCBlKSB7XG4gICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLnJlbW92ZVJlZmVyZW5jZSh0LCBlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHJlZmVyZW5jZXMgd2l0aCBhIGdpdmVuIElELiBDYWxscyByZW1vdmVSZWYoKSBmb3IgZWFjaCBrZXlcbiAgICAgKiByZW1vdmVkLlxuICAgICAqLyAgICB1cyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgU3QobmV3IGR0KFtdKSksIG4gPSBuZXcgU3IoZSwgdCksIHMgPSBuZXcgU3IoZSwgdCArIDEpLCBpID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLm5zLmZvckVhY2hJblJhbmdlKFsgbiwgcyBdLCAodCA9PiB7XG4gICAgICAgICAgICB0aGlzLm9zKHQpLCBpLnB1c2godC5rZXkpO1xuICAgICAgICB9KSksIGk7XG4gICAgfVxuICAgIGhzKCkge1xuICAgICAgICB0aGlzLnRzLmZvckVhY2goKHQgPT4gdGhpcy5vcyh0KSkpO1xuICAgIH1cbiAgICBvcyh0KSB7XG4gICAgICAgIHRoaXMudHMgPSB0aGlzLnRzLmRlbGV0ZSh0KSwgdGhpcy5ucyA9IHRoaXMubnMuZGVsZXRlKHQpO1xuICAgIH1cbiAgICBscyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgU3QobmV3IGR0KFtdKSksIG4gPSBuZXcgU3IoZSwgdCksIHMgPSBuZXcgU3IoZSwgdCArIDEpO1xuICAgICAgICBsZXQgaSA9IFNuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5zLmZvckVhY2hJblJhbmdlKFsgbiwgcyBdLCAodCA9PiB7XG4gICAgICAgICAgICBpID0gaS5hZGQodC5rZXkpO1xuICAgICAgICB9KSksIGk7XG4gICAgfVxuICAgIGNvbnRhaW5zS2V5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBTcih0LCAwKSwgbiA9IHRoaXMudHMuZmlyc3RBZnRlck9yRXF1YWwoZSk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSBuICYmIHQuaXNFcXVhbChuLmtleSk7XG4gICAgfVxufVxuXG5jbGFzcyBTciB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmtleSA9IHQsIHRoaXMuZnMgPSBlO1xuICAgIH1cbiAgICAvKiogQ29tcGFyZSBieSBrZXkgdGhlbiBieSBJRCAqLyAgICBzdGF0aWMgZXModCwgZSkge1xuICAgICAgICByZXR1cm4gU3QuY29tcGFyYXRvcih0LmtleSwgZS5rZXkpIHx8IGl0KHQuZnMsIGUuZnMpO1xuICAgIH1cbiAgICAvKiogQ29tcGFyZSBieSBJRCB0aGVuIGJ5IGtleSAqLyAgICBzdGF0aWMgc3ModCwgZSkge1xuICAgICAgICByZXR1cm4gaXQodC5mcywgZS5mcykgfHwgU3QuY29tcGFyYXRvcih0LmtleSwgZS5rZXkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgRHIge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5KdCA9IHQsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzZXQgb2YgYWxsIG11dGF0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZW50IGJ1dCBub3QgeWV0IGJlZW4gYXBwbGllZCB0b1xuICAgICAgICAgKiB0aGUgYmFja2VuZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuQW4gPSBbXSwgXG4gICAgICAgIC8qKiBOZXh0IHZhbHVlIHRvIHVzZSB3aGVuIGFzc2lnbmluZyBzZXF1ZW50aWFsIElEcyB0byBlYWNoIG11dGF0aW9uIGJhdGNoLiAqL1xuICAgICAgICB0aGlzLmRzID0gMSwgXG4gICAgICAgIC8qKiBBbiBvcmRlcmVkIG1hcHBpbmcgYmV0d2VlbiBkb2N1bWVudHMgYW5kIHRoZSBtdXRhdGlvbnMgYmF0Y2ggSURzLiAqL1xuICAgICAgICB0aGlzLndzID0gbmV3IFRuKFNyLmVzKTtcbiAgICB9XG4gICAgY2hlY2tFbXB0eSh0KSB7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKDAgPT09IHRoaXMuQW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgYWRkTXV0YXRpb25CYXRjaCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmRzO1xuICAgICAgICB0aGlzLmRzKyssIHRoaXMuQW4ubGVuZ3RoID4gMCAmJiB0aGlzLkFuW3RoaXMuQW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgcmkoaSwgZSwgbiwgcyk7XG4gICAgICAgIHRoaXMuQW4ucHVzaChyKTtcbiAgICAgICAgLy8gVHJhY2sgcmVmZXJlbmNlcyBieSBkb2N1bWVudCBrZXkgYW5kIGluZGV4IGNvbGxlY3Rpb24gcGFyZW50cy5cbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHRoaXMud3MgPSB0aGlzLndzLmFkZChuZXcgU3IoZS5rZXksIGkpKSwgdGhpcy5KdC5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlLmtleS5wYXRoLnBvcExhc3QoKSk7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHIpO1xuICAgIH1cbiAgICBsb29rdXBNdXRhdGlvbkJhdGNoKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUodGhpcy5fcyhlKSk7XG4gICAgfVxuICAgIGdldE5leHRNdXRhdGlvbkJhdGNoQWZ0ZXJCYXRjaElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgKyAxLCBzID0gdGhpcy5ncyhuKSwgaSA9IHMgPCAwID8gMCA6IHM7XG4gICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgYmF0Y2hJZCBtYXkgc3RpbGwgYmUgb3V0IG9mIHJhbmdlIHNvIG5vcm1hbGl6ZSBpdCB0byB0aGVcbiAgICAgICAgLy8gc3RhcnQgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHRoaXMuQW4ubGVuZ3RoID4gaSA/IHRoaXMuQW5baV0gOiBudWxsKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCgpIHtcbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUoMCA9PT0gdGhpcy5Bbi5sZW5ndGggPyAtMSA6IHRoaXMuZHMgLSAxKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUodGhpcy5Bbi5zbGljZSgpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IFNyKGUsIDApLCBzID0gbmV3IFNyKGUsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSksIGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMud3MuZm9yRWFjaEluUmFuZ2UoWyBuLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9zKHQuZnMpO1xuICAgICAgICAgICAgaS5wdXNoKGUpO1xuICAgICAgICB9KSksIEdzLnJlc29sdmUoaSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5cyh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gbmV3IFRuKGl0KTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFNyKHQsIDApLCBzID0gbmV3IFNyKHQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgICAgICB0aGlzLndzLmZvckVhY2hJblJhbmdlKFsgZSwgcyBdLCAodCA9PiB7XG4gICAgICAgICAgICAgICAgbiA9IG4uYWRkKHQuZnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSksIEdzLnJlc29sdmUodGhpcy55cyhuKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ1F1ZXJ5KHQsIGUpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBxdWVyeSBwYXRoIGFzIGEgcHJlZml4IGZvciB0ZXN0aW5nIGlmIGEgZG9jdW1lbnQgbWF0Y2hlcyB0aGVcbiAgICAgICAgLy8gcXVlcnkuXG4gICAgICAgIGNvbnN0IG4gPSBlLnBhdGgsIHMgPSBuLmxlbmd0aCArIDE7XG4gICAgICAgIC8vIENvbnN0cnVjdCBhIGRvY3VtZW50IHJlZmVyZW5jZSBmb3IgYWN0dWFsbHkgc2Nhbm5pbmcgdGhlIGluZGV4LiBVbmxpa2VcbiAgICAgICAgLy8gdGhlIHByZWZpeCB0aGUgZG9jdW1lbnQga2V5IGluIHRoaXMgcmVmZXJlbmNlIG11c3QgaGF2ZSBhbiBldmVuIG51bWJlciBvZlxuICAgICAgICAvLyBzZWdtZW50cy4gVGhlIGVtcHR5IHNlZ21lbnQgY2FuIGJlIHVzZWQgYSBzdWZmaXggb2YgdGhlIHF1ZXJ5IHBhdGhcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBwcmVjZWRlcyBhbGwgb3RoZXIgc2VnbWVudHMgaW4gYW4gb3JkZXJlZCB0cmF2ZXJzYWwuXG4gICAgICAgIGxldCBpID0gbjtcbiAgICAgICAgU3QuaXNEb2N1bWVudEtleShpKSB8fCAoaSA9IGkuY2hpbGQoXCJcIikpO1xuICAgICAgICBjb25zdCByID0gbmV3IFNyKG5ldyBTdChpKSwgMCk7XG4gICAgICAgIC8vIEZpbmQgdW5pcXVlIGJhdGNoSURzIHJlZmVyZW5jZWQgYnkgYWxsIGRvY3VtZW50cyBwb3RlbnRpYWxseSBtYXRjaGluZyB0aGVcbiAgICAgICAgLy8gcXVlcnkuXG4gICAgICAgICAgICAgICAgbGV0IG8gPSBuZXcgVG4oaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy53cy5mb3JFYWNoV2hpbGUoKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQua2V5LnBhdGg7XG4gICAgICAgICAgICByZXR1cm4gISFuLmlzUHJlZml4T2YoZSkgJiYgKFxuICAgICAgICAgICAgLy8gUm93cyB3aXRoIGRvY3VtZW50IGtleXMgbW9yZSB0aGFuIG9uZSBzZWdtZW50IGxvbmdlciB0aGFuIHRoZSBxdWVyeVxuICAgICAgICAgICAgLy8gcGF0aCBjYW4ndCBiZSBtYXRjaGVzLiBGb3IgZXhhbXBsZSwgYSBxdWVyeSBvbiAncm9vbXMnIGNhbid0IG1hdGNoXG4gICAgICAgICAgICAvLyB0aGUgZG9jdW1lbnQgL3Jvb21zL2FiYy9tZXNzYWdlcy94eXguXG4gICAgICAgICAgICAvLyBUT0RPKG1jZyk6IHdlJ2xsIG5lZWQgYSBkaWZmZXJlbnQgc2Nhbm5lciB3aGVuIHdlIGltcGxlbWVudFxuICAgICAgICAgICAgLy8gYW5jZXN0b3IgcXVlcmllcy5cbiAgICAgICAgICAgIGUubGVuZ3RoID09PSBzICYmIChvID0gby5hZGQodC5mcykpLCAhMCk7XG4gICAgICAgIH0pLCByKSwgR3MucmVzb2x2ZSh0aGlzLnlzKG8pKTtcbiAgICB9XG4gICAgeXModCkge1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gYXJyYXkgb2YgbWF0Y2hpbmcgYmF0Y2hlcywgc29ydGVkIGJ5IGJhdGNoSUQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gbXVsdGlwbGUgbXV0YXRpb25zIGFmZmVjdGluZyB0aGUgc2FtZSBkb2N1bWVudCBrZXkgYXJlIGFwcGxpZWQgaW4gb3JkZXIuXG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5fcyh0KTtcbiAgICAgICAgICAgIG51bGwgIT09IG4gJiYgZS5wdXNoKG4pO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxuICAgIHJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkge1xuICAgICAgICBCKDAgPT09IHRoaXMucHMoZS5iYXRjaElkLCBcInJlbW92ZWRcIikpLCB0aGlzLkFuLnNoaWZ0KCk7XG4gICAgICAgIGxldCBuID0gdGhpcy53cztcbiAgICAgICAgcmV0dXJuIEdzLmZvckVhY2goZS5tdXRhdGlvbnMsIChzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgU3Iocy5rZXksIGUuYmF0Y2hJZCk7XG4gICAgICAgICAgICByZXR1cm4gbiA9IG4uZGVsZXRlKGkpLCB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIHMua2V5KTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3MgPSBuO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGVlKHQpIHtcbiAgICAgICAgLy8gTm8tb3Agc2luY2UgdGhlIG1lbW9yeSBtdXRhdGlvbiBxdWV1ZSBkb2VzIG5vdCBtYWludGFpbiBhIHNlcGFyYXRlIGNhY2hlLlxuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgU3IoZSwgMCksIHMgPSB0aGlzLndzLmZpcnN0QWZ0ZXJPckVxdWFsKG4pO1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZShlLmlzRXF1YWwocyAmJiBzLmtleSkpO1xuICAgIH1cbiAgICBwZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLkFuLmxlbmd0aCwgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGJhdGNoSWQgaW4gdGhlIG11dGF0aW9uIHF1ZXVlIGFuZCBhc3NlcnRzIHRoYXRcbiAgICAgKiB0aGUgcmVzdWx0aW5nIGluZGV4IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXRjaElkIC0gVGhlIGJhdGNoSWQgdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBkb2luZywgcGhyYXNlZCBpbiBwYXNzaXZlXG4gICAgICogZm9ybSAoZS5nLiBcImFja25vd2xlZGdlZFwiIGluIGEgcm91dGluZSB0aGF0IGFja25vd2xlZGdlcyBiYXRjaGVzKS5cbiAgICAgKi8gICAgcHModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncyh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBiYXRjaElkIGluIHRoZSBtdXRhdGlvbiBxdWV1ZS4gVGhpcyBvcGVyYXRpb25cbiAgICAgKiBpcyBPKDEpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNvbXB1dGVkIGluZGV4IG9mIHRoZSBiYXRjaCB3aXRoIHRoZSBnaXZlbiBiYXRjaElkLCBiYXNlZCBvblxuICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgcXVldWUuIE5vdGUgdGhpcyBpbmRleCBjYW4gYmUgbmVnYXRpdmUgaWYgdGhlIHJlcXVlc3RlZFxuICAgICAqIGJhdGNoSWQgaGFzIGFscmVhZHkgYmVlbiByZW12b2VkIGZyb20gdGhlIHF1ZXVlIG9yIHBhc3QgdGhlIGVuZCBvZiB0aGVcbiAgICAgKiBxdWV1ZSBpZiB0aGUgYmF0Y2hJZCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFzdCBhZGRlZCBiYXRjaC5cbiAgICAgKi8gICAgZ3ModCkge1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy5Bbi5sZW5ndGgpIFxuICAgICAgICAvLyBBcyBhbiBpbmRleCB0aGlzIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIC8vIEV4YW1pbmUgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSB0byBmaWd1cmUgb3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlXG4gICAgICAgIC8vIGJhdGNoSWQgYW5kIGluZGV4ZXMgaW4gdGhlIGFycmF5LiBOb3RlIHRoYXQgc2luY2UgdGhlIHF1ZXVlIGlzIG9yZGVyZWRcbiAgICAgICAgLy8gYnkgYmF0Y2hJZCwgaWYgdGhlIGZpcnN0IGJhdGNoIGhhcyBhIGxhcmdlciBiYXRjaElkIHRoZW4gdGhlIHJlcXVlc3RlZFxuICAgICAgICAvLyBiYXRjaElkIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAgICAgICAgIHJldHVybiB0IC0gdGhpcy5BblswXS5iYXRjaElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHZlcnNpb24gb2YgbG9va3VwTXV0YXRpb25CYXRjaCB0aGF0IGRvZXNuJ3QgcmV0dXJuIGEgcHJvbWlzZSwgdGhpcyBtYWtlc1xuICAgICAqIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHVzZXMgdGhpcyBjb2RlIGVhc2llciB0byByZWFkIGFuZCBtb3JlIGVmZmljZW50LlxuICAgICAqLyAgICBfcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmdzKHQpO1xuICAgICAgICBpZiAoZSA8IDAgfHwgZSA+PSB0aGlzLkFuLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLkFuW2VdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhlIG1lbW9yeS1vbmx5IFJlbW90ZURvY3VtZW50Q2FjaGUgZm9yIEluZGV4ZWREYi4gVG8gY29uc3RydWN0LCBpbnZva2VcbiAqIGBuZXdNZW1vcnlSZW1vdGVEb2N1bWVudENhY2hlKClgLlxuICovXG5jbGFzcyBDciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNpemVyIC0gVXNlZCB0byBhc3Nlc3MgdGhlIHNpemUgb2YgYSBkb2N1bWVudC4gRm9yIGVhZ2VyIEdDLCB0aGlzIGlzXG4gICAgICogZXhwZWN0ZWQgdG8ganVzdCByZXR1cm4gMCB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGRvaW5nIHRoZSB3b3JrIG9mXG4gICAgICogY2FsY3VsYXRpbmcgdGhlIHNpemUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLkp0ID0gdCwgdGhpcy5UcyA9IGUsIFxuICAgICAgICAvKiogVW5kZXJseWluZyBjYWNoZSBvZiBkb2N1bWVudHMgYW5kIHRoZWlyIHJlYWQgdGltZXMuICovXG4gICAgICAgIHRoaXMuZG9jcyA9IG5ldyBnbihTdC5jb21wYXJhdG9yKSwgXG4gICAgICAgIC8qKiBTaXplIG9mIGFsbCBjYWNoZWQgZG9jdW1lbnRzLiAqL1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzdXBwbGllZCBlbnRyeSB0byB0aGUgY2FjaGUgYW5kIHVwZGF0ZXMgdGhlIGNhY2hlIHNpemUgYXMgYXBwcm9wcmlhdGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYGFkZEVudHJ5YCAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYC5cbiAgICAgKi8gICAgYWRkRW50cnkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gZS5rZXksIGkgPSB0aGlzLmRvY3MuZ2V0KHMpLCByID0gaSA/IGkuc2l6ZSA6IDAsIG8gPSB0aGlzLlRzKGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NzID0gdGhpcy5kb2NzLmluc2VydChzLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZS5jbG9uZSgpLFxuICAgICAgICAgICAgc2l6ZTogbyxcbiAgICAgICAgICAgIHJlYWRUaW1lOiBuXG4gICAgICAgIH0pLCB0aGlzLnNpemUgKz0gbyAtIHIsIHRoaXMuSnQuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgcy5wYXRoLnBvcExhc3QoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSBmcm9tIHRoZSBjYWNoZSBhbmQgdXBkYXRlcyB0aGUgY2FjaGUgc2l6ZSBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKlxuICAgICAqIEFsbCBjYWxscyBvZiBgcmVtb3ZlRW50cnlgIGFyZSByZXF1aXJlZCB0byBnbyB0aHJvdWdoIHRoZSBSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlclxuICAgICAqIHJldHVybmVkIGJ5IGBuZXdDaGFuZ2VCdWZmZXIoKWAuXG4gICAgICovICAgIHJlbW92ZUVudHJ5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jcy5nZXQodCk7XG4gICAgICAgIGUgJiYgKHRoaXMuZG9jcyA9IHRoaXMuZG9jcy5yZW1vdmUodCksIHRoaXMuc2l6ZSAtPSBlLnNpemUpO1xuICAgIH1cbiAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRvY3MuZ2V0KGUpO1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZShuID8gbi5kb2N1bWVudC5jbG9uZSgpIDogV3QubmV3SW52YWxpZERvY3VtZW50KGUpKTtcbiAgICB9XG4gICAgZ2V0RW50cmllcyh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gQW4oKTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5kb2NzLmdldCh0KTtcbiAgICAgICAgICAgIG4gPSBuLmluc2VydCh0LCBlID8gZS5kb2N1bWVudC5jbG9uZSgpIDogV3QubmV3SW52YWxpZERvY3VtZW50KHQpKTtcbiAgICAgICAgfSkpLCBHcy5yZXNvbHZlKG4pO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSBBbigpO1xuICAgICAgICAvLyBEb2N1bWVudHMgYXJlIG9yZGVyZWQgYnkga2V5LCBzbyB3ZSBjYW4gdXNlIGEgcHJlZml4IHNjYW4gdG8gbmFycm93IGRvd25cbiAgICAgICAgLy8gdGhlIGRvY3VtZW50cyB3ZSBuZWVkIHRvIG1hdGNoIHRoZSBxdWVyeSBhZ2FpbnN0LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgU3QoZS5wYXRoLmNoaWxkKFwiXCIpKSwgciA9IHRoaXMuZG9jcy5nZXRJdGVyYXRvckZyb20oaSk7XG4gICAgICAgIGZvciAoO3IuaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHtrZXk6IHQsIHZhbHVlOiB7ZG9jdW1lbnQ6IGksIHJlYWRUaW1lOiBvfX0gPSByLmdldE5leHQoKTtcbiAgICAgICAgICAgIGlmICghZS5wYXRoLmlzUHJlZml4T2YodC5wYXRoKSkgYnJlYWs7XG4gICAgICAgICAgICBvLmNvbXBhcmVUbyhuKSA8PSAwIHx8IFNlKGUsIGkpICYmIChzID0gcy5pbnNlcnQoaS5rZXksIGkuY2xvbmUoKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHMpO1xuICAgIH1cbiAgICBFcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBHcy5mb3JFYWNoKHRoaXMuZG9jcywgKHQgPT4gZSh0KSkpO1xuICAgIH1cbiAgICBuZXdDaGFuZ2VCdWZmZXIodCkge1xuICAgICAgICAvLyBgdHJhY2tSZW1vdmFsc2AgaXMgaWdub3JlcyBzaW5jZSB0aGUgTWVtb3J5UmVtb3RlRG9jdW1lbnRDYWNoZSBrZWVwc1xuICAgICAgICAvLyBhIHNlcGFyYXRlIGNoYW5nZWxvZyBhbmQgZG9lcyBub3QgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciByZW1vdmFscy5cbiAgICAgICAgcmV0dXJuIG5ldyBOcih0aGlzKTtcbiAgICB9XG4gICAgZ2V0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHRoaXMuc2l6ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWVtb3J5LW9ubHkgUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAqXG4gKiBAcGFyYW0gaW5kZXhNYW5hZ2VyIC0gQSBjbGFzcyB0aGF0IG1hbmFnZXMgY29sbGVjdGlvbiBncm91cCBpbmRpY2VzLlxuICogQHBhcmFtIHNpemVyIC0gVXNlZCB0byBhc3Nlc3MgdGhlIHNpemUgb2YgYSBkb2N1bWVudC4gRm9yIGVhZ2VyIEdDLCB0aGlzIGlzXG4gKiBleHBlY3RlZCB0byBqdXN0IHJldHVybiAwIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgZG9pbmcgdGhlIHdvcmsgb2ZcbiAqIGNhbGN1bGF0aW5nIHRoZSBzaXplLlxuICovXG4vKipcbiAqIEhhbmRsZXMgdGhlIGRldGFpbHMgb2YgYWRkaW5nIGFuZCB1cGRhdGluZyBkb2N1bWVudHMgaW4gdGhlIE1lbW9yeVJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKi9cbmNsYXNzIE5yIGV4dGVuZHMgemkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5EZSA9IHQ7XG4gICAgfVxuICAgIGFwcGx5Q2hhbmdlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlcy5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgcy5kb2N1bWVudC5pc1ZhbGlkRG9jdW1lbnQoKSA/IGUucHVzaCh0aGlzLkRlLmFkZEVudHJ5KHQsIHMuZG9jdW1lbnQsIHRoaXMuZ2V0UmVhZFRpbWUobikpKSA6IHRoaXMuRGUucmVtb3ZlRW50cnkobik7XG4gICAgICAgIH0pKSwgR3Mud2FpdEZvcihlKTtcbiAgICB9XG4gICAgZ2V0RnJvbUNhY2hlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRGUuZ2V0RW50cnkodCwgZSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkRlLmdldEVudHJpZXModCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBrciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgdGFyZ2V0IHRvIHRoZSBkYXRhIGFib3V0IHRoYXQgdGFyZ2V0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLklzID0gbmV3IEdpKCh0ID0+IEh0KHQpKSwgWXQpLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IHJlY2VpdmVkIHNuYXBzaG90IHZlcnNpb24uICovXG4gICAgICAgIHRoaXMubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbiA9IGN0Lm1pbigpLCBcbiAgICAgICAgLyoqIFRoZSBoaWdoZXN0IG51bWJlcmVkIHRhcmdldCBJRCBlbmNvdW50ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5oaWdoZXN0VGFyZ2V0SWQgPSAwLCBcbiAgICAgICAgLyoqIFRoZSBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciBlbmNvdW50ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5BcyA9IDAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBvcmRlcmVkIGJpZGlyZWN0aW9uYWwgbWFwcGluZyBiZXR3ZWVuIGRvY3VtZW50cyBhbmQgdGhlIHJlbW90ZSB0YXJnZXRcbiAgICAgICAgICogSURzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ScyA9IG5ldyBWciwgdGhpcy50YXJnZXRDb3VudCA9IDAsIHRoaXMuUHMgPSAkaS5pZSgpO1xuICAgIH1cbiAgICBmb3JFYWNoVGFyZ2V0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSXMuZm9yRWFjaCgoKHQsIG4pID0+IGUobikpKSwgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRMYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUodGhpcy5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFNlcXVlbmNlTnVtYmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIEdzLnJlc29sdmUodGhpcy5Bcyk7XG4gICAgfVxuICAgIGFsbG9jYXRlVGFyZ2V0SWQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaWdoZXN0VGFyZ2V0SWQgPSB0aGlzLlBzLm5leHQoKSwgR3MucmVzb2x2ZSh0aGlzLmhpZ2hlc3RUYXJnZXRJZCk7XG4gICAgfVxuICAgIHNldFRhcmdldHNNZXRhZGF0YSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuICYmICh0aGlzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuKSwgZSA+IHRoaXMuQXMgJiYgKHRoaXMuQXMgPSBlKSwgXG4gICAgICAgIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY2UodCkge1xuICAgICAgICB0aGlzLklzLnNldCh0LnRhcmdldCwgdCk7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkO1xuICAgICAgICBlID4gdGhpcy5oaWdoZXN0VGFyZ2V0SWQgJiYgKHRoaXMuUHMgPSBuZXcgJGkoZSksIHRoaXMuaGlnaGVzdFRhcmdldElkID0gZSksIHQuc2VxdWVuY2VOdW1iZXIgPiB0aGlzLkFzICYmICh0aGlzLkFzID0gdC5zZXF1ZW5jZU51bWJlcik7XG4gICAgfVxuICAgIGFkZFRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZShlKSwgdGhpcy50YXJnZXRDb3VudCArPSAxLCBHcy5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHVwZGF0ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZShlKSwgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSXMuZGVsZXRlKGUudGFyZ2V0KSwgdGhpcy5Scy51cyhlLnRhcmdldElkKSwgdGhpcy50YXJnZXRDb3VudCAtPSAxLCBcbiAgICAgICAgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXRzKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSAwO1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLklzLmZvckVhY2goKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBvLnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQoby50YXJnZXRJZCkgJiYgKHRoaXMuSXMuZGVsZXRlKHIpLCBpLnB1c2godGhpcy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBvLnRhcmdldElkKSksIFxuICAgICAgICAgICAgcysrKTtcbiAgICAgICAgfSkpLCBHcy53YWl0Rm9yKGkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q291bnQodCkge1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZSh0aGlzLnRhcmdldENvdW50KTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLklzLmdldChlKSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gR3MucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgYWRkTWF0Y2hpbmdLZXlzKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuUnMucnMoZSwgbiksIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5Scy5jcyhlLCBuKTtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUsIGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHMgJiYgZS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGkucHVzaChzLm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpKTtcbiAgICAgICAgfSkpLCBHcy53YWl0Rm9yKGkpO1xuICAgIH1cbiAgICByZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlJzLnVzKGUpLCBHcy5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuUnMubHMoZSk7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKG4pO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBHcy5yZXNvbHZlKHRoaXMuUnMuY29udGFpbnNLZXkoZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBtZW1vcnktYmFja2VkIGluc3RhbmNlIG9mIFBlcnNpc3RlbmNlLiBEYXRhIGlzIHN0b3JlZCBvbmx5IGluIFJBTSBhbmRcbiAqIG5vdCBwZXJzaXN0ZWQgYWNyb3NzIHNlc3Npb25zLlxuICovXG5jbGFzcyB4ciB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBkZWxlZ2F0ZS4gVGhpc1xuICAgICAqIGFsbG93cyBib3RoIHRoZSBkZWxlZ2F0ZSBhbmQgdGhpcyBpbnN0YW5jZSB0byBoYXZlIHN0cm9uZyByZWZlcmVuY2VzIHRvXG4gICAgICogZWFjaCBvdGhlciB3aXRob3V0IGhhdmluZyBudWxsYWJsZSBmaWVsZHMgdGhhdCB3b3VsZCB0aGVuIG5lZWQgdG8gYmVcbiAgICAgKiBjaGVja2VkIG9yIGFzc2VydGVkIG9uIGV2ZXJ5IGFjY2Vzcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuYnMgPSB7fSwgdGhpcy5CZSA9IG5ldyBldCgwKSwgdGhpcy5VZSA9ICExLCB0aGlzLlVlID0gITAsIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSB0KHRoaXMpLCBcbiAgICAgICAgdGhpcy5IZSA9IG5ldyBrcih0aGlzKTtcbiAgICAgICAgdGhpcy5KdCA9IG5ldyBJaSwgdGhpcy5KZSA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ3IodCwgZSk7XG4gICAgICAgIH0odGhpcy5KdCwgKHQgPT4gdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS52cyh0KSkpLCB0aGlzLmsgPSBuZXcgY2koZSksIHRoaXMuWWUgPSBuZXcgdnIodGhpcy5rKTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIC8vIE5vIGR1cmFibGUgc3RhdGUgdG8gZW5zdXJlIGlzIGNsb3NlZCBvbiBzaHV0ZG93bi5cbiAgICAgICAgcmV0dXJuIHRoaXMuVWUgPSAhMSwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCBzdGFydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5VZTtcbiAgICB9XG4gICAgc2V0RGF0YWJhc2VEZWxldGVkTGlzdGVuZXIoKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBzZXROZXR3b3JrRW5hYmxlZCgpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIGdldEluZGV4TWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSnQ7XG4gICAgfVxuICAgIGdldE11dGF0aW9uUXVldWUodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuYnNbdC50b0tleSgpXTtcbiAgICAgICAgcmV0dXJuIGUgfHwgKGUgPSBuZXcgRHIodGhpcy5KdCwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSksIHRoaXMuYnNbdC50b0tleSgpXSA9IGUpLCBcbiAgICAgICAgZTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhlO1xuICAgIH1cbiAgICBnZXRSZW1vdGVEb2N1bWVudENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5KZTtcbiAgICB9XG4gICAgZ2V0QnVuZGxlQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlllO1xuICAgIH1cbiAgICBydW5UcmFuc2FjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICQoXCJNZW1vcnlQZXJzaXN0ZW5jZVwiLCBcIlN0YXJ0aW5nIHRyYW5zYWN0aW9uOlwiLCB0KTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyAkcih0aGlzLkJlLm5leHQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLlZzKCksIG4ocykubmV4dCgodCA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLlNzKHMpLm5leHQoKCgpID0+IHQpKSkpLnRvUHJvbWlzZSgpLnRoZW4oKHQgPT4gKHMucmFpc2VPbkNvbW1pdHRlZEV2ZW50KCksIFxuICAgICAgICB0KSkpO1xuICAgIH1cbiAgICBEcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBHcy5vcihPYmplY3QudmFsdWVzKHRoaXMuYnMpLm1hcCgobiA9PiAoKSA9PiBuLmNvbnRhaW5zS2V5KHQsIGUpKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZW1vcnkgcGVyc2lzdGVuY2UgaXMgbm90IGFjdHVhbGx5IHRyYW5zYWN0aW9uYWwsIGJ1dCBmdXR1cmUgaW1wbGVtZW50YXRpb25zXG4gKiBtYXkgaGF2ZSB0cmFuc2FjdGlvbi1zY29wZWQgc3RhdGUuXG4gKi8gY2xhc3MgJHIgZXh0ZW5kcyBXcyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmN1cnJlbnRTZXF1ZW5jZU51bWJlciA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBGciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgYWxsIGRvY3VtZW50cyB0aGF0IGFyZSBhY3RpdmUgaW4gUXVlcnkgdmlld3MuICovXG4gICAgICAgIHRoaXMuQ3MgPSBuZXcgVnIsIFxuICAgICAgICAvKiogVGhlIGxpc3Qgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIHBvdGVudGlhbGx5IEdDZWQgYWZ0ZXIgZWFjaCB0cmFuc2FjdGlvbi4gKi9cbiAgICAgICAgdGhpcy5OcyA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBrcyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnIodCk7XG4gICAgfVxuICAgIGdldCB4cygpIHtcbiAgICAgICAgaWYgKHRoaXMuTnMpIHJldHVybiB0aGlzLk5zO1xuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkNzLmFkZFJlZmVyZW5jZShuLCBlKSwgdGhpcy54cy5kZWxldGUobi50b1N0cmluZygpKSwgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5Dcy5yZW1vdmVSZWZlcmVuY2UobiwgZSksIHRoaXMueHMuYWRkKG4udG9TdHJpbmcoKSksIEdzLnJlc29sdmUoKTtcbiAgICB9XG4gICAgbWFya1BvdGVudGlhbGx5T3JwaGFuZWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy54cy5hZGQoZS50b1N0cmluZygpKSwgR3MucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICB0aGlzLkNzLnVzKGUudGFyZ2V0SWQpLmZvckVhY2goKHQgPT4gdGhpcy54cy5hZGQodC50b1N0cmluZygpKSkpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpO1xuICAgICAgICByZXR1cm4gbi5nZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLnhzLmFkZCh0LnRvU3RyaW5nKCkpKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuLnJlbW92ZVRhcmdldERhdGEodCwgZSkpKTtcbiAgICB9XG4gICAgVnMoKSB7XG4gICAgICAgIHRoaXMuTnMgPSBuZXcgU2V0O1xuICAgIH1cbiAgICBTcyh0KSB7XG4gICAgICAgIC8vIFJlbW92ZSBuZXdseSBvcnBoYW5lZCBkb2N1bWVudHMuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnBlcnNpc3RlbmNlLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIEdzLmZvckVhY2godGhpcy54cywgKG4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IFN0LmZyb21QYXRoKG4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCBlLnJlbW92ZUVudHJ5KHMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gKHRoaXMuTnMgPSBudWxsLCBlLmFwcGx5KHQpKSkpO1xuICAgIH1cbiAgICB1cGRhdGVMaW1ib0RvY3VtZW50KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHModCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICB0ID8gdGhpcy54cy5kZWxldGUoZS50b1N0cmluZygpKSA6IHRoaXMueHMuYWRkKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgdnModCkge1xuICAgICAgICAvLyBGb3IgZWFnZXIgR0MsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGRvY3VtZW50IHNpemUsIHRoZXJlIGFyZSBubyBzaXplIHRocmVzaG9sZHMuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAkcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBHcy5vcihbICgpID0+IEdzLnJlc29sdmUodGhpcy5Dcy5jb250YWluc0tleShlKSksICgpID0+IHRoaXMucGVyc2lzdGVuY2UuZ2V0VGFyZ2V0Q2FjaGUoKS5jb250YWluc0tleSh0LCBlKSwgKCkgPT4gdGhpcy5wZXJzaXN0ZW5jZS5Ecyh0LCBlKSBdKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBUaGUgZm9ybWF0IG9mIHRoZSBMb2NhbFN0b3JhZ2Uga2V5IHRoYXQgc3RvcmVzIHRoZSBjbGllbnQgc3RhdGUgaXM6XG4vLyAgICAgZmlyZXN0b3JlX2NsaWVudHNfPHBlcnNpc3RlbmNlX3ByZWZpeD5fPGluc3RhbmNlX2tleT5cbi8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgYSBjbGllbnQgc3RhdGUgaW4gV2ViU3RvcmFnZSAqL1xuZnVuY3Rpb24gT3IodCwgZSkge1xuICAgIHJldHVybiBgZmlyZXN0b3JlX2NsaWVudHNfJHt0fV8ke2V9YDtcbn1cblxuLy8gVGhlIGZvcm1hdCBvZiB0aGUgV2ViU3RvcmFnZSBrZXkgdGhhdCBzdG9yZXMgdGhlIG11dGF0aW9uIHN0YXRlIGlzOlxuLy8gICAgIGZpcmVzdG9yZV9tdXRhdGlvbnNfPHBlcnNpc3RlbmNlX3ByZWZpeD5fPGJhdGNoX2lkPlxuLy8gICAgIChmb3IgdW5hdXRoZW50aWNhdGVkIHVzZXJzKVxuLy8gb3I6IGZpcmVzdG9yZV9tdXRhdGlvbnNfPHBlcnNpc3RlbmNlX3ByZWZpeD5fPGJhdGNoX2lkPl88dXNlcl91aWQ+XG5cbi8vICd1c2VyX3VpZCcgaXMgbGFzdCB0byBhdm9pZCBuZWVkaW5nIHRvIGVzY2FwZSAnXycgY2hhcmFjdGVycyB0aGF0IGl0IG1pZ2h0XG4vLyBjb250YWluLlxuLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciBhIG11dGF0aW9uIGJhdGNoIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIE1yKHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IGBmaXJlc3RvcmVfbXV0YXRpb25zXyR7dH1fJHtufWA7XG4gICAgcmV0dXJuIGUuaXNBdXRoZW50aWNhdGVkKCkgJiYgKHMgKz0gYF8ke2UudWlkfWApLCBzO1xufVxuXG4vLyBUaGUgZm9ybWF0IG9mIHRoZSBXZWJTdG9yYWdlIGtleSB0aGF0IHN0b3JlcyBhIHF1ZXJ5IHRhcmdldCdzIG1ldGFkYXRhIGlzOlxuLy8gICAgIGZpcmVzdG9yZV90YXJnZXRzXzxwZXJzaXN0ZW5jZV9wcmVmaXg+Xzx0YXJnZXRfaWQ+XG4vKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIGEgcXVlcnkgc3RhdGUgaW4gV2ViU3RvcmFnZSAqL1xuZnVuY3Rpb24gTHIodCwgZSkge1xuICAgIHJldHVybiBgZmlyZXN0b3JlX3RhcmdldHNfJHt0fV8ke2V9YDtcbn1cblxuLy8gVGhlIFdlYlN0b3JhZ2UgcHJlZml4IHRoYXQgc3RvcmVzIHRoZSBwcmltYXJ5IHRhYidzIG9ubGluZSBzdGF0ZS4gVGhlXG4vLyBmb3JtYXQgb2YgdGhlIGtleSBpczpcbi8vICAgICBmaXJlc3RvcmVfb25saW5lX3N0YXRlXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XG4vKipcbiAqIEhvbGRzIHRoZSBzdGF0ZSBvZiBhIG11dGF0aW9uIGJhdGNoLCBpbmNsdWRpbmcgaXRzIHVzZXIgSUQsIGJhdGNoIElEIGFuZFxuICogd2hldGhlciB0aGUgYmF0Y2ggaXMgJ3BlbmRpbmcnLCAnYWNrbm93bGVkZ2VkJyBvciAncmVqZWN0ZWQnLlxuICovXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nXG5jbGFzcyBCciB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnVzZXIgPSB0LCB0aGlzLmJhdGNoSWQgPSBlLCB0aGlzLnN0YXRlID0gbiwgdGhpcy5lcnJvciA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIE11dGF0aW9uTWV0YWRhdGEgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiBpbiBXZWJTdG9yYWdlLlxuICAgICAqIExvZ3MgYSB3YXJuaW5nIGFuZCByZXR1cm5zIG51bGwgaWYgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpcyBub3QgdmFsaWQuXG4gICAgICovICAgIHN0YXRpYyBGcyh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBKU09OLnBhcnNlKG4pO1xuICAgICAgICBsZXQgaSwgciA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHMgJiYgLTEgIT09IFsgXCJwZW5kaW5nXCIsIFwiYWNrbm93bGVkZ2VkXCIsIFwicmVqZWN0ZWRcIiBdLmluZGV4T2Yocy5zdGF0ZSkgJiYgKHZvaWQgMCA9PT0gcy5lcnJvciB8fCBcIm9iamVjdFwiID09IHR5cGVvZiBzLmVycm9yKTtcbiAgICAgICAgcmV0dXJuIHIgJiYgcy5lcnJvciAmJiAociA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIHMuZXJyb3IubWVzc2FnZSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBzLmVycm9yLmNvZGUsIFxuICAgICAgICByICYmIChpID0gbmV3IGoocy5lcnJvci5jb2RlLCBzLmVycm9yLm1lc3NhZ2UpKSksIHIgPyBuZXcgQnIodCwgZSwgcy5zdGF0ZSwgaSkgOiAoRihcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgbXV0YXRpb24gc3RhdGUgZm9yIElEICcke2V9JzogJHtufWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxuICAgIE9zKCkge1xuICAgICAgICBjb25zdCB0ID0ge1xuICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICB1cGRhdGVUaW1lTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgKHQuZXJyb3IgPSB7XG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVycm9yLmNvZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSksIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIb2xkcyB0aGUgc3RhdGUgb2YgYSBxdWVyeSB0YXJnZXQsIGluY2x1ZGluZyBpdHMgdGFyZ2V0IElEIGFuZCB3aGV0aGVyIHRoZVxuICogdGFyZ2V0IGlzICdub3QtY3VycmVudCcsICdjdXJyZW50JyBvciAncmVqZWN0ZWQnLlxuICovXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nXG5jbGFzcyBVciB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLnRhcmdldElkID0gdCwgdGhpcy5zdGF0ZSA9IGUsIHRoaXMuZXJyb3IgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBRdWVyeVRhcmdldE1ldGFkYXRhIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgRnModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgbGV0IHMsIGkgPSBcIm9iamVjdFwiID09IHR5cGVvZiBuICYmIC0xICE9PSBbIFwibm90LWN1cnJlbnRcIiwgXCJjdXJyZW50XCIsIFwicmVqZWN0ZWRcIiBdLmluZGV4T2Yobi5zdGF0ZSkgJiYgKHZvaWQgMCA9PT0gbi5lcnJvciB8fCBcIm9iamVjdFwiID09IHR5cGVvZiBuLmVycm9yKTtcbiAgICAgICAgcmV0dXJuIGkgJiYgbi5lcnJvciAmJiAoaSA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIG4uZXJyb3IubWVzc2FnZSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBuLmVycm9yLmNvZGUsIFxuICAgICAgICBpICYmIChzID0gbmV3IGoobi5lcnJvci5jb2RlLCBuLmVycm9yLm1lc3NhZ2UpKSksIGkgPyBuZXcgVXIodCwgbi5zdGF0ZSwgcykgOiAoRihcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgdGFyZ2V0IHN0YXRlIGZvciBJRCAnJHt0fSc6ICR7ZX1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbiAgICBPcygpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yICYmICh0LmVycm9yID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5lcnJvci5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5lcnJvci5tZXNzYWdlXG4gICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBpbW11dGFibGUgQ2xpZW50U3RhdGUgZm9yIGEgY2xpZW50IHJlYWQgZnJvbVxuICogV2ViU3RvcmFnZSwgY29udGFpbmluZyB0aGUgbGlzdCBvZiBhY3RpdmUgcXVlcnkgdGFyZ2V0cy5cbiAqLyBjbGFzcyBxciB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0gdCwgdGhpcy5hY3RpdmVUYXJnZXRJZHMgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBSZW1vdGVDbGllbnRTdGF0ZSBmcm9tIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIEZzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEpTT04ucGFyc2UoZSk7XG4gICAgICAgIGxldCBzID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgbiAmJiBuLmFjdGl2ZVRhcmdldElkcyBpbnN0YW5jZW9mIEFycmF5LCBpID0gQ24oKTtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHMgJiYgdCA8IG4uYWN0aXZlVGFyZ2V0SWRzLmxlbmd0aDsgKyt0KSBzID0gVnQobi5hY3RpdmVUYXJnZXRJZHNbdF0pLCBcbiAgICAgICAgaSA9IGkuYWRkKG4uYWN0aXZlVGFyZ2V0SWRzW3RdKTtcbiAgICAgICAgcmV0dXJuIHMgPyBuZXcgcXIodCwgaSkgOiAoRihcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgY2xpZW50IGRhdGEgZm9yIGluc3RhbmNlICcke3R9JzogJHtlfWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb25saW5lIHN0YXRlIGZvciBhbGwgY2xpZW50cyBwYXJ0aWNpcGF0aW5nIGluXG4gKiBtdWx0aS10YWIuIFRoZSBvbmxpbmUgc3RhdGUgaXMgb25seSB3cml0dGVuIHRvIGJ5IHRoZSBwcmltYXJ5IGNsaWVudCwgYW5kXG4gKiB1c2VkIGluIHNlY29uZGFyeSBjbGllbnRzIHRvIHVwZGF0ZSB0aGVpciBxdWVyeSB2aWV3cy5cbiAqLyBjbGFzcyBLciB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0gdCwgdGhpcy5vbmxpbmVTdGF0ZSA9IGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIFNoYXJlZE9ubGluZVN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgRnModCkge1xuICAgICAgICBjb25zdCBlID0gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIGUgJiYgLTEgIT09IFsgXCJVbmtub3duXCIsIFwiT25saW5lXCIsIFwiT2ZmbGluZVwiIF0uaW5kZXhPZihlLm9ubGluZVN0YXRlKSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBlLmNsaWVudElkID8gbmV3IEtyKGUuY2xpZW50SWQsIGUub25saW5lU3RhdGUpIDogKEYoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIG9ubGluZSBzdGF0ZTogJHt0fWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIE1ldGFkYXRhIHN0YXRlIG9mIHRoZSBsb2NhbCBjbGllbnQuIFVubGlrZSBgUmVtb3RlQ2xpZW50U3RhdGVgLCB0aGlzIGNsYXNzIGlzXG4gKiBtdXRhYmxlIGFuZCBrZWVwcyB0cmFjayBvZiBhbGwgcGVuZGluZyBtdXRhdGlvbnMsIHdoaWNoIGFsbG93cyB1cyB0b1xuICogdXBkYXRlIHRoZSByYW5nZSBvZiBwZW5kaW5nIG11dGF0aW9uIGJhdGNoIElEcyBhcyBuZXcgbXV0YXRpb25zIGFyZSBhZGRlZCBvclxuICogcmVtb3ZlZC5cbiAqXG4gKiBUaGUgZGF0YSBpbiBgTG9jYWxDbGllbnRTdGF0ZWAgaXMgbm90IHJlYWQgZnJvbSBXZWJTdG9yYWdlIGFuZCBpbnN0ZWFkXG4gKiB1cGRhdGVkIHZpYSBpdHMgaW5zdGFuY2UgbWV0aG9kcy4gVGhlIHVwZGF0ZWQgc3RhdGUgY2FuIGJlIHNlcmlhbGl6ZWQgdmlhXG4gKiBgdG9XZWJTdG9yYWdlSlNPTigpYC5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbmNsYXNzIGpyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVUYXJnZXRJZHMgPSBDbigpO1xuICAgIH1cbiAgICBNcyh0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gdGhpcy5hY3RpdmVUYXJnZXRJZHMuYWRkKHQpO1xuICAgIH1cbiAgICBMcyh0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gdGhpcy5hY3RpdmVUYXJnZXRJZHMuZGVsZXRlKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIGVudHJ5IGludG8gYSBKU09OLWVuY29kZWQgZm9ybWF0IHdlIGNhbiB1c2UgZm9yIFdlYlN0b3JhZ2UuXG4gICAgICogRG9lcyBub3QgZW5jb2RlIGBjbGllbnRJZGAgYXMgaXQgaXMgcGFydCBvZiB0aGUga2V5IGluIFdlYlN0b3JhZ2UuXG4gICAgICovICAgIE9zKCkge1xuICAgICAgICBjb25zdCB0ID0ge1xuICAgICAgICAgICAgYWN0aXZlVGFyZ2V0SWRzOiB0aGlzLmFjdGl2ZVRhcmdldElkcy50b0FycmF5KCksXG4gICAgICAgICAgICB1cGRhdGVUaW1lTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCB1c2VzIFdlYlN0b3JhZ2UgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIGFzIHRoZVxuICogYmFja2luZyBzdG9yZSBmb3IgdGhlIFNoYXJlZENsaWVudFN0YXRlLiBJdCBrZWVwcyB0cmFjayBvZiBhbGwgYWN0aXZlXG4gKiBjbGllbnRzIGFuZCBzdXBwb3J0cyBtb2RpZmljYXRpb25zIG9mIHRoZSBsb2NhbCBjbGllbnQncyBkYXRhLlxuICovIGNsYXNzIFFyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMud2luZG93ID0gdCwgdGhpcy5PZSA9IGUsIHRoaXMucGVyc2lzdGVuY2VLZXkgPSBuLCB0aGlzLkJzID0gcywgdGhpcy5zeW5jRW5naW5lID0gbnVsbCwgXG4gICAgICAgIHRoaXMub25saW5lU3RhdGVIYW5kbGVyID0gbnVsbCwgdGhpcy5zZXF1ZW5jZU51bWJlckhhbmRsZXIgPSBudWxsLCB0aGlzLlVzID0gdGhpcy5xcy5iaW5kKHRoaXMpLCBcbiAgICAgICAgdGhpcy5LcyA9IG5ldyBnbihpdCksIHRoaXMuc3RhcnRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIFdlYlN0b3JhZ2UgZXZlbnRzIHRoYXQgb2NjdXIgYmVmb3JlIGBzdGFydCgpYCBpcyBjYWxsZWQuIFRoZXNlXG4gICAgICAgICAqIGV2ZW50cyBhcmUgcmVwbGF5ZWQgb25jZSBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCBpcyBzdGFydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qcyA9IFtdO1xuICAgICAgICAvLyBFc2NhcGUgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBtZW50aW9uZWQgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9HdWlkZS9SZWd1bGFyX0V4cHJlc3Npb25zXG4gICAgICAgIGNvbnN0IHIgPSBuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gdGhpcy53aW5kb3cubG9jYWxTdG9yYWdlLCB0aGlzLmN1cnJlbnRVc2VyID0gaSwgdGhpcy5RcyA9IE9yKHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMuQnMpLCBcbiAgICAgICAgdGhpcy5XcyA9IFxuICAgICAgICAvKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlci4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfc2VxdWVuY2VfbnVtYmVyXyR7dH1gO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgdGhpcy5LcyA9IHRoaXMuS3MuaW5zZXJ0KHRoaXMuQnMsIG5ldyBqciksIHRoaXMuR3MgPSBuZXcgUmVnRXhwKGBeZmlyZXN0b3JlX2NsaWVudHNfJHtyfV8oW15fXSopJGApLCBcbiAgICAgICAgdGhpcy56cyA9IG5ldyBSZWdFeHAoYF5maXJlc3RvcmVfbXV0YXRpb25zXyR7cn1fKFxcXFxkKykoPzpfKC4qKSk/JGApLCB0aGlzLkhzID0gbmV3IFJlZ0V4cChgXmZpcmVzdG9yZV90YXJnZXRzXyR7cn1fKFxcXFxkKykkYCksIFxuICAgICAgICB0aGlzLkpzID0gXG4gICAgICAgIC8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgdGhlIG9ubGluZSBzdGF0ZSBvZiB0aGUgcHJpbWFyeSB0YWIuICovXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX29ubGluZV9zdGF0ZV8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV2ViU3RvcmFnZSBwcmVmaXggdGhhdCBwbGF5cyBhcyBhIGV2ZW50IHRvIGluZGljYXRlIHRoZSByZW1vdGUgZG9jdW1lbnRzXG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgY2hhbmdlZCBkdWUgdG8gc29tZSBzZWNvbmRhcnkgdGFicyBsb2FkaW5nIGEgYnVuZGxlLlxuICAgICAgICAvLyBmb3JtYXQgb2YgdGhlIGtleSBpczpcbiAgICAgICAgLy8gICAgIGZpcmVzdG9yZV9idW5kbGVfbG9hZGVkXzxwZXJzaXN0ZW5jZUtleT5cbiAgICAgICAgKHRoaXMucGVyc2lzdGVuY2VLZXkpLCB0aGlzLllzID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfYnVuZGxlX2xvYWRlZF8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV2ViU3RvcmFnZSBrZXkgcHJlZml4IGZvciB0aGUga2V5IHRoYXQgc3RvcmVzIHRoZSBsYXN0IHNlcXVlbmNlIG51bWJlciBhbGxvY2F0ZWQuIFRoZSBrZXlcbiAgICAgICAgLy8gbG9va3MgbGlrZSAnZmlyZXN0b3JlX3NlcXVlbmNlX251bWJlcl88cGVyc2lzdGVuY2VfcHJlZml4PicuXG4gICAgICAgICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgXG4gICAgICAgIC8vIFJhdGhlciB0aGFuIGFkZGluZyB0aGUgc3RvcmFnZSBvYnNlcnZlciBkdXJpbmcgc3RhcnQoKSwgd2UgYWRkIHRoZVxuICAgICAgICAvLyBzdG9yYWdlIG9ic2VydmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgY29sbGVjdFxuICAgICAgICAvLyBldmVudHMgYmVmb3JlIG90aGVyIGNvbXBvbmVudHMgcG9wdWxhdGUgdGhlaXIgaW5pdGlhbCBzdGF0ZSAoZHVyaW5nIHRoZWlyXG4gICAgICAgIC8vIHJlc3BlY3RpdmUgc3RhcnQoKSBjYWxscykuIE90aGVyd2lzZSwgd2UgbWlnaHQgZm9yIGV4YW1wbGUgbWlzcyBhXG4gICAgICAgIC8vIG11dGF0aW9uIHRoYXQgaXMgYWRkZWQgYWZ0ZXIgTG9jYWxTdG9yZSdzIHN0YXJ0KCkgcHJvY2Vzc2VkIHRoZSBleGlzdGluZ1xuICAgICAgICAvLyBtdXRhdGlvbnMgYnV0IGJlZm9yZSB3ZSBvYnNlcnZlIFdlYlN0b3JhZ2UgZXZlbnRzLlxuICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic3RvcmFnZVwiLCB0aGlzLlVzKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgJ3RydWUnIGlmIFdlYlN0b3JhZ2UgaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiAqLyAgICBzdGF0aWMgYnQodCkge1xuICAgICAgICByZXR1cm4gISghdCB8fCAhdC5sb2NhbFN0b3JhZ2UpO1xuICAgIH1cbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2xpZW50cyB0byBiYWNrZmlsbCB0aGUgZGF0YSBpblxuICAgICAgICAvLyBTaGFyZWRDbGllbnRTdGF0ZS5cbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHRoaXMuc3luY0VuZ2luZS5UbigpO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgaWYgKGUgPT09IHRoaXMuQnMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0SXRlbShPcih0aGlzLnBlcnNpc3RlbmNlS2V5LCBlKSk7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBxci5GcyhlLCB0KTtcbiAgICAgICAgICAgICAgICBuICYmICh0aGlzLktzID0gdGhpcy5Lcy5pbnNlcnQobi5jbGllbnRJZCwgbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuWHMoKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgb25saW5lIHN0YXRlIGFuZCBjYWxsIHRoZSBjYWxsYmFjayBoYW5kbGVyXG4gICAgICAgIC8vIGlmIGFwcGxpY2FibGUuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkpzKTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlpzKGUpO1xuICAgICAgICAgICAgdCAmJiB0aGlzLnRpKHQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmpzKSB0aGlzLnFzKHQpO1xuICAgICAgICB0aGlzLmpzID0gW10sIFxuICAgICAgICAvLyBSZWdpc3RlciBhIHdpbmRvdyB1bmxvYWQgaG9vayB0byByZW1vdmUgdGhlIGNsaWVudCBtZXRhZGF0YSBlbnRyeSBmcm9tXG4gICAgICAgIC8vIFdlYlN0b3JhZ2UgZXZlbiBpZiBgc2h1dGRvd24oKWAgd2FzIG5vdCBjYWxsZWQuXG4gICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCAoKCkgPT4gdGhpcy5zaHV0ZG93bigpKSksIHRoaXMuc3RhcnRlZCA9ICEwO1xuICAgIH1cbiAgICB3cml0ZVNlcXVlbmNlTnVtYmVyKHQpIHtcbiAgICAgICAgdGhpcy5zZXRJdGVtKHRoaXMuV3MsIEpTT04uc3RyaW5naWZ5KHQpKTtcbiAgICB9XG4gICAgZ2V0QWxsQWN0aXZlUXVlcnlUYXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5laSh0aGlzLktzKTtcbiAgICB9XG4gICAgaXNBY3RpdmVRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIGxldCBlID0gITE7XG4gICAgICAgIHJldHVybiB0aGlzLktzLmZvckVhY2goKChuLCBzKSA9PiB7XG4gICAgICAgICAgICBzLmFjdGl2ZVRhcmdldElkcy5oYXModCkgJiYgKGUgPSAhMCk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG4gICAgYWRkUGVuZGluZ011dGF0aW9uKHQpIHtcbiAgICAgICAgdGhpcy5uaSh0LCBcInBlbmRpbmdcIik7XG4gICAgfVxuICAgIHVwZGF0ZU11dGF0aW9uU3RhdGUodCwgZSwgbikge1xuICAgICAgICB0aGlzLm5pKHQsIGUsIG4pLCBcbiAgICAgICAgLy8gT25jZSBhIGZpbmFsIG11dGF0aW9uIHJlc3VsdCBpcyBvYnNlcnZlZCBieSBvdGhlciBjbGllbnRzLCB0aGV5IG5vIGxvbmdlclxuICAgICAgICAvLyBhY2Nlc3MgdGhlIG11dGF0aW9uJ3MgbWV0YWRhdGEgZW50cnkuIFNpbmNlIFdlYlN0b3JhZ2UgcmVwbGF5cyBldmVudHNcbiAgICAgICAgLy8gaW4gb3JkZXIsIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBlbnRyeSByaWdodCBhZnRlciB1cGRhdGluZyBpdC5cbiAgICAgICAgdGhpcy5zaSh0KTtcbiAgICB9XG4gICAgYWRkTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIGxldCBlID0gXCJub3QtY3VycmVudFwiO1xuICAgICAgICAvLyBMb29rdXAgYW4gZXhpc3RpbmcgcXVlcnkgc3RhdGUgaWYgdGhlIHRhcmdldCBJRCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICAgIC8vIGJ5IGFub3RoZXIgdGFiXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmVRdWVyeVRhcmdldCh0KSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKExyKHRoaXMucGVyc2lzdGVuY2VLZXksIHQpKTtcbiAgICAgICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IFVyLkZzKHQsIG4pO1xuICAgICAgICAgICAgICAgIHMgJiYgKGUgPSBzLnN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5paS5Ncyh0KSwgdGhpcy5YcygpLCBlO1xuICAgIH1cbiAgICByZW1vdmVMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgdGhpcy5paS5Mcyh0KSwgdGhpcy5YcygpO1xuICAgIH1cbiAgICBpc0xvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5paS5hY3RpdmVUYXJnZXRJZHMuaGFzKHQpO1xuICAgIH1cbiAgICBjbGVhclF1ZXJ5U3RhdGUodCkge1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oTHIodGhpcy5wZXJzaXN0ZW5jZUtleSwgdCkpO1xuICAgIH1cbiAgICB1cGRhdGVRdWVyeVN0YXRlKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5yaSh0LCBlLCBuKTtcbiAgICB9XG4gICAgaGFuZGxlVXNlckNoYW5nZSh0LCBlLCBuKSB7XG4gICAgICAgIGUuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNpKHQpO1xuICAgICAgICB9KSksIHRoaXMuY3VycmVudFVzZXIgPSB0LCBuLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRQZW5kaW5nTXV0YXRpb24odCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2V0T25saW5lU3RhdGUodCkge1xuICAgICAgICB0aGlzLm9pKHQpO1xuICAgIH1cbiAgICBub3RpZnlCdW5kbGVMb2FkZWQoKSB7XG4gICAgICAgIHRoaXMuYWkoKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCAmJiAodGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwgdGhpcy5VcyksIHRoaXMucmVtb3ZlSXRlbSh0aGlzLlFzKSwgXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9ICExKTtcbiAgICB9XG4gICAgZ2V0SXRlbSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSh0KTtcbiAgICAgICAgcmV0dXJuICQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIlJFQURcIiwgdCwgZSksIGU7XG4gICAgfVxuICAgIHNldEl0ZW0odCwgZSkge1xuICAgICAgICAkKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJTRVRcIiwgdCwgZSksIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHQsIGUpO1xuICAgIH1cbiAgICByZW1vdmVJdGVtKHQpIHtcbiAgICAgICAgJChcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiUkVNT1ZFXCIsIHQpLCB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0KTtcbiAgICB9XG4gICAgcXModCkge1xuICAgICAgICAvLyBOb3RlOiBUaGUgZnVuY3Rpb24gaXMgdHlwZWQgdG8gdGFrZSBFdmVudCB0byBiZSBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoXG4gICAgICAgIC8vIGBXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcmAuXG4gICAgICAgIGNvbnN0IGUgPSB0O1xuICAgICAgICBpZiAoZS5zdG9yYWdlQXJlYSA9PT0gdGhpcy5zdG9yYWdlKSB7XG4gICAgICAgICAgICBpZiAoJChcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiRVZFTlRcIiwgZS5rZXksIGUubmV3VmFsdWUpLCBlLmtleSA9PT0gdGhpcy5RcykgcmV0dXJuIHZvaWQgRihcIlJlY2VpdmVkIFdlYlN0b3JhZ2Ugbm90aWZpY2F0aW9uIGZvciBsb2NhbCBjaGFuZ2UuIEFub3RoZXIgY2xpZW50IG1pZ2h0IGhhdmUgZ2FyYmFnZS1jb2xsZWN0ZWQgb3VyIHN0YXRlXCIpO1xuICAgICAgICAgICAgdGhpcy5PZS5lbnF1ZXVlUmV0cnlhYmxlKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZS5rZXkpIGlmICh0aGlzLkdzLnRlc3QoZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY2koZS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVpKHQsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmhpKGUua2V5LCBlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHRoaXMudWkodC5jbGllbnRJZCwgdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy56cy50ZXN0KGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5saShlLmtleSwgZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLmZpKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuSHMudGVzdChlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZGkoZS5rZXksIGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdGhpcy53aSh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gdGhpcy5Kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5acyhlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHRoaXMudGkodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMuV3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBldC5JO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQpIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBKU09OLnBhcnNlKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCKFwibnVtYmVyXCIgPT0gdHlwZW9mIG4pLCBlID0gbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIkZhaWxlZCB0byByZWFkIHNlcXVlbmNlIG51bWJlciBmcm9tIFdlYlN0b3JhZ2VcIiwgdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gKiBgTWVtb3J5U2hhcmVkQ2xpZW50U3RhdGVgIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFNoYXJlZENsaWVudFN0YXRlIGZvclxuICogY2xpZW50cyB1c2luZyBtZW1vcnkgcGVyc2lzdGVuY2UuIFRoZSBzdGF0ZSBpbiB0aGlzIGNsYXNzIHJlbWFpbnMgZnVsbHlcbiAqIGlzb2xhdGVkIGFuZCBubyBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkLlxuICovIChlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgIT09IGV0LkkgJiYgdGhpcy5zZXF1ZW5jZU51bWJlckhhbmRsZXIodCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMuWXMpIHJldHVybiB0aGlzLnN5bmNFbmdpbmUuX2koKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5qcy5wdXNoKGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuS3MuZ2V0KHRoaXMuQnMpO1xuICAgIH1cbiAgICBYcygpIHtcbiAgICAgICAgdGhpcy5zZXRJdGVtKHRoaXMuUXMsIHRoaXMuaWkuT3MoKSk7XG4gICAgfVxuICAgIG5pKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBCcih0aGlzLmN1cnJlbnRVc2VyLCB0LCBlLCBuKSwgaSA9IE1yKHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMuY3VycmVudFVzZXIsIHQpO1xuICAgICAgICB0aGlzLnNldEl0ZW0oaSwgcy5PcygpKTtcbiAgICB9XG4gICAgc2kodCkge1xuICAgICAgICBjb25zdCBlID0gTXIodGhpcy5wZXJzaXN0ZW5jZUtleSwgdGhpcy5jdXJyZW50VXNlciwgdCk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShlKTtcbiAgICB9XG4gICAgb2kodCkge1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuQnMsXG4gICAgICAgICAgICBvbmxpbmVTdGF0ZTogdFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkpzLCBKU09OLnN0cmluZ2lmeShlKSk7XG4gICAgfVxuICAgIHJpKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IExyKHRoaXMucGVyc2lzdGVuY2VLZXksIHQpLCBpID0gbmV3IFVyKHQsIGUsIG4pO1xuICAgICAgICB0aGlzLnNldEl0ZW0ocywgaS5PcygpKTtcbiAgICB9XG4gICAgYWkoKSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLllzLCBcInZhbHVlLW5vdC11c2VkXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBjbGllbnQgc3RhdGUga2V5IGluIFdlYlN0b3JhZ2UuIFJldHVybnMgbnVsbCBpZiB0aGUga2V5IGRvZXMgbm90XG4gICAgICogbWF0Y2ggdGhlIGV4cGVjdGVkIGtleSBmb3JtYXQuXG4gICAgICovICAgIGNpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuR3MuZXhlYyh0KTtcbiAgICAgICAgcmV0dXJuIGUgPyBlWzFdIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgY2xpZW50IHN0YXRlIGluIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZSBjb3VsZCBub3RcbiAgICAgKiBiZSBwYXJzZWQuXG4gICAgICovICAgIGhpKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuY2kodCk7XG4gICAgICAgIHJldHVybiBxci5GcyhuLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgbXV0YXRpb24gYmF0Y2ggc3RhdGUgaW4gV2ViU3RvcmFnZS4gUmV0dXJucyAnbnVsbCcgaWYgdGhlIHZhbHVlXG4gICAgICogY291bGQgbm90IGJlIHBhcnNlZC5cbiAgICAgKi8gICAgbGkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy56cy5leGVjKHQpLCBzID0gTnVtYmVyKG5bMV0pLCBpID0gdm9pZCAwICE9PSBuWzJdID8gblsyXSA6IG51bGw7XG4gICAgICAgIHJldHVybiBCci5GcyhuZXcgRChpKSwgcywgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHF1ZXJ5IHRhcmdldCBzdGF0ZSBmcm9tIFdlYlN0b3JhZ2UuIFJldHVybnMgJ251bGwnIGlmIHRoZSB2YWx1ZVxuICAgICAqIGNvdWxkIG5vdCBiZSBwYXJzZWQuXG4gICAgICovICAgIGRpKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuSHMuZXhlYyh0KSwgcyA9IE51bWJlcihuWzFdKTtcbiAgICAgICAgcmV0dXJuIFVyLkZzKHMsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYW4gb25saW5lIHN0YXRlIGZyb20gV2ViU3RvcmFnZS4gUmV0dXJucyAnbnVsbCcgaWYgdGhlIHZhbHVlXG4gICAgICogY291bGQgbm90IGJlIHBhcnNlZC5cbiAgICAgKi8gICAgWnModCkge1xuICAgICAgICByZXR1cm4gS3IuRnModCk7XG4gICAgfVxuICAgIGFzeW5jIGZpKHQpIHtcbiAgICAgICAgaWYgKHQudXNlci51aWQgPT09IHRoaXMuY3VycmVudFVzZXIudWlkKSByZXR1cm4gdGhpcy5zeW5jRW5naW5lLm1pKHQuYmF0Y2hJZCwgdC5zdGF0ZSwgdC5lcnJvcik7XG4gICAgICAgICQoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgSWdub3JpbmcgbXV0YXRpb24gZm9yIG5vbi1hY3RpdmUgdXNlciAke3QudXNlci51aWR9YCk7XG4gICAgfVxuICAgIHdpKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0VuZ2luZS5naSh0LnRhcmdldElkLCB0LnN0YXRlLCB0LmVycm9yKTtcbiAgICB9XG4gICAgdWkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZSA/IHRoaXMuS3MuaW5zZXJ0KHQsIGUpIDogdGhpcy5Lcy5yZW1vdmUodCksIHMgPSB0aGlzLmVpKHRoaXMuS3MpLCBpID0gdGhpcy5laShuKSwgciA9IFtdLCBvID0gW107XG4gICAgICAgIHJldHVybiBpLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgcy5oYXModCkgfHwgci5wdXNoKHQpO1xuICAgICAgICB9KSksIHMuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBpLmhhcyh0KSB8fCBvLnB1c2godCk7XG4gICAgICAgIH0pKSwgdGhpcy5zeW5jRW5naW5lLnlpKHIsIG8pLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuS3MgPSBuO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHRpKHQpIHtcbiAgICAgICAgLy8gV2UgY2hlY2sgd2hldGhlciB0aGUgY2xpZW50IHRoYXQgd3JvdGUgdGhpcyBvbmxpbmUgc3RhdGUgaXMgc3RpbGwgYWN0aXZlXG4gICAgICAgIC8vIGJ5IGNvbXBhcmluZyBpdHMgY2xpZW50IElEIHRvIHRoZSBsaXN0IG9mIGNsaWVudHMga2VwdCBhY3RpdmUgaW5cbiAgICAgICAgLy8gSW5kZXhlZERiLiBJZiBhIGNsaWVudCBkb2VzIG5vdCB1cGRhdGUgdGhlaXIgSW5kZXhlZERiIGNsaWVudCBzdGF0ZVxuICAgICAgICAvLyB3aXRoaW4gNSBzZWNvbmRzLCBpdCBpcyBjb25zaWRlcmVkIGluYWN0aXZlIGFuZCB3ZSBkb24ndCBlbWl0IGFuIG9ubGluZVxuICAgICAgICAvLyBzdGF0ZSBldmVudC5cbiAgICAgICAgdGhpcy5Lcy5nZXQodC5jbGllbnRJZCkgJiYgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIodC5vbmxpbmVTdGF0ZSk7XG4gICAgfVxuICAgIGVpKHQpIHtcbiAgICAgICAgbGV0IGUgPSBDbigpO1xuICAgICAgICByZXR1cm4gdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgZSA9IGUudW5pb25XaXRoKG4uYWN0aXZlVGFyZ2V0SWRzKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbn1cblxuY2xhc3MgV3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBpID0gbmV3IGpyLCB0aGlzLlRpID0ge30sIHRoaXMub25saW5lU3RhdGVIYW5kbGVyID0gbnVsbCwgdGhpcy5zZXF1ZW5jZU51bWJlckhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgICBhZGRQZW5kaW5nTXV0YXRpb24odCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgdXBkYXRlTXV0YXRpb25TdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICBhZGRMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkuTXModCksIHRoaXMuVGlbdF0gfHwgXCJub3QtY3VycmVudFwiO1xuICAgIH1cbiAgICB1cGRhdGVRdWVyeVN0YXRlKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5UaVt0XSA9IGU7XG4gICAgfVxuICAgIHJlbW92ZUxvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICB0aGlzLnBpLkxzKHQpO1xuICAgIH1cbiAgICBpc0xvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waS5hY3RpdmVUYXJnZXRJZHMuaGFzKHQpO1xuICAgIH1cbiAgICBjbGVhclF1ZXJ5U3RhdGUodCkge1xuICAgICAgICBkZWxldGUgdGhpcy5UaVt0XTtcbiAgICB9XG4gICAgZ2V0QWxsQWN0aXZlUXVlcnlUYXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waS5hY3RpdmVUYXJnZXRJZHM7XG4gICAgfVxuICAgIGlzQWN0aXZlUXVlcnlUYXJnZXQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waS5hY3RpdmVUYXJnZXRJZHMuaGFzKHQpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGkgPSBuZXcganIsIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBoYW5kbGVVc2VyQ2hhbmdlKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIHNldE9ubGluZVN0YXRlKHQpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIHNodXRkb3duKCkge31cbiAgICB3cml0ZVNlcXVlbmNlTnVtYmVyKHQpIHt9XG4gICAgbm90aWZ5QnVuZGxlTG9hZGVkKCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIEdyIHtcbiAgICBFaSh0KSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgLy8gTm8tb3AuXG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gUmVmZXJlbmNlcyB0byBgd2luZG93YCBhcmUgZ3VhcmRlZCBieSBCcm93c2VyQ29ubmVjdGl2aXR5TW9uaXRvci5pc0F2YWlsYWJsZSgpXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbi8qKlxuICogQnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBDb25uZWN0aXZpdHlNb25pdG9yLlxuICovXG5jbGFzcyB6ciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuSWkgPSAoKSA9PiB0aGlzLkFpKCksIHRoaXMuUmkgPSAoKSA9PiB0aGlzLlBpKCksIHRoaXMuYmkgPSBbXSwgdGhpcy52aSgpO1xuICAgIH1cbiAgICBFaSh0KSB7XG4gICAgICAgIHRoaXMuYmkucHVzaCh0KTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMuSWkpLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5SaSk7XG4gICAgfVxuICAgIHZpKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLklpKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMuUmkpO1xuICAgIH1cbiAgICBBaSgpIHtcbiAgICAgICAgJChcIkNvbm5lY3Rpdml0eU1vbml0b3JcIiwgXCJOZXR3b3JrIGNvbm5lY3Rpdml0eSBjaGFuZ2VkOiBBVkFJTEFCTEVcIik7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmJpKSB0KDAgLyogQVZBSUxBQkxFICovKTtcbiAgICB9XG4gICAgUGkoKSB7XG4gICAgICAgICQoXCJDb25uZWN0aXZpdHlNb25pdG9yXCIsIFwiTmV0d29yayBjb25uZWN0aXZpdHkgY2hhbmdlZDogVU5BVkFJTEFCTEVcIik7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmJpKSB0KDEgLyogVU5BVkFJTEFCTEUgKi8pO1xuICAgIH1cbiAgICAvLyBUT0RPKGNoZW5icmlhbik6IENvbnNpZGVyIHBhc3NpbmcgaW4gd2luZG93IGVpdGhlciBpbnRvIHRoaXMgY29tcG9uZW50IG9yXG4gICAgLy8gaGVyZSBmb3IgdGVzdGluZyB2aWEgRmFrZVdpbmRvdy5cbiAgICAvKiogQ2hlY2tzIHRoYXQgYWxsIHVzZWQgYXR0cmlidXRlcyBvZiB3aW5kb3cgYXJlIGF2YWlsYWJsZS4gKi9cbiAgICBzdGF0aWMgYnQoKSB7XG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgJiYgdm9pZCAwICE9PSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAmJiB2b2lkIDAgIT09IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgSHIgPSB7XG4gICAgQmF0Y2hHZXREb2N1bWVudHM6IFwiYmF0Y2hHZXRcIixcbiAgICBDb21taXQ6IFwiY29tbWl0XCIsXG4gICAgUnVuUXVlcnk6IFwicnVuUXVlcnlcIlxufTtcblxuLyoqXG4gKiBNYXBzIFJQQyBuYW1lcyB0byB0aGUgY29ycmVzcG9uZGluZyBSRVNUIGVuZHBvaW50IG5hbWUuXG4gKlxuICogV2UgdXNlIGFycmF5IG5vdGF0aW9uIHRvIGF2b2lkIG1hbmdsaW5nLlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoZWxwZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBTdHJlYW0gaW50ZXJmYWNlIHRvXG4gKiBicmlkZ2UgdG8gb3RoZXIgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIHN0cmVhbXMgYnV0IGRvIG5vdCBpbXBsZW1lbnQgdGhlXG4gKiBpbnRlcmZhY2UuIFRoZSBzdHJlYW0gY2FsbGJhY2tzIGFyZSBpbnZva2VkIHdpdGggdGhlIGNhbGxPbi4uLiBtZXRob2RzLlxuICovXG5jbGFzcyBKciB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLlZpID0gdC5WaSwgdGhpcy5TaSA9IHQuU2k7XG4gICAgfVxuICAgIERpKHQpIHtcbiAgICAgICAgdGhpcy5DaSA9IHQ7XG4gICAgfVxuICAgIE5pKHQpIHtcbiAgICAgICAgdGhpcy5raSA9IHQ7XG4gICAgfVxuICAgIG9uTWVzc2FnZSh0KSB7XG4gICAgICAgIHRoaXMueGkgPSB0O1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5TaSgpO1xuICAgIH1cbiAgICBzZW5kKHQpIHtcbiAgICAgICAgdGhpcy5WaSh0KTtcbiAgICB9XG4gICAgJGkoKSB7XG4gICAgICAgIHRoaXMuQ2koKTtcbiAgICB9XG4gICAgRmkodCkge1xuICAgICAgICB0aGlzLmtpKHQpO1xuICAgIH1cbiAgICBPaSh0KSB7XG4gICAgICAgIHRoaXMueGkodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBZciBleHRlbmRzIFxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgUmVzdC1iYXNlZCBjb25uZWN0aW9ucyB0byB0aGUgYmFja2VuZCAoV2ViQ2hhbm5lbCBhbmRcbiAqIEhUVFApLlxuICovXG5jbGFzcyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmRhdGFiYXNlSW5mbyA9IHQsIHRoaXMuZGF0YWJhc2VJZCA9IHQuZGF0YWJhc2VJZDtcbiAgICAgICAgY29uc3QgZSA9IHQuc3NsID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIHRoaXMuTWkgPSBlICsgXCI6Ly9cIiArIHQuaG9zdCwgdGhpcy5MaSA9IFwicHJvamVjdHMvXCIgKyB0aGlzLmRhdGFiYXNlSWQucHJvamVjdElkICsgXCIvZGF0YWJhc2VzL1wiICsgdGhpcy5kYXRhYmFzZUlkLmRhdGFiYXNlICsgXCIvZG9jdW1lbnRzXCI7XG4gICAgfVxuICAgIEJpKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuVWkodCwgZSk7XG4gICAgICAgICQoXCJSZXN0Q29ubmVjdGlvblwiLCBcIlNlbmRpbmc6IFwiLCByLCBuKTtcbiAgICAgICAgY29uc3QgbyA9IHt9O1xuICAgICAgICByZXR1cm4gdGhpcy5xaShvLCBzLCBpKSwgdGhpcy5LaSh0LCByLCBvLCBuKS50aGVuKCh0ID0+ICgkKFwiUmVzdENvbm5lY3Rpb25cIiwgXCJSZWNlaXZlZDogXCIsIHQpLCBcbiAgICAgICAgdCkpLCAoZSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBPKFwiUmVzdENvbm5lY3Rpb25cIiwgYCR7dH0gZmFpbGVkIHdpdGggZXJyb3I6IGAsIGUsIFwidXJsOiBcIiwgciwgXCJyZXF1ZXN0OlwiLCBuKSwgXG4gICAgICAgICAgICBlO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGppKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgLy8gVGhlIFJFU1QgQVBJIGF1dG9tYXRpY2FsbHkgYWdncmVnYXRlcyBhbGwgb2YgdGhlIHN0cmVhbWVkIHJlc3VsdHMsIHNvIHdlXG4gICAgICAgIC8vIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGludm9rZSgpIG1ldGhvZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuQmkodCwgZSwgbiwgcywgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIHRoZSBoZWFkZXJzIGZvciBhIHJlcXVlc3QsIGFkZGluZyBhbnkgYXV0aG9yaXphdGlvbiB0b2tlbiBpZlxuICAgICAqIHByZXNlbnQgYW5kIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqLyAgICBxaSh0LCBlLCBuKSB7XG4gICAgICAgIHRbXCJYLUdvb2ctQXBpLUNsaWVudFwiXSA9IFwiZ2wtanMvIGZpcmUvXCIgKyBDLCBcbiAgICAgICAgLy8gQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIHdpbGwgYXZvaWQgcHJlZmxpZ2h0IHJlcXVlc3RzIHdoaWNoIG1pZ2h0XG4gICAgICAgIC8vIG1lc3Mgd2l0aCBDT1JTIGFuZCByZWRpcmVjdHMgYnkgcHJveGllcy4gSWYgd2UgYWRkIGN1c3RvbSBoZWFkZXJzXG4gICAgICAgIC8vIHdlIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhpcyBjb2RlIHRvIHBvdGVudGlhbGx5IHVzZSB0aGUgJGh0dHBPdmVyd3JpdGVcbiAgICAgICAgLy8gcGFyYW1ldGVyIHN1cHBvcnRlZCBieSBFU0YgdG8gYXZvaWQgdHJpZ2dlcmluZyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICAgIHRbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvcGxhaW5cIiwgdGhpcy5kYXRhYmFzZUluZm8uYXBwSWQgJiYgKHRbXCJYLUZpcmViYXNlLUdNUElEXCJdID0gdGhpcy5kYXRhYmFzZUluZm8uYXBwSWQpLCBcbiAgICAgICAgZSAmJiBlLmhlYWRlcnMuZm9yRWFjaCgoKGUsIG4pID0+IHRbbl0gPSBlKSksIG4gJiYgbi5oZWFkZXJzLmZvckVhY2goKChlLCBuKSA9PiB0W25dID0gZSkpO1xuICAgIH1cbiAgICBVaSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBIclt0XTtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuTWl9L3YxLyR7ZX06JHtufWA7XG4gICAgfVxufSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcih0KSwgdGhpcy5mb3JjZUxvbmdQb2xsaW5nID0gdC5mb3JjZUxvbmdQb2xsaW5nLCB0aGlzLmF1dG9EZXRlY3RMb25nUG9sbGluZyA9IHQuYXV0b0RldGVjdExvbmdQb2xsaW5nLCBcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgPSB0LnVzZUZldGNoU3RyZWFtcztcbiAgICB9XG4gICAgS2kodCwgZSwgbiwgcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKChpLCByKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gbmV3IFhocklvO1xuICAgICAgICAgICAgby5saXN0ZW5PbmNlKEV2ZW50VHlwZS5DT01QTEVURSwgKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG8uZ2V0TGFzdEVycm9yQ29kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGUuTk9fRVJST1I6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gby5nZXRSZXNwb25zZUpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCJDb25uZWN0aW9uXCIsIFwiWEhSIHJlY2VpdmVkOlwiLCBKU09OLnN0cmluZ2lmeShlKSksIGkoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLlRJTUVPVVQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiQ29ubmVjdGlvblwiLCAnUlBDIFwiJyArIHQgKyAnXCIgdGltZWQgb3V0JyksIHIobmV3IGooSy5ERUFETElORV9FWENFRURFRCwgXCJSZXF1ZXN0IHRpbWUgb3V0XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGUuSFRUUF9FUlJPUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBvLmdldFN0YXR1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoXCJDb25uZWN0aW9uXCIsICdSUEMgXCInICsgdCArICdcIiBmYWlsZWQgd2l0aCBzdGF0dXM6JywgbiwgXCJyZXNwb25zZSB0ZXh0OlwiLCBvLmdldFJlc3BvbnNlVGV4dCgpKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBuID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBvLmdldFJlc3BvbnNlSnNvbigpLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuc3RhdHVzICYmIHQubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKEspLmluZGV4T2YoZSkgPj0gMCA/IGUgOiBLLlVOS05PV047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKG5ldyBqKGUsIHQubWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSByKG5ldyBqKEsuVU5LTk9XTiwgXCJTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggc3RhdHVzIFwiICsgby5nZXRTdGF0dXMoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZWQgYW4gSFRUUF9FUlJPUiBidXQgdGhlcmUncyBubyBzdGF0dXMgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgbW9zdCBwcm9iYWJseSBhIGNvbm5lY3Rpb24gaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIHIobmV3IGooSy5VTkFWQUlMQUJMRSwgXCJDb25uZWN0aW9uIGZhaWxlZC5cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgTCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgJChcIkNvbm5lY3Rpb25cIiwgJ1JQQyBcIicgKyB0ICsgJ1wiIGNvbXBsZXRlZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBhID0gSlNPTi5zdHJpbmdpZnkocyk7XG4gICAgICAgICAgICBvLnNlbmQoZSwgXCJQT1NUXCIsIGEsIG4sIDE1KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBRaSh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBbIHRoaXMuTWksIFwiL1wiLCBcImdvb2dsZS5maXJlc3RvcmUudjEuRmlyZXN0b3JlXCIsIFwiL1wiLCB0LCBcIi9jaGFubmVsXCIgXSwgaSA9IGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQoKSwgciA9IGdldFN0YXRFdmVudFRhcmdldCgpLCBvID0ge1xuICAgICAgICAgICAgLy8gUmVxdWlyZWQgZm9yIGJhY2tlbmQgc3RpY2tpbmVzcywgcm91dGluZyBiZWhhdmlvciBpcyBiYXNlZCBvbiB0aGlzXG4gICAgICAgICAgICAvLyBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBodHRwU2Vzc2lvbklkUGFyYW06IFwiZ3Nlc3Npb25pZFwiLFxuICAgICAgICAgICAgaW5pdE1lc3NhZ2VIZWFkZXJzOiB7fSxcbiAgICAgICAgICAgIG1lc3NhZ2VVcmxQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhcmFtIGlzIHVzZWQgdG8gaW1wcm92ZSByb3V0aW5nIGFuZCBwcm9qZWN0IGlzb2xhdGlvbiBieSB0aGVcbiAgICAgICAgICAgICAgICAvLyBiYWNrZW5kIGFuZCBtdXN0IGJlIGluY2x1ZGVkIGluIGV2ZXJ5IHJlcXVlc3QuXG4gICAgICAgICAgICAgICAgZGF0YWJhc2U6IGBwcm9qZWN0cy8ke3RoaXMuZGF0YWJhc2VJZC5wcm9qZWN0SWR9L2RhdGFiYXNlcy8ke3RoaXMuZGF0YWJhc2VJZC5kYXRhYmFzZX1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VuZFJhd0pzb246ICEwLFxuICAgICAgICAgICAgc3VwcG9ydHNDcm9zc0RvbWFpblhocjogITAsXG4gICAgICAgICAgICBpbnRlcm5hbENoYW5uZWxQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCB0aW1lb3V0IChyYW5kb21pemVkIGJldHdlZW4gMTAtMjAgc2Vjb25kcykgc2luY2VcbiAgICAgICAgICAgICAgICAvLyBhIGxhcmdlIHdyaXRlIGJhdGNoIG9uIGEgc2xvdyBpbnRlcm5ldCBjb25uZWN0aW9uIG1heSB0YWtlIGEgbG9uZ1xuICAgICAgICAgICAgICAgIC8vIHRpbWUgdG8gc2VuZCB0byB0aGUgYmFja2VuZC4gUmF0aGVyIHRoYW4gaGF2ZSBXZWJDaGFubmVsIGltcG9zZSBhXG4gICAgICAgICAgICAgICAgLy8gdGlnaHQgdGltZW91dCB3aGljaCBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHRpbWVvdXRzIGFuZCByZXRyaWVzLCB3ZVxuICAgICAgICAgICAgICAgIC8vIHNldCBpdCB2ZXJ5IGxhcmdlICg1LTEwIG1pbnV0ZXMpIGFuZCByZWx5IG9uIHRoZSBicm93c2VyJ3MgYnVpbHRpblxuICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRzIHRvIGtpY2sgaW4gaWYgdGhlIHJlcXVlc3QgaXNuJ3Qgd29ya2luZy5cbiAgICAgICAgICAgICAgICBmb3J3YXJkQ2hhbm5lbFJlcXVlc3RUaW1lb3V0TXM6IDZlNVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcmNlTG9uZ1BvbGxpbmc6IHRoaXMuZm9yY2VMb25nUG9sbGluZyxcbiAgICAgICAgICAgIGRldGVjdEJ1ZmZlcmluZ1Byb3h5OiB0aGlzLmF1dG9EZXRlY3RMb25nUG9sbGluZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnVzZUZldGNoU3RyZWFtcyAmJiAoby54bWxIdHRwRmFjdG9yeSA9IG5ldyBGZXRjaFhtbEh0dHBGYWN0b3J5KHt9KSksIHRoaXMucWkoby5pbml0TWVzc2FnZUhlYWRlcnMsIGUsIG4pLCBcbiAgICAgICAgLy8gU2VuZGluZyB0aGUgY3VzdG9tIGhlYWRlcnMgd2UganVzdCBhZGRlZCB0byByZXF1ZXN0LmluaXRNZXNzYWdlSGVhZGVyc1xuICAgICAgICAvLyAoQXV0aG9yaXphdGlvbiwgZXRjLikgd2lsbCB0cmlnZ2VyIHRoZSBicm93c2VyIHRvIG1ha2UgYSBDT1JTIHByZWZsaWdodFxuICAgICAgICAvLyByZXF1ZXN0IGJlY2F1c2UgdGhlIFhIUiB3aWxsIG5vIGxvbmdlciBtZWV0IHRoZSBjcml0ZXJpYSBmb3IgYSBcInNpbXBsZVwiXG4gICAgICAgIC8vIENPUlMgcmVxdWVzdDpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9DT1JTI1NpbXBsZV9yZXF1ZXN0c1xuICAgICAgICAvLyBUaGVyZWZvcmUgdG8gYXZvaWQgdGhlIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3QgKGFuIGV4dHJhIG5ldHdvcmtcbiAgICAgICAgLy8gcm91bmR0cmlwKSwgd2UgdXNlIHRoZSBodHRwSGVhZGVyc092ZXJ3cml0ZVBhcmFtIG9wdGlvbiB0byBzcGVjaWZ5IHRoYXRcbiAgICAgICAgLy8gdGhlIGhlYWRlcnMgc2hvdWxkIGluc3RlYWQgYmUgZW5jb2RlZCBpbnRvIGEgc3BlY2lhbCBcIiRodHRwSGVhZGVyc1wiIHF1ZXJ5XG4gICAgICAgIC8vIHBhcmFtZXRlciwgd2hpY2ggaXMgcmVjb2duaXplZCBieSB0aGUgd2ViY2hhbm5lbCBiYWNrZW5kLiBUaGlzIGlzXG4gICAgICAgIC8vIGZvcm1hbGx5IGRlZmluZWQgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvYmxvYi9iMGUxODE1YjEzZmI5MmE0NmQ3YzliM2MzMGRlNWQ2YTM5NmEzMjQ1L2Nsb3N1cmUvZ29vZy9uZXQvcnBjL2h0dHBjb3JzLmpzI0wzMlxuICAgICAgICAvLyBUT0RPKGIvMTQ1NjI0NzU2KTogVGhlcmUgaXMgYSBiYWNrZW5kIGJ1ZyB3aGVyZSAkaHR0cEhlYWRlcnMgaXNuJ3QgcmVzcGVjdGVkIGlmIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSBhbiBPcmlnaW4gaGVhZGVyLiBTbyB3ZSBoYXZlIHRvIGV4Y2x1ZGUgYSBmZXcgYnJvd3NlciBlbnZpcm9ubWVudHMgdGhhdCBhcmVcbiAgICAgICAgLy8ga25vd24gdG8gKHNvbWV0aW1lcykgbm90IGluY2x1ZGUgYW4gT3JpZ2luLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvMTQ5MS5cbiAgICAgICAgaXNNb2JpbGVDb3Jkb3ZhKCkgfHwgaXNSZWFjdE5hdGl2ZSgpIHx8IGlzRWxlY3Ryb24oKSB8fCBpc0lFKCkgfHwgaXNVV1AoKSB8fCBpc0Jyb3dzZXJFeHRlbnNpb24oKSB8fCAoby5odHRwSGVhZGVyc092ZXJ3cml0ZVBhcmFtID0gXCIkaHR0cEhlYWRlcnNcIik7XG4gICAgICAgIGNvbnN0IGEgPSBzLmpvaW4oXCJcIik7XG4gICAgICAgICQoXCJDb25uZWN0aW9uXCIsIFwiQ3JlYXRpbmcgV2ViQ2hhbm5lbDogXCIgKyBhLCBvKTtcbiAgICAgICAgY29uc3QgYyA9IGkuY3JlYXRlV2ViQ2hhbm5lbChhLCBvKTtcbiAgICAgICAgLy8gV2ViQ2hhbm5lbCBzdXBwb3J0cyBzZW5kaW5nIHRoZSBmaXJzdCBtZXNzYWdlIHdpdGggdGhlIGhhbmRzaGFrZSAtIHNhdmluZ1xuICAgICAgICAvLyBhIG5ldHdvcmsgcm91bmQgdHJpcC4gSG93ZXZlciwgaXQgd2lsbCBoYXZlIHRvIGNhbGwgc2VuZCBpbiB0aGUgc2FtZVxuICAgICAgICAvLyBKUyBldmVudCBsb29wIGFzIG9wZW4uIEluIG9yZGVyIHRvIGVuZm9yY2UgdGhpcywgd2UgZGVsYXkgYWN0dWFsbHlcbiAgICAgICAgLy8gb3BlbmluZyB0aGUgV2ViQ2hhbm5lbCB1bnRpbCBzZW5kIGlzIGNhbGxlZC4gV2hldGhlciB3ZSBoYXZlIGNhbGxlZFxuICAgICAgICAvLyBvcGVuIGlzIHRyYWNrZWQgd2l0aCB0aGlzIHZhcmlhYmxlLlxuICAgICAgICAgICAgICAgIGxldCB1ID0gITEsIGggPSAhMTtcbiAgICAgICAgLy8gQSBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdHJlYW0gd2FzIGNsb3NlZCAoYnkgdXMgb3IgdGhyb3VnaCBhblxuICAgICAgICAvLyBlcnJvci9jbG9zZSBldmVudCkgdG8gYXZvaWQgZGVsaXZlcmluZyBtdWx0aXBsZSBjbG9zZSBldmVudHMgb3Igc2VuZGluZ1xuICAgICAgICAvLyBvbiBhIGNsb3NlZCBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBnID0gbmV3IEpyKHtcbiAgICAgICAgICAgIFZpOiB0ID0+IHtcbiAgICAgICAgICAgICAgICBoID8gJChcIkNvbm5lY3Rpb25cIiwgXCJOb3Qgc2VuZGluZyBiZWNhdXNlIFdlYkNoYW5uZWwgaXMgY2xvc2VkOlwiLCB0KSA6ICh1IHx8ICgkKFwiQ29ubmVjdGlvblwiLCBcIk9wZW5pbmcgV2ViQ2hhbm5lbCB0cmFuc3BvcnQuXCIpLCBcbiAgICAgICAgICAgICAgICBjLm9wZW4oKSwgdSA9ICEwKSwgJChcIkNvbm5lY3Rpb25cIiwgXCJXZWJDaGFubmVsIHNlbmRpbmc6XCIsIHQpLCBjLnNlbmQodCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFNpOiAoKSA9PiBjLmNsb3NlKClcbiAgICAgICAgfSksIHkgPSAodCwgZSwgbikgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiBjbG9zdXJlIHR5cGluZyBzZWVtcyBicm9rZW4gYmVjYXVzZSBXZWJDaGFubmVsIGRvZXNcbiAgICAgICAgICAgIC8vIG5vdCBpbXBsZW1lbnQgZ29vZy5ldmVudHMuTGlzdGVuYWJsZVxuICAgICAgICAgICAgdC5saXN0ZW4oZSwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0O1xuICAgICAgICAgICAgICAgICAgICB9KSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBDbG9zdXJlIGV2ZW50cyBhcmUgZ3VhcmRlZCBhbmQgZXhjZXB0aW9ucyBhcmUgc3dhbGxvd2VkLCBzbyBjYXRjaCBhbnlcbiAgICAgICAgLy8gZXhjZXB0aW9uIGFuZCByZXRocm93IHVzaW5nIGEgc2V0VGltZW91dCBzbyB0aGV5IGJlY29tZSB2aXNpYmxlIGFnYWluLlxuICAgICAgICAvLyBOb3RlIHRoYXQgZXZlbnR1YWxseSB0aGlzIGZ1bmN0aW9uIGNvdWxkIGdvIGF3YXkgaWYgd2UgYXJlIGNvbmZpZGVudFxuICAgICAgICAvLyBlbm91Z2ggdGhlIGNvZGUgaXMgZXhjZXB0aW9uIGZyZWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHkoYywgV2ViQ2hhbm5lbC5FdmVudFR5cGUuT1BFTiwgKCgpID0+IHtcbiAgICAgICAgICAgIGggfHwgJChcIkNvbm5lY3Rpb25cIiwgXCJXZWJDaGFubmVsIHRyYW5zcG9ydCBvcGVuZWQuXCIpO1xuICAgICAgICB9KSksIHkoYywgV2ViQ2hhbm5lbC5FdmVudFR5cGUuQ0xPU0UsICgoKSA9PiB7XG4gICAgICAgICAgICBoIHx8IChoID0gITAsICQoXCJDb25uZWN0aW9uXCIsIFwiV2ViQ2hhbm5lbCB0cmFuc3BvcnQgY2xvc2VkXCIpLCBnLkZpKCkpO1xuICAgICAgICB9KSksIHkoYywgV2ViQ2hhbm5lbC5FdmVudFR5cGUuRVJST1IsICh0ID0+IHtcbiAgICAgICAgICAgIGggfHwgKGggPSAhMCwgTyhcIkNvbm5lY3Rpb25cIiwgXCJXZWJDaGFubmVsIHRyYW5zcG9ydCBlcnJvcmVkOlwiLCB0KSwgZy5GaShuZXcgaihLLlVOQVZBSUxBQkxFLCBcIlRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIGNvbXBsZXRlZFwiKSkpO1xuICAgICAgICB9KSksIHkoYywgV2ViQ2hhbm5lbC5FdmVudFR5cGUuTUVTU0FHRSwgKHQgPT4ge1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kYXRhWzBdO1xuICAgICAgICAgICAgICAgIEIoISFuKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMzUxNDM4OTEpOiBUaGVyZSBpcyBhIGJ1ZyBpbiBPbmUgUGxhdGZvcm0gdGhhdCBjYXVzZWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgLy8gKGFuZCBvbmx5IGVycm9ycykgdG8gYmUgd3JhcHBlZCBpbiBhbiBleHRyYSBhcnJheS4gVG8gYmUgZm9yd2FyZFxuICAgICAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCB0aGUgYnVnIHdlIG5lZWQgdG8gY2hlY2sgZWl0aGVyIGNvbmRpdGlvbi4gVGhlIGxhdHRlclxuICAgICAgICAgICAgICAgIC8vIGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGZpeCBoYXMgYmVlbiByb2xsZWQgb3V0LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBhbnkgYmVjYXVzZSBtc2dEYXRhLmVycm9yIGlzIG5vdCB0eXBlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbiwgaSA9IHMuZXJyb3IgfHwgKG51bGwgPT09IChlID0gc1swXSkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgJChcIkNvbm5lY3Rpb25cIiwgXCJXZWJDaGFubmVsIHJlY2VpdmVkIGVycm9yOlwiLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Iuc3RhdHVzIHdpbGwgYmUgYSBzdHJpbmcgbGlrZSAnT0snIG9yICdOT1RfRk9VTkQnLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlID0gXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICogTWFwcyBhbiBlcnJvciBDb2RlIGZyb20gYSBHUlBDIHN0YXR1cyBpZGVudGlmaWVyIGxpa2UgJ05PVF9GT1VORCcuXG4gKlxuICogQHJldHVybnMgVGhlIENvZGUgZXF1aXZhbGVudCB0byB0aGUgZ2l2ZW4gc3RhdHVzIHN0cmluZyBvciB1bmRlZmluZWQgaWZcbiAqICAgICB0aGVyZSBpcyBubyBtYXRjaC5cbiAqL1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rdXAgYnkgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGRuW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZSkgcmV0dXJuIG1uKGUpO1xuICAgICAgICAgICAgICAgICAgICB9KHQpLCBuID0gaS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBLLklOVEVSTkFMLCBuID0gXCJVbmtub3duIGVycm9yIHN0YXR1czogXCIgKyB0ICsgXCIgd2l0aCBtZXNzYWdlIFwiICsgaS5tZXNzYWdlKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgY2xvc2VkIHNvIG5vIGZ1cnRoZXIgZXZlbnRzIGFyZSBwcm9wYWdhdGVkXG4gICAgICAgICAgICAgICAgICAgIGggPSAhMCwgZy5GaShuZXcgaihlLCBuKSksIGMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgJChcIkNvbm5lY3Rpb25cIiwgXCJXZWJDaGFubmVsIHJlY2VpdmVkOlwiLCBuKSwgZy5PaShuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCB5KHIsIEV2ZW50LlNUQVRfRVZFTlQsICh0ID0+IHtcbiAgICAgICAgICAgIHQuc3RhdCA9PT0gU3RhdC5QUk9YWSA/ICQoXCJDb25uZWN0aW9uXCIsIFwiRGV0ZWN0ZWQgYnVmZmVyaW5nIHByb3h5XCIpIDogdC5zdGF0ID09PSBTdGF0Lk5PUFJPWFkgJiYgJChcIkNvbm5lY3Rpb25cIiwgXCJEZXRlY3RlZCBubyBidWZmZXJpbmcgcHJveHlcIik7XG4gICAgICAgIH0pKSwgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UgY291bGQvc2hvdWxkIHdhaXQgZm9yIHRoZSBXZWJDaGFubmVsIG9wZW5lZCBldmVudCxcbiAgICAgICAgICAgIC8vIGJ1dCBiZWNhdXNlIHdlIHdhbnQgdG8gc2VuZCB0aGUgZmlyc3QgbWVzc2FnZSB3aXRoIHRoZSBXZWJDaGFubmVsXG4gICAgICAgICAgICAvLyBoYW5kc2hha2Ugd2UgcHJldGVuZCB0aGUgY2hhbm5lbCBvcGVuZWQgaGVyZSAoYXN5bmNocm9ub3VzbHkpLCBhbmRcbiAgICAgICAgICAgIC8vIHRoZW4gZGVsYXkgdGhlIGFjdHVhbCBvcGVuIHVudGlsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHNlbnQuXG4gICAgICAgICAgICBnLiRpKCk7XG4gICAgICAgIH0pLCAwKSwgZztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogSW5pdGlhbGl6ZXMgdGhlIFdlYkNoYW5uZWxDb25uZWN0aW9uIGZvciB0aGUgYnJvd3Nlci4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVGhlIFBsYXRmb3JtJ3MgJ3dpbmRvdycgaW1wbGVtZW50YXRpb24gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLiAqL1xuZnVuY3Rpb24gWHIoKSB7XG4gICAgLy8gYHdpbmRvd2AgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIGUuZy4gaW4gUmVhY3ROYXRpdmUgYW5kIFdlYldvcmtlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiBudWxsO1xufVxuXG4vKiogVGhlIFBsYXRmb3JtJ3MgJ2RvY3VtZW50JyBpbXBsZW1lbnRhdGlvbiBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUuICovIGZ1bmN0aW9uIFpyKCkge1xuICAgIC8vIGBkb2N1bWVudGAgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIGUuZy4gaW4gUmVhY3ROYXRpdmUgYW5kIFdlYldvcmtlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBkb2N1bWVudCA/IGRvY3VtZW50IDogbnVsbDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gdG8odCkge1xuICAgIHJldHVybiBuZXcgS24odCwgLyogdXNlUHJvdG8zSnNvbj0gKi8gITApO1xufVxuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBQbGF0Zm9ybSdzICdUZXh0RW5jb2RlcicgaW1wbGVtZW50YXRpb24uXG4gKi9cbi8qKlxuICogQSBoZWxwZXIgZm9yIHJ1bm5pbmcgZGVsYXllZCB0YXNrcyBmb2xsb3dpbmcgYW4gZXhwb25lbnRpYWwgYmFja29mZiBjdXJ2ZVxuICogYmV0d2VlbiBhdHRlbXB0cy5cbiAqXG4gKiBFYWNoIGRlbGF5IGlzIG1hZGUgdXAgb2YgYSBcImJhc2VcIiBkZWxheSB3aGljaCBmb2xsb3dzIHRoZSBleHBvbmVudGlhbFxuICogYmFja29mZiBjdXJ2ZSwgYW5kIGEgKy8tIDUwJSBcImppdHRlclwiIHRoYXQgaXMgY2FsY3VsYXRlZCBhbmQgYWRkZWQgdG8gdGhlXG4gKiBiYXNlIGRlbGF5LiBUaGlzIHByZXZlbnRzIGNsaWVudHMgZnJvbSBhY2NpZGVudGFsbHkgc3luY2hyb25pemluZyB0aGVpclxuICogZGVsYXlzIGNhdXNpbmcgc3Bpa2VzIG9mIGxvYWQgdG8gdGhlIGJhY2tlbmQuXG4gKi9cbmNsYXNzIGVvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgQXN5bmNRdWV1ZSB0byBydW4gYmFja29mZiBvcGVyYXRpb25zIG9uLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBJRCB0byB1c2Ugd2hlbiBzY2hlZHVsaW5nIGJhY2tvZmYgb3BlcmF0aW9ucyBvbiB0aGUgQXN5bmNRdWV1ZS5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkZWxheSAodXNlZCBhcyB0aGUgYmFzZSBkZWxheSBvbiB0aGUgZmlyc3QgcmV0cnkgYXR0ZW1wdCkuXG4gICAgICogTm90ZSB0aGF0IGppdHRlciB3aWxsIHN0aWxsIGJlIGFwcGxpZWQsIHNvIHRoZSBhY3R1YWwgZGVsYXkgY291bGQgYmUgYXNcbiAgICAgKiBsaXR0bGUgYXMgMC41KmluaXRpYWxEZWxheU1zLlxuICAgICAqL1xuICAgIG4gPSAxZTNcbiAgICAvKipcbiAgICAgKiBUaGUgbXVsdGlwbGllciB0byB1c2UgdG8gZGV0ZXJtaW5lIHRoZSBleHRlbmRlZCBiYXNlIGRlbGF5IGFmdGVyIGVhY2hcbiAgICAgKiBhdHRlbXB0LlxuICAgICAqLyAsIHMgPSAxLjVcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBiYXNlIGRlbGF5IGFmdGVyIHdoaWNoIG5vIGZ1cnRoZXIgYmFja29mZiBpcyBwZXJmb3JtZWQuXG4gICAgICogTm90ZSB0aGF0IGppdHRlciB3aWxsIHN0aWxsIGJlIGFwcGxpZWQsIHNvIHRoZSBhY3R1YWwgZGVsYXkgY291bGQgYmUgYXNcbiAgICAgKiBtdWNoIGFzIDEuNSptYXhEZWxheU1zLlxuICAgICAqLyAsIGkgPSA2ZTQpIHtcbiAgICAgICAgdGhpcy5PZSA9IHQsIHRoaXMudGltZXJJZCA9IGUsIHRoaXMuV2kgPSBuLCB0aGlzLkdpID0gcywgdGhpcy56aSA9IGksIHRoaXMuSGkgPSAwLCBcbiAgICAgICAgdGhpcy5KaSA9IG51bGwsIFxuICAgICAgICAvKiogVGhlIGxhc3QgYmFja29mZiBhdHRlbXB0LCBhcyBlcG9jaCBtaWxsaXNlY29uZHMuICovXG4gICAgICAgIHRoaXMuWWkgPSBEYXRlLm5vdygpLCB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYmFja29mZiBkZWxheS5cbiAgICAgKlxuICAgICAqIFRoZSB2ZXJ5IG5leHQgYmFja29mZkFuZFdhaXQoKSB3aWxsIGhhdmUgbm8gZGVsYXkuIElmIGl0IGlzIGNhbGxlZCBhZ2FpblxuICAgICAqIChpLmUuIGR1ZSB0byBhbiBlcnJvciksIGluaXRpYWxEZWxheU1zIChwbHVzIGppdHRlcikgd2lsbCBiZSB1c2VkLCBhbmRcbiAgICAgKiBzdWJzZXF1ZW50IG9uZXMgd2lsbCBpbmNyZWFzZSBhY2NvcmRpbmcgdG8gdGhlIGJhY2tvZmZGYWN0b3IuXG4gICAgICovICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLkhpID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBiYWNrb2ZmIGRlbGF5IHRvIHRoZSBtYXhpbXVtIGRlbGF5IChlLmcuIGZvciB1c2UgYWZ0ZXIgYVxuICAgICAqIFJFU09VUkNFX0VYSEFVU1RFRCBlcnJvcikuXG4gICAgICovICAgIFhpKCkge1xuICAgICAgICB0aGlzLkhpID0gdGhpcy56aTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjdXJyZW50RGVsYXlNcywgYW5kIGluY3JlYXNlcyB0aGVcbiAgICAgKiBkZWxheSBmb3IgYW55IHN1YnNlcXVlbnQgYXR0ZW1wdHMuIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgYmFja29mZiBvcGVyYXRpb25cbiAgICAgKiBhbHJlYWR5LCBpdCB3aWxsIGJlIGNhbmNlbGVkLlxuICAgICAqLyAgICBaaSh0KSB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgcGVuZGluZyBiYWNrb2ZmIG9wZXJhdGlvbi5cbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgLy8gRmlyc3Qgc2NoZWR1bGUgdXNpbmcgdGhlIGN1cnJlbnQgYmFzZSAod2hpY2ggbWF5IGJlIDAgYW5kIHNob3VsZCBiZVxuICAgICAgICAvLyBob25vcmVkIGFzIHN1Y2gpLlxuICAgICAgICBjb25zdCBlID0gTWF0aC5mbG9vcih0aGlzLkhpICsgdGhpcy50cigpKSwgbiA9IE1hdGgubWF4KDAsIERhdGUubm93KCkgLSB0aGlzLllpKSwgcyA9IE1hdGgubWF4KDAsIGUgLSBuKTtcbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBsYXN0QXR0ZW1wdFRpbWUgYmVpbmcgaW4gdGhlIGZ1dHVyZSBkdWUgdG8gYSBjbG9jayBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgcyA+IDAgJiYgJChcIkV4cG9uZW50aWFsQmFja29mZlwiLCBgQmFja2luZyBvZmYgZm9yICR7c30gbXMgKGJhc2UgZGVsYXk6ICR7dGhpcy5IaX0gbXMsIGRlbGF5IHdpdGggaml0dGVyOiAke2V9IG1zLCBsYXN0IGF0dGVtcHQ6ICR7bn0gbXMgYWdvKWApLCBcbiAgICAgICAgdGhpcy5KaSA9IHRoaXMuT2UuZW5xdWV1ZUFmdGVyRGVsYXkodGhpcy50aW1lcklkLCBzLCAoKCkgPT4gKHRoaXMuWWkgPSBEYXRlLm5vdygpLCBcbiAgICAgICAgdCgpKSkpLCBcbiAgICAgICAgLy8gQXBwbHkgYmFja29mZiBmYWN0b3IgdG8gZGV0ZXJtaW5lIG5leHQgZGVsYXkgYW5kIGVuc3VyZSBpdCBpcyB3aXRoaW5cbiAgICAgICAgLy8gYm91bmRzLlxuICAgICAgICB0aGlzLkhpICo9IHRoaXMuR2ksIHRoaXMuSGkgPCB0aGlzLldpICYmICh0aGlzLkhpID0gdGhpcy5XaSksIHRoaXMuSGkgPiB0aGlzLnppICYmICh0aGlzLkhpID0gdGhpcy56aSk7XG4gICAgfVxuICAgIGVyKCkge1xuICAgICAgICBudWxsICE9PSB0aGlzLkppICYmICh0aGlzLkppLnNraXBEZWxheSgpLCB0aGlzLkppID0gbnVsbCk7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy5KaSAmJiAodGhpcy5KaS5jYW5jZWwoKSwgdGhpcy5KaSA9IG51bGwpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIHJhbmRvbSB2YWx1ZSBpbiB0aGUgcmFuZ2UgWy1jdXJyZW50QmFzZU1zLzIsIGN1cnJlbnRCYXNlTXMvMl0gKi8gICAgdHIoKSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5yYW5kb20oKSAtIC41KSAqIHRoaXMuSGk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIFBlcnNpc3RlbnRTdHJlYW0gaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzdHJlYW1pbmcgUlBDXG4gKiB0byB0aGUgRmlyZXN0b3JlIGJhY2tlbmQuIEl0J3MgYnVpbHQgb24gdG9wIG9mIHRoZSBjb25uZWN0aW9ucyBvd24gc3VwcG9ydFxuICogZm9yIHN0cmVhbWluZyBSUENzLCBhbmQgYWRkcyBzZXZlcmFsIGNyaXRpY2FsIGZlYXR1cmVzIGZvciBvdXIgY2xpZW50czpcbiAqXG4gKiAgIC0gRXhwb25lbnRpYWwgYmFja29mZiBvbiBmYWlsdXJlXG4gKiAgIC0gQXV0aGVudGljYXRpb24gdmlhIENyZWRlbnRpYWxzUHJvdmlkZXJcbiAqICAgLSBEaXNwYXRjaGluZyBhbGwgY2FsbGJhY2tzIGludG8gdGhlIHNoYXJlZCB3b3JrZXIgcXVldWVcbiAqICAgLSBDbG9zaW5nIGlkbGUgc3RyZWFtcyBhZnRlciA2MCBzZWNvbmRzIG9mIGluYWN0aXZpdHlcbiAqXG4gKiBTdWJjbGFzc2VzIG9mIFBlcnNpc3RlbnRTdHJlYW0gaW1wbGVtZW50IHNlcmlhbGl6YXRpb24gb2YgbW9kZWxzIHRvIGFuZFxuICogZnJvbSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2wgYnVmZmVycyBmb3IgYSBzcGVjaWZpY1xuICogc3RyZWFtaW5nIFJQQy5cbiAqXG4gKiAjIyBTdGFydGluZyBhbmQgU3RvcHBpbmdcbiAqXG4gKiBTdHJlYW1pbmcgUlBDcyBhcmUgc3RhdGVmdWwgYW5kIG5lZWQgdG8gYmUgc3RhcnQoKWVkIGJlZm9yZSBtZXNzYWdlcyBjYW5cbiAqIGJlIHNlbnQgYW5kIHJlY2VpdmVkLiBUaGUgUGVyc2lzdGVudFN0cmVhbSB3aWxsIGNhbGwgdGhlIG9uT3BlbigpIGZ1bmN0aW9uXG4gKiBvZiB0aGUgbGlzdGVuZXIgb25jZSB0aGUgc3RyZWFtIGlzIHJlYWR5IHRvIGFjY2VwdCByZXF1ZXN0cy5cbiAqXG4gKiBTaG91bGQgYSBzdGFydCgpIGZhaWwsIFBlcnNpc3RlbnRTdHJlYW0gd2lsbCBjYWxsIHRoZSByZWdpc3RlcmVkIG9uQ2xvc2UoKVxuICogbGlzdGVuZXIgd2l0aCBhIEZpcmVzdG9yZUVycm9yIGluZGljYXRpbmcgd2hhdCB3ZW50IHdyb25nLlxuICpcbiAqIEEgUGVyc2lzdGVudFN0cmVhbSBjYW4gYmUgc3RhcnRlZCBhbmQgc3RvcHBlZCByZXBlYXRlZGx5LlxuICpcbiAqIEdlbmVyaWMgdHlwZXM6XG4gKiAgU2VuZFR5cGU6IFRoZSB0eXBlIG9mIHRoZSBvdXRnb2luZyBtZXNzYWdlIG9mIHRoZSB1bmRlcmx5aW5nXG4gKiAgICBjb25uZWN0aW9uIHN0cmVhbVxuICogIFJlY2VpdmVUeXBlOiBUaGUgdHlwZSBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZ1xuICogICAgY29ubmVjdGlvbiBzdHJlYW1cbiAqICBMaXN0ZW5lclR5cGU6IFRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY2FsbGJhY2tzXG4gKi9cbmNsYXNzIG5vIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCBhKSB7XG4gICAgICAgIHRoaXMuT2UgPSB0LCB0aGlzLm5yID0gbiwgdGhpcy5zciA9IHMsIHRoaXMuaXIgPSBpLCB0aGlzLmF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyID0gciwgXG4gICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFsc1Byb3ZpZGVyID0gbywgdGhpcy5saXN0ZW5lciA9IGEsIHRoaXMuc3RhdGUgPSAwIC8qIEluaXRpYWwgKi8gLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgY2xvc2UgY291bnQgdGhhdCdzIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgdGhlIHN0cmVhbSBpcyBjbG9zZWQ7IHVzZWQgYnlcbiAgICAgICAgICogZ2V0Q2xvc2VHdWFyZGVkRGlzcGF0Y2hlcigpIHRvIGludmFsaWRhdGUgY2FsbGJhY2tzIHRoYXQgaGFwcGVuIGFmdGVyXG4gICAgICAgICAqIGNsb3NlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yciA9IDAsIHRoaXMuYXIgPSBudWxsLCB0aGlzLmNyID0gbnVsbCwgdGhpcy5zdHJlYW0gPSBudWxsLCB0aGlzLnVyID0gbmV3IGVvKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgc3RhcnQoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIG5vIGVycm9yIGhhcyBvY2N1cnJlZC4gVHJ1ZVxuICAgICAqIGluZGljYXRlcyB0aGUgc3RyZWFtIGlzIG9wZW4gb3IgaW4gdGhlIHByb2Nlc3Mgb2Ygb3BlbmluZyAod2hpY2hcbiAgICAgKiBlbmNvbXBhc3NlcyByZXNwZWN0aW5nIGJhY2tvZmYsIGdldHRpbmcgYXV0aCB0b2tlbnMsIGFuZCBzdGFydGluZyB0aGVcbiAgICAgKiBhY3R1YWwgUlBDKS4gVXNlIGlzT3BlbigpIHRvIGRldGVybWluZSBpZiB0aGUgc3RyZWFtIGlzIG9wZW4gYW5kIHJlYWR5IGZvclxuICAgICAqIG91dGJvdW5kIHJlcXVlc3RzLlxuICAgICAqLyAgICBocigpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogU3RhcnRpbmcgKi8gPT09IHRoaXMuc3RhdGUgfHwgNSAvKiBCYWNrb2ZmICovID09PSB0aGlzLnN0YXRlIHx8IHRoaXMubHIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIFJQQyBpcyBvcGVuICh0aGUgb25PcGVuKCkgbGlzdGVuZXIgaGFzIGJlZW5cbiAgICAgKiBjYWxsZWQpIGFuZCB0aGUgc3RyZWFtIGlzIHJlYWR5IGZvciBvdXRib3VuZCByZXF1ZXN0cy5cbiAgICAgKi8gICAgbHIoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIE9wZW4gKi8gPT09IHRoaXMuc3RhdGUgfHwgMyAvKiBIZWFsdGh5ICovID09PSB0aGlzLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIFJQQy4gT25seSBhbGxvd2VkIGlmIGlzU3RhcnRlZCgpIHJldHVybnMgZmFsc2UuIFRoZSBzdHJlYW0gaXNcbiAgICAgKiBub3QgaW1tZWRpYXRlbHkgcmVhZHkgZm9yIHVzZTogb25PcGVuKCkgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIFJQQyBpc1xuICAgICAqIHJlYWR5IGZvciBvdXRib3VuZCByZXF1ZXN0cywgYXQgd2hpY2ggcG9pbnQgaXNPcGVuKCkgd2lsbCByZXR1cm4gdHJ1ZS5cbiAgICAgKlxuICAgICAqIFdoZW4gc3RhcnQgcmV0dXJucywgaXNTdGFydGVkKCkgd2lsbCByZXR1cm4gdHJ1ZS5cbiAgICAgKi8gICAgc3RhcnQoKSB7XG4gICAgICAgIDQgLyogRXJyb3IgKi8gIT09IHRoaXMuc3RhdGUgPyB0aGlzLmF1dGgoKSA6IHRoaXMuZHIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIFJQQy4gVGhpcyBjYWxsIGlzIGlkZW1wb3RlbnQgYW5kIGFsbG93ZWQgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgKiBjdXJyZW50IGlzU3RhcnRlZCgpIHN0YXRlLlxuICAgICAqXG4gICAgICogV2hlbiBzdG9wIHJldHVybnMsIGlzU3RhcnRlZCgpIGFuZCBpc09wZW4oKSB3aWxsIGJvdGggcmV0dXJuIGZhbHNlLlxuICAgICAqLyAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICB0aGlzLmhyKCkgJiYgYXdhaXQgdGhpcy5jbG9zZSgwIC8qIEluaXRpYWwgKi8pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZnRlciBhbiBlcnJvciB0aGUgc3RyZWFtIHdpbGwgdXN1YWxseSBiYWNrIG9mZiBvbiB0aGUgbmV4dCBhdHRlbXB0IHRvXG4gICAgICogc3RhcnQgaXQuIElmIHRoZSBlcnJvciB3YXJyYW50cyBhbiBpbW1lZGlhdGUgcmVzdGFydCBvZiB0aGUgc3RyZWFtLCB0aGVcbiAgICAgKiBzZW5kZXIgY2FuIHVzZSB0aGlzIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlY2VpdmVyIHNob3VsZCBub3QgYmFjayBvZmYuXG4gICAgICpcbiAgICAgKiBFYWNoIGVycm9yIHdpbGwgY2FsbCB0aGUgb25DbG9zZSgpIGxpc3RlbmVyLiBUaGF0IGZ1bmN0aW9uIGNhbiBkZWNpZGUgdG9cbiAgICAgKiBpbmhpYml0IGJhY2tvZmYgaWYgcmVxdWlyZWQuXG4gICAgICovICAgIHdyKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gMCAvKiBJbml0aWFsICovICwgdGhpcy51ci5yZXNldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGlzIHN0cmVhbSBhcyBpZGxlLiBJZiBubyBmdXJ0aGVyIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGVcbiAgICAgKiBzdHJlYW0gZm9yIG9uZSBtaW51dGUsIHRoZSBzdHJlYW0gd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIGl0c2VsZiBhbmRcbiAgICAgKiBub3RpZnkgdGhlIHN0cmVhbSdzIG9uQ2xvc2UoKSBoYW5kbGVyIHdpdGggU3RhdHVzLk9LLiBUaGUgc3RyZWFtIHdpbGwgdGhlblxuICAgICAqIGJlIGluIGEgIWlzU3RhcnRlZCgpIHN0YXRlLCByZXF1aXJpbmcgdGhlIGNhbGxlciB0byBzdGFydCB0aGUgc3RyZWFtIGFnYWluXG4gICAgICogYmVmb3JlIGZ1cnRoZXIgdXNlLlxuICAgICAqXG4gICAgICogT25seSBzdHJlYW1zIHRoYXQgYXJlIGluIHN0YXRlICdPcGVuJyBjYW4gYmUgbWFya2VkIGlkbGUsIGFzIGFsbCBvdGhlclxuICAgICAqIHN0YXRlcyBpbXBseSBwZW5kaW5nIG5ldHdvcmsgb3BlcmF0aW9ucy5cbiAgICAgKi8gICAgX3IoKSB7XG4gICAgICAgIC8vIFN0YXJ0cyB0aGUgaWRsZSB0aW1lIGlmIHdlIGFyZSBpbiBzdGF0ZSAnT3BlbicgYW5kIGFyZSBub3QgeWV0IGFscmVhZHlcbiAgICAgICAgLy8gcnVubmluZyBhIHRpbWVyIChpbiB3aGljaCBjYXNlIHRoZSBwcmV2aW91cyBpZGxlIHRpbWVvdXQgc3RpbGwgYXBwbGllcykuXG4gICAgICAgIHRoaXMubHIoKSAmJiBudWxsID09PSB0aGlzLmFyICYmICh0aGlzLmFyID0gdGhpcy5PZS5lbnF1ZXVlQWZ0ZXJEZWxheSh0aGlzLm5yLCA2ZTQsICgoKSA9PiB0aGlzLm1yKCkpKSk7XG4gICAgfVxuICAgIC8qKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAqLyAgICBncih0KSB7XG4gICAgICAgIHRoaXMueXIoKSwgdGhpcy5zdHJlYW0uc2VuZCh0KTtcbiAgICB9XG4gICAgLyoqIENhbGxlZCBieSB0aGUgaWRsZSB0aW1lciB3aGVuIHRoZSBzdHJlYW0gc2hvdWxkIGNsb3NlIGR1ZSB0byBpbmFjdGl2aXR5LiAqLyAgICBhc3luYyBtcigpIHtcbiAgICAgICAgaWYgKHRoaXMubHIoKSkgXG4gICAgICAgIC8vIFdoZW4gdGltaW5nIG91dCBhbiBpZGxlIHN0cmVhbSB0aGVyZSdzIG5vIHJlYXNvbiB0byBmb3JjZSB0aGUgc3RyZWFtIGludG8gYmFja29mZiB3aGVuXG4gICAgICAgIC8vIGl0IHJlc3RhcnRzIHNvIHNldCB0aGUgc3RyZWFtIHN0YXRlIHRvIEluaXRpYWwgaW5zdGVhZCBvZiBFcnJvci5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoMCAvKiBJbml0aWFsICovKTtcbiAgICB9XG4gICAgLyoqIE1hcmtzIHRoZSBzdHJlYW0gYXMgYWN0aXZlIGFnYWluLiAqLyAgICB5cigpIHtcbiAgICAgICAgdGhpcy5hciAmJiAodGhpcy5hci5jYW5jZWwoKSwgdGhpcy5hciA9IG51bGwpO1xuICAgIH1cbiAgICAvKiogQ2FuY2VscyB0aGUgaGVhbHRoIGNoZWNrIGRlbGF5ZWQgb3BlcmF0aW9uLiAqLyAgICBwcigpIHtcbiAgICAgICAgdGhpcy5jciAmJiAodGhpcy5jci5jYW5jZWwoKSwgdGhpcy5jciA9IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBhbmQgY2xlYW5zIHVwIGFzIG5lY2Vzc2FyeTpcbiAgICAgKlxuICAgICAqICogY2xvc2VzIHRoZSB1bmRlcmx5aW5nIEdSUEMgc3RyZWFtO1xuICAgICAqICogY2FsbHMgdGhlIG9uQ2xvc2UgaGFuZGxlciB3aXRoIHRoZSBnaXZlbiAnZXJyb3InO1xuICAgICAqICogc2V0cyBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgdG8gJ2ZpbmFsU3RhdGUnO1xuICAgICAqICogYWRqdXN0cyB0aGUgYmFja29mZiB0aW1lciBiYXNlZCBvbiB0aGUgZXJyb3JcbiAgICAgKlxuICAgICAqIEEgbmV3IHN0cmVhbSBjYW4gYmUgb3BlbmVkIGJ5IGNhbGxpbmcgc3RhcnQoKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaW5hbFN0YXRlIC0gdGhlIGludGVuZGVkIHN0YXRlIG9mIHRoZSBzdHJlYW0gYWZ0ZXIgY2xvc2luZy5cbiAgICAgKiBAcGFyYW0gZXJyb3IgLSB0aGUgZXJyb3IgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCB3aXRoLlxuICAgICAqLyAgICBhc3luYyBjbG9zZSh0LCBlKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbnkgb3V0c3RhbmRpbmcgdGltZXJzICh0aGV5J3JlIGd1YXJhbnRlZWQgbm90IHRvIGV4ZWN1dGUpLlxuICAgICAgICB0aGlzLnlyKCksIHRoaXMucHIoKSwgdGhpcy51ci5jYW5jZWwoKSwgXG4gICAgICAgIC8vIEludmFsaWRhdGVzIGFueSBzdHJlYW0tcmVsYXRlZCBjYWxsYmFja3MgKGUuZy4gZnJvbSBhdXRoIG9yIHRoZVxuICAgICAgICAvLyB1bmRlcmx5aW5nIHN0cmVhbSksIGd1YXJhbnRlZWluZyB0aGV5IHdvbid0IGV4ZWN1dGUuXG4gICAgICAgIHRoaXMucnIrKywgNCAvKiBFcnJvciAqLyAhPT0gdCA/IFxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGludGVudGlvbmFsIGNsb3NlIGVuc3VyZSB3ZSBkb24ndCBkZWxheSBvdXIgbmV4dCBjb25uZWN0aW9uIGF0dGVtcHQuXG4gICAgICAgIHRoaXMudXIucmVzZXQoKSA6IGUgJiYgZS5jb2RlID09PSBLLlJFU09VUkNFX0VYSEFVU1RFRCA/IChcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvci4gKFByb2JhYmx5IGVpdGhlciAncXVvdGEgZXhjZWVkZWQnIG9yICdtYXggcXVldWUgbGVuZ3RoIHJlYWNoZWQnLilcbiAgICAgICAgRihlLnRvU3RyaW5nKCkpLCBGKFwiVXNpbmcgbWF4aW11bSBiYWNrb2ZmIGRlbGF5IHRvIHByZXZlbnQgb3ZlcmxvYWRpbmcgdGhlIGJhY2tlbmQuXCIpLCBcbiAgICAgICAgdGhpcy51ci5YaSgpKSA6IGUgJiYgZS5jb2RlID09PSBLLlVOQVVUSEVOVElDQVRFRCAmJiAzIC8qIEhlYWx0aHkgKi8gIT09IHRoaXMuc3RhdGUgJiYgKFxuICAgICAgICAvLyBcInVuYXV0aGVudGljYXRlZFwiIGVycm9yIG1lYW5zIHRoZSB0b2tlbiB3YXMgcmVqZWN0ZWQuIFRoaXMgc2hvdWxkIHJhcmVseVxuICAgICAgICAvLyBoYXBwZW4gc2luY2UgYm90aCBBdXRoIGFuZCBBcHBDaGVjayBlbnN1cmUgYSBzdWZmaWNpZW50IFRUTCB3aGVuIHdlXG4gICAgICAgIC8vIHJlcXVlc3QgYSB0b2tlbi4gSWYgYSB1c2VyIG1hbnVhbGx5IHJlc2V0cyB0aGVpciBzeXN0ZW0gY2xvY2sgdGhpcyBjYW5cbiAgICAgICAgLy8gZmFpbCwgaG93ZXZlci4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgZ2V0IGEgQ29kZS5VTkFVVEhFTlRJQ0FURUQgZXJyb3JcbiAgICAgICAgLy8gYmVmb3JlIHdlIHJlY2VpdmVkIHRoZSBmaXJzdCBtZXNzYWdlIGFuZCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlIHRva2VuXG4gICAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IHdlIGZldGNoIGEgbmV3IHRva2VuLlxuICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyLmludmFsaWRhdGVUb2tlbigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlci5pbnZhbGlkYXRlVG9rZW4oKSksIFxuICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdW5kZXJseWluZyBzdHJlYW0gYmVjYXVzZSB3ZSBhcmUgbm8gbG9uZ2VyIGludGVyZXN0ZWQgaW4gZXZlbnRzLlxuICAgICAgICBudWxsICE9PSB0aGlzLnN0cmVhbSAmJiAodGhpcy5UcigpLCB0aGlzLnN0cmVhbS5jbG9zZSgpLCB0aGlzLnN0cmVhbSA9IG51bGwpLCBcbiAgICAgICAgLy8gVGhpcyBzdGF0ZSBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBjYWxsaW5nIG9uQ2xvc2UoKSB0byBhbGxvdyB0aGUgY2FsbGJhY2sgdG9cbiAgICAgICAgLy8gaW5oaWJpdCBiYWNrb2ZmIG9yIG90aGVyd2lzZSBtYW5pcHVsYXRlIHRoZSBzdGF0ZSBpbiBpdHMgbm9uLXN0YXJ0ZWQgc3RhdGUuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0LCBcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBzdHJlYW0gY2xvc2VkLlxuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmVyLk5pKGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiB0byBwZXJmb3JtIGFkZGl0aW9uYWwgY2xlYW51cCBiZWZvcmUgdGhlIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICogQ2FsbGluZyBzdXBlci50ZWFyRG93bigpIGlzIG5vdCByZXF1aXJlZC5cbiAgICAgKi8gICAgVHIoKSB7fVxuICAgIGF1dGgoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFN0YXJ0aW5nICovO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5Fcih0aGlzLnJyKSwgZSA9IHRoaXMucnI7XG4gICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogSnVzdCB1c2UgZGlzcGF0Y2hJZk5vdENsb3NlZCwgYnV0IHNlZSBUT0RPIGJlbG93LlxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFsgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlci5nZXRUb2tlbigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlci5nZXRUb2tlbigpIF0pLnRoZW4oKChbdCwgbl0pID0+IHtcbiAgICAgICAgICAgIC8vIFN0cmVhbSBjYW4gYmUgc3RvcHBlZCB3aGlsZSB3YWl0aW5nIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogV2UgcmVhbGx5IHNob3VsZCBqdXN0IHVzZSBkaXNwYXRjaElmTm90Q2xvc2VkXG4gICAgICAgICAgICAvLyBhbmQgbGV0IHRoaXMgZGlzcGF0Y2ggb250byB0aGUgcXVldWUsIGJ1dCB0aGF0IG9wZW5lZCBhIHNwZWMgdGVzdCBjYW5cbiAgICAgICAgICAgIC8vIG9mIHdvcm1zIHRoYXQgSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBpbiB0aGlzIFBSLlxuICAgICAgICAgICAgdGhpcy5yciA9PT0gZSAmJiBcbiAgICAgICAgICAgIC8vIE5vcm1hbGx5IHdlJ2QgaGF2ZSB0byBzY2hlZHVsZSB0aGUgY2FsbGJhY2sgb24gdGhlIEFzeW5jUXVldWUuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgZm9sbG93aW5nIGNhbGxzIGFyZSBzYWZlIHRvIGJlIGNhbGxlZCBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgLy8gQXN5bmNRdWV1ZSBzaW5jZSB0aGV5IGRvbid0IGNoYWluIGFzeW5jaHJvbm91cyBjYWxsc1xuICAgICAgICAgICAgdGhpcy5Jcih0LCBuKTtcbiAgICAgICAgfSksIChlID0+IHtcbiAgICAgICAgICAgIHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IGooSy5VTktOT1dOLCBcIkZldGNoaW5nIGF1dGggdG9rZW4gZmFpbGVkOiBcIiArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXIodCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgSXIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5Fcih0aGlzLnJyKTtcbiAgICAgICAgdGhpcy5zdHJlYW0gPSB0aGlzLlJyKHQsIGUpLCB0aGlzLnN0cmVhbS5EaSgoKCkgPT4ge1xuICAgICAgICAgICAgbigoKCkgPT4gKHRoaXMuc3RhdGUgPSAyIC8qIE9wZW4gKi8gLCB0aGlzLmNyID0gdGhpcy5PZS5lbnF1ZXVlQWZ0ZXJEZWxheSh0aGlzLnNyLCAxZTQsICgoKSA9PiAodGhpcy5scigpICYmICh0aGlzLnN0YXRlID0gMyAvKiBIZWFsdGh5ICovKSwgXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKSkpKSwgdGhpcy5saXN0ZW5lci5EaSgpKSkpO1xuICAgICAgICB9KSksIHRoaXMuc3RyZWFtLk5pKCh0ID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+IHRoaXMuQXIodCkpKTtcbiAgICAgICAgfSkpLCB0aGlzLnN0cmVhbS5vbk1lc3NhZ2UoKHQgPT4ge1xuICAgICAgICAgICAgbigoKCkgPT4gdGhpcy5vbk1lc3NhZ2UodCkpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDUgLyogQmFja29mZiAqLyAsIHRoaXMudXIuWmkoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAwIC8qIEluaXRpYWwgKi8gLCB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdHNcbiAgICBBcih0KSB7XG4gICAgICAgIC8vIEluIHRoZW9yeSB0aGUgc3RyZWFtIGNvdWxkIGNsb3NlIGNsZWFubHksIGhvd2V2ZXIsIGluIG91ciBjdXJyZW50IG1vZGVsXG4gICAgICAgIC8vIHdlIG5ldmVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWNhdXNlIGlmIHdlIHN0b3AgYSBzdHJlYW0gb3Vyc2VsdmVzLFxuICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiBUbyBwcmV2ZW50IGNhc2VzIHdoZXJlIHdlIHJldHJ5XG4gICAgICAgIC8vIHdpdGhvdXQgYSBiYWNrb2ZmIGFjY2lkZW50YWxseSwgd2Ugc2V0IHRoZSBzdHJlYW0gdG8gZXJyb3IgaW4gYWxsIGNhc2VzLlxuICAgICAgICByZXR1cm4gJChcIlBlcnNpc3RlbnRTdHJlYW1cIiwgYGNsb3NlIHdpdGggZXJyb3I6ICR7dH1gKSwgdGhpcy5zdHJlYW0gPSBudWxsLCB0aGlzLmNsb3NlKDQgLyogRXJyb3IgKi8gLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFwiZGlzcGF0Y2hlclwiIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvcGVyYXRpb25zIG9udG8gdGhlXG4gICAgICogQXN5bmNRdWV1ZSBidXQgb25seSBydW5zIHRoZW0gaWYgY2xvc2VDb3VudCByZW1haW5zIHVuY2hhbmdlZC4gVGhpcyBhbGxvd3NcbiAgICAgKiB1cyB0byB0dXJuIGF1dGggLyBzdHJlYW0gY2FsbGJhY2tzIGludG8gbm8tb3BzIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkIC9cbiAgICAgKiByZS1vcGVuZWQsIGV0Yy5cbiAgICAgKi8gICAgRXIodCkge1xuICAgICAgICByZXR1cm4gZSA9PiB7XG4gICAgICAgICAgICB0aGlzLk9lLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHRoaXMucnIgPT09IHQgPyBlKCkgOiAoJChcIlBlcnNpc3RlbnRTdHJlYW1cIiwgXCJzdHJlYW0gY2FsbGJhY2sgc2tpcHBlZCBieSBnZXRDbG9zZUd1YXJkZWREaXNwYXRjaGVyLlwiKSwgXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKSkpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBQZXJzaXN0ZW50U3RyZWFtIHRoYXQgaW1wbGVtZW50cyB0aGUgTGlzdGVuIFJQQy5cbiAqXG4gKiBPbmNlIHRoZSBMaXN0ZW4gc3RyZWFtIGhhcyBjYWxsZWQgdGhlIG9uT3BlbigpIGxpc3RlbmVyLCBhbnkgbnVtYmVyIG9mXG4gKiBsaXN0ZW4oKSBhbmQgdW5saXN0ZW4oKSBjYWxscyBjYW4gYmUgbWFkZSB0byBjb250cm9sIHdoYXQgY2hhbmdlcyB3aWxsIGJlXG4gKiBzZW50IGZyb20gdGhlIHNlcnZlciBmb3IgTGlzdGVuUmVzcG9uc2VzLlxuICovIGNsYXNzIHNvIGV4dGVuZHMgbm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgc3VwZXIodCwgXCJsaXN0ZW5fc3RyZWFtX2Nvbm5lY3Rpb25fYmFja29mZlwiIC8qIExpc3RlblN0cmVhbUNvbm5lY3Rpb25CYWNrb2ZmICovICwgXCJsaXN0ZW5fc3RyZWFtX2lkbGVcIiAvKiBMaXN0ZW5TdHJlYW1JZGxlICovICwgXCJoZWFsdGhfY2hlY2tfdGltZW91dFwiIC8qIEhlYWx0aENoZWNrVGltZW91dCAqLyAsIGUsIG4sIHMsIHIpLCBcbiAgICAgICAgdGhpcy5rID0gaTtcbiAgICB9XG4gICAgUnIodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pci5RaShcIkxpc3RlblwiLCB0LCBlKTtcbiAgICB9XG4gICAgb25NZXNzYWdlKHQpIHtcbiAgICAgICAgLy8gQSBzdWNjZXNzZnVsIHJlc3BvbnNlIG1lYW5zIHRoZSBzdHJlYW0gaXMgaGVhbHRoeVxuICAgICAgICB0aGlzLnVyLnJlc2V0KCk7XG4gICAgICAgIGNvbnN0IGUgPSBycyh0aGlzLmssIHQpLCBuID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBvbmx5IHJlYWNoZWQgYSBjb25zaXN0ZW50IHNuYXBzaG90IGZvciB0aGUgZW50aXJlIHN0cmVhbSBpZiB0aGVyZVxuICAgICAgICAgICAgLy8gaXMgYSByZWFkX3RpbWUgc2V0IGFuZCBpdCBhcHBsaWVzIHRvIGFsbCB0YXJnZXRzIChpLmUuIHRoZSBsaXN0IG9mXG4gICAgICAgICAgICAvLyB0YXJnZXRzIGlzIGVtcHR5KS4gVGhlIGJhY2tlbmQgaXMgZ3VhcmFudGVlZCB0byBzZW5kIHN1Y2ggcmVzcG9uc2VzLlxuICAgICAgICAgICAgaWYgKCEoXCJ0YXJnZXRDaGFuZ2VcIiBpbiB0KSkgcmV0dXJuIGN0Lm1pbigpO1xuICAgICAgICAgICAgY29uc3QgZSA9IHQudGFyZ2V0Q2hhbmdlO1xuICAgICAgICAgICAgcmV0dXJuIGUudGFyZ2V0SWRzICYmIGUudGFyZ2V0SWRzLmxlbmd0aCA/IGN0Lm1pbigpIDogZS5yZWFkVGltZSA/IEduKGUucmVhZFRpbWUpIDogY3QubWluKCk7XG4gICAgICAgIH0odCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLlByKGUsIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgaW50ZXJlc3QgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHRhcmdldC4gSWYgdGhlIHRhcmdldFxuICAgICAqIGluY2x1ZGVzIGEgcmVzdW1lVG9rZW4gaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdC4gUmVzdWx0cyB0aGF0XG4gICAgICogYWZmZWN0IHRoZSB0YXJnZXQgd2lsbCBiZSBzdHJlYW1lZCBiYWNrIGFzIFdhdGNoQ2hhbmdlIG1lc3NhZ2VzIHRoYXRcbiAgICAgKiByZWZlcmVuY2UgdGhlIHRhcmdldElkLlxuICAgICAqLyAgICBicih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgICAgZS5kYXRhYmFzZSA9IHRzKHRoaXMuayksIGUuYWRkVGFyZ2V0ID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgbGV0IG47XG4gICAgICAgICAgICBjb25zdCBzID0gZS50YXJnZXQ7XG4gICAgICAgICAgICByZXR1cm4gbiA9IFh0KHMpID8ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogdXModCwgcylcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGhzKHQsIHMpXG4gICAgICAgICAgICB9LCBuLnRhcmdldElkID0gZS50YXJnZXRJZCwgZS5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwID8gbi5yZXN1bWVUb2tlbiA9IFFuKHQsIGUucmVzdW1lVG9rZW4pIDogZS5zbmFwc2hvdFZlcnNpb24uY29tcGFyZVRvKGN0Lm1pbigpKSA+IDAgJiYgKFxuICAgICAgICAgICAgLy8gVE9ETyh3dWFuZHkpOiBDb25zaWRlciByZW1vdmluZyBhYm92ZSBjaGVjayBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IHRydWUuXG4gICAgICAgICAgICAvLyBSaWdodCBub3csIG1hbnkgdGVzdHMgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3VyIHRob3VnaCAobGVhdmluZyBtaW4oKSBvdXRcbiAgICAgICAgICAgIC8vIG9mIHNlcmlhbGl6YXRpb24pLlxuICAgICAgICAgICAgbi5yZWFkVGltZSA9IGpuKHQsIGUuc25hcHNob3RWZXJzaW9uLnRvVGltZXN0YW1wKCkpKSwgbjtcbiAgICAgICAgfSh0aGlzLmssIHQpO1xuICAgICAgICBjb25zdCBuID0gZnModGhpcy5rLCB0KTtcbiAgICAgICAgbiAmJiAoZS5sYWJlbHMgPSBuKSwgdGhpcy5ncihlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgaW50ZXJlc3QgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRhcmdldCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgICogZ2l2ZW4gdGFyZ2V0SWQuXG4gICAgICovICAgIHZyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHt9O1xuICAgICAgICBlLmRhdGFiYXNlID0gdHModGhpcy5rKSwgZS5yZW1vdmVUYXJnZXQgPSB0LCB0aGlzLmdyKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIFN0cmVhbSB0aGF0IGltcGxlbWVudHMgdGhlIFdyaXRlIFJQQy5cbiAqXG4gKiBUaGUgV3JpdGUgUlBDIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gbWFpbnRhaW4gc3BlY2lhbCBzdHJlYW1Ub2tlblxuICogc3RhdGUgaW4gYmV0d2VlbiBjYWxscywgdG8gaGVscCB0aGUgc2VydmVyIHVuZGVyc3RhbmQgd2hpY2ggcmVzcG9uc2VzIHRoZVxuICogY2xpZW50IGhhcyBwcm9jZXNzZWQgYnkgdGhlIHRpbWUgdGhlIG5leHQgcmVxdWVzdCBpcyBtYWRlLiBFdmVyeSByZXNwb25zZVxuICogd2lsbCBjb250YWluIGEgc3RyZWFtVG9rZW47IHRoaXMgdmFsdWUgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIG5leHRcbiAqIHJlcXVlc3QuXG4gKlxuICogQWZ0ZXIgY2FsbGluZyBzdGFydCgpIG9uIHRoaXMgc3RyZWFtLCB0aGUgbmV4dCByZXF1ZXN0IG11c3QgYmUgYSBoYW5kc2hha2UsXG4gKiBjb250YWluaW5nIHdoYXRldmVyIHN0cmVhbVRva2VuIGlzIG9uIGhhbmQuIE9uY2UgYSByZXNwb25zZSB0byB0aGlzXG4gKiByZXF1ZXN0IGlzIHJlY2VpdmVkLCBhbGwgcGVuZGluZyBtdXRhdGlvbnMgbWF5IGJlIHN1Ym1pdHRlZC4gV2hlblxuICogc3VibWl0dGluZyBtdWx0aXBsZSBiYXRjaGVzIG9mIG11dGF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLCBpdCdzXG4gKiBva2F5IHRvIHVzZSB0aGUgc2FtZSBzdHJlYW1Ub2tlbiBmb3IgdGhlIGNhbGxzIHRvIHdyaXRlTXV0YXRpb25zLlxuICpcbiAqIFRPRE8oYi8zMzI3MTIzNSk6IFVzZSBwcm90byB0eXBlc1xuICovIGNsYXNzIGlvIGV4dGVuZHMgbm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgc3VwZXIodCwgXCJ3cml0ZV9zdHJlYW1fY29ubmVjdGlvbl9iYWNrb2ZmXCIgLyogV3JpdGVTdHJlYW1Db25uZWN0aW9uQmFja29mZiAqLyAsIFwid3JpdGVfc3RyZWFtX2lkbGVcIiAvKiBXcml0ZVN0cmVhbUlkbGUgKi8gLCBcImhlYWx0aF9jaGVja190aW1lb3V0XCIgLyogSGVhbHRoQ2hlY2tUaW1lb3V0ICovICwgZSwgbiwgcywgciksIFxuICAgICAgICB0aGlzLmsgPSBpLCB0aGlzLlZyID0gITE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyYWNrcyB3aGV0aGVyIG9yIG5vdCBhIGhhbmRzaGFrZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhjaGFuZ2VkIGFuZFxuICAgICAqIHRoZSBzdHJlYW0gaXMgcmVhZHkgdG8gYWNjZXB0IG11dGF0aW9ucy5cbiAgICAgKi8gICAgZ2V0IFNyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5WcjtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGUgb2YgUGVyc2lzdGVudFN0cmVhbS5zdGFydFxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLlZyID0gITEsIHRoaXMubGFzdFN0cmVhbVRva2VuID0gdm9pZCAwLCBzdXBlci5zdGFydCgpO1xuICAgIH1cbiAgICBUcigpIHtcbiAgICAgICAgdGhpcy5WciAmJiB0aGlzLkRyKFtdKTtcbiAgICB9XG4gICAgUnIodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pci5RaShcIldyaXRlXCIsIHQsIGUpO1xuICAgIH1cbiAgICBvbk1lc3NhZ2UodCkge1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIEFsd2F5cyBjYXB0dXJlIHRoZSBsYXN0IHN0cmVhbSB0b2tlbi5cbiAgICAgICAgQighIXQuc3RyZWFtVG9rZW4pLCB0aGlzLmxhc3RTdHJlYW1Ub2tlbiA9IHQuc3RyZWFtVG9rZW4sIHRoaXMuVnIpIHtcbiAgICAgICAgICAgIC8vIEEgc3VjY2Vzc2Z1bCBmaXJzdCB3cml0ZSByZXNwb25zZSBtZWFucyB0aGUgc3RyZWFtIGlzIGhlYWx0aHksXG4gICAgICAgICAgICAvLyBOb3RlLCB0aGF0IHdlIGNvdWxkIGNvbnNpZGVyIGEgc3VjY2Vzc2Z1bCBoYW5kc2hha2UgaGVhbHRoeSwgaG93ZXZlcixcbiAgICAgICAgICAgIC8vIHRoZSB3cml0ZSBpdHNlbGYgbWlnaHQgYmUgY2F1c2luZyBhbiBlcnJvciB3ZSB3YW50IHRvIGJhY2sgb2ZmIGZyb20uXG4gICAgICAgICAgICB0aGlzLnVyLnJlc2V0KCk7XG4gICAgICAgICAgICBjb25zdCBlID0gY3ModC53cml0ZVJlc3VsdHMsIHQuY29tbWl0VGltZSksIG4gPSBHbih0LmNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuQ3IobiwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGZpcnN0IHJlc3BvbnNlIGlzIGFsd2F5cyB0aGUgaGFuZHNoYWtlIHJlc3BvbnNlXG4gICAgICAgIHJldHVybiBCKCF0LndyaXRlUmVzdWx0cyB8fCAwID09PSB0LndyaXRlUmVzdWx0cy5sZW5ndGgpLCB0aGlzLlZyID0gITAsIHRoaXMubGlzdGVuZXIuTnIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gaW5pdGlhbCBzdHJlYW1Ub2tlbiB0byB0aGUgc2VydmVyLCBwZXJmb3JtaW5nIHRoZSBoYW5kc2hha2VcbiAgICAgKiByZXF1aXJlZCB0byBtYWtlIHRoZSBTdHJlYW1pbmdXcml0ZSBSUEMgd29yay4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHNob3VsZCB3YWl0IHVudGlsIG9uSGFuZHNoYWtlQ29tcGxldGUgd2FzIGNhbGxlZC5cbiAgICAgKi8gICAga3IoKSB7XG4gICAgICAgIC8vIFRPRE8oZGltb25kKTogU3VwcG9ydCBzdHJlYW0gcmVzdW1wdGlvbi4gV2UgaW50ZW50aW9uYWxseSBkbyBub3Qgc2V0IHRoZVxuICAgICAgICAvLyBzdHJlYW0gdG9rZW4gb24gdGhlIGhhbmRzaGFrZSwgaWdub3JpbmcgYW55IHN0cmVhbSB0b2tlbiB3ZSBtaWdodCBoYXZlLlxuICAgICAgICBjb25zdCB0ID0ge307XG4gICAgICAgIHQuZGF0YWJhc2UgPSB0cyh0aGlzLmspLCB0aGlzLmdyKHQpO1xuICAgIH1cbiAgICAvKiogU2VuZHMgYSBncm91cCBvZiBtdXRhdGlvbnMgdG8gdGhlIEZpcmVzdG9yZSBiYWNrZW5kIHRvIGFwcGx5LiAqLyAgICBEcih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBzdHJlYW1Ub2tlbjogdGhpcy5sYXN0U3RyZWFtVG9rZW4sXG4gICAgICAgICAgICB3cml0ZXM6IHQubWFwKCh0ID0+IG9zKHRoaXMuaywgdCkpKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGF0YXN0b3JlIGFuZCBpdHMgcmVsYXRlZCBtZXRob2RzIGFyZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBHb29nbGVcbiAqIENsb3VkIERhdGFzdG9yZSBncnBjIEFQSSwgd2hpY2ggcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgbW9yZSBjb252ZW5pZW50XG4gKiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudCBTREsgYXJjaGl0ZWN0dXJlIHRvIGNvbnN1bWUuXG4gKi9cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgRGF0YXN0b3JlIHRoYXQgZXhwb3NlcyBhZGRpdGlvbmFsIHN0YXRlIGZvciBpbnRlcm5hbFxuICogY29uc3VtcHRpb24uXG4gKi9cbmNsYXNzIHJvIGV4dGVuZHMgY2xhc3Mge30ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5hdXRoQ3JlZGVudGlhbHMgPSB0LCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMgPSBlLCB0aGlzLmlyID0gbiwgdGhpcy5rID0gcywgXG4gICAgICAgIHRoaXMuJHIgPSAhMTtcbiAgICB9XG4gICAgRnIoKSB7XG4gICAgICAgIGlmICh0aGlzLiRyKSB0aHJvdyBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiVGhlIGNsaWVudCBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWQuXCIpO1xuICAgIH1cbiAgICAvKiogSW52b2tlcyB0aGUgcHJvdmlkZWQgUlBDIHdpdGggYXV0aCBhbmQgQXBwQ2hlY2sgdG9rZW5zLiAqLyAgICBCaSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZyKCksIFByb21pc2UuYWxsKFsgdGhpcy5hdXRoQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmdldFRva2VuKCkgXSkudGhlbigoKFtzLCBpXSkgPT4gdGhpcy5pci5CaSh0LCBlLCBuLCBzLCBpKSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRocm93IFwiRmlyZWJhc2VFcnJvclwiID09PSB0Lm5hbWUgPyAodC5jb2RlID09PSBLLlVOQVVUSEVOVElDQVRFRCAmJiAodGhpcy5hdXRoQ3JlZGVudGlhbHMuaW52YWxpZGF0ZVRva2VuKCksIFxuICAgICAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpKSwgdCkgOiBuZXcgaihLLlVOS05PV04sIHQudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqIEludm9rZXMgdGhlIHByb3ZpZGVkIFJQQyB3aXRoIHN0cmVhbWVkIHJlc3VsdHMgd2l0aCBhdXRoIGFuZCBBcHBDaGVjayB0b2tlbnMuICovICAgIGppKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRnIoKSwgUHJvbWlzZS5hbGwoWyB0aGlzLmF1dGhDcmVkZW50aWFscy5nZXRUb2tlbigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSBdKS50aGVuKCgoW3MsIGldKSA9PiB0aGlzLmlyLmppKHQsIGUsIG4sIHMsIGkpKSkuY2F0Y2goKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgXCJGaXJlYmFzZUVycm9yXCIgPT09IHQubmFtZSA/ICh0LmNvZGUgPT09IEsuVU5BVVRIRU5USUNBVEVEICYmICh0aGlzLmF1dGhDcmVkZW50aWFscy5pbnZhbGlkYXRlVG9rZW4oKSwgXG4gICAgICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuaW52YWxpZGF0ZVRva2VuKCkpLCB0KSA6IG5ldyBqKEsuVU5LTk9XTiwgdC50b1N0cmluZygpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHRoaXMuJHIgPSAhMDtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JleHApOiBNYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgRGF0YXN0b3JlIGluc3RhbmNlIHBlclxuLy8gZmlyZXN0b3JlLWV4cCBjbGllbnQuXG4vKipcbiAqIEEgY29tcG9uZW50IHVzZWQgYnkgdGhlIFJlbW90ZVN0b3JlIHRvIHRyYWNrIHRoZSBPbmxpbmVTdGF0ZSAodGhhdCBpcyxcbiAqIHdoZXRoZXIgb3Igbm90IHRoZSBjbGllbnQgYXMgYSB3aG9sZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBvbmxpbmUgb3JcbiAqIG9mZmxpbmUpLCBpbXBsZW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIGhldXJpc3RpY3MuXG4gKlxuICogSW4gcGFydGljdWxhciwgd2hlbiB0aGUgY2xpZW50IGlzIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBiYWNrZW5kLCB3ZVxuICogYWxsb3cgdXAgdG8gTUFYX1dBVENIX1NUUkVBTV9GQUlMVVJFUyB3aXRoaW4gT05MSU5FX1NUQVRFX1RJTUVPVVRfTVMgZm9yXG4gKiBhIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC4gSWYgd2UgaGF2ZSB0b28gbWFueSBmYWlsdXJlcyBvciB0aGUgdGltZW91dCBlbGFwc2VzLFxuICogdGhlbiB3ZSBzZXQgdGhlIE9ubGluZVN0YXRlIHRvIE9mZmxpbmUsIGFuZCB0aGUgY2xpZW50IHdpbGwgYmVoYXZlIGFzIGlmXG4gKiBpdCBpcyBvZmZsaW5lIChnZXQoKXMgd2lsbCByZXR1cm4gY2FjaGVkIGRhdGEsIGV0Yy4pLlxuICovXG5jbGFzcyBvbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmFzeW5jUXVldWUgPSB0LCB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IGUsIFxuICAgICAgICAvKiogVGhlIGN1cnJlbnQgT25saW5lU3RhdGUuICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBcIlVua25vd25cIiAvKiBVbmtub3duICovICwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzIHRvIG9wZW4gdGhlIHN0cmVhbS4gSWYgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICogbWF4aW11bSBkZWZpbmVkIGJ5IE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMsIHdlJ2xsIHNldCB0aGUgT25saW5lU3RhdGUgdG9cbiAgICAgICAgICogT2ZmbGluZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuT3IgPSAwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgdGltZXIgdGhhdCBlbGFwc2VzIGFmdGVyIE9OTElORV9TVEFURV9USU1FT1VUX01TLCBhdCB3aGljaCBwb2ludCB3ZVxuICAgICAgICAgKiB0cmFuc2l0aW9uIGZyb20gT25saW5lU3RhdGUuVW5rbm93biB0byBPbmxpbmVTdGF0ZS5PZmZsaW5lIHdpdGhvdXQgd2FpdGluZ1xuICAgICAgICAgKiBmb3IgdGhlIHN0cmVhbSB0byBhY3R1YWxseSBmYWlsIChNQVhfV0FUQ0hfU1RSRUFNX0ZBSUxVUkVTIHRpbWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuTXIgPSBudWxsLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNsaWVudCBzaG91bGQgbG9nIGEgd2FybmluZyBtZXNzYWdlIGlmIGl0IGZhaWxzIHRvIGNvbm5lY3QgdG9cbiAgICAgICAgICogdGhlIGJhY2tlbmQgKGluaXRpYWxseSB0cnVlLCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdHJlYW0sIG9yIGlmIHdlJ3ZlXG4gICAgICAgICAqIGxvZ2dlZCB0aGUgbWVzc2FnZSBhbHJlYWR5KS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuTHIgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJ5IFJlbW90ZVN0b3JlIHdoZW4gYSB3YXRjaCBzdHJlYW0gaXMgc3RhcnRlZCAoaW5jbHVkaW5nIG9uIGVhY2hcbiAgICAgKiBiYWNrb2ZmIGF0dGVtcHQpLlxuICAgICAqXG4gICAgICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdCwgaXQgc2V0cyB0aGUgT25saW5lU3RhdGUgdG8gVW5rbm93biBhbmQgc3RhcnRzXG4gICAgICogdGhlIG9ubGluZVN0YXRlVGltZXIuXG4gICAgICovICAgIEJyKCkge1xuICAgICAgICAwID09PSB0aGlzLk9yICYmICh0aGlzLlVyKFwiVW5rbm93blwiIC8qIFVua25vd24gKi8pLCB0aGlzLk1yID0gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBZnRlckRlbGF5KFwib25saW5lX3N0YXRlX3RpbWVvdXRcIiAvKiBPbmxpbmVTdGF0ZVRpbWVvdXQgKi8gLCAxZTQsICgoKSA9PiAodGhpcy5NciA9IG51bGwsIFxuICAgICAgICB0aGlzLnFyKFwiQmFja2VuZCBkaWRuJ3QgcmVzcG9uZCB3aXRoaW4gMTAgc2Vjb25kcy5cIiksIHRoaXMuVXIoXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyksIFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb3VyIE9ubGluZVN0YXRlIGFzIGFwcHJvcHJpYXRlIGFmdGVyIHRoZSB3YXRjaCBzdHJlYW0gcmVwb3J0cyBhXG4gICAgICogZmFpbHVyZS4gVGhlIGZpcnN0IGZhaWx1cmUgbW92ZXMgdXMgdG8gdGhlICdVbmtub3duJyBzdGF0ZS4gV2UgdGhlbiBtYXlcbiAgICAgKiBhbGxvdyBtdWx0aXBsZSBmYWlsdXJlcyAoYmFzZWQgb24gTUFYX1dBVENIX1NUUkVBTV9GQUlMVVJFUykgYmVmb3JlIHdlXG4gICAgICogYWN0dWFsbHkgdHJhbnNpdGlvbiB0byB0aGUgJ09mZmxpbmUnIHN0YXRlLlxuICAgICAqLyAgICBLcih0KSB7XG4gICAgICAgIFwiT25saW5lXCIgLyogT25saW5lICovID09PSB0aGlzLnN0YXRlID8gdGhpcy5VcihcIlVua25vd25cIiAvKiBVbmtub3duICovKSA6ICh0aGlzLk9yKyssIFxuICAgICAgICB0aGlzLk9yID49IDEgJiYgKHRoaXMuanIoKSwgdGhpcy5xcihgQ29ubmVjdGlvbiBmYWlsZWQgMSB0aW1lcy4gTW9zdCByZWNlbnQgZXJyb3I6ICR7dC50b1N0cmluZygpfWApLCBcbiAgICAgICAgdGhpcy5VcihcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBsaWNpdGx5IHNldHMgdGhlIE9ubGluZVN0YXRlIHRvIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyByZXNldHMgb3VyIHRpbWVycyAvIGZhaWx1cmUgY291bnRlcnMsIGV0Yy4gdXNlZCBieSBvdXJcbiAgICAgKiBPZmZsaW5lIGhldXJpc3RpY3MsIHNvIG11c3Qgbm90IGJlIHVzZWQgaW4gcGxhY2Ugb2ZcbiAgICAgKiBoYW5kbGVXYXRjaFN0cmVhbVN0YXJ0KCkgYW5kIGhhbmRsZVdhdGNoU3RyZWFtRmFpbHVyZSgpLlxuICAgICAqLyAgICBzZXQodCkge1xuICAgICAgICB0aGlzLmpyKCksIHRoaXMuT3IgPSAwLCBcIk9ubGluZVwiIC8qIE9ubGluZSAqLyA9PT0gdCAmJiAoXG4gICAgICAgIC8vIFdlJ3ZlIGNvbm5lY3RlZCB0byB3YXRjaCBhdCBsZWFzdCBvbmNlLiBEb24ndCB3YXJuIHRoZSBkZXZlbG9wZXJcbiAgICAgICAgLy8gYWJvdXQgYmVpbmcgb2ZmbGluZSBnb2luZyBmb3J3YXJkLlxuICAgICAgICB0aGlzLkxyID0gITEpLCB0aGlzLlVyKHQpO1xuICAgIH1cbiAgICBVcih0KSB7XG4gICAgICAgIHQgIT09IHRoaXMuc3RhdGUgJiYgKHRoaXMuc3RhdGUgPSB0LCB0aGlzLm9ubGluZVN0YXRlSGFuZGxlcih0KSk7XG4gICAgfVxuICAgIHFyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGBDb3VsZCBub3QgcmVhY2ggQ2xvdWQgRmlyZXN0b3JlIGJhY2tlbmQuICR7dH1cXG5UaGlzIHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3VyIGRldmljZSBkb2VzIG5vdCBoYXZlIGEgaGVhbHRoeSBJbnRlcm5ldCBjb25uZWN0aW9uIGF0IHRoZSBtb21lbnQuIFRoZSBjbGllbnQgd2lsbCBvcGVyYXRlIGluIG9mZmxpbmUgbW9kZSB1bnRpbCBpdCBpcyBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBjb25uZWN0IHRvIHRoZSBiYWNrZW5kLmA7XG4gICAgICAgIHRoaXMuTHIgPyAoRihlKSwgdGhpcy5MciA9ICExKSA6ICQoXCJPbmxpbmVTdGF0ZVRyYWNrZXJcIiwgZSk7XG4gICAgfVxuICAgIGpyKCkge1xuICAgICAgICBudWxsICE9PSB0aGlzLk1yICYmICh0aGlzLk1yLmNhbmNlbCgpLCB0aGlzLk1yID0gbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBhbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGxvY2FsIHN0b3JlLCB1c2VkIHRvIGZpbGwgdGhlIHdyaXRlIHBpcGVsaW5lIHdpdGggb3V0Ym91bmQgbXV0YXRpb25zLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgY2xpZW50LXNpZGUgcHJveHkgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGJhY2tlbmQuICovXG4gICAgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgPSB0LCB0aGlzLmRhdGFzdG9yZSA9IGUsIHRoaXMuYXN5bmNRdWV1ZSA9IG4sIHRoaXMucmVtb3RlU3luY2VyID0ge30sIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIHVwIHRvIE1BWF9QRU5ESU5HX1dSSVRFUyB3cml0ZXMgdGhhdCB3ZSBoYXZlIGZldGNoZWQgZnJvbSB0aGVcbiAgICAgICAgICogTG9jYWxTdG9yZSB2aWEgZmlsbFdyaXRlUGlwZWxpbmUoKSBhbmQgaGF2ZSBvciB3aWxsIHNlbmQgdG8gdGhlIHdyaXRlXG4gICAgICAgICAqIHN0cmVhbS5cbiAgICAgICAgICpcbiAgICAgICAgICogV2hlbmV2ZXIgd3JpdGVQaXBlbGluZS5sZW5ndGggPiAwIHRoZSBSZW1vdGVTdG9yZSB3aWxsIGF0dGVtcHQgdG8gc3RhcnQgb3JcbiAgICAgICAgICogcmVzdGFydCB0aGUgd3JpdGUgc3RyZWFtLiBXaGVuIHRoZSBzdHJlYW0gaXMgZXN0YWJsaXNoZWQgdGhlIHdyaXRlcyBpbiB0aGVcbiAgICAgICAgICogcGlwZWxpbmUgd2lsbCBiZSBzZW50IGluIG9yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXcml0ZXMgcmVtYWluIGluIHdyaXRlUGlwZWxpbmUgdW50aWwgdGhleSBhcmUgYWNrbm93bGVkZ2VkIGJ5IHRoZSBiYWNrZW5kXG4gICAgICAgICAqIGFuZCB0aHVzIHdpbGwgYXV0b21hdGljYWxseSBiZSByZS1zZW50IGlmIHRoZSBzdHJlYW0gaXMgaW50ZXJydXB0ZWQgL1xuICAgICAgICAgKiByZXN0YXJ0ZWQgYmVmb3JlIHRoZXkncmUgYWNrbm93bGVkZ2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXcml0ZSByZXNwb25zZXMgZnJvbSB0aGUgYmFja2VuZCBhcmUgbGlua2VkIHRvIHRoZWlyIG9yaWdpbmF0aW5nIHJlcXVlc3RcbiAgICAgICAgICogcHVyZWx5IGJhc2VkIG9uIG9yZGVyLCBhbmQgc28gd2UgY2FuIGp1c3Qgc2hpZnQoKSB3cml0ZXMgZnJvbSB0aGUgZnJvbnQgb2ZcbiAgICAgICAgICogdGhlIHdyaXRlUGlwZWxpbmUgYXMgd2UgcmVjZWl2ZSByZXNwb25zZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlFyID0gW10sIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXBwaW5nIG9mIHdhdGNoZWQgdGFyZ2V0cyB0aGF0IHRoZSBjbGllbnQgY2FyZXMgYWJvdXQgdHJhY2tpbmcgYW5kIHRoZVxuICAgICAgICAgKiB1c2VyIGhhcyBleHBsaWNpdGx5IGNhbGxlZCBhICdsaXN0ZW4nIGZvciB0aGlzIHRhcmdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlc2UgdGFyZ2V0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gc2VudCB0byBvciBhY2tub3dsZWRnZWQgYnkgdGhlXG4gICAgICAgICAqIHNlcnZlci4gT24gcmUtZXN0YWJsaXNoaW5nIHRoZSBsaXN0ZW4gc3RyZWFtLCB0aGVzZSB0YXJnZXRzIHNob3VsZCBiZSBzZW50XG4gICAgICAgICAqIHRvIHRoZSBzZXJ2ZXIuIFRoZSB0YXJnZXRzIHJlbW92ZWQgd2l0aCB1bmxpc3RlbnMgYXJlIHJlbW92ZWQgZWFnZXJseVxuICAgICAgICAgKiB3aXRob3V0IHdhaXRpbmcgZm9yIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSBsaXN0ZW4gc3RyZWFtLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5XciA9IG5ldyBNYXAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzZXQgb2YgcmVhc29ucyBmb3Igd2h5IHRoZSBSZW1vdGVTdG9yZSBtYXkgYmUgb2ZmbGluZS4gSWYgZW1wdHksIHRoZVxuICAgICAgICAgKiBSZW1vdGVTdG9yZSBtYXkgc3RhcnQgaXRzIG5ldHdvcmsgY29ubmVjdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkdyID0gbmV3IFNldCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmVudCBoYW5kbGVycyB0aGF0IGdldCBjYWxsZWQgd2hlbiB0aGUgbmV0d29yayBpcyBkaXNhYmxlZCBvciBlbmFibGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBvbiB0aGUgV2ViIGNsaWVudCB0byBjcmVhdGUgdGhlXG4gICAgICAgICAqIHVuZGVybHlpbmcgc3RyZWFtcyAodG8gc3VwcG9ydCB0cmVlLXNoYWtlYWJsZSBzdHJlYW1zKS4gT24gQW5kcm9pZCBhbmQgaU9TLFxuICAgICAgICAgKiB0aGUgc3RyZWFtcyBhcmUgY3JlYXRlZCBkdXJpbmcgY29uc3RydWN0aW9uIG9mIFJlbW90ZVN0b3JlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy56ciA9IFtdLCB0aGlzLkhyID0gaSwgdGhpcy5Ici5FaSgodCA9PiB7XG4gICAgICAgICAgICBuLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQb3J0aW5nIE5vdGU6IFVubGlrZSBpT1MsIGByZXN0YXJ0TmV0d29yaygpYCBpcyBjYWxsZWQgZXZlbiB3aGVuIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgYmVjb21lcyB1bnJlYWNoYWJsZSBhcyB3ZSBkb24ndCBoYXZlIGFueSBvdGhlciB3YXkgdG8gdGVhclxuICAgICAgICAgICAgICAgIC8vIGRvd24gb3VyIHN0cmVhbXMuXG4gICAgICAgICAgICAgICAgZ28odGhpcykgJiYgKCQoXCJSZW1vdGVTdG9yZVwiLCBcIlJlc3RhcnRpbmcgc3RyZWFtcyBmb3IgbmV0d29yayByZWFjaGFiaWxpdHkgY2hhbmdlLlwiKSwgXG4gICAgICAgICAgICAgICAgYXdhaXQgYXN5bmMgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gcSh0KTtcbiAgICAgICAgICAgICAgICAgICAgZS5Hci5hZGQoNCAvKiBDb25uZWN0aXZpdHlDaGFuZ2UgKi8pLCBhd2FpdCB1byhlKSwgZS5Kci5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLyksIFxuICAgICAgICAgICAgICAgICAgICBlLkdyLmRlbGV0ZSg0IC8qIENvbm5lY3Rpdml0eUNoYW5nZSAqLyksIGF3YWl0IGNvKGUpO1xuICAgICAgICAgICAgICAgIH0odGhpcykpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSksIHRoaXMuSnIgPSBuZXcgb28obiwgcyk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbyh0KSB7XG4gICAgaWYgKGdvKHQpKSBmb3IgKGNvbnN0IGUgb2YgdC56cikgYXdhaXQgZSgvKiBlbmFibGVkPSAqLyAhMCk7XG59XG5cbi8qKlxuICogVGVtcG9yYXJpbHkgZGlzYWJsZXMgdGhlIG5ldHdvcmsuIFRoZSBuZXR3b3JrIGNhbiBiZSByZS1lbmFibGVkIHVzaW5nXG4gKiBlbmFibGVOZXR3b3JrKCkuXG4gKi8gYXN5bmMgZnVuY3Rpb24gdW8odCkge1xuICAgIGZvciAoY29uc3QgZSBvZiB0LnpyKSBhd2FpdCBlKC8qIGVuYWJsZWQ9ICovICExKTtcbn1cblxuLyoqXG4gKiBTdGFydHMgbmV3IGxpc3RlbiBmb3IgdGhlIGdpdmVuIHRhcmdldC4gVXNlcyByZXN1bWUgdG9rZW4gaWYgcHJvdmlkZWQuIEl0XG4gKiBpcyBhIG5vLW9wIGlmIHRoZSB0YXJnZXQgb2YgZ2l2ZW4gYFRhcmdldERhdGFgIGlzIGFscmVhZHkgYmVpbmcgbGlzdGVuZWQgdG8uXG4gKi9cbmZ1bmN0aW9uIGhvKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KTtcbiAgICBuLldyLmhhcyhlLnRhcmdldElkKSB8fCAoXG4gICAgLy8gTWFyayB0aGlzIGFzIHNvbWV0aGluZyB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBsaXN0ZW5pbmcgZm9yLlxuICAgIG4uV3Iuc2V0KGUudGFyZ2V0SWQsIGUpLCBtbyhuKSA/IFxuICAgIC8vIFRoZSBsaXN0ZW4gd2lsbCBiZSBzZW50IGluIG9uV2F0Y2hTdHJlYW1PcGVuXG4gICAgX28obikgOiB4byhuKS5scigpICYmIGZvKG4sIGUpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBsaXN0ZW4gZnJvbSBzZXJ2ZXIuIEl0IGlzIGEgbm8tb3AgaWYgdGhlIGdpdmVuIHRhcmdldCBpZCBpc1xuICogbm90IGJlaW5nIGxpc3RlbmVkIHRvLlxuICovIGZ1bmN0aW9uIGxvKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KSwgcyA9IHhvKG4pO1xuICAgIG4uV3IuZGVsZXRlKGUpLCBzLmxyKCkgJiYgd28obiwgZSksIDAgPT09IG4uV3Iuc2l6ZSAmJiAocy5scigpID8gcy5fcigpIDogZ28obikgJiYgXG4gICAgLy8gUmV2ZXJ0IHRvIE9ubGluZVN0YXRlLlVua25vd24gaWYgdGhlIHdhdGNoIHN0cmVhbSBpcyBub3Qgb3BlbiBhbmQgd2VcbiAgICAvLyBoYXZlIG5vIGxpc3RlbmVycywgc2luY2Ugd2l0aG91dCBhbnkgbGlzdGVucyB0byBzZW5kIHdlIGNhbm5vdFxuICAgIC8vIGNvbmZpcm0gaWYgdGhlIHN0cmVhbSBpcyBoZWFsdGh5IGFuZCB1cGdyYWRlIHRvIE9ubGluZVN0YXRlLk9ubGluZS5cbiAgICBuLkpyLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKSk7XG59XG5cbi8qKlxuICogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcGVuZGluZyByZXNwb25zZXMgd2UncmUgZHVlXG4gKiBmcm9tIHdhdGNoIHNvIHdlIHdhaXQgZm9yIHRoZSBhY2sgdG8gcHJvY2VzcyBhbnkgbWVzc2FnZXMgZnJvbSB0aGlzIHRhcmdldC5cbiAqLyBmdW5jdGlvbiBmbyh0LCBlKSB7XG4gICAgdC5Zci5YKGUudGFyZ2V0SWQpLCB4byh0KS5icihlKTtcbn1cblxuLyoqXG4gKiBXZSBuZWVkIHRvIGluY3JlbWVudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIHdlJ3JlIGR1ZVxuICogZnJvbSB3YXRjaCBzbyB3ZSB3YWl0IGZvciB0aGUgcmVtb3ZhbCBvbiB0aGUgc2VydmVyIGJlZm9yZSB3ZSBwcm9jZXNzIGFueVxuICogbWVzc2FnZXMgZnJvbSB0aGlzIHRhcmdldC5cbiAqLyBmdW5jdGlvbiB3byh0LCBlKSB7XG4gICAgdC5Zci5YKGUpLCB4byh0KS52cihlKTtcbn1cblxuZnVuY3Rpb24gX28odCkge1xuICAgIHQuWXIgPSBuZXcgTW4oe1xuICAgICAgICBnZXRSZW1vdGVLZXlzRm9yVGFyZ2V0OiBlID0+IHQucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQoZSksXG4gICAgICAgIEV0OiBlID0+IHQuV3IuZ2V0KGUpIHx8IG51bGxcbiAgICB9KSwgeG8odCkuc3RhcnQoKSwgdC5Kci5CcigpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgd2F0Y2ggc3RyZWFtIHNob3VsZCBiZSBzdGFydGVkIGJlY2F1c2UgaXQncyBuZWNlc3NhcnlcbiAqIGFuZCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQuXG4gKi8gZnVuY3Rpb24gbW8odCkge1xuICAgIHJldHVybiBnbyh0KSAmJiAheG8odCkuaHIoKSAmJiB0LldyLnNpemUgPiAwO1xufVxuXG5mdW5jdGlvbiBnbyh0KSB7XG4gICAgcmV0dXJuIDAgPT09IHEodCkuR3Iuc2l6ZTtcbn1cblxuZnVuY3Rpb24geW8odCkge1xuICAgIHQuWXIgPSB2b2lkIDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvKHQpIHtcbiAgICB0LldyLmZvckVhY2goKChlLCBuKSA9PiB7XG4gICAgICAgIGZvKHQsIGUpO1xuICAgIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gVG8odCwgZSkge1xuICAgIHlvKHQpLCBcbiAgICAvLyBJZiB3ZSBzdGlsbCBuZWVkIHRoZSB3YXRjaCBzdHJlYW0sIHJldHJ5IHRoZSBjb25uZWN0aW9uLlxuICAgIG1vKHQpID8gKHQuSnIuS3IoZSksIF9vKHQpKSA6IFxuICAgIC8vIE5vIG5lZWQgdG8gcmVzdGFydCB3YXRjaCBzdHJlYW0gYmVjYXVzZSB0aGVyZSBhcmUgbm8gYWN0aXZlIHRhcmdldHMuXG4gICAgLy8gVGhlIG9ubGluZSBzdGF0ZSBpcyBzZXQgdG8gdW5rbm93biBiZWNhdXNlIHRoZXJlIGlzIG5vIGFjdGl2ZSBhdHRlbXB0XG4gICAgLy8gYXQgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvblxuICAgIHQuSnIuc2V0KFwiVW5rbm93blwiIC8qIFVua25vd24gKi8pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBFbyh0LCBlLCBuKSB7XG4gICAgaWYgKFxuICAgIC8vIE1hcmsgdGhlIGNsaWVudCBhcyBvbmxpbmUgc2luY2Ugd2UgZ290IGEgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICB0LkpyLnNldChcIk9ubGluZVwiIC8qIE9ubGluZSAqLyksIGUgaW5zdGFuY2VvZiBGbiAmJiAyIC8qIFJlbW92ZWQgKi8gPT09IGUuc3RhdGUgJiYgZS5jYXVzZSkgXG4gICAgLy8gVGhlcmUgd2FzIGFuIGVycm9yIG9uIGEgdGFyZ2V0LCBkb24ndCB3YWl0IGZvciBhIGNvbnNpc3RlbnQgc25hcHNob3RcbiAgICAvLyB0byByYWlzZSBldmVudHNcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBcbiAgICAgICAgLyoqIEhhbmRsZXMgYW4gZXJyb3Igb24gYSB0YXJnZXQgKi9cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGUuY2F1c2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgZS50YXJnZXRJZHMpIFxuICAgICAgICAgICAgLy8gQSB3YXRjaGVkIHRhcmdldCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LlxuICAgICAgICAgICAgdC5Xci5oYXMocykgJiYgKGF3YWl0IHQucmVtb3RlU3luY2VyLnJlamVjdExpc3RlbihzLCBuKSwgdC5Xci5kZWxldGUocyksIHQuWXIucmVtb3ZlVGFyZ2V0KHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEF0dGVtcHRzIHRvIGZpbGwgb3VyIHdyaXRlIHBpcGVsaW5lIHdpdGggd3JpdGVzIGZyb20gdGhlIExvY2FsU3RvcmUuXG4gKlxuICogQ2FsbGVkIGludGVybmFsbHkgdG8gYm9vdHN0cmFwIG9yIHJlZmlsbCB0aGUgd3JpdGUgcGlwZWxpbmUgYW5kIGJ5XG4gKiBTeW5jRW5naW5lIHdoZW5ldmVyIHRoZXJlIGFyZSBuZXcgbXV0YXRpb25zIHRvIHByb2Nlc3MuXG4gKlxuICogU3RhcnRzIHRoZSB3cml0ZSBzdHJlYW0gaWYgbmVjZXNzYXJ5LlxuICovICh0LCBlKTtcbiAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICQoXCJSZW1vdGVTdG9yZVwiLCBcIkZhaWxlZCB0byByZW1vdmUgdGFyZ2V0cyAlczogJXMgXCIsIGUudGFyZ2V0SWRzLmpvaW4oXCIsXCIpLCBuKSwgXG4gICAgICAgIGF3YWl0IElvKHQsIG4pO1xuICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIHhuID8gdC5Zci5vdChlKSA6IGUgaW5zdGFuY2VvZiAkbiA/IHQuWXIuZHQoZSkgOiB0LllyLnV0KGUpLCBcbiAgICAhbi5pc0VxdWFsKGN0Lm1pbigpKSkgdHJ5IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IF9yKHQubG9jYWxTdG9yZSk7XG4gICAgICAgIG4uY29tcGFyZVRvKGUpID49IDAgJiYgXG4gICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgYSB0YXJnZXQgY2hhbmdlIHdpdGggYSBnbG9iYWwgc25hcHNob3QgaWYgdGhlIHNuYXBzaG90XG4gICAgICAgIC8vIHZlcnNpb24gaXMgbm90IGVxdWFsIHRvIFNuYXBzaG90VmVyc2lvbi5taW4oKS5cbiAgICAgICAgYXdhaXQgXG4gICAgICAgIC8qKlxuICogVGFrZXMgYSBiYXRjaCBvZiBjaGFuZ2VzIGZyb20gdGhlIERhdGFzdG9yZSwgcmVwYWNrYWdlcyB0aGVtIGFzIGFcbiAqIFJlbW90ZUV2ZW50LCBhbmQgcGFzc2VzIHRoYXQgb24gdG8gdGhlIGxpc3RlbmVyLCB3aGljaCBpcyB0eXBpY2FsbHkgdGhlXG4gKiBTeW5jRW5naW5lLlxuICovXG4gICAgICAgIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LllyLmd0KGUpO1xuICAgICAgICAgICAgLy8gVXBkYXRlIGluLW1lbW9yeSByZXN1bWUgdG9rZW5zLiBMb2NhbFN0b3JlIHdpbGwgdXBkYXRlIHRoZVxuICAgICAgICAgICAgLy8gcGVyc2lzdGVudCB2aWV3IG9mIHRoZXNlIHdoZW4gYXBwbHlpbmcgdGhlIGNvbXBsZXRlZCBSZW1vdGVFdmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnRhcmdldENoYW5nZXMuZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5yZXN1bWVUb2tlbi5hcHByb3hpbWF0ZUJ5dGVTaXplKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LldyLmdldChzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSB3YXRjaGVkIHRhcmdldCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgdC5Xci5zZXQocywgaS53aXRoUmVzdW1lVG9rZW4obi5yZXN1bWVUb2tlbiwgZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSwgXG4gICAgICAgICAgICAvLyBSZS1lc3RhYmxpc2ggbGlzdGVucyBmb3IgdGhlIHRhcmdldHMgdGhhdCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgYnlcbiAgICAgICAgICAgIC8vIGV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2hlcy5cbiAgICAgICAgICAgIG4udGFyZ2V0TWlzbWF0Y2hlcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5Xci5nZXQoZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFuKSBcbiAgICAgICAgICAgICAgICAvLyBBIHdhdGNoZWQgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIGFscmVhZHkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSByZXN1bWUgdG9rZW4gZm9yIHRoZSB0YXJnZXQsIHNpbmNlIHdlJ3JlIGluIGEga25vd24gbWlzbWF0Y2hcbiAgICAgICAgICAgICAgICAvLyBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5Xci5zZXQoZSwgbi53aXRoUmVzdW1lVG9rZW4oeXQuRU1QVFlfQllURV9TVFJJTkcsIG4uc25hcHNob3RWZXJzaW9uKSksIFxuICAgICAgICAgICAgICAgIC8vIENhdXNlIGEgaGFyZCByZXNldCBieSB1bndhdGNoaW5nIGFuZCByZXdhdGNoaW5nIGltbWVkaWF0ZWx5LCBidXRcbiAgICAgICAgICAgICAgICAvLyBkZWxpYmVyYXRlbHkgZG9uJ3Qgc2VuZCBhIHJlc3VtZSB0b2tlbiBzbyB0aGF0IHdlIGdldCBhIGZ1bGwgdXBkYXRlLlxuICAgICAgICAgICAgICAgIHdvKHQsIGUpO1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRhcmdldCB3ZSBzZW5kIGFzIGJlaW5nIG9uIGJlaGFsZiBvZiBhbiBleGlzdGVuY2UgZmlsdGVyXG4gICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gsIGJ1dCBkb24ndCBhY3R1YWxseSByZXRhaW4gdGhhdCBpbiBsaXN0ZW5UYXJnZXRzLiBUaGlzIGVuc3VyZXNcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIGZsYWcgdGhlIGZpcnN0IHJlLWxpc3RlbiB0aGlzIHdheSB3aXRob3V0IGltcGFjdGluZyBmdXR1cmVcbiAgICAgICAgICAgICAgICAvLyBsaXN0ZW5zIG9mIHRoaXMgdGFyZ2V0ICh0aGF0IG1pZ2h0IGhhcHBlbiBlLmcuIG9uIHJlY29ubmVjdCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBhaShuLnRhcmdldCwgZSwgMSAvKiBFeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaCAqLyAsIG4uc2VxdWVuY2VOdW1iZXIpO1xuICAgICAgICAgICAgICAgIGZvKHQsIHMpO1xuICAgICAgICAgICAgfSkpLCB0LnJlbW90ZVN5bmNlci5hcHBseVJlbW90ZUV2ZW50KG4pO1xuICAgICAgICB9KHQsIG4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgJChcIlJlbW90ZVN0b3JlXCIsIFwiRmFpbGVkIHRvIHJhaXNlIHNuYXBzaG90OlwiLCBlKSwgYXdhaXQgSW8odCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlY292ZXJ5IGxvZ2ljIGZvciBJbmRleGVkREIgZXJyb3JzIHRoYXQgdGFrZXMgdGhlIG5ldHdvcmsgb2ZmbGluZSB1bnRpbFxuICogYG9wYCBzdWNjZWVkcy4gUmV0cmllcyBhcmUgc2NoZWR1bGVkIHdpdGggYmFja29mZiB1c2luZ1xuICogYGVucXVldWVSZXRyeWFibGUoKWAuIElmIGBvcCgpYCBpcyBub3QgcHJvdmlkZWQsIEluZGV4ZWREQiBhY2Nlc3MgaXNcbiAqIHZhbGlkYXRlZCB2aWEgYSBnZW5lcmljIG9wZXJhdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgUHJvbWlzZSBpcyByZXNvbHZlZCBvbmNlIHRoZSBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCBiZWZvcmVcbiAqIGFueSByZXRyeSBhdHRlbXB0LlxuICovIGFzeW5jIGZ1bmN0aW9uIElvKHQsIGUsIG4pIHtcbiAgICBpZiAoIVhzKGUpKSB0aHJvdyBlO1xuICAgIHQuR3IuYWRkKDEgLyogSW5kZXhlZERiRmFpbGVkICovKSwgXG4gICAgLy8gRGlzYWJsZSBuZXR3b3JrIGFuZCByYWlzZSBvZmZsaW5lIHNuYXBzaG90c1xuICAgIGF3YWl0IHVvKHQpLCB0LkpyLnNldChcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovKSwgbiB8fCAoXG4gICAgLy8gVXNlIGEgc2ltcGxlIHJlYWQgb3BlcmF0aW9uIHRvIGRldGVybWluZSBpZiBJbmRleGVkREIgcmVjb3ZlcmVkLlxuICAgIC8vIElkZWFsbHksIHdlIHdvdWxkIGV4cG9zZSBhIGhlYWx0aCBjaGVjayBkaXJlY3RseSBvbiBTaW1wbGVEYiwgYnV0XG4gICAgLy8gUmVtb3RlU3RvcmUgb25seSBoYXMgYWNjZXNzIHRvIHBlcnNpc3RlbmNlIHRocm91Z2ggTG9jYWxTdG9yZS5cbiAgICBuID0gKCkgPT4gX3IodC5sb2NhbFN0b3JlKSksIFxuICAgIC8vIFByb2JlIEluZGV4ZWREQiBwZXJpb2RpY2FsbHkgYW5kIHJlLWVuYWJsZSBuZXR3b3JrXG4gICAgdC5hc3luY1F1ZXVlLmVucXVldWVSZXRyeWFibGUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgJChcIlJlbW90ZVN0b3JlXCIsIFwiUmV0cnlpbmcgSW5kZXhlZERCIGFjY2Vzc1wiKSwgYXdhaXQgbigpLCB0LkdyLmRlbGV0ZSgxIC8qIEluZGV4ZWREYkZhaWxlZCAqLyksIFxuICAgICAgICBhd2FpdCBjbyh0KTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYG9wYC4gSWYgYG9wYCBmYWlscywgdGFrZXMgdGhlIG5ldHdvcmsgb2ZmbGluZSB1bnRpbCBgb3BgXG4gKiBzdWNjZWVkcy4gUmV0dXJucyBhZnRlciB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAqLyBmdW5jdGlvbiBBbyh0LCBlKSB7XG4gICAgcmV0dXJuIGUoKS5jYXRjaCgobiA9PiBJbyh0LCBuLCBlKSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBSbyh0KSB7XG4gICAgY29uc3QgZSA9IHEodCksIG4gPSAkbyhlKTtcbiAgICBsZXQgcyA9IGUuUXIubGVuZ3RoID4gMCA/IGUuUXJbZS5Rci5sZW5ndGggLSAxXS5iYXRjaElkIDogLTE7XG4gICAgZm9yICg7UG8oZSk7ICkgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHlyKGUubG9jYWxTdG9yZSwgcyk7XG4gICAgICAgIGlmIChudWxsID09PSB0KSB7XG4gICAgICAgICAgICAwID09PSBlLlFyLmxlbmd0aCAmJiBuLl9yKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzID0gdC5iYXRjaElkLCBibyhlLCB0KTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGF3YWl0IElvKGUsIHQpO1xuICAgIH1cbiAgICB2byhlKSAmJiBWbyhlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgd2UgY2FuIGFkZCB0byB0aGUgd3JpdGUgcGlwZWxpbmUgKGkuZS4gdGhlIG5ldHdvcmsgaXNcbiAqIGVuYWJsZWQgYW5kIHRoZSB3cml0ZSBwaXBlbGluZSBpcyBub3QgZnVsbCkuXG4gKi8gZnVuY3Rpb24gUG8odCkge1xuICAgIHJldHVybiBnbyh0KSAmJiB0LlFyLmxlbmd0aCA8IDEwO1xufVxuXG4vKipcbiAqIFF1ZXVlcyBhZGRpdGlvbmFsIHdyaXRlcyB0byBiZSBzZW50IHRvIHRoZSB3cml0ZSBzdHJlYW0sIHNlbmRpbmcgdGhlbVxuICogaW1tZWRpYXRlbHkgaWYgdGhlIHdyaXRlIHN0cmVhbSBpcyBlc3RhYmxpc2hlZC5cbiAqLyBmdW5jdGlvbiBibyh0LCBlKSB7XG4gICAgdC5Rci5wdXNoKGUpO1xuICAgIGNvbnN0IG4gPSAkbyh0KTtcbiAgICBuLmxyKCkgJiYgbi5TciAmJiBuLkRyKGUubXV0YXRpb25zKTtcbn1cblxuZnVuY3Rpb24gdm8odCkge1xuICAgIHJldHVybiBnbyh0KSAmJiAhJG8odCkuaHIoKSAmJiB0LlFyLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIFZvKHQpIHtcbiAgICAkbyh0KS5zdGFydCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBTbyh0KSB7XG4gICAgJG8odCkua3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gRG8odCkge1xuICAgIGNvbnN0IGUgPSAkbyh0KTtcbiAgICAvLyBTZW5kIHRoZSB3cml0ZSBwaXBlbGluZSBub3cgdGhhdCB0aGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkLlxuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdC5RcikgZS5EcihuLm11dGF0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIENvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gdC5Rci5zaGlmdCgpLCBpID0gb2kuZnJvbShzLCBlLCBuKTtcbiAgICBhd2FpdCBBbyh0LCAoKCkgPT4gdC5yZW1vdGVTeW5jZXIuYXBwbHlTdWNjZXNzZnVsV3JpdGUoaSkpKSwgXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdpdGggdGhlIGNvbXBsZXRpb24gb2YgdGhpcyBtdXRhdGlvbiBhbm90aGVyXG4gICAgLy8gc2xvdCBoYXMgZnJlZWQgdXAuXG4gICAgYXdhaXQgUm8odCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIE5vKHQsIGUpIHtcbiAgICAvLyBJZiB0aGUgd3JpdGUgc3RyZWFtIGNsb3NlZCBhZnRlciB0aGUgd3JpdGUgaGFuZHNoYWtlIGNvbXBsZXRlcywgYSB3cml0ZVxuICAgIC8vIG9wZXJhdGlvbiBmYWlsZWQgYW5kIHdlIGZhaWwgdGhlIHBlbmRpbmcgb3BlcmF0aW9uLlxuICAgIGUgJiYgJG8odCkuU3IgJiYgXG4gICAgLy8gVGhpcyBlcnJvciBhZmZlY3RzIHRoZSBhY3R1YWwgd3JpdGUuXG4gICAgYXdhaXQgYXN5bmMgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAvLyBPbmx5IGhhbmRsZSBwZXJtYW5lbnQgZXJyb3JzIGhlcmUuIElmIGl0J3MgdHJhbnNpZW50LCBqdXN0IGxldCB0aGUgcmV0cnlcbiAgICAgICAgLy8gbG9naWMga2ljayBpbi5cbiAgICAgICAgaWYgKG4gPSBlLmNvZGUsIF9uKG4pICYmIG4gIT09IEsuQUJPUlRFRCkge1xuICAgICAgICAgICAgLy8gVGhpcyB3YXMgYSBwZXJtYW5lbnQgZXJyb3IsIHRoZSByZXF1ZXN0IGl0c2VsZiB3YXMgdGhlIHByb2JsZW1cbiAgICAgICAgICAgIC8vIHNvIGl0J3Mgbm90IGdvaW5nIHRvIHN1Y2NlZWQgaWYgd2UgcmVzZW5kIGl0LlxuICAgICAgICAgICAgY29uc3QgbiA9IHQuUXIuc2hpZnQoKTtcbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSBpdCdzIGFsc28gdW5saWtlbHkgdGhhdCB0aGUgc2VydmVyIGl0c2VsZiBpcyBtZWx0aW5nXG4gICAgICAgICAgICAvLyBkb3duIC0tIHRoaXMgd2FzIGp1c3QgYSBiYWQgcmVxdWVzdCBzbyBpbmhpYml0IGJhY2tvZmYgb24gdGhlIG5leHRcbiAgICAgICAgICAgIC8vIHJlc3RhcnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAkbyh0KS53cigpLCBhd2FpdCBBbyh0LCAoKCkgPT4gdC5yZW1vdGVTeW5jZXIucmVqZWN0RmFpbGVkV3JpdGUobi5iYXRjaElkLCBlKSkpLCBcbiAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aXRoIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgbXV0YXRpb25cbiAgICAgICAgICAgIC8vIGFub3RoZXIgc2xvdCBoYXMgZnJlZWQgdXAuXG4gICAgICAgICAgICBhd2FpdCBSbyh0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbjtcbiAgICB9KHQsIGUpLCBcbiAgICAvLyBUaGUgd3JpdGUgc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiBzdGFydGVkIGJ5IHJlZmlsbGluZyB0aGUgd3JpdGVcbiAgICAvLyBwaXBlbGluZSBmb3IgZmFpbGVkIHdyaXRlc1xuICAgIHZvKHQpICYmIFZvKHQpO1xufVxuXG4vKipcbiAqIFRvZ2dsZXMgdGhlIG5ldHdvcmsgc3RhdGUgd2hlbiB0aGUgY2xpZW50IGdhaW5zIG9yIGxvc2VzIGl0cyBwcmltYXJ5IGxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBrbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCk7XG4gICAgZSA/IChuLkdyLmRlbGV0ZSgyIC8qIElzU2Vjb25kYXJ5ICovKSwgYXdhaXQgY28obikpIDogZSB8fCAobi5Hci5hZGQoMiAvKiBJc1NlY29uZGFyeSAqLyksIFxuICAgIGF3YWl0IHVvKG4pLCBuLkpyLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKSk7XG59XG5cbi8qKlxuICogSWYgbm90IHlldCBpbml0aWFsaXplZCwgcmVnaXN0ZXJzIHRoZSBXYXRjaFN0cmVhbSBhbmQgaXRzIG5ldHdvcmsgc3RhdGVcbiAqIGNhbGxiYWNrIHdpdGggYHJlbW90ZVN0b3JlSW1wbGAuIFJldHVybnMgdGhlIGV4aXN0aW5nIHN0cmVhbSBpZiBvbmUgaXNcbiAqIGFscmVhZHkgYXZhaWxhYmxlLlxuICpcbiAqIFBPUlRJTkcgTk9URTogT24gaU9TIGFuZCBBbmRyb2lkLCB0aGUgV2F0Y2hTdHJlYW0gZ2V0cyByZWdpc3RlcmVkIG9uIHN0YXJ0dXAuXG4gKiBUaGlzIGlzIG5vdCBkb25lIG9uIFdlYiB0byBhbGxvdyBpdCB0byBiZSB0cmVlLXNoYWtlbi5cbiAqLyBmdW5jdGlvbiB4byh0KSB7XG4gICAgcmV0dXJuIHQuWHIgfHwgKFxuICAgIC8vIENyZWF0ZSBzdHJlYW0gKGJ1dCBub3RlIHRoYXQgaXQgaXMgbm90IHN0YXJ0ZWQgeWV0KS5cbiAgICB0LlhyID0gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gcSh0KTtcbiAgICAgICAgcmV0dXJuIHMuRnIoKSwgbmV3IHNvKGUsIHMuaXIsIHMuYXV0aENyZWRlbnRpYWxzLCBzLmFwcENoZWNrQ3JlZGVudGlhbHMsIHMuaywgbik7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0LmRhdGFzdG9yZSwgdC5hc3luY1F1ZXVlLCB7XG4gICAgICAgIERpOiBwby5iaW5kKG51bGwsIHQpLFxuICAgICAgICBOaTogVG8uYmluZChudWxsLCB0KSxcbiAgICAgICAgUHI6IEVvLmJpbmQobnVsbCwgdClcbiAgICB9KSwgdC56ci5wdXNoKChhc3luYyBlID0+IHtcbiAgICAgICAgZSA/ICh0LlhyLndyKCksIG1vKHQpID8gX28odCkgOiB0LkpyLnNldChcIlVua25vd25cIiAvKiBVbmtub3duICovKSkgOiAoYXdhaXQgdC5Yci5zdG9wKCksIFxuICAgICAgICB5byh0KSk7XG4gICAgfSkpKSwgdC5Ycjtcbn1cblxuLyoqXG4gKiBJZiBub3QgeWV0IGluaXRpYWxpemVkLCByZWdpc3RlcnMgdGhlIFdyaXRlU3RyZWFtIGFuZCBpdHMgbmV0d29yayBzdGF0ZVxuICogY2FsbGJhY2sgd2l0aCBgcmVtb3RlU3RvcmVJbXBsYC4gUmV0dXJucyB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlmIG9uZSBpc1xuICogYWxyZWFkeSBhdmFpbGFibGUuXG4gKlxuICogUE9SVElORyBOT1RFOiBPbiBpT1MgYW5kIEFuZHJvaWQsIHRoZSBXcml0ZVN0cmVhbSBnZXRzIHJlZ2lzdGVyZWQgb24gc3RhcnR1cC5cbiAqIFRoaXMgaXMgbm90IGRvbmUgb24gV2ViIHRvIGFsbG93IGl0IHRvIGJlIHRyZWUtc2hha2VuLlxuICovIGZ1bmN0aW9uICRvKHQpIHtcbiAgICByZXR1cm4gdC5aciB8fCAoXG4gICAgLy8gQ3JlYXRlIHN0cmVhbSAoYnV0IG5vdGUgdGhhdCBpdCBpcyBub3Qgc3RhcnRlZCB5ZXQpLlxuICAgIHQuWnIgPSBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBxKHQpO1xuICAgICAgICByZXR1cm4gcy5GcigpLCBuZXcgaW8oZSwgcy5pciwgcy5hdXRoQ3JlZGVudGlhbHMsIHMuYXBwQ2hlY2tDcmVkZW50aWFscywgcy5rLCBuKTtcbiAgICB9KHQuZGF0YXN0b3JlLCB0LmFzeW5jUXVldWUsIHtcbiAgICAgICAgRGk6IFNvLmJpbmQobnVsbCwgdCksXG4gICAgICAgIE5pOiBOby5iaW5kKG51bGwsIHQpLFxuICAgICAgICBOcjogRG8uYmluZChudWxsLCB0KSxcbiAgICAgICAgQ3I6IENvLmJpbmQobnVsbCwgdClcbiAgICB9KSwgdC56ci5wdXNoKChhc3luYyBlID0+IHtcbiAgICAgICAgZSA/ICh0LlpyLndyKCksIFxuICAgICAgICAvLyBUaGlzIHdpbGwgc3RhcnQgdGhlIHdyaXRlIHN0cmVhbSBpZiBuZWNlc3NhcnkuXG4gICAgICAgIGF3YWl0IFJvKHQpKSA6IChhd2FpdCB0LlpyLnN0b3AoKSwgdC5Rci5sZW5ndGggPiAwICYmICgkKFwiUmVtb3RlU3RvcmVcIiwgYFN0b3BwaW5nIHdyaXRlIHN0cmVhbSB3aXRoICR7dC5Rci5sZW5ndGh9IHBlbmRpbmcgd3JpdGVzYCksIFxuICAgICAgICB0LlFyID0gW10pKTtcbiAgICB9KSkpLCB0LlpyO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wZXJhdGlvbiBzY2hlZHVsZWQgdG8gYmUgcnVuIGluIHRoZSBmdXR1cmUgb24gYW4gQXN5bmNRdWV1ZS5cbiAqXG4gKiBJdCBpcyBjcmVhdGVkIHZpYSBEZWxheWVkT3BlcmF0aW9uLmNyZWF0ZUFuZFNjaGVkdWxlKCkuXG4gKlxuICogU3VwcG9ydHMgY2FuY2VsbGF0aW9uICh2aWEgY2FuY2VsKCkpIGFuZCBlYXJseSBleGVjdXRpb24gKHZpYSBza2lwRGVsYXkoKSkuXG4gKlxuICogTm90ZTogV2UgaW1wbGVtZW50IGBQcm9taXNlTGlrZWAgaW5zdGVhZCBvZiBgUHJvbWlzZWAsIGFzIHRoZSBgUHJvbWlzZWAgdHlwZVxuICogaW4gbmV3ZXIgdmVyc2lvbnMgb2YgVHlwZVNjcmlwdCBkZWZpbmVzIGBmaW5hbGx5YCwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBpblxuICogSUUuXG4gKi9cbmNsYXNzIEZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZSA9IHQsIHRoaXMudGltZXJJZCA9IGUsIHRoaXMudGFyZ2V0VGltZU1zID0gbiwgdGhpcy5vcCA9IHMsIHRoaXMucmVtb3ZhbENhbGxiYWNrID0gaSwgXG4gICAgICAgIHRoaXMuZGVmZXJyZWQgPSBuZXcgUSwgdGhpcy50aGVuID0gdGhpcy5kZWZlcnJlZC5wcm9taXNlLnRoZW4uYmluZCh0aGlzLmRlZmVycmVkLnByb21pc2UpLCBcbiAgICAgICAgLy8gSXQncyBub3JtYWwgZm9yIHRoZSBkZWZlcnJlZCBwcm9taXNlIHRvIGJlIGNhbmNlbGVkIChkdWUgdG8gY2FuY2VsbGF0aW9uKVxuICAgICAgICAvLyBhbmQgc28gd2UgYXR0YWNoIGEgZHVtbXkgY2F0Y2ggY2FsbGJhY2sgdG8gYXZvaWRcbiAgICAgICAgLy8gJ1VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25XYXJuaW5nJyBsb2cgc3BhbS5cbiAgICAgICAgdGhpcy5kZWZlcnJlZC5wcm9taXNlLmNhdGNoKCh0ID0+IHt9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBEZWxheWVkT3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIGJlXG4gICAgICogZXhlY3V0ZWQgb24gdGhlIHByb3ZpZGVkIGFzeW5jUXVldWUgYWZ0ZXIgdGhlIHByb3ZpZGVkIGRlbGF5TXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXN5bmNRdWV1ZSAtIFRoZSBxdWV1ZSB0byBzY2hlZHVsZSB0aGUgb3BlcmF0aW9uIG9uLlxuICAgICAqIEBwYXJhbSBpZCAtIEEgVGltZXIgSUQgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoaXMgaXMuXG4gICAgICogQHBhcmFtIGRlbGF5TXMgLSBUaGUgZGVsYXkgKG1zKSBiZWZvcmUgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgc2NoZWR1bGVkLlxuICAgICAqIEBwYXJhbSBvcCAtIFRoZSBvcGVyYXRpb24gdG8gcnVuLlxuICAgICAqIEBwYXJhbSByZW1vdmFsQ2FsbGJhY2sgLSBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IG9uY2UgdGhlXG4gICAgICogICBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgb3IgY2FuY2VsZWQsIG5vdGlmeWluZyB0aGUgQXN5bmNRdWV1ZSB0byByZW1vdmUgaXRcbiAgICAgKiAgIGZyb20gaXRzIGRlbGF5ZWRPcGVyYXRpb25zIGxpc3QuXG4gICAgICogICBQT1JUSU5HIE5PVEU6IFRoaXMgZXhpc3RzIHRvIHByZXZlbnQgbWFraW5nIHJlbW92ZURlbGF5ZWRPcGVyYXRpb24oKSBhbmRcbiAgICAgKiAgIHRoZSBEZWxheWVkT3BlcmF0aW9uIGNsYXNzIHB1YmxpYy5cbiAgICAgKi8gICAgc3RhdGljIGNyZWF0ZUFuZFNjaGVkdWxlKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IERhdGUubm93KCkgKyBuLCBvID0gbmV3IEZvKHQsIGUsIHIsIHMsIGkpO1xuICAgICAgICByZXR1cm4gby5zdGFydChuKSwgbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSB0aW1lci4gVGhpcyBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uIGJ5XG4gICAgICogY3JlYXRlQW5kU2NoZWR1bGUoKS5cbiAgICAgKi8gICAgc3RhcnQodCkge1xuICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gc2V0VGltZW91dCgoKCkgPT4gdGhpcy5oYW5kbGVEZWxheUVsYXBzZWQoKSksIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWV1ZXMgdGhlIG9wZXJhdGlvbiB0byBydW4gaW1tZWRpYXRlbHkgKGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gcnVuIG9yXG4gICAgICogY2FuY2VsZWQpLlxuICAgICAqLyAgICBza2lwRGVsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZURlbGF5RWxhcHNlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBvcGVyYXRpb24gaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBleGVjdXRlZCBvciBjYW5jZWxlZC4gVGhlXG4gICAgICogcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkLlxuICAgICAqXG4gICAgICogQXMgbG9uZyBhcyB0aGUgb3BlcmF0aW9uIGhhcyBub3QgeWV0IGJlZW4gcnVuLCBjYWxsaW5nIGNhbmNlbCgpIHByb3ZpZGVzIGFcbiAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgb3BlcmF0aW9uIHdpbGwgbm90IGJlIHJ1bi5cbiAgICAgKi8gICAgY2FuY2VsKHQpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy50aW1lckhhbmRsZSAmJiAodGhpcy5jbGVhclRpbWVvdXQoKSwgdGhpcy5kZWZlcnJlZC5yZWplY3QobmV3IGooSy5DQU5DRUxMRUQsIFwiT3BlcmF0aW9uIGNhbmNlbGxlZFwiICsgKHQgPyBcIjogXCIgKyB0IDogXCJcIikpKSk7XG4gICAgfVxuICAgIGhhbmRsZURlbGF5RWxhcHNlZCgpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgPyAodGhpcy5jbGVhclRpbWVvdXQoKSwgXG4gICAgICAgIHRoaXMub3AoKS50aGVuKCh0ID0+IHRoaXMuZGVmZXJyZWQucmVzb2x2ZSh0KSkpKSA6IFByb21pc2UucmVzb2x2ZSgpKSk7XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCgpIHtcbiAgICAgICAgbnVsbCAhPT0gdGhpcy50aW1lckhhbmRsZSAmJiAodGhpcy5yZW1vdmFsQ2FsbGJhY2sodGhpcyksIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySGFuZGxlKSwgXG4gICAgICAgIHRoaXMudGltZXJIYW5kbGUgPSBudWxsKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEZpcmVzdG9yZUVycm9yIHRoYXQgY2FuIGJlIHN1cmZhY2VkIHRvIHRoZSB1c2VyIGlmIHRoZSBwcm92aWRlZFxuICogZXJyb3IgaXMgYW4gSW5kZXhlZERiVHJhbnNhY3Rpb25FcnJvci4gUmUtdGhyb3dzIHRoZSBlcnJvciBvdGhlcndpc2UuXG4gKi8gZnVuY3Rpb24gT28odCwgZSkge1xuICAgIGlmIChGKFwiQXN5bmNRdWV1ZVwiLCBgJHtlfTogJHt0fWApLCBYcyh0KSkgcmV0dXJuIG5ldyBqKEsuVU5BVkFJTEFCTEUsIGAke2V9OiAke3R9YCk7XG4gICAgdGhyb3cgdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRG9jdW1lbnRTZXQgaXMgYW4gaW1tdXRhYmxlIChjb3B5LW9uLXdyaXRlKSBjb2xsZWN0aW9uIHRoYXQgaG9sZHMgZG9jdW1lbnRzXG4gKiBpbiBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIHByb3ZpZGVkIGNvbXBhcmF0b3IuIFdlIGFsd2F5cyBhZGQgYSBkb2N1bWVudCBrZXlcbiAqIGNvbXBhcmF0b3Igb24gdG9wIG9mIHdoYXQgaXMgcHJvdmlkZWQgdG8gZ3VhcmFudGVlIGRvY3VtZW50IGVxdWFsaXR5IGJhc2VkIG9uXG4gKiB0aGUga2V5LlxuICovIGNsYXNzIE1vIHtcbiAgICAvKiogVGhlIGRlZmF1bHQgb3JkZXJpbmcgaXMgYnkga2V5IGlmIHRoZSBjb21wYXJhdG9yIGlzIG9taXR0ZWQgKi9cbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIC8vIFdlIGFyZSBhZGRpbmcgZG9jdW1lbnQga2V5IGNvbXBhcmF0b3IgdG8gdGhlIGVuZCBhcyBpdCdzIHRoZSBvbmx5XG4gICAgICAgIC8vIGd1YXJhbnRlZWQgdW5pcXVlIHByb3BlcnR5IG9mIGEgZG9jdW1lbnQuXG4gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IHQgPyAoZSwgbikgPT4gdChlLCBuKSB8fCBTdC5jb21wYXJhdG9yKGUua2V5LCBuLmtleSkgOiAodCwgZSkgPT4gU3QuY29tcGFyYXRvcih0LmtleSwgZS5rZXkpLCBcbiAgICAgICAgdGhpcy5rZXllZE1hcCA9IFBuKCksIHRoaXMuc29ydGVkU2V0ID0gbmV3IGduKHRoaXMuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gZW1wdHkgY29weSBvZiB0aGUgZXhpc3RpbmcgRG9jdW1lbnRTZXQsIHVzaW5nIHRoZSBzYW1lXG4gICAgICogY29tcGFyYXRvci5cbiAgICAgKi8gICAgc3RhdGljIGVtcHR5U2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNbyh0LmNvbXBhcmF0b3IpO1xuICAgIH1cbiAgICBoYXModCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPSB0aGlzLmtleWVkTWFwLmdldCh0KTtcbiAgICB9XG4gICAgZ2V0KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5ZWRNYXAuZ2V0KHQpO1xuICAgIH1cbiAgICBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkU2V0Lm1pbktleSgpO1xuICAgIH1cbiAgICBsYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRTZXQubWF4S2V5KCk7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcm92aWRlZCBrZXkgaW4gdGhlIGRvY3VtZW50IHNldCwgb3IgLTEgaWYgdGhlXG4gICAgICogZG9jdW1lbnQga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBzZXQ7XG4gICAgICovICAgIGluZGV4T2YodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5rZXllZE1hcC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlID8gdGhpcy5zb3J0ZWRTZXQuaW5kZXhPZihlKSA6IC0xO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkU2V0LnNpemU7XG4gICAgfVxuICAgIC8qKiBJdGVyYXRlcyBkb2N1bWVudHMgaW4gb3JkZXIgZGVmaW5lZCBieSBcImNvbXBhcmF0b3JcIiAqLyAgICBmb3JFYWNoKHQpIHtcbiAgICAgICAgdGhpcy5zb3J0ZWRTZXQuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0KGUpLCAhMSkpKTtcbiAgICB9XG4gICAgLyoqIEluc2VydHMgb3IgdXBkYXRlcyBhIGRvY3VtZW50IHdpdGggdGhlIHNhbWUga2V5ICovICAgIGFkZCh0KSB7XG4gICAgICAgIC8vIEZpcnN0IHJlbW92ZSB0aGUgZWxlbWVudCBpZiB3ZSBoYXZlIGl0LlxuICAgICAgICBjb25zdCBlID0gdGhpcy5kZWxldGUodC5rZXkpO1xuICAgICAgICByZXR1cm4gZS5jb3B5KGUua2V5ZWRNYXAuaW5zZXJ0KHQua2V5LCB0KSwgZS5zb3J0ZWRTZXQuaW5zZXJ0KHQsIG51bGwpKTtcbiAgICB9XG4gICAgLyoqIERlbGV0ZXMgYSBkb2N1bWVudCB3aXRoIGEgZ2l2ZW4ga2V5ICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmdldCh0KTtcbiAgICAgICAgcmV0dXJuIGUgPyB0aGlzLmNvcHkodGhpcy5rZXllZE1hcC5yZW1vdmUodCksIHRoaXMuc29ydGVkU2V0LnJlbW92ZShlKSkgOiB0aGlzO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIE1vKSkgcmV0dXJuICExO1xuICAgICAgICBpZiAodGhpcy5zaXplICE9PSB0LnNpemUpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuc29ydGVkU2V0LmdldEl0ZXJhdG9yKCksIG4gPSB0LnNvcnRlZFNldC5nZXRJdGVyYXRvcigpO1xuICAgICAgICBmb3IgKDtlLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5nZXROZXh0KCkua2V5LCBzID0gbi5nZXROZXh0KCkua2V5O1xuICAgICAgICAgICAgaWYgKCF0LmlzRXF1YWwocykpIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgdC5wdXNoKGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0pKSwgMCA9PT0gdC5sZW5ndGggPyBcIkRvY3VtZW50U2V0ICgpXCIgOiBcIkRvY3VtZW50U2V0IChcXG4gIFwiICsgdC5qb2luKFwiICBcXG5cIikgKyBcIlxcbilcIjtcbiAgICB9XG4gICAgY29weSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTW87XG4gICAgICAgIHJldHVybiBuLmNvbXBhcmF0b3IgPSB0aGlzLmNvbXBhcmF0b3IsIG4ua2V5ZWRNYXAgPSB0LCBuLnNvcnRlZFNldCA9IGUsIG47XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBEb2N1bWVudENoYW5nZVNldCBrZWVwcyB0cmFjayBvZiBhIHNldCBvZiBjaGFuZ2VzIHRvIGRvY3MgaW4gYSBxdWVyeSwgbWVyZ2luZ1xuICogZHVwbGljYXRlIGV2ZW50cyBmb3IgdGhlIHNhbWUgZG9jLlxuICovIGNsYXNzIExvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbyA9IG5ldyBnbihTdC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgdHJhY2sodCkge1xuICAgICAgICBjb25zdCBlID0gdC5kb2Mua2V5LCBuID0gdGhpcy5lby5nZXQoZSk7XG4gICAgICAgIG4gPyBcbiAgICAgICAgLy8gTWVyZ2UgdGhlIG5ldyBjaGFuZ2Ugd2l0aCB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuICAgICAgICAwIC8qIEFkZGVkICovICE9PSB0LnR5cGUgJiYgMyAvKiBNZXRhZGF0YSAqLyA9PT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8uaW5zZXJ0KGUsIHQpIDogMyAvKiBNZXRhZGF0YSAqLyA9PT0gdC50eXBlICYmIDEgLyogUmVtb3ZlZCAqLyAhPT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8uaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IG4udHlwZSxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiAyIC8qIE1vZGlmaWVkICovID09PSB0LnR5cGUgJiYgMiAvKiBNb2RpZmllZCAqLyA9PT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8uaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDIgLyogTW9kaWZpZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiB0LmRvY1xuICAgICAgICB9KSA6IDIgLyogTW9kaWZpZWQgKi8gPT09IHQudHlwZSAmJiAwIC8qIEFkZGVkICovID09PSBuLnR5cGUgPyB0aGlzLmVvID0gdGhpcy5lby5pbnNlcnQoZSwge1xuICAgICAgICAgICAgdHlwZTogMCAvKiBBZGRlZCAqLyAsXG4gICAgICAgICAgICBkb2M6IHQuZG9jXG4gICAgICAgIH0pIDogMSAvKiBSZW1vdmVkICovID09PSB0LnR5cGUgJiYgMCAvKiBBZGRlZCAqLyA9PT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8ucmVtb3ZlKGUpIDogMSAvKiBSZW1vdmVkICovID09PSB0LnR5cGUgJiYgMiAvKiBNb2RpZmllZCAqLyA9PT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8uaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDEgLyogUmVtb3ZlZCAqLyAsXG4gICAgICAgICAgICBkb2M6IG4uZG9jXG4gICAgICAgIH0pIDogMCAvKiBBZGRlZCAqLyA9PT0gdC50eXBlICYmIDEgLyogUmVtb3ZlZCAqLyA9PT0gbi50eXBlID8gdGhpcy5lbyA9IHRoaXMuZW8uaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDIgLyogTW9kaWZpZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiB0LmRvY1xuICAgICAgICB9KSA6IFxuICAgICAgICAvLyBUaGlzIGluY2x1ZGVzIHRoZXNlIGNhc2VzLCB3aGljaCBkb24ndCBtYWtlIHNlbnNlOlxuICAgICAgICAvLyBBZGRlZC0+QWRkZWRcbiAgICAgICAgLy8gUmVtb3ZlZC0+UmVtb3ZlZFxuICAgICAgICAvLyBNb2RpZmllZC0+QWRkZWRcbiAgICAgICAgLy8gUmVtb3ZlZC0+TW9kaWZpZWRcbiAgICAgICAgLy8gTWV0YWRhdGEtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPk1ldGFkYXRhXG4gICAgICAgIEwoKSA6IHRoaXMuZW8gPSB0aGlzLmVvLmluc2VydChlLCB0KTtcbiAgICB9XG4gICAgbm8oKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW8uaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIHQucHVzaChuKTtcbiAgICAgICAgfSkpLCB0O1xuICAgIH1cbn1cblxuY2xhc3MgQm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIsIG8sIGEpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuZG9jcyA9IGUsIHRoaXMub2xkRG9jcyA9IG4sIHRoaXMuZG9jQ2hhbmdlcyA9IHMsIHRoaXMubXV0YXRlZEtleXMgPSBpLCBcbiAgICAgICAgdGhpcy5mcm9tQ2FjaGUgPSByLCB0aGlzLnN5bmNTdGF0ZUNoYW5nZWQgPSBvLCB0aGlzLmV4Y2x1ZGVzTWV0YWRhdGFDaGFuZ2VzID0gYTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSB2aWV3IHNuYXBzaG90IGFzIGlmIGFsbCBkb2N1bWVudHMgaW4gdGhlIHNuYXBzaG90IHdlcmUgYWRkZWQuICovICAgIHN0YXRpYyBmcm9tSW5pdGlhbERvY3VtZW50cyh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBpLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IDAgLyogQWRkZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKSwgbmV3IEJvKHQsIGUsIE1vLmVtcHR5U2V0KGUpLCBpLCBuLCBzLCBcbiAgICAgICAgLyogc3luY1N0YXRlQ2hhbmdlZD0gKi8gITAsIFxuICAgICAgICAvKiBleGNsdWRlc01ldGFkYXRhQ2hhbmdlcz0gKi8gITEpO1xuICAgIH1cbiAgICBnZXQgaGFzUGVuZGluZ1dyaXRlcygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLm11dGF0ZWRLZXlzLmlzRW1wdHkoKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHRoaXMuZnJvbUNhY2hlID09PSB0LmZyb21DYWNoZSAmJiB0aGlzLnN5bmNTdGF0ZUNoYW5nZWQgPT09IHQuc3luY1N0YXRlQ2hhbmdlZCAmJiB0aGlzLm11dGF0ZWRLZXlzLmlzRXF1YWwodC5tdXRhdGVkS2V5cykgJiYgYmUodGhpcy5xdWVyeSwgdC5xdWVyeSkgJiYgdGhpcy5kb2NzLmlzRXF1YWwodC5kb2NzKSAmJiB0aGlzLm9sZERvY3MuaXNFcXVhbCh0Lm9sZERvY3MpKSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5kb2NDaGFuZ2VzLCBuID0gdC5kb2NDaGFuZ2VzO1xuICAgICAgICBpZiAoZS5sZW5ndGggIT09IG4ubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgaWYgKGVbdF0udHlwZSAhPT0gblt0XS50eXBlIHx8ICFlW3RdLmRvYy5pc0VxdWFsKG5bdF0uZG9jKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBIb2xkcyB0aGUgbGlzdGVuZXJzIGFuZCB0aGUgbGFzdCByZWNlaXZlZCBWaWV3U25hcHNob3QgZm9yIGEgcXVlcnkgYmVpbmdcbiAqIHRyYWNrZWQgYnkgRXZlbnRNYW5hZ2VyLlxuICovIGNsYXNzIFVvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zbyA9IHZvaWQgMCwgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICB9XG59XG5cbmNsYXNzIHFvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5xdWVyaWVzID0gbmV3IEdpKCh0ID0+IHZlKHQpKSwgYmUpLCB0aGlzLm9ubGluZVN0YXRlID0gXCJVbmtub3duXCIgLyogVW5rbm93biAqLyAsIFxuICAgICAgICB0aGlzLmlvID0gbmV3IFNldDtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIEtvKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KSwgcyA9IGUucXVlcnk7XG4gICAgbGV0IGkgPSAhMSwgciA9IG4ucXVlcmllcy5nZXQocyk7XG4gICAgaWYgKHIgfHwgKGkgPSAhMCwgciA9IG5ldyBVbyksIGkpIHRyeSB7XG4gICAgICAgIHIuc28gPSBhd2FpdCBuLm9uTGlzdGVuKHMpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgY29uc3QgbiA9IE9vKHQsIGBJbml0aWFsaXphdGlvbiBvZiBxdWVyeSAnJHtWZShlLnF1ZXJ5KX0nIGZhaWxlZGApO1xuICAgICAgICByZXR1cm4gdm9pZCBlLm9uRXJyb3Iobik7XG4gICAgfVxuICAgIGlmIChuLnF1ZXJpZXMuc2V0KHMsIHIpLCByLmxpc3RlbmVycy5wdXNoKGUpLCBcbiAgICAvLyBSdW4gZ2xvYmFsIHNuYXBzaG90IGxpc3RlbmVycyBpZiBhIGNvbnNpc3RlbnQgc25hcHNob3QgaGFzIGJlZW4gZW1pdHRlZC5cbiAgICBlLnJvKG4ub25saW5lU3RhdGUpLCByLnNvKSB7XG4gICAgICAgIGUub28oci5zbykgJiYgR28obik7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBqbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCksIHMgPSBlLnF1ZXJ5O1xuICAgIGxldCBpID0gITE7XG4gICAgY29uc3QgciA9IG4ucXVlcmllcy5nZXQocyk7XG4gICAgaWYgKHIpIHtcbiAgICAgICAgY29uc3QgdCA9IHIubGlzdGVuZXJzLmluZGV4T2YoZSk7XG4gICAgICAgIHQgPj0gMCAmJiAoci5saXN0ZW5lcnMuc3BsaWNlKHQsIDEpLCBpID0gMCA9PT0gci5saXN0ZW5lcnMubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKGkpIHJldHVybiBuLnF1ZXJpZXMuZGVsZXRlKHMpLCBuLm9uVW5saXN0ZW4ocyk7XG59XG5cbmZ1bmN0aW9uIFFvKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KTtcbiAgICBsZXQgcyA9ICExO1xuICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnF1ZXJ5LCBpID0gbi5xdWVyaWVzLmdldChlKTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBpLmxpc3RlbmVycykgZS5vbyh0KSAmJiAocyA9ICEwKTtcbiAgICAgICAgICAgIGkuc28gPSB0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHMgJiYgR28obik7XG59XG5cbmZ1bmN0aW9uIFdvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gcSh0KSwgaSA9IHMucXVlcmllcy5nZXQoZSk7XG4gICAgaWYgKGkpIGZvciAoY29uc3QgdCBvZiBpLmxpc3RlbmVycykgdC5vbkVycm9yKG4pO1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzLiBOT1RFOiBXZSBkb24ndCBuZWVkIHRvIGNhbGwgc3luY0VuZ2luZS51bmxpc3RlbigpXG4gICAgLy8gYWZ0ZXIgYW4gZXJyb3IuXG4gICAgICAgIHMucXVlcmllcy5kZWxldGUoZSk7XG59XG5cbi8vIENhbGwgYWxsIGdsb2JhbCBzbmFwc2hvdCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gc2V0LlxuZnVuY3Rpb24gR28odCkge1xuICAgIHQuaW8uZm9yRWFjaCgodCA9PiB7XG4gICAgICAgIHQubmV4dCgpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBRdWVyeUxpc3RlbmVyIHRha2VzIGEgc2VyaWVzIG9mIGludGVybmFsIHZpZXcgc25hcHNob3RzIGFuZCBkZXRlcm1pbmVzXG4gKiB3aGVuIHRvIHJhaXNlIHRoZSBldmVudC5cbiAqXG4gKiBJdCB1c2VzIGFuIE9ic2VydmVyIHRvIGRpc3BhdGNoIGV2ZW50cy5cbiAqLyBjbGFzcyB6byB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gdCwgdGhpcy5hbyA9IGUsIFxuICAgICAgICAvKipcbiAgICAgICAgICogSW5pdGlhbCBzbmFwc2hvdHMgKGUuZy4gZnJvbSBjYWNoZSkgbWF5IG5vdCBiZSBwcm9wYWdhdGVkIHRvIHRoZSB3cmFwcGVkXG4gICAgICAgICAqIG9ic2VydmVyLiBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgb25jZSB3ZSd2ZSBhY3R1YWxseSByYWlzZWQgYW4gZXZlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvID0gITEsIHRoaXMudW8gPSBudWxsLCB0aGlzLm9ubGluZVN0YXRlID0gXCJVbmtub3duXCIgLyogVW5rbm93biAqLyAsIHRoaXMub3B0aW9ucyA9IG4gfHwge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIG5ldyBWaWV3U25hcHNob3QgdG8gdGhpcyBsaXN0ZW5lciwgcmFpc2luZyBhIHVzZXItZmFjaW5nIGV2ZW50XG4gICAgICogaWYgYXBwbGljYWJsZSAoZGVwZW5kaW5nIG9uIHdoYXQgY2hhbmdlZCwgd2hldGhlciB0aGUgdXNlciBoYXMgb3B0ZWQgaW50b1xuICAgICAqIG1ldGFkYXRhLW9ubHkgY2hhbmdlcywgZXRjLikuIFJldHVybnMgdHJ1ZSBpZiBhIHVzZXItZmFjaW5nIGV2ZW50IHdhc1xuICAgICAqIGluZGVlZCByYWlzZWQuXG4gICAgICovICAgIG9vKHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZXRhZGF0YSBvbmx5IGNoYW5nZXMuXG4gICAgICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdC5kb2NDaGFuZ2VzKSAzIC8qIE1ldGFkYXRhICovICE9PSBuLnR5cGUgJiYgZS5wdXNoKG4pO1xuICAgICAgICAgICAgdCA9IG5ldyBCbyh0LnF1ZXJ5LCB0LmRvY3MsIHQub2xkRG9jcywgZSwgdC5tdXRhdGVkS2V5cywgdC5mcm9tQ2FjaGUsIHQuc3luY1N0YXRlQ2hhbmdlZCwgXG4gICAgICAgICAgICAvKiBleGNsdWRlc01ldGFkYXRhQ2hhbmdlcz0gKi8gITApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlID0gITE7XG4gICAgICAgIHJldHVybiB0aGlzLmNvID8gdGhpcy5obyh0KSAmJiAodGhpcy5hby5uZXh0KHQpLCBlID0gITApIDogdGhpcy5sbyh0LCB0aGlzLm9ubGluZVN0YXRlKSAmJiAodGhpcy5mbyh0KSwgXG4gICAgICAgIGUgPSAhMCksIHRoaXMudW8gPSB0LCBlO1xuICAgIH1cbiAgICBvbkVycm9yKHQpIHtcbiAgICAgICAgdGhpcy5hby5lcnJvcih0KTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgd2hldGhlciBhIHNuYXBzaG90IHdhcyByYWlzZWQuICovICAgIHJvKHQpIHtcbiAgICAgICAgdGhpcy5vbmxpbmVTdGF0ZSA9IHQ7XG4gICAgICAgIGxldCBlID0gITE7XG4gICAgICAgIHJldHVybiB0aGlzLnVvICYmICF0aGlzLmNvICYmIHRoaXMubG8odGhpcy51bywgdCkgJiYgKHRoaXMuZm8odGhpcy51byksIGUgPSAhMCksIFxuICAgICAgICBlO1xuICAgIH1cbiAgICBsbyh0LCBlKSB7XG4gICAgICAgIC8vIEFsd2F5cyByYWlzZSB0aGUgZmlyc3QgZXZlbnQgd2hlbiB3ZSdyZSBzeW5jZWRcbiAgICAgICAgaWYgKCF0LmZyb21DYWNoZSkgcmV0dXJuICEwO1xuICAgICAgICAvLyBOT1RFOiBXZSBjb25zaWRlciBPbmxpbmVTdGF0ZS5Vbmtub3duIGFzIG9ubGluZSAoaXQgc2hvdWxkIGJlY29tZSBPZmZsaW5lXG4gICAgICAgIC8vIG9yIE9ubGluZSBpZiB3ZSB3YWl0IGxvbmcgZW5vdWdoKS5cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gXCJPZmZsaW5lXCIgLyogT2ZmbGluZSAqLyAhPT0gZTtcbiAgICAgICAgLy8gRG9uJ3QgcmFpc2UgdGhlIGV2ZW50IGlmIHdlJ3JlIG9ubGluZSwgYXJlbid0IHN5bmNlZCB5ZXQgKGNoZWNrZWRcbiAgICAgICAgLy8gYWJvdmUpIGFuZCBhcmUgd2FpdGluZyBmb3IgYSBzeW5jLlxuICAgICAgICAgICAgICAgIHJldHVybiAoIXRoaXMub3B0aW9ucy53byB8fCAhbikgJiYgKCF0LmRvY3MuaXNFbXB0eSgpIHx8IFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8gPT09IGUpO1xuICAgICAgICAvLyBSYWlzZSBkYXRhIGZyb20gY2FjaGUgaWYgd2UgaGF2ZSBhbnkgZG9jdW1lbnRzIG9yIHdlIGFyZSBvZmZsaW5lXG4gICAgICAgIH1cbiAgICBobyh0KSB7XG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIGluY2x1ZGVEb2N1bWVudE1ldGFkYXRhQ2hhbmdlcyBoZXJlIGJlY2F1c2VcbiAgICAgICAgLy8gdGhlIE1ldGFkYXRhIG9ubHkgY2hhbmdlcyBoYXZlIGFscmVhZHkgYmVlbiBzdHJpcHBlZCBvdXQgaWYgbmVlZGVkLlxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBvbmx5IGNoYW5nZXMgd2Ugd2lsbCBzZWUgYXJlIHRoZSBvbmVzIHdlIHNob3VsZFxuICAgICAgICAvLyBwcm9wYWdhdGUuXG4gICAgICAgIGlmICh0LmRvY0NoYW5nZXMubGVuZ3RoID4gMCkgcmV0dXJuICEwO1xuICAgICAgICBjb25zdCBlID0gdGhpcy51byAmJiB0aGlzLnVvLmhhc1BlbmRpbmdXcml0ZXMgIT09IHQuaGFzUGVuZGluZ1dyaXRlcztcbiAgICAgICAgcmV0dXJuICEoIXQuc3luY1N0YXRlQ2hhbmdlZCAmJiAhZSkgJiYgITAgPT09IHRoaXMub3B0aW9ucy5pbmNsdWRlTWV0YWRhdGFDaGFuZ2VzO1xuICAgICAgICAvLyBHZW5lcmFsbHkgd2Ugc2hvdWxkIGhhdmUgaGl0IG9uZSBvZiB0aGUgY2FzZXMgYWJvdmUsIGJ1dCBpdCdzIHBvc3NpYmxlXG4gICAgICAgIC8vIHRvIGdldCBoZXJlIGlmIHRoZXJlIHdlcmUgb25seSBtZXRhZGF0YSBkb2NDaGFuZ2VzIGFuZCB0aGV5IGdvdFxuICAgICAgICAvLyBzdHJpcHBlZCBvdXQuXG4gICAgICAgIH1cbiAgICBmbyh0KSB7XG4gICAgICAgIHQgPSBCby5mcm9tSW5pdGlhbERvY3VtZW50cyh0LnF1ZXJ5LCB0LmRvY3MsIHQubXV0YXRlZEtleXMsIHQuZnJvbUNhY2hlKSwgdGhpcy5jbyA9ICEwLCBcbiAgICAgICAgdGhpcy5hby5uZXh0KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb21wbGV0ZSBlbGVtZW50IGluIHRoZSBidW5kbGUgc3RyZWFtLCB0b2dldGhlciB3aXRoIHRoZSBieXRlIGxlbmd0aCBpdFxuICogb2NjdXBpZXMgaW4gdGhlIHN0cmVhbS5cbiAqLyBjbGFzcyBIbyB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLy8gSG93IG1hbnkgYnl0ZXMgdGhpcyBlbGVtZW50IHRha2VzIHRvIHN0b3JlIGluIHRoZSBidW5kbGUuXG4gICAgZSkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB0LCB0aGlzLmJ5dGVMZW5ndGggPSBlO1xuICAgIH1cbiAgICBfbygpIHtcbiAgICAgICAgcmV0dXJuIFwibWV0YWRhdGFcIiBpbiB0aGlzLnBheWxvYWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBvYmplY3RzIGZyb20gYnVuZGxlcyB0byBtb2RlbCBvYmplY3RzIGluIHRoZSBTREsuXG4gKi8gY2xhc3MgSm8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5rID0gdDtcbiAgICB9XG4gICAgSG4odCkge1xuICAgICAgICByZXR1cm4gWW4odGhpcy5rLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBCdW5kbGVEb2N1bWVudCB0byBhIE11dGFibGVEb2N1bWVudC5cbiAgICAgKi8gICAgSm4odCkge1xuICAgICAgICByZXR1cm4gdC5tZXRhZGF0YS5leGlzdHMgPyBzcyh0aGlzLmssIHQuZG9jdW1lbnQsICExKSA6IFd0Lm5ld05vRG9jdW1lbnQodGhpcy5Ibih0Lm1ldGFkYXRhLm5hbWUpLCB0aGlzLlluKHQubWV0YWRhdGEucmVhZFRpbWUpKTtcbiAgICB9XG4gICAgWW4odCkge1xuICAgICAgICByZXR1cm4gR24odCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdG8gcHJvY2VzcyB0aGUgZWxlbWVudHMgZnJvbSBhIGJ1bmRsZSwgbG9hZCB0aGVtIGludG8gbG9jYWxcbiAqIHN0b3JhZ2UgYW5kIHByb3ZpZGUgcHJvZ3Jlc3MgdXBkYXRlIHdoaWxlIGxvYWRpbmcuXG4gKi8gY2xhc3MgWW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5tbyA9IHQsIHRoaXMubG9jYWxTdG9yZSA9IGUsIHRoaXMuayA9IG4sIFxuICAgICAgICAvKiogQmF0Y2hlZCBxdWVyaWVzIHRvIGJlIHNhdmVkIGludG8gc3RvcmFnZSAqL1xuICAgICAgICB0aGlzLnF1ZXJpZXMgPSBbXSwgXG4gICAgICAgIC8qKiBCYXRjaGVkIGRvY3VtZW50cyB0byBiZSBzYXZlZCBpbnRvIHN0b3JhZ2UgKi9cbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXSwgdGhpcy5wcm9ncmVzcyA9IFhvKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGVsZW1lbnQgZnJvbSB0aGUgYnVuZGxlIHRvIHRoZSBsb2FkZXIuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHByb2dyZXNzIGlmIGFkZGluZyB0aGUgZWxlbWVudCBsZWFkcyB0byBhIG5ldyBwcm9ncmVzcyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICAgICAqLyAgICB5byh0KSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuYnl0ZXNMb2FkZWQgKz0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICBsZXQgZSA9IHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkO1xuICAgICAgICByZXR1cm4gdC5wYXlsb2FkLm5hbWVkUXVlcnkgPyB0aGlzLnF1ZXJpZXMucHVzaCh0LnBheWxvYWQubmFtZWRRdWVyeSkgOiB0LnBheWxvYWQuZG9jdW1lbnRNZXRhZGF0YSA/ICh0aGlzLmRvY3VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0LnBheWxvYWQuZG9jdW1lbnRNZXRhZGF0YVxuICAgICAgICB9KSwgdC5wYXlsb2FkLmRvY3VtZW50TWV0YWRhdGEuZXhpc3RzIHx8ICsrZSkgOiB0LnBheWxvYWQuZG9jdW1lbnQgJiYgKHRoaXMuZG9jdW1lbnRzW3RoaXMuZG9jdW1lbnRzLmxlbmd0aCAtIDFdLmRvY3VtZW50ID0gdC5wYXlsb2FkLmRvY3VtZW50LCBcbiAgICAgICAgKytlKSwgZSAhPT0gdGhpcy5wcm9ncmVzcy5kb2N1bWVudHNMb2FkZWQgPyAodGhpcy5wcm9ncmVzcy5kb2N1bWVudHNMb2FkZWQgPSBlLCBcbiAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9ncmVzcykpIDogbnVsbDtcbiAgICB9XG4gICAgcG8odCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IE1hcCwgbiA9IG5ldyBKbyh0aGlzLmspO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdCkgaWYgKHMubWV0YWRhdGEucXVlcmllcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG4uSG4ocy5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBzLm1ldGFkYXRhLnF1ZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gKGUuZ2V0KG4pIHx8IFNuKCkpLmFkZCh0KTtcbiAgICAgICAgICAgICAgICBlLnNldChuLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwcm9ncmVzcyB0byAnU3VjY2VzcycgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBwcm9ncmVzcy5cbiAgICAgKi8gICAgYXN5bmMgY29tcGxldGUoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBQcih0aGlzLmxvY2FsU3RvcmUsIG5ldyBKbyh0aGlzLmspLCB0aGlzLmRvY3VtZW50cywgdGhpcy5tby5pZCksIGUgPSB0aGlzLnBvKHRoaXMuZG9jdW1lbnRzKTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMucXVlcmllcykgYXdhaXQgYnIodGhpcy5sb2NhbFN0b3JlLCB0LCBlLmdldCh0Lm5hbWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MudGFza1N0YXRlID0gXCJTdWNjZXNzXCIsIG5ldyBhcihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb2dyZXNzKSwgdCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBgTG9hZEJ1bmRsZVRhc2tQcm9ncmVzc2AgcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsIHByb2dyZXNzIG9mXG4gKiBsb2FkaW5nIGEgYnVuZGxlLlxuICovIGZ1bmN0aW9uIFhvKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YXNrU3RhdGU6IFwiUnVubmluZ1wiLFxuICAgICAgICBkb2N1bWVudHNMb2FkZWQ6IDAsXG4gICAgICAgIGJ5dGVzTG9hZGVkOiAwLFxuICAgICAgICB0b3RhbERvY3VtZW50czogdC50b3RhbERvY3VtZW50cyxcbiAgICAgICAgdG90YWxCeXRlczogdC50b3RhbEJ5dGVzXG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHJlcHJlc2VudGluZyB0aGUgcHJvZ3Jlc3MgdGhhdCB0aGUgbG9hZGluZ1xuICogaGFzIHN1Y2NlZWRlZC5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNsYXNzIFpvIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2V5ID0gdDtcbiAgICB9XG59XG5cbmNsYXNzIHRhIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2V5ID0gdDtcbiAgICB9XG59XG5cbi8qKlxuICogVmlldyBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHRoZSBmaW5hbCBtZXJnZWQgdHJ1dGggb2Ygd2hhdCBkb2NzIGFyZSBpblxuICogYSBxdWVyeS4gSXQgZ2V0cyBub3RpZmllZCBvZiBsb2NhbCBhbmQgcmVtb3RlIGNoYW5nZXMgdG8gZG9jcywgYW5kIGFwcGxpZXNcbiAqIHRoZSBxdWVyeSBmaWx0ZXJzIGFuZCBsaW1pdHMgdG8gZGV0ZXJtaW5lIHRoZSBtb3N0IGNvcnJlY3QgcG9zc2libGUgcmVzdWx0cy5cbiAqLyBjbGFzcyBlYSB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLyoqIERvY3VtZW50cyBpbmNsdWRlZCBpbiB0aGUgcmVtb3RlIHRhcmdldCAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuVG8gPSBlLCB0aGlzLkVvID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZsYWcgd2hldGhlciB0aGUgdmlldyBpcyBjdXJyZW50IHdpdGggdGhlIGJhY2tlbmQuIEEgdmlldyBpcyBjb25zaWRlcmVkXG4gICAgICAgICAqIGN1cnJlbnQgYWZ0ZXIgaXQgaGFzIHNlZW4gdGhlIGN1cnJlbnQgZmxhZyBmcm9tIHRoZSBiYWNrZW5kIGFuZCBkaWQgbm90XG4gICAgICAgICAqIGxvc2UgY29uc2lzdGVuY3kgd2l0aGluIHRoZSB3YXRjaCBzdHJlYW0gKGUuZy4gYmVjYXVzZSBvZiBhbiBleGlzdGVuY2VcbiAgICAgICAgICogZmlsdGVyIG1pc21hdGNoKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudCA9ICExLCBcbiAgICAgICAgLyoqIERvY3VtZW50cyBpbiB0aGUgdmlldyBidXQgbm90IGluIHRoZSByZW1vdGUgdGFyZ2V0ICovXG4gICAgICAgIHRoaXMuSW8gPSBTbigpLCBcbiAgICAgICAgLyoqIERvY3VtZW50IEtleXMgdGhhdCBoYXZlIGxvY2FsIGNoYW5nZXMgKi9cbiAgICAgICAgdGhpcy5tdXRhdGVkS2V5cyA9IFNuKCksIHRoaXMuQW8gPSBEZSh0KSwgdGhpcy5SbyA9IG5ldyBNbyh0aGlzLkFvKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiByZW1vdGUgZG9jdW1lbnRzIHRoYXQgdGhlIHNlcnZlciBoYXMgdG9sZCB1cyBiZWxvbmdzIHRvIHRoZSB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogdGhpcyB2aWV3LlxuICAgICAqLyAgICBnZXQgUG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlRvO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGEgc2V0IG9mIGRvYyBjaGFuZ2VzLCBhcHBsaWVzIHRoZSBxdWVyeSBsaW1pdCwgYW5kIGNvbXB1dGVzXG4gICAgICogd2hhdCB0aGUgbmV3IHJlc3VsdHMgc2hvdWxkIGJlLCB3aGF0IHRoZSBjaGFuZ2VzIHdlcmUsIGFuZCB3aGV0aGVyIHdlIG1heVxuICAgICAqIG5lZWQgdG8gZ28gYmFjayB0byB0aGUgbG9jYWwgY2FjaGUgZm9yIG1vcmUgcmVzdWx0cy4gRG9lcyBub3QgbWFrZSBhbnlcbiAgICAgKiBjaGFuZ2VzIHRvIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSBkb2NDaGFuZ2VzIC0gVGhlIGRvYyBjaGFuZ2VzIHRvIGFwcGx5IHRvIHRoaXMgdmlldy5cbiAgICAgKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2VzIC0gSWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgd2l0aCBhIHJlZmlsbCwgdGhlbiBzdGFydFxuICAgICAqICAgICAgICB3aXRoIHRoaXMgc2V0IG9mIGRvY3MgYW5kIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2aWV3LlxuICAgICAqIEByZXR1cm5zIGEgbmV3IHNldCBvZiBkb2NzLCBjaGFuZ2VzLCBhbmQgcmVmaWxsIGZsYWcuXG4gICAgICovICAgIGJvKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgPyBlLnZvIDogbmV3IExvLCBzID0gZSA/IGUuUm8gOiB0aGlzLlJvO1xuICAgICAgICBsZXQgaSA9IGUgPyBlLm11dGF0ZWRLZXlzIDogdGhpcy5tdXRhdGVkS2V5cywgciA9IHMsIG8gPSAhMTtcbiAgICAgICAgLy8gVHJhY2sgdGhlIGxhc3QgZG9jIGluIGEgKGZ1bGwpIGxpbWl0LiBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSBzb21lXG4gICAgICAgIC8vIHVwZGF0ZSAoYSBkZWxldGUsIG9yIGFuIHVwZGF0ZSBtb3ZpbmcgYSBkb2MgcGFzdCB0aGUgb2xkIGxpbWl0KSBtaWdodFxuICAgICAgICAvLyBtZWFuIHRoZXJlIGlzIHNvbWUgb3RoZXIgZG9jdW1lbnQgaW4gdGhlIGxvY2FsIGNhY2hlIHRoYXQgZWl0aGVyIHNob3VsZFxuICAgICAgICAvLyBjb21lICgxKSBiZXR3ZWVuIHRoZSBvbGQgbGFzdCBsaW1pdCBkb2MgYW5kIHRoZSBuZXcgbGFzdCBkb2N1bWVudCwgaW4gdGhlXG4gICAgICAgIC8vIGNhc2Ugb2YgdXBkYXRlcywgb3IgKDIpIGFmdGVyIHRoZSBuZXcgbGFzdCBkb2N1bWVudCwgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgICAgLy8gZGVsZXRlcy4gU28gd2Uga2VlcCB0aGlzIGRvYyBhdCB0aGUgb2xkIGxpbWl0IHRvIGNvbXBhcmUgdGhlIHVwZGF0ZXMgdG8uXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBuZXZlciBnZXQgdXNlZCBpbiBhIHJlZmlsbCAod2hlbiBwcmV2aW91c0NoYW5nZXMgaXNcbiAgICAgICAgLy8gc2V0KSwgYmVjYXVzZSB0aGVyZSB3aWxsIG9ubHkgYmUgYWRkcyAtLSBubyBkZWxldGVzIG9yIHVwZGF0ZXMuXG4gICAgICAgIGNvbnN0IGEgPSB5ZSh0aGlzLnF1ZXJ5KSAmJiBzLnNpemUgPT09IHRoaXMucXVlcnkubGltaXQgPyBzLmxhc3QoKSA6IG51bGwsIGMgPSBwZSh0aGlzLnF1ZXJ5KSAmJiBzLnNpemUgPT09IHRoaXMucXVlcnkubGltaXQgPyBzLmZpcnN0KCkgOiBudWxsO1xuICAgICAgICAvLyBEcm9wIGRvY3VtZW50cyBvdXQgdG8gbWVldCBsaW1pdC9saW1pdFRvTGFzdCByZXF1aXJlbWVudC5cbiAgICAgICAgaWYgKHQuaW5vcmRlclRyYXZlcnNhbCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBzLmdldCh0KSwgaCA9IFNlKHRoaXMucXVlcnksIGUpID8gZSA6IG51bGwsIGwgPSAhIXUgJiYgdGhpcy5tdXRhdGVkS2V5cy5oYXModS5rZXkpLCBmID0gISFoICYmIChoLmhhc0xvY2FsTXV0YXRpb25zIHx8IFxuICAgICAgICAgICAgLy8gV2Ugb25seSBjb25zaWRlciBjb21taXR0ZWQgbXV0YXRpb25zIGZvciBkb2N1bWVudHMgdGhhdCB3ZXJlXG4gICAgICAgICAgICAvLyBtdXRhdGVkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHZpZXcuXG4gICAgICAgICAgICB0aGlzLm11dGF0ZWRLZXlzLmhhcyhoLmtleSkgJiYgaC5oYXNDb21taXR0ZWRNdXRhdGlvbnMpO1xuICAgICAgICAgICAgbGV0IGQgPSAhMTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ICYmIGgpIHtcbiAgICAgICAgICAgICAgICB1LmRhdGEuaXNFcXVhbChoLmRhdGEpID8gbCAhPT0gZiAmJiAobi50cmFjayh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IDMgLyogTWV0YWRhdGEgKi8gLFxuICAgICAgICAgICAgICAgICAgICBkb2M6IGhcbiAgICAgICAgICAgICAgICB9KSwgZCA9ICEwKSA6IHRoaXMuVm8odSwgaCkgfHwgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAyIC8qIE1vZGlmaWVkICovICxcbiAgICAgICAgICAgICAgICAgICAgZG9jOiBoXG4gICAgICAgICAgICAgICAgfSksIGQgPSAhMCwgKGEgJiYgdGhpcy5BbyhoLCBhKSA+IDAgfHwgYyAmJiB0aGlzLkFvKGgsIGMpIDwgMCkgJiYgKFxuICAgICAgICAgICAgICAgIC8vIFRoaXMgZG9jIG1vdmVkIGZyb20gaW5zaWRlIHRoZSBsaW1pdCB0byBvdXRzaWRlIHRoZSBsaW1pdC5cbiAgICAgICAgICAgICAgICAvLyBUaGF0IG1lYW5zIHRoZXJlIG1heSBiZSBzb21lIG90aGVyIGRvYyBpbiB0aGUgbG9jYWwgY2FjaGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgIG8gPSAhMCkpO1xuICAgICAgICAgICAgfSBlbHNlICF1ICYmIGggPyAobi50cmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogMCAvKiBBZGRlZCAqLyAsXG4gICAgICAgICAgICAgICAgZG9jOiBoXG4gICAgICAgICAgICB9KSwgZCA9ICEwKSA6IHUgJiYgIWggJiYgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgIHR5cGU6IDEgLyogUmVtb3ZlZCAqLyAsXG4gICAgICAgICAgICAgICAgZG9jOiB1XG4gICAgICAgICAgICB9KSwgZCA9ICEwLCAoYSB8fCBjKSAmJiAoXG4gICAgICAgICAgICAvLyBBIGRvYyB3YXMgcmVtb3ZlZCBmcm9tIGEgZnVsbCBsaW1pdCBxdWVyeS4gV2UnbGwgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVxdWVyeSBmcm9tIHRoZSBsb2NhbCBjYWNoZSB0byBzZWUgaWYgd2Uga25vdyBhYm91dCBzb21lIG90aGVyXG4gICAgICAgICAgICAvLyBkb2MgdGhhdCBzaG91bGQgYmUgaW4gdGhlIHJlc3VsdHMuXG4gICAgICAgICAgICBvID0gITApKTtcbiAgICAgICAgICAgIGQgJiYgKGggPyAociA9IHIuYWRkKGgpLCBpID0gZiA/IGkuYWRkKHQpIDogaS5kZWxldGUodCkpIDogKHIgPSByLmRlbGV0ZSh0KSwgaSA9IGkuZGVsZXRlKHQpKSk7XG4gICAgICAgIH0pKSwgeWUodGhpcy5xdWVyeSkgfHwgcGUodGhpcy5xdWVyeSkpIGZvciAoO3Iuc2l6ZSA+IHRoaXMucXVlcnkubGltaXQ7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHllKHRoaXMucXVlcnkpID8gci5sYXN0KCkgOiByLmZpcnN0KCk7XG4gICAgICAgICAgICByID0gci5kZWxldGUodC5rZXkpLCBpID0gaS5kZWxldGUodC5rZXkpLCBuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxIC8qIFJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFJvOiByLFxuICAgICAgICAgICAgdm86IG4sXG4gICAgICAgICAgICBCbjogbyxcbiAgICAgICAgICAgIG11dGF0ZWRLZXlzOiBpXG4gICAgICAgIH07XG4gICAgfVxuICAgIFZvKHQsIGUpIHtcbiAgICAgICAgLy8gV2Ugc3VwcHJlc3MgdGhlIGluaXRpYWwgY2hhbmdlIGV2ZW50IGZvciBkb2N1bWVudHMgdGhhdCB3ZXJlIG1vZGlmaWVkIGFzXG4gICAgICAgIC8vIHBhcnQgb2YgYSB3cml0ZSBhY2tub3dsZWRnbWVudCAoZS5nLiB3aGVuIHRoZSB2YWx1ZSBvZiBhIHNlcnZlciB0cmFuc2Zvcm1cbiAgICAgICAgLy8gaXMgYXBwbGllZCkgYXMgV2F0Y2ggd2lsbCBzZW5kIHVzIHRoZSBzYW1lIGRvY3VtZW50IGFnYWluLlxuICAgICAgICAvLyBCeSBzdXBwcmVzc2luZyB0aGUgZXZlbnQsIHdlIG9ubHkgcmFpc2UgdHdvIHVzZXIgdmlzaWJsZSBldmVudHMgKG9uZSB3aXRoXG4gICAgICAgIC8vIGBoYXNQZW5kaW5nV3JpdGVzYCBhbmQgdGhlIGZpbmFsIHN0YXRlIG9mIHRoZSBkb2N1bWVudCkgaW5zdGVhZCBvZiB0aHJlZVxuICAgICAgICAvLyAob25lIHdpdGggYGhhc1BlbmRpbmdXcml0ZXNgLCB0aGUgbW9kaWZpZWQgZG9jdW1lbnQgd2l0aFxuICAgICAgICAvLyBgaGFzUGVuZGluZ1dyaXRlc2AgYW5kIHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQpLlxuICAgICAgICByZXR1cm4gdC5oYXNMb2NhbE11dGF0aW9ucyAmJiBlLmhhc0NvbW1pdHRlZE11dGF0aW9ucyAmJiAhZS5oYXNMb2NhbE11dGF0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBnaXZlbiBWaWV3RG9jdW1lbnRDaGFuZ2VzIGFuZCBvcHRpb25hbGx5IHVwZGF0ZXNcbiAgICAgKiBsaW1ibyBkb2NzIGFuZCBzeW5jIHN0YXRlIGZyb20gdGhlIHByb3ZpZGVkIHRhcmdldCBjaGFuZ2UuXG4gICAgICogQHBhcmFtIGRvY0NoYW5nZXMgLSBUaGUgc2V0IG9mIGNoYW5nZXMgdG8gbWFrZSB0byB0aGUgdmlldydzIGRvY3MuXG4gICAgICogQHBhcmFtIHVwZGF0ZUxpbWJvRG9jdW1lbnRzIC0gV2hldGhlciB0byB1cGRhdGUgbGltYm8gZG9jdW1lbnRzIGJhc2VkIG9uXG4gICAgICogICAgICAgIHRoaXMgY2hhbmdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDaGFuZ2UgLSBBIHRhcmdldCBjaGFuZ2UgdG8gYXBwbHkgZm9yIGNvbXB1dGluZyBsaW1ibyBkb2NzIGFuZFxuICAgICAqICAgICAgICBzeW5jIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFZpZXdDaGFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gZG9jcywgY2hhbmdlcywgYW5kIHN5bmMgc3RhdGUuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBUaGUgaU9TL0FuZHJvaWQgY2xpZW50cyBhbHdheXMgY29tcHV0ZSBsaW1ibyBkb2N1bWVudCBjaGFuZ2VzLlxuICAgIGFwcGx5Q2hhbmdlcyh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLlJvO1xuICAgICAgICB0aGlzLlJvID0gdC5SbywgdGhpcy5tdXRhdGVkS2V5cyA9IHQubXV0YXRlZEtleXM7XG4gICAgICAgIC8vIFNvcnQgY2hhbmdlcyBiYXNlZCBvbiB0eXBlIGFuZCBxdWVyeSBjb21wYXJhdG9yXG4gICAgICAgIGNvbnN0IGkgPSB0LnZvLm5vKCk7XG4gICAgICAgIGkuc29ydCgoKHQsIGUpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBBZGRlZCAqLyA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDIgLyogTW9kaWZpZWQgKi8gOlxuICAgICAgICAgICAgICAgICAgY2FzZSAzIC8qIE1ldGFkYXRhICovIDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBtZXRhZGF0YSBjaGFuZ2UgaXMgY29udmVydGVkIHRvIGEgbW9kaWZpZWQgY2hhbmdlIGF0IHRoZSBwdWJsaWNcbiAgICAgICAgICAgICAgICAgICAgLy8gYXBpIGxheWVyLiAgU2luY2Ugd2Ugc29ydCBieSBkb2N1bWVudCBrZXkgYW5kIHRoZW4gY2hhbmdlIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhIGFuZCBtb2RpZmllZCBjaGFuZ2VzIG11c3QgYmUgc29ydGVkIGVxdWl2YWxlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBSZW1vdmVkICovIDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBMKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBuKHQpIC0gbihlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAodC50eXBlLCBlLnR5cGUpIHx8IHRoaXMuQW8odC5kb2MsIGUuZG9jKSkpLCB0aGlzLlNvKG4pO1xuICAgICAgICBjb25zdCByID0gZSA/IHRoaXMuRG8oKSA6IFtdLCBvID0gMCA9PT0gdGhpcy5Jby5zaXplICYmIHRoaXMuY3VycmVudCA/IDEgLyogU3luY2VkICovIDogMCAvKiBMb2NhbCAqLyAsIGEgPSBvICE9PSB0aGlzLkVvO1xuICAgICAgICBpZiAodGhpcy5FbyA9IG8sIDAgIT09IGkubGVuZ3RoIHx8IGEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IG5ldyBCbyh0aGlzLnF1ZXJ5LCB0LlJvLCBzLCBpLCB0Lm11dGF0ZWRLZXlzLCAwIC8qIExvY2FsICovID09PSBvLCBhLCBcbiAgICAgICAgICAgICAgICAvKiBleGNsdWRlc01ldGFkYXRhQ2hhbmdlcz0gKi8gITEpLFxuICAgICAgICAgICAgICAgIENvOiByXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vIGNoYW5nZXNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIENvOiByXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYW4gT25saW5lU3RhdGUgY2hhbmdlIHRvIHRoZSB2aWV3LCBwb3RlbnRpYWxseSBnZW5lcmF0aW5nIGFcbiAgICAgKiBWaWV3Q2hhbmdlIGlmIHRoZSB2aWV3J3Mgc3luY1N0YXRlIGNoYW5nZXMgYXMgYSByZXN1bHQuXG4gICAgICovICAgIHJvKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudCAmJiBcIk9mZmxpbmVcIiAvKiBPZmZsaW5lICovID09PSB0ID8gKFxuICAgICAgICAvLyBJZiB3ZSdyZSBvZmZsaW5lLCBzZXQgYGN1cnJlbnRgIHRvIGZhbHNlIGFuZCB0aGVuIGNhbGwgYXBwbHlDaGFuZ2VzKClcbiAgICAgICAgLy8gdG8gcmVmcmVzaCBvdXIgc3luY1N0YXRlIGFuZCBnZW5lcmF0ZSBhIFZpZXdDaGFuZ2UgYXMgYXBwcm9wcmlhdGUuIFdlXG4gICAgICAgIC8vIGFyZSBndWFyYW50ZWVkIHRvIGdldCBhIG5ldyBUYXJnZXRDaGFuZ2UgdGhhdCBzZXRzIGBjdXJyZW50YCBiYWNrIHRvXG4gICAgICAgIC8vIHRydWUgb25jZSB0aGUgY2xpZW50IGlzIGJhY2sgb25saW5lLlxuICAgICAgICB0aGlzLmN1cnJlbnQgPSAhMSwgdGhpcy5hcHBseUNoYW5nZXMoe1xuICAgICAgICAgICAgUm86IHRoaXMuUm8sXG4gICAgICAgICAgICB2bzogbmV3IExvLFxuICAgICAgICAgICAgbXV0YXRlZEtleXM6IHRoaXMubXV0YXRlZEtleXMsXG4gICAgICAgICAgICBCbjogITFcbiAgICAgICAgfSwgXG4gICAgICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyAhMSkpIDoge1xuICAgICAgICAgICAgQ286IFtdXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZG9jIGZvciB0aGUgZ2l2ZW4ga2V5IHNob3VsZCBiZSBpbiBsaW1iby5cbiAgICAgKi8gICAgTm8odCkge1xuICAgICAgICAvLyBJZiB0aGUgcmVtb3RlIGVuZCBzYXlzIGl0J3MgcGFydCBvZiB0aGlzIHF1ZXJ5LCBpdCdzIG5vdCBpbiBsaW1iby5cbiAgICAgICAgcmV0dXJuICF0aGlzLlRvLmhhcyh0KSAmJiAoXG4gICAgICAgIC8vIFRoZSBsb2NhbCBzdG9yZSBkb2Vzbid0IHRoaW5rIGl0J3MgYSByZXN1bHQsIHNvIGl0IHNob3VsZG4ndCBiZSBpbiBsaW1iby5cbiAgICAgICAgISF0aGlzLlJvLmhhcyh0KSAmJiAhdGhpcy5Sby5nZXQodCkuaGFzTG9jYWxNdXRhdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHN5bmNlZERvY3VtZW50cywgY3VycmVudCwgYW5kIGxpbWJvIGRvY3MgYmFzZWQgb24gdGhlIGdpdmVuIGNoYW5nZS5cbiAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoYW5nZXMgdG8gd2hpY2ggZG9jcyBhcmUgaW4gbGltYm8uXG4gICAgICovICAgIFNvKHQpIHtcbiAgICAgICAgdCAmJiAodC5hZGRlZERvY3VtZW50cy5mb3JFYWNoKCh0ID0+IHRoaXMuVG8gPSB0aGlzLlRvLmFkZCh0KSkpLCB0Lm1vZGlmaWVkRG9jdW1lbnRzLmZvckVhY2goKHQgPT4ge30pKSwgXG4gICAgICAgIHQucmVtb3ZlZERvY3VtZW50cy5mb3JFYWNoKCh0ID0+IHRoaXMuVG8gPSB0aGlzLlRvLmRlbGV0ZSh0KSkpLCB0aGlzLmN1cnJlbnQgPSB0LmN1cnJlbnQpO1xuICAgIH1cbiAgICBEbygpIHtcbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgZGV0ZXJtaW5lIGxpbWJvIGRvY3VtZW50cyB3aGVuIHdlJ3JlIGluLXN5bmMgd2l0aCB0aGUgc2VydmVyLlxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgcmV0dXJuIFtdO1xuICAgICAgICAvLyBUT0RPKGtsaW10KTogRG8gdGhpcyBpbmNyZW1lbnRhbGx5IHNvIHRoYXQgaXQncyBub3QgcXVhZHJhdGljIHdoZW5cbiAgICAgICAgLy8gdXBkYXRpbmcgbWFueSBkb2N1bWVudHMuXG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuSW87XG4gICAgICAgIHRoaXMuSW8gPSBTbigpLCB0aGlzLlJvLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5Obyh0LmtleSkgJiYgKHRoaXMuSW8gPSB0aGlzLklvLmFkZCh0LmtleSkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIERpZmYgdGhlIG5ldyBsaW1ibyBkb2NzIHdpdGggdGhlIG9sZCBsaW1ibyBkb2NzLlxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5Jby5oYXModCkgfHwgZS5wdXNoKG5ldyB0YSh0KSk7XG4gICAgICAgIH0pKSwgdGhpcy5Jby5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgICAgIHQuaGFzKG4pIHx8IGUucHVzaChuZXcgWm8obikpO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIHRoZSBjdXJyZW50IHZpZXcgd2l0aCB0aGUgc3RhdGUgcmVhZCBmcm9tXG4gICAgICogcGVyc2lzdGVuY2UuXG4gICAgICpcbiAgICAgKiBXZSB1cGRhdGUgdGhlIHF1ZXJ5IHZpZXcgd2hlbmV2ZXIgYSBjbGllbnQncyBwcmltYXJ5IHN0YXR1cyBjaGFuZ2VzOlxuICAgICAqIC0gV2hlbiBhIGNsaWVudCB0cmFuc2l0aW9ucyBmcm9tIHByaW1hcnkgdG8gc2Vjb25kYXJ5LCBpdCBjYW4gbWlzc1xuICAgICAqICAgTG9jYWxTdG9yYWdlIHVwZGF0ZXMgYW5kIGl0cyBxdWVyeSB2aWV3cyBtYXkgdGVtcG9yYXJpbHkgbm90IGJlXG4gICAgICogICBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc3RhdGUgb24gZGlzay5cbiAgICAgKiAtIEZvciBzZWNvbmRhcnkgdG8gcHJpbWFyeSB0cmFuc2l0aW9ucywgdGhlIGNsaWVudCBuZWVkcyB0byB1cGRhdGUgdGhlIGxpc3RcbiAgICAgKiAgIG9mIGBzeW5jZWREb2N1bWVudHNgIHNpbmNlIHNlY29uZGFyeSBjbGllbnRzIHVwZGF0ZSB0aGVpciBxdWVyeSB2aWV3c1xuICAgICAqICAgYmFzZWQgcHVyZWx5IG9uIHN5bnRoZXNpemVkIFJlbW90ZUV2ZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBxdWVyeVJlc3VsdC5kb2N1bWVudHMgLSBUaGUgZG9jdW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBMb2NhbFN0b3JlLlxuICAgICAqIEBwYXJhbSBxdWVyeVJlc3VsdC5yZW1vdGVLZXlzIC0gVGhlIGtleXMgb2YgdGhlIGRvY3VtZW50cyB0aGF0IG1hdGNoIHRoZVxuICAgICAqIHF1ZXJ5IGFjY29yZGluZyB0byB0aGUgYmFja2VuZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBWaWV3Q2hhbmdlIHRoYXQgcmVzdWx0ZWQgZnJvbSB0aGlzIHN5bmNocm9uaXphdGlvbi5cbiAgICAgKi9cbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgIGtvKHQpIHtcbiAgICAgICAgdGhpcy5UbyA9IHQuem4sIHRoaXMuSW8gPSBTbigpO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5ibyh0LmRvY3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q2hhbmdlcyhlLCAvKnVwZGF0ZUxpbWJvRG9jdW1lbnRzPSovICEwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZpZXcgc25hcHNob3QgYXMgaWYgdGhpcyBxdWVyeSB3YXMganVzdCBsaXN0ZW5lZCB0by4gQ29udGFpbnNcbiAgICAgKiBhIGRvY3VtZW50IGFkZCBmb3IgZXZlcnkgZXhpc3RpbmcgZG9jdW1lbnQgYW5kIHRoZSBgZnJvbUNhY2hlYCBhbmRcbiAgICAgKiBgaGFzUGVuZGluZ1dyaXRlc2Agc3RhdHVzIG9mIHRoZSBhbHJlYWR5IGVzdGFibGlzaGVkIHZpZXcuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICB4bygpIHtcbiAgICAgICAgcmV0dXJuIEJvLmZyb21Jbml0aWFsRG9jdW1lbnRzKHRoaXMucXVlcnksIHRoaXMuUm8sIHRoaXMubXV0YXRlZEtleXMsIDAgLyogTG9jYWwgKi8gPT09IHRoaXMuRW8pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBRdWVyeVZpZXcgY29udGFpbnMgYWxsIG9mIHRoZSBkYXRhIHRoYXQgU3luY0VuZ2luZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIGZvclxuICogYSBwYXJ0aWN1bGFyIHF1ZXJ5LlxuICovXG5jbGFzcyBuYSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IGl0c2VsZi5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG51bWJlciBjcmVhdGVkIGJ5IHRoZSBjbGllbnQgdGhhdCBpcyB1c2VkIGluIHRoZSB3YXRjaFxuICAgICAqIHN0cmVhbSB0byBpZGVudGlmeSB0aGlzIHF1ZXJ5LlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIFRoZSB2aWV3IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgdGhlIGZpbmFsIG1lcmdlZCB0cnV0aCBvZiB3aGF0XG4gICAgICogZG9jcyBhcmUgaW4gdGhlIHF1ZXJ5LiBJdCBnZXRzIG5vdGlmaWVkIG9mIGxvY2FsIGFuZCByZW1vdGUgY2hhbmdlcyxcbiAgICAgKiBhbmQgYXBwbGllcyB0aGUgcXVlcnkgZmlsdGVycyBhbmQgbGltaXRzIHRvIGRldGVybWluZSB0aGUgbW9zdCBjb3JyZWN0XG4gICAgICogcG9zc2libGUgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBuKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLnRhcmdldElkID0gZSwgdGhpcy52aWV3ID0gbjtcbiAgICB9XG59XG5cbi8qKiBUcmFja3MgYSBsaW1ibyByZXNvbHV0aW9uLiAqLyBjbGFzcyBzYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtleSA9IHQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IHRvIHRydWUgb25jZSB3ZSd2ZSByZWNlaXZlZCBhIGRvY3VtZW50LiBUaGlzIGlzIHVzZWQgaW5cbiAgICAgICAgICogZ2V0UmVtb3RlS2V5c0ZvclRhcmdldCgpIGFuZCB1bHRpbWF0ZWx5IHVzZWQgYnkgV2F0Y2hDaGFuZ2VBZ2dyZWdhdG9yIHRvXG4gICAgICAgICAqIGRlY2lkZSB3aGV0aGVyIGl0IG5lZWRzIHRvIG1hbnVmYWN0dXJlIGEgZGVsZXRlIGV2ZW50IGZvciB0aGUgdGFyZ2V0IG9uY2VcbiAgICAgICAgICogdGhlIHRhcmdldCBpcyBDVVJSRU5ULlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy4kbyA9ICExO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgU3luY0VuZ2luZWAgY29vcmRpbmF0aW5nIHdpdGggb3RoZXIgcGFydHMgb2YgU0RLLlxuICpcbiAqIFRoZSBwYXJ0cyBvZiBTeW5jRW5naW5lIHRoYXQgYWN0IGFzIGEgY2FsbGJhY2sgdG8gUmVtb3RlU3RvcmUgbmVlZCB0byBiZVxuICogcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHkuIFRoaXMgaXMgZG9uZSBpbiBgc3luY0VuZ2luZVdyaXRlKClgIGFuZFxuICogYHN5bmNFbmdpbmVMaXN0ZW4oKWAgKGFzIHdlbGwgYXMgYGFwcGx5UHJpbWFyeVN0YXRlKClgKSBhcyB0aGVzZSBtZXRob2RzXG4gKiBzZXJ2ZSBhcyBlbnRyeSBwb2ludHMgdG8gUmVtb3RlU3RvcmUncyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIE5vdGU6IHNvbWUgZmllbGQgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIG1pZ2h0IGhhdmUgcHVibGljIGFjY2VzcyBsZXZlbCwgYnV0XG4gKiB0aGUgY2xhc3MgaXMgbm90IGV4cG9ydGVkIHNvIHRoZXkgYXJlIG9ubHkgYWNjZXNzaWJsZSBmcm9tIHRoaXMgbW9kdWxlLlxuICogVGhpcyBpcyB1c2VmdWwgdG8gaW1wbGVtZW50IG9wdGlvbmFsIGZlYXR1cmVzIChsaWtlIGJ1bmRsZXMpIGluIGZyZWVcbiAqIGZ1bmN0aW9ucywgc3VjaCB0aGF0IHRoZXkgYXJlIHRyZWUtc2hha2VhYmxlLlxuICovIGNsYXNzIGlhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBcbiAgICAvLyBQT1JUSU5HIE5PVEU6IE1hbmFnZXMgc3RhdGUgc3luY2hyb25pemF0aW9uIGluIG11bHRpLXRhYiBlbnZpcm9ubWVudHMuXG4gICAgcywgaSwgcikge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgPSB0LCB0aGlzLnJlbW90ZVN0b3JlID0gZSwgdGhpcy5ldmVudE1hbmFnZXIgPSBuLCB0aGlzLnNoYXJlZENsaWVudFN0YXRlID0gcywgXG4gICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBpLCB0aGlzLm1heENvbmN1cnJlbnRMaW1ib1Jlc29sdXRpb25zID0gciwgdGhpcy5GbyA9IHt9LCB0aGlzLk9vID0gbmV3IEdpKCh0ID0+IHZlKHQpKSwgYmUpLCBcbiAgICAgICAgdGhpcy5NbyA9IG5ldyBNYXAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGtleXMgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIGluIGxpbWJvIGZvciB3aGljaCB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFcbiAgICAgICAgICogbGltYm8gcmVzb2x1dGlvbiBxdWVyeS4gVGhlIHN0cmluZ3MgaW4gdGhpcyBzZXQgYXJlIHRoZSByZXN1bHQgb2YgY2FsbGluZ1xuICAgICAgICAgKiBga2V5LnBhdGguY2Fub25pY2FsU3RyaW5nKClgIHdoZXJlIGBrZXlgIGlzIGEgYERvY3VtZW50S2V5YCBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgU2V0YCB0eXBlIHdhcyBjaG9zZW4gYmVjYXVzZSBpdCBwcm92aWRlcyBlZmZpY2llbnQgbG9va3VwIGFuZCByZW1vdmFsXG4gICAgICAgICAqIG9mIGFyYml0cmFyeSBlbGVtZW50cyBhbmQgaXQgYWxzbyBtYWludGFpbnMgaW5zZXJ0aW9uIG9yZGVyLCBwcm92aWRpbmcgdGhlXG4gICAgICAgICAqIGRlc2lyZWQgcXVldWUtbGlrZSBGSUZPIHNlbWFudGljcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuTG8gPSBuZXcgU2V0LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSB0YXJnZXQgSUQgZm9yIGVhY2ggZG9jdW1lbnQgdGhhdCBpcyBpbiBsaW1ibyB3aXRoIGFuXG4gICAgICAgICAqIGFjdGl2ZSB0YXJnZXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkJvID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY3RpdmUgbGltYm8gcmVzb2x1dGlvbiBmb3IgZWFjaFxuICAgICAgICAgKiBhY3RpdmUgdGFyZ2V0IElEIHRoYXQgd2FzIHN0YXJ0ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGxpbWJvIHJlc29sdXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlVvID0gbmV3IE1hcCwgdGhpcy5xbyA9IG5ldyBWciwgXG4gICAgICAgIC8qKiBTdG9yZXMgdXNlciBjb21wbGV0aW9uIGhhbmRsZXJzLCBpbmRleGVkIGJ5IFVzZXIgYW5kIEJhdGNoSWQuICovXG4gICAgICAgIHRoaXMuS28gPSB7fSwgXG4gICAgICAgIC8qKiBTdG9yZXMgdXNlciBjYWxsYmFja3Mgd2FpdGluZyBmb3IgYWxsIHBlbmRpbmcgd3JpdGVzIHRvIGJlIGFja25vd2xlZGdlZC4gKi9cbiAgICAgICAgdGhpcy5qbyA9IG5ldyBNYXAsIHRoaXMuUW8gPSAkaS5yZSgpLCB0aGlzLm9ubGluZVN0YXRlID0gXCJVbmtub3duXCIgLyogVW5rbm93biAqLyAsIFxuICAgICAgICAvLyBUaGUgcHJpbWFyeSBzdGF0ZSBpcyBzZXQgdG8gYHRydWVgIG9yIGBmYWxzZWAgaW1tZWRpYXRlbHkgYWZ0ZXIgRmlyZXN0b3JlXG4gICAgICAgIC8vIHN0YXJ0dXAuIEluIHRoZSBpbnRlcmltLCBhIGNsaWVudCBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIHByaW1hcnkgaWZcbiAgICAgICAgLy8gYGlzUHJpbWFyeWAgaXMgdHJ1ZS5cbiAgICAgICAgdGhpcy5XbyA9IHZvaWQgMDtcbiAgICB9XG4gICAgZ2V0IGlzUHJpbWFyeUNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuICEwID09PSB0aGlzLldvO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWF0ZXMgdGhlIG5ldyBsaXN0ZW4sIHJlc29sdmVzIHByb21pc2Ugd2hlbiBsaXN0ZW4gZW5xdWV1ZWQgdG8gdGhlXG4gKiBzZXJ2ZXIuIEFsbCB0aGUgc3Vic2VxdWVudCB2aWV3IHNuYXBzaG90cyBvciBlcnJvcnMgYXJlIHNlbnQgdG8gdGhlXG4gKiBzdWJzY3JpYmVkIGhhbmRsZXJzLiBSZXR1cm5zIHRoZSBpbml0aWFsIHNuYXBzaG90LlxuICovXG5hc3luYyBmdW5jdGlvbiByYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHhhKHQpO1xuICAgIGxldCBzLCBpO1xuICAgIGNvbnN0IHIgPSBuLk9vLmdldChlKTtcbiAgICBpZiAocikgXG4gICAgLy8gUE9SVElORyBOT1RFOiBXaXRoIE11bHRpLVRhYiBXZWIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBxdWVyeSB2aWV3XG4gICAgLy8gYWxyZWFkeSBleGlzdHMgd2hlbiBFdmVudE1hbmFnZXIgY2FsbHMgdXMgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGlzXG4gICAgLy8gaGFwcGVucyB3aGVuIHRoZSBwcmltYXJ5IHRhYiBpcyBhbHJlYWR5IGxpc3RlbmluZyB0byB0aGlzIHF1ZXJ5IG9uXG4gICAgLy8gYmVoYWxmIG9mIGFub3RoZXIgdGFiIGFuZCB0aGUgdXNlciBvZiB0aGUgcHJpbWFyeSBhbHNvIHN0YXJ0cyBsaXN0ZW5pbmdcbiAgICAvLyB0byB0aGUgcXVlcnkuIEV2ZW50TWFuYWdlciB3aWxsIG5vdCBoYXZlIGFuIGFzc2lnbmVkIHRhcmdldCBJRCBpbiB0aGlzXG4gICAgLy8gY2FzZSBhbmQgY2FsbHMgYGxpc3RlbmAgdG8gb2J0YWluIHRoaXMgSUQuXG4gICAgcyA9IHIudGFyZ2V0SWQsIG4uc2hhcmVkQ2xpZW50U3RhdGUuYWRkTG9jYWxRdWVyeVRhcmdldChzKSwgaSA9IHIudmlldy54bygpOyBlbHNlIHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHByKG4ubG9jYWxTdG9yZSwgUmUoZSkpLCByID0gbi5zaGFyZWRDbGllbnRTdGF0ZS5hZGRMb2NhbFF1ZXJ5VGFyZ2V0KHQudGFyZ2V0SWQpO1xuICAgICAgICBzID0gdC50YXJnZXRJZCwgaSA9IGF3YWl0IG9hKG4sIGUsIHMsIFwiY3VycmVudFwiID09PSByKSwgbi5pc1ByaW1hcnlDbGllbnQgJiYgaG8obi5yZW1vdGVTdG9yZSwgdCk7XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZpZXcgZm9yIGEgcHJldmlvdXNseSB1bmtub3duIHF1ZXJ5IGFuZCBjb21wdXRlcyBpdHMgaW5pdGlhbFxuICogc25hcHNob3QuXG4gKi8gYXN5bmMgZnVuY3Rpb24gb2EodCwgZSwgbiwgcykge1xuICAgIC8vIFBPUlRJTkcgTk9URTogT24gV2ViIG9ubHksIHdlIGluamVjdCB0aGUgY29kZSB0aGF0IHJlZ2lzdGVycyBuZXcgTGltYm9cbiAgICAvLyB0YXJnZXRzIGJhc2VkIG9uIHZpZXcgY2hhbmdlcy4gVGhpcyBhbGxvd3MgdXMgdG8gb25seSBkZXBlbmQgb24gTGltYm9cbiAgICAvLyBjaGFuZ2VzIHdoZW4gdXNlciBjb2RlIGluY2x1ZGVzIHF1ZXJpZXMuXG4gICAgdC5HbyA9IChlLCBuLCBzKSA9PiBhc3luYyBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIGxldCBpID0gZS52aWV3LmJvKG4pO1xuICAgICAgICBpLkJuICYmIChcbiAgICAgICAgLy8gVGhlIHF1ZXJ5IGhhcyBhIGxpbWl0IGFuZCBzb21lIGRvY3Mgd2VyZSByZW1vdmVkLCBzbyB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIHJlLXJ1biB0aGUgcXVlcnkgYWdhaW5zdCB0aGUgbG9jYWwgc3RvcmUgdG8gbWFrZSBzdXJlIHdlXG4gICAgICAgIC8vIGRpZG4ndCBsb3NlIGFueSBnb29kIGRvY3MgdGhhdCBoYWQgYmVlbiBwYXN0IHRoZSBsaW1pdC5cbiAgICAgICAgaSA9IGF3YWl0IEVyKHQubG9jYWxTdG9yZSwgZS5xdWVyeSwgXG4gICAgICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITEpLnRoZW4oKCh7ZG9jdW1lbnRzOiB0fSkgPT4gZS52aWV3LmJvKHQsIGkpKSkpO1xuICAgICAgICBjb25zdCByID0gcyAmJiBzLnRhcmdldENoYW5nZXMuZ2V0KGUudGFyZ2V0SWQpLCBvID0gZS52aWV3LmFwcGx5Q2hhbmdlcyhpLCBcbiAgICAgICAgLyogdXBkYXRlTGltYm9Eb2N1bWVudHM9ICovIHQuaXNQcmltYXJ5Q2xpZW50LCByKTtcbiAgICAgICAgcmV0dXJuIHBhKHQsIGUudGFyZ2V0SWQsIG8uQ28pLCBvLnNuYXBzaG90O1xuICAgIH0odCwgZSwgbiwgcyk7XG4gICAgY29uc3QgaSA9IGF3YWl0IEVyKHQubG9jYWxTdG9yZSwgZSwgXG4gICAgLyogdXNlUHJldmlvdXNSZXN1bHRzPSAqLyAhMCksIHIgPSBuZXcgZWEoZSwgaS56biksIG8gPSByLmJvKGkuZG9jdW1lbnRzKSwgYSA9IGtuLmNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZShuLCBzICYmIFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8gIT09IHQub25saW5lU3RhdGUpLCBjID0gci5hcHBseUNoYW5nZXMobywgXG4gICAgLyogdXBkYXRlTGltYm9Eb2N1bWVudHM9ICovIHQuaXNQcmltYXJ5Q2xpZW50LCBhKTtcbiAgICBwYSh0LCBuLCBjLkNvKTtcbiAgICBjb25zdCB1ID0gbmV3IG5hKGUsIG4sIHIpO1xuICAgIHJldHVybiB0Lk9vLnNldChlLCB1KSwgdC5Nby5oYXMobikgPyB0Lk1vLmdldChuKS5wdXNoKGUpIDogdC5Nby5zZXQobiwgWyBlIF0pLCBjLnNuYXBzaG90O1xufVxuXG4vKiogU3RvcHMgbGlzdGVuaW5nIHRvIHRoZSBxdWVyeS4gKi8gYXN5bmMgZnVuY3Rpb24gYWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gbi5Pby5nZXQoZSksIGkgPSBuLk1vLmdldChzLnRhcmdldElkKTtcbiAgICBpZiAoaS5sZW5ndGggPiAxKSByZXR1cm4gbi5Nby5zZXQocy50YXJnZXRJZCwgaS5maWx0ZXIoKHQgPT4gIWJlKHQsIGUpKSkpLCB2b2lkIG4uT28uZGVsZXRlKGUpO1xuICAgIC8vIE5vIG90aGVyIHF1ZXJpZXMgYXJlIG1hcHBlZCB0byB0aGUgdGFyZ2V0LCBjbGVhbiB1cCB0aGUgcXVlcnkgYW5kIHRoZSB0YXJnZXQuXG4gICAgICAgIGlmIChuLmlzUHJpbWFyeUNsaWVudCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgbG9jYWwgcXVlcnkgdGFyZ2V0IGZpcnN0IHRvIGFsbG93IHVzIHRvIHZlcmlmeVxuICAgICAgICAvLyB3aGV0aGVyIGFueSBvdGhlciBjbGllbnQgaXMgc3RpbGwgaW50ZXJlc3RlZCBpbiB0aGlzIHRhcmdldC5cbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5yZW1vdmVMb2NhbFF1ZXJ5VGFyZ2V0KHMudGFyZ2V0SWQpO1xuICAgICAgICBuLnNoYXJlZENsaWVudFN0YXRlLmlzQWN0aXZlUXVlcnlUYXJnZXQocy50YXJnZXRJZCkgfHwgYXdhaXQgVHIobi5sb2NhbFN0b3JlLCBzLnRhcmdldElkLCBcbiAgICAgICAgLyprZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YT0qLyAhMSkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5jbGVhclF1ZXJ5U3RhdGUocy50YXJnZXRJZCksIGxvKG4ucmVtb3RlU3RvcmUsIHMudGFyZ2V0SWQpLCBcbiAgICAgICAgICAgIGdhKG4sIHMudGFyZ2V0SWQpO1xuICAgICAgICB9KSkuY2F0Y2goQmkpO1xuICAgIH0gZWxzZSBnYShuLCBzLnRhcmdldElkKSwgYXdhaXQgVHIobi5sb2NhbFN0b3JlLCBzLnRhcmdldElkLCBcbiAgICAvKmtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhPSovICEwKTtcbn1cblxuLyoqXG4gKiBJbml0aWF0ZXMgdGhlIHdyaXRlIG9mIGxvY2FsIG11dGF0aW9uIGJhdGNoIHdoaWNoIGludm9sdmVzIGFkZGluZyB0aGVcbiAqIHdyaXRlcyB0byB0aGUgbXV0YXRpb24gcXVldWUsIG5vdGlmeWluZyB0aGUgcmVtb3RlIHN0b3JlIGFib3V0IG5ld1xuICogbXV0YXRpb25zIGFuZCByYWlzaW5nIGV2ZW50cyBmb3IgYW55IGNoYW5nZXMgdGhpcyB3cml0ZSBjYXVzZWQuXG4gKlxuICogVGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhpcyBjYWxsIGlzIHJlc29sdmVkIHdoZW4gdGhlIGFib3ZlIHN0ZXBzXG4gKiBoYXZlIGNvbXBsZXRlZCwgKm5vdCogd2hlbiB0aGUgd3JpdGUgd2FzIGFja2VkIGJ5IHRoZSBiYWNrZW5kLiBUaGVcbiAqIHVzZXJDYWxsYmFjayBpcyByZXNvbHZlZCBvbmNlIHRoZSB3cml0ZSB3YXMgYWNrZWQvcmVqZWN0ZWQgYnkgdGhlXG4gKiBiYWNrZW5kIChvciBmYWlsZWQgbG9jYWxseSBmb3IgYW55IG90aGVyIHJlYXNvbikuXG4gKi8gYXN5bmMgZnVuY3Rpb24gY2EodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSAkYSh0KTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHEodCksIHMgPSBhdC5ub3coKSwgaSA9IGUucmVkdWNlKCgodCwgZSkgPT4gdC5hZGQoZS5rZXkpKSwgU24oKSk7XG4gICAgICAgICAgICBsZXQgcjtcbiAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiTG9jYWxseSB3cml0ZSBtdXRhdGlvbnNcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gbi5Xbi52bih0LCBpKS5uZXh0KChpID0+IHtcbiAgICAgICAgICAgICAgICByID0gaTtcbiAgICAgICAgICAgICAgICAvLyBGb3Igbm9uLWlkZW1wb3RlbnQgbXV0YXRpb25zIChzdWNoIGFzIGBGaWVsZFZhbHVlLmluY3JlbWVudCgpYCksXG4gICAgICAgICAgICAgICAgLy8gd2UgcmVjb3JkIHRoZSBiYXNlIHN0YXRlIGluIGEgc2VwYXJhdGUgcGF0Y2ggbXV0YXRpb24uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAvLyBsYXRlciB1c2VkIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW50IHZhbHVlcyBhbmQgcHJldmVudHMgZmxpY2tlclxuICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGJhY2tlbmQgc2VuZHMgdXMgYW4gdXBkYXRlIHRoYXQgYWxyZWFkeSBpbmNsdWRlcyBvdXJcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBlbih0LCByLmdldCh0LmtleSkpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9IGUgJiYgXG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoZSBiYXNlIHN0YXRlIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgaWYgdGhlcmUncyBzb21lXG4gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGRvY3VtZW50IHRvIG92ZXJyaWRlLCBzbyB1c2UgYSBQcmVjb25kaXRpb24gb2ZcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzPXRydWVcbiAgICAgICAgICAgICAgICAgICAgby5wdXNoKG5ldyBvbih0LmtleSwgZSwgUXQoZS52YWx1ZS5tYXBWYWx1ZSksIEplLmV4aXN0cyghMCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4uQW4uYWRkTXV0YXRpb25CYXRjaCh0LCBzLCBvLCBlKTtcbiAgICAgICAgICAgIH0pKSkpLnRoZW4oKHQgPT4gKHQuYXBwbHlUb0xvY2FsRG9jdW1lbnRTZXQociksIHtcbiAgICAgICAgICAgICAgICBiYXRjaElkOiB0LmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgY2hhbmdlczogclxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfShzLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLmFkZFBlbmRpbmdNdXRhdGlvbih0LmJhdGNoSWQpLCBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICBsZXQgcyA9IHQuS29bdC5jdXJyZW50VXNlci50b0tleSgpXTtcbiAgICAgICAgICAgIHMgfHwgKHMgPSBuZXcgZ24oaXQpKTtcbiAgICAgICAgICAgIHMgPSBzLmluc2VydChlLCBuKSwgdC5Lb1t0LmN1cnJlbnRVc2VyLnRvS2V5KCldID0gcztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJlc29sdmVzIG9yIHJlamVjdHMgdGhlIHVzZXIgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiBiYXRjaCBhbmQgdGhlbiBkaXNjYXJkc1xuICogaXQuXG4gKi8gKHMsIHQuYmF0Y2hJZCwgbiksIGF3YWl0IElhKHMsIHQuY2hhbmdlcyksIGF3YWl0IFJvKHMucmVtb3RlU3RvcmUpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgLy8gSWYgd2UgY2FuJ3QgcGVyc2lzdCB0aGUgbXV0YXRpb24sIHdlIHJlamVjdCB0aGUgdXNlciBjYWxsYmFjayBhbmRcbiAgICAgICAgLy8gZG9uJ3Qgc2VuZCB0aGUgbXV0YXRpb24uIFRoZSB1c2VyIGNhbiB0aGVuIHJldHJ5IHRoZSB3cml0ZS5cbiAgICAgICAgY29uc3QgZSA9IE9vKHQsIFwiRmFpbGVkIHRvIHBlcnNpc3Qgd3JpdGVcIik7XG4gICAgICAgIG4ucmVqZWN0KGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIG9uZSByZW1vdGUgZXZlbnQgdG8gdGhlIHN5bmMgZW5naW5lLCBub3RpZnlpbmcgYW55IHZpZXdzIG9mIHRoZVxuICogY2hhbmdlcywgYW5kIHJlbGVhc2luZyBhbnkgcGVuZGluZyBtdXRhdGlvbiBiYXRjaGVzIHRoYXQgd291bGQgYmVjb21lXG4gKiB2aXNpYmxlIGJlY2F1c2Ugb2YgdGhlIHNuYXBzaG90IHZlcnNpb24gdGhlIHJlbW90ZSBldmVudCBjb250YWlucy5cbiAqLyBhc3luYyBmdW5jdGlvbiB1YSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IG1yKG4ubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIC8vIFVwZGF0ZSBgcmVjZWl2ZWREb2N1bWVudGAgYXMgYXBwcm9wcmlhdGUgZm9yIGFueSBsaW1ibyB0YXJnZXRzLlxuICAgICAgICAgICAgICAgIGUudGFyZ2V0Q2hhbmdlcy5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IG4uVW8uZ2V0KGUpO1xuICAgICAgICAgICAgcyAmJiAoXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbGltYm8gcmVzb2x1dGlvbiBsb29rdXAsIGl0J3MgZm9yIGEgc2luZ2xlIGRvY3VtZW50XG4gICAgICAgICAgICAvLyBhbmQgaXQgY291bGQgYmUgYWRkZWQsIG1vZGlmaWVkLCBvciByZW1vdmVkLCBidXQgbm90IGEgY29tYmluYXRpb24uXG4gICAgICAgICAgICBCKHQuYWRkZWREb2N1bWVudHMuc2l6ZSArIHQubW9kaWZpZWREb2N1bWVudHMuc2l6ZSArIHQucmVtb3ZlZERvY3VtZW50cy5zaXplIDw9IDEpLCBcbiAgICAgICAgICAgIHQuYWRkZWREb2N1bWVudHMuc2l6ZSA+IDAgPyBzLiRvID0gITAgOiB0Lm1vZGlmaWVkRG9jdW1lbnRzLnNpemUgPiAwID8gQihzLiRvKSA6IHQucmVtb3ZlZERvY3VtZW50cy5zaXplID4gMCAmJiAoQihzLiRvKSwgXG4gICAgICAgICAgICBzLiRvID0gITEpKTtcbiAgICAgICAgfSkpLCBhd2FpdCBJYShuLCB0LCBlKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGF3YWl0IEJpKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGFuIE9ubGluZVN0YXRlIGNoYW5nZSB0byB0aGUgc3luYyBlbmdpbmUgYW5kIG5vdGlmaWVzIGFueSB2aWV3cyBvZlxuICogdGhlIGNoYW5nZS5cbiAqLyBmdW5jdGlvbiBoYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHEodCk7XG4gICAgLy8gSWYgd2UgYXJlIHRoZSBzZWNvbmRhcnkgY2xpZW50LCB3ZSBleHBsaWNpdGx5IGlnbm9yZSB0aGUgcmVtb3RlIHN0b3JlJ3NcbiAgICAvLyBvbmxpbmUgc3RhdGUgKHRoZSBsb2NhbCBjbGllbnQgbWF5IGdvIG9mZmxpbmUsIGV2ZW4gdGhvdWdoIHRoZSBwcmltYXJ5XG4gICAgLy8gdGFiIHJlbWFpbnMgb25saW5lKSBhbmQgb25seSBhcHBseSB0aGUgcHJpbWFyeSB0YWIncyBvbmxpbmUgc3RhdGUgZnJvbVxuICAgIC8vIFNoYXJlZENsaWVudFN0YXRlLlxuICAgICAgICBpZiAocy5pc1ByaW1hcnlDbGllbnQgJiYgMCAvKiBSZW1vdGVTdG9yZSAqLyA9PT0gbiB8fCAhcy5pc1ByaW1hcnlDbGllbnQgJiYgMSAvKiBTaGFyZWRDbGllbnRTdGF0ZSAqLyA9PT0gbikge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHMuT28uZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBzLnZpZXcucm8oZSk7XG4gICAgICAgICAgICBpLnNuYXBzaG90ICYmIHQucHVzaChpLnNuYXBzaG90KTtcbiAgICAgICAgfSkpLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gcSh0KTtcbiAgICAgICAgICAgIG4ub25saW5lU3RhdGUgPSBlO1xuICAgICAgICAgICAgbGV0IHMgPSAhMTtcbiAgICAgICAgICAgIG4ucXVlcmllcy5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBuLmxpc3RlbmVycykgXG4gICAgICAgICAgICAgICAgLy8gUnVuIGdsb2JhbCBzbmFwc2hvdCBsaXN0ZW5lcnMgaWYgYSBjb25zaXN0ZW50IHNuYXBzaG90IGhhcyBiZWVuIGVtaXR0ZWQuXG4gICAgICAgICAgICAgICAgdC5ybyhlKSAmJiAocyA9ICEwKTtcbiAgICAgICAgICAgIH0pKSwgcyAmJiBHbyhuKTtcbiAgICAgICAgfShzLmV2ZW50TWFuYWdlciwgZSksIHQubGVuZ3RoICYmIHMuRm8uUHIodCksIHMub25saW5lU3RhdGUgPSBlLCBzLmlzUHJpbWFyeUNsaWVudCAmJiBzLnNoYXJlZENsaWVudFN0YXRlLnNldE9ubGluZVN0YXRlKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWplY3RzIHRoZSBsaXN0ZW4gZm9yIHRoZSBnaXZlbiB0YXJnZXRJRC4gVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZVxuICogYmFja2VuZCBmb3IgYW55IGFjdGl2ZSB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBUaGUgc3luYyBlbmdpbmUgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gdGFyZ2V0SWQgLSBUaGUgdGFyZ2V0SUQgY29ycmVzcG9uZHMgdG8gb25lIHByZXZpb3VzbHkgaW5pdGlhdGVkIGJ5IHRoZVxuICogdXNlciBhcyBwYXJ0IG9mIFRhcmdldERhdGEgcGFzc2VkIHRvIGxpc3RlbigpIG9uIFJlbW90ZVN0b3JlLlxuICogQHBhcmFtIGVyciAtIEEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbmRpdGlvbiB0aGF0IGhhcyBmb3JjZWQgdGhlIHJlamVjdGlvbi5cbiAqIE5lYXJseSBhbHdheXMgdGhpcyB3aWxsIGJlIGFuIGluZGljYXRpb24gdGhhdCB0aGUgdXNlciBpcyBubyBsb25nZXJcbiAqIGF1dGhvcml6ZWQgdG8gc2VlIHRoZSBkYXRhIG1hdGNoaW5nIHRoZSB0YXJnZXQuXG4gKi8gYXN5bmMgZnVuY3Rpb24gbGEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBxKHQpO1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgICAgIHMuc2hhcmVkQ2xpZW50U3RhdGUudXBkYXRlUXVlcnlTdGF0ZShlLCBcInJlamVjdGVkXCIsIG4pO1xuICAgIGNvbnN0IGkgPSBzLlVvLmdldChlKSwgciA9IGkgJiYgaS5rZXk7XG4gICAgaWYgKHIpIHtcbiAgICAgICAgLy8gVE9ETyhrbGltdCk6IFdlIHJlYWxseSBvbmx5IHNob3VsZCBkbyB0aGUgZm9sbG93aW5nIG9uIHBlcm1pc3Npb25cbiAgICAgICAgLy8gZGVuaWVkIGVycm9ycywgYnV0IHdlIGRvbid0IGhhdmUgdGhlIGNhdXNlIGNvZGUgaGVyZS5cbiAgICAgICAgLy8gSXQncyBhIGxpbWJvIGRvYy4gQ3JlYXRlIGEgc3ludGhldGljIGV2ZW50IHNheWluZyBpdCB3YXMgZGVsZXRlZC5cbiAgICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGEgaGFjay4gSWRlYWxseSwgd2Ugd291bGQgaGF2ZSBhIG1ldGhvZCBpbiB0aGUgbG9jYWxcbiAgICAgICAgLy8gc3RvcmUgdG8gcHVyZ2UgYSBkb2N1bWVudC4gSG93ZXZlciwgaXQgd291bGQgYmUgdHJpY2t5IHRvIGtlZXAgYWxsIG9mXG4gICAgICAgIC8vIHRoZSBsb2NhbCBzdG9yZSdzIGludmFyaWFudHMgd2l0aCBhbm90aGVyIG1ldGhvZC5cbiAgICAgICAgbGV0IHQgPSBuZXcgZ24oU3QuY29tcGFyYXRvcik7XG4gICAgICAgIHQgPSB0Lmluc2VydChyLCBXdC5uZXdOb0RvY3VtZW50KHIsIGN0Lm1pbigpKSk7XG4gICAgICAgIGNvbnN0IG4gPSBTbigpLmFkZChyKSwgaSA9IG5ldyBObihjdC5taW4oKSwgXG4gICAgICAgIC8qIHRhcmdldENoYW5nZXM9ICovIG5ldyBNYXAsIFxuICAgICAgICAvKiB0YXJnZXRNaXNtYXRjaGVzPSAqLyBuZXcgVG4oaXQpLCB0LCBuKTtcbiAgICAgICAgYXdhaXQgdWEocywgaSksIFxuICAgICAgICAvLyBTaW5jZSB0aGlzIHF1ZXJ5IGZhaWxlZCwgd2Ugd29uJ3Qgd2FudCB0byBtYW51YWxseSB1bmxpc3RlbiB0byBpdC5cbiAgICAgICAgLy8gV2Ugb25seSByZW1vdmUgaXQgZnJvbSBib29ra2VlcGluZyBhZnRlciB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGVcbiAgICAgICAgLy8gUmVtb3RlRXZlbnQuIElmIGBhcHBseVJlbW90ZUV2ZW50KClgIHRocm93cywgd2Ugd2FudCB0byByZS1saXN0ZW4gdG9cbiAgICAgICAgLy8gdGhpcyBxdWVyeSB3aGVuIHRoZSBSZW1vdGVTdG9yZSByZXN0YXJ0cyB0aGUgV2F0Y2ggc3RyZWFtLCB3aGljaCBzaG91bGRcbiAgICAgICAgLy8gcmUtdHJpZ2dlciB0aGUgdGFyZ2V0IGZhaWx1cmUuXG4gICAgICAgIHMuQm8gPSBzLkJvLnJlbW92ZShyKSwgcy5Vby5kZWxldGUoZSksIEVhKHMpO1xuICAgIH0gZWxzZSBhd2FpdCBUcihzLmxvY2FsU3RvcmUsIGUsIFxuICAgIC8qIGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhICovICExKS50aGVuKCgoKSA9PiBnYShzLCBlLCBuKSkpLmNhdGNoKEJpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gZS5iYXRjaC5iYXRjaElkO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB3cihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAvLyBUaGUgbG9jYWwgc3RvcmUgbWF5IG9yIG1heSBub3QgYmUgYWJsZSB0byBhcHBseSB0aGUgd3JpdGUgcmVzdWx0IGFuZFxuICAgICAgICAvLyByYWlzZSBldmVudHMgaW1tZWRpYXRlbHkgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB3YXRjaGVyIGlzIGNhdWdodFxuICAgICAgICAvLyB1cCksIHNvIHdlIHJhaXNlIHVzZXIgY2FsbGJhY2tzIGZpcnN0IHNvIHRoYXQgdGhleSBjb25zaXN0ZW50bHkgaGFwcGVuXG4gICAgICAgIC8vIGJlZm9yZSBsaXN0ZW4gZXZlbnRzLlxuICAgICAgICAgICAgICAgIG1hKG4sIHMsIC8qZXJyb3I9Ki8gbnVsbCksIF9hKG4sIHMpLCBuLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUocywgXCJhY2tub3dsZWRnZWRcIiksIFxuICAgICAgICBhd2FpdCBJYShuLCB0KTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGF3YWl0IEJpKHQpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBxKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gcSh0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiUmVqZWN0IGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBzO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLkFuLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgoZSA9PiAoQihudWxsICE9PSBlKSwgcyA9IGUua2V5cygpLCBuLkFuLnJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkpKSkubmV4dCgoKCkgPT4gbi5Bbi5wZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSkpLm5leHQoKCgpID0+IG4uV24udm4odCwgcykpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgdGhlIGxhcmdlc3QgKGxhdGVzdCkgYmF0Y2ggaWQgaW4gbXV0YXRpb24gcXVldWUgdGhhdCBpcyBwZW5kaW5nXG4gKiBzZXJ2ZXIgcmVzcG9uc2UuXG4gKlxuICogUmV0dXJucyBgQkFUQ0hJRF9VTktOT1dOYCBpZiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gKi8gKHMubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIC8vIFRoZSBsb2NhbCBzdG9yZSBtYXkgb3IgbWF5IG5vdCBiZSBhYmxlIHRvIGFwcGx5IHRoZSB3cml0ZSByZXN1bHQgYW5kXG4gICAgICAgIC8vIHJhaXNlIGV2ZW50cyBpbW1lZGlhdGVseSAoZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHdhdGNoZXIgaXMgY2F1Z2h0IHVwKSxcbiAgICAgICAgLy8gc28gd2UgcmFpc2UgdXNlciBjYWxsYmFja3MgZmlyc3Qgc28gdGhhdCB0aGV5IGNvbnNpc3RlbnRseSBoYXBwZW4gYmVmb3JlXG4gICAgICAgIC8vIGxpc3RlbiBldmVudHMuXG4gICAgICAgICAgICAgICAgbWEocywgZSwgbiksIF9hKHMsIGUpLCBzLnNoYXJlZENsaWVudFN0YXRlLnVwZGF0ZU11dGF0aW9uU3RhdGUoZSwgXCJyZWplY3RlZFwiLCBuKSwgXG4gICAgICAgIGF3YWl0IElhKHMsIHQpO1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgYXdhaXQgQmkobik7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHVzZXIgY2FsbGJhY2sgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBwZW5kaW5nIG11dGF0aW9ucyBhdCB0aGUgbW9tZW50IG9mIGNhbGxpbmdcbiAqIGFyZSBhY2tub3dsZWRnZWQgLlxuICovIGFzeW5jIGZ1bmN0aW9uIHdhKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KTtcbiAgICBnbyhuLnJlbW90ZVN0b3JlKSB8fCAkKFwiU3luY0VuZ2luZVwiLCBcIlRoZSBuZXR3b3JrIGlzIGRpc2FibGVkLiBUaGUgdGFzayByZXR1cm5lZCBieSAnYXdhaXRQZW5kaW5nV3JpdGVzKCknIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBuZXR3b3JrIGlzIGVuYWJsZWQuXCIpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gcSh0KTtcbiAgICAgICAgICAgIHJldHVybiBlLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IGhpZ2hlc3QgdW5hY2tub3dsZWRnZWQgYmF0Y2ggaWRcIiwgXCJyZWFkb25seVwiLCAodCA9PiBlLkFuLmdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQodCkpKTtcbiAgICAgICAgfShuLmxvY2FsU3RvcmUpO1xuICAgICAgICBpZiAoLTEgPT09IHQpIFxuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBjYWxsYmFjayByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgd3JpdGVzIGF0IHRoZSBtb21lbnQuXG4gICAgICAgIHJldHVybiB2b2lkIGUucmVzb2x2ZSgpO1xuICAgICAgICBjb25zdCBzID0gbi5qby5nZXQodCkgfHwgW107XG4gICAgICAgIHMucHVzaChlKSwgbi5qby5zZXQodCwgcyk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBjb25zdCBuID0gT28odCwgXCJJbml0aWFsaXphdGlvbiBvZiB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpIG9wZXJhdGlvbiBmYWlsZWRcIik7XG4gICAgICAgIGUucmVqZWN0KG4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmlnZ2VycyB0aGUgY2FsbGJhY2tzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoaXMgYmF0Y2ggaWQgdG8gZ2V0IGFja25vd2xlZGdlZCBieSBzZXJ2ZXIsXG4gKiBpZiB0aGVyZSBhcmUgYW55LlxuICovIGZ1bmN0aW9uIF9hKHQsIGUpIHtcbiAgICAodC5qby5nZXQoZSkgfHwgW10pLmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0LnJlc29sdmUoKTtcbiAgICB9KSksIHQuam8uZGVsZXRlKGUpO1xufVxuXG4vKiogUmVqZWN0IGFsbCBvdXRzdGFuZGluZyBjYWxsYmFja3Mgd2FpdGluZyBmb3IgcGVuZGluZyB3cml0ZXMgdG8gY29tcGxldGUuICovIGZ1bmN0aW9uIG1hKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gcSh0KTtcbiAgICBsZXQgaSA9IHMuS29bcy5jdXJyZW50VXNlci50b0tleSgpXTtcbiAgICAvLyBOT1RFOiBNdXRhdGlvbnMgcmVzdG9yZWQgZnJvbSBwZXJzaXN0ZW5jZSB3b24ndCBoYXZlIGNhbGxiYWNrcywgc28gaXQnc1xuICAgIC8vIG9rYXkgZm9yIHRoZXJlIHRvIGJlIG5vIGNhbGxiYWNrIGZvciB0aGlzIElELlxuICAgICAgICBpZiAoaSkge1xuICAgICAgICBjb25zdCB0ID0gaS5nZXQoZSk7XG4gICAgICAgIHQgJiYgKG4gPyB0LnJlamVjdChuKSA6IHQucmVzb2x2ZSgpLCBpID0gaS5yZW1vdmUoZSkpLCBzLktvW3MuY3VycmVudFVzZXIudG9LZXkoKV0gPSBpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2EodCwgZSwgbiA9IG51bGwpIHtcbiAgICB0LnNoYXJlZENsaWVudFN0YXRlLnJlbW92ZUxvY2FsUXVlcnlUYXJnZXQoZSk7XG4gICAgZm9yIChjb25zdCBzIG9mIHQuTW8uZ2V0KGUpKSB0Lk9vLmRlbGV0ZShzKSwgbiAmJiB0LkZvLnpvKHMsIG4pO1xuICAgIGlmICh0Lk1vLmRlbGV0ZShlKSwgdC5pc1ByaW1hcnlDbGllbnQpIHtcbiAgICAgICAgdC5xby51cyhlKS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucW8uY29udGFpbnNLZXkoZSkgfHwgXG4gICAgICAgICAgICAvLyBXZSByZW1vdmVkIHRoZSBsYXN0IHJlZmVyZW5jZSBmb3IgdGhpcyBrZXlcbiAgICAgICAgICAgIHlhKHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB5YSh0LCBlKSB7XG4gICAgdC5Mby5kZWxldGUoZS5wYXRoLmNhbm9uaWNhbFN0cmluZygpKTtcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHRhcmdldCBhbHJlYWR5IGdvdCByZW1vdmVkIGJlY2F1c2UgdGhlIHF1ZXJ5IGZhaWxlZC4gSW4gdGhhdCBjYXNlLFxuICAgIC8vIHRoZSBrZXkgd29uJ3QgZXhpc3QgaW4gYGxpbWJvVGFyZ2V0c0J5S2V5YC4gT25seSBkbyB0aGUgY2xlYW51cCBpZiB3ZSBzdGlsbCBoYXZlIHRoZSB0YXJnZXQuXG4gICAgY29uc3QgbiA9IHQuQm8uZ2V0KGUpO1xuICAgIG51bGwgIT09IG4gJiYgKGxvKHQucmVtb3RlU3RvcmUsIG4pLCB0LkJvID0gdC5Cby5yZW1vdmUoZSksIHQuVW8uZGVsZXRlKG4pLCBFYSh0KSk7XG59XG5cbmZ1bmN0aW9uIHBhKHQsIGUsIG4pIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgbikgaWYgKHMgaW5zdGFuY2VvZiBabykgdC5xby5hZGRSZWZlcmVuY2Uocy5rZXksIGUpLCBUYSh0LCBzKTsgZWxzZSBpZiAocyBpbnN0YW5jZW9mIHRhKSB7XG4gICAgICAgICQoXCJTeW5jRW5naW5lXCIsIFwiRG9jdW1lbnQgbm8gbG9uZ2VyIGluIGxpbWJvOiBcIiArIHMua2V5KSwgdC5xby5yZW1vdmVSZWZlcmVuY2Uocy5rZXksIGUpO1xuICAgICAgICB0LnFvLmNvbnRhaW5zS2V5KHMua2V5KSB8fCBcbiAgICAgICAgLy8gV2UgcmVtb3ZlZCB0aGUgbGFzdCByZWZlcmVuY2UgZm9yIHRoaXMga2V5XG4gICAgICAgIHlhKHQsIHMua2V5KTtcbiAgICB9IGVsc2UgTCgpO1xufVxuXG5mdW5jdGlvbiBUYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUua2V5LCBzID0gbi5wYXRoLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIHQuQm8uZ2V0KG4pIHx8IHQuTG8uaGFzKHMpIHx8ICgkKFwiU3luY0VuZ2luZVwiLCBcIk5ldyBkb2N1bWVudCBpbiBsaW1ibzogXCIgKyBuKSwgdC5Mby5hZGQocyksIFxuICAgIEVhKHQpKTtcbn1cblxuLyoqXG4gKiBTdGFydHMgbGlzdGVucyBmb3IgZG9jdW1lbnRzIGluIGxpbWJvIHRoYXQgYXJlIGVucXVldWVkIGZvciByZXNvbHV0aW9uLFxuICogc3ViamVjdCB0byBhIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMuXG4gKlxuICogV2l0aG91dCBib3VuZGluZyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVzb2x1dGlvbnMsIHRoZSBzZXJ2ZXIgY2FuIGZhaWxcbiAqIHdpdGggXCJyZXNvdXJjZSBleGhhdXN0ZWRcIiBlcnJvcnMgd2hpY2ggY2FuIGxlYWQgdG8gcGF0aG9sb2dpY2FsIGNsaWVudFxuICogYmVoYXZpb3IgYXMgc2VlbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2lzc3Vlcy8yNjgzLlxuICovIGZ1bmN0aW9uIEVhKHQpIHtcbiAgICBmb3IgKDt0LkxvLnNpemUgPiAwICYmIHQuQm8uc2l6ZSA8IHQubWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnM7ICkge1xuICAgICAgICBjb25zdCBlID0gdC5Mby52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIHQuTG8uZGVsZXRlKGUpO1xuICAgICAgICBjb25zdCBuID0gbmV3IFN0KGR0LmZyb21TdHJpbmcoZSkpLCBzID0gdC5Rby5uZXh0KCk7XG4gICAgICAgIHQuVW8uc2V0KHMsIG5ldyBzYShuKSksIHQuQm8gPSB0LkJvLmluc2VydChuLCBzKSwgaG8odC5yZW1vdGVTdG9yZSwgbmV3IGFpKFJlKGdlKG4ucGF0aCkpLCBzLCAyIC8qIExpbWJvUmVzb2x1dGlvbiAqLyAsIGV0LkkpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIElhKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gcSh0KSwgaSA9IFtdLCByID0gW10sIG8gPSBbXTtcbiAgICBzLk9vLmlzRW1wdHkoKSB8fCAocy5Pby5mb3JFYWNoKCgodCwgYSkgPT4ge1xuICAgICAgICBvLnB1c2gocy5HbyhhLCBlLCBuKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVRdWVyeVN0YXRlKGEudGFyZ2V0SWQsIHQuZnJvbUNhY2hlID8gXCJub3QtY3VycmVudFwiIDogXCJjdXJyZW50XCIpLCBcbiAgICAgICAgICAgICAgICBpLnB1c2godCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHVyLiRuKGEudGFyZ2V0SWQsIHQpO1xuICAgICAgICAgICAgICAgIHIucHVzaChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpKTtcbiAgICB9KSksIGF3YWl0IFByb21pc2UuYWxsKG8pLCBzLkZvLlByKGkpLCBhd2FpdCBhc3luYyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBxKHQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIm5vdGlmeUxvY2FsVmlld0NoYW5nZXNcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gR3MuZm9yRWFjaChlLCAoZSA9PiBHcy5mb3JFYWNoKGUua24sIChzID0+IG4ucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUuYWRkUmVmZXJlbmNlKHQsIGUudGFyZ2V0SWQsIHMpKSkubmV4dCgoKCkgPT4gR3MuZm9yRWFjaChlLnhuLCAocyA9PiBuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnJlbW92ZVJlZmVyZW5jZSh0LCBlLnRhcmdldElkLCBzKSkpKSkpKSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBpZiAoIVhzKHQpKSB0aHJvdyB0O1xuICAgICAgICAgICAgLy8gSWYgYG5vdGlmeUxvY2FsVmlld0NoYW5nZXNgIGZhaWxzLCB3ZSBkaWQgbm90IGFkdmFuY2UgdGhlIHNlcXVlbmNlXG4gICAgICAgICAgICAvLyBudW1iZXIgZm9yIHRoZSBkb2N1bWVudHMgdGhhdCB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRyaWdnZXIgdGhlbSB0byBiZSBkZWxldGVkIGVhcmxpZXIgdGhhbiB0aGV5IG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gd291bGQgaGF2ZSwgYnV0IGl0IHNob3VsZCBub3QgaW52YWxpZGF0ZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkYXRhLlxuICAgICAgICAgICAgJChcIkxvY2FsU3RvcmVcIiwgXCJGYWlsZWQgdG8gdXBkYXRlIHNlcXVlbmNlIG51bWJlcnM6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkO1xuICAgICAgICAgICAgaWYgKCF0LmZyb21DYWNoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuLnFuLmdldChlKSwgcyA9IHQuc25hcHNob3RWZXJzaW9uLCBpID0gdC53aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbihzKTtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBsYXN0IGxpbWJvIGZyZWUgc25hcHNob3QgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnFuID0gbi5xbi5pbnNlcnQoZSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KHMubG9jYWxTdG9yZSwgcikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBBYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHEodCk7XG4gICAgaWYgKCFuLmN1cnJlbnRVc2VyLmlzRXF1YWwoZSkpIHtcbiAgICAgICAgJChcIlN5bmNFbmdpbmVcIiwgXCJVc2VyIGNoYW5nZS4gTmV3IHVzZXI6XCIsIGUudG9LZXkoKSk7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBkcihuLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICBuLmN1cnJlbnRVc2VyID0gZSwgXG4gICAgICAgIC8vIEZhaWxzIHRhc2tzIHdhaXRpbmcgZm9yIHBlbmRpbmcgd3JpdGVzIHJlcXVlc3RlZCBieSBwcmV2aW91cyB1c2VyLlxuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICB0LmpvLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHQucmVqZWN0KG5ldyBqKEsuQ0FOQ0VMTEVELCBlKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCB0LmpvLmNsZWFyKCk7XG4gICAgICAgIH0obiwgXCInd2FpdEZvclBlbmRpbmdXcml0ZXMnIHByb21pc2UgaXMgcmVqZWN0ZWQgZHVlIHRvIGEgdXNlciBjaGFuZ2UuXCIpLCBcbiAgICAgICAgLy8gVE9ETyhiLzExNDIyNjQxNyk6IENvbnNpZGVyIGNhbGxpbmcgdGhpcyBvbmx5IGluIHRoZSBwcmltYXJ5IHRhYi5cbiAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5oYW5kbGVVc2VyQ2hhbmdlKGUsIHQucmVtb3ZlZEJhdGNoSWRzLCB0LmFkZGVkQmF0Y2hJZHMpLCBhd2FpdCBJYShuLCB0LkduKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFJhKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcSh0KSwgcyA9IG4uVW8uZ2V0KGUpO1xuICAgIGlmIChzICYmIHMuJG8pIHJldHVybiBTbigpLmFkZChzLmtleSk7XG4gICAge1xuICAgICAgICBsZXQgdCA9IFNuKCk7XG4gICAgICAgIGNvbnN0IHMgPSBuLk1vLmdldChlKTtcbiAgICAgICAgaWYgKCFzKSByZXR1cm4gdDtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBuLk9vLmdldChlKTtcbiAgICAgICAgICAgIHQgPSB0LnVuaW9uV2l0aChzLnZpZXcuUG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWNvbmNpbGUgdGhlIGxpc3Qgb2Ygc3luY2VkIGRvY3VtZW50cyBpbiBhbiBleGlzdGluZyB2aWV3IHdpdGggdGhvc2VcbiAqIGZyb20gcGVyc2lzdGVuY2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24gUGEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gYXdhaXQgRXIobi5sb2NhbFN0b3JlLCBlLnF1ZXJ5LCBcbiAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgaSA9IGUudmlldy5rbyhzKTtcbiAgICByZXR1cm4gbi5pc1ByaW1hcnlDbGllbnQgJiYgcGEobiwgZS50YXJnZXRJZCwgaS5DbyksIGk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIG5ld2x5IGNoYW5nZWQgZG9jdW1lbnRzIGZyb20gcmVtb3RlIGRvY3VtZW50IGNhY2hlIGFuZCByYWlzZXNcbiAqIHNuYXBzaG90cyBpZiBuZWVkZWQuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiBiYSh0KSB7XG4gICAgY29uc3QgZSA9IHEodCk7XG4gICAgcmV0dXJuIEFyKGUubG9jYWxTdG9yZSkudGhlbigodCA9PiBJYShlLCB0KSkpO1xufVxuXG4vKiogQXBwbGllcyBhIG11dGF0aW9uIHN0YXRlIHRvIGFuIGV4aXN0aW5nIGJhdGNoLiAgKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5hc3luYyBmdW5jdGlvbiB2YSh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IHEodCksIHIgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gcShuLkFuKTtcbiAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJMb29rdXAgbXV0YXRpb24gZG9jdW1lbnRzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gcy5adCh0LCBlKS5uZXh0KChlID0+IGUgPyBuLlduLnZuKHQsIGUpIDogR3MucmVzb2x2ZShudWxsKSkpKSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSk7XG4gICAgbnVsbCAhPT0gciA/IChcInBlbmRpbmdcIiA9PT0gbiA/IFxuICAgIC8vIElmIHdlIGFyZSB0aGUgcHJpbWFyeSBjbGllbnQsIHdlIG5lZWQgdG8gc2VuZCB0aGlzIHdyaXRlIHRvIHRoZVxuICAgIC8vIGJhY2tlbmQuIFNlY29uZGFyeSBjbGllbnRzIHdpbGwgaWdub3JlIHRoZXNlIHdyaXRlcyBzaW5jZSB0aGVpciByZW1vdGVcbiAgICAvLyBjb25uZWN0aW9uIGlzIGRpc2FibGVkLlxuICAgIGF3YWl0IFJvKGkucmVtb3RlU3RvcmUpIDogXCJhY2tub3dsZWRnZWRcIiA9PT0gbiB8fCBcInJlamVjdGVkXCIgPT09IG4gPyAoXG4gICAgLy8gTk9URTogQm90aCB0aGVzZSBtZXRob2RzIGFyZSBuby1vcHMgZm9yIGJhdGNoZXMgdGhhdCBvcmlnaW5hdGVkIGZyb21cbiAgICAvLyBvdGhlciBjbGllbnRzLlxuICAgIG1hKGksIGUsIHMgfHwgbnVsbCksIF9hKGksIGUpLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIHEocSh0KS5BbikuZWUoZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgKGkubG9jYWxTdG9yZSwgZSkpIDogTCgpLCBhd2FpdCBJYShpLCByKSkgOiBcbiAgICAvLyBBIHRocm90dGxlZCB0YWIgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIG11dGF0aW9uIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkXG4gICAgLy8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgbXV0YXRpb24gcXVldWUsIGluIHdoaWNoIGNhc2Ugd2Ugd29uJ3QgaGF2ZSBjYWNoZWRcbiAgICAvLyB0aGUgYWZmZWN0ZWQgZG9jdW1lbnRzLiBJbiB0aGlzIGNhc2Ugd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIHVwZGF0ZVxuICAgIC8vIHNpbmNlIHRoYXQgbWVhbnMgd2UgZGlkbid0IGFwcGx5IHRoZSBtdXRhdGlvbiBsb2NhbGx5IGF0IGFsbCAoaWYgd2VcbiAgICAvLyBoYWQsIHdlIHdvdWxkIGhhdmUgY2FjaGVkIHRoZSBhZmZlY3RlZCBkb2N1bWVudHMpLCBhbmQgc28gd2Ugd2lsbCBqdXN0XG4gICAgLy8gc2VlIGFueSByZXN1bHRpbmcgZG9jdW1lbnQgY2hhbmdlcyB2aWEgbm9ybWFsIHJlbW90ZSBkb2N1bWVudCB1cGRhdGVzXG4gICAgLy8gYXMgYXBwbGljYWJsZS5cbiAgICAkKFwiU3luY0VuZ2luZVwiLCBcIkNhbm5vdCBhcHBseSBtdXRhdGlvbiBiYXRjaCB3aXRoIGlkOiBcIiArIGUpO1xufVxuXG4vKiogQXBwbGllcyBhIHF1ZXJ5IHRhcmdldCBjaGFuZ2UgZnJvbSBhIGRpZmZlcmVudCB0YWIuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuYXN5bmMgZnVuY3Rpb24gVmEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBxKHQpO1xuICAgIGlmICh4YShuKSwgJGEobiksICEwID09PSBlICYmICEwICE9PSBuLldvKSB7XG4gICAgICAgIC8vIFNlY29uZGFyeSB0YWJzIG9ubHkgbWFpbnRhaW4gVmlld3MgZm9yIHRoZWlyIGxvY2FsIGxpc3RlbmVycyBhbmQgdGhlXG4gICAgICAgIC8vIFZpZXdzIGludGVybmFsIHN0YXRlIG1heSBub3QgYmUgMTAwJSBwb3B1bGF0ZWQgKGluIHBhcnRpY3VsYXJcbiAgICAgICAgLy8gc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgdHJhY2sgc3luY2VkRG9jdW1lbnRzLCB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGVcbiAgICAgICAgLy8gc2VydmVyIGNvbnNpZGVycyB0byBiZSBpbiB0aGUgdGFyZ2V0KS4gU28gd2hlbiBhIHNlY29uZGFyeSBiZWNvbWVzXG4gICAgICAgIC8vIHByaW1hcnksIHdlIG5lZWQgdG8gbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdmlld3MgZm9yIGFsbCB0YXJnZXRzXG4gICAgICAgIC8vIG1hdGNoIHRoZSBzdGF0ZSBvbiBkaXNrLlxuICAgICAgICBjb25zdCB0ID0gbi5zaGFyZWRDbGllbnRTdGF0ZS5nZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMoKSwgZSA9IGF3YWl0IFNhKG4sIHQudG9BcnJheSgpKTtcbiAgICAgICAgbi5XbyA9ICEwLCBhd2FpdCBrbyhuLnJlbW90ZVN0b3JlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSBobyhuLnJlbW90ZVN0b3JlLCB0KTtcbiAgICB9IGVsc2UgaWYgKCExID09PSBlICYmICExICE9PSBuLldvKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgbGV0IGUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgbi5Nby5mb3JFYWNoKCgocywgaSkgPT4ge1xuICAgICAgICAgICAgbi5zaGFyZWRDbGllbnRTdGF0ZS5pc0xvY2FsUXVlcnlUYXJnZXQoaSkgPyB0LnB1c2goaSkgOiBlID0gZS50aGVuKCgoKSA9PiAoZ2EobiwgaSksIFxuICAgICAgICAgICAgVHIobi5sb2NhbFN0b3JlLCBpLCBcbiAgICAgICAgICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITApKSkpLCBsbyhuLnJlbW90ZVN0b3JlLCBpKTtcbiAgICAgICAgfSkpLCBhd2FpdCBlLCBhd2FpdCBTYShuLCB0KSwgXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgICAgICAgICAgZS5Vby5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGxvKGUucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICAgICAgfSkpLCBlLnFvLmhzKCksIGUuVW8gPSBuZXcgTWFwLCBlLkJvID0gbmV3IGduKFN0LmNvbXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmVjb25jaWxlIHRoZSBxdWVyeSB2aWV3cyBvZiB0aGUgcHJvdmlkZWQgcXVlcnkgdGFyZ2V0cyB3aXRoIHRoZSBzdGF0ZSBmcm9tXG4gKiBwZXJzaXN0ZW5jZS4gUmFpc2VzIHNuYXBzaG90cyBmb3IgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIGxvY2FsXG4gKiBjbGllbnQgYW5kIHJldHVybnMgdGhlIHVwZGF0ZWQgc3RhdGUgb2YgYWxsIHRhcmdldCdzIHF1ZXJ5IGRhdGEuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBUaGUgc3luYyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB0YXJnZXRzIC0gdGhlIGxpc3Qgb2YgdGFyZ2V0cyB3aXRoIHZpZXdzIHRoYXQgbmVlZCB0byBiZSByZWNvbXB1dGVkXG4gKiBAcGFyYW0gdHJhbnNpdGlvblRvUHJpbWFyeSAtIGB0cnVlYCBpZmYgdGhlIHRhYiB0cmFuc2l0aW9ucyBmcm9tIGEgc2Vjb25kYXJ5XG4gKiB0YWIgdG8gYSBwcmltYXJ5IHRhYlxuICovXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG4gICAgICAgIChuKSwgbi5XbyA9ICExLCBhd2FpdCBrbyhuLnJlbW90ZVN0b3JlLCAhMSk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBTYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHEodCksIGkgPSBbXSwgciA9IFtdO1xuICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICBjb25zdCBuID0gcy5Nby5nZXQodCk7XG4gICAgICAgIGlmIChuICYmIDAgIT09IG4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGb3IgcXVlcmllcyB0aGF0IGhhdmUgYSBsb2NhbCBWaWV3LCB3ZSBmZXRjaCB0aGVpciBjdXJyZW50IHN0YXRlXG4gICAgICAgICAgICAvLyBmcm9tIExvY2FsU3RvcmUgKGFzIHRoZSByZXN1bWUgdG9rZW4gYW5kIHRoZSBzbmFwc2hvdCB2ZXJzaW9uXG4gICAgICAgICAgICAvLyBtaWdodCBoYXZlIGNoYW5nZWQpIGFuZCByZWNvbmNpbGUgdGhlaXIgdmlld3Mgd2l0aCB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAvLyBzdGF0ZSAodGhlIGxpc3Qgb2Ygc3luY2VkRG9jdW1lbnRzIG1heSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYykuXG4gICAgICAgICAgICBlID0gYXdhaXQgcHIocy5sb2NhbFN0b3JlLCBSZShuWzBdKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBzLk9vLmdldCh0KSwgbiA9IGF3YWl0IFBhKHMsIGUpO1xuICAgICAgICAgICAgICAgIG4uc25hcHNob3QgJiYgci5wdXNoKG4uc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHF1ZXJpZXMgdGhhdCBuZXZlciBleGVjdXRlZCBvbiB0aGlzIGNsaWVudCwgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlIHRhcmdldCBpbiBMb2NhbFN0b3JlIGFuZCBpbml0aWFsaXplIGEgbmV3IFZpZXcuXG4gICAgICAgICAgICBjb25zdCBuID0gYXdhaXQgSXIocy5sb2NhbFN0b3JlLCB0KTtcbiAgICAgICAgICAgIGUgPSBhd2FpdCBwcihzLmxvY2FsU3RvcmUsIG4pLCBhd2FpdCBvYShzLCBEYShuKSwgdCwgXG4gICAgICAgICAgICAvKmN1cnJlbnQ9Ki8gITEpO1xuICAgICAgICB9XG4gICAgICAgIGkucHVzaChlKTtcbiAgICB9XG4gICAgcmV0dXJuIHMuRm8uUHIociksIGk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBRdWVyeWAgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBgVGFyZ2V0YC4gVGhlcmUgaXMgbm8gd2F5IHRvXG4gKiBvYnRhaW4gdGhlIG9yaWdpbmFsIGBRdWVyeWAsIHNvIHdlIHN5bnRoZXNpemUgYSBgUXVlcnlgIGZyb20gdGhlIGBUYXJnZXRgXG4gKiBvYmplY3QuXG4gKlxuICogVGhlIHN5bnRoZXNpemVkIHJlc3VsdCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgYFF1ZXJ5YCwgYnV0XG4gKiBzaW5jZSB0aGUgc3ludGhlc2l6ZWQgYFF1ZXJ5YCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlXG4gKiBvcmlnaW5hbCBvbmUgKG9ubHkgdGhlIHByZXNlbnRhdGlvbiBvZiByZXN1bHRzIG1pZ2h0IGRpZmZlciksIHRoZSBwb3RlbnRpYWxcbiAqIGRpZmZlcmVuY2Ugd2lsbCBub3QgY2F1c2UgaXNzdWVzLlxuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gRGEodCkge1xuICAgIHJldHVybiBtZSh0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0Lm9yZGVyQnksIHQuZmlsdGVycywgdC5saW1pdCwgXCJGXCIgLyogRmlyc3QgKi8gLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgSURzIG9mIHRoZSBjbGllbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gQ2EodCkge1xuICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgIHJldHVybiBxKHEoZS5sb2NhbFN0b3JlKS5wZXJzaXN0ZW5jZSkuVG4oKTtcbn1cblxuLyoqIEFwcGxpZXMgYSBxdWVyeSB0YXJnZXQgY2hhbmdlIGZyb20gYSBkaWZmZXJlbnQgdGFiLiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIE5hKHQsIGUsIG4sIHMpIHtcbiAgICBjb25zdCBpID0gcSh0KTtcbiAgICBpZiAoaS5XbykgXG4gICAgLy8gSWYgd2UgcmVjZWl2ZSBhIHRhcmdldCBzdGF0ZSBub3RpZmljYXRpb24gdmlhIFdlYlN0b3JhZ2UsIHdlIGFyZVxuICAgIC8vIGVpdGhlciBhbHJlYWR5IHNlY29uZGFyeSBvciBhbm90aGVyIHRhYiBoYXMgdGFrZW4gdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgJChcIlN5bmNFbmdpbmVcIiwgXCJJZ25vcmluZyB1bmV4cGVjdGVkIHF1ZXJ5IHN0YXRlIG5vdGlmaWNhdGlvbi5cIik7IGVsc2UgaWYgKGkuTW8uaGFzKGUpKSBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgXCJjdXJyZW50XCI6XG4gICAgICBjYXNlIFwibm90LWN1cnJlbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IGF3YWl0IEFyKGkubG9jYWxTdG9yZSksIHMgPSBObi5jcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZShlLCBcImN1cnJlbnRcIiA9PT0gbik7XG4gICAgICAgICAgICBhd2FpdCBJYShpLCB0LCBzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICBhd2FpdCBUcihpLmxvY2FsU3RvcmUsIGUsIFxuICAgICAgICAvKiBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YSAqLyAhMCksIGdhKGksIGUsIHMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgTCgpO1xuICAgIH1cbn1cblxuLyoqIEFkZHMgb3IgcmVtb3ZlcyBXYXRjaCB0YXJnZXRzIGZvciBxdWVyaWVzIGZyb20gZGlmZmVyZW50IHRhYnMuICovIGFzeW5jIGZ1bmN0aW9uIGthKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0geGEodCk7XG4gICAgaWYgKHMuV28pIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmIChzLk1vLmhhcyh0KSkge1xuICAgICAgICAgICAgICAgIC8vIEEgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBpbiBhIHByZXZpb3VzIGF0dGVtcHRcbiAgICAgICAgICAgICAgICAkKFwiU3luY0VuZ2luZVwiLCBcIkFkZGluZyBhbiBhbHJlYWR5IGFjdGl2ZSB0YXJnZXQgXCIgKyB0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGUgPSBhd2FpdCBJcihzLmxvY2FsU3RvcmUsIHQpLCBuID0gYXdhaXQgcHIocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgICAgIGF3YWl0IG9hKHMsIERhKGUpLCBuLnRhcmdldElkLCBcbiAgICAgICAgICAgIC8qY3VycmVudD0qLyAhMSksIGhvKHMucmVtb3RlU3RvcmUsIG4pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBuKSBcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0aWxsIGFjdGl2ZSBzaW5jZSB0aGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlblxuICAgICAgICAvLyByZW1vdmVkIGlmIGl0IGhhcyBiZWVuIHJlamVjdGVkIGJ5IHRoZSBiYWNrZW5kLlxuICAgICAgICBzLk1vLmhhcyh0KSAmJiBcbiAgICAgICAgLy8gUmVsZWFzZSBxdWVyaWVzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS5cbiAgICAgICAgYXdhaXQgVHIocy5sb2NhbFN0b3JlLCB0LCBcbiAgICAgICAgLyoga2VlcFBlcnNpc3RlZFRhcmdldERhdGEgKi8gITEpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIGxvKHMucmVtb3RlU3RvcmUsIHQpLCBnYShzLCB0KTtcbiAgICAgICAgfSkpLmNhdGNoKEJpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHhhKHQpIHtcbiAgICBjb25zdCBlID0gcSh0KTtcbiAgICByZXR1cm4gZS5yZW1vdGVTdG9yZS5yZW1vdGVTeW5jZXIuYXBwbHlSZW1vdGVFdmVudCA9IHVhLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQgPSBSYS5iaW5kKG51bGwsIGUpLCBcbiAgICBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5yZWplY3RMaXN0ZW4gPSBsYS5iaW5kKG51bGwsIGUpLCBlLkZvLlByID0gUW8uYmluZChudWxsLCBlLmV2ZW50TWFuYWdlciksIFxuICAgIGUuRm8uem8gPSBXby5iaW5kKG51bGwsIGUuZXZlbnRNYW5hZ2VyKSwgZTtcbn1cblxuZnVuY3Rpb24gJGEodCkge1xuICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgIHJldHVybiBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5hcHBseVN1Y2Nlc3NmdWxXcml0ZSA9IGZhLmJpbmQobnVsbCwgZSksIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLnJlamVjdEZhaWxlZFdyaXRlID0gZGEuYmluZChudWxsLCBlKSwgXG4gICAgZTtcbn1cblxuLyoqXG4gKiBMb2FkcyBhIEZpcmVzdG9yZSBidW5kbGUgaW50byB0aGUgU0RLLiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyB3aGVuXG4gKiB0aGUgYnVuZGxlIGZpbmlzaGVkIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHN5bmNFbmdpbmUgLSBTeW5jRW5naW5lIHRvIHVzZS5cbiAqIEBwYXJhbSBidW5kbGVSZWFkZXIgLSBCdW5kbGUgdG8gbG9hZCBpbnRvIHRoZSBTREsuXG4gKiBAcGFyYW0gdGFzayAtIExvYWRCdW5kbGVUYXNrIHVzZWQgdG8gdXBkYXRlIHRoZSBsb2FkaW5nIHByb2dyZXNzIHRvIHB1YmxpYyBBUEkuXG4gKi8gZnVuY3Rpb24gRmEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBxKHQpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gR24oZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcImhhc05ld2VyQnVuZGxlXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5ZZS5nZXRCdW5kbGVNZXRhZGF0YSh0LCBlLmlkKSkpLnRoZW4oKHQgPT4gISF0ICYmIHQuY3JlYXRlVGltZS5jb21wYXJlVG8ocykgPj0gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYEJ1bmRsZU1ldGFkYXRhYCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqLyAodC5sb2NhbFN0b3JlLCBzKSkgcmV0dXJuIGF3YWl0IGUuY2xvc2UoKSwgdm9pZCBuLl9jb21wbGV0ZVdpdGgoZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tTdGF0ZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50c0xvYWRlZDogdC50b3RhbERvY3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXNMb2FkZWQ6IHQudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxEb2N1bWVudHM6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXM6IHQudG90YWxCeXRlc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHMpKTtcbiAgICAgICAgICAgIG4uX3VwZGF0ZVByb2dyZXNzKFhvKHMpKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgWW8ocywgdC5sb2NhbFN0b3JlLCBlLmspO1xuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBlLkhvKCk7XG4gICAgICAgICAgICBmb3IgKDtyOyApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgaS55byhyKTtcbiAgICAgICAgICAgICAgICB0ICYmIG4uX3VwZGF0ZVByb2dyZXNzKHQpLCByID0gYXdhaXQgZS5IbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbyA9IGF3YWl0IGkuY29tcGxldGUoKTtcbiAgICAgICAgICAgIC8vIFRPRE8oYi8xNjA4NzY0NDMpOiBUaGlzIGN1cnJlbnRseSByYWlzZXMgc25hcHNob3RzIHdpdGhcbiAgICAgICAgICAgIC8vIGBmcm9tQ2FjaGU9ZmFsc2VgIGlmIHVzZXJzIGFscmVhZHkgbGlzdGVuIHRvIHNvbWUgcXVlcmllcyBhbmQgYnVuZGxlc1xuICAgICAgICAgICAgLy8gaGFzIG5ld2VyIHZlcnNpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBJYSh0LCBvLkluLCBcbiAgICAgICAgICAgIC8qIHJlbW90ZUV2ZW50ICovIHZvaWQgMCksIFxuICAgICAgICAgICAgLy8gU2F2ZSBtZXRhZGF0YSwgc28gbG9hZGluZyB0aGUgc2FtZSBidW5kbGUgd2lsbCBza2lwLlxuICAgICAgICAgICAgYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBxKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiU2F2ZSBidW5kbGVcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gbi5ZZS5zYXZlQnVuZGxlTWV0YWRhdGEodCwgZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBgTmFtZWRRdWVyeWAgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHF1ZXJ5IG5hbWUuIFByb21pc2VcbiAqIHJlc29sdmVzIHRvIHVuZGVmaW5lZCBpZiBubyBwZXJzaXN0ZWQgZGF0YSBjYW4gYmUgZm91bmQuXG4gKi8gKHQubG9jYWxTdG9yZSwgcyksIG4uX2NvbXBsZXRlV2l0aChvLnByb2dyZXNzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgTyhcIlN5bmNFbmdpbmVcIiwgYExvYWRpbmcgYnVuZGxlIGZhaWxlZCB3aXRoICR7dH1gKSwgbi5fZmFpbFdpdGgodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKipcbiAqIFByb3ZpZGVzIGFsbCBjb21wb25lbnRzIG5lZWRlZCBmb3IgRmlyZXN0b3JlIHdpdGggaW4tbWVtb3J5IHBlcnNpc3RlbmNlLlxuICogVXNlcyBFYWdlckdDIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqLykocywgZSwgbikudGhlbigoKCkgPT4ge1xuICAgICAgICBzLnNoYXJlZENsaWVudFN0YXRlLm5vdGlmeUJ1bmRsZUxvYWRlZCgpO1xuICAgIH0pKTtcbn1cblxuY2xhc3MgT2Ege1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplVGFicyA9ICExO1xuICAgIH1cbiAgICBhc3luYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgdGhpcy5rID0gdG8odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUgPSB0aGlzLkpvKHQpLCB0aGlzLnBlcnNpc3RlbmNlID0gdGhpcy5Zbyh0KSwgXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2Uuc3RhcnQoKSwgdGhpcy5nY1NjaGVkdWxlciA9IHRoaXMuWG8odCksIHRoaXMubG9jYWxTdG9yZSA9IHRoaXMuWm8odCk7XG4gICAgfVxuICAgIFhvKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFpvKHQpIHtcbiAgICAgICAgcmV0dXJuIGZyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBociwgdC5pbml0aWFsVXNlciwgdGhpcy5rKTtcbiAgICB9XG4gICAgWW8odCkge1xuICAgICAgICByZXR1cm4gbmV3IHhyKEZyLmtzLCB0aGlzLmspO1xuICAgIH1cbiAgICBKbyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgV3I7XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5nY1NjaGVkdWxlciAmJiB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zaHV0ZG93bigpLCBcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zaHV0ZG93bigpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS5cbiAqLyBjbGFzcyBNYSBleHRlbmRzIE9hIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMudGEgPSB0LCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gZSwgdGhpcy5mb3JjZU93bmVyc2hpcCA9IG4sIHRoaXMuc3luY2hyb25pemVUYWJzID0gITE7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpLCBhd2FpdCBScih0aGlzLmxvY2FsU3RvcmUpLCBhd2FpdCB0aGlzLnRhLmluaXRpYWxpemUodGhpcywgdCksIFxuICAgICAgICAvLyBFbnF1ZXVlIHdyaXRlcyBmcm9tIGEgcHJldmlvdXMgc2Vzc2lvblxuICAgICAgICBhd2FpdCAkYSh0aGlzLnRhLnN5bmNFbmdpbmUpLCBhd2FpdCBSbyh0aGlzLnRhLnJlbW90ZVN0b3JlKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2Uuc24oKCgpID0+ICh0aGlzLmdjU2NoZWR1bGVyICYmICF0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0ZWQgJiYgdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpLCBcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkpKSk7XG4gICAgfVxuICAgIFpvKHQpIHtcbiAgICAgICAgcmV0dXJuIGZyKHRoaXMucGVyc2lzdGVuY2UsIG5ldyBociwgdC5pbml0aWFsVXNlciwgdGhpcy5rKTtcbiAgICB9XG4gICAgWG8odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5nYXJiYWdlQ29sbGVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IEtpKGUsIHQuYXN5bmNRdWV1ZSk7XG4gICAgfVxuICAgIFlvKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG9yKHQuZGF0YWJhc2VJbmZvLmRhdGFiYXNlSWQsIHQuZGF0YWJhc2VJbmZvLnBlcnNpc3RlbmNlS2V5KSwgbiA9IHZvaWQgMCAhPT0gdGhpcy5jYWNoZVNpemVCeXRlcyA/IHZpLndpdGhDYWNoZVNpemUodGhpcy5jYWNoZVNpemVCeXRlcykgOiB2aS5ERUZBVUxUO1xuICAgICAgICByZXR1cm4gbmV3IHNyKHRoaXMuc3luY2hyb25pemVUYWJzLCBlLCB0LmNsaWVudElkLCBuLCB0LmFzeW5jUXVldWUsIFhyKCksIFpyKCksIHRoaXMuaywgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgISF0aGlzLmZvcmNlT3duZXJzaGlwKTtcbiAgICB9XG4gICAgSm8odCkge1xuICAgICAgICByZXR1cm4gbmV3IFdyO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIG11bHRpLXRhYiBJbmRleGVkREJcbiAqIHBlcnNpc3RlbmNlLlxuICpcbiAqIEluIHRoZSBsZWdhY3kgY2xpZW50LCB0aGlzIHByb3ZpZGVyIGlzIHVzZWQgdG8gcHJvdmlkZSBib3RoIG11bHRpLXRhYiBhbmRcbiAqIG5vbi1tdWx0aS10YWIgcGVyc2lzdGVuY2Ugc2luY2Ugd2UgY2Fubm90IHRlbGwgYXQgYnVpbGQgdGltZSB3aGV0aGVyXG4gKiBgc3luY2hyb25pemVUYWJzYCB3aWxsIGJlIGVuYWJsZWQuXG4gKi8gY2xhc3MgTGEgZXh0ZW5kcyBNYSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBlLCAvKiBmb3JjZU93bmVyc2hpcD0gKi8gITEpLCB0aGlzLnRhID0gdCwgdGhpcy5jYWNoZVNpemVCeXRlcyA9IGUsIHRoaXMuc3luY2hyb25pemVUYWJzID0gITA7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpO1xuICAgICAgICBjb25zdCBlID0gdGhpcy50YS5zeW5jRW5naW5lO1xuICAgICAgICB0aGlzLnNoYXJlZENsaWVudFN0YXRlIGluc3RhbmNlb2YgUXIgJiYgKHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUuc3luY0VuZ2luZSA9IHtcbiAgICAgICAgICAgIG1pOiB2YS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAgZ2k6IE5hLmJpbmQobnVsbCwgZSksXG4gICAgICAgICAgICB5aToga2EuYmluZChudWxsLCBlKSxcbiAgICAgICAgICAgIFRuOiBDYS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAgX2k6IGJhLmJpbmQobnVsbCwgZSlcbiAgICAgICAgfSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zdGFydCgpKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2Uuc24oKGFzeW5jIHQgPT4ge1xuICAgICAgICAgICAgYXdhaXQgVmEodGhpcy50YS5zeW5jRW5naW5lLCB0KSwgdGhpcy5nY1NjaGVkdWxlciAmJiAodCAmJiAhdGhpcy5nY1NjaGVkdWxlci5zdGFydGVkID8gdGhpcy5nY1NjaGVkdWxlci5zdGFydCh0aGlzLmxvY2FsU3RvcmUpIDogdCB8fCB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgSm8odCkge1xuICAgICAgICBjb25zdCBlID0gWHIoKTtcbiAgICAgICAgaWYgKCFRci5idChlKSkgdGhyb3cgbmV3IGooSy5VTklNUExFTUVOVEVELCBcIkluZGV4ZWREQiBwZXJzaXN0ZW5jZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IExvY2FsU3RvcmFnZS5cIik7XG4gICAgICAgIGNvbnN0IG4gPSBvcih0LmRhdGFiYXNlSW5mby5kYXRhYmFzZUlkLCB0LmRhdGFiYXNlSW5mby5wZXJzaXN0ZW5jZUtleSk7XG4gICAgICAgIHJldHVybiBuZXcgUXIoZSwgdC5hc3luY1F1ZXVlLCBuLCB0LmNsaWVudElkLCB0LmluaXRpYWxVc2VyKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW5kIHdpcmVzIHRoZSBjb21wb25lbnRzIHRoYXQgYXJlIG5lZWRlZCB0byBpbnRlcmZhY2Ugd2l0aCB0aGVcbiAqIG5ldHdvcmsuXG4gKi8gY2xhc3MgQmEge1xuICAgIGFzeW5jIGluaXRpYWxpemUodCwgZSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgfHwgKHRoaXMubG9jYWxTdG9yZSA9IHQubG9jYWxTdG9yZSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHQuc2hhcmVkQ2xpZW50U3RhdGUsIFxuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHRoaXMuY3JlYXRlRGF0YXN0b3JlKGUpLCB0aGlzLnJlbW90ZVN0b3JlID0gdGhpcy5jcmVhdGVSZW1vdGVTdG9yZShlKSwgXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gdGhpcy5jcmVhdGVFdmVudE1hbmFnZXIoZSksIHRoaXMuc3luY0VuZ2luZSA9IHRoaXMuY3JlYXRlU3luY0VuZ2luZShlLCBcbiAgICAgICAgLyogc3RhcnRBc1ByaW1hcnk9Ki8gIXQuc3luY2hyb25pemVUYWJzKSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5vbmxpbmVTdGF0ZUhhbmRsZXIgPSB0ID0+IGhhKHRoaXMuc3luY0VuZ2luZSwgdCwgMSAvKiBTaGFyZWRDbGllbnRTdGF0ZSAqLyksIFxuICAgICAgICB0aGlzLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5oYW5kbGVDcmVkZW50aWFsQ2hhbmdlID0gQWEuYmluZChudWxsLCB0aGlzLnN5bmNFbmdpbmUpLCBcbiAgICAgICAgYXdhaXQga28odGhpcy5yZW1vdGVTdG9yZSwgdGhpcy5zeW5jRW5naW5lLmlzUHJpbWFyeUNsaWVudCkpO1xuICAgIH1cbiAgICBjcmVhdGVFdmVudE1hbmFnZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IHFvO1xuICAgIH1cbiAgICBjcmVhdGVEYXRhc3RvcmUodCkge1xuICAgICAgICBjb25zdCBlID0gdG8odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCksIG4gPSAocyA9IHQuZGF0YWJhc2VJbmZvLCBuZXcgWXIocykpO1xuICAgICAgICB2YXIgcztcbiAgICAgICAgLyoqIFJldHVybiB0aGUgUGxhdGZvcm0tc3BlY2lmaWMgY29ubmVjdGl2aXR5IG1vbml0b3IuICovICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBybyh0LCBlLCBuLCBzKTtcbiAgICAgICAgfSh0LmF1dGhDcmVkZW50aWFscywgdC5hcHBDaGVja0NyZWRlbnRpYWxzLCBuLCBlKTtcbiAgICB9XG4gICAgY3JlYXRlUmVtb3RlU3RvcmUodCkge1xuICAgICAgICByZXR1cm4gZSA9IHRoaXMubG9jYWxTdG9yZSwgbiA9IHRoaXMuZGF0YXN0b3JlLCBzID0gdC5hc3luY1F1ZXVlLCBpID0gdCA9PiBoYSh0aGlzLnN5bmNFbmdpbmUsIHQsIDAgLyogUmVtb3RlU3RvcmUgKi8pLCBcbiAgICAgICAgciA9IHpyLmJ0KCkgPyBuZXcgenIgOiBuZXcgR3IsIG5ldyBhbyhlLCBuLCBzLCBpLCByKTtcbiAgICAgICAgdmFyIGUsIG4sIHMsIGksIHI7XG4gICAgICAgIC8qKiBSZS1lbmFibGVzIHRoZSBuZXR3b3JrLiBJZGVtcG90ZW50LiAqLyAgICB9XG4gICAgY3JlYXRlU3luY0VuZ2luZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBcbiAgICAgICAgLy8gUE9SVElORyBOT1RFOiBNYW5hZ2VzIHN0YXRlIHN5bmNocm9uaXphdGlvbiBpbiBtdWx0aS10YWIgZW52aXJvbm1lbnRzLlxuICAgICAgICBzLCBpLCByLCBvKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gbmV3IGlhKHQsIGUsIG4sIHMsIGksIHIpO1xuICAgICAgICAgICAgcmV0dXJuIG8gJiYgKGEuV28gPSAhMCksIGE7XG4gICAgICAgIH0odGhpcy5sb2NhbFN0b3JlLCB0aGlzLnJlbW90ZVN0b3JlLCB0aGlzLmV2ZW50TWFuYWdlciwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSwgdC5pbml0aWFsVXNlciwgdC5tYXhDb25jdXJyZW50TGltYm9SZXNvbHV0aW9ucywgZSk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBxKHQpO1xuICAgICAgICAgICAgJChcIlJlbW90ZVN0b3JlXCIsIFwiUmVtb3RlU3RvcmUgc2h1dHRpbmcgZG93bi5cIiksIGUuR3IuYWRkKDUgLyogU2h1dGRvd24gKi8pLCBhd2FpdCB1byhlKSwgXG4gICAgICAgICAgICBlLkhyLnNodXRkb3duKCksIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBPbmxpbmVTdGF0ZSB0byBVbmtub3duIChyYXRoZXIgdGhhbiBPZmZsaW5lKSB0byBhdm9pZCBwb3RlbnRpYWxseVxuICAgICAgICAgICAgLy8gdHJpZ2dlcmluZyBzcHVyaW91cyBsaXN0ZW5lciBldmVudHMgd2l0aCBjYWNoZWQgZGF0YSwgZXRjLlxuICAgICAgICAgICAgZS5Kci5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLyk7XG4gICAgICAgIH0odGhpcy5yZW1vdGVTdG9yZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBIb3cgbWFueSBieXRlcyB0byByZWFkIGVhY2ggdGltZSB3aGVuIGBSZWFkYWJsZVN0cmVhbVJlYWRlci5yZWFkKClgIGlzXG4gKiBjYWxsZWQuIE9ubHkgYXBwbGljYWJsZSBmb3IgYnl0ZSBzdHJlYW1zIHRoYXQgd2UgY29udHJvbCAoZS5nLiB0aG9zZSBiYWNrZWRcbiAqIGJ5IGFuIFVJbnQ4QXJyYXkpLlxuICovXG4vKipcbiAqIEJ1aWxkcyBhIGBCeXRlU3RyZWFtUmVhZGVyYCBmcm9tIGEgVUludDhBcnJheS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgZGF0YSBzb3VyY2UgdG8gdXNlLlxuICogQHBhcmFtIGJ5dGVzUGVyUmVhZCAtIEhvdyBtYW55IGJ5dGVzIGVhY2ggYHJlYWQoKWAgZnJvbSB0aGUgcmV0dXJuZWQgcmVhZGVyXG4gKiAgICAgICAgd2lsbCByZWFkLlxuICovXG5mdW5jdGlvbiBVYSh0LCBlID0gMTAyNDApIHtcbiAgICBsZXQgbiA9IDA7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmb3IgUmVhZGFibGVTdHJlYW1SZWFkZXIgY2hhbmdlZC4gV2UgdXNlXG4gICAgLy8gYGFueWAgaGVyZSB0byBhbGxvdyB0aGlzIGNvZGUgdG8gY29tcGlsZSB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80Mjk3MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgICBpZiAobiA8IHQuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnNsaWNlKG4sIG4gKyBlKSxcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBuICs9IGUsIHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBjYW5jZWwoKSB7fSxcbiAgICAgICAgcmVsZWFzZUxvY2soKSB7fSxcbiAgICAgICAgY2xvc2VkOiBQcm9taXNlLnJlamVjdChcInVuaW1wbGVtZW50ZWRcIilcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBPbiB3ZWIsIGEgYFJlYWRhYmxlU3RyZWFtYCBpcyB3cmFwcGVkIGFyb3VuZCBieSBhIGBCeXRlU3RyZWFtUmVhZGVyYC5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qXG4gKiBBIHdyYXBwZXIgaW1wbGVtZW50YXRpb24gb2YgT2JzZXJ2ZXI8VD4gdGhhdCB3aWxsIGRpc3BhdGNoIGV2ZW50c1xuICogYXN5bmNocm9ub3VzbHkuIFRvIGFsbG93IGltbWVkaWF0ZSBzaWxlbmNpbmcsIGEgbXV0ZSBjYWxsIGlzIGFkZGVkIHdoaWNoXG4gKiBjYXVzZXMgZXZlbnRzIHNjaGVkdWxlZCB0byBubyBsb25nZXIgYmUgcmFpc2VkLlxuICovXG5jbGFzcyBxYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIHNldCB0byB0cnVlLCB3aWxsIG5vdCByYWlzZSBmdXR1cmUgZXZlbnRzLiBOZWNlc3NhcnkgdG8gZGVhbCB3aXRoXG4gICAgICAgICAqIGFzeW5jIGRldGFjaG1lbnQgb2YgbGlzdGVuZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm11dGVkID0gITE7XG4gICAgfVxuICAgIG5leHQodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLm5leHQgJiYgdGhpcy5lYSh0aGlzLm9ic2VydmVyLm5leHQsIHQpO1xuICAgIH1cbiAgICBlcnJvcih0KSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZXJyb3IgPyB0aGlzLmVhKHRoaXMub2JzZXJ2ZXIuZXJyb3IsIHQpIDogY29uc29sZS5lcnJvcihcIlVuY2F1Z2h0IEVycm9yIGluIHNuYXBzaG90IGxpc3RlbmVyOlwiLCB0KTtcbiAgICB9XG4gICAgbmEoKSB7XG4gICAgICAgIHRoaXMubXV0ZWQgPSAhMDtcbiAgICB9XG4gICAgZWEodCwgZSkge1xuICAgICAgICB0aGlzLm11dGVkIHx8IHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXV0ZWQgfHwgdChlKTtcbiAgICAgICAgfSksIDApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBidW5kbGUuXG4gKlxuICogVGFrZXMgYSBidW5kbGUgc3RyZWFtIG9yIGJ1ZmZlciwgYW5kIHByZXNlbnRzIGFic3RyYWN0aW9ucyB0byByZWFkIGJ1bmRsZWRcbiAqIGVsZW1lbnRzIG91dCBvZiB0aGUgdW5kZXJseWluZyBjb250ZW50LlxuICovIGNsYXNzIEthIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHJlYWRlciB0byByZWFkIGZyb20gdW5kZXJseWluZyBiaW5hcnkgYnVuZGxlIGRhdGEgc291cmNlLiAqL1xuICAgIHQsIGUpIHtcbiAgICAgICAgdGhpcy5zYSA9IHQsIHRoaXMuayA9IGUsIFxuICAgICAgICAvKiogQ2FjaGVkIGJ1bmRsZSBtZXRhZGF0YS4gKi9cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBRLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybmFsIGJ1ZmZlciB0byBob2xkIGJ1bmRsZSBjb250ZW50LCBhY2N1bXVsYXRpbmcgaW5jb21wbGV0ZSBlbGVtZW50XG4gICAgICAgICAqIGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5LCB0aGlzLmlhID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiksIFxuICAgICAgICAvLyBSZWFkIHRoZSBtZXRhZGF0YSAod2hpY2ggaXMgdGhlIGZpcnN0IGVsZW1lbnQpLlxuICAgICAgICB0aGlzLnJhKCkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0ICYmIHQuX28oKSA/IHRoaXMubWV0YWRhdGEucmVzb2x2ZSh0LnBheWxvYWQubWV0YWRhdGEpIDogdGhpcy5tZXRhZGF0YS5yZWplY3QobmV3IEVycm9yKGBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYnVuZGxlIGlzIG5vdCBhIG1ldGFkYXRhLCBpdCBpc1xcbiAgICAgICAgICAgICAke0pTT04uc3RyaW5naWZ5KG51bGwgPT0gdCA/IHZvaWQgMCA6IHQucGF5bG9hZCl9YCkpO1xuICAgICAgICB9KSwgKHQgPT4gdGhpcy5tZXRhZGF0YS5yZWplY3QodCkpKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhLmNhbmNlbCgpO1xuICAgIH1cbiAgICBhc3luYyBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEucHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgSG8oKSB7XG4gICAgICAgIC8vIE1ha2VzIHN1cmUgbWV0YWRhdGEgaXMgcmVhZCBiZWZvcmUgcHJvY2VlZGluZy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWV0YWRhdGEoKSwgdGhpcy5yYSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBmcm9tIHRoZSBoZWFkIG9mIGludGVybmFsIGJ1ZmZlciwgYW5kIHB1bGxpbmcgbW9yZSBkYXRhIGZyb21cbiAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbSBpZiBhIGNvbXBsZXRlIGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLCB1bnRpbCBhblxuICAgICAqIGVsZW1lbnQoaW5jbHVkaW5nIHRoZSBwcmVmaXhlZCBsZW5ndGggYW5kIHRoZSBKU09OIHN0cmluZykgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBPbmNlIGEgY29tcGxldGUgZWxlbWVudCBpcyByZWFkLCBpdCBpcyBkcm9wcGVkIGZyb20gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqXG4gICAgICogUmV0dXJucyBlaXRoZXIgdGhlIGJ1bmRsZWQgZWxlbWVudCwgb3IgbnVsbCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZlxuICAgICAqIHRoZSBzdHJlYW0uXG4gICAgICovICAgIGFzeW5jIHJhKCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5vYSgpO1xuICAgICAgICBpZiAobnVsbCA9PT0gdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmlhLmRlY29kZSh0KSwgbiA9IE51bWJlcihlKTtcbiAgICAgICAgaXNOYU4obikgJiYgdGhpcy5hYShgbGVuZ3RoIHN0cmluZyAoJHtlfSkgaXMgbm90IHZhbGlkIG51bWJlcmApO1xuICAgICAgICBjb25zdCBzID0gYXdhaXQgdGhpcy5jYShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIbyhKU09OLnBhcnNlKHMpLCB0Lmxlbmd0aCArIG4pO1xuICAgIH1cbiAgICAvKiogRmlyc3QgaW5kZXggb2YgJ3snIGZyb20gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiAqLyAgICB1YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZpbmRJbmRleCgodCA9PiB0ID09PSBcIntcIi5jaGFyQ29kZUF0KDApKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLCB1bnRpbCB0aGUgZmlyc3QgJ3snLCBhbmRcbiAgICAgKiByZXR1cm4gdGhlIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBJZiByZWFjaGVkIGVuZCBvZiB0aGUgc3RyZWFtLCByZXR1cm5zIGEgbnVsbC5cbiAgICAgKi8gICAgYXN5bmMgb2EoKSB7XG4gICAgICAgIGZvciAoO3RoaXMudWEoKSA8IDA7ICkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGEoKSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBhbmQgdGhlcmVcbiAgICAgICAgLy8gaGFwcGVucyB0byBiZSBubyBtb3JlIGRhdGEgdG8gcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMudWEoKTtcbiAgICAgICAgLy8gQnJva2Ugb3V0IG9mIHRoZSBsb29wIGJlY2F1c2UgdW5kZXJseWluZyBzdHJlYW0gaXMgY2xvc2VkLCBidXQgc3RpbGxcbiAgICAgICAgLy8gY2Fubm90IGZpbmQgYW4gb3BlbiBicmFja2V0LlxuICAgICAgICAgICAgICAgIHQgPCAwICYmIHRoaXMuYWEoXCJSZWFjaGVkIHRoZSBlbmQgb2YgYnVuZGxlIHdoZW4gYSBsZW5ndGggc3RyaW5nIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuYnVmZmVyLnNsaWNlKDAsIHQpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGxlbmd0aC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZSh0KSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgZnJvbSBhIHNwZWNpZmllZCBwb3NpdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIsIGZvciBhIHNwZWNpZmllZFxuICAgICAqIG51bWJlciBvZiBieXRlcywgcHVsbGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaWYgbmVlZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyBkZWNvZGVkIGZyb20gdGhlIHJlYWQgYnl0ZXMuXG4gICAgICovICAgIGFzeW5jIGNhKHQpIHtcbiAgICAgICAgZm9yICg7dGhpcy5idWZmZXIubGVuZ3RoIDwgdDsgKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhKCkgJiYgdGhpcy5hYShcIlJlYWNoZWQgdGhlIGVuZCBvZiBidW5kbGUgd2hlbiBtb3JlIGlzIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gdGhpcy5pYS5kZWNvZGUodGhpcy5idWZmZXIuc2xpY2UoMCwgdCkpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGludGVybmFsIGJ1ZmZlciB0byBkcm9wIHRoZSByZWFkIGpzb24gc3RyaW5nLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKHQpLCBlO1xuICAgIH1cbiAgICBhYSh0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhyb3cgdGhpcy5zYS5jYW5jZWwoKSwgbmV3IEVycm9yKGBJbnZhbGlkIGJ1bmRsZSBmb3JtYXQ6ICR7dH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVsbHMgbW9yZSBkYXRhIGZyb20gdW5kZXJseWluZyBzdHJlYW0gdG8gaW50ZXJuYWwgYnVmZmVyLlxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkLlxuICAgICAqLyAgICBhc3luYyBoYSgpIHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IHRoaXMuc2EucmVhZCgpO1xuICAgICAgICBpZiAoIXQuZG9uZSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmxlbmd0aCArIHQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGUuc2V0KHRoaXMuYnVmZmVyKSwgZS5zZXQodC52YWx1ZSwgdGhpcy5idWZmZXIubGVuZ3RoKSwgdGhpcy5idWZmZXIgPSBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LmRvbmU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbnRlcm5hbCB0cmFuc2FjdGlvbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIGFjY3VtdWxhdGluZyB0aGUgbXV0YXRpb25zIHRvXG4gKiBwZXJmb3JtIGFuZCB0aGUgYmFzZSB2ZXJzaW9ucyBmb3IgYW55IGRvY3VtZW50cyByZWFkLlxuICovXG5jbGFzcyBqYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmRhdGFzdG9yZSA9IHQsIFxuICAgICAgICAvLyBUaGUgdmVyc2lvbiBvZiBlYWNoIGRvY3VtZW50IHRoYXQgd2FzIHJlYWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMucmVhZFZlcnNpb25zID0gbmV3IE1hcCwgdGhpcy5tdXRhdGlvbnMgPSBbXSwgdGhpcy5jb21taXR0ZWQgPSAhMSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmVycmVkIHVzYWdlIGVycm9yIHRoYXQgb2NjdXJyZWQgcHJldmlvdXNseSBpbiB0aGlzIHRyYW5zYWN0aW9uIHRoYXRcbiAgICAgICAgICogd2lsbCBjYXVzZSB0aGUgdHJhbnNhY3Rpb24gdG8gZmFpbCBvbmNlIGl0IGFjdHVhbGx5IGNvbW1pdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gbnVsbCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgb2YgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gaW4gdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaGVuIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB3cml0ZSB0byB0aGUgc2FtZSBrZXkgaW4gYSB0cmFuc2FjdGlvbiwgYW55XG4gICAgICAgICAqIHdyaXRlcyBhZnRlciB0aGUgZmlyc3QgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzID0gbmV3IFNldDtcbiAgICB9XG4gICAgYXN5bmMgbG9va3VwKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCksIHRoaXMubXV0YXRpb25zLmxlbmd0aCA+IDApIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJGaXJlc3RvcmUgdHJhbnNhY3Rpb25zIHJlcXVpcmUgYWxsIHJlYWRzIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSBhbGwgd3JpdGVzLlwiKTtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gdHMobi5rKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogZS5tYXAoKHQgPT4gSm4obi5rLCB0KSkpXG4gICAgICAgICAgICB9LCByID0gYXdhaXQgbi5qaShcIkJhdGNoR2V0RG9jdW1lbnRzXCIsIHMsIGkpLCBvID0gbmV3IE1hcDtcbiAgICAgICAgICAgIHIuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGlzKG4uaywgdCk7XG4gICAgICAgICAgICAgICAgby5zZXQoZS5rZXkudG9TdHJpbmcoKSwgZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCBhID0gW107XG4gICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gby5nZXQodC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBCKCEhZSksIGEucHVzaChlKTtcbiAgICAgICAgICAgIH0pKSwgYTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4gdGhpcy5yZWNvcmRWZXJzaW9uKHQpKSksIGU7XG4gICAgfVxuICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGUoZS50b011dGF0aW9uKHQsIHRoaXMucHJlY29uZGl0aW9uKHQpKSksIHRoaXMud3JpdHRlbkRvY3MuYWRkKHQudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKGUudG9NdXRhdGlvbih0LCB0aGlzLnByZWNvbmRpdGlvbkZvclVwZGF0ZSh0KSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICB0aGlzLndyaXRlKG5ldyBobih0LCB0aGlzLnByZWNvbmRpdGlvbih0KSkpLCB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBhc3luYyBjb21taXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuc3VyZUNvbW1pdE5vdENhbGxlZCgpLCB0aGlzLmxhc3RXcml0ZUVycm9yKSB0aHJvdyB0aGlzLmxhc3RXcml0ZUVycm9yO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5yZWFkVmVyc2lvbnM7XG4gICAgICAgIC8vIEZvciBlYWNoIG11dGF0aW9uLCBub3RlIHRoYXQgdGhlIGRvYyB3YXMgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQuZGVsZXRlKGUua2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBGb3IgZWFjaCBkb2N1bWVudCB0aGF0IHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiB0bywgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAgICAgIC8vIGEgYHZlcmlmeWAgb3BlcmF0aW9uLlxuICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gU3QuZnJvbVBhdGgoZSk7XG4gICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5wdXNoKG5ldyBsbihuLCB0aGlzLnByZWNvbmRpdGlvbihuKSkpO1xuICAgICAgICB9KSksIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBxKHQpLCBzID0gdHMobi5rKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIHdyaXRlczogZS5tYXAoKHQgPT4gb3Mobi5rLCB0KSkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgbi5CaShcIkNvbW1pdFwiLCBzLCBpKTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdGhpcy5tdXRhdGlvbnMpLCB0aGlzLmNvbW1pdHRlZCA9ICEwO1xuICAgIH1cbiAgICByZWNvcmRWZXJzaW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIGlmICh0LmlzRm91bmREb2N1bWVudCgpKSBlID0gdC52ZXJzaW9uOyBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdC5pc05vRG9jdW1lbnQoKSkgdGhyb3cgTCgpO1xuICAgICAgICAgICAgLy8gRm9yIGRlbGV0ZWQgZG9jcywgd2UgbXVzdCB1c2UgYmFzZVZlcnNpb24gMCB3aGVuIHdlIG92ZXJ3cml0ZSB0aGVtLlxuICAgICAgICAgICAgZSA9IGN0Lm1pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnJlYWRWZXJzaW9ucy5nZXQodC5rZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBpZiAoIWUuaXNFcXVhbChuKSkgXG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgZmFpbCBubyBtYXR0ZXIgd2hhdC5cbiAgICAgICAgICAgIHRocm93IG5ldyBqKEsuQUJPUlRFRCwgXCJEb2N1bWVudCB2ZXJzaW9uIGNoYW5nZWQgYmV0d2VlbiB0d28gcmVhZHMuXCIpO1xuICAgICAgICB9IGVsc2UgdGhpcy5yZWFkVmVyc2lvbnMuc2V0KHQua2V5LnRvU3RyaW5nKCksIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgd2hlbiBpdCB3YXMgcmVhZCBpbiB0aGlzIHRyYW5zYWN0aW9uLFxuICAgICAqIGFzIGEgcHJlY29uZGl0aW9uLCBvciBubyBwcmVjb25kaXRpb24gaWYgaXQgd2FzIG5vdCByZWFkLlxuICAgICAqLyAgICBwcmVjb25kaXRpb24odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiAhdGhpcy53cml0dGVuRG9jcy5oYXModC50b1N0cmluZygpKSAmJiBlID8gSmUudXBkYXRlVGltZShlKSA6IEplLm5vbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJlY29uZGl0aW9uIGZvciBhIGRvY3VtZW50IGlmIHRoZSBvcGVyYXRpb24gaXMgYW4gdXBkYXRlLlxuICAgICAqLyAgICBwcmVjb25kaXRpb25Gb3JVcGRhdGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgZG9jdW1lbnQgaXMgd3JpdHRlbiwgd2Ugd2FudCB0byB0YWtlIGludG8gYWNjb3VudCB0aGVcbiAgICAgICAgLy8gcmVhZCB0aW1lIGFuZCBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMud3JpdHRlbkRvY3MuaGFzKHQudG9TdHJpbmcoKSkgJiYgZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNFcXVhbChjdC5taW4oKSkpIFxuICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QsIHNvIGZhaWwgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgdmFsaWRhdGVkIGxvY2FsbHkgYmVjYXVzZSB5b3UgY2FuJ3Qgc2VuZCBhXG4gICAgICAgICAgICAvLyBwcmVjb25kaXRpb24gdGhhdCBhIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IHdpdGhvdXQgY2hhbmdpbmcgdGhlXG4gICAgICAgICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIGJhY2tlbmQgd3JpdGUgdG8gYmUgYW4gaW5zZXJ0LiBUaGlzIGlzIHRoZSByZXZlcnNlXG4gICAgICAgICAgICAvLyBvZiB3aGF0IHdlIHdhbnQsIHNpbmNlIHdlIHdhbnQgdG8gYXNzZXJ0IHRoYXQgdGhlIGRvY3VtZW50IGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIGV4aXN0IGJ1dCB0aGVuIHNlbmQgdGhlIHVwZGF0ZSBhbmQgaGF2ZSBpdCBmYWlsLiBTaW5jZSB3ZSBjYW4ndFxuICAgICAgICAgICAgLy8gZXhwcmVzcyB0aGF0IHRvIHRoZSBiYWNrZW5kLCB3ZSBoYXZlIHRvIHZhbGlkYXRlIGxvY2FsbHkuXG4gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGNhbiBjaGFuZ2Ugb25jZSB3ZSBjYW4gc2VuZCBzZXBhcmF0ZSB2ZXJpZnkgd3JpdGVzIGluIHRoZVxuICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiQ2FuJ3QgdXBkYXRlIGEgZG9jdW1lbnQgdGhhdCBkb2Vzbid0IGV4aXN0LlwiKTtcbiAgICAgICAgICAgIC8vIERvY3VtZW50IGV4aXN0cywgYmFzZSBwcmVjb25kaXRpb24gb24gZG9jdW1lbnQgdXBkYXRlIHRpbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmUudXBkYXRlVGltZShlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb2N1bWVudCB3YXMgbm90IHJlYWQsIHNvIHdlIGp1c3QgdXNlIHRoZSBwcmVjb25kaXRpb25zIGZvciBhIGJsaW5kXG4gICAgICAgIC8vIHVwZGF0ZS5cbiAgICAgICAgcmV0dXJuIEplLmV4aXN0cyghMCk7XG4gICAgfVxuICAgIHdyaXRlKHQpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb21taXROb3RDYWxsZWQoKSwgdGhpcy5tdXRhdGlvbnMucHVzaCh0KTtcbiAgICB9XG4gICAgZW5zdXJlQ29tbWl0Tm90Q2FsbGVkKCkge31cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVHJhbnNhY3Rpb25SdW5uZXIgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBuZWVkZWQgdG8gcnVuIGFuZCByZXRyeSB0cmFuc2FjdGlvbnNcbiAqIHdpdGggYmFja29mZi5cbiAqL1xuY2xhc3MgUWEge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlID0gdCwgdGhpcy5kYXRhc3RvcmUgPSBlLCB0aGlzLnVwZGF0ZUZ1bmN0aW9uID0gbiwgdGhpcy5kZWZlcnJlZCA9IHMsIFxuICAgICAgICB0aGlzLmxhID0gNSwgdGhpcy51ciA9IG5ldyBlbyh0aGlzLmFzeW5jUXVldWUsIFwidHJhbnNhY3Rpb25fcmV0cnlcIiAvKiBUcmFuc2FjdGlvblJldHJ5ICovKTtcbiAgICB9XG4gICAgLyoqIFJ1bnMgdGhlIHRyYW5zYWN0aW9uIGFuZCBzZXRzIHRoZSByZXN1bHQgb24gZGVmZXJyZWQuICovICAgIHJ1bigpIHtcbiAgICAgICAgdGhpcy5sYSAtPSAxLCB0aGlzLmZhKCk7XG4gICAgfVxuICAgIGZhKCkge1xuICAgICAgICB0aGlzLnVyLlppKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IGphKHRoaXMuZGF0YXN0b3JlKSwgZSA9IHRoaXMuZGEodCk7XG4gICAgICAgICAgICBlICYmIGUudGhlbigoZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHQuY29tbWl0KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoZSk7XG4gICAgICAgICAgICAgICAgfSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YSh0KTtcbiAgICAgICAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YSh0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkYSh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy51cGRhdGVGdW5jdGlvbih0KTtcbiAgICAgICAgICAgIHJldHVybiAhYnQoZSkgJiYgZS5jYXRjaCAmJiBlLnRoZW4gPyBlIDogKHRoaXMuZGVmZXJyZWQucmVqZWN0KEVycm9yKFwiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlXCIpKSwgXG4gICAgICAgICAgICBudWxsKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHJldHJ5IGVycm9ycyB0aHJvd24gYnkgdXNlciBwcm92aWRlZCB1cGRhdGVGdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkLnJlamVjdCh0KSwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3YSh0KSB7XG4gICAgICAgIHRoaXMubGEgPiAwICYmIHRoaXMuX2EodCkgPyAodGhpcy5sYSAtPSAxLCB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gKHRoaXMuZmEoKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpKSA6IHRoaXMuZGVmZXJyZWQucmVqZWN0KHQpO1xuICAgIH1cbiAgICBfYSh0KSB7XG4gICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBJbiB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZW5kIHdpbGwgZmFpbCBvdXRkYXRlZCByZWFkcyB3aXRoIEZBSUxFRF9QUkVDT05ESVRJT04gYW5kXG4gICAgICAgICAgICAvLyBub24tbWF0Y2hpbmcgZG9jdW1lbnQgdmVyc2lvbnMgd2l0aCBBQk9SVEVELiBUaGVzZSBlcnJvcnMgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAgICAgICAgICBjb25zdCBlID0gdC5jb2RlO1xuICAgICAgICAgICAgcmV0dXJuIFwiYWJvcnRlZFwiID09PSBlIHx8IFwiZmFpbGVkLXByZWNvbmRpdGlvblwiID09PSBlIHx8ICFfbihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGaXJlc3RvcmVDbGllbnQgaXMgYSB0b3AtbGV2ZWwgY2xhc3MgdGhhdCBjb25zdHJ1Y3RzIGFuZCBvd25zIGFsbCBvZiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgY2xpZW50IFNESyBhcmNoaXRlY3R1cmUuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGVcbiAqIGFzeW5jIHF1ZXVlIHRoYXQgaXMgc2hhcmVkIGJ5IGFsbCBvZiB0aGUgb3RoZXIgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtLlxuICovXG5jbGFzcyBXYSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgXG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzIHF1ZXVlIHJlc3BvbnNpYmxlIGZvciBhbGwgb2Ygb3VyIGludGVybmFsIHByb2Nlc3NpbmcuIFdoZW5cbiAgICAgKiB3ZSBnZXQgaW5jb21pbmcgd29yayBmcm9tIHRoZSB1c2VyICh2aWEgcHVibGljIEFQSSkgb3IgdGhlIG5ldHdvcmtcbiAgICAgKiAoaW5jb21pbmcgR1JQQyBtZXNzYWdlcyksIHdlIHNob3VsZCBhbHdheXMgc2NoZWR1bGUgb250byB0aGlzIHF1ZXVlLlxuICAgICAqIFRoaXMgZW5zdXJlcyBhbGwgb2Ygb3VyIHdvcmsgaXMgcHJvcGVybHkgc2VyaWFsaXplZCAoZS5nLiB3ZSBkb24ndFxuICAgICAqIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgb3BlcmF0aW9uIHdoaWxlIHRoZSBwcmV2aW91cyBvbmUgaXMgd2FpdGluZyBmb3JcbiAgICAgKiBhbiBhc3luYyBJL08gdG8gY29tcGxldGUpLlxuICAgICAqL1xuICAgIG4sIHMpIHtcbiAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMgPSB0LCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMgPSBlLCB0aGlzLmFzeW5jUXVldWUgPSBuLCB0aGlzLmRhdGFiYXNlSW5mbyA9IHMsIFxuICAgICAgICB0aGlzLnVzZXIgPSBELlVOQVVUSEVOVElDQVRFRCwgdGhpcy5jbGllbnRJZCA9IHN0LkEoKSwgdGhpcy5hdXRoQ3JlZGVudGlhbExpc3RlbmVyID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCksIFxuICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFscy5zdGFydChuLCAoYXN5bmMgdCA9PiB7XG4gICAgICAgICAgICAkKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiUmVjZWl2ZWQgdXNlcj1cIiwgdC51aWQpLCBhd2FpdCB0aGlzLmF1dGhDcmVkZW50aWFsTGlzdGVuZXIodCksIFxuICAgICAgICAgICAgdGhpcy51c2VyID0gdDtcbiAgICAgICAgfSkpLCBcbiAgICAgICAgLy8gUmVnaXN0ZXIgYW4gZW1wdHkgY3JlZGVudGlhbHMgY2hhbmdlIGxpc3RlbmVyIHRvIGFjdGl2YXRlIHRva2VuIHJlZnJlc2guXG4gICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5zdGFydChuLCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFzeW5jUXVldWU6IHRoaXMuYXN5bmNRdWV1ZSxcbiAgICAgICAgICAgIGRhdGFiYXNlSW5mbzogdGhpcy5kYXRhYmFzZUluZm8sXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgICAgIGF1dGhDcmVkZW50aWFsczogdGhpcy5hdXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICBhcHBDaGVja0NyZWRlbnRpYWxzOiB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICBpbml0aWFsVXNlcjogdGhpcy51c2VyLFxuICAgICAgICAgICAgbWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnM6IDEwMFxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFsTGlzdGVuZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhhdCB0aGUgY2xpZW50IGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkLiBFbnN1cmVzIHRoYXQgb3RoZXIgbWV0aG9kcyBvblxuICAgICAqIHRoaXMgY2xhc3MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciB0aGUgY2xpZW50IGlzIHRlcm1pbmF0ZWQuXG4gICAgICovICAgIHZlcmlmeU5vdFRlcm1pbmF0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFzeW5jUXVldWUuaXNTaHV0dGluZ0Rvd24pIHRocm93IG5ldyBqKEsuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJUaGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZC5cIik7XG4gICAgfVxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVudGVyUmVzdHJpY3RlZE1vZGUoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBRO1xuICAgICAgICByZXR1cm4gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXRFdmVuV2hpbGVSZXN0cmljdGVkKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMub25saW5lQ29tcG9uZW50cyAmJiBhd2FpdCB0aGlzLm9ubGluZUNvbXBvbmVudHMudGVybWluYXRlKCksIHRoaXMub2ZmbGluZUNvbXBvbmVudHMgJiYgYXdhaXQgdGhpcy5vZmZsaW5lQ29tcG9uZW50cy50ZXJtaW5hdGUoKSwgXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNyZWRlbnRpYWxzIHByb3ZpZGVyIG11c3QgYmUgdGVybWluYXRlZCBhZnRlciBzaHV0dGluZyBkb3duIHRoZVxuICAgICAgICAgICAgICAgIC8vIFJlbW90ZVN0b3JlIGFzIGl0IHdpbGwgcHJldmVudCB0aGUgUmVtb3RlU3RvcmUgZnJvbSByZXRyaWV2aW5nIGF1dGhcbiAgICAgICAgICAgICAgICAvLyB0b2tlbnMuXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoQ3JlZGVudGlhbHMuc2h1dGRvd24oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLnNodXRkb3duKCksIHQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBPbyhlLCBcIkZhaWxlZCB0byBzaHV0ZG93biBwZXJzaXN0ZW5jZVwiKTtcbiAgICAgICAgICAgICAgICB0LnJlamVjdChuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCB0LnByb21pc2U7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBHYSh0LCBlKSB7XG4gICAgdC5hc3luY1F1ZXVlLnZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSwgJChcIkZpcmVzdG9yZUNsaWVudFwiLCBcIkluaXRpYWxpemluZyBPZmZsaW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgbiA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuKTtcbiAgICBsZXQgcyA9IG4uaW5pdGlhbFVzZXI7XG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKGFzeW5jIHQgPT4ge1xuICAgICAgICBzLmlzRXF1YWwodCkgfHwgKGF3YWl0IGRyKGUubG9jYWxTdG9yZSwgdCksIHMgPSB0KTtcbiAgICB9KSksIFxuICAgIC8vIFdoZW4gYSB1c2VyIGNhbGxzIGNsZWFyUGVyc2lzdGVuY2UoKSBpbiBvbmUgY2xpZW50LCBhbGwgb3RoZXIgY2xpZW50c1xuICAgIC8vIG5lZWQgdG8gYmUgdGVybWluYXRlZCB0byBhbGxvdyB0aGUgZGVsZXRlIHRvIHN1Y2NlZWQuXG4gICAgZS5wZXJzaXN0ZW5jZS5zZXREYXRhYmFzZURlbGV0ZWRMaXN0ZW5lcigoKCkgPT4gdC50ZXJtaW5hdGUoKSkpLCB0Lm9mZmxpbmVDb21wb25lbnRzID0gZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gemEodCwgZSkge1xuICAgIHQuYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCk7XG4gICAgY29uc3QgbiA9IGF3YWl0IEhhKHQpO1xuICAgICQoXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJJbml0aWFsaXppbmcgT25saW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgcyA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuLCBzKSwgXG4gICAgLy8gVGhlIENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lciBvZiB0aGUgb25saW5lIGNvbXBvbmVudCBwcm92aWRlciB0YWtlc1xuICAgIC8vIHByZWNlZGVuY2Ugb3ZlciB0aGUgb2ZmbGluZSBjb21wb25lbnQgcHJvdmlkZXIuXG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKHQgPT4gYXN5bmMgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gcSh0KTtcbiAgICAgICAgbi5hc3luY1F1ZXVlLnZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSwgJChcIlJlbW90ZVN0b3JlXCIsIFwiUmVtb3RlU3RvcmUgcmVjZWl2ZWQgbmV3IGNyZWRlbnRpYWxzXCIpO1xuICAgICAgICBjb25zdCBzID0gZ28obik7XG4gICAgICAgIC8vIFRlYXIgZG93biBhbmQgcmUtY3JlYXRlIG91ciBuZXR3b3JrIHN0cmVhbXMuIFRoaXMgd2lsbCBlbnN1cmUgd2UgZ2V0IGFcbiAgICAgICAgLy8gZnJlc2ggYXV0aCB0b2tlbiBmb3IgdGhlIG5ldyB1c2VyIGFuZCByZS1maWxsIHRoZSB3cml0ZSBwaXBlbGluZSB3aXRoXG4gICAgICAgIC8vIG5ldyBtdXRhdGlvbnMgZnJvbSB0aGUgTG9jYWxTdG9yZSAoc2luY2UgbXV0YXRpb25zIGFyZSBwZXItdXNlcikuXG4gICAgICAgICAgICAgICAgbi5Hci5hZGQoMyAvKiBDcmVkZW50aWFsQ2hhbmdlICovKSwgYXdhaXQgdW8obiksIHMgJiYgXG4gICAgICAgIC8vIERvbid0IHNldCB0aGUgbmV0d29yayBzdGF0dXMgdG8gVW5rbm93biBpZiB3ZSBhcmUgb2ZmbGluZS5cbiAgICAgICAgbi5Kci5zZXQoXCJVbmtub3duXCIgLyogVW5rbm93biAqLyksIGF3YWl0IG4ucmVtb3RlU3luY2VyLmhhbmRsZUNyZWRlbnRpYWxDaGFuZ2UoZSksIFxuICAgICAgICBuLkdyLmRlbGV0ZSgzIC8qIENyZWRlbnRpYWxDaGFuZ2UgKi8pLCBhd2FpdCBjbyhuKTtcbiAgICB9KGUucmVtb3RlU3RvcmUsIHQpKSksIHQub25saW5lQ29tcG9uZW50cyA9IGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIEhhKHQpIHtcbiAgICByZXR1cm4gdC5vZmZsaW5lQ29tcG9uZW50cyB8fCAoJChcIkZpcmVzdG9yZUNsaWVudFwiLCBcIlVzaW5nIGRlZmF1bHQgT2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyXCIpLCBcbiAgICBhd2FpdCBHYSh0LCBuZXcgT2EpKSwgdC5vZmZsaW5lQ29tcG9uZW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gSmEodCkge1xuICAgIHJldHVybiB0Lm9ubGluZUNvbXBvbmVudHMgfHwgKCQoXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJVc2luZyBkZWZhdWx0IE9ubGluZUNvbXBvbmVudFByb3ZpZGVyXCIpLCBcbiAgICBhd2FpdCB6YSh0LCBuZXcgQmEpKSwgdC5vbmxpbmVDb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBZYSh0KSB7XG4gICAgcmV0dXJuIEhhKHQpLnRoZW4oKHQgPT4gdC5wZXJzaXN0ZW5jZSkpO1xufVxuXG5mdW5jdGlvbiBYYSh0KSB7XG4gICAgcmV0dXJuIEhhKHQpLnRoZW4oKHQgPT4gdC5sb2NhbFN0b3JlKSk7XG59XG5cbmZ1bmN0aW9uIFphKHQpIHtcbiAgICByZXR1cm4gSmEodCkudGhlbigodCA9PiB0LnJlbW90ZVN0b3JlKSk7XG59XG5cbmZ1bmN0aW9uIHRjKHQpIHtcbiAgICByZXR1cm4gSmEodCkudGhlbigodCA9PiB0LnN5bmNFbmdpbmUpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZWModCkge1xuICAgIGNvbnN0IGUgPSBhd2FpdCBKYSh0KSwgbiA9IGUuZXZlbnRNYW5hZ2VyO1xuICAgIHJldHVybiBuLm9uTGlzdGVuID0gcmEuYmluZChudWxsLCBlLnN5bmNFbmdpbmUpLCBuLm9uVW5saXN0ZW4gPSBhYS5iaW5kKG51bGwsIGUuc3luY0VuZ2luZSksIFxuICAgIG47XG59XG5cbi8qKiBFbmFibGVzIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIHJlLWVucXVldWVzIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMuICovIGZ1bmN0aW9uIG5jKHQpIHtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IFlhKHQpLCBuID0gYXdhaXQgWmEodCk7XG4gICAgICAgIHJldHVybiBlLnNldE5ldHdvcmtFbmFibGVkKCEwKSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHEodCk7XG4gICAgICAgICAgICByZXR1cm4gZS5Hci5kZWxldGUoMCAvKiBVc2VyRGlzYWJsZWQgKi8pLCBjbyhlKTtcbiAgICAgICAgfShuKTtcbiAgICB9KSk7XG59XG5cbi8qKiBEaXNhYmxlcyB0aGUgbmV0d29yayBjb25uZWN0aW9uLiBQZW5kaW5nIG9wZXJhdGlvbnMgd2lsbCBub3QgY29tcGxldGUuICovIGZ1bmN0aW9uIHNjKHQpIHtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IFlhKHQpLCBuID0gYXdhaXQgWmEodCk7XG4gICAgICAgIHJldHVybiBlLnNldE5ldHdvcmtFbmFibGVkKCExKSwgYXN5bmMgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHEodCk7XG4gICAgICAgICAgICBlLkdyLmFkZCgwIC8qIFVzZXJEaXNhYmxlZCAqLyksIGF3YWl0IHVvKGUpLCBcbiAgICAgICAgICAgIC8vIFNldCB0aGUgT25saW5lU3RhdGUgdG8gT2ZmbGluZSBzbyBnZXQoKXMgcmV0dXJuIGZyb20gY2FjaGUsIGV0Yy5cbiAgICAgICAgICAgIGUuSnIuc2V0KFwiT2ZmbGluZVwiIC8qIE9mZmxpbmUgKi8pO1xuICAgICAgICB9KG4pO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHdyaXRlcyB0aGF0IHdlcmUgcGVuZGluZyBhdCB0aGUgdGltZVxuICogdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCByZWNlaXZlZCBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LiBBbiBhY2tub3dsZWRnZW1lbnRcbiAqIGNhbiBiZSBlaXRoZXIgYWNjZXB0YW5jZSBvciByZWplY3Rpb24uXG4gKi8gZnVuY3Rpb24gaWModCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgUTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHEodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJyZWFkIGRvY3VtZW50XCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5Xbi5Sbih0LCBlKSkpO1xuICAgICAgICAgICAgfSh0LCBlKTtcbiAgICAgICAgICAgIHMuaXNGb3VuZERvY3VtZW50KCkgPyBuLnJlc29sdmUocykgOiBzLmlzTm9Eb2N1bWVudCgpID8gbi5yZXNvbHZlKG51bGwpIDogbi5yZWplY3QobmV3IGooSy5VTkFWQUlMQUJMRSwgXCJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGZyb20gY2FjaGUuIChIb3dldmVyLCB0aGlzIGRvY3VtZW50IG1heSBleGlzdCBvbiB0aGUgc2VydmVyLiBSdW4gYWdhaW4gd2l0aG91dCBzZXR0aW5nICdzb3VyY2UnIGluIHRoZSBHZXRPcHRpb25zIHRvIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGRvY3VtZW50IGZyb20gdGhlIHNlcnZlci4pXCIpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IE9vKHQsIGBGYWlsZWQgdG8gZ2V0IGRvY3VtZW50ICcke2V9IGZyb20gY2FjaGVgKTtcbiAgICAgICAgICAgIG4ucmVqZWN0KHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICogUmV0cmlldmVzIGEgbGF0ZW5jeS1jb21wZW5zYXRlZCBkb2N1bWVudCBmcm9tIHRoZSBiYWNrZW5kIHZpYSBhXG4gKiBTbmFwc2hvdExpc3RlbmVyLlxuICovIChhd2FpdCBYYSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiByYyh0LCBlLCBuID0ge30pIHtcbiAgICBjb25zdCBzID0gbmV3IFE7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgcWEoe1xuICAgICAgICAgICAgbmV4dDogciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHF1ZXJ5IGZpcnN0IGJlZm9yZSBwYXNzaW5nIGV2ZW50IHRvIHVzZXIgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAvLyB1c2VyIGFjdGlvbnMgYWZmZWN0aW5nIHRoZSBub3cgc3RhbGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBqbyh0LCBvKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSByLmRvY3MuaGFzKG4pO1xuICAgICAgICAgICAgICAgICFhICYmIHIuZnJvbUNhY2hlID8gXG4gICAgICAgICAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiBJZiB3ZSdyZSBvbmxpbmUgYW5kIHRoZSBkb2N1bWVudCBkb2Vzbid0XG4gICAgICAgICAgICAgICAgLy8gZXhpc3QgdGhlbiB3ZSByZXNvbHZlIHdpdGggYSBkb2MuZXhpc3RzIHNldCB0byBmYWxzZS4gSWZcbiAgICAgICAgICAgICAgICAvLyB3ZSdyZSBvZmZsaW5lIGhvd2V2ZXIsIHdlIHJlamVjdCB0aGUgUHJvbWlzZSBpbiB0aGlzXG4gICAgICAgICAgICAgICAgLy8gY2FzZS4gVHdvIG9wdGlvbnM6IDEpIENhY2hlIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlciBzbyB3ZSBjYW4gZGVsaXZlciB0aGF0IGV2ZW4gd2hlbiB5b3UncmVcbiAgICAgICAgICAgICAgICAvLyBvZmZsaW5lIDIpIEFjdHVhbGx5IHJlamVjdCB0aGUgUHJvbWlzZSBpbiB0aGUgb25saW5lIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICAgICAgICBpLnJlamVjdChuZXcgaihLLlVOQVZBSUxBQkxFLCBcIkZhaWxlZCB0byBnZXQgZG9jdW1lbnQgYmVjYXVzZSB0aGUgY2xpZW50IGlzIG9mZmxpbmUuXCIpKSA6IGEgJiYgci5mcm9tQ2FjaGUgJiYgcyAmJiBcInNlcnZlclwiID09PSBzLnNvdXJjZSA/IGkucmVqZWN0KG5ldyBqKEsuVU5BVkFJTEFCTEUsICdGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGZyb20gc2VydmVyLiAoSG93ZXZlciwgdGhpcyBkb2N1bWVudCBkb2VzIGV4aXN0IGluIHRoZSBsb2NhbCBjYWNoZS4gUnVuIGFnYWluIHdpdGhvdXQgc2V0dGluZyBzb3VyY2UgdG8gXCJzZXJ2ZXJcIiB0byByZXRyaWV2ZSB0aGUgY2FjaGVkIGRvY3VtZW50LiknKSkgOiBpLnJlc29sdmUocik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IHQgPT4gaS5yZWplY3QodClcbiAgICAgICAgfSksIG8gPSBuZXcgem8oZ2Uobi5wYXRoKSwgciwge1xuICAgICAgICAgICAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlczogITAsXG4gICAgICAgICAgICB3bzogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBLbyh0LCBvKTtcbiAgICB9KGF3YWl0IGVjKHQpLCB0LmFzeW5jUXVldWUsIGUsIG4sIHMpKSksIHMucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gb2ModCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgUTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBFcih0LCBlLCBcbiAgICAgICAgICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITApLCBpID0gbmV3IGVhKGUsIHMuem4pLCByID0gaS5ibyhzLmRvY3VtZW50cyksIG8gPSBpLmFwcGx5Q2hhbmdlcyhyLCBcbiAgICAgICAgICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyAhMSk7XG4gICAgICAgICAgICBuLnJlc29sdmUoby5zbmFwc2hvdCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBPbyh0LCBgRmFpbGVkIHRvIGV4ZWN1dGUgcXVlcnkgJyR7ZX0gYWdhaW5zdCBjYWNoZWApO1xuICAgICAgICAgICAgbi5yZWplY3Qocyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gKiBSZXRyaWV2ZXMgYSBsYXRlbmN5LWNvbXBlbnNhdGVkIHF1ZXJ5IHNuYXBzaG90IGZyb20gdGhlIGJhY2tlbmQgdmlhIGFcbiAqIFNuYXBzaG90TGlzdGVuZXIuXG4gKi8gKGF3YWl0IFhhKHQpLCBlLCBuKSkpLCBuLnByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGFjKHQsIGUsIG4gPSB7fSkge1xuICAgIGNvbnN0IHMgPSBuZXcgUTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IG5ldyBxYSh7XG4gICAgICAgICAgICBuZXh0OiBuID0+IHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcXVlcnkgZmlyc3QgYmVmb3JlIHBhc3NpbmcgZXZlbnQgdG8gdXNlciB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIHVzZXIgYWN0aW9ucyBhZmZlY3RpbmcgdGhlIG5vdyBzdGFsZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IGpvKHQsIG8pKSksIG4uZnJvbUNhY2hlICYmIFwic2VydmVyXCIgPT09IHMuc291cmNlID8gaS5yZWplY3QobmV3IGooSy5VTkFWQUlMQUJMRSwgJ0ZhaWxlZCB0byBnZXQgZG9jdW1lbnRzIGZyb20gc2VydmVyLiAoSG93ZXZlciwgdGhlc2UgZG9jdW1lbnRzIG1heSBleGlzdCBpbiB0aGUgbG9jYWwgY2FjaGUuIFJ1biBhZ2FpbiB3aXRob3V0IHNldHRpbmcgc291cmNlIHRvIFwic2VydmVyXCIgdG8gcmV0cmlldmUgdGhlIGNhY2hlZCBkb2N1bWVudHMuKScpKSA6IGkucmVzb2x2ZShuKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogdCA9PiBpLnJlamVjdCh0KVxuICAgICAgICB9KSwgbyA9IG5ldyB6byhuLCByLCB7XG4gICAgICAgICAgICBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOiAhMCxcbiAgICAgICAgICAgIHdvOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEtvKHQsIG8pO1xuICAgIH0oYXdhaXQgZWModCksIHQuYXN5bmNRdWV1ZSwgZSwgbiwgcykpKSwgcy5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiBjYyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IG5ldyBxYShlKTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcSh0KS5pby5hZGQoZSksIFxuICAgICAgICAvLyBJbW1lZGlhdGVseSBmaXJlIGFuIGluaXRpYWwgZXZlbnQsIGluZGljYXRpbmcgYWxsIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgICAgICAvLyBhcmUgaW4tc3luYy5cbiAgICAgICAgZS5uZXh0KCk7XG4gICAgfShhd2FpdCBlYyh0KSwgbikpKSwgKCkgPT4ge1xuICAgICAgICBuLm5hKCksIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBxKHQpLmlvLmRlbGV0ZShlKTtcbiAgICAgICAgfShhd2FpdCBlYyh0KSwgbikpKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRha2VzIGFuIHVwZGF0ZUZ1bmN0aW9uIGluIHdoaWNoIGEgc2V0IG9mIHJlYWRzIGFuZCB3cml0ZXMgY2FuIGJlIHBlcmZvcm1lZFxuICogYXRvbWljYWxseS4gSW4gdGhlIHVwZGF0ZUZ1bmN0aW9uLCB0aGUgY2xpZW50IGNhbiByZWFkIGFuZCB3cml0ZSB2YWx1ZXNcbiAqIHVzaW5nIHRoZSBzdXBwbGllZCB0cmFuc2FjdGlvbiBvYmplY3QuIEFmdGVyIHRoZSB1cGRhdGVGdW5jdGlvbiwgYWxsXG4gKiBjaGFuZ2VzIHdpbGwgYmUgY29tbWl0dGVkLiBJZiBhIHJldHJ5YWJsZSBlcnJvciBvY2N1cnMgKGV4OiBzb21lIG90aGVyXG4gKiBjbGllbnQgaGFzIGNoYW5nZWQgYW55IG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQpLCB0aGVuIHRoZSB1cGRhdGVGdW5jdGlvblxuICogd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgYSBiYWNrb2ZmLiBJZiB0aGUgdXBkYXRlRnVuY3Rpb24gc3RpbGwgZmFpbHNcbiAqIGFmdGVyIGFsbCByZXRyaWVzLCB0aGVuIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlamVjdGVkLlxuICpcbiAqIFRoZSB0cmFuc2FjdGlvbiBvYmplY3QgcGFzc2VkIHRvIHRoZSB1cGRhdGVGdW5jdGlvbiBjb250YWlucyBtZXRob2RzIGZvclxuICogYWNjZXNzaW5nIGRvY3VtZW50cyBhbmQgY29sbGVjdGlvbnMuIFVubGlrZSBvdGhlciBkYXRhc3RvcmUgYWNjZXNzLCBkYXRhXG4gKiBhY2Nlc3NlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiB3aWxsIG5vdCByZWZsZWN0IGxvY2FsIGNoYW5nZXMgdGhhdCBoYXZlIG5vdFxuICogYmVlbiBjb21taXR0ZWQuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwgcmVhZHMgYXJlXG4gKiBwZXJmb3JtZWQgYmVmb3JlIGFueSB3cml0ZXMuIFRyYW5zYWN0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSBvbmxpbmUuXG4gKi8gZnVuY3Rpb24gdWModCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgUTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGF3YWl0IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBKYSh0KS50aGVuKCh0ID0+IHQuZGF0YXN0b3JlKSk7XG4gICAgICAgIH0odCk7XG4gICAgICAgIG5ldyBRYSh0LmFzeW5jUXVldWUsIHMsIGUsIG4pLnJ1bigpO1xuICAgIH0pKSwgbi5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiBoYyh0LCBlLCBuLCBzKSB7XG4gICAgY29uc3QgaSA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIG4gPSBcInN0cmluZ1wiID09IHR5cGVvZiB0ID8gKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpIDogdDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgS2EodCwgZSk7XG4gICAgICAgIH0oZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gVWEodCwgZSk7XG4gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gVWEobmV3IFVpbnQ4QXJyYXkodCksIGUpO1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkgcmV0dXJuIHQuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2Ugb2YgYHRvQnl0ZVN0cmVhbVJlYWRlcmAgaGFzIHRvIGJlIGEgQXJyYXlCdWZmZXIgb3IgUmVhZGFibGVTdHJlYW1cIik7XG4gICAgICAgIH0obiksIGUpO1xuICAgIH1cbiAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAobiwgdG8oZSkpO1xuICAgIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgIEZhKGF3YWl0IHRjKHQpLCBpLCBzKTtcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGxjKHQsIGUpIHtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWUoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHEodCk7XG4gICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IG5hbWVkIHF1ZXJ5XCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5ZZS5nZXROYW1lZFF1ZXJ5KHQsIGUpKSk7XG4gICAgfShhd2FpdCBYYSh0KSwgZSkpKTtcbn1cblxuY2xhc3MgZmMge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBEYXRhYmFzZUluZm8gdXNpbmcgdGhlIHByb3ZpZGVkIGhvc3QsIGRhdGFiYXNlSWQgYW5kXG4gICAgICogcGVyc2lzdGVuY2VLZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YWJhc2VJZCAtIFRoZSBkYXRhYmFzZSB0byB1c2UuXG4gICAgICogQHBhcmFtIGFwcElkIC0gVGhlIEZpcmViYXNlIEFwcCBJZC5cbiAgICAgKiBAcGFyYW0gcGVyc2lzdGVuY2VLZXkgLSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIEZpcmVzdG9yZSdzIGxvY2FsXG4gICAgICogc3RvcmFnZSAodXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBkYXRhYmFzZUlkKS5cbiAgICAgKiBAcGFyYW0gaG9zdCAtIFRoZSBGaXJlc3RvcmUgYmFja2VuZCBob3N0IHRvIGNvbm5lY3QgdG8uXG4gICAgICogQHBhcmFtIHNzbCAtIFdoZXRoZXIgdG8gdXNlIFNTTCB3aGVuIGNvbm5lY3RpbmcuXG4gICAgICogQHBhcmFtIGZvcmNlTG9uZ1BvbGxpbmcgLSBXaGV0aGVyIHRvIHVzZSB0aGUgZm9yY2VMb25nUG9sbGluZyBvcHRpb25cbiAgICAgKiB3aGVuIHVzaW5nIFdlYkNoYW5uZWwgYXMgdGhlIG5ldHdvcmsgdHJhbnNwb3J0LlxuICAgICAqIEBwYXJhbSBhdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgLSBXaGV0aGVyIHRvIHVzZSB0aGUgZGV0ZWN0QnVmZmVyaW5nUHJveHlcbiAgICAgKiBvcHRpb24gd2hlbiB1c2luZyBXZWJDaGFubmVsIGFzIHRoZSBuZXR3b3JrIHRyYW5zcG9ydC5cbiAgICAgKiBAcGFyYW0gdXNlRmV0Y2hTdHJlYW1zIFdoZXRoZXIgdG8gdXNlIHRoZSBGZXRjaCBBUEkgaW5zdGVhZCBvZlxuICAgICAqIFhNTEhUVFBSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgciwgbywgYSkge1xuICAgICAgICB0aGlzLmRhdGFiYXNlSWQgPSB0LCB0aGlzLmFwcElkID0gZSwgdGhpcy5wZXJzaXN0ZW5jZUtleSA9IG4sIHRoaXMuaG9zdCA9IHMsIHRoaXMuc3NsID0gaSwgXG4gICAgICAgIHRoaXMuZm9yY2VMb25nUG9sbGluZyA9IHIsIHRoaXMuYXV0b0RldGVjdExvbmdQb2xsaW5nID0gbywgdGhpcy51c2VGZXRjaFN0cmVhbXMgPSBhO1xuICAgIH1cbn1cblxuLyoqIFRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWUgZm9yIGEgcHJvamVjdC4gKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZGF0YWJhc2UgSUQgYSBGaXJlc3RvcmUgY2xpZW50IGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBkYyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnByb2plY3RJZCA9IHQsIHRoaXMuZGF0YWJhc2UgPSBlIHx8IFwiKGRlZmF1bHQpXCI7XG4gICAgfVxuICAgIGdldCBpc0RlZmF1bHREYXRhYmFzZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiKGRlZmF1bHQpXCIgPT09IHRoaXMuZGF0YWJhc2U7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGRjICYmIHQucHJvamVjdElkID09PSB0aGlzLnByb2plY3RJZCAmJiB0LmRhdGFiYXNlID09PSB0aGlzLmRhdGFiYXNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3Qgd2MgPSBuZXcgTWFwO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG1hcCB0aGF0IGVuc3VyZXMgb25seSBvbmUgRGF0YXN0b3JlIGV4aXN0cyBwZXIgRmlyZXN0b3JlXG4gKiBpbnN0YW5jZS5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmZ1bmN0aW9uIF9jKHQsIGUsIG4pIHtcbiAgICBpZiAoIW4pIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEZ1bmN0aW9uICR7dH0oKSBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgJHtlfS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0d28gYm9vbGVhbiBvcHRpb25zIGFyZSBub3Qgc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBtYyh0LCBlLCBuLCBzKSB7XG4gICAgaWYgKCEwID09PSBlICYmICEwID09PSBzKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGAke3R9IGFuZCAke259IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLmApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGBwYXRoYCByZWZlcnMgdG8gYSBkb2N1bWVudCAoaW5kaWNhdGVkIGJ5IHRoZSBmYWN0IGl0IGNvbnRhaW5zXG4gKiBhbiBldmVuIG51bWJlcnMgb2Ygc2VnbWVudHMpLlxuICovIGZ1bmN0aW9uIGdjKHQpIHtcbiAgICBpZiAoIVN0LmlzRG9jdW1lbnRLZXkodCkpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgZG9jdW1lbnQgcmVmZXJlbmNlLiBEb2N1bWVudCByZWZlcmVuY2VzIG11c3QgaGF2ZSBhbiBldmVuIG51bWJlciBvZiBzZWdtZW50cywgYnV0ICR7dH0gaGFzICR7dC5sZW5ndGh9LmApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGBwYXRoYCByZWZlcnMgdG8gYSBjb2xsZWN0aW9uIChpbmRpY2F0ZWQgYnkgdGhlIGZhY3QgaXRcbiAqIGNvbnRhaW5zIGFuIG9kZCBudW1iZXJzIG9mIHNlZ21lbnRzKS5cbiAqLyBmdW5jdGlvbiB5Yyh0KSB7XG4gICAgaWYgKFN0LmlzRG9jdW1lbnRLZXkodCkpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgY29sbGVjdGlvbiByZWZlcmVuY2UuIENvbGxlY3Rpb24gcmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gb2RkIG51bWJlciBvZiBzZWdtZW50cywgYnV0ICR7dH0gaGFzICR7dC5sZW5ndGh9LmApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgbm9uLW51bGwgb2JqZWN0IHdpdGhvdXQgYSBjdXN0b20gcHJvdG90eXBlXG4gKiAoaS5lLiBleGNsdWRlcyBBcnJheSwgRGF0ZSwgZXRjLikuXG4gKi9cbi8qKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHR5cGUgLyB2YWx1ZSBvZiB0aGUgcHJvdmlkZWQgaW5wdXQuICovXG5mdW5jdGlvbiBwYyh0KSB7XG4gICAgaWYgKHZvaWQgMCA9PT0gdCkgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gICAgaWYgKG51bGwgPT09IHQpIHJldHVybiBcIm51bGxcIjtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHQubGVuZ3RoID4gMjAgJiYgKHQgPSBgJHt0LnN1YnN0cmluZygwLCAyMCl9Li4uYCksIFxuICAgIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiB0IHx8IFwiYm9vbGVhblwiID09IHR5cGVvZiB0KSByZXR1cm4gXCJcIiArIHQ7XG4gICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIFwiYW4gYXJyYXlcIjtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAgICAgLyoqIHRyeSB0byBnZXQgdGhlIGNvbnN0cnVjdG9yIG5hbWUgZm9yIGFuIG9iamVjdC4gKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodC5jb25zdHJ1Y3RvcikgcmV0dXJuIHQuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQ2FzdHMgYG9iamAgdG8gYFRgLCBvcHRpb25hbGx5IHVud3JhcHBpbmcgQ29tcGF0IHR5cGVzIHRvIGV4cG9zZSB0aGVcbiAqIHVuZGVybHlpbmcgaW5zdGFuY2UuIFRocm93cyBpZiAgYG9iamAgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBUYC5cbiAqXG4gKiBUaGlzIGNhc3QgaXMgdXNlZCBpbiB0aGUgTGl0ZSBhbmQgRnVsbCBTREsgdG8gdmVyaWZ5IGluc3RhbmNlIHR5cGVzIGZvclxuICogYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgcHVibGljIEFQSS5cbiAqIEBpbnRlcm5hbFxuICovICh0KTtcbiAgICAgICAgICAgIHJldHVybiBlID8gYGEgY3VzdG9tICR7ZX0gb2JqZWN0YCA6IFwiYW4gb2JqZWN0XCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCA/IFwiYSBmdW5jdGlvblwiIDogTCgpO1xufVxuXG5mdW5jdGlvbiBUYyh0LCBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5lKSB7XG4gICAgaWYgKFwiX2RlbGVnYXRlXCIgaW4gdCAmJiAoXG4gICAgLy8gVW53cmFwIENvbXBhdCB0eXBlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdCA9IHQuX2RlbGVnYXRlKSwgISh0IGluc3RhbmNlb2YgZSkpIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gdC5jb25zdHJ1Y3Rvci5uYW1lKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgaW5zdGFuY2UuIERpZCB5b3UgcGFzcyBhIHJlZmVyZW5jZSBmcm9tIGEgZGlmZmVyZW50IEZpcmVzdG9yZSBTREs/XCIpO1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBuID0gcGModCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBFeHBlY3RlZCB0eXBlICcke2UubmFtZX0nLCBidXQgaXQgd2FzOiAke259YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIEVjKHQsIGUpIHtcbiAgICBpZiAoZSA8PSAwKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBGdW5jdGlvbiAke3R9KCkgcmVxdWlyZXMgYSBwb3NpdGl2ZSBudW1iZXIsIGJ1dCBpdCB3YXM6ICR7ZX0uYCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBzZXR0aW5ncygpIGRlZmF1bHRzOlxuLyoqXG4gKiBBIGNvbmNyZXRlIHR5cGUgZGVzY3JpYmluZyBhbGwgdGhlIHZhbHVlcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHZpYSBhXG4gKiB1c2VyLXN1cHBsaWVkIGBGaXJlc3RvcmVTZXR0aW5nc2Agb2JqZWN0LiBUaGlzIGlzIGEgc2VwYXJhdGUgdHlwZSBzbyB0aGF0XG4gKiBkZWZhdWx0cyBjYW4gYmUgc3VwcGxpZWQgYW5kIHRoZSB2YWx1ZSBjYW4gYmUgY2hlY2tlZCBmb3IgZXF1YWxpdHkuXG4gKi9cbmNsYXNzIEljIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAodm9pZCAwID09PSB0Lmhvc3QpIHtcbiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQuc3NsKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiQ2FuJ3QgcHJvdmlkZSBzc2wgb3B0aW9uIGlmIGhvc3Qgb3B0aW9uIGlzIG5vdCBzZXRcIik7XG4gICAgICAgICAgICB0aGlzLmhvc3QgPSBcImZpcmVzdG9yZS5nb29nbGVhcGlzLmNvbVwiLCB0aGlzLnNzbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB0aGlzLmhvc3QgPSB0Lmhvc3QsIHRoaXMuc3NsID0gbnVsbCA9PT0gKGUgPSB0LnNzbCkgfHwgdm9pZCAwID09PSBlIHx8IGU7XG4gICAgICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzID0gdC5jcmVkZW50aWFscywgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID0gISF0Lmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMsIFxuICAgICAgICB2b2lkIDAgPT09IHQuY2FjaGVTaXplQnl0ZXMpIHRoaXMuY2FjaGVTaXplQnl0ZXMgPSA0MTk0MzA0MDsgZWxzZSB7XG4gICAgICAgICAgICBpZiAoLTEgIT09IHQuY2FjaGVTaXplQnl0ZXMgJiYgdC5jYWNoZVNpemVCeXRlcyA8IDEwNDg1NzYpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJjYWNoZVNpemVCeXRlcyBtdXN0IGJlIGF0IGxlYXN0IDEwNDg1NzZcIik7XG4gICAgICAgICAgICB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gdC5jYWNoZVNpemVCeXRlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcgPSAhIXQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZywgdGhpcy5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSAhIXQuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nLCBcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgPSAhIXQudXNlRmV0Y2hTdHJlYW1zLCBtYyhcImV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmdcIiwgdC5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nLCBcImV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZ1wiLCB0LmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZyk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0ID09PSB0Lmhvc3QgJiYgdGhpcy5zc2wgPT09IHQuc3NsICYmIHRoaXMuY3JlZGVudGlhbHMgPT09IHQuY3JlZGVudGlhbHMgJiYgdGhpcy5jYWNoZVNpemVCeXRlcyA9PT0gdC5jYWNoZVNpemVCeXRlcyAmJiB0aGlzLmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcgPT09IHQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZyAmJiB0aGlzLmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZyA9PT0gdC5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgJiYgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID09PSB0Lmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMgJiYgdGhpcy51c2VGZXRjaFN0cmVhbXMgPT09IHQudXNlRmV0Y2hTdHJlYW1zO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhlIENsb3VkIEZpcmVzdG9yZSBzZXJ2aWNlIGludGVyZmFjZS5cbiAqXG4gKiBEbyBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiBJbnN0ZWFkLCB1c2Uge0BsaW5rIGdldEZpcmVzdG9yZX0uXG4gKi8gY2xhc3MgQWMge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLl9hdXRoQ3JlZGVudGlhbHMgPSBlLCB0aGlzLl9hcHBDaGVja0NyZWRlbnRpYWxzID0gbiwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGl0J3MgYSBGaXJlc3RvcmUgb3IgRmlyZXN0b3JlIExpdGUgaW5zdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImZpcmVzdG9yZS1saXRlXCIsIHRoaXMuX3BlcnNpc3RlbmNlS2V5ID0gXCIobGl0ZSlcIiwgdGhpcy5fc2V0dGluZ3MgPSBuZXcgSWMoe30pLCBcbiAgICAgICAgdGhpcy5fc2V0dGluZ3NGcm96ZW4gPSAhMSwgdCBpbnN0YW5jZW9mIGRjID8gdGhpcy5fZGF0YWJhc2VJZCA9IHQgOiAodGhpcy5fYXBwID0gdCwgXG4gICAgICAgIHRoaXMuX2RhdGFiYXNlSWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYXBwbHkodC5vcHRpb25zLCBbIFwicHJvamVjdElkXCIgXSkpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgJ1wicHJvamVjdElkXCIgbm90IHByb3ZpZGVkIGluIGZpcmViYXNlLmluaXRpYWxpemVBcHAuJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGRjKHQub3B0aW9ucy5wcm9qZWN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogTW9kaWZ5IHRoaXMgaW5zdGFuY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgQ2xvdWQgRmlyZXN0b3JlIGVtdWxhdG9yLlxuICpcbiAqIE5vdGU6IFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgaW5zdGFuY2UgaGFzIGJlZW4gdXNlZCB0byBkbyBhbnlcbiAqIG9wZXJhdGlvbnMuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSBgRmlyZXN0b3JlYCBpbnN0YW5jZSB0byBjb25maWd1cmUgdG8gY29ubmVjdCB0byB0aGVcbiAqIGVtdWxhdG9yLlxuICogQHBhcmFtIGhvc3QgLSB0aGUgZW11bGF0b3IgaG9zdCAoZXg6IGxvY2FsaG9zdCkuXG4gKiBAcGFyYW0gcG9ydCAtIHRoZSBlbXVsYXRvciBwb3J0IChleDogOTAwMCkuXG4gKiBAcGFyYW0gb3B0aW9ucy5tb2NrVXNlclRva2VuIC0gdGhlIG1vY2sgYXV0aCB0b2tlbiB0byB1c2UgZm9yIHVuaXQgdGVzdGluZ1xuICogU2VjdXJpdHkgUnVsZXMuXG4gKi8gKHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBgRmlyZXN0b3JlYCBzZXJ2aWNlXG4gICAgICogaW5zdGFuY2UuXG4gICAgICovICAgIGdldCBhcHAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fYXBwKSB0aHJvdyBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiRmlyZXN0b3JlIHdhcyBub3QgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIEZpcmViYXNlIFNESy4gJ2FwcCcgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcDtcbiAgICB9XG4gICAgZ2V0IF9pbml0aWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzRnJvemVuO1xuICAgIH1cbiAgICBnZXQgX3Rlcm1pbmF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuX3Rlcm1pbmF0ZVRhc2s7XG4gICAgfVxuICAgIF9zZXRTZXR0aW5ncyh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc0Zyb3plbikgdGhyb3cgbmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkZpcmVzdG9yZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgYW5kIGl0cyBzZXR0aW5ncyBjYW4gbm8gbG9uZ2VyIGJlIGNoYW5nZWQuIFlvdSBjYW4gb25seSBtb2RpZnkgc2V0dGluZ3MgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIG1ldGhvZHMgb24gYSBGaXJlc3RvcmUgb2JqZWN0LlwiKTtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBuZXcgSWModCksIHZvaWQgMCAhPT0gdC5jcmVkZW50aWFscyAmJiAodGhpcy5fYXV0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKCF0KSByZXR1cm4gbmV3IEc7XG4gICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiZ2FwaVwiOlxuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmNsaWVudDtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyByZWFsbHkgaXMgYSBHYXBpIGNsaWVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIoIShcIm9iamVjdFwiICE9IHR5cGVvZiBlIHx8IG51bGwgPT09IGUgfHwgIWUuYXV0aCB8fCAhZS5hdXRoLmdldEF1dGhIZWFkZXJWYWx1ZUZvckZpcnN0UGFydHkpKSwgXG4gICAgICAgICAgICAgICAgbmV3IFkoZSwgdC5zZXNzaW9uSW5kZXggfHwgXCIwXCIsIHQuaWFtVG9rZW4gfHwgbnVsbCk7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInByb3ZpZGVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuY2xpZW50O1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcIm1ha2VBdXRoQ3JlZGVudGlhbHNQcm92aWRlciBmYWlsZWQgZHVlIHRvIGludmFsaWQgY3JlZGVudGlhbCB0eXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHQuY3JlZGVudGlhbHMpKTtcbiAgICB9XG4gICAgX2dldFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XG4gICAgfVxuICAgIF9mcmVlemVTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzRnJvemVuID0gITAsIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBfZGVsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVybWluYXRlVGFzayB8fCAodGhpcy5fdGVybWluYXRlVGFzayA9IHRoaXMuX3Rlcm1pbmF0ZSgpKSwgdGhpcy5fdGVybWluYXRlVGFzaztcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBGaXJlc3RvcmVgIGluc3RhbmNlLiAqLyAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcHA6IHRoaXMuX2FwcCxcbiAgICAgICAgICAgIGRhdGFiYXNlSWQ6IHRoaXMuX2RhdGFiYXNlSWQsXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5fc2V0dGluZ3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVybWluYXRlcyBhbGwgY29tcG9uZW50cyB1c2VkIGJ5IHRoaXMgY2xpZW50LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgICAqIHRoaXMgbWV0aG9kIHRvIGNsZWFuIHVwIHRoZWlyIG93biBkZXBlbmRlbmNpZXMsIGJ1dCBtdXN0IGFsc28gY2FsbCB0aGlzXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogT25seSBldmVyIGNhbGxlZCBvbmNlLlxuICAgICAqLyAgICBfdGVybWluYXRlKCkge1xuICAgICAgICAvKipcbiAqIFJlbW92ZXMgYWxsIGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpbnN0YW5jZS4gTXVzdCBiZSBjYWxsZWRcbiAqIHdoZW4gdGhlIGBGaXJlc3RvcmVgIGluc3RhbmNlIGlzIHRlcm1pbmF0ZWQuXG4gKi9cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB3Yy5nZXQodCk7XG4gICAgICAgICAgICBlICYmICgkKFwiQ29tcG9uZW50UHJvdmlkZXJcIiwgXCJSZW1vdmluZyBEYXRhc3RvcmVcIiksIHdjLmRlbGV0ZSh0KSwgZS50ZXJtaW5hdGUoKSk7XG4gICAgICAgIH0odGhpcyksIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gUmModCwgZSwgbiwgcyA9IHt9KSB7XG4gICAgdmFyIGk7XG4gICAgY29uc3QgciA9ICh0ID0gVGModCwgQWMpKS5fZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoXCJmaXJlc3RvcmUuZ29vZ2xlYXBpcy5jb21cIiAhPT0gci5ob3N0ICYmIHIuaG9zdCAhPT0gZSAmJiBPKFwiSG9zdCBoYXMgYmVlbiBzZXQgaW4gYm90aCBzZXR0aW5ncygpIGFuZCB1c2VFbXVsYXRvcigpLCBlbXVsYXRvciBob3N0IHdpbGwgYmUgdXNlZFwiKSwgXG4gICAgdC5fc2V0U2V0dGluZ3MoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByKSwge1xuICAgICAgICBob3N0OiBgJHtlfToke259YCxcbiAgICAgICAgc3NsOiAhMVxuICAgIH0pKSwgcy5tb2NrVXNlclRva2VuKSB7XG4gICAgICAgIGxldCBlLCBuO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2Ygcy5tb2NrVXNlclRva2VuKSBlID0gcy5tb2NrVXNlclRva2VuLCBuID0gRC5NT0NLX1VTRVI7IGVsc2Uge1xuICAgICAgICAgICAgLy8gTGV0IGNyZWF0ZU1vY2tVc2VyVG9rZW4gdmFsaWRhdGUgZmlyc3QgKGNhdGNoZXMgY29tbW9uIG1pc3Rha2VzIGxpa2VcbiAgICAgICAgICAgIC8vIGludmFsaWQgZmllbGQgXCJ1aWRcIiBhbmQgbWlzc2luZyBmaWVsZCBcInN1YlwiIC8gXCJ1c2VyX2lkXCIuKVxuICAgICAgICAgICAgZSA9IGNyZWF0ZU1vY2tVc2VyVG9rZW4ocy5tb2NrVXNlclRva2VuLCBudWxsID09PSAoaSA9IHQuX2FwcCkgfHwgdm9pZCAwID09PSBpID8gdm9pZCAwIDogaS5vcHRpb25zLnByb2plY3RJZCk7XG4gICAgICAgICAgICBjb25zdCByID0gcy5tb2NrVXNlclRva2VuLnN1YiB8fCBzLm1vY2tVc2VyVG9rZW4udXNlcl9pZDtcbiAgICAgICAgICAgIGlmICghcikgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcIm1vY2tVc2VyVG9rZW4gbXVzdCBjb250YWluICdzdWInIG9yICd1c2VyX2lkJyBmaWVsZCFcIik7XG4gICAgICAgICAgICBuID0gbmV3IEQocik7XG4gICAgICAgIH1cbiAgICAgICAgdC5fYXV0aENyZWRlbnRpYWxzID0gbmV3IHoobmV3IFcoZSwgbikpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBgRG9jdW1lbnRSZWZlcmVuY2VgIHJlZmVycyB0byBhIGRvY3VtZW50IGxvY2F0aW9uIGluIGEgRmlyZXN0b3JlIGRhdGFiYXNlXG4gKiBhbmQgY2FuIGJlIHVzZWQgdG8gd3JpdGUsIHJlYWQsIG9yIGxpc3RlbiB0byB0aGUgbG9jYXRpb24uIFRoZSBkb2N1bWVudCBhdFxuICogdGhlIHJlZmVyZW5jZWQgbG9jYXRpb24gbWF5IG9yIG1heSBub3QgZXhpc3QuXG4gKi8gY2xhc3MgUGMge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBgRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZSwgbikge1xuICAgICAgICB0aGlzLmNvbnZlcnRlciA9IGUsIHRoaXMuX2tleSA9IG4sIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBGaXJlc3RvcmUgcmVmZXJlbmNlLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImRvY3VtZW50XCIsIHRoaXMuZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgZ2V0IF9wYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCdzIGlkZW50aWZpZXIgd2l0aGluIGl0cyBjb2xsZWN0aW9uLlxuICAgICAqLyAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXkucGF0aC5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb2YgdGhlIHJlZmVyZW5jZWQgZG9jdW1lbnQgKHJlbGF0aXZlXG4gICAgICogdG8gdGhlIHJvb3Qgb2YgdGhlIGRhdGFiYXNlKS5cbiAgICAgKi8gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXkucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbGxlY3Rpb24gdGhpcyBgRG9jdW1lbnRSZWZlcmVuY2VgIGJlbG9uZ3MgdG8uXG4gICAgICovICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgdmModGhpcy5maXJlc3RvcmUsIHRoaXMuY29udmVydGVyLCB0aGlzLl9rZXkucGF0aC5wb3BMYXN0KCkpO1xuICAgIH1cbiAgICB3aXRoQ29udmVydGVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYyh0aGlzLmZpcmVzdG9yZSwgdCwgdGhpcy5fa2V5KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBgUXVlcnlgIHJlZmVycyB0byBhIHF1ZXJ5IHdoaWNoIHlvdSBjYW4gcmVhZCBvciBsaXN0ZW4gdG8uIFlvdSBjYW4gYWxzb1xuICogY29uc3RydWN0IHJlZmluZWQgYFF1ZXJ5YCBvYmplY3RzIGJ5IGFkZGluZyBmaWx0ZXJzIGFuZCBvcmRlcmluZy5cbiAqLyBjbGFzcyBiYyB7XG4gICAgLy8gVGhpcyBpcyB0aGUgbGl0ZSB2ZXJzaW9uIG9mIHRoZSBRdWVyeSBjbGFzcyBpbiB0aGUgbWFpbiBTREsuXG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgcHJvdGVjdGVkICovXG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBgRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZSwgbikge1xuICAgICAgICB0aGlzLmNvbnZlcnRlciA9IGUsIHRoaXMuX3F1ZXJ5ID0gbiwgXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIEZpcmVzdG9yZSByZWZlcmVuY2UuICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwicXVlcnlcIiwgdGhpcy5maXJlc3RvcmUgPSB0O1xuICAgIH1cbiAgICB3aXRoQ29udmVydGVyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBiYyh0aGlzLmZpcmVzdG9yZSwgdCwgdGhpcy5fcXVlcnkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBDb2xsZWN0aW9uUmVmZXJlbmNlYCBvYmplY3QgY2FuIGJlIHVzZWQgZm9yIGFkZGluZyBkb2N1bWVudHMsIGdldHRpbmdcbiAqIGRvY3VtZW50IHJlZmVyZW5jZXMsIGFuZCBxdWVyeWluZyBmb3IgZG9jdW1lbnRzICh1c2luZyB7QGxpbmsgcXVlcnl9KS5cbiAqLyBjbGFzcyB2YyBleHRlbmRzIGJjIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIodCwgZSwgZ2UobikpLCB0aGlzLl9wYXRoID0gbiwgXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIEZpcmVzdG9yZSByZWZlcmVuY2UuICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwiY29sbGVjdGlvblwiO1xuICAgIH1cbiAgICAvKiogVGhlIGNvbGxlY3Rpb24ncyBpZGVudGlmaWVyLiAqLyAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeS5wYXRoLmxhc3RTZWdtZW50KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCBvZiB0aGUgcmVmZXJlbmNlZCBjb2xsZWN0aW9uIChyZWxhdGl2ZVxuICAgICAqIHRvIHRoZSByb290IG9mIHRoZSBkYXRhYmFzZSkuXG4gICAgICovICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5pbmcgYERvY3VtZW50UmVmZXJlbmNlYCBpZiB0aGlzIGlzIGFcbiAgICAgKiBzdWJjb2xsZWN0aW9uLiBJZiB0aGlzIGlzbid0IGEgc3ViY29sbGVjdGlvbiwgdGhlIHJlZmVyZW5jZSBpcyBudWxsLlxuICAgICAqLyAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5fcGF0aC5wb3BMYXN0KCk7XG4gICAgICAgIHJldHVybiB0LmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgUGModGhpcy5maXJlc3RvcmUsIFxuICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIG5ldyBTdCh0KSk7XG4gICAgfVxuICAgIHdpdGhDb252ZXJ0ZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IHZjKHRoaXMuZmlyZXN0b3JlLCB0LCB0aGlzLl9wYXRoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFZjKHQsIGUsIC4uLm4pIHtcbiAgICBpZiAodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgX2MoXCJjb2xsZWN0aW9uXCIsIFwicGF0aFwiLCBlKSwgdCBpbnN0YW5jZW9mIEFjKSB7XG4gICAgICAgIGNvbnN0IHMgPSBkdC5mcm9tU3RyaW5nKGUsIC4uLm4pO1xuICAgICAgICByZXR1cm4geWMocyksIG5ldyB2Yyh0LCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIHMpO1xuICAgIH1cbiAgICB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBQYyB8fCB0IGluc3RhbmNlb2YgdmMpKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gY29sbGVjdGlvbigpIHRvIGJlIGEgQ29sbGVjdGlvblJlZmVyZW5jZSwgYSBEb2N1bWVudFJlZmVyZW5jZSBvciBGaXJlYmFzZUZpcmVzdG9yZVwiKTtcbiAgICAgICAgY29uc3QgcyA9IHQuX3BhdGguY2hpbGQoZHQuZnJvbVN0cmluZyhlLCAuLi5uKSk7XG4gICAgICAgIHJldHVybiB5YyhzKSwgbmV3IHZjKHQuZmlyZXN0b3JlLCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBzKTtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JlbGl0ZSk6IENvbnNpZGVyIHVzaW5nIEVycm9yRmFjdG9yeSAtXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2Jsb2IvMDEzMWUxZi9wYWNrYWdlcy91dGlsL3NyYy9lcnJvcnMudHMjTDEwNlxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGBRdWVyeWAgaW5zdGFuY2UgdGhhdCBpbmNsdWRlcyBhbGwgZG9jdW1lbnRzIGluIHRoZVxuICogZGF0YWJhc2UgdGhhdCBhcmUgY29udGFpbmVkIGluIGEgY29sbGVjdGlvbiBvciBzdWJjb2xsZWN0aW9uIHdpdGggdGhlXG4gKiBnaXZlbiBgY29sbGVjdGlvbklkYC5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgYEZpcmVzdG9yZWAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29sbGVjdGlvbklkIC0gSWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbnMgdG8gcXVlcnkgb3Zlci4gRXZlcnlcbiAqIGNvbGxlY3Rpb24gb3Igc3ViY29sbGVjdGlvbiB3aXRoIHRoaXMgSUQgYXMgdGhlIGxhc3Qgc2VnbWVudCBvZiBpdHMgcGF0aFxuICogd2lsbCBiZSBpbmNsdWRlZC4gQ2Fubm90IGNvbnRhaW4gYSBzbGFzaC5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGBRdWVyeWAuXG4gKi8gZnVuY3Rpb24gU2ModCwgZSkge1xuICAgIGlmICh0ID0gVGModCwgQWMpLCBfYyhcImNvbGxlY3Rpb25Hcm91cFwiLCBcImNvbGxlY3Rpb24gaWRcIiwgZSksIGUuaW5kZXhPZihcIi9cIikgPj0gMCkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBjb2xsZWN0aW9uIElEICcke2V9JyBwYXNzZWQgdG8gZnVuY3Rpb24gY29sbGVjdGlvbkdyb3VwKCkuIENvbGxlY3Rpb24gSURzIG11c3Qgbm90IGNvbnRhaW4gJy8nLmApO1xuICAgIHJldHVybiBuZXcgYmModCwgXG4gICAgLyogY29udmVydGVyPSAqLyBudWxsLCBcbiAgICAvKipcbiAqIENyZWF0ZXMgYSBuZXcgUXVlcnkgZm9yIGEgY29sbGVjdGlvbiBncm91cCBxdWVyeSB0aGF0IG1hdGNoZXMgYWxsIGRvY3VtZW50c1xuICogd2l0aGluIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uIGdyb3VwLlxuICovXG4gICAgZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IF9lKGR0LmVtcHR5UGF0aCgpLCB0KTtcbiAgICB9KGUpKTtcbn1cblxuZnVuY3Rpb24gRGModCwgZSwgLi4ubikge1xuICAgIGlmICh0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpLCBcbiAgICAvLyBXZSBhbGxvdyBvbWlzc2lvbiBvZiAncGF0aFN0cmluZycgYnV0IGV4cGxpY2l0bHkgcHJvaGliaXQgcGFzc2luZyBpbiBib3RoXG4gICAgLy8gJ3VuZGVmaW5lZCcgYW5kICdudWxsJy5cbiAgICAxID09PSBhcmd1bWVudHMubGVuZ3RoICYmIChlID0gc3QuQSgpKSwgX2MoXCJkb2NcIiwgXCJwYXRoXCIsIGUpLCB0IGluc3RhbmNlb2YgQWMpIHtcbiAgICAgICAgY29uc3QgcyA9IGR0LmZyb21TdHJpbmcoZSwgLi4ubik7XG4gICAgICAgIHJldHVybiBnYyhzKSwgbmV3IFBjKHQsIFxuICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIG5ldyBTdChzKSk7XG4gICAgfVxuICAgIHtcbiAgICAgICAgaWYgKCEodCBpbnN0YW5jZW9mIFBjIHx8IHQgaW5zdGFuY2VvZiB2YykpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBjb2xsZWN0aW9uKCkgdG8gYmUgYSBDb2xsZWN0aW9uUmVmZXJlbmNlLCBhIERvY3VtZW50UmVmZXJlbmNlIG9yIEZpcmViYXNlRmlyZXN0b3JlXCIpO1xuICAgICAgICBjb25zdCBzID0gdC5fcGF0aC5jaGlsZChkdC5mcm9tU3RyaW5nKGUsIC4uLm4pKTtcbiAgICAgICAgcmV0dXJuIGdjKHMpLCBuZXcgUGModC5maXJlc3RvcmUsIHQgaW5zdGFuY2VvZiB2YyA/IHQuY29udmVydGVyIDogbnVsbCwgbmV3IFN0KHMpKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCByZWZlcmVuY2VzIGFyZSBlcXVhbC5cbiAqXG4gKiBAcGFyYW0gbGVmdCAtIEEgcmVmZXJlbmNlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gcmlnaHQgLSBBIHJlZmVyZW5jZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlcyBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgc2FtZVxuICogRmlyZXN0b3JlIGRhdGFiYXNlLlxuICovIGZ1bmN0aW9uIENjKHQsIGUpIHtcbiAgICByZXR1cm4gdCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSwgKHQgaW5zdGFuY2VvZiBQYyB8fCB0IGluc3RhbmNlb2YgdmMpICYmIChlIGluc3RhbmNlb2YgUGMgfHwgZSBpbnN0YW5jZW9mIHZjKSAmJiAodC5maXJlc3RvcmUgPT09IGUuZmlyZXN0b3JlICYmIHQucGF0aCA9PT0gZS5wYXRoICYmIHQuY29udmVydGVyID09PSBlLmNvbnZlcnRlcik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBxdWVyaWVzIHBvaW50IHRvIHRoZSBzYW1lIGNvbGxlY3Rpb24gYW5kIGFwcGx5XG4gKiB0aGUgc2FtZSBjb25zdHJhaW50cy5cbiAqXG4gKiBAcGFyYW0gbGVmdCAtIEEgYFF1ZXJ5YCB0byBjb21wYXJlLlxuICogQHBhcmFtIHJpZ2h0IC0gQSBgUXVlcnlgIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSByZWZlcmVuY2VzIHBvaW50IHRvIHRoZSBzYW1lIGxvY2F0aW9uIGluIHRoZSBzYW1lXG4gKiBGaXJlc3RvcmUgZGF0YWJhc2UuXG4gKi8gZnVuY3Rpb24gTmModCwgZSkge1xuICAgIHJldHVybiB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpLCBlID0gZ2V0TW9kdWxhckluc3RhbmNlKGUpLCB0IGluc3RhbmNlb2YgYmMgJiYgZSBpbnN0YW5jZW9mIGJjICYmICh0LmZpcmVzdG9yZSA9PT0gZS5maXJlc3RvcmUgJiYgYmUodC5fcXVlcnksIGUuX3F1ZXJ5KSAmJiB0LmNvbnZlcnRlciA9PT0gZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBrYyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIFRoZSBsYXN0IHByb21pc2UgaW4gdGhlIHF1ZXVlLlxuICAgICAgICB0aGlzLm1hID0gUHJvbWlzZS5yZXNvbHZlKCksIFxuICAgICAgICAvLyBBIGxpc3Qgb2YgcmV0cnlhYmxlIG9wZXJhdGlvbnMuIFJldHJ5YWJsZSBvcGVyYXRpb25zIGFyZSBydW4gaW4gb3JkZXIgYW5kXG4gICAgICAgIC8vIHJldHJpZWQgd2l0aCBiYWNrb2ZmLlxuICAgICAgICB0aGlzLmdhID0gW10sIFxuICAgICAgICAvLyBJcyB0aGlzIEFzeW5jUXVldWUgYmVpbmcgc2h1dCBkb3duPyBPbmNlIGl0IGlzIHNldCB0byB0cnVlLCBpdCB3aWxsIG5vdFxuICAgICAgICAvLyBiZSBjaGFuZ2VkIGFnYWluLlxuICAgICAgICB0aGlzLnlhID0gITEsIFxuICAgICAgICAvLyBPcGVyYXRpb25zIHNjaGVkdWxlZCB0byBiZSBxdWV1ZWQgaW4gdGhlIGZ1dHVyZS4gT3BlcmF0aW9ucyBhcmVcbiAgICAgICAgLy8gYXV0b21hdGljYWxseSByZW1vdmVkIGFmdGVyIHRoZXkgYXJlIHJ1biBvciBjYW5jZWxlZC5cbiAgICAgICAgdGhpcy5wYSA9IFtdLCBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICB0aGlzLlRhID0gbnVsbCwgXG4gICAgICAgIC8vIEZsYWcgc2V0IHdoaWxlIHRoZXJlJ3MgYW4gb3V0c3RhbmRpbmcgQXN5bmNRdWV1ZSBvcGVyYXRpb24sIHVzZWQgZm9yXG4gICAgICAgIC8vIGFzc2VydGlvbiBzYW5pdHktY2hlY2tzLlxuICAgICAgICB0aGlzLkVhID0gITEsIFxuICAgICAgICAvLyBFbmFibGVkIGR1cmluZyBzaHV0ZG93biBvbiBTYWZhcmkgdG8gcHJldmVudCBmdXR1cmUgYWNjZXNzIHRvIEluZGV4ZWREQi5cbiAgICAgICAgdGhpcy5JYSA9ICExLCBcbiAgICAgICAgLy8gTGlzdCBvZiBUaW1lcklkcyB0byBmYXN0LWZvcndhcmQgZGVsYXlzIGZvci5cbiAgICAgICAgdGhpcy5BYSA9IFtdLCBcbiAgICAgICAgLy8gQmFja29mZiB0aW1lciB1c2VkIHRvIHNjaGVkdWxlIHJldHJpZXMgZm9yIHJldHJ5YWJsZSBvcGVyYXRpb25zXG4gICAgICAgIHRoaXMudXIgPSBuZXcgZW8odGhpcywgXCJhc3luY19xdWV1ZV9yZXRyeVwiIC8qIEFzeW5jUXVldWVSZXRyeSAqLyksIFxuICAgICAgICAvLyBWaXNpYmlsaXR5IGhhbmRsZXIgdGhhdCB0cmlnZ2VycyBhbiBpbW1lZGlhdGUgcmV0cnkgb2YgYWxsIHJldHJ5YWJsZVxuICAgICAgICAvLyBvcGVyYXRpb25zLiBNZWFudCB0byBzcGVlZCB1cCByZWNvdmVyeSB3aGVuIHdlIHJlZ2FpbiBmaWxlIHN5c3RlbSBhY2Nlc3NcbiAgICAgICAgLy8gYWZ0ZXIgcGFnZSBjb21lcyBpbnRvIGZvcmVncm91bmQuXG4gICAgICAgIHRoaXMuUmEgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gWnIoKTtcbiAgICAgICAgICAgIHQgJiYgJChcIkFzeW5jUXVldWVcIiwgXCJWaXNpYmlsaXR5IHN0YXRlIGNoYW5nZWQgdG8gXCIgKyB0LnZpc2liaWxpdHlTdGF0ZSksIHRoaXMudXIuZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdCA9IFpyKCk7XG4gICAgICAgIHQgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LmFkZEV2ZW50TGlzdGVuZXIgJiYgdC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB0aGlzLlJhKTtcbiAgICB9XG4gICAgZ2V0IGlzU2h1dHRpbmdEb3duKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBvcGVyYXRpb24gdG8gdGhlIHF1ZXVlIHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUgKGkuZS5cbiAgICAgKiB3ZSBpZ25vcmUgdGhlIFByb21pc2UgcmVzdWx0KS5cbiAgICAgKi8gICAgZW5xdWV1ZUFuZEZvcmdldCh0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhpcy5lbnF1ZXVlKHQpO1xuICAgIH1cbiAgICBlbnF1ZXVlQW5kRm9yZ2V0RXZlbldoaWxlUmVzdHJpY3RlZCh0KSB7XG4gICAgICAgIHRoaXMuUGEoKSwgXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgdGhpcy5iYSh0KTtcbiAgICB9XG4gICAgZW50ZXJSZXN0cmljdGVkTW9kZSh0KSB7XG4gICAgICAgIGlmICghdGhpcy55YSkge1xuICAgICAgICAgICAgdGhpcy55YSA9ICEwLCB0aGlzLklhID0gdCB8fCAhMTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBacigpO1xuICAgICAgICAgICAgZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMuUmEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVucXVldWUodCkge1xuICAgICAgICBpZiAodGhpcy5QYSgpLCB0aGlzLnlhKSBcbiAgICAgICAgLy8gUmV0dXJuIGEgUHJvbWlzZSB3aGljaCBuZXZlciByZXNvbHZlcy5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgoKSA9PiB7fSkpO1xuICAgICAgICAvLyBDcmVhdGUgYSBkZWZlcnJlZCBQcm9taXNlIHRoYXQgd2UgY2FuIHJldHVybiB0byB0aGUgY2FsbGVlLiBUaGlzXG4gICAgICAgIC8vIGFsbG93cyB1cyB0byByZXR1cm4gYSBcImhhbmdpbmcgUHJvbWlzZVwiIG9ubHkgdG8gdGhlIGNhbGxlZSBhbmQgc3RpbGxcbiAgICAgICAgLy8gYWR2YW5jZSB0aGUgcXVldWUgZXZlbiB3aGVuIHRoZSBvcGVyYXRpb24gaXMgbm90IHJ1bi5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IFE7XG4gICAgICAgIHJldHVybiB0aGlzLmJhKCgoKSA9PiB0aGlzLnlhICYmIHRoaXMuSWEgPyBQcm9taXNlLnJlc29sdmUoKSA6ICh0KCkudGhlbihlLnJlc29sdmUsIGUucmVqZWN0KSwgXG4gICAgICAgIGUucHJvbWlzZSkpKS50aGVuKCgoKSA9PiBlLnByb21pc2UpKTtcbiAgICB9XG4gICAgZW5xdWV1ZVJldHJ5YWJsZSh0KSB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gKHRoaXMuZ2EucHVzaCh0KSwgdGhpcy52YSgpKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBuZXh0IG9wZXJhdGlvbiBmcm9tIHRoZSByZXRyeWFibGUgcXVldWUuIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsXG4gICAgICogcmVzY2hlZHVsZXMgd2l0aCBiYWNrb2ZmLlxuICAgICAqLyAgICBhc3luYyB2YSgpIHtcbiAgICAgICAgaWYgKDAgIT09IHRoaXMuZ2EubGVuZ3RoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2FbMF0oKSwgdGhpcy5nYS5zaGlmdCgpLCB0aGlzLnVyLnJlc2V0KCk7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFYcyh0KSkgdGhyb3cgdDtcbiAvLyBGYWlsdXJlIHdpbGwgYmUgaGFuZGxlZCBieSBBc3luY1F1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXCJBc3luY1F1ZXVlXCIsIFwiT3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJldHJ5YWJsZSBlcnJvcjogXCIgKyB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2EubGVuZ3RoID4gMCAmJiBcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMsIHdlIHJlLXNjaGVkdWxlIGByZXRyeU5leHRPcCgpYC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHJ1biByZXRyeWFibGUgb3BlcmF0aW9ucyB0aGF0IGZhaWxlZCBkdXJpbmdcbiAgICAgICAgICAgIC8vIHRoZWlyIGluaXRpYWwgYXR0ZW1wdCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhleSBhcmUgYWxyZWFkeVxuICAgICAgICAgICAgLy8gZW5xdWV1ZWQuIElmLCBmb3IgZXhhbXBsZSwgYG9wMWAsIGBvcDJgLCBgb3AzYCBhcmUgZW5xdWV1ZWQgYW5kIGBvcDFgXG4gICAgICAgICAgICAvLyBuZWVkcyB0byAgYmUgcmUtcnVuLCB3ZSB3aWxsIHJ1biBgb3AxYCwgYG9wMWAsIGBvcDJgIHVzaW5nIHRoZVxuICAgICAgICAgICAgLy8gYWxyZWFkeSBlbnF1ZXVlZCBjYWxscyB0byBgcmV0cnlOZXh0T3AoKWAuIGBvcDMoKWAgd2lsbCB0aGVuIHJ1biBpbiB0aGVcbiAgICAgICAgICAgIC8vIGNhbGwgc2NoZWR1bGVkIGhlcmUuXG4gICAgICAgICAgICAvLyBTaW5jZSBgYmFja29mZkFuZFJ1bigpYCBjYW5jZWxzIGFuIGV4aXN0aW5nIGJhY2tvZmYgYW5kIHNjaGVkdWxlcyBhXG4gICAgICAgICAgICAvLyBuZXcgYmFja29mZiBvbiBldmVyeSBjYWxsLCB0aGVyZSBpcyBvbmx5IGV2ZXIgYSBzaW5nbGUgYWRkaXRpb25hbFxuICAgICAgICAgICAgLy8gb3BlcmF0aW9uIGluIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgIHRoaXMudXIuWmkoKCgpID0+IHRoaXMudmEoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJhKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMubWEudGhlbigoKCkgPT4gKHRoaXMuRWEgPSAhMCwgdCgpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuVGEgPSB0LCB0aGlzLkVhID0gITE7XG4gICAgICAgICAgICBjb25zdCBlID0gXG4gICAgICAgICAgICAvKipcbiAqIENocm9tZSBpbmNsdWRlcyBFcnJvci5tZXNzYWdlIGluIEVycm9yLnN0YWNrLiBPdGhlciBicm93c2VycyBkbyBub3QuXG4gKiBUaGlzIHJldHVybnMgZXhwZWN0ZWQgb3V0cHV0IG9mIG1lc3NhZ2UgKyBzdGFjayB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG9yIEZpcmVzdG9yZUVycm9yXG4gKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZSA9IHQubWVzc2FnZSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIHQuc3RhY2sgJiYgKGUgPSB0LnN0YWNrLmluY2x1ZGVzKHQubWVzc2FnZSkgPyB0LnN0YWNrIDogdC5tZXNzYWdlICsgXCJcXG5cIiArIHQuc3RhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKHQpO1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdGhlIGVycm9yIHNvIHRoYXQgdGhpcy50YWlsIGJlY29tZXMgYSByZWplY3RlZCBQcm9taXNlIGFuZFxuICAgICAgICAgICAgLy8gYWxsIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gY2hhaW4gKHZpYSAudGhlbikgd2lsbCBqdXN0IHNob3J0LWNpcmN1aXRcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gdGhlIHJlamVjdGVkIFByb21pc2UuXG4gICAgICAgICAgICB0aHJvdyBGKFwiSU5URVJOQUwgVU5IQU5ETEVEIEVSUk9SOiBcIiwgZSksIHQ7XG4gICAgICAgIH0pKS50aGVuKCh0ID0+ICh0aGlzLkVhID0gITEsIHQpKSkpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hID0gZSwgZTtcbiAgICB9XG4gICAgZW5xdWV1ZUFmdGVyRGVsYXkodCwgZSwgbikge1xuICAgICAgICB0aGlzLlBhKCksIFxuICAgICAgICAvLyBGYXN0LWZvcndhcmQgZGVsYXlzIGZvciB0aW1lcklkcyB0aGF0IGhhdmUgYmVlbiBvdmVycmlkZW4uXG4gICAgICAgIHRoaXMuQWEuaW5kZXhPZih0KSA+IC0xICYmIChlID0gMCk7XG4gICAgICAgIGNvbnN0IHMgPSBGby5jcmVhdGVBbmRTY2hlZHVsZSh0aGlzLCB0LCBlLCBuLCAodCA9PiB0aGlzLlZhKHQpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhLnB1c2gocyksIHM7XG4gICAgfVxuICAgIFBhKCkge1xuICAgICAgICB0aGlzLlRhICYmIEwoKTtcbiAgICB9XG4gICAgdmVyaWZ5T3BlcmF0aW9uSW5Qcm9ncmVzcygpIHt9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYWxsIGN1cnJlbnRseSBxdWV1ZWQgdGFza3MgYXJlIGZpbmlzaGVkIGV4ZWN1dGluZy4gRGVsYXllZFxuICAgICAqIG9wZXJhdGlvbnMgYXJlIG5vdCBydW4uXG4gICAgICovICAgIGFzeW5jIFNhKCkge1xuICAgICAgICAvLyBPcGVyYXRpb25zIGluIHRoZSBxdWV1ZSBwcmlvciB0byBkcmFpbmluZyBtYXkgaGF2ZSBlbnF1ZXVlZCBhZGRpdGlvbmFsXG4gICAgICAgIC8vIG9wZXJhdGlvbnMuIEtlZXAgZHJhaW5pbmcgdGhlIHF1ZXVlIHVudGlsIHRoZSB0YWlsIGlzIG5vIGxvbmdlciBhZHZhbmNlZCxcbiAgICAgICAgLy8gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBuZXcgb3BlcmF0aW9ucyB3ZXJlIGVucXVldWVkIGFuZCB0aGF0IGFsbFxuICAgICAgICAvLyBvcGVyYXRpb25zIHdlcmUgZXhlY3V0ZWQuXG4gICAgICAgIGxldCB0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICB0ID0gdGhpcy5tYSwgYXdhaXQgdDtcbiAgICAgICAgfSB3aGlsZSAodCAhPT0gdGhpcy5tYSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvciBUZXN0czogRGV0ZXJtaW5lIGlmIGEgZGVsYXllZCBvcGVyYXRpb24gd2l0aCBhIHBhcnRpY3VsYXIgVGltZXJJZFxuICAgICAqIGV4aXN0cy5cbiAgICAgKi8gICAgRGEodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5wYSkgaWYgKGUudGltZXJJZCA9PT0gdCkgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvciBUZXN0czogUnVucyBzb21lIG9yIGFsbCBkZWxheWVkIG9wZXJhdGlvbnMgZWFybHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFRpbWVySWQgLSBEZWxheWVkIG9wZXJhdGlvbnMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIFRpbWVySWRcbiAgICAgKiB3aWxsIGJlIGRyYWluZWQuIFBhc3MgVGltZXJJZC5BbGwgdG8gcnVuIGFsbCBkZWxheWVkIG9wZXJhdGlvbnMuXG4gICAgICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgb3BlcmF0aW9ucyBoYXZlIGJlZW4gcnVuLlxuICAgICAqLyAgICBDYSh0KSB7XG4gICAgICAgIC8vIE5vdGUgdGhhdCBkcmFpbmluZyBtYXkgZ2VuZXJhdGUgbW9yZSBkZWxheWVkIG9wcywgc28gd2UgZG8gdGhhdCBmaXJzdC5cbiAgICAgICAgcmV0dXJuIHRoaXMuU2EoKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBSdW4gb3BzIGluIHRoZSBzYW1lIG9yZGVyIHRoZXknZCBydW4gaWYgdGhleSByYW4gbmF0dXJhbGx5LlxuICAgICAgICAgICAgdGhpcy5wYS5zb3J0KCgodCwgZSkgPT4gdC50YXJnZXRUaW1lTXMgLSBlLnRhcmdldFRpbWVNcykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMucGEpIGlmIChlLnNraXBEZWxheSgpLCBcImFsbFwiIC8qIEFsbCAqLyAhPT0gdCAmJiBlLnRpbWVySWQgPT09IHQpIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2EoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IFNraXAgYWxsIHN1YnNlcXVlbnQgZGVsYXlzIGZvciBhIHRpbWVyIGlkLlxuICAgICAqLyAgICBOYSh0KSB7XG4gICAgICAgIHRoaXMuQWEucHVzaCh0KTtcbiAgICB9XG4gICAgLyoqIENhbGxlZCBvbmNlIGEgRGVsYXllZE9wZXJhdGlvbiBpcyBydW4gb3IgY2FuY2VsZWQuICovICAgIFZhKHQpIHtcbiAgICAgICAgLy8gTk9URTogaW5kZXhPZiAvIHNsaWNlIGFyZSBPKG4pLCBidXQgZGVsYXllZE9wZXJhdGlvbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc21hbGwuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnBhLmluZGV4T2YodCk7XG4gICAgICAgIHRoaXMucGEuc3BsaWNlKGUsIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24geGModCkge1xuICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhbiBvYmplY3QgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkXG4gKiBtZXRob2RzLlxuICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgbnVsbCA9PT0gdCkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBuID0gdDtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIGlmICh0IGluIG4gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBuW3RdKSByZXR1cm4gITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKipcbiAqIFJlcHJlc2VudHMgdGhlIHRhc2sgb2YgbG9hZGluZyBhIEZpcmVzdG9yZSBidW5kbGUuIEl0IHByb3ZpZGVzIHByb2dyZXNzIG9mIGJ1bmRsZVxuICogbG9hZGluZywgYXMgd2VsbCBhcyB0YXNrIGNvbXBsZXRpb24gYW5kIGVycm9yIGV2ZW50cy5cbiAqXG4gKiBUaGUgQVBJIGlzIGNvbXBhdGlibGUgd2l0aCBgUHJvbWlzZTxMb2FkQnVuZGxlVGFza1Byb2dyZXNzPmAuXG4gKi8gKHQsIFsgXCJuZXh0XCIsIFwiZXJyb3JcIiwgXCJjb21wbGV0ZVwiIF0pO1xufVxuXG5jbGFzcyAkYyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIgPSB7fSwgdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlciA9IG5ldyBRLCB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgICB0YXNrU3RhdGU6IFwiUnVubmluZ1wiLFxuICAgICAgICAgICAgdG90YWxCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsRG9jdW1lbnRzOiAwLFxuICAgICAgICAgICAgYnl0ZXNMb2FkZWQ6IDAsXG4gICAgICAgICAgICBkb2N1bWVudHNMb2FkZWQ6IDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGZ1bmN0aW9ucyB0byBsaXN0ZW4gdG8gYnVuZGxlIGxvYWRpbmcgcHJvZ3Jlc3MgZXZlbnRzLlxuICAgICAqIEBwYXJhbSBuZXh0IC0gQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBwcm9ncmVzcyB1cGRhdGUgZnJvbSBidW5kbGUgbG9hZGluZy4gVHlwaWNhbGx5IGBuZXh0YCBjYWxscyBvY2N1clxuICAgICAqICAgZWFjaCB0aW1lIGEgRmlyZXN0b3JlIGRvY3VtZW50IGlzIGxvYWRlZCBmcm9tIHRoZSBidW5kbGUuXG4gICAgICogQHBhcmFtIGVycm9yIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy4gVGhlIHRhc2sgYWJvcnRzIGFmdGVyIHJlcG9ydGluZyB0aGVcbiAgICAgKiAgIGVycm9yLCBhbmQgdGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgdXBkYXRlcyBhZnRlciB0aGlzLlxuICAgICAqIEBwYXJhbSBjb21wbGV0ZSAtIENhbGxlZCB3aGVuIHRoZSBsb2FkaW5nIHRhc2sgaXMgY29tcGxldGUuXG4gICAgICovICAgIG9uUHJvZ3Jlc3ModCwgZSwgbikge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyID0ge1xuICAgICAgICAgICAgbmV4dDogdCxcbiAgICAgICAgICAgIGVycm9yOiBlLFxuICAgICAgICAgICAgY29tcGxldGU6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB0aGUgYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz4uY2F0Y2hgIGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvblJlamVjdGVkIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy5cbiAgICAgKi8gICAgY2F0Y2godCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlci5wcm9taXNlLmNhdGNoKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHRoZSBgUHJvbWlzZTxMb2FkQnVuZGxlVGFza1Byb2dyZXNzPi50aGVuYCBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25GdWxmaWxsZWQgLSBDYWxsZWQgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxvYWRpbmcgdGFzayB3aXRoIGEgZmluYWwgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHVwZGF0ZS5cbiAgICAgKiAgIFRoZSB1cGRhdGUgd2lsbCBhbHdheXMgaGF2ZSBpdHMgYHRhc2tTdGF0ZWAgc2V0IHRvIGBcIlN1Y2Nlc3NcImAuXG4gICAgICogQHBhcmFtIG9uUmVqZWN0ZWQgLSBDYWxsZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGJ1bmRsZSBsb2FkaW5nLlxuICAgICAqLyAgICB0aGVuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucHJvbWlzZS50aGVuKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIHRoYXQgYnVuZGxlIGxvYWRpbmcgaGFzIGNvbXBsZXRlZCwgd2l0aCBhIHByb3ZpZGVkXG4gICAgICogYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovICAgIF9jb21wbGV0ZVdpdGgodCkge1xuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyh0KSwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5jb21wbGV0ZSAmJiB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmNvbXBsZXRlKCksIFxuICAgICAgICB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnJlc29sdmUodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgdGhhdCBidW5kbGUgbG9hZGluZyBoYXMgZmFpbGVkLCB3aXRoIGEgcHJvdmlkZWRcbiAgICAgKiBgRXJyb3JgIGFzIHRoZSByZWFzb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfZmFpbFdpdGgodCkge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MudGFza1N0YXRlID0gXCJFcnJvclwiLCB0aGlzLl9wcm9ncmVzc09ic2VydmVyLm5leHQgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0KHRoaXMuX2xhc3RQcm9ncmVzcyksIFxuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmVycm9yICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIuZXJyb3IodCksIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucmVqZWN0KHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhIHByb2dyZXNzIHVwZGF0ZSBvZiBsb2FkaW5nIGEgYnVuZGxlLlxuICAgICAqIEBwYXJhbSBwcm9ncmVzcyAtIFRoZSBuZXcgcHJvZ3Jlc3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfdXBkYXRlUHJvZ3Jlc3ModCkge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB0LCB0aGlzLl9wcm9ncmVzc09ic2VydmVyLm5leHQgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBET01FeGNlcHRpb24gZXJyb3IgY29kZSBjb25zdGFudHMuICovIGNvbnN0IEZjID0gLTE7XG5cbi8qKlxuICogVGhlIENsb3VkIEZpcmVzdG9yZSBzZXJ2aWNlIGludGVyZmFjZS5cbiAqXG4gKiBEbyBub3QgY2FsbCB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiBJbnN0ZWFkLCB1c2Uge0BsaW5rIGdldEZpcmVzdG9yZX0uXG4gKi9cbmNsYXNzIE9jIGV4dGVuZHMgQWMge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcih0LCBlLCBuKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGl0J3MgYSB7QGxpbmsgRmlyZXN0b3JlfSBvciBGaXJlc3RvcmUgTGl0ZSBpbnN0YW5jZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwiZmlyZXN0b3JlXCIsIHRoaXMuX3F1ZXVlID0gbmV3IGtjLCB0aGlzLl9wZXJzaXN0ZW5jZUtleSA9IFwibmFtZVwiIGluIHQgPyB0Lm5hbWUgOiBcIltERUZBVUxUXVwiO1xuICAgIH1cbiAgICBfdGVybWluYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlyZXN0b3JlQ2xpZW50IHx8IFxuICAgICAgICAvLyBUaGUgY2xpZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIHN1YnNlcXVlbnQgQVBJXG4gICAgICAgIC8vIHVzYWdlIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICAgIFVjKHRoaXMpLCB0aGlzLl9maXJlc3RvcmVDbGllbnQudGVybWluYXRlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBGaXJlc3RvcmV9IHdpdGggdGhlIHByb3ZpZGVkIHNldHRpbmdzLlxuICogQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZnVuY3Rpb24sIGluY2x1ZGluZ1xuICoge0BsaW5rIGdldEZpcmVzdG9yZX0uIElmIHRoZSBjdXN0b20gc2V0dGluZ3MgYXJlIGVtcHR5LCB0aGlzIGZ1bmN0aW9uIGlzXG4gKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGdldEZpcmVzdG9yZX0uXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gd2l0aCB3aGljaCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogYmUgYXNzb2NpYXRlZC5cbiAqIEBwYXJhbSBzZXR0aW5ncyAtIEEgc2V0dGluZ3Mgb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBIG5ld2x5IGluaXRpYWxpemVkIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlLlxuICovIGZ1bmN0aW9uIE1jKHQsIGUpIHtcbiAgICBjb25zdCBuID0gX2dldFByb3ZpZGVyKHQsIFwiZmlyZXN0b3JlXCIpO1xuICAgIGlmIChuLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICBjb25zdCB0ID0gbi5nZXRJbW1lZGlhdGUoKSwgcyA9IG4uZ2V0T3B0aW9ucygpO1xuICAgICAgICBpZiAoZGVlcEVxdWFsKHMsIGUpKSByZXR1cm4gdDtcbiAgICAgICAgdGhyb3cgbmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBcImluaXRpYWxpemVGaXJlc3RvcmUoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCB3aXRoIGRpZmZlcmVudCBvcHRpb25zLiBUbyBhdm9pZCB0aGlzIGVycm9yLCBjYWxsIGluaXRpYWxpemVGaXJlc3RvcmUoKSB3aXRoIHRoZSBzYW1lIG9wdGlvbnMgYXMgd2hlbiBpdCB3YXMgb3JpZ2luYWxseSBjYWxsZWQsIG9yIGNhbGwgZ2V0RmlyZXN0b3JlKCkgdG8gcmV0dXJuIHRoZSBhbHJlYWR5IGluaXRpYWxpemVkIGluc3RhbmNlLlwiKTtcbiAgICB9XG4gICAgaWYgKHZvaWQgMCAhPT0gZS5jYWNoZVNpemVCeXRlcyAmJiAtMSAhPT0gZS5jYWNoZVNpemVCeXRlcyAmJiBlLmNhY2hlU2l6ZUJ5dGVzIDwgMTA0ODU3NikgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcImNhY2hlU2l6ZUJ5dGVzIG11c3QgYmUgYXQgbGVhc3QgMTA0ODU3NlwiKTtcbiAgICByZXR1cm4gbi5pbml0aWFsaXplKHtcbiAgICAgICAgb3B0aW9uczogZVxuICAgIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4aXN0aW5nIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICogcHJvdmlkZWQge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9LiBJZiBubyBpbnN0YW5jZSBleGlzdHMsIGluaXRpYWxpemVzIGEgbmV3XG4gKiBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gaW5zdGFuY2UgdGhhdCB0aGUgcmV0dXJuZWQge0BsaW5rIEZpcmVzdG9yZX1cbiAqIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQgYXBwLlxuICovIGZ1bmN0aW9uIExjKGUgPSBnZXRBcHAoKSkge1xuICAgIHJldHVybiBfZ2V0UHJvdmlkZXIoZSwgXCJmaXJlc3RvcmVcIikuZ2V0SW1tZWRpYXRlKCk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gQmModCkge1xuICAgIHJldHVybiB0Ll9maXJlc3RvcmVDbGllbnQgfHwgVWModCksIHQuX2ZpcmVzdG9yZUNsaWVudC52ZXJpZnlOb3RUZXJtaW5hdGVkKCksIHQuX2ZpcmVzdG9yZUNsaWVudDtcbn1cblxuZnVuY3Rpb24gVWModCkge1xuICAgIHZhciBlO1xuICAgIGNvbnN0IG4gPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBzID0gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICByZXR1cm4gbmV3IGZjKHQsIGUsIG4sIHMuaG9zdCwgcy5zc2wsIHMuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZywgcy5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcsIHMudXNlRmV0Y2hTdHJlYW1zKTtcbiAgICB9KHQuX2RhdGFiYXNlSWQsIChudWxsID09PSAoZSA9IHQuX2FwcCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5vcHRpb25zLmFwcElkKSB8fCBcIlwiLCB0Ll9wZXJzaXN0ZW5jZUtleSwgbik7XG4gICAgdC5fZmlyZXN0b3JlQ2xpZW50ID0gbmV3IFdhKHQuX2F1dGhDcmVkZW50aWFscywgdC5fYXBwQ2hlY2tDcmVkZW50aWFscywgdC5fcXVldWUsIHMpO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGVuYWJsZSBwZXJzaXN0ZW50IHN0b3JhZ2UsIGlmIHBvc3NpYmxlLlxuICpcbiAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZnVuY3Rpb25zIChvdGhlciB0aGFuXG4gKiB7QGxpbmsgaW5pdGlhbGl6ZUZpcmVzdG9yZX0sIHtAbGluayBnZXRGaXJlc3RvcmV9IG9yXG4gKiB7QGxpbmsgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZX0uXG4gKlxuICogSWYgdGhpcyBmYWlscywgYGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlKClgIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGl0XG4gKiByZXR1cm5zLiBOb3RlIHRoYXQgZXZlbiBhZnRlciB0aGlzIGZhaWx1cmUsIHRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB3aWxsXG4gKiByZW1haW4gdXNhYmxlLCBob3dldmVyIG9mZmxpbmUgcGVyc2lzdGVuY2Ugd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSB0aGlzIGNhbiBmYWlsLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieVxuICogdGhlIGBjb2RlYCBvbiB0aGUgZXJyb3IuXG4gKlxuICogICAqIGZhaWxlZC1wcmVjb25kaXRpb246IFRoZSBhcHAgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgYnJvd3NlciB0YWIuXG4gKiAgICogdW5pbXBsZW1lbnRlZDogVGhlIGJyb3dzZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG9mZmxpbmVcbiAqICAgICBwZXJzaXN0ZW5jZSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gVGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSBmb3IuXG4gKiBAcGFyYW0gcGVyc2lzdGVuY2VTZXR0aW5ncyAtIE9wdGlvbmFsIHNldHRpbmdzIG9iamVjdCB0byBjb25maWd1cmVcbiAqIHBlcnNpc3RlbmNlLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCByZXByZXNlbnRzIHN1Y2Nlc3NmdWxseSBlbmFibGluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuXG4gKi8gZnVuY3Rpb24gcWModCwgZSkge1xuICAgIFhjKHQgPSBUYyh0LCBPYykpO1xuICAgIGNvbnN0IG4gPSBCYyh0KSwgcyA9IHQuX2ZyZWV6ZVNldHRpbmdzKCksIGkgPSBuZXcgQmE7XG4gICAgcmV0dXJuIGpjKG4sIGksIG5ldyBNYShpLCBzLmNhY2hlU2l6ZUJ5dGVzLCBudWxsID09IGUgPyB2b2lkIDAgOiBlLmZvcmNlT3duZXJzaGlwKSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gZW5hYmxlIG11bHRpLXRhYiBwZXJzaXN0ZW50IHN0b3JhZ2UsIGlmIHBvc3NpYmxlLiBJZiBlbmFibGVkXG4gKiBhY3Jvc3MgYWxsIHRhYnMsIGFsbCBvcGVyYXRpb25zIHNoYXJlIGFjY2VzcyB0byBsb2NhbCBwZXJzaXN0ZW5jZSwgaW5jbHVkaW5nXG4gKiBzaGFyZWQgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgYW5kIGxhdGVuY3ktY29tcGVuc2F0ZWQgbG9jYWwgZG9jdW1lbnQgdXBkYXRlc1xuICogYWNyb3NzIGFsbCBjb25uZWN0ZWQgaW5zdGFuY2VzLlxuICpcbiAqIElmIHRoaXMgZmFpbHMsIGBlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlKClgIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlXG4gKiBpdCByZXR1cm5zLiBOb3RlIHRoYXQgZXZlbiBhZnRlciB0aGlzIGZhaWx1cmUsIHRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB3aWxsXG4gKiByZW1haW4gdXNhYmxlLCBob3dldmVyIG9mZmxpbmUgcGVyc2lzdGVuY2Ugd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSB0aGlzIGNhbiBmYWlsLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieVxuICogdGhlIGBjb2RlYCBvbiB0aGUgZXJyb3IuXG4gKlxuICogICAqIGZhaWxlZC1wcmVjb25kaXRpb246IFRoZSBhcHAgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgYnJvd3NlciB0YWIgYW5kXG4gKiAgICAgbXVsdGktdGFiIGlzIG5vdCBlbmFibGVkLlxuICogICAqIHVuaW1wbGVtZW50ZWQ6IFRoZSBicm93c2VyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvZmZsaW5lXG4gKiAgICAgcGVyc2lzdGVuY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBlbmFibGUgcGVyc2lzdGVuY2UgZm9yLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCByZXByZXNlbnRzIHN1Y2Nlc3NmdWxseSBlbmFibGluZyBwZXJzaXN0ZW50XG4gKiBzdG9yYWdlLlxuICovIGZ1bmN0aW9uIEtjKHQpIHtcbiAgICBYYyh0ID0gVGModCwgT2MpKTtcbiAgICBjb25zdCBlID0gQmModCksIG4gPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBzID0gbmV3IEJhO1xuICAgIHJldHVybiBqYyhlLCBzLCBuZXcgTGEocywgbi5jYWNoZVNpemVCeXRlcykpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBib3RoIHRoZSBgT2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyYCBhbmQgYE9ubGluZUNvbXBvbmVudFByb3ZpZGVyYC5cbiAqIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhIHJlY292ZXJhYmxlIGVycm9yIChzZWVcbiAqIGBjYW5SZWNvdmVyRnJvbUluZGV4ZWREYkVycm9yKClgIGJlbG93KSwgdGhlIHJldHVybmVkIFByb21pc2UgaXMgcmVqZWN0ZWRcbiAqIGJ1dCB0aGUgY2xpZW50IHJlbWFpbnMgdXNhYmxlLlxuICovIGZ1bmN0aW9uIGpjKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gbmV3IFE7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBHYSh0LCBuKSwgYXdhaXQgemEodCwgZSksIHMucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBpZiAoIVxuICAgICAgICAgICAgLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVycm9yIGFsbG93cyB1cyB0byBncmFjZWZ1bGx5IGRpc2FibGVcbiAqIHBlcnNpc3RlbmNlIChhcyBvcHBvc2VkIHRvIGNyYXNoaW5nIHRoZSBjbGllbnQpLlxuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiRmlyZWJhc2VFcnJvclwiID09PSB0Lm5hbWUpIHJldHVybiB0LmNvZGUgPT09IEsuRkFJTEVEX1BSRUNPTkRJVElPTiB8fCB0LmNvZGUgPT09IEsuVU5JTVBMRU1FTlRFRDtcbiAgICAgICAgICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRE9NRXhjZXB0aW9uICYmIHQgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pIFxuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhIGZldyBrbm93biBjaXJjdW1zdGFuY2VzIHdoZXJlIHdlIGNhbiBvcGVuIEluZGV4ZWREYiBidXRcbiAgICAgICAgICAgICAgICAvLyB0cnlpbmcgdG8gcmVhZC93cml0ZSB3aWxsIGZhaWwgKGUuZy4gcXVvdGEgZXhjZWVkZWQpLiBGb3JcbiAgICAgICAgICAgICAgICAvLyB3ZWxsLXVuZGVyc3Rvb2QgY2FzZXMsIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHRoZXNlIGFuZCB0aGVuIGdyYWNlZnVsbHlcbiAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJhdGhlciB0aGFuIGNvbnRpbnVlIHRvIGFkZCB0byB0aGlzIGxpc3QsIHdlIGNvdWxkIGRlY2lkZSB0b1xuICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmYWxsIGJhY2ssIHdpdGggdGhlIHJpc2sgdGhhdCB3ZSBtaWdodCBhY2NpZGVudGFsbHkgaGlkZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRpbmcgYWN0dWFsIFNESyBidWdzLlxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGJyb3dzZXIgaXMgb3V0IG9mIHF1b3RhIHdlIGNvdWxkIGdldCBlaXRoZXIgcXVvdGEgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAvLyBvciBhbiBhYm9ydGVkIGVycm9yIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlcnJvciBoYXBwZW5lZCBkdXJpbmdcbiAgICAgICAgICAgICAgICAvLyBzY2hlbWEgbWlncmF0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVybiAyMiA9PT0gdC5jb2RlIHx8IDIwID09PSB0LmNvZGUgfHwgXG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBQcml2YXRlIEJyb3dzaW5nIG1vZGUgZGlzYWJsZXMgSW5kZXhlZERiIGFuZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgLy8gSU5WQUxJRF9TVEFURSBmb3IgYW55IHVzYWdlLlxuICAgICAgICAgICAgICAgIDExID09PSB0LmNvZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBDbGVhcnMgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZS4gVGhpcyBpbmNsdWRlcyBwZW5kaW5nIHdyaXRlcyBhbmQgY2FjaGVkXG4gKiBkb2N1bWVudHMuXG4gKlxuICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIGlzIG5vdCBzdGFydGVkIChhZnRlciB0aGUgYXBwIGlzXG4gKiB0ZXJtaW5hdGVkIG9yIHdoZW4gdGhlIGFwcCBpcyBmaXJzdCBpbml0aWFsaXplZCkuIE9uIHN0YXJ0dXAsIHRoaXMgZnVuY3Rpb25cbiAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBmdW5jdGlvbnMgKG90aGVyIHRoYW4ge0BsaW5rXG4gKiBpbml0aWFsaXplRmlyZXN0b3JlfSBvciB7QGxpbmsgZ2V0RmlyZXN0b3JlfSkpLiBJZiB0aGUge0BsaW5rIEZpcmVzdG9yZX1cbiAqIGluc3RhbmNlIGlzIHN0aWxsIHJ1bm5pbmcsIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgZXJyb3IgY29kZVxuICogb2YgYGZhaWxlZC1wcmVjb25kaXRpb25gLlxuICpcbiAqIE5vdGU6IGBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlKClgIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBoZWxwIHdyaXRlXG4gKiByZWxpYWJsZSB0ZXN0cyB0aGF0IHVzZSBDbG91ZCBGaXJlc3RvcmUuIEl0IHVzZXMgYW4gZWZmaWNpZW50IG1lY2hhbmlzbSBmb3JcbiAqIGRyb3BwaW5nIGV4aXN0aW5nIGRhdGEgYnV0IGRvZXMgbm90IGF0dGVtcHQgdG8gc2VjdXJlbHkgb3ZlcndyaXRlIG9yXG4gKiBvdGhlcndpc2UgbWFrZSBjYWNoZWQgZGF0YSB1bnJlY292ZXJhYmxlLiBGb3IgYXBwbGljYXRpb25zIHRoYXQgYXJlIHNlbnNpdGl2ZVxuICogdG8gdGhlIGRpc2Nsb3N1cmUgb2YgY2FjaGVkIGRhdGEgaW4gYmV0d2VlbiB1c2VyIHNlc3Npb25zLCB3ZSBzdHJvbmdseVxuICogcmVjb21tZW5kIG5vdCBlbmFibGluZyBwZXJzaXN0ZW5jZSBhdCBhbGwuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBjbGVhciBwZXJzaXN0ZW5jZSBmb3IuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBpc1xuICogY2xlYXJlZC4gT3RoZXJ3aXNlLCB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCB3aXRoIGFuIGVycm9yLlxuICovICh0KSkgdGhyb3cgdDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGVuYWJsaW5nIG9mZmxpbmUgcGVyc2lzdGVuY2UuIEZhbGxpbmcgYmFjayB0byBwZXJzaXN0ZW5jZSBkaXNhYmxlZDogXCIgKyB0KSwgXG4gICAgICAgICAgICBzLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH0pKS50aGVuKCgoKSA9PiBzLnByb21pc2UpKTtcbn1cblxuZnVuY3Rpb24gUWModCkge1xuICAgIGlmICh0Ll9pbml0aWFsaXplZCAmJiAhdC5fdGVybWluYXRlZCkgdGhyb3cgbmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIlBlcnNpc3RlbmNlIGNhbiBvbmx5IGJlIGNsZWFyZWQgYmVmb3JlIGEgRmlyZXN0b3JlIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIG9yIGFmdGVyIGl0IGlzIHRlcm1pbmF0ZWQuXCIpO1xuICAgIGNvbnN0IGUgPSBuZXcgUTtcbiAgICByZXR1cm4gdC5fcXVldWUuZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQoKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUhzLmJ0KCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdCArIFwibWFpblwiO1xuICAgICAgICAgICAgICAgIGF3YWl0IEhzLmRlbGV0ZShlKTtcbiAgICAgICAgICAgIH0ob3IodC5fZGF0YWJhc2VJZCwgdC5fcGVyc2lzdGVuY2VLZXkpKSwgZS5yZXNvbHZlKCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGUucmVqZWN0KHQpO1xuICAgICAgICB9XG4gICAgfSkpLCBlLnByb21pc2U7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWwgYWxsIGN1cnJlbnRseSBwZW5kaW5nIHdyaXRlcyBmb3IgdGhlIGFjdGl2ZSB1c2VyIGhhdmUgYmVlblxuICogYWNrbm93bGVkZ2VkIGJ5IHRoZSBiYWNrZW5kLlxuICpcbiAqIFRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyB3cml0ZXMuXG4gKiBPdGhlcndpc2UsIHRoZSBwcm9taXNlIHdhaXRzIGZvciBhbGwgcHJldmlvdXNseSBpc3N1ZWQgd3JpdGVzIChpbmNsdWRpbmdcbiAqIHRob3NlIHdyaXR0ZW4gaW4gYSBwcmV2aW91cyBhcHAgc2Vzc2lvbiksIGJ1dCBpdCBkb2VzIG5vdCB3YWl0IGZvciB3cml0ZXNcbiAqIHRoYXQgd2VyZSBhZGRlZCBhZnRlciB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBJZiB5b3Ugd2FudCB0byB3YWl0IGZvclxuICogYWRkaXRpb25hbCB3cml0ZXMsIGNhbGwgYHdhaXRGb3JQZW5kaW5nV3JpdGVzKClgIGFnYWluLlxuICpcbiAqIEFueSBvdXRzdGFuZGluZyBgd2FpdEZvclBlbmRpbmdXcml0ZXMoKWAgcHJvbWlzZXMgYXJlIHJlamVjdGVkIGR1cmluZyB1c2VyXG4gKiBjaGFuZ2VzLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHdoaWNoIHJlc29sdmVzIHdoZW4gYWxsIGN1cnJlbnRseSBwZW5kaW5nIHdyaXRlcyBoYXZlIGJlZW5cbiAqIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZC5cbiAqLyBmdW5jdGlvbiBXYyh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBRO1xuICAgICAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IHdhKGF3YWl0IHRjKHQpLCBlKSkpLCBlLnByb21pc2U7XG4gICAgfShCYyh0ID0gVGModCwgT2MpKSk7XG59XG5cbi8qKlxuICogUmUtZW5hYmxlcyB1c2Ugb2YgdGhlIG5ldHdvcmsgZm9yIHRoaXMge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgYWZ0ZXIgYSBwcmlvclxuICogY2FsbCB0byB7QGxpbmsgZGlzYWJsZU5ldHdvcmt9LlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmV0d29yayBoYXMgYmVlbiBlbmFibGVkLlxuICovIGZ1bmN0aW9uIEdjKHQpIHtcbiAgICByZXR1cm4gbmMoQmModCA9IFRjKHQsIE9jKSkpO1xufVxuXG4vKipcbiAqIERpc2FibGVzIG5ldHdvcmsgdXNhZ2UgZm9yIHRoaXMgaW5zdGFuY2UuIEl0IGNhbiBiZSByZS1lbmFibGVkIHZpYSB7QGxpbmtcbiAqIGVuYWJsZU5ldHdvcmt9LiBXaGlsZSB0aGUgbmV0d29yayBpcyBkaXNhYmxlZCwgYW55IHNuYXBzaG90IGxpc3RlbmVycyxcbiAqIGBnZXREb2MoKWAgb3IgYGdldERvY3MoKWAgY2FsbHMgd2lsbCByZXR1cm4gcmVzdWx0cyBmcm9tIGNhY2hlLCBhbmQgYW55IHdyaXRlXG4gKiBvcGVyYXRpb25zIHdpbGwgYmUgcXVldWVkIHVudGlsIHRoZSBuZXR3b3JrIGlzIHJlc3RvcmVkLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmV0d29yayBoYXMgYmVlbiBkaXNhYmxlZC5cbiAqLyBmdW5jdGlvbiB6Yyh0KSB7XG4gICAgcmV0dXJuIHNjKEJjKHQgPSBUYyh0LCBPYykpKTtcbn1cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBwcm92aWRlZCB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZS5cbiAqXG4gKiBBZnRlciBjYWxsaW5nIGB0ZXJtaW5hdGUoKWAgb25seSB0aGUgYGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoKWAgZnVuY3Rpb25cbiAqIG1heSBiZSB1c2VkLiBBbnkgb3RoZXIgZnVuY3Rpb24gd2lsbCB0aHJvdyBhIGBGaXJlc3RvcmVFcnJvcmAuXG4gKlxuICogVG8gcmVzdGFydCBhZnRlciB0ZXJtaW5hdGlvbiwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZpcmViYXNlRmlyZXN0b3JlIHdpdGhcbiAqIHtAbGluayBnZXRGaXJlc3RvcmV9LlxuICpcbiAqIFRlcm1pbmF0aW9uIGRvZXMgbm90IGNhbmNlbCBhbnkgcGVuZGluZyB3cml0ZXMsIGFuZCBhbnkgcHJvbWlzZXMgdGhhdCBhcmVcbiAqIGF3YWl0aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIHdpbGwgbm90IGJlIHJlc29sdmVkLiBJZiB5b3UgaGF2ZVxuICogcGVyc2lzdGVuY2UgZW5hYmxlZCwgdGhlIG5leHQgdGltZSB5b3Ugc3RhcnQgdGhpcyBpbnN0YW5jZSwgaXQgd2lsbCByZXN1bWVcbiAqIHNlbmRpbmcgdGhlc2Ugd3JpdGVzIHRvIHRoZSBzZXJ2ZXIuXG4gKlxuICogTm90ZTogVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIGNhbGxpbmcgYHRlcm1pbmF0ZSgpYCBpcyBub3QgcmVxdWlyZWQuIFRoaXNcbiAqIGZ1bmN0aW9uIGlzIHVzZWZ1bCBvbmx5IHdoZW4geW91IHdhbnQgdG8gZm9yY2UgdGhpcyBpbnN0YW5jZSB0byByZWxlYXNlIGFsbFxuICogb2YgaXRzIHJlc291cmNlcyBvciBpbiBjb21iaW5hdGlvbiB3aXRoIGBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlKClgIHRvXG4gKiBlbnN1cmUgdGhhdCBhbGwgbG9jYWwgc3RhdGUgaXMgZGVzdHJveWVkIGJldHdlZW4gdGVzdCBydW5zLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5XG4gKiB0ZXJtaW5hdGVkLlxuICovIGZ1bmN0aW9uIEhjKHQpIHtcbiAgICByZXR1cm4gX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSh0LmFwcCwgXCJmaXJlc3RvcmVcIiksIHQuX2RlbGV0ZSgpO1xufVxuXG4vKipcbiAqIExvYWRzIGEgRmlyZXN0b3JlIGJ1bmRsZSBpbnRvIHRoZSBsb2NhbCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gVGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIHRvIGxvYWQgYnVuZGxlcyBmb3IgZm9yLlxuICogQHBhcmFtIGJ1bmRsZURhdGEgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBidW5kbGUgdG8gYmUgbG9hZGVkLiBWYWxpZCBvYmplY3RzIGFyZVxuICogICBgQXJyYXlCdWZmZXJgLCBgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT5gIG9yIGBzdHJpbmdgLlxuICpcbiAqIEByZXR1cm5zXG4gKiAgIEEgYExvYWRCdW5kbGVUYXNrYCBvYmplY3QsIHdoaWNoIG5vdGlmaWVzIGNhbGxlcnMgd2l0aCBwcm9ncmVzcyB1cGRhdGVzLCBhbmQgY29tcGxldGlvblxuICogICBvciBlcnJvciBldmVudHMuIEl0IGNhbiBiZSB1c2VkIGFzIGEgYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz5gLlxuICovIGZ1bmN0aW9uIEpjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gQmModCA9IFRjKHQsIE9jKSksIHMgPSBuZXcgJGM7XG4gICAgcmV0dXJuIGhjKG4sIHQuX2RhdGFiYXNlSWQsIGUsIHMpLCBzO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgRmlyZXN0b3JlIHtAbGluayBRdWVyeX0gZnJvbSBsb2NhbCBjYWNoZSwgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gbmFtZS5cbiAqXG4gKiBUaGUgbmFtZWQgcXVlcmllcyBhcmUgcGFja2FnZWQgIGludG8gYnVuZGxlcyBvbiB0aGUgc2VydmVyIHNpZGUgKGFsb25nXG4gKiB3aXRoIHJlc3VsdGluZyBkb2N1bWVudHMpLCBhbmQgbG9hZGVkIHRvIGxvY2FsIGNhY2hlIHVzaW5nIGBsb2FkQnVuZGxlYC4gT25jZSBpbiBsb2NhbFxuICogY2FjaGUsIHVzZSB0aGlzIG1ldGhvZCB0byBleHRyYWN0IGEge0BsaW5rIFF1ZXJ5fSBieSBuYW1lLlxuICovIGZ1bmN0aW9uIFljKHQsIGUpIHtcbiAgICByZXR1cm4gbGMoQmModCA9IFRjKHQsIE9jKSksIGUpLnRoZW4oKGUgPT4gZSA/IG5ldyBiYyh0LCBudWxsLCBlLnF1ZXJ5KSA6IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gWGModCkge1xuICAgIGlmICh0Ll9pbml0aWFsaXplZCB8fCB0Ll90ZXJtaW5hdGVkKSB0aHJvdyBuZXcgaihLLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiRmlyZXN0b3JlIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBhbmQgcGVyc2lzdGVuY2UgY2FuIG5vIGxvbmdlciBiZSBlbmFibGVkLiBZb3UgY2FuIG9ubHkgZW5hYmxlIHBlcnNpc3RlbmNlIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBtZXRob2RzIG9uIGEgRmlyZXN0b3JlIG9iamVjdC5cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBGaWVsZFBhdGhgIHJlZmVycyB0byBhIGZpZWxkIGluIGEgZG9jdW1lbnQuIFRoZSBwYXRoIG1heSBjb25zaXN0IG9mIGFcbiAqIHNpbmdsZSBmaWVsZCBuYW1lIChyZWZlcnJpbmcgdG8gYSB0b3AtbGV2ZWwgZmllbGQgaW4gdGhlIGRvY3VtZW50KSwgb3IgYVxuICogbGlzdCBvZiBmaWVsZCBuYW1lcyAocmVmZXJyaW5nIHRvIGEgbmVzdGVkIGZpZWxkIGluIHRoZSBkb2N1bWVudCkuXG4gKlxuICogQ3JlYXRlIGEgYEZpZWxkUGF0aGAgYnkgcHJvdmlkaW5nIGZpZWxkIG5hbWVzLiBJZiBtb3JlIHRoYW4gb25lIGZpZWxkXG4gKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gKi9cbmNsYXNzIFpjIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYEZpZWxkUGF0aGAgZnJvbSB0aGUgcHJvdmlkZWQgZmllbGQgbmFtZXMuIElmIG1vcmUgdGhhbiBvbmUgZmllbGRcbiAgICAgKiBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgcGF0aCB3aWxsIHBvaW50IHRvIGEgbmVzdGVkIGZpZWxkIGluIGEgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGROYW1lcyAtIEEgbGlzdCBvZiBmaWVsZCBuYW1lcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvciguLi50KSB7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdC5sZW5ndGg7ICsrZSkgaWYgKDAgPT09IHRbZV0ubGVuZ3RoKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBmaWVsZCBuYW1lIGF0IGFyZ3VtZW50ICQoaSArIDEpLiBGaWVsZCBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eS5cIik7XG4gICAgICAgIHRoaXMuX2ludGVybmFsUGF0aCA9IG5ldyBfdCh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEZpZWxkUGF0aGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgRmllbGRQYXRoYCB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGBGaWVsZFBhdGhgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxQYXRoLmlzRXF1YWwodC5faW50ZXJuYWxQYXRoKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgc2VudGluZWwgYEZpZWxkUGF0aGAgdG8gcmVmZXIgdG8gdGhlIElEIG9mIGEgZG9jdW1lbnQuXG4gKiBJdCBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoZSBkb2N1bWVudCBJRC5cbiAqLyBmdW5jdGlvbiB0dSgpIHtcbiAgICByZXR1cm4gbmV3IFpjKFwiX19uYW1lX19cIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIGJ5dGVzLlxuICovIGNsYXNzIGV1IHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5fYnl0ZVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYEJ5dGVzYCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZywgY29udmVydGluZyBpdCB0b1xuICAgICAqIGJ5dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21CYXNlNjRTdHJpbmcodCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBldSh5dC5mcm9tQmFzZTY0U3RyaW5nKHQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBjb25zdHJ1Y3QgZGF0YSBmcm9tIEJhc2U2NCBzdHJpbmc6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQnl0ZXNgIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBVaW50OEFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFycmF5IC0gVGhlIFVpbnQ4QXJyYXkgdXNlZCB0byBjcmVhdGUgdGhlIGBCeXRlc2Agb2JqZWN0LlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkodCkge1xuICAgICAgICByZXR1cm4gbmV3IGV1KHl0LmZyb21VaW50OEFycmF5KHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBieXRlcyBhcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9CYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlU3RyaW5nLnRvQmFzZTY0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgaW4gYSBuZXcgYFVpbnQ4QXJyYXlgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFVpbnQ4QXJyYXkgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZVN0cmluZy50b1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICovICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJCeXRlcyhiYXNlNjQ6IFwiICsgdGhpcy50b0Jhc2U2NCgpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBCeXRlc2Agb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYEJ5dGVzYCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgQnl0ZXNgIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVTdHJpbmcuaXNFcXVhbCh0Ll9ieXRlU3RyaW5nKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNlbnRpbmVsIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBkb2N1bWVudCBmaWVsZHMgd2l0aCBgc2V0KClgXG4gKiBvciBgdXBkYXRlKClgLlxuICovIGNsYXNzIG51IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX21ldGhvZE5hbWUgLSBUaGUgcHVibGljIEFQSSBlbmRwb2ludCB0aGF0IHJldHVybnMgdGhpcyBjbGFzcy5cbiAgICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLl9tZXRob2ROYW1lID0gdDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBpbiBGaXJlc3RvcmUuIFRoZVxuICogbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYXMgbGF0aXR1ZGUvbG9uZ2l0dWRlIHBhaXIuXG4gKlxuICogTGF0aXR1ZGUgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgWy05MCwgOTBdLlxuICogTG9uZ2l0dWRlIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIG9mIFstMTgwLCAxODBdLlxuICovIGNsYXNzIHN1IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGltbXV0YWJsZSBgR2VvUG9pbnRgIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBsYXRpdHVkZSBhbmRcbiAgICAgKiBsb25naXR1ZGUgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSBhcyBudW1iZXIgYmV0d2VlbiAtOTAgYW5kIDkwLlxuICAgICAqIEBwYXJhbSBsb25naXR1ZGUgLSBUaGUgbG9uZ2l0dWRlIGFzIG51bWJlciBiZXR3ZWVuIC0xODAgYW5kIDE4MC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIGlmICghaXNGaW5pdGUodCkgfHwgdCA8IC05MCB8fCB0ID4gOTApIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJMYXRpdHVkZSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gLTkwIGFuZCA5MCwgYnV0IHdhczogXCIgKyB0KTtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShlKSB8fCBlIDwgLTE4MCB8fCBlID4gMTgwKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiTG9uZ2l0dWRlIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAsIGJ1dCB3YXM6IFwiICsgZSk7XG4gICAgICAgIHRoaXMuX2xhdCA9IHQsIHRoaXMuX2xvbmcgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbGF0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhpcyBgR2VvUG9pbnRgIGluc3RhbmNlLlxuICAgICAqLyAgICBnZXQgbG9uZ2l0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEdlb1BvaW50YCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBHZW9Qb2ludGAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgR2VvUG9pbnRgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ID09PSB0Ll9sYXQgJiYgdGhpcy5fbG9uZyA9PT0gdC5fbG9uZztcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdlb1BvaW50LiAqLyAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRpdHVkZTogdGhpcy5fbGF0LFxuICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLl9sb25nXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdHVhbGx5IHByaXZhdGUgdG8gSlMgY29uc3VtZXJzIG9mIG91ciBBUEksIHNvIHRoaXMgZnVuY3Rpb24gaXMgcHJlZml4ZWRcbiAgICAgKiB3aXRoIGFuIHVuZGVyc2NvcmUuXG4gICAgICovICAgIF9jb21wYXJlVG8odCkge1xuICAgICAgICByZXR1cm4gaXQodGhpcy5fbGF0LCB0Ll9sYXQpIHx8IGl0KHRoaXMuX2xvbmcsIHQuX2xvbmcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgaXUgPSAvXl9fLipfXyQvO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGRvY3VtZW50IGRhdGEgKGUuZy4gZm9yIGEgc2V0RGF0YSBjYWxsKS4gKi8gY2xhc3MgcnUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdCwgdGhpcy5maWVsZE1hc2sgPSBlLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IG47XG4gICAgfVxuICAgIHRvTXV0YXRpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5maWVsZE1hc2sgPyBuZXcgb24odCwgdGhpcy5kYXRhLCB0aGlzLmZpZWxkTWFzaywgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpIDogbmV3IHJuKHQsIHRoaXMuZGF0YSwgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSByZXN1bHQgb2YgcGFyc2luZyBcInVwZGF0ZVwiIGRhdGEgKGkuZS4gZm9yIGFuIHVwZGF0ZURhdGEgY2FsbCkuICovIGNsYXNzIG91IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBcbiAgICAvLyBUaGUgZmllbGRNYXNrIGRvZXMgbm90IGluY2x1ZGUgZG9jdW1lbnQgdHJhbnNmb3Jtcy5cbiAgICBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHQsIHRoaXMuZmllbGRNYXNrID0gZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMgPSBuO1xuICAgIH1cbiAgICB0b011dGF0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBvbih0LCB0aGlzLmRhdGEsIHRoaXMuZmllbGRNYXNrLCBlLCB0aGlzLmZpZWxkVHJhbnNmb3Jtcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhdSh0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBjYXNlIDAgLyogU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAyIC8qIE1lcmdlU2V0ICovIDpcbiAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAxIC8qIFVwZGF0ZSAqLyA6XG4gICAgICAgIHJldHVybiAhMDtcblxuICAgICAgY2FzZSAzIC8qIEFyZ3VtZW50ICovIDpcbiAgICAgIGNhc2UgNCAvKiBBcnJheUFyZ3VtZW50ICovIDpcbiAgICAgICAgcmV0dXJuICExO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBMKCk7XG4gICAgfVxufVxuXG4vKiogQSBcImNvbnRleHRcIiBvYmplY3QgcGFzc2VkIGFyb3VuZCB3aGlsZSBwYXJzaW5nIHVzZXIgZGF0YS4gKi8gY2xhc3MgY3Uge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGEgUGFyc2VDb250ZXh0IHdpdGggdGhlIGdpdmVuIHNvdXJjZSBhbmQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncyBmb3IgdGhlIHBhcnNlci5cbiAgICAgKiBAcGFyYW0gZGF0YWJhc2VJZCAtIFRoZSBkYXRhYmFzZSBJRCBvZiB0aGUgRmlyZXN0b3JlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVyIC0gVGhlIHNlcmlhbGl6ZXIgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBWYWx1ZSBwcm90by5cbiAgICAgKiBAcGFyYW0gaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyAtIFdoZXRoZXIgdG8gaWdub3JlIHVuZGVmaW5lZCBwcm9wZXJ0aWVzXG4gICAgICogcmF0aGVyIHRoYW4gdGhyb3cuXG4gICAgICogQHBhcmFtIGZpZWxkVHJhbnNmb3JtcyAtIEEgbXV0YWJsZSBsaXN0IG9mIGZpZWxkIHRyYW5zZm9ybXMgZW5jb3VudGVyZWRcbiAgICAgKiB3aGlsZSBwYXJzaW5nIHRoZSBkYXRhLlxuICAgICAqIEBwYXJhbSBmaWVsZE1hc2sgLSBBIG11dGFibGUgbGlzdCBvZiBmaWVsZCBwYXRocyBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nXG4gICAgICogdGhlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdywgc28gcGF0aCBjYW4gYmVcbiAgICAgKiBudWxsIHRvIGluZGljYXRlIHRoZSBjb250ZXh0IHJlcHJlc2VudHMgYW55IGxvY2F0aW9uIHdpdGhpbiBhbiBhcnJheSAoaW5cbiAgICAgKiB3aGljaCBjYXNlIGNlcnRhaW4gZmVhdHVyZXMgd2lsbCBub3Qgd29yayBhbmQgZXJyb3JzIHdpbGwgYmUgc29tZXdoYXRcbiAgICAgKiBjb21wcm9taXNlZCkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5kYXRhYmFzZUlkID0gZSwgdGhpcy5rID0gbiwgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID0gcywgXG4gICAgICAgIC8vIE1pbm9yIGhhY2s6IElmIGZpZWxkVHJhbnNmb3JtcyBpcyB1bmRlZmluZWQsIHdlIGFzc3VtZSB0aGlzIGlzIGFuXG4gICAgICAgIC8vIGV4dGVybmFsIGNhbGwgYW5kIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhlIGVudGlyZSBwYXRoLlxuICAgICAgICB2b2lkIDAgPT09IGkgJiYgdGhpcy5rYSgpLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IGkgfHwgW10sIHRoaXMuZmllbGRNYXNrID0gciB8fCBbXTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnBhdGg7XG4gICAgfVxuICAgIGdldCB4YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MueGE7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIHNldHRpbmdzIG92ZXJ3cml0dGVuLiAqLyAgICAkYSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnNldHRpbmdzKSwgdCksIHRoaXMuZGF0YWJhc2VJZCwgdGhpcy5rLCB0aGlzLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMsIHRoaXMuZmllbGRUcmFuc2Zvcm1zLCB0aGlzLmZpZWxkTWFzayk7XG4gICAgfVxuICAgIEZhKHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuJGEoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIE9hOiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMuTWEodCksIHM7XG4gICAgfVxuICAgIExhKHQpIHtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGNvbnN0IG4gPSBudWxsID09PSAoZSA9IHRoaXMucGF0aCkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5jaGlsZCh0KSwgcyA9IHRoaXMuJGEoe1xuICAgICAgICAgICAgcGF0aDogbixcbiAgICAgICAgICAgIE9hOiAhMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHMua2EoKSwgcztcbiAgICB9XG4gICAgQmEodCkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBXZSBkb24ndCBzdXBwb3J0IGFycmF5IHBhdGhzIHJpZ2h0IG5vdzsgc28gbWFrZSBwYXRoXG4gICAgICAgIC8vIHVuZGVmaW5lZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuJGEoe1xuICAgICAgICAgICAgcGF0aDogdm9pZCAwLFxuICAgICAgICAgICAgT2E6ICEwXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBVYSh0KSB7XG4gICAgICAgIHJldHVybiBWdSh0LCB0aGlzLnNldHRpbmdzLm1ldGhvZE5hbWUsIHRoaXMuc2V0dGluZ3MucWEgfHwgITEsIHRoaXMucGF0aCwgdGhpcy5zZXR0aW5ncy5LYSk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zICd0cnVlJyBpZiAnZmllbGRQYXRoJyB3YXMgdHJhdmVyc2VkIHdoZW4gY3JlYXRpbmcgdGhpcyBjb250ZXh0LiAqLyAgICBjb250YWlucyh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuZmllbGRNYXNrLmZpbmQoKGUgPT4gdC5pc1ByZWZpeE9mKGUpKSkgfHwgdm9pZCAwICE9PSB0aGlzLmZpZWxkVHJhbnNmb3Jtcy5maW5kKChlID0+IHQuaXNQcmVmaXhPZihlLmZpZWxkKSkpO1xuICAgIH1cbiAgICBrYSgpIHtcbiAgICAgICAgLy8gVE9ETyhiLzM0ODcxMTMxKTogUmVtb3ZlIG51bGwgY2hlY2sgb25jZSB3ZSBoYXZlIHByb3BlciBwYXRocyBmb3IgZmllbGRzXG4gICAgICAgIC8vIHdpdGhpbiBhcnJheXMuXG4gICAgICAgIGlmICh0aGlzLnBhdGgpIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5wYXRoLmxlbmd0aDsgdCsrKSB0aGlzLk1hKHRoaXMucGF0aC5nZXQodCkpO1xuICAgIH1cbiAgICBNYSh0KSB7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgdGhyb3cgdGhpcy5VYShcIkRvY3VtZW50IGZpZWxkcyBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICAgICAgaWYgKGF1KHRoaXMueGEpICYmIGl1LnRlc3QodCkpIHRocm93IHRoaXMuVWEoJ0RvY3VtZW50IGZpZWxkcyBjYW5ub3QgYmVnaW4gYW5kIGVuZCB3aXRoIFwiX19cIicpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIHBhcnNpbmcgcmF3IHVzZXIgaW5wdXQgKHByb3ZpZGVkIHZpYSB0aGUgQVBJKSBpbnRvIGludGVybmFsIG1vZGVsXG4gKiBjbGFzc2VzLlxuICovIGNsYXNzIHV1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9IGUsIHRoaXMuayA9IG4gfHwgdG8odCk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IHRvcC1sZXZlbCBwYXJzZSBjb250ZXh0LiAqLyAgICBqYSh0LCBlLCBuLCBzID0gITEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjdSh7XG4gICAgICAgICAgICB4YTogdCxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGUsXG4gICAgICAgICAgICBLYTogbixcbiAgICAgICAgICAgIHBhdGg6IF90LmVtcHR5UGF0aCgpLFxuICAgICAgICAgICAgT2E6ICExLFxuICAgICAgICAgICAgcWE6IHNcbiAgICAgICAgfSwgdGhpcy5kYXRhYmFzZUlkLCB0aGlzLmssIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBodSh0KSB7XG4gICAgY29uc3QgZSA9IHQuX2ZyZWV6ZVNldHRpbmdzKCksIG4gPSB0byh0Ll9kYXRhYmFzZUlkKTtcbiAgICByZXR1cm4gbmV3IHV1KHQuX2RhdGFiYXNlSWQsICEhZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBuKTtcbn1cblxuLyoqIFBhcnNlIGRvY3VtZW50IGRhdGEgZnJvbSBhIHNldCgpIGNhbGwuICovIGZ1bmN0aW9uIGx1KHQsIGUsIG4sIHMsIGksIHIgPSB7fSkge1xuICAgIGNvbnN0IG8gPSB0LmphKHIubWVyZ2UgfHwgci5tZXJnZUZpZWxkcyA/IDIgLyogTWVyZ2VTZXQgKi8gOiAwIC8qIFNldCAqLyAsIGUsIG4sIGkpO1xuICAgIFJ1KFwiRGF0YSBtdXN0IGJlIGFuIG9iamVjdCwgYnV0IGl0IHdhczpcIiwgbywgcyk7XG4gICAgY29uc3QgYSA9IEl1KHMsIG8pO1xuICAgIGxldCBjLCB1O1xuICAgIGlmIChyLm1lcmdlKSBjID0gbmV3IG10KG8uZmllbGRNYXNrKSwgdSA9IG8uZmllbGRUcmFuc2Zvcm1zOyBlbHNlIGlmIChyLm1lcmdlRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHIubWVyZ2VGaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBQdShlLCBzLCBuKTtcbiAgICAgICAgICAgIGlmICghby5jb250YWlucyhpKSkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgRmllbGQgJyR7aX0nIGlzIHNwZWNpZmllZCBpbiB5b3VyIGZpZWxkIG1hc2sgYnV0IG1pc3NpbmcgZnJvbSB5b3VyIGlucHV0IGRhdGEuYCk7XG4gICAgICAgICAgICBTdSh0LCBpKSB8fCB0LnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgYyA9IG5ldyBtdCh0KSwgdSA9IG8uZmllbGRUcmFuc2Zvcm1zLmZpbHRlcigodCA9PiBjLmNvdmVycyh0LmZpZWxkKSkpO1xuICAgIH0gZWxzZSBjID0gbnVsbCwgdSA9IG8uZmllbGRUcmFuc2Zvcm1zO1xuICAgIHJldHVybiBuZXcgcnUobmV3IGp0KGEpLCBjLCB1KTtcbn1cblxuY2xhc3MgZnUgZXh0ZW5kcyBudSB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBpZiAoMiAvKiBNZXJnZVNldCAqLyAhPT0gdC54YSkgdGhyb3cgMSAvKiBVcGRhdGUgKi8gPT09IHQueGEgPyB0LlVhKGAke3RoaXMuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciB1cGRhdGUgZGF0YWApIDogdC5VYShgJHt0aGlzLl9tZXRob2ROYW1lfSgpIGNhbm5vdCBiZSB1c2VkIHdpdGggc2V0KCkgdW5sZXNzIHlvdSBwYXNzIHttZXJnZTp0cnVlfWApO1xuICAgICAgICAvLyBObyB0cmFuc2Zvcm0gdG8gYWRkIGZvciBhIGRlbGV0ZSwgYnV0IHdlIG5lZWQgdG8gYWRkIGl0IHRvIG91clxuICAgICAgICAvLyBmaWVsZE1hc2sgc28gaXQgZ2V0cyBkZWxldGVkLlxuICAgICAgICByZXR1cm4gdC5maWVsZE1hc2sucHVzaCh0LnBhdGgpLCBudWxsO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBmdTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHQgZm9yIHBhcnNpbmcgU2VyaWFsaXphYmxlRmllbGRWYWx1ZXMuXG4gKlxuICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBjYWxsaW5nIGBQYXJzZUNvbnRleHQuY29udGV4dFdpdGhgIGJlY2F1c2UgaXQga2VlcHNcbiAqIHRoZSBmaWVsZFRyYW5zZm9ybXMgYW5kIGZpZWxkTWFzayBzZXBhcmF0ZS5cbiAqXG4gKiBUaGUgY3JlYXRlZCBjb250ZXh0IGhhcyBpdHMgYGRhdGFTb3VyY2VgIHNldCB0byBgVXNlckRhdGFTb3VyY2UuQXJndW1lbnRgLlxuICogQWx0aG91Z2ggdGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggd3JpdGVzLCBhbnkgZWxlbWVudHMgaW4gdGhlc2UgRmllbGRWYWx1ZXNcbiAqIGFyZSBub3QgY29uc2lkZXJlZCB3cml0ZXMgc2luY2UgdGhleSBjYW5ub3QgY29udGFpbiBhbnkgRmllbGRWYWx1ZSBzZW50aW5lbHMsXG4gKiBldGMuXG4gKlxuICogQHBhcmFtIGZpZWxkVmFsdWUgLSBUaGUgc2VudGluZWwgRmllbGRWYWx1ZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgY2hpbGRcbiAqICAgICBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcGFyZW50IGNvbnRleHQuXG4gKiBAcGFyYW0gYXJyYXlFbGVtZW50IC0gV2hldGhlciBvciBub3QgdGhlIEZpZWxkVmFsdWUgaGFzIGFuIGFycmF5LlxuICovIGZ1bmN0aW9uIGR1KHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IGN1KHtcbiAgICAgICAgeGE6IDMgLyogQXJndW1lbnQgKi8gLFxuICAgICAgICBLYTogZS5zZXR0aW5ncy5LYSxcbiAgICAgICAgbWV0aG9kTmFtZTogdC5fbWV0aG9kTmFtZSxcbiAgICAgICAgT2E6IG5cbiAgICB9LCBlLmRhdGFiYXNlSWQsIGUuaywgZS5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzKTtcbn1cblxuY2xhc3Mgd3UgZXh0ZW5kcyBudSB7XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICByZXR1cm4gbmV3IEdlKHQucGF0aCwgbmV3IExlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2Ygd3U7XG4gICAgfVxufVxuXG5jbGFzcyBfdSBleHRlbmRzIG51IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLlFhID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gZHUodGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5RYS5tYXAoKHQgPT4gRXUodCwgZSkpKSwgcyA9IG5ldyBCZShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBHZSh0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBtdSBleHRlbmRzIG51IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLlFhID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gZHUodGhpcywgdCwgXG4gICAgICAgIC8qYXJyYXk9Ki8gITApLCBuID0gdGhpcy5RYS5tYXAoKHQgPT4gRXUodCwgZSkpKSwgcyA9IG5ldyBxZShuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBHZSh0LnBhdGgsIHMpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgLy8gVE9ETyhtcnNjaG1pZHQpOiBJbXBsZW1lbnQgaXNFcXVhbHNcbiAgICAgICAgcmV0dXJuIHRoaXMgPT09IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBndSBleHRlbmRzIG51IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQpLCB0aGlzLldhID0gZTtcbiAgICB9XG4gICAgX3RvRmllbGRUcmFuc2Zvcm0odCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IGplKHQuaywgeGUodC5rLCB0aGlzLldhKSk7XG4gICAgICAgIHJldHVybiBuZXcgR2UodC5wYXRoLCBlKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogSW1wbGVtZW50IGlzRXF1YWxzXG4gICAgICAgIHJldHVybiB0aGlzID09PSB0O1xuICAgIH1cbn1cblxuLyoqIFBhcnNlIHVwZGF0ZSBkYXRhIGZyb20gYW4gdXBkYXRlKCkgY2FsbC4gKi8gZnVuY3Rpb24geXUodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSB0LmphKDEgLyogVXBkYXRlICovICwgZSwgbik7XG4gICAgUnUoXCJEYXRhIG11c3QgYmUgYW4gb2JqZWN0LCBidXQgaXQgd2FzOlwiLCBpLCBzKTtcbiAgICBjb25zdCByID0gW10sIG8gPSBqdC5lbXB0eSgpO1xuICAgIGh0KHMsICgodCwgcykgPT4ge1xuICAgICAgICBjb25zdCBhID0gdnUoZSwgdCwgbik7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBzID0gZ2V0TW9kdWxhckluc3RhbmNlKHMpO1xuICAgICAgICBjb25zdCBjID0gaS5MYShhKTtcbiAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBmdSkgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICByLnB1c2goYSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IEV1KHMsIGMpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmIChyLnB1c2goYSksIG8uc2V0KGEsIHQpKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBhID0gbmV3IG10KHIpO1xuICAgIHJldHVybiBuZXcgb3UobywgYSwgaS5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKiogUGFyc2UgdXBkYXRlIGRhdGEgZnJvbSBhIGxpc3Qgb2YgZmllbGQvdmFsdWUgYXJndW1lbnRzLiAqLyBmdW5jdGlvbiBwdSh0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgY29uc3QgbyA9IHQuamEoMSAvKiBVcGRhdGUgKi8gLCBlLCBuKSwgYSA9IFsgUHUoZSwgcywgbikgXSwgYyA9IFsgaSBdO1xuICAgIGlmIChyLmxlbmd0aCAlIDIgIT0gMCkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHtlfSgpIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IGFsdGVybmF0ZSBiZXR3ZWVuIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMuYCk7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCByLmxlbmd0aDsgdCArPSAyKSBhLnB1c2goUHUoZSwgclt0XSkpLCBjLnB1c2goclt0ICsgMV0pO1xuICAgIGNvbnN0IHUgPSBbXSwgaCA9IGp0LmVtcHR5KCk7XG4gICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIG9yZGVyIHRvIHBpY2sgdGhlIGxhc3QgdmFsdWUgZm9yIGEgZmllbGQgaWYgdGhlXG4gICAgLy8gdXNlciBzcGVjaWZpZWQgdGhlIGZpZWxkIG11bHRpcGxlIHRpbWVzLlxuICAgIGZvciAobGV0IHQgPSBhLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSBpZiAoIVN1KHUsIGFbdF0pKSB7XG4gICAgICAgIGNvbnN0IGUgPSBhW3RdO1xuICAgICAgICBsZXQgbiA9IGNbdF07XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBuID0gZ2V0TW9kdWxhckluc3RhbmNlKG4pO1xuICAgICAgICBjb25zdCBzID0gby5MYShlKTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBmdSkgXG4gICAgICAgIC8vIEFkZCBpdCB0byB0aGUgZmllbGQgbWFzaywgYnV0IGRvbid0IGFkZCBhbnl0aGluZyB0byB1cGRhdGVEYXRhLlxuICAgICAgICB1LnB1c2goZSk7IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IEV1KG4sIHMpO1xuICAgICAgICAgICAgbnVsbCAhPSB0ICYmICh1LnB1c2goZSksIGguc2V0KGUsIHQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsID0gbmV3IG10KHUpO1xuICAgIHJldHVybiBuZXcgb3UoaCwgbCwgby5maWVsZFRyYW5zZm9ybXMpO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgXCJxdWVyeSB2YWx1ZVwiIChlLmcuIHZhbHVlIGluIGEgd2hlcmUgZmlsdGVyIG9yIGEgdmFsdWUgaW4gYSBjdXJzb3JcbiAqIGJvdW5kKS5cbiAqXG4gKiBAcGFyYW0gYWxsb3dBcnJheXMgLSBXaGV0aGVyIHRoZSBxdWVyeSB2YWx1ZSBpcyBhbiBhcnJheSB0aGF0IG1heSBkaXJlY3RseVxuICogY29udGFpbiBhZGRpdGlvbmFsIGFycmF5cyAoZS5nLiB0aGUgb3BlcmFuZCBvZiBhbiBgaW5gIHF1ZXJ5KS5cbiAqLyBmdW5jdGlvbiBUdSh0LCBlLCBuLCBzID0gITEpIHtcbiAgICByZXR1cm4gRXUobiwgdC5qYShzID8gNCAvKiBBcnJheUFyZ3VtZW50ICovIDogMyAvKiBBcmd1bWVudCAqLyAsIGUpKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdXNlciBkYXRhIHRvIFByb3RvYnVmIFZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgLSBEYXRhIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSBjb250ZXh0IC0gQSBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcGF0aCBiZWluZyBwYXJzZWQsXG4gKiB0aGUgc291cmNlIG9mIHRoZSBkYXRhIGJlaW5nIHBhcnNlZCwgZXRjLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgdmFsdWUgd2FzIGEgRmllbGRWYWx1ZSBzZW50aW5lbFxuICogdGhhdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgcGFyc2VkIGRhdGEuXG4gKi8gZnVuY3Rpb24gRXUodCwgZSkge1xuICAgIGlmIChBdShcbiAgICAvLyBVbndyYXAgdGhlIEFQSSB0eXBlIGZyb20gdGhlIENvbXBhdCBTREsuIFRoaXMgd2lsbCByZXR1cm4gdGhlIEFQSSB0eXBlXG4gICAgLy8gZnJvbSBmaXJlc3RvcmUtZXhwLlxuICAgIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4gUnUoXCJVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTpcIiwgZSwgdCksIEl1KHQsIGUpO1xuICAgIGlmICh0IGluc3RhbmNlb2YgbnUpIFxuICAgIC8vIEZpZWxkVmFsdWVzIHVzdWFsbHkgcGFyc2UgaW50byB0cmFuc2Zvcm1zIChleGNlcHQgRmllbGRWYWx1ZS5kZWxldGUoKSlcbiAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgdGhpcyBmaWVsZCBpbiBvdXIgcGFyc2VkIGRhdGFcbiAgICAvLyAoYXMgZG9pbmcgc28gd2lsbCBvdmVyd3JpdGUgdGhlIGZpZWxkIGRpcmVjdGx5IHByaW9yIHRvIHRoZSB0cmFuc2Zvcm1cbiAgICAvLyB0cnlpbmcgdG8gdHJhbnNmb3JtIGl0KS4gU28gd2UgZG9uJ3QgYWRkIHRoaXMgbG9jYXRpb24gdG9cbiAgICAvLyBjb250ZXh0LmZpZWxkTWFzayBhbmQgd2UgcmV0dXJuIG51bGwgYXMgb3VyIHBhcnNpbmcgcmVzdWx0LlxuICAgIC8qKlxuICogXCJQYXJzZXNcIiB0aGUgcHJvdmlkZWQgRmllbGRWYWx1ZUltcGwsIGFkZGluZyBhbnkgbmVjZXNzYXJ5IHRyYW5zZm9ybXMgdG9cbiAqIGNvbnRleHQuZmllbGRUcmFuc2Zvcm1zLlxuICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gU2VudGluZWxzIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIHdyaXRlcywgYW5kIG5vdCB3aXRoaW4gYXJyYXlzLlxuICAgICAgICBpZiAoIWF1KGUueGEpKSB0aHJvdyBlLlVhKGAke3QuX21ldGhvZE5hbWV9KCkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHVwZGF0ZSgpIGFuZCBzZXQoKWApO1xuICAgICAgICBpZiAoIWUucGF0aCkgdGhyb3cgZS5VYShgJHt0Ll9tZXRob2ROYW1lfSgpIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluc2lkZSBhcnJheXNgKTtcbiAgICAgICAgY29uc3QgbiA9IHQuX3RvRmllbGRUcmFuc2Zvcm0oZSk7XG4gICAgICAgIG4gJiYgZS5maWVsZFRyYW5zZm9ybXMucHVzaChuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgYSBzY2FsYXIgdmFsdWUgKGkuZS4gbm90IGFuIE9iamVjdCwgQXJyYXksIG9yIEZpZWxkVmFsdWUpXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCB2YWx1ZVxuICovICh0LCBlKSwgbnVsbDtcbiAgICBpZiAodm9pZCAwID09PSB0ICYmIGUuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcykgXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZCBpdCBjYW4gbmV2ZXIgcGFydGljaXBhdGUgaW4gdGhlIGZpZWxkTWFzaywgc29cbiAgICAvLyBkb24ndCBoYW5kbGUgdGhpcyBiZWxvdy4gSWYgYGlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXNgIGlzIGZhbHNlLFxuICAgIC8vIGBwYXJzZVNjYWxhclZhbHVlYCB3aWxsIHJlamVjdCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKFxuICAgIC8vIElmIGNvbnRleHQucGF0aCBpcyBudWxsIHdlIGFyZSBpbnNpZGUgYW4gYXJyYXkgYW5kIHdlIGRvbid0IHN1cHBvcnRcbiAgICAvLyBmaWVsZCBtYXNrIHBhdGhzIG1vcmUgZ3JhbnVsYXIgdGhhbiB0aGUgdG9wLWxldmVsIGFycmF5LlxuICAgIGUucGF0aCAmJiBlLmZpZWxkTWFzay5wdXNoKGUucGF0aCksIHQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAvLyBUT0RPKGIvMzQ4NzExMzEpOiBJbmNsdWRlIHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIGFycmF5IGluIHRoZSBlcnJvclxuICAgICAgICAvLyBtZXNzYWdlLlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBJTiBxdWVyaWVzLCB0aGUgcGFyc2VkIGRhdGEgaXMgYW4gYXJyYXkgKHJlcHJlc2VudGluZ1xuICAgICAgICAvLyB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIElOIHF1ZXJ5KSB0aGF0IG1heSBkaXJlY3RseVxuICAgICAgICAvLyBjb250YWluIGFkZGl0aW9uYWwgYXJyYXlzIChlYWNoIHJlcHJlc2VudGluZyBhbiBpbmRpdmlkdWFsIGZpZWxkXG4gICAgICAgIC8vIHZhbHVlKSwgc28gd2UgZGlzYWJsZSB0aGlzIHZhbGlkYXRpb24uXG4gICAgICAgIGlmIChlLnNldHRpbmdzLk9hICYmIDQgLyogQXJyYXlBcmd1bWVudCAqLyAhPT0gZS54YSkgdGhyb3cgZS5VYShcIk5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gRXUoaSwgZS5CYShzKSk7XG4gICAgICAgICAgICAgICAgbnVsbCA9PSB0ICYmIChcbiAgICAgICAgICAgICAgICAvLyBKdXN0IGluY2x1ZGUgbnVsbHMgaW4gdGhlIGFycmF5IGZvciBmaWVsZHMgYmVpbmcgcmVwbGFjZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgLy8gc2VudGluZWwuXG4gICAgICAgICAgICAgICAgdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICAgICAgICAgIH0pLCBuLnB1c2godCksIHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHQsIGUpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBpZiAobnVsbCA9PT0gKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpKSByZXR1cm4ge1xuICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHhlKGUuaywgdCk7XG4gICAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvb2xlYW5WYWx1ZTogdFxuICAgICAgICB9O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiB0XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGF0LmZyb21EYXRlKHQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogam4oZS5rLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGF0KSB7XG4gICAgICAgICAgICAvLyBGaXJlc3RvcmUgYmFja2VuZCB0cnVuY2F0ZXMgcHJlY2lzaW9uIGRvd24gdG8gbWljcm9zZWNvbmRzLiBUbyBlbnN1cmVcbiAgICAgICAgICAgIC8vIG9mZmxpbmUgbW9kZSB3b3JrcyB0aGUgc2FtZSB3aXRoIHJlZ2FyZHMgdG8gdHJ1bmNhdGlvbiwgcGVyZm9ybSB0aGVcbiAgICAgICAgICAgIC8vIHRydW5jYXRpb24gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgYmFja2VuZCB0byBkbyB0aGF0LlxuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBhdCh0LnNlY29uZHMsIDFlMyAqIE1hdGguZmxvb3IodC5uYW5vc2Vjb25kcyAvIDFlMykpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZTogam4oZS5rLCBuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHN1KSByZXR1cm4ge1xuICAgICAgICAgICAgZ2VvUG9pbnRWYWx1ZToge1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiB0LmxhdGl0dWRlLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogdC5sb25naXR1ZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBldSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ5dGVzVmFsdWU6IFFuKGUuaywgdC5fYnl0ZVN0cmluZylcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQYykge1xuICAgICAgICAgICAgY29uc3QgbiA9IGUuZGF0YWJhc2VJZCwgcyA9IHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkO1xuICAgICAgICAgICAgaWYgKCFzLmlzRXF1YWwobikpIHRocm93IGUuVWEoYERvY3VtZW50IHJlZmVyZW5jZSBpcyBmb3IgZGF0YWJhc2UgJHtzLnByb2plY3RJZH0vJHtzLmRhdGFiYXNlfSBidXQgc2hvdWxkIGJlIGZvciBkYXRhYmFzZSAke24ucHJvamVjdElkfS8ke24uZGF0YWJhc2V9YCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZVZhbHVlOiB6bih0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCB8fCBlLmRhdGFiYXNlSWQsIHQuX2tleS5wYXRoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlLlVhKGBVbnN1cHBvcnRlZCBmaWVsZCB2YWx1ZTogJHtwYyh0KX1gKTtcbiAgICB9XG4gICAgLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgbG9va3MgbGlrZSBhIEpTT04gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICogaW50byBhIHN0cnVjdC4gTm9ybWFsIGNsYXNzL3Byb3RvdHlwZSBpbnN0YW5jZXMgYXJlIGNvbnNpZGVyZWQgdG8gbG9vayBsaWtlXG4gKiBKU09OIG9iamVjdHMgc2luY2UgdGhleSBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgc3RydWN0IHZhbHVlLiBBcnJheXMsIERhdGVzLFxuICogR2VvUG9pbnRzLCBldGMuIGFyZSBub3QgY29uc2lkZXJlZCB0byBsb29rIGxpa2UgSlNPTiBvYmplY3RzIHNpbmNlIHRoZXkgbWFwXG4gKiB0byBzcGVjaWZpYyBGaWVsZFZhbHVlIHR5cGVzIG90aGVyIHRoYW4gT2JqZWN0VmFsdWUuXG4gKi8gKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBJdSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IHt9O1xuICAgIHJldHVybiBsdCh0KSA/IFxuICAgIC8vIElmIHdlIGVuY291bnRlciBhbiBlbXB0eSBvYmplY3QsIHdlIGV4cGxpY2l0bHkgYWRkIGl0IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBtYXNrIHRvIGVuc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgY3JlYXRlcyBhIG1hcCBlbnRyeS5cbiAgICBlLnBhdGggJiYgZS5wYXRoLmxlbmd0aCA+IDAgJiYgZS5maWVsZE1hc2sucHVzaChlLnBhdGgpIDogaHQodCwgKCh0LCBzKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBFdShzLCBlLkZhKHQpKTtcbiAgICAgICAgbnVsbCAhPSBpICYmIChuW3RdID0gaSk7XG4gICAgfSkpLCB7XG4gICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICBmaWVsZHM6IG5cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIEF1KHQpIHtcbiAgICByZXR1cm4gIShcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgdCBpbnN0YW5jZW9mIEFycmF5IHx8IHQgaW5zdGFuY2VvZiBEYXRlIHx8IHQgaW5zdGFuY2VvZiBhdCB8fCB0IGluc3RhbmNlb2Ygc3UgfHwgdCBpbnN0YW5jZW9mIGV1IHx8IHQgaW5zdGFuY2VvZiBQYyB8fCB0IGluc3RhbmNlb2YgbnUpO1xufVxuXG5mdW5jdGlvbiBSdSh0LCBlLCBuKSB7XG4gICAgaWYgKCFBdShuKSB8fCAhZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiBudWxsICE9PSB0ICYmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgbnVsbCA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKTtcbiAgICB9KG4pKSB7XG4gICAgICAgIGNvbnN0IHMgPSBwYyhuKTtcbiAgICAgICAgdGhyb3cgXCJhbiBvYmplY3RcIiA9PT0gcyA/IGUuVWEodCArIFwiIGEgY3VzdG9tIG9iamVjdFwiKSA6IGUuVWEodCArIFwiIFwiICsgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0aGF0IGNhbGxzIGZyb21Eb3RTZXBhcmF0ZWRTdHJpbmcoKSBidXQgd3JhcHMgYW55IGVycm9yIHRocm93bi5cbiAqLyBmdW5jdGlvbiBQdSh0LCBlLCBuKSB7XG4gICAgaWYgKChcbiAgICAvLyBJZiByZXF1aXJlZCwgcmVwbGFjZSB0aGUgRmllbGRQYXRoIENvbXBhdCBjbGFzcyB3aXRoIHdpdGggdGhlIGZpcmVzdG9yZS1leHBcbiAgICAvLyBGaWVsZFBhdGguXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgaW5zdGFuY2VvZiBaYykgcmV0dXJuIGUuX2ludGVybmFsUGF0aDtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSkgcmV0dXJuIHZ1KHQsIGUpO1xuICAgIHRocm93IFZ1KFwiRmllbGQgcGF0aCBhcmd1bWVudHMgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBGaWVsZFBhdGguXCIsIHQsIFxuICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgIC8qIHBhdGg9ICovIHZvaWQgMCwgbik7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBhbnkgY2hhcmFjdGVycyBpbiBhIGZpZWxkIHBhdGggc3RyaW5nIHRoYXQgYXJlIHJlc2VydmVkLlxuICovIGNvbnN0IGJ1ID0gbmV3IFJlZ0V4cChcIlt+XFxcXCovXFxcXFtcXFxcXV1cIik7XG5cbi8qKlxuICogV3JhcHMgZnJvbURvdFNlcGFyYXRlZFN0cmluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIG1ldGhvZCB0aGF0XG4gKiB3YXMgdGhyb3duLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgcHVibGljbHkgdmlzaWJsZSBtZXRob2QgbmFtZVxuICogQHBhcmFtIHBhdGggLSBUaGUgZG90LXNlcGFyYXRlZCBzdHJpbmcgZm9ybSBvZiBhIGZpZWxkIHBhdGggd2hpY2ggd2lsbCBiZVxuICogc3BsaXQgb24gZG90cy5cbiAqIEBwYXJhbSB0YXJnZXREb2MgLSBUaGUgZG9jdW1lbnQgYWdhaW5zdCB3aGljaCB0aGUgZmllbGQgcGF0aCB3aWxsIGJlXG4gKiBldmFsdWF0ZWQuXG4gKi8gZnVuY3Rpb24gdnUodCwgZSwgbikge1xuICAgIGlmIChlLnNlYXJjaChidSkgPj0gMCkgdGhyb3cgVnUoYEludmFsaWQgZmllbGQgcGF0aCAoJHtlfSkuIFBhdGhzIG11c3Qgbm90IGNvbnRhaW4gJ34nLCAnKicsICcvJywgJ1snLCBvciAnXSdgLCB0LCBcbiAgICAvKiBoYXNDb252ZXJ0ZXI9ICovICExLCBcbiAgICAvKiBwYXRoPSAqLyB2b2lkIDAsIG4pO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgWmMoLi4uZS5zcGxpdChcIi5cIikpLl9pbnRlcm5hbFBhdGg7XG4gICAgfSBjYXRjaCAocykge1xuICAgICAgICB0aHJvdyBWdShgSW52YWxpZCBmaWVsZCBwYXRoICgke2V9KS4gUGF0aHMgbXVzdCBub3QgYmUgZW1wdHksIGJlZ2luIHdpdGggJy4nLCBlbmQgd2l0aCAnLicsIG9yIGNvbnRhaW4gJy4uJ2AsIHQsIFxuICAgICAgICAvKiBoYXNDb252ZXJ0ZXI9ICovICExLCBcbiAgICAgICAgLyogcGF0aD0gKi8gdm9pZCAwLCBuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFZ1KHQsIGUsIG4sIHMsIGkpIHtcbiAgICBjb25zdCByID0gcyAmJiAhcy5pc0VtcHR5KCksIG8gPSB2b2lkIDAgIT09IGk7XG4gICAgbGV0IGEgPSBgRnVuY3Rpb24gJHtlfSgpIGNhbGxlZCB3aXRoIGludmFsaWQgZGF0YWA7XG4gICAgbiAmJiAoYSArPSBcIiAodmlhIGB0b0ZpcmVzdG9yZSgpYClcIiksIGEgKz0gXCIuIFwiO1xuICAgIGxldCBjID0gXCJcIjtcbiAgICByZXR1cm4gKHIgfHwgbykgJiYgKGMgKz0gXCIgKGZvdW5kXCIsIHIgJiYgKGMgKz0gYCBpbiBmaWVsZCAke3N9YCksIG8gJiYgKGMgKz0gYCBpbiBkb2N1bWVudCAke2l9YCksIFxuICAgIGMgKz0gXCIpXCIpLCBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGEgKyB0ICsgYyk7XG59XG5cbi8qKiBDaGVja3MgYGhheXN0YWNrYCBpZiBGaWVsZFBhdGggYG5lZWRsZWAgaXMgcHJlc2VudC4gUnVucyBpbiBPKG4pLiAqLyBmdW5jdGlvbiBTdSh0LCBlKSB7XG4gICAgcmV0dXJuIHQuc29tZSgodCA9PiB0LmlzRXF1YWwoZSkpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbnMgZGF0YSByZWFkIGZyb20gYSBkb2N1bWVudCBpbiB5b3VyIEZpcmVzdG9yZVxuICogZGF0YWJhc2UuIFRoZSBkYXRhIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBgLmRhdGEoKWAgb3IgYC5nZXQoPGZpZWxkPilgIHRvXG4gKiBnZXQgYSBzcGVjaWZpYyBmaWVsZC5cbiAqXG4gKiBGb3IgYSBgRG9jdW1lbnRTbmFwc2hvdGAgdGhhdCBwb2ludHMgdG8gYSBub24tZXhpc3RpbmcgZG9jdW1lbnQsIGFueSBkYXRhXG4gKiBhY2Nlc3Mgd2lsbCByZXR1cm4gJ3VuZGVmaW5lZCcuIFlvdSBjYW4gdXNlIHRoZSBgZXhpc3RzKClgIG1ldGhvZCB0b1xuICogZXhwbGljaXRseSB2ZXJpZnkgYSBkb2N1bWVudCdzIGV4aXN0ZW5jZS5cbiAqLyBjbGFzcyBEdSB7XG4gICAgLy8gTm90ZTogVGhpcyBjbGFzcyBpcyBzdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgdGhlIERvY3VtZW50U25hcHNob3QgaW5cbiAgICAvLyB0aGUgbGVnYWN5IFNESy4gVGhlIGNoYW5nZXMgYXJlOlxuICAgIC8vIC0gTm8gc3VwcG9ydCBmb3IgU25hcHNob3RNZXRhZGF0YS5cbiAgICAvLyAtIE5vIHN1cHBvcnQgZm9yIFNuYXBzaG90T3B0aW9ucy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX3VzZXJEYXRhV3JpdGVyID0gZSwgdGhpcy5fa2V5ID0gbiwgdGhpcy5fZG9jdW1lbnQgPSBzLCBcbiAgICAgICAgdGhpcy5fY29udmVydGVyID0gaTtcbiAgICB9XG4gICAgLyoqIFByb3BlcnR5IG9mIHRoZSBgRG9jdW1lbnRTbmFwc2hvdGAgdGhhdCBwcm92aWRlcyB0aGUgZG9jdW1lbnQncyBJRC4gKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBEb2N1bWVudFJlZmVyZW5jZWAgZm9yIHRoZSBkb2N1bWVudCBpbmNsdWRlZCBpbiB0aGUgYERvY3VtZW50U25hcHNob3RgLlxuICAgICAqLyAgICBnZXQgcmVmKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBjKHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fY29udmVydGVyLCB0aGlzLl9rZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaWduYWxzIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBhdCB0aGUgc25hcHNob3QncyBsb2NhdGlvbiBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkb2N1bWVudCBleGlzdHMuXG4gICAgICovICAgIGV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuX2RvY3VtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgYXMgYW4gYE9iamVjdGAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWZcbiAgICAgKiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgb3IgYHVuZGVmaW5lZGBcbiAgICAgKiBpZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgKi8gICAgZGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHVzZSB0aGUgY29udmVydGVyIGFuZCBjcmVhdGUgYSBuZXcgRG9jdW1lbnRTbmFwc2hvdFxuICAgICAgICAgICAgICAgIC8vIGlmIGEgY29udmVydGVyIGhhcyBiZWVuIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgQ3UodGhpcy5fZmlyZXN0b3JlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgdGhpcy5fa2V5LCB0aGlzLl9kb2N1bWVudCwgXG4gICAgICAgICAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydGVyLmZyb21GaXJlc3RvcmUodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlckRhdGFXcml0ZXIuY29udmVydFZhbHVlKHRoaXMuX2RvY3VtZW50LmRhdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRQYXRoIC0gVGhlIHBhdGggKGZvciBleGFtcGxlICdmb28nIG9yICdmb28uYmFyJykgdG8gYSBzcGVjaWZpY1xuICAgICAqIGZpZWxkLlxuICAgICAqIEByZXR1cm5zIFRoZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmllbGQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2hcbiAgICAgKiBmaWVsZCBleGlzdHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIC8vIFdlIGFyZSB1c2luZyBgYW55YCBoZXJlIHRvIGF2b2lkIGFuIGV4cGxpY2l0IGNhc3QgYnkgb3VyIHVzZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0KHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5fZG9jdW1lbnQuZGF0YS5maWVsZChOdShcIkRvY3VtZW50U25hcHNob3QuZ2V0XCIsIHQpKTtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSBlKSByZXR1cm4gdGhpcy5fdXNlckRhdGFXcml0ZXIuY29udmVydFZhbHVlKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbnMgZGF0YSByZWFkIGZyb20gYSBkb2N1bWVudCBpbiB5b3VyXG4gKiBGaXJlc3RvcmUgZGF0YWJhc2UgYXMgcGFydCBvZiBhIHF1ZXJ5LiBUaGUgZG9jdW1lbnQgaXMgZ3VhcmFudGVlZCB0byBleGlzdFxuICogYW5kIGl0cyBkYXRhIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBgLmRhdGEoKWAgb3IgYC5nZXQoPGZpZWxkPilgIHRvIGdldCBhXG4gKiBzcGVjaWZpYyBmaWVsZC5cbiAqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIG9mZmVycyB0aGUgc2FtZSBBUEkgc3VyZmFjZSBhcyBhXG4gKiBgRG9jdW1lbnRTbmFwc2hvdGAuIFNpbmNlIHF1ZXJ5IHJlc3VsdHMgY29udGFpbiBvbmx5IGV4aXN0aW5nIGRvY3VtZW50cywgdGhlXG4gKiBgZXhpc3RzYCBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSB0cnVlIGFuZCBgZGF0YSgpYCB3aWxsIG5ldmVyIHJldHVyblxuICogJ3VuZGVmaW5lZCcuXG4gKi8gY2xhc3MgQ3UgZXh0ZW5kcyBEdSB7XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLlxuICAgICAqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHJldHVybnMgQW4gYE9iamVjdGAgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBkYXRhKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZGF0YSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCBjYWxscyBgZnJvbURvdFNlcGFyYXRlZFN0cmluZygpYCBidXQgd3JhcHMgYW55IGVycm9yIHRocm93bi5cbiAqLyBmdW5jdGlvbiBOdSh0LCBlKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgPyB2dSh0LCBlKSA6IGUgaW5zdGFuY2VvZiBaYyA/IGUuX2ludGVybmFsUGF0aCA6IGUuX2RlbGVnYXRlLl9pbnRlcm5hbFBhdGg7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGEgc25hcHNob3QsIGRlc2NyaWJpbmcgdGhlIHN0YXRlIG9mIHRoZSBzbmFwc2hvdC5cbiAqLyBjbGFzcyBrdSB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuaGFzUGVuZGluZ1dyaXRlcyA9IHQsIHRoaXMuZnJvbUNhY2hlID0gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYFNuYXBzaG90TWV0YWRhdGFgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYFNuYXBzaG90TWV0YWRhdGFgIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYFNuYXBzaG90TWV0YWRhdGFgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICovICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQZW5kaW5nV3JpdGVzID09PSB0Lmhhc1BlbmRpbmdXcml0ZXMgJiYgdGhpcy5mcm9tQ2FjaGUgPT09IHQuZnJvbUNhY2hlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWlucyBkYXRhIHJlYWQgZnJvbSBhIGRvY3VtZW50IGluIHlvdXIgRmlyZXN0b3JlXG4gKiBkYXRhYmFzZS4gVGhlIGRhdGEgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGAuZGF0YSgpYCBvciBgLmdldCg8ZmllbGQ+KWAgdG9cbiAqIGdldCBhIHNwZWNpZmljIGZpZWxkLlxuICpcbiAqIEZvciBhIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHBvaW50cyB0byBhIG5vbi1leGlzdGluZyBkb2N1bWVudCwgYW55IGRhdGFcbiAqIGFjY2VzcyB3aWxsIHJldHVybiAndW5kZWZpbmVkJy4gWW91IGNhbiB1c2UgdGhlIGBleGlzdHMoKWAgbWV0aG9kIHRvXG4gKiBleHBsaWNpdGx5IHZlcmlmeSBhIGRvY3VtZW50J3MgZXhpc3RlbmNlLlxuICovIGNsYXNzIHh1IGV4dGVuZHMgRHUge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yIHByb3RlY3RlZCAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgc3VwZXIodCwgZSwgbiwgcywgciksIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX2ZpcmVzdG9yZUltcGwgPSB0LCB0aGlzLm1ldGFkYXRhID0gaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgb2YgdGhlIGBEb2N1bWVudFNuYXBzaG90YCB0aGF0IHNpZ25hbHMgd2hldGhlciBvciBub3QgdGhlIGRhdGFcbiAgICAgKiBleGlzdHMuIFRydWUgaWYgdGhlIGRvY3VtZW50IGV4aXN0cy5cbiAgICAgKi8gICAgZXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZXhpc3RzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZlxuICAgICAqIHRoZSBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgYEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKClgIHZhbHVlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuXG4gICAgICogc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IGRhdGEgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgKiB0aGUgc25hcHNob3QgKGZvciBleGFtcGxlIHRoZSBkZXNpcmVkIGJlaGF2aW9yIGZvciBzZXJ2ZXIgdGltZXN0YW1wcyB0aGF0XG4gICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlKS5cbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IG9yIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovICAgIGRhdGEodCA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGNvbnZlcnRlciBhbmQgY3JlYXRlIGEgbmV3IERvY3VtZW50U25hcHNob3RcbiAgICAgICAgICAgICAgICAvLyBpZiBhIGNvbnZlcnRlciBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3ICR1KHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHRoaXMuX2tleSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMubWV0YWRhdGEsIFxuICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlci5mcm9tRmlyZXN0b3JlKGUsIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJEYXRhV3JpdGVyLmNvbnZlcnRWYWx1ZSh0aGlzLl9kb2N1bWVudC5kYXRhLnZhbHVlLCB0LnNlcnZlclRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBhIGBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpYCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gc2V0IHRvXG4gICAgICogaXRzIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnlcbiAgICAgKiBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkUGF0aCAtIFRoZSBwYXRoIChmb3IgZXhhbXBsZSAnZm9vJyBvciAnZm9vLmJhcicpIHRvIGEgc3BlY2lmaWNcbiAgICAgKiBmaWVsZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbnMgb2JqZWN0IHRvIGNvbmZpZ3VyZSBob3cgdGhlIGZpZWxkIGlzIHJldHJpZXZlZFxuICAgICAqIGZyb20gdGhlIHNuYXBzaG90IChmb3IgZXhhbXBsZSB0aGUgZGVzaXJlZCBiZWhhdmlvciBmb3Igc2VydmVyIHRpbWVzdGFtcHNcbiAgICAgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNldCB0byB0aGVpciBmaW5hbCB2YWx1ZSkuXG4gICAgICogQHJldHVybnMgVGhlIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBmaWVsZCBsb2NhdGlvbiBvciB1bmRlZmluZWQgaWYgbm8gc3VjaFxuICAgICAqIGZpZWxkIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgLy8gV2UgYXJlIHVzaW5nIGBhbnlgIGhlcmUgdG8gYXZvaWQgYW4gZXhwbGljaXQgY2FzdCBieSBvdXIgdXNlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBnZXQodCwgZSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuX2RvY3VtZW50LmRhdGEuZmllbGQoTnUoXCJEb2N1bWVudFNuYXBzaG90LmdldFwiLCB0KSk7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gbikgcmV0dXJuIHRoaXMuX3VzZXJEYXRhV3JpdGVyLmNvbnZlcnRWYWx1ZShuLCBlLnNlcnZlclRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbnMgZGF0YSByZWFkIGZyb20gYSBkb2N1bWVudCBpbiB5b3VyXG4gKiBGaXJlc3RvcmUgZGF0YWJhc2UgYXMgcGFydCBvZiBhIHF1ZXJ5LiBUaGUgZG9jdW1lbnQgaXMgZ3VhcmFudGVlZCB0byBleGlzdFxuICogYW5kIGl0cyBkYXRhIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBgLmRhdGEoKWAgb3IgYC5nZXQoPGZpZWxkPilgIHRvIGdldCBhXG4gKiBzcGVjaWZpYyBmaWVsZC5cbiAqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIG9mZmVycyB0aGUgc2FtZSBBUEkgc3VyZmFjZSBhcyBhXG4gKiBgRG9jdW1lbnRTbmFwc2hvdGAuIFNpbmNlIHF1ZXJ5IHJlc3VsdHMgY29udGFpbiBvbmx5IGV4aXN0aW5nIGRvY3VtZW50cywgdGhlXG4gKiBgZXhpc3RzYCBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSB0cnVlIGFuZCBgZGF0YSgpYCB3aWxsIG5ldmVyIHJldHVyblxuICogJ3VuZGVmaW5lZCcuXG4gKi8gY2xhc3MgJHUgZXh0ZW5kcyB4dSB7XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgYEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKClgIHZhbHVlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuXG4gICAgICogc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IGRhdGEgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgKiB0aGUgc25hcHNob3QgKGZvciBleGFtcGxlIHRoZSBkZXNpcmVkIGJlaGF2aW9yIGZvciBzZXJ2ZXIgdGltZXN0YW1wcyB0aGF0XG4gICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlKS5cbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGRhdGEodCA9IHt9KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kYXRhKHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBRdWVyeVNuYXBzaG90YCBjb250YWlucyB6ZXJvIG9yIG1vcmUgYERvY3VtZW50U25hcHNob3RgIG9iamVjdHNcbiAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cyBvZiBhIHF1ZXJ5LiBUaGUgZG9jdW1lbnRzIGNhbiBiZSBhY2Nlc3NlZCBhcyBhblxuICogYXJyYXkgdmlhIHRoZSBgZG9jc2AgcHJvcGVydHkgb3IgZW51bWVyYXRlZCB1c2luZyB0aGUgYGZvckVhY2hgIG1ldGhvZC4gVGhlXG4gKiBudW1iZXIgb2YgZG9jdW1lbnRzIGNhbiBiZSBkZXRlcm1pbmVkIHZpYSB0aGUgYGVtcHR5YCBhbmQgYHNpemVgXG4gKiBwcm9wZXJ0aWVzLlxuICovIGNsYXNzIEZ1IHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fdXNlckRhdGFXcml0ZXIgPSBlLCB0aGlzLl9zbmFwc2hvdCA9IHMsIHRoaXMubWV0YWRhdGEgPSBuZXcga3Uocy5oYXNQZW5kaW5nV3JpdGVzLCBzLmZyb21DYWNoZSksIFxuICAgICAgICB0aGlzLnF1ZXJ5ID0gbjtcbiAgICB9XG4gICAgLyoqIEFuIGFycmF5IG9mIGFsbCB0aGUgZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBkb2NzKCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmZvckVhY2goKGUgPT4gdC5wdXNoKGUpKSksIHQ7XG4gICAgfVxuICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cyBpbiB0aGUgYFF1ZXJ5U25hcHNob3RgLiAqLyAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90LmRvY3Muc2l6ZTtcbiAgICB9XG4gICAgLyoqIFRydWUgaWYgdGhlcmUgYXJlIG5vIGRvY3VtZW50cyBpbiB0aGUgYFF1ZXJ5U25hcHNob3RgLiAqLyAgICBnZXQgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAwID09PSB0aGlzLnNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVudW1lcmF0ZXMgYWxsIG9mIHRoZSBkb2N1bWVudHMgaW4gdGhlIGBRdWVyeVNuYXBzaG90YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdpdGggYSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBmb3JcbiAgICAgKiBlYWNoIGRvY3VtZW50IGluIHRoZSBzbmFwc2hvdC5cbiAgICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrLlxuICAgICAqLyAgICBmb3JFYWNoKHQsIGUpIHtcbiAgICAgICAgdGhpcy5fc25hcHNob3QuZG9jcy5mb3JFYWNoKChuID0+IHtcbiAgICAgICAgICAgIHQuY2FsbChlLCBuZXcgJHUodGhpcy5fZmlyZXN0b3JlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgbi5rZXksIG4sIG5ldyBrdSh0aGlzLl9zbmFwc2hvdC5tdXRhdGVkS2V5cy5oYXMobi5rZXkpLCB0aGlzLl9zbmFwc2hvdC5mcm9tQ2FjaGUpLCB0aGlzLnF1ZXJ5LmNvbnZlcnRlcikpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRvY3VtZW50cyBjaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IHNuYXBzaG90LiBJZiB0aGlzXG4gICAgICogaXMgdGhlIGZpcnN0IHNuYXBzaG90LCBhbGwgZG9jdW1lbnRzIHdpbGwgYmUgaW4gdGhlIGxpc3QgYXMgJ2FkZGVkJ1xuICAgICAqIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGBTbmFwc2hvdExpc3Rlbk9wdGlvbnNgIHRoYXQgY29udHJvbCB3aGV0aGVyIG1ldGFkYXRhLW9ubHlcbiAgICAgKiBjaGFuZ2VzIChpLmUuIG9ubHkgYERvY3VtZW50U25hcHNob3QubWV0YWRhdGFgIGNoYW5nZWQpIHNob3VsZCB0cmlnZ2VyXG4gICAgICogc25hcHNob3QgZXZlbnRzLlxuICAgICAqLyAgICBkb2NDaGFuZ2VzKHQgPSB7fSkge1xuICAgICAgICBjb25zdCBlID0gISF0LmluY2x1ZGVNZXRhZGF0YUNoYW5nZXM7XG4gICAgICAgIGlmIChlICYmIHRoaXMuX3NuYXBzaG90LmV4Y2x1ZGVzTWV0YWRhdGFDaGFuZ2VzKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiVG8gaW5jbHVkZSBtZXRhZGF0YSBjaGFuZ2VzIHdpdGggeW91ciBkb2N1bWVudCBjaGFuZ2VzLCB5b3UgbXVzdCBhbHNvIHBhc3MgeyBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOnRydWUgfSB0byBvblNuYXBzaG90KCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkQ2hhbmdlcyAmJiB0aGlzLl9jYWNoZWRDaGFuZ2VzSW5jbHVkZU1ldGFkYXRhQ2hhbmdlcyA9PT0gZSB8fCAodGhpcy5fY2FjaGVkQ2hhbmdlcyA9IFxuICAgICAgICAvKiogQ2FsY3VsYXRlcyB0aGUgYXJyYXkgb2YgYERvY3VtZW50Q2hhbmdlYHMgZm9yIGEgZ2l2ZW4gYFZpZXdTbmFwc2hvdGAuICovXG4gICAgICAgIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGlmICh0Ll9zbmFwc2hvdC5vbGREb2NzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5fc25hcHNob3QuZG9jQ2hhbmdlcy5tYXAoKG4gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhZGRlZFwiLFxuICAgICAgICAgICAgICAgICAgICBkb2M6IG5ldyAkdSh0Ll9maXJlc3RvcmUsIHQuX3VzZXJEYXRhV3JpdGVyLCBuLmRvYy5rZXksIG4uZG9jLCBuZXcga3UodC5fc25hcHNob3QubXV0YXRlZEtleXMuaGFzKG4uZG9jLmtleSksIHQuX3NuYXBzaG90LmZyb21DYWNoZSksIHQucXVlcnkuY29udmVydGVyKSxcbiAgICAgICAgICAgICAgICAgICAgb2xkSW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgICAgICBuZXdJbmRleDogZSsrXG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBBIGBEb2N1bWVudFNldGAgdGhhdCBpcyB1cGRhdGVkIGluY3JlbWVudGFsbHkgYXMgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB1c2VcbiAgICAgICAgICAgICAgICAvLyB0byBsb29rdXAgdGhlIGluZGV4IG9mIGEgZG9jdW1lbnQuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSB0Ll9zbmFwc2hvdC5vbGREb2NzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0Ll9zbmFwc2hvdC5kb2NDaGFuZ2VzLmZpbHRlcigodCA9PiBlIHx8IDMgLyogTWV0YWRhdGEgKi8gIT09IHQudHlwZSkpLm1hcCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgJHUodC5fZmlyZXN0b3JlLCB0Ll91c2VyRGF0YVdyaXRlciwgZS5kb2Mua2V5LCBlLmRvYywgbmV3IGt1KHQuX3NuYXBzaG90Lm11dGF0ZWRLZXlzLmhhcyhlLmRvYy5rZXkpLCB0Ll9zbmFwc2hvdC5mcm9tQ2FjaGUpLCB0LnF1ZXJ5LmNvbnZlcnRlcik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gLTEsIHIgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogQWRkZWQgKi8gIT09IGUudHlwZSAmJiAoaSA9IG4uaW5kZXhPZihlLmRvYy5rZXkpLCBuID0gbi5kZWxldGUoZS5kb2Mua2V5KSksIFxuICAgICAgICAgICAgICAgICAgICAxIC8qIFJlbW92ZWQgKi8gIT09IGUudHlwZSAmJiAobiA9IG4uYWRkKGUuZG9jKSwgciA9IG4uaW5kZXhPZihlLmRvYy5rZXkpKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3UoZS50eXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvYzogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZEluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5kZXg6IHJcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0odGhpcywgZSksIHRoaXMuX2NhY2hlZENoYW5nZXNJbmNsdWRlTWV0YWRhdGFDaGFuZ2VzID0gZSksIHRoaXMuX2NhY2hlZENoYW5nZXM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBPdSh0KSB7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICBjYXNlIDAgLyogQWRkZWQgKi8gOlxuICAgICAgICByZXR1cm4gXCJhZGRlZFwiO1xuXG4gICAgICBjYXNlIDIgLyogTW9kaWZpZWQgKi8gOlxuICAgICAgY2FzZSAzIC8qIE1ldGFkYXRhICovIDpcbiAgICAgICAgcmV0dXJuIFwibW9kaWZpZWRcIjtcblxuICAgICAgY2FzZSAxIC8qIFJlbW92ZWQgKi8gOlxuICAgICAgICByZXR1cm4gXCJyZW1vdmVkXCI7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBMKCk7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZWV4cCk6IEFkZCB0ZXN0cyBmb3Igc25hcHNob3RFcXVhbCB3aXRoIGRpZmZlcmVudCBzbmFwc2hvdFxuLy8gbWV0YWRhdGFcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBzbmFwc2hvdHMgYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBsZWZ0IC0gQSBzbmFwc2hvdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHJpZ2h0IC0gQSBzbmFwc2hvdCB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc25hcHNob3RzIGFyZSBlcXVhbC5cbiAqLyBmdW5jdGlvbiBNdSh0LCBlKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiB4dSAmJiBlIGluc3RhbmNlb2YgeHUgPyB0Ll9maXJlc3RvcmUgPT09IGUuX2ZpcmVzdG9yZSAmJiB0Ll9rZXkuaXNFcXVhbChlLl9rZXkpICYmIChudWxsID09PSB0Ll9kb2N1bWVudCA/IG51bGwgPT09IGUuX2RvY3VtZW50IDogdC5fZG9jdW1lbnQuaXNFcXVhbChlLl9kb2N1bWVudCkpICYmIHQuX2NvbnZlcnRlciA9PT0gZS5fY29udmVydGVyIDogdCBpbnN0YW5jZW9mIEZ1ICYmIGUgaW5zdGFuY2VvZiBGdSAmJiAodC5fZmlyZXN0b3JlID09PSBlLl9maXJlc3RvcmUgJiYgTmModC5xdWVyeSwgZS5xdWVyeSkgJiYgdC5tZXRhZGF0YS5pc0VxdWFsKGUubWV0YWRhdGEpICYmIHQuX3NuYXBzaG90LmlzRXF1YWwoZS5fc25hcHNob3QpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gTHUodCkge1xuICAgIGlmIChwZSh0KSAmJiAwID09PSB0LmV4cGxpY2l0T3JkZXJCeS5sZW5ndGgpIHRocm93IG5ldyBqKEsuVU5JTVBMRU1FTlRFRCwgXCJsaW1pdFRvTGFzdCgpIHF1ZXJpZXMgcmVxdWlyZSBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBvcmRlckJ5KCkgY2xhdXNlXCIpO1xufVxuXG4vKipcbiAqIEEgYFF1ZXJ5Q29uc3RyYWludGAgaXMgdXNlZCB0byBuYXJyb3cgdGhlIHNldCBvZiBkb2N1bWVudHMgcmV0dXJuZWQgYnkgYVxuICogRmlyZXN0b3JlIHF1ZXJ5LiBgUXVlcnlDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcge0BsaW5rIHdoZXJlfSxcbiAqIHtAbGluayBvcmRlckJ5fSwge0BsaW5rIChzdGFydEF0OjEpfSwge0BsaW5rIChzdGFydEFmdGVyOjEpfSwge0BsaW5rXG4gKiBlbmRCZWZvcmU6MX0sIHtAbGluayAoZW5kQXQ6MSl9LCB7QGxpbmsgbGltaXR9IG9yIHtAbGluayBsaW1pdFRvTGFzdH0gYW5kXG4gKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8ge0BsaW5rIHF1ZXJ5fSB0byBjcmVhdGUgYSBuZXcgcXVlcnkgaW5zdGFuY2UgdGhhdFxuICogYWxzbyBjb250YWlucyB0aGlzIGBRdWVyeUNvbnN0cmFpbnRgLlxuICovIGNsYXNzIEJ1IHt9XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpbW11dGFibGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFF1ZXJ5fSB0aGF0IGlzIGV4dGVuZGVkIHRvIGFsc28gaW5jbHVkZVxuICogYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAqXG4gKiBAcGFyYW0gcXVlcnkgLSBUaGUge0BsaW5rIFF1ZXJ5fSBpbnN0YW5jZSB0byB1c2UgYXMgYSBiYXNlIGZvciB0aGUgbmV3IGNvbnN0cmFpbnRzLlxuICogQHBhcmFtIHF1ZXJ5Q29uc3RyYWludHMgLSBUaGUgbGlzdCBvZiB7QGxpbmsgUXVlcnlDb25zdHJhaW50fXMgdG8gYXBwbHkuXG4gKiBAdGhyb3dzIGlmIGFueSBvZiB0aGUgcHJvdmlkZWQgcXVlcnkgY29uc3RyYWludHMgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggdGhlXG4gKiBleGlzdGluZyBvciBuZXcgY29uc3RyYWludHMuXG4gKi8gZnVuY3Rpb24gVXUodCwgLi4uZSkge1xuICAgIGZvciAoY29uc3QgbiBvZiBlKSB0ID0gbi5fYXBwbHkodCk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbmNsYXNzIHF1IGV4dGVuZHMgQnUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5HYSA9IHQsIHRoaXMuemEgPSBlLCB0aGlzLkhhID0gbiwgdGhpcy50eXBlID0gXCJ3aGVyZVwiO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICBjb25zdCBlID0gaHUodC5maXJlc3RvcmUpLCBuID0gZnVuY3Rpb24odCwgZSwgbiwgcywgaSwgciwgbykge1xuICAgICAgICAgICAgbGV0IGE7XG4gICAgICAgICAgICBpZiAoaS5pc0tleUZpZWxkKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovID09PSByIHx8IFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovID09PSByKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIFF1ZXJ5LiBZb3UgY2FuJ3QgcGVyZm9ybSAnJHtyfScgcXVlcmllcyBvbiBGaWVsZFBhdGguZG9jdW1lbnRJZCgpLmApO1xuICAgICAgICAgICAgICAgIGlmIChcImluXCIgLyogSU4gKi8gPT09IHIgfHwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gPT09IHIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2gobywgcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIG8pIGUucHVzaChuaChzLCB0LCBuKSk7XG4gICAgICAgICAgICAgICAgICAgIGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGEgPSBuaChzLCB0LCBvKTtcbiAgICAgICAgICAgIH0gZWxzZSBcImluXCIgLyogSU4gKi8gIT09IHIgJiYgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gIT09IHIgJiYgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gIT09IHIgfHwgc2gobywgciksIFxuICAgICAgICAgICAgYSA9IFR1KG4sIGUsIG8sIFxuICAgICAgICAgICAgLyogYWxsb3dBcnJheXM9ICovIFwiaW5cIiAvKiBJTiAqLyA9PT0gciB8fCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA9PT0gcik7XG4gICAgICAgICAgICBjb25zdCBjID0gWnQuY3JlYXRlKGksIHIsIGEpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5WKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IEVlKHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbiAmJiAhbi5pc0VxdWFsKGUuZmllbGQpKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBBbGwgd2hlcmUgZmlsdGVycyB3aXRoIGFuIGluZXF1YWxpdHkgKDwsIDw9LCAhPSwgbm90LWluLCA+LCBvciA+PSkgbXVzdCBiZSBvbiB0aGUgc2FtZSBmaWVsZC4gQnV0IHlvdSBoYXZlIGluZXF1YWxpdHkgZmlsdGVycyBvbiAnJHtuLnRvU3RyaW5nKCl9JyBhbmQgJyR7ZS5maWVsZC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IFRlKHQpO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBzICYmIGloKHQsIGUuZmllbGQsIHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdC5maWx0ZXJzKSBpZiAoZS5pbmRleE9mKG4ub3ApID49IDApIHJldHVybiBuLm9wO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9KHQsIFxuICAgICAgICAgICAgICAgIC8qKlxuICogR2l2ZW4gYW4gb3BlcmF0b3IsIHJldHVybnMgdGhlIHNldCBvZiBvcGVyYXRvcnMgdGhhdCBjYW5ub3QgYmUgdXNlZCB3aXRoIGl0LlxuICpcbiAqIE9wZXJhdG9ycyBpbiBhIHF1ZXJ5IG11c3QgYWRoZXJlIHRvIHRoZSBmb2xsb3dpbmcgc2V0IG9mIHJ1bGVzOlxuICogMS4gT25seSBvbmUgYXJyYXkgb3BlcmF0b3IgaXMgYWxsb3dlZC5cbiAqIDIuIE9ubHkgb25lIGRpc2p1bmN0aXZlIG9wZXJhdG9yIGlzIGFsbG93ZWQuXG4gKiAzLiBgTk9UX0VRVUFMYCBjYW5ub3QgYmUgdXNlZCB3aXRoIGFub3RoZXIgYE5PVF9FUVVBTGAgb3BlcmF0b3IuXG4gKiA0LiBgTk9UX0lOYCBjYW5ub3QgYmUgdXNlZCB3aXRoIGFycmF5LCBkaXNqdW5jdGl2ZSwgb3IgYE5PVF9FUVVBTGAgb3BlcmF0b3JzLlxuICpcbiAqIEFycmF5IG9wZXJhdG9yczogYEFSUkFZX0NPTlRBSU5TYCwgYEFSUkFZX0NPTlRBSU5TX0FOWWBcbiAqIERpc2p1bmN0aXZlIG9wZXJhdG9yczogYElOYCwgYEFSUkFZX0NPTlRBSU5TX0FOWWAsIGBOT1RfSU5gXG4gKi9cbiAgICAgICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcIiE9XCIgLyogTk9UX0VRVUFMICovICwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIFwiYXJyYXktY29udGFpbnNcIiAvKiBBUlJBWV9DT05UQUlOUyAqLyAsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpblwiIC8qIElOICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgXCJpblwiIC8qIElOICovICwgXCJub3QtaW5cIiAvKiBOT1RfSU4gKi8gXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgXCJhcnJheS1jb250YWluc1wiIC8qIEFSUkFZX0NPTlRBSU5TICovICwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBBUlJBWV9DT05UQUlOU19BTlkgKi8gLCBcImluXCIgLyogSU4gKi8gLCBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm5vdC1pblwiIC8qIE5PVF9JTiAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBcImFycmF5LWNvbnRhaW5zXCIgLyogQVJSQVlfQ09OVEFJTlMgKi8gLCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIEFSUkFZX0NPTlRBSU5TX0FOWSAqLyAsIFwiaW5cIiAvKiBJTiAqLyAsIFwibm90LWluXCIgLyogTk9UX0lOICovICwgXCIhPVwiIC8qIE5PVF9FUVVBTCAqLyBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0oZS5vcCkpO1xuICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBuKSBcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlbiBpdCdzIGEgZHVwbGljYXRlIG9wIHRvIGdpdmUgYSBzbGlnaHRseSBjbGVhcmVyIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgdGhyb3cgbiA9PT0gZS5vcCA/IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFlvdSBjYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgJyR7ZS5vcC50b1N0cmluZygpfScgZmlsdGVyLmApIDogbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gWW91IGNhbm5vdCB1c2UgJyR7ZS5vcC50b1N0cmluZygpfScgZmlsdGVycyB3aXRoICcke24udG9TdHJpbmcoKX0nIGZpbHRlcnMuYCk7XG4gICAgICAgICAgICB9KHQsIGMpLCBjO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBcIndoZXJlXCIsIGUsIHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkLCB0aGlzLkdhLCB0aGlzLnphLCB0aGlzLkhhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBiYyh0LmZpcmVzdG9yZSwgdC5jb252ZXJ0ZXIsIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmZpbHRlcnMuY29uY2F0KFsgZSBdKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgX2UodC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgdC5leHBsaWNpdE9yZGVyQnkuc2xpY2UoKSwgbiwgdC5saW1pdCwgdC5saW1pdFR5cGUsIHQuc3RhcnRBdCwgdC5lbmRBdCk7XG4gICAgICAgIH0odC5fcXVlcnksIG4pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUNvbnN0cmFpbnR9IHRoYXQgZW5mb3JjZXMgdGhhdCBkb2N1bWVudHMgbXVzdCBjb250YWluIHRoZVxuICogc3BlY2lmaWVkIGZpZWxkIGFuZCB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgc2F0aXNmeSB0aGUgcmVsYXRpb24gY29uc3RyYWludFxuICogcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIGZpZWxkUGF0aCAtIFRoZSBwYXRoIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBvcFN0ciAtIFRoZSBvcGVyYXRpb24gc3RyaW5nIChlLmcgXCImbHQ7XCIsIFwiJmx0Oz1cIiwgXCI9PVwiLCBcIiZsdDtcIixcbiAqICAgXCImbHQ7PVwiLCBcIiE9XCIpLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIGZvciBjb21wYXJpc29uXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB7QGxpbmsgUXVlcnl9LlxuICovIGZ1bmN0aW9uIEt1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZSwgaSA9IE51KFwid2hlcmVcIiwgdCk7XG4gICAgcmV0dXJuIG5ldyBxdShpLCBzLCBuKTtcbn1cblxuY2xhc3MganUgZXh0ZW5kcyBCdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLkdhID0gdCwgdGhpcy5KYSA9IGUsIHRoaXMudHlwZSA9IFwib3JkZXJCeVwiO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICBjb25zdCBlID0gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHQuc3RhcnRBdCkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBcIkludmFsaWQgcXVlcnkuIFlvdSBtdXN0IG5vdCBjYWxsIHN0YXJ0QXQoKSBvciBzdGFydEFmdGVyKCkgYmVmb3JlIGNhbGxpbmcgb3JkZXJCeSgpLlwiKTtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSB0LmVuZEF0KSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBxdWVyeS4gWW91IG11c3Qgbm90IGNhbGwgZW5kQXQoKSBvciBlbmRCZWZvcmUoKSBiZWZvcmUgY2FsbGluZyBvcmRlckJ5KCkuXCIpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBsZShlLCBuKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IFRlKHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IG9yZGVyIGJ5LiBJdCBtdXN0IG1hdGNoIGFueSBpbmVxdWFsaXR5LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gRWUodCk7XG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IG4gJiYgaWgodCwgbiwgZS5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSh0LCBzKSwgcztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIENyZWF0ZSBhIGBCb3VuZGAgZnJvbSBhIHF1ZXJ5IGFuZCBhIGRvY3VtZW50LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgYEJvdW5kYCB3aWxsIGFsd2F5cyBpbmNsdWRlIHRoZSBrZXkgb2YgdGhlIGRvY3VtZW50XG4gKiBhbmQgc28gb25seSB0aGUgcHJvdmlkZWQgZG9jdW1lbnQgd2lsbCBjb21wYXJlIGVxdWFsIHRvIHRoZSByZXR1cm5lZFxuICogcG9zaXRpb24uXG4gKlxuICogV2lsbCB0aHJvdyBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBhbGwgZmllbGRzIG9mIHRoZSBvcmRlciBieVxuICogb2YgdGhlIHF1ZXJ5IG9yIGlmIGFueSBvZiB0aGUgZmllbGRzIGluIHRoZSBvcmRlciBieSBhcmUgYW4gdW5jb21taXR0ZWRcbiAqIHNlcnZlciB0aW1lc3RhbXAuXG4gKi8gKHQuX3F1ZXJ5LCB0aGlzLkdhLCB0aGlzLkphKTtcbiAgICAgICAgcmV0dXJuIG5ldyBiYyh0LmZpcmVzdG9yZSwgdC5jb252ZXJ0ZXIsIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogdmFsaWRhdGUgdGhhdCBvcmRlckJ5IGRvZXMgbm90IGxpc3QgdGhlIHNhbWUga2V5IHR3aWNlLlxuICAgICAgICAgICAgY29uc3QgbiA9IHQuZXhwbGljaXRPcmRlckJ5LmNvbmNhdChbIGUgXSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IF9lKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIG4sIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCB0LmVuZEF0KTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFF1ZXJ5Q29uc3RyYWludH0gdGhhdCBzb3J0cyB0aGUgcXVlcnkgcmVzdWx0IGJ5IHRoZVxuICogc3BlY2lmaWVkIGZpZWxkLCBvcHRpb25hbGx5IGluIGRlc2NlbmRpbmcgb3JkZXIgaW5zdGVhZCBvZiBhc2NlbmRpbmcuXG4gKlxuICogQHBhcmFtIGZpZWxkUGF0aCAtIFRoZSBmaWVsZCB0byBzb3J0IGJ5LlxuICogQHBhcmFtIGRpcmVjdGlvblN0ciAtIE9wdGlvbmFsIGRpcmVjdGlvbiB0byBzb3J0IGJ5ICgnYXNjJyBvciAnZGVzYycpLiBJZlxuICogbm90IHNwZWNpZmllZCwgb3JkZXIgd2lsbCBiZSBhc2NlbmRpbmcuXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB7QGxpbmsgUXVlcnl9LlxuICovIGZ1bmN0aW9uIFF1KHQsIGUgPSBcImFzY1wiKSB7XG4gICAgY29uc3QgbiA9IGUsIHMgPSBOdShcIm9yZGVyQnlcIiwgdCk7XG4gICAgcmV0dXJuIG5ldyBqdShzLCBuKTtcbn1cblxuY2xhc3MgV3UgZXh0ZW5kcyBCdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLllhID0gZSwgdGhpcy5YYSA9IG47XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYmModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBQZSh0Ll9xdWVyeSwgdGhpcy5ZYSwgdGhpcy5YYSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFF1ZXJ5Q29uc3RyYWludH0gdGhhdCBvbmx5IHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIGRvY3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiBHdSh0KSB7XG4gICAgcmV0dXJuIEVjKFwibGltaXRcIiwgdCksIG5ldyBXdShcImxpbWl0XCIsIHQsIFwiRlwiIC8qIEZpcnN0ICovKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIFF1ZXJ5Q29uc3RyYWludH0gdGhhdCBvbmx5IHJldHVybnMgdGhlIGxhc3QgbWF0Y2hpbmcgZG9jdW1lbnRzLlxuICpcbiAqIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGBvcmRlckJ5YCBjbGF1c2UgZm9yIGBsaW1pdFRvTGFzdGAgcXVlcmllcyxcbiAqIG90aGVyd2lzZSBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZHVyaW5nIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5fS5cbiAqLyBmdW5jdGlvbiB6dSh0KSB7XG4gICAgcmV0dXJuIEVjKFwibGltaXRUb0xhc3RcIiwgdCksIG5ldyBXdShcImxpbWl0VG9MYXN0XCIsIHQsIFwiTFwiIC8qIExhc3QgKi8pO1xufVxuXG5jbGFzcyBIdSBleHRlbmRzIEJ1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9IHQsIHRoaXMuWmEgPSBlLCB0aGlzLnRjID0gbjtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGVoKHQsIHRoaXMudHlwZSwgdGhpcy5aYSwgdGhpcy50Yyk7XG4gICAgICAgIHJldHVybiBuZXcgYmModC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IF9lKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgZSwgdC5lbmRBdCk7XG4gICAgICAgIH0odC5fcXVlcnksIGUpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEp1KC4uLnQpIHtcbiAgICByZXR1cm4gbmV3IEh1KFwic3RhcnRBdFwiLCB0LCAvKmJlZm9yZT0qLyAhMCk7XG59XG5cbmZ1bmN0aW9uIFl1KC4uLnQpIHtcbiAgICByZXR1cm4gbmV3IEh1KFwic3RhcnRBZnRlclwiLCB0LCBcbiAgICAvKmJlZm9yZT0qLyAhMSk7XG59XG5cbmNsYXNzIFh1IGV4dGVuZHMgQnUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy50eXBlID0gdCwgdGhpcy5aYSA9IGUsIHRoaXMudGMgPSBuO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICBjb25zdCBlID0gZWgodCwgdGhpcy50eXBlLCB0aGlzLlphLCB0aGlzLnRjKTtcbiAgICAgICAgcmV0dXJuIG5ldyBiYyh0LmZpcmVzdG9yZSwgdC5jb252ZXJ0ZXIsIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgX2UodC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgdC5leHBsaWNpdE9yZGVyQnkuc2xpY2UoKSwgdC5maWx0ZXJzLnNsaWNlKCksIHQubGltaXQsIHQubGltaXRUeXBlLCB0LnN0YXJ0QXQsIGUpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBlKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBadSguLi50KSB7XG4gICAgcmV0dXJuIG5ldyBYdShcImVuZEJlZm9yZVwiLCB0LCAvKmJlZm9yZT0qLyAhMCk7XG59XG5cbmZ1bmN0aW9uIHRoKC4uLnQpIHtcbiAgICByZXR1cm4gbmV3IFh1KFwiZW5kQXRcIiwgdCwgLypiZWZvcmU9Ki8gITEpO1xufVxuXG4vKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGJvdW5kIGZyb20gYSBkb2N1bWVudCBvciBmaWVsZHMgKi8gZnVuY3Rpb24gZWgodCwgZSwgbiwgcykge1xuICAgIGlmIChuWzBdID0gZ2V0TW9kdWxhckluc3RhbmNlKG5bMF0pLCBuWzBdIGluc3RhbmNlb2YgRHUpIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGlmICghcykgdGhyb3cgbmV3IGooSy5OT1RfRk9VTkQsIGBDYW4ndCB1c2UgYSBEb2N1bWVudFNuYXBzaG90IHRoYXQgZG9lc24ndCBleGlzdCBmb3IgJHtufSgpLmApO1xuICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgIC8vIEJlY2F1c2UgcGVvcGxlIGV4cGVjdCB0byBjb250aW51ZS9lbmQgYSBxdWVyeSBhdCB0aGUgZXhhY3QgZG9jdW1lbnRcbiAgICAgICAgLy8gcHJvdmlkZWQsIHdlIG5lZWQgdG8gdXNlIHRoZSBpbXBsaWNpdCBzb3J0IG9yZGVyIHJhdGhlciB0aGFuIHRoZSBleHBsaWNpdFxuICAgICAgICAvLyBzb3J0IG9yZGVyLCBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBjb250YWluIHRoZSBkb2N1bWVudCBrZXkuIFRoYXQgd2F5XG4gICAgICAgIC8vIHRoZSBwb3NpdGlvbiBiZWNvbWVzIHVuYW1iaWd1b3VzIGFuZCB0aGUgcXVlcnkgY29udGludWVzL2VuZHMgZXhhY3RseSBhdFxuICAgICAgICAvLyB0aGUgcHJvdmlkZWQgZG9jdW1lbnQuIFdpdGhvdXQgdGhlIGtleSAoYnkgdXNpbmcgdGhlIGV4cGxpY2l0IHNvcnRcbiAgICAgICAgLy8gb3JkZXJzKSwgbXVsdGlwbGUgZG9jdW1lbnRzIGNvdWxkIG1hdGNoIHRoZSBwb3NpdGlvbiwgeWllbGRpbmcgZHVwbGljYXRlXG4gICAgICAgIC8vIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIEFlKHQpKSBpZiAobi5maWVsZC5pc0tleUZpZWxkKCkpIHIucHVzaChPdChlLCBzLmtleSkpOyBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBzLmRhdGEuZmllbGQobi5maWVsZCk7XG4gICAgICAgICAgICBpZiAoQXQodCkpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgJ0ludmFsaWQgcXVlcnkuIFlvdSBhcmUgdHJ5aW5nIHRvIHN0YXJ0IG9yIGVuZCBhIHF1ZXJ5IHVzaW5nIGEgZG9jdW1lbnQgZm9yIHdoaWNoIHRoZSBmaWVsZCBcIicgKyBuLmZpZWxkICsgJ1wiIGlzIGFuIHVuY29tbWl0dGVkIHNlcnZlciB0aW1lc3RhbXAuIChTaW5jZSB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyB1bmtub3duLCB5b3UgY2Fubm90IHN0YXJ0L2VuZCBhIHF1ZXJ5IHdpdGggaXQuKScpO1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbi5maWVsZC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgYXJlIHRyeWluZyB0byBzdGFydCBvciBlbmQgYSBxdWVyeSB1c2luZyBhIGRvY3VtZW50IGZvciB3aGljaCB0aGUgZmllbGQgJyR7dH0nICh1c2VkIGFzIHRoZSBvcmRlckJ5KSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHVlKHIsIGkpO1xuICAgIH1cbiAgICAvKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiBmaWVsZCB2YWx1ZXMgdG8gYSBgQm91bmRgIGZvciB0aGUgZ2l2ZW4gcXVlcnkuXG4gKi8gKHQuX3F1ZXJ5LCB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCwgZSwgblswXS5fZG9jdW1lbnQsIHMpO1xuICAgIHtcbiAgICAgICAgY29uc3QgaSA9IGh1KHQuZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgICAgIC8vIFVzZSBleHBsaWNpdCBvcmRlciBieSdzIGJlY2F1c2UgaXQgaGFzIHRvIG1hdGNoIHRoZSBxdWVyeSB0aGUgdXNlciBtYWRlXG4gICAgICAgICAgICBjb25zdCBvID0gdC5leHBsaWNpdE9yZGVyQnk7XG4gICAgICAgICAgICBpZiAoaS5sZW5ndGggPiBvLmxlbmd0aCkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIHRvICR7c30oKS4gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBvcmRlckJ5KCkgY2xhdXNlc2ApO1xuICAgICAgICAgICAgY29uc3QgYSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBpLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGlbcl07XG4gICAgICAgICAgICAgICAgaWYgKG9bcl0uZmllbGQuaXNLZXlGaWVsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiBjKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBFeHBlY3RlZCBhIHN0cmluZyBmb3IgZG9jdW1lbnQgSUQgaW4gJHtzfSgpLCBidXQgZ290IGEgJHt0eXBlb2YgY31gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJZSh0KSAmJiAtMSAhPT0gYy5pbmRleE9mKFwiL1wiKSkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gYW5kIG9yZGVyaW5nIGJ5IEZpZWxkUGF0aC5kb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJHtzfSgpIG11c3QgYmUgYSBwbGFpbiBkb2N1bWVudCBJRCwgYnV0ICcke2N9JyBjb250YWlucyBhIHNsYXNoLmApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5wYXRoLmNoaWxkKGR0LmZyb21TdHJpbmcoYykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVN0LmlzRG9jdW1lbnRLZXkobikpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGFuZCBvcmRlcmluZyBieSBGaWVsZFBhdGguZG9jdW1lbnRJZCgpLCB0aGUgdmFsdWUgcGFzc2VkIHRvICR7c30oKSBtdXN0IHJlc3VsdCBpbiBhIHZhbGlkIGRvY3VtZW50IHBhdGgsIGJ1dCAnJHtufScgaXMgbm90IGJlY2F1c2UgaXQgY29udGFpbnMgYW4gb2RkIG51bWJlciBvZiBzZWdtZW50cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBTdChuKTtcbiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKE90KGUsIGkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gVHUobiwgcywgYyk7XG4gICAgICAgICAgICAgICAgICAgIGEucHVzaCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IHVlKGEsIHIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUGFyc2VzIHRoZSBnaXZlbiBgZG9jdW1lbnRJZFZhbHVlYCBpbnRvIGEgYFJlZmVyZW5jZVZhbHVlYCwgdGhyb3dpbmdcbiAqIGFwcHJvcHJpYXRlIGVycm9ycyBpZiB0aGUgdmFsdWUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIGBEb2N1bWVudFJlZmVyZW5jZWBcbiAqIG9yIGBzdHJpbmdgLCBvciBpZiB0aGUgc3RyaW5nIGlzIG1hbGZvcm1lZC5cbiAqLyAodC5fcXVlcnksIHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkLCBpLCBlLCBuLCBzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5oKHQsIGUsIG4pIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgKG4gPSBnZXRNb2R1bGFySW5zdGFuY2UobikpKSB7XG4gICAgICAgIGlmIChcIlwiID09PSBuKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyB3aXRoIEZpZWxkUGF0aC5kb2N1bWVudElkKCksIHlvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCBkb2N1bWVudCBJRCwgYnV0IGl0IHdhcyBhbiBlbXB0eSBzdHJpbmcuXCIpO1xuICAgICAgICBpZiAoIUllKGUpICYmIC0xICE9PSBuLmluZGV4T2YoXCIvXCIpKSB0aHJvdyBuZXcgaihLLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBXaGVuIHF1ZXJ5aW5nIGEgY29sbGVjdGlvbiBieSBGaWVsZFBhdGguZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgcGxhaW4gZG9jdW1lbnQgSUQsIGJ1dCAnJHtufScgY29udGFpbnMgYSAnLycgY2hhcmFjdGVyLmApO1xuICAgICAgICBjb25zdCBzID0gZS5wYXRoLmNoaWxkKGR0LmZyb21TdHJpbmcobikpO1xuICAgICAgICBpZiAoIVN0LmlzRG9jdW1lbnRLZXkocykpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgYSBjb2xsZWN0aW9uIGdyb3VwIGJ5IEZpZWxkUGF0aC5kb2N1bWVudElkKCksIHRoZSB2YWx1ZSBwcm92aWRlZCBtdXN0IHJlc3VsdCBpbiBhIHZhbGlkIGRvY3VtZW50IHBhdGgsIGJ1dCAnJHtzfScgaXMgbm90IGJlY2F1c2UgaXQgaGFzIGFuIG9kZCBudW1iZXIgb2Ygc2VnbWVudHMgKCR7cy5sZW5ndGh9KS5gKTtcbiAgICAgICAgcmV0dXJuIE90KHQsIG5ldyBTdChzKSk7XG4gICAgfVxuICAgIGlmIChuIGluc3RhbmNlb2YgUGMpIHJldHVybiBPdCh0LCBuLl9rZXkpO1xuICAgIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgd2l0aCBGaWVsZFBhdGguZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgc3RyaW5nIG9yIGEgRG9jdW1lbnRSZWZlcmVuY2UsIGJ1dCBpdCB3YXM6ICR7cGMobil9LmApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBwYXNzZWQgaW50byBhIGRpc2p1bmN0aXZlIGZpbHRlciBzYXRpc2ZpZXMgYWxsXG4gKiBhcnJheSByZXF1aXJlbWVudHMuXG4gKi8gZnVuY3Rpb24gc2godCwgZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSB8fCAwID09PSB0Lmxlbmd0aCkgdGhyb3cgbmV3IGooSy5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBRdWVyeS4gQSBub24tZW1wdHkgYXJyYXkgaXMgcmVxdWlyZWQgZm9yICcke2UudG9TdHJpbmcoKX0nIGZpbHRlcnMuYCk7XG4gICAgaWYgKHQubGVuZ3RoID4gMTApIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgUXVlcnkuICcke2UudG9TdHJpbmcoKX0nIGZpbHRlcnMgc3VwcG9ydCBhIG1heGltdW0gb2YgMTAgZWxlbWVudHMgaW4gdGhlIHZhbHVlIGFycmF5LmApO1xufVxuXG5mdW5jdGlvbiBpaCh0LCBlLCBuKSB7XG4gICAgaWYgKCFuLmlzRXF1YWwoZSkpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIFlvdSBoYXZlIGEgd2hlcmUgZmlsdGVyIHdpdGggYW4gaW5lcXVhbGl0eSAoPCwgPD0sICE9LCBub3QtaW4sID4sIG9yID49KSBvbiBmaWVsZCAnJHtlLnRvU3RyaW5nKCl9JyBhbmQgc28geW91IG11c3QgYWxzbyB1c2UgJyR7ZS50b1N0cmluZygpfScgYXMgeW91ciBmaXJzdCBhcmd1bWVudCB0byBvcmRlckJ5KCksIGJ1dCB5b3VyIGZpcnN0IG9yZGVyQnkoKSBpcyBvbiBmaWVsZCAnJHtuLnRvU3RyaW5nKCl9JyBpbnN0ZWFkLmApO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDb252ZXJ0cyBGaXJlc3RvcmUncyBpbnRlcm5hbCB0eXBlcyB0byB0aGUgSmF2YVNjcmlwdCB0eXBlcyB0aGF0IHdlIGV4cG9zZVxuICogdG8gdGhlIHVzZXIuXG4gKlxuICogQGludGVybmFsXG4gKi8gY2xhc3Mgcmgge1xuICAgIGNvbnZlcnRWYWx1ZSh0LCBlID0gXCJub25lXCIpIHtcbiAgICAgICAgc3dpdGNoIChEdCh0KSkge1xuICAgICAgICAgIGNhc2UgMCAvKiBOdWxsVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBjYXNlIDEgLyogQm9vbGVhblZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0LmJvb2xlYW5WYWx1ZTtcblxuICAgICAgICAgIGNhc2UgMiAvKiBOdW1iZXJWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gRXQodC5pbnRlZ2VyVmFsdWUgfHwgdC5kb3VibGVWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDMgLyogVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRpbWVzdGFtcCh0LnRpbWVzdGFtcFZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgNCAvKiBTZXJ2ZXJUaW1lc3RhbXBWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2VydmVyVGltZXN0YW1wKHQsIGUpO1xuXG4gICAgICAgICAgY2FzZSA1IC8qIFN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0LnN0cmluZ1ZhbHVlO1xuXG4gICAgICAgICAgY2FzZSA2IC8qIEJsb2JWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qnl0ZXMoSXQodC5ieXRlc1ZhbHVlKSk7XG5cbiAgICAgICAgICBjYXNlIDcgLyogUmVmVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFJlZmVyZW5jZSh0LnJlZmVyZW5jZVZhbHVlKTtcblxuICAgICAgICAgIGNhc2UgOCAvKiBHZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRHZW9Qb2ludCh0Lmdlb1BvaW50VmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSA5IC8qIEFycmF5VmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEFycmF5KHQuYXJyYXlWYWx1ZSwgZSk7XG5cbiAgICAgICAgICBjYXNlIDEwIC8qIE9iamVjdFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3QodC5tYXBWYWx1ZSwgZSk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgTCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnZlcnRPYmplY3QodCwgZSkge1xuICAgICAgICBjb25zdCBuID0ge307XG4gICAgICAgIHJldHVybiBodCh0LmZpZWxkcywgKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBuW3RdID0gdGhpcy5jb252ZXJ0VmFsdWUocywgZSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAgY29udmVydEdlb1BvaW50KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzdShFdCh0LmxhdGl0dWRlKSwgRXQodC5sb25naXR1ZGUpKTtcbiAgICB9XG4gICAgY29udmVydEFycmF5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuICh0LnZhbHVlcyB8fCBbXSkubWFwKCh0ID0+IHRoaXMuY29udmVydFZhbHVlKHQsIGUpKSk7XG4gICAgfVxuICAgIGNvbnZlcnRTZXJ2ZXJUaW1lc3RhbXAodCwgZSkge1xuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIFwicHJldmlvdXNcIjpcbiAgICAgICAgICAgIGNvbnN0IG4gPSBSdCh0KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDogdGhpcy5jb252ZXJ0VmFsdWUobiwgZSk7XG5cbiAgICAgICAgICBjYXNlIFwiZXN0aW1hdGVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXAoUHQodCkpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnZlcnRUaW1lc3RhbXAodCkge1xuICAgICAgICBjb25zdCBlID0gVHQodCk7XG4gICAgICAgIHJldHVybiBuZXcgYXQoZS5zZWNvbmRzLCBlLm5hbm9zKTtcbiAgICB9XG4gICAgY29udmVydERvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGR0LmZyb21TdHJpbmcodCk7XG4gICAgICAgIEIoQXMobikpO1xuICAgICAgICBjb25zdCBzID0gbmV3IGRjKG4uZ2V0KDEpLCBuLmdldCgzKSksIGkgPSBuZXcgU3Qobi5wb3BGaXJzdCg1KSk7XG4gICAgICAgIHJldHVybiBzLmlzRXF1YWwoZSkgfHwgXG4gICAgICAgIC8vIFRPRE8oYi82NDEzMDIwMik6IFNvbWVob3cgc3VwcG9ydCBmb3JlaWduIHJlZmVyZW5jZXMuXG4gICAgICAgIEYoYERvY3VtZW50ICR7aX0gY29udGFpbnMgYSBkb2N1bWVudCByZWZlcmVuY2Ugd2l0aGluIGEgZGlmZmVyZW50IGRhdGFiYXNlICgke3MucHJvamVjdElkfS8ke3MuZGF0YWJhc2V9KSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBJdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UgKCR7ZS5wcm9qZWN0SWR9LyR7ZS5kYXRhYmFzZX0pIGluc3RlYWQuYCksIFxuICAgICAgICBpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ29udmVydHMgY3VzdG9tIG1vZGVsIG9iamVjdCBvZiB0eXBlIFQgaW50byBgRG9jdW1lbnREYXRhYCBieSBhcHBseWluZyB0aGVcbiAqIGNvbnZlcnRlciBpZiBpdCBleGlzdHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gY29udmVydGluZyB1c2VyIG9iamVjdHMgdG8gYERvY3VtZW50RGF0YWBcbiAqIGJlY2F1c2Ugd2Ugd2FudCB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgaWZcbiAqIHRoZWlyIGBzZXQoKWAgb3IgZmFpbHMgZHVlIHRvIGludmFsaWQgZGF0YSBvcmlnaW5hdGluZyBmcm9tIGEgYHRvRmlyZXN0b3JlKClgXG4gKiBjYWxsLlxuICovIGZ1bmN0aW9uIG9oKHQsIGUsIG4pIHtcbiAgICBsZXQgcztcbiAgICAvLyBDYXN0IHRvIGBhbnlgIGluIG9yZGVyIHRvIHNhdGlzZnkgdGhlIHVuaW9uIHR5cGUgY29uc3RyYWludCBvblxuICAgIC8vIHRvRmlyZXN0b3JlKCkuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gcyA9IHQgPyBuICYmIChuLm1lcmdlIHx8IG4ubWVyZ2VGaWVsZHMpID8gdC50b0ZpcmVzdG9yZShlLCBuKSA6IHQudG9GaXJlc3RvcmUoZSkgOiBlLCBcbiAgICBzO1xufVxuXG5jbGFzcyBhaCBleHRlbmRzIHJoIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgY29udmVydEJ5dGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBldSh0KTtcbiAgICB9XG4gICAgY29udmVydFJlZmVyZW5jZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmNvbnZlcnREb2N1bWVudEtleSh0LCB0aGlzLmZpcmVzdG9yZS5fZGF0YWJhc2VJZCk7XG4gICAgICAgIHJldHVybiBuZXcgUGModGhpcy5maXJlc3RvcmUsIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHdyaXRlIGJhdGNoLCB1c2VkIHRvIHBlcmZvcm0gbXVsdGlwbGUgd3JpdGVzIGFzIGEgc2luZ2xlIGF0b21pYyB1bml0LlxuICpcbiAqIEEgYFdyaXRlQmF0Y2hgIG9iamVjdCBjYW4gYmUgYWNxdWlyZWQgYnkgY2FsbGluZyB7QGxpbmsgd3JpdGVCYXRjaH0uIEl0XG4gKiBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgd3JpdGVzIHRvIHRoZSB3cml0ZSBiYXRjaC4gTm9uZSBvZiB0aGUgd3JpdGVzXG4gKiB3aWxsIGJlIGNvbW1pdHRlZCAob3IgdmlzaWJsZSBsb2NhbGx5KSB1bnRpbCB7QGxpbmsgV3JpdGVCYXRjaC5jb21taXR9IGlzXG4gKiBjYWxsZWQuXG4gKi8gY2xhc3MgY2gge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSB0LCB0aGlzLl9jb21taXRIYW5kbGVyID0gZSwgdGhpcy5fbXV0YXRpb25zID0gW10sIHRoaXMuX2NvbW1pdHRlZCA9ICExLCBcbiAgICAgICAgdGhpcy5fZGF0YVJlYWRlciA9IGh1KHQpO1xuICAgIH1cbiAgICBzZXQodCwgZSwgbikge1xuICAgICAgICB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKTtcbiAgICAgICAgY29uc3QgcyA9IHVoKHQsIHRoaXMuX2ZpcmVzdG9yZSksIGkgPSBvaChzLmNvbnZlcnRlciwgZSwgbiksIHIgPSBsdSh0aGlzLl9kYXRhUmVhZGVyLCBcIldyaXRlQmF0Y2guc2V0XCIsIHMuX2tleSwgaSwgbnVsbCAhPT0gcy5jb252ZXJ0ZXIsIG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fbXV0YXRpb25zLnB1c2goci50b011dGF0aW9uKHMuX2tleSwgSmUubm9uZSgpKSksIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlLCBuLCAuLi5zKSB7XG4gICAgICAgIHRoaXMuX3ZlcmlmeU5vdENvbW1pdHRlZCgpO1xuICAgICAgICBjb25zdCBpID0gdWgodCwgdGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgLy8gRm9yIENvbXBhdCB0eXBlcywgd2UgaGF2ZSB0byBcImV4dHJhY3RcIiB0aGUgdW5kZXJseWluZyB0eXBlcyBiZWZvcmVcbiAgICAgICAgLy8gcGVyZm9ybWluZyB2YWxpZGF0aW9uLlxuICAgICAgICAgICAgICAgIGxldCByO1xuICAgICAgICByZXR1cm4gciA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIChlID0gZ2V0TW9kdWxhckluc3RhbmNlKGUpKSB8fCBlIGluc3RhbmNlb2YgWmMgPyBwdSh0aGlzLl9kYXRhUmVhZGVyLCBcIldyaXRlQmF0Y2gudXBkYXRlXCIsIGkuX2tleSwgZSwgbiwgcykgOiB5dSh0aGlzLl9kYXRhUmVhZGVyLCBcIldyaXRlQmF0Y2gudXBkYXRlXCIsIGkuX2tleSwgZSksIFxuICAgICAgICB0aGlzLl9tdXRhdGlvbnMucHVzaChyLnRvTXV0YXRpb24oaS5fa2V5LCBKZS5leGlzdHMoITApKSksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHJldHVybnMgVGhpcyBgV3JpdGVCYXRjaGAgaW5zdGFuY2UuIFVzZWQgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxscy5cbiAgICAgKi8gICAgZGVsZXRlKHQpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5Tm90Q29tbWl0dGVkKCk7XG4gICAgICAgIGNvbnN0IGUgPSB1aCh0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbXV0YXRpb25zID0gdGhpcy5fbXV0YXRpb25zLmNvbmNhdChuZXcgaG4oZS5fa2V5LCBKZS5ub25lKCkpKSwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyBhbGwgb2YgdGhlIHdyaXRlcyBpbiB0aGlzIHdyaXRlIGJhdGNoIGFzIGEgc2luZ2xlIGF0b21pYyB1bml0LlxuICAgICAqXG4gICAgICogVGhlIHJlc3VsdCBvZiB0aGVzZSB3cml0ZXMgd2lsbCBvbmx5IGJlIHJlZmxlY3RlZCBpbiBkb2N1bWVudCByZWFkcyB0aGF0XG4gICAgICogb2NjdXIgYWZ0ZXIgdGhlIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMuIElmIHRoZSBjbGllbnQgaXMgb2ZmbGluZSwgdGhlXG4gICAgICogd3JpdGUgZmFpbHMuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBsb2NhbCBtb2RpZmljYXRpb25zIG9yIGJ1ZmZlciB3cml0ZXNcbiAgICAgKiB1bnRpbCB0aGUgY2xpZW50IGlzIG9ubGluZSwgdXNlIHRoZSBmdWxsIEZpcmVzdG9yZSBTREsuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGBQcm9taXNlYCByZXNvbHZlZCBvbmNlIGFsbCBvZiB0aGUgd3JpdGVzIGluIHRoZSBiYXRjaCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byB0aGUgYmFja2VuZCBhcyBhbiBhdG9taWMgdW5pdCAobm90ZSB0aGF0IGl0IHdvbid0XG4gICAgICogcmVzb2x2ZSB3aGlsZSB5b3UncmUgb2ZmbGluZSkuXG4gICAgICovICAgIGNvbW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeU5vdENvbW1pdHRlZCgpLCB0aGlzLl9jb21taXR0ZWQgPSAhMCwgdGhpcy5fbXV0YXRpb25zLmxlbmd0aCA+IDAgPyB0aGlzLl9jb21taXRIYW5kbGVyKHRoaXMuX211dGF0aW9ucykgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgX3ZlcmlmeU5vdENvbW1pdHRlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkgdGhyb3cgbmV3IGooSy5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkEgd3JpdGUgYmF0Y2ggY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyIGNvbW1pdCgpIGhhcyBiZWVuIGNhbGxlZC5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1aCh0LCBlKSB7XG4gICAgaWYgKCh0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpKS5maXJlc3RvcmUgIT09IGUpIHRocm93IG5ldyBqKEsuSU5WQUxJRF9BUkdVTUVOVCwgXCJQcm92aWRlZCBkb2N1bWVudCByZWZlcmVuY2UgaXMgZnJvbSBhIGRpZmZlcmVudCBGaXJlc3RvcmUgaW5zdGFuY2UuXCIpO1xuICAgIHJldHVybiB0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVE9ETyhtcnNjaG1pZHQpIENvbnNpZGVyIHVzaW5nIGBCYXNlVHJhbnNhY3Rpb25gIGFzIHRoZSBiYXNlIGNsYXNzIGluIHRoZVxuLy8gbGVnYWN5IFNESy5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBUaGUgYFRyYW5zYWN0aW9uYCBvYmplY3QgcGFzc2VkIHRvIGEgdHJhbnNhY3Rpb24ncyBgdXBkYXRlRnVuY3Rpb25gIHByb3ZpZGVzXG4gKiB0aGUgbWV0aG9kcyB0byByZWFkIGFuZCB3cml0ZSBkYXRhIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gY29udGV4dC4gU2VlXG4gKiB7QGxpbmsgcnVuVHJhbnNhY3Rpb259LlxuICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhpcyBgRG9jdW1lbnRSZWZlcmVuY2VgLlxuICpcbiAqIE5vdGU6IGBnZXREb2MoKWAgYXR0ZW1wdHMgdG8gcHJvdmlkZSB1cC10by1kYXRlIGRhdGEgd2hlbiBwb3NzaWJsZSBieSB3YWl0aW5nXG4gKiBmb3IgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIGJ1dCBpdCBtYXkgcmV0dXJuIGNhY2hlZCBkYXRhIG9yIGZhaWwgaWYgeW91IGFyZVxuICogb2ZmbGluZSBhbmQgdGhlIHNlcnZlciBjYW5ub3QgYmUgcmVhY2hlZC4gVG8gc3BlY2lmeSB0aGlzIGJlaGF2aW9yLCBpbnZva2VcbiAqIHtAbGluayBnZXREb2NGcm9tQ2FjaGV9IG9yIHtAbGluayBnZXREb2NGcm9tU2VydmVyfS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSBvZiB0aGUgZG9jdW1lbnQgdG8gZmV0Y2guXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWluaW5nIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBjb250ZW50cy5cbiAqL1xuZnVuY3Rpb24gaGgodCkge1xuICAgIHQgPSBUYyh0LCBQYyk7XG4gICAgY29uc3QgZSA9IFRjKHQuZmlyZXN0b3JlLCBPYyk7XG4gICAgcmV0dXJuIHJjKEJjKGUpLCB0Ll9rZXkpLnRoZW4oKG4gPT4gUmgoZSwgdCwgbikpKTtcbn1cblxuY2xhc3MgbGggZXh0ZW5kcyByaCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGNvbnZlcnRCeXRlcyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgZXUodCk7XG4gICAgfVxuICAgIGNvbnZlcnRSZWZlcmVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb252ZXJ0RG9jdW1lbnRLZXkodCwgdGhpcy5maXJlc3RvcmUuX2RhdGFiYXNlSWQpO1xuICAgICAgICByZXR1cm4gbmV3IFBjKHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhpcyBgRG9jdW1lbnRSZWZlcmVuY2VgIGZyb20gY2FjaGUuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgY3VycmVudGx5IGNhY2hlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCByZXNvbHZlZCB3aXRoIGEgYERvY3VtZW50U25hcHNob3RgIGNvbnRhaW5pbmcgdGhlXG4gKiBjdXJyZW50IGRvY3VtZW50IGNvbnRlbnRzLlxuICovIGZ1bmN0aW9uIGZoKHQpIHtcbiAgICB0ID0gVGModCwgUGMpO1xuICAgIGNvbnN0IGUgPSBUYyh0LmZpcmVzdG9yZSwgT2MpLCBuID0gQmMoZSksIHMgPSBuZXcgbGgoZSk7XG4gICAgcmV0dXJuIGljKG4sIHQuX2tleSkudGhlbigobiA9PiBuZXcgeHUoZSwgcywgdC5fa2V5LCBuLCBuZXcga3UobnVsbCAhPT0gbiAmJiBuLmhhc0xvY2FsTXV0YXRpb25zLCBcbiAgICAvKiBmcm9tQ2FjaGU9ICovICEwKSwgdC5jb252ZXJ0ZXIpKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBmcm9tIHRoZSBzZXJ2ZXIuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBuZXR3b3JrIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWluaW5nIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBjb250ZW50cy5cbiAqLyBmdW5jdGlvbiBkaCh0KSB7XG4gICAgdCA9IFRjKHQsIFBjKTtcbiAgICBjb25zdCBlID0gVGModC5maXJlc3RvcmUsIE9jKTtcbiAgICByZXR1cm4gcmMoQmMoZSksIHQuX2tleSwge1xuICAgICAgICBzb3VyY2U6IFwic2VydmVyXCJcbiAgICB9KS50aGVuKChuID0+IFJoKGUsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgLlxuICpcbiAqIE5vdGU6IGBnZXREb2NzKClgIGF0dGVtcHRzIHRvIHByb3ZpZGUgdXAtdG8tZGF0ZSBkYXRhIHdoZW4gcG9zc2libGUgYnlcbiAqIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBidXQgaXQgbWF5IHJldHVybiBjYWNoZWQgZGF0YSBvciBmYWlsIGlmXG4gKiB5b3UgYXJlIG9mZmxpbmUgYW5kIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIHJlYWNoZWQuIFRvIHNwZWNpZnkgdGhpcyBiZWhhdmlvcixcbiAqIGludm9rZSB7QGxpbmsgZ2V0RG9jc0Zyb21DYWNoZX0gb3Ige0BsaW5rIGdldERvY3NGcm9tU2VydmVyfS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gd2godCkge1xuICAgIHQgPSBUYyh0LCBiYyk7XG4gICAgY29uc3QgZSA9IFRjKHQuZmlyZXN0b3JlLCBPYyksIG4gPSBCYyhlKSwgcyA9IG5ldyBsaChlKTtcbiAgICByZXR1cm4gTHUodC5fcXVlcnkpLCBhYyhuLCB0Ll9xdWVyeSkudGhlbigobiA9PiBuZXcgRnUoZSwgcywgdCwgbikpKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMgYXMgYSBgUXVlcnlTbmFwc2hvdGAgZnJvbSBjYWNoZS5cbiAqIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGRvY3VtZW50IGlzIG5vdCBjdXJyZW50bHkgY2FjaGVkLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS5cbiAqLyBmdW5jdGlvbiBfaCh0KSB7XG4gICAgdCA9IFRjKHQsIGJjKTtcbiAgICBjb25zdCBlID0gVGModC5maXJlc3RvcmUsIE9jKSwgbiA9IEJjKGUpLCBzID0gbmV3IGxoKGUpO1xuICAgIHJldHVybiBvYyhuLCB0Ll9xdWVyeSkudGhlbigobiA9PiBuZXcgRnUoZSwgcywgdCwgbikpKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMgYXMgYSBgUXVlcnlTbmFwc2hvdGAgZnJvbSB0aGVcbiAqIHNlcnZlci4gUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbmV0d29yayBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS5cbiAqLyBmdW5jdGlvbiBtaCh0KSB7XG4gICAgdCA9IFRjKHQsIGJjKTtcbiAgICBjb25zdCBlID0gVGModC5maXJlc3RvcmUsIE9jKSwgbiA9IEJjKGUpLCBzID0gbmV3IGxoKGUpO1xuICAgIHJldHVybiBhYyhuLCB0Ll9xdWVyeSwge1xuICAgICAgICBzb3VyY2U6IFwic2VydmVyXCJcbiAgICB9KS50aGVuKChuID0+IG5ldyBGdShlLCBzLCB0LCBuKSkpO1xufVxuXG5mdW5jdGlvbiBnaCh0LCBlLCBuKSB7XG4gICAgdCA9IFRjKHQsIFBjKTtcbiAgICBjb25zdCBzID0gVGModC5maXJlc3RvcmUsIE9jKSwgaSA9IG9oKHQuY29udmVydGVyLCBlLCBuKTtcbiAgICByZXR1cm4gQWgocywgWyBsdShodShzKSwgXCJzZXREb2NcIiwgdC5fa2V5LCBpLCBudWxsICE9PSB0LmNvbnZlcnRlciwgbikudG9NdXRhdGlvbih0Ll9rZXksIEplLm5vbmUoKSkgXSk7XG59XG5cbmZ1bmN0aW9uIHloKHQsIGUsIG4sIC4uLnMpIHtcbiAgICB0ID0gVGModCwgUGMpO1xuICAgIGNvbnN0IGkgPSBUYyh0LmZpcmVzdG9yZSwgT2MpLCByID0gaHUoaSk7XG4gICAgbGV0IG87XG4gICAgbyA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIChcbiAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICBlID0gZ2V0TW9kdWxhckluc3RhbmNlKGUpKSB8fCBlIGluc3RhbmNlb2YgWmMgPyBwdShyLCBcInVwZGF0ZURvY1wiLCB0Ll9rZXksIGUsIG4sIHMpIDogeXUociwgXCJ1cGRhdGVEb2NcIiwgdC5fa2V5LCBlKTtcbiAgICByZXR1cm4gQWgoaSwgWyBvLnRvTXV0YXRpb24odC5fa2V5LCBKZS5leGlzdHMoITApKSBdKTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIHRoZSBkb2N1bWVudCByZWZlcnJlZCB0byBieSB0aGUgc3BlY2lmaWVkIGBEb2N1bWVudFJlZmVyZW5jZWAuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBkZWxldGUuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5XG4gKiBkZWxldGVkIGZyb20gdGhlIGJhY2tlbmQgKG5vdGUgdGhhdCBpdCB3b24ndCByZXNvbHZlIHdoaWxlIHlvdSdyZSBvZmZsaW5lKS5cbiAqLyBmdW5jdGlvbiBwaCh0KSB7XG4gICAgcmV0dXJuIEFoKFRjKHQuZmlyZXN0b3JlLCBPYyksIFsgbmV3IGhuKHQuX2tleSwgSmUubm9uZSgpKSBdKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgZG9jdW1lbnQgdG8gc3BlY2lmaWVkIGBDb2xsZWN0aW9uUmVmZXJlbmNlYCB3aXRoIHRoZSBnaXZlbiBkYXRhLFxuICogYXNzaWduaW5nIGl0IGEgZG9jdW1lbnQgSUQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gQSByZWZlcmVuY2UgdG8gdGhlIGNvbGxlY3Rpb24gdG8gYWRkIHRoaXMgZG9jdW1lbnQgdG8uXG4gKiBAcGFyYW0gZGF0YSAtIEFuIE9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50LlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFJlZmVyZW5jZWAgcG9pbnRpbmcgdG8gdGhlXG4gKiBuZXdseSBjcmVhdGVkIGRvY3VtZW50IGFmdGVyIGl0IGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIGJhY2tlbmQgKE5vdGUgdGhhdCBpdFxuICogd29uJ3QgcmVzb2x2ZSB3aGlsZSB5b3UncmUgb2ZmbGluZSkuXG4gKi8gZnVuY3Rpb24gVGgodCwgZSkge1xuICAgIGNvbnN0IG4gPSBUYyh0LmZpcmVzdG9yZSwgT2MpLCBzID0gRGModCksIGkgPSBvaCh0LmNvbnZlcnRlciwgZSk7XG4gICAgcmV0dXJuIEFoKG4sIFsgbHUoaHUodC5maXJlc3RvcmUpLCBcImFkZERvY1wiLCBzLl9rZXksIGksIG51bGwgIT09IHQuY29udmVydGVyLCB7fSkudG9NdXRhdGlvbihzLl9rZXksIEplLmV4aXN0cyghMSkpIF0pLnRoZW4oKCgpID0+IHMpKTtcbn1cblxuZnVuY3Rpb24gRWgodCwgLi4uZSkge1xuICAgIHZhciBuLCBzLCBpO1xuICAgIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCk7XG4gICAgbGV0IHIgPSB7XG4gICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6ICExXG4gICAgfSwgbyA9IDA7XG4gICAgXCJvYmplY3RcIiAhPSB0eXBlb2YgZVtvXSB8fCB4YyhlW29dKSB8fCAociA9IGVbb10sIG8rKyk7XG4gICAgY29uc3QgYSA9IHtcbiAgICAgICAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlczogci5pbmNsdWRlTWV0YWRhdGFDaGFuZ2VzXG4gICAgfTtcbiAgICBpZiAoeGMoZVtvXSkpIHtcbiAgICAgICAgY29uc3QgdCA9IGVbb107XG4gICAgICAgIGVbb10gPSBudWxsID09PSAobiA9IHQubmV4dCkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi5iaW5kKHQpLCBlW28gKyAxXSA9IG51bGwgPT09IChzID0gdC5lcnJvcikgfHwgdm9pZCAwID09PSBzID8gdm9pZCAwIDogcy5iaW5kKHQpLCBcbiAgICAgICAgZVtvICsgMl0gPSBudWxsID09PSAoaSA9IHQuY29tcGxldGUpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuYmluZCh0KTtcbiAgICB9XG4gICAgbGV0IGMsIHUsIGg7XG4gICAgaWYgKHQgaW5zdGFuY2VvZiBQYykgdSA9IFRjKHQuZmlyZXN0b3JlLCBPYyksIGggPSBnZSh0Ll9rZXkucGF0aCksIGMgPSB7XG4gICAgICAgIG5leHQ6IG4gPT4ge1xuICAgICAgICAgICAgZVtvXSAmJiBlW29dKFJoKHUsIHQsIG4pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVbbyArIDFdLFxuICAgICAgICBjb21wbGV0ZTogZVtvICsgMl1cbiAgICB9OyBlbHNlIHtcbiAgICAgICAgY29uc3QgbiA9IFRjKHQsIGJjKTtcbiAgICAgICAgdSA9IFRjKG4uZmlyZXN0b3JlLCBPYyksIGggPSBuLl9xdWVyeTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBsaCh1KTtcbiAgICAgICAgYyA9IHtcbiAgICAgICAgICAgIG5leHQ6IHQgPT4ge1xuICAgICAgICAgICAgICAgIGVbb10gJiYgZVtvXShuZXcgRnUodSwgcywgbiwgdCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlW28gKyAxXSxcbiAgICAgICAgICAgIGNvbXBsZXRlOiBlW28gKyAyXVxuICAgICAgICB9LCBMdSh0Ll9xdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgcWEocyksIHIgPSBuZXcgem8oZSwgaSwgbik7XG4gICAgICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4gS28oYXdhaXQgZWModCksIHIpKSksICgpID0+IHtcbiAgICAgICAgICAgIGkubmEoKSwgdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGpvKGF3YWl0IGVjKHQpLCByKSkpO1xuICAgICAgICB9O1xuICAgIH0oQmModSksIGgsIGEsIGMpO1xufVxuXG5mdW5jdGlvbiBJaCh0LCBlKSB7XG4gICAgcmV0dXJuIGNjKEJjKHQgPSBUYyh0LCBPYykpLCB4YyhlKSA/IGUgOiB7XG4gICAgICAgIG5leHQ6IGVcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBMb2NhbGx5IHdyaXRlcyBgbXV0YXRpb25zYCBvbiB0aGUgYXN5bmMgcXVldWUuXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBBaCh0LCBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBRO1xuICAgICAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGNhKGF3YWl0IHRjKHQpLCBlLCBuKSkpLCBuLnByb21pc2U7XG4gICAgfShCYyh0KSwgZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB7QGxpbmsgVmlld1NuYXBzaG90fSB0aGF0IGNvbnRhaW5zIHRoZSBzaW5nbGUgZG9jdW1lbnQgc3BlY2lmaWVkIGJ5IGByZWZgXG4gKiB0byBhIHtAbGluayBEb2N1bWVudFNuYXBzaG90fS5cbiAqLyBmdW5jdGlvbiBSaCh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IG4uZG9jcy5nZXQoZS5fa2V5KSwgaSA9IG5ldyBsaCh0KTtcbiAgICByZXR1cm4gbmV3IHh1KHQsIGksIGUuX2tleSwgcywgbmV3IGt1KG4uaGFzUGVuZGluZ1dyaXRlcywgbi5mcm9tQ2FjaGUpLCBlLmNvbnZlcnRlcik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGBUcmFuc2FjdGlvbmAgb2JqZWN0IHBhc3NlZCB0byBhIHRyYW5zYWN0aW9uJ3MgYHVwZGF0ZUZ1bmN0aW9uYCBwcm92aWRlc1xuICogdGhlIG1ldGhvZHMgdG8gcmVhZCBhbmQgd3JpdGUgZGF0YSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQuIFNlZVxuICoge0BsaW5rIHJ1blRyYW5zYWN0aW9ufS5cbiAqLyBjbGFzcyBQaCBleHRlbmRzIGNsYXNzIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fdHJhbnNhY3Rpb24gPSBlLCB0aGlzLl9kYXRhUmVhZGVyID0gaHUodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIHJlYWQuXG4gICAgICogQHJldHVybnMgQSBgRG9jdW1lbnRTbmFwc2hvdGAgd2l0aCB0aGUgcmVhZCBkYXRhLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gdWgodCwgdGhpcy5fZmlyZXN0b3JlKSwgbiA9IG5ldyBhaCh0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24ubG9va3VwKFsgZS5fa2V5IF0pLnRoZW4oKHQgPT4ge1xuICAgICAgICAgICAgaWYgKCF0IHx8IDEgIT09IHQubGVuZ3RoKSByZXR1cm4gTCgpO1xuICAgICAgICAgICAgY29uc3QgcyA9IHRbMF07XG4gICAgICAgICAgICBpZiAocy5pc0ZvdW5kRG9jdW1lbnQoKSkgcmV0dXJuIG5ldyBEdSh0aGlzLl9maXJlc3RvcmUsIG4sIHMua2V5LCBzLCBlLmNvbnZlcnRlcik7XG4gICAgICAgICAgICBpZiAocy5pc05vRG9jdW1lbnQoKSkgcmV0dXJuIG5ldyBEdSh0aGlzLl9maXJlc3RvcmUsIG4sIGUuX2tleSwgbnVsbCwgZS5jb252ZXJ0ZXIpO1xuICAgICAgICAgICAgdGhyb3cgTCgpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNldCh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB1aCh0LCB0aGlzLl9maXJlc3RvcmUpLCBpID0gb2gocy5jb252ZXJ0ZXIsIGUsIG4pLCByID0gbHUodGhpcy5fZGF0YVJlYWRlciwgXCJUcmFuc2FjdGlvbi5zZXRcIiwgcy5fa2V5LCBpLCBudWxsICE9PSBzLmNvbnZlcnRlciwgbik7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbi5zZXQocy5fa2V5LCByKSwgdGhpcztcbiAgICB9XG4gICAgdXBkYXRlKHQsIGUsIG4sIC4uLnMpIHtcbiAgICAgICAgY29uc3QgaSA9IHVoKHQsIHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIC8vIEZvciBDb21wYXQgdHlwZXMsIHdlIGhhdmUgdG8gXCJleHRyYWN0XCIgdGhlIHVuZGVybHlpbmcgdHlwZXMgYmVmb3JlXG4gICAgICAgIC8vIHBlcmZvcm1pbmcgdmFsaWRhdGlvbi5cbiAgICAgICAgICAgICAgICBsZXQgcjtcbiAgICAgICAgcmV0dXJuIHIgPSBcInN0cmluZ1wiID09IHR5cGVvZiAoZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIFpjID8gcHUodGhpcy5fZGF0YVJlYWRlciwgXCJUcmFuc2FjdGlvbi51cGRhdGVcIiwgaS5fa2V5LCBlLCBuLCBzKSA6IHl1KHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24udXBkYXRlXCIsIGkuX2tleSwgZSksIFxuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbi51cGRhdGUoaS5fa2V5LCByKSwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhlIHByb3ZpZGVkIHtAbGluayBEb2N1bWVudFJlZmVyZW5jZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRSZWYgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcmV0dXJucyBUaGlzIGBUcmFuc2FjdGlvbmAgaW5zdGFuY2UuIFVzZWQgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxscy5cbiAgICAgKi8gICAgZGVsZXRlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHVoKHQsIHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbi5kZWxldGUoZS5fa2V5KSwgdGhpcztcbiAgICB9XG59IHtcbiAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHNhbWUgbG9naWMgYXMgdGhlIFRyYW5zYWN0aW9uIEFQSSBpbiB0aGUgTGl0ZSBTREtcbiAgICAvLyBidXQgaXMgc3ViY2xhc3NlZCBpbiBvcmRlciB0byByZXR1cm4gaXRzIG93biBEb2N1bWVudFNuYXBzaG90IHR5cGVzLlxuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBlKSwgdGhpcy5fZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIHByb3ZpZGVkIHtAbGluayBEb2N1bWVudFJlZmVyZW5jZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRSZWYgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gYmUgcmVhZC5cbiAgICAgKiBAcmV0dXJucyBBIGBEb2N1bWVudFNuYXBzaG90YCB3aXRoIHRoZSByZWFkIGRhdGEuXG4gICAgICovICAgIGdldCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB1aCh0LCB0aGlzLl9maXJlc3RvcmUpLCBuID0gbmV3IGxoKHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQodCkudGhlbigodCA9PiBuZXcgeHUodGhpcy5fZmlyZXN0b3JlLCBuLCBlLl9rZXksIHQuX2RvY3VtZW50LCBuZXcga3UoXG4gICAgICAgIC8qIGhhc1BlbmRpbmdXcml0ZXM9ICovICExLCBcbiAgICAgICAgLyogZnJvbUNhY2hlPSAqLyAhMSksIGUuY29udmVydGVyKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYHVwZGF0ZUZ1bmN0aW9uYCBhbmQgdGhlbiBhdHRlbXB0cyB0byBjb21taXQgdGhlIGNoYW5nZXNcbiAqIGFwcGxpZWQgd2l0aGluIHRoZSB0cmFuc2FjdGlvbi4gSWYgYW55IGRvY3VtZW50IHJlYWQgd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICogaGFzIGNoYW5nZWQsIENsb3VkIEZpcmVzdG9yZSByZXRyaWVzIHRoZSBgdXBkYXRlRnVuY3Rpb25gLiBJZiBpdCBmYWlscyB0b1xuICogY29tbWl0IGFmdGVyIDUgYXR0ZW1wdHMsIHRoZSB0cmFuc2FjdGlvbiBmYWlscy5cbiAqXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd3JpdGVzIGFsbG93ZWQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24gaXMgNTAwLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgRmlyZXN0b3JlIGRhdGFiYXNlIHRvIHJ1biB0aGlzXG4gKiB0cmFuc2FjdGlvbiBhZ2FpbnN0LlxuICogQHBhcmFtIHVwZGF0ZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICogY29udGV4dC5cbiAqIEByZXR1cm5zIElmIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IG9yIHdhcyBleHBsaWNpdGx5IGFib3J0ZWRcbiAqICh0aGUgYHVwZGF0ZUZ1bmN0aW9uYCByZXR1cm5lZCBhIGZhaWxlZCBwcm9taXNlKSwgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlXG4gKiBgdXBkYXRlRnVuY3Rpb24gYGlzIHJldHVybmVkIGhlcmUuIE90aGVyd2lzZSwgaWYgdGhlIHRyYW5zYWN0aW9uIGZhaWxlZCwgYVxuICogcmVqZWN0ZWQgcHJvbWlzZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZhaWx1cmUgZXJyb3IgaXMgcmV0dXJuZWQuXG4gKi8gZnVuY3Rpb24gYmgodCwgZSkge1xuICAgIHJldHVybiB1YyhCYyh0ID0gVGModCwgT2MpKSwgKG4gPT4gZShuZXcgUGgodCwgbikpKSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJldHVybnMgYSBzZW50aW5lbCBmb3IgdXNlIHdpdGgge0BsaW5rIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSModXBkYXRlRG9jOjEpfSBvclxuICoge0BsaW5rIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSMoc2V0RG9jOjEpfSB3aXRoIGB7bWVyZ2U6IHRydWV9YCB0byBtYXJrIGEgZmllbGQgZm9yIGRlbGV0aW9uLlxuICovIGZ1bmN0aW9uIHZoKCkge1xuICAgIHJldHVybiBuZXcgZnUoXCJkZWxldGVGaWVsZFwiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2VudGluZWwgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSModXBkYXRlRG9jOjEpfSB0b1xuICogaW5jbHVkZSBhIHNlcnZlci1nZW5lcmF0ZWQgdGltZXN0YW1wIGluIHRoZSB3cml0dGVuIGRhdGEuXG4gKi8gZnVuY3Rpb24gVmgoKSB7XG4gICAgcmV0dXJuIG5ldyB3dShcInNlcnZlclRpbWVzdGFtcFwiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3BlY2lhbCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGgge0BsaW5rIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSMoc2V0RG9jOjEpfSBvciB7QGxpbmtcbiAqIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSModXBkYXRlRG9jOjEpfSB0aGF0IHRlbGxzIHRoZSBzZXJ2ZXIgdG8gdW5pb24gdGhlIGdpdmVuIGVsZW1lbnRzIHdpdGggYW55IGFycmF5XG4gKiB2YWx1ZSB0aGF0IGFscmVhZHkgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIuIEVhY2ggc3BlY2lmaWVkIGVsZW1lbnQgdGhhdCBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0IGluIHRoZSBhcnJheSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQuIElmIHRoZSBmaWVsZCBiZWluZ1xuICogbW9kaWZpZWQgaXMgbm90IGFscmVhZHkgYW4gYXJyYXkgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGFuIGFycmF5XG4gKiBjb250YWluaW5nIGV4YWN0bHkgdGhlIHNwZWNpZmllZCBlbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudHMgLSBUaGUgZWxlbWVudHMgdG8gdW5pb24gaW50byB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWAuXG4gKi8gZnVuY3Rpb24gU2goLi4udCkge1xuICAgIC8vIE5PVEU6IFdlIGRvbid0IGFjdHVhbGx5IHBhcnNlIHRoZSBkYXRhIHVudGlsIGl0J3MgdXNlZCBpbiBzZXQoKSBvclxuICAgIC8vIHVwZGF0ZSgpIHNpbmNlIHdlJ2QgbmVlZCB0aGUgRmlyZXN0b3JlIGluc3RhbmNlIHRvIGRvIHRoaXMuXG4gICAgcmV0dXJuIG5ldyBfdShcImFycmF5VW5pb25cIiwgdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayAoc2V0RG9jOjEpfSBvciB7QGxpbmtcbiAqIHVwZGF0ZURvYzoxfSB0aGF0IHRlbGxzIHRoZSBzZXJ2ZXIgdG8gcmVtb3ZlIHRoZSBnaXZlbiBlbGVtZW50cyBmcm9tIGFueVxuICogYXJyYXkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc2VydmVyLiBBbGwgaW5zdGFuY2VzIG9mIGVhY2ggZWxlbWVudFxuICogc3BlY2lmaWVkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS4gSWYgdGhlIGZpZWxkIGJlaW5nIG1vZGlmaWVkIGlzIG5vdFxuICogYWxyZWFkeSBhbiBhcnJheSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggYW4gZW1wdHkgYXJyYXkuXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gVGhlIGVsZW1lbnRzIHRvIHJlbW92ZSBmcm9tIHRoZSBhcnJheS5cbiAqIEByZXR1cm5zIFRoZSBgRmllbGRWYWx1ZWAgc2VudGluZWwgZm9yIHVzZSBpbiBhIGNhbGwgdG8gYHNldERvYygpYCBvclxuICogYHVwZGF0ZURvYygpYFxuICovIGZ1bmN0aW9uIERoKC4uLnQpIHtcbiAgICAvLyBOT1RFOiBXZSBkb24ndCBhY3R1YWxseSBwYXJzZSB0aGUgZGF0YSB1bnRpbCBpdCdzIHVzZWQgaW4gc2V0KCkgb3JcbiAgICAvLyB1cGRhdGUoKSBzaW5jZSB3ZSdkIG5lZWQgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZSB0byBkbyB0aGlzLlxuICAgIHJldHVybiBuZXcgbXUoXCJhcnJheVJlbW92ZVwiLCB0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3BlY2lhbCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGgge0BsaW5rIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSMoc2V0RG9jOjEpfSBvciB7QGxpbmtcbiAqIEBmaXJlYmFzZS9maXJlc3RvcmUvbGl0ZSModXBkYXRlRG9jOjEpfSB0aGF0IHRlbGxzIHRoZSBzZXJ2ZXIgdG8gaW5jcmVtZW50IHRoZSBmaWVsZCdzIGN1cnJlbnQgdmFsdWUgYnlcbiAqIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBJZiBlaXRoZXIgdGhlIG9wZXJhbmQgb3IgdGhlIGN1cnJlbnQgZmllbGQgdmFsdWUgdXNlcyBmbG9hdGluZyBwb2ludFxuICogcHJlY2lzaW9uLCBhbGwgYXJpdGhtZXRpYyBmb2xsb3dzIElFRUUgNzU0IHNlbWFudGljcy4gSWYgYm90aCB2YWx1ZXMgYXJlXG4gKiBpbnRlZ2VycywgdmFsdWVzIG91dHNpZGUgb2YgSmF2YVNjcmlwdCdzIHNhZmUgbnVtYmVyIHJhbmdlXG4gKiAoYE51bWJlci5NSU5fU0FGRV9JTlRFR0VSYCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgKSBhcmUgYWxzbyBzdWJqZWN0IHRvXG4gKiBwcmVjaXNpb24gbG9zcy4gRnVydGhlcm1vcmUsIG9uY2UgcHJvY2Vzc2VkIGJ5IHRoZSBGaXJlc3RvcmUgYmFja2VuZCwgYWxsXG4gKiBpbnRlZ2VyIG9wZXJhdGlvbnMgYXJlIGNhcHBlZCBiZXR3ZWVuIC0yXjYzIGFuZCAyXjYzLTEuXG4gKlxuICogSWYgdGhlIGN1cnJlbnQgZmllbGQgdmFsdWUgaXMgbm90IG9mIHR5cGUgYG51bWJlcmAsIG9yIGlmIHRoZSBmaWVsZCBkb2VzIG5vdFxuICogeWV0IGV4aXN0LCB0aGUgdHJhbnNmb3JtYXRpb24gc2V0cyB0aGUgZmllbGQgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBuIC0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIFRoZSBgRmllbGRWYWx1ZWAgc2VudGluZWwgZm9yIHVzZSBpbiBhIGNhbGwgdG8gYHNldERvYygpYCBvclxuICogYHVwZGF0ZURvYygpYFxuICovIGZ1bmN0aW9uIENoKHQpIHtcbiAgICByZXR1cm4gbmV3IGd1KFwiaW5jcmVtZW50XCIsIHQpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDcmVhdGVzIGEgd3JpdGUgYmF0Y2gsIHVzZWQgZm9yIHBlcmZvcm1pbmcgbXVsdGlwbGUgd3JpdGVzIGFzIGEgc2luZ2xlXG4gKiBhdG9taWMgb3BlcmF0aW9uLiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygd3JpdGVzIGFsbG93ZWQgaW4gYSBzaW5nbGUge0BsaW5rIFdyaXRlQmF0Y2h9XG4gKiBpcyA1MDAuXG4gKlxuICogVW5saWtlIHRyYW5zYWN0aW9ucywgd3JpdGUgYmF0Y2hlcyBhcmUgcGVyc2lzdGVkIG9mZmxpbmUgYW5kIHRoZXJlZm9yZSBhcmVcbiAqIHByZWZlcmFibGUgd2hlbiB5b3UgZG9uJ3QgbmVlZCB0byBjb25kaXRpb24geW91ciB3cml0ZXMgb24gcmVhZCBkYXRhLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFdyaXRlQmF0Y2h9IHRoYXQgY2FuIGJlIHVzZWQgdG8gYXRvbWljYWxseSBleGVjdXRlIG11bHRpcGxlXG4gKiB3cml0ZXMuXG4gKi8gZnVuY3Rpb24gTmgodCkge1xuICAgIHJldHVybiBCYyh0ID0gVGModCwgT2MpKSwgbmV3IGNoKHQsIChlID0+IEFoKHQsIGUpKSk7XG59XG5cbi8qKlxuICogQ2xvdWQgRmlyZXN0b3JlXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi8gIWZ1bmN0aW9uKHQsIGUgPSAhMCkge1xuICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgIEMgPSB0O1xuICAgIH0oU0RLX1ZFUlNJT04pLCBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudChcImZpcmVzdG9yZVwiLCAoKHQsIHtvcHRpb25zOiBufSkgPT4ge1xuICAgICAgICBjb25zdCBzID0gdC5nZXRQcm92aWRlcihcImFwcFwiKS5nZXRJbW1lZGlhdGUoKSwgaSA9IG5ldyBPYyhzLCBuZXcgSCh0LmdldFByb3ZpZGVyKFwiYXV0aC1pbnRlcm5hbFwiKSksIG5ldyBaKHQuZ2V0UHJvdmlkZXIoXCJhcHAtY2hlY2staW50ZXJuYWxcIikpKTtcbiAgICAgICAgcmV0dXJuIG4gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHVzZUZldGNoU3RyZWFtczogZVxuICAgICAgICB9LCBuKSwgaS5fc2V0U2V0dGluZ3MobiksIGk7XG4gICAgfSksIFwiUFVCTElDXCIpKSwgcmVnaXN0ZXJWZXJzaW9uKFMsIFwiMy40LjFcIiwgdCksIFxuICAgIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXG4gICAgcmVnaXN0ZXJWZXJzaW9uKFMsIFwiMy40LjFcIiwgXCJlc20yMDE3XCIpO1xufSgpO1xuXG5leHBvcnQgeyByaCBhcyBBYnN0cmFjdFVzZXJEYXRhV3JpdGVyLCBldSBhcyBCeXRlcywgRmMgYXMgQ0FDSEVfU0laRV9VTkxJTUlURUQsIHZjIGFzIENvbGxlY3Rpb25SZWZlcmVuY2UsIFBjIGFzIERvY3VtZW50UmVmZXJlbmNlLCB4dSBhcyBEb2N1bWVudFNuYXBzaG90LCBaYyBhcyBGaWVsZFBhdGgsIG51IGFzIEZpZWxkVmFsdWUsIE9jIGFzIEZpcmVzdG9yZSwgaiBhcyBGaXJlc3RvcmVFcnJvciwgc3UgYXMgR2VvUG9pbnQsICRjIGFzIExvYWRCdW5kbGVUYXNrLCBiYyBhcyBRdWVyeSwgQnUgYXMgUXVlcnlDb25zdHJhaW50LCAkdSBhcyBRdWVyeURvY3VtZW50U25hcHNob3QsIEZ1IGFzIFF1ZXJ5U25hcHNob3QsIGt1IGFzIFNuYXBzaG90TWV0YWRhdGEsIGF0IGFzIFRpbWVzdGFtcCwgUGggYXMgVHJhbnNhY3Rpb24sIGNoIGFzIFdyaXRlQmF0Y2gsIGRjIGFzIF9EYXRhYmFzZUlkLCBTdCBhcyBfRG9jdW1lbnRLZXksIHR0IGFzIF9FbXB0eUFwcENoZWNrVG9rZW5Qcm92aWRlciwgRyBhcyBfRW1wdHlBdXRoQ3JlZGVudGlhbHNQcm92aWRlciwgX3QgYXMgX0ZpZWxkUGF0aCwgVGMgYXMgX2Nhc3QsIFUgYXMgX2RlYnVnQXNzZXJ0LCBndCBhcyBfaXNCYXNlNjRBdmFpbGFibGUsIE8gYXMgX2xvZ1dhcm4sIG1jIGFzIF92YWxpZGF0ZUlzTm90VXNlZFRvZ2V0aGVyLCBUaCBhcyBhZGREb2MsIERoIGFzIGFycmF5UmVtb3ZlLCBTaCBhcyBhcnJheVVuaW9uLCBRYyBhcyBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlLCBWYyBhcyBjb2xsZWN0aW9uLCBTYyBhcyBjb2xsZWN0aW9uR3JvdXAsIFJjIGFzIGNvbm5lY3RGaXJlc3RvcmVFbXVsYXRvciwgcGggYXMgZGVsZXRlRG9jLCB2aCBhcyBkZWxldGVGaWVsZCwgemMgYXMgZGlzYWJsZU5ldHdvcmssIERjIGFzIGRvYywgdHUgYXMgZG9jdW1lbnRJZCwgcWMgYXMgZW5hYmxlSW5kZXhlZERiUGVyc2lzdGVuY2UsIEtjIGFzIGVuYWJsZU11bHRpVGFiSW5kZXhlZERiUGVyc2lzdGVuY2UsIEdjIGFzIGVuYWJsZU5ldHdvcmssIHRoIGFzIGVuZEF0LCBadSBhcyBlbmRCZWZvcmUsIEJjIGFzIGVuc3VyZUZpcmVzdG9yZUNvbmZpZ3VyZWQsIEFoIGFzIGV4ZWN1dGVXcml0ZSwgaGggYXMgZ2V0RG9jLCBmaCBhcyBnZXREb2NGcm9tQ2FjaGUsIGRoIGFzIGdldERvY0Zyb21TZXJ2ZXIsIHdoIGFzIGdldERvY3MsIF9oIGFzIGdldERvY3NGcm9tQ2FjaGUsIG1oIGFzIGdldERvY3NGcm9tU2VydmVyLCBMYyBhcyBnZXRGaXJlc3RvcmUsIENoIGFzIGluY3JlbWVudCwgTWMgYXMgaW5pdGlhbGl6ZUZpcmVzdG9yZSwgR3UgYXMgbGltaXQsIHp1IGFzIGxpbWl0VG9MYXN0LCBKYyBhcyBsb2FkQnVuZGxlLCBZYyBhcyBuYW1lZFF1ZXJ5LCBFaCBhcyBvblNuYXBzaG90LCBJaCBhcyBvblNuYXBzaG90c0luU3luYywgUXUgYXMgb3JkZXJCeSwgVXUgYXMgcXVlcnksIE5jIGFzIHF1ZXJ5RXF1YWwsIENjIGFzIHJlZkVxdWFsLCBiaCBhcyBydW5UcmFuc2FjdGlvbiwgVmggYXMgc2VydmVyVGltZXN0YW1wLCBnaCBhcyBzZXREb2MsIHggYXMgc2V0TG9nTGV2ZWwsIE11IGFzIHNuYXBzaG90RXF1YWwsIFl1IGFzIHN0YXJ0QWZ0ZXIsIEp1IGFzIHN0YXJ0QXQsIEhjIGFzIHRlcm1pbmF0ZSwgeWggYXMgdXBkYXRlRG9jLCBXYyBhcyB3YWl0Rm9yUGVuZGluZ1dyaXRlcywgS3UgYXMgd2hlcmUsIE5oIGFzIHdyaXRlQmF0Y2ggfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9nZ2VyLCBzZXRVc2VyTG9nSGFuZGxlciwgc2V0TG9nTGV2ZWwgYXMgc2V0TG9nTGV2ZWwkMSB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBkZWVwRXF1YWwgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5leHBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgLy8gSW4gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBieSBpbnN0YWxsYXRpb25zIG9uXHJcbiAgICAvLyBhdXRoIHRva2VuIHJlZnJlc2gsIGFuZCBpbnN0YWxsYXRpb25zIHdpbGwgc2VuZCB0aGlzIHN0cmluZy5cclxuICAgIGdldFBsYXRmb3JtSW5mb1N0cmluZygpIHtcclxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcnMoKTtcclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggcHJvdmlkZXJzIGFuZCBnZXQgbGlicmFyeS92ZXJzaW9uIHBhaXJzIGZyb20gYW55IHRoYXQgYXJlXHJcbiAgICAgICAgLy8gdmVyc2lvbiBjb21wb25lbnRzLlxyXG4gICAgICAgIHJldHVybiBwcm92aWRlcnNcclxuICAgICAgICAgICAgLm1hcChwcm92aWRlciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7c2VydmljZS5saWJyYXJ5fS8ke3NlcnZpY2UudmVyc2lvbn1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKGxvZ1N0cmluZyA9PiBsb2dTdHJpbmcpXHJcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBwcm92aWRlciBjaGVjayBpZiB0aGlzIHByb3ZpZGVyIHByb3ZpZGVzIGEgVmVyc2lvblNlcnZpY2VcclxuICpcclxuICogTk9URTogVXNpbmcgUHJvdmlkZXI8J2FwcC12ZXJzaW9uJz4gaXMgYSBoYWNrIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVyXHJcbiAqIHByb3ZpZGVzIFZlcnNpb25TZXJ2aWNlLiBUaGUgcHJvdmlkZXIgaXMgbm90IG5lY2Vzc2FyaWx5IGEgJ2FwcC12ZXJzaW9uJ1xyXG4gKiBwcm92aWRlci5cclxuICovXHJcbmZ1bmN0aW9uIGlzVmVyc2lvblNlcnZpY2VQcm92aWRlcihwcm92aWRlcikge1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50KCk7XHJcbiAgICByZXR1cm4gKGNvbXBvbmVudCA9PT0gbnVsbCB8fCBjb21wb25lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBvbmVudC50eXBlKSA9PT0gXCJWRVJTSU9OXCIgLyogVkVSU0lPTiAqLztcclxufVxuXG5jb25zdCBuYW1lJG8gPSBcIkBmaXJlYmFzZS9hcHBcIjtcbmNvbnN0IHZlcnNpb24kMSA9IFwiMC43LjExXCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hcHAnKTtcblxuY29uc3QgbmFtZSRuID0gXCJAZmlyZWJhc2UvYXBwLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJG0gPSBcIkBmaXJlYmFzZS9hbmFseXRpY3MtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkbCA9IFwiQGZpcmViYXNlL2FuYWx5dGljc1wiO1xuXG5jb25zdCBuYW1lJGsgPSBcIkBmaXJlYmFzZS9hcHAtY2hlY2stY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkaiA9IFwiQGZpcmViYXNlL2FwcC1jaGVja1wiO1xuXG5jb25zdCBuYW1lJGkgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG5cbmNvbnN0IG5hbWUkaCA9IFwiQGZpcmViYXNlL2F1dGgtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkZyA9IFwiQGZpcmViYXNlL2RhdGFiYXNlXCI7XG5cbmNvbnN0IG5hbWUkZiA9IFwiQGZpcmViYXNlL2RhdGFiYXNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGUgPSBcIkBmaXJlYmFzZS9mdW5jdGlvbnNcIjtcblxuY29uc3QgbmFtZSRkID0gXCJAZmlyZWJhc2UvZnVuY3Rpb25zLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGMgPSBcIkBmaXJlYmFzZS9pbnN0YWxsYXRpb25zXCI7XG5cbmNvbnN0IG5hbWUkYiA9IFwiQGZpcmViYXNlL2luc3RhbGxhdGlvbnMtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkYSA9IFwiQGZpcmViYXNlL21lc3NhZ2luZ1wiO1xuXG5jb25zdCBuYW1lJDkgPSBcIkBmaXJlYmFzZS9tZXNzYWdpbmctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkOCA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlXCI7XG5cbmNvbnN0IG5hbWUkNyA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJDYgPSBcIkBmaXJlYmFzZS9yZW1vdGUtY29uZmlnXCI7XG5cbmNvbnN0IG5hbWUkNSA9IFwiQGZpcmViYXNlL3JlbW90ZS1jb25maWctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkNCA9IFwiQGZpcmViYXNlL3N0b3JhZ2VcIjtcblxuY29uc3QgbmFtZSQzID0gXCJAZmlyZWJhc2Uvc3RvcmFnZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSQyID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbmNvbnN0IG5hbWUkMSA9IFwiQGZpcmViYXNlL2ZpcmVzdG9yZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbmNvbnN0IHZlcnNpb24gPSBcIjkuNi4xXCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBhcHAgbmFtZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xyXG5jb25zdCBQTEFURk9STV9MT0dfU1RSSU5HID0ge1xyXG4gICAgW25hbWUkb106ICdmaXJlLWNvcmUnLFxyXG4gICAgW25hbWUkbl06ICdmaXJlLWNvcmUtY29tcGF0JyxcclxuICAgIFtuYW1lJGxdOiAnZmlyZS1hbmFseXRpY3MnLFxyXG4gICAgW25hbWUkbV06ICdmaXJlLWFuYWx5dGljcy1jb21wYXQnLFxyXG4gICAgW25hbWUkal06ICdmaXJlLWFwcC1jaGVjaycsXHJcbiAgICBbbmFtZSRrXTogJ2ZpcmUtYXBwLWNoZWNrLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRpXTogJ2ZpcmUtYXV0aCcsXHJcbiAgICBbbmFtZSRoXTogJ2ZpcmUtYXV0aC1jb21wYXQnLFxyXG4gICAgW25hbWUkZ106ICdmaXJlLXJ0ZGInLFxyXG4gICAgW25hbWUkZl06ICdmaXJlLXJ0ZGItY29tcGF0JyxcclxuICAgIFtuYW1lJGVdOiAnZmlyZS1mbicsXHJcbiAgICBbbmFtZSRkXTogJ2ZpcmUtZm4tY29tcGF0JyxcclxuICAgIFtuYW1lJGNdOiAnZmlyZS1paWQnLFxyXG4gICAgW25hbWUkYl06ICdmaXJlLWlpZC1jb21wYXQnLFxyXG4gICAgW25hbWUkYV06ICdmaXJlLWZjbScsXHJcbiAgICBbbmFtZSQ5XTogJ2ZpcmUtZmNtLWNvbXBhdCcsXHJcbiAgICBbbmFtZSQ4XTogJ2ZpcmUtcGVyZicsXHJcbiAgICBbbmFtZSQ3XTogJ2ZpcmUtcGVyZi1jb21wYXQnLFxyXG4gICAgW25hbWUkNl06ICdmaXJlLXJjJyxcclxuICAgIFtuYW1lJDVdOiAnZmlyZS1yYy1jb21wYXQnLFxyXG4gICAgW25hbWUkNF06ICdmaXJlLWdjcycsXHJcbiAgICBbbmFtZSQzXTogJ2ZpcmUtZ2NzLWNvbXBhdCcsXHJcbiAgICBbbmFtZSQyXTogJ2ZpcmUtZnN0JyxcclxuICAgIFtuYW1lJDFdOiAnZmlyZS1mc3QtY29tcGF0JyxcclxuICAgICdmaXJlLWpzJzogJ2ZpcmUtanMnLFxyXG4gICAgW25hbWVdOiAnZmlyZS1qcy1hbGwnXHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IF9hcHBzID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogUmVnaXN0ZXJlZCBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmNvbnN0IF9jb21wb25lbnRzID0gbmV3IE1hcCgpO1xyXG4vKipcclxuICogQHBhcmFtIGNvbXBvbmVudCAtIHRoZSBjb21wb25lbnQgYmVpbmcgYWRkZWQgdG8gdGhpcyBhcHAncyBjb250YWluZXJcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfYWRkQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGFwcC5jb250YWluZXIuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29tcG9uZW50ICR7Y29tcG9uZW50Lm5hbWV9IGZhaWxlZCB0byByZWdpc3RlciB3aXRoIEZpcmViYXNlQXBwICR7YXBwLm5hbWV9YCwgZSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KSB7XHJcbiAgICBhcHAuY29udGFpbmVyLmFkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyXHJcbiAqIEByZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBjb21wb25lbnQgaXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICBpZiAoX2NvbXBvbmVudHMuaGFzKGNvbXBvbmVudE5hbWUpKSB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBUaGVyZSB3ZXJlIG11bHRpcGxlIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCAke2NvbXBvbmVudE5hbWV9LmApO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIF9jb21wb25lbnRzLnNldChjb21wb25lbnROYW1lLCBjb21wb25lbnQpO1xyXG4gICAgLy8gYWRkIHRoZSBjb21wb25lbnQgdG8gZXhpc3RpbmcgYXBwIGluc3RhbmNlc1xyXG4gICAgZm9yIChjb25zdCBhcHAgb2YgX2FwcHMudmFsdWVzKCkpIHtcclxuICAgICAgICBfYWRkQ29tcG9uZW50KGFwcCwgY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcclxuICogQHBhcmFtIG5hbWUgLSBzZXJ2aWNlIG5hbWVcclxuICpcclxuICogQHJldHVybnMgdGhlIHByb3ZpZGVyIGZvciB0aGUgc2VydmljZSB3aXRoIHRoZSBtYXRjaGluZyBuYW1lXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkge1xyXG4gICAgcmV0dXJuIGFwcC5jb250YWluZXIuZ2V0UHJvdmlkZXIobmFtZSk7XHJcbn1cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBhcHAgLSBGaXJlYmFzZUFwcCBpbnN0YW5jZVxyXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxyXG4gKiBAcGFyYW0gaW5zdGFuY2VJZGVudGlmaWVyIC0gc2VydmljZSBpbnN0YW5jZSBpZGVudGlmaWVyIGluIGNhc2UgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgaW5zdGFuY2VzXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX3JlbW92ZVNlcnZpY2VJbnN0YW5jZShhcHAsIG5hbWUsIGluc3RhbmNlSWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkuY2xlYXJJbnN0YW5jZShpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG59XHJcbi8qKlxyXG4gKiBUZXN0IG9ubHlcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2xlYXJDb21wb25lbnRzKCkge1xyXG4gICAgX2NvbXBvbmVudHMuY2xlYXIoKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBFUlJPUlMgPSB7XHJcbiAgICBbXCJuby1hcHBcIiAvKiBOT19BUFAgKi9dOiBcIk5vIEZpcmViYXNlIEFwcCAneyRhcHBOYW1lfScgaGFzIGJlZW4gY3JlYXRlZCAtIFwiICtcclxuICAgICAgICAnY2FsbCBGaXJlYmFzZSBBcHAuaW5pdGlhbGl6ZUFwcCgpJyxcclxuICAgIFtcImJhZC1hcHAtbmFtZVwiIC8qIEJBRF9BUFBfTkFNRSAqL106IFwiSWxsZWdhbCBBcHAgbmFtZTogJ3skYXBwTmFtZX1cIixcclxuICAgIFtcImR1cGxpY2F0ZS1hcHBcIiAvKiBEVVBMSUNBVEVfQVBQICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgb3IgY29uZmlnXCIsXHJcbiAgICBbXCJhcHAtZGVsZXRlZFwiIC8qIEFQUF9ERUxFVEVEICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZGVsZXRlZFwiLFxyXG4gICAgW1wiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBJTlZBTElEX0FQUF9BUkdVTUVOVCAqL106ICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXHJcbiAgICAgICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nLFxyXG4gICAgW1wiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBJTlZBTElEX0xPR19BUkdVTUVOVCAqL106ICdGaXJzdCBhcmd1bWVudCB0byBgb25Mb2dgIG11c3QgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLidcclxufTtcclxuY29uc3QgRVJST1JfRkFDVE9SWSA9IG5ldyBFcnJvckZhY3RvcnkoJ2FwcCcsICdGaXJlYmFzZScsIEVSUk9SUyk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEZpcmViYXNlQXBwSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb25maWcsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuX2lzRGVsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcclxuICAgICAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPVxyXG4gICAgICAgICAgICBjb25maWcuYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudCgnYXBwJywgKCkgPT4gdGhpcywgXCJQVUJMSUNcIiAvKiBQVUJMSUMgKi8pKTtcclxuICAgIH1cclxuICAgIGdldCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKHZhbCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XHJcbiAgICB9XHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBnZXQgY29uZmlnKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgZ2V0IGlzRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNEZWxldGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGlzRGVsZXRlZCh2YWwpIHtcclxuICAgICAgICB0aGlzLl9pc0RlbGV0ZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBFcnJvciBpZiB0aGUgQXBwIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZCAtXHJcbiAgICAgKiB1c2UgYmVmb3JlIHBlcmZvcm1pbmcgQVBJIGFjdGlvbnMgb24gdGhlIEFwcC5cclxuICAgICAqL1xyXG4gICAgY2hlY2tEZXN0cm95ZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiYXBwLWRlbGV0ZWRcIiAvKiBBUFBfREVMRVRFRCAqLywgeyBhcHBOYW1lOiB0aGlzLl9uYW1lIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGN1cnJlbnQgU0RLIHZlcnNpb24uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IFNES19WRVJTSU9OID0gdmVyc2lvbjtcclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChvcHRpb25zLCByYXdDb25maWcgPSB7fSkge1xyXG4gICAgaWYgKHR5cGVvZiByYXdDb25maWcgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHJhd0NvbmZpZztcclxuICAgICAgICByYXdDb25maWcgPSB7IG5hbWUgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lOiBERUZBVUxUX0VOVFJZX05BTUUsIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogZmFsc2UgfSwgcmF3Q29uZmlnKTtcclxuICAgIGNvbnN0IG5hbWUgPSBjb25maWcubmFtZTtcclxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgIW5hbWUpIHtcclxuICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImJhZC1hcHAtbmFtZVwiIC8qIEJBRF9BUFBfTkFNRSAqLywge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBTdHJpbmcobmFtZSlcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV4aXN0aW5nQXBwID0gX2FwcHMuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKGV4aXN0aW5nQXBwKSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBleGlzdGluZyBhcHAgaWYgb3B0aW9ucyBhbmQgY29uZmlnIGRlZXAgZXF1YWwgdGhlIG9uZXMgaW4gdGhlIGV4aXN0aW5nIGFwcC5cclxuICAgICAgICBpZiAoZGVlcEVxdWFsKG9wdGlvbnMsIGV4aXN0aW5nQXBwLm9wdGlvbnMpICYmXHJcbiAgICAgICAgICAgIGRlZXBFcXVhbChjb25maWcsIGV4aXN0aW5nQXBwLmNvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQXBwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJkdXBsaWNhdGUtYXBwXCIgLyogRFVQTElDQVRFX0FQUCAqLywgeyBhcHBOYW1lOiBuYW1lIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIobmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfY29tcG9uZW50cy52YWx1ZXMoKSkge1xyXG4gICAgICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0FwcCA9IG5ldyBGaXJlYmFzZUFwcEltcGwob3B0aW9ucywgY29uZmlnLCBjb250YWluZXIpO1xyXG4gICAgX2FwcHMuc2V0KG5hbWUsIG5ld0FwcCk7XHJcbiAgICByZXR1cm4gbmV3QXBwO1xyXG59XHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgYSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuIFdoZW4gYW4gYXBwIG5hbWVcclxuICogaXMgcHJvdmlkZWQsIHRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXHJcbiAqXHJcbiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGFwcCBiZWluZyByZXRyaWV2ZWQgaGFzIG5vdCB5ZXQgYmVlblxyXG4gKiBpbml0aWFsaXplZC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgYXBwXHJcbiAqIGNvbnN0IGFwcCA9IGdldEFwcCgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBSZXR1cm4gYSBuYW1lZCBhcHBcclxuICogY29uc3Qgb3RoZXJBcHAgPSBnZXRBcHAoXCJvdGhlckFwcFwiKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgYXBwIHRvIHJldHVybi4gSWYgbm8gbmFtZSBpc1xyXG4gKiAgIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyBgXCJbREVGQVVMVF1cImAuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYXBwIG5hbWUuXHJcbiAqICAgSWYgbm8gYXBwIG5hbWUgaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFwcCBpcyByZXR1cm5lZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXBwKG5hbWUgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgIGNvbnN0IGFwcCA9IF9hcHBzLmdldChuYW1lKTtcclxuICAgIGlmICghYXBwKSB7XHJcbiAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJuby1hcHBcIiAvKiBOT19BUFAgKi8sIHsgYXBwTmFtZTogbmFtZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcHA7XHJcbn1cclxuLyoqXHJcbiAqIEEgKHJlYWQtb25seSkgYXJyYXkgb2YgYWxsIGluaXRpYWxpemVkIGFwcHMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldEFwcHMoKSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfYXBwcy52YWx1ZXMoKSk7XHJcbn1cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBhcHAgdW51c2FibGUgYW5kIGZyZWVzIHRoZSByZXNvdXJjZXMgb2YgYWxsIGFzc29jaWF0ZWRcclxuICogc2VydmljZXMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZGVsZXRlQXBwKGFwcClcclxuICogICAudGhlbihmdW5jdGlvbigpIHtcclxuICogICAgIGNvbnNvbGUubG9nKFwiQXBwIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gKiAgIH0pXHJcbiAqICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XHJcbiAqICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGRlbGV0aW5nIGFwcDpcIiwgZXJyb3IpO1xyXG4gKiAgIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQXBwKGFwcCkge1xyXG4gICAgY29uc3QgbmFtZSA9IGFwcC5uYW1lO1xyXG4gICAgaWYgKF9hcHBzLmhhcyhuYW1lKSkge1xyXG4gICAgICAgIF9hcHBzLmRlbGV0ZShuYW1lKTtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhcHAuY29udGFpbmVyXHJcbiAgICAgICAgICAgIC5nZXRQcm92aWRlcnMoKVxyXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyID0+IHByb3ZpZGVyLmRlbGV0ZSgpKSk7XHJcbiAgICAgICAgYXBwLmlzRGVsZXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyBhIGxpYnJhcnkncyBuYW1lIGFuZCB2ZXJzaW9uIGZvciBwbGF0Zm9ybSBsb2dnaW5nIHB1cnBvc2VzLlxyXG4gKiBAcGFyYW0gbGlicmFyeSAtIE5hbWUgb2YgMXAgb3IgM3AgbGlicmFyeSAoZS5nLiBmaXJlc3RvcmUsIGFuZ3VsYXJmaXJlKVxyXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGF0IGxpYnJhcnkuXHJcbiAqIEBwYXJhbSB2YXJpYW50IC0gQnVuZGxlIHZhcmlhbnQsIGUuZy4sIG5vZGUsIHJuLCBldGMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyVmVyc2lvbihsaWJyYXJ5S2V5T3JOYW1lLCB2ZXJzaW9uLCB2YXJpYW50KSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICAvLyBUT0RPOiBXZSBjYW4gdXNlIHRoaXMgY2hlY2sgdG8gd2hpdGVsaXN0IHN0cmluZ3Mgd2hlbi9pZiB3ZSBzZXQgdXBcclxuICAgIC8vIGEgZ29vZCB3aGl0ZWxpc3Qgc3lzdGVtLlxyXG4gICAgbGV0IGxpYnJhcnkgPSAoX2EgPSBQTEFURk9STV9MT0dfU1RSSU5HW2xpYnJhcnlLZXlPck5hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBsaWJyYXJ5S2V5T3JOYW1lO1xyXG4gICAgaWYgKHZhcmlhbnQpIHtcclxuICAgICAgICBsaWJyYXJ5ICs9IGAtJHt2YXJpYW50fWA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsaWJyYXJ5TWlzbWF0Y2ggPSBsaWJyYXJ5Lm1hdGNoKC9cXHN8XFwvLyk7XHJcbiAgICBjb25zdCB2ZXJzaW9uTWlzbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKC9cXHN8XFwvLyk7XHJcbiAgICBpZiAobGlicmFyeU1pc21hdGNoIHx8IHZlcnNpb25NaXNtYXRjaCkge1xyXG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBbXHJcbiAgICAgICAgICAgIGBVbmFibGUgdG8gcmVnaXN0ZXIgbGlicmFyeSBcIiR7bGlicmFyeX1cIiB3aXRoIHZlcnNpb24gXCIke3ZlcnNpb259XCI6YFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgaWYgKGxpYnJhcnlNaXNtYXRjaCkge1xyXG4gICAgICAgICAgICB3YXJuaW5nLnB1c2goYGxpYnJhcnkgbmFtZSBcIiR7bGlicmFyeX1cIiBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMgKHdoaXRlc3BhY2Ugb3IgXCIvXCIpYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2ggJiYgdmVyc2lvbk1pc21hdGNoKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmcucHVzaCgnYW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2ZXJzaW9uTWlzbWF0Y2gpIHtcclxuICAgICAgICAgICAgd2FybmluZy5wdXNoKGB2ZXJzaW9uIG5hbWUgXCIke3ZlcnNpb259XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2dnZXIud2Fybih3YXJuaW5nLmpvaW4oJyAnKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoYCR7bGlicmFyeX0tdmVyc2lvbmAsICgpID0+ICh7IGxpYnJhcnksIHZlcnNpb24gfSksIFwiVkVSU0lPTlwiIC8qIFZFUlNJT04gKi8pKTtcclxufVxyXG4vKipcclxuICogU2V0cyBsb2cgaGFuZGxlciBmb3IgYWxsIEZpcmViYXNlIFNES3MuXHJcbiAqIEBwYXJhbSBsb2dDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGN1c3RvbSBsb2cgaGFuZGxlciB0aGF0IGV4ZWN1dGVzIHVzZXIgY29kZSB3aGVuZXZlclxyXG4gKiB0aGUgRmlyZWJhc2UgU0RLIG1ha2VzIGEgbG9nZ2luZyBjYWxsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBvbkxvZyhsb2dDYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgaWYgKGxvZ0NhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBsb2dDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBJTlZBTElEX0xPR19BUkdVTUVOVCAqLyk7XHJcbiAgICB9XHJcbiAgICBzZXRVc2VyTG9nSGFuZGxlcihsb2dDYWxsYmFjaywgb3B0aW9ucyk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgbG9nIGxldmVsIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cclxuICpcclxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFyZSBjYXB0dXJlZCAoaS5lLiBpZlxyXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYGluZm9gLCBlcnJvcnMgYXJlIGxvZ2dlZCwgYnV0IGBkZWJ1Z2AgYW5kXHJcbiAqIGB2ZXJib3NlYCBsb2dzIGFyZSBub3QpLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRMb2dMZXZlbChsb2dMZXZlbCkge1xyXG4gICAgc2V0TG9nTGV2ZWwkMShsb2dMZXZlbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVnaXN0ZXJDb3JlQ29tcG9uZW50cyh2YXJpYW50KSB7XHJcbiAgICBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudCgncGxhdGZvcm0tbG9nZ2VyJywgY29udGFpbmVyID0+IG5ldyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsKGNvbnRhaW5lciksIFwiUFJJVkFURVwiIC8qIFBSSVZBVEUgKi8pKTtcclxuICAgIC8vIFJlZ2lzdGVyIGBhcHBgIHBhY2thZ2UuXHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSRvLCB2ZXJzaW9uJDEsIHZhcmlhbnQpO1xyXG4gICAgLy8gQlVJTERfVEFSR0VUIHdpbGwgYmUgcmVwbGFjZWQgYnkgdmFsdWVzIGxpa2UgZXNtNSwgZXNtMjAxNywgY2pzNSwgZXRjIGR1cmluZyB0aGUgY29tcGlsYXRpb25cclxuICAgIHJlZ2lzdGVyVmVyc2lvbihuYW1lJG8sIHZlcnNpb24kMSwgJ2VzbTIwMTcnKTtcclxuICAgIC8vIFJlZ2lzdGVyIHBsYXRmb3JtIFNESyBpZGVudGlmaWVyIChubyB2ZXJzaW9uKS5cclxuICAgIHJlZ2lzdGVyVmVyc2lvbignZmlyZS1qcycsICcnKTtcclxufVxuXG4vKipcclxuICogRmlyZWJhc2UgQXBwXHJcbiAqXHJcbiAqIEByZW1hcmtzIFRoaXMgcGFja2FnZSBjb29yZGluYXRlcyB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgRmlyZWJhc2UgY29tcG9uZW50c1xyXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cclxuICovXHJcbnJlZ2lzdGVyQ29yZUNvbXBvbmVudHMoJycpO1xuXG5leHBvcnQgeyBTREtfVkVSU0lPTiwgREVGQVVMVF9FTlRSWV9OQU1FIGFzIF9ERUZBVUxUX0VOVFJZX05BTUUsIF9hZGRDb21wb25lbnQsIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudCwgX2FwcHMsIF9jbGVhckNvbXBvbmVudHMsIF9jb21wb25lbnRzLCBfZ2V0UHJvdmlkZXIsIF9yZWdpc3RlckNvbXBvbmVudCwgX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSwgZGVsZXRlQXBwLCBnZXRBcHAsIGdldEFwcHMsIGluaXRpYWxpemVBcHAsIG9uTG9nLCByZWdpc3RlclZlcnNpb24sIHNldExvZ0xldmVsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEEgY29udGFpbmVyIGZvciBhbGwgb2YgdGhlIExvZ2dlciBpbnN0YW5jZXNcclxuICovXHJcbmNvbnN0IGluc3RhbmNlcyA9IFtdO1xyXG4vKipcclxuICogVGhlIEpTIFNESyBzdXBwb3J0cyA1IGxvZyBsZXZlbHMgYW5kIGFsc28gYWxsb3dzIGEgdXNlciB0aGUgYWJpbGl0eSB0b1xyXG4gKiBzaWxlbmNlIHRoZSBsb2dzIGFsdG9nZXRoZXIuXHJcbiAqXHJcbiAqIFRoZSBvcmRlciBpcyBhIGZvbGxvd3M6XHJcbiAqIERFQlVHIDwgVkVSQk9TRSA8IElORk8gPCBXQVJOIDwgRVJST1JcclxuICpcclxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIHdpbGwgYmUgY2FwdHVyZWQgKGkuZS4gaWZcclxuICogeW91IHNldCB0aGUgbG9nIGxldmVsIHRvIGBJTkZPYCwgZXJyb3JzIHdpbGwgc3RpbGwgYmUgbG9nZ2VkLCBidXQgYERFQlVHYCBhbmRcclxuICogYFZFUkJPU0VgIGxvZ3Mgd2lsbCBub3QpXHJcbiAqL1xyXG52YXIgTG9nTGV2ZWw7XHJcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiREVCVUdcIl0gPSAwXSA9IFwiREVCVUdcIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiVkVSQk9TRVwiXSA9IDFdID0gXCJWRVJCT1NFXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIklORk9cIl0gPSAyXSA9IFwiSU5GT1wiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJXQVJOXCJdID0gM10gPSBcIldBUk5cIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRVJST1JcIl0gPSA0XSA9IFwiRVJST1JcIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiU0lMRU5UXCJdID0gNV0gPSBcIlNJTEVOVFwiO1xyXG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xyXG5jb25zdCBsZXZlbFN0cmluZ1RvRW51bSA9IHtcclxuICAgICdkZWJ1Zyc6IExvZ0xldmVsLkRFQlVHLFxyXG4gICAgJ3ZlcmJvc2UnOiBMb2dMZXZlbC5WRVJCT1NFLFxyXG4gICAgJ2luZm8nOiBMb2dMZXZlbC5JTkZPLFxyXG4gICAgJ3dhcm4nOiBMb2dMZXZlbC5XQVJOLFxyXG4gICAgJ2Vycm9yJzogTG9nTGV2ZWwuRVJST1IsXHJcbiAgICAnc2lsZW50JzogTG9nTGV2ZWwuU0lMRU5UXHJcbn07XHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBsb2cgbGV2ZWxcclxuICovXHJcbmNvbnN0IGRlZmF1bHRMb2dMZXZlbCA9IExvZ0xldmVsLklORk87XHJcbi8qKlxyXG4gKiBCeSBkZWZhdWx0LCBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgZGV2ZWxvcGVyIGNvbnNvbGUgKGluXHJcbiAqIGNocm9tZSkuIFRvIGF2b2lkIGZvcmNpbmcgdXNlcnMgdG8gaGF2ZSB0byBvcHQtaW4gdG8gdGhlc2UgbG9ncyB0d2ljZVxyXG4gKiAoaS5lLiBvbmNlIGZvciBmaXJlYmFzZSwgYW5kIG9uY2UgaW4gdGhlIGNvbnNvbGUpLCB3ZSBhcmUgc2VuZGluZyBgREVCVUdgXHJcbiAqIGxvZ3MgdG8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24uXHJcbiAqL1xyXG5jb25zdCBDb25zb2xlTWV0aG9kID0ge1xyXG4gICAgW0xvZ0xldmVsLkRFQlVHXTogJ2xvZycsXHJcbiAgICBbTG9nTGV2ZWwuVkVSQk9TRV06ICdsb2cnLFxyXG4gICAgW0xvZ0xldmVsLklORk9dOiAnaW5mbycsXHJcbiAgICBbTG9nTGV2ZWwuV0FSTl06ICd3YXJuJyxcclxuICAgIFtMb2dMZXZlbC5FUlJPUl06ICdlcnJvcidcclxufTtcclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGxvZyBoYW5kbGVyIHdpbGwgZm9yd2FyZCBERUJVRywgVkVSQk9TRSwgSU5GTywgV0FSTiwgYW5kIEVSUk9SXHJcbiAqIG1lc3NhZ2VzIG9uIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgY29uc29sZSBjb3VudGVycGFydHMgKGlmIHRoZSBsb2cgbWV0aG9kXHJcbiAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBsb2cgbGV2ZWwpXHJcbiAqL1xyXG5jb25zdCBkZWZhdWx0TG9nSGFuZGxlciA9IChpbnN0YW5jZSwgbG9nVHlwZSwgLi4uYXJncykgPT4ge1xyXG4gICAgaWYgKGxvZ1R5cGUgPCBpbnN0YW5jZS5sb2dMZXZlbCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcclxuICAgIGNvbnN0IG1ldGhvZCA9IENvbnNvbGVNZXRob2RbbG9nVHlwZV07XHJcbiAgICBpZiAobWV0aG9kKSB7XHJcbiAgICAgICAgY29uc29sZVttZXRob2RdKGBbJHtub3d9XSAgJHtpbnN0YW5jZS5uYW1lfTpgLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIGxvZyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGxvZ1R5cGUgKHZhbHVlOiAke2xvZ1R5cGV9KWApO1xyXG4gICAgfVxyXG59O1xyXG5jbGFzcyBMb2dnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlcyB5b3UgYW4gaW5zdGFuY2Ugb2YgYSBMb2dnZXIgdG8gY2FwdHVyZSBtZXNzYWdlcyBhY2NvcmRpbmcgdG9cclxuICAgICAqIEZpcmViYXNlJ3MgbG9nZ2luZyBzY2hlbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdGhhdCB0aGUgbG9ncyB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9nIGxldmVsIG9mIHRoZSBnaXZlbiBMb2dnZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSBkZWZhdWx0TG9nTGV2ZWw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1haW4gKGludGVybmFsKSBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cclxuICAgICAgICAgKiBDYW4gYmUgc2V0IHRvIGEgbmV3IGZ1bmN0aW9uIGluIGludGVybmFsIHBhY2thZ2UgY29kZSBidXQgbm90IGJ5IHVzZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlciA9IGRlZmF1bHRMb2dIYW5kbGVyO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcHRpb25hbCwgYWRkaXRpb25hbCwgdXNlci1kZWZpbmVkIGxvZyBoYW5kbGVyIGZvciB0aGUgTG9nZ2VyIGluc3RhbmNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYXB0dXJlIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnN0YW5jZXMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuICAgIGdldCBsb2dMZXZlbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7XHJcbiAgICB9XHJcbiAgICBzZXQgbG9nTGV2ZWwodmFsKSB7XHJcbiAgICAgICAgaWYgKCEodmFsIGluIExvZ0xldmVsKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHZhbHVlIFwiJHt2YWx9XCIgYXNzaWduZWQgdG8gXFxgbG9nTGV2ZWxcXGBgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBzZXR0ZXIvZ2V0dGVyIGhhdmluZyB0byBiZSB0aGUgc2FtZSB0eXBlLlxyXG4gICAgc2V0TG9nTGV2ZWwodmFsKSB7XHJcbiAgICAgICAgdGhpcy5fbG9nTGV2ZWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IGxldmVsU3RyaW5nVG9FbnVtW3ZhbF0gOiB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9nSGFuZGxlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9nSGFuZGxlcjtcclxuICAgIH1cclxuICAgIHNldCBsb2dIYW5kbGVyKHZhbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1ZhbHVlIGFzc2lnbmVkIHRvIGBsb2dIYW5kbGVyYCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlciA9IHZhbDtcclxuICAgIH1cclxuICAgIGdldCB1c2VyTG9nSGFuZGxlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckxvZ0hhbmRsZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgdXNlckxvZ0hhbmRsZXIodmFsKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgPSB2YWw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGFsbCBiYXNlZCBvbiB0aGUgYGNvbnNvbGVgIGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBkZWJ1ZyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgbG9nKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJlxyXG4gICAgICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5WRVJCT1NFLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLlZFUkJPU0UsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgaW5mbyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuSU5GTywgLi4uYXJncyk7XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5JTkZPLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIHdhcm4oLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLldBUk4sIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuV0FSTiwgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBlcnJvciguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuRVJST1IsIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuRVJST1IsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XHJcbiAgICBpbnN0YW5jZXMuZm9yRWFjaChpbnN0ID0+IHtcclxuICAgICAgICBpbnN0LnNldExvZ0xldmVsKGxldmVsKTtcclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIHNldFVzZXJMb2dIYW5kbGVyKGxvZ0NhbGxiYWNrLCBvcHRpb25zKSB7XHJcbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykge1xyXG4gICAgICAgIGxldCBjdXN0b21Mb2dMZXZlbCA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZXZlbCkge1xyXG4gICAgICAgICAgICBjdXN0b21Mb2dMZXZlbCA9IGxldmVsU3RyaW5nVG9FbnVtW29wdGlvbnMubGV2ZWxdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9nQ2FsbGJhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxldmVsLCAuLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYXJnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8IHR5cGVvZiBhcmcgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoaWdub3JlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYXJnID0+IGFyZylcclxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxldmVsID49IChjdXN0b21Mb2dMZXZlbCAhPT0gbnVsbCAmJiBjdXN0b21Mb2dMZXZlbCAhPT0gdm9pZCAwID8gY3VzdG9tTG9nTGV2ZWwgOiBpbnN0YW5jZS5sb2dMZXZlbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dDYWxsYmFjayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbFtsZXZlbF0udG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaW5zdGFuY2UubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBMb2dMZXZlbCwgTG9nZ2VyLCBzZXRMb2dMZXZlbCwgc2V0VXNlckxvZ0hhbmRsZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuLyoqXHJcbiAqIENvbXBvbmVudCBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcclxuICovXHJcbmNsYXNzIENvbXBvbmVudCB7XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcHVibGljIHNlcnZpY2UgbmFtZSwgZS5nLiBhcHAsIGF1dGgsIGZpcmVzdG9yZSwgZGF0YWJhc2VcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUZhY3RvcnkgU2VydmljZSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcHVibGljIGludGVyZmFjZVxyXG4gICAgICogQHBhcmFtIHR5cGUgd2hldGhlciB0aGUgc2VydmljZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGlzIHB1YmxpYyBvciBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGluc3RhbmNlRmFjdG9yeSwgdHlwZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZUZhY3RvcnkgPSBpbnN0YW5jZUZhY3Rvcnk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgICAgICB0aGlzLm11bHRpcGxlSW5zdGFuY2VzID0gZmFsc2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBuYW1lc3BhY2VcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNlcnZpY2VQcm9wcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbk1vZGUgPSBcIkxBWllcIiAvKiBMQVpZICovO1xyXG4gICAgICAgIHRoaXMub25JbnN0YW5jZUNyZWF0ZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgc2V0SW5zdGFudGlhdGlvbk1vZGUobW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbk1vZGUgPSBtb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0TXVsdGlwbGVJbnN0YW5jZXMobXVsdGlwbGVJbnN0YW5jZXMpIHtcclxuICAgICAgICB0aGlzLm11bHRpcGxlSW5zdGFuY2VzID0gbXVsdGlwbGVJbnN0YW5jZXM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXRTZXJ2aWNlUHJvcHMocHJvcHMpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2VQcm9wcyA9IHByb3BzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0SW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2soY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLm9uSW5zdGFuY2VDcmVhdGVkID0gY2FsbGJhY2s7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9FTlRSWV9OQU1FID0gJ1tERUZBVUxUXSc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgaW5zdGFuY2UgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuICdhdXRoJywgJ2F1dGgtaW50ZXJuYWwnXHJcbiAqIE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSBpcyBhbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlXHJcbiAqL1xyXG5jbGFzcyBQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm9uSW5pdENhbGxiYWNrcyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgQSBwcm92aWRlciBjYW4gcHJvdmlkZSBtdWxpdHBsZSBpbnN0YW5jZXMgb2YgYSBzZXJ2aWNlXHJcbiAgICAgKiBpZiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyBpcyB0cnVlLlxyXG4gICAgICovXHJcbiAgICBnZXQoaWRlbnRpZmllcikge1xyXG4gICAgICAgIC8vIGlmIG11bHRpcGxlSW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSB0aGUgZGVmYXVsdCBuYW1lXHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuaGFzKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZGVmZXJyZWQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzZXJ2aWNlIGlmIGl0IGNhbiBiZSBhdXRvLWluaXRpYWxpemVkXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgZ2V0KCksIGl0IHNob3VsZCBub3QgY2F1c2VcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IHJldHVybiB0aGUgdW5yZXNvbHZlZCBwcm9taXNlIGluIHRoaXMgY2FzZS5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpLnByb21pc2U7XHJcbiAgICB9XHJcbiAgICBnZXRJbW1lZGlhdGUob3B0aW9ucykge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBpZiBtdWx0aXBsZUluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIGRlZmF1bHQgbmFtZVxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmlkZW50aWZpZXIpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbmFsID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9wdGlvbmFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxyXG4gICAgICAgICAgICB0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluIGNhc2UgYSBjb21wb25lbnQgaXMgbm90IGluaXRpYWxpemVkIGFuZCBzaG91bGQvY2FuIG5vdCBiZSBhdXRvLWluaXRpYWxpemVkIGF0IHRoZSBtb21lbnQsIHJldHVybiBudWxsIGlmIHRoZSBvcHRpb25hbCBmbGFnIGlzIHNldCwgb3IgdGhyb3dcclxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBTZXJ2aWNlICR7dGhpcy5uYW1lfSBpcyBub3QgYXZhaWxhYmxlYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50O1xyXG4gICAgfVxyXG4gICAgc2V0Q29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPT0gdGhpcy5uYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBNaXNtYXRjaGluZyBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZm9yIFByb3ZpZGVyICR7dGhpcy5uYW1lfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDb21wb25lbnQgZm9yICR7dGhpcy5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHByb3ZpZGVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xyXG4gICAgICAgIC8vIHJldHVybiBlYXJseSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGlmIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gKGNhbGxpbmcgYFByb3ZpZGVyLmluaXRpYWxpemUoKWApXHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB0aGUgc2VydmljZSBpcyBlYWdlciwgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZVxyXG4gICAgICAgIGlmIChpc0NvbXBvbmVudEVhZ2VyKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7IGluc3RhbmNlSWRlbnRpZmllcjogREVGQVVMVF9FTlRSWV9OQU1FIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IGZvciBhbiBlYWdlciBDb21wb25lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGVhZ2VyXHJcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiwgaXQgc2hvdWxkIG5vdCBjYXVzZSBhIGZhdGFsIGVycm9yLlxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2UgbmVlZCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSwgYmVjYXVzZSBzb21lIGNvbXBvbmVudCBtYXkgd2FudCB0byBjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gYSBmYXRhbCBlcnJvciBpbiB0aGlzIGNhc2U/XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2VzIGZvciB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZSB0aGVtXHJcbiAgICAgICAgLy8gTk9URTogaWYgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyBpcyBmYWxzZSwgb25seSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWRcclxuICAgICAgICAvLyBhbmQgYWxsIHByb21pc2VzIHdpdGggcmVzb2x2ZSB3aXRoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIGlkZW50aWZpZXIuXHJcbiAgICAgICAgZm9yIChjb25zdCBbaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZURlZmVycmVkXSBvZiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAvLyBgZ2V0T3JJbml0aWFsaXplU2VydmljZSgpYCBzaG91bGQgYWx3YXlzIHJldHVybiBhIHZhbGlkIGluc3RhbmNlIHNpbmNlIGEgY29tcG9uZW50IGlzIGd1YXJhbnRlZWQuIHVzZSAhIHRvIG1ha2UgdHlwZXNjcmlwdCBoYXBweS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIG5vdCBjYXVzZVxyXG4gICAgICAgICAgICAgICAgLy8gYSBmYXRhbCBlcnJvci4gV2UganVzdCBsZWF2ZSB0aGUgcHJvbWlzZSB1bnJlc29sdmVkLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2xlYXJJbnN0YW5jZShpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5kZWxldGUoaWRlbnRpZmllcik7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLmRlbGV0ZShpZGVudGlmaWVyKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUoaWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgICAvLyBhcHAuZGVsZXRlKCkgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIGV2ZXJ5IHByb3ZpZGVyIHRvIGRlbGV0ZSB0aGUgc2VydmljZXNcclxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBtYXJrIHRoZSBwcm92aWRlciBhcyBkZWxldGVkP1xyXG4gICAgYXN5bmMgZGVsZXRlKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbSh0aGlzLmluc3RhbmNlcy52YWx1ZXMoKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAuLi5zZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdJTlRFUk5BTCcgaW4gc2VydmljZSkgLy8gbGVnYWN5IHNlcnZpY2VzXHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgLm1hcChzZXJ2aWNlID0+IHNlcnZpY2UuSU5URVJOQUwuZGVsZXRlKCkpLFxyXG4gICAgICAgICAgICAuLi5zZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdfZGVsZXRlJyBpbiBzZXJ2aWNlKSAvLyBtb2R1bGFyaXplZCBzZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIC5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLl9kZWxldGUoKSlcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuICAgIGlzQ29tcG9uZW50U2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudCAhPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaXNJbml0aWFsaXplZChpZGVudGlmaWVyID0gREVGQVVMVF9FTlRSWV9OQU1FKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLmhhcyhpZGVudGlmaWVyKTtcclxuICAgIH1cclxuICAgIGdldE9wdGlvbnMoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlc09wdGlvbnMuZ2V0KGlkZW50aWZpZXIpIHx8IHt9O1xyXG4gICAgfVxyXG4gICAgaW5pdGlhbGl6ZShvcHRzID0ge30pIHtcclxuICAgICAgICBjb25zdCB7IG9wdGlvbnMgPSB7fSB9ID0gb3B0cztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKG9wdHMuaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgJHt0aGlzLm5hbWV9KCR7bm9ybWFsaXplZElkZW50aWZpZXJ9KSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbXBvbmVudFNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDb21wb25lbnQgJHt0aGlzLm5hbWV9IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIHlldGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XHJcbiAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXIsXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyByZXNvbHZlIGFueSBwZW5kaW5nIHByb21pc2Ugd2FpdGluZyBmb3IgdGhlIHNlcnZpY2UgaW5zdGFuY2VcclxuICAgICAgICBmb3IgKGNvbnN0IFtpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlRGVmZXJyZWRdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWREZWZlcnJlZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZElkZW50aWZpZXIgPT09IG5vcm1hbGl6ZWREZWZlcnJlZElkZW50aWZpZXIpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCAgYWZ0ZXIgdGhlIHByb3ZpZGVyIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgcHJvdmlkZXIuaW5pdGlhbGl6ZSgpLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgU1lOQ0hST05PVVNMWSwgc28gaXQgc2hvdWxkIG5vdCBleGVjdXRlIGFueSBsb25ncnVubmluZyB0YXNrcyBpbiBvcmRlciB0byBub3QgYmxvY2sgdGhlIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgQW4gb3B0aW9uYWwgaW5zdGFuY2UgaWRlbnRpZmllclxyXG4gICAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFja1xyXG4gICAgICovXHJcbiAgICBvbkluaXQoY2FsbGJhY2ssIGlkZW50aWZpZXIpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NhbGxiYWNrcyA9IChfYSA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChub3JtYWxpemVkSWRlbnRpZmllcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBTZXQoKTtcclxuICAgICAgICBleGlzdGluZ0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZXhpc3RpbmdDYWxsYmFja3MpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV4aXN0aW5nSW5zdGFuY2UsIG5vcm1hbGl6ZWRJZGVudGlmaWVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2Ugb25Jbml0IGNhbGxiYWNrcyBzeW5jaHJvbm91c2x5XHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgdGhlIHNlcnZpY2UgaW5zdGFuY2VgXHJcbiAgICAgKi9cclxuICAgIGludm9rZU9uSW5pdENhbGxiYWNrcyhpbnN0YW5jZSwgaWRlbnRpZmllcikge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChpZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoIWNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhpbnN0YW5jZSwgaWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGluIHRoZSBvbkluaXQgY2FsbGJhY2tcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldE9ySW5pdGlhbGl6ZVNlcnZpY2UoeyBpbnN0YW5jZUlkZW50aWZpZXIsIG9wdGlvbnMgPSB7fSB9KSB7XHJcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCFpbnN0YW5jZSAmJiB0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50Lmluc3RhbmNlRmFjdG9yeSh0aGlzLmNvbnRhaW5lciwge1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVJZGVudGlmaWVyRm9yRmFjdG9yeShpbnN0YW5jZUlkZW50aWZpZXIpLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlc09wdGlvbnMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJbnZva2Ugb25Jbml0IGxpc3RlbmVycy5cclxuICAgICAgICAgICAgICogTm90ZSB0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCBpcyBkaWZmZXJlbnQsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGNvbXBvbmVudCBjcmVhdG9yLFxyXG4gICAgICAgICAgICAgKiB3aGlsZSBvbkluaXQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIGJ5IGNvbnN1bWVycyBvZiB0aGUgcHJvdmlkZXIuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmludm9rZU9uSW5pdENhbGxiYWNrcyhpbnN0YW5jZSwgaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIE9yZGVyIGlzIGltcG9ydGFudFxyXG4gICAgICAgICAgICAgKiBvbkluc3RhbmNlQ3JlYXRlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpOyB3aGljaFxyXG4gICAgICAgICAgICAgKiBtYWtlcyBgaXNJbml0aWFsaXplZCgpYCByZXR1cm4gdHJ1ZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGluIHRoZSBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICBub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgPyBpZGVudGlmaWVyIDogREVGQVVMVF9FTlRSWV9OQU1FO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7IC8vIGFzc3VtZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXJlIHN1cHBvcnRlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBwcm92aWRlZC5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzaG91bGRBdXRvSW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICByZXR1cm4gKCEhdGhpcy5jb21wb25lbnQgJiZcclxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgIT09IFwiRVhQTElDSVRcIiAvKiBFWFBMSUNJVCAqLyk7XHJcbiAgICB9XHJcbn1cclxuLy8gdW5kZWZpbmVkIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgZmFjdG9yeSBmb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2VcclxuZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllckZvckZhY3RvcnkoaWRlbnRpZmllcikge1xyXG4gICAgcmV0dXJuIGlkZW50aWZpZXIgPT09IERFRkFVTFRfRU5UUllfTkFNRSA/IHVuZGVmaW5lZCA6IGlkZW50aWZpZXI7XHJcbn1cclxuZnVuY3Rpb24gaXNDb21wb25lbnRFYWdlcihjb21wb25lbnQpIHtcclxuICAgIHJldHVybiBjb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgPT09IFwiRUFHRVJcIiAvKiBFQUdFUiAqLztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ29tcG9uZW50Q29udGFpbmVyIHRoYXQgcHJvdmlkZXMgUHJvdmlkZXJzIGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiBgYXV0aGAsIGBhdXRoLWludGVybmFsYFxyXG4gKi9cclxuY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gbmV3IE1hcCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCBDb21wb25lbnQgYmVpbmcgYWRkZWRcclxuICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hlbiBhIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLFxyXG4gICAgICogaWYgb3ZlcndyaXRlIGlzIHRydWU6IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHdpdGggdGhlIG5ldyBjb21wb25lbnQgYW5kIGNyZWF0ZSBhIG5ld1xyXG4gICAgICogcHJvdmlkZXIgd2l0aCB0aGUgbmV3IGNvbXBvbmVudC4gSXQgY2FuIGJlIHVzZWZ1bCBpbiB0ZXN0cyB3aGVyZSB5b3Ugd2FudCB0byB1c2UgZGlmZmVyZW50IG1vY2tzXHJcbiAgICAgKiBmb3IgZGlmZmVyZW50IHRlc3RzLlxyXG4gICAgICogaWYgb3ZlcndyaXRlIGlzIGZhbHNlOiB0aHJvdyBhbiBleGNlcHRpb25cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHdpdGggJHt0aGlzLm5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3ZpZGVyLnNldENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgYWRkT3JPdmVyd3JpdGVDb21wb25lbnQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGNvbXBvbmVudC5uYW1lKTtcclxuICAgICAgICBpZiAocHJvdmlkZXIuaXNDb21wb25lbnRTZXQoKSkge1xyXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGV4aXN0aW5nIHByb3ZpZGVyIGZyb20gdGhlIGNvbnRhaW5lciwgc28gd2UgY2FuIHJlZ2lzdGVyIHRoZSBuZXcgY29tcG9uZW50XHJcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLmRlbGV0ZShjb21wb25lbnQubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGdldFByb3ZpZGVyIHByb3ZpZGVzIGEgdHlwZSBzYWZlIGludGVyZmFjZSB3aGVyZSBpdCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBhIGZpZWxkIG5hbWVcclxuICAgICAqIHByZXNlbnQgaW4gTmFtZVNlcnZpY2VNYXBwaW5nIGludGVyZmFjZS5cclxuICAgICAqXHJcbiAgICAgKiBGaXJlYmFzZSBTREtzIHByb3ZpZGluZyBzZXJ2aWNlcyBzaG91bGQgZXh0ZW5kIE5hbWVTZXJ2aWNlTWFwcGluZyBpbnRlcmZhY2UgdG8gcmVnaXN0ZXJcclxuICAgICAqIHRoZW1zZWx2ZXMuXHJcbiAgICAgKi9cclxuICAgIGdldFByb3ZpZGVyKG5hbWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm92aWRlcnMuaGFzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5nZXQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNyZWF0ZSBhIFByb3ZpZGVyIGZvciBhIHNlcnZpY2UgdGhhdCBoYXNuJ3QgcmVnaXN0ZXJlZCB3aXRoIEZpcmViYXNlXHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIobmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5wcm92aWRlcnMuc2V0KG5hbWUsIHByb3ZpZGVyKTtcclxuICAgICAgICByZXR1cm4gcHJvdmlkZXI7XHJcbiAgICB9XHJcbiAgICBnZXRQcm92aWRlcnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wcm92aWRlcnMudmFsdWVzKCkpO1xyXG4gICAgfVxyXG59XG5cbmV4cG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q29udGFpbmVyLCBQcm92aWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsInZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG52YXIgZXNtID0ge307XG5cbi8qXG5cbiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLlxuIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4qL1xudmFyIGssZ29vZz1nb29nfHx7fSxsPWNvbW1vbmpzR2xvYmFsfHxzZWxmO2Z1bmN0aW9uIGFhKCl7fWZ1bmN0aW9uIGJhKGEpe3ZhciBiPXR5cGVvZiBhO2I9XCJvYmplY3RcIiE9Yj9iOmE/QXJyYXkuaXNBcnJheShhKT9cImFycmF5XCI6YjpcIm51bGxcIjtyZXR1cm4gXCJhcnJheVwiPT1ifHxcIm9iamVjdFwiPT1iJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGh9ZnVuY3Rpb24gcChhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gXCJvYmplY3RcIj09YiYmbnVsbCE9YXx8XCJmdW5jdGlvblwiPT1ifWZ1bmN0aW9uIGRhKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxlYSkmJmFbZWFdfHwoYVtlYV09KytmYSl9dmFyIGVhPVwiY2xvc3VyZV91aWRfXCIrKDFFOSpNYXRoLnJhbmRvbSgpPj4+MCksZmE9MDtmdW5jdGlvbiBoYShhLGIsYyl7cmV0dXJuIGEuY2FsbC5hcHBseShhLmJpbmQsYXJndW1lbnRzKX1cbmZ1bmN0aW9uIGlhKGEsYixjKXtpZighYSl0aHJvdyBFcnJvcigpO2lmKDI8YXJndW1lbnRzLmxlbmd0aCl7dmFyIGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7QXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoZSxkKTtyZXR1cm4gYS5hcHBseShiLGUpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHEoYSxiLGMpe0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kJiYtMSE9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQudG9TdHJpbmcoKS5pbmRleE9mKFwibmF0aXZlIGNvZGVcIik/cT1oYTpxPWlhO3JldHVybiBxLmFwcGx5KG51bGwsYXJndW1lbnRzKX1cbmZ1bmN0aW9uIGphKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuc2xpY2UoKTtkLnB1c2guYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiBhLmFwcGx5KHRoaXMsZCl9fWZ1bmN0aW9uIHQoYSxiKXtmdW5jdGlvbiBjKCl7fWMucHJvdG90eXBlPWIucHJvdG90eXBlO2EuWj1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EuVmI9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLG49MjtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWhbbi0yXT1hcmd1bWVudHNbbl07cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9O31mdW5jdGlvbiB2KCl7dGhpcy5zPXRoaXMuczt0aGlzLm89dGhpcy5vO312YXIga2E9MCxsYT17fTt2LnByb3RvdHlwZS5zPSExO3YucHJvdG90eXBlLm5hPWZ1bmN0aW9uKCl7aWYoIXRoaXMucyYmKHRoaXMucz0hMCx0aGlzLk0oKSwwIT1rYSkpe3ZhciBhPWRhKHRoaXMpO2RlbGV0ZSBsYVthXTt9fTt2LnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7aWYodGhpcy5vKWZvcig7dGhpcy5vLmxlbmd0aDspdGhpcy5vLnNoaWZ0KCkoKTt9O2NvbnN0IG1hPUFycmF5LnByb3RvdHlwZS5pbmRleE9mP2Z1bmN0aW9uKGEsYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYSxiLHZvaWQgMCl9OmZ1bmN0aW9uKGEsYil7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBcInN0cmluZ1wiIT09dHlwZW9mIGJ8fDEhPWIubGVuZ3RoPy0xOmEuaW5kZXhPZihiLDApO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuIC0xfSxuYT1BcnJheS5wcm90b3R5cGUuZm9yRWFjaD9mdW5jdGlvbihhLGIsYyl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyk7fTpmdW5jdGlvbihhLGIsYyl7Y29uc3QgZD1hLmxlbmd0aCxlPVwic3RyaW5nXCI9PT10eXBlb2YgYT9hLnNwbGl0KFwiXCIpOmE7Zm9yKGxldCBmPTA7ZjxkO2YrKylmIGluIGUmJmIuY2FsbChjLGVbZl0sZixhKTt9O1xuZnVuY3Rpb24gb2EoYSl7YTp7dmFyIGI9cGE7Y29uc3QgYz1hLmxlbmd0aCxkPVwic3RyaW5nXCI9PT10eXBlb2YgYT9hLnNwbGl0KFwiXCIpOmE7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZihlIGluIGQmJmIuY2FsbCh2b2lkIDAsZFtlXSxlLGEpKXtiPWU7YnJlYWsgYX1iPS0xO31yZXR1cm4gMD5iP251bGw6XCJzdHJpbmdcIj09PXR5cGVvZiBhP2EuY2hhckF0KGIpOmFbYl19ZnVuY3Rpb24gcWEoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYXJndW1lbnRzKX1mdW5jdGlvbiByYShhKXtjb25zdCBiPWEubGVuZ3RoO2lmKDA8Yil7Y29uc3QgYz1BcnJheShiKTtmb3IobGV0IGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm4gW119ZnVuY3Rpb24gc2EoYSl7cmV0dXJuIC9eW1xcc1xceGEwXSokLy50ZXN0KGEpfXZhciB0YT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4gL15bXFxzXFx4YTBdKihbXFxzXFxTXSo/KVtcXHNcXHhhMF0qJC8uZXhlYyhhKVsxXX07ZnVuY3Rpb24gdyhhLGIpe3JldHVybiAtMSE9YS5pbmRleE9mKGIpfWZ1bmN0aW9uIHVhKGEsYil7cmV0dXJuIGE8Yj8tMTphPmI/MTowfXZhciB4O2E6e3ZhciB2YT1sLm5hdmlnYXRvcjtpZih2YSl7dmFyIHdhPXZhLnVzZXJBZ2VudDtpZih3YSl7eD13YTticmVhayBhfX14PVwiXCI7fWZ1bmN0aW9uIHhhKGEsYixjKXtmb3IoY29uc3QgZCBpbiBhKWIuY2FsbChjLGFbZF0sZCxhKTt9ZnVuY3Rpb24geWEoYSl7Y29uc3QgYj17fTtmb3IoY29uc3QgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn12YXIgemE9XCJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2ZcIi5zcGxpdChcIiBcIik7ZnVuY3Rpb24gQWEoYSxiKXtsZXQgYyxkO2ZvcihsZXQgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2ZvcihsZXQgZj0wO2Y8emEubGVuZ3RoO2YrKyljPXphW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKTt9fWZ1bmN0aW9uIENhKGEpe0NhW1wiIFwiXShhKTtyZXR1cm4gYX1DYVtcIiBcIl09YWE7ZnVuY3Rpb24gRmEoYSl7dmFyIGI9R2E7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLDkpP2JbOV06Yls5XT1hKDkpfXZhciBIYT13KHgsXCJPcGVyYVwiKSx5PXcoeCxcIlRyaWRlbnRcIil8fHcoeCxcIk1TSUVcIiksSWE9dyh4LFwiRWRnZVwiKSxKYT1JYXx8eSxLYT13KHgsXCJHZWNrb1wiKSYmISh3KHgudG9Mb3dlckNhc2UoKSxcIndlYmtpdFwiKSYmIXcoeCxcIkVkZ2VcIikpJiYhKHcoeCxcIlRyaWRlbnRcIil8fHcoeCxcIk1TSUVcIikpJiYhdyh4LFwiRWRnZVwiKSxMYT13KHgudG9Mb3dlckNhc2UoKSxcIndlYmtpdFwiKSYmIXcoeCxcIkVkZ2VcIik7ZnVuY3Rpb24gTWEoKXt2YXIgYT1sLmRvY3VtZW50O3JldHVybiBhP2EuZG9jdW1lbnRNb2RlOnZvaWQgMH12YXIgTmE7XG5hOnt2YXIgT2E9XCJcIixQYT1mdW5jdGlvbigpe3ZhciBhPXg7aWYoS2EpcmV0dXJuIC9ydjooW15cXCk7XSspKFxcKXw7KS8uZXhlYyhhKTtpZihJYSlyZXR1cm4gL0VkZ2VcXC8oW1xcZFxcLl0rKS8uZXhlYyhhKTtpZih5KXJldHVybiAvXFxiKD86TVNJRXxydilbOiBdKFteXFwpO10rKShcXCl8OykvLmV4ZWMoYSk7aWYoTGEpcmV0dXJuIC9XZWJLaXRcXC8oXFxTKykvLmV4ZWMoYSk7aWYoSGEpcmV0dXJuIC8oPzpWZXJzaW9uKVsgXFwvXT8oXFxTKykvLmV4ZWMoYSl9KCk7UGEmJihPYT1QYT9QYVsxXTpcIlwiKTtpZih5KXt2YXIgUWE9TWEoKTtpZihudWxsIT1RYSYmUWE+cGFyc2VGbG9hdChPYSkpe05hPVN0cmluZyhRYSk7YnJlYWsgYX19TmE9T2E7fXZhciBHYT17fTtcbmZ1bmN0aW9uIFJhKCl7cmV0dXJuIEZhKGZ1bmN0aW9uKCl7bGV0IGE9MDtjb25zdCBiPXRhKFN0cmluZyhOYSkpLnNwbGl0KFwiLlwiKSxjPXRhKFwiOVwiKS5zcGxpdChcIi5cIiksZD1NYXRoLm1heChiLmxlbmd0aCxjLmxlbmd0aCk7Zm9yKGxldCBoPTA7MD09YSYmaDxkO2grKyl7dmFyIGU9YltoXXx8XCJcIixmPWNbaF18fFwiXCI7ZG97ZT0vKFxcZCopKFxcRCopKC4qKS8uZXhlYyhlKXx8W1wiXCIsXCJcIixcIlwiLFwiXCJdO2Y9LyhcXGQqKShcXEQqKSguKikvLmV4ZWMoZil8fFtcIlwiLFwiXCIsXCJcIixcIlwiXTtpZigwPT1lWzBdLmxlbmd0aCYmMD09ZlswXS5sZW5ndGgpYnJlYWs7YT11YSgwPT1lWzFdLmxlbmd0aD8wOnBhcnNlSW50KGVbMV0sMTApLDA9PWZbMV0ubGVuZ3RoPzA6cGFyc2VJbnQoZlsxXSwxMCkpfHx1YSgwPT1lWzJdLmxlbmd0aCwwPT1mWzJdLmxlbmd0aCl8fHVhKGVbMl0sZlsyXSk7ZT1lWzNdO2Y9ZlszXTt9d2hpbGUoMD09YSl9cmV0dXJuIDA8PWF9KX12YXIgU2E7XG5pZihsLmRvY3VtZW50JiZ5KXt2YXIgVGE9TWEoKTtTYT1UYT9UYTpwYXJzZUludChOYSwxMCl8fHZvaWQgMDt9ZWxzZSBTYT12b2lkIDA7dmFyIFVhPVNhO3ZhciBWYT1mdW5jdGlvbigpe2lmKCFsLmFkZEV2ZW50TGlzdGVuZXJ8fCFPYmplY3QuZGVmaW5lUHJvcGVydHkpcmV0dXJuICExO3ZhciBhPSExLGI9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwicGFzc2l2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXthPSEwO319KTt0cnl7bC5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLGFhLGIpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIixhYSxiKTt9Y2F0Y2goYyl7fXJldHVybiBhfSgpO2Z1bmN0aW9uIHooYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmc9dGhpcy50YXJnZXQ9Yjt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITE7fXoucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7fTtmdW5jdGlvbiBBKGEsYil7ei5jYWxsKHRoaXMsYT9hLnR5cGU6XCJcIik7dGhpcy5yZWxhdGVkVGFyZ2V0PXRoaXMuZz10aGlzLnRhcmdldD1udWxsO3RoaXMuYnV0dG9uPXRoaXMuc2NyZWVuWT10aGlzLnNjcmVlblg9dGhpcy5jbGllbnRZPXRoaXMuY2xpZW50WD0wO3RoaXMua2V5PVwiXCI7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9XCJcIjt0aGlzLmk9bnVsbDtpZihhKXt2YXIgYz10aGlzLnR5cGU9YS50eXBlLGQ9YS5jaGFuZ2VkVG91Y2hlcyYmYS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg/YS5jaGFuZ2VkVG91Y2hlc1swXTpudWxsO3RoaXMudGFyZ2V0PWEudGFyZ2V0fHxhLnNyY0VsZW1lbnQ7dGhpcy5nPWI7aWYoYj1hLnJlbGF0ZWRUYXJnZXQpe2lmKEthKXthOnt0cnl7Q2EoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT1cbiExO31lfHwoYj1udWxsKTt9fWVsc2UgXCJtb3VzZW92ZXJcIj09Yz9iPWEuZnJvbUVsZW1lbnQ6XCJtb3VzZW91dFwiPT1jJiYoYj1hLnRvRWxlbWVudCk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPXZvaWQgMCE9PWQuY2xpZW50WD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9dm9pZCAwIT09ZC5jbGllbnRZP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD12b2lkIDAhPT1hLmNsaWVudFg/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWEuY2xpZW50WT9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMua2V5PWEua2V5fHxcIlwiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1cbmEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLnBvaW50ZXJJZD1hLnBvaW50ZXJJZHx8MDt0aGlzLnBvaW50ZXJUeXBlPVwic3RyaW5nXCI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOldhW2EucG9pbnRlclR5cGVdfHxcIlwiO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLmk9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJkEuWi5oLmNhbGwodGhpcyk7fX10KEEseik7dmFyIFdhPXsyOlwidG91Y2hcIiwzOlwicGVuXCIsNDpcIm1vdXNlXCJ9O0EucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtBLlouaC5jYWxsKHRoaXMpO3ZhciBhPXRoaXMuaTthLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExO307dmFyIEI9XCJjbG9zdXJlX2xpc3RlbmFibGVfXCIrKDFFNipNYXRoLnJhbmRvbSgpfDApO3ZhciBYYT0wO2Z1bmN0aW9uIFlhKGEsYixjLGQsZSl7dGhpcy5saXN0ZW5lcj1hO3RoaXMucHJveHk9bnVsbDt0aGlzLnNyYz1iO3RoaXMudHlwZT1jO3RoaXMuY2FwdHVyZT0hIWQ7dGhpcy5pYT1lO3RoaXMua2V5PSsrWGE7dGhpcy5jYT10aGlzLmZhPSExO31mdW5jdGlvbiBaYShhKXthLmNhPSEwO2EubGlzdGVuZXI9bnVsbDthLnByb3h5PW51bGw7YS5zcmM9bnVsbDthLmlhPW51bGw7fWZ1bmN0aW9uICRhKGEpe3RoaXMuc3JjPWE7dGhpcy5nPXt9O3RoaXMuaD0wO30kYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS50b1N0cmluZygpO2E9dGhpcy5nW2ZdO2F8fChhPXRoaXMuZ1tmXT1bXSx0aGlzLmgrKyk7dmFyIGg9YWIoYSxiLGQsZSk7LTE8aD8oYj1hW2hdLGN8fChiLmZhPSExKSk6KGI9bmV3IFlhKGIsdGhpcy5zcmMsZiwhIWQsZSksYi5mYT1jLGEucHVzaChiKSk7cmV0dXJuIGJ9O2Z1bmN0aW9uIGJiKGEsYil7dmFyIGM9Yi50eXBlO2lmKGMgaW4gYS5nKXt2YXIgZD1hLmdbY10sZT1tYShkLGIpLGY7KGY9MDw9ZSkmJkFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChkLGUsMSk7ZiYmKFphKGIpLDA9PWEuZ1tjXS5sZW5ndGgmJihkZWxldGUgYS5nW2NdLGEuaC0tKSk7fX1cbmZ1bmN0aW9uIGFiKGEsYixjLGQpe2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7KytlKXt2YXIgZj1hW2VdO2lmKCFmLmNhJiZmLmxpc3RlbmVyPT1iJiZmLmNhcHR1cmU9PSEhYyYmZi5pYT09ZClyZXR1cm4gZX1yZXR1cm4gLTF9dmFyIGNiPVwiY2xvc3VyZV9sbV9cIisoMUU2Kk1hdGgucmFuZG9tKCl8MCksZGI9e307ZnVuY3Rpb24gZmIoYSxiLGMsZCxlKXtpZihkJiZkLm9uY2UpcmV0dXJuIGdiKGEsYixjLGQsZSk7aWYoQXJyYXkuaXNBcnJheShiKSl7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspZmIoYSxiW2ZdLGMsZCxlKTtyZXR1cm4gbnVsbH1jPWhiKGMpO3JldHVybiBhJiZhW0JdP2EuTihiLGMscChkKT8hIWQuY2FwdHVyZTohIWQsZSk6aWIoYSxiLGMsITEsZCxlKX1cbmZ1bmN0aW9uIGliKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcihcIkludmFsaWQgZXZlbnQgdHlwZVwiKTt2YXIgaD1wKGUpPyEhZS5jYXB0dXJlOiEhZSxuPWpiKGEpO258fChhW2NiXT1uPW5ldyAkYShhKSk7Yz1uLmFkZChiLGMsZCxoLGYpO2lmKGMucHJveHkpcmV0dXJuIGM7ZD1rYigpO2MucHJveHk9ZDtkLnNyYz1hO2QubGlzdGVuZXI9YztpZihhLmFkZEV2ZW50TGlzdGVuZXIpVmF8fChlPWgpLHZvaWQgMD09PWUmJihlPSExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYi50b1N0cmluZygpLGQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQobGIoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKFwiYWRkRXZlbnRMaXN0ZW5lciBhbmQgYXR0YWNoRXZlbnQgYXJlIHVuYXZhaWxhYmxlLlwiKTtyZXR1cm4gY31cbmZ1bmN0aW9uIGtiKCl7ZnVuY3Rpb24gYShjKXtyZXR1cm4gYi5jYWxsKGEuc3JjLGEubGlzdGVuZXIsYyl9dmFyIGI9bWI7cmV0dXJuIGF9ZnVuY3Rpb24gZ2IoYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylnYihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9aGIoYyk7cmV0dXJuIGEmJmFbQl0/YS5PKGIsYyxwKGQpPyEhZC5jYXB0dXJlOiEhZCxlKTppYihhLGIsYywhMCxkLGUpfVxuZnVuY3Rpb24gbmIoYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKW5iKGEsYltmXSxjLGQsZSk7ZWxzZSAoZD1wKGQpPyEhZC5jYXB0dXJlOiEhZCxjPWhiKGMpLGEmJmFbQl0pPyhhPWEuaSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1hYihmLGMsZCxlKSwtMTxjJiYoWmEoZltjXSksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSwwPT1mLmxlbmd0aCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPWpiKGEpKSYmKGI9YS5nW2IudG9TdHJpbmcoKV0sYT0tMSxiJiYoYT1hYihiLGMsZCxlKSksKGM9LTE8YT9iW2FdOm51bGwpJiZvYihjKSk7fVxuZnVuY3Rpb24gb2IoYSl7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBhJiZhJiYhYS5jYSl7dmFyIGI9YS5zcmM7aWYoYiYmYltCXSliYihiLmksYSk7ZWxzZSB7dmFyIGM9YS50eXBlLGQ9YS5wcm94eTtiLnJlbW92ZUV2ZW50TGlzdGVuZXI/Yi5yZW1vdmVFdmVudExpc3RlbmVyKGMsZCxhLmNhcHR1cmUpOmIuZGV0YWNoRXZlbnQ/Yi5kZXRhY2hFdmVudChsYihjKSxkKTpiLmFkZExpc3RlbmVyJiZiLnJlbW92ZUxpc3RlbmVyJiZiLnJlbW92ZUxpc3RlbmVyKGQpOyhjPWpiKGIpKT8oYmIoYyxhKSwwPT1jLmgmJihjLnNyYz1udWxsLGJbY2JdPW51bGwpKTpaYShhKTt9fX1mdW5jdGlvbiBsYihhKXtyZXR1cm4gYSBpbiBkYj9kYlthXTpkYlthXT1cIm9uXCIrYX1mdW5jdGlvbiBtYihhLGIpe2lmKGEuY2EpYT0hMDtlbHNlIHtiPW5ldyBBKGIsdGhpcyk7dmFyIGM9YS5saXN0ZW5lcixkPWEuaWF8fGEuc3JjO2EuZmEmJm9iKGEpO2E9Yy5jYWxsKGQsYik7fXJldHVybiBhfVxuZnVuY3Rpb24gamIoYSl7YT1hW2NiXTtyZXR1cm4gYSBpbnN0YW5jZW9mICRhP2E6bnVsbH12YXIgcGI9XCJfX2Nsb3N1cmVfZXZlbnRzX2ZuX1wiKygxRTkqTWF0aC5yYW5kb20oKT4+PjApO2Z1bmN0aW9uIGhiKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBhO2FbcGJdfHwoYVtwYl09ZnVuY3Rpb24oYil7cmV0dXJuIGEuaGFuZGxlRXZlbnQoYil9KTtyZXR1cm4gYVtwYl19ZnVuY3Rpb24gQygpe3YuY2FsbCh0aGlzKTt0aGlzLmk9bmV3ICRhKHRoaXMpO3RoaXMuUD10aGlzO3RoaXMuST1udWxsO310KEMsdik7Qy5wcm90b3R5cGVbQl09ITA7Qy5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyxkKXtuYih0aGlzLGEsYixjLGQpO307XG5mdW5jdGlvbiBEKGEsYil7dmFyIGMsZD1hLkk7aWYoZClmb3IoYz1bXTtkO2Q9ZC5JKWMucHVzaChkKTthPWEuUDtkPWIudHlwZXx8YjtpZihcInN0cmluZ1wiPT09dHlwZW9mIGIpYj1uZXcgeihiLGEpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIHopYi50YXJnZXQ9Yi50YXJnZXR8fGE7ZWxzZSB7dmFyIGU9YjtiPW5ldyB6KGQsYSk7QWEoYixlKTt9ZT0hMDtpZihjKWZvcih2YXIgZj1jLmxlbmd0aC0xOzA8PWY7Zi0tKXt2YXIgaD1iLmc9Y1tmXTtlPXFiKGgsZCwhMCxiKSYmZTt9aD1iLmc9YTtlPXFiKGgsZCwhMCxiKSYmZTtlPXFiKGgsZCwhMSxiKSYmZTtpZihjKWZvcihmPTA7ZjxjLmxlbmd0aDtmKyspaD1iLmc9Y1tmXSxlPXFiKGgsZCwhMSxiKSYmZTt9XG5DLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7Qy5aLk0uY2FsbCh0aGlzKTtpZih0aGlzLmkpe3ZhciBhPXRoaXMuaSxjO2ZvcihjIGluIGEuZyl7Zm9yKHZhciBkPWEuZ1tjXSxlPTA7ZTxkLmxlbmd0aDtlKyspWmEoZFtlXSk7ZGVsZXRlIGEuZ1tjXTthLmgtLTt9fXRoaXMuST1udWxsO307Qy5wcm90b3R5cGUuTj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5pLmFkZChTdHJpbmcoYSksYiwhMSxjLGQpfTtDLnByb3RvdHlwZS5PPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmkuYWRkKFN0cmluZyhhKSxiLCEwLGMsZCl9O1xuZnVuY3Rpb24gcWIoYSxiLGMsZCl7Yj1hLmkuZ1tTdHJpbmcoYildO2lmKCFiKXJldHVybiAhMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5jYSYmaC5jYXB0dXJlPT1jKXt2YXIgbj1oLmxpc3RlbmVyLHU9aC5pYXx8aC5zcmM7aC5mYSYmYmIoYS5pLGgpO2U9ITEhPT1uLmNhbGwodSxkKSYmZTt9fXJldHVybiBlJiYhZC5kZWZhdWx0UHJldmVudGVkfXZhciByYj1sLkpTT04uc3RyaW5naWZ5O2Z1bmN0aW9uIHNiKCl7dmFyIGE9dGI7bGV0IGI9bnVsbDthLmcmJihiPWEuZyxhLmc9YS5nLm5leHQsYS5nfHwoYS5oPW51bGwpLGIubmV4dD1udWxsKTtyZXR1cm4gYn1jbGFzcyB1Yntjb25zdHJ1Y3Rvcigpe3RoaXMuaD10aGlzLmc9bnVsbDt9YWRkKGEsYil7Y29uc3QgYz12Yi5nZXQoKTtjLnNldChhLGIpO3RoaXMuaD90aGlzLmgubmV4dD1jOnRoaXMuZz1jO3RoaXMuaD1jO319dmFyIHZiPW5ldyBjbGFzc3tjb25zdHJ1Y3RvcihhLGIpe3RoaXMuaT1hO3RoaXMuaj1iO3RoaXMuaD0wO3RoaXMuZz1udWxsO31nZXQoKXtsZXQgYTswPHRoaXMuaD8odGhpcy5oLS0sYT10aGlzLmcsdGhpcy5nPWEubmV4dCxhLm5leHQ9bnVsbCk6YT10aGlzLmkoKTtyZXR1cm4gYX19KCgpPT5uZXcgd2IsYT0+YS5yZXNldCgpKTtcbmNsYXNzIHdie2NvbnN0cnVjdG9yKCl7dGhpcy5uZXh0PXRoaXMuZz10aGlzLmg9bnVsbDt9c2V0KGEsYil7dGhpcy5oPWE7dGhpcy5nPWI7dGhpcy5uZXh0PW51bGw7fXJlc2V0KCl7dGhpcy5uZXh0PXRoaXMuZz10aGlzLmg9bnVsbDt9fWZ1bmN0aW9uIHliKGEpe2wuc2V0VGltZW91dCgoKT0+e3Rocm93IGE7fSwwKTt9ZnVuY3Rpb24gemIoYSxiKXtBYnx8QmIoKTtDYnx8KEFiKCksQ2I9ITApO3RiLmFkZChhLGIpO312YXIgQWI7ZnVuY3Rpb24gQmIoKXt2YXIgYT1sLlByb21pc2UucmVzb2x2ZSh2b2lkIDApO0FiPWZ1bmN0aW9uKCl7YS50aGVuKERiKTt9O312YXIgQ2I9ITEsdGI9bmV3IHViO2Z1bmN0aW9uIERiKCl7Zm9yKHZhciBhO2E9c2IoKTspe3RyeXthLmguY2FsbChhLmcpO31jYXRjaChjKXt5YihjKTt9dmFyIGI9dmI7Yi5qKGEpOzEwMD5iLmgmJihiLmgrKyxhLm5leHQ9Yi5nLGIuZz1hKTt9Q2I9ITE7fWZ1bmN0aW9uIEViKGEsYil7Qy5jYWxsKHRoaXMpO3RoaXMuaD1hfHwxO3RoaXMuZz1ifHxsO3RoaXMuaj1xKHRoaXMua2IsdGhpcyk7dGhpcy5sPURhdGUubm93KCk7fXQoRWIsQyk7az1FYi5wcm90b3R5cGU7ay5kYT0hMTtrLlM9bnVsbDtrLmtiPWZ1bmN0aW9uKCl7aWYodGhpcy5kYSl7dmFyIGE9RGF0ZS5ub3coKS10aGlzLmw7MDxhJiZhPC44KnRoaXMuaD90aGlzLlM9dGhpcy5nLnNldFRpbWVvdXQodGhpcy5qLHRoaXMuaC1hKToodGhpcy5TJiYodGhpcy5nLmNsZWFyVGltZW91dCh0aGlzLlMpLHRoaXMuUz1udWxsKSxEKHRoaXMsXCJ0aWNrXCIpLHRoaXMuZGEmJihGYih0aGlzKSx0aGlzLnN0YXJ0KCkpKTt9fTtrLnN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5kYT0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5nLnNldFRpbWVvdXQodGhpcy5qLHRoaXMuaCksdGhpcy5sPURhdGUubm93KCkpO307XG5mdW5jdGlvbiBGYihhKXthLmRhPSExO2EuUyYmKGEuZy5jbGVhclRpbWVvdXQoYS5TKSxhLlM9bnVsbCk7fWsuTT1mdW5jdGlvbigpe0ViLlouTS5jYWxsKHRoaXMpO0ZiKHRoaXMpO2RlbGV0ZSB0aGlzLmc7fTtmdW5jdGlvbiBHYihhLGIsYyl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpYyYmKGE9cShhLGMpKTtlbHNlIGlmKGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuaGFuZGxlRXZlbnQpYT1xKGEuaGFuZGxlRXZlbnQsYSk7ZWxzZSB0aHJvdyBFcnJvcihcIkludmFsaWQgbGlzdGVuZXIgYXJndW1lbnRcIik7cmV0dXJuIDIxNDc0ODM2NDc8TnVtYmVyKGIpPy0xOmwuc2V0VGltZW91dChhLGJ8fDApfWZ1bmN0aW9uIEhiKGEpe2EuZz1HYigoKT0+e2EuZz1udWxsO2EuaSYmKGEuaT0hMSxIYihhKSk7fSxhLmopO2NvbnN0IGI9YS5oO2EuaD1udWxsO2EubS5hcHBseShudWxsLGIpO31jbGFzcyBJYiBleHRlbmRzIHZ7Y29uc3RydWN0b3IoYSxiKXtzdXBlcigpO3RoaXMubT1hO3RoaXMuaj1iO3RoaXMuaD1udWxsO3RoaXMuaT0hMTt0aGlzLmc9bnVsbDt9bChhKXt0aGlzLmg9YXJndW1lbnRzO3RoaXMuZz90aGlzLmk9ITA6SGIodGhpcyk7fU0oKXtzdXBlci5NKCk7dGhpcy5nJiYobC5jbGVhclRpbWVvdXQodGhpcy5nKSx0aGlzLmc9bnVsbCx0aGlzLmk9ITEsdGhpcy5oPW51bGwpO319ZnVuY3Rpb24gRShhKXt2LmNhbGwodGhpcyk7dGhpcy5oPWE7dGhpcy5nPXt9O310KEUsdik7dmFyIEpiPVtdO2Z1bmN0aW9uIEtiKGEsYixjLGQpe0FycmF5LmlzQXJyYXkoYyl8fChjJiYoSmJbMF09Yy50b1N0cmluZygpKSxjPUpiKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9ZmIoYixjW2VdLGR8fGEuaGFuZGxlRXZlbnQsITEsYS5ofHxhKTtpZighZilicmVhazthLmdbZi5rZXldPWY7fX1mdW5jdGlvbiBMYihhKXt4YShhLmcsZnVuY3Rpb24oYixjKXt0aGlzLmcuaGFzT3duUHJvcGVydHkoYykmJm9iKGIpO30sYSk7YS5nPXt9O31FLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7RS5aLk0uY2FsbCh0aGlzKTtMYih0aGlzKTt9O0UucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoXCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkXCIpO307ZnVuY3Rpb24gTWIoKXt0aGlzLmc9ITA7fU1iLnByb3RvdHlwZS5BYT1mdW5jdGlvbigpe3RoaXMuZz0hMTt9O2Z1bmN0aW9uIE5iKGEsYixjLGQsZSxmKXthLmluZm8oZnVuY3Rpb24oKXtpZihhLmcpaWYoZil7dmFyIGg9XCJcIjtmb3IodmFyIG49Zi5zcGxpdChcIiZcIiksdT0wO3U8bi5sZW5ndGg7dSsrKXt2YXIgbT1uW3VdLnNwbGl0KFwiPVwiKTtpZigxPG0ubGVuZ3RoKXt2YXIgcj1tWzBdO209bVsxXTt2YXIgRz1yLnNwbGl0KFwiX1wiKTtoPTI8PUcubGVuZ3RoJiZcInR5cGVcIj09R1sxXT9oKyhyK1wiPVwiK20rXCImXCIpOmgrKHIrXCI9cmVkYWN0ZWQmXCIpO319fWVsc2UgaD1udWxsO2Vsc2UgaD1mO3JldHVybiBcIlhNTEhUVFAgUkVRIChcIitkK1wiKSBbYXR0ZW1wdCBcIitlK1wiXTogXCIrYitcIlxcblwiK2MrXCJcXG5cIitofSk7fVxuZnVuY3Rpb24gT2IoYSxiLGMsZCxlLGYsaCl7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiWE1MSFRUUCBSRVNQIChcIitkK1wiKSBbIGF0dGVtcHQgXCIrZStcIl06IFwiK2IrXCJcXG5cIitjK1wiXFxuXCIrZitcIiBcIitofSk7fWZ1bmN0aW9uIEYoYSxiLGMsZCl7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiWE1MSFRUUCBURVhUIChcIitiK1wiKTogXCIrUGIoYSxjKSsoZD9cIiBcIitkOlwiXCIpfSk7fWZ1bmN0aW9uIFFiKGEsYil7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiVElNRU9VVDogXCIrYn0pO31NYi5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe307XG5mdW5jdGlvbiBQYihhLGIpe2lmKCFhLmcpcmV0dXJuIGI7aWYoIWIpcmV0dXJuIG51bGw7dHJ5e3ZhciBjPUpTT04ucGFyc2UoYik7aWYoYylmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWlmKEFycmF5LmlzQXJyYXkoY1thXSkpe3ZhciBkPWNbYV07aWYoISgyPmQubGVuZ3RoKSl7dmFyIGU9ZFsxXTtpZihBcnJheS5pc0FycmF5KGUpJiYhKDE+ZS5sZW5ndGgpKXt2YXIgZj1lWzBdO2lmKFwibm9vcFwiIT1mJiZcInN0b3BcIiE9ZiYmXCJjbG9zZVwiIT1mKWZvcih2YXIgaD0xO2g8ZS5sZW5ndGg7aCsrKWVbaF09XCJcIjt9fX1yZXR1cm4gcmIoYyl9Y2F0Y2gobil7cmV0dXJuIGJ9fXZhciBIPXt9LFJiPW51bGw7ZnVuY3Rpb24gU2IoKXtyZXR1cm4gUmI9UmJ8fG5ldyBDfUguTWE9XCJzZXJ2ZXJyZWFjaGFiaWxpdHlcIjtmdW5jdGlvbiBUYihhKXt6LmNhbGwodGhpcyxILk1hLGEpO310KFRiLHopO2Z1bmN0aW9uIEkoYSl7Y29uc3QgYj1TYigpO0QoYixuZXcgVGIoYixhKSk7fUguU1RBVF9FVkVOVD1cInN0YXRldmVudFwiO2Z1bmN0aW9uIFViKGEsYil7ei5jYWxsKHRoaXMsSC5TVEFUX0VWRU5ULGEpO3RoaXMuc3RhdD1iO310KFViLHopO2Z1bmN0aW9uIEooYSl7Y29uc3QgYj1TYigpO0QoYixuZXcgVWIoYixhKSk7fUguTmE9XCJ0aW1pbmdldmVudFwiO2Z1bmN0aW9uIFZiKGEsYil7ei5jYWxsKHRoaXMsSC5OYSxhKTt0aGlzLnNpemU9Yjt9dChWYix6KTtcbmZ1bmN0aW9uIEsoYSxiKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIkZuIG11c3Qgbm90IGJlIG51bGwgYW5kIG11c3QgYmUgYSBmdW5jdGlvblwiKTtyZXR1cm4gbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSgpO30sYil9dmFyIFdiPXtOT19FUlJPUjowLGxiOjEseWI6Mix4YjozLHNiOjQsd2I6NSx6Yjo2LEphOjcsVElNRU9VVDo4LENiOjl9O3ZhciBYYj17cWI6XCJjb21wbGV0ZVwiLE1iOlwic3VjY2Vzc1wiLEthOlwiZXJyb3JcIixKYTpcImFib3J0XCIsRWI6XCJyZWFkeVwiLEZiOlwicmVhZHlzdGF0ZWNoYW5nZVwiLFRJTUVPVVQ6XCJ0aW1lb3V0XCIsQWI6XCJpbmNyZW1lbnRhbGRhdGFcIixEYjpcInByb2dyZXNzXCIsdGI6XCJkb3dubG9hZHByb2dyZXNzXCIsVWI6XCJ1cGxvYWRwcm9ncmVzc1wifTtmdW5jdGlvbiBZYigpe31ZYi5wcm90b3R5cGUuaD1udWxsO2Z1bmN0aW9uIFpiKGEpe3JldHVybiBhLmh8fChhLmg9YS5pKCkpfWZ1bmN0aW9uICRiKCl7fXZhciBMPXtPUEVOOlwiYVwiLHBiOlwiYlwiLEthOlwiY1wiLEJiOlwiZFwifTtmdW5jdGlvbiBhYygpe3ouY2FsbCh0aGlzLFwiZFwiKTt9dChhYyx6KTtmdW5jdGlvbiBiYygpe3ouY2FsbCh0aGlzLFwiY1wiKTt9dChiYyx6KTt2YXIgY2M7ZnVuY3Rpb24gZGMoKXt9dChkYyxZYik7ZGMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fTtkYy5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB7fX07Y2M9bmV3IGRjO2Z1bmN0aW9uIE0oYSxiLGMsZCl7dGhpcy5sPWE7dGhpcy5qPWI7dGhpcy5tPWM7dGhpcy5YPWR8fDE7dGhpcy5WPW5ldyBFKHRoaXMpO3RoaXMuUD1lYzthPUphPzEyNTp2b2lkIDA7dGhpcy5XPW5ldyBFYihhKTt0aGlzLkg9bnVsbDt0aGlzLmk9ITE7dGhpcy5zPXRoaXMuQT10aGlzLnY9dGhpcy5LPXRoaXMuRj10aGlzLlk9dGhpcy5CPW51bGw7dGhpcy5EPVtdO3RoaXMuZz1udWxsO3RoaXMuQz0wO3RoaXMubz10aGlzLnU9bnVsbDt0aGlzLk49LTE7dGhpcy5JPSExO3RoaXMuTz0wO3RoaXMuTD1udWxsO3RoaXMuYWE9dGhpcy5KPXRoaXMuJD10aGlzLlU9ITE7dGhpcy5oPW5ldyBmYzt9ZnVuY3Rpb24gZmMoKXt0aGlzLmk9bnVsbDt0aGlzLmc9XCJcIjt0aGlzLmg9ITE7fXZhciBlYz00NUUzLGdjPXt9LGhjPXt9O2s9TS5wcm90b3R5cGU7ay5zZXRUaW1lb3V0PWZ1bmN0aW9uKGEpe3RoaXMuUD1hO307XG5mdW5jdGlvbiBpYyhhLGIsYyl7YS5LPTE7YS52PWpjKE4oYikpO2Eucz1jO2EuVT0hMDtrYyhhLG51bGwpO31mdW5jdGlvbiBrYyhhLGIpe2EuRj1EYXRlLm5vdygpO2xjKGEpO2EuQT1OKGEudik7dmFyIGM9YS5BLGQ9YS5YO0FycmF5LmlzQXJyYXkoZCl8fChkPVtTdHJpbmcoZCldKTttYyhjLmgsXCJ0XCIsZCk7YS5DPTA7Yz1hLmwuSDthLmg9bmV3IGZjO2EuZz1uYyhhLmwsYz9iOm51bGwsIWEucyk7MDxhLk8mJihhLkw9bmV3IEliKHEoYS5JYSxhLGEuZyksYS5PKSk7S2IoYS5WLGEuZyxcInJlYWR5c3RhdGVjaGFuZ2VcIixhLmdiKTtiPWEuSD95YShhLkgpOnt9O2Eucz8oYS51fHwoYS51PVwiUE9TVFwiKSxiW1wiQ29udGVudC1UeXBlXCJdPVwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsYS5nLmVhKGEuQSxhLnUsYS5zLGIpKTooYS51PVwiR0VUXCIsYS5nLmVhKGEuQSxhLnUsbnVsbCxiKSk7SSgxKTtOYihhLmosYS51LGEuQSxhLm0sYS5YLGEucyk7fVxuay5nYj1mdW5jdGlvbihhKXthPWEudGFyZ2V0O2NvbnN0IGI9dGhpcy5MO2ImJjM9PU8oYSk/Yi5sKCk6dGhpcy5JYShhKTt9O1xuay5JYT1mdW5jdGlvbihhKXt0cnl7aWYoYT09dGhpcy5nKWE6e2NvbnN0IHI9Tyh0aGlzLmcpO3ZhciBiPXRoaXMuZy5EYSgpO2NvbnN0IEc9dGhpcy5nLmJhKCk7aWYoISgzPnIpJiYoMyE9cnx8SmF8fHRoaXMuZyYmKHRoaXMuaC5ofHx0aGlzLmcuZ2EoKXx8b2ModGhpcy5nKSkpKXt0aGlzLkl8fDQhPXJ8fDc9PWJ8fCg4PT1ifHwwPj1HP0koMyk6SSgyKSk7cGModGhpcyk7dmFyIGM9dGhpcy5nLmJhKCk7dGhpcy5OPWM7YjppZihxYyh0aGlzKSl7dmFyIGQ9b2ModGhpcy5nKTthPVwiXCI7dmFyIGU9ZC5sZW5ndGgsZj00PT1PKHRoaXMuZyk7aWYoIXRoaXMuaC5pKXtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIFRleHREZWNvZGVyKXtQKHRoaXMpO3JjKHRoaXMpO3ZhciBoPVwiXCI7YnJlYWsgYn10aGlzLmguaT1uZXcgbC5UZXh0RGVjb2Rlcjt9Zm9yKGI9MDtiPGU7YisrKXRoaXMuaC5oPSEwLGErPXRoaXMuaC5pLmRlY29kZShkW2JdLHtzdHJlYW06ZiYmYj09ZS0xfSk7ZC5zcGxpY2UoMCxcbmUpO3RoaXMuaC5nKz1hO3RoaXMuQz0wO2g9dGhpcy5oLmc7fWVsc2UgaD10aGlzLmcuZ2EoKTt0aGlzLmk9MjAwPT1jO09iKHRoaXMuaix0aGlzLnUsdGhpcy5BLHRoaXMubSx0aGlzLlgscixjKTtpZih0aGlzLmkpe2lmKHRoaXMuJCYmIXRoaXMuSil7Yjp7aWYodGhpcy5nKXt2YXIgbix1PXRoaXMuZztpZigobj11Lmc/dS5nLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1IVFRQLUluaXRpYWwtUmVzcG9uc2VcIik6bnVsbCkmJiFzYShuKSl7dmFyIG09bjticmVhayBifX1tPW51bGw7fWlmKGM9bSlGKHRoaXMuaix0aGlzLm0sYyxcIkluaXRpYWwgaGFuZHNoYWtlIHJlc3BvbnNlIHZpYSBYLUhUVFAtSW5pdGlhbC1SZXNwb25zZVwiKSx0aGlzLko9ITAsc2ModGhpcyxjKTtlbHNlIHt0aGlzLmk9ITE7dGhpcy5vPTM7SigxMik7UCh0aGlzKTtyYyh0aGlzKTticmVhayBhfX10aGlzLlU/KHRjKHRoaXMscixoKSxKYSYmdGhpcy5pJiYzPT1yJiYoS2IodGhpcy5WLHRoaXMuVyxcInRpY2tcIix0aGlzLmZiKSxcbnRoaXMuVy5zdGFydCgpKSk6KEYodGhpcy5qLHRoaXMubSxoLG51bGwpLHNjKHRoaXMsaCkpOzQ9PXImJlAodGhpcyk7dGhpcy5pJiYhdGhpcy5JJiYoND09cj91Yyh0aGlzLmwsdGhpcyk6KHRoaXMuaT0hMSxsYyh0aGlzKSkpO31lbHNlIDQwMD09YyYmMDxoLmluZGV4T2YoXCJVbmtub3duIFNJRFwiKT8odGhpcy5vPTMsSigxMikpOih0aGlzLm89MCxKKDEzKSksUCh0aGlzKSxyYyh0aGlzKTt9fX1jYXRjaChyKXt9ZmluYWxseXt9fTtmdW5jdGlvbiBxYyhhKXtyZXR1cm4gYS5nP1wiR0VUXCI9PWEudSYmMiE9YS5LJiZhLmwuQmE6ITF9XG5mdW5jdGlvbiB0YyhhLGIsYyl7bGV0IGQ9ITAsZTtmb3IoOyFhLkkmJmEuQzxjLmxlbmd0aDspaWYoZT12YyhhLGMpLGU9PWhjKXs0PT1iJiYoYS5vPTQsSigxNCksZD0hMSk7RihhLmosYS5tLG51bGwsXCJbSW5jb21wbGV0ZSBSZXNwb25zZV1cIik7YnJlYWt9ZWxzZSBpZihlPT1nYyl7YS5vPTQ7SigxNSk7RihhLmosYS5tLGMsXCJbSW52YWxpZCBDaHVua11cIik7ZD0hMTticmVha31lbHNlIEYoYS5qLGEubSxlLG51bGwpLHNjKGEsZSk7cWMoYSkmJmUhPWhjJiZlIT1nYyYmKGEuaC5nPVwiXCIsYS5DPTApOzQhPWJ8fDAhPWMubGVuZ3RofHxhLmguaHx8KGEubz0xLEooMTYpLGQ9ITEpO2EuaT1hLmkmJmQ7ZD8wPGMubGVuZ3RoJiYhYS5hYSYmKGEuYWE9ITAsYj1hLmwsYi5nPT1hJiZiLiQmJiFiLkwmJihiLmguaW5mbyhcIkdyZWF0LCBubyBidWZmZXJpbmcgcHJveHkgZGV0ZWN0ZWQuIEJ5dGVzIHJlY2VpdmVkOiBcIitjLmxlbmd0aCksd2MoYiksYi5MPSEwLEooMTEpKSk6KEYoYS5qLGEubSxcbmMsXCJbSW52YWxpZCBDaHVua2VkIFJlc3BvbnNlXVwiKSxQKGEpLHJjKGEpKTt9ay5mYj1mdW5jdGlvbigpe2lmKHRoaXMuZyl7dmFyIGE9Tyh0aGlzLmcpLGI9dGhpcy5nLmdhKCk7dGhpcy5DPGIubGVuZ3RoJiYocGModGhpcyksdGModGhpcyxhLGIpLHRoaXMuaSYmNCE9YSYmbGModGhpcykpO319O2Z1bmN0aW9uIHZjKGEsYil7dmFyIGM9YS5DLGQ9Yi5pbmRleE9mKFwiXFxuXCIsYyk7aWYoLTE9PWQpcmV0dXJuIGhjO2M9TnVtYmVyKGIuc3Vic3RyaW5nKGMsZCkpO2lmKGlzTmFOKGMpKXJldHVybiBnYztkKz0xO2lmKGQrYz5iLmxlbmd0aClyZXR1cm4gaGM7Yj1iLnN1YnN0cihkLGMpO2EuQz1kK2M7cmV0dXJuIGJ9ay5jYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLkk9ITA7UCh0aGlzKTt9O2Z1bmN0aW9uIGxjKGEpe2EuWT1EYXRlLm5vdygpK2EuUDt4YyhhLGEuUCk7fVxuZnVuY3Rpb24geGMoYSxiKXtpZihudWxsIT1hLkIpdGhyb3cgRXJyb3IoXCJXYXRjaERvZyB0aW1lciBub3QgbnVsbFwiKTthLkI9SyhxKGEuZWIsYSksYik7fWZ1bmN0aW9uIHBjKGEpe2EuQiYmKGwuY2xlYXJUaW1lb3V0KGEuQiksYS5CPW51bGwpO31rLmViPWZ1bmN0aW9uKCl7dGhpcy5CPW51bGw7Y29uc3QgYT1EYXRlLm5vdygpOzA8PWEtdGhpcy5ZPyhRYih0aGlzLmosdGhpcy5BKSwyIT10aGlzLksmJihJKDMpLEooMTcpKSxQKHRoaXMpLHRoaXMubz0yLHJjKHRoaXMpKTp4Yyh0aGlzLHRoaXMuWS1hKTt9O2Z1bmN0aW9uIHJjKGEpezA9PWEubC5HfHxhLkl8fHVjKGEubCxhKTt9ZnVuY3Rpb24gUChhKXtwYyhhKTt2YXIgYj1hLkw7YiYmXCJmdW5jdGlvblwiPT10eXBlb2YgYi5uYSYmYi5uYSgpO2EuTD1udWxsO0ZiKGEuVyk7TGIoYS5WKTthLmcmJihiPWEuZyxhLmc9bnVsbCxiLmFib3J0KCksYi5uYSgpKTt9XG5mdW5jdGlvbiBzYyhhLGIpe3RyeXt2YXIgYz1hLmw7aWYoMCE9Yy5HJiYoYy5nPT1hfHx5YyhjLmksYSkpKWlmKGMuST1hLk4sIWEuSiYmeWMoYy5pLGEpJiYzPT1jLkcpe3RyeXt2YXIgZD1jLkNhLmcucGFyc2UoYik7fWNhdGNoKG0pe2Q9bnVsbDt9aWYoQXJyYXkuaXNBcnJheShkKSYmMz09ZC5sZW5ndGgpe3ZhciBlPWQ7aWYoMD09ZVswXSlhOntpZighYy51KXtpZihjLmcpaWYoYy5nLkYrM0UzPGEuRil6YyhjKSxBYyhjKTtlbHNlIGJyZWFrIGE7QmMoYyk7SigxOCk7fX1lbHNlIGMudGE9ZVsxXSwwPGMudGEtYy5VJiYzNzUwMD5lWzJdJiZjLk4mJjA9PWMuQSYmIWMudiYmKGMudj1LKHEoYy5hYixjKSw2RTMpKTtpZigxPj1DYyhjLmkpJiZjLmthKXt0cnl7Yy5rYSgpO31jYXRjaChtKXt9Yy5rYT12b2lkIDA7fX1lbHNlIFEoYywxMSk7fWVsc2UgaWYoKGEuSnx8Yy5nPT1hKSYmemMoYyksIXNhKGIpKWZvcihlPWMuQ2EuZy5wYXJzZShiKSxiPTA7YjxlLmxlbmd0aDtiKyspe2xldCBtPWVbYl07XG5jLlU9bVswXTttPW1bMV07aWYoMj09Yy5HKWlmKFwiY1wiPT1tWzBdKXtjLko9bVsxXTtjLmxhPW1bMl07Y29uc3Qgcj1tWzNdO251bGwhPXImJihjLm1hPXIsYy5oLmluZm8oXCJWRVI9XCIrYy5tYSkpO2NvbnN0IEc9bVs0XTtudWxsIT1HJiYoYy56YT1HLGMuaC5pbmZvKFwiU1ZFUj1cIitjLnphKSk7Y29uc3QgRGE9bVs1XTtudWxsIT1EYSYmXCJudW1iZXJcIj09PXR5cGVvZiBEYSYmMDxEYSYmKGQ9MS41KkRhLGMuSz1kLGMuaC5pbmZvKFwiYmFja0NoYW5uZWxSZXF1ZXN0VGltZW91dE1zXz1cIitkKSk7ZD1jO2NvbnN0IGNhPWEuZztpZihjYSl7Y29uc3QgRWE9Y2EuZz9jYS5nLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1DbGllbnQtV2lyZS1Qcm90b2NvbFwiKTpudWxsO2lmKEVhKXt2YXIgZj1kLmk7IWYuZyYmKHcoRWEsXCJzcGR5XCIpfHx3KEVhLFwicXVpY1wiKXx8dyhFYSxcImgyXCIpKSYmKGYuaj1mLmwsZi5nPW5ldyBTZXQsZi5oJiYoRGMoZixmLmgpLGYuaD1udWxsKSk7fWlmKGQuRCl7Y29uc3QgeGI9XG5jYS5nP2NhLmcuZ2V0UmVzcG9uc2VIZWFkZXIoXCJYLUhUVFAtU2Vzc2lvbi1JZFwiKTpudWxsO3hiJiYoZC5zYT14YixSKGQuRixkLkQseGIpKTt9fWMuRz0zO2MuaiYmYy5qLnhhKCk7Yy4kJiYoYy5PPURhdGUubm93KCktYS5GLGMuaC5pbmZvKFwiSGFuZHNoYWtlIFJUVDogXCIrYy5PK1wibXNcIikpO2Q9Yzt2YXIgaD1hO2Qub2E9RWMoZCxkLkg/ZC5sYTpudWxsLGQuVyk7aWYoaC5KKXtGYyhkLmksaCk7dmFyIG49aCx1PWQuSzt1JiZuLnNldFRpbWVvdXQodSk7bi5CJiYocGMobiksbGMobikpO2QuZz1oO31lbHNlIEdjKGQpOzA8Yy5sLmxlbmd0aCYmSGMoYyk7fWVsc2UgXCJzdG9wXCIhPW1bMF0mJlwiY2xvc2VcIiE9bVswXXx8UShjLDcpO2Vsc2UgMz09Yy5HJiYoXCJzdG9wXCI9PW1bMF18fFwiY2xvc2VcIj09bVswXT9cInN0b3BcIj09bVswXT9RKGMsNyk6SWMoYyk6XCJub29wXCIhPW1bMF0mJmMuaiYmYy5qLndhKG0pLGMuQT0wKTt9SSg0KTt9Y2F0Y2gobSl7fX1mdW5jdGlvbiBKYyhhKXtpZihhLlImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuUilyZXR1cm4gYS5SKCk7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBhLnNwbGl0KFwiXCIpO2lmKGJhKGEpKXtmb3IodmFyIGI9W10sYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyliLnB1c2goYVtkXSk7cmV0dXJuIGJ9Yj1bXTtjPTA7Zm9yKGQgaW4gYSliW2MrK109YVtkXTtyZXR1cm4gYn1cbmZ1bmN0aW9uIEtjKGEsYil7aWYoYS5mb3JFYWNoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmZvckVhY2gpYS5mb3JFYWNoKGIsdm9pZCAwKTtlbHNlIGlmKGJhKGEpfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpbmEoYSxiLHZvaWQgMCk7ZWxzZSB7aWYoYS5UJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLlQpdmFyIGM9YS5UKCk7ZWxzZSBpZihhLlImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuUiljPXZvaWQgMDtlbHNlIGlmKGJhKGEpfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpe2M9W107Zm9yKHZhciBkPWEubGVuZ3RoLGU9MDtlPGQ7ZSsrKWMucHVzaChlKTt9ZWxzZSBmb3IoZSBpbiBjPVtdLGQ9MCxhKWNbZCsrXT1lO2Q9SmMoYSk7ZT1kLmxlbmd0aDtmb3IodmFyIGY9MDtmPGU7ZisrKWIuY2FsbCh2b2lkIDAsZFtmXSxjJiZjW2ZdLGEpO319ZnVuY3Rpb24gUyhhLGIpe3RoaXMuaD17fTt0aGlzLmc9W107dGhpcy5pPTA7dmFyIGM9YXJndW1lbnRzLmxlbmd0aDtpZigxPGMpe2lmKGMlMil0aHJvdyBFcnJvcihcIlVuZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzXCIpO2Zvcih2YXIgZD0wO2Q8YztkKz0yKXRoaXMuc2V0KGFyZ3VtZW50c1tkXSxhcmd1bWVudHNbZCsxXSk7fWVsc2UgaWYoYSlpZihhIGluc3RhbmNlb2YgUylmb3IoYz1hLlQoKSxkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5zZXQoY1tkXSxhLmdldChjW2RdKSk7ZWxzZSBmb3IoZCBpbiBhKXRoaXMuc2V0KGQsYVtkXSk7fWs9Uy5wcm90b3R5cGU7ay5SPWZ1bmN0aW9uKCl7TGModGhpcyk7Zm9yKHZhciBhPVtdLGI9MDtiPHRoaXMuZy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmhbdGhpcy5nW2JdXSk7cmV0dXJuIGF9O2suVD1mdW5jdGlvbigpe0xjKHRoaXMpO3JldHVybiB0aGlzLmcuY29uY2F0KCl9O1xuZnVuY3Rpb24gTGMoYSl7aWYoYS5pIT1hLmcubGVuZ3RoKXtmb3IodmFyIGI9MCxjPTA7YjxhLmcubGVuZ3RoOyl7dmFyIGQ9YS5nW2JdO1QoYS5oLGQpJiYoYS5nW2MrK109ZCk7YisrO31hLmcubGVuZ3RoPWM7fWlmKGEuaSE9YS5nLmxlbmd0aCl7dmFyIGU9e307Zm9yKGM9Yj0wO2I8YS5nLmxlbmd0aDspZD1hLmdbYl0sVChlLGQpfHwoYS5nW2MrK109ZCxlW2RdPTEpLGIrKzthLmcubGVuZ3RoPWM7fX1rLmdldD1mdW5jdGlvbihhLGIpe3JldHVybiBUKHRoaXMuaCxhKT90aGlzLmhbYV06Yn07ay5zZXQ9ZnVuY3Rpb24oYSxiKXtUKHRoaXMuaCxhKXx8KHRoaXMuaSsrLHRoaXMuZy5wdXNoKGEpKTt0aGlzLmhbYV09Yjt9O2suZm9yRWFjaD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz10aGlzLlQoKSxkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0sZj10aGlzLmdldChlKTthLmNhbGwoYixmLGUsdGhpcyk7fX07XG5mdW5jdGlvbiBUKGEsYil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpfXZhciBNYz0vXig/OihbXjovPyMuXSspOik/KD86XFwvXFwvKD86KFteXFxcXC8/I10qKUApPyhbXlxcXFwvPyNdKj8pKD86OihbMC05XSspKT8oPz1bXFxcXC8/I118JCkpPyhbXj8jXSspPyg/OlxcPyhbXiNdKikpPyg/OiMoW1xcc1xcU10qKSk/JC87ZnVuY3Rpb24gTmMoYSxiKXtpZihhKXthPWEuc3BsaXQoXCImXCIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdLmluZGV4T2YoXCI9XCIpLGU9bnVsbDtpZigwPD1kKXt2YXIgZj1hW2NdLnN1YnN0cmluZygwLGQpO2U9YVtjXS5zdWJzdHJpbmcoZCsxKTt9ZWxzZSBmPWFbY107YihmLGU/ZGVjb2RlVVJJQ29tcG9uZW50KGUucmVwbGFjZSgvXFwrL2csXCIgXCIpKTpcIlwiKTt9fX1mdW5jdGlvbiBVKGEsYil7dGhpcy5pPXRoaXMucz10aGlzLmo9XCJcIjt0aGlzLm09bnVsbDt0aGlzLm89dGhpcy5sPVwiXCI7dGhpcy5nPSExO2lmKGEgaW5zdGFuY2VvZiBVKXt0aGlzLmc9dm9pZCAwIT09Yj9iOmEuZztPYyh0aGlzLGEuaik7dGhpcy5zPWEucztQYyh0aGlzLGEuaSk7UWModGhpcyxhLm0pO3RoaXMubD1hLmw7Yj1hLmg7dmFyIGM9bmV3IFJjO2MuaT1iLmk7Yi5nJiYoYy5nPW5ldyBTKGIuZyksYy5oPWIuaCk7U2ModGhpcyxjKTt0aGlzLm89YS5vO31lbHNlIGEmJihjPVN0cmluZyhhKS5tYXRjaChNYykpPyh0aGlzLmc9ISFiLE9jKHRoaXMsY1sxXXx8XCJcIiwhMCksdGhpcy5zPVRjKGNbMl18fFwiXCIpLFBjKHRoaXMsY1szXXx8XCJcIiwhMCksUWModGhpcyxjWzRdKSx0aGlzLmw9VGMoY1s1XXx8XCJcIiwhMCksU2ModGhpcyxjWzZdfHxcIlwiLCEwKSx0aGlzLm89VGMoY1s3XXx8XCJcIikpOih0aGlzLmc9ISFiLHRoaXMuaD1uZXcgUmMobnVsbCx0aGlzLmcpKTt9XG5VLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPVtdLGI9dGhpcy5qO2ImJmEucHVzaChVYyhiLFZjLCEwKSxcIjpcIik7dmFyIGM9dGhpcy5pO2lmKGN8fFwiZmlsZVwiPT1iKWEucHVzaChcIi8vXCIpLChiPXRoaXMucykmJmEucHVzaChVYyhiLFZjLCEwKSxcIkBcIiksYS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYykpLnJlcGxhY2UoLyUyNShbMC05YS1mQS1GXXsyfSkvZyxcIiUkMVwiKSksYz10aGlzLm0sbnVsbCE9YyYmYS5wdXNoKFwiOlwiLFN0cmluZyhjKSk7aWYoYz10aGlzLmwpdGhpcy5pJiZcIi9cIiE9Yy5jaGFyQXQoMCkmJmEucHVzaChcIi9cIiksYS5wdXNoKFVjKGMsXCIvXCI9PWMuY2hhckF0KDApP1djOlhjLCEwKSk7KGM9dGhpcy5oLnRvU3RyaW5nKCkpJiZhLnB1c2goXCI/XCIsYyk7KGM9dGhpcy5vKSYmYS5wdXNoKFwiI1wiLFVjKGMsWWMpKTtyZXR1cm4gYS5qb2luKFwiXCIpfTtmdW5jdGlvbiBOKGEpe3JldHVybiBuZXcgVShhKX1cbmZ1bmN0aW9uIE9jKGEsYixjKXthLmo9Yz9UYyhiLCEwKTpiO2EuaiYmKGEuaj1hLmoucmVwbGFjZSgvOiQvLFwiXCIpKTt9ZnVuY3Rpb24gUGMoYSxiLGMpe2EuaT1jP1RjKGIsITApOmI7fWZ1bmN0aW9uIFFjKGEsYil7aWYoYil7Yj1OdW1iZXIoYik7aWYoaXNOYU4oYil8fDA+Yil0aHJvdyBFcnJvcihcIkJhZCBwb3J0IG51bWJlciBcIitiKTthLm09Yjt9ZWxzZSBhLm09bnVsbDt9ZnVuY3Rpb24gU2MoYSxiLGMpe2IgaW5zdGFuY2VvZiBSYz8oYS5oPWIsWmMoYS5oLGEuZykpOihjfHwoYj1VYyhiLCRjKSksYS5oPW5ldyBSYyhiLGEuZykpO31mdW5jdGlvbiBSKGEsYixjKXthLmguc2V0KGIsYyk7fWZ1bmN0aW9uIGpjKGEpe1IoYSxcInp4XCIsTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KStNYXRoLmFicyhNYXRoLmZsb29yKDIxNDc0ODM2NDgqTWF0aC5yYW5kb20oKSleRGF0ZS5ub3coKSkudG9TdHJpbmcoMzYpKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIGFkKGEpe3JldHVybiBhIGluc3RhbmNlb2YgVT9OKGEpOm5ldyBVKGEsdm9pZCAwKX1mdW5jdGlvbiBiZChhLGIsYyxkKXt2YXIgZT1uZXcgVShudWxsLHZvaWQgMCk7YSYmT2MoZSxhKTtiJiZQYyhlLGIpO2MmJlFjKGUsYyk7ZCYmKGUubD1kKTtyZXR1cm4gZX1mdW5jdGlvbiBUYyhhLGIpe3JldHVybiBhP2I/ZGVjb2RlVVJJKGEucmVwbGFjZSgvJTI1L2csXCIlMjUyNVwiKSk6ZGVjb2RlVVJJQ29tcG9uZW50KGEpOlwiXCJ9ZnVuY3Rpb24gVWMoYSxiLGMpe3JldHVybiBcInN0cmluZ1wiPT09dHlwZW9mIGE/KGE9ZW5jb2RlVVJJKGEpLnJlcGxhY2UoYixjZCksYyYmKGE9YS5yZXBsYWNlKC8lMjUoWzAtOWEtZkEtRl17Mn0pL2csXCIlJDFcIikpLGEpOm51bGx9ZnVuY3Rpb24gY2QoYSl7YT1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIFwiJVwiKyhhPj40JjE1KS50b1N0cmluZygxNikrKGEmMTUpLnRvU3RyaW5nKDE2KX1cbnZhciBWYz0vWyNcXC9cXD9AXS9nLFhjPS9bI1xcPzpdL2csV2M9L1sjXFw/XS9nLCRjPS9bI1xcP0BdL2csWWM9LyMvZztmdW5jdGlvbiBSYyhhLGIpe3RoaXMuaD10aGlzLmc9bnVsbDt0aGlzLmk9YXx8bnVsbDt0aGlzLmo9ISFiO31mdW5jdGlvbiBWKGEpe2EuZ3x8KGEuZz1uZXcgUyxhLmg9MCxhLmkmJk5jKGEuaSxmdW5jdGlvbihiLGMpe2EuYWRkKGRlY29kZVVSSUNvbXBvbmVudChiLnJlcGxhY2UoL1xcKy9nLFwiIFwiKSksYyk7fSkpO31rPVJjLnByb3RvdHlwZTtrLmFkZD1mdW5jdGlvbihhLGIpe1YodGhpcyk7dGhpcy5pPW51bGw7YT1XKHRoaXMsYSk7dmFyIGM9dGhpcy5nLmdldChhKTtjfHx0aGlzLmcuc2V0KGEsYz1bXSk7Yy5wdXNoKGIpO3RoaXMuaCs9MTtyZXR1cm4gdGhpc307XG5mdW5jdGlvbiBkZChhLGIpe1YoYSk7Yj1XKGEsYik7VChhLmcuaCxiKSYmKGEuaT1udWxsLGEuaC09YS5nLmdldChiKS5sZW5ndGgsYT1hLmcsVChhLmgsYikmJihkZWxldGUgYS5oW2JdLGEuaS0tLGEuZy5sZW5ndGg+MiphLmkmJkxjKGEpKSk7fWZ1bmN0aW9uIGVkKGEsYil7VihhKTtiPVcoYSxiKTtyZXR1cm4gVChhLmcuaCxiKX1rLmZvckVhY2g9ZnVuY3Rpb24oYSxiKXtWKHRoaXMpO3RoaXMuZy5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7bmEoYyxmdW5jdGlvbihlKXthLmNhbGwoYixlLGQsdGhpcyk7fSx0aGlzKTt9LHRoaXMpO307ay5UPWZ1bmN0aW9uKCl7Vih0aGlzKTtmb3IodmFyIGE9dGhpcy5nLlIoKSxiPXRoaXMuZy5UKCksYz1bXSxkPTA7ZDxiLmxlbmd0aDtkKyspZm9yKHZhciBlPWFbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKWMucHVzaChiW2RdKTtyZXR1cm4gY307XG5rLlI9ZnVuY3Rpb24oYSl7Vih0aGlzKTt2YXIgYj1bXTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpZWQodGhpcyxhKSYmKGI9cWEoYix0aGlzLmcuZ2V0KFcodGhpcyxhKSkpKTtlbHNlIHthPXRoaXMuZy5SKCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1xYShiLGFbY10pO31yZXR1cm4gYn07ay5zZXQ9ZnVuY3Rpb24oYSxiKXtWKHRoaXMpO3RoaXMuaT1udWxsO2E9Vyh0aGlzLGEpO2VkKHRoaXMsYSkmJih0aGlzLmgtPXRoaXMuZy5nZXQoYSkubGVuZ3RoKTt0aGlzLmcuc2V0KGEsW2JdKTt0aGlzLmgrPTE7cmV0dXJuIHRoaXN9O2suZ2V0PWZ1bmN0aW9uKGEsYil7aWYoIWEpcmV0dXJuIGI7YT10aGlzLlIoYSk7cmV0dXJuIDA8YS5sZW5ndGg/U3RyaW5nKGFbMF0pOmJ9O2Z1bmN0aW9uIG1jKGEsYixjKXtkZChhLGIpOzA8Yy5sZW5ndGgmJihhLmk9bnVsbCxhLmcuc2V0KFcoYSxiKSxyYShjKSksYS5oKz1jLmxlbmd0aCk7fVxuay50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMuaSlyZXR1cm4gdGhpcy5pO2lmKCF0aGlzLmcpcmV0dXJuIFwiXCI7Zm9yKHZhciBhPVtdLGI9dGhpcy5nLlQoKSxjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY10sZT1lbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGQpKTtkPXRoaXMuUihkKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGg9ZTtcIlwiIT09ZFtmXSYmKGgrPVwiPVwiK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZFtmXSkpKTthLnB1c2goaCk7fX1yZXR1cm4gdGhpcy5pPWEuam9pbihcIiZcIil9O2Z1bmN0aW9uIFcoYSxiKXtiPVN0cmluZyhiKTthLmomJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gWmMoYSxiKXtiJiYhYS5qJiYoVihhKSxhLmk9bnVsbCxhLmcuZm9yRWFjaChmdW5jdGlvbihjLGQpe3ZhciBlPWQudG9Mb3dlckNhc2UoKTtkIT1lJiYoZGQodGhpcyxkKSxtYyh0aGlzLGUsYykpO30sYSkpO2Euaj1iO312YXIgZmQ9Y2xhc3N7Y29uc3RydWN0b3IoYSxiKXt0aGlzLmg9YTt0aGlzLmc9Yjt9fTtmdW5jdGlvbiBnZChhKXt0aGlzLmw9YXx8aGQ7bC5QZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmc/KGE9bC5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKFwibmF2aWdhdGlvblwiKSxhPTA8YS5sZW5ndGgmJihcImhxXCI9PWFbMF0ubmV4dEhvcFByb3RvY29sfHxcImgyXCI9PWFbMF0ubmV4dEhvcFByb3RvY29sKSk6YT0hIShsLmcmJmwuZy5FYSYmbC5nLkVhKCkmJmwuZy5FYSgpLlpiKTt0aGlzLmo9YT90aGlzLmw6MTt0aGlzLmc9bnVsbDsxPHRoaXMuaiYmKHRoaXMuZz1uZXcgU2V0KTt0aGlzLmg9bnVsbDt0aGlzLmk9W107fXZhciBoZD0xMDtmdW5jdGlvbiBpZChhKXtyZXR1cm4gYS5oPyEwOmEuZz9hLmcuc2l6ZT49YS5qOiExfWZ1bmN0aW9uIENjKGEpe3JldHVybiBhLmg/MTphLmc/YS5nLnNpemU6MH1mdW5jdGlvbiB5YyhhLGIpe3JldHVybiBhLmg/YS5oPT1iOmEuZz9hLmcuaGFzKGIpOiExfWZ1bmN0aW9uIERjKGEsYil7YS5nP2EuZy5hZGQoYik6YS5oPWI7fVxuZnVuY3Rpb24gRmMoYSxiKXthLmgmJmEuaD09Yj9hLmg9bnVsbDphLmcmJmEuZy5oYXMoYikmJmEuZy5kZWxldGUoYik7fWdkLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLmk9amQodGhpcyk7aWYodGhpcy5oKXRoaXMuaC5jYW5jZWwoKSx0aGlzLmg9bnVsbDtlbHNlIGlmKHRoaXMuZyYmMCE9PXRoaXMuZy5zaXplKXtmb3IoY29uc3QgYSBvZiB0aGlzLmcudmFsdWVzKCkpYS5jYW5jZWwoKTt0aGlzLmcuY2xlYXIoKTt9fTtmdW5jdGlvbiBqZChhKXtpZihudWxsIT1hLmgpcmV0dXJuIGEuaS5jb25jYXQoYS5oLkQpO2lmKG51bGwhPWEuZyYmMCE9PWEuZy5zaXplKXtsZXQgYj1hLmk7Zm9yKGNvbnN0IGMgb2YgYS5nLnZhbHVlcygpKWI9Yi5jb25jYXQoYy5EKTtyZXR1cm4gYn1yZXR1cm4gcmEoYS5pKX1mdW5jdGlvbiBrZCgpe31rZC5wcm90b3R5cGUuc3RyaW5naWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBsLkpTT04uc3RyaW5naWZ5KGEsdm9pZCAwKX07a2QucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEpe3JldHVybiBsLkpTT04ucGFyc2UoYSx2b2lkIDApfTtmdW5jdGlvbiBsZCgpe3RoaXMuZz1uZXcga2Q7fWZ1bmN0aW9uIG1kKGEsYixjKXtjb25zdCBkPWN8fFwiXCI7dHJ5e0tjKGEsZnVuY3Rpb24oZSxmKXtsZXQgaD1lO3AoZSkmJihoPXJiKGUpKTtiLnB1c2goZCtmK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChoKSk7fSk7fWNhdGNoKGUpe3Rocm93IGIucHVzaChkK1widHlwZT1cIitlbmNvZGVVUklDb21wb25lbnQoXCJfYmFkbWFwXCIpKSxlO319ZnVuY3Rpb24gbmQoYSxiKXtjb25zdCBjPW5ldyBNYjtpZihsLkltYWdlKXtjb25zdCBkPW5ldyBJbWFnZTtkLm9ubG9hZD1qYShvZCxjLGQsXCJUZXN0TG9hZEltYWdlOiBsb2FkZWRcIiwhMCxiKTtkLm9uZXJyb3I9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogZXJyb3JcIiwhMSxiKTtkLm9uYWJvcnQ9amEob2QsYyxkLFwiVGVzdExvYWRJbWFnZTogYWJvcnRcIiwhMSxiKTtkLm9udGltZW91dD1qYShvZCxjLGQsXCJUZXN0TG9hZEltYWdlOiB0aW1lb3V0XCIsITEsYik7bC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoZC5vbnRpbWVvdXQpZC5vbnRpbWVvdXQoKTt9LDFFNCk7ZC5zcmM9YTt9ZWxzZSBiKCExKTt9ZnVuY3Rpb24gb2QoYSxiLGMsZCxlKXt0cnl7Yi5vbmxvYWQ9bnVsbCxiLm9uZXJyb3I9bnVsbCxiLm9uYWJvcnQ9bnVsbCxiLm9udGltZW91dD1udWxsLGUoZCk7fWNhdGNoKGYpe319ZnVuY3Rpb24gcGQoYSl7dGhpcy5sPWEuJGJ8fG51bGw7dGhpcy5qPWEuaWJ8fCExO310KHBkLFliKTtwZC5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiBuZXcgcWQodGhpcy5sLHRoaXMuail9O3BkLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhfX0oe30pO2Z1bmN0aW9uIHFkKGEsYil7Qy5jYWxsKHRoaXMpO3RoaXMuRD1hO3RoaXMudT1iO3RoaXMubT12b2lkIDA7dGhpcy5yZWFkeVN0YXRlPXJkO3RoaXMuc3RhdHVzPTA7dGhpcy5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVRleHQ9dGhpcy5yZXNwb25zZT10aGlzLnN0YXR1c1RleHQ9XCJcIjt0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3RoaXMudj1uZXcgSGVhZGVyczt0aGlzLmg9bnVsbDt0aGlzLkM9XCJHRVRcIjt0aGlzLkI9XCJcIjt0aGlzLmc9ITE7dGhpcy5BPXRoaXMuaj10aGlzLmw9bnVsbDt9dChxZCxDKTt2YXIgcmQ9MDtrPXFkLnByb3RvdHlwZTtcbmsub3Blbj1mdW5jdGlvbihhLGIpe2lmKHRoaXMucmVhZHlTdGF0ZSE9cmQpdGhyb3cgdGhpcy5hYm9ydCgpLEVycm9yKFwiRXJyb3IgcmVvcGVuaW5nIGEgY29ubmVjdGlvblwiKTt0aGlzLkM9YTt0aGlzLkI9Yjt0aGlzLnJlYWR5U3RhdGU9MTtzZCh0aGlzKTt9O2suc2VuZD1mdW5jdGlvbihhKXtpZigxIT10aGlzLnJlYWR5U3RhdGUpdGhyb3cgdGhpcy5hYm9ydCgpLEVycm9yKFwibmVlZCB0byBjYWxsIG9wZW4oKSBmaXJzdC4gXCIpO3RoaXMuZz0hMDtjb25zdCBiPXtoZWFkZXJzOnRoaXMudixtZXRob2Q6dGhpcy5DLGNyZWRlbnRpYWxzOnRoaXMubSxjYWNoZTp2b2lkIDB9O2EmJihiLmJvZHk9YSk7KHRoaXMuRHx8bCkuZmV0Y2gobmV3IFJlcXVlc3QodGhpcy5CLGIpKS50aGVuKHRoaXMuVmEuYmluZCh0aGlzKSx0aGlzLmhhLmJpbmQodGhpcykpO307XG5rLmFib3J0PWZ1bmN0aW9uKCl7dGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dD1cIlwiO3RoaXMudj1uZXcgSGVhZGVyczt0aGlzLnN0YXR1cz0wO3RoaXMuaiYmdGhpcy5qLmNhbmNlbChcIlJlcXVlc3Qgd2FzIGFib3J0ZWQuXCIpOzE8PXRoaXMucmVhZHlTdGF0ZSYmdGhpcy5nJiY0IT10aGlzLnJlYWR5U3RhdGUmJih0aGlzLmc9ITEsdGQodGhpcykpO3RoaXMucmVhZHlTdGF0ZT1yZDt9O1xuay5WYT1mdW5jdGlvbihhKXtpZih0aGlzLmcmJih0aGlzLmw9YSx0aGlzLmh8fCh0aGlzLnN0YXR1cz10aGlzLmwuc3RhdHVzLHRoaXMuc3RhdHVzVGV4dD10aGlzLmwuc3RhdHVzVGV4dCx0aGlzLmg9YS5oZWFkZXJzLHRoaXMucmVhZHlTdGF0ZT0yLHNkKHRoaXMpKSx0aGlzLmcmJih0aGlzLnJlYWR5U3RhdGU9MyxzZCh0aGlzKSx0aGlzLmcpKSlpZihcImFycmF5YnVmZmVyXCI9PT10aGlzLnJlc3BvbnNlVHlwZSlhLmFycmF5QnVmZmVyKCkudGhlbih0aGlzLlRhLmJpbmQodGhpcyksdGhpcy5oYS5iaW5kKHRoaXMpKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgbC5SZWFkYWJsZVN0cmVhbSYmXCJib2R5XCJpbiBhKXt0aGlzLmo9YS5ib2R5LmdldFJlYWRlcigpO2lmKHRoaXMudSl7aWYodGhpcy5yZXNwb25zZVR5cGUpdGhyb3cgRXJyb3IoJ3Jlc3BvbnNlVHlwZSBtdXN0IGJlIGVtcHR5IGZvciBcInN0cmVhbUJpbmFyeUNodW5rc1wiIG1vZGUgcmVzcG9uc2VzLicpO3RoaXMucmVzcG9uc2U9XG5bXTt9ZWxzZSB0aGlzLnJlc3BvbnNlPXRoaXMucmVzcG9uc2VUZXh0PVwiXCIsdGhpcy5BPW5ldyBUZXh0RGVjb2Rlcjt1ZCh0aGlzKTt9ZWxzZSBhLnRleHQoKS50aGVuKHRoaXMuVWEuYmluZCh0aGlzKSx0aGlzLmhhLmJpbmQodGhpcykpO307ZnVuY3Rpb24gdWQoYSl7YS5qLnJlYWQoKS50aGVuKGEuU2EuYmluZChhKSkuY2F0Y2goYS5oYS5iaW5kKGEpKTt9ay5TYT1mdW5jdGlvbihhKXtpZih0aGlzLmcpe2lmKHRoaXMudSYmYS52YWx1ZSl0aGlzLnJlc3BvbnNlLnB1c2goYS52YWx1ZSk7ZWxzZSBpZighdGhpcy51KXt2YXIgYj1hLnZhbHVlP2EudmFsdWU6bmV3IFVpbnQ4QXJyYXkoMCk7aWYoYj10aGlzLkEuZGVjb2RlKGIse3N0cmVhbTohYS5kb25lfSkpdGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dCs9Yjt9YS5kb25lP3RkKHRoaXMpOnNkKHRoaXMpOzM9PXRoaXMucmVhZHlTdGF0ZSYmdWQodGhpcyk7fX07XG5rLlVhPWZ1bmN0aW9uKGEpe3RoaXMuZyYmKHRoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQ9YSx0ZCh0aGlzKSk7fTtrLlRhPWZ1bmN0aW9uKGEpe3RoaXMuZyYmKHRoaXMucmVzcG9uc2U9YSx0ZCh0aGlzKSk7fTtrLmhhPWZ1bmN0aW9uKCl7dGhpcy5nJiZ0ZCh0aGlzKTt9O2Z1bmN0aW9uIHRkKGEpe2EucmVhZHlTdGF0ZT00O2EubD1udWxsO2Euaj1udWxsO2EuQT1udWxsO3NkKGEpO31rLnNldFJlcXVlc3RIZWFkZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLnYuYXBwZW5kKGEsYik7fTtrLmdldFJlc3BvbnNlSGVhZGVyPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmg/dGhpcy5oLmdldChhLnRvTG93ZXJDYXNlKCkpfHxcIlwiOlwiXCJ9O1xuay5nZXRBbGxSZXNwb25zZUhlYWRlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5oKXJldHVybiBcIlwiO2NvbnN0IGE9W10sYj10aGlzLmguZW50cmllcygpO2Zvcih2YXIgYz1iLm5leHQoKTshYy5kb25lOyljPWMudmFsdWUsYS5wdXNoKGNbMF0rXCI6IFwiK2NbMV0pLGM9Yi5uZXh0KCk7cmV0dXJuIGEuam9pbihcIlxcclxcblwiKX07ZnVuY3Rpb24gc2QoYSl7YS5vbnJlYWR5c3RhdGVjaGFuZ2UmJmEub25yZWFkeXN0YXRlY2hhbmdlLmNhbGwoYSk7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShxZC5wcm90b3R5cGUsXCJ3aXRoQ3JlZGVudGlhbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFwiaW5jbHVkZVwiPT09dGhpcy5tfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tPWE/XCJpbmNsdWRlXCI6XCJzYW1lLW9yaWdpblwiO319KTt2YXIgdmQ9bC5KU09OLnBhcnNlO2Z1bmN0aW9uIFgoYSl7Qy5jYWxsKHRoaXMpO3RoaXMuaGVhZGVycz1uZXcgUzt0aGlzLnU9YXx8bnVsbDt0aGlzLmg9ITE7dGhpcy5DPXRoaXMuZz1udWxsO3RoaXMuSD1cIlwiO3RoaXMubT0wO3RoaXMuaj1cIlwiO3RoaXMubD10aGlzLkY9dGhpcy52PXRoaXMuRD0hMTt0aGlzLkI9MDt0aGlzLkE9bnVsbDt0aGlzLko9d2Q7dGhpcy5LPXRoaXMuTD0hMTt9dChYLEMpO3ZhciB3ZD1cIlwiLHhkPS9eaHR0cHM/JC9pLHlkPVtcIlBPU1RcIixcIlBVVFwiXTtrPVgucHJvdG90eXBlO1xuay5lYT1mdW5jdGlvbihhLGIsYyxkKXtpZih0aGlzLmcpdGhyb3cgRXJyb3IoXCJbZ29vZy5uZXQuWGhySW9dIE9iamVjdCBpcyBhY3RpdmUgd2l0aCBhbm90aGVyIHJlcXVlc3Q9XCIrdGhpcy5IK1wiOyBuZXdVcmk9XCIrYSk7Yj1iP2IudG9VcHBlckNhc2UoKTpcIkdFVFwiO3RoaXMuSD1hO3RoaXMuaj1cIlwiO3RoaXMubT0wO3RoaXMuRD0hMTt0aGlzLmg9ITA7dGhpcy5nPXRoaXMudT90aGlzLnUuZygpOmNjLmcoKTt0aGlzLkM9dGhpcy51P1piKHRoaXMudSk6WmIoY2MpO3RoaXMuZy5vbnJlYWR5c3RhdGVjaGFuZ2U9cSh0aGlzLkZhLHRoaXMpO3RyeXt0aGlzLkY9ITAsdGhpcy5nLm9wZW4oYixTdHJpbmcoYSksITApLHRoaXMuRj0hMTt9Y2F0Y2goZil7emQodGhpcyxmKTtyZXR1cm59YT1jfHxcIlwiO2NvbnN0IGU9bmV3IFModGhpcy5oZWFkZXJzKTtkJiZLYyhkLGZ1bmN0aW9uKGYsaCl7ZS5zZXQoaCxmKTt9KTtkPW9hKGUuVCgpKTtjPWwuRm9ybURhdGEmJmEgaW5zdGFuY2VvZiBsLkZvcm1EYXRhO1xuISgwPD1tYSh5ZCxiKSl8fGR8fGN8fGUuc2V0KFwiQ29udGVudC1UeXBlXCIsXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOFwiKTtlLmZvckVhY2goZnVuY3Rpb24oZixoKXt0aGlzLmcuc2V0UmVxdWVzdEhlYWRlcihoLGYpO30sdGhpcyk7dGhpcy5KJiYodGhpcy5nLnJlc3BvbnNlVHlwZT10aGlzLkopO1wid2l0aENyZWRlbnRpYWxzXCJpbiB0aGlzLmcmJnRoaXMuZy53aXRoQ3JlZGVudGlhbHMhPT10aGlzLkwmJih0aGlzLmcud2l0aENyZWRlbnRpYWxzPXRoaXMuTCk7dHJ5e0FkKHRoaXMpLDA8dGhpcy5CJiYoKHRoaXMuSz1CZCh0aGlzLmcpKT8odGhpcy5nLnRpbWVvdXQ9dGhpcy5CLHRoaXMuZy5vbnRpbWVvdXQ9cSh0aGlzLnBhLHRoaXMpKTp0aGlzLkE9R2IodGhpcy5wYSx0aGlzLkIsdGhpcykpLHRoaXMudj0hMCx0aGlzLmcuc2VuZChhKSx0aGlzLnY9ITE7fWNhdGNoKGYpe3pkKHRoaXMsZik7fX07XG5mdW5jdGlvbiBCZChhKXtyZXR1cm4geSYmUmEoKSYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnRpbWVvdXQmJnZvaWQgMCE9PWEub250aW1lb3V0fWZ1bmN0aW9uIHBhKGEpe3JldHVybiBcImNvbnRlbnQtdHlwZVwiPT1hLnRvTG93ZXJDYXNlKCl9ay5wYT1mdW5jdGlvbigpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBnb29nJiZ0aGlzLmcmJih0aGlzLmo9XCJUaW1lZCBvdXQgYWZ0ZXIgXCIrdGhpcy5CK1wibXMsIGFib3J0aW5nXCIsdGhpcy5tPTgsRCh0aGlzLFwidGltZW91dFwiKSx0aGlzLmFib3J0KDgpKTt9O2Z1bmN0aW9uIHpkKGEsYil7YS5oPSExO2EuZyYmKGEubD0hMCxhLmcuYWJvcnQoKSxhLmw9ITEpO2Euaj1iO2EubT01O0NkKGEpO0RkKGEpO31mdW5jdGlvbiBDZChhKXthLkR8fChhLkQ9ITAsRChhLFwiY29tcGxldGVcIiksRChhLFwiZXJyb3JcIikpO31cbmsuYWJvcnQ9ZnVuY3Rpb24oYSl7dGhpcy5nJiZ0aGlzLmgmJih0aGlzLmg9ITEsdGhpcy5sPSEwLHRoaXMuZy5hYm9ydCgpLHRoaXMubD0hMSx0aGlzLm09YXx8NyxEKHRoaXMsXCJjb21wbGV0ZVwiKSxEKHRoaXMsXCJhYm9ydFwiKSxEZCh0aGlzKSk7fTtrLk09ZnVuY3Rpb24oKXt0aGlzLmcmJih0aGlzLmgmJih0aGlzLmg9ITEsdGhpcy5sPSEwLHRoaXMuZy5hYm9ydCgpLHRoaXMubD0hMSksRGQodGhpcywhMCkpO1guWi5NLmNhbGwodGhpcyk7fTtrLkZhPWZ1bmN0aW9uKCl7dGhpcy5zfHwodGhpcy5GfHx0aGlzLnZ8fHRoaXMubD9FZCh0aGlzKTp0aGlzLmNiKCkpO307ay5jYj1mdW5jdGlvbigpe0VkKHRoaXMpO307XG5mdW5jdGlvbiBFZChhKXtpZihhLmgmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnb29nJiYoIWEuQ1sxXXx8NCE9TyhhKXx8MiE9YS5iYSgpKSlpZihhLnYmJjQ9PU8oYSkpR2IoYS5GYSwwLGEpO2Vsc2UgaWYoRChhLFwicmVhZHlzdGF0ZWNoYW5nZVwiKSw0PT1PKGEpKXthLmg9ITE7dHJ5e2NvbnN0IG49YS5iYSgpO2E6c3dpdGNoKG4pe2Nhc2UgMjAwOmNhc2UgMjAxOmNhc2UgMjAyOmNhc2UgMjA0OmNhc2UgMjA2OmNhc2UgMzA0OmNhc2UgMTIyMzp2YXIgYj0hMDticmVhayBhO2RlZmF1bHQ6Yj0hMTt9dmFyIGM7aWYoIShjPWIpKXt2YXIgZDtpZihkPTA9PT1uKXt2YXIgZT1TdHJpbmcoYS5IKS5tYXRjaChNYylbMV18fG51bGw7aWYoIWUmJmwuc2VsZiYmbC5zZWxmLmxvY2F0aW9uKXt2YXIgZj1sLnNlbGYubG9jYXRpb24ucHJvdG9jb2w7ZT1mLnN1YnN0cigwLGYubGVuZ3RoLTEpO31kPSF4ZC50ZXN0KGU/ZS50b0xvd2VyQ2FzZSgpOlwiXCIpO31jPWQ7fWlmKGMpRChhLFwiY29tcGxldGVcIiksRChhLFxuXCJzdWNjZXNzXCIpO2Vsc2Uge2EubT02O3RyeXt2YXIgaD0yPE8oYSk/YS5nLnN0YXR1c1RleHQ6XCJcIjt9Y2F0Y2godSl7aD1cIlwiO31hLmo9aCtcIiBbXCIrYS5iYSgpK1wiXVwiO0NkKGEpO319ZmluYWxseXtEZChhKTt9fX1mdW5jdGlvbiBEZChhLGIpe2lmKGEuZyl7QWQoYSk7Y29uc3QgYz1hLmcsZD1hLkNbMF0/YWE6bnVsbDthLmc9bnVsbDthLkM9bnVsbDtifHxEKGEsXCJyZWFkeVwiKTt0cnl7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZDt9Y2F0Y2goZSl7fX19ZnVuY3Rpb24gQWQoYSl7YS5nJiZhLksmJihhLmcub250aW1lb3V0PW51bGwpO2EuQSYmKGwuY2xlYXJUaW1lb3V0KGEuQSksYS5BPW51bGwpO31mdW5jdGlvbiBPKGEpe3JldHVybiBhLmc/YS5nLnJlYWR5U3RhdGU6MH1rLmJhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiAyPE8odGhpcyk/dGhpcy5nLnN0YXR1czotMX1jYXRjaChhKXtyZXR1cm4gLTF9fTtcbmsuZ2E9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZz90aGlzLmcucmVzcG9uc2VUZXh0OlwiXCJ9Y2F0Y2goYSl7cmV0dXJuIFwiXCJ9fTtrLlFhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZyl7dmFyIGI9dGhpcy5nLnJlc3BvbnNlVGV4dDthJiYwPT1iLmluZGV4T2YoYSkmJihiPWIuc3Vic3RyaW5nKGEubGVuZ3RoKSk7cmV0dXJuIHZkKGIpfX07ZnVuY3Rpb24gb2MoYSl7dHJ5e2lmKCFhLmcpcmV0dXJuIG51bGw7aWYoXCJyZXNwb25zZVwiaW4gYS5nKXJldHVybiBhLmcucmVzcG9uc2U7c3dpdGNoKGEuSil7Y2FzZSB3ZDpjYXNlIFwidGV4dFwiOnJldHVybiBhLmcucmVzcG9uc2VUZXh0O2Nhc2UgXCJhcnJheWJ1ZmZlclwiOmlmKFwibW96UmVzcG9uc2VBcnJheUJ1ZmZlclwiaW4gYS5nKXJldHVybiBhLmcubW96UmVzcG9uc2VBcnJheUJ1ZmZlcn1yZXR1cm4gbnVsbH1jYXRjaChiKXtyZXR1cm4gbnVsbH19ay5EYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm19O1xuay5MYT1mdW5jdGlvbigpe3JldHVybiBcInN0cmluZ1wiPT09dHlwZW9mIHRoaXMuaj90aGlzLmo6U3RyaW5nKHRoaXMuail9O2Z1bmN0aW9uIEZkKGEpe2xldCBiPVwiXCI7eGEoYSxmdW5jdGlvbihjLGQpe2IrPWQ7Yis9XCI6XCI7Yis9YztiKz1cIlxcclxcblwiO30pO3JldHVybiBifWZ1bmN0aW9uIEdkKGEsYixjKXthOntmb3IoZCBpbiBjKXt2YXIgZD0hMTticmVhayBhfWQ9ITA7fWR8fChjPUZkKGMpLFwic3RyaW5nXCI9PT10eXBlb2YgYT8obnVsbCE9YyYmZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjKSkpOlIoYSxiLGMpKTt9ZnVuY3Rpb24gSGQoYSxiLGMpe3JldHVybiBjJiZjLmludGVybmFsQ2hhbm5lbFBhcmFtcz9jLmludGVybmFsQ2hhbm5lbFBhcmFtc1thXXx8YjpifVxuZnVuY3Rpb24gSWQoYSl7dGhpcy56YT0wO3RoaXMubD1bXTt0aGlzLmg9bmV3IE1iO3RoaXMubGE9dGhpcy5vYT10aGlzLkY9dGhpcy5XPXRoaXMuZz10aGlzLnNhPXRoaXMuRD10aGlzLmFhPXRoaXMubz10aGlzLlA9dGhpcy5zPW51bGw7dGhpcy5aYT10aGlzLlY9MDt0aGlzLlhhPUhkKFwiZmFpbEZhc3RcIiwhMSxhKTt0aGlzLk49dGhpcy52PXRoaXMudT10aGlzLm09dGhpcy5qPW51bGw7dGhpcy5YPSEwO3RoaXMuST10aGlzLnRhPXRoaXMuVT0tMTt0aGlzLlk9dGhpcy5BPXRoaXMuQz0wO3RoaXMuUGE9SGQoXCJiYXNlUmV0cnlEZWxheU1zXCIsNUUzLGEpO3RoaXMuJGE9SGQoXCJyZXRyeURlbGF5U2VlZE1zXCIsMUU0LGEpO3RoaXMuWWE9SGQoXCJmb3J3YXJkQ2hhbm5lbE1heFJldHJpZXNcIiwyLGEpO3RoaXMucmE9SGQoXCJmb3J3YXJkQ2hhbm5lbFJlcXVlc3RUaW1lb3V0TXNcIiwyRTQsYSk7dGhpcy5xYT1hJiZhLnhtbEh0dHBGYWN0b3J5fHx2b2lkIDA7dGhpcy5CYT1hJiZhLllifHwhMTtcbnRoaXMuSz12b2lkIDA7dGhpcy5IPWEmJmEuc3VwcG9ydHNDcm9zc0RvbWFpblhocnx8ITE7dGhpcy5KPVwiXCI7dGhpcy5pPW5ldyBnZChhJiZhLmNvbmN1cnJlbnRSZXF1ZXN0TGltaXQpO3RoaXMuQ2E9bmV3IGxkO3RoaXMuamE9YSYmYS5mYXN0SGFuZHNoYWtlfHwhMTt0aGlzLlJhPWEmJmEuV2J8fCExO2EmJmEuQWEmJnRoaXMuaC5BYSgpO2EmJmEuZm9yY2VMb25nUG9sbGluZyYmKHRoaXMuWD0hMSk7dGhpcy4kPSF0aGlzLmphJiZ0aGlzLlgmJmEmJmEuZGV0ZWN0QnVmZmVyaW5nUHJveHl8fCExO3RoaXMua2E9dm9pZCAwO3RoaXMuTz0wO3RoaXMuTD0hMTt0aGlzLkI9bnVsbDt0aGlzLldhPSFhfHwhMSE9PWEuWGI7fWs9SWQucHJvdG90eXBlO2subWE9ODtrLkc9MTtcbmZ1bmN0aW9uIEljKGEpe0pkKGEpO2lmKDM9PWEuRyl7dmFyIGI9YS5WKyssYz1OKGEuRik7UihjLFwiU0lEXCIsYS5KKTtSKGMsXCJSSURcIixiKTtSKGMsXCJUWVBFXCIsXCJ0ZXJtaW5hdGVcIik7S2QoYSxjKTtiPW5ldyBNKGEsYS5oLGIsdm9pZCAwKTtiLks9MjtiLnY9amMoTihjKSk7Yz0hMTtsLm5hdmlnYXRvciYmbC5uYXZpZ2F0b3Iuc2VuZEJlYWNvbiYmKGM9bC5uYXZpZ2F0b3Iuc2VuZEJlYWNvbihiLnYudG9TdHJpbmcoKSxcIlwiKSk7IWMmJmwuSW1hZ2UmJigobmV3IEltYWdlKS5zcmM9Yi52LGM9ITApO2N8fChiLmc9bmMoYi5sLG51bGwpLGIuZy5lYShiLnYpKTtiLkY9RGF0ZS5ub3coKTtsYyhiKTt9TGQoYSk7fWsuaGI9ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuaC5pbmZvKFwiT3JpZ2luIFRyaWFscyBpbnZva2VkOiBcIithKTt9Y2F0Y2goYil7fX07ZnVuY3Rpb24gQWMoYSl7YS5nJiYod2MoYSksYS5nLmNhbmNlbCgpLGEuZz1udWxsKTt9XG5mdW5jdGlvbiBKZChhKXtBYyhhKTthLnUmJihsLmNsZWFyVGltZW91dChhLnUpLGEudT1udWxsKTt6YyhhKTthLmkuY2FuY2VsKCk7YS5tJiYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm0mJmwuY2xlYXJUaW1lb3V0KGEubSksYS5tPW51bGwpO31mdW5jdGlvbiBNZChhLGIpe2EubC5wdXNoKG5ldyBmZChhLlphKyssYikpOzM9PWEuRyYmSGMoYSk7fWZ1bmN0aW9uIEhjKGEpe2lkKGEuaSl8fGEubXx8KGEubT0hMCx6YihhLkhhLGEpLGEuQz0wKTt9ZnVuY3Rpb24gTmQoYSxiKXtpZihDYyhhLmkpPj1hLmkuai0oYS5tPzE6MCkpcmV0dXJuICExO2lmKGEubSlyZXR1cm4gYS5sPWIuRC5jb25jYXQoYS5sKSwhMDtpZigxPT1hLkd8fDI9PWEuR3x8YS5DPj0oYS5YYT8wOmEuWWEpKXJldHVybiAhMTthLm09SyhxKGEuSGEsYSxiKSxPZChhLGEuQykpO2EuQysrO3JldHVybiAhMH1cbmsuSGE9ZnVuY3Rpb24oYSl7aWYodGhpcy5tKWlmKHRoaXMubT1udWxsLDE9PXRoaXMuRyl7aWYoIWEpe3RoaXMuVj1NYXRoLmZsb29yKDFFNSpNYXRoLnJhbmRvbSgpKTthPXRoaXMuVisrO2NvbnN0IGU9bmV3IE0odGhpcyx0aGlzLmgsYSx2b2lkIDApO2xldCBmPXRoaXMuczt0aGlzLlAmJihmPyhmPXlhKGYpLEFhKGYsdGhpcy5QKSk6Zj10aGlzLlApO251bGw9PT10aGlzLm8mJihlLkg9Zik7aWYodGhpcy5qYSlhOnt2YXIgYj0wO2Zvcih2YXIgYz0wO2M8dGhpcy5sLmxlbmd0aDtjKyspe2I6e3ZhciBkPXRoaXMubFtjXTtpZihcIl9fZGF0YV9fXCJpbiBkLmcmJihkPWQuZy5fX2RhdGFfXyxcInN0cmluZ1wiPT09dHlwZW9mIGQpKXtkPWQubGVuZ3RoO2JyZWFrIGJ9ZD12b2lkIDA7fWlmKHZvaWQgMD09PWQpYnJlYWs7Yis9ZDtpZig0MDk2PGIpe2I9YzticmVhayBhfWlmKDQwOTY9PT1ifHxjPT09dGhpcy5sLmxlbmd0aC0xKXtiPWMrMTticmVhayBhfX1iPTFFMzt9ZWxzZSBiPTFFMztiPVxuUGQodGhpcyxlLGIpO2M9Tih0aGlzLkYpO1IoYyxcIlJJRFwiLGEpO1IoYyxcIkNWRVJcIiwyMik7dGhpcy5EJiZSKGMsXCJYLUhUVFAtU2Vzc2lvbi1JZFwiLHRoaXMuRCk7S2QodGhpcyxjKTt0aGlzLm8mJmYmJkdkKGMsdGhpcy5vLGYpO0RjKHRoaXMuaSxlKTt0aGlzLlJhJiZSKGMsXCJUWVBFXCIsXCJpbml0XCIpO3RoaXMuamE/KFIoYyxcIiRyZXFcIixiKSxSKGMsXCJTSURcIixcIm51bGxcIiksZS4kPSEwLGljKGUsYyxudWxsKSk6aWMoZSxjLGIpO3RoaXMuRz0yO319ZWxzZSAzPT10aGlzLkcmJihhP1FkKHRoaXMsYSk6MD09dGhpcy5sLmxlbmd0aHx8aWQodGhpcy5pKXx8UWQodGhpcykpO307XG5mdW5jdGlvbiBRZChhLGIpe3ZhciBjO2I/Yz1iLm06Yz1hLlYrKztjb25zdCBkPU4oYS5GKTtSKGQsXCJTSURcIixhLkopO1IoZCxcIlJJRFwiLGMpO1IoZCxcIkFJRFwiLGEuVSk7S2QoYSxkKTthLm8mJmEucyYmR2QoZCxhLm8sYS5zKTtjPW5ldyBNKGEsYS5oLGMsYS5DKzEpO251bGw9PT1hLm8mJihjLkg9YS5zKTtiJiYoYS5sPWIuRC5jb25jYXQoYS5sKSk7Yj1QZChhLGMsMUUzKTtjLnNldFRpbWVvdXQoTWF0aC5yb3VuZCguNSphLnJhKStNYXRoLnJvdW5kKC41KmEucmEqTWF0aC5yYW5kb20oKSkpO0RjKGEuaSxjKTtpYyhjLGQsYik7fWZ1bmN0aW9uIEtkKGEsYil7YS5qJiZLYyh7fSxmdW5jdGlvbihjLGQpe1IoYixkLGMpO30pO31cbmZ1bmN0aW9uIFBkKGEsYixjKXtjPU1hdGgubWluKGEubC5sZW5ndGgsYyk7dmFyIGQ9YS5qP3EoYS5qLk9hLGEuaixhKTpudWxsO2E6e3ZhciBlPWEubDtsZXQgZj0tMTtmb3IoOzspe2NvbnN0IGg9W1wiY291bnQ9XCIrY107LTE9PWY/MDxjPyhmPWVbMF0uaCxoLnB1c2goXCJvZnM9XCIrZikpOmY9MDpoLnB1c2goXCJvZnM9XCIrZik7bGV0IG49ITA7Zm9yKGxldCB1PTA7dTxjO3UrKyl7bGV0IG09ZVt1XS5oO2NvbnN0IHI9ZVt1XS5nO20tPWY7aWYoMD5tKWY9TWF0aC5tYXgoMCxlW3VdLmgtMTAwKSxuPSExO2Vsc2UgdHJ5e21kKHIsaCxcInJlcVwiK20rXCJfXCIpO31jYXRjaChHKXtkJiZkKHIpO319aWYobil7ZD1oLmpvaW4oXCImXCIpO2JyZWFrIGF9fX1hPWEubC5zcGxpY2UoMCxjKTtiLkQ9YTtyZXR1cm4gZH1mdW5jdGlvbiBHYyhhKXthLmd8fGEudXx8KGEuWT0xLHpiKGEuR2EsYSksYS5BPTApO31cbmZ1bmN0aW9uIEJjKGEpe2lmKGEuZ3x8YS51fHwzPD1hLkEpcmV0dXJuICExO2EuWSsrO2EudT1LKHEoYS5HYSxhKSxPZChhLGEuQSkpO2EuQSsrO3JldHVybiAhMH1rLkdhPWZ1bmN0aW9uKCl7dGhpcy51PW51bGw7UmQodGhpcyk7aWYodGhpcy4kJiYhKHRoaXMuTHx8bnVsbD09dGhpcy5nfHwwPj10aGlzLk8pKXt2YXIgYT0yKnRoaXMuTzt0aGlzLmguaW5mbyhcIkJQIGRldGVjdGlvbiB0aW1lciBlbmFibGVkOiBcIithKTt0aGlzLkI9SyhxKHRoaXMuYmIsdGhpcyksYSk7fX07ay5iYj1mdW5jdGlvbigpe3RoaXMuQiYmKHRoaXMuQj1udWxsLHRoaXMuaC5pbmZvKFwiQlAgZGV0ZWN0aW9uIHRpbWVvdXQgcmVhY2hlZC5cIiksdGhpcy5oLmluZm8oXCJCdWZmZXJpbmcgcHJveHkgZGV0ZWN0ZWQgYW5kIHN3aXRjaCB0byBsb25nLXBvbGxpbmchXCIpLHRoaXMuTj0hMSx0aGlzLkw9ITAsSigxMCksQWModGhpcyksUmQodGhpcykpO307XG5mdW5jdGlvbiB3YyhhKXtudWxsIT1hLkImJihsLmNsZWFyVGltZW91dChhLkIpLGEuQj1udWxsKTt9ZnVuY3Rpb24gUmQoYSl7YS5nPW5ldyBNKGEsYS5oLFwicnBjXCIsYS5ZKTtudWxsPT09YS5vJiYoYS5nLkg9YS5zKTthLmcuTz0wO3ZhciBiPU4oYS5vYSk7UihiLFwiUklEXCIsXCJycGNcIik7UihiLFwiU0lEXCIsYS5KKTtSKGIsXCJDSVwiLGEuTj9cIjBcIjpcIjFcIik7UihiLFwiQUlEXCIsYS5VKTtLZChhLGIpO1IoYixcIlRZUEVcIixcInhtbGh0dHBcIik7YS5vJiZhLnMmJkdkKGIsYS5vLGEucyk7YS5LJiZhLmcuc2V0VGltZW91dChhLkspO3ZhciBjPWEuZzthPWEubGE7Yy5LPTE7Yy52PWpjKE4oYikpO2Mucz1udWxsO2MuVT0hMDtrYyhjLGEpO31rLmFiPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy52JiYodGhpcy52PW51bGwsQWModGhpcyksQmModGhpcyksSigxOSkpO307ZnVuY3Rpb24gemMoYSl7bnVsbCE9YS52JiYobC5jbGVhclRpbWVvdXQoYS52KSxhLnY9bnVsbCk7fVxuZnVuY3Rpb24gdWMoYSxiKXt2YXIgYz1udWxsO2lmKGEuZz09Yil7emMoYSk7d2MoYSk7YS5nPW51bGw7dmFyIGQ9Mjt9ZWxzZSBpZih5YyhhLmksYikpYz1iLkQsRmMoYS5pLGIpLGQ9MTtlbHNlIHJldHVybjthLkk9Yi5OO2lmKDAhPWEuRylpZihiLmkpaWYoMT09ZCl7Yz1iLnM/Yi5zLmxlbmd0aDowO2I9RGF0ZS5ub3coKS1iLkY7dmFyIGU9YS5DO2Q9U2IoKTtEKGQsbmV3IFZiKGQsYyxiLGUpKTtIYyhhKTt9ZWxzZSBHYyhhKTtlbHNlIGlmKGU9Yi5vLDM9PWV8fDA9PWUmJjA8YS5JfHwhKDE9PWQmJk5kKGEsYil8fDI9PWQmJkJjKGEpKSlzd2l0Y2goYyYmMDxjLmxlbmd0aCYmKGI9YS5pLGIuaT1iLmkuY29uY2F0KGMpKSxlKXtjYXNlIDE6UShhLDUpO2JyZWFrO2Nhc2UgNDpRKGEsMTApO2JyZWFrO2Nhc2UgMzpRKGEsNik7YnJlYWs7ZGVmYXVsdDpRKGEsMik7fX1cbmZ1bmN0aW9uIE9kKGEsYil7bGV0IGM9YS5QYStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS4kYSk7YS5qfHwoYyo9Mik7cmV0dXJuIGMqYn1mdW5jdGlvbiBRKGEsYil7YS5oLmluZm8oXCJFcnJvciBjb2RlIFwiK2IpO2lmKDI9PWIpe3ZhciBjPW51bGw7YS5qJiYoYz1udWxsKTt2YXIgZD1xKGEuamIsYSk7Y3x8KGM9bmV3IFUoXCIvL3d3dy5nb29nbGUuY29tL2ltYWdlcy9jbGVhcmRvdC5naWZcIiksbC5sb2NhdGlvbiYmXCJodHRwXCI9PWwubG9jYXRpb24ucHJvdG9jb2x8fE9jKGMsXCJodHRwc1wiKSxqYyhjKSk7bmQoYy50b1N0cmluZygpLGQpO31lbHNlIEooMik7YS5HPTA7YS5qJiZhLmoudmEoYik7TGQoYSk7SmQoYSk7fWsuamI9ZnVuY3Rpb24oYSl7YT8odGhpcy5oLmluZm8oXCJTdWNjZXNzZnVsbHkgcGluZ2VkIGdvb2dsZS5jb21cIiksSigyKSk6KHRoaXMuaC5pbmZvKFwiRmFpbGVkIHRvIHBpbmcgZ29vZ2xlLmNvbVwiKSxKKDEpKTt9O1xuZnVuY3Rpb24gTGQoYSl7YS5HPTA7YS5JPS0xO2lmKGEuail7aWYoMCE9amQoYS5pKS5sZW5ndGh8fDAhPWEubC5sZW5ndGgpYS5pLmkubGVuZ3RoPTAscmEoYS5sKSxhLmwubGVuZ3RoPTA7YS5qLnVhKCk7fX1mdW5jdGlvbiBFYyhhLGIsYyl7bGV0IGQ9YWQoYyk7aWYoXCJcIiE9ZC5pKWImJlBjKGQsYitcIi5cIitkLmkpLFFjKGQsZC5tKTtlbHNlIHtjb25zdCBlPWwubG9jYXRpb247ZD1iZChlLnByb3RvY29sLGI/YitcIi5cIitlLmhvc3RuYW1lOmUuaG9zdG5hbWUsK2UucG9ydCxjKTt9YS5hYSYmeGEoYS5hYSxmdW5jdGlvbihlLGYpe1IoZCxmLGUpO30pO2I9YS5EO2M9YS5zYTtiJiZjJiZSKGQsYixjKTtSKGQsXCJWRVJcIixhLm1hKTtLZChhLGQpO3JldHVybiBkfVxuZnVuY3Rpb24gbmMoYSxiLGMpe2lmKGImJiFhLkgpdGhyb3cgRXJyb3IoXCJDYW4ndCBjcmVhdGUgc2Vjb25kYXJ5IGRvbWFpbiBjYXBhYmxlIFhocklvIG9iamVjdC5cIik7Yj1jJiZhLkJhJiYhYS5xYT9uZXcgWChuZXcgcGQoe2liOiEwfSkpOm5ldyBYKGEucWEpO2IuTD1hLkg7cmV0dXJuIGJ9ZnVuY3Rpb24gU2QoKXt9az1TZC5wcm90b3R5cGU7ay54YT1mdW5jdGlvbigpe307ay53YT1mdW5jdGlvbigpe307ay52YT1mdW5jdGlvbigpe307ay51YT1mdW5jdGlvbigpe307ay5PYT1mdW5jdGlvbigpe307ZnVuY3Rpb24gVGQoKXtpZih5JiYhKDEwPD1OdW1iZXIoVWEpKSl0aHJvdyBFcnJvcihcIkVudmlyb25tZW50YWwgZXJyb3I6IG5vIGF2YWlsYWJsZSB0cmFuc3BvcnQuXCIpO31UZC5wcm90b3R5cGUuZz1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgWShhLGIpfTtcbmZ1bmN0aW9uIFkoYSxiKXtDLmNhbGwodGhpcyk7dGhpcy5nPW5ldyBJZChiKTt0aGlzLmw9YTt0aGlzLmg9YiYmYi5tZXNzYWdlVXJsUGFyYW1zfHxudWxsO2E9YiYmYi5tZXNzYWdlSGVhZGVyc3x8bnVsbDtiJiZiLmNsaWVudFByb3RvY29sSGVhZGVyUmVxdWlyZWQmJihhP2FbXCJYLUNsaWVudC1Qcm90b2NvbFwiXT1cIndlYmNoYW5uZWxcIjphPXtcIlgtQ2xpZW50LVByb3RvY29sXCI6XCJ3ZWJjaGFubmVsXCJ9KTt0aGlzLmcucz1hO2E9YiYmYi5pbml0TWVzc2FnZUhlYWRlcnN8fG51bGw7YiYmYi5tZXNzYWdlQ29udGVudFR5cGUmJihhP2FbXCJYLVdlYkNoYW5uZWwtQ29udGVudC1UeXBlXCJdPWIubWVzc2FnZUNvbnRlbnRUeXBlOmE9e1wiWC1XZWJDaGFubmVsLUNvbnRlbnQtVHlwZVwiOmIubWVzc2FnZUNvbnRlbnRUeXBlfSk7YiYmYi55YSYmKGE/YVtcIlgtV2ViQ2hhbm5lbC1DbGllbnQtUHJvZmlsZVwiXT1iLnlhOmE9e1wiWC1XZWJDaGFubmVsLUNsaWVudC1Qcm9maWxlXCI6Yi55YX0pO3RoaXMuZy5QPVxuYTsoYT1iJiZiLmh0dHBIZWFkZXJzT3ZlcndyaXRlUGFyYW0pJiYhc2EoYSkmJih0aGlzLmcubz1hKTt0aGlzLkE9YiYmYi5zdXBwb3J0c0Nyb3NzRG9tYWluWGhyfHwhMTt0aGlzLnY9YiYmYi5zZW5kUmF3SnNvbnx8ITE7KGI9YiYmYi5odHRwU2Vzc2lvbklkUGFyYW0pJiYhc2EoYikmJih0aGlzLmcuRD1iLGE9dGhpcy5oLG51bGwhPT1hJiZiIGluIGEmJihhPXRoaXMuaCxiIGluIGEmJmRlbGV0ZSBhW2JdKSk7dGhpcy5qPW5ldyBaKHRoaXMpO310KFksQyk7WS5wcm90b3R5cGUubT1mdW5jdGlvbigpe3RoaXMuZy5qPXRoaXMuajt0aGlzLkEmJih0aGlzLmcuSD0hMCk7dmFyIGE9dGhpcy5nLGI9dGhpcy5sLGM9dGhpcy5ofHx2b2lkIDA7YS5XYSYmKGEuaC5pbmZvKFwiT3JpZ2luIFRyaWFscyBlbmFibGVkLlwiKSx6YihxKGEuaGIsYSxiKSkpO0ooMCk7YS5XPWI7YS5hYT1jfHx7fTthLk49YS5YO2EuRj1FYyhhLG51bGwsYS5XKTtIYyhhKTt9O1kucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7SWModGhpcy5nKTt9O1xuWS5wcm90b3R5cGUudT1mdW5jdGlvbihhKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpe3ZhciBiPXt9O2IuX19kYXRhX189YTtNZCh0aGlzLmcsYik7fWVsc2UgdGhpcy52PyhiPXt9LGIuX19kYXRhX189cmIoYSksTWQodGhpcy5nLGIpKTpNZCh0aGlzLmcsYSk7fTtZLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7dGhpcy5nLmo9bnVsbDtkZWxldGUgdGhpcy5qO0ljKHRoaXMuZyk7ZGVsZXRlIHRoaXMuZztZLlouTS5jYWxsKHRoaXMpO307ZnVuY3Rpb24gVWQoYSl7YWMuY2FsbCh0aGlzKTt2YXIgYj1hLl9fc21fXztpZihiKXthOntmb3IoY29uc3QgYyBpbiBiKXthPWM7YnJlYWsgYX1hPXZvaWQgMDt9aWYodGhpcy5pPWEpYT10aGlzLmksYj1udWxsIT09YiYmYSBpbiBiP2JbYV06dm9pZCAwO3RoaXMuZGF0YT1iO31lbHNlIHRoaXMuZGF0YT1hO310KFVkLGFjKTtmdW5jdGlvbiBWZCgpe2JjLmNhbGwodGhpcyk7dGhpcy5zdGF0dXM9MTt9dChWZCxiYyk7ZnVuY3Rpb24gWihhKXt0aGlzLmc9YTt9XG50KFosU2QpO1oucHJvdG90eXBlLnhhPWZ1bmN0aW9uKCl7RCh0aGlzLmcsXCJhXCIpO307Wi5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSl7RCh0aGlzLmcsbmV3IFVkKGEpKTt9O1oucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe0QodGhpcy5nLG5ldyBWZChhKSk7fTtaLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe0QodGhpcy5nLFwiYlwiKTt9Oy8qXG5cbiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG5cbiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5UZC5wcm90b3R5cGUuY3JlYXRlV2ViQ2hhbm5lbD1UZC5wcm90b3R5cGUuZztZLnByb3RvdHlwZS5zZW5kPVkucHJvdG90eXBlLnU7WS5wcm90b3R5cGUub3Blbj1ZLnByb3RvdHlwZS5tO1kucHJvdG90eXBlLmNsb3NlPVkucHJvdG90eXBlLmNsb3NlO1diLk5PX0VSUk9SPTA7V2IuVElNRU9VVD04O1diLkhUVFBfRVJST1I9NjtYYi5DT01QTEVURT1cImNvbXBsZXRlXCI7JGIuRXZlbnRUeXBlPUw7TC5PUEVOPVwiYVwiO0wuQ0xPU0U9XCJiXCI7TC5FUlJPUj1cImNcIjtMLk1FU1NBR0U9XCJkXCI7Qy5wcm90b3R5cGUubGlzdGVuPUMucHJvdG90eXBlLk47WC5wcm90b3R5cGUubGlzdGVuT25jZT1YLnByb3RvdHlwZS5PO1gucHJvdG90eXBlLmdldExhc3RFcnJvcj1YLnByb3RvdHlwZS5MYTtYLnByb3RvdHlwZS5nZXRMYXN0RXJyb3JDb2RlPVgucHJvdG90eXBlLkRhO1gucHJvdG90eXBlLmdldFN0YXR1cz1YLnByb3RvdHlwZS5iYTtYLnByb3RvdHlwZS5nZXRSZXNwb25zZUpzb249WC5wcm90b3R5cGUuUWE7XG5YLnByb3RvdHlwZS5nZXRSZXNwb25zZVRleHQ9WC5wcm90b3R5cGUuZ2E7WC5wcm90b3R5cGUuc2VuZD1YLnByb3RvdHlwZS5lYTt2YXIgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCA9IGVzbS5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUZH07dmFyIGdldFN0YXRFdmVudFRhcmdldCA9IGVzbS5nZXRTdGF0RXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gU2IoKX07dmFyIEVycm9yQ29kZSA9IGVzbS5FcnJvckNvZGU9V2I7dmFyIEV2ZW50VHlwZSA9IGVzbS5FdmVudFR5cGU9WGI7dmFyIEV2ZW50ID0gZXNtLkV2ZW50PUg7dmFyIFN0YXQgPSBlc20uU3RhdD17cmI6MCx1YjoxLHZiOjIsT2I6MyxUYjo0LFFiOjUsUmI6NixQYjo3LE5iOjgsU2I6OSxQUk9YWToxMCxOT1BST1hZOjExLExiOjEyLEhiOjEzLEliOjE0LEdiOjE1LEpiOjE2LEtiOjE3LG5iOjE4LG1iOjE5LG9iOjIwfTt2YXIgRmV0Y2hYbWxIdHRwRmFjdG9yeSA9IGVzbS5GZXRjaFhtbEh0dHBGYWN0b3J5PXBkO3ZhciBXZWJDaGFubmVsID0gZXNtLldlYkNoYW5uZWw9JGI7XG52YXIgWGhySW8gPSBlc20uWGhySW89WDtcblxuZXhwb3J0IHsgRXJyb3JDb2RlLCBFdmVudCwgRXZlbnRUeXBlLCBGZXRjaFhtbEh0dHBGYWN0b3J5LCBTdGF0LCBXZWJDaGFubmVsLCBYaHJJbywgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCwgZXNtIGFzIGRlZmF1bHQsIGdldFN0YXRFdmVudFRhcmdldCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsImltcG9ydCB7IEVycm9yRmFjdG9yeSwgY29udGFpbnMsIGRlZXBFeHRlbmQsIGNyZWF0ZVN1YnNjcmliZSwgaXNCcm93c2VyIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyBtb2R1bGFyQVBJcyBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IF9hZGRDb21wb25lbnQsIGRlbGV0ZUFwcCwgX0RFRkFVTFRfRU5UUllfTkFNRSwgX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50LCByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogR2xvYmFsIGNvbnRleHQgb2JqZWN0IGZvciBhIGNvbGxlY3Rpb24gb2Ygc2VydmljZXMgdXNpbmdcclxuICogYSBzaGFyZWQgYXV0aGVudGljYXRpb24gc3RhdGUuXHJcbiAqXHJcbiAqIG1hcmtlZCBhcyBpbnRlcm5hbCBiZWNhdXNlIGl0IHJlZmVyZW5jZXMgaW50ZXJuYWwgdHlwZXMgZXhwb3J0ZWQgZnJvbSBAZmlyZWJhc2UvYXBwXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY2xhc3MgRmlyZWJhc2VBcHBJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKF9kZWxlZ2F0ZSwgZmlyZWJhc2UpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLmZpcmViYXNlID0gZmlyZWJhc2U7XHJcbiAgICAgICAgLy8gYWRkIGl0c2VsZiB0byBjb250YWluZXJcclxuICAgICAgICBfYWRkQ29tcG9uZW50KF9kZWxlZ2F0ZSwgbmV3IENvbXBvbmVudCgnYXBwLWNvbXBhdCcsICgpID0+IHRoaXMsIFwiUFVCTElDXCIgLyogUFVCTElDICovKSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBfZGVsZWdhdGUuY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCh2YWwpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUubmFtZTtcclxuICAgIH1cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5vcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmViYXNlLklOVEVSTkFMLnJlbW92ZUFwcCh0aGlzLm5hbWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlQXBwKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgc2VydmljZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcHAgKGNyZWF0aW5nIGl0XHJcbiAgICAgKiBvbiBkZW1hbmQpLCBpZGVudGlmaWVkIGJ5IHRoZSBwYXNzZWQgaW5zdGFuY2VJZGVudGlmaWVyLlxyXG4gICAgICpcclxuICAgICAqIE5PVEU6IEN1cnJlbnRseSBzdG9yYWdlIGFuZCBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBhcmUgbGV2ZXJhZ2luZyB0aGlzXHJcbiAgICAgKiBmdW5jdGlvbmFsaXR5LiBUaGV5IGludm9rZSBpdCBieSBjYWxsaW5nOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGZpcmViYXNlLmFwcCgpLnN0b3JhZ2UoJ1NUT1JBR0UgQlVDS0VUIElEJylcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRoZSBzZXJ2aWNlIG5hbWUgaXMgcGFzc2VkIHRvIHRoaXMgYWxyZWFkeVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIF9nZXRTZXJ2aWNlKG5hbWUsIGluc3RhbmNlSWRlbnRpZmllciA9IF9ERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIGluc3RhbmNlIGlmIEluc3RhdGlhdGlvbk1vZGUgaXMgYEVYUExJQ0lUYC5cclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2RlbGVnYXRlLmNvbnRhaW5lci5nZXRQcm92aWRlcihuYW1lKTtcclxuICAgICAgICBpZiAoIXByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSAmJlxyXG4gICAgICAgICAgICAoKF9hID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnN0YW50aWF0aW9uTW9kZSkgPT09IFwiRVhQTElDSVRcIiAvKiBFWFBMSUNJVCAqLykge1xyXG4gICAgICAgICAgICBwcm92aWRlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGdldEltbWVkaWF0ZSB3aWxsIGFsd2F5cyBzdWNjZWVkIGJlY2F1c2UgX2dldFNlcnZpY2UgaXMgb25seSBjYWxsZWQgZm9yIHJlZ2lzdGVyZWQgY29tcG9uZW50cy5cclxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKHtcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogaW5zdGFuY2VJZGVudGlmaWVyXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhIHNlcnZpY2UgaW5zdGFuY2UgZnJvbSB0aGUgY2FjaGUsIHNvIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciB0aGlzIHNlcnZpY2VcclxuICAgICAqIHdoZW4gcGVvcGxlIHRyeSB0byBnZXQgaXQgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogTk9URTogY3VycmVudGx5IG9ubHkgZmlyZXN0b3JlIHVzZXMgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIHN1cHBvcnQgZmlyZXN0b3JlIHNodXRkb3duLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBzZXJ2aWNlIG5hbWVcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUlkZW50aWZpZXIgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIG11bHRpcGxlIGluc3RhbmNlcyBhcmUgYWxsb3dlZFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UobmFtZSwgaW5zdGFuY2VJZGVudGlmaWVyID0gX0RFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmNvbnRhaW5lclxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAuZ2V0UHJvdmlkZXIobmFtZSlcclxuICAgICAgICAgICAgLmNsZWFySW5zdGFuY2UoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIHRvIHRoaXMgYXBwJ3MgY29udGFpbmVyXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgX2FkZENvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgICAgICBfYWRkQ29tcG9uZW50KHRoaXMuX2RlbGVnYXRlLCBjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudCh0aGlzLl9kZWxlZ2F0ZSwgY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogdGhpcy5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuLy8gVE9ETzogaW52ZXN0aWdhdGUgd2h5IHRoZSBmb2xsb3dpbmcgbmVlZHMgdG8gYmUgY29tbWVudGVkIG91dFxyXG4vLyBQcmV2ZW50IGRlYWQtY29kZSBlbGltaW5hdGlvbiBvZiB0aGVzZSBtZXRob2RzIHcvbyBpbnZhbGlkIHByb3BlcnR5XHJcbi8vIGNvcHlpbmcuXHJcbi8vIChGaXJlYmFzZUFwcEltcGwucHJvdG90eXBlLm5hbWUgJiYgRmlyZWJhc2VBcHBJbXBsLnByb3RvdHlwZS5vcHRpb25zKSB8fFxyXG4vLyAgIEZpcmViYXNlQXBwSW1wbC5wcm90b3R5cGUuZGVsZXRlIHx8XHJcbi8vICAgY29uc29sZS5sb2coJ2RjJyk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEVSUk9SUyA9IHtcclxuICAgIFtcIm5vLWFwcFwiIC8qIE5PX0FQUCAqL106IFwiTm8gRmlyZWJhc2UgQXBwICd7JGFwcE5hbWV9JyBoYXMgYmVlbiBjcmVhdGVkIC0gXCIgK1xyXG4gICAgICAgICdjYWxsIEZpcmViYXNlIEFwcC5pbml0aWFsaXplQXBwKCknLFxyXG4gICAgW1wiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBJTlZBTElEX0FQUF9BUkdVTUVOVCAqL106ICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXHJcbiAgICAgICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nXHJcbn07XHJcbmNvbnN0IEVSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhcHAtY29tcGF0JywgJ0ZpcmViYXNlJywgRVJST1JTKTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEJlY2F1c2UgYXV0aCBjYW4ndCBzaGFyZSBjb2RlIHdpdGggb3RoZXIgY29tcG9uZW50cywgd2UgYXR0YWNoIHRoZSB1dGlsaXR5IGZ1bmN0aW9uc1xyXG4gKiBpbiBhbiBpbnRlcm5hbCBuYW1lc3BhY2UgdG8gc2hhcmUgY29kZS5cclxuICogVGhpcyBmdW5jdGlvbiByZXR1cm4gYSBmaXJlYmFzZSBuYW1lc3BhY2Ugb2JqZWN0IHdpdGhvdXRcclxuICogYW55IHV0aWxpdHkgZnVuY3Rpb25zLCBzbyBpdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gdGhlIHJlZ3VsYXIgZmlyZWJhc2VOYW1lc3BhY2UgYW5kXHJcbiAqIHRoZSBsaXRlIHZlcnNpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZUNvcmUoZmlyZWJhc2VBcHBJbXBsKSB7XHJcbiAgICBjb25zdCBhcHBzID0ge307XHJcbiAgICAvLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgLy8gY29uc3QgY29tcG9uZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnQ8YW55Pj4oKTtcclxuICAgIC8vIEEgbmFtZXNwYWNlIGlzIGEgcGxhaW4gSmF2YVNjcmlwdCBPYmplY3QuXHJcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB7XHJcbiAgICAgICAgLy8gSGFjayB0byBwcmV2ZW50IEJhYmVsIGZyb20gbW9kaWZ5aW5nIHRoZSBvYmplY3QgcmV0dXJuZWRcclxuICAgICAgICAvLyBhcyB0aGUgZmlyZWJhc2UgbmFtZXNwYWNlLlxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxyXG4gICAgICAgIGluaXRpYWxpemVBcHA6IGluaXRpYWxpemVBcHBDb21wYXQsXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGFwcCxcclxuICAgICAgICByZWdpc3RlclZlcnNpb246IG1vZHVsYXJBUElzLnJlZ2lzdGVyVmVyc2lvbixcclxuICAgICAgICBzZXRMb2dMZXZlbDogbW9kdWxhckFQSXMuc2V0TG9nTGV2ZWwsXHJcbiAgICAgICAgb25Mb2c6IG1vZHVsYXJBUElzLm9uTG9nLFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBhcHBzOiBudWxsLFxyXG4gICAgICAgIFNES19WRVJTSU9OOiBtb2R1bGFyQVBJcy5TREtfVkVSU0lPTixcclxuICAgICAgICBJTlRFUk5BTDoge1xyXG4gICAgICAgICAgICByZWdpc3RlckNvbXBvbmVudDogcmVnaXN0ZXJDb21wb25lbnRDb21wYXQsXHJcbiAgICAgICAgICAgIHJlbW92ZUFwcCxcclxuICAgICAgICAgICAgdXNlQXNTZXJ2aWNlLFxyXG4gICAgICAgICAgICBtb2R1bGFyQVBJc1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyBJbmplY3QgYSBjaXJjdWxhciBkZWZhdWx0IGV4cG9ydCB0byBhbGxvdyBCYWJlbCB1c2VycyB3aG8gd2VyZSBwcmV2aW91c2x5XHJcbiAgICAvLyB1c2luZzpcclxuICAgIC8vXHJcbiAgICAvLyAgIGltcG9ydCBmaXJlYmFzZSBmcm9tICdmaXJlYmFzZSc7XHJcbiAgICAvLyAgIHdoaWNoIGJlY29tZXM6IHZhciBmaXJlYmFzZSA9IHJlcXVpcmUoJ2ZpcmViYXNlJykuZGVmYXVsdDtcclxuICAgIC8vXHJcbiAgICAvLyBpbnN0ZWFkIG9mXHJcbiAgICAvL1xyXG4gICAgLy8gICBpbXBvcnQgKiBhcyBmaXJlYmFzZSBmcm9tICdmaXJlYmFzZSc7XHJcbiAgICAvLyAgIHdoaWNoIGJlY29tZXM6IHZhciBmaXJlYmFzZSA9IHJlcXVpcmUoJ2ZpcmViYXNlJyk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgbmFtZXNwYWNlWydkZWZhdWx0J10gPSBuYW1lc3BhY2U7XHJcbiAgICAvLyBmaXJlYmFzZS5hcHBzIGlzIGEgcmVhZC1vbmx5IGdldHRlci5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYW1lc3BhY2UsICdhcHBzJywge1xyXG4gICAgICAgIGdldDogZ2V0QXBwc1xyXG4gICAgfSk7XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBBcHAuZGVsZXRlKCkgLSBidXQgYmVmb3JlIGFueSBzZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFwcFxyXG4gICAgICogYXJlIGRlbGV0ZWQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUFwcChuYW1lKSB7XHJcbiAgICAgICAgZGVsZXRlIGFwcHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgQXBwIG9iamVjdCBmb3IgYSBnaXZlbiBuYW1lIChvciBERUZBVUxUKS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gYXBwKG5hbWUpIHtcclxuICAgICAgICBuYW1lID0gbmFtZSB8fCBtb2R1bGFyQVBJcy5fREVGQVVMVF9FTlRSWV9OQU1FO1xyXG4gICAgICAgIGlmICghY29udGFpbnMoYXBwcywgbmFtZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJuby1hcHBcIiAvKiBOT19BUFAgKi8sIHsgYXBwTmFtZTogbmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFwcHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBhcHBbJ0FwcCddID0gZmlyZWJhc2VBcHBJbXBsO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgQXBwIGluc3RhbmNlIChuYW1lIG11c3QgYmUgdW5pcXVlKS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQuIEl0IGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSB1c2luZyB0aGUgc2FtZSBvcHRpb25zIGFuZCBjb25maWcuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVBcHBDb21wYXQob3B0aW9ucywgcmF3Q29uZmlnID0ge30pIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBtb2R1bGFyQVBJcy5pbml0aWFsaXplQXBwKG9wdGlvbnMsIHJhd0NvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5zKGFwcHMsIGFwcC5uYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXBwc1thcHAubmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFwcENvbXBhdCA9IG5ldyBmaXJlYmFzZUFwcEltcGwoYXBwLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgIGFwcHNbYXBwLm5hbWVdID0gYXBwQ29tcGF0O1xyXG4gICAgICAgIHJldHVybiBhcHBDb21wYXQ7XHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgbm9uLWRlbGV0ZWQgRmlyZWJhc2VBcHBzLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRBcHBzKCkge1xyXG4gICAgICAgIC8vIE1ha2UgYSBjb3B5IHNvIGNhbGxlciBjYW5ub3QgbXV0YXRlIHRoZSBhcHBzIGxpc3QuXHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFwcHMpLm1hcChuYW1lID0+IGFwcHNbbmFtZV0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRDb21wYXQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0ID0gY29tcG9uZW50TmFtZS5yZXBsYWNlKCctY29tcGF0JywgJycpO1xyXG4gICAgICAgIGlmIChtb2R1bGFyQVBJcy5fcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KSAmJlxyXG4gICAgICAgICAgICBjb21wb25lbnQudHlwZSA9PT0gXCJQVUJMSUNcIiAvKiBQVUJMSUMgKi8pIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIHNlcnZpY2UgbmFtZXNwYWNlIGZvciBwdWJsaWMgY29tcG9uZW50c1xyXG4gICAgICAgICAgICAvLyBUaGUgU2VydmljZSBuYW1lc3BhY2UgaXMgYW4gYWNjZXNzb3IgZnVuY3Rpb24gLi4uXHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lc3BhY2UgPSAoYXBwQXJnID0gYXBwKCkpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFwcEFyZ1tjb21wb25lbnROYW1lV2l0aG91dENvbXBhdF0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyBpbiB0aGUgZm9sbG93aW5nIGNhc2U6IGZpcmViYXNlLnN0b3JhZ2UoJ2dzOi8nKVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBJTlZBTElEX0FQUF9BUkdVTUVOVCAqLywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBOYW1lOiBjb21wb25lbnROYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBGb3J3YXJkIHNlcnZpY2UgaW5zdGFuY2UgbG9va3VwIHRvIHRoZSBGaXJlYmFzZUFwcC5cclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwQXJnW2NvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0XSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyAuLi4gYW5kIGEgY29udGFpbmVyIGZvciBzZXJ2aWNlLWxldmVsIHByb3BlcnRpZXMuXHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2VydmljZVByb3BzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGRlZXBFeHRlbmQoc2VydmljZU5hbWVzcGFjZSwgY29tcG9uZW50LnNlcnZpY2VQcm9wcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgbmFtZXNwYWNlW2NvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0XSA9IHNlcnZpY2VOYW1lc3BhY2U7XHJcbiAgICAgICAgICAgIC8vIFBhdGNoIHRoZSBGaXJlYmFzZUFwcEltcGwgcHJvdG90eXBlXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgIGZpcmViYXNlQXBwSW1wbC5wcm90b3R5cGVbY29tcG9uZW50TmFtZVdpdGhvdXRDb21wYXRdID1cclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoZSBlc2xpbnQgZGlzYWJsZSBjYW4gYmUgcmVtb3ZlZCBhbmQgdGhlICdpZ25vcmVSZXN0QXJncydcclxuICAgICAgICAgICAgICAgIC8vIG9wdGlvbiBhZGRlZCB0byB0aGUgbm8tZXhwbGljaXQtYW55IHJ1bGUgd2hlbiBFU2xpbnQgcmVsZWFzZXMgaXQuXHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlRnhuID0gdGhpcy5fZ2V0U2VydmljZS5iaW5kKHRoaXMsIGNvbXBvbmVudE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlRnhuLmFwcGx5KHRoaXMsIGNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyA/IGFyZ3MgOiBbXSk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcG9uZW50LnR5cGUgPT09IFwiUFVCTElDXCIgLyogUFVCTElDICovXHJcbiAgICAgICAgICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZVtjb21wb25lbnROYW1lV2l0aG91dENvbXBhdF1cclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gTWFwIHRoZSByZXF1ZXN0ZWQgc2VydmljZSB0byBhIHJlZ2lzdGVyZWQgc2VydmljZSBuYW1lXHJcbiAgICAvLyAodXNlZCB0byBtYXAgYXV0aCB0byBzZXJ2ZXJBdXRoIHNlcnZpY2Ugd2hlbiBuZWVkZWQpLlxyXG4gICAgZnVuY3Rpb24gdXNlQXNTZXJ2aWNlKGFwcCwgbmFtZSkge1xyXG4gICAgICAgIGlmIChuYW1lID09PSAnc2VydmVyQXV0aCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVzZVNlcnZpY2UgPSBuYW1lO1xyXG4gICAgICAgIHJldHVybiB1c2VTZXJ2aWNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJuIGEgZmlyZWJhc2UgbmFtZXNwYWNlIG9iamVjdC5cclxuICpcclxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYW5kIHRoZSByZXN1bHRcclxuICogYXNzaWduZWQgdG8gdGhlICdmaXJlYmFzZScgZ2xvYmFsLiAgSXQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xyXG4gKiBpbiB1bml0IHRlc3RzLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlRmlyZWJhc2VOYW1lc3BhY2UoKSB7XHJcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZUNvcmUoRmlyZWJhc2VBcHBJbXBsKTtcclxuICAgIG5hbWVzcGFjZS5JTlRFUk5BTCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmFtZXNwYWNlLklOVEVSTkFMKSwgeyBjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZSxcclxuICAgICAgICBleHRlbmROYW1lc3BhY2UsXHJcbiAgICAgICAgY3JlYXRlU3Vic2NyaWJlLFxyXG4gICAgICAgIEVycm9yRmFjdG9yeSxcclxuICAgICAgICBkZWVwRXh0ZW5kIH0pO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQYXRjaCB0aGUgdG9wLWxldmVsIGZpcmViYXNlIG5hbWVzcGFjZSB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBmaXJlYmFzZS5JTlRFUk5BTC5leHRlbmROYW1lc3BhY2UoKVxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBleHRlbmROYW1lc3BhY2UocHJvcHMpIHtcclxuICAgICAgICBkZWVwRXh0ZW5kKG5hbWVzcGFjZSwgcHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcclxufVxyXG5jb25zdCBmaXJlYmFzZSQxID0gY3JlYXRlRmlyZWJhc2VOYW1lc3BhY2UoKTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2FwcC1jb21wYXQnKTtcblxuY29uc3QgbmFtZSA9IFwiQGZpcmViYXNlL2FwcC1jb21wYXRcIjtcbmNvbnN0IHZlcnNpb24gPSBcIjAuMS4xMlwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlckNvcmVDb21wb25lbnRzKHZhcmlhbnQpIHtcclxuICAgIC8vIFJlZ2lzdGVyIGBhcHBgIHBhY2thZ2UuXHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgdmFyaWFudCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gRmlyZWJhc2UgTGl0ZSBkZXRlY3Rpb25cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuaWYgKGlzQnJvd3NlcigpICYmIHNlbGYuZmlyZWJhc2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgbG9nZ2VyLndhcm4oYFxuICAgIFdhcm5pbmc6IEZpcmViYXNlIGlzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLiBQbGVhc2UgbWFrZSBzdXJlXG4gICAgRmlyZWJhc2UgbGlicmFyeSBpcyBvbmx5IGxvYWRlZCBvbmNlLlxuICBgKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgY29uc3Qgc2RrVmVyc2lvbiA9IHNlbGYuZmlyZWJhc2UuU0RLX1ZFUlNJT047XHJcbiAgICBpZiAoc2RrVmVyc2lvbiAmJiBzZGtWZXJzaW9uLmluZGV4T2YoJ0xJVEUnKSA+PSAwKSB7XHJcbiAgICAgICAgbG9nZ2VyLndhcm4oYFxuICAgIFdhcm5pbmc6IFlvdSBhcmUgdHJ5aW5nIHRvIGxvYWQgRmlyZWJhc2Ugd2hpbGUgdXNpbmcgRmlyZWJhc2UgUGVyZm9ybWFuY2Ugc3RhbmRhbG9uZSBzY3JpcHQuXG4gICAgWW91IHNob3VsZCBsb2FkIEZpcmViYXNlIFBlcmZvcm1hbmNlIHdpdGggdGhpcyBpbnN0YW5jZSBvZiBGaXJlYmFzZSB0byBhdm9pZCBsb2FkaW5nIGR1cGxpY2F0ZSBjb2RlLlxuICAgIGApO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IGZpcmViYXNlID0gZmlyZWJhc2UkMTtcclxucmVnaXN0ZXJDb3JlQ29tcG9uZW50cygpO1xuXG5leHBvcnQgeyBmaXJlYmFzZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gIEluIHRoZVxuLy8gYnJvd3NlciB0aGlzIGlzIGEgbGl0dGxlIGNvbXBsaWNhdGVkIGR1ZSB0byB1bmtub3duIHF1YWxpdHkgb2YgTWF0aC5yYW5kb20oKVxuLy8gYW5kIGluY29uc2lzdGVudCBzdXBwb3J0IGZvciB0aGUgYGNyeXB0b2AgQVBJLiAgV2UgZG8gdGhlIGJlc3Qgd2UgY2FuIHZpYVxuLy8gZmVhdHVyZS1kZXRlY3Rpb25cblxuLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvXG4vLyBpbXBsZW1lbnRhdGlvbi4gQWxzbywgZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIG9uIElFMTEuXG52YXIgZ2V0UmFuZG9tVmFsdWVzID0gKHR5cGVvZihjcnlwdG8pICE9ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZihtc0NyeXB0bykgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0bykpO1xuXG5pZiAoZ2V0UmFuZG9tVmFsdWVzKSB7XG4gIC8vIFdIQVRXRyBjcnlwdG8gUk5HIC0gaHR0cDovL3dpa2kud2hhdHdnLm9yZy93aWtpL0NyeXB0b1xuICB2YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdoYXR3Z1JORygpIHtcbiAgICBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xuICAgIHJldHVybiBybmRzODtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIE1hdGgucmFuZG9tKCktYmFzZWQgKFJORylcbiAgLy9cbiAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIHVzZSBNYXRoLnJhbmRvbSgpLiAgSXQncyBmYXN0LCBidXQgaXMgb2YgdW5zcGVjaWZpZWRcbiAgLy8gcXVhbGl0eS5cbiAgdmFyIHJuZHMgPSBuZXcgQXJyYXkoMTYpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWF0aFJORygpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgcjsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGlmICgoaSAmIDB4MDMpID09PSAwKSByID0gTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwO1xuICAgICAgcm5kc1tpXSA9IHIgPj4+ICgoaSAmIDB4MDMpIDw8IDMpICYgMHhmZjtcbiAgICB9XG5cbiAgICByZXR1cm4gcm5kcztcbiAgfTtcbn1cbiIsIi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xudmFyIGJ5dGVUb0hleCA9IFtdO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXhbaV0gPSAoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpO1xufVxuXG5mdW5jdGlvbiBieXRlc1RvVXVpZChidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IG9mZnNldCB8fCAwO1xuICB2YXIgYnRoID0gYnl0ZVRvSGV4O1xuICAvLyBqb2luIHVzZWQgdG8gZml4IG1lbW9yeSBpc3N1ZSBjYXVzZWQgYnkgY29uY2F0ZW5hdGlvbjogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzE3NSNjNFxuICByZXR1cm4gKFtcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXVxuICBdKS5qb2luKCcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBieXRlc1RvVXVpZDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCBmaXJlYmFzZSBmcm9tIFwiZmlyZWJhc2UvY29tcGF0L2FwcFwiO1xuaW1wb3J0IFwiZmlyZWJhc2UvY29tcGF0L2F1dGhcIjtcbmltcG9ydCBcImZpcmViYXNlL2NvbXBhdC9maXJlc3RvcmVcIjtcbmltcG9ydCB7IGRvYywgc2V0RG9jLCBvblNuYXBzaG90IH0gZnJvbSBcImZpcmViYXNlL2ZpcmVzdG9yZVwiO1xuXG5jb25zdCBTSEFSRF9DT0xMRUNUSU9OX0lEID0gXCJfY291bnRlcl9zaGFyZHNfXCI7XG5jb25zdCBDT09LSUVfTkFNRSA9IFwiRklSRVNUT1JFX0NPVU5URVJfU0hBUkRfSURcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb3VudGVyU25hcHNob3Qge1xuICBleGlzdHM6IGJvb2xlYW47XG4gIGRhdGE6ICgpID0+IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvdW50ZXIge1xuICBwcml2YXRlIGRiOiBmaXJlYmFzZS5maXJlc3RvcmUuRmlyZXN0b3JlID0gbnVsbDtcbiAgcHJpdmF0ZSBzaGFyZElkID0gXCJcIjtcbiAgcHJpdmF0ZSBzaGFyZHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgcHJpdmF0ZSBub3RpZnlQcm9taXNlOiBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNoYXJkZWQgY291bnRlciBvYmplY3QgdGhhdCByZWZlcmVuY2VzIHRvIGEgZmllbGRcbiAgICogaW4gYSBkb2N1bWVudCB0aGF0IGlzIGEgY291bnRlci5cbiAgICpcbiAgICogQHBhcmFtIGRvYyBBIHJlZmVyZW5jZSB0byBhIGRvY3VtZW50IHdpdGggYSBjb3VudGVyIGZpZWxkLlxuICAgKiBAcGFyYW0gZmllbGQgQSBwYXRoIHRvIGEgY291bnRlciBmaWVsZCBpbiB0aGUgYWJvdmUgZG9jdW1lbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRvYzogZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50UmVmZXJlbmNlLFxuICAgIHByaXZhdGUgZmllbGQ6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmRiID0gZG9jLmZpcmVzdG9yZTtcbiAgICB0aGlzLnNoYXJkSWQgPSBnZXRTaGFyZElkKENPT0tJRV9OQU1FKTtcblxuICAgIGZpcmViYXNlLmluaXRpYWxpemVBcHAodGhpcy5kYi5hcHAub3B0aW9ucyk7XG5cbiAgICBjb25zdCBzaGFyZHNSZWYgPSBmaXJlYmFzZVxuICAgICAgLmZpcmVzdG9yZSgpXG4gICAgICAuY29sbGVjdGlvbihkb2MucGF0aCArIFwiL1wiICsgU0hBUkRfQ09MTEVDVElPTl9JRCk7XG4gICAgdGhpcy5zaGFyZHNbZG9jLnBhdGhdID0gMDtcblxuICAgIHRoaXMuc2hhcmRzW3NoYXJkc1JlZi5wYXRoICsgXCIvXCIgKyB0aGlzLnNoYXJkSWRdID0gMDtcbiAgICB0aGlzLnNoYXJkc1tzaGFyZHNSZWYucGF0aCArIFwiL1wiICsgXCJcXHRcIiArIHRoaXMuc2hhcmRJZC5zdWJzdHIoMCwgNCldID0gMDtcbiAgICB0aGlzLnNoYXJkc1tzaGFyZHNSZWYucGF0aCArIFwiL1wiICsgXCJcXHRcXHRcIiArIHRoaXMuc2hhcmRJZC5zdWJzdHIoMCwgMyldID0gMDtcbiAgICB0aGlzLnNoYXJkc1tcbiAgICAgIHNoYXJkc1JlZi5wYXRoICsgXCIvXCIgKyBcIlxcdFxcdFxcdFwiICsgdGhpcy5zaGFyZElkLnN1YnN0cigwLCAyKVxuICAgIF0gPSAwO1xuICAgIHRoaXMuc2hhcmRzW1xuICAgICAgc2hhcmRzUmVmLnBhdGggKyBcIi9cIiArIFwiXFx0XFx0XFx0XCIgKyB0aGlzLnNoYXJkSWQuc3Vic3RyKDAsIDEpXG4gICAgXSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVuY3kgY29tcGVuc2F0ZWQgdmlldyBvZiB0aGUgY291bnRlci5cbiAgICpcbiAgICogQWxsIGxvY2FsIGluY3JlbWVudHMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGNvdW50ZXIgZXZlbiBpZiB0aGUgbWFpblxuICAgKiBjb3VudGVyIGhhc24ndCBiZWVuIHVwZGF0ZWQgeWV0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldChvcHRpb25zPzogZmlyZWJhc2UuZmlyZXN0b3JlLkdldE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHZhbHVlUHJvbWlzZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNoYXJkcykubWFwKGFzeW5jIChwYXRoKSA9PiB7XG4gICAgICBjb25zdCBzaGFyZCA9IGF3YWl0IHRoaXMuZGIuZG9jKHBhdGgpLmdldChvcHRpb25zKTtcbiAgICAgIHJldHVybiA8bnVtYmVyPnNoYXJkLmdldCh0aGlzLmZpZWxkKSB8fCAwO1xuICAgIH0pO1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlUHJvbWlzZXMpO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIHRvIGxhdGVuY3kgY29tcGVuc2F0ZWQgdmlldyBvZiB0aGUgY291bnRlci5cbiAgICpcbiAgICogQWxsIGxvY2FsIGluY3JlbWVudHMgdG8gdGhpcyBjb3VudGVyIHdpbGwgYmUgaW1tZWRpYXRlbHkgdmlzaWJsZSBpbiB0aGVcbiAgICogc25hcHNob3QuXG4gICAqL1xuICBwdWJsaWMgb25TbmFwc2hvdChvYnNlcnZhYmxlOiAobmV4dDogQ291bnRlclNuYXBzaG90KSA9PiB2b2lkKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zaGFyZHMpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gZmlyZWJhc2UuZmlyZXN0b3JlKCkuZG9jKHBhdGgpO1xuXG4gICAgICBvblNuYXBzaG90KGRvY3VtZW50LCAoc25hcDogZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50RGF0YSkgPT4ge1xuICAgICAgICB0aGlzLnNoYXJkc1tzbmFwLnJlZi5wYXRoXSA9IHNuYXAuZ2V0KHRoaXMuZmllbGQpIHx8IDA7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVByb21pc2UgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5ub3RpZnlQcm9taXNlID0gc2NoZWR1bGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1bSA9IE9iamVjdC52YWx1ZXModGhpcy5zaGFyZHMpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICAgIG9ic2VydmFibGUoeyBleGlzdHM6IHRydWUsIGRhdGE6ICgpID0+IHN1bSB9KTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVByb21pc2UgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCB0aGUgY291bnRlciBieSBhIGdpdmVuIHZhbHVlLlxuICAgKlxuICAgKiBlLmcuXG4gICAqIGNvbnN0IGNvdW50ZXIgPSBuZXcgc2hhcmRlZC5Db3VudGVyKGRiLmRvYyhcInBhdGgvZG9jdW1lbnRcIiksIFwiY291bnRlclwiKTtcbiAgICogY291bnRlci5pbmNyZW1lbnRCeSgxKTtcbiAgICovXG4gIHB1YmxpYyBpbmNyZW1lbnRCeSh2YWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbmNyZW1lbnQ6IGFueSA9IGZpcmViYXNlLmZpcmVzdG9yZS5GaWVsZFZhbHVlLmluY3JlbWVudCh2YWwpO1xuICAgIGNvbnN0IHVwZGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHRoaXMuZmllbGRcbiAgICAgIC5zcGxpdChcIi5cIilcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoKHZhbHVlLCBuYW1lKSA9PiAoeyBbbmFtZV06IHZhbHVlIH0pLCBpbmNyZW1lbnQpO1xuXG4gICAgY29uc3Qgc2hhcmRSZWYgPSBmaXJlYmFzZVxuICAgICAgLmZpcmVzdG9yZSgpXG4gICAgICAuY29sbGVjdGlvbih0aGlzLmRvYy5wYXRoICsgXCIvXCIgKyBTSEFSRF9DT0xMRUNUSU9OX0lEKTtcblxuICAgIHJldHVybiBzZXREb2MoZG9jKHNoYXJkUmVmLCB0aGlzLnNoYXJkSWQpLCB1cGRhdGUsIHsgbWVyZ2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBhc3NpZ25lZCBzaGFyZCBkaXJlY3RseS4gVXNlZnVsIHRvIHVwZGF0ZSBtdWx0aXBsZSBjb3VudGVyc1xuICAgKiBhdCB0aGUgc2FtZSB0aW1lLCBiYXRjaGVzIG9yIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogZS5nLlxuICAgKiBjb25zdCBjb3VudGVyID0gbmV3IHNoYXJkZWQuQ291bnRlcihkYi5kb2MoXCJwYXRoL2NvdW50ZXJcIiksIFwiXCIpO1xuICAgKiBjb25zdCBzaGFyZFJlZiA9IGNvdW50ZXIuc2hhcmQoKTtcbiAgICogc2hhcmRSZWYuc2V0KHtcImNvdW50ZXIxXCIsIGZpcmVzdG9yZS5GaWVsZFZhbHVlLkluY3JlbWVudCgxKSxcbiAgICogICAgICAgICAgICAgICBcImNvdW50ZXIyXCIsIGZpcmVzdG9yZS5GaWVsZFZhbHVlLkluY3JlbWVudCgxKSk7XG4gICAqL1xuICBwdWJsaWMgc2hhcmQoKTogZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5kb2MuY29sbGVjdGlvbihTSEFSRF9DT0xMRUNUSU9OX0lEKS5kb2ModGhpcy5zaGFyZElkKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZTxUPihmdW5jOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0sIDApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmRJZChjb29raWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBSZWdFeHAoXG4gICAgXCIoPzpefDsgKVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSkgKyBcIj0oW147XSopXCJcbiAgKS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XG4gIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHRbMV07XG5cbiAgY29uc3Qgc2hhcmRJZCA9IHV1aWQudjQoKTtcblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgY29uc3QgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b1VUQ1N0cmluZygpO1xuXG4gIGRvY3VtZW50LmNvb2tpZSA9XG4gICAgZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSkgKyBcIj1cIiArIHNoYXJkSWQgKyBleHBpcmVzICsgXCI7IHBhdGg9L1wiO1xuICByZXR1cm4gc2hhcmRJZDtcbn1cbiIsInZhciB2MSA9IHJlcXVpcmUoJy4vdjEnKTtcbnZhciB2NCA9IHJlcXVpcmUoJy4vdjQnKTtcblxudmFyIHV1aWQgPSB2NDtcbnV1aWQudjEgPSB2MTtcbnV1aWQudjQgPSB2NDtcblxubW9kdWxlLmV4cG9ydHMgPSB1dWlkO1xuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IFtdO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxO1xuXG4gIC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gcm5nKCk7XG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtcbiAgICAgICAgc2VlZEJ5dGVzWzBdIHwgMHgwMSxcbiAgICAgICAgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1cbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7XG5cbiAgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuICB2YXIgZHQgPSAobXNlY3MgLSBfbGFzdE1TZWNzKSArIChuc2VjcyAtIF9sYXN0TlNlY3MpLzEwMDAwO1xuXG4gIC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfVxuXG4gIC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH1cblxuICAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXVpZC52MSgpOiBDYW5cXCd0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlYycpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuXG4gIC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDtcblxuICAvLyBgdGltZV9sb3dgXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfbWlkYFxuICB2YXIgdG1oID0gKG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCkgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjtcblxuICAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwO1xuXG4gIC8vIGBjbG9ja19zZXFfbG93YFxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7XG5cbiAgLy8gYG5vZGVgXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiA/IGJ1ZiA6IGJ5dGVzVG9VdWlkKGIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHYxO1xuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG5cbiAgaWYgKHR5cGVvZihvcHRpb25zKSA9PSAnc3RyaW5nJykge1xuICAgIGJ1ZiA9IG9wdGlvbnMgPT09ICdiaW5hcnknID8gbmV3IEFycmF5KDE2KSA6IG51bGw7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gIC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcbiAgcm5kc1s2XSA9IChybmRzWzZdICYgMHgwZikgfCAweDQwO1xuICBybmRzWzhdID0gKHJuZHNbOF0gJiAweDNmKSB8IDB4ODA7XG5cbiAgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG4gIGlmIChidWYpIHtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgMTY7ICsraWkpIHtcbiAgICAgIGJ1ZltpICsgaWldID0gcm5kc1tpaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBieXRlc1RvVXVpZChybmRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2NDtcbiIsImltcG9ydCBmaXJlYmFzZSBmcm9tICdAZmlyZWJhc2UvYXBwLWNvbXBhdCc7XG5leHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnQGZpcmViYXNlL2FwcC1jb21wYXQnO1xuXG52YXIgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbnZhciB2ZXJzaW9uID0gXCI5LjYuMVwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5maXJlYmFzZS5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2FwcC1jb21wYXQnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5qcy5tYXBcbiIsImltcG9ydCAnQGZpcmViYXNlL2F1dGgtY29tcGF0Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5qcy5tYXBcbiIsImltcG9ydCBmaXJlYmFzZSBmcm9tICdAZmlyZWJhc2UvYXBwLWNvbXBhdCc7XG5pbXBvcnQgKiBhcyBleHAgZnJvbSAnQGZpcmViYXNlL2F1dGgvaW50ZXJuYWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBpc0Jyb3dzZXJFeHRlbnNpb24sIGlzUmVhY3ROYXRpdmUsIGlzTm9kZSwgZ2V0VUEsIGlzSUUsIGlzSW5kZXhlZERCQXZhaWxhYmxlLCBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG52YXIgbmFtZSA9IFwiQGZpcmViYXNlL2F1dGgtY29tcGF0XCI7XG52YXIgdmVyc2lvbiA9IFwiMC4yLjRcIjtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQ09SRE9WQV9PTkRFVklDRVJFQURZX1RJTUVPVVRfTVMgPSAxMDAwO1xyXG5mdW5jdGlvbiBfZ2V0Q3VycmVudFNjaGVtZSgpIHtcclxuICAgIHZhciBfYTtcclxuICAgIHJldHVybiAoKF9hID0gc2VsZiA9PT0gbnVsbCB8fCBzZWxmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxmLmxvY2F0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvdG9jb2wpIHx8IG51bGw7XHJcbn1cclxuLyoqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgaHR0cCBvciBodHRwcy5cclxuICovXHJcbmZ1bmN0aW9uIF9pc0h0dHBPckh0dHBzKCkge1xyXG4gICAgcmV0dXJuIF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwOicgfHwgX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2h0dHBzOic7XHJcbn1cclxuLyoqXHJcbiAqIEBwYXJhbSB7P3N0cmluZz19IHVhIFRoZSB1c2VyIGFnZW50LlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBhcHAgaXMgcmVuZGVyZWQgaW4gYSBtb2JpbGUgaU9TIG9yIEFuZHJvaWRcclxuICogICAgIENvcmRvdmEgZW52aXJvbm1lbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNBbmRyb2lkT3JJb3NDb3Jkb3ZhU2NoZW1lKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuICEhKChfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnZmlsZTonIHx8IF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdpb25pYzonKSAmJlxyXG4gICAgICAgIHVhLnRvTG93ZXJDYXNlKCkubWF0Y2goL2lwaG9uZXxpcGFkfGlwb2R8YW5kcm9pZC8pKTtcclxufVxyXG4vKipcclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZW52aXJvbm1lbnQgaXMgYSBuYXRpdmUgZW52aXJvbm1lbnQsIHdoZXJlXHJcbiAqICAgICBDT1JTIGNoZWNrcyBkbyBub3QgYXBwbHkuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNOYXRpdmVFbnZpcm9ubWVudCgpIHtcclxuICAgIHJldHVybiBpc1JlYWN0TmF0aXZlKCkgfHwgaXNOb2RlKCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIGFnZW50IGlzIElFMTEuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaXMgSUUxMS5cclxuICovXHJcbmZ1bmN0aW9uIF9pc0llMTEoKSB7XHJcbiAgICByZXR1cm4gaXNJRSgpICYmIChkb2N1bWVudCA9PT0gbnVsbCB8fCBkb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSA9PT0gMTE7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIGFnZW50IGlzIEVkZ2UuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyQWdlbnQgVGhlIGJyb3dzZXIgdXNlciBhZ2VudCBzdHJpbmcuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaXMgRWRnZS5cclxuICovXHJcbmZ1bmN0aW9uIF9pc0VkZ2UodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gL0VkZ2VcXC9cXGQrLy50ZXN0KHVhKTtcclxufVxyXG4vKipcclxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X3VzZXJBZ2VudCBUaGUgbmF2aWdhdG9yIHVzZXIgYWdlbnQuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgbG9jYWwgc3RvcmFnZSBpcyBub3Qgc3luY2hyb25pemVkIGJldHdlZW4gYW4gaWZyYW1lXHJcbiAqICAgICBhbmQgYSBwb3B1cCBvZiB0aGUgc2FtZSBkb21haW4uXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNMb2NhbFN0b3JhZ2VOb3RTeW5jaHJvbml6ZWQodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gX2lzSWUxMSgpIHx8IF9pc0VkZ2UodWEpO1xyXG59XHJcbi8qKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHdlYiBzdG9yYWdlIGlzIHN1cHBvcnRlZC4gKi9cclxuZnVuY3Rpb24gX2lzV2ViU3RvcmFnZVN1cHBvcnRlZCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHNlbGYubG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGV4cC5fZ2VuZXJhdGVFdmVudElkKCk7XHJcbiAgICAgICAgaWYgKHN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgLy8gc2V0SXRlbSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZSBjYW5ub3QgYWNjZXNzIFdlYlN0b3JhZ2UgKGUuZy4sXHJcbiAgICAgICAgICAgIC8vIFNhZmFyaSBpbiBwcml2YXRlIG1vZGUpLlxyXG4gICAgICAgICAgICBzdG9yYWdlWydzZXRJdGVtJ10oa2V5LCAnMScpO1xyXG4gICAgICAgICAgICBzdG9yYWdlWydyZW1vdmVJdGVtJ10oa2V5KTtcclxuICAgICAgICAgICAgLy8gRm9yIGJyb3dzZXJzIHdoZXJlIGlmcmFtZSB3ZWIgc3RvcmFnZSBkb2VzIG5vdCBzeW5jaHJvbml6ZSB3aXRoIGEgcG9wdXBcclxuICAgICAgICAgICAgLy8gb2YgdGhlIHNhbWUgZG9tYWluLCBpbmRleGVkREIgaXMgdXNlZCBmb3IgcGVyc2lzdGVudCBzdG9yYWdlLiBUaGVzZVxyXG4gICAgICAgICAgICAvLyBicm93c2VycyBpbmNsdWRlIElFMTEgYW5kIEVkZ2UuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBpcyBzdXBwb3J0ZWQgKElFMTEgYW5kIEVkZ2UgcHJpdmF0ZSBtb2RlIGRvZXMgbm90IHN1cHBvcnRcclxuICAgICAgICAgICAgLy8gdGhhdCkuXHJcbiAgICAgICAgICAgIGlmIChfaXNMb2NhbFN0b3JhZ2VOb3RTeW5jaHJvbml6ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW4gc3VjaCBicm93c2VycywgaWYgaW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQsIGFuIGlmcmFtZSBjYW5ub3QgYmVcclxuICAgICAgICAgICAgICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBwb3B1cCBzaWduIGluIHJlc3VsdC5cclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0luZGV4ZWREQkF2YWlsYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUgZnJvbSBhIHdvcmtlci4gVGVzdCBhdmFpbGFiaWxpdHkgb2ZcclxuICAgICAgICAvLyBpbmRleGVkREIuXHJcbiAgICAgICAgcmV0dXJuIF9pc1dvcmtlcigpICYmIGlzSW5kZXhlZERCQXZhaWxhYmxlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIEBwYXJhbSB7P09iamVjdD19IGdsb2JhbCBUaGUgb3B0aW9uYWwgZ2xvYmFsIHNjb3BlLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSB3b3JrZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNXb3JrZXIoKSB7XHJcbiAgICAvLyBXb3JrZXJHbG9iYWxTY29wZSBvbmx5IGRlZmluZWQgaW4gd29ya2VyIGVudmlyb25tZW50LlxyXG4gICAgcmV0dXJuICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICdXb3JrZXJHbG9iYWxTY29wZScgaW4gZ2xvYmFsICYmXHJcbiAgICAgICAgJ2ltcG9ydFNjcmlwdHMnIGluIGdsb2JhbCk7XHJcbn1cclxuZnVuY3Rpb24gX2lzUG9wdXBSZWRpcmVjdFN1cHBvcnRlZCgpIHtcclxuICAgIHJldHVybiAoKF9pc0h0dHBPckh0dHBzKCkgfHxcclxuICAgICAgICBpc0Jyb3dzZXJFeHRlbnNpb24oKSB8fFxyXG4gICAgICAgIF9pc0FuZHJvaWRPcklvc0NvcmRvdmFTY2hlbWUoKSkgJiZcclxuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgd2l0aCByZW1vdGUgZGVidWdnaW5nIHJlcG9ydHMgaXRzIGxvY2F0aW9uLnByb3RvY29sIGFzXHJcbiAgICAgICAgLy8gaHR0cC5cclxuICAgICAgICAhX2lzTmF0aXZlRW52aXJvbm1lbnQoKSAmJlxyXG4gICAgICAgIC8vIExvY2FsIHN0b3JhZ2UgaGFzIHRvIGJlIHN1cHBvcnRlZCBmb3IgYnJvd3NlciBwb3B1cCBhbmQgcmVkaXJlY3RcclxuICAgICAgICAvLyBvcGVyYXRpb25zIHRvIHdvcmsuXHJcbiAgICAgICAgX2lzV2ViU3RvcmFnZVN1cHBvcnRlZCgpICYmXHJcbiAgICAgICAgLy8gRE9NLCBwb3B1cHMgYW5kIHJlZGlyZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoaW4gYSB3b3JrZXIuXHJcbiAgICAgICAgIV9pc1dvcmtlcigpKTtcclxufVxyXG4vKiogUXVpY2sgY2hlY2sgdGhhdCBpbmRpY2F0ZXMgdGhlIHBsYXRmb3JtICptYXkqIGJlIENvcmRvdmEgKi9cclxuZnVuY3Rpb24gX2lzTGlrZWx5Q29yZG92YSgpIHtcclxuICAgIHJldHVybiBfaXNBbmRyb2lkT3JJb3NDb3Jkb3ZhU2NoZW1lKCkgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfaXNDb3Jkb3ZhKCkge1xyXG4gICAgaWYgKCFfaXNMaWtlbHlDb3Jkb3ZhKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlJ3ZlIHdhaXRlZCBsb25nIGVub3VnaDsgdGhlIHRlbGx0YWxlIENvcmRvdmEgZXZlbnQgZGlkbid0IGhhcHBlblxyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9LCBDT1JET1ZBX09OREVWSUNFUkVBRFlfVElNRU9VVF9NUyk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgUGVyc2lzdGVuY2UgPSB7XHJcbiAgICBMT0NBTDogJ2xvY2FsJyxcclxuICAgIE5PTkU6ICdub25lJyxcclxuICAgIFNFU1NJT046ICdzZXNzaW9uJ1xyXG59O1xyXG5jb25zdCBfYXNzZXJ0JDMgPSBleHAuX2Fzc2VydDtcclxuY29uc3QgUEVSU0lTVEVOQ0VfS0VZID0gJ3BlcnNpc3RlbmNlJztcclxuLyoqXHJcbiAqIFZhbGlkYXRlcyB0aGF0IGFuIGFyZ3VtZW50IGlzIGEgdmFsaWQgcGVyc2lzdGVuY2UgdmFsdWUuIElmIGFuIGludmFsaWQgdHlwZVxyXG4gKiBpcyBzcGVjaWZpZWQsIGFuIGVycm9yIGlzIHRocm93biBzeW5jaHJvbm91c2x5LlxyXG4gKi9cclxuZnVuY3Rpb24gX3ZhbGlkYXRlUGVyc2lzdGVuY2VBcmd1bWVudChhdXRoLCBwZXJzaXN0ZW5jZSkge1xyXG4gICAgX2Fzc2VydCQzKE9iamVjdC52YWx1ZXMoUGVyc2lzdGVuY2UpLmluY2x1ZGVzKHBlcnNpc3RlbmNlKSwgYXV0aCwgXCJpbnZhbGlkLXBlcnNpc3RlbmNlLXR5cGVcIiAvKiBJTlZBTElEX1BFUlNJU1RFTkNFICovKTtcclxuICAgIC8vIFZhbGlkYXRlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcbiAgICBpZiAoaXNSZWFjdE5hdGl2ZSgpKSB7XHJcbiAgICAgICAgLy8gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBhIGJyb3dzZXIuXHJcbiAgICAgICAgX2Fzc2VydCQzKHBlcnNpc3RlbmNlICE9PSBQZXJzaXN0ZW5jZS5TRVNTSU9OLCBhdXRoLCBcInVuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGVcIiAvKiBVTlNVUFBPUlRFRF9QRVJTSVNURU5DRSAqLyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzTm9kZSgpKSB7XHJcbiAgICAgICAgLy8gT25seSBub25lIGlzIHN1cHBvcnRlZCBpbiBOb2RlLmpzLlxyXG4gICAgICAgIF9hc3NlcnQkMyhwZXJzaXN0ZW5jZSA9PT0gUGVyc2lzdGVuY2UuTk9ORSwgYXV0aCwgXCJ1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogVU5TVVBQT1JURURfUEVSU0lTVEVOQ0UgKi8pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChfaXNXb3JrZXIoKSkge1xyXG4gICAgICAgIC8vIEluIGEgd29ya2VyIGVudmlyb25tZW50LCBlaXRoZXIgTE9DQUwgb3IgTk9ORSBhcmUgc3VwcG9ydGVkLlxyXG4gICAgICAgIC8vIElmIGluZGV4ZWREQiBub3Qgc3VwcG9ydGVkIGFuZCBMT0NBTCBwcm92aWRlZCwgdGhyb3cgYW4gZXJyb3JcclxuICAgICAgICBfYXNzZXJ0JDMocGVyc2lzdGVuY2UgPT09IFBlcnNpc3RlbmNlLk5PTkUgfHxcclxuICAgICAgICAgICAgKHBlcnNpc3RlbmNlID09PSBQZXJzaXN0ZW5jZS5MT0NBTCAmJiBpc0luZGV4ZWREQkF2YWlsYWJsZSgpKSwgYXV0aCwgXCJ1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogVU5TVVBQT1JURURfUEVSU0lTVEVOQ0UgKi8pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIFRoaXMgaXMgcmVzdHJpY3RlZCBieSB3aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzLlxyXG4gICAgX2Fzc2VydCQzKHBlcnNpc3RlbmNlID09PSBQZXJzaXN0ZW5jZS5OT05FIHx8IF9pc1dlYlN0b3JhZ2VTdXBwb3J0ZWQoKSwgYXV0aCwgXCJ1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogVU5TVVBQT1JURURfUEVSU0lTVEVOQ0UgKi8pO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9zYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdChhdXRoKSB7XHJcbiAgICBhd2FpdCBhdXRoLl9pbml0aWFsaXphdGlvblByb21pc2U7XHJcbiAgICBjb25zdCB3aW4gPSBnZXRTZWxmV2luZG93KCk7XHJcbiAgICBjb25zdCBrZXkgPSBleHAuX3BlcnNpc3RlbmNlS2V5TmFtZShQRVJTSVNURU5DRV9LRVksIGF1dGguY29uZmlnLmFwaUtleSwgYXV0aC5uYW1lKTtcclxuICAgIGlmICh3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uc2Vzc2lvblN0b3JhZ2UpIHtcclxuICAgICAgICB3aW4uc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIGF1dGguX2dldFBlcnNpc3RlbmNlKCkpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9nZXRQZXJzaXN0ZW5jZXNGcm9tUmVkaXJlY3QoYXBpS2V5LCBhcHBOYW1lKSB7XHJcbiAgICBjb25zdCB3aW4gPSBnZXRTZWxmV2luZG93KCk7XHJcbiAgICBpZiAoISh3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uc2Vzc2lvblN0b3JhZ2UpKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5ID0gZXhwLl9wZXJzaXN0ZW5jZUtleU5hbWUoUEVSU0lTVEVOQ0VfS0VZLCBhcGlLZXksIGFwcE5hbWUpO1xyXG4gICAgY29uc3QgcGVyc2lzdGVuY2UgPSB3aW4uc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgc3dpdGNoIChwZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgIGNhc2UgUGVyc2lzdGVuY2UuTk9ORTpcclxuICAgICAgICAgICAgcmV0dXJuIFtleHAuaW5NZW1vcnlQZXJzaXN0ZW5jZV07XHJcbiAgICAgICAgY2FzZSBQZXJzaXN0ZW5jZS5MT0NBTDpcclxuICAgICAgICAgICAgcmV0dXJuIFtleHAuaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSwgZXhwLmJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VdO1xyXG4gICAgICAgIGNhc2UgUGVyc2lzdGVuY2UuU0VTU0lPTjpcclxuICAgICAgICAgICAgcmV0dXJuIFtleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZV07XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldFNlbGZXaW5kb3coKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBudWxsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9hc3NlcnQkMiA9IGV4cC5fYXNzZXJ0O1xyXG4vKiogUGxhdGZvcm0tYWdub3N0aWMgcG9wdXAtcmVkaXJlY3QgcmVzb2x2ZXIgKi9cclxuY2xhc3MgQ29tcGF0UG9wdXBSZWRpcmVjdFJlc29sdmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8vIENyZWF0ZSBib3RoIHJlc29sdmVycyBmb3IgZHluYW1pYyByZXNvbHV0aW9uIGxhdGVyXHJcbiAgICAgICAgdGhpcy5icm93c2VyUmVzb2x2ZXIgPSBleHAuX2dldEluc3RhbmNlKGV4cC5icm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgICAgICB0aGlzLmNvcmRvdmFSZXNvbHZlciA9IGV4cC5fZ2V0SW5zdGFuY2UoZXhwLmNvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgIC8vIFRoZSBhY3R1YWwgcmVzb2x2ZXIgaW4gdXNlOiBlaXRoZXIgYnJvd3NlclJlc29sdmVyIG9yIGNvcmRvdmFSZXNvbHZlci5cclxuICAgICAgICB0aGlzLnVuZGVybHlpbmdSZXNvbHZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGV4cC5icm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlO1xyXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlUmVkaXJlY3RGbiA9IGV4cC5fZ2V0UmVkaXJlY3RSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZShhdXRoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RVbmRlcmx5aW5nUmVzb2x2ZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFVuZGVybHlpbmdSZXNvbHZlci5faW5pdGlhbGl6ZShhdXRoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuUG9wdXAoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBldmVudElkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RVbmRlcmx5aW5nUmVzb2x2ZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFVuZGVybHlpbmdSZXNvbHZlci5fb3BlblBvcHVwKGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfb3BlblJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0VW5kZXJseWluZ1Jlc29sdmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX29wZW5SZWRpcmVjdChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIGV2ZW50SWQpO1xyXG4gICAgfVxyXG4gICAgX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChhdXRoLCBjYikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChhdXRoLCBjYik7XHJcbiAgICB9XHJcbiAgICBfb3JpZ2luVmFsaWRhdGlvbihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XHJcbiAgICB9XHJcbiAgICBnZXQgX3Nob3VsZEluaXRQcm9hY3RpdmVseSgpIHtcclxuICAgICAgICByZXR1cm4gX2lzTGlrZWx5Q29yZG92YSgpIHx8IHRoaXMuYnJvd3NlclJlc29sdmVyLl9zaG91bGRJbml0UHJvYWN0aXZlbHk7XHJcbiAgICB9XHJcbiAgICBnZXQgYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIoKSB7XHJcbiAgICAgICAgX2Fzc2VydCQyKHRoaXMudW5kZXJseWluZ1Jlc29sdmVyLCBcImludGVybmFsLWVycm9yXCIgLyogSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuZGVybHlpbmdSZXNvbHZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIHNlbGVjdFVuZGVybHlpbmdSZXNvbHZlcigpIHtcclxuICAgICAgICBpZiAodGhpcy51bmRlcmx5aW5nUmVzb2x2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBXZSBoYXZlbid0IHlldCBkZXRlcm1pbmVkIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGluIENvcmRvdmE7IGdvIGFoZWFkXHJcbiAgICAgICAgLy8gYW5kIGRldGVybWluZSB0aGF0IHN0YXRlIG5vdy5cclxuICAgICAgICBjb25zdCBpc0NvcmRvdmEgPSBhd2FpdCBfaXNDb3Jkb3ZhKCk7XHJcbiAgICAgICAgdGhpcy51bmRlcmx5aW5nUmVzb2x2ZXIgPSBpc0NvcmRvdmFcclxuICAgICAgICAgICAgPyB0aGlzLmNvcmRvdmFSZXNvbHZlclxyXG4gICAgICAgICAgICA6IHRoaXMuYnJvd3NlclJlc29sdmVyO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHVud3JhcChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QudW53cmFwKCk7XHJcbn1cclxuZnVuY3Rpb24gd3JhcHBlZChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3Qud3JhcHBlZCgpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGNyZWRlbnRpYWxGcm9tUmVzcG9uc2UodXNlckNyZWRlbnRpYWwpIHtcclxuICAgIHJldHVybiBjcmVkZW50aWFsRnJvbU9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbn1cclxuZnVuY3Rpb24gYXR0YWNoRXh0cmFFcnJvckZpZWxkcyhhdXRoLCBlKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICAvLyBUaGUgcmVzcG9uc2UgY29udGFpbnMgYWxsIGZpZWxkcyBmcm9tIHRoZSBzZXJ2ZXIgd2hpY2ggbWF5IG9yIG1heSBub3RcclxuICAgIC8vIGFjdHVhbGx5IG1hdGNoIHRoZSB1bmRlcmx5aW5nIHR5cGVcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gKF9hID0gZS5jdXN0b21EYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3Rva2VuUmVzcG9uc2U7XHJcbiAgICBpZiAoZS5jb2RlID09PSAnYXV0aC9tdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZCcpIHtcclxuICAgICAgICBjb25zdCBtZmFFcnIgPSBlO1xyXG4gICAgICAgIG1mYUVyci5yZXNvbHZlciA9IG5ldyBNdWx0aUZhY3RvclJlc29sdmVyKGF1dGgsIGV4cC5nZXRNdWx0aUZhY3RvclJlc29sdmVyKGF1dGgsIGUpKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbCA9IGNyZWRlbnRpYWxGcm9tT2JqZWN0KGUpO1xyXG4gICAgICAgIGNvbnN0IGNyZWRFcnIgPSBlO1xyXG4gICAgICAgIGlmIChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgICAgIGNyZWRFcnIuY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XHJcbiAgICAgICAgICAgIGNyZWRFcnIudGVuYW50SWQgPSByZXNwb25zZS50ZW5hbnRJZCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNyZWRFcnIuZW1haWwgPSByZXNwb25zZS5lbWFpbCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNyZWRFcnIucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZU51bWJlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNyZWRlbnRpYWxGcm9tT2JqZWN0KG9iamVjdCkge1xyXG4gICAgY29uc3QgeyBfdG9rZW5SZXNwb25zZSB9ID0gKG9iamVjdCBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IgPyBvYmplY3QuY3VzdG9tRGF0YSA6IG9iamVjdCk7XHJcbiAgICBpZiAoIV90b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgcGhvbmUgQXV0aCBjcmVkZW50aWFsIHJlc3BvbnNlcywgYXMgdGhleSBoYXZlIGEgZGlmZmVyZW50IGZvcm1hdFxyXG4gICAgLy8gZnJvbSBvdGhlciBiYWNrZW5kIHJlc3BvbnNlcyAoaS5lLiBubyBwcm92aWRlcklkKS4gVGhpcyBpcyBhbHNvIG9ubHkgdGhlXHJcbiAgICAvLyBjYXNlIGZvciB1c2VyIGNyZWRlbnRpYWxzIChkb2VzIG5vdCB3b3JrIGZvciBlcnJvcnMpLlxyXG4gICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikpIHtcclxuICAgICAgICBpZiAoJ3RlbXBvcmFyeVByb29mJyBpbiBfdG9rZW5SZXNwb25zZSAmJiAncGhvbmVOdW1iZXInIGluIF90b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBleHAuUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQob2JqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm92aWRlcklkID0gX3Rva2VuUmVzcG9uc2UucHJvdmlkZXJJZDtcclxuICAgIC8vIEVtYWlsIGFuZCBwYXNzd29yZCBpcyBub3Qgc3VwcG9ydGVkIGFzIHRoZXJlIGlzIG5vIHNpdHVhdGlvbiB3aGVyZSB0aGVcclxuICAgIC8vIHNlcnZlciB3b3VsZCByZXR1cm4gdGhlIHBhc3N3b3JkIHRvIHRoZSBjbGllbnQuXHJcbiAgICBpZiAoIXByb3ZpZGVySWQgfHwgcHJvdmlkZXJJZCA9PT0gZXhwLlByb3ZpZGVySWQuUEFTU1dPUkQpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBwcm92aWRlcjtcclxuICAgIHN3aXRjaCAocHJvdmlkZXJJZCkge1xyXG4gICAgICAgIGNhc2UgZXhwLlByb3ZpZGVySWQuR09PR0xFOlxyXG4gICAgICAgICAgICBwcm92aWRlciA9IGV4cC5Hb29nbGVBdXRoUHJvdmlkZXI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgZXhwLlByb3ZpZGVySWQuRkFDRUJPT0s6XHJcbiAgICAgICAgICAgIHByb3ZpZGVyID0gZXhwLkZhY2Vib29rQXV0aFByb3ZpZGVyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIGV4cC5Qcm92aWRlcklkLkdJVEhVQjpcclxuICAgICAgICAgICAgcHJvdmlkZXIgPSBleHAuR2l0aHViQXV0aFByb3ZpZGVyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIGV4cC5Qcm92aWRlcklkLlRXSVRURVI6XHJcbiAgICAgICAgICAgIHByb3ZpZGVyID0gZXhwLlR3aXR0ZXJBdXRoUHJvdmlkZXI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNvbnN0IHsgb2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuLCBvYXV0aFRva2VuU2VjcmV0LCBwZW5kaW5nVG9rZW4sIG5vbmNlIH0gPSBfdG9rZW5SZXNwb25zZTtcclxuICAgICAgICAgICAgaWYgKCFvYXV0aEFjY2Vzc1Rva2VuICYmXHJcbiAgICAgICAgICAgICAgICAhb2F1dGhUb2tlblNlY3JldCAmJlxyXG4gICAgICAgICAgICAgICAgIW9hdXRoSWRUb2tlbiAmJlxyXG4gICAgICAgICAgICAgICAgIXBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gVE9ETyhhdm9sa292aSk6IHVuY29tbWVudCB0aGlzIGFuZCBnZXQgaXQgd29ya2luZyB3aXRoIFNBTUwgJiBPSURDXHJcbiAgICAgICAgICAgIGlmIChwZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm92aWRlcklkLnN0YXJ0c1dpdGgoJ3NhbWwuJykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwLlNBTUxBdXRoQ3JlZGVudGlhbC5fY3JlYXRlKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPSURDIGFuZCBub24tZGVmYXVsdCBwcm92aWRlcnMgZXhjbHVkaW5nIFR3aXR0ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cC5PQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduSW5NZXRob2Q6IHByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdUb2tlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbjogb2F1dGhJZFRva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogb2F1dGhBY2Nlc3NUb2tlblxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgZXhwLk9BdXRoUHJvdmlkZXIocHJvdmlkZXJJZCkuY3JlZGVudGlhbCh7XHJcbiAgICAgICAgICAgICAgICBpZFRva2VuOiBvYXV0aElkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogb2F1dGhBY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgICAgIHJhd05vbmNlOiBub25jZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yXHJcbiAgICAgICAgPyBwcm92aWRlci5jcmVkZW50aWFsRnJvbUVycm9yKG9iamVjdClcclxuICAgICAgICA6IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KG9iamVjdCk7XHJcbn1cclxuZnVuY3Rpb24gY29udmVydENyZWRlbnRpYWwoYXV0aCwgY3JlZGVudGlhbFByb21pc2UpIHtcclxuICAgIHJldHVybiBjcmVkZW50aWFsUHJvbWlzZVxyXG4gICAgICAgIC5jYXRjaChlID0+IHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IpIHtcclxuICAgICAgICAgICAgYXR0YWNoRXh0cmFFcnJvckZpZWxkcyhhdXRoLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH0pXHJcbiAgICAgICAgLnRoZW4oY3JlZGVudGlhbCA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IGNyZWRlbnRpYWwub3BlcmF0aW9uVHlwZTtcclxuICAgICAgICBjb25zdCB1c2VyID0gY3JlZGVudGlhbC51c2VyO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxGcm9tUmVzcG9uc2UoY3JlZGVudGlhbCksXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxVc2VySW5mbzogZXhwLmdldEFkZGl0aW9uYWxVc2VySW5mbyhjcmVkZW50aWFsKSxcclxuICAgICAgICAgICAgdXNlcjogVXNlci5nZXRPckNyZWF0ZSh1c2VyKVxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0KGF1dGgsIGNvbmZpcm1hdGlvblJlc3VsdFByb21pc2UpIHtcclxuICAgIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdEV4cCA9IGF3YWl0IGNvbmZpcm1hdGlvblJlc3VsdFByb21pc2U7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHZlcmlmaWNhdGlvbklkOiBjb25maXJtYXRpb25SZXN1bHRFeHAudmVyaWZpY2F0aW9uSWQsXHJcbiAgICAgICAgY29uZmlybTogKHZlcmlmaWNhdGlvbkNvZGUpID0+IGNvbnZlcnRDcmVkZW50aWFsKGF1dGgsIGNvbmZpcm1hdGlvblJlc3VsdEV4cC5jb25maXJtKHZlcmlmaWNhdGlvbkNvZGUpKVxyXG4gICAgfTtcclxufVxyXG5jbGFzcyBNdWx0aUZhY3RvclJlc29sdmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgsIHJlc29sdmVyKSB7XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IHdyYXBwZWQoYXV0aCk7XHJcbiAgICB9XHJcbiAgICBnZXQgc2Vzc2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlci5zZXNzaW9uO1xyXG4gICAgfVxyXG4gICAgZ2V0IGhpbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyLmhpbnRzO1xyXG4gICAgfVxyXG4gICAgcmVzb2x2ZVNpZ25Jbihhc3NlcnRpb24pIHtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodW53cmFwKHRoaXMuYXV0aCksIHRoaXMucmVzb2x2ZXIucmVzb2x2ZVNpZ25Jbihhc3NlcnRpb24pKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBVc2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgICAgIHRoaXMubXVsdGlGYWN0b3IgPSBleHAubXVsdGlGYWN0b3IoX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBnZXRPckNyZWF0ZSh1c2VyKSB7XHJcbiAgICAgICAgaWYgKCFVc2VyLlVTRVJfTUFQLmhhcyh1c2VyKSkge1xyXG4gICAgICAgICAgICBVc2VyLlVTRVJfTUFQLnNldCh1c2VyLCBuZXcgVXNlcih1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBVc2VyLlVTRVJfTUFQLmdldCh1c2VyKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZGVsZXRlKCk7XHJcbiAgICB9XHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS50b0pTT04oKTtcclxuICAgIH1cclxuICAgIGdldElkVG9rZW5SZXN1bHQoZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldElkVG9rZW5SZXN1bHQoZm9yY2VSZWZyZXNoKTtcclxuICAgIH1cclxuICAgIGdldElkVG9rZW4oZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcclxuICAgIH1cclxuICAgIGxpbmtBbmRSZXRyaWV2ZURhdGFXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlua1dpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgbGlua1dpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5hdXRoLCBleHAubGlua1dpdGhDcmVkZW50aWFsKHRoaXMuX2RlbGVnYXRlLCBjcmVkZW50aWFsKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBsaW5rV2l0aFBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDb25maXJtYXRpb25SZXN1bHQodGhpcy5hdXRoLCBleHAubGlua1dpdGhQaG9uZU51bWJlcih0aGlzLl9kZWxlZ2F0ZSwgcGhvbmVOdW1iZXIsIGFwcGxpY2F0aW9uVmVyaWZpZXIpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGxpbmtXaXRoUG9wdXAocHJvdmlkZXIpIHtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5hdXRoLCBleHAubGlua1dpdGhQb3B1cCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcikpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgbGlua1dpdGhSZWRpcmVjdChwcm92aWRlcikge1xyXG4gICAgICAgIGF3YWl0IF9zYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdChleHAuX2Nhc3RBdXRoKHRoaXMuYXV0aCkpO1xyXG4gICAgICAgIHJldHVybiBleHAubGlua1dpdGhSZWRpcmVjdCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICB9XHJcbiAgICByZWF1dGhlbnRpY2F0ZUFuZFJldHJpZXZlRGF0YVdpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHRoaXMuYXV0aCwgZXhwLnJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIGNyZWRlbnRpYWwpKTtcclxuICAgIH1cclxuICAgIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDb25maXJtYXRpb25SZXN1bHQodGhpcy5hdXRoLCBleHAucmVhdXRoZW50aWNhdGVXaXRoUGhvbmVOdW1iZXIodGhpcy5fZGVsZWdhdGUsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKSk7XHJcbiAgICB9XHJcbiAgICByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChwcm92aWRlcikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLmF1dGgsIGV4cC5yZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcikpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QocHJvdmlkZXIpIHtcclxuICAgICAgICBhd2FpdCBfc2F2ZVBlcnNpc3RlbmNlRm9yUmVkaXJlY3QoZXhwLl9jYXN0QXV0aCh0aGlzLmF1dGgpKTtcclxuICAgICAgICByZXR1cm4gZXhwLnJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHRoaXMuX2RlbGVnYXRlLCBwcm92aWRlciwgQ29tcGF0UG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgIH1cclxuICAgIHNlbmRFbWFpbFZlcmlmaWNhdGlvbihhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnNlbmRFbWFpbFZlcmlmaWNhdGlvbih0aGlzLl9kZWxlZ2F0ZSwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHVubGluayhwcm92aWRlcklkKSB7XHJcbiAgICAgICAgYXdhaXQgZXhwLnVubGluayh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXJJZCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVFbWFpbChuZXdFbWFpbCkge1xyXG4gICAgICAgIHJldHVybiBleHAudXBkYXRlRW1haWwodGhpcy5fZGVsZWdhdGUsIG5ld0VtYWlsKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVBhc3N3b3JkKG5ld1Bhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC51cGRhdGVQYXNzd29yZCh0aGlzLl9kZWxlZ2F0ZSwgbmV3UGFzc3dvcmQpO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlUGhvbmVOdW1iZXIocGhvbmVDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC51cGRhdGVQaG9uZU51bWJlcih0aGlzLl9kZWxlZ2F0ZSwgcGhvbmVDcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVByb2ZpbGUocHJvZmlsZSkge1xyXG4gICAgICAgIHJldHVybiBleHAudXBkYXRlUHJvZmlsZSh0aGlzLl9kZWxlZ2F0ZSwgcHJvZmlsZSk7XHJcbiAgICB9XHJcbiAgICB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbChuZXdFbWFpbCwgYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC52ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCh0aGlzLl9kZWxlZ2F0ZSwgbmV3RW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBnZXQgZW1haWxWZXJpZmllZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZW1haWxWZXJpZmllZDtcclxuICAgIH1cclxuICAgIGdldCBpc0Fub255bW91cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNBbm9ueW1vdXM7XHJcbiAgICB9XHJcbiAgICBnZXQgbWV0YWRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLm1ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgZ2V0IHBob25lTnVtYmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5waG9uZU51bWJlcjtcclxuICAgIH1cclxuICAgIGdldCBwcm92aWRlckRhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb3ZpZGVyRGF0YTtcclxuICAgIH1cclxuICAgIGdldCByZWZyZXNoVG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnJlZnJlc2hUb2tlbjtcclxuICAgIH1cclxuICAgIGdldCB0ZW5hbnRJZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUudGVuYW50SWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgZGlzcGxheU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtYWlsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5lbWFpbDtcclxuICAgIH1cclxuICAgIGdldCBwaG90b1VSTCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucGhvdG9VUkw7XHJcbiAgICB9XHJcbiAgICBnZXQgcHJvdmlkZXJJZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucHJvdmlkZXJJZDtcclxuICAgIH1cclxuICAgIGdldCB1aWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnVpZDtcclxuICAgIH1cclxuICAgIGdldCBhdXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5hdXRoO1xyXG4gICAgfVxyXG59XHJcbi8vIE1haW50YWluIGEgbWFwIHNvIHRoYXQgdGhlcmUncyBhbHdheXMgYSAxOjEgbWFwcGluZyBiZXR3ZWVuIG5ldyBVc2VyIGFuZFxyXG4vLyBsZWdhY3kgY29tcGF0IHVzZXJzXHJcblVzZXIuVVNFUl9NQVAgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBfYXNzZXJ0JDEgPSBleHAuX2Fzc2VydDtcclxuY2xhc3MgQXV0aCB7XHJcbiAgICBjb25zdHJ1Y3RvcihhcHAsIHByb3ZpZGVyKSB7XHJcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbmtVbmRlcmx5aW5nQXV0aCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHsgYXBpS2V5IH0gPSBhcHAub3B0aW9ucztcclxuICAgICAgICAvLyBUT0RPOiBwbGF0Zm9ybSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIHVzaW5nIGhldXJpc3RpY3NcclxuICAgICAgICBfYXNzZXJ0JDEoYXBpS2V5LCBcImludmFsaWQtYXBpLWtleVwiIC8qIElOVkFMSURfQVBJX0tFWSAqLywge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBwZXJzaXN0ZW5jZXMgPSBbZXhwLmluTWVtb3J5UGVyc2lzdGVuY2VdO1xyXG4gICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIHBlcnNpc3RlbmNlcyBpbiB3ZWIgZW52aXJvbm1lbnRzXHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYmVoYXZpb3I6IGluIHRoaXMgY2FzZSwgdGhlIHN0b3JlZFxyXG4gICAgICAgICAgICAvLyBwZXJzaXN0ZW5jZSBpcyBjaGVja2VkICpmaXJzdCogcmF0aGVyIHRoYW4gbGFzdC4gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnRcclxuICAgICAgICAgICAgLy8gdG8gcHJlZmVyIHN0b3JlZCBwZXJzaXN0ZW5jZSB0eXBlIGluIHRoZSBoaWVyYXJjaHkuXHJcbiAgICAgICAgICAgIHBlcnNpc3RlbmNlcyA9IF9nZXRQZXJzaXN0ZW5jZXNGcm9tUmVkaXJlY3QoYXBpS2V5LCBhcHAubmFtZSk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVyc2lzdGVuY2Ugb2YgW1xyXG4gICAgICAgICAgICAgICAgZXhwLmluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UsXHJcbiAgICAgICAgICAgICAgICBleHAuYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsXHJcbiAgICAgICAgICAgICAgICBleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZVxyXG4gICAgICAgICAgICBdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBlcnNpc3RlbmNlcy5pbmNsdWRlcyhwZXJzaXN0ZW5jZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZXMucHVzaChwZXJzaXN0ZW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogcGxhdGZvcm0gbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCB1c2luZyBoZXVyaXN0aWNzXHJcbiAgICAgICAgX2Fzc2VydCQxKGFwaUtleSwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBJTlZBTElEX0FQSV9LRVkgKi8sIHtcclxuICAgICAgICAgICAgYXBwTmFtZTogYXBwLm5hbWVcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBPbmx5IHVzZSBhIHBvcHVwL3JlZGlyZWN0IHJlc29sdmVyIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlciA6IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IHByb3ZpZGVyLmluaXRpYWxpemUoe1xyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZTogcGVyc2lzdGVuY2VzLFxyXG4gICAgICAgICAgICAgICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiByZXNvbHZlclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuX3VwZGF0ZUVycm9yTWFwKGV4cC5kZWJ1Z0Vycm9yTWFwKTtcclxuICAgICAgICB0aGlzLmxpbmtVbmRlcmx5aW5nQXV0aCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtdWxhdG9yQ29uZmlnKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5lbXVsYXRvckNvbmZpZztcclxuICAgIH1cclxuICAgIGdldCBjdXJyZW50VXNlcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RlbGVnYXRlLmN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gVXNlci5nZXRPckNyZWF0ZSh0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50VXNlcik7XHJcbiAgICB9XHJcbiAgICBnZXQgbGFuZ3VhZ2VDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5sYW5ndWFnZUNvZGU7XHJcbiAgICB9XHJcbiAgICBzZXQgbGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmxhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZTtcclxuICAgIH1cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgdGVuYW50SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnRlbmFudElkO1xyXG4gICAgfVxyXG4gICAgc2V0IHRlbmFudElkKHRpZCkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLnRlbmFudElkID0gdGlkO1xyXG4gICAgfVxyXG4gICAgdXNlRGV2aWNlTGFuZ3VhZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUudXNlRGV2aWNlTGFuZ3VhZ2UoKTtcclxuICAgIH1cclxuICAgIHNpZ25PdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNpZ25PdXQoKTtcclxuICAgIH1cclxuICAgIHVzZUVtdWxhdG9yKHVybCwgb3B0aW9ucykge1xyXG4gICAgICAgIGV4cC5jb25uZWN0QXV0aEVtdWxhdG9yKHRoaXMuX2RlbGVnYXRlLCB1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgYXBwbHlBY3Rpb25Db2RlKGNvZGUpIHtcclxuICAgICAgICByZXR1cm4gZXhwLmFwcGx5QWN0aW9uQ29kZSh0aGlzLl9kZWxlZ2F0ZSwgY29kZSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0FjdGlvbkNvZGUoY29kZSkge1xyXG4gICAgICAgIHJldHVybiBleHAuY2hlY2tBY3Rpb25Db2RlKHRoaXMuX2RlbGVnYXRlLCBjb2RlKTtcclxuICAgIH1cclxuICAgIGNvbmZpcm1QYXNzd29yZFJlc2V0KGNvZGUsIG5ld1Bhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5jb25maXJtUGFzc3dvcmRSZXNldCh0aGlzLl9kZWxlZ2F0ZSwgY29kZSwgbmV3UGFzc3dvcmQpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLmNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCh0aGlzLl9kZWxlZ2F0ZSwgZW1haWwsIHBhc3N3b3JkKSk7XHJcbiAgICB9XHJcbiAgICBmZXRjaFByb3ZpZGVyc0ZvckVtYWlsKGVtYWlsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoZW1haWwpO1xyXG4gICAgfVxyXG4gICAgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoZW1haWwpIHtcclxuICAgICAgICByZXR1cm4gZXhwLmZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsKHRoaXMuX2RlbGVnYXRlLCBlbWFpbCk7XHJcbiAgICB9XHJcbiAgICBpc1NpZ25JbldpdGhFbWFpbExpbmsoZW1haWxMaW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5pc1NpZ25JbldpdGhFbWFpbExpbmsodGhpcy5fZGVsZWdhdGUsIGVtYWlsTGluayk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRSZWRpcmVjdFJlc3VsdCgpIHtcclxuICAgICAgICBfYXNzZXJ0JDEoX2lzUG9wdXBSZWRpcmVjdFN1cHBvcnRlZCgpLCB0aGlzLl9kZWxlZ2F0ZSwgXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi8pO1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBleHAuZ2V0UmVkaXJlY3RSZXN1bHQodGhpcy5fZGVsZWdhdGUsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgaWYgKCFjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIFByb21pc2UucmVzb2x2ZShjcmVkZW50aWFsKSk7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBmcmFtZXdvcmtzIChlLmcuIEZpcmViYXNlVUktd2ViKSB0byBsb2cgdGhlaXIgdXNhZ2UuXHJcbiAgICAvLyBJdCBpcyBub3QgaW50ZW5kZWQgZm9yIGRpcmVjdCB1c2UgYnkgZGV2ZWxvcGVyIGFwcHMuIE5PIGpzZG9jIGhlcmUgdG8gaW50ZW50aW9uYWxseSBsZWF2ZSBpdFxyXG4gICAgLy8gb3V0IG9mIGF1dG9nZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBwYWdlcyB0byByZWR1Y2UgYWNjaWRlbnRhbCBtaXN1c2UuXHJcbiAgICBhZGRGcmFtZXdvcmtGb3JMb2dnaW5nKGZyYW1ld29yaykge1xyXG4gICAgICAgIGV4cC5hZGRGcmFtZXdvcmtGb3JMb2dnaW5nKHRoaXMuX2RlbGVnYXRlLCBmcmFtZXdvcmspO1xyXG4gICAgfVxyXG4gICAgb25BdXRoU3RhdGVDaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvckZuLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICBjb25zdCB7IG5leHQsIGVycm9yLCBjb21wbGV0ZSB9ID0gd3JhcE9ic2VydmVycyhuZXh0T3JPYnNlcnZlciwgZXJyb3JGbiwgY29tcGxldGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub25BdXRoU3RhdGVDaGFuZ2VkKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XHJcbiAgICB9XHJcbiAgICBvbklkVG9rZW5DaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvckZuLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICBjb25zdCB7IG5leHQsIGVycm9yLCBjb21wbGV0ZSB9ID0gd3JhcE9ic2VydmVycyhuZXh0T3JPYnNlcnZlciwgZXJyb3JGbiwgY29tcGxldGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub25JZFRva2VuQ2hhbmdlZChuZXh0LCBlcnJvciwgY29tcGxldGUpO1xyXG4gICAgfVxyXG4gICAgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnNlbmRTaWduSW5MaW5rVG9FbWFpbCh0aGlzLl9kZWxlZ2F0ZSwgZW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnNlbmRQYXNzd29yZFJlc2V0RW1haWwodGhpcy5fZGVsZWdhdGUsIGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MgfHwgdW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNldFBlcnNpc3RlbmNlKHBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgX3ZhbGlkYXRlUGVyc2lzdGVuY2VBcmd1bWVudCh0aGlzLl9kZWxlZ2F0ZSwgcGVyc2lzdGVuY2UpO1xyXG4gICAgICAgIGxldCBjb252ZXJ0ZWQ7XHJcbiAgICAgICAgc3dpdGNoIChwZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgICAgICBjYXNlIFBlcnNpc3RlbmNlLlNFU1NJT046XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBlcnNpc3RlbmNlLkxPQ0FMOlxyXG4gICAgICAgICAgICAgICAgLy8gTm90IHVzaW5nIGlzSW5kZXhlZERCQXZhaWxhYmxlKCkgc2luY2UgaXQgb25seSBjaGVja3MgaWYgaW5kZXhlZERCIGlzIGRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0luZGV4ZWREQkZ1bGx5U3VwcG9ydGVkID0gYXdhaXQgZXhwXHJcbiAgICAgICAgICAgICAgICAgICAgLl9nZXRJbnN0YW5jZShleHAuaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSlcclxuICAgICAgICAgICAgICAgICAgICAuX2lzQXZhaWxhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBpc0luZGV4ZWREQkZ1bGx5U3VwcG9ydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPyBleHAuaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgIDogZXhwLmJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUGVyc2lzdGVuY2UuTk9ORTpcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGV4cC5pbk1lbW9yeVBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwLl9mYWlsKFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBUkdVTUVOVF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IHRoaXMuX2RlbGVnYXRlLm5hbWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2V0UGVyc2lzdGVuY2UoY29udmVydGVkKTtcclxuICAgIH1cclxuICAgIHNpZ25JbkFuZFJldHJpZXZlRGF0YVdpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIHNpZ25JbkFub255bW91c2x5KCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbkFub255bW91c2x5KHRoaXMuX2RlbGVnYXRlKSk7XHJcbiAgICB9XHJcbiAgICBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHRoaXMuX2RlbGVnYXRlLCBleHAuc2lnbkluV2l0aENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIGNyZWRlbnRpYWwpKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhDdXN0b21Ub2tlbih0b2tlbikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhDdXN0b21Ub2tlbih0aGlzLl9kZWxlZ2F0ZSwgdG9rZW4pKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKHRoaXMuX2RlbGVnYXRlLCBlbWFpbCwgcGFzc3dvcmQpKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhFbWFpbExpbmsoZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhFbWFpbExpbmsodGhpcy5fZGVsZWdhdGUsIGVtYWlsLCBlbWFpbExpbmspKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0KHRoaXMuX2RlbGVnYXRlLCBleHAuc2lnbkluV2l0aFBob25lTnVtYmVyKHRoaXMuX2RlbGVnYXRlLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbkluV2l0aFBvcHVwKHByb3ZpZGVyKSB7XHJcbiAgICAgICAgX2Fzc2VydCQxKF9pc1BvcHVwUmVkaXJlY3RTdXBwb3J0ZWQoKSwgdGhpcy5fZGVsZWdhdGUsIFwib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovKTtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIGV4cC5zaWduSW5XaXRoUG9wdXAodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVyLCBDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNpZ25JbldpdGhSZWRpcmVjdChwcm92aWRlcikge1xyXG4gICAgICAgIF9hc3NlcnQkMShfaXNQb3B1cFJlZGlyZWN0U3VwcG9ydGVkKCksIHRoaXMuX2RlbGVnYXRlLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICAgICAgYXdhaXQgX3NhdmVQZXJzaXN0ZW5jZUZvclJlZGlyZWN0KHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICByZXR1cm4gZXhwLnNpZ25JbldpdGhSZWRpcmVjdCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIHRzLWlnbm9yZSBvbmNlIG92ZXJsb2FkcyBhcmUgZGVmaW5lZCBmb3IgZXhwIGZ1bmN0aW9ucyB0byBhY2NlcHQgY29tcGF0IG9iamVjdHNcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnVwZGF0ZUN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgfVxyXG4gICAgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUoY29kZSkge1xyXG4gICAgICAgIHJldHVybiBleHAudmVyaWZ5UGFzc3dvcmRSZXNldENvZGUodGhpcy5fZGVsZWdhdGUsIGNvZGUpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIF9kZWxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLl9kZWxldGUoKTtcclxuICAgIH1cclxuICAgIGxpbmtVbmRlcmx5aW5nQXV0aCgpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS53cmFwcGVkID0gKCkgPT4gdGhpcztcclxuICAgIH1cclxufVxyXG5BdXRoLlBlcnNpc3RlbmNlID0gUGVyc2lzdGVuY2U7XHJcbmZ1bmN0aW9uIHdyYXBPYnNlcnZlcnMobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xyXG4gICAgbGV0IG5leHQgPSBuZXh0T3JPYnNlcnZlcjtcclxuICAgIGlmICh0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAoeyBuZXh0LCBlcnJvciwgY29tcGxldGUgfSA9IG5leHRPck9ic2VydmVyKTtcclxuICAgIH1cclxuICAgIC8vIFdlIGtub3cgJ25leHQnIGlzIG5vdyBhIGZ1bmN0aW9uXHJcbiAgICBjb25zdCBvbGROZXh0ID0gbmV4dDtcclxuICAgIGNvbnN0IG5ld05leHQgPSAodXNlcikgPT4gb2xkTmV4dCh1c2VyICYmIFVzZXIuZ2V0T3JDcmVhdGUodXNlcikpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBuZXdOZXh0LFxyXG4gICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICBjb21wbGV0ZVxyXG4gICAgfTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBQaG9uZUF1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSAncGhvbmUnO1xyXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cy1pZ25vcmUgd2hlbiBtb3ZpbmcgdHlwZXMgZnJvbSBhdXRoLXR5cGVzIHRvIGF1dGgtY29tcGF0XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbmV3IGV4cC5QaG9uZUF1dGhQcm92aWRlcih1bndyYXAoZmlyZWJhc2UuYXV0aCgpKSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSkge1xyXG4gICAgICAgIHJldHVybiBleHAuUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAgICB9XHJcbiAgICB2ZXJpZnlQaG9uZU51bWJlcihwaG9uZUluZm9PcHRpb25zLCBhcHBsaWNhdGlvblZlcmlmaWVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnZlcmlmeVBob25lTnVtYmVyKFxyXG4gICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIGJ1dCB0aGUgdHlwZXMgYXJlIHN1YnRseSBpbmNvbXBhdGlibGVcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHBob25lSW5mb09wdGlvbnMsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcclxuICAgIH1cclxufVxyXG5QaG9uZUF1dGhQcm92aWRlci5QSE9ORV9TSUdOX0lOX01FVEhPRCA9IGV4cC5QaG9uZUF1dGhQcm92aWRlci5QSE9ORV9TSUdOX0lOX01FVEhPRDtcclxuUGhvbmVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBleHAuUGhvbmVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9hc3NlcnQgPSBleHAuX2Fzc2VydDtcclxuY2xhc3MgUmVjYXB0Y2hhVmVyaWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBwYXJhbWV0ZXJzLCBhcHAgPSBmaXJlYmFzZS5hcHAoKSkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBBUEkga2V5IGlzIHJlcXVpcmVkIGZvciB3ZWIgY2xpZW50IFJQQyBjYWxscy5cclxuICAgICAgICBfYXNzZXJ0KChfYSA9IGFwcC5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXBpS2V5LCBcImludmFsaWQtYXBpLWtleVwiIC8qIElOVkFMSURfQVBJX0tFWSAqLywge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbmV3IGV4cC5SZWNhcHRjaGFWZXJpZmllcihjb250YWluZXIsIFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgcGFyYW1ldGVycywgXHJcbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzLWlnbm9yZSB3aGVuIG1vdmluZyB0eXBlcyBmcm9tIGF1dGgtdHlwZXMgdG8gYXV0aC1jb21wYXRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgYXBwLmF1dGgoKSk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5fZGVsZWdhdGUudHlwZTtcclxuICAgIH1cclxuICAgIGNsZWFyKCkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnJlbmRlcigpO1xyXG4gICAgfVxyXG4gICAgdmVyaWZ5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS52ZXJpZnkoKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBBVVRIX1RZUEUgPSAnYXV0aC1jb21wYXQnO1xyXG4vLyBDcmVhdGUgYXV0aCBjb21wb25lbnRzIHRvIHJlZ2lzdGVyIHdpdGggZmlyZWJhc2UuXHJcbi8vIFByb3ZpZGVzIEF1dGggcHVibGljIEFQSXMuXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyQXV0aENvbXBhdChpbnN0YW5jZSkge1xyXG4gICAgaW5zdGFuY2UuSU5URVJOQUwucmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudChBVVRIX1RZUEUsIGNvbnRhaW5lciA9PiB7XHJcbiAgICAgICAgLy8gZ2V0SW1tZWRpYXRlIGZvciBGaXJlYmFzZUFwcCB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgY29uc3QgYXBwID0gY29udGFpbmVyLmdldFByb3ZpZGVyKCdhcHAtY29tcGF0JykuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgY29uc3QgYXV0aFByb3ZpZGVyID0gY29udGFpbmVyLmdldFByb3ZpZGVyKCdhdXRoJyk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRoKGFwcCwgYXV0aFByb3ZpZGVyKTtcclxuICAgIH0sIFwiUFVCTElDXCIgLyogUFVCTElDICovKVxyXG4gICAgICAgIC5zZXRTZXJ2aWNlUHJvcHMoe1xyXG4gICAgICAgIEFjdGlvbkNvZGVJbmZvOiB7XHJcbiAgICAgICAgICAgIE9wZXJhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgRU1BSUxfU0lHTklOOiBleHAuQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU4sXHJcbiAgICAgICAgICAgICAgICBQQVNTV09SRF9SRVNFVDogZXhwLkFjdGlvbkNvZGVPcGVyYXRpb24uUEFTU1dPUkRfUkVTRVQsXHJcbiAgICAgICAgICAgICAgICBSRUNPVkVSX0VNQUlMOiBleHAuQWN0aW9uQ29kZU9wZXJhdGlvbi5SRUNPVkVSX0VNQUlMLFxyXG4gICAgICAgICAgICAgICAgUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046IGV4cC5BY3Rpb25Db2RlT3BlcmF0aW9uLlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OLFxyXG4gICAgICAgICAgICAgICAgVkVSSUZZX0FORF9DSEFOR0VfRU1BSUw6IGV4cC5BY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLFxyXG4gICAgICAgICAgICAgICAgVkVSSUZZX0VNQUlMOiBleHAuQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfRU1BSUxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgRW1haWxBdXRoUHJvdmlkZXI6IGV4cC5FbWFpbEF1dGhQcm92aWRlcixcclxuICAgICAgICBGYWNlYm9va0F1dGhQcm92aWRlcjogZXhwLkZhY2Vib29rQXV0aFByb3ZpZGVyLFxyXG4gICAgICAgIEdpdGh1YkF1dGhQcm92aWRlcjogZXhwLkdpdGh1YkF1dGhQcm92aWRlcixcclxuICAgICAgICBHb29nbGVBdXRoUHJvdmlkZXI6IGV4cC5Hb29nbGVBdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgT0F1dGhQcm92aWRlcjogZXhwLk9BdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgU0FNTEF1dGhQcm92aWRlcjogZXhwLlNBTUxBdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgUGhvbmVBdXRoUHJvdmlkZXI6IFBob25lQXV0aFByb3ZpZGVyLFxyXG4gICAgICAgIFBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3I6IGV4cC5QaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yLFxyXG4gICAgICAgIFJlY2FwdGNoYVZlcmlmaWVyOiBSZWNhcHRjaGFWZXJpZmllcixcclxuICAgICAgICBUd2l0dGVyQXV0aFByb3ZpZGVyOiBleHAuVHdpdHRlckF1dGhQcm92aWRlcixcclxuICAgICAgICBBdXRoLFxyXG4gICAgICAgIEF1dGhDcmVkZW50aWFsOiBleHAuQXV0aENyZWRlbnRpYWwsXHJcbiAgICAgICAgRXJyb3I6IEZpcmViYXNlRXJyb3JcclxuICAgIH0pXHJcbiAgICAgICAgLnNldEluc3RhbnRpYXRpb25Nb2RlKFwiTEFaWVwiIC8qIExBWlkgKi8pXHJcbiAgICAgICAgLnNldE11bHRpcGxlSW5zdGFuY2VzKGZhbHNlKSk7XHJcbiAgICBpbnN0YW5jZS5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbik7XHJcbn1cclxucmVnaXN0ZXJBdXRoQ29tcGF0KGZpcmViYXNlKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2ZpcmVzdG9yZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCJpbXBvcnQgZmlyZWJhc2UgZnJvbSAnQGZpcmViYXNlL2FwcC1jb21wYXQnO1xuaW1wb3J0IHsgRmlyZXN0b3JlRXJyb3IsIEJ5dGVzLCBfaXNCYXNlNjRBdmFpbGFibGUsIGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlLCBlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlLCBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlLCBfRGF0YWJhc2VJZCwgX2xvZ1dhcm4sIGNvbm5lY3RGaXJlc3RvcmVFbXVsYXRvciwgZW5hYmxlTmV0d29yaywgZGlzYWJsZU5ldHdvcmssIF92YWxpZGF0ZUlzTm90VXNlZFRvZ2V0aGVyLCB3YWl0Rm9yUGVuZGluZ1dyaXRlcywgb25TbmFwc2hvdHNJblN5bmMsIGNvbGxlY3Rpb24sIGRvYywgY29sbGVjdGlvbkdyb3VwLCBydW5UcmFuc2FjdGlvbiwgZW5zdXJlRmlyZXN0b3JlQ29uZmlndXJlZCwgV3JpdGVCYXRjaCBhcyBXcml0ZUJhdGNoJDEsIGV4ZWN1dGVXcml0ZSwgbG9hZEJ1bmRsZSwgbmFtZWRRdWVyeSwgX2Nhc3QsIERvY3VtZW50UmVmZXJlbmNlIGFzIERvY3VtZW50UmVmZXJlbmNlJDEsIERvY3VtZW50U25hcHNob3QgYXMgRG9jdW1lbnRTbmFwc2hvdCQxLCBfRG9jdW1lbnRLZXksIHJlZkVxdWFsLCBzZXREb2MsIHVwZGF0ZURvYywgZGVsZXRlRG9jLCBvblNuYXBzaG90LCBnZXREb2NGcm9tQ2FjaGUsIGdldERvY0Zyb21TZXJ2ZXIsIGdldERvYywgc25hcHNob3RFcXVhbCwgcXVlcnksIHdoZXJlLCBvcmRlckJ5LCBsaW1pdCwgbGltaXRUb0xhc3QsIHN0YXJ0QXQsIHN0YXJ0QWZ0ZXIsIGVuZEJlZm9yZSwgZW5kQXQsIHF1ZXJ5RXF1YWwsIGdldERvY3NGcm9tQ2FjaGUsIGdldERvY3NGcm9tU2VydmVyLCBnZXREb2NzLCBRdWVyeVNuYXBzaG90IGFzIFF1ZXJ5U25hcHNob3QkMSwgYWRkRG9jLCBBYnN0cmFjdFVzZXJEYXRhV3JpdGVyLCBzZXRMb2dMZXZlbCBhcyBzZXRMb2dMZXZlbCQxLCBRdWVyeURvY3VtZW50U25hcHNob3QgYXMgUXVlcnlEb2N1bWVudFNuYXBzaG90JDEsIF9kZWJ1Z0Fzc2VydCwgRmllbGRQYXRoIGFzIEZpZWxkUGF0aCQxLCBfRmllbGRQYXRoLCBzZXJ2ZXJUaW1lc3RhbXAsIGRlbGV0ZUZpZWxkLCBhcnJheVVuaW9uLCBhcnJheVJlbW92ZSwgaW5jcmVtZW50LCBHZW9Qb2ludCwgVGltZXN0YW1wLCBDQUNIRV9TSVpFX1VOTElNSVRFRCB9IGZyb20gJ0BmaXJlYmFzZS9maXJlc3RvcmUnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5cbmNvbnN0IG5hbWUgPSBcIkBmaXJlYmFzZS9maXJlc3RvcmUtY29tcGF0XCI7XG5jb25zdCB2ZXJzaW9uID0gXCIwLjEuMTBcIjtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVTZXRPcHRpb25zKG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtZXJnZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMubWVyZ2VGaWVsZHMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLm1lcmdlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRmlyZXN0b3JlRXJyb3IoJ2ludmFsaWQtYXJndW1lbnQnLCBgSW52YWxpZCBvcHRpb25zIHBhc3NlZCB0byBmdW5jdGlvbiAke21ldGhvZE5hbWV9KCk6IFlvdSBjYW5ub3QgYCArXHJcbiAgICAgICAgICAgICdzcGVjaWZ5IGJvdGggXCJtZXJnZVwiIGFuZCBcIm1lcmdlRmllbGRzXCIuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKiogSGVscGVyIGZ1bmN0aW9uIHRvIGFzc2VydCBVaW50OEFycmF5IGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLiAqL1xyXG5mdW5jdGlvbiBhc3NlcnRVaW50OEFycmF5QXZhaWxhYmxlKCkge1xyXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRocm93IG5ldyBGaXJlc3RvcmVFcnJvcigndW5pbXBsZW1lbnRlZCcsICdVaW50OEFycmF5cyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LicpO1xyXG4gICAgfVxyXG59XHJcbi8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gYXNzZXJ0IEJhc2U2NCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBhdCBydW50aW1lLiAqL1xyXG5mdW5jdGlvbiBhc3NlcnRCYXNlNjRBdmFpbGFibGUoKSB7XHJcbiAgICBpZiAoIV9pc0Jhc2U2NEF2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEZpcmVzdG9yZUVycm9yKCd1bmltcGxlbWVudGVkJywgJ0Jsb2JzIGFyZSB1bmF2YWlsYWJsZSBpbiBGaXJlc3RvcmUgaW4gdGhpcyBlbnZpcm9ubWVudC4nKTtcclxuICAgIH1cclxufVxyXG4vKiogSW1tdXRhYmxlIGNsYXNzIGhvbGRpbmcgYSBibG9iIChiaW5hcnkgZGF0YSkgKi9cclxuY2xhc3MgQmxvYiB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tQmFzZTY0U3RyaW5nKGJhc2U2NCkge1xyXG4gICAgICAgIGFzc2VydEJhc2U2NEF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihCeXRlcy5mcm9tQmFzZTY0U3RyaW5nKGJhc2U2NCkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21VaW50OEFycmF5KGFycmF5KSB7XHJcbiAgICAgICAgYXNzZXJ0VWludDhBcnJheUF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihCeXRlcy5mcm9tVWludDhBcnJheShhcnJheSkpO1xyXG4gICAgfVxyXG4gICAgdG9CYXNlNjQoKSB7XHJcbiAgICAgICAgYXNzZXJ0QmFzZTY0QXZhaWxhYmxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnRvQmFzZTY0KCk7XHJcbiAgICB9XHJcbiAgICB0b1VpbnQ4QXJyYXkoKSB7XHJcbiAgICAgICAgYXNzZXJ0VWludDhBcnJheUF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS50b1VpbnQ4QXJyYXkoKTtcclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNFcXVhbChvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuICdCbG9iKGJhc2U2NDogJyArIHRoaXMudG9CYXNlNjQoKSArICcpJztcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1BhcnRpYWxPYnNlcnZlcihvYmopIHtcclxuICAgIHJldHVybiBpbXBsZW1lbnRzQW55TWV0aG9kcyhvYmosIFsnbmV4dCcsICdlcnJvcicsICdjb21wbGV0ZSddKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhbiBvYmplY3QgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkXHJcbiAqIG1ldGhvZHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBpbXBsZW1lbnRzQW55TWV0aG9kcyhvYmosIG1ldGhvZHMpIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvYmplY3QgPSBvYmo7XHJcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XHJcbiAgICAgICAgaWYgKG1ldGhvZCBpbiBvYmplY3QgJiYgdHlwZW9mIG9iamVjdFttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGluY2x1ZGVkIHdpdGggdGhlIGZ1bGwgRmlyZXN0b3JlIFNESy5cclxuICovXHJcbmNsYXNzIEluZGV4ZWREYlBlcnNpc3RlbmNlUHJvdmlkZXIge1xyXG4gICAgZW5hYmxlSW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlLCBmb3JjZU93bmVyc2hpcCkge1xyXG4gICAgICAgIHJldHVybiBlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUuX2RlbGVnYXRlLCB7IGZvcmNlT3duZXJzaGlwIH0pO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUpIHtcclxuICAgICAgICByZXR1cm4gZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbXBhdCBjbGFzcyBmb3IgRmlyZXN0b3JlLiBFeHBvc2VzIEZpcmVzdG9yZSBMZWdhY3kgQVBJLCBidXQgZGVsZWdhdGVzXHJcbiAqIHRvIHRoZSBmdW5jdGlvbmFsIEFQSSBvZiBmaXJlc3RvcmUtZXhwLlxyXG4gKi9cclxuY2xhc3MgRmlyZXN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGFiYXNlSWRPckFwcCwgX2RlbGVnYXRlLCBfcGVyc2lzdGVuY2VQcm92aWRlcikge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlUHJvdmlkZXIgPSBfcGVyc2lzdGVuY2VQcm92aWRlcjtcclxuICAgICAgICB0aGlzLklOVEVSTkFMID0ge1xyXG4gICAgICAgICAgICBkZWxldGU6ICgpID0+IHRoaXMudGVybWluYXRlKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghKGRhdGFiYXNlSWRPckFwcCBpbnN0YW5jZW9mIF9EYXRhYmFzZUlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQgPSBkYXRhYmFzZUlkT3JBcHA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IF9kYXRhYmFzZUlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fZGF0YWJhc2VJZDtcclxuICAgIH1cclxuICAgIHNldHRpbmdzKHNldHRpbmdzTGl0ZXJhbCkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9IHRoaXMuX2RlbGVnYXRlLl9nZXRTZXR0aW5ncygpO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NMaXRlcmFsLm1lcmdlICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRTZXR0aW5ncy5ob3N0ICE9PSBzZXR0aW5nc0xpdGVyYWwuaG9zdCkge1xyXG4gICAgICAgICAgICBfbG9nV2FybignWW91IGFyZSBvdmVycmlkaW5nIHRoZSBvcmlnaW5hbCBob3N0LiBJZiB5b3UgZGlkIG5vdCBpbnRlbmQgJyArXHJcbiAgICAgICAgICAgICAgICAndG8gb3ZlcnJpZGUgeW91ciBzZXR0aW5ncywgdXNlIHttZXJnZTogdHJ1ZX0uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0xpdGVyYWwubWVyZ2UpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3NMaXRlcmFsID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50U2V0dGluZ3MpLCBzZXR0aW5nc0xpdGVyYWwpO1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHNldHRpbmdzIG9uY2UgdGhlIG1lcmdlIGlzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBkZWxldGUgc2V0dGluZ3NMaXRlcmFsLm1lcmdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5fc2V0U2V0dGluZ3Moc2V0dGluZ3NMaXRlcmFsKTtcclxuICAgIH1cclxuICAgIHVzZUVtdWxhdG9yKGhvc3QsIHBvcnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbm5lY3RGaXJlc3RvcmVFbXVsYXRvcih0aGlzLl9kZWxlZ2F0ZSwgaG9zdCwgcG9ydCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBlbmFibGVOZXR3b3JrKCkge1xyXG4gICAgICAgIHJldHVybiBlbmFibGVOZXR3b3JrKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGRpc2FibGVOZXR3b3JrKCkge1xyXG4gICAgICAgIHJldHVybiBkaXNhYmxlTmV0d29yayh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBlbmFibGVQZXJzaXN0ZW5jZShzZXR0aW5ncykge1xyXG4gICAgICAgIGxldCBzeW5jaHJvbml6ZVRhYnMgPSBmYWxzZTtcclxuICAgICAgICBsZXQgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgc3luY2hyb25pemVUYWJzID0gISFzZXR0aW5ncy5zeW5jaHJvbml6ZVRhYnM7XHJcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbEZvcmNlT3duaW5nVGFiID0gISFzZXR0aW5ncy5leHBlcmltZW50YWxGb3JjZU93bmluZ1RhYjtcclxuICAgICAgICAgICAgX3ZhbGlkYXRlSXNOb3RVc2VkVG9nZXRoZXIoJ3N5bmNocm9uaXplVGFicycsIHN5bmNocm9uaXplVGFicywgJ2V4cGVyaW1lbnRhbEZvcmNlT3duaW5nVGFiJywgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3luY2hyb25pemVUYWJzXHJcbiAgICAgICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2VQcm92aWRlci5lbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlKHRoaXMpXHJcbiAgICAgICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2VQcm92aWRlci5lbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSh0aGlzLCBleHBlcmltZW50YWxGb3JjZU93bmluZ1RhYik7XHJcbiAgICB9XHJcbiAgICBjbGVhclBlcnNpc3RlbmNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZVByb3ZpZGVyLmNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0ZXJtaW5hdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FwcENvbXBhdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQuX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSgnZmlyZXN0b3JlLWNvbXBhdCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQuX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSgnZmlyZXN0b3JlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fZGVsZXRlKCk7XHJcbiAgICB9XHJcbiAgICB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpIHtcclxuICAgICAgICByZXR1cm4gd2FpdEZvclBlbmRpbmdXcml0ZXModGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgb25TbmFwc2hvdHNJblN5bmMoYXJnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9uU25hcHNob3RzSW5TeW5jKHRoaXMuX2RlbGVnYXRlLCBhcmcpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFwcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2FwcENvbXBhdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlyZXN0b3JlRXJyb3IoJ2ZhaWxlZC1wcmVjb25kaXRpb24nLCBcIkZpcmVzdG9yZSB3YXMgbm90IGluaXRpYWxpemVkIHVzaW5nIHRoZSBGaXJlYmFzZSBTREsuICdhcHAnIGlzIFwiICtcclxuICAgICAgICAgICAgICAgICdub3QgYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBDb21wYXQ7XHJcbiAgICB9XHJcbiAgICBjb2xsZWN0aW9uKHBhdGhTdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25SZWZlcmVuY2UodGhpcywgY29sbGVjdGlvbih0aGlzLl9kZWxlZ2F0ZSwgcGF0aFN0cmluZykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsICdjb2xsZWN0aW9uKCknLCAnRmlyZXN0b3JlLmNvbGxlY3Rpb24oKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRvYyhwYXRoU3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLCBkb2ModGhpcy5fZGVsZWdhdGUsIHBhdGhTdHJpbmcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnZG9jKCknLCAnRmlyZXN0b3JlLmRvYygpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29sbGVjdGlvbkdyb3VwKGNvbGxlY3Rpb25JZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgY29sbGVjdGlvbkdyb3VwKHRoaXMuX2RlbGVnYXRlLCBjb2xsZWN0aW9uSWQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnY29sbGVjdGlvbkdyb3VwKCknLCAnRmlyZXN0b3JlLmNvbGxlY3Rpb25Hcm91cCgpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcnVuVHJhbnNhY3Rpb24odXBkYXRlRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gcnVuVHJhbnNhY3Rpb24odGhpcy5fZGVsZWdhdGUsIHRyYW5zYWN0aW9uID0+IHVwZGF0ZUZ1bmN0aW9uKG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc2FjdGlvbikpKTtcclxuICAgIH1cclxuICAgIGJhdGNoKCkge1xyXG4gICAgICAgIGVuc3VyZUZpcmVzdG9yZUNvbmZpZ3VyZWQodGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgICAgIHJldHVybiBuZXcgV3JpdGVCYXRjaChuZXcgV3JpdGVCYXRjaCQxKHRoaXMuX2RlbGVnYXRlLCBtdXRhdGlvbnMgPT4gZXhlY3V0ZVdyaXRlKHRoaXMuX2RlbGVnYXRlLCBtdXRhdGlvbnMpKSk7XHJcbiAgICB9XHJcbiAgICBsb2FkQnVuZGxlKGJ1bmRsZURhdGEpIHtcclxuICAgICAgICByZXR1cm4gbG9hZEJ1bmRsZSh0aGlzLl9kZWxlZ2F0ZSwgYnVuZGxlRGF0YSk7XHJcbiAgICB9XHJcbiAgICBuYW1lZFF1ZXJ5KG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmFtZWRRdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgbmFtZSkudGhlbihleHBRdWVyeSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXhwUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgXHJcbiAgICAgICAgICAgIC8vIFdlIGNhbiBwYXNzIGBleHBRdWVyeWAgaGVyZSBkaXJlY3RseSBzaW5jZSBuYW1lZCBxdWVyaWVzIGRvbid0IGhhdmUgYSBVc2VyRGF0YUNvbnZlcnRlci5cclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBFeHBRdWVyeSBhbmQgcGFzcyB0aGUgb2xkIFVzZXJEYXRhQ29udmVydGVyLlxyXG4gICAgICAgICAgICBleHBRdWVyeSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVXNlckRhdGFXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFVzZXJEYXRhV3JpdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGZpcmVzdG9yZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5maXJlc3RvcmUgPSBmaXJlc3RvcmU7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0Qnl0ZXMoYnl0ZXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IobmV3IEJ5dGVzKGJ5dGVzKSk7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0UmVmZXJlbmNlKG5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbnZlcnREb2N1bWVudEtleShuYW1lLCB0aGlzLmZpcmVzdG9yZS5fZGF0YWJhc2VJZCk7XHJcbiAgICAgICAgcmV0dXJuIERvY3VtZW50UmVmZXJlbmNlLmZvcktleShrZXksIHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XHJcbiAgICBzZXRMb2dMZXZlbCQxKGxldmVsKTtcclxufVxyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gYSB0cmFuc2FjdGlvbi5cclxuICovXHJcbmNsYXNzIFRyYW5zYWN0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKF9maXJlc3RvcmUsIF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IF9maXJlc3RvcmU7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7XHJcbiAgICAgICAgdGhpcy5fdXNlckRhdGFXcml0ZXIgPSBuZXcgVXNlckRhdGFXcml0ZXIoX2ZpcmVzdG9yZSk7XHJcbiAgICB9XHJcbiAgICBnZXQoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGVcclxuICAgICAgICAgICAgLmdldChyZWYpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBuZXcgRG9jdW1lbnRTbmFwc2hvdCh0aGlzLl9maXJlc3RvcmUsIG5ldyBEb2N1bWVudFNuYXBzaG90JDEodGhpcy5fZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHJlc3VsdC5fa2V5LCByZXN1bHQuX2RvY3VtZW50LCByZXN1bHQubWV0YWRhdGEsIHJlZi5jb252ZXJ0ZXIpKSk7XHJcbiAgICB9XHJcbiAgICBzZXQoZG9jdW1lbnRSZWYsIGRhdGEsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YWxpZGF0ZVNldE9wdGlvbnMoJ1RyYW5zYWN0aW9uLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXQocmVmLCBkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldChyZWYsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHVwZGF0ZShkb2N1bWVudFJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkZWxldGUoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZWxldGUocmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxyXG5jbGFzcyBXcml0ZUJhdGNoIHtcclxuICAgIGNvbnN0cnVjdG9yKF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgc2V0KGRvY3VtZW50UmVmLCBkYXRhLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGVTZXRPcHRpb25zKCdXcml0ZUJhdGNoLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXQocmVmLCBkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldChyZWYsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHVwZGF0ZShkb2N1bWVudFJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkZWxldGUoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZWxldGUocmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGNvbW1pdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tbWl0KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFdyYXBzIGEgYFB1YmxpY0ZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIHRyYW5zbGF0aW5nIHRoZSB0eXBlcyBmcm9tIHRoZVxyXG4gKiBleHBlcmltZW50YWwgU0RLIGludG8gY29ycmVzcG9uZGluZyB0eXBlcyBmcm9tIHRoZSBDbGFzc2ljIFNESyBiZWZvcmUgcGFzc2luZ1xyXG4gKiB0aGVtIHRvIHRoZSB3cmFwcGVkIGNvbnZlcnRlci5cclxuICovXHJcbmNsYXNzIEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX3VzZXJEYXRhV3JpdGVyLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSBfZmlyZXN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3VzZXJEYXRhV3JpdGVyID0gX3VzZXJEYXRhV3JpdGVyO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgZnJvbUZpcmVzdG9yZShzbmFwc2hvdCwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGV4cFNuYXBzaG90ID0gbmV3IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCQxKHRoaXMuX2ZpcmVzdG9yZS5fZGVsZWdhdGUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCBzbmFwc2hvdC5fa2V5LCBzbmFwc2hvdC5fZG9jdW1lbnQsIHNuYXBzaG90Lm1ldGFkYXRhLCBcclxuICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5mcm9tRmlyZXN0b3JlKG5ldyBRdWVyeURvY3VtZW50U25hcHNob3QodGhpcy5fZmlyZXN0b3JlLCBleHBTbmFwc2hvdCksIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9KTtcclxuICAgIH1cclxuICAgIHRvRmlyZXN0b3JlKG1vZGVsT2JqZWN0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS50b0ZpcmVzdG9yZShtb2RlbE9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUudG9GaXJlc3RvcmUobW9kZWxPYmplY3QsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFVzZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiBgRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZXNcclxuICAgIC8vIG9mIGBGaXJlc3RvcmVgIGFuZCBgUHVibGljRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgc28gdGhhdCBpc0VxdWFsKCkgd2lsbFxyXG4gICAgLy8gY29tcGFyZSBlcXVhbCBmb3IgdHdvIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGNvbnZlcnRlciBpbnN0YW5jZS5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShmaXJlc3RvcmUsIGNvbnZlcnRlcikge1xyXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlID0gRmlyZXN0b3JlRGF0YUNvbnZlcnRlci5JTlNUQU5DRVM7XHJcbiAgICAgICAgbGV0IHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlciA9IGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlLmdldChmaXJlc3RvcmUpO1xyXG4gICAgICAgIGlmICghdW50eXBlZENvbnZlcnRlckJ5Q29udmVydGVyKSB7XHJcbiAgICAgICAgICAgIHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlciA9IG5ldyBXZWFrTWFwKCk7XHJcbiAgICAgICAgICAgIGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlLnNldChmaXJlc3RvcmUsIHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlci5nZXQoY29udmVydGVyKTtcclxuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIoZmlyZXN0b3JlLCBuZXcgVXNlckRhdGFXcml0ZXIoZmlyZXN0b3JlKSwgY29udmVydGVyKTtcclxuICAgICAgICAgICAgdW50eXBlZENvbnZlcnRlckJ5Q29udmVydGVyLnNldChjb252ZXJ0ZXIsIGluc3RhbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59XHJcbkZpcmVzdG9yZURhdGFDb252ZXJ0ZXIuSU5TVEFOQ0VTID0gbmV3IFdlYWtNYXAoKTtcclxuLyoqXHJcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcGFydGljdWxhciBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24gaW4gdGhlIGRhdGFiYXNlLlxyXG4gKi9cclxuY2xhc3MgRG9jdW1lbnRSZWZlcmVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLl91c2VyRGF0YVdyaXRlciA9IG5ldyBVc2VyRGF0YVdyaXRlcihmaXJlc3RvcmUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZvclBhdGgocGF0aCwgZmlyZXN0b3JlLCBjb252ZXJ0ZXIpIHtcclxuICAgICAgICBpZiAocGF0aC5sZW5ndGggJSAyICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBGaXJlc3RvcmVFcnJvcignaW52YWxpZC1hcmd1bWVudCcsICdJbnZhbGlkIGRvY3VtZW50IHJlZmVyZW5jZS4gRG9jdW1lbnQgJyArXHJcbiAgICAgICAgICAgICAgICAncmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAnICtcclxuICAgICAgICAgICAgICAgIGAke3BhdGguY2Fub25pY2FsU3RyaW5nKCl9IGhhcyAke3BhdGgubGVuZ3RofWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UmVmZXJlbmNlKGZpcmVzdG9yZSwgbmV3IERvY3VtZW50UmVmZXJlbmNlJDEoZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgY29udmVydGVyLCBuZXcgX0RvY3VtZW50S2V5KHBhdGgpKSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9yS2V5KGtleSwgZmlyZXN0b3JlLCBjb252ZXJ0ZXIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UmVmZXJlbmNlKGZpcmVzdG9yZSwgbmV3IERvY3VtZW50UmVmZXJlbmNlJDEoZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgY29udmVydGVyLCBrZXkpKTtcclxuICAgIH1cclxuICAgIGdldCBpZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcGFyZW50KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUucGFyZW50KTtcclxuICAgIH1cclxuICAgIGdldCBwYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5wYXRoO1xyXG4gICAgfVxyXG4gICAgY29sbGVjdGlvbihwYXRoU3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVmZXJlbmNlKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uKHRoaXMuX2RlbGVnYXRlLCBwYXRoU3RyaW5nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2NvbGxlY3Rpb24oKScsICdEb2N1bWVudFJlZmVyZW5jZS5jb2xsZWN0aW9uKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpc0VxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgb3RoZXIgPSBnZXRNb2R1bGFySW5zdGFuY2Uob3RoZXIpO1xyXG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRG9jdW1lbnRSZWZlcmVuY2UkMSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVmRXF1YWwodGhpcy5fZGVsZWdhdGUsIG90aGVyKTtcclxuICAgIH1cclxuICAgIHNldCh2YWx1ZSwgb3B0aW9ucykge1xyXG4gICAgICAgIG9wdGlvbnMgPSB2YWxpZGF0ZVNldE9wdGlvbnMoJ0RvY3VtZW50UmVmZXJlbmNlLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0RG9jKHRoaXMuX2RlbGVnYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0RG9jKHRoaXMuX2RlbGVnYXRlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnc2V0RG9jKCknLCAnRG9jdW1lbnRSZWZlcmVuY2Uuc2V0KCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGUoZmllbGRPclVwZGF0ZURhdGEsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVEb2ModGhpcy5fZGVsZWdhdGUsIGZpZWxkT3JVcGRhdGVEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVEb2ModGhpcy5fZGVsZWdhdGUsIGZpZWxkT3JVcGRhdGVEYXRhLCB2YWx1ZSwgLi4ubW9yZUZpZWxkc0FuZFZhbHVlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAndXBkYXRlRG9jKCknLCAnRG9jdW1lbnRSZWZlcmVuY2UudXBkYXRlKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZURvYyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBvblNuYXBzaG90KC4uLmFyZ3MpIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gZXh0cmFjdFNuYXBzaG90T3B0aW9ucyhhcmdzKTtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHdyYXBPYnNlcnZlcihhcmdzLCByZXN1bHQgPT4gbmV3IERvY3VtZW50U25hcHNob3QodGhpcy5maXJlc3RvcmUsIG5ldyBEb2N1bWVudFNuYXBzaG90JDEodGhpcy5maXJlc3RvcmUuX2RlbGVnYXRlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgcmVzdWx0Ll9rZXksIHJlc3VsdC5fZG9jdW1lbnQsIHJlc3VsdC5tZXRhZGF0YSwgdGhpcy5fZGVsZWdhdGUuY29udmVydGVyKSkpO1xyXG4gICAgICAgIHJldHVybiBvblNuYXBzaG90KHRoaXMuX2RlbGVnYXRlLCBvcHRpb25zLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICBnZXQob3B0aW9ucykge1xyXG4gICAgICAgIGxldCBzbmFwO1xyXG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNvdXJjZSkgPT09ICdjYWNoZScpIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvY0Zyb21DYWNoZSh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc291cmNlKSA9PT0gJ3NlcnZlcicpIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvY0Zyb21TZXJ2ZXIodGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvYyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzbmFwLnRoZW4ocmVzdWx0ID0+IG5ldyBEb2N1bWVudFNuYXBzaG90KHRoaXMuZmlyZXN0b3JlLCBuZXcgRG9jdW1lbnRTbmFwc2hvdCQxKHRoaXMuZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHJlc3VsdC5fa2V5LCByZXN1bHQuX2RvY3VtZW50LCByZXN1bHQubWV0YWRhdGEsIHRoaXMuX2RlbGVnYXRlLmNvbnZlcnRlcikpKTtcclxuICAgIH1cclxuICAgIHdpdGhDb252ZXJ0ZXIoY29udmVydGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgY29udmVydGVyXHJcbiAgICAgICAgICAgID8gdGhpcy5fZGVsZWdhdGUud2l0aENvbnZlcnRlcihGaXJlc3RvcmVEYXRhQ29udmVydGVyLmdldEluc3RhbmNlKHRoaXMuZmlyZXN0b3JlLCBjb252ZXJ0ZXIpKVxyXG4gICAgICAgICAgICA6IHRoaXMuX2RlbGVnYXRlLndpdGhDb252ZXJ0ZXIobnVsbCkpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXBsYWNlcyB0aGUgZnVuY3Rpb24gbmFtZSBpbiBhbiBlcnJvciB0aHJvd24gYnkgdGhlIGZpcmVzdG9yZS1leHAgQVBJXHJcbiAqIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIHVzZWQgaW4gdGhlIGNsYXNzaWMgQVBJLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCBvcmlnaW5hbCwgdXBkYXRlZCkge1xyXG4gICAgZS5tZXNzYWdlID0gZS5tZXNzYWdlLnJlcGxhY2Uob3JpZ2luYWwsIHVwZGF0ZWQpO1xyXG4gICAgcmV0dXJuIGU7XHJcbn1cclxuLyoqXHJcbiAqIEl0ZXJhdGVzIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBmcm9tIGFuIGBvblNuYXBzaG90YCBjYWxsIGFuZCByZXR1cm5zIHRoZVxyXG4gKiBmaXJzdCBhcmd1bWVudCB0aGF0IG1heSBiZSBhbiBgU25hcHNob3RMaXN0ZW5PcHRpb25zYCBvYmplY3QuIFJldHVybnMgYW5cclxuICogZW1wdHkgb2JqZWN0IGlmIG5vbmUgaXMgZm91bmQuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0U25hcHNob3RPcHRpb25zKGFyZ3MpIHtcclxuICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgIWlzUGFydGlhbE9ic2VydmVyKGFyZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBmaXJlc3RvcmUtZXhwIFNESy4gVGhlXHJcbiAqIG9ic2VydmVyIGNvbnZlcnRzIGFsbCBvYnNlcnZlZCB2YWx1ZXMgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBjbGFzc2ljXHJcbiAqIFNESy5cclxuICpcclxuICogQHBhcmFtIGFyZ3MgLSBUaGUgbGlzdCBvZiBhcmd1bWVudHMgZnJvbSBhbiBgb25TbmFwc2hvdGAgY2FsbC5cclxuICogQHBhcmFtIHdyYXBwZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyB0aGUgZmlyZXN0b3JlLWV4cCB0eXBlIGludG8gdGhlXHJcbiAqIHR5cGUgdXNlZCBieSB0aGlzIHNoaW0uXHJcbiAqL1xyXG5mdW5jdGlvbiB3cmFwT2JzZXJ2ZXIoYXJncywgd3JhcHBlcikge1xyXG4gICAgdmFyIF9hLCBfYjtcclxuICAgIGxldCB1c2VyT2JzZXJ2ZXI7XHJcbiAgICBpZiAoaXNQYXJ0aWFsT2JzZXJ2ZXIoYXJnc1swXSkpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSBhcmdzWzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNQYXJ0aWFsT2JzZXJ2ZXIoYXJnc1sxXSkpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSBhcmdzWzFdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5leHQ6IGFyZ3NbMF0sXHJcbiAgICAgICAgICAgIGVycm9yOiBhcmdzWzFdLFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogYXJnc1syXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5leHQ6IGFyZ3NbMV0sXHJcbiAgICAgICAgICAgIGVycm9yOiBhcmdzWzJdLFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogYXJnc1szXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IHZhbCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyT2JzZXJ2ZXIubmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdXNlck9ic2VydmVyLm5leHQod3JhcHBlcih2YWwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChfYSA9IHVzZXJPYnNlcnZlci5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJpbmQodXNlck9ic2VydmVyKSxcclxuICAgICAgICBjb21wbGV0ZTogKF9iID0gdXNlck9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYmluZCh1c2VyT2JzZXJ2ZXIpXHJcbiAgICB9O1xyXG59XHJcbmNsYXNzIERvY3VtZW50U25hcHNob3Qge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX2RlbGVnYXRlKSB7XHJcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gX2ZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCByZWYoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX2RlbGVnYXRlLnJlZik7XHJcbiAgICB9XHJcbiAgICBnZXQgaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlkO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBleGlzdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmV4aXN0cygpO1xyXG4gICAgfVxyXG4gICAgZGF0YShvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmRhdGEob3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBnZXQoZmllbGRQYXRoLCBvcHRpb25zXHJcbiAgICAvLyBXZSBhcmUgdXNpbmcgYGFueWAgaGVyZSB0byBhdm9pZCBhbiBleHBsaWNpdCBjYXN0IGJ5IG91ciB1c2Vycy5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGZpZWxkUGF0aCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpc0VxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90RXF1YWwodGhpcy5fZGVsZWdhdGUsIG90aGVyLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUXVlcnlEb2N1bWVudFNuYXBzaG90IGV4dGVuZHMgRG9jdW1lbnRTbmFwc2hvdCB7XHJcbiAgICBkYXRhKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGVsZWdhdGUuZGF0YShvcHRpb25zKTtcclxuICAgICAgICBfZGVidWdBc3NlcnQoZGF0YSAhPT0gdW5kZWZpbmVkLCAnRG9jdW1lbnQgaW4gYSBRdWVyeURvY3VtZW50U25hcHNob3Qgc2hvdWxkIGV4aXN0Jyk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUXVlcnkge1xyXG4gICAgY29uc3RydWN0b3IoZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLl91c2VyRGF0YVdyaXRlciA9IG5ldyBVc2VyRGF0YVdyaXRlcihmaXJlc3RvcmUpO1xyXG4gICAgfVxyXG4gICAgd2hlcmUoZmllbGRQYXRoLCBvcFN0ciwgdmFsdWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBUaGUgXCJhcyBzdHJpbmdcIiBjYXN0IGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2suIGB3aGVyZWAgYWNjZXB0cyB0aGVcclxuICAgICAgICAgICAgLy8gRmllbGRQYXRoIENvbXBhdCB0eXBlIGFzIGlucHV0LCBidXQgaXMgbm90IHR5cGVkIGFzIHN1Y2ggaW4gb3JkZXIgdG9cclxuICAgICAgICAgICAgLy8gbm90IGV4cG9zZSB0aGlzIHZpYSBvdXIgcHVibGljIHR5cGluZ3MgZmlsZS5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIHdoZXJlKGZpZWxkUGF0aCwgb3BTdHIsIHZhbHVlKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsIC8ob3JkZXJCeXx3aGVyZSlcXChcXCkvLCAnUXVlcnkuJDEoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9yZGVyQnkoZmllbGRQYXRoLCBkaXJlY3Rpb25TdHIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBUaGUgXCJhcyBzdHJpbmdcIiBjYXN0IGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2suIGBvcmRlckJ5YCBhY2NlcHRzIHRoZVxyXG4gICAgICAgICAgICAvLyBGaWVsZFBhdGggQ29tcGF0IHR5cGUgYXMgaW5wdXQsIGJ1dCBpcyBub3QgdHlwZWQgYXMgc3VjaCBpbiBvcmRlciB0b1xyXG4gICAgICAgICAgICAvLyBub3QgZXhwb3NlIHRoaXMgdmlhIG91ciBwdWJsaWMgdHlwaW5ncyBmaWxlLlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuZmlyZXN0b3JlLCBxdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgb3JkZXJCeShmaWVsZFBhdGgsIGRpcmVjdGlvblN0cikpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAvKG9yZGVyQnl8d2hlcmUpXFwoXFwpLywgJ1F1ZXJ5LiQxKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBsaW1pdChuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIGxpbWl0KG4pKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2xpbWl0KCknLCAnUXVlcnkubGltaXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxpbWl0VG9MYXN0KG4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuZmlyZXN0b3JlLCBxdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgbGltaXRUb0xhc3QobikpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnbGltaXRUb0xhc3QoKScsICdRdWVyeS5saW1pdFRvTGFzdCgpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnRBdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIHN0YXJ0QXQoLi4uYXJncykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnc3RhcnRBdCgpJywgJ1F1ZXJ5LnN0YXJ0QXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXJ0QWZ0ZXIoLi4uYXJncykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIHF1ZXJ5KHRoaXMuX2RlbGVnYXRlLCBzdGFydEFmdGVyKC4uLmFyZ3MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ3N0YXJ0QWZ0ZXIoKScsICdRdWVyeS5zdGFydEFmdGVyKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbmRCZWZvcmUoLi4uYXJncykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIHF1ZXJ5KHRoaXMuX2RlbGVnYXRlLCBlbmRCZWZvcmUoLi4uYXJncykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnZW5kQmVmb3JlKCknLCAnUXVlcnkuZW5kQmVmb3JlKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbmRBdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIGVuZEF0KC4uLmFyZ3MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2VuZEF0KCknLCAnUXVlcnkuZW5kQXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gcXVlcnlFcXVhbCh0aGlzLl9kZWxlZ2F0ZSwgb3RoZXIuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGdldChvcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHF1ZXJ5O1xyXG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNvdXJjZSkgPT09ICdjYWNoZScpIHtcclxuICAgICAgICAgICAgcXVlcnkgPSBnZXREb2NzRnJvbUNhY2hlKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zb3VyY2UpID09PSAnc2VydmVyJykge1xyXG4gICAgICAgICAgICBxdWVyeSA9IGdldERvY3NGcm9tU2VydmVyKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ID0gZ2V0RG9jcyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBxdWVyeS50aGVuKHJlc3VsdCA9PiBuZXcgUXVlcnlTbmFwc2hvdCh0aGlzLmZpcmVzdG9yZSwgbmV3IFF1ZXJ5U25hcHNob3QkMSh0aGlzLmZpcmVzdG9yZS5fZGVsZWdhdGUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCB0aGlzLl9kZWxlZ2F0ZSwgcmVzdWx0Ll9zbmFwc2hvdCkpKTtcclxuICAgIH1cclxuICAgIG9uU25hcHNob3QoLi4uYXJncykge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHRyYWN0U25hcHNob3RPcHRpb25zKGFyZ3MpO1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gd3JhcE9ic2VydmVyKGFyZ3MsIHNuYXAgPT4gbmV3IFF1ZXJ5U25hcHNob3QodGhpcy5maXJlc3RvcmUsIG5ldyBRdWVyeVNuYXBzaG90JDEodGhpcy5maXJlc3RvcmUuX2RlbGVnYXRlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgdGhpcy5fZGVsZWdhdGUsIHNuYXAuX3NuYXBzaG90KSkpO1xyXG4gICAgICAgIHJldHVybiBvblNuYXBzaG90KHRoaXMuX2RlbGVnYXRlLCBvcHRpb25zLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICB3aXRoQ29udmVydGVyKGNvbnZlcnRlcikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIGNvbnZlcnRlclxyXG4gICAgICAgICAgICA/IHRoaXMuX2RlbGVnYXRlLndpdGhDb252ZXJ0ZXIoRmlyZXN0b3JlRGF0YUNvbnZlcnRlci5nZXRJbnN0YW5jZSh0aGlzLmZpcmVzdG9yZSwgY29udmVydGVyKSlcclxuICAgICAgICAgICAgOiB0aGlzLl9kZWxlZ2F0ZS53aXRoQ29udmVydGVyKG51bGwpKTtcclxuICAgIH1cclxufVxyXG5jbGFzcyBEb2N1bWVudENoYW5nZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSBfZmlyZXN0b3JlO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnR5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgZG9jKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlEb2N1bWVudFNuYXBzaG90KHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUuZG9jKTtcclxuICAgIH1cclxuICAgIGdldCBvbGRJbmRleCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub2xkSW5kZXg7XHJcbiAgICB9XHJcbiAgICBnZXQgbmV3SW5kZXgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLm5ld0luZGV4O1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFF1ZXJ5U25hcHNob3Qge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX2RlbGVnYXRlKSB7XHJcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gX2ZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCBxdWVyeSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUucXVlcnkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBzaXplKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5zaXplO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtcHR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5lbXB0eTtcclxuICAgIH1cclxuICAgIGdldCBkb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5kb2NzLm1hcChkb2MgPT4gbmV3IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCh0aGlzLl9maXJlc3RvcmUsIGRvYykpO1xyXG4gICAgfVxyXG4gICAgZG9jQ2hhbmdlcyhvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlXHJcbiAgICAgICAgICAgIC5kb2NDaGFuZ2VzKG9wdGlvbnMpXHJcbiAgICAgICAgICAgIC5tYXAoZG9jQ2hhbmdlID0+IG5ldyBEb2N1bWVudENoYW5nZSh0aGlzLl9maXJlc3RvcmUsIGRvY0NoYW5nZSkpO1xyXG4gICAgfVxyXG4gICAgZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmZvckVhY2goc25hcHNob3QgPT4ge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIG5ldyBRdWVyeURvY3VtZW50U25hcHNob3QodGhpcy5fZmlyZXN0b3JlLCBzbmFwc2hvdCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIHJldHVybiBzbmFwc2hvdEVxdWFsKHRoaXMuX2RlbGVnYXRlLCBvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIENvbGxlY3Rpb25SZWZlcmVuY2UgZXh0ZW5kcyBRdWVyeSB7XHJcbiAgICBjb25zdHJ1Y3RvcihmaXJlc3RvcmUsIF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHN1cGVyKGZpcmVzdG9yZSwgX2RlbGVnYXRlKTtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCBpZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucGF0aDtcclxuICAgIH1cclxuICAgIGdldCBwYXJlbnQoKSB7XHJcbiAgICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5fZGVsZWdhdGUucGFyZW50O1xyXG4gICAgICAgIHJldHVybiBkb2NSZWYgPyBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvY1JlZikgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgZG9jKGRvY3VtZW50UGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudFBhdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2FsbCBgZG9jYCB3aXRob3V0IGBkb2N1bWVudFBhdGhgIGlmIGBkb2N1bWVudFBhdGhgIGlzIGB1bmRlZmluZWRgXHJcbiAgICAgICAgICAgICAgICAvLyBhcyBgZG9jYCB2YWxpZGF0ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJldmVudCB1c2VycyBmcm9tXHJcbiAgICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzc2luZyBgdW5kZWZpbmVkYC5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvYyh0aGlzLl9kZWxlZ2F0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgZG9jKHRoaXMuX2RlbGVnYXRlLCBkb2N1bWVudFBhdGgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsICdkb2MoKScsICdDb2xsZWN0aW9uUmVmZXJlbmNlLmRvYygpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gYWRkRG9jKHRoaXMuX2RlbGVnYXRlLCBkYXRhKS50aGVuKGRvY1JlZiA9PiBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvY1JlZikpO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIHJldHVybiByZWZFcXVhbCh0aGlzLl9kZWxlZ2F0ZSwgb3RoZXIuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHdpdGhDb252ZXJ0ZXIoY29udmVydGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVmZXJlbmNlKHRoaXMuZmlyZXN0b3JlLCBjb252ZXJ0ZXJcclxuICAgICAgICAgICAgPyB0aGlzLl9kZWxlZ2F0ZS53aXRoQ29udmVydGVyKEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UodGhpcy5maXJlc3RvcmUsIGNvbnZlcnRlcikpXHJcbiAgICAgICAgICAgIDogdGhpcy5fZGVsZWdhdGUud2l0aENvbnZlcnRlcihudWxsKSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZikge1xyXG4gICAgcmV0dXJuIF9jYXN0KGRvY3VtZW50UmVmLCBEb2N1bWVudFJlZmVyZW5jZSQxKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBUaGUgb2JqZWN0cyB0aGF0IGFyZSBhIHBhcnQgb2YgdGhpcyBBUEkgYXJlIGV4cG9zZWQgdG8gdGhpcmQtcGFydGllcyBhc1xyXG4vLyBjb21waWxlZCBqYXZhc2NyaXB0IHNvIHdlIHdhbnQgdG8gZmxhZyBvdXIgcHJpdmF0ZSBtZW1iZXJzIHdpdGggYSBsZWFkaW5nXHJcbi8vIHVuZGVyc2NvcmUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuXHJcbi8qKlxyXG4gKiBBIGBGaWVsZFBhdGhgIHJlZmVycyB0byBhIGZpZWxkIGluIGEgZG9jdW1lbnQuIFRoZSBwYXRoIG1heSBjb25zaXN0IG9mIGFcclxuICogc2luZ2xlIGZpZWxkIG5hbWUgKHJlZmVycmluZyB0byBhIHRvcC1sZXZlbCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQpLCBvciBhIGxpc3RcclxuICogb2YgZmllbGQgbmFtZXMgKHJlZmVycmluZyB0byBhIG5lc3RlZCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQpLlxyXG4gKi9cclxuY2xhc3MgRmllbGRQYXRoIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZpZWxkUGF0aCBmcm9tIHRoZSBwcm92aWRlZCBmaWVsZCBuYW1lcy4gSWYgbW9yZSB0aGFuIG9uZSBmaWVsZFxyXG4gICAgICogbmFtZSBpcyBwcm92aWRlZCwgdGhlIHBhdGggd2lsbCBwb2ludCB0byBhIG5lc3RlZCBmaWVsZCBpbiBhIGRvY3VtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWVzIC0gQSBsaXN0IG9mIGZpZWxkIG5hbWVzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvciguLi5maWVsZE5hbWVzKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBuZXcgRmllbGRQYXRoJDEoLi4uZmllbGROYW1lcyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZG9jdW1lbnRJZCgpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBOb3RlOiBUaGUgYmFja2VuZCBkb2Vzbid0IHRlY2huaWNhbGx5IHN1cHBvcnQgcXVlcnlpbmcgYnlcclxuICAgICAgICAgKiBkb2N1bWVudCBJRC4gSW5zdGVhZCBpdCBxdWVyaWVzIGJ5IHRoZSBlbnRpcmUgZG9jdW1lbnQgbmFtZSAoZnVsbCBwYXRoXHJcbiAgICAgICAgICogaW5jbHVkZWQpLCBidXQgaW4gdGhlIGNhc2VzIHdlIGN1cnJlbnRseSBzdXBwb3J0IGRvY3VtZW50SWQoKSwgdGhlIG5ldFxyXG4gICAgICAgICAqIGVmZmVjdCBpcyB0aGUgc2FtZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gbmV3IEZpZWxkUGF0aChfRmllbGRQYXRoLmtleUZpZWxkKCkuY2Fub25pY2FsU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIG90aGVyID0gZ2V0TW9kdWxhckluc3RhbmNlKG90aGVyKTtcclxuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpZWxkUGF0aCQxKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5faW50ZXJuYWxQYXRoLmlzRXF1YWwob3RoZXIuX2ludGVybmFsUGF0aCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRmllbGRWYWx1ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzZXJ2ZXJUaW1lc3RhbXAoKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBzZXJ2ZXJUaW1lc3RhbXAoKTtcclxuICAgICAgICBkZWxlZ2F0ZS5fbWV0aG9kTmFtZSA9ICdGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBkZWxldGUoKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBkZWxldGVGaWVsZCgpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuZGVsZXRlJztcclxuICAgICAgICByZXR1cm4gbmV3IEZpZWxkVmFsdWUoZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFycmF5VW5pb24oLi4uZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFycmF5VW5pb24oLi4uZWxlbWVudHMpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuYXJyYXlVbmlvbic7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhcnJheVJlbW92ZSguLi5lbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlID0gYXJyYXlSZW1vdmUoLi4uZWxlbWVudHMpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuYXJyYXlSZW1vdmUnO1xyXG4gICAgICAgIHJldHVybiBuZXcgRmllbGRWYWx1ZShkZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaW5jcmVtZW50KG4pIHtcclxuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGluY3JlbWVudChuKTtcclxuICAgICAgICBkZWxlZ2F0ZS5fbWV0aG9kTmFtZSA9ICdGaWVsZFZhbHVlLmluY3JlbWVudCc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNFcXVhbChvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGZpcmVzdG9yZU5hbWVzcGFjZSA9IHtcclxuICAgIEZpcmVzdG9yZSxcclxuICAgIEdlb1BvaW50LFxyXG4gICAgVGltZXN0YW1wLFxyXG4gICAgQmxvYixcclxuICAgIFRyYW5zYWN0aW9uLFxyXG4gICAgV3JpdGVCYXRjaCxcclxuICAgIERvY3VtZW50UmVmZXJlbmNlLFxyXG4gICAgRG9jdW1lbnRTbmFwc2hvdCxcclxuICAgIFF1ZXJ5LFxyXG4gICAgUXVlcnlEb2N1bWVudFNuYXBzaG90LFxyXG4gICAgUXVlcnlTbmFwc2hvdCxcclxuICAgIENvbGxlY3Rpb25SZWZlcmVuY2UsXHJcbiAgICBGaWVsZFBhdGgsXHJcbiAgICBGaWVsZFZhbHVlLFxyXG4gICAgc2V0TG9nTGV2ZWwsXHJcbiAgICBDQUNIRV9TSVpFX1VOTElNSVRFRFxyXG59O1xyXG4vKipcclxuICogQ29uZmlndXJlcyBGaXJlc3RvcmUgYXMgcGFydCBvZiB0aGUgRmlyZWJhc2UgU0RLIGJ5IGNhbGxpbmcgcmVnaXN0ZXJDb21wb25lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaXJlYmFzZSAtIFRoZSBGaXJlYmFzZU5hbWVzcGFjZSB0byByZWdpc3RlciBGaXJlc3RvcmUgd2l0aFxyXG4gKiBAcGFyYW0gZmlyZXN0b3JlRmFjdG9yeSAtIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgRmlyZXN0b3JlXHJcbiAqICAgIGluc3RhbmNlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29uZmlndXJlRm9yRmlyZWJhc2UoZmlyZWJhc2UsIGZpcmVzdG9yZUZhY3RvcnkpIHtcclxuICAgIGZpcmViYXNlLklOVEVSTkFMLnJlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ2ZpcmVzdG9yZS1jb21wYXQnLCBjb250YWluZXIgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwLWNvbXBhdCcpLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGZpcmVzdG9yZUV4cCA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignZmlyZXN0b3JlJykuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIGZpcmVzdG9yZUZhY3RvcnkoYXBwLCBmaXJlc3RvcmVFeHApO1xyXG4gICAgfSwgJ1BVQkxJQycpLnNldFNlcnZpY2VQcm9wcyhPYmplY3QuYXNzaWduKHt9LCBmaXJlc3RvcmVOYW1lc3BhY2UpKSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyB0aGUgbWFpbiBGaXJlc3RvcmUgYnVpbGQgd2l0aCB0aGUgY29tcG9uZW50cyBmcmFtZXdvcmsuXHJcbiAqIFBlcnNpc3RlbmNlIGNhbiBiZSBlbmFibGVkIHZpYSBgZmlyZWJhc2UuZmlyZXN0b3JlKCkuZW5hYmxlUGVyc2lzdGVuY2UoKWAuXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlckZpcmVzdG9yZShpbnN0YW5jZSkge1xyXG4gICAgY29uZmlndXJlRm9yRmlyZWJhc2UoaW5zdGFuY2UsIChhcHAsIGZpcmVzdG9yZUV4cCkgPT4gbmV3IEZpcmVzdG9yZShhcHAsIGZpcmVzdG9yZUV4cCwgbmV3IEluZGV4ZWREYlBlcnNpc3RlbmNlUHJvdmlkZXIoKSkpO1xyXG4gICAgaW5zdGFuY2UucmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24pO1xyXG59XHJcbnJlZ2lzdGVyRmlyZXN0b3JlKGZpcmViYXNlKTtcblxuZXhwb3J0IHsgcmVnaXN0ZXJGaXJlc3RvcmUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +var R,x;R=r.a,x=(e,t)=>new f(e,t,new d),R.INTERNAL.registerComponent(new o.a("firestore-compat",e=>{const t=e.getProvider("app-compat").getImmediate(),n=e.getProvider("firestore").getImmediate();return x(t,n)},"PUBLIC").setServiceProps(Object.assign({},O))),R.registerVersion("@firebase/firestore-compat","0.3.12")}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zaGFyZGVkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvZGlzdC9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS90c2xpYkAyLjYuMy9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAwLjIzLjJfQGZpcmViYXNlK2FwcEAwLjkuMTMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL2Rpc3QvZXNtMjAxNy9pbmRleC1lM2Q1ZDNmNC5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy9Vc2Vycy9qYWNvYi9nb29nbGUvZXh0ZW5zaW9ucy9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMC4yMy4yX0BmaXJlYmFzZSthcHBAMC45LjEzL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9kaXN0L2VzbTIwMTcvaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZStmaXJlc3RvcmVAMy4xMy4wX0BmaXJlYmFzZSthcHBAMC45LjEzL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvZmlyZXN0b3JlL2Rpc3QvaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy9Vc2Vycy9qYWNvYi9nb29nbGUvZXh0ZW5zaW9ucy9ub2RlX21vZHVsZXMvLnBucG0vaWRiQDcuMS4xL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvd3JhcC1pZGItdmFsdWUuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL2lkYkA3LjEuMS9ub2RlX21vZHVsZXMvaWRiL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4xMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9kaXN0L2VzbS9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2Urd2ViY2hhbm5lbC13cmFwcGVyQDAuMTAuMS9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3dlYmNoYW5uZWwtd3JhcHBlci9kaXN0L2VzbS9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrbG9nZ2VyQDAuNC4wL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvbG9nZ2VyL2Rpc3QvZXNtL2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZStjb21wb25lbnRAMC42LjQvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9jb21wb25lbnQvZGlzdC9lc20vaW5kZXguZXNtMjAxNy5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy9Vc2Vycy9qYWNvYi9nb29nbGUvZXh0ZW5zaW9ucy9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcC1jb21wYXRAMC4yLjEzL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwLWNvbXBhdC9kaXN0L2VzbS9pbmRleC5lc20yMDE3LmpzIiwid2VicGFjazovL3NoYXJkZWQvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS91dWlkQDMuNC4wL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy9Vc2Vycy9qYWNvYi9nb29nbGUvZXh0ZW5zaW9ucy9ub2RlX21vZHVsZXMvLnBucG0vdXVpZEAzLjQuMC9ub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL3Byb2Nlc3NAMC4xMS4xMC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovL3NoYXJkZWQvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMy40LjAvbm9kZV9tb2R1bGVzL3V1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMy40LjAvbm9kZV9tb2R1bGVzL3V1aWQvdjEuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMy40LjAvbm9kZV9tb2R1bGVzL3V1aWQvdjQuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL2ZpcmViYXNlQDkuMjMuMC9ub2RlX21vZHVsZXMvZmlyZWJhc2UvY29tcGF0L2FwcC9kaXN0L2VzbS9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL2ZpcmViYXNlQDkuMjMuMC9ub2RlX21vZHVsZXMvZmlyZWJhc2UvY29tcGF0L2F1dGgvZGlzdC9lc20vaW5kZXguZXNtLmpzIiwid2VicGFjazovL3NoYXJkZWQvL1VzZXJzL2phY29iL2dvb2dsZS9leHRlbnNpb25zL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aC1jb21wYXRAMC40LjJfQGZpcmViYXNlK2FwcC1jb21wYXRAMC4yLjEzX0BmaXJlYmFzZSthcHAtdHlwZXNAMC45LjBfQGZpcmViYXNlK2FwcEAwLjkuMTMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoLWNvbXBhdC9kaXN0L2luZGV4LmVzbTIwMTcuanMiLCJ3ZWJwYWNrOi8vc2hhcmRlZC8vVXNlcnMvamFjb2IvZ29vZ2xlL2V4dGVuc2lvbnMvbm9kZV9tb2R1bGVzLy5wbnBtL2ZpcmViYXNlQDkuMjMuMC9ub2RlX21vZHVsZXMvZmlyZWJhc2UvZmlyZXN0b3JlL2Rpc3QvZXNtL2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9zaGFyZGVkLy9Vc2Vycy9qYWNvYi9nb29nbGUvZXh0ZW5zaW9ucy9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2ZpcmVzdG9yZS1jb21wYXRAMC4zLjEyX0BmaXJlYmFzZSthcHAtY29tcGF0QDAuMi4xM19AZmlyZWJhc2UrYXBwLXR5cGVzQDAuOS4wX0BmaXJlYmFzZSthcHBAMC45LjEzL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvZmlyZXN0b3JlLWNvbXBhdC9kaXN0L2luZGV4LmVzbTIwMTcuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJzdHJpbmdUb0J5dGVBcnJheSQxIiwic3RyIiwib3V0IiwibGVuZ3RoIiwiY2hhckNvZGVBdCIsImJhc2U2NCIsImJ5dGVUb0NoYXJNYXBfIiwiY2hhclRvQnl0ZU1hcF8iLCJieXRlVG9DaGFyTWFwV2ViU2FmZV8iLCJjaGFyVG9CeXRlTWFwV2ViU2FmZV8iLCJFTkNPREVEX1ZBTFNfQkFTRSIsInRoaXMiLCJIQVNfTkFUSVZFX1NVUFBPUlQiLCJhdG9iIiwiaW5wdXQiLCJ3ZWJTYWZlIiwiQXJyYXkiLCJpc0FycmF5IiwiRXJyb3IiLCJpbml0XyIsImJ5dGVUb0NoYXJNYXAiLCJvdXRwdXQiLCJieXRlMSIsImhhdmVCeXRlMiIsImJ5dGUyIiwiaGF2ZUJ5dGUzIiwiYnl0ZTMiLCJvdXRCeXRlMSIsIm91dEJ5dGUyIiwib3V0Qnl0ZTMiLCJvdXRCeXRlNCIsInB1c2giLCJqb2luIiwiYnRvYSIsImVuY29kZUJ5dGVBcnJheSIsImJ5dGVzIiwicG9zIiwiYzEiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjMiIsInUiLCJjMyIsImJ5dGVBcnJheVRvU3RyaW5nIiwiZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkiLCJjaGFyVG9CeXRlTWFwIiwiY2hhckF0IiwiYnl0ZTQiLCJEZWNvZGVCYXNlNjRTdHJpbmdFcnJvciIsIkVOQ09ERURfVkFMUyIsIkVOQ09ERURfVkFMU19XRUJTQUZFIiwic3VwZXIiLCJhcmd1bWVudHMiLCJiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyIsInV0ZjhCeXRlcyIsImJhc2U2NEVuY29kZSIsInJlcGxhY2UiLCJiYXNlNjREZWNvZGUiLCJkZWNvZGVTdHJpbmciLCJlIiwiY29uc29sZSIsImVycm9yIiwiZGVlcEV4dGVuZCIsInRhcmdldCIsInNvdXJjZSIsImNvbnN0cnVjdG9yIiwiRGF0ZSIsImdldFRpbWUiLCJ1bmRlZmluZWQiLCJwcm9wIiwiZ2V0RGVmYXVsdHNGcm9tR2xvYmFsIiwic2VsZiIsIndpbmRvdyIsImdsb2JhbCIsImdldEdsb2JhbCIsIl9fRklSRUJBU0VfREVGQVVMVFNfXyIsImdldERlZmF1bHRzIiwicHJvY2VzcyIsImVudiIsImRlZmF1bHRzSnNvblN0cmluZyIsIkpTT04iLCJwYXJzZSIsImdldERlZmF1bHRzRnJvbUVudlZhcmlhYmxlIiwiZG9jdW1lbnQiLCJtYXRjaCIsImNvb2tpZSIsImRlY29kZWQiLCJnZXREZWZhdWx0c0Zyb21Db29raWUiLCJpbmZvIiwiZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCIsInByb2R1Y3ROYW1lIiwiX2EiLCJfYiIsImVtdWxhdG9ySG9zdHMiLCJnZXREZWZhdWx0RW11bGF0b3JIb3N0bmFtZUFuZFBvcnQiLCJob3N0Iiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInBvcnQiLCJwYXJzZUludCIsInN1YnN0cmluZyIsImdldERlZmF1bHRBcHBDb25maWciLCJjb25maWciLCJnZXRFeHBlcmltZW50YWxTZXR0aW5nIiwiRGVmZXJyZWQiLCJyZWplY3QiLCJyZXNvbHZlIiwicHJvbWlzZSIsIlByb21pc2UiLCJjYWxsYmFjayIsImNhdGNoIiwiY3JlYXRlTW9ja1VzZXJUb2tlbiIsInRva2VuIiwicHJvamVjdElkIiwidWlkIiwicHJvamVjdCIsImlhdCIsInN1YiIsInVzZXJfaWQiLCJwYXlsb2FkIiwiYXNzaWduIiwiaXNzIiwiYXVkIiwiZXhwIiwiYXV0aF90aW1lIiwiZmlyZWJhc2UiLCJzaWduX2luX3Byb3ZpZGVyIiwiaWRlbnRpdGllcyIsInN0cmluZ2lmeSIsImFsZyIsInR5cGUiLCJnZXRVQSIsIm5hdmlnYXRvciIsImlzTW9iaWxlQ29yZG92YSIsInRlc3QiLCJpc05vZGUiLCJmb3JjZUVudmlyb25tZW50IiwidG9TdHJpbmciLCJpc0Jyb3dzZXIiLCJpc0Jyb3dzZXJFeHRlbnNpb24iLCJydW50aW1lIiwiY2hyb21lIiwiYnJvd3NlciIsImlkIiwiaXNSZWFjdE5hdGl2ZSIsImlzSUUiLCJ1YSIsImluZGV4T2YiLCJpc1NhZmFyaSIsInVzZXJBZ2VudCIsImluY2x1ZGVzIiwiaXNJbmRleGVkREJBdmFpbGFibGUiLCJpbmRleGVkREIiLCJ2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlIiwicHJlRXhpc3QiLCJEQl9DSEVDS19OQU1FIiwicmVxdWVzdCIsIm9wZW4iLCJvbnN1Y2Nlc3MiLCJyZXN1bHQiLCJjbG9zZSIsImRlbGV0ZURhdGFiYXNlIiwib251cGdyYWRlbmVlZGVkIiwib25lcnJvciIsIm1lc3NhZ2UiLCJGaXJlYmFzZUVycm9yIiwiY29kZSIsImN1c3RvbURhdGEiLCJzZXRQcm90b3R5cGVPZiIsImNhcHR1cmVTdGFja1RyYWNlIiwiRXJyb3JGYWN0b3J5Iiwic2VydmljZSIsInNlcnZpY2VOYW1lIiwiZXJyb3JzIiwiZGF0YSIsImZ1bGxDb2RlIiwidGVtcGxhdGUiLCJQQVRURVJOIiwiXyIsInJlcGxhY2VUZW1wbGF0ZSIsImZ1bGxNZXNzYWdlIiwiY29udGFpbnMiLCJvYmoiLCJpc0VtcHR5IiwiZGVlcEVxdWFsIiwiYSIsImIiLCJhS2V5cyIsImtleXMiLCJiS2V5cyIsImsiLCJhUHJvcCIsImJQcm9wIiwiaXNPYmplY3QiLCJ0aGluZyIsInF1ZXJ5c3RyaW5nIiwicXVlcnlzdHJpbmdQYXJhbXMiLCJwYXJhbXMiLCJlbnRyaWVzIiwiZm9yRWFjaCIsImFycmF5VmFsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicXVlcnlzdHJpbmdEZWNvZGUiLCJzcGxpdCIsImRlY29kZVVSSUNvbXBvbmVudCIsImV4dHJhY3RRdWVyeXN0cmluZyIsInVybCIsInF1ZXJ5U3RhcnQiLCJmcmFnbWVudFN0YXJ0IiwiY3JlYXRlU3Vic2NyaWJlIiwiZXhlY3V0b3IiLCJvbk5vT2JzZXJ2ZXJzIiwicHJveHkiLCJPYnNlcnZlclByb3h5Iiwic3Vic2NyaWJlIiwib2JzZXJ2ZXJzIiwidW5zdWJzY3JpYmVzIiwib2JzZXJ2ZXJDb3VudCIsInRhc2siLCJmaW5hbGl6ZWQiLCJ0aGVuIiwiZm9yRWFjaE9ic2VydmVyIiwib2JzZXJ2ZXIiLCJuZXh0IiwiY29tcGxldGUiLCJuZXh0T3JPYnNlcnZlciIsIm1ldGhvZHMiLCJtZXRob2QiLCJpbXBsZW1lbnRzQW55TWV0aG9kcyIsIm5vb3AiLCJ1bnN1YiIsInVuc3Vic2NyaWJlT25lIiwiZmluYWxFcnJvciIsImZuIiwic2VuZE9uZSIsImVyciIsImdldE1vZHVsYXJJbnN0YW5jZSIsIl9kZWxlZ2F0ZSIsIl9fcmVzdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiU3VwcHJlc3NlZEVycm9yIiwiUHJvdmlkZXJJZCIsIkZBQ0VCT09LIiwiR0lUSFVCIiwiR09PR0xFIiwiUEFTU1dPUkQiLCJQSE9ORSIsIlRXSVRURVIiLCJBY3Rpb25Db2RlT3BlcmF0aW9uIiwiRU1BSUxfU0lHTklOIiwiUEFTU1dPUkRfUkVTRVQiLCJSRUNPVkVSX0VNQUlMIiwiUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04iLCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTCIsIlZFUklGWV9FTUFJTCIsIl9wcm9kRXJyb3JNYXAiLCJkZWJ1Z0Vycm9yTWFwIiwicHJvZEVycm9yTWFwIiwiX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZIiwibG9nQ2xpZW50IiwiX2xvZ0Vycm9yIiwibXNnIiwiYXJncyIsImxvZ0xldmVsIiwiRVJST1IiLCJfZmFpbCIsImF1dGhPckNvZGUiLCJyZXN0IiwiY3JlYXRlRXJyb3JJbnRlcm5hbCIsIl9jcmVhdGVFcnJvciIsIl9lcnJvcldpdGhDdXN0b21NZXNzYWdlIiwiYXV0aCIsImVycm9yTWFwIiwiYXBwTmFtZSIsIl9hc3NlcnRJbnN0YW5jZU9mIiwiaW5zdGFuY2UiLCJmdWxsUGFyYW1zIiwic2xpY2UiLCJfZXJyb3JGYWN0b3J5IiwiX2Fzc2VydCIsImFzc2VydGlvbiIsImRlYnVnRmFpbCIsImZhaWx1cmUiLCJkZWJ1Z0Fzc2VydCIsIl9nZXRDdXJyZW50VXJsIiwibG9jYXRpb24iLCJocmVmIiwiX2lzSHR0cE9ySHR0cHMiLCJfZ2V0Q3VycmVudFNjaGVtZSIsInByb3RvY29sIiwic2hvcnREZWxheSIsImxvbmdEZWxheSIsImlzTW9iaWxlIiwib25MaW5lIiwiTWF0aCIsIm1pbiIsIl9lbXVsYXRvclVybCIsInBhdGgiLCJlbXVsYXRvciIsInN0YXJ0c1dpdGgiLCJGZXRjaFByb3ZpZGVyIiwiZmV0Y2hJbXBsIiwiaGVhZGVyc0ltcGwiLCJyZXNwb25zZUltcGwiLCJmZXRjaCIsIkhlYWRlcnMiLCJSZXNwb25zZSIsIlNFUlZFUl9FUlJPUl9NQVAiLCJERUZBVUxUX0FQSV9USU1FT1VUX01TIiwiX2FkZFRpZElmTmVjZXNzYXJ5IiwidGVuYW50SWQiLCJhc3luYyIsIl9wZXJmb3JtQXBpUmVxdWVzdCIsImN1c3RvbUVycm9yTWFwIiwiX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nIiwiYm9keSIsInF1ZXJ5IiwiYXBpS2V5IiwiaGVhZGVycyIsIl9nZXRBZGRpdGlvbmFsSGVhZGVycyIsImxhbmd1YWdlQ29kZSIsIl9nZXRGaW5hbFRhcmdldCIsImFwaUhvc3QiLCJyZWZlcnJlclBvbGljeSIsImZldGNoRm4iLCJfY2FuSW5pdEVtdWxhdG9yIiwibmV0d29ya1RpbWVvdXQiLCJOZXR3b3JrVGltZW91dCIsInJlc3BvbnNlIiwicmFjZSIsImNsZWFyTmV0d29ya1RpbWVvdXQiLCJqc29uIiwiX21ha2VUYWdnZWRFcnJvciIsIm9rIiwiZXJyb3JNZXNzYWdlIiwic2VydmVyRXJyb3JDb2RlIiwic2VydmVyRXJyb3JNZXNzYWdlIiwiYXV0aEVycm9yIiwidG9Mb3dlckNhc2UiLCJfcGVyZm9ybVNpZ25JblJlcXVlc3QiLCJzZXJ2ZXJSZXNwb25zZSIsIl9zZXJ2ZXJSZXNwb25zZSIsImJhc2UiLCJhcGlTY2hlbWUiLCJ0aW1lciIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJlcnJvclBhcmFtcyIsImVtYWlsIiwicGhvbmVOdW1iZXIiLCJfdG9rZW5SZXNwb25zZSIsInV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyIsInV0Y1RpbWVzdGFtcCIsImRhdGUiLCJOdW1iZXIiLCJpc05hTiIsInRvVVRDU3RyaW5nIiwic2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsIl9wYXJzZVRva2VuIiwiYWxnb3JpdGhtIiwic2lnbmF0dXJlIiwiX2xvZ291dElmSW52YWxpZGF0ZWQiLCJ1c2VyIiwiYnlwYXNzQXV0aFN0YXRlIiwiaXNVc2VySW52YWxpZGF0ZWQiLCJjdXJyZW50VXNlciIsInNpZ25PdXQiLCJQcm9hY3RpdmVSZWZyZXNoIiwiaXNSdW5uaW5nIiwidGltZXJJZCIsImVycm9yQmFja29mZiIsInNjaGVkdWxlIiwid2FzRXJyb3IiLCJpbnRlcnZhbCIsInN0c1Rva2VuTWFuYWdlciIsImV4cGlyYXRpb25UaW1lIiwibm93IiwibWF4IiwiZ2V0SW50ZXJ2YWwiLCJpdGVyYXRpb24iLCJnZXRJZFRva2VuIiwiVXNlck1ldGFkYXRhIiwiY3JlYXRlZEF0IiwibGFzdExvZ2luQXQiLCJfaW5pdGlhbGl6ZVRpbWUiLCJsYXN0U2lnbkluVGltZSIsImNyZWF0aW9uVGltZSIsIm1ldGFkYXRhIiwiX3JlbG9hZFdpdGhvdXRTYXZpbmciLCJpZFRva2VuIiwiZ2V0QWNjb3VudEluZm8iLCJ1c2VycyIsImNvcmVBY2NvdW50IiwiX25vdGlmeVJlbG9hZExpc3RlbmVyIiwibmV3UHJvdmlkZXJEYXRhIiwicHJvdmlkZXJVc2VySW5mbyIsIm1hcCIsInByb3ZpZGVySWQiLCJwcm92aWRlciIsInJhd0lkIiwiZGlzcGxheU5hbWUiLCJwaG90b1VSTCIsInBob3RvVXJsIiwicHJvdmlkZXJEYXRhIiwib3JpZ2luYWwiLCJuZXdEYXRhIiwiZmlsdGVyIiwic29tZSIsIm9sZElzQW5vbnltb3VzIiwiaXNBbm9ueW1vdXMiLCJuZXdJc0Fub255bW91cyIsInBhc3N3b3JkSGFzaCIsInVwZGF0ZXMiLCJsb2NhbElkIiwiZW1haWxWZXJpZmllZCIsIlN0c1Rva2VuTWFuYWdlciIsInJlZnJlc2hUb2tlbiIsImFjY2Vzc1Rva2VuIiwiZXhwaXJlc0luIiwicGFyc2VkVG9rZW4iLCJfdG9rZW5FeHBpcmVzSW4iLCJ1cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uIiwiZm9yY2VSZWZyZXNoIiwiaXNFeHBpcmVkIiwicmVmcmVzaCIsIm9sZFRva2VuIiwidG9rZW5BcGlIb3N0IiwiYWNjZXNzX3Rva2VuIiwiZXhwaXJlc19pbiIsInJlZnJlc2hfdG9rZW4iLCJyZXF1ZXN0U3RzVG9rZW4iLCJleHBpcmVzSW5TZWMiLCJtYW5hZ2VyIiwidG9KU09OIiwiYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQiLCJvcHQiLCJwcm9hY3RpdmVSZWZyZXNoIiwicmVsb2FkVXNlckluZm8iLCJyZWxvYWRMaXN0ZW5lciIsImdldFRva2VuIiwiX3BlcnNpc3RVc2VySWZDdXJyZW50IiwiX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCIsInVzZXJJbnRlcm5hbCIsImNsYWltcyIsInNpZ25JblByb3ZpZGVyIiwiYXV0aFRpbWUiLCJpc3N1ZWRBdFRpbWUiLCJzaWduSW5TZWNvbmRGYWN0b3IiLCJnZXRJZFRva2VuUmVzdWx0IiwicmVsb2FkIiwidXNlckluZm8iLCJfY29weSIsIl9hc3NpZ24iLCJuZXdVc2VyIiwiX2Nsb25lIiwiX3N0YXJ0IiwiX3N0b3AiLCJ0b2tlbnNSZWZyZXNoZWQiLCJ1cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UiLCJkZWxldGVBY2NvdW50IiwiY2xlYXJSZWZyZXNoVG9rZW4iLCJfcmVkaXJlY3RFdmVudElkIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwicGxhaW5PYmplY3RUb2tlbk1hbmFnZXIiLCJmcm9tSlNPTiIsImlkVG9rZW5SZXNwb25zZSIsImluc3RhbmNlQ2FjaGUiLCJNYXAiLCJfZ2V0SW5zdGFuY2UiLCJjbHMiLCJGdW5jdGlvbiIsInNldCIsIkluTWVtb3J5UGVyc2lzdGVuY2UiLCJzdG9yYWdlIiwiX2tleSIsIl9saXN0ZW5lciIsImluTWVtb3J5UGVyc2lzdGVuY2UiLCJfcGVyc2lzdGVuY2VLZXlOYW1lIiwiUGVyc2lzdGVuY2VVc2VyTWFuYWdlciIsInBlcnNpc3RlbmNlIiwidXNlcktleSIsImZ1bGxVc2VyS2V5IiwiZnVsbFBlcnNpc3RlbmNlS2V5IiwiYm91bmRFdmVudEhhbmRsZXIiLCJfb25TdG9yYWdlRXZlbnQiLCJfYWRkTGlzdGVuZXIiLCJfc2V0IiwiYmxvYiIsIl9nZXQiLCJfZnJvbUpTT04iLCJfcmVtb3ZlIiwibmV3UGVyc2lzdGVuY2UiLCJnZXRDdXJyZW50VXNlciIsInJlbW92ZUN1cnJlbnRVc2VyIiwic2V0Q3VycmVudFVzZXIiLCJfcmVtb3ZlTGlzdGVuZXIiLCJwZXJzaXN0ZW5jZUhpZXJhcmNoeSIsImF2YWlsYWJsZVBlcnNpc3RlbmNlcyIsImFsbCIsIl9pc0F2YWlsYWJsZSIsInNlbGVjdGVkUGVyc2lzdGVuY2UiLCJ1c2VyVG9NaWdyYXRlIiwibWlncmF0aW9uSGllcmFyY2h5IiwiX3Nob3VsZEFsbG93TWlncmF0aW9uIiwiX2dldEJyb3dzZXJOYW1lIiwiX2lzSUVNb2JpbGUiLCJfaXNGaXJlZm94IiwiX2lzQmxhY2tCZXJyeSIsIl9pc1dlYk9TIiwiX2lzU2FmYXJpIiwiX2lzQ2hyb21lSU9TIiwiX2lzQW5kcm9pZCIsInJlIiwibWF0Y2hlcyIsIl9pc0lPUyIsIl9pc01vYmlsZUJyb3dzZXIiLCJfZ2V0Q2xpZW50VmVyc2lvbiIsImNsaWVudFBsYXRmb3JtIiwiZnJhbWV3b3JrcyIsInJlcG9ydGVkUGxhdGZvcm0iLCJyZXBvcnRlZEZyYW1ld29ya3MiLCJnZXRSZWNhcHRjaGFDb25maWciLCJpc1YyIiwiZ3JlY2FwdGNoYSIsImdldFJlc3BvbnNlIiwiaXNFbnRlcnByaXNlIiwiZW50ZXJwcmlzZSIsIlJlY2FwdGNoYUNvbmZpZyIsInNpdGVLZXkiLCJlbWFpbFBhc3N3b3JkRW5hYmxlZCIsInJlY2FwdGNoYUtleSIsInJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUiLCJlbmZvcmNlbWVudFN0YXRlIiwiX2xvYWRKUyIsImVsIiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsIm9ubG9hZCIsImNoYXJzZXQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImFwcGVuZENoaWxkIiwiX2dlbmVyYXRlQ2FsbGJhY2tOYW1lIiwicHJlZml4IiwiZmxvb3IiLCJyYW5kb20iLCJSZWNhcHRjaGFFbnRlcnByaXNlVmVyaWZpZXIiLCJhdXRoRXh0ZXJuIiwiX2Nhc3RBdXRoIiwiYWN0aW9uIiwicmV0cmlldmVSZWNhcHRjaGFUb2tlbiIsInJlYWR5IiwiZXhlY3V0ZSIsIl9hZ2VudFJlY2FwdGNoYUNvbmZpZyIsIl90ZW5hbnRSZWNhcHRjaGFDb25maWdzIiwiY2xpZW50VHlwZSIsInZlcnNpb24iLCJyZXRyaWV2ZVNpdGVLZXkiLCJpbmplY3RSZWNhcHRjaGFGaWVsZHMiLCJjYXB0Y2hhUmVzcCIsInZlcmlmaWVyIiwiY2FwdGNoYVJlc3BvbnNlIiwidmVyaWZ5IiwibmV3UmVxdWVzdCIsIkF1dGhNaWRkbGV3YXJlUXVldWUiLCJxdWV1ZSIsIm9uQWJvcnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJpbmRleCIsIm5leHRVc2VyIiwib25BYm9ydFN0YWNrIiwiYmVmb3JlU3RhdGVDYWxsYmFjayIsInJldmVyc2UiLCJvcmlnaW5hbE1lc3NhZ2UiLCJhcHAiLCJoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIiLCJhcHBDaGVja1NlcnZpY2VQcm92aWRlciIsImVtdWxhdG9yQ29uZmlnIiwib3BlcmF0aW9ucyIsImF1dGhTdGF0ZVN1YnNjcmlwdGlvbiIsImlkVG9rZW5TdWJzY3JpcHRpb24iLCJiZWZvcmVTdGF0ZVF1ZXVlIiwicmVkaXJlY3RVc2VyIiwiaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCIsIl9pc0luaXRpYWxpemVkIiwiX2RlbGV0ZWQiLCJfaW5pdGlhbGl6YXRpb25Qcm9taXNlIiwiX3BvcHVwUmVkaXJlY3RSZXNvbHZlciIsImxhc3ROb3RpZmllZFVpZCIsInNldHRpbmdzIiwiYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nIiwiY2xpZW50VmVyc2lvbiIsInNka0NsaWVudFZlcnNpb24iLCJwb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJwZXJzaXN0ZW5jZU1hbmFnZXIiLCJfc2hvdWxkSW5pdFByb2FjdGl2ZWx5IiwiX2luaXRpYWxpemUiLCJpbml0aWFsaXplQ3VycmVudFVzZXIiLCJhc3NlcnRlZFBlcnNpc3RlbmNlIiwiX2N1cnJlbnRVc2VyIiwiX3VwZGF0ZUN1cnJlbnRVc2VyIiwicHJldmlvdXNseVN0b3JlZFVzZXIiLCJmdXR1cmVDdXJyZW50VXNlciIsIm5lZWRzVG9jaGVja01pZGRsZXdhcmUiLCJhdXRoRG9tYWluIiwiZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIiLCJyZWRpcmVjdFVzZXJFdmVudElkIiwic3RvcmVkVXNlckV2ZW50SWQiLCJ0cnlSZWRpcmVjdFNpZ25JbiIsImRpcmVjdGx5U2V0Q3VycmVudFVzZXIiLCJydW5NaWRkbGV3YXJlIiwiX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQiLCJyZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIiLCJyZWRpcmVjdFJlc29sdmVyIiwiX2NvbXBsZXRlUmVkaXJlY3RGbiIsIl9zZXRSZWRpcmVjdFVzZXIiLCJuYXZpZ2F0b3JMYW5ndWFnZSIsImxhbmd1YWdlcyIsImxhbmd1YWdlIiwiX2dldFVzZXJMYW5ndWFnZSIsInVzZXJFeHRlcm4iLCJza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MiLCJub3RpZnlBdXRoTGlzdGVuZXJzIiwicmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIiLCJzZXRQZXJzaXN0ZW5jZSIsImNvbXBsZXRlZCIsInJlZ2lzdGVyU3RhdGVMaXN0ZW5lciIsInB1c2hDYWxsYmFjayIsInJlZGlyZWN0TWFuYWdlciIsInJlc29sdmVyIiwiX3JlZGlyZWN0UGVyc2lzdGVuY2UiLCJfc3RhcnRQcm9hY3RpdmVSZWZyZXNoIiwiX3N0b3BQcm9hY3RpdmVSZWZyZXNoIiwiY3VycmVudFVpZCIsInN1YnNjcmlwdGlvbiIsImNiIiwiYWRkT2JzZXJ2ZXIiLCJmcmFtZXdvcmsiLCJzb3J0IiwiX2dldEZyYW1ld29ya3MiLCJvcHRpb25zIiwiYXBwSWQiLCJoZWFydGJlYXRzSGVhZGVyIiwiZ2V0SW1tZWRpYXRlIiwib3B0aW9uYWwiLCJnZXRIZWFydGJlYXRzSGVhZGVyIiwiYXBwQ2hlY2tUb2tlbiIsIl9nZXRBcHBDaGVja1Rva2VuIiwiYXBwQ2hlY2tUb2tlblJlc3VsdCIsIldBUk4iLCJ3YXJuIiwiX2xvZ1dhcm4iLCJjb25uZWN0QXV0aEVtdWxhdG9yIiwiYXV0aEludGVybmFsIiwiZGlzYWJsZVdhcm5pbmdzIiwiZXh0cmFjdFByb3RvY29sIiwiYXV0aG9yaXR5IiwiZXhlYyIsInN1YnN0ciIsImhvc3RBbmRQb3J0IiwicG9wIiwiYnJhY2tldGVkSVB2NiIsInBhcnNlUG9ydCIsImV4dHJhY3RIb3N0QW5kUG9ydCIsInBvcnRTdHIiLCJmcmVlemUiLCJhdHRhY2hCYW5uZXIiLCJzdHkiLCJzdHlsZSIsImlubmVyVGV4dCIsInBvc2l0aW9uIiwid2lkdGgiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXIiLCJjb2xvciIsImJvdHRvbSIsImxlZnQiLCJtYXJnaW4iLCJ6SW5kZXgiLCJ0ZXh0QWxpZ24iLCJjbGFzc0xpc3QiLCJhZGQiLCJyZWFkeVN0YXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImVtaXRFbXVsYXRvcldhcm5pbmciLCJwcm90b2NvbEVuZCIsIkF1dGhDcmVkZW50aWFsIiwic2lnbkluTWV0aG9kIiwiX2F1dGgiLCJfaWRUb2tlbiIsInJlc2V0UGFzc3dvcmQiLCJ1cGRhdGVFbWFpbFBhc3N3b3JkIiwic2lnbkluV2l0aFBhc3N3b3JkIiwic2VuZE9vYkNvZGUiLCJzZW5kUGFzc3dvcmRSZXNldEVtYWlsJDEiLCJzZW5kU2lnbkluTGlua1RvRW1haWwkMSIsIkVtYWlsQXV0aENyZWRlbnRpYWwiLCJfZW1haWwiLCJfcGFzc3dvcmQiLCJfdGVuYW50SWQiLCJwYXNzd29yZCIsIm9vYkNvZGUiLCJfZnJvbUVtYWlsQW5kUGFzc3dvcmQiLCJfZnJvbUVtYWlsQW5kQ29kZSIsInJldHVyblNlY3VyZVRva2VuIiwiX2dldFJlY2FwdGNoYUNvbmZpZyIsInJlcXVlc3RXaXRoUmVjYXB0Y2hhIiwibG9nIiwic2lnbkluV2l0aEVtYWlsTGluayQxIiwic2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmciLCJfZ2V0SWRUb2tlblJlc3BvbnNlIiwic2lnbkluV2l0aElkcCIsInBlbmRpbmdUb2tlbiIsImNyZWQiLCJub25jZSIsIm9hdXRoVG9rZW4iLCJvYXV0aFRva2VuU2VjcmV0Iiwic2VjcmV0IiwiYnVpbGRSZXF1ZXN0IiwiYXV0b0NyZWF0ZSIsInJlcXVlc3RVcmkiLCJwb3N0Qm9keSIsIlZFUklGWV9QSE9ORV9OVU1CRVJfRk9SX0VYSVNUSU5HX0VSUk9SX01BUF8iLCJQaG9uZUF1dGhDcmVkZW50aWFsIiwidmVyaWZpY2F0aW9uSWQiLCJ2ZXJpZmljYXRpb25Db2RlIiwidGVtcG9yYXJ5UHJvb2YiLCJzaWduSW5XaXRoUGhvbmVOdW1iZXIkMSIsIl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCIsImxpbmtXaXRoUGhvbmVOdW1iZXIkMSIsIm9wZXJhdGlvbiIsInZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3RpbmciLCJzZXNzaW9uSW5mbyIsImFjdGlvbkxpbmsiLCJzZWFyY2hQYXJhbXMiLCJwYXJzZU1vZGUiLCJjb250aW51ZVVybCIsImxpbmsiLCJkb3VibGVEZWVwTGluayIsImlPU0RlZXBMaW5rIiwicGFyc2VEZWVwTGluayIsIkVtYWlsQXV0aFByb3ZpZGVyIiwiUFJPVklERVJfSUQiLCJlbWFpbExpbmsiLCJhY3Rpb25Db2RlVXJsIiwicGFyc2VMaW5rIiwiRU1BSUxfUEFTU1dPUkRfU0lHTl9JTl9NRVRIT0QiLCJFTUFJTF9MSU5LX1NJR05fSU5fTUVUSE9EIiwiRmVkZXJhdGVkQXV0aFByb3ZpZGVyIiwiZGVmYXVsdExhbmd1YWdlQ29kZSIsImN1c3RvbVBhcmFtZXRlcnMiLCJjdXN0b21PQXV0aFBhcmFtZXRlcnMiLCJCYXNlT0F1dGhQcm92aWRlciIsInNjb3BlcyIsInNjb3BlIiwiT0F1dGhQcm92aWRlciIsIl9mcm9tUGFyYW1zIiwiX2NyZWRlbnRpYWwiLCJyYXdOb25jZSIsInVzZXJDcmVkZW50aWFsIiwib2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCIsInRva2VuUmVzcG9uc2UiLCJvYXV0aElkVG9rZW4iLCJvYXV0aEFjY2Vzc1Rva2VuIiwiRmFjZWJvb2tBdXRoUHJvdmlkZXIiLCJGQUNFQk9PS19TSUdOX0lOX01FVEhPRCIsImNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0IiwiY3JlZGVudGlhbCIsIkdvb2dsZUF1dGhQcm92aWRlciIsImFkZFNjb3BlIiwiR09PR0xFX1NJR05fSU5fTUVUSE9EIiwiR2l0aHViQXV0aFByb3ZpZGVyIiwiR0lUSFVCX1NJR05fSU5fTUVUSE9EIiwiU0FNTEF1dGhDcmVkZW50aWFsIiwiU0FNTEF1dGhQcm92aWRlciIsInNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCIsIl9jcmVhdGUiLCJUd2l0dGVyQXV0aFByb3ZpZGVyIiwiVFdJVFRFUl9TSUdOX0lOX01FVEhPRCIsInNpZ25VcCIsIlVzZXJDcmVkZW50aWFsSW1wbCIsIm9wZXJhdGlvblR5cGUiLCJfZnJvbUlkVG9rZW5SZXNwb25zZSIsInByb3ZpZGVySWRGb3JSZXNwb25zZSIsIl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeSIsInNpZ25JbkFub255bW91c2x5IiwiX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5IiwiX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlciIsIl9mcm9tRXJyb3JBbmRPcGVyYXRpb24iLCJwcm92aWRlckRhdGFBc05hbWVzIiwiU2V0IiwicGlkIiwidW5saW5rIiwiX2Fzc2VydExpbmtlZFN0YXR1cyIsImRlbGV0ZUxpbmtlZEFjY291bnRzIiwiZGVsZXRlUHJvdmlkZXIiLCJwcm92aWRlcnNMZWZ0IiwicGQiLCJoYXMiLCJfbGluayQxIiwiX2xpbmtUb0lkVG9rZW4iLCJfZm9yT3BlcmF0aW9uIiwiZXhwZWN0ZWQiLCJfcmVhdXRoZW50aWNhdGUiLCJwYXJzZWQiLCJfc2lnbkluV2l0aENyZWRlbnRpYWwiLCJzaWduSW5XaXRoQ3JlZGVudGlhbCIsImxpbmtXaXRoQ3JlZGVudGlhbCIsInJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwiLCJzaWduSW5XaXRoQ3VzdG9tVG9rZW4iLCJjdXN0b21Ub2tlbiIsInNpZ25JbldpdGhDdXN0b21Ub2tlbiQxIiwiTXVsdGlGYWN0b3JJbmZvSW1wbCIsImZhY3RvcklkIiwibWZhRW5yb2xsbWVudElkIiwiZW5yb2xsbWVudFRpbWUiLCJlbnJvbGxlZEF0IiwiZW5yb2xsbWVudCIsIlBob25lTXVsdGlGYWN0b3JJbmZvSW1wbCIsIl9mcm9tU2VydmVyUmVzcG9uc2UiLCJUb3RwTXVsdGlGYWN0b3JJbmZvSW1wbCIsInBob25lSW5mbyIsIl9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QiLCJhY3Rpb25Db2RlU2V0dGluZ3MiLCJkeW5hbWljTGlua0RvbWFpbiIsImNhbkhhbmRsZUNvZGVJbkFwcCIsImhhbmRsZUNvZGVJbkFwcCIsImlPUyIsImJ1bmRsZUlkIiwiaU9TQnVuZGxlSWQiLCJhbmRyb2lkIiwicGFja2FnZU5hbWUiLCJhbmRyb2lkSW5zdGFsbEFwcCIsImluc3RhbGxBcHAiLCJhbmRyb2lkTWluaW11bVZlcnNpb25Db2RlIiwibWluaW11bVZlcnNpb24iLCJhbmRyb2lkUGFja2FnZU5hbWUiLCJzZW5kUGFzc3dvcmRSZXNldEVtYWlsIiwicmVxdWVzdFR5cGUiLCJjb25maXJtUGFzc3dvcmRSZXNldCIsIm5ld1Bhc3N3b3JkIiwiYXBwbHlBY3Rpb25Db2RlIiwiYXBwbHlBY3Rpb25Db2RlJDEiLCJjaGVja0FjdGlvbkNvZGUiLCJhdXRoTW9kdWxhciIsIm5ld0VtYWlsIiwibWZhSW5mbyIsIm11bHRpRmFjdG9ySW5mbyIsInByZXZpb3VzRW1haWwiLCJ2ZXJpZnlQYXNzd29yZFJlc2V0Q29kZSIsImNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCIsInNpZ25VcFJlc3BvbnNlIiwic2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQiLCJzZW5kU2lnbkluTGlua1RvRW1haWwiLCJzZXRBY3Rpb25Db2RlU2V0dGluZ3MiLCJpc1NpZ25JbldpdGhFbWFpbExpbmsiLCJzaWduSW5XaXRoRW1haWxMaW5rIiwiY3JlZGVudGlhbFdpdGhMaW5rIiwiZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwiLCJpZGVudGlmaWVyIiwiY29udGludWVVcmkiLCJzaWduaW5NZXRob2RzIiwiY3JlYXRlQXV0aFVyaSIsInNlbmRFbWFpbFZlcmlmaWNhdGlvbiIsInNlbmRFbWFpbFZlcmlmaWNhdGlvbiQxIiwidmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwiLCJ2ZXJpZnlBbmRDaGFuZ2VFbWFpbCIsInVwZGF0ZVByb2ZpbGUiLCJwcm9maWxlUmVxdWVzdCIsInVwZGF0ZVByb2ZpbGUkMSIsInBhc3N3b3JkUHJvdmlkZXIiLCJmaW5kIiwidXBkYXRlRW1haWwiLCJ1cGRhdGVFbWFpbE9yUGFzc3dvcmQiLCJ1cGRhdGVQYXNzd29yZCIsIkdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8iLCJpc05ld1VzZXIiLCJwcm9maWxlIiwiRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIiwidXNlcm5hbWUiLCJGYWNlYm9va0FkZGl0aW9uYWxVc2VySW5mbyIsIkdpdGh1YkFkZGl0aW9uYWxVc2VySW5mbyIsImxvZ2luIiwiR29vZ2xlQWRkaXRpb25hbFVzZXJJbmZvIiwiVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyIsInNjcmVlbk5hbWUiLCJnZXRBZGRpdGlvbmFsVXNlckluZm8iLCJyYXdVc2VySW5mbyIsImtpbmQiLCJNdWx0aUZhY3RvclNlc3Npb25JbXBsIiwibWZhUGVuZGluZ0NyZWRlbnRpYWwiLCJtdWx0aUZhY3RvclNlc3Npb24iLCJwZW5kaW5nQ3JlZGVudGlhbCIsIl9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwiLCJfZnJvbUlkdG9rZW4iLCJNdWx0aUZhY3RvclJlc29sdmVySW1wbCIsInNlc3Npb24iLCJoaW50cyIsInNpZ25JblJlc29sdmVyIiwibWZhUmVzcG9uc2UiLCJfcHJvY2VzcyIsImFzc2VydGlvbkV4dGVybiIsImdldE11bHRpRmFjdG9yUmVzb2x2ZXIiLCJlcnJvckludGVybmFsIiwiX2Zyb21FcnJvciIsIk11bHRpRmFjdG9yVXNlckltcGwiLCJlbnJvbGxlZEZhY3RvcnMiLCJfb25SZWxvYWQiLCJnZXRTZXNzaW9uIiwiZmluYWxpemVNZmFSZXNwb25zZSIsImluZm9PclVpZCIsIm11bHRpRmFjdG9yVXNlckNhY2hlIiwiV2Vha01hcCIsIm11bHRpRmFjdG9yIiwidXNlck1vZHVsYXIiLCJfZnJvbVVzZXIiLCJCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyIsInN0b3JhZ2VSZXRyaWV2ZXIiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImdldEl0ZW0iLCJCcm93c2VyTG9jYWxQZXJzaXN0ZW5jZSIsImxvY2FsU3RvcmFnZSIsImV2ZW50IiwicG9sbCIsIm9uU3RvcmFnZUV2ZW50IiwibGlzdGVuZXJzIiwibG9jYWxDYWNoZSIsInBvbGxUaW1lciIsInNhZmFyaUxvY2FsU3RvcmFnZU5vdFN5bmNlZCIsIl9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSIsInRvcCIsIl9pc0lmcmFtZSIsImZhbGxiYWNrVG9Qb2xsaW5nIiwibmV3VmFsdWUiLCJvbGRWYWx1ZSIsImZvckFsbENoYW5nZWRLZXlzIiwiX29sZFZhbHVlIiwibm90aWZ5TGlzdGVuZXJzIiwiZGV0YWNoTGlzdGVuZXIiLCJzdG9wUG9sbGluZyIsInN0b3JlZFZhbHVlIiwidHJpZ2dlckxpc3RlbmVycyIsImRvY3VtZW50TW9kZSIsImxpc3RlbmVyIiwiZnJvbSIsInNldEludGVydmFsIiwiU3RvcmFnZUV2ZW50IiwiY2xlYXJJbnRlcnZhbCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzdGFydFBvbGxpbmciLCJhdHRhY2hMaXN0ZW5lciIsImRlbGV0ZSIsInNpemUiLCJicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSIsIkJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UiLCJzZXNzaW9uU3RvcmFnZSIsImJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UiLCJSZWNlaXZlciIsImV2ZW50VGFyZ2V0IiwiaGFuZGxlcnNNYXAiLCJoYW5kbGVFdmVudCIsImV4aXN0aW5nSW5zdGFuY2UiLCJyZWNlaXZlcnMiLCJyZWNlaXZlciIsImlzTGlzdGVuaW5ndG8iLCJuZXdJbnN0YW5jZSIsIm1lc3NhZ2VFdmVudCIsImV2ZW50SWQiLCJldmVudFR5cGUiLCJoYW5kbGVycyIsInBvcnRzIiwicG9zdE1lc3NhZ2UiLCJzdGF0dXMiLCJwcm9taXNlcyIsImhhbmRsZXIiLCJvcmlnaW4iLCJmdWxmaWxsZWQiLCJyZWFzb24iLCJfYWxsU2V0dGxlZCIsImV2ZW50SGFuZGxlciIsIl9nZW5lcmF0ZUV2ZW50SWQiLCJkaWdpdHMiLCJTZW5kZXIiLCJtZXNzYWdlQ2hhbm5lbCIsInBvcnQxIiwib25NZXNzYWdlIiwidGltZW91dCIsIk1lc3NhZ2VDaGFubmVsIiwiY29tcGxldGlvblRpbWVyIiwic3RhcnQiLCJhY2tUaW1lciIsInBvcnQyIiwiZmluYWxseSIsInJlbW92ZU1lc3NhZ2VIYW5kbGVyIiwiX3dpbmRvdyIsIl9pc1dvcmtlciIsIkRCX05BTUUiLCJEQlByb21pc2UiLCJnZXRPYmplY3RTdG9yZSIsImRiIiwiaXNSZWFkV3JpdGUiLCJ0cmFuc2FjdGlvbiIsIm9iamVjdFN0b3JlIiwiX29wZW5EYXRhYmFzZSIsImNyZWF0ZU9iamVjdFN0b3JlIiwia2V5UGF0aCIsIm9iamVjdFN0b3JlTmFtZXMiLCJ0b1Byb21pc2UiLCJfZGVsZXRlRGF0YWJhc2UiLCJfcHV0T2JqZWN0IiwicHV0IiwiX2RlbGV0ZU9iamVjdCIsIkluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UiLCJwZW5kaW5nV3JpdGVzIiwic2VuZGVyIiwic2VydmljZVdvcmtlclJlY2VpdmVyQXZhaWxhYmxlIiwiYWN0aXZlU2VydmljZVdvcmtlciIsIl93b3JrZXJJbml0aWFsaXphdGlvblByb21pc2UiLCJpbml0aWFsaXplU2VydmljZVdvcmtlck1lc3NhZ2luZyIsIm9wIiwibnVtQXR0ZW1wdHMiLCJfb3BlbkRiIiwiaW5pdGlhbGl6ZVJlY2VpdmVyIiwiaW5pdGlhbGl6ZVNlbmRlciIsIl9zdWJzY3JpYmUiLCJfb3JpZ2luIiwia2V5UHJvY2Vzc2VkIiwiX3BvbGwiLCJfZGF0YSIsInNlcnZpY2VXb3JrZXIiLCJhY3RpdmUiLCJfZ2V0QWN0aXZlU2VydmljZVdvcmtlciIsInJlc3VsdHMiLCJfc2VuZCIsImNvbnRyb2xsZXIiLCJ3cml0ZSIsIl93aXRoUGVuZGluZ1dyaXRlIiwiX3dpdGhSZXRyaWVzIiwibm90aWZ5U2VydmljZVdvcmtlciIsImdldE9iamVjdCIsImdldEFsbFJlcXVlc3QiLCJnZXRBbGwiLCJrZXlzSW5SZXN1bHQiLCJmYmFzZV9rZXkiLCJsb2NhbEtleSIsImluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UiLCJNb2NrUmVDYXB0Y2hhIiwiY291bnRlciIsIl93aWRnZXRzIiwiY29udGFpbmVyIiwicGFyYW1ldGVycyIsIk1vY2tXaWRnZXQiLCJvcHRXaWRnZXRJZCIsImNvbnRhaW5lck9ySWQiLCJkZWxldGVkIiwicmVzcG9uc2VUb2tlbiIsImNsaWNrSGFuZGxlciIsImdldEVsZW1lbnRCeUlkIiwiaXNWaXNpYmxlIiwiY2hlY2tJZkRlbGV0ZWQiLCJsZW4iLCJjaGFycyIsImFsbG93ZWRDaGFycyIsImdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nIiwiZXhwaXJlZENhbGxiYWNrIiwiX0pTTE9BRF9DQUxMQkFDSyIsIk5FVFdPUktfVElNRU9VVF9ERUxBWSIsImhvc3RMYW5ndWFnZSIsImxpYnJhcnlTZXBhcmF0ZWx5TG9hZGVkIiwicmVuZGVyIiwiaGwiLCJpc0hvc3RMYW5ndWFnZVZhbGlkIiwic2hvdWxkUmVzb2x2ZUltbWVkaWF0ZWx5IiwicmVjYXB0Y2hhIiwid2lkZ2V0SWQiLCJNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCIsIkRFRkFVTFRfUEFSQU1TIiwidGhlbWUiLCJSZWNhcHRjaGFWZXJpZmllciIsImRlc3Ryb3llZCIsInRva2VuQ2hhbmdlTGlzdGVuZXJzIiwicmVuZGVyUHJvbWlzZSIsImlzSW52aXNpYmxlIiwibWFrZVRva2VuQ2FsbGJhY2siLCJfcmVjYXB0Y2hhTG9hZGVyIiwidmFsaWRhdGVTdGFydGluZ1N0YXRlIiwiYXNzZXJ0Tm90RGVzdHJveWVkIiwiZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEiLCJ0b2tlbkNoYW5nZSIsIm1ha2VSZW5kZXJQcm9taXNlIiwicmVzZXQiLCJjbGVhcmVkT25lSW5zdGFuY2UiLCJjaGlsZE5vZGVzIiwibm9kZSIsInJlbW92ZUNoaWxkIiwic2l0ZWtleSIsImhhc0NoaWxkTm9kZXMiLCJleGlzdGluZyIsImdsb2JhbEZ1bmMiLCJpbml0IiwiZ3VhcmFudGVlZEVtcHR5IiwiZG9tUmVhZHkiLCJsb2FkIiwicmVjYXB0Y2hhU2l0ZUtleSIsImdldFJlY2FwdGNoYVBhcmFtcyIsIkNvbmZpcm1hdGlvblJlc3VsdEltcGwiLCJvbkNvbmZpcm1hdGlvbiIsImF1dGhDcmVkZW50aWFsIiwiX2Zyb21WZXJpZmljYXRpb24iLCJzaWduSW5XaXRoUGhvbmVOdW1iZXIiLCJhcHBWZXJpZmllciIsIl92ZXJpZnlQaG9uZU51bWJlciIsImxpbmtXaXRoUGhvbmVOdW1iZXIiLCJyZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlciIsInJlY2FwdGNoYVRva2VuIiwicGhvbmVJbmZvT3B0aW9ucyIsInN0YXJ0RW5yb2xsUGhvbmVNZmEiLCJwaG9uZUVucm9sbG1lbnRJbmZvIiwicGhvbmVTZXNzaW9uSW5mbyIsIm11bHRpRmFjdG9ySGludCIsIm11bHRpRmFjdG9yVWlkIiwic3RhcnRTaWduSW5QaG9uZU1mYSIsInBob25lU2lnbkluSW5mbyIsInBob25lUmVzcG9uc2VJbmZvIiwic2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZSIsIl9yZXNldCIsInVwZGF0ZVBob25lTnVtYmVyIiwicGhvbmVPcHRpb25zIiwiYXBwbGljYXRpb25WZXJpZmllciIsIl9mcm9tVG9rZW5SZXNwb25zZSIsIl93aXRoRGVmYXVsdFJlc29sdmVyIiwicmVzb2x2ZXJPdmVycmlkZSIsIlBIT05FX1NJR05fSU5fTUVUSE9EIiwiSWRwQ3JlZGVudGlhbCIsIl9idWlsZElkcFJlcXVlc3QiLCJzZXNzaW9uSWQiLCJyZXR1cm5JZHBDcmVkZW50aWFsIiwiX3NpZ25JbiIsIl9yZWF1dGgiLCJfbGluayIsIkFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiIsInBlbmRpbmdQcm9taXNlIiwiZXZlbnRNYW5hZ2VyIiwib25FeGVjdXRpb24iLCJyZWdpc3RlckNvbnN1bWVyIiwidXJsUmVzcG9uc2UiLCJnZXRJZHBUYXNrIiwidW5yZWdpc3RlckFuZENsZWFuVXAiLCJ1bnJlZ2lzdGVyQ29uc3VtZXIiLCJjbGVhblVwIiwiX1BPTExfV0lORE9XX0NMT1NFX1RJTUVPVVQiLCJzaWduSW5XaXRoUG9wdXAiLCJyZXNvbHZlckludGVybmFsIiwiUG9wdXBPcGVyYXRpb24iLCJleGVjdXRlTm90TnVsbCIsInJlYXV0aGVudGljYXRlV2l0aFBvcHVwIiwibGlua1dpdGhQb3B1cCIsImF1dGhXaW5kb3ciLCJwb2xsSWQiLCJjdXJyZW50UG9wdXBBY3Rpb24iLCJjYW5jZWwiLCJfb3BlblBvcHVwIiwiYXNzb2NpYXRlZEV2ZW50IiwiX29yaWdpblZhbGlkYXRpb24iLCJfaXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkIiwiaXNTdXBwb3J0ZWQiLCJwb2xsVXNlckNhbmNlbGxhdGlvbiIsImNsb3NlZCIsInJlZGlyZWN0T3V0Y29tZU1hcCIsIlJlZGlyZWN0QWN0aW9uIiwicmVhZHlPdXRjb21lIiwicGVuZGluZ1JlZGlyZWN0S2V5IiwicmVzb2x2ZXJQZXJzaXN0ZW5jZSIsImhhc1BlbmRpbmdSZWRpcmVjdCIsIl9nZXRBbmRDbGVhclBlbmRpbmdSZWRpcmVjdFN0YXR1cyIsIm9uQXV0aEV2ZW50IiwiX3JlZGlyZWN0VXNlckZvcklkIiwiX3NldFBlbmRpbmdSZWRpcmVjdFN0YXR1cyIsInNpZ25JbldpdGhSZWRpcmVjdCIsIl9vcGVuUmVkaXJlY3QiLCJfc2lnbkluV2l0aFJlZGlyZWN0IiwicmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QiLCJwcmVwYXJlVXNlckZvclJlZGlyZWN0IiwiX3JlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0IiwibGlua1dpdGhSZWRpcmVjdCIsIl9saW5rV2l0aFJlZGlyZWN0IiwiZ2V0UmVkaXJlY3RSZXN1bHQiLCJfZ2V0UmVkaXJlY3RSZXN1bHQiLCJyZXNvbHZlckV4dGVybiIsIkF1dGhFdmVudE1hbmFnZXIiLCJjYWNoZWRFdmVudFVpZHMiLCJjb25zdW1lcnMiLCJxdWV1ZWRSZWRpcmVjdEV2ZW50IiwiaGFzSGFuZGxlZFBvdGVudGlhbFJlZGlyZWN0IiwibGFzdFByb2Nlc3NlZEV2ZW50VGltZSIsImF1dGhFdmVudENvbnN1bWVyIiwiaXNFdmVudEZvckNvbnN1bWVyIiwic2VuZFRvQ29uc3VtZXIiLCJzYXZlRXZlbnRUb0NhY2hlIiwiaGFzRXZlbnRCZWVuSGFuZGxlZCIsImhhbmRsZWQiLCJjb25zdW1lciIsImlzTnVsbFJlZGlyZWN0RXZlbnQiLCJpc1JlZGlyZWN0RXZlbnQiLCJvbkVycm9yIiwiZXZlbnRJZE1hdGNoZXMiLCJjbGVhciIsImV2ZW50VWlkIiwidiIsIl9nZXRQcm9qZWN0Q29uZmlnIiwiSVBfQUREUkVTU19SRUdFWCIsIkhUVFBfUkVHRVgiLCJtYXRjaERvbWFpbiIsImN1cnJlbnRVcmwiLCJob3N0bmFtZSIsIlVSTCIsImNlVXJsIiwiZXNjYXBlZERvbWFpblBhdHRlcm4iLCJSZWdFeHAiLCJORVRXT1JLX1RJTUVPVVQiLCJyZXNldFVubG9hZGVkR2FwaU1vZHVsZXMiLCJiZWFjb24iLCJfX19qc2wiLCJIIiwiaGludCIsIkwiLCJDUCIsImNhY2hlZEdBcGlMb2FkZXIiLCJfbG9hZEdhcGkiLCJsb2FkR2FwaUlmcmFtZSIsImdhcGkiLCJpZnJhbWVzIiwiZ2V0Q29udGV4dCIsIm9udGltZW91dCIsIklmcmFtZSIsImNiTmFtZSIsImxvYWRHYXBpIiwiUElOR19USU1FT1VUIiwiSUZSQU1FX0FUVFJJQlVURVMiLCJoZWlnaHQiLCJ0YWJpbmRleCIsIkVJRF9GUk9NX0FQSUhPU1QiLCJnZXRJZnJhbWVVcmwiLCJlaWQiLCJmdyIsIkJBU0VfUE9QVVBfT1BUSU9OUyIsInJlc2l6YWJsZSIsInN0YXR1c2JhciIsInRvb2xiYXIiLCJBdXRoUG9wdXAiLCJfb3BlbiIsInNjcmVlbiIsImF2YWlsSGVpZ2h0IiwiYXZhaWxXaWR0aCIsInNjcm9sbGJhcnMiLCJvcHRpb25zU3RyaW5nIiwicmVkdWNlIiwiYWNjdW0iLCJzdGFuZGFsb25lIiwiX2lzSU9TU3RhbmRhbG9uZSIsImNsaWNrIiwiY3JlYXRlRXZlbnQiLCJpbml0TW91c2VFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJvcGVuQXNOZXdXaW5kb3dJT1MiLCJuZXdXaW4iLCJmb2N1cyIsIkZJUkVCQVNFX0FQUF9DSEVDS19GUkFHTUVOVF9JRCIsIl9nZXRSZWRpcmVjdFVybCIsImF1dGhUeXBlIiwicmVkaXJlY3RVcmwiLCJhZGRpdGlvbmFsUGFyYW1zIiwic2V0RGVmYXVsdExhbmd1YWdlIiwiZ2V0Q3VzdG9tUGFyYW1ldGVycyIsImdldFNjb3BlcyIsInRpZCIsInBhcmFtc0RpY3QiLCJhcHBDaGVja1Rva2VuRnJhZ21lbnQiLCJnZXRIYW5kbGVyQmFzZSIsImJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJldmVudE1hbmFnZXJzIiwib3JpZ2luVmFsaWRhdGlvblByb21pc2VzIiwiX3NldFdpbmRvd0xvY2F0aW9uIiwiaW5pdEFuZEdldE1hbmFnZXIiLCJpZnJhbWUiLCJjb250ZXh0Iiwid2hlcmUiLCJtZXNzYWdlSGFuZGxlcnNGaWx0ZXIiLCJDUk9TU19PUklHSU5fSUZSQU1FU19GSUxURVIiLCJhdHRyaWJ1dGVzIiwiZG9udGNsZWFyIiwicmVzdHlsZSIsInNldEhpZGVPbkxlYXZlIiwibmV0d29ya0Vycm9yIiwibmV0d29ya0Vycm9yVGltZXIiLCJjbGVhclRpbWVyQW5kUmVzb2x2ZSIsInBpbmciLCJfb3BlbklmcmFtZSIsInJlZ2lzdGVyIiwiaWZyYW1lRXZlbnQiLCJhdXRoRXZlbnQiLCJvbkV2ZW50Iiwic2VuZCIsImF1dGhvcml6ZWREb21haW5zIiwiZG9tYWluIiwiX3ZhbGlkYXRlT3JpZ2luIiwiTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIiwiX2ZpbmFsaXplRW5yb2xsIiwiX2ZpbmFsaXplU2lnbkluIiwiUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwiLCJmaW5hbGl6ZUVucm9sbFBob25lTWZhIiwicGhvbmVWZXJpZmljYXRpb25JbmZvIiwiZmluYWxpemVTaWduSW5QaG9uZU1mYSIsIlBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IiLCJfZnJvbUNyZWRlbnRpYWwiLCJGQUNUT1JfSUQiLCJBdXRoSW50ZXJvcCIsImludGVybmFsTGlzdGVuZXJzIiwiYXNzZXJ0QXV0aENvbmZpZ3VyZWQiLCJ1bnN1YnNjcmliZSIsIm9uSWRUb2tlbkNoYW5nZWQiLCJ1cGRhdGVQcm9hY3RpdmVSZWZyZXNoIiwiX2NvcmRvdmFXaW5kb3ciLCJkZXBzIiwiZ2V0UHJvdmlkZXIiLCJhdXRoSW5zdGFuY2UiLCJoaWVyYXJjaHkiLCJfdXBkYXRlRXJyb3JNYXAiLCJfaW5pdGlhbGl6ZVdpdGhQZXJzaXN0ZW5jZSIsIl9pbml0aWFsaXplQXV0aEluc3RhbmNlIiwic2V0SW5zdGFudGlhdGlvbk1vZGUiLCJzZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjayIsIl9pbnN0YW5jZUlkZW50aWZpZXIiLCJfaW5zdGFuY2UiLCJpbml0aWFsaXplIiwiZ2V0VmVyc2lvbkZvclBsYXRmb3JtIiwiX2dlbmVyYXRlSGFuZGxlclVybCIsIkJ1aWxkSW5mbyIsInNlc3Npb25EaWdlc3QiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsImJ1ZmYiLCJBcnJheUJ1ZmZlciIsInZpZXciLCJVaW50OEFycmF5Iiwic3RyaW5nVG9BcnJheUJ1ZmZlciIsImJ1ZiIsImNyeXB0byIsInN1YnRsZSIsImRpZ2VzdCIsIm51bSIsInBhZFN0YXJ0IiwiY29tcHV0ZVNoYTI1NiIsIl9wZXJmb3JtUmVkaXJlY3QiLCJoYW5kbGVyVXJsIiwiY29yZG92YSIsInBsdWdpbnMiLCJicm93c2VydGFiIiwiaXNBdmFpbGFibGUiLCJicm93c2VyVGFiSXNBdmFpbGFibGUiLCJpYWJSZWYiLCJvcGVuVXJsIiwiSW5BcHBCcm93c2VyIiwiX2lzSU9TN09yOCIsInBhc3NpdmVMaXN0ZW5lcnMiLCJpbml0UHJvbWlzZSIsInJlc29sdmVJbmlhbGl6ZWQiLCJfZ2V0QW5kUmVtb3ZlRXZlbnQiLCJwZXJzaXN0ZW5jZUtleSIsIl9ldmVudEZyb21QYXJ0aWFsQW5kVXJsIiwicGFydGlhbEV2ZW50IiwiY2FsbGJhY2tVcmwiLCJzZWFyY2hQYXJhbXNPckVtcHR5IiwiX2dldERlZXBMaW5rRnJvbUNhbGxiYWNrIiwiZXJyb3JPYmplY3QiLCJwYXJzZUpzb25Pck51bGwiLCJnZW5lcmF0ZVNlc3Npb25JZCIsImlkeCIsImNvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCJhdHRhY2hDYWxsYmFja0xpc3RlbmVycyIsIl9qIiwiX2siLCJ3aW4iLCJ1bml2ZXJzYWxMaW5rcyIsIm1pc3NpbmdQbHVnaW4iLCJfY2hlY2tDb3Jkb3ZhQ29uZmlndXJhdGlvbiIsImluaXRpYWxpemVkIiwicmVzZXRSZWRpcmVjdCIsIl9nZW5lcmF0ZU5ld0V2ZW50IiwiX3NhdmVQYXJ0aWFsRXZlbnQiLCJldmVudExpc3RlbmVyIiwiY2xlYW51cCIsIm9uQ2xvc2VUaW1lciIsImF1dGhFdmVudFNlZW4iLCJjbG9zZUJyb3dzZXJUYWIiLCJyZXN1bWVkIiwidmlzaWJpbGl0eUNoYW5nZWQiLCJ2aXNpYmlsaXR5U3RhdGUiLCJhZGRQYXNzaXZlTGlzdGVuZXIiLCJyZW1vdmVQYXNzaXZlTGlzdGVuZXIiLCJfd2FpdEZvckFwcFJlc3VtZSIsIl9jYiIsImlvc0J1bmRsZUlkIiwiaGFuZGxlT3BlblVSTCIsIm5vRXZlbnRUaW1lb3V0IiwiZ2VuZXJhdGVOb0V2ZW50IiwidW5pdmVyc2FsTGlua3NDYiIsImV2ZW50RGF0YSIsImZpbmFsRXZlbnQiLCJleGlzdGluZ0hhbmRsZU9wZW5VUkwiLCJwYWNrYWdlUHJlZml4IiwiYWRkRnJhbWV3b3JrRm9yTG9nZ2luZyIsIl9sb2dGcmFtZXdvcmsiLCJWIiwiaXNBdXRoZW50aWNhdGVkIiwiVU5BVVRIRU5USUNBVEVEIiwiR09PR0xFX0NSRURFTlRJQUxTIiwiRklSU1RfUEFSVFkiLCJNT0NLX1VTRVIiLCJTIiwiRCIsIkMiLCJ4Iiwic2V0TG9nTGV2ZWwiLCJOIiwiREVCVUciLCIkIiwiZGVidWciLCJNIiwiTyIsIkYiLCJCIiwicSIsIk9LIiwiQ0FOQ0VMTEVEIiwiVU5LTk9XTiIsIklOVkFMSURfQVJHVU1FTlQiLCJERUFETElORV9FWENFRURFRCIsIk5PVF9GT1VORCIsIkFMUkVBRFlfRVhJU1RTIiwiUEVSTUlTU0lPTl9ERU5JRUQiLCJSRVNPVVJDRV9FWEhBVVNURUQiLCJGQUlMRURfUFJFQ09ORElUSU9OIiwiQUJPUlRFRCIsIk9VVF9PRl9SQU5HRSIsIlVOSU1QTEVNRU5URUQiLCJJTlRFUk5BTCIsIlVOQVZBSUxBQkxFIiwiREFUQV9MT1NTIiwiVSIsIksiLCJHIiwiUSIsImVucXVldWVSZXRyeWFibGUiLCJqIiwiY2hhbmdlTGlzdGVuZXIiLCJ6IiwiYWRkQXV0aFRva2VuTGlzdGVuZXIiLCJvbkluaXQiLCJyZW1vdmVBdXRoVG9rZW5MaXN0ZW5lciIsImdldFVpZCIsIlciLCJoIiwiZyIsIkoiLCJZIiwiSSIsImFwcENoZWNrIiwiVCIsImFkZFRva2VuTGlzdGVuZXIiLCJyZW1vdmVUb2tlbkxpc3RlbmVyIiwiWCIsIloiLCJtc0NyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsInR0IiwiZXQiLCJudCIsImV2ZXJ5Iiwic3QiLCJpdCIsIm5hbm9zZWNvbmRzIiwiZnJvbU1pbGxpcyIsInRvTWlsbGlzIiwicnQiLCJ0aW1lc3RhbXAiLCJfY29tcGFyZVRvIiwiaXNFcXVhbCIsIm90Iiwic2VnbWVudHMiLCJvZmZzZXQiLCJjb21wYXJhdG9yIiwibGltaXQiLCJjb25zdHJ1Y3QiLCJ1dCIsInRvQXJyYXkiLCJjYW5vbmljYWxTdHJpbmciLCJjdCIsImF0IiwiaXNWYWxpZElkZW50aWZpZXIiLCJodCIsImZyb21TdHJpbmciLCJwb3BGaXJzdCIsImVtcHR5UGF0aCIsInBvcExhc3QiLCJsYXN0U2VnbWVudCIsImx0IiwiaW5kZXhJZCIsImNvbGxlY3Rpb25Hcm91cCIsImZpZWxkcyIsImluZGV4U3RhdGUiLCJmdCIsImR0Iiwid3QiLCJtdCIsIlVOS05PV05fSUQiLCJfdCIsImZpZWxkUGF0aCIsImd0Iiwic2VxdWVuY2VOdW1iZXIiLCJJdCIsInl0IiwidG9UaW1lc3RhbXAiLCJmcm9tVGltZXN0YW1wIiwiZW1wdHkiLCJwdCIsInJlYWRUaW1lIiwiZG9jdW1lbnRLZXkiLCJsYXJnZXN0QmF0Y2hJZCIsIlR0IiwiY29tcGFyZVRvIiwiRXQiLCJBdCIsIm9uQ29tbWl0dGVkTGlzdGVuZXJzIiwidnQiLCJSdCIsIm5leHRDYWxsYmFjayIsImNhdGNoQ2FsbGJhY2siLCJpc0RvbmUiLCJjYWxsYmFja0F0dGFjaGVkIiwid3JhcEZhaWx1cmUiLCJ3cmFwU3VjY2VzcyIsIndyYXBVc2VyRnVuY3Rpb24iLCJ3YWl0Rm9yIiwiUHQiLCJhYm9ydGVkIiwib25jb21wbGV0ZSIsIm9uYWJvcnQiLCJTdCIsImt0IiwiYWJvcnQiLCJjb21taXQiLCJDdCIsImJ0IiwieHQiLCJzdG9yZSIsIm9uYmxvY2tlZCIsIm9sZFZlcnNpb24iLCJvbnZlcnNpb25jaGFuZ2UiLCJQIiwiUiIsIlZ0IiwiRHQiLCJjb3VudCIsImN1cnNvciIsInJhbmdlIiwicHJpbWFyeUtleSIsImNvbnRpbnVlIiwiZG9uZSIsIm9wZW5LZXlDdXJzb3IiLCJvcGVuQ3Vyc29yIiwiTnQiLCJNdCIsImFzeW5jUXVldWUiLCJlbnF1ZXVlQWZ0ZXJEZWxheSIsIiR0IiwibG9jYWxTdG9yZSIsInJ1blRyYW5zYWN0aW9uIiwiZG9XaGlsZSIsImluZGV4TWFuYWdlciIsImdldE5leHRDb2xsZWN0aW9uR3JvdXBUb1VwZGF0ZSIsImdldE1pbk9mZnNldEZyb21Db2xsZWN0aW9uR3JvdXAiLCJsb2NhbERvY3VtZW50cyIsImdldE5leHREb2N1bWVudHMiLCJjaGFuZ2VzIiwidXBkYXRlSW5kZXhFbnRyaWVzIiwidXBkYXRlQ29sbGVjdGlvbkdyb3VwIiwiYmF0Y2hJZCIsIk90IiwicHJldmlvdXNWYWx1ZSIsInNlcXVlbmNlTnVtYmVySGFuZGxlciIsIndyaXRlU2VxdWVuY2VOdW1iZXIiLCJGdCIsIkJ0IiwiTHQiLCJpc0ludGVnZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsInF0IiwiS3QiLCJVdCIsIkd0IiwiX19QUklWQVRFX2xhc3RSZWFzb25hYmxlRXNjYXBlSW5kZXgiLCJRdCIsImp0IiwienQiLCJXdCIsIkh0IiwiSnQiLCJZdCIsIlh0IiwiWnQiLCJ0ZSIsImVlIiwibmUiLCJzZSIsImllIiwib2UiLCJ1ZSIsImNlIiwiYWUiLCJoZSIsImxlIiwiZmUiLCJkZSIsIndlIiwiY3VycmVudFNlcXVlbmNlTnVtYmVyIiwibWUiLCJnZSIsInllIiwicGUiLCJyb290IiwiVGUiLCJFTVBUWSIsImluc2VydCIsImNvcHkiLCJCTEFDSyIsInJlbW92ZSIsInJpZ2h0IiwibWluS2V5IiwibWF4S2V5IiwiaW5vcmRlclRyYXZlcnNhbCIsInJldmVyc2VUcmF2ZXJzYWwiLCJJZSIsImlzUmV2ZXJzZSIsIm5vZGVTdGFjayIsIlJFRCIsImZpeFVwIiwiaXNSZWQiLCJtb3ZlUmVkTGVmdCIsInJlbW92ZU1pbiIsInJvdGF0ZVJpZ2h0IiwibW92ZVJlZFJpZ2h0Iiwicm90YXRlTGVmdCIsImNvbG9yRmxpcCIsImNoZWNrIiwicG93IiwiRWUiLCJnZXRJdGVyYXRvckZyb20iLCJoYXNOZXh0IiwiZ2V0TmV4dCIsImdldEl0ZXJhdG9yIiwiQWUiLCJpdGVyIiwidmUiLCJSZSIsImlzUHJlZml4T2YiLCJQZSIsImJlIiwiVmUiLCJiaW5hcnlTdHJpbmciLCJET01FeGNlcHRpb24iLCJpdGVyYXRvciIsIkVNUFRZX0JZVEVfU1RSSU5HIiwiU2UiLCJEZSIsIm5hbm9zIiwiQ2UiLCJ4ZSIsImZyb21CYXNlNjRTdHJpbmciLCJmcm9tVWludDhBcnJheSIsIk5lIiwibWFwVmFsdWUiLCJfX3R5cGVfXyIsInN0cmluZ1ZhbHVlIiwia2UiLCJfX3ByZXZpb3VzX3ZhbHVlX18iLCJNZSIsIl9fbG9jYWxfd3JpdGVfdGltZV9fIiwidGltZXN0YW1wVmFsdWUiLCIkZSIsImRhdGFiYXNlSWQiLCJzc2wiLCJmb3JjZUxvbmdQb2xsaW5nIiwiYXV0b0RldGVjdExvbmdQb2xsaW5nIiwibG9uZ1BvbGxpbmdPcHRpb25zIiwidXNlRmV0Y2hTdHJlYW1zIiwiT2UiLCJkYXRhYmFzZSIsIkZlIiwiQmUiLCJudWxsVmFsdWUiLCJMZSIsImVuIiwicWUiLCJib29sZWFuVmFsdWUiLCJieXRlc1ZhbHVlIiwicmVmZXJlbmNlVmFsdWUiLCJnZW9Qb2ludFZhbHVlIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJpbnRlZ2VyVmFsdWUiLCJkb3VibGVWYWx1ZSIsImFycmF5VmFsdWUiLCJ2YWx1ZXMiLCJVZSIsIktlIiwiR2UiLCJRZSIsImplIiwidG9CYXNlNjQiLCJmcm9tTmFtZSIsIldlIiwiSGUiLCJKZSIsIlllIiwiWGUiLCJaZSIsInRuIiwibm4iLCJOYU4iLCJzbiIsInJuIiwiaW5jbHVzaXZlIiwib24iLCJ1biIsImdldEZpZWxkc01hcCIsImlzSW1tZWRpYXRlUGFyZW50T2YiLCJhcHBseUNoYW5nZXMiLCJmaWVsZCIsImNuIiwiY2hpbGQiLCJhbiIsImRvY3VtZW50VHlwZSIsImNyZWF0ZVRpbWUiLCJkb2N1bWVudFN0YXRlIiwiaGFzTG9jYWxNdXRhdGlvbnMiLCJoYXNDb21taXR0ZWRNdXRhdGlvbnMiLCJjbG9uZSIsImhuIiwibG4iLCJpc0tleUZpZWxkIiwiZGlyIiwiZG4iLCJ3biIsIl9uIiwibW4iLCJjcmVhdGVLZXlGaWVsZEluRmlsdGVyIiwiUG4iLCJEbiIsIkNuIiwieG4iLCJObiIsImJuIiwiVm4iLCJtYXRjaGVzQ29tcGFyaXNvbiIsImlzSW5lcXVhbGl0eSIsImduIiwiZmlsdGVycyIsInluIiwiY29uY2F0IiwiZ2V0RmxhdHRlbmVkRmlsdGVycyIsInBuIiwiSW4iLCJUbiIsIkFuIiwidm4iLCJSbiIsImdldEZpbHRlcnMiLCJTbiIsImtuIiwib3JkZXJCeSIsInN0YXJ0QXQiLCJlbmRBdCIsIk1uIiwiJG4iLCJFbiIsIk9uIiwiRm4iLCJpc0RvY3VtZW50S2V5IiwiQm4iLCJMbiIsInFuIiwiVW4iLCJleHBsaWNpdE9yZGVyQnkiLCJsaW1pdFR5cGUiLCJLbiIsIkduIiwiUW4iLCJqbiIsInpuIiwiZ2V0Rmlyc3RJbmVxdWFsaXR5RmllbGQiLCJXbiIsIkhuIiwia2V5RmllbGQiLCJKbiIsIlluIiwiWG4iLCJabiIsInRzIiwiZXMiLCJpc0ZvdW5kRG9jdW1lbnQiLCJoYXNDb2xsZWN0aW9uSWQiLCJzcyIsImlzIiwicnMiLCJvcyIsIm1hcEtleUZuIiwiZXF1YWxzRm4iLCJpbm5lciIsImlubmVyU2l6ZSIsInNwbGljZSIsInVzIiwiY3MiLCJhcyIsImhzIiwibHMiLCJvdmVybGF5ZWREb2N1bWVudCIsImZzIiwid3MiLCJkcyIsIl9zIiwibXMiLCJncyIsInlzIiwicHMiLCJJcyIsInVzZVByb3RvM0pzb24iLCJUcyIsIkVzIiwiQXMiLCJ2cyIsImJzIiwiVnMiLCJTcyIsIkRzIiwiQ3MiLCJQcyIsIk5zIiwic2VyaWFsaXplciIsIlJzIiwieHMiLCJlbGVtZW50cyIsImtzIiwiTXMiLCJ0cmFuc2Zvcm0iLCJPcyIsInRyYW5zZm9ybVJlc3VsdHMiLCJGcyIsInVwZGF0ZVRpbWUiLCJleGlzdHMiLCJCcyIsIkxzIiwicXMiLCJpc05vRG9jdW1lbnQiLCJZcyIsIm5vbmUiLCJqcyIsInpzIiwiVXMiLCJIcyIsImZpZWxkVHJhbnNmb3JtcyIsInNldEFsbCIsImNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQiLCJzZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMiLCJwcmVjb25kaXRpb24iLCJjb252ZXJ0VG9Vbmtub3duRG9jdW1lbnQiLCJXcyIsImNvbnZlcnRUb05vRG9jdW1lbnQiLCJLcyIsIkpzIiwic2V0SGFzTG9jYWxNdXRhdGlvbnMiLCJ1bmlvbldpdGgiLCJmaWVsZE1hc2siLCJHcyIsIlFzIiwiJHMiLCJYcyIsIlpzIiwibG9jYWxXcml0ZVRpbWUiLCJiYXNlTXV0YXRpb25zIiwibXV0YXRpb25zIiwibXV0YXRpb25SZXN1bHRzIiwiYXBwbHlUb0xvY2FsVmlldyIsIm11dGF0ZWRGaWVsZHMiLCJpc1ZhbGlkRG9jdW1lbnQiLCJ0aSIsImJhdGNoIiwiY29tbWl0VmVyc2lvbiIsImRvY1ZlcnNpb25zIiwiZWkiLCJtdXRhdGlvbiIsIm5pIiwiYWxpYXMiLCJzaSIsInVuY2hhbmdlZE5hbWVzIiwiaWkiLCJyaSIsIm9pIiwidWkiLCJjaSIsIm9uRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hDYWxsYmFja3MiLCJhaSIsImhpIiwibGkiLCJmaSIsInVwZGF0ZSIsImRpIiwiRGF0YVZpZXciLCJidWZmZXIiLCJnZXRVaW50MzIiLCJ3aSIsImJpdG1hcCIsInBhZGRpbmciLCJoYXNoQ291bnQiLCJfaSIsImZyb21OdW1iZXIiLCJtdWx0aXBseSIsImNvbXBhcmUiLCJnZXRCaXRzIiwibW9kdWxvIiwidG9OdW1iZXIiLCJjZWlsIiwibWkiLCJzbmFwc2hvdFZlcnNpb24iLCJ0YXJnZXRDaGFuZ2VzIiwidGFyZ2V0TWlzbWF0Y2hlcyIsImRvY3VtZW50VXBkYXRlcyIsInJlc29sdmVkTGltYm9Eb2N1bWVudHMiLCJnaSIsImNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSIsInJlc3VtZVRva2VuIiwiY3VycmVudCIsImFkZGVkRG9jdW1lbnRzIiwibW9kaWZpZWREb2N1bWVudHMiLCJyZW1vdmVkRG9jdW1lbnRzIiwieWkiLCJyZW1vdmVkVGFyZ2V0SWRzIiwicGkiLCJ0YXJnZXRJZCIsIklpIiwic3RhdGUiLCJ0YXJnZXRJZHMiLCJjYXVzZSIsIlRpIiwidmkiLCJhcHByb3hpbWF0ZUJ5dGVTaXplIiwiRWkiLCJBaSIsImZvckVhY2hUYXJnZXQiLCJyZW1vdmVUYXJnZXQiLCJuZXdOb0RvY3VtZW50Iiwibm90aWZ5T25FeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaCIsImxvY2FsQ2FjaGVDb3VudCIsImV4aXN0ZW5jZUZpbHRlckNvdW50IiwiYmxvb21GaWx0ZXIiLCJhcHBsaWVkIiwiYml0bWFwTGVuZ3RoIiwiYml0cyIsInRvVWludDhBcnJheSIsImdldFJlbW90ZUtleXNGb3JUYXJnZXQiLCJmb3JFYWNoV2hpbGUiLCJwdXJwb3NlIiwic2V0UmVhZFRpbWUiLCJSaSIsImFzYyIsImRlc2MiLCJQaSIsImluIiwiYmkiLCJhbmQiLCJvciIsIlZpIiwiU2kiLCJEaSIsInRvSVNPU3RyaW5nIiwiQ2kiLCJ4aSIsIk5pIiwia2kiLCJNaSIsInVyIiwiJGkiLCJPaSIsInFpIiwiRmkiLCJCaSIsIkxpIiwiVWkiLCJLaSIsIm5ld0ZvdW5kRG9jdW1lbnQiLCJqaSIsInVwZGF0ZU1hc2siLCJ1cGRhdGVUcmFuc2Zvcm1zIiwic2V0VG9TZXJ2ZXJWYWx1ZSIsImFwcGVuZE1pc3NpbmdFbGVtZW50cyIsInJlbW92ZUFsbEZyb21BcnJheSIsImluY3JlbWVudCIsImlzTm9uZSIsImN1cnJlbnREb2N1bWVudCIsInppIiwiZnJvbVNlcnZlckZvcm1hdCIsImZpZWxkUGF0aHMiLCJIaSIsImRvY3VtZW50cyIsIkppIiwic3RydWN0dXJlZFF1ZXJ5IiwicGFyZW50IiwiY29sbGVjdGlvbklkIiwiYWxsRGVzY2VuZGFudHMiLCJyciIsInVuYXJ5RmlsdGVyIiwic3IiLCJmaWVsZEZpbHRlciIsImVyIiwiY29tcG9zaXRlRmlsdGVyIiwibnIiLCJkaXJlY3Rpb24iLCJ0ciIsImJlZm9yZSIsIllpIiwiWmkiLCJpciIsImNyIiwibGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiIsImV4cGVjdGVkQ291bnQiLCJhciIsImxyIiwicHJlZml4UGF0aCIsImdldENvbGxlY3Rpb25QYXRoIiwiZG9jdW1lbnRJZCIsImZyIiwibm9Eb2N1bWVudCIsImRyIiwiaXNVbmtub3duRG9jdW1lbnQiLCJ1bmtub3duRG9jdW1lbnQiLCJ3ciIsIl9yIiwibG9jYWxXcml0ZVRpbWVNcyIsIm1yIiwibGFzdExpc3RlblNlcXVlbmNlTnVtYmVyIiwiZ3IiLCJjYW5vbmljYWxJZCIsInlyIiwicHIiLCJvdmVybGF5TXV0YXRpb24iLCJJciIsIlRyIiwiRXIiLCJBciIsInZyIiwiYnVuZGxlZFF1ZXJ5IiwiUnIiLCJ1c2VySWQiLCJQciIsImdldE92ZXJsYXkiLCJJREJLZXlSYW5nZSIsImJvdW5kIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRLZXkiLCJjb2xsZWN0aW9uUGF0aCIsImdldENvbGxlY3Rpb25Hcm91cCIsImJyIiwiVnIiLCJTciIsIkRyIiwiY29kZVBvaW50QXQiLCJzZXRGbG9hdDY0IiwiQ3IiLCJ4ciIsIk5yIiwiemUiLCJzZWVkIiwia3IiLCJkaXJlY3Rpb25hbFZhbHVlIiwiTXIiLCIkciIsIk9yIiwiQnIiLCJLciIsImpyIiwiVXIiLCJHciIsIkZyIiwiTHIiLCJxciIsIlFyIiwienIiLCJXciIsImdldEVudHJpZXMiLCJIciIsIkpyIiwiYWRkT25Db21taXR0ZWRMaXN0ZW5lciIsIllyIiwiWnIiLCJ0byIsIlhyIiwiZiIsInciLCJmcm9tU2VnbWVudHMiLCJjcmVhdGVSYW5nZSIsImdldEZpZWxkSW5kZXhlcyIsIm9yZGVyZWREb2N1bWVudEtleSIsIm9ubHkiLCJ1cHBlckJvdW5kIiwiZW8iLCJtYXBBcnJheSIsIm5vIiwiZGlkUnVuIiwic2VxdWVuY2VOdW1iZXJzQ29sbGVjdGVkIiwidGFyZ2V0c1JlbW92ZWQiLCJkb2N1bWVudHNSZW1vdmVkIiwic28iLCJjYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkIiwicGVyY2VudGlsZVRvQ29sbGVjdCIsIm1heGltdW1TZXF1ZW5jZU51bWJlcnNUb0NvbGxlY3QiLCJERUZBVUxUX0NPTExFQ1RJT05fUEVSQ0VOVElMRSIsIkRFRkFVTFRfTUFYX1NFUVVFTkNFX05VTUJFUlNfVE9fQ09MTEVDVCIsImlvIiwicm8iLCJERUZBVUxUIiwiRElTQUJMRUQiLCJvbyIsInJlZmVyZW5jZURlbGVnYXRlIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJjbyIsImFvIiwiYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgiLCJsb29rdXBNdXRhdGlvbkJhdGNoIiwibG93ZXJCb3VuZCIsIm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkIiwiY2hlY2tFbXB0eSIsInVvIiwiaG8iLCJsYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZCIsImxhc3RTdHJlYW1Ub2tlbiIsImxvIiwiZm8iLCJoaWdoZXN0VGFyZ2V0SWQiLCJsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uIiwiaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyIiwidGFyZ2V0Q291bnQiLCJyZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCIsIndvIiwicmVtb3ZlVGFyZ2V0RGF0YSIsIl9vIiwibW8iLCJhZGRSZWZlcmVuY2UiLCJyZW1vdmVSZWZlcmVuY2UiLCJnbyIsInlvIiwibGFzdCIsInBvIiwiZ2FyYmFnZUNvbGxlY3RvciIsImNvbGxlY3RHYXJiYWdlIiwiSW8iLCJtYXhWYWx1ZSIsInJlbW92ZVRhcmdldHMiLCJyZW1vdmVPcnBoYW5lZERvY3VtZW50cyIsImdldENhY2hlU2l6ZSIsImNhbGN1bGF0ZVRhcmdldENvdW50IiwibnRoU2VxdWVuY2VOdW1iZXIiLCJUbyIsIkVvIiwiZ2V0VGFyZ2V0Q2FjaGUiLCJnZXRUYXJnZXRDb3VudCIsIkFvIiwiZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSIsIm5ld0NoYW5nZUJ1ZmZlciIsImdldEVudHJ5IiwicmVtb3ZlRW50cnkiLCJhcHBseSIsIndpdGhTZXF1ZW5jZU51bWJlciIsInVwZGF0ZVRhcmdldERhdGEiLCJnZXRTaXplIiwidm8iLCJjaGFuZ2VzQXBwbGllZCIsImFzc2VydE5vdEFwcGxpZWQiLCJuZXdJbnZhbGlkRG9jdW1lbnQiLCJnZXRGcm9tQ2FjaGUiLCJnZXRBbGxGcm9tQ2FjaGUiLCJSbyIsIlNvIiwiZ2V0TWV0YWRhdGEiLCJieXRlU2l6ZSIsIkRvIiwieG8iLCJmaXJzdCIsIkNvIiwiYm8iLCJ0cmFja1JlbW92YWxzIiwiVm8iLCJuZXdVbmtub3duRG9jdW1lbnQiLCJociIsIlBvIiwiYWRkRW50cnkiLCJ1cGRhdGVNZXRhZGF0YSIsIk5vIiwia28iLCJyZW1vdGVEb2N1bWVudENhY2hlIiwibXV0YXRpb25RdWV1ZSIsImRvY3VtZW50T3ZlcmxheUNhY2hlIiwiZ2V0TG9jYWxWaWV3T2ZEb2N1bWVudHMiLCJwb3B1bGF0ZU92ZXJsYXlzIiwiY29tcHV0ZVZpZXdzIiwiZ2V0T3ZlcmxheXMiLCJnZXRGaWVsZE1hc2siLCJyZWNhbGN1bGF0ZUFuZFNhdmVPdmVybGF5cyIsImdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5cyIsImdldFJldmVyc2VJdGVyYXRvciIsInNhdmVPdmVybGF5cyIsImdldERvY3VtZW50c01hdGNoaW5nRG9jdW1lbnRRdWVyeSIsImdldERvY3VtZW50c01hdGNoaW5nQ29sbGVjdGlvbkdyb3VwUXVlcnkiLCJnZXREb2N1bWVudHNNYXRjaGluZ0NvbGxlY3Rpb25RdWVyeSIsImdldEFsbEZyb21Db2xsZWN0aW9uR3JvdXAiLCJnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb25Hcm91cCIsImdldERvY3VtZW50IiwiZ2V0Q29sbGVjdGlvblBhcmVudHMiLCJnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb24iLCJnZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5IiwiTW8iLCIkbyIsIm92ZXJsYXlzIiwiT28iLCJGbyIsImZvckVhY2hJblJhbmdlIiwiZmlyc3RBZnRlck9yRXF1YWwiLCJCbyIsInNoaWZ0IiwiTG8iLCJkb2NzIiwibXV0YWJsZUNvcHkiLCJxbyIsIlVvIiwiY29udGFpbnNLZXkiLCJLbyIsInRvS2V5IiwiR28iLCJyYWlzZU9uQ29tbWl0dGVkRXZlbnQiLCJRbyIsImdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkIiwiZnJvbVBhdGgiLCJqbyIsInpvIiwiYXV0b0luY3JlbWVudCIsImNyZWF0ZUluZGV4IiwidW5pcXVlIiwiV28iLCJkZWxldGVPYmplY3RTdG9yZSIsImdldEluZGV4TWFuYWdlciIsInJlY2FsY3VsYXRlQW5kU2F2ZU92ZXJsYXlzRm9yRG9jdW1lbnRLZXlzIiwiSG8iLCJKbyIsImFsbG93VGFiU3luY2hyb25pemF0aW9uIiwiY2xpZW50SWQiLCJpc1ByaW1hcnkiLCJuZXR3b3JrRW5hYmxlZCIsImluRm9yZWdyb3VuZCIsImdldEhpZ2hlc3RTZXF1ZW5jZU51bWJlciIsInN0YXJ0ZWQiLCJuZXdWZXJzaW9uIiwiZW5xdWV1ZUFuZEZvcmdldCIsIlhvIiwidXBkYXRlVGltZU1zIiwiWW8iLCJvd25lcklkIiwibGVhc2VUaW1lc3RhbXBNcyIsImFwcFZlcnNpb24iLCJlbnRlclJlc3RyaWN0ZWRNb2RlIiwic2h1dGRvd24iLCJabyIsImlzRGVmYXVsdERhdGFiYXNlIiwidHUiLCJmcm9tQ2FjaGUiLCJkb2NDaGFuZ2VzIiwiZG9jIiwiZXUiLCJHaSIsIlFpIiwiZ2V0SW5kZXhUeXBlIiwiZ2V0RG9jdW1lbnRzTWF0Y2hpbmdUYXJnZXQiLCJnZXREb2N1bWVudHMiLCJnZXRNaW5PZmZzZXQiLCJXaSIsImhhc1BlbmRpbmdXcml0ZXMiLCJudSIsIlhpIiwiZ2V0QnVuZGxlQ2FjaGUiLCJnZXREb2N1bWVudE92ZXJsYXlDYWNoZSIsImdldE11dGF0aW9uUXVldWUiLCJzZXRJbmRleE1hbmFnZXIiLCJjb2xsZWN0Iiwic3UiLCJpdSIsImdldEFsbE11dGF0aW9uQmF0Y2hlcyIsInJlbW92ZWRCYXRjaElkcyIsImFkZGVkQmF0Y2hJZHMiLCJvdSIsImdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24iLCJjdSIsImF1IiwiZ2V0TmV4dE11dGF0aW9uQmF0Y2hBZnRlckJhdGNoSWQiLCJodSIsImdldFRhcmdldERhdGEiLCJhbGxvY2F0ZVRhcmdldElkIiwiYWRkVGFyZ2V0RGF0YSIsImx1IiwiZnUiLCJfdSIsImR1Iiwid3UiLCJndSIsInNhdmVOYW1lZFF1ZXJ5Iiwid2l0aFJlc3VtZVRva2VuIiwiYWRkTWF0Y2hpbmdLZXlzIiwieXUiLCJwdSIsIkl1IiwiVHUiLCJFdSIsIkF1IiwiYWN0aXZlVGFyZ2V0SWRzIiwidnUiLCJvbmxpbmVTdGF0ZSIsIlJ1IiwiUHUiLCJzeW5jRW5naW5lIiwib25saW5lU3RhdGVIYW5kbGVyIiwiaXNBY3RpdmVRdWVyeVRhcmdldCIsImFkZFBlbmRpbmdNdXRhdGlvbiIsInN0b3JhZ2VBcmVhIiwiYnUiLCJWdSIsIlN1IiwiRHUiLCJDdSIsInJvdW5kIiwieHUiLCJCYXRjaEdldERvY3VtZW50cyIsIkNvbW1pdCIsIlJ1blF1ZXJ5IiwiUnVuQWdncmVnYXRpb25RdWVyeSIsIk51Iiwia3UiLCJNdSIsImRhdGFiYXNlSW5mbyIsInNldFdpdGhDcmVkZW50aWFscyIsImxpc3Rlbk9uY2UiLCJDT01QTEVURSIsImdldExhc3RFcnJvckNvZGUiLCJOT19FUlJPUiIsImdldFJlc3BvbnNlSnNvbiIsIlRJTUVPVVQiLCJIVFRQX0VSUk9SIiwiZ2V0U3RhdHVzIiwiZ2V0UmVzcG9uc2VUZXh0IiwiaHR0cFNlc3Npb25JZFBhcmFtIiwiaW5pdE1lc3NhZ2VIZWFkZXJzIiwibWVzc2FnZVVybFBhcmFtcyIsInNlbmRSYXdKc29uIiwic3VwcG9ydHNDcm9zc0RvbWFpblhociIsImludGVybmFsQ2hhbm5lbFBhcmFtcyIsImZvcndhcmRDaGFubmVsUmVxdWVzdFRpbWVvdXRNcyIsImRldGVjdEJ1ZmZlcmluZ1Byb3h5IiwidGltZW91dFNlY29uZHMiLCJsb25nUG9sbGluZ1RpbWVvdXQiLCJ4bWxIdHRwRmFjdG9yeSIsImVuY29kZUluaXRNZXNzYWdlSGVhZGVycyIsImNyZWF0ZVdlYkNoYW5uZWwiLCJsaXN0ZW4iLCJFdmVudFR5cGUiLCJPUEVOIiwiQ0xPU0UiLCJNRVNTQUdFIiwiU1RBVF9FVkVOVCIsInN0YXQiLCJQUk9YWSIsIk5PUFJPWFkiLCIkdSIsIk91IiwiRnUiLCJCdSIsInNraXBEZWxheSIsIkx1IiwiY29ubmVjdGlvbiIsImF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyIiwiYXBwQ2hlY2tDcmVkZW50aWFsc1Byb3ZpZGVyIiwic3RyZWFtIiwiaW52YWxpZGF0ZVRva2VuIiwicXUiLCJ0YXJnZXRDaGFuZ2UiLCJ0YXJnZXRDaGFuZ2VUeXBlIiwiZG9jdW1lbnRDaGFuZ2UiLCJkb2N1bWVudERlbGV0ZSIsImRvY3VtZW50UmVtb3ZlIiwiYWRkVGFyZ2V0IiwibGFiZWxzIiwiVXUiLCJydSIsInV1Iiwic3RyZWFtVG9rZW4iLCJ3cml0ZVJlc3VsdHMiLCJjb21taXRUaW1lIiwid3JpdGVzIiwiS3UiLCJhdXRoQ3JlZGVudGlhbHMiLCJhcHBDaGVja0NyZWRlbnRpYWxzIiwiUXUiLCJtdSIsImp1IiwiZGF0YXN0b3JlIiwicmVtb3RlU3luY2VyIiwiZWMiLCJXdSIsInp1IiwiSHUiLCJ0YyIsIlp1IiwicGMiLCJZdSIsIkp1IiwiWHUiLCJ3aXRoRXhwZWN0ZWRDb3VudCIsIm5jIiwic2MiLCJpYyIsInJjIiwicmVqZWN0TGlzdGVuIiwib2MiLCJhcHBseVJlbW90ZUV2ZW50IiwidWMiLCJjYyIsIkljIiwiYWMiLCJoYyIsImxjIiwiZmMiLCJkYyIsIndjIiwiYXBwbHlTdWNjZXNzZnVsV3JpdGUiLCJtYyIsInJlamVjdEZhaWxlZFdyaXRlIiwiZ2MiLCJ2ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzIiwiaGFuZGxlQ3JlZGVudGlhbENoYW5nZSIsInljIiwic3RvcCIsIlRjIiwidGFyZ2V0VGltZU1zIiwicmVtb3ZhbENhbGxiYWNrIiwiZGVmZXJyZWQiLCJ0aW1lckhhbmRsZSIsImhhbmRsZURlbGF5RWxhcHNlZCIsIkVjIiwiQWMiLCJrZXllZE1hcCIsInNvcnRlZFNldCIsInZjIiwiUmMiLCJvbGREb2NzIiwibXV0YXRlZEtleXMiLCJzeW5jU3RhdGVDaGFuZ2VkIiwiZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXMiLCJoYXNDYWNoZWRSZXN1bHRzIiwiZW1wdHlTZXQiLCJQYyIsImJjIiwicXVlcmllcyIsIlZjIiwib25MaXN0ZW4iLCJ4YyIsIlNjIiwib25Vbmxpc3RlbiIsIkRjIiwiQ2MiLCJOYyIsImluY2x1ZGVNZXRhZGF0YUNoYW5nZXMiLCJmcm9tSW5pdGlhbERvY3VtZW50cyIsImtjIiwiR3UiLCJieXRlTGVuZ3RoIiwiTWMiLCIkYyIsImNvbGxlY3Rpb25Hcm91cHMiLCJwcm9ncmVzcyIsIk9jIiwiYnl0ZXNMb2FkZWQiLCJkb2N1bWVudHNMb2FkZWQiLCJuYW1lZFF1ZXJ5IiwiZG9jdW1lbnRNZXRhZGF0YSIsInRhc2tTdGF0ZSIsInRvdGFsRG9jdW1lbnRzIiwidG90YWxCeXRlcyIsIkZjIiwiQmMiLCJMYyIsInRyYWNrIiwic25hcHNob3QiLCJxYyIsIlVjIiwiS2MiLCJyZW1vdGVTdG9yZSIsInNoYXJlZENsaWVudFN0YXRlIiwibWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnMiLCJHYyIsInBhIiwiYWRkTG9jYWxRdWVyeVRhcmdldCIsIlFjIiwiaXNQcmltYXJ5Q2xpZW50IiwiaWEiLCJqYyIsInJlbW92ZUxvY2FsUXVlcnlUYXJnZXQiLCJjbGVhclF1ZXJ5U3RhdGUiLCJuYSIsIldjIiwicmVtb3ZlTWF0Y2hpbmdLZXlzIiwid2l0aExhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24iLCJ0b01pY3Jvc2Vjb25kcyIsInVwZGF0ZUxpbWJvRG9jdW1lbnQiLCJzZXRUYXJnZXRzTWV0YWRhdGEiLCJIYyIsInNldE9ubGluZVN0YXRlIiwiSmMiLCJ1cGRhdGVRdWVyeVN0YXRlIiwib2EiLCJZYyIsImFwcGx5VG9SZW1vdGVEb2N1bWVudCIsInJlbW92ZU11dGF0aW9uQmF0Y2giLCJwZXJmb3JtQ29uc2lzdGVuY3lDaGVjayIsInJlbW92ZU92ZXJsYXlzRm9yQmF0Y2hJZCIsImVhIiwidGEiLCJ1cGRhdGVNdXRhdGlvblN0YXRlIiwiWGMiLCJzYSIsInJhIiwiY2EiLCJoYW5kbGVVc2VyQ2hhbmdlIiwiYWEiLCJoYSIsImxhIiwiZmEiLCJ3YSIsIm1hIiwiZ2EiLCJjcmVhdGVTeW50aGVzaXplZFJlbW90ZUV2ZW50Rm9yQ3VycmVudENoYW5nZSIsInlhIiwiSWEiLCJFYSIsInN5bmNocm9uaXplVGFicyIsImNyZWF0ZVNoYXJlZENsaWVudFN0YXRlIiwiY3JlYXRlUGVyc2lzdGVuY2UiLCJjcmVhdGVMb2NhbFN0b3JlIiwiZ2NTY2hlZHVsZXIiLCJjcmVhdGVHYXJiYWdlQ29sbGVjdGlvblNjaGVkdWxlciIsImluZGV4QmFja2ZpbGxlclNjaGVkdWxlciIsImNyZWF0ZUluZGV4QmFja2ZpbGxlclNjaGVkdWxlciIsImluaXRpYWxVc2VyIiwiQWEiLCJjYWNoZVNpemVCeXRlcyIsIndpdGhDYWNoZVNpemUiLCJ2YSIsImZvcmNlT3duZXJzaGlwIiwiUmEiLCJnZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMiLCJpc0xvY2FsUXVlcnlUYXJnZXQiLCJkYSIsIlBhIiwiY3JlYXRlRGF0YXN0b3JlIiwiY3JlYXRlUmVtb3RlU3RvcmUiLCJjcmVhdGVFdmVudE1hbmFnZXIiLCJjcmVhdGVTeW5jRW5naW5lIiwiYmEiLCJWYSIsIm11dGVkIiwiU2EiLCJUZXh0RGVjb2RlciIsImRlY29kZSIsImZpbmRJbmRleCIsInJlYWQiLCJEYSIsInJlYWRWZXJzaW9ucyIsImNvbW1pdHRlZCIsImxhc3RXcml0ZUVycm9yIiwid3JpdHRlbkRvY3MiLCJlbnN1cmVDb21taXROb3RDYWxsZWQiLCJmb3VuZCIsIm1pc3NpbmciLCJyZWNvcmRWZXJzaW9uIiwidG9NdXRhdGlvbiIsInByZWNvbmRpdGlvbkZvclVwZGF0ZSIsIkNhIiwidXBkYXRlRnVuY3Rpb24iLCJtYXhBdHRlbXB0cyIsInhhIiwiQSIsImF1dGhDcmVkZW50aWFsTGlzdGVuZXIiLCJhcHBDaGVja0NyZWRlbnRpYWxMaXN0ZW5lciIsImlzU2h1dHRpbmdEb3duIiwiZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQiLCJfb25saW5lQ29tcG9uZW50cyIsInRlcm1pbmF0ZSIsIl9vZmZsaW5lQ29tcG9uZW50cyIsIk5hIiwiZ2V0Q29uZmlndXJhdGlvbiIsInNldENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lciIsInNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyIiwia2EiLCIkYSIsInNldEFwcENoZWNrVG9rZW5DaGFuZ2VMaXN0ZW5lciIsIk1hIiwiX3VuaW5pdGlhbGl6ZWRDb21wb25lbnRzUHJvdmlkZXIiLCJfb2ZmbGluZSIsIk9hIiwiX29ubGluZSIsIkZhIiwiQmEiLCJMYSIsInFhIiwiVWEiLCJLYSIsInphIiwiSGEiLCJZYSIsIlJlYWRhYmxlU3RyZWFtIiwiZ2V0UmVhZGVyIiwiZ2V0QnVuZGxlTWV0YWRhdGEiLCJfY29tcGxldGVXaXRoIiwiX3VwZGF0ZVByb2dyZXNzIiwic2F2ZUJ1bmRsZU1ldGFkYXRhIiwiX2ZhaWxXaXRoIiwibm90aWZ5QnVuZGxlTG9hZGVkIiwiVGEiLCJ0aCIsImVoIiwibmgiLCJzaCIsImloIiwicmgiLCJvaCIsInVoIiwiY2giLCJhaCIsImNyZWRlbnRpYWxzIiwiaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyIsImNhY2hlIiwiZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZyIsImV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZyIsImV4cGVyaW1lbnRhbExvbmdQb2xsaW5nT3B0aW9ucyIsImhoIiwiX2F1dGhDcmVkZW50aWFscyIsIl9hcHBDaGVja0NyZWRlbnRpYWxzIiwiX2RhdGFiYXNlSWQiLCJfYXBwIiwiX3BlcnNpc3RlbmNlS2V5IiwiX3NldHRpbmdzIiwiX3NldHRpbmdzRnJvemVuIiwiX3Rlcm1pbmF0ZVRhc2siLCJzZXNzaW9uSW5kZXgiLCJpYW1Ub2tlbiIsImF1dGhUb2tlbkZhY3RvcnkiLCJjbGllbnQiLCJfdGVybWluYXRlIiwibGgiLCJfZ2V0U2V0dGluZ3MiLCJfc2V0U2V0dGluZ3MiLCJtb2NrVXNlclRva2VuIiwiZmgiLCJjb252ZXJ0ZXIiLCJmaXJlc3RvcmUiLCJ3aCIsImRoIiwiX3F1ZXJ5IiwiX3BhdGgiLCJtaCIsImdoIiwieWgiLCJwaCIsIkloIiwiemMiLCJlbnF1ZXVlIiwiWmMiLCJzdGFjayIsImNyZWF0ZUFuZFNjaGVkdWxlIiwiVGgiLCJFaCIsIl9wcm9ncmVzc09ic2VydmVyIiwiX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIiLCJfbGFzdFByb2dyZXNzIiwiQWgiLCJ2aCIsIl9xdWV1ZSIsIl9maXJlc3RvcmVDbGllbnQiLCJWaCIsIlJoIiwiaXNJbml0aWFsaXplZCIsImdldE9wdGlvbnMiLCJpbnN0YW5jZUlkZW50aWZpZXIiLCJQaCIsIl9pbml0aWFsaXplZCIsImJoIiwidmVyaWZ5Tm90VGVybWluYXRlZCIsIl9mcmVlemVTZXR0aW5ncyIsIl9vZmZsaW5lQ29tcG9uZW50UHJvdmlkZXIiLCJfb25saW5lQ29tcG9uZW50UHJvdmlkZXIiLCJfb2ZmbGluZUtpbmQiLCJTaCIsIkJoIiwiQ2giLCJEaCIsInhoIiwiX3Rlcm1pbmF0ZWQiLCJOaCIsImdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQiLCJraCIsInNldE5ldHdvcmtFbmFibGVkIiwiR2EiLCJNaCIsIlFhIiwiJGgiLCJfZGVsZXRlIiwiT2giLCJGaCIsImdldE5hbWVkUXVlcnkiLCJYYSIsIkxoIiwiX2FnZ3JlZ2F0ZVR5cGUiLCJfaW50ZXJuYWxGaWVsZFBhdGgiLCJxaCIsIl91c2VyRGF0YVdyaXRlciIsImNvbnZlcnRPYmplY3RNYXAiLCJVaCIsIl9ieXRlU3RyaW5nIiwiS2giLCJfaW50ZXJuYWxQYXRoIiwiR2giLCJRaCIsIl9tZXRob2ROYW1lIiwiamgiLCJpc0Zpbml0ZSIsIl9sYXQiLCJfbG9uZyIsInpoIiwiV2giLCJIaCIsIkpoIiwiWWgiLCJnbCIsIm1ldGhvZE5hbWUiLCJYaCIsIlpoIiwidGwiLCJtZXJnZSIsIm1lcmdlRmllbGRzIiwiZGwiLCJsbCIsIndsIiwieWwiLCJjb3ZlcnMiLCJubCIsInNsIiwiaWwiLCJybCIsIm9sIiwidWwiLCJtbCIsImNsIiwiYWwiLCJmbCIsIl90b0ZpZWxkVHJhbnNmb3JtIiwiZnJvbURhdGUiLCJnZXRQcm90b3R5cGVPZiIsIl9sIiwic2VhcmNoIiwicGwiLCJfZmlyZXN0b3JlIiwiX2RvY3VtZW50IiwiX2NvbnZlcnRlciIsIklsIiwiZnJvbUZpcmVzdG9yZSIsImNvbnZlcnRWYWx1ZSIsIlRsIiwiRWwiLCJBbCIsInZsIiwiUmwiLCJWbCIsIlBsIiwiX2FwcGx5IiwiX2ZpZWxkIiwiX29wIiwiX3ZhbHVlIiwiX3BhcnNlIiwiUWwiLCJHbCIsIktsIiwiYmwiLCJfcXVlcnlDb25zdHJhaW50cyIsIl9nZXRPcGVyYXRvciIsIlNsIiwiemwiLCJEbCIsIkNsIiwiX2RpcmVjdGlvbiIsImpsIiwieGwiLCJObCIsIl9saW1pdCIsIl9saW1pdFR5cGUiLCJrbCIsIk1sIiwiJGwiLCJfZG9jT3JGaWVsZHMiLCJfaW5jbHVzaXZlIiwiVWwiLCJPbCIsIkZsIiwiQmwiLCJMbCIsInFsIiwiV2wiLCJjb252ZXJ0VGltZXN0YW1wIiwiY29udmVydFNlcnZlclRpbWVzdGFtcCIsImNvbnZlcnRCeXRlcyIsImNvbnZlcnRSZWZlcmVuY2UiLCJjb252ZXJ0R2VvUG9pbnQiLCJjb252ZXJ0QXJyYXkiLCJjb252ZXJ0T2JqZWN0IiwiSGwiLCJ0b0ZpcmVzdG9yZSIsIkpsIiwiY29udmVydERvY3VtZW50S2V5IiwiWWwiLCJYbCIsIlpsIiwidGYiLCJlZiIsIm5mIiwic2YiLCJfZmlyZXN0b3JlSW1wbCIsInJmIiwic2VydmVyVGltZXN0YW1wcyIsIm9mIiwiX3NuYXBzaG90IiwiX2NhY2hlZENoYW5nZXMiLCJfY2FjaGVkQ2hhbmdlc0luY2x1ZGVNZXRhZGF0YUNoYW5nZXMiLCJvbGRJbmRleCIsIm5ld0luZGV4IiwidWYiLCJjZiIsImFmIiwiQWYiLCJoZiIsImxmIiwiamEiLCJmZiIsImRmIiwid2YiLCJXYSIsIm1mIiwiRWYiLCJnZiIsInlmIiwicGYiLCJJZiIsIlRmIiwiSmEiLCJnZXRPdmVybGF5ZWREb2N1bWVudHMiLCJhZGRNdXRhdGlvbkJhdGNoIiwiYXBwbHlUb0xvY2FsRG9jdW1lbnRTZXQiLCJ2ZiIsIlJmIiwiYXZnIiwic3VtIiwic3RydWN0dXJlZEFnZ3JlZ2F0aW9uUXVlcnkiLCJhZ2dyZWdhdGlvbnMiLCJhZ2dyZWdhdGVGaWVsZHMiLCJQZiIsImJmIiwidGFiTWFuYWdlciIsIiRmIiwiVmYiLCJTZiIsIkRmIiwiQ2YiLCJ4ZiIsIk5mIiwia2YiLCJNZiIsIk9mIiwiRmYiLCJCZiIsIl9jb21taXRIYW5kbGVyIiwiX211dGF0aW9ucyIsIl9jb21taXR0ZWQiLCJfZGF0YVJlYWRlciIsIl92ZXJpZnlOb3RDb21taXR0ZWQiLCJMZiIsInFmIiwiX3RyYW5zYWN0aW9uIiwibG9va3VwIiwiVWYiLCJydW4iLCJLZiIsIkdmIiwiUWYiLCJqZiIsInpmIiwiV2YiLCJIZiIsImluZGV4ZXMiLCJKZiIsImFycmF5Q29uZmlnIiwib3JkZXIiLCJhZGRGaWVsZEluZGV4IiwiZGVsZXRlRmllbGRJbmRleCIsIlphIiwic2V0TXVsdGlwbGVJbnN0YW5jZXMiLCJpZGJQcm94eWFibGVUeXBlcyIsImN1cnNvckFkdmFuY2VNZXRob2RzIiwiY3Vyc29yUmVxdWVzdE1hcCIsInRyYW5zYWN0aW9uRG9uZU1hcCIsInRyYW5zYWN0aW9uU3RvcmVOYW1lc01hcCIsInRyYW5zZm9ybUNhY2hlIiwicmV2ZXJzZVRyYW5zZm9ybUNhY2hlIiwiaWRiUHJveHlUcmFwcyIsIklEQlRyYW5zYWN0aW9uIiwid3JhcCIsIndyYXBGdW5jdGlvbiIsImZ1bmMiLCJJREJEYXRhYmFzZSIsIklEQkN1cnNvciIsImFkdmFuY2UiLCJjb250aW51ZVByaW1hcnlLZXkiLCJ1bndyYXAiLCJzdG9yZU5hbWVzIiwidHgiLCJ0cmFuc2Zvcm1DYWNoYWJsZVZhbHVlIiwidW5saXN0ZW4iLCJjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24iLCJJREJPYmplY3RTdG9yZSIsIklEQkluZGV4IiwiUHJveHkiLCJJREJSZXF1ZXN0Iiwic3VjY2VzcyIsInByb21pc2lmeVJlcXVlc3QiLCJyZWFkTWV0aG9kcyIsIndyaXRlTWV0aG9kcyIsImNhY2hlZE1ldGhvZHMiLCJnZXRNZXRob2QiLCJ0YXJnZXRGdW5jTmFtZSIsInVzZUluZGV4IiwiaXNXcml0ZSIsInN0b3JlTmFtZSIsIm9sZFRyYXBzIiwiUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCIsImdldFByb3ZpZGVycyIsImNvbXBvbmVudCIsImdldENvbXBvbmVudCIsImlzVmVyc2lvblNlcnZpY2VQcm92aWRlciIsImxpYnJhcnkiLCJsb2dTdHJpbmciLCJuYW1lJG8iLCJsb2dnZXIiLCJERUZBVUxUX0VOVFJZX05BTUUiLCJQTEFURk9STV9MT0dfU1RSSU5HIiwiX2FwcHMiLCJfY29tcG9uZW50cyIsIl9hZGRDb21wb25lbnQiLCJhZGRDb21wb25lbnQiLCJfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQiLCJhZGRPck92ZXJ3cml0ZUNvbXBvbmVudCIsIl9yZWdpc3RlckNvbXBvbmVudCIsImNvbXBvbmVudE5hbWUiLCJfZ2V0UHJvdmlkZXIiLCJoZWFydGJlYXRDb250cm9sbGVyIiwidHJpZ2dlckhlYXJ0YmVhdCIsIl9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UiLCJjbGVhckluc3RhbmNlIiwiX2NsZWFyQ29tcG9uZW50cyIsIkVSUk9SUyIsIkVSUk9SX0ZBQ1RPUlkiLCJfaXNEZWxldGVkIiwiX29wdGlvbnMiLCJfY29uZmlnIiwiX25hbWUiLCJfYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkIiwiYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkIiwiX2NvbnRhaW5lciIsImNoZWNrRGVzdHJveWVkIiwidmFsIiwiaXNEZWxldGVkIiwiU0RLX1ZFUlNJT04iLCJpbml0aWFsaXplQXBwIiwicmF3Q29uZmlnIiwiZXhpc3RpbmdBcHAiLCJuZXdBcHAiLCJnZXRBcHAiLCJnZXRBcHBzIiwiZGVsZXRlQXBwIiwicmVnaXN0ZXJWZXJzaW9uIiwibGlicmFyeUtleU9yTmFtZSIsInZhcmlhbnQiLCJsaWJyYXJ5TWlzbWF0Y2giLCJ2ZXJzaW9uTWlzbWF0Y2giLCJ3YXJuaW5nIiwib25Mb2ciLCJsb2dDYWxsYmFjayIsIlNUT1JFX05BTUUiLCJkYlByb21pc2UiLCJnZXREYlByb21pc2UiLCJibG9ja2VkIiwidXBncmFkZSIsImJsb2NraW5nIiwidGVybWluYXRlZCIsIm9wZW5Qcm9taXNlIiwib3BlbkRCIiwib3JpZ2luYWxFcnJvck1lc3NhZ2UiLCJ3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQiIsImhlYXJ0YmVhdE9iamVjdCIsImNvbXB1dGVLZXkiLCJpZGJHZXRFcnJvciIsIl9oZWFydGJlYXRzQ2FjaGUiLCJfc3RvcmFnZSIsIl9oZWFydGJlYXRzQ2FjaGVQcm9taXNlIiwiYWdlbnQiLCJnZXRQbGF0Zm9ybUluZm9TdHJpbmciLCJnZXRVVENEYXRlU3RyaW5nIiwibGFzdFNlbnRIZWFydGJlYXREYXRlIiwiaGVhcnRiZWF0cyIsInNpbmdsZURhdGVIZWFydGJlYXQiLCJoYlRpbWVzdGFtcCIsInZhbHVlT2YiLCJvdmVyd3JpdGUiLCJoZWFydGJlYXRzVG9TZW5kIiwidW5zZW50RW50cmllcyIsImhlYXJ0YmVhdHNDYWNoZSIsIm1heFNpemUiLCJoZWFydGJlYXRFbnRyeSIsImhiIiwiZGF0ZXMiLCJjb3VudEJ5dGVzIiwiZXh0cmFjdEhlYXJ0YmVhdHNGb3JIZWFkZXIiLCJoZWFkZXJTdHJpbmciLCJfY2FuVXNlSW5kZXhlZERCUHJvbWlzZSIsInJ1bkluZGV4ZWREQkVudmlyb25tZW50Q2hlY2siLCJyZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIiLCJoZWFydGJlYXRzT2JqZWN0IiwiZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0IiwiY29tbW9uanNHbG9iYWwiLCJnbG9iYWxUaGlzIiwiZXNtIiwiZ29vZyIsInVuc2hpZnQiLCJkZWZhdWx0UHJldmVudGVkIiwieSIsInBhcnNlRmxvYXQiLCJyZWxhdGVkVGFyZ2V0IiwiYnV0dG9uIiwic2NyZWVuWSIsInNjcmVlblgiLCJjbGllbnRZIiwiY2xpZW50WCIsIm1ldGFLZXkiLCJzaGlmdEtleSIsImFsdEtleSIsImN0cmxLZXkiLCJwb2ludGVySWQiLCJwb2ludGVyVHlwZSIsImNoYW5nZWRUb3VjaGVzIiwic3JjRWxlbWVudCIsIm5vZGVOYW1lIiwiZnJvbUVsZW1lbnQiLCJ0b0VsZW1lbnQiLCJwYWdlWCIsInBhZ2VZIiwiMiIsIjMiLCI0IiwicHJldmVudERlZmF1bHQiLCJyZXR1cm5WYWx1ZSIsInNyYyIsImNhcHR1cmUiLCJvbmNlIiwiYWIiLCJiYiIsImViIiwiYXR0YWNoRXZlbnQiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiZ2IiLCJkZXRhY2hFdmVudCIsImliIiwiZmIiLCJqYiIsImxiIiwibWIiLCJvYiIsInBiIiwicWIiLCJyYiIsInNiIiwidGIiLCJ2YiIsInViIiwid2IiLCJ4YiIsInliIiwiQWIiLCJ6YiIsIkJiIiwiQ2IiLCJEYiIsIkZiIiwiR2IiLCJKYiIsIkUiLCJMYiIsIk1iIiwiTmIiLCJPYiIsIlBiIiwiUWIiLCJSYiIsIlNiIiwiRWIiLCJJYiIsIlRiIiwiS2IiLCIkYiIsIlViIiwiVmIiLCJXYiIsIlhiIiwiSGIiLCJZYiIsIlpiIiwiWE1MSHR0cFJlcXVlc3QiLCJuYiIsImdldFJlc3BvbnNlSGVhZGVyIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwidHJpbSIsImFicyIsImRlY29kZVVSSSIsImVuY29kZVVSSSIsImFkIiwiY2QiLCJkZCIsIlBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyIsInBlcmZvcm1hbmNlIiwiZ2V0RW50cmllc0J5VHlwZSIsIm5leHRIb3BQcm90b2NvbCIsImVkIiwiZmQiLCJoZCIsImtkIiwibGQiLCJtZCIsIm5kIiwicmVzcG9uc2VUeXBlIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzVGV4dCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInFkIiwib2QiLCJSZXF1ZXN0IiwiYXJyYXlCdWZmZXIiLCJ0ZXh0Iiwic2V0UmVxdWVzdEhlYWRlciIsImFwcGVuZCIsInJkIiwic2QiLCJ0ZCIsInVkIiwidmQiLCJ5ZCIsInpkIiwiQWQiLCJ3ZCIsIm1velJlc3BvbnNlQXJyYXlCdWZmZXIiLCJCZCIsIkNkIiwiRGQiLCJFZCIsImNvbmN1cnJlbnRSZXF1ZXN0TGltaXQiLCJmYXN0SGFuZHNoYWtlIiwiRmQiLCJHZCIsInNlbmRCZWFjb24iLCJJbWFnZSIsIkhkIiwiTGQiLCJLZCIsIkpkIiwiTWQiLCJJZCIsImlzQWN0aXZlIiwiamQiLCJOZCIsIk9kIiwibWVzc2FnZUhlYWRlcnMiLCJjbGllbnRQcm90b2NvbEhlYWRlclJlcXVpcmVkIiwibWVzc2FnZUNvbnRlbnRUeXBlIiwiUGQiLCJfX2hlYWRlcnNfXyIsInN0YXR1c0NvZGUiLCJfX3N0YXR1c19fIiwiX19zbV9fIiwiUWQiLCJibG9ja1NpemUiLCJTZCIsInRvVXBwZXJDYXNlIiwiRm9ybURhdGEiLCJ3aXRoQ3JlZGVudGlhbHMiLCJ4ZCIsImtiIiwiX19kYXRhX18iLCJUZCIsIlVkIiwiV2QiLCJYZCIsIlpkIiwiJGQiLCJZZCIsIkxOMiIsInhvciIsImdldExhc3RFcnJvciIsIlZkIiwiY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCIsImdldFN0YXRFdmVudFRhcmdldCIsIkVycm9yQ29kZSIsIkV2ZW50IiwiU3RhdCIsIkZldGNoWG1sSHR0cEZhY3RvcnkiLCJXZWJDaGFubmVsIiwiWGhySW8iLCJNZDUiLCJJbnRlZ2VyIiwiaW5zdGFuY2VzIiwiTG9nTGV2ZWwiLCJsZXZlbFN0cmluZ1RvRW51bSIsIlZFUkJPU0UiLCJJTkZPIiwiU0lMRU5UIiwiZGVmYXVsdExvZ0xldmVsIiwiQ29uc29sZU1ldGhvZCIsImRlZmF1bHRMb2dIYW5kbGVyIiwibG9nVHlwZSIsIkxvZ2dlciIsIl9sb2dMZXZlbCIsIl9sb2dIYW5kbGVyIiwiX3VzZXJMb2dIYW5kbGVyIiwiVHlwZUVycm9yIiwibGV2ZWwiLCJpbnN0Iiwic2V0VXNlckxvZ0hhbmRsZXIiLCJjdXN0b21Mb2dMZXZlbCIsInVzZXJMb2dIYW5kbGVyIiwiYXJnIiwiaWdub3JlZCIsIkNvbXBvbmVudCIsImluc3RhbmNlRmFjdG9yeSIsIm11bHRpcGxlSW5zdGFuY2VzIiwic2VydmljZVByb3BzIiwiaW5zdGFudGlhdGlvbk1vZGUiLCJvbkluc3RhbmNlQ3JlYXRlZCIsInByb3BzIiwiUHJvdmlkZXIiLCJpbnN0YW5jZXNEZWZlcnJlZCIsImluc3RhbmNlc09wdGlvbnMiLCJvbkluaXRDYWxsYmFja3MiLCJub3JtYWxpemVkSWRlbnRpZmllciIsIm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllciIsInNob3VsZEF1dG9Jbml0aWFsaXplIiwiZ2V0T3JJbml0aWFsaXplU2VydmljZSIsImlzQ29tcG9uZW50RWFnZXIiLCJpbnN0YW5jZURlZmVycmVkIiwic2VydmljZXMiLCJvcHRzIiwiaXNDb21wb25lbnRTZXQiLCJleGlzdGluZ0NhbGxiYWNrcyIsImNhbGxiYWNrcyIsImludm9rZU9uSW5pdENhbGxiYWNrcyIsIkNvbXBvbmVudENvbnRhaW5lciIsInByb3ZpZGVycyIsInNldENvbXBvbmVudCIsIkZpcmViYXNlQXBwSW1wbCIsInJlbW92ZUFwcCIsImZpcmViYXNlJDEiLCJjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZSIsIm5hbWVzcGFjZSIsImZpcmViYXNlQXBwSW1wbCIsImFwcHMiLCJhcHBDb21wYXQiLCJyZWdpc3RlckNvbXBvbmVudCIsImNvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0Iiwic2VydmljZU5hbWVzcGFjZSIsImFwcEFyZyIsIl9nZXRTZXJ2aWNlIiwidXNlQXNTZXJ2aWNlIiwibW9kdWxhckFQSXMiLCJjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZUNvcmUiLCJleHRlbmROYW1lc3BhY2UiLCJzZGtWZXJzaW9uIiwicm5kczgiLCJybmRzIiwiYnl0ZVRvSGV4IiwiYnRoIiwiY2FjaGVkU2V0VGltZW91dCIsImNhY2hlZENsZWFyVGltZW91dCIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsImN1cnJlbnRRdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwiYXJyYXkiLCJuZXh0VGljayIsInRpdGxlIiwiYXJndiIsInZlcnNpb25zIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZW1pdCIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJiaW5kaW5nIiwiY3dkIiwiY2hkaXIiLCJ1bWFzayIsInNoYXJkSWQiLCJzaGFyZHMiLCJub3RpZnlQcm9taXNlIiwidXVpZCIsInY0Iiwic2V0VGltZSIsImV4cGlyZXMiLCJnZXRTaGFyZElkIiwic2hhcmRzUmVmIiwiY29sbGVjdGlvbiIsInZhbHVlUHJvbWlzZXMiLCJvYnNlcnZhYmxlIiwib25TbmFwc2hvdCIsInNuYXAiLCJyZWYiLCJGaWVsZFZhbHVlIiwic2hhcmRSZWYiLCJzZXREb2MiLCJ2MSIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJybmciLCJieXRlc1RvVXVpZCIsIl9sYXN0TVNlY3MiLCJfbGFzdE5TZWNzIiwiY2xvY2tzZXEiLCJzZWVkQnl0ZXMiLCJtc2VjcyIsIm5zZWNzIiwidG1oIiwiX2lzQW5kcm9pZE9ySW9zQ29yZG92YVNjaGVtZSIsIl9pc0xvY2FsU3RvcmFnZU5vdFN5bmNocm9uaXplZCIsIl9pc0VkZ2UiLCJfaXNXZWJTdG9yYWdlU3VwcG9ydGVkIiwiX2lzUG9wdXBSZWRpcmVjdFN1cHBvcnRlZCIsIl9pc0xpa2VseUNvcmRvdmEiLCJQZXJzaXN0ZW5jZSIsIkxPQ0FMIiwiTk9ORSIsIlNFU1NJT04iLCJfYXNzZXJ0JDMiLCJfc2F2ZVBlcnNpc3RlbmNlRm9yUmVkaXJlY3QiLCJnZXRTZXNzaW9uU3RvcmFnZUlmQXZhaWxhYmxlIiwiX2dldFBlcnNpc3RlbmNlIiwiX2Fzc2VydCQyIiwiQ29tcGF0UG9wdXBSZWRpcmVjdFJlc29sdmVyIiwiYnJvd3NlclJlc29sdmVyIiwiY29yZG92YVJlc29sdmVyIiwidW5kZXJseWluZ1Jlc29sdmVyIiwic2VsZWN0VW5kZXJseWluZ1Jlc29sdmVyIiwiYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIiLCJpc0NvcmRvdmEiLCJ0aW1lb3V0SWQiLCJfaXNDb3Jkb3ZhIiwiY3JlZGVudGlhbEZyb21PYmplY3QiLCJjcmVkZW50aWFsRnJvbVJlc3VsdCIsImNyZWRlbnRpYWxGcm9tRXJyb3IiLCJjb252ZXJ0Q3JlZGVudGlhbCIsImNyZWRlbnRpYWxQcm9taXNlIiwiTXVsdGlGYWN0b3JSZXNvbHZlciIsImNyZWRFcnIiLCJhdHRhY2hFeHRyYUVycm9yRmllbGRzIiwiYWRkaXRpb25hbFVzZXJJbmZvIiwiVXNlciIsImdldE9yQ3JlYXRlIiwiY29udmVydENvbmZpcm1hdGlvblJlc3VsdCIsImNvbmZpcm1hdGlvblJlc3VsdFByb21pc2UiLCJjb25maXJtYXRpb25SZXN1bHRFeHAiLCJjb25maXJtIiwid3JhcHBlZCIsInJlc29sdmVTaWduSW4iLCJVU0VSX01BUCIsInBob25lQ3JlZGVudGlhbCIsIl9hc3NlcnQkMSIsIkF1dGgiLCJsaW5rVW5kZXJseWluZ0F1dGgiLCJidWlsZFBlcnNpc3RlbmNlSGllcmFyY2h5IiwidXNlRGV2aWNlTGFuZ3VhZ2UiLCJlcnJvckZuIiwid3JhcE9ic2VydmVycyIsIm9uQXV0aFN0YXRlQ2hhbmdlZCIsImNvbnZlcnRlZCIsIl92YWxpZGF0ZVBlcnNpc3RlbmNlQXJndW1lbnQiLCJ1cGRhdGVDdXJyZW50VXNlciIsIm9sZE5leHQiLCJwZXJzaXN0ZW5jZXMiLCJfZ2V0UGVyc2lzdGVuY2VzRnJvbVJlZGlyZWN0IiwiUGhvbmVBdXRoUHJvdmlkZXIiLCJ2ZXJpZnlQaG9uZU51bWJlciIsImF1dGhQcm92aWRlciIsInNldFNlcnZpY2VQcm9wcyIsIkFjdGlvbkNvZGVJbmZvIiwiT3BlcmF0aW9uIiwidmFsaWRhdGVTZXRPcHRpb25zIiwiYXNzZXJ0VWludDhBcnJheUF2YWlsYWJsZSIsImFzc2VydEJhc2U2NEF2YWlsYWJsZSIsIm90aGVyIiwiaXNQYXJ0aWFsT2JzZXJ2ZXIiLCJkYXRhYmFzZUlkT3JBcHAiLCJfcGVyc2lzdGVuY2VQcm92aWRlciIsIl9hcHBDb21wYXQiLCJzZXR0aW5nc0xpdGVyYWwiLCJjdXJyZW50U2V0dGluZ3MiLCJleHBlcmltZW50YWxGb3JjZU93bmluZ1RhYiIsImVuYWJsZU11bHRpVGFiSW5kZXhlZERiUGVyc2lzdGVuY2UiLCJlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSIsImNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UiLCJwYXRoU3RyaW5nIiwicmVwbGFjZUZ1bmN0aW9uTmFtZSIsIldyaXRlQmF0Y2giLCJidW5kbGVEYXRhIiwiZXhwUXVlcnkiLCJmb3JLZXkiLCJkb2N1bWVudFJlZiIsImNhc3RSZWZlcmVuY2UiLCJkYXRhT3JGaWVsZCIsIm1vcmVGaWVsZHNBbmRWYWx1ZXMiLCJleHBTbmFwc2hvdCIsIm1vZGVsT2JqZWN0IiwiY29udmVydGVyTWFwQnlGaXJlc3RvcmUiLCJJTlNUQU5DRVMiLCJ1bnR5cGVkQ29udmVydGVyQnlDb252ZXJ0ZXIiLCJmaWVsZE9yVXBkYXRlRGF0YSIsImV4dHJhY3RTbmFwc2hvdE9wdGlvbnMiLCJ3cmFwT2JzZXJ2ZXIiLCJ3aXRoQ29udmVydGVyIiwiZ2V0SW5zdGFuY2UiLCJ1cGRhdGVkIiwid3JhcHBlciIsInVzZXJPYnNlcnZlciIsIm9wU3RyIiwiZGlyZWN0aW9uU3RyIiwiRG9jdW1lbnRDaGFuZ2UiLCJkb2NDaGFuZ2UiLCJ0aGlzQXJnIiwiZG9jUmVmIiwiZG9jdW1lbnRQYXRoIiwiZmllbGROYW1lcyIsImRlbGVnYXRlIiwiZmlyZXN0b3JlTmFtZXNwYWNlIiwiRmlyZXN0b3JlIiwiR2VvUG9pbnQiLCJUaW1lc3RhbXAiLCJCbG9iIiwiVHJhbnNhY3Rpb24iLCJEb2N1bWVudFJlZmVyZW5jZSIsIkRvY3VtZW50U25hcHNob3QiLCJRdWVyeSIsIlF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCIsIlF1ZXJ5U25hcHNob3QiLCJDb2xsZWN0aW9uUmVmZXJlbmNlIiwiRmllbGRQYXRoIiwiQ0FDSEVfU0laRV9VTkxJTUlURUQiLCJmaXJlc3RvcmVGYWN0b3J5IiwiZmlyZXN0b3JlRXhwIl0sIm1hcHBpbmdzIjoid0JBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBMERmLE9BckRBRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxF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eXlGLEVBQWlCOTJGLEVBQUsrMkYsSUFDOUIsVUFBVWhFLGdCQUFnQno0RyxPQUFPOEksT0FBTyxHQUFJNHlHLEtBeUIvQ2hwRyxFQUFTcXJGLGdCQTE5QkEsNkJBQ0ciLCJmaWxlIjoic2hhcmRlZC1jb3VudGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEyKTtcbiIsIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBAZmlsZW92ZXJ2aWV3IEZpcmViYXNlIGNvbnN0YW50cy4gIFNvbWUgb2YgdGhlc2UgKEBkZWZpbmVzKSBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBjb21waWxlLXRpbWUuXHJcbiAqL1xyXG5jb25zdCBDT05TVEFOVFMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgY2xpZW50IE5vZGUuanMgU0RLLlxyXG4gICAgICovXHJcbiAgICBOT0RFX0NMSUVOVDogZmFsc2UsXHJcbiAgICAvKipcclxuICAgICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgQWRtaW4gTm9kZS5qcyBTREsuXHJcbiAgICAgKi9cclxuICAgIE5PREVfQURNSU46IGZhbHNlLFxyXG4gICAgLyoqXHJcbiAgICAgKiBGaXJlYmFzZSBTREsgVmVyc2lvblxyXG4gICAgICovXHJcbiAgICBTREtfVkVSU0lPTjogJyR7SlNDT1JFX1ZFUlNJT059J1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBwcm92aWRlZCBhc3NlcnRpb24gaXMgZmFsc3lcclxuICovXHJcbmNvbnN0IGFzc2VydCA9IGZ1bmN0aW9uIChhc3NlcnRpb24sIG1lc3NhZ2UpIHtcclxuICAgIGlmICghYXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgdGhyb3cgYXNzZXJ0aW9uRXJyb3IobWVzc2FnZSk7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuXHJcbiAqL1xyXG5jb25zdCBhc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gbmV3IEVycm9yKCdGaXJlYmFzZSBEYXRhYmFzZSAoJyArXHJcbiAgICAgICAgQ09OU1RBTlRTLlNES19WRVJTSU9OICtcclxuICAgICAgICAnKSBJTlRFUk5BTCBBU1NFUlQgRkFJTEVEOiAnICtcclxuICAgICAgICBtZXNzYWdlKTtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkkMSA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZiAoYyA8IDEyOCkge1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IGM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPCAyMDQ4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gNikgfCAxOTI7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmXHJcbiAgICAgICAgICAgIGkgKyAxIDwgc3RyLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XHJcbiAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXHJcbiAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM2ZmKSA8PCAxMCkgKyAoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNmZik7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcbi8qKlxyXG4gKiBUdXJucyBhbiBhcnJheSBvZiBudW1iZXJzIGludG8gdGhlIHN0cmluZyBnaXZlbiBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcclxuICogY2hhcmFjdGVycyB0byB3aGljaCB0aGUgbnVtYmVycyBjb3JyZXNwb25kLlxyXG4gKiBAcGFyYW0gYnl0ZXMgQXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRpbmcgY2hhcmFjdGVycy5cclxuICogQHJldHVybiBTdHJpbmdpZmljYXRpb24gb2YgdGhlIGFycmF5LlxyXG4gKi9cclxuY29uc3QgYnl0ZUFycmF5VG9TdHJpbmcgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcclxuICAgIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwb3MgPSAwLCBjID0gMDtcclxuICAgIHdoaWxlIChwb3MgPCBieXRlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjMSA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICBpZiAoYzEgPCAxMjgpIHtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYzEgPiAxOTEgJiYgYzEgPCAyMjQpIHtcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMxICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYzEgPiAyMzkgJiYgYzEgPCAzNjUpIHtcclxuICAgICAgICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBjb25zdCBjNCA9IGJ5dGVzW3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgdSA9ICgoKGMxICYgNykgPDwgMTgpIHwgKChjMiAmIDYzKSA8PCAxMikgfCAoKGMzICYgNjMpIDw8IDYpIHwgKGM0ICYgNjMpKSAtXHJcbiAgICAgICAgICAgICAgICAweDEwMDAwO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkODAwICsgKHUgPj4gMTApKTtcclxuICAgICAgICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZGMwMCArICh1ICYgMTAyMykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xyXG4gICAgICAgICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjMSAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0LmpvaW4oJycpO1xyXG59O1xyXG4vLyBXZSBkZWZpbmUgaXQgYXMgYW4gb2JqZWN0IGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNsYXNzIGJlY2F1c2UgYSBjbGFzcyBjb21waWxlZCBkb3duIHRvIGVzNSBjYW4ndFxyXG4vLyBiZSB0cmVlc2hha2VkLiBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTY5MVxyXG4vLyBTdGF0aWMgbG9va3VwIG1hcHMsIGxhemlseSBwb3B1bGF0ZWQgYnkgaW5pdF8oKVxyXG5jb25zdCBiYXNlNjQgPSB7XHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYnl0ZXMgdG8gY2hhcmFjdGVycy5cclxuICAgICAqL1xyXG4gICAgYnl0ZVRvQ2hhck1hcF86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgY2hhcmFjdGVycyB0byBieXRlcy5cclxuICAgICAqL1xyXG4gICAgY2hhclRvQnl0ZU1hcF86IG51bGwsXHJcbiAgICAvKipcclxuICAgICAqIE1hcHMgYnl0ZXMgdG8gd2Vic2FmZSBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgYnl0ZVRvQ2hhck1hcFdlYlNhZmVfOiBudWxsLFxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXBzIHdlYnNhZmUgY2hhcmFjdGVycyB0byBieXRlcy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogbnVsbCxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQsIHNoYXJlZCBiZXR3ZWVuXHJcbiAgICAgKiBFTkNPREVEX1ZBTFMgYW5kIEVOQ09ERURfVkFMU19XRUJTQUZFXHJcbiAgICAgKi9cclxuICAgIEVOQ09ERURfVkFMU19CQVNFOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICsgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyArICcwMTIzNDU2Nzg5JyxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQuIFZhbHVlIDY0ICg9KSBpcyBzcGVjaWFsOyBpdCBtZWFucyBcIm5vdGhpbmcuXCJcclxuICAgICAqL1xyXG4gICAgZ2V0IEVOQ09ERURfVkFMUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICcrLz0nO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogT3VyIHdlYnNhZmUgYWxwaGFiZXQuXHJcbiAgICAgKi9cclxuICAgIGdldCBFTkNPREVEX1ZBTFNfV0VCU0FGRSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICctXy4nO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgdGhlIGF0b2IgYW5kIGJ0b2EgZnVuY3Rpb25zLiBUaGlzIGV4dGVuc2lvblxyXG4gICAgICogc3RhcnRlZCBhdCBNb3ppbGxhIGJ1dCBpcyBub3cgaW1wbGVtZW50ZWQgYnkgbWFueSBicm93c2Vycy4gV2UgdXNlIHRoZVxyXG4gICAgICogQVNTVU1FXyogdmFyaWFibGVzIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgdXNlcmFnZW50IGRldGVjdGlvbiBsaWJyYXJ5XHJcbiAgICAgKiBidXQgc3RpbGwgYWxsb3dpbmcgdGhlIHN0YW5kYXJkIHBlci1icm93c2VyIGNvbXBpbGF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIEhBU19OQVRJVkVfU1VQUE9SVDogdHlwZW9mIGF0b2IgPT09ICdmdW5jdGlvbicsXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1lbmNvZGUgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IEFuIGFycmF5IG9mIGJ5dGVzIChudW1iZXJzIHdpdGhcclxuICAgICAqICAgICB2YWx1ZSBpbiBbMCwgMjU1XSkgdG8gZW5jb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgQm9vbGVhbiBpbmRpY2F0aW5nIHdlIHNob3VsZCB1c2UgdGhlXHJcbiAgICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXHJcbiAgICAgKiBAcmV0dXJuIFRoZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIGVuY29kZUJ5dGVBcnJheShpbnB1dCwgd2ViU2FmZSkge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2VuY29kZUJ5dGVBcnJheSB0YWtlcyBhbiBhcnJheSBhcyBhIHBhcmFtZXRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRfKCk7XHJcbiAgICAgICAgY29uc3QgYnl0ZVRvQ2hhck1hcCA9IHdlYlNhZmVcclxuICAgICAgICAgICAgPyB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1xyXG4gICAgICAgICAgICA6IHRoaXMuYnl0ZVRvQ2hhck1hcF87XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMSA9IGlucHV0W2ldO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTIgPSBpICsgMSA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTIgPSBoYXZlQnl0ZTIgPyBpbnB1dFtpICsgMV0gOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpICsgMiA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTMgPSBoYXZlQnl0ZTMgPyBpbnB1dFtpICsgMl0gOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBvdXRCeXRlMSA9IGJ5dGUxID4+IDI7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dEJ5dGUyID0gKChieXRlMSAmIDB4MDMpIDw8IDQpIHwgKGJ5dGUyID4+IDQpO1xyXG4gICAgICAgICAgICBsZXQgb3V0Qnl0ZTMgPSAoKGJ5dGUyICYgMHgwZikgPDwgMikgfCAoYnl0ZTMgPj4gNik7XHJcbiAgICAgICAgICAgIGxldCBvdXRCeXRlNCA9IGJ5dGUzICYgMHgzZjtcclxuICAgICAgICAgICAgaWYgKCFoYXZlQnl0ZTMpIHtcclxuICAgICAgICAgICAgICAgIG91dEJ5dGU0ID0gNjQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhdmVCeXRlMikge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dEJ5dGUzID0gNjQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMV0sIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTJdLCBieXRlVG9DaGFyTWFwW291dEJ5dGUzXSwgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlNF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQmFzZTY0LWVuY29kZSBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgQSBzdHJpbmcgdG8gZW5jb2RlLlxyXG4gICAgICogQHBhcmFtIHdlYlNhZmUgSWYgdHJ1ZSwgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgZW5jb2RlU3RyaW5nKGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgLy8gU2hvcnRjdXQgZm9yIE1vemlsbGEgYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnRcclxuICAgICAgICAvLyBhIG5hdGl2ZSBiYXNlNjQgZW5jb2RlciBpbiB0aGUgZm9ybSBvZiBcImJ0b2EvYXRvYlwiXHJcbiAgICAgICAgaWYgKHRoaXMuSEFTX05BVElWRV9TVVBQT1JUICYmICF3ZWJTYWZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBidG9hKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlQnl0ZUFycmF5KHN0cmluZ1RvQnl0ZUFycmF5JDEoaW5wdXQpLCB3ZWJTYWZlKTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1kZWNvZGUgYSBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlucHV0IHRvIGRlY29kZS5cclxuICAgICAqIEBwYXJhbSB3ZWJTYWZlIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGVcclxuICAgICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cclxuICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZGVjb2RlU3RyaW5nKGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgLy8gU2hvcnRjdXQgZm9yIE1vemlsbGEgYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnRcclxuICAgICAgICAvLyBhIG5hdGl2ZSBiYXNlNjQgZW5jb2RlciBpbiB0aGUgZm9ybSBvZiBcImJ0b2EvYXRvYlwiXHJcbiAgICAgICAgaWYgKHRoaXMuSEFTX05BVElWRV9TVVBQT1JUICYmICF3ZWJTYWZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhdG9iKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ5dGVBcnJheVRvU3RyaW5nKHRoaXMuZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpKTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEJhc2U2NC1kZWNvZGUgYSBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogSW4gYmFzZS02NCBkZWNvZGluZywgZ3JvdXBzIG9mIGZvdXIgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhyZWVcclxuICAgICAqIGJ5dGVzLiAgSWYgdGhlIGVuY29kZXIgZGlkIG5vdCBhcHBseSBwYWRkaW5nLCB0aGUgaW5wdXQgbGVuZ3RoIG1heSBub3RcclxuICAgICAqIGJlIGEgbXVsdGlwbGUgb2YgNC5cclxuICAgICAqXHJcbiAgICAgKiBJbiB0aGlzIGNhc2UsIHRoZSBsYXN0IGdyb3VwIHdpbGwgaGF2ZSBmZXdlciB0aGFuIDQgY2hhcmFjdGVycywgYW5kXHJcbiAgICAgKiBwYWRkaW5nIHdpbGwgYmUgaW5mZXJyZWQuICBJZiB0aGUgZ3JvdXAgaGFzIG9uZSBvciB0d28gY2hhcmFjdGVycywgaXQgZGVjb2Rlc1xyXG4gICAgICogdG8gb25lIGJ5dGUuICBJZiB0aGUgZ3JvdXAgaGFzIHRocmVlIGNoYXJhY3RlcnMsIGl0IGRlY29kZXMgdG8gdHdvIGJ5dGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpbnB1dCBJbnB1dCB0byBkZWNvZGUuXHJcbiAgICAgKiBAcGFyYW0gd2ViU2FmZSBUcnVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIHdlYi1zYWZlIGFscGhhYmV0LlxyXG4gICAgICogQHJldHVybiBieXRlcyByZXByZXNlbnRpbmcgdGhlIGRlY29kZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlY29kZVN0cmluZ1RvQnl0ZUFycmF5KGlucHV0LCB3ZWJTYWZlKSB7XHJcbiAgICAgICAgdGhpcy5pbml0XygpO1xyXG4gICAgICAgIGNvbnN0IGNoYXJUb0J5dGVNYXAgPSB3ZWJTYWZlXHJcbiAgICAgICAgICAgID8gdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV9cclxuICAgICAgICAgICAgOiB0aGlzLmNoYXJUb0J5dGVNYXBfO1xyXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOykge1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMSA9IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkrKyldO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTIgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlMiA9IGhhdmVCeXRlMiA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDA7XHJcbiAgICAgICAgICAgICsraTtcclxuICAgICAgICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSA8IGlucHV0Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgYnl0ZTMgPSBoYXZlQnl0ZTMgPyBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKV0gOiA2NDtcclxuICAgICAgICAgICAgKytpO1xyXG4gICAgICAgICAgICBjb25zdCBoYXZlQnl0ZTQgPSBpIDwgaW5wdXQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBieXRlNCA9IGhhdmVCeXRlNCA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xyXG4gICAgICAgICAgICArK2k7XHJcbiAgICAgICAgICAgIGlmIChieXRlMSA9PSBudWxsIHx8IGJ5dGUyID09IG51bGwgfHwgYnl0ZTMgPT0gbnVsbCB8fCBieXRlNCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBvdXRCeXRlMSA9IChieXRlMSA8PCAyKSB8IChieXRlMiA+PiA0KTtcclxuICAgICAgICAgICAgb3V0cHV0LnB1c2gob3V0Qnl0ZTEpO1xyXG4gICAgICAgICAgICBpZiAoYnl0ZTMgIT09IDY0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRCeXRlMiA9ICgoYnl0ZTIgPDwgNCkgJiAweGYwKSB8IChieXRlMyA+PiAyKTtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUyKTtcclxuICAgICAgICAgICAgICAgIGlmIChieXRlNCAhPT0gNjQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRCeXRlMyA9ICgoYnl0ZTMgPDwgNikgJiAweGMwKSB8IGJ5dGU0O1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogTGF6eSBzdGF0aWMgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIENhbGxlZCBiZWZvcmVcclxuICAgICAqIGFjY2Vzc2luZyBhbnkgb2YgdGhlIHN0YXRpYyBtYXAgdmFyaWFibGVzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgaW5pdF8oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmJ5dGVUb0NoYXJNYXBfKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcF8gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwXyA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlXyA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlXyA9IHt9O1xyXG4gICAgICAgICAgICAvLyBXZSB3YW50IHF1aWNrIG1hcHBpbmdzIGJhY2sgYW5kIGZvcnRoLCBzbyB3ZSBwcmVjb21wdXRlIHR3byBtYXBzLlxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuRU5DT0RFRF9WQUxTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBfW2ldID0gdGhpcy5FTkNPREVEX1ZBTFMuY2hhckF0KGkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwX1t0aGlzLmJ5dGVUb0NoYXJNYXBfW2ldXSA9IGk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTX1dFQlNBRkUuY2hhckF0KGkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV9bdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV9baV1dID0gaTtcclxuICAgICAgICAgICAgICAgIC8vIEJlIGZvcmdpdmluZyB3aGVuIGRlY29kaW5nIGFuZCBjb3JyZWN0bHkgZGVjb2RlIGJvdGggZW5jb2RpbmdzLlxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBfW3RoaXMuRU5DT0RFRF9WQUxTX1dFQlNBRkUuY2hhckF0KGkpXSA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV9bdGhpcy5FTkNPREVEX1ZBTFMuY2hhckF0KGkpXSA9IGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBBbiBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBiYXNlNjQgc3RyaW5nLlxyXG4gKi9cclxuY2xhc3MgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9ICdEZWNvZGVCYXNlNjRTdHJpbmdFcnJvcic7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZ1xyXG4gKi9cclxuY29uc3QgYmFzZTY0RW5jb2RlID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgY29uc3QgdXRmOEJ5dGVzID0gc3RyaW5nVG9CeXRlQXJyYXkkMShzdHIpO1xyXG4gICAgcmV0dXJuIGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodXRmOEJ5dGVzLCB0cnVlKTtcclxufTtcclxuLyoqXHJcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyAod2l0aG91dCBcIi5cIiBwYWRkaW5nIGluIHRoZSBlbmQpLlxyXG4gKiBlLmcuIFVzZWQgaW4gSlNPTiBXZWIgVG9rZW4gKEpXVCkgcGFydHMuXHJcbiAqL1xyXG5jb25zdCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgIC8vIFVzZSBiYXNlNjR1cmwgZW5jb2RpbmcgYW5kIHJlbW92ZSBwYWRkaW5nIGluIHRoZSBlbmQgKGRvdCBjaGFyYWN0ZXJzKS5cclxuICAgIHJldHVybiBiYXNlNjRFbmNvZGUoc3RyKS5yZXBsYWNlKC9cXC4vZywgJycpO1xyXG59O1xyXG4vKipcclxuICogVVJMLXNhZmUgYmFzZTY0IGRlY29kaW5nXHJcbiAqXHJcbiAqIE5PVEU6IERPIE5PVCB1c2UgdGhlIGdsb2JhbCBhdG9iKCkgZnVuY3Rpb24gLSBpdCBkb2VzIE5PVCBzdXBwb3J0IHRoZVxyXG4gKiBiYXNlNjRVcmwgdmFyaWFudCBlbmNvZGluZy5cclxuICpcclxuICogQHBhcmFtIHN0ciBUbyBiZSBkZWNvZGVkXHJcbiAqIEByZXR1cm4gRGVjb2RlZCByZXN1bHQsIGlmIHBvc3NpYmxlXHJcbiAqL1xyXG5jb25zdCBiYXNlNjREZWNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2RlU3RyaW5nKHN0ciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Jhc2U2NERlY29kZSBmYWlsZWQ6ICcsIGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBEbyBhIGRlZXAtY29weSBvZiBiYXNpYyBKYXZhU2NyaXB0IE9iamVjdHMgb3IgQXJyYXlzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVlcENvcHkodmFsdWUpIHtcclxuICAgIHJldHVybiBkZWVwRXh0ZW5kKHVuZGVmaW5lZCwgdmFsdWUpO1xyXG59XHJcbi8qKlxyXG4gKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IChyZWN1cnNpdmVseSBhbGxvd3MgZXh0ZW5zaW9uXHJcbiAqIG9mIE9iamVjdHMgYW5kIEFycmF5cykuICBTY2FsYXIgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJlIG92ZXItd3JpdHRlbi5cclxuICogSWYgdGFyZ2V0IGlzIHVuZGVmaW5lZCwgYW4gb2JqZWN0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIHdpbGwgYmUgY3JlYXRlZFxyXG4gKiAoYW5kIHJldHVybmVkKS5cclxuICpcclxuICogV2UgcmVjdXJzaXZlbHkgY29weSBhbGwgY2hpbGQgcHJvcGVydGllcyBvZiBwbGFpbiBPYmplY3RzIGluIHRoZSBzb3VyY2UtIHNvXHJcbiAqIHRoYXQgbmFtZXNwYWNlLSBsaWtlIGRpY3Rpb25hcmllcyBhcmUgbWVyZ2VkLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQgdGhlIHRhcmdldCBjYW4gYmUgYSBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydGllcyBpblxyXG4gKiB0aGUgc291cmNlIE9iamVjdCBhcmUgY29waWVkIG9udG8gaXQgYXMgc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIEZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBOb3RlOiB3ZSBkb24ndCBtZXJnZSBfX3Byb3RvX18gdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWVwRXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XHJcbiAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBPYmplY3QpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoc291cmNlLmNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgY2FzZSBEYXRlOlxyXG4gICAgICAgICAgICAvLyBUcmVhdCBEYXRlcyBsaWtlIHNjYWxhcnM7IGlmIHRoZSB0YXJnZXQgZGF0ZSBvYmplY3QgaGFkIGFueSBjaGlsZFxyXG4gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIC0gdGhleSB3aWxsIGJlIGxvc3QhXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHNvdXJjZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVWYWx1ZS5nZXRUaW1lKCkpO1xyXG4gICAgICAgIGNhc2UgT2JqZWN0OlxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQXJyYXk6XHJcbiAgICAgICAgICAgIC8vIEFsd2F5cyBjb3B5IHRoZSBhcnJheSBzb3VyY2UgYW5kIG92ZXJ3cml0ZSB0aGUgdGFyZ2V0LlxyXG4gICAgICAgICAgICB0YXJnZXQgPSBbXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgLy8gTm90IGEgcGxhaW4gT2JqZWN0IC0gdHJlYXQgaXQgYXMgYSBzY2FsYXIuXHJcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XHJcbiAgICAgICAgLy8gdXNlIGlzVmFsaWRLZXkgdG8gZ3VhcmQgYWdhaW5zdCBwcm90b3R5cGUgcG9sbHV0aW9uLiBTZWUgaHR0cHM6Ly9zbnlrLmlvL3Z1bG4vU05ZSy1KUy1MT0RBU0gtNDUwMjAyXHJcbiAgICAgICAgaWYgKCFzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgIWlzVmFsaWRLZXkocHJvcCkpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhcmdldFtwcm9wXSA9IGRlZXBFeHRlbmQodGFyZ2V0W3Byb3BdLCBzb3VyY2VbcHJvcF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xyXG4gICAgcmV0dXJuIGtleSAhPT0gJ19fcHJvdG9fXyc7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFBvbHlmaWxsIGZvciBgZ2xvYmFsVGhpc2Agb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XHJcbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gd2luZG93O1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbDtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0LicpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGdldERlZmF1bHRzRnJvbUdsb2JhbCA9ICgpID0+IGdldEdsb2JhbCgpLl9fRklSRUJBU0VfREVGQVVMVFNfXztcclxuLyoqXHJcbiAqIEF0dGVtcHQgdG8gcmVhZCBkZWZhdWx0cyBmcm9tIGEgSlNPTiBzdHJpbmcgcHJvdmlkZWQgdG9cclxuICogcHJvY2VzcyguKWVudiguKV9fRklSRUJBU0VfREVGQVVMVFNfXyBvciBhIEpTT04gZmlsZSB3aG9zZSBwYXRoIGlzIGluXHJcbiAqIHByb2Nlc3MoLillbnYoLilfX0ZJUkVCQVNFX0RFRkFVTFRTX1BBVEhfX1xyXG4gKiBUaGUgZG90cyBhcmUgaW4gcGFyZW5zIGJlY2F1c2UgY2VydGFpbiBjb21waWxlcnMgKFZpdGU/KSBjYW5ub3RcclxuICogaGFuZGxlIHNlZWluZyB0aGF0IHZhcmlhYmxlIGluIGNvbW1lbnRzLlxyXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjgzOFxyXG4gKi9cclxuY29uc3QgZ2V0RGVmYXVsdHNGcm9tRW52VmFyaWFibGUgPSAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBwcm9jZXNzLmVudiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWZhdWx0c0pzb25TdHJpbmcgPSBwcm9jZXNzLmVudi5fX0ZJUkVCQVNFX0RFRkFVTFRTX187XHJcbiAgICBpZiAoZGVmYXVsdHNKc29uU3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVmYXVsdHNKc29uU3RyaW5nKTtcclxuICAgIH1cclxufTtcclxuY29uc3QgZ2V0RGVmYXVsdHNGcm9tQ29va2llID0gKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgbWF0Y2g7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKC9fX0ZJUkVCQVNFX0RFRkFVTFRTX189KFteO10rKS8pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBTb21lIGVudmlyb25tZW50cyBzdWNoIGFzIEFuZ3VsYXIgVW5pdmVyc2FsIFNTUiBoYXZlIGFcclxuICAgICAgICAvLyBgZG9jdW1lbnRgIG9iamVjdCBidXQgZXJyb3Igb24gYWNjZXNzaW5nIGBkb2N1bWVudC5jb29raWVgLlxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlY29kZWQgPSBtYXRjaCAmJiBiYXNlNjREZWNvZGUobWF0Y2hbMV0pO1xyXG4gICAgcmV0dXJuIGRlY29kZWQgJiYgSlNPTi5wYXJzZShkZWNvZGVkKTtcclxufTtcclxuLyoqXHJcbiAqIEdldCB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdC4gSXQgY2hlY2tzIGluIG9yZGVyOlxyXG4gKiAoMSkgaWYgc3VjaCBhbiBvYmplY3QgZXhpc3RzIGFzIGEgcHJvcGVydHkgb2YgYGdsb2JhbFRoaXNgXHJcbiAqICgyKSBpZiBzdWNoIGFuIG9iamVjdCB3YXMgcHJvdmlkZWQgb24gYSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZVxyXG4gKiAoMykgaWYgc3VjaCBhbiBvYmplY3QgZXhpc3RzIGluIGEgY29va2llXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGdldERlZmF1bHRzID0gKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gKGdldERlZmF1bHRzRnJvbUdsb2JhbCgpIHx8XHJcbiAgICAgICAgICAgIGdldERlZmF1bHRzRnJvbUVudlZhcmlhYmxlKCkgfHxcclxuICAgICAgICAgICAgZ2V0RGVmYXVsdHNGcm9tQ29va2llKCkpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYXRjaC1hbGwgZm9yIGJlaW5nIHVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZVxyXG4gICAgICAgICAqIHRvIGFueSBlbnZpcm9ubWVudCBjYXNlIHdlIGhhdmUgbm90IGFjY291bnRlZCBmb3IuIExvZyB0b1xyXG4gICAgICAgICAqIGluZm8gaW5zdGVhZCBvZiBzd2FsbG93aW5nIHNvIHdlIGNhbiBmaW5kIHRoZXNlIHVua25vd24gY2FzZXNcclxuICAgICAgICAgKiBhbmQgYWRkIHBhdGhzIGZvciB0aGVtIGlmIG5lZWRlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zb2xlLmluZm8oYFVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZSB0bzogJHtlfWApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxufTtcclxuLyoqXHJcbiAqIFJldHVybnMgZW11bGF0b3IgaG9zdCBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3RcclxuICogZm9yIHRoZSBnaXZlbiBwcm9kdWN0LlxyXG4gKiBAcmV0dXJucyBhIFVSTCBob3N0IGZvcm1hdHRlZCBsaWtlIGAxMjcuMC4wLjE6OTk5OWAgb3IgYFs6OjFdOjQwMDBgIGlmIGF2YWlsYWJsZVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBnZXREZWZhdWx0RW11bGF0b3JIb3N0ID0gKHByb2R1Y3ROYW1lKSA9PiB7IHZhciBfYSwgX2I7IHJldHVybiAoX2IgPSAoX2EgPSBnZXREZWZhdWx0cygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW11bGF0b3JIb3N0cykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3Byb2R1Y3ROYW1lXTsgfTtcclxuLyoqXHJcbiAqIFJldHVybnMgZW11bGF0b3IgaG9zdG5hbWUgYW5kIHBvcnQgc3RvcmVkIGluIHRoZSBfX0ZJUkVCQVNFX0RFRkFVTFRTX18gb2JqZWN0XHJcbiAqIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdC5cclxuICogQHJldHVybnMgYSBwYWlyIG9mIGhvc3RuYW1lIGFuZCBwb3J0IGxpa2UgYFtcIjo6MVwiLCA0MDAwXWAgaWYgYXZhaWxhYmxlXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGdldERlZmF1bHRFbXVsYXRvckhvc3RuYW1lQW5kUG9ydCA9IChwcm9kdWN0TmFtZSkgPT4ge1xyXG4gICAgY29uc3QgaG9zdCA9IGdldERlZmF1bHRFbXVsYXRvckhvc3QocHJvZHVjdE5hbWUpO1xyXG4gICAgaWYgKCFob3N0KSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gaG9zdC5sYXN0SW5kZXhPZignOicpOyAvLyBGaW5kaW5nIHRoZSBsYXN0IHNpbmNlIElQdjYgYWRkciBhbHNvIGhhcyBjb2xvbnMuXHJcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMCB8fCBzZXBhcmF0b3JJbmRleCArIDEgPT09IGhvc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhvc3QgJHtob3N0fSB3aXRoIG5vIHNlcGFyYXRlIGhvc3RuYW1lIGFuZCBwb3J0IWApO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xyXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSksIDEwKTtcclxuICAgIGlmIChob3N0WzBdID09PSAnWycpIHtcclxuICAgICAgICAvLyBCcmFja2V0LXF1b3RlZCBgW2lwdjZhZGRyXTpwb3J0YCA9PiByZXR1cm4gXCJpcHY2YWRkclwiICh3aXRob3V0IGJyYWNrZXRzKS5cclxuICAgICAgICByZXR1cm4gW2hvc3Quc3Vic3RyaW5nKDEsIHNlcGFyYXRvckluZGV4IC0gMSksIHBvcnRdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFtob3N0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCksIHBvcnRdO1xyXG4gICAgfVxyXG59O1xyXG4vKipcclxuICogUmV0dXJucyBGaXJlYmFzZSBhcHAgY29uZmlnIHN0b3JlZCBpbiB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdC5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgZ2V0RGVmYXVsdEFwcENvbmZpZyA9ICgpID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gZ2V0RGVmYXVsdHMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZzsgfTtcclxuLyoqXHJcbiAqIFJldHVybnMgYW4gZXhwZXJpbWVudGFsIHNldHRpbmcgb24gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QgKHByb3BlcnRpZXNcclxuICogcHJlZml4ZWQgYnkgXCJfXCIpXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGdldEV4cGVyaW1lbnRhbFNldHRpbmcgPSAobmFtZSkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBnZXREZWZhdWx0cygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbYF8ke25hbWV9YF07IH07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIERlZmVycmVkIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucmVqZWN0ID0gKCkgPT4geyB9O1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZSA9ICgpID0+IHsgfTtcclxuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPdXIgQVBJIGludGVybmFscyBhcmUgbm90IHByb21pc2VpZmllZCBhbmQgY2Fubm90IGJlY2F1c2Ugb3VyIGNhbGxiYWNrIEFQSXMgaGF2ZSBzdWJ0bGUgZXhwZWN0YXRpb25zIGFyb3VuZFxyXG4gICAgICogaW52b2tpbmcgcHJvbWlzZXMgaW5saW5lLCB3aGljaCBQcm9taXNlcyBhcmUgZm9yYmlkZGVuIHRvIGRvLiBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIG9wdGlvbmFsIG5vZGUtc3R5bGUgY2FsbGJhY2tcclxuICAgICAqIGFuZCByZXR1cm5zIGEgbm9kZS1zdHlsZSBjYWxsYmFjayB3aGljaCB3aWxsIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBEZWZlcnJlZCdzIHByb21pc2UuXHJcbiAgICAgKi9cclxuICAgIHdyYXBDYWxsYmFjayhjYWxsYmFjaykge1xyXG4gICAgICAgIHJldHVybiAoZXJyb3IsIHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdHRhY2hpbmcgbm9vcCBoYW5kbGVyIGp1c3QgaW4gY2FzZSBkZXZlbG9wZXIgd2Fzbid0IGV4cGVjdGluZ1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvbWlzZXNcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB7IH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gU29tZSBvZiBvdXIgY2FsbGJhY2tzIGRvbid0IGV4cGVjdCBhIHZhbHVlIGFuZCBvdXIgb3duIHRlc3RzXHJcbiAgICAgICAgICAgICAgICAvLyBhc3NlcnQgdGhhdCB0aGUgcGFyYW1ldGVyIGxlbmd0aCBpcyAxXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2subGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlTW9ja1VzZXJUb2tlbih0b2tlbiwgcHJvamVjdElkKSB7XHJcbiAgICBpZiAodG9rZW4udWlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJ1aWRcIiBmaWVsZCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IG1vY2tVc2VyVG9rZW4uIFBsZWFzZSB1c2UgXCJzdWJcIiBpbnN0ZWFkIGZvciBGaXJlYmFzZSBBdXRoIFVzZXIgSUQuJyk7XHJcbiAgICB9XHJcbiAgICAvLyBVbnNlY3VyZWQgSldUcyB1c2UgXCJub25lXCIgYXMgdGhlIGFsZ29yaXRobS5cclxuICAgIGNvbnN0IGhlYWRlciA9IHtcclxuICAgICAgICBhbGc6ICdub25lJyxcclxuICAgICAgICB0eXBlOiAnSldUJ1xyXG4gICAgfTtcclxuICAgIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0SWQgfHwgJ2RlbW8tcHJvamVjdCc7XHJcbiAgICBjb25zdCBpYXQgPSB0b2tlbi5pYXQgfHwgMDtcclxuICAgIGNvbnN0IHN1YiA9IHRva2VuLnN1YiB8fCB0b2tlbi51c2VyX2lkO1xyXG4gICAgaWYgKCFzdWIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2NrVXNlclRva2VuIG11c3QgY29udGFpbiAnc3ViJyBvciAndXNlcl9pZCcgZmllbGQhXCIpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oeyBcclxuICAgICAgICAvLyBTZXQgYWxsIHJlcXVpcmVkIGZpZWxkcyB0byBkZWNlbnQgZGVmYXVsdHNcclxuICAgICAgICBpc3M6IGBodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vJHtwcm9qZWN0fWAsIGF1ZDogcHJvamVjdCwgaWF0LCBleHA6IGlhdCArIDM2MDAsIGF1dGhfdGltZTogaWF0LCBzdWIsIHVzZXJfaWQ6IHN1YiwgZmlyZWJhc2U6IHtcclxuICAgICAgICAgICAgc2lnbl9pbl9wcm92aWRlcjogJ2N1c3RvbScsXHJcbiAgICAgICAgICAgIGlkZW50aXRpZXM6IHt9XHJcbiAgICAgICAgfSB9LCB0b2tlbik7XHJcbiAgICAvLyBVbnNlY3VyZWQgSldUcyB1c2UgdGhlIGVtcHR5IHN0cmluZyBhcyBhIHNpZ25hdHVyZS5cclxuICAgIGNvbnN0IHNpZ25hdHVyZSA9ICcnO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhKU09OLnN0cmluZ2lmeShoZWFkZXIpKSxcclxuICAgICAgICBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSksXHJcbiAgICAgICAgc2lnbmF0dXJlXHJcbiAgICBdLmpvaW4oJy4nKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBuYXZpZ2F0b3IudXNlckFnZW50IHN0cmluZyBvciAnJyBpZiBpdCdzIG5vdCBkZWZpbmVkLlxyXG4gKiBAcmV0dXJuIHVzZXIgYWdlbnQgc3RyaW5nXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRVQSgpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgIHR5cGVvZiBuYXZpZ2F0b3JbJ3VzZXJBZ2VudCddID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3JbJ3VzZXJBZ2VudCddO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgQ29yZG92YSAvIFBob25lR2FwIC8gSW9uaWMgZnJhbWV3b3JrcyBvbiBhIG1vYmlsZSBkZXZpY2UuXHJcbiAqXHJcbiAqIERlbGliZXJhdGVseSBkb2VzIG5vdCByZWx5IG9uIGNoZWNraW5nIGBmaWxlOi8vYCBVUkxzIChhcyB0aGlzIGZhaWxzIFBob25lR2FwXHJcbiAqIGluIHRoZSBSaXBwbGUgZW11bGF0b3IpIG5vciBDb3Jkb3ZhIGBvbkRldmljZVJlYWR5YCwgd2hpY2ggd291bGQgbm9ybWFsbHlcclxuICogd2FpdCBmb3IgYSBjYWxsYmFjay5cclxuICovXHJcbmZ1bmN0aW9uIGlzTW9iaWxlQ29yZG92YSgpIHtcclxuICAgIHJldHVybiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFNldHRpbmcgdXAgYW4gYnJvYWRseSBhcHBsaWNhYmxlIGluZGV4IHNpZ25hdHVyZSBmb3IgV2luZG93XHJcbiAgICAgICAgLy8ganVzdCB0byBkZWFsIHdpdGggdGhpcyBjYXNlIHdvdWxkIHByb2JhYmx5IGJlIGEgYmFkIGlkZWEuXHJcbiAgICAgICAgISEod2luZG93Wydjb3Jkb3ZhJ10gfHwgd2luZG93WydwaG9uZWdhcCddIHx8IHdpbmRvd1snUGhvbmVHYXAnXSkgJiZcclxuICAgICAgICAvaW9zfGlwaG9uZXxpcG9kfGlwYWR8YW5kcm9pZHxibGFja2JlcnJ5fGllbW9iaWxlL2kudGVzdChnZXRVQSgpKSk7XHJcbn1cclxuLyoqXHJcbiAqIERldGVjdCBOb2RlLmpzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHRydWUgaWYgTm9kZS5qcyBlbnZpcm9ubWVudCBpcyBkZXRlY3RlZCBvciBzcGVjaWZpZWQuXHJcbiAqL1xyXG4vLyBOb2RlIGRldGVjdGlvbiBsb2dpYyBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vaWxpYWthbi9kZXRlY3Qtbm9kZS9cclxuZnVuY3Rpb24gaXNOb2RlKCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgZm9yY2VFbnZpcm9ubWVudCA9IChfYSA9IGdldERlZmF1bHRzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZUVudmlyb25tZW50O1xyXG4gICAgaWYgKGZvcmNlRW52aXJvbm1lbnQgPT09ICdub2RlJykge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm9yY2VFbnZpcm9ubWVudCA9PT0gJ2Jyb3dzZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogRGV0ZWN0IEJyb3dzZXIgRW52aXJvbm1lbnRcclxuICovXHJcbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcclxuICAgIHJldHVybiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmO1xyXG59XHJcbmZ1bmN0aW9uIGlzQnJvd3NlckV4dGVuc2lvbigpIHtcclxuICAgIGNvbnN0IHJ1bnRpbWUgPSB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0J1xyXG4gICAgICAgID8gY2hyb21lLnJ1bnRpbWVcclxuICAgICAgICA6IHR5cGVvZiBicm93c2VyID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IGJyb3dzZXIucnVudGltZVxyXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiB0eXBlb2YgcnVudGltZSA9PT0gJ29iamVjdCcgJiYgcnVudGltZS5pZCAhPT0gdW5kZWZpbmVkO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3QgUmVhY3QgTmF0aXZlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHRydWUgaWYgUmVhY3ROYXRpdmUgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1JlYWN0TmF0aXZlKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3JbJ3Byb2R1Y3QnXSA9PT0gJ1JlYWN0TmF0aXZlJyk7XHJcbn1cclxuLyoqIERldGVjdHMgRWxlY3Ryb24gYXBwcy4gKi9cclxuZnVuY3Rpb24gaXNFbGVjdHJvbigpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ0VsZWN0cm9uLycpID49IDA7XHJcbn1cclxuLyoqIERldGVjdHMgSW50ZXJuZXQgRXhwbG9yZXIuICovXHJcbmZ1bmN0aW9uIGlzSUUoKSB7XHJcbiAgICBjb25zdCB1YSA9IGdldFVBKCk7XHJcbiAgICByZXR1cm4gdWEuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgPj0gMDtcclxufVxyXG4vKiogRGV0ZWN0cyBVbml2ZXJzYWwgV2luZG93cyBQbGF0Zm9ybSBhcHBzLiAqL1xyXG5mdW5jdGlvbiBpc1VXUCgpIHtcclxuICAgIHJldHVybiBnZXRVQSgpLmluZGV4T2YoJ01TQXBwSG9zdC8nKSA+PSAwO1xyXG59XHJcbi8qKlxyXG4gKiBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBTREsgYnVpbGQgaXMgdGhlIE5vZGUgdmVyc2lvbi5cclxuICpcclxuICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIE5vZGUgU0RLIGJ1aWxkLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNOb2RlU2RrKCkge1xyXG4gICAgcmV0dXJuIENPTlNUQU5UUy5OT0RFX0NMSUVOVCA9PT0gdHJ1ZSB8fCBDT05TVEFOVFMuTk9ERV9BRE1JTiA9PT0gdHJ1ZTtcclxufVxyXG4vKiogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGluIFNhZmFyaS4gKi9cclxuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XHJcbiAgICByZXR1cm4gKCFpc05vZGUoKSAmJlxyXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpICYmXHJcbiAgICAgICAgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKTtcclxufVxyXG4vKipcclxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICogQHJldHVybiB0cnVlIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcclxuICovXHJcbmZ1bmN0aW9uIGlzSW5kZXhlZERCQXZhaWxhYmxlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIGluZGV4ZWREQiA9PT0gJ29iamVjdCc7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIGJyb3dzZXIvc3cgY29udGV4dCBmb3IgaW5kZXhlZERCIGJ5IG9wZW5pbmcgYSBkdW1teSBpbmRleGVkREIgZGF0YWJhc2UgYW5kIHJlamVjdFxyXG4gKiBpZiBlcnJvcnMgb2NjdXIgZHVyaW5nIHRoZSBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi5cclxuICpcclxuICogQHRocm93cyBleGNlcHRpb24gaWYgY3VycmVudCBicm93c2VyL3N3IGNvbnRleHQgY2FuJ3QgcnVuIGlkYi5vcGVuIChleDogU2FmYXJpIGlmcmFtZSwgRmlyZWZveFxyXG4gKiBwcml2YXRlIGJyb3dzaW5nKVxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSgpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHByZUV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgREJfQ0hFQ0tfTkFNRSA9ICd2YWxpZGF0ZS1icm93c2VyLWNvbnRleHQtZm9yLWluZGV4ZWRkYi1hbmFseXRpY3MtbW9kdWxlJztcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHNlbGYuaW5kZXhlZERCLm9wZW4oREJfQ0hFQ0tfTkFNRSk7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBkYXRhYmFzZSBvbmx5IHdoZW4gaXQgZG9lc24ndCBwcmUtZXhpc3RcclxuICAgICAgICAgICAgICAgIGlmICghcHJlRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShEQl9DSEVDS19OQU1FKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJlRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KCgoX2EgPSByZXF1ZXN0LmVycm9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWVzc2FnZSkgfHwgJycpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICpcclxuICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxyXG4gKiBAcmV0dXJuIHRydWUgaWYgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxyXG4gKi9cclxuZnVuY3Rpb24gYXJlQ29va2llc0VuYWJsZWQoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgIW5hdmlnYXRvci5jb29raWVFbmFibGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBmaWxlb3ZlcnZpZXcgU3RhbmRhcmRpemVkIEZpcmViYXNlIEVycm9yLlxyXG4gKlxyXG4gKiBVc2FnZTpcclxuICpcclxuICogICAvLyBUeXBlc2NyaXB0IHN0cmluZyBsaXRlcmFscyBmb3IgdHlwZS1zYWZlIGNvZGVzXHJcbiAqICAgdHlwZSBFcnIgPVxyXG4gKiAgICAgJ3Vua25vd24nIHxcclxuICogICAgICdvYmplY3Qtbm90LWZvdW5kJ1xyXG4gKiAgICAgO1xyXG4gKlxyXG4gKiAgIC8vIENsb3N1cmUgZW51bSBmb3IgdHlwZS1zYWZlIGVycm9yIGNvZGVzXHJcbiAqICAgLy8gYXQtZW51bSB7c3RyaW5nfVxyXG4gKiAgIHZhciBFcnIgPSB7XHJcbiAqICAgICBVTktOT1dOOiAndW5rbm93bicsXHJcbiAqICAgICBPQkpFQ1RfTk9UX0ZPVU5EOiAnb2JqZWN0LW5vdC1mb3VuZCcsXHJcbiAqICAgfVxyXG4gKlxyXG4gKiAgIGxldCBlcnJvcnM6IE1hcDxFcnIsIHN0cmluZz4gPSB7XHJcbiAqICAgICAnZ2VuZXJpYy1lcnJvcic6IFwiVW5rbm93biBlcnJvclwiLFxyXG4gKiAgICAgJ2ZpbGUtbm90LWZvdW5kJzogXCJDb3VsZCBub3QgZmluZCBmaWxlOiB7JGZpbGV9XCIsXHJcbiAqICAgfTtcclxuICpcclxuICogICAvLyBUeXBlLXNhZmUgZnVuY3Rpb24gLSBtdXN0IHBhc3MgYSB2YWxpZCBlcnJvciBjb2RlIGFzIHBhcmFtLlxyXG4gKiAgIGxldCBlcnJvciA9IG5ldyBFcnJvckZhY3Rvcnk8RXJyPignc2VydmljZScsICdTZXJ2aWNlJywgZXJyb3JzKTtcclxuICpcclxuICogICAuLi5cclxuICogICB0aHJvdyBlcnJvci5jcmVhdGUoRXJyLkdFTkVSSUMpO1xyXG4gKiAgIC4uLlxyXG4gKiAgIHRocm93IGVycm9yLmNyZWF0ZShFcnIuRklMRV9OT1RfRk9VTkQsIHsnZmlsZSc6IGZpbGVOYW1lfSk7XHJcbiAqICAgLi4uXHJcbiAqICAgLy8gU2VydmljZTogQ291bGQgbm90IGZpbGUgZmlsZTogZm9vLnR4dCAoc2VydmljZS9maWxlLW5vdC1mb3VuZCkuXHJcbiAqXHJcbiAqICAgY2F0Y2ggKGUpIHtcclxuICogICAgIGFzc2VydChlLm1lc3NhZ2UgPT09IFwiQ291bGQgbm90IGZpbmQgZmlsZTogZm9vLnR4dC5cIik7XHJcbiAqICAgICBpZiAoKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09ICdzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kJykge1xyXG4gKiAgICAgICBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCByZWFkIGZpbGU6IFwiICsgZVsnZmlsZSddKTtcclxuICogICAgIH1cclxuICogICB9XHJcbiAqL1xyXG5jb25zdCBFUlJPUl9OQU1FID0gJ0ZpcmViYXNlRXJyb3InO1xyXG4vLyBCYXNlZCBvbiBjb2RlIGZyb206XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xyXG5jbGFzcyBGaXJlYmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAvKiogVGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXJyb3IuICovXHJcbiAgICBjb2RlLCBtZXNzYWdlLCBcclxuICAgIC8qKiBDdXN0b20gZGF0YSBmb3IgdGhpcyBlcnJvci4gKi9cclxuICAgIGN1c3RvbURhdGEpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRGF0YSA9IGN1c3RvbURhdGE7XHJcbiAgICAgICAgLyoqIFRoZSBjdXN0b20gbmFtZSBmb3IgYWxsIEZpcmViYXNlRXJyb3JzLiAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IEVSUk9SX05BTUU7XHJcbiAgICAgICAgLy8gRml4IEZvciBFUzVcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGaXJlYmFzZUVycm9yLnByb3RvdHlwZSk7XHJcbiAgICAgICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgb3VyIGVycm9yIHdhcyB0aHJvd24uXHJcbiAgICAgICAgLy8gT25seSBhdmFpbGFibGUgb24gVjguXHJcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XHJcbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEVycm9yRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRXJyb3JGYWN0b3J5IHtcclxuICAgIGNvbnN0cnVjdG9yKHNlcnZpY2UsIHNlcnZpY2VOYW1lLCBlcnJvcnMpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTtcclxuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcclxuICAgIH1cclxuICAgIGNyZWF0ZShjb2RlLCAuLi5kYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IGRhdGFbMF0gfHwge307XHJcbiAgICAgICAgY29uc3QgZnVsbENvZGUgPSBgJHt0aGlzLnNlcnZpY2V9LyR7Y29kZX1gO1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5lcnJvcnNbY29kZV07XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRlbXBsYXRlID8gcmVwbGFjZVRlbXBsYXRlKHRlbXBsYXRlLCBjdXN0b21EYXRhKSA6ICdFcnJvcic7XHJcbiAgICAgICAgLy8gU2VydmljZSBOYW1lOiBFcnJvciBtZXNzYWdlIChzZXJ2aWNlL2NvZGUpLlxyXG4gICAgICAgIGNvbnN0IGZ1bGxNZXNzYWdlID0gYCR7dGhpcy5zZXJ2aWNlTmFtZX06ICR7bWVzc2FnZX0gKCR7ZnVsbENvZGV9KS5gO1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEZpcmViYXNlRXJyb3IoZnVsbENvZGUsIGZ1bGxNZXNzYWdlLCBjdXN0b21EYXRhKTtcclxuICAgICAgICByZXR1cm4gZXJyb3I7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcmVwbGFjZVRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhKSB7XHJcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShQQVRURVJOLCAoXywga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2tleV07XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyBTdHJpbmcodmFsdWUpIDogYDwke2tleX0/PmA7XHJcbiAgICB9KTtcclxufVxyXG5jb25zdCBQQVRURVJOID0gL1xce1xcJChbXn1dKyl9L2c7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBFdmFsdWF0ZXMgYSBKU09OIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgQSBzdHJpbmcgY29udGFpbmluZyBKU09OLlxyXG4gKiBAcmV0dXJuIHsqfSBUaGUgamF2YXNjcmlwdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgSlNPTi5cclxuICovXHJcbmZ1bmN0aW9uIGpzb25FdmFsKHN0cikge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyBKU09OIHJlcHJlc2VudGluZyBhIGphdmFzY3JpcHQgb2JqZWN0LlxyXG4gKiBAcGFyYW0geyp9IGRhdGEgSmF2YXNjcmlwdCBvYmplY3QgdG8gYmUgc3RyaW5naWZpZWQuXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEpTT04gY29udGVudHMgb2YgdGhlIG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeShkYXRhKSB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBpbnRvIGNvbnN0aXR1ZW50IHBhcnRzLlxyXG4gKlxyXG4gKiBOb3RlczpcclxuICogLSBNYXkgcmV0dXJuIHdpdGggaW52YWxpZCAvIGluY29tcGxldGUgY2xhaW1zIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxyXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxyXG4gKi9cclxuY29uc3QgZGVjb2RlID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBsZXQgaGVhZGVyID0ge30sIGNsYWltcyA9IHt9LCBkYXRhID0ge30sIHNpZ25hdHVyZSA9ICcnO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgaGVhZGVyID0ganNvbkV2YWwoYmFzZTY0RGVjb2RlKHBhcnRzWzBdKSB8fCAnJyk7XHJcbiAgICAgICAgY2xhaW1zID0ganNvbkV2YWwoYmFzZTY0RGVjb2RlKHBhcnRzWzFdKSB8fCAnJyk7XHJcbiAgICAgICAgc2lnbmF0dXJlID0gcGFydHNbMl07XHJcbiAgICAgICAgZGF0YSA9IGNsYWltc1snZCddIHx8IHt9O1xyXG4gICAgICAgIGRlbGV0ZSBjbGFpbXNbJ2QnXTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7IH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaGVhZGVyLFxyXG4gICAgICAgIGNsYWltcyxcclxuICAgICAgICBkYXRhLFxyXG4gICAgICAgIHNpZ25hdHVyZVxyXG4gICAgfTtcclxufTtcclxuLyoqXHJcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBpdHMgdGltZS1iYXNlZCBjbGFpbXMuIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlXHJcbiAqIHRva2VuIGlzIHdpdGhpbiB0aGUgdGltZSB3aW5kb3cgYXV0aG9yaXplZCBieSB0aGUgJ25iZicgKG5vdC1iZWZvcmUpIGFuZCAnaWF0JyAoaXNzdWVkLWF0KSBjbGFpbXMuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzVmFsaWRUaW1lc3RhbXAgPSBmdW5jdGlvbiAodG9rZW4pIHtcclxuICAgIGNvbnN0IGNsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xyXG4gICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApO1xyXG4gICAgbGV0IHZhbGlkU2luY2UgPSAwLCB2YWxpZFVudGlsID0gMDtcclxuICAgIGlmICh0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGlmIChjbGFpbXMuaGFzT3duUHJvcGVydHkoJ25iZicpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ25iZiddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpKSB7XHJcbiAgICAgICAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ2lhdCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCdleHAnKSkge1xyXG4gICAgICAgICAgICB2YWxpZFVudGlsID0gY2xhaW1zWydleHAnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRva2VuIHdpbGwgZXhwaXJlIGFmdGVyIDI0aCBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgIHZhbGlkVW50aWwgPSB2YWxpZFNpbmNlICsgODY0MDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICghIW5vdyAmJlxyXG4gICAgICAgICEhdmFsaWRTaW5jZSAmJlxyXG4gICAgICAgICEhdmFsaWRVbnRpbCAmJlxyXG4gICAgICAgIG5vdyA+PSB2YWxpZFNpbmNlICYmXHJcbiAgICAgICAgbm93IDw9IHZhbGlkVW50aWwpO1xyXG59O1xyXG4vKipcclxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCByZXR1cm5zIGl0cyBpc3N1ZWQgYXQgdGltZSBpZiB2YWxpZCwgbnVsbCBvdGhlcndpc2UuXHJcbiAqXHJcbiAqIE5vdGVzOlxyXG4gKiAtIE1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cclxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cclxuICovXHJcbmNvbnN0IGlzc3VlZEF0VGltZSA9IGZ1bmN0aW9uICh0b2tlbikge1xyXG4gICAgY29uc3QgY2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XHJcbiAgICBpZiAodHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcgJiYgY2xhaW1zLmhhc093blByb3BlcnR5KCdpYXQnKSkge1xyXG4gICAgICAgIHJldHVybiBjbGFpbXNbJ2lhdCddO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcbi8qKlxyXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgaXRzIGZvcm1hdC4gRXhwZWN0cyBhIHZhbGlkIGlzc3VlZC1hdCB0aW1lLlxyXG4gKlxyXG4gKiBOb3RlczpcclxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBpc1ZhbGlkRm9ybWF0ID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlKHRva2VuKSwgY2xhaW1zID0gZGVjb2RlZC5jbGFpbXM7XHJcbiAgICByZXR1cm4gISFjbGFpbXMgJiYgdHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcgJiYgY2xhaW1zLmhhc093blByb3BlcnR5KCdpYXQnKTtcclxufTtcclxuLyoqXHJcbiAqIEF0dGVtcHRzIHRvIHBlZXIgaW50byBhbiBhdXRoIHRva2VuIGFuZCBkZXRlcm1pbmUgaWYgaXQncyBhbiBhZG1pbiBhdXRoIHRva2VuIGJ5IGxvb2tpbmcgYXQgdGhlIGNsYWltcyBwb3J0aW9uLlxyXG4gKlxyXG4gKiBOb3RlczpcclxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXHJcbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXHJcbiAqL1xyXG5jb25zdCBpc0FkbWluID0gZnVuY3Rpb24gKHRva2VuKSB7XHJcbiAgICBjb25zdCBjbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcclxuICAgIHJldHVybiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXNbJ2FkbWluJ10gPT09IHRydWU7XHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGNvbnRhaW5zKG9iaiwga2V5KSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcclxufVxyXG5mdW5jdGlvbiBzYWZlR2V0KG9iaiwga2V5KSB7XHJcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xyXG4gICAgICAgIHJldHVybiBvYmpba2V5XTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBtYXAob2JqLCBmbiwgY29udGV4dE9iaikge1xyXG4gICAgY29uc3QgcmVzID0ge307XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICByZXNba2V5XSA9IGZuLmNhbGwoY29udGV4dE9iaiwgb2JqW2tleV0sIGtleSwgb2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG59XHJcbi8qKlxyXG4gKiBEZWVwIGVxdWFsIHR3byBvYmplY3RzLiBTdXBwb3J0IEFycmF5cyBhbmQgT2JqZWN0cy5cclxuICovXHJcbmZ1bmN0aW9uIGRlZXBFcXVhbChhLCBiKSB7XHJcbiAgICBpZiAoYSA9PT0gYikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcclxuICAgIGNvbnN0IGJLZXlzID0gT2JqZWN0LmtleXMoYik7XHJcbiAgICBmb3IgKGNvbnN0IGsgb2YgYUtleXMpIHtcclxuICAgICAgICBpZiAoIWJLZXlzLmluY2x1ZGVzKGspKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYVByb3AgPSBhW2tdO1xyXG4gICAgICAgIGNvbnN0IGJQcm9wID0gYltrXTtcclxuICAgICAgICBpZiAoaXNPYmplY3QoYVByb3ApICYmIGlzT2JqZWN0KGJQcm9wKSkge1xyXG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhUHJvcCwgYlByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYVByb3AgIT09IGJQcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGsgb2YgYktleXMpIHtcclxuICAgICAgICBpZiAoIWFLZXlzLmluY2x1ZGVzKGspKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5mdW5jdGlvbiBpc09iamVjdCh0aGluZykge1xyXG4gICAgcmV0dXJuIHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJlamVjdHMgaWYgdGhlIGdpdmVuIHByb21pc2UgZG9lc24ndCByZXNvbHZlIGluIHRpbWVJbk1TIG1pbGxpc2Vjb25kcy5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9taXNlV2l0aFRpbWVvdXQocHJvbWlzZSwgdGltZUluTVMgPSAyMDAwKSB7XHJcbiAgICBjb25zdCBkZWZlcnJlZFByb21pc2UgPSBuZXcgRGVmZXJyZWQoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gZGVmZXJyZWRQcm9taXNlLnJlamVjdCgndGltZW91dCEnKSwgdGltZUluTVMpO1xyXG4gICAgcHJvbWlzZS50aGVuKGRlZmVycmVkUHJvbWlzZS5yZXNvbHZlLCBkZWZlcnJlZFByb21pc2UucmVqZWN0KTtcclxuICAgIHJldHVybiBkZWZlcnJlZFByb21pc2UucHJvbWlzZTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUmV0dXJucyBhIHF1ZXJ5c3RyaW5nLWZvcm1hdHRlZCBzdHJpbmcgKGUuZy4gJmFyZz12YWwmYXJnMj12YWwyKSBmcm9tIGFcclxuICogcGFyYW1zIG9iamVjdCAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcclxuICogTm90ZTogWW91IG11c3QgcHJlcGVuZCBpdCB3aXRoID8gd2hlbiBhZGRpbmcgaXQgdG8gYSBVUkwuXHJcbiAqL1xyXG5mdW5jdGlvbiBxdWVyeXN0cmluZyhxdWVyeXN0cmluZ1BhcmFtcykge1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeXN0cmluZ1BhcmFtcykpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChhcnJheVZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChhcnJheVZhbCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcmFtcy5sZW5ndGggPyAnJicgKyBwYXJhbXMuam9pbignJicpIDogJyc7XHJcbn1cclxuLyoqXHJcbiAqIERlY29kZXMgYSBxdWVyeXN0cmluZyAoZS5nLiA/YXJnPXZhbCZhcmcyPXZhbDIpIGludG8gYSBwYXJhbXMgb2JqZWN0XHJcbiAqIChlLmcuIHthcmc6ICd2YWwnLCBhcmcyOiAndmFsMid9KVxyXG4gKi9cclxuZnVuY3Rpb24gcXVlcnlzdHJpbmdEZWNvZGUocXVlcnlzdHJpbmcpIHtcclxuICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgY29uc3QgdG9rZW5zID0gcXVlcnlzdHJpbmcucmVwbGFjZSgvXlxcPy8sICcnKS5zcGxpdCgnJicpO1xyXG4gICAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xyXG4gICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB0b2tlbi5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgICBvYmpbZGVjb2RlVVJJQ29tcG9uZW50KGtleSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3QgdGhlIHF1ZXJ5IHN0cmluZyBwYXJ0IG9mIGEgVVJMLCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgcXVlc3Rpb24gbWFyayAoaWYgcHJlc2VudCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0UXVlcnlzdHJpbmcodXJsKSB7XHJcbiAgICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcclxuICAgIGlmICghcXVlcnlTdGFydCkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYWdtZW50U3RhcnQgPSB1cmwuaW5kZXhPZignIycsIHF1ZXJ5U3RhcnQpO1xyXG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocXVlcnlTdGFydCwgZnJhZ21lbnRTdGFydCA+IDAgPyBmcmFnbWVudFN0YXJ0IDogdW5kZWZpbmVkKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGZpbGVvdmVydmlldyBTSEEtMSBjcnlwdG9ncmFwaGljIGhhc2guXHJcbiAqIFZhcmlhYmxlIG5hbWVzIGZvbGxvdyB0aGUgbm90YXRpb24gaW4gRklQUyBQVUIgMTgwLTM6XHJcbiAqIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxODAtMy9maXBzMTgwLTNfZmluYWwucGRmLlxyXG4gKlxyXG4gKiBVc2FnZTpcclxuICogICB2YXIgc2hhMSA9IG5ldyBzaGExKCk7XHJcbiAqICAgc2hhMS51cGRhdGUoYnl0ZXMpO1xyXG4gKiAgIHZhciBoYXNoID0gc2hhMS5kaWdlc3QoKTtcclxuICpcclxuICogUGVyZm9ybWFuY2U6XHJcbiAqICAgQ2hyb21lIDIzOiAgIH40MDAgTWJpdC9zXHJcbiAqICAgRmlyZWZveCAxNjogIH4yNTAgTWJpdC9zXHJcbiAqXHJcbiAqL1xyXG4vKipcclxuICogU0hBLTEgY3J5cHRvZ3JhcGhpYyBoYXNoIGNvbnN0cnVjdG9yLlxyXG4gKlxyXG4gKiBUaGUgcHJvcGVydGllcyBkZWNsYXJlZCBoZXJlIGFyZSBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIGFsZ29yaXRobSBkb2N1bWVudC5cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBmaW5hbFxyXG4gKiBAc3RydWN0XHJcbiAqL1xyXG5jbGFzcyBTaGExIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYWNjdW11bGF0ZWQgdmFyaWFibGVzIGEtZSBpbiB0aGUgY29tcHJlc3NfXHJcbiAgICAgICAgICogZnVuY3Rpb24uXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoYWluXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYnVmZmVyIGhvbGRpbmcgdGhlIHBhcnRpYWxseSBjb21wdXRlZCBoYXNoIHJlc3VsdC5cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnVmXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIDgwIGJ5dGVzLCBlYWNoIGEgcGFydCBvZiB0aGUgbWVzc2FnZSB0byBiZSBoYXNoZWQuICBSZWZlcnJlZCB0b1xyXG4gICAgICAgICAqIGFzIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGluIHRoZSBkb2NzLlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5XXyA9IFtdO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnRhaW5zIGRhdGEgbmVlZGVkIHRvIHBhZCBtZXNzYWdlcyBsZXNzIHRoYW4gNjQgYnl0ZXMuXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhZF8gPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxfID0gMDtcclxuICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IDUxMiAvIDg7XHJcbiAgICAgICAgdGhpcy5wYWRfWzBdID0gMTI4O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5ibG9ja1NpemU7ICsraSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhZF9baV0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICByZXNldCgpIHtcclxuICAgICAgICB0aGlzLmNoYWluX1swXSA9IDB4Njc0NTIzMDE7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bMV0gPSAweGVmY2RhYjg5O1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gMHg5OGJhZGNmZTtcclxuICAgICAgICB0aGlzLmNoYWluX1szXSA9IDB4MTAzMjU0NzY7XHJcbiAgICAgICAgdGhpcy5jaGFpbl9bNF0gPSAweGMzZDJlMWYwO1xyXG4gICAgICAgIHRoaXMuaW5idWZfID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsXyA9IDA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGNvbXByZXNzIGhlbHBlciBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSBidWYgQmxvY2sgdG8gY29tcHJlc3MuXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCBvZiB0aGUgYmxvY2sgaW4gdGhlIGJ1ZmZlci5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbXByZXNzXyhidWYsIG9mZnNldCkge1xyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IFcgPSB0aGlzLldfO1xyXG4gICAgICAgIC8vIGdldCAxNiBiaWcgZW5kaWFuIHdvcmRzXHJcbiAgICAgICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyh1c2VyKTogW2J1ZyA4MTQwMTIyXSBSZWNlbnQgdmVyc2lvbnMgb2YgU2FmYXJpIGZvciBNYWMgT1MgYW5kIGlPU1xyXG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGJ1ZyB0aGF0IHR1cm5zIHRoZSBwb3N0LWluY3JlbWVudCArKyBvcGVyYXRvciBpbnRvIHByZS1pbmNyZW1lbnRcclxuICAgICAgICAgICAgICAgIC8vIGR1cmluZyBKSVQgY29tcGlsYXRpb24uICBXZSBoYXZlIGNvZGUgdGhhdCBkZXBlbmRzIGhlYXZpbHkgb24gU0hBLTEgZm9yXHJcbiAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzcyBhbmQgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBidWcsIHNvIEkndmUgcmVtb3ZlZCBhbGwgdXNlc1xyXG4gICAgICAgICAgICAgICAgLy8gb2YgcG9zdC1pbmNyZW1lbnQgKysgaW4gd2hpY2ggdGhlIHJlc3VsdCB2YWx1ZSBpcyB1c2VkLiAgV2UgY2FuIHJldmVydFxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGFuZ2Ugb25jZSB0aGUgU2FmYXJpIGJ1Z1xyXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkwMzYpIGhhcyBiZWVuIGZpeGVkIGFuZFxyXG4gICAgICAgICAgICAgICAgLy8gbW9zdCBjbGllbnRzIGhhdmUgYmVlbiB1cGRhdGVkLlxyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWYuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDMpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgV1tpXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXRdIDw8IDI0KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWZbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZltvZmZzZXQgKyAyXSA8PCA4KSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyAzXTtcclxuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4cGFuZCB0byA4MCB3b3Jkc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdCA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XHJcbiAgICAgICAgICAgIFdbaV0gPSAoKHQgPDwgMSkgfCAodCA+Pj4gMzEpKSAmIDB4ZmZmZmZmZmY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhID0gdGhpcy5jaGFpbl9bMF07XHJcbiAgICAgICAgbGV0IGIgPSB0aGlzLmNoYWluX1sxXTtcclxuICAgICAgICBsZXQgYyA9IHRoaXMuY2hhaW5fWzJdO1xyXG4gICAgICAgIGxldCBkID0gdGhpcy5jaGFpbl9bM107XHJcbiAgICAgICAgbGV0IGUgPSB0aGlzLmNoYWluX1s0XTtcclxuICAgICAgICBsZXQgZiwgaztcclxuICAgICAgICAvLyBUT0RPKHVzZXIpOiBUcnkgdG8gdW5yb2xsIHRoaXMgbG9vcCB0byBzcGVlZCB1cCB0aGUgY29tcHV0YXRpb24uXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgNDApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpIDwgMjApIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4NWE4Mjc5OTk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmID0gYiBeIGMgXiBkO1xyXG4gICAgICAgICAgICAgICAgICAgIGsgPSAweDZlZDllYmExO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCA2MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiB8IGMpKTtcclxuICAgICAgICAgICAgICAgICAgICBrID0gMHg4ZjFiYmNkYztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IDB4Y2E2MmMxZDY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdCA9ICgoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgayArIFdbaV0pICYgMHhmZmZmZmZmZjtcclxuICAgICAgICAgICAgZSA9IGQ7XHJcbiAgICAgICAgICAgIGQgPSBjO1xyXG4gICAgICAgICAgICBjID0gKChiIDw8IDMwKSB8IChiID4+PiAyKSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgICAgICBiID0gYTtcclxuICAgICAgICAgICAgYSA9IHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhaW5fWzBdID0gKHRoaXMuY2hhaW5fWzBdICsgYSkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzFdID0gKHRoaXMuY2hhaW5fWzFdICsgYikgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzJdID0gKHRoaXMuY2hhaW5fWzJdICsgYykgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzNdID0gKHRoaXMuY2hhaW5fWzNdICsgZCkgJiAweGZmZmZmZmZmO1xyXG4gICAgICAgIHRoaXMuY2hhaW5fWzRdID0gKHRoaXMuY2hhaW5fWzRdICsgZSkgJiAweGZmZmZmZmZmO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlKGJ5dGVzLCBsZW5ndGgpIHtcclxuICAgICAgICAvLyBUT0RPKGpvaG5sZW56KTogdGlnaHRlbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZW1vdmUgdGhpcyBjaGVja1xyXG4gICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoTWludXNCbG9jayA9IGxlbmd0aCAtIHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICAvLyBVc2luZyBsb2NhbCBpbnN0ZWFkIG9mIG1lbWJlciB2YXJpYWJsZXMgZ2l2ZXMgfjUlIHNwZWVkdXAgb24gRmlyZWZveCAxNi5cclxuICAgICAgICBjb25zdCBidWYgPSB0aGlzLmJ1Zl87XHJcbiAgICAgICAgbGV0IGluYnVmID0gdGhpcy5pbmJ1Zl87XHJcbiAgICAgICAgLy8gVGhlIG91dGVyIHdoaWxlIGxvb3Agc2hvdWxkIGV4ZWN1dGUgYXQgbW9zdCB0d2ljZS5cclxuICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBXaGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgYmxvY2sgdG8gdG9wIHVwLCB3ZSBjYW4gZGlyZWN0bHkgcHJvY2VzcyB0aGVcclxuICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIChhc3N1bWluZyBpdCBjb250YWlucyBzdWZmaWNpZW50IGRhdGEpLiBUaGlzIGdpdmVzIH4yNSVcclxuICAgICAgICAgICAgLy8gc3BlZWR1cCBvbiBDaHJvbWUgMjMgYW5kIH4xNSUgc3BlZWR1cCBvbiBGaXJlZm94IDE2LCBidXQgcmVxdWlyZXMgdGhhdFxyXG4gICAgICAgICAgICAvLyB0aGUgZGF0YSBpcyBwcm92aWRlZCBpbiBsYXJnZSBjaHVua3MgKG9yIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcykuXHJcbiAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG4gPD0gbGVuZ3RoTWludXNCbG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHJlc3NfKGJ5dGVzLCBuKTtcclxuICAgICAgICAgICAgICAgICAgICBuICs9IHRoaXMuYmxvY2tTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltpbmJ1Zl0gPSBieXRlcy5jaGFyQ29kZUF0KG4pO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzW25dO1xyXG4gICAgICAgICAgICAgICAgICAgICsraW5idWY7XHJcbiAgICAgICAgICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmJ1ZiA9PT0gdGhpcy5ibG9ja1NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdW1wIHRvIHRoZSBvdXRlciBsb29wIHNvIHdlIHVzZSB0aGUgZnVsbC1ibG9jayBvcHRpbWl6YXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluYnVmXyA9IGluYnVmO1xyXG4gICAgICAgIHRoaXMudG90YWxfICs9IGxlbmd0aDtcclxuICAgIH1cclxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cclxuICAgIGRpZ2VzdCgpIHtcclxuICAgICAgICBjb25zdCBkaWdlc3QgPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxCaXRzID0gdGhpcy50b3RhbF8gKiA4O1xyXG4gICAgICAgIC8vIEFkZCBwYWQgMHg4MCAweDAwKi5cclxuICAgICAgICBpZiAodGhpcy5pbmJ1Zl8gPCA1Nikge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIDU2IC0gdGhpcy5pbmJ1Zl8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy5wYWRfLCB0aGlzLmJsb2NrU2l6ZSAtICh0aGlzLmluYnVmXyAtIDU2KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCAjIGJpdHMuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYmxvY2tTaXplIC0gMTsgaSA+PSA1NjsgaS0tKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmX1tpXSA9IHRvdGFsQml0cyAmIDI1NTtcclxuICAgICAgICAgICAgdG90YWxCaXRzIC89IDI1NjsgLy8gRG9uJ3QgdXNlIGJpdC1zaGlmdGluZyBoZXJlIVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXByZXNzXyh0aGlzLmJ1Zl8pO1xyXG4gICAgICAgIGxldCBuID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMjQ7IGogPj0gMDsgaiAtPSA4KSB7XHJcbiAgICAgICAgICAgICAgICBkaWdlc3Rbbl0gPSAodGhpcy5jaGFpbl9baV0gPj4gaikgJiAyNTU7XHJcbiAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpZ2VzdDtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogSGVscGVyIHRvIG1ha2UgYSBTdWJzY3JpYmUgZnVuY3Rpb24gKGp1c3QgbGlrZSBQcm9taXNlIGhlbHBzIG1ha2UgYVxyXG4gKiBUaGVuYWJsZSkuXHJcbiAqXHJcbiAqIEBwYXJhbSBleGVjdXRvciBGdW5jdGlvbiB3aGljaCBjYW4gbWFrZSBjYWxscyB0byBhIHNpbmdsZSBPYnNlcnZlclxyXG4gKiAgICAgYXMgYSBwcm94eS5cclxuICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlKGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKSB7XHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBPYnNlcnZlclByb3h5KGV4ZWN1dG9yLCBvbk5vT2JzZXJ2ZXJzKTtcclxuICAgIHJldHVybiBwcm94eS5zdWJzY3JpYmUuYmluZChwcm94eSk7XHJcbn1cclxuLyoqXHJcbiAqIEltcGxlbWVudCBmYW4tb3V0IGZvciBhbnkgbnVtYmVyIG9mIE9ic2VydmVycyBhdHRhY2hlZCB2aWEgYSBzdWJzY3JpYmVcclxuICogZnVuY3Rpb24uXHJcbiAqL1xyXG5jbGFzcyBPYnNlcnZlclByb3h5IHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXHJcbiAgICAgKiAgICAgYXMgYSBwcm94eS5cclxuICAgICAqIEBwYXJhbSBvbk5vT2JzZXJ2ZXJzIENhbGxiYWNrIHdoZW4gY291bnQgb2YgT2JzZXJ2ZXJzIGdvZXMgdG8gemVyby5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpIHtcclxuICAgICAgICB0aGlzLm9ic2VydmVycyA9IFtdO1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVzID0gW107XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50ID0gMDtcclxuICAgICAgICAvLyBNaWNyby10YXNrIHNjaGVkdWxpbmcgYnkgY2FsbGluZyB0YXNrLnRoZW4oKS5cclxuICAgICAgICB0aGlzLnRhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IG9uTm9PYnNlcnZlcnM7XHJcbiAgICAgICAgLy8gQ2FsbCB0aGUgZXhlY3V0b3IgYXN5bmNocm9ub3VzbHkgc28gc3Vic2NyaWJlcnMgdGhhdCBhcmUgY2FsbGVkXHJcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSBhZnRlciB0aGUgY3JlYXRpb24gb2YgdGhlIHN1YnNjcmliZSBmdW5jdGlvblxyXG4gICAgICAgIC8vIGNhbiBzdGlsbCByZWNlaXZlIHRoZSB2ZXJ5IGZpcnN0IHZhbHVlIGdlbmVyYXRlZCBpbiB0aGUgZXhlY3V0b3IuXHJcbiAgICAgICAgdGhpcy50YXNrXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZXhlY3V0b3IodGhpcyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yKGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbmV4dCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNsb3NlKGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGFuIE9ic2VydmVyIHRvIHRoZSBmYW4tb3V0IGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogLSBXZSByZXF1aXJlIHRoYXQgbm8gZXZlbnQgaXMgc2VudCB0byBhIHN1YnNjcmliZXIgc3ljaHJvbm91c2x5IHRvIHRoZWlyXHJcbiAgICAgKiAgIGNhbGwgdG8gc3Vic2NyaWJlKCkuXHJcbiAgICAgKi9cclxuICAgIHN1YnNjcmliZShuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyO1xyXG4gICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciA9PT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgIGVycm9yID09PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgY29tcGxldGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgT2JzZXJ2ZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFzc2VtYmxlIGFuIE9ic2VydmVyIG9iamVjdCB3aGVuIHBhc3NlZCBhcyBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgICAgaWYgKGltcGxlbWVudHNBbnlNZXRob2RzKG5leHRPck9ic2VydmVyLCBbXHJcbiAgICAgICAgICAgICduZXh0JyxcclxuICAgICAgICAgICAgJ2Vycm9yJyxcclxuICAgICAgICAgICAgJ2NvbXBsZXRlJ1xyXG4gICAgICAgIF0pKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyID0gbmV4dE9yT2JzZXJ2ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvYnNlcnZlciA9IHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IG5leHRPck9ic2VydmVyLFxyXG4gICAgICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQgPSBub29wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JzZXJ2ZXIuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvciA9IG5vb3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYnNlcnZlci5jb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlID0gbm9vcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5zdWIgPSB0aGlzLnVuc3Vic2NyaWJlT25lLmJpbmQodGhpcywgdGhpcy5vYnNlcnZlcnMubGVuZ3RoKTtcclxuICAgICAgICAvLyBBdHRlbXB0IHRvIHN1YnNjcmliZSB0byBhIHRlcm1pbmF0ZWQgT2JzZXJ2YWJsZSAtIHdlXHJcbiAgICAgICAgLy8ganVzdCByZXNwb25kIHRvIHRoZSBPYnNlcnZlciB3aXRoIHRoZSBmaW5hbCBlcnJvciBvciBjb21wbGV0ZVxyXG4gICAgICAgIC8vIGV2ZW50LlxyXG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcih0aGlzLmZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xyXG4gICAgICAgIHJldHVybiB1bnN1YjtcclxuICAgIH1cclxuICAgIC8vIFVuc3Vic2NyaWJlIGlzIHN5bmNocm9ub3VzIC0gd2UgZ3VhcmFudGVlIHRoYXQgbm8gZXZlbnRzIGFyZSBzZW50IHRvXHJcbiAgICAvLyBhbnkgdW5zdWJzY3JpYmVkIE9ic2VydmVyLlxyXG4gICAgdW5zdWJzY3JpYmVPbmUoaSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVycyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub2JzZXJ2ZXJzW2ldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbaV07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlckNvdW50IC09IDE7XHJcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJDb3VudCA9PT0gMCAmJiB0aGlzLm9uTm9PYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnModGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yRWFjaE9ic2VydmVyKGZuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIC8vIEFscmVhZHkgY2xvc2VkIGJ5IHByZXZpb3VzIGV2ZW50Li4uLmp1c3QgZWF0IHRoZSBhZGRpdGlvbmFsIHZhbHVlcy5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTaW5jZSBzZW5kT25lIGNhbGxzIGFzeW5jaHJvbm91c2x5IC0gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXRcclxuICAgICAgICAvLyB0aGlzLm9ic2VydmVycyB3aWxsIGJlY29tZSB1bmRlZmluZWQuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9ic2VydmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRPbmUoaSwgZm4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIENhbGwgdGhlIE9ic2VydmVyIHZpYSBvbmUgb2YgaXQncyBjYWxsYmFjayBmdW5jdGlvbi4gV2UgYXJlIGNhcmVmdWwgdG9cclxuICAgIC8vIGNvbmZpcm0gdGhhdCB0aGUgb2JzZXJ2ZSBoYXMgbm90IGJlZW4gdW5zdWJzY3JpYmVkIHNpbmNlIHRoaXMgYXN5bmNocm9ub3VzXHJcbiAgICAvLyBmdW5jdGlvbiBoYWQgYmVlbiBxdWV1ZWQuXHJcbiAgICBzZW5kT25lKGksIGZuKSB7XHJcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgdGhpcy50YXNrLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9ic2VydmVyc1tpXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZuKHRoaXMub2JzZXJ2ZXJzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbnMgcmFpc2VkIGluIE9ic2VydmVycyBvciBtaXNzaW5nIG1ldGhvZHMgb2YgYW5cclxuICAgICAgICAgICAgICAgICAgICAvLyBPYnNlcnZlci5cclxuICAgICAgICAgICAgICAgICAgICAvLyBMb2cgZXJyb3IgdG8gY29uc29sZS4gYi8zMTQwNDgwNlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2xvc2UoZXJyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsRXJyb3IgPSBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciBuZWVkZWQgLSBnYXJiYWdlIGNvbGxlY3QgcmVmZXJlbmNlc1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLm9uTm9PYnNlcnZlcnMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqIFR1cm4gc3luY2hyb25vdXMgZnVuY3Rpb24gaW50byBvbmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5LiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5mdW5jdGlvbiBhc3luYyhmbiwgb25FcnJvcikge1xyXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XHJcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZm4oLi4uYXJncyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgICAgICAgb25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcGFzc2VkIGluIGltcGxlbWVudHMgYW55IG9mIHRoZSBuYW1lZCBtZXRob2RzLlxyXG4gKi9cclxuZnVuY3Rpb24gaW1wbGVtZW50c0FueU1ldGhvZHMob2JqLCBtZXRob2RzKSB7XHJcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xyXG4gICAgICAgIGlmIChtZXRob2QgaW4gb2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuZnVuY3Rpb24gbm9vcCgpIHtcclxuICAgIC8vIGRvIG5vdGhpbmdcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBmb3IgYSBwdWJsaWMgZnVuY3Rpb24uXHJcbiAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBmYWlscy5cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gbWluQ291bnQgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIG1heENvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudCB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcclxuICogQHBhcmFtIGFyZ0NvdW50IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBwcm92aWRlZC5cclxuICovXHJcbmNvbnN0IHZhbGlkYXRlQXJnQ291bnQgPSBmdW5jdGlvbiAoZm5OYW1lLCBtaW5Db3VudCwgbWF4Q291bnQsIGFyZ0NvdW50KSB7XHJcbiAgICBsZXQgYXJnRXJyb3I7XHJcbiAgICBpZiAoYXJnQ291bnQgPCBtaW5Db3VudCkge1xyXG4gICAgICAgIGFyZ0Vycm9yID0gJ2F0IGxlYXN0ICcgKyBtaW5Db3VudDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFyZ0NvdW50ID4gbWF4Q291bnQpIHtcclxuICAgICAgICBhcmdFcnJvciA9IG1heENvdW50ID09PSAwID8gJ25vbmUnIDogJ25vIG1vcmUgdGhhbiAnICsgbWF4Q291bnQ7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJnRXJyb3IpIHtcclxuICAgICAgICBjb25zdCBlcnJvciA9IGZuTmFtZSArXHJcbiAgICAgICAgICAgICcgZmFpbGVkOiBXYXMgY2FsbGVkIHdpdGggJyArXHJcbiAgICAgICAgICAgIGFyZ0NvdW50ICtcclxuICAgICAgICAgICAgKGFyZ0NvdW50ID09PSAxID8gJyBhcmd1bWVudC4nIDogJyBhcmd1bWVudHMuJykgK1xyXG4gICAgICAgICAgICAnIEV4cGVjdHMgJyArXHJcbiAgICAgICAgICAgIGFyZ0Vycm9yICtcclxuICAgICAgICAgICAgJy4nO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdG8gcHJlZml4IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgZmFpbGVkIGFyZ3VtZW50IHZhbGlkYXRpb25cclxuICpcclxuICogQHBhcmFtIGZuTmFtZSBUaGUgZnVuY3Rpb24gbmFtZVxyXG4gKiBAcGFyYW0gYXJnTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnRcclxuICogQHJldHVybiBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgZXJyb3IgdGhyb3duIGZvciB2YWxpZGF0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gZXJyb3JQcmVmaXgoZm5OYW1lLCBhcmdOYW1lKSB7XHJcbiAgICByZXR1cm4gYCR7Zm5OYW1lfSBmYWlsZWQ6ICR7YXJnTmFtZX0gYXJndW1lbnQgYDtcclxufVxyXG4vKipcclxuICogQHBhcmFtIGZuTmFtZVxyXG4gKiBAcGFyYW0gYXJndW1lbnROdW1iZXJcclxuICogQHBhcmFtIG5hbWVzcGFjZVxyXG4gKiBAcGFyYW0gb3B0aW9uYWxcclxuICovXHJcbmZ1bmN0aW9uIHZhbGlkYXRlTmFtZXNwYWNlKGZuTmFtZSwgbmFtZXNwYWNlLCBvcHRpb25hbCkge1xyXG4gICAgaWYgKG9wdGlvbmFsICYmICFuYW1lc3BhY2UpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvL1RPRE86IEkgc2hvdWxkIGRvIG1vcmUgdmFsaWRhdGlvbiBoZXJlLiBXZSBvbmx5IGFsbG93IGNlcnRhaW4gY2hhcnMgaW4gbmFtZXNwYWNlcy5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JQcmVmaXgoZm5OYW1lLCAnbmFtZXNwYWNlJykgKyAnbXVzdCBiZSBhIHZhbGlkIGZpcmViYXNlIG5hbWVzcGFjZS4nKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrKGZuTmFtZSwgYXJndW1lbnROYW1lLCBcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuY2FsbGJhY2ssIG9wdGlvbmFsKSB7XHJcbiAgICBpZiAob3B0aW9uYWwgJiYgIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLicpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dE9iamVjdChmbk5hbWUsIGFyZ3VtZW50TmFtZSwgY29udGV4dCwgb3B0aW9uYWwpIHtcclxuICAgIGlmIChvcHRpb25hbCAmJiAhY29udGV4dCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcgfHwgY29udGV4dCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGNvbnRleHQgb2JqZWN0LicpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIENvZGUgb3JpZ2luYWxseSBjYW1lIGZyb20gZ29vZy5jcnlwdC5zdHJpbmdUb1V0ZjhCeXRlQXJyYXksIGJ1dCBmb3Igc29tZSByZWFzb24gdGhleVxyXG4vLyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkICdcXHJcXG4nIHdpdGggJ1xcbicsIGFuZCB0aGV5IGRpZG4ndCBoYW5kbGUgc3Vycm9nYXRlIHBhaXJzLFxyXG4vLyBzbyBpdCdzIGJlZW4gbW9kaWZpZWQuXHJcbi8vIE5vdGUgdGhhdCBub3QgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyBhcHBlYXIgYXMgc2luZ2xlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBzdHJpbmdzLlxyXG4vLyBmcm9tQ2hhckNvZGUgcmV0dXJucyB0aGUgVVRGLTE2IGVuY29kaW5nIG9mIGEgY2hhcmFjdGVyIC0gc28gc29tZSBVbmljb2RlIGNoYXJhY3RlcnNcclxuLy8gdXNlIDIgY2hhcmFjdGVycyBpbiBKYXZhc2NyaXB0LiAgQWxsIDQtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzIGJlZ2luIHdpdGggYSBmaXJzdFxyXG4vLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDB4RDgwMCAtIDB4REJGRiAodGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHNvLWNhbGxlZCBzdXJyb2dhdGVcclxuLy8gcGFpcikuXHJcbi8vIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMS4zXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXHJcbiAqIEByZXR1cm4ge0FycmF5fVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICBjb25zdCBvdXQgPSBbXTtcclxuICAgIGxldCBwID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAvLyBJcyB0aGlzIHRoZSBsZWFkIHN1cnJvZ2F0ZSBpbiBhIHN1cnJvZ2F0ZSBwYWlyP1xyXG4gICAgICAgIGlmIChjID49IDB4ZDgwMCAmJiBjIDw9IDB4ZGJmZikge1xyXG4gICAgICAgICAgICBjb25zdCBoaWdoID0gYyAtIDB4ZDgwMDsgLy8gdGhlIGhpZ2ggMTAgYml0cy5cclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBhc3NlcnQoaSA8IHN0ci5sZW5ndGgsICdTdXJyb2dhdGUgcGFpciBtaXNzaW5nIHRyYWlsIHN1cnJvZ2F0ZS4nKTtcclxuICAgICAgICAgICAgY29uc3QgbG93ID0gc3RyLmNoYXJDb2RlQXQoaSkgLSAweGRjMDA7IC8vIHRoZSBsb3cgMTAgYml0cy5cclxuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoaGlnaCA8PCAxMCkgKyBsb3c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjIDwgMTI4KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDIwNDgpIHtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYyA8IDY1NTM2KSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcclxuICAgICAgICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XHJcbiAgICAgICAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xyXG4gICAgICAgICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgbGVuZ3RoIHdpdGhvdXQgYWN0dWFsbHkgY29udmVydGluZzsgdXNlZnVsIGZvciBkb2luZyBjaGVhcGVyIHZhbGlkYXRpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcclxuICogQHJldHVybiB7bnVtYmVyfVxyXG4gKi9cclxuY29uc3Qgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaWYgKGMgPCAxMjgpIHtcclxuICAgICAgICAgICAgcCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjIDwgMjA0OCkge1xyXG4gICAgICAgICAgICBwICs9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XHJcbiAgICAgICAgICAgIC8vIExlYWQgc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICBUaGUgcGFpciB0b2dldGhlciB3aWxsIHRha2UgNCBieXRlcyB0byByZXByZXNlbnQuXHJcbiAgICAgICAgICAgIHAgKz0gNDtcclxuICAgICAgICAgICAgaSsrOyAvLyBza2lwIHRyYWlsIHN1cnJvZ2F0ZS5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHAgKz0gMztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIENvcGllZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzXHJcbiAqIEdlbmVyYXRlcyBhIG5ldyB1dWlkLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCB1dWlkdjQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBjID0+IHtcclxuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGV4cG9uZW50aWFsbHkgaW5jcmVhc2UuXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0lOVEVSVkFMX01JTExJUyA9IDEwMDA7XHJcbi8qKlxyXG4gKiBUaGUgZmFjdG9yIHRvIGJhY2tvZmYgYnkuXHJcbiAqIFNob3VsZCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfQkFDS09GRl9GQUNUT1IgPSAyO1xyXG4vKipcclxuICogVGhlIG1heGltdW0gbWlsbGlzZWNvbmRzIHRvIGluY3JlYXNlIHRvLlxyXG4gKlxyXG4gKiA8cD5WaXNpYmxlIGZvciB0ZXN0aW5nXHJcbiAqL1xyXG5jb25zdCBNQVhfVkFMVUVfTUlMTElTID0gNCAqIDYwICogNjAgKiAxMDAwOyAvLyBGb3VyIGhvdXJzLCBsaWtlIGlPUyBhbmQgQW5kcm9pZC5cclxuLyoqXHJcbiAqIFRoZSBwZXJjZW50YWdlIG9mIGJhY2tvZmYgdGltZSB0byByYW5kb21pemUgYnkuXHJcbiAqIFNlZVxyXG4gKiBodHRwOi8vZ28vc2FmZS1jbGllbnQtYmVoYXZpb3Ijc3RlcC0xLWRldGVybWluZS10aGUtYXBwcm9wcmlhdGUtcmV0cnktaW50ZXJ2YWwtdG8taGFuZGxlLXNwaWtlLXRyYWZmaWNcclxuICogZm9yIGNvbnRleHQuXHJcbiAqXHJcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcclxuICovXHJcbmNvbnN0IFJBTkRPTV9GQUNUT1IgPSAwLjU7XHJcbi8qKlxyXG4gKiBCYXNlZCBvbiB0aGUgYmFja29mZiBtZXRob2QgZnJvbVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9jbG9zdXJlL2dvb2cvbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMuXHJcbiAqIEV4dHJhY3RlZCBoZXJlIHNvIHdlIGRvbid0IG5lZWQgdG8gcGFzcyBtZXRhZGF0YSBhbmQgYSBzdGF0ZWZ1bCBFeHBvbmVudGlhbEJhY2tvZmYgb2JqZWN0IGFyb3VuZC5cclxuICovXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmZNaWxsaXMoYmFja29mZkNvdW50LCBpbnRlcnZhbE1pbGxpcyA9IERFRkFVTFRfSU5URVJWQUxfTUlMTElTLCBiYWNrb2ZmRmFjdG9yID0gREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUikge1xyXG4gICAgLy8gQ2FsY3VsYXRlcyBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgdmFsdWUuXHJcbiAgICAvLyBEZXZpYXRpb246IGNhbGN1bGF0ZXMgdmFsdWUgZnJvbSBjb3VudCBhbmQgYSBjb25zdGFudCBpbnRlcnZhbCwgc28gd2Ugb25seSBuZWVkIHRvIHNhdmUgdmFsdWVcclxuICAgIC8vIGFuZCBjb3VudCB0byByZXN0b3JlIHN0YXRlLlxyXG4gICAgY29uc3QgY3VyckJhc2VWYWx1ZSA9IGludGVydmFsTWlsbGlzICogTWF0aC5wb3coYmFja29mZkZhY3RvciwgYmFja29mZkNvdW50KTtcclxuICAgIC8vIEEgcmFuZG9tIFwiZnV6elwiIHRvIGF2b2lkIHdhdmVzIG9mIHJldHJpZXMuXHJcbiAgICAvLyBEZXZpYXRpb246IHJhbmRvbUZhY3RvciBpcyByZXF1aXJlZC5cclxuICAgIGNvbnN0IHJhbmRvbVdhaXQgPSBNYXRoLnJvdW5kKFxyXG4gICAgLy8gQSBmcmFjdGlvbiBvZiB0aGUgYmFja29mZiB2YWx1ZSB0byBhZGQvc3VidHJhY3QuXHJcbiAgICAvLyBEZXZpYXRpb246IGNoYW5nZXMgbXVsdGlwbGljYXRpb24gb3JkZXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS5cclxuICAgIFJBTkRPTV9GQUNUT1IgKlxyXG4gICAgICAgIGN1cnJCYXNlVmFsdWUgKlxyXG4gICAgICAgIC8vIEEgcmFuZG9tIGZsb2F0IChyb3VuZGVkIHRvIGludCBieSBNYXRoLnJvdW5kIGFib3ZlKSBpbiB0aGUgcmFuZ2UgWy0xLCAxXS4gRGV0ZXJtaW5lc1xyXG4gICAgICAgIC8vIGlmIHdlIGFkZCBvciBzdWJ0cmFjdC5cclxuICAgICAgICAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKlxyXG4gICAgICAgIDIpO1xyXG4gICAgLy8gTGltaXRzIGJhY2tvZmYgdG8gbWF4IHRvIGF2b2lkIGVmZmVjdGl2ZWx5IHBlcm1hbmVudCBiYWNrb2ZmLlxyXG4gICAgcmV0dXJuIE1hdGgubWluKE1BWF9WQUxVRV9NSUxMSVMsIGN1cnJCYXNlVmFsdWUgKyByYW5kb21XYWl0KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZSBFbmdsaXNoIG9yZGluYWwgbGV0dGVycyBhZnRlciBhIG51bWJlclxyXG4gKi9cclxuZnVuY3Rpb24gb3JkaW5hbChpKSB7XHJcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpKSkge1xyXG4gICAgICAgIHJldHVybiBgJHtpfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaSArIGluZGljYXRvcihpKTtcclxufVxyXG5mdW5jdGlvbiBpbmRpY2F0b3IoaSkge1xyXG4gICAgaSA9IE1hdGguYWJzKGkpO1xyXG4gICAgY29uc3QgY2VudCA9IGkgJSAxMDA7XHJcbiAgICBpZiAoY2VudCA+PSAxMCAmJiBjZW50IDw9IDIwKSB7XHJcbiAgICAgICAgcmV0dXJuICd0aCc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWMgPSBpICUgMTA7XHJcbiAgICBpZiAoZGVjID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuICdzdCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAyKSB7XHJcbiAgICAgICAgcmV0dXJuICduZCc7XHJcbiAgICB9XHJcbiAgICBpZiAoZGVjID09PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuICdyZCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ3RoJztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRNb2R1bGFySW5zdGFuY2Uoc2VydmljZSkge1xyXG4gICAgaWYgKHNlcnZpY2UgJiYgc2VydmljZS5fZGVsZWdhdGUpIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZS5fZGVsZWdhdGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gc2VydmljZTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBDT05TVEFOVFMsIERlY29kZUJhc2U2NFN0cmluZ0Vycm9yLCBEZWZlcnJlZCwgRXJyb3JGYWN0b3J5LCBGaXJlYmFzZUVycm9yLCBNQVhfVkFMVUVfTUlMTElTLCBSQU5ET01fRkFDVE9SLCBTaGExLCBhcmVDb29raWVzRW5hYmxlZCwgYXNzZXJ0LCBhc3NlcnRpb25FcnJvciwgYXN5bmMsIGJhc2U2NCwgYmFzZTY0RGVjb2RlLCBiYXNlNjRFbmNvZGUsIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nLCBjYWxjdWxhdGVCYWNrb2ZmTWlsbGlzLCBjb250YWlucywgY3JlYXRlTW9ja1VzZXJUb2tlbiwgY3JlYXRlU3Vic2NyaWJlLCBkZWNvZGUsIGRlZXBDb3B5LCBkZWVwRXF1YWwsIGRlZXBFeHRlbmQsIGVycm9yUHJlZml4LCBleHRyYWN0UXVlcnlzdHJpbmcsIGdldERlZmF1bHRBcHBDb25maWcsIGdldERlZmF1bHRFbXVsYXRvckhvc3QsIGdldERlZmF1bHRFbXVsYXRvckhvc3RuYW1lQW5kUG9ydCwgZ2V0RGVmYXVsdHMsIGdldEV4cGVyaW1lbnRhbFNldHRpbmcsIGdldEdsb2JhbCwgZ2V0TW9kdWxhckluc3RhbmNlLCBnZXRVQSwgaXNBZG1pbiwgaXNCcm93c2VyLCBpc0Jyb3dzZXJFeHRlbnNpb24sIGlzRWxlY3Ryb24sIGlzRW1wdHksIGlzSUUsIGlzSW5kZXhlZERCQXZhaWxhYmxlLCBpc01vYmlsZUNvcmRvdmEsIGlzTm9kZSwgaXNOb2RlU2RrLCBpc1JlYWN0TmF0aXZlLCBpc1NhZmFyaSwgaXNVV1AsIGlzVmFsaWRGb3JtYXQsIGlzVmFsaWRUaW1lc3RhbXAsIGlzc3VlZEF0VGltZSwganNvbkV2YWwsIG1hcCwgb3JkaW5hbCwgcHJvbWlzZVdpdGhUaW1lb3V0LCBxdWVyeXN0cmluZywgcXVlcnlzdHJpbmdEZWNvZGUsIHNhZmVHZXQsIHN0cmluZ0xlbmd0aCwgc3RyaW5nVG9CeXRlQXJyYXksIHN0cmluZ2lmeSwgdXVpZHY0LCB2YWxpZGF0ZUFyZ0NvdW50LCB2YWxpZGF0ZUNhbGxiYWNrLCB2YWxpZGF0ZUNvbnRleHRPYmplY3QsIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUsIHZhbGlkYXRlTmFtZXNwYWNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBFcnJvckZhY3RvcnksIGlzQnJvd3NlckV4dGVuc2lvbiwgaXNNb2JpbGVDb3Jkb3ZhLCBpc1JlYWN0TmF0aXZlLCBGaXJlYmFzZUVycm9yLCBxdWVyeXN0cmluZywgZ2V0TW9kdWxhckluc3RhbmNlLCBiYXNlNjREZWNvZGUsIGdldFVBLCBpc0lFLCBjcmVhdGVTdWJzY3JpYmUsIGRlZXBFcXVhbCwgcXVlcnlzdHJpbmdEZWNvZGUsIGV4dHJhY3RRdWVyeXN0cmluZywgaXNFbXB0eSwgZ2V0RXhwZXJpbWVudGFsU2V0dGluZywgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFNES19WRVJTSU9OLCBfZ2V0UHJvdmlkZXIsIF9yZWdpc3RlckNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uLCBnZXRBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IF9fcmVzdCB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQW4gZW51bSBvZiBmYWN0b3JzIHRoYXQgbWF5IGJlIHVzZWQgZm9yIG11bHRpZmFjdG9yIGF1dGhlbnRpY2F0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBGYWN0b3JJZCA9IHtcclxuICAgIC8qKiBQaG9uZSBhcyBzZWNvbmQgZmFjdG9yICovXHJcbiAgICBQSE9ORTogJ3Bob25lJyxcclxuICAgIFRPVFA6ICd0b3RwJ1xyXG59O1xyXG4vKipcclxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHByb3ZpZGVycy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgUHJvdmlkZXJJZCA9IHtcclxuICAgIC8qKiBGYWNlYm9vayBwcm92aWRlciBJRCAqL1xyXG4gICAgRkFDRUJPT0s6ICdmYWNlYm9vay5jb20nLFxyXG4gICAgLyoqIEdpdEh1YiBwcm92aWRlciBJRCAqL1xyXG4gICAgR0lUSFVCOiAnZ2l0aHViLmNvbScsXHJcbiAgICAvKiogR29vZ2xlIHByb3ZpZGVyIElEICovXHJcbiAgICBHT09HTEU6ICdnb29nbGUuY29tJyxcclxuICAgIC8qKiBQYXNzd29yZCBwcm92aWRlciAqL1xyXG4gICAgUEFTU1dPUkQ6ICdwYXNzd29yZCcsXHJcbiAgICAvKiogUGhvbmUgcHJvdmlkZXIgKi9cclxuICAgIFBIT05FOiAncGhvbmUnLFxyXG4gICAgLyoqIFR3aXR0ZXIgcHJvdmlkZXIgSUQgKi9cclxuICAgIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcclxufTtcclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBzaWduLWluIG1ldGhvZHMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IFNpZ25Jbk1ldGhvZCA9IHtcclxuICAgIC8qKiBFbWFpbCBsaW5rIHNpZ24gaW4gbWV0aG9kICovXHJcbiAgICBFTUFJTF9MSU5LOiAnZW1haWxMaW5rJyxcclxuICAgIC8qKiBFbWFpbC9wYXNzd29yZCBzaWduIGluIG1ldGhvZCAqL1xyXG4gICAgRU1BSUxfUEFTU1dPUkQ6ICdwYXNzd29yZCcsXHJcbiAgICAvKiogRmFjZWJvb2sgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEZBQ0VCT09LOiAnZmFjZWJvb2suY29tJyxcclxuICAgIC8qKiBHaXRIdWIgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIEdJVEhVQjogJ2dpdGh1Yi5jb20nLFxyXG4gICAgLyoqIEdvb2dsZSBzaWduIGluIG1ldGhvZCAqL1xyXG4gICAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXHJcbiAgICAvKiogUGhvbmUgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIFBIT05FOiAncGhvbmUnLFxyXG4gICAgLyoqIFR3aXR0ZXIgc2lnbiBpbiBtZXRob2QgKi9cclxuICAgIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcclxufTtcclxuLyoqXHJcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBvcGVyYXRpb24gdHlwZXMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IE9wZXJhdGlvblR5cGUgPSB7XHJcbiAgICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBsaW5raW5nIGFuIGFkZGl0aW9uYWwgcHJvdmlkZXIgdG8gYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cclxuICAgIExJTks6ICdsaW5rJyxcclxuICAgIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIHVzaW5nIGEgcHJvdmlkZXIgdG8gcmVhdXRoZW50aWNhdGUgYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cclxuICAgIFJFQVVUSEVOVElDQVRFOiAncmVhdXRoZW50aWNhdGUnLFxyXG4gICAgLyoqIE9wZXJhdGlvbiBpbnZvbHZpbmcgc2lnbmluZyBpbiBhIHVzZXIuICovXHJcbiAgICBTSUdOX0lOOiAnc2lnbkluJ1xyXG59O1xyXG4vKipcclxuICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGVtYWlsIGFjdGlvbiB0eXBlcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgQWN0aW9uQ29kZU9wZXJhdGlvbiA9IHtcclxuICAgIC8qKiBUaGUgZW1haWwgbGluayBzaWduLWluIGFjdGlvbi4gKi9cclxuICAgIEVNQUlMX1NJR05JTjogJ0VNQUlMX1NJR05JTicsXHJcbiAgICAvKiogVGhlIHBhc3N3b3JkIHJlc2V0IGFjdGlvbi4gKi9cclxuICAgIFBBU1NXT1JEX1JFU0VUOiAnUEFTU1dPUkRfUkVTRVQnLFxyXG4gICAgLyoqIFRoZSBlbWFpbCByZXZvY2F0aW9uIGFjdGlvbi4gKi9cclxuICAgIFJFQ09WRVJfRU1BSUw6ICdSRUNPVkVSX0VNQUlMJyxcclxuICAgIC8qKiBUaGUgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb24gZW1haWwgYWN0aW9uLiAqL1xyXG4gICAgUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046ICdSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTicsXHJcbiAgICAvKiogVGhlIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uIGVtYWlsIGFjdGlvbi4gKi9cclxuICAgIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOiAnVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwnLFxyXG4gICAgLyoqIFRoZSBlbWFpbCB2ZXJpZmljYXRpb24gYWN0aW9uLiAqL1xyXG4gICAgVkVSSUZZX0VNQUlMOiAnVkVSSUZZX0VNQUlMJ1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfZGVidWdFcnJvck1hcCgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgW1wiYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb25cIiAvKiBBdXRoRXJyb3JDb2RlLkFETUlOX09OTFlfT1BFUkFUSU9OICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gYWRtaW5pc3RyYXRvcnMgb25seS4nLFxyXG4gICAgICAgIFtcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqL106ICcnLFxyXG4gICAgICAgIFtcImFwcC1ub3QtYXV0aG9yaXplZFwiIC8qIEF1dGhFcnJvckNvZGUuQVBQX05PVF9BVVRIT1JJWkVEICovXTogXCJUaGlzIGFwcCwgaWRlbnRpZmllZCBieSB0aGUgZG9tYWluIHdoZXJlIGl0J3MgaG9zdGVkLCBpcyBub3QgXCIgK1xyXG4gICAgICAgICAgICAnYXV0aG9yaXplZCB0byB1c2UgRmlyZWJhc2UgQXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgQVBJIGtleS4gJyArXHJcbiAgICAgICAgICAgICdSZXZpZXcgeW91ciBrZXkgY29uZmlndXJhdGlvbiBpbiB0aGUgR29vZ2xlIEFQSSBjb25zb2xlLicsXHJcbiAgICAgICAgW1wiYXBwLW5vdC1pbnN0YWxsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLkFQUF9OT1RfSU5TVEFMTEVEICovXTogJ1RoZSByZXF1ZXN0ZWQgbW9iaWxlIGFwcGxpY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlkZW50aWZpZXIgKCcgK1xyXG4gICAgICAgICAgICAnQW5kcm9pZCBwYWNrYWdlIG5hbWUgb3IgaU9TIGJ1bmRsZSBJRCkgcHJvdmlkZWQgaXMgbm90IGluc3RhbGxlZCBvbiAnICtcclxuICAgICAgICAgICAgJ3RoaXMgZGV2aWNlLicsXHJcbiAgICAgICAgW1wiY2FwdGNoYS1jaGVjay1mYWlsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLkNBUFRDSEFfQ0hFQ0tfRkFJTEVEICovXTogJ1RoZSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gcHJvdmlkZWQgaXMgZWl0aGVyIGludmFsaWQsIGV4cGlyZWQsICcgK1xyXG4gICAgICAgICAgICAnYWxyZWFkeSB1c2VkIG9yIHRoZSBkb21haW4gYXNzb2NpYXRlZCB3aXRoIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBsaXN0ICcgK1xyXG4gICAgICAgICAgICAnb2Ygd2hpdGVsaXN0ZWQgZG9tYWlucy4nLFxyXG4gICAgICAgIFtcImNvZGUtZXhwaXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuQ09ERV9FWFBJUkVEICovXTogJ1RoZSBTTVMgY29kZSBoYXMgZXhwaXJlZC4gUGxlYXNlIHJlLXNlbmQgdGhlIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHRyeSAnICtcclxuICAgICAgICAgICAgJ2FnYWluLicsXHJcbiAgICAgICAgW1wiY29yZG92YS1ub3QtcmVhZHlcIiAvKiBBdXRoRXJyb3JDb2RlLkNPUkRPVkFfTk9UX1JFQURZICovXTogJ0NvcmRvdmEgZnJhbWV3b3JrIGlzIG5vdCByZWFkeS4nLFxyXG4gICAgICAgIFtcImNvcnMtdW5zdXBwb3J0ZWRcIiAvKiBBdXRoRXJyb3JDb2RlLkNPUlNfVU5TVVBQT1JURUQgKi9dOiAnVGhpcyBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuJyxcclxuICAgICAgICBbXCJjcmVkZW50aWFsLWFscmVhZHktaW4tdXNlXCIgLyogQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFICovXTogJ1RoaXMgY3JlZGVudGlhbCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCB1c2VyIGFjY291bnQuJyxcclxuICAgICAgICBbXCJjdXN0b20tdG9rZW4tbWlzbWF0Y2hcIiAvKiBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfTUlTTUFUQ0ggKi9dOiAnVGhlIGN1c3RvbSB0b2tlbiBjb3JyZXNwb25kcyB0byBhIGRpZmZlcmVudCBhdWRpZW5jZS4nLFxyXG4gICAgICAgIFtcInJlcXVpcmVzLXJlY2VudC1sb2dpblwiIC8qIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIHNlbnNpdGl2ZSBhbmQgcmVxdWlyZXMgcmVjZW50IGF1dGhlbnRpY2F0aW9uLiBMb2cgaW4gJyArXHJcbiAgICAgICAgICAgICdhZ2FpbiBiZWZvcmUgcmV0cnlpbmcgdGhpcyByZXF1ZXN0LicsXHJcbiAgICAgICAgW1wiZGVwZW5kZW50LXNkay1pbml0aWFsaXplZC1iZWZvcmUtYXV0aFwiIC8qIEF1dGhFcnJvckNvZGUuREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIICovXTogJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xyXG4gICAgICAgICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSBiZSBzdXJlIHRvIGNhbGwgYGluaXRpYWxpemVBdXRoYCBvciBgZ2V0QXV0aGAgYmVmb3JlICcgK1xyXG4gICAgICAgICAgICAnc3RhcnRpbmcgYW55IG90aGVyIEZpcmViYXNlIFNESy4nLFxyXG4gICAgICAgIFtcImR5bmFtaWMtbGluay1ub3QtYWN0aXZhdGVkXCIgLyogQXV0aEVycm9yQ29kZS5EWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRCAqL106ICdQbGVhc2UgYWN0aXZhdGUgRHluYW1pYyBMaW5rcyBpbiB0aGUgRmlyZWJhc2UgQ29uc29sZSBhbmQgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCAnICtcclxuICAgICAgICAgICAgJ2NvbmRpdGlvbnMuJyxcclxuICAgICAgICBbXCJlbWFpbC1jaGFuZ2UtbmVlZHMtdmVyaWZpY2F0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5FTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OICovXTogJ011bHRpLWZhY3RvciB1c2VycyBtdXN0IGFsd2F5cyBoYXZlIGEgdmVyaWZpZWQgZW1haWwuJyxcclxuICAgICAgICBbXCJlbWFpbC1hbHJlYWR5LWluLXVzZVwiIC8qIEF1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTICovXTogJ1RoZSBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgYWNjb3VudC4nLFxyXG4gICAgICAgIFtcImVtdWxhdG9yLWNvbmZpZy1mYWlsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLkVNVUxBVE9SX0NPTkZJR19GQUlMRUQgKi9dOiAnQXV0aCBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgdG8gbWFrZSBhIG5ldHdvcmsgY2FsbC4gQXV0aCBjYW4gJyArXHJcbiAgICAgICAgICAgICdubyBsb25nZXIgYmUgY29uZmlndXJlZCB0byB1c2UgdGhlIGVtdWxhdG9yLiBUcnkgY2FsbGluZyAnICtcclxuICAgICAgICAgICAgJ1wiY29ubmVjdEF1dGhFbXVsYXRvcigpXCIgc29vbmVyLicsXHJcbiAgICAgICAgW1wiZXhwaXJlZC1hY3Rpb24tY29kZVwiIC8qIEF1dGhFcnJvckNvZGUuRVhQSVJFRF9PT0JfQ09ERSAqL106ICdUaGUgYWN0aW9uIGNvZGUgaGFzIGV4cGlyZWQuJyxcclxuICAgICAgICBbXCJjYW5jZWxsZWQtcG9wdXAtcmVxdWVzdFwiIC8qIEF1dGhFcnJvckNvZGUuRVhQSVJFRF9QT1BVUF9SRVFVRVNUICovXTogJ1RoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBkdWUgdG8gYW5vdGhlciBjb25mbGljdGluZyBwb3B1cCBiZWluZyBvcGVuZWQuJyxcclxuICAgICAgICBbXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi9dOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtYXBwLWNyZWRlbnRpYWxcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBQX0NSRURFTlRJQUwgKi9dOiAnVGhlIHBob25lIHZlcmlmaWNhdGlvbiByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgYXBwbGljYXRpb24gdmVyaWZpZXIuJyArXHJcbiAgICAgICAgICAgICcgVGhlIHJlQ0FQVENIQSB0b2tlbiByZXNwb25zZSBpcyBlaXRoZXIgaW52YWxpZCBvciBleHBpcmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hcHAtaWRcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBQX0lEICovXTogJ1RoZSBtb2JpbGUgYXBwIGlkZW50aWZpZXIgaXMgbm90IHJlZ2lzdGVkIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LicsXHJcbiAgICAgICAgW1wiaW52YWxpZC11c2VyLXRva2VuXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEggKi9dOiBcIlRoaXMgdXNlcidzIGNyZWRlbnRpYWwgaXNuJ3QgdmFsaWQgZm9yIHRoaXMgcHJvamVjdC4gVGhpcyBjYW4gaGFwcGVuIFwiICtcclxuICAgICAgICAgICAgXCJpZiB0aGUgdXNlcidzIHRva2VuIGhhcyBiZWVuIHRhbXBlcmVkIHdpdGgsIG9yIGlmIHRoZSB1c2VyIGlzbid0IGZvciBcIiArXHJcbiAgICAgICAgICAgICd0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBBUEkga2V5LicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hdXRoLWV2ZW50XCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhfRVZFTlQgKi9dOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGVcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09ERSAqL106ICdUaGUgU01TIHZlcmlmaWNhdGlvbiBjb2RlIHVzZWQgdG8gY3JlYXRlIHRoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgaXMgJyArXHJcbiAgICAgICAgICAgICdpbnZhbGlkLiBQbGVhc2UgcmVzZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSBzbXMgYW5kIGJlIHN1cmUgdG8gdXNlIHRoZSAnICtcclxuICAgICAgICAgICAgJ3ZlcmlmaWNhdGlvbiBjb2RlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jb250aW51ZS11cmlcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09OVElOVUVfVVJJICovXTogJ1RoZSBjb250aW51ZSBVUkwgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtY29yZG92YS1jb25maWd1cmF0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqL106ICdUaGUgZm9sbG93aW5nIENvcmRvdmEgcGx1Z2lucyBtdXN0IGJlIGluc3RhbGxlZCB0byBlbmFibGUgT0F1dGggc2lnbi1pbjogJyArXHJcbiAgICAgICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1idWlsZGluZm8sIGNvcmRvdmEtdW5pdmVyc2FsLWxpbmtzLXBsdWdpbiwgJyArXHJcbiAgICAgICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiLCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXIgYW5kICcgK1xyXG4gICAgICAgICAgICAnY29yZG92YS1wbHVnaW4tY3VzdG9tdXJsc2NoZW1lLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jdXN0b20tdG9rZW5cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ1VTVE9NX1RPS0VOICovXTogJ1RoZSBjdXN0b20gdG9rZW4gZm9ybWF0IGlzIGluY29ycmVjdC4gUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU4gKi9dOiAnVGhlIHByb3ZpZGVkIGR5bmFtaWMgbGluayBkb21haW4gaXMgbm90IGNvbmZpZ3VyZWQgb3IgYXV0aG9yaXplZCBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtZW1haWxcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1BSUwgKi9dOiAnVGhlIGVtYWlsIGFkZHJlc3MgaXMgYmFkbHkgZm9ybWF0dGVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1lbXVsYXRvci1zY2hlbWVcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1VTEFUT1JfU0NIRU1FICovXTogJ0VtdWxhdG9yIFVSTCBtdXN0IHN0YXJ0IHdpdGggYSB2YWxpZCBzY2hlbWUgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1hcGkta2V5XCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVkgKi9dOiAnWW91ciBBUEkga2V5IGlzIGludmFsaWQsIHBsZWFzZSBjaGVjayB5b3UgaGF2ZSBjb3BpZWQgaXQgY29ycmVjdGx5LicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1jZXJ0LWhhc2hcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ0VSVF9IQVNIICovXTogJ1RoZSBTSEEtMSBjZXJ0aWZpY2F0ZSBoYXNoIHByb3ZpZGVkIGlzIGludmFsaWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLWNyZWRlbnRpYWxcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfSURQX1JFU1BPTlNFICovXTogJ1RoZSBzdXBwbGllZCBhdXRoIGNyZWRlbnRpYWwgaXMgbWFsZm9ybWVkIG9yIGhhcyBleHBpcmVkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1tZXNzYWdlLXBheWxvYWRcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfTUVTU0FHRV9QQVlMT0FEICovXTogJ1RoZSBlbWFpbCB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyBpbiBpdHMgbWVzc2FnZS4gJyArXHJcbiAgICAgICAgICAgICdQbGVhc2UgZml4IGJ5IGdvaW5nIHRvIHRoZSBBdXRoIGVtYWlsIHRlbXBsYXRlcyBzZWN0aW9uIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9NRkFfU0VTU0lPTiAqL106ICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxyXG4gICAgICAgIFtcImludmFsaWQtb2F1dGgtcHJvdmlkZXJcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfUFJPVklERVIgKi9dOiAnRW1haWxBdXRoUHJvdmlkZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uIFRoaXMgb3BlcmF0aW9uICcgK1xyXG4gICAgICAgICAgICAnb25seSBzdXBwb3J0cyBPQXV0aCBwcm92aWRlcnMuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLW9hdXRoLWNsaWVudC1pZFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgKi9dOiAnVGhlIE9BdXRoIGNsaWVudCBJRCBwcm92aWRlZCBpcyBlaXRoZXIgaW52YWxpZCBvciBkb2VzIG5vdCBtYXRjaCB0aGUgJyArXHJcbiAgICAgICAgICAgICdzcGVjaWZpZWQgQVBJIGtleS4nLFxyXG4gICAgICAgIFtcInVuYXV0aG9yaXplZC1kb21haW5cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT1JJR0lOICovXTogJ1RoaXMgZG9tYWluIGlzIG5vdCBhdXRob3JpemVkIGZvciBPQXV0aCBvcGVyYXRpb25zIGZvciB5b3VyIEZpcmViYXNlICcgK1xyXG4gICAgICAgICAgICAncHJvamVjdC4gRWRpdCB0aGUgbGlzdCBvZiBhdXRob3JpemVkIGRvbWFpbnMgZnJvbSB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxyXG4gICAgICAgIFtcImludmFsaWQtYWN0aW9uLWNvZGVcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT09CX0NPREUgKi9dOiAnVGhlIGFjdGlvbiBjb2RlIGlzIGludmFsaWQuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgY29kZSBpcyBtYWxmb3JtZWQsICcgK1xyXG4gICAgICAgICAgICAnZXhwaXJlZCwgb3IgaGFzIGFscmVhZHkgYmVlbiB1c2VkLicsXHJcbiAgICAgICAgW1wid3JvbmctcGFzc3dvcmRcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfUEFTU1dPUkQgKi9dOiAnVGhlIHBhc3N3b3JkIGlzIGludmFsaWQgb3IgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhIHBhc3N3b3JkLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1BFUlNJU1RFTkNFICovXTogJ1RoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZSBpcyBpbnZhbGlkLiBJdCBjYW4gb25seSBiZSBsb2NhbCwgc2Vzc2lvbiBvciBub25lLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1waG9uZS1udW1iZXJcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfUEhPTkVfTlVNQkVSICovXTogJ1RoZSBmb3JtYXQgb2YgdGhlIHBob25lIG51bWJlciBwcm92aWRlZCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBlbnRlciB0aGUgJyArXHJcbiAgICAgICAgICAgICdwaG9uZSBudW1iZXIgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFyc2VkIGludG8gRS4xNjQgZm9ybWF0LiBFLjE2NCAnICtcclxuICAgICAgICAgICAgJ3Bob25lIG51bWJlcnMgYXJlIHdyaXR0ZW4gaW4gdGhlIGZvcm1hdCBbK11bY291bnRyeSBjb2RlXVtzdWJzY3JpYmVyICcgK1xyXG4gICAgICAgICAgICAnbnVtYmVyIGluY2x1ZGluZyBhcmVhIGNvZGVdLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1wcm92aWRlci1pZFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9QUk9WSURFUl9JRCAqL106ICdUaGUgc3BlY2lmaWVkIHByb3ZpZGVyIElEIGlzIGludmFsaWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXJlY2lwaWVudC1lbWFpbFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNJUElFTlRfRU1BSUwgKi9dOiAnVGhlIGVtYWlsIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gZmFpbGVkIHRvIHNlbmQgYXMgdGhlIHByb3ZpZGVkICcgK1xyXG4gICAgICAgICAgICAncmVjaXBpZW50IGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZC4nLFxyXG4gICAgICAgIFtcImludmFsaWQtc2VuZGVyXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFTkRFUiAqL106ICdUaGUgZW1haWwgdGVtcGxhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBjb250YWlucyBhbiBpbnZhbGlkIHNlbmRlciBlbWFpbCBvciBuYW1lLiAnICtcclxuICAgICAgICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXZlcmlmaWNhdGlvbi1pZFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9TRVNTSU9OX0lORk8gKi9dOiAnVGhlIHZlcmlmaWNhdGlvbiBJRCB1c2VkIHRvIGNyZWF0ZSB0aGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIGlzIGludmFsaWQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXRlbmFudC1pZFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9URU5BTlRfSUQgKi9dOiBcIlRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEIGlzIGludmFsaWQuXCIsXHJcbiAgICAgICAgW1wibG9naW4tYmxvY2tlZFwiIC8qIEF1dGhFcnJvckNvZGUuTE9HSU5fQkxPQ0tFRCAqL106ICdMb2dpbiBibG9ja2VkIGJ5IHVzZXItcHJvdmlkZWQgbWV0aG9kOiB7JG9yaWdpbmFsTWVzc2FnZX0nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctYW5kcm9pZC1wa2ctbmFtZVwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSAqL106ICdBbiBBbmRyb2lkIFBhY2thZ2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBBbmRyb2lkIEFwcCBpcyByZXF1aXJlZCB0byBiZSBpbnN0YWxsZWQuJyxcclxuICAgICAgICBbXCJhdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWRcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4gKi9dOiAnQmUgc3VyZSB0byBpbmNsdWRlIGF1dGhEb21haW4gd2hlbiBjYWxsaW5nIGZpcmViYXNlLmluaXRpYWxpemVBcHAoKSwgJyArXHJcbiAgICAgICAgICAgICdieSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctYXBwLWNyZWRlbnRpYWxcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVBQX0NSRURFTlRJQUwgKi9dOiAnVGhlIHBob25lIHZlcmlmaWNhdGlvbiByZXF1ZXN0IGlzIG1pc3NpbmcgYW4gYXBwbGljYXRpb24gdmVyaWZpZXIgJyArXHJcbiAgICAgICAgICAgICdhc3NlcnRpb24uIEEgcmVDQVBUQ0hBIHJlc3BvbnNlIHRva2VuIG5lZWRzIHRvIGJlIHByb3ZpZGVkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy12ZXJpZmljYXRpb24tY29kZVwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19DT0RFICovXTogJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWNvbnRpbnVlLXVyaVwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19DT05USU5VRV9VUkkgKi9dOiAnQSBjb250aW51ZSBVUkwgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctaWZyYW1lLXN0YXJ0XCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0lGUkFNRV9TVEFSVCAqL106ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1pb3MtYnVuZGxlLWlkXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0lPU19CVU5ETEVfSUQgKi9dOiAnQW4gaU9TIEJ1bmRsZSBJRCBtdXN0IGJlIHByb3ZpZGVkIGlmIGFuIEFwcCBTdG9yZSBJRCBpcyBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm1pc3Npbmctb3ItaW52YWxpZC1ub25jZVwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19PUl9JTlZBTElEX05PTkNFICovXTogJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBub25jZS4gVGhpcyBjYW4gb2NjdXIgaWYgdGhlICcgK1xyXG4gICAgICAgICAgICAnU0hBLTI1NiBoYXNoIG9mIHRoZSBwcm92aWRlZCByYXcgbm9uY2UgZG9lcyBub3QgbWF0Y2ggdGhlIGhhc2hlZCBub25jZSAnICtcclxuICAgICAgICAgICAgJ2luIHRoZSBJRCB0b2tlbiBwYXlsb2FkLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1wYXNzd29yZFwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19QQVNTV09SRCAqL106ICdBIG5vbi1lbXB0eSBwYXNzd29yZCBtdXN0IGJlIHByb3ZpZGVkJyxcclxuICAgICAgICBbXCJtaXNzaW5nLW11bHRpLWZhY3Rvci1pbmZvXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX01GQV9JTkZPICovXTogJ05vIHNlY29uZCBmYWN0b3IgaWRlbnRpZmllciBpcyBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb25cIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX1NFU1NJT04gKi9dOiAnVGhlIHJlcXVlc3QgaXMgbWlzc2luZyBwcm9vZiBvZiBmaXJzdCBmYWN0b3Igc3VjY2Vzc2Z1bCBzaWduLWluLicsXHJcbiAgICAgICAgW1wibWlzc2luZy1waG9uZS1udW1iZXJcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUEhPTkVfTlVNQkVSICovXTogJ1RvIHNlbmQgdmVyaWZpY2F0aW9uIGNvZGVzLCBwcm92aWRlIGEgcGhvbmUgbnVtYmVyIGZvciB0aGUgcmVjaXBpZW50LicsXHJcbiAgICAgICAgW1wibWlzc2luZy12ZXJpZmljYXRpb24taWRcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfU0VTU0lPTl9JTkZPICovXTogJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSB2ZXJpZmljYXRpb24gSUQuJyxcclxuICAgICAgICBbXCJhcHAtZGVsZXRlZFwiIC8qIEF1dGhFcnJvckNvZGUuTU9EVUxFX0RFU1RST1lFRCAqL106ICdUaGlzIGluc3RhbmNlIG9mIEZpcmViYXNlQXBwIGhhcyBiZWVuIGRlbGV0ZWQuJyxcclxuICAgICAgICBbXCJtdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmRcIiAvKiBBdXRoRXJyb3JDb2RlLk1GQV9JTkZPX05PVF9GT1VORCAqL106ICdUaGUgdXNlciBkb2VzIG5vdCBoYXZlIGEgc2Vjb25kIGZhY3RvciBtYXRjaGluZyB0aGUgaWRlbnRpZmllciBwcm92aWRlZC4nLFxyXG4gICAgICAgIFtcIm11bHRpLWZhY3Rvci1hdXRoLXJlcXVpcmVkXCIgLyogQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRUQgKi9dOiAnUHJvb2Ygb2Ygb3duZXJzaGlwIG9mIGEgc2Vjb25kIGZhY3RvciBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSBzaWduLWluLicsXHJcbiAgICAgICAgW1wiYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbFwiIC8qIEF1dGhFcnJvckNvZGUuTkVFRF9DT05GSVJNQVRJT04gKi9dOiAnQW4gYWNjb3VudCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MgYnV0IGRpZmZlcmVudCAnICtcclxuICAgICAgICAgICAgJ3NpZ24taW4gY3JlZGVudGlhbHMuIFNpZ24gaW4gdXNpbmcgYSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyAnICtcclxuICAgICAgICAgICAgJ2VtYWlsIGFkZHJlc3MuJyxcclxuICAgICAgICBbXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovXTogJ0EgbmV0d29yayBBdXRoRXJyb3IgKHN1Y2ggYXMgdGltZW91dCwgaW50ZXJydXB0ZWQgY29ubmVjdGlvbiBvciB1bnJlYWNoYWJsZSBob3N0KSBoYXMgb2NjdXJyZWQuJyxcclxuICAgICAgICBbXCJuby1hdXRoLWV2ZW50XCIgLyogQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UICovXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcclxuICAgICAgICBbXCJuby1zdWNoLXByb3ZpZGVyXCIgLyogQXV0aEVycm9yQ29kZS5OT19TVUNIX1BST1ZJREVSICovXTogJ1VzZXIgd2FzIG5vdCBsaW5rZWQgdG8gYW4gYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwcm92aWRlci4nLFxyXG4gICAgICAgIFtcIm51bGwtdXNlclwiIC8qIEF1dGhFcnJvckNvZGUuTlVMTF9VU0VSICovXTogJ0EgbnVsbCB1c2VyIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgdGhlIGFyZ3VtZW50IGZvciBhbiBvcGVyYXRpb24gd2hpY2ggJyArXHJcbiAgICAgICAgICAgICdyZXF1aXJlcyBhIG5vbi1udWxsIHVzZXIgb2JqZWN0LicsXHJcbiAgICAgICAgW1wib3BlcmF0aW9uLW5vdC1hbGxvd2VkXCIgLyogQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX0FMTE9XRUQgKi9dOiAnVGhlIGdpdmVuIHNpZ24taW4gcHJvdmlkZXIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgRmlyZWJhc2UgcHJvamVjdC4gJyArXHJcbiAgICAgICAgICAgICdFbmFibGUgaXQgaW4gdGhlIEZpcmViYXNlIGNvbnNvbGUsIHVuZGVyIHRoZSBzaWduLWluIG1ldGhvZCB0YWIgb2YgdGhlICcgK1xyXG4gICAgICAgICAgICAnQXV0aCBzZWN0aW9uLicsXHJcbiAgICAgICAgW1wib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi9dOiAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW52aXJvbm1lbnQgdGhpcyBhcHBsaWNhdGlvbiBpcyAnICtcclxuICAgICAgICAgICAgJ3J1bm5pbmcgb24uIFwibG9jYXRpb24ucHJvdG9jb2xcIiBtdXN0IGJlIGh0dHAsIGh0dHBzIG9yIGNocm9tZS1leHRlbnNpb24nICtcclxuICAgICAgICAgICAgJyBhbmQgd2ViIHN0b3JhZ2UgbXVzdCBiZSBlbmFibGVkLicsXHJcbiAgICAgICAgW1wicG9wdXAtYmxvY2tlZFwiIC8qIEF1dGhFcnJvckNvZGUuUE9QVVBfQkxPQ0tFRCAqL106ICdVbmFibGUgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBwb3B1cC4gSXQgbWF5IGhhdmUgYmVlbiBibG9ja2VkIGJ5IHRoZSBicm93c2VyLicsXHJcbiAgICAgICAgW1wicG9wdXAtY2xvc2VkLWJ5LXVzZXJcIiAvKiBBdXRoRXJyb3JDb2RlLlBPUFVQX0NMT1NFRF9CWV9VU0VSICovXTogJ1RoZSBwb3B1cCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGZpbmFsaXppbmcgdGhlIG9wZXJhdGlvbi4nLFxyXG4gICAgICAgIFtcInByb3ZpZGVyLWFscmVhZHktbGlua2VkXCIgLyogQXV0aEVycm9yQ29kZS5QUk9WSURFUl9BTFJFQURZX0xJTktFRCAqL106ICdVc2VyIGNhbiBvbmx5IGJlIGxpbmtlZCB0byBvbmUgaWRlbnRpdHkgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4nLFxyXG4gICAgICAgIFtcInF1b3RhLWV4Y2VlZGVkXCIgLyogQXV0aEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCAqL106IFwiVGhlIHByb2plY3QncyBxdW90YSBmb3IgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gZXhjZWVkZWQuXCIsXHJcbiAgICAgICAgW1wicmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXJcIiAvKiBBdXRoRXJyb3JDb2RlLlJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSICovXTogJ1RoZSByZWRpcmVjdCBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBmaW5hbGl6aW5nLicsXHJcbiAgICAgICAgW1wicmVkaXJlY3Qtb3BlcmF0aW9uLXBlbmRpbmdcIiAvKiBBdXRoRXJyb3JDb2RlLlJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HICovXTogJ0EgcmVkaXJlY3Qgc2lnbi1pbiBvcGVyYXRpb24gaXMgYWxyZWFkeSBwZW5kaW5nLicsXHJcbiAgICAgICAgW1wicmVqZWN0ZWQtY3JlZGVudGlhbFwiIC8qIEF1dGhFcnJvckNvZGUuUkVKRUNURURfQ1JFREVOVElBTCAqL106ICdUaGUgcmVxdWVzdCBjb250YWlucyBtYWxmb3JtZWQgb3IgbWlzbWF0Y2hpbmcgY3JlZGVudGlhbHMuJyxcclxuICAgICAgICBbXCJzZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlXCIgLyogQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0FMUkVBRFlfRU5ST0xMRUQgKi9dOiAnVGhlIHNlY29uZCBmYWN0b3IgaXMgYWxyZWFkeSBlbnJvbGxlZCBvbiB0aGlzIGFjY291bnQuJyxcclxuICAgICAgICBbXCJtYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgKi9dOiAnVGhlIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygc2Vjb25kIGZhY3RvcnMgb24gYSB1c2VyIGhhcyBiZWVuIGV4Y2VlZGVkLicsXHJcbiAgICAgICAgW1widGVuYW50LWlkLW1pc21hdGNoXCIgLyogQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0ggKi9dOiBcIlRoZSBwcm92aWRlZCB0ZW5hbnQgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIEF1dGggaW5zdGFuY2UncyB0ZW5hbnQgSURcIixcclxuICAgICAgICBbXCJ0aW1lb3V0XCIgLyogQXV0aEVycm9yQ29kZS5USU1FT1VUICovXTogJ1RoZSBvcGVyYXRpb24gaGFzIHRpbWVkIG91dC4nLFxyXG4gICAgICAgIFtcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCAqL106IFwiVGhlIHVzZXIncyBjcmVkZW50aWFsIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhlIHVzZXIgbXVzdCBzaWduIGluIGFnYWluLlwiLFxyXG4gICAgICAgIFtcInRvby1tYW55LXJlcXVlc3RzXCIgLyogQXV0aEVycm9yQ29kZS5UT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVIgKi9dOiAnV2UgaGF2ZSBibG9ja2VkIGFsbCByZXF1ZXN0cyBmcm9tIHRoaXMgZGV2aWNlIGR1ZSB0byB1bnVzdWFsIGFjdGl2aXR5LiAnICtcclxuICAgICAgICAgICAgJ1RyeSBhZ2FpbiBsYXRlci4nLFxyXG4gICAgICAgIFtcInVuYXV0aG9yaXplZC1jb250aW51ZS11cmlcIiAvKiBBdXRoRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF9ET01BSU4gKi9dOiAnVGhlIGRvbWFpbiBvZiB0aGUgY29udGludWUgVVJMIGlzIG5vdCB3aGl0ZWxpc3RlZC4gIFBsZWFzZSB3aGl0ZWxpc3QgJyArXHJcbiAgICAgICAgICAgICd0aGUgZG9tYWluIGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXHJcbiAgICAgICAgW1widW5zdXBwb3J0ZWQtZmlyc3QtZmFjdG9yXCIgLyogQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1IgKi9dOiAnRW5yb2xsaW5nIGEgc2Vjb25kIGZhY3RvciBvciBzaWduaW5nIGluIHdpdGggYSBtdWx0aS1mYWN0b3IgYWNjb3VudCByZXF1aXJlcyBzaWduLWluIHdpdGggYSBzdXBwb3J0ZWQgZmlyc3QgZmFjdG9yLicsXHJcbiAgICAgICAgW1widW5zdXBwb3J0ZWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIEF1dGhFcnJvckNvZGUuVU5TVVBQT1JURURfUEVSU0lTVEVOQ0UgKi9dOiAnVGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbmNlIHR5cGUuJyxcclxuICAgICAgICBbXCJ1bnN1cHBvcnRlZC10ZW5hbnQtb3BlcmF0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OICovXTogJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYSBtdWx0aS10ZW5hbnQgY29udGV4dC4nLFxyXG4gICAgICAgIFtcInVudmVyaWZpZWQtZW1haWxcIiAvKiBBdXRoRXJyb3JDb2RlLlVOVkVSSUZJRURfRU1BSUwgKi9dOiAnVGhlIG9wZXJhdGlvbiByZXF1aXJlcyBhIHZlcmlmaWVkIGVtYWlsLicsXHJcbiAgICAgICAgW1widXNlci1jYW5jZWxsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlVTRVJfQ0FOQ0VMTEVEICovXTogJ1RoZSB1c2VyIGRpZCBub3QgZ3JhbnQgeW91ciBhcHBsaWNhdGlvbiB0aGUgcGVybWlzc2lvbnMgaXQgcmVxdWVzdGVkLicsXHJcbiAgICAgICAgW1widXNlci1ub3QtZm91bmRcIiAvKiBBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRCAqL106ICdUaGVyZSBpcyBubyB1c2VyIHJlY29yZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWRlbnRpZmllci4gVGhlIHVzZXIgbWF5ICcgK1xyXG4gICAgICAgICAgICAnaGF2ZSBiZWVuIGRlbGV0ZWQuJyxcclxuICAgICAgICBbXCJ1c2VyLWRpc2FibGVkXCIgLyogQXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVEICovXTogJ1RoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGlzYWJsZWQgYnkgYW4gYWRtaW5pc3RyYXRvci4nLFxyXG4gICAgICAgIFtcInVzZXItbWlzbWF0Y2hcIiAvKiBBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0ggKi9dOiAnVGhlIHN1cHBsaWVkIGNyZWRlbnRpYWxzIGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBwcmV2aW91c2x5IHNpZ25lZCBpbiB1c2VyLicsXHJcbiAgICAgICAgW1widXNlci1zaWduZWQtb3V0XCIgLyogQXV0aEVycm9yQ29kZS5VU0VSX1NJR05FRF9PVVQgKi9dOiAnJyxcclxuICAgICAgICBbXCJ3ZWFrLXBhc3N3b3JkXCIgLyogQXV0aEVycm9yQ29kZS5XRUFLX1BBU1NXT1JEICovXTogJ1RoZSBwYXNzd29yZCBtdXN0IGJlIDYgY2hhcmFjdGVycyBsb25nIG9yIG1vcmUuJyxcclxuICAgICAgICBbXCJ3ZWItc3RvcmFnZS11bnN1cHBvcnRlZFwiIC8qIEF1dGhFcnJvckNvZGUuV0VCX1NUT1JBR0VfVU5TVVBQT1JURUQgKi9dOiAnVGhpcyBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQgb3IgM3JkIHBhcnR5IGNvb2tpZXMgYW5kIGRhdGEgbWF5IGJlIGRpc2FibGVkLicsXHJcbiAgICAgICAgW1wiYWxyZWFkeS1pbml0aWFsaXplZFwiIC8qIEF1dGhFcnJvckNvZGUuQUxSRUFEWV9JTklUSUFMSVpFRCAqL106ICdpbml0aWFsaXplQXV0aCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggJyArXHJcbiAgICAgICAgICAgICdkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplQXV0aCgpIHdpdGggdGhlICcgK1xyXG4gICAgICAgICAgICAnc2FtZSBvcHRpb25zIGFzIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgY2FsbGVkLCBvciBjYWxsIGdldEF1dGgoKSB0byByZXR1cm4gdGhlJyArXHJcbiAgICAgICAgICAgICcgYWxyZWFkeSBpbml0aWFsaXplZCBpbnN0YW5jZS4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctcmVjYXB0Y2hhLXRva2VuXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiAqL106ICdUaGUgcmVDQVBUQ0hBIHRva2VuIGlzIG1pc3Npbmcgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXJlY2FwdGNoYS10b2tlblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU4gKi9dOiAnVGhlIHJlQ0FQVENIQSB0b2tlbiBpcyBpbnZhbGlkIHdoZW4gc2VuZGluZyByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1yZWNhcHRjaGEtYWN0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9BQ1RJT04gKi9dOiAnVGhlIHJlQ0FQVENIQSBhY3Rpb24gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxyXG4gICAgICAgIFtcInJlY2FwdGNoYS1ub3QtZW5hYmxlZFwiIC8qIEF1dGhFcnJvckNvZGUuUkVDQVBUQ0hBX05PVF9FTkFCTEVEICovXTogJ3JlQ0FQVENIQSBFbnRlcnByaXNlIGludGVncmF0aW9uIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHByb2plY3QuJyxcclxuICAgICAgICBbXCJtaXNzaW5nLWNsaWVudC10eXBlXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFICovXTogJ1RoZSByZUNBUFRDSEEgY2xpZW50IHR5cGUgaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxyXG4gICAgICAgIFtcIm1pc3NpbmctcmVjYXB0Y2hhLXZlcnNpb25cIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gKi9dOiAnVGhlIHJlQ0FQVENIQSB2ZXJzaW9uIGlzIG1pc3Npbmcgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcclxuICAgICAgICBbXCJpbnZhbGlkLXJlcS10eXBlXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFUV9UWVBFICovXTogJ0ludmFsaWQgcmVxdWVzdCBwYXJhbWV0ZXJzLicsXHJcbiAgICAgICAgW1wiaW52YWxpZC1yZWNhcHRjaGEtdmVyc2lvblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTiAqL106ICdUaGUgcmVDQVBUQ0hBIHZlcnNpb24gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nXHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIF9wcm9kRXJyb3JNYXAoKSB7XHJcbiAgICAvLyBXZSB3aWxsIGluY2x1ZGUgdGhpcyBvbmUgbWVzc2FnZSBpbiB0aGUgcHJvZCBlcnJvciBtYXAgc2luY2UgYnkgdGhlIHZlcnlcclxuICAgIC8vIG5hdHVyZSBvZiB0aGlzIGVycm9yLCBkZXZlbG9wZXJzIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBzZWUgdGhlIG1lc3NhZ2VcclxuICAgIC8vIHVzaW5nIHRoZSBkZWJ1Z0Vycm9yTWFwICh3aGljaCBpcyBpbnN0YWxsZWQgZHVyaW5nIGF1dGggaW5pdGlhbGl6YXRpb24pLlxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBbXCJkZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoXCIgLyogQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEggKi9dOiAnQW5vdGhlciBGaXJlYmFzZSBTREsgd2FzIGluaXRpYWxpemVkIGFuZCBpcyB0cnlpbmcgdG8gdXNlIEF1dGggYmVmb3JlIEF1dGggaXMgJyArXHJcbiAgICAgICAgICAgICdpbml0aWFsaXplZC4gUGxlYXNlIGJlIHN1cmUgdG8gY2FsbCBgaW5pdGlhbGl6ZUF1dGhgIG9yIGBnZXRBdXRoYCBiZWZvcmUgJyArXHJcbiAgICAgICAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLidcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIEEgdmVyYm9zZSBlcnJvciBtYXAgd2l0aCBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgZm9yIG1vc3QgZXJyb3IgY29kZXMuXHJcbiAqXHJcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGRlYnVnRXJyb3JNYXAgPSBfZGVidWdFcnJvck1hcDtcclxuLyoqXHJcbiAqIEEgbWluaW1hbCBlcnJvciBtYXAgd2l0aCBhbGwgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyBzdHJpcHBlZC5cclxuICpcclxuICogU2VlIGRpc2N1c3Npb24gYXQge0BsaW5rIEF1dGhFcnJvck1hcH1cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgcHJvZEVycm9yTWFwID0gX3Byb2RFcnJvck1hcDtcclxuY29uc3QgX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZID0gbmV3IEVycm9yRmFjdG9yeSgnYXV0aCcsICdGaXJlYmFzZScsIF9wcm9kRXJyb3JNYXAoKSk7XHJcbi8qKlxyXG4gKiBBIG1hcCBvZiBwb3RlbnRpYWwgYEF1dGhgIGVycm9yIGNvZGVzLCBmb3IgZWFzaWVyIGNvbXBhcmlzb24gd2l0aCBlcnJvcnNcclxuICogdGhyb3duIGJ5IHRoZSBTREsuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIE5vdGUgdGhhdCB5b3UgY2FuJ3QgdHJlZS1zaGFrZSBpbmRpdmlkdWFsIGtleXNcclxuICogaW4gdGhlIG1hcCwgc28gYnkgdXNpbmcgdGhlIG1hcCB5b3UgbWlnaHQgc3Vic3RhbnRpYWxseSBpbmNyZWFzZSB5b3VyXHJcbiAqIGJ1bmRsZSBzaXplLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBBVVRIX0VSUk9SX0NPREVTX01BUF9ET19OT1RfVVNFX0lOVEVSTkFMTFkgPSB7XHJcbiAgICBBRE1JTl9PTkxZX09QRVJBVElPTjogJ2F1dGgvYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb24nLFxyXG4gICAgQVJHVU1FTlRfRVJST1I6ICdhdXRoL2FyZ3VtZW50LWVycm9yJyxcclxuICAgIEFQUF9OT1RfQVVUSE9SSVpFRDogJ2F1dGgvYXBwLW5vdC1hdXRob3JpemVkJyxcclxuICAgIEFQUF9OT1RfSU5TVEFMTEVEOiAnYXV0aC9hcHAtbm90LWluc3RhbGxlZCcsXHJcbiAgICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRDogJ2F1dGgvY2FwdGNoYS1jaGVjay1mYWlsZWQnLFxyXG4gICAgQ09ERV9FWFBJUkVEOiAnYXV0aC9jb2RlLWV4cGlyZWQnLFxyXG4gICAgQ09SRE9WQV9OT1RfUkVBRFk6ICdhdXRoL2NvcmRvdmEtbm90LXJlYWR5JyxcclxuICAgIENPUlNfVU5TVVBQT1JURUQ6ICdhdXRoL2NvcnMtdW5zdXBwb3J0ZWQnLFxyXG4gICAgQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRTogJ2F1dGgvY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZScsXHJcbiAgICBDUkVERU5USUFMX01JU01BVENIOiAnYXV0aC9jdXN0b20tdG9rZW4tbWlzbWF0Y2gnLFxyXG4gICAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOOiAnYXV0aC9yZXF1aXJlcy1yZWNlbnQtbG9naW4nLFxyXG4gICAgREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIOiAnYXV0aC9kZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoJyxcclxuICAgIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEOiAnYXV0aC9keW5hbWljLWxpbmstbm90LWFjdGl2YXRlZCcsXHJcbiAgICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OOiAnYXV0aC9lbWFpbC1jaGFuZ2UtbmVlZHMtdmVyaWZpY2F0aW9uJyxcclxuICAgIEVNQUlMX0VYSVNUUzogJ2F1dGgvZW1haWwtYWxyZWFkeS1pbi11c2UnLFxyXG4gICAgRU1VTEFUT1JfQ09ORklHX0ZBSUxFRDogJ2F1dGgvZW11bGF0b3ItY29uZmlnLWZhaWxlZCcsXHJcbiAgICBFWFBJUkVEX09PQl9DT0RFOiAnYXV0aC9leHBpcmVkLWFjdGlvbi1jb2RlJyxcclxuICAgIEVYUElSRURfUE9QVVBfUkVRVUVTVDogJ2F1dGgvY2FuY2VsbGVkLXBvcHVwLXJlcXVlc3QnLFxyXG4gICAgSU5URVJOQUxfRVJST1I6ICdhdXRoL2ludGVybmFsLWVycm9yJyxcclxuICAgIElOVkFMSURfQVBJX0tFWTogJ2F1dGgvaW52YWxpZC1hcGkta2V5JyxcclxuICAgIElOVkFMSURfQVBQX0NSRURFTlRJQUw6ICdhdXRoL2ludmFsaWQtYXBwLWNyZWRlbnRpYWwnLFxyXG4gICAgSU5WQUxJRF9BUFBfSUQ6ICdhdXRoL2ludmFsaWQtYXBwLWlkJyxcclxuICAgIElOVkFMSURfQVVUSDogJ2F1dGgvaW52YWxpZC11c2VyLXRva2VuJyxcclxuICAgIElOVkFMSURfQVVUSF9FVkVOVDogJ2F1dGgvaW52YWxpZC1hdXRoLWV2ZW50JyxcclxuICAgIElOVkFMSURfQ0VSVF9IQVNIOiAnYXV0aC9pbnZhbGlkLWNlcnQtaGFzaCcsXHJcbiAgICBJTlZBTElEX0NPREU6ICdhdXRoL2ludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGUnLFxyXG4gICAgSU5WQUxJRF9DT05USU5VRV9VUkk6ICdhdXRoL2ludmFsaWQtY29udGludWUtdXJpJyxcclxuICAgIElOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OOiAnYXV0aC9pbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvbicsXHJcbiAgICBJTlZBTElEX0NVU1RPTV9UT0tFTjogJ2F1dGgvaW52YWxpZC1jdXN0b20tdG9rZW4nLFxyXG4gICAgSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOOiAnYXV0aC9pbnZhbGlkLWR5bmFtaWMtbGluay1kb21haW4nLFxyXG4gICAgSU5WQUxJRF9FTUFJTDogJ2F1dGgvaW52YWxpZC1lbWFpbCcsXHJcbiAgICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRTogJ2F1dGgvaW52YWxpZC1lbXVsYXRvci1zY2hlbWUnLFxyXG4gICAgSU5WQUxJRF9JRFBfUkVTUE9OU0U6ICdhdXRoL2ludmFsaWQtY3JlZGVudGlhbCcsXHJcbiAgICBJTlZBTElEX01FU1NBR0VfUEFZTE9BRDogJ2F1dGgvaW52YWxpZC1tZXNzYWdlLXBheWxvYWQnLFxyXG4gICAgSU5WQUxJRF9NRkFfU0VTU0lPTjogJ2F1dGgvaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXHJcbiAgICBJTlZBTElEX09BVVRIX0NMSUVOVF9JRDogJ2F1dGgvaW52YWxpZC1vYXV0aC1jbGllbnQtaWQnLFxyXG4gICAgSU5WQUxJRF9PQVVUSF9QUk9WSURFUjogJ2F1dGgvaW52YWxpZC1vYXV0aC1wcm92aWRlcicsXHJcbiAgICBJTlZBTElEX09PQl9DT0RFOiAnYXV0aC9pbnZhbGlkLWFjdGlvbi1jb2RlJyxcclxuICAgIElOVkFMSURfT1JJR0lOOiAnYXV0aC91bmF1dGhvcml6ZWQtZG9tYWluJyxcclxuICAgIElOVkFMSURfUEFTU1dPUkQ6ICdhdXRoL3dyb25nLXBhc3N3b3JkJyxcclxuICAgIElOVkFMSURfUEVSU0lTVEVOQ0U6ICdhdXRoL2ludmFsaWQtcGVyc2lzdGVuY2UtdHlwZScsXHJcbiAgICBJTlZBTElEX1BIT05FX05VTUJFUjogJ2F1dGgvaW52YWxpZC1waG9uZS1udW1iZXInLFxyXG4gICAgSU5WQUxJRF9QUk9WSURFUl9JRDogJ2F1dGgvaW52YWxpZC1wcm92aWRlci1pZCcsXHJcbiAgICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTDogJ2F1dGgvaW52YWxpZC1yZWNpcGllbnQtZW1haWwnLFxyXG4gICAgSU5WQUxJRF9TRU5ERVI6ICdhdXRoL2ludmFsaWQtc2VuZGVyJyxcclxuICAgIElOVkFMSURfU0VTU0lPTl9JTkZPOiAnYXV0aC9pbnZhbGlkLXZlcmlmaWNhdGlvbi1pZCcsXHJcbiAgICBJTlZBTElEX1RFTkFOVF9JRDogJ2F1dGgvaW52YWxpZC10ZW5hbnQtaWQnLFxyXG4gICAgTUZBX0lORk9fTk9UX0ZPVU5EOiAnYXV0aC9tdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmQnLFxyXG4gICAgTUZBX1JFUVVJUkVEOiAnYXV0aC9tdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZCcsXHJcbiAgICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FOiAnYXV0aC9taXNzaW5nLWFuZHJvaWQtcGtnLW5hbWUnLFxyXG4gICAgTUlTU0lOR19BUFBfQ1JFREVOVElBTDogJ2F1dGgvbWlzc2luZy1hcHAtY3JlZGVudGlhbCcsXHJcbiAgICBNSVNTSU5HX0FVVEhfRE9NQUlOOiAnYXV0aC9hdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWQnLFxyXG4gICAgTUlTU0lOR19DT0RFOiAnYXV0aC9taXNzaW5nLXZlcmlmaWNhdGlvbi1jb2RlJyxcclxuICAgIE1JU1NJTkdfQ09OVElOVUVfVVJJOiAnYXV0aC9taXNzaW5nLWNvbnRpbnVlLXVyaScsXHJcbiAgICBNSVNTSU5HX0lGUkFNRV9TVEFSVDogJ2F1dGgvbWlzc2luZy1pZnJhbWUtc3RhcnQnLFxyXG4gICAgTUlTU0lOR19JT1NfQlVORExFX0lEOiAnYXV0aC9taXNzaW5nLWlvcy1idW5kbGUtaWQnLFxyXG4gICAgTUlTU0lOR19PUl9JTlZBTElEX05PTkNFOiAnYXV0aC9taXNzaW5nLW9yLWludmFsaWQtbm9uY2UnLFxyXG4gICAgTUlTU0lOR19NRkFfSU5GTzogJ2F1dGgvbWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mbycsXHJcbiAgICBNSVNTSU5HX01GQV9TRVNTSU9OOiAnYXV0aC9taXNzaW5nLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcclxuICAgIE1JU1NJTkdfUEhPTkVfTlVNQkVSOiAnYXV0aC9taXNzaW5nLXBob25lLW51bWJlcicsXHJcbiAgICBNSVNTSU5HX1NFU1NJT05fSU5GTzogJ2F1dGgvbWlzc2luZy12ZXJpZmljYXRpb24taWQnLFxyXG4gICAgTU9EVUxFX0RFU1RST1lFRDogJ2F1dGgvYXBwLWRlbGV0ZWQnLFxyXG4gICAgTkVFRF9DT05GSVJNQVRJT046ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnLFxyXG4gICAgTkVUV09SS19SRVFVRVNUX0ZBSUxFRDogJ2F1dGgvbmV0d29yay1yZXF1ZXN0LWZhaWxlZCcsXHJcbiAgICBOVUxMX1VTRVI6ICdhdXRoL251bGwtdXNlcicsXHJcbiAgICBOT19BVVRIX0VWRU5UOiAnYXV0aC9uby1hdXRoLWV2ZW50JyxcclxuICAgIE5PX1NVQ0hfUFJPVklERVI6ICdhdXRoL25vLXN1Y2gtcHJvdmlkZXInLFxyXG4gICAgT1BFUkFUSU9OX05PVF9BTExPV0VEOiAnYXV0aC9vcGVyYXRpb24tbm90LWFsbG93ZWQnLFxyXG4gICAgT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ6ICdhdXRoL29wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnQnLFxyXG4gICAgUE9QVVBfQkxPQ0tFRDogJ2F1dGgvcG9wdXAtYmxvY2tlZCcsXHJcbiAgICBQT1BVUF9DTE9TRURfQllfVVNFUjogJ2F1dGgvcG9wdXAtY2xvc2VkLWJ5LXVzZXInLFxyXG4gICAgUFJPVklERVJfQUxSRUFEWV9MSU5LRUQ6ICdhdXRoL3Byb3ZpZGVyLWFscmVhZHktbGlua2VkJyxcclxuICAgIFFVT1RBX0VYQ0VFREVEOiAnYXV0aC9xdW90YS1leGNlZWRlZCcsXHJcbiAgICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUjogJ2F1dGgvcmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXInLFxyXG4gICAgUkVESVJFQ1RfT1BFUkFUSU9OX1BFTkRJTkc6ICdhdXRoL3JlZGlyZWN0LW9wZXJhdGlvbi1wZW5kaW5nJyxcclxuICAgIFJFSkVDVEVEX0NSRURFTlRJQUw6ICdhdXRoL3JlamVjdGVkLWNyZWRlbnRpYWwnLFxyXG4gICAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEOiAnYXV0aC9zZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlJyxcclxuICAgIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQ6ICdhdXRoL21heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZCcsXHJcbiAgICBURU5BTlRfSURfTUlTTUFUQ0g6ICdhdXRoL3RlbmFudC1pZC1taXNtYXRjaCcsXHJcbiAgICBUSU1FT1VUOiAnYXV0aC90aW1lb3V0JyxcclxuICAgIFRPS0VOX0VYUElSRUQ6ICdhdXRoL3VzZXItdG9rZW4tZXhwaXJlZCcsXHJcbiAgICBUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVI6ICdhdXRoL3Rvby1tYW55LXJlcXVlc3RzJyxcclxuICAgIFVOQVVUSE9SSVpFRF9ET01BSU46ICdhdXRoL3VuYXV0aG9yaXplZC1jb250aW51ZS11cmknLFxyXG4gICAgVU5TVVBQT1JURURfRklSU1RfRkFDVE9SOiAnYXV0aC91bnN1cHBvcnRlZC1maXJzdC1mYWN0b3InLFxyXG4gICAgVU5TVVBQT1JURURfUEVSU0lTVEVOQ0U6ICdhdXRoL3Vuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGUnLFxyXG4gICAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTjogJ2F1dGgvdW5zdXBwb3J0ZWQtdGVuYW50LW9wZXJhdGlvbicsXHJcbiAgICBVTlZFUklGSUVEX0VNQUlMOiAnYXV0aC91bnZlcmlmaWVkLWVtYWlsJyxcclxuICAgIFVTRVJfQ0FOQ0VMTEVEOiAnYXV0aC91c2VyLWNhbmNlbGxlZCcsXHJcbiAgICBVU0VSX0RFTEVURUQ6ICdhdXRoL3VzZXItbm90LWZvdW5kJyxcclxuICAgIFVTRVJfRElTQUJMRUQ6ICdhdXRoL3VzZXItZGlzYWJsZWQnLFxyXG4gICAgVVNFUl9NSVNNQVRDSDogJ2F1dGgvdXNlci1taXNtYXRjaCcsXHJcbiAgICBVU0VSX1NJR05FRF9PVVQ6ICdhdXRoL3VzZXItc2lnbmVkLW91dCcsXHJcbiAgICBXRUFLX1BBU1NXT1JEOiAnYXV0aC93ZWFrLXBhc3N3b3JkJyxcclxuICAgIFdFQl9TVE9SQUdFX1VOU1VQUE9SVEVEOiAnYXV0aC93ZWItc3RvcmFnZS11bnN1cHBvcnRlZCcsXHJcbiAgICBBTFJFQURZX0lOSVRJQUxJWkVEOiAnYXV0aC9hbHJlYWR5LWluaXRpYWxpemVkJyxcclxuICAgIFJFQ0FQVENIQV9OT1RfRU5BQkxFRDogJ2F1dGgvcmVjYXB0Y2hhLW5vdC1lbmFibGVkJyxcclxuICAgIE1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOOiAnYXV0aC9taXNzaW5nLXJlY2FwdGNoYS10b2tlbicsXHJcbiAgICBJTlZBTElEX1JFQ0FQVENIQV9UT0tFTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtdG9rZW4nLFxyXG4gICAgSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OOiAnYXV0aC9pbnZhbGlkLXJlY2FwdGNoYS1hY3Rpb24nLFxyXG4gICAgTUlTU0lOR19DTElFTlRfVFlQRTogJ2F1dGgvbWlzc2luZy1jbGllbnQtdHlwZScsXHJcbiAgICBNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OOiAnYXV0aC9taXNzaW5nLXJlY2FwdGNoYS12ZXJzaW9uJyxcclxuICAgIElOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT046ICdhdXRoL2ludmFsaWQtcmVjYXB0Y2hhLXZlcnNpb24nLFxyXG4gICAgSU5WQUxJRF9SRVFfVFlQRTogJ2F1dGgvaW52YWxpZC1yZXEtdHlwZSdcclxufTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgbG9nQ2xpZW50ID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2F1dGgnKTtcclxuZnVuY3Rpb24gX2xvZ1dhcm4obXNnLCAuLi5hcmdzKSB7XHJcbiAgICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLldBUk4pIHtcclxuICAgICAgICBsb2dDbGllbnQud2FybihgQXV0aCAoJHtTREtfVkVSU0lPTn0pOiAke21zZ31gLCAuLi5hcmdzKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfbG9nRXJyb3IobXNnLCAuLi5hcmdzKSB7XHJcbiAgICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLkVSUk9SKSB7XHJcbiAgICAgICAgbG9nQ2xpZW50LmVycm9yKGBBdXRoICgke1NES19WRVJTSU9OfSk6ICR7bXNnfWAsIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9mYWlsKGF1dGhPckNvZGUsIC4uLnJlc3QpIHtcclxuICAgIHRocm93IGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XHJcbn1cclxuZnVuY3Rpb24gX2NyZWF0ZUVycm9yKGF1dGhPckNvZGUsIC4uLnJlc3QpIHtcclxuICAgIHJldHVybiBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIGNvZGUsIG1lc3NhZ2UpIHtcclxuICAgIGNvbnN0IGVycm9yTWFwID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9kRXJyb3JNYXAoKSksIHsgW2NvZGVdOiBtZXNzYWdlIH0pO1xyXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBFcnJvckZhY3RvcnkoJ2F1dGgnLCAnRmlyZWJhc2UnLCBlcnJvck1hcCk7XHJcbiAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoY29kZSwge1xyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZVxyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gX2Fzc2VydEluc3RhbmNlT2YoYXV0aCwgb2JqZWN0LCBpbnN0YW5jZSkge1xyXG4gICAgY29uc3QgY29uc3RydWN0b3JJbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3JJbnN0YW5jZSkpIHtcclxuICAgICAgICBpZiAoY29uc3RydWN0b3JJbnN0YW5jZS5uYW1lICE9PSBvYmplY3QuY29uc3RydWN0b3IubmFtZSkge1xyXG4gICAgICAgICAgICBfZmFpbChhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovLCBgVHlwZSBvZiAke29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBpbnN0YW5jZS5gICtcclxuICAgICAgICAgICAgYERpZCB5b3UgcGFzcyBhIHJlZmVyZW5jZSBmcm9tIGEgZGlmZmVyZW50IEF1dGggU0RLP2ApO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCkge1xyXG4gICAgaWYgKHR5cGVvZiBhdXRoT3JDb2RlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXN0WzBdO1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXJhbXMgPSBbLi4ucmVzdC5zbGljZSgxKV07XHJcbiAgICAgICAgaWYgKGZ1bGxQYXJhbXNbMF0pIHtcclxuICAgICAgICAgICAgZnVsbFBhcmFtc1swXS5hcHBOYW1lID0gYXV0aE9yQ29kZS5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXV0aE9yQ29kZS5fZXJyb3JGYWN0b3J5LmNyZWF0ZShjb2RlLCAuLi5mdWxsUGFyYW1zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkuY3JlYXRlKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9hc3NlcnQoYXNzZXJ0aW9uLCBhdXRoT3JDb2RlLCAuLi5yZXN0KSB7XHJcbiAgICBpZiAoIWFzc2VydGlvbikge1xyXG4gICAgICAgIHRocm93IGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gaW50ZXJuYWwgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cclxuICpcclxuICogQHBhcmFtIGZhaWx1cmUgdHlwZSBvZiBmYWlsdXJlIGVuY291bnRlcmVkXHJcbiAqIEB0aHJvd3MgRXJyb3JcclxuICovXHJcbmZ1bmN0aW9uIGRlYnVnRmFpbChmYWlsdXJlKSB7XHJcbiAgICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXHJcbiAgICAvLyBleGNlcHRpb24gaXMgc3dhbGxvd2VkLlxyXG4gICAgY29uc3QgbWVzc2FnZSA9IGBJTlRFUk5BTCBBU1NFUlRJT04gRkFJTEVEOiBgICsgZmFpbHVyZTtcclxuICAgIF9sb2dFcnJvcihtZXNzYWdlKTtcclxuICAgIC8vIE5PVEU6IFdlIGRvbid0IHVzZSBGaXJlYmFzZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcclxuICAgIC8vIHRoYXQgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhlIHVzZXIuIChBbHNvIGl0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyXHJcbiAgICAvLyBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIGVycm9yIGFuZCBhc3NlcnQgbW9kdWxlcyB3aGljaCBkb2Vzbid0IHdvcmsuKVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG59XHJcbi8qKlxyXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcclxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhc3NlcnRpb25cclxuICogQHBhcmFtIG1lc3NhZ2VcclxuICovXHJcbmZ1bmN0aW9uIGRlYnVnQXNzZXJ0KGFzc2VydGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKCFhc3NlcnRpb24pIHtcclxuICAgICAgICBkZWJ1Z0ZhaWwobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dldEN1cnJlbnRVcmwoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiAoKF9hID0gc2VsZi5sb2NhdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSB8fCAnJztcclxufVxyXG5mdW5jdGlvbiBfaXNIdHRwT3JIdHRwcygpIHtcclxuICAgIHJldHVybiBfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnaHR0cDonIHx8IF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwczonO1xyXG59XHJcbmZ1bmN0aW9uIF9nZXRDdXJyZW50U2NoZW1lKCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgKChfYSA9IHNlbGYubG9jYXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcm90b2NvbCkpIHx8IG51bGw7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBicm93c2VyIGlzIHdvcmtpbmcgb25saW5lXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNPbmxpbmUoKSB7XHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICBuYXZpZ2F0b3IgJiZcclxuICAgICAgICAnb25MaW5lJyBpbiBuYXZpZ2F0b3IgJiZcclxuICAgICAgICB0eXBlb2YgbmF2aWdhdG9yLm9uTGluZSA9PT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgLy8gQXBwbHkgb25seSBmb3IgdHJhZGl0aW9uYWwgd2ViIGFwcHMgYW5kIENocm9tZSBleHRlbnNpb25zLlxyXG4gICAgICAgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciBDb3Jkb3ZhIGFwcHMgd2hpY2ggaGF2ZSB1bnJlbGlhYmxlXHJcbiAgICAgICAgLy8gbmF2aWdhdG9yLm9uTGluZSBiZWhhdmlvciB1bmxlc3MgY29yZG92YS1wbHVnaW4tbmV0d29yay1pbmZvcm1hdGlvbiBpc1xyXG4gICAgICAgIC8vIGluc3RhbGxlZCB3aGljaCBvdmVyd3JpdGVzIHRoZSBuYXRpdmUgbmF2aWdhdG9yLm9uTGluZSB2YWx1ZSBhbmRcclxuICAgICAgICAvLyBkZWZpbmVzIG5hdmlnYXRvci5jb25uZWN0aW9uLlxyXG4gICAgICAgIChfaXNIdHRwT3JIdHRwcygpIHx8IGlzQnJvd3NlckV4dGVuc2lvbigpIHx8ICdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmU7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIHN0YXRlLCBhc3N1bWUgaXQgaXMgb25saW5lLlxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuZnVuY3Rpb24gX2dldFVzZXJMYW5ndWFnZSgpIHtcclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmF2aWdhdG9yTGFuZ3VhZ2UgPSBuYXZpZ2F0b3I7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgLy8gTW9zdCByZWxpYWJsZSwgYnV0IG9ubHkgc3VwcG9ydGVkIGluIENocm9tZS9GaXJlZm94LlxyXG4gICAgKG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZXNbMF0pIHx8XHJcbiAgICAgICAgLy8gU3VwcG9ydGVkIGluIG1vc3QgYnJvd3NlcnMsIGJ1dCByZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgYnJvd3NlclxyXG4gICAgICAgIC8vIFVJLCBub3QgdGhlIGxhbmd1YWdlIHNldCBpbiBicm93c2VyIHNldHRpbmdzLlxyXG4gICAgICAgIG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlIHx8XHJcbiAgICAgICAgLy8gQ291bGRuJ3QgZGV0ZXJtaW5lIGxhbmd1YWdlLlxyXG4gICAgICAgIG51bGwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBIHN0cnVjdHVyZSB0byBoZWxwIHBpY2sgYmV0d2VlbiBhIHJhbmdlIG9mIGxvbmcgYW5kIHNob3J0IGRlbGF5IGR1cmF0aW9uc1xyXG4gKiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuIEluIGdlbmVyYWwsIHRoZSBsb25nIGRlbGF5IGlzIHVzZWQgZm9yXHJcbiAqIG1vYmlsZSBlbnZpcm9ubWVudHMgd2hlcmVhcyBzaG9ydCBkZWxheXMgYXJlIHVzZWQgZm9yIGRlc2t0b3AgZW52aXJvbm1lbnRzLlxyXG4gKi9cclxuY2xhc3MgRGVsYXkge1xyXG4gICAgY29uc3RydWN0b3Ioc2hvcnREZWxheSwgbG9uZ0RlbGF5KSB7XHJcbiAgICAgICAgdGhpcy5zaG9ydERlbGF5ID0gc2hvcnREZWxheTtcclxuICAgICAgICB0aGlzLmxvbmdEZWxheSA9IGxvbmdEZWxheTtcclxuICAgICAgICAvLyBJbnRlcm5hbCBlcnJvciB3aGVuIGltcHJvcGVybHkgaW5pdGlhbGl6ZWQuXHJcbiAgICAgICAgZGVidWdBc3NlcnQobG9uZ0RlbGF5ID4gc2hvcnREZWxheSwgJ1Nob3J0IGRlbGF5IHNob3VsZCBiZSBsZXNzIHRoYW4gbG9uZyBkZWxheSEnKTtcclxuICAgICAgICB0aGlzLmlzTW9iaWxlID0gaXNNb2JpbGVDb3Jkb3ZhKCkgfHwgaXNSZWFjdE5hdGl2ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGlmICghX2lzT25saW5lKCkpIHtcclxuICAgICAgICAgICAgLy8gUGljayB0aGUgc2hvcnRlciB0aW1lb3V0LlxyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oNTAwMCAvKiBEZWxheU1pbi5PRkZMSU5FICovLCB0aGlzLnNob3J0RGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBydW5uaW5nIGluIGEgbW9iaWxlIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGxvbmcgZGVsYXksIG90aGVyd2lzZVxyXG4gICAgICAgIC8vIHJldHVybiB0aGUgc2hvcnQgZGVsYXkuXHJcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiBvdGhlclxyXG4gICAgICAgIC8vIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGp1c3QgcmVhZGluZyB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgICAgICByZXR1cm4gdGhpcy5pc01vYmlsZSA/IHRoaXMubG9uZ0RlbGF5IDogdGhpcy5zaG9ydERlbGF5O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9lbXVsYXRvclVybChjb25maWcsIHBhdGgpIHtcclxuICAgIGRlYnVnQXNzZXJ0KGNvbmZpZy5lbXVsYXRvciwgJ0VtdWxhdG9yIHNob3VsZCBhbHdheXMgYmUgc2V0IGhlcmUnKTtcclxuICAgIGNvbnN0IHsgdXJsIH0gPSBjb25maWcuZW11bGF0b3I7XHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3VybH0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aC5zbGljZSgxKSA6IHBhdGh9YDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBGZXRjaFByb3ZpZGVyIHtcclxuICAgIHN0YXRpYyBpbml0aWFsaXplKGZldGNoSW1wbCwgaGVhZGVyc0ltcGwsIHJlc3BvbnNlSW1wbCkge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hJbXBsID0gZmV0Y2hJbXBsO1xyXG4gICAgICAgIGlmIChoZWFkZXJzSW1wbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnNJbXBsID0gaGVhZGVyc0ltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXNwb25zZUltcGwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNwb25zZUltcGwgPSByZXNwb25zZUltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhdGljIGZldGNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZldGNoSW1wbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2ZldGNoJyBpbiBzZWxmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmZldGNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z0ZhaWwoJ0NvdWxkIG5vdCBmaW5kIGZldGNoIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGhlYWRlcnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyc0ltcGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyc0ltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ0hlYWRlcnMnIGluIHNlbGYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuSGVhZGVycztcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVidWdGYWlsKCdDb3VsZCBub3QgZmluZCBIZWFkZXJzIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHJlc3BvbnNlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlSW1wbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUltcGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1Jlc3BvbnNlJyBpbiBzZWxmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLlJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWJ1Z0ZhaWwoJ0NvdWxkIG5vdCBmaW5kIFJlc3BvbnNlIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCcpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBNYXAgZnJvbSBlcnJvcnMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciB0byBlcnJvcnMgdG8gZGV2ZWxvcGVyIHZpc2libGUgZXJyb3JzXHJcbiAqL1xyXG5jb25zdCBTRVJWRVJfRVJST1JfTUFQID0ge1xyXG4gICAgLy8gQ3VzdG9tIHRva2VuIGVycm9ycy5cclxuICAgIFtcIkNSRURFTlRJQUxfTUlTTUFUQ0hcIiAvKiBTZXJ2ZXJFcnJvci5DUkVERU5USUFMX01JU01BVENIICovXTogXCJjdXN0b20tdG9rZW4tbWlzbWF0Y2hcIiAvKiBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfTUlTTUFUQ0ggKi8sXHJcbiAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXHJcbiAgICBbXCJNSVNTSU5HX0NVU1RPTV9UT0tFTlwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfQ1VTVE9NX1RPS0VOICovXTogXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBDcmVhdGUgQXV0aCBVUkkgZXJyb3JzLlxyXG4gICAgW1wiSU5WQUxJRF9JREVOVElGSUVSXCIgLyogU2VydmVyRXJyb3IuSU5WQUxJRF9JREVOVElGSUVSICovXTogXCJpbnZhbGlkLWVtYWlsXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNQUlMICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19DT05USU5VRV9VUklcIiAvKiBTZXJ2ZXJFcnJvci5NSVNTSU5HX0NPTlRJTlVFX1VSSSAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovLFxyXG4gICAgLy8gU2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZCBlcnJvcnMgKHNvbWUgYXBwbHkgdG8gc2lnbiB1cCB0b28pLlxyXG4gICAgW1wiSU5WQUxJRF9QQVNTV09SRFwiIC8qIFNlcnZlckVycm9yLklOVkFMSURfUEFTU1dPUkQgKi9dOiBcIndyb25nLXBhc3N3b3JkXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1BBU1NXT1JEICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19QQVNTV09SRFwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfUEFTU1dPUkQgKi9dOiBcIm1pc3NpbmctcGFzc3dvcmRcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUEFTU1dPUkQgKi8sXHJcbiAgICAvLyBTaWduIHVwIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycy5cclxuICAgIFtcIkVNQUlMX0VYSVNUU1wiIC8qIFNlcnZlckVycm9yLkVNQUlMX0VYSVNUUyAqL106IFwiZW1haWwtYWxyZWFkeS1pbi11c2VcIiAvKiBBdXRoRXJyb3JDb2RlLkVNQUlMX0VYSVNUUyAqLyxcclxuICAgIFtcIlBBU1NXT1JEX0xPR0lOX0RJU0FCTEVEXCIgLyogU2VydmVyRXJyb3IuUEFTU1dPUkRfTE9HSU5fRElTQUJMRUQgKi9dOiBcIm9wZXJhdGlvbi1ub3QtYWxsb3dlZFwiIC8qIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9BTExPV0VEICovLFxyXG4gICAgLy8gVmVyaWZ5IGFzc2VydGlvbiBmb3Igc2lnbiBpbiB3aXRoIGNyZWRlbnRpYWwgZXJyb3JzOlxyXG4gICAgW1wiSU5WQUxJRF9JRFBfUkVTUE9OU0VcIiAvKiBTZXJ2ZXJFcnJvci5JTlZBTElEX0lEUF9SRVNQT05TRSAqL106IFwiaW52YWxpZC1jcmVkZW50aWFsXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0lEUF9SRVNQT05TRSAqLyxcclxuICAgIFtcIklOVkFMSURfUEVORElOR19UT0tFTlwiIC8qIFNlcnZlckVycm9yLklOVkFMSURfUEVORElOR19UT0tFTiAqL106IFwiaW52YWxpZC1jcmVkZW50aWFsXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0lEUF9SRVNQT05TRSAqLyxcclxuICAgIFtcIkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEXCIgLyogU2VydmVyRXJyb3IuRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRUQgKi9dOiBcImNyZWRlbnRpYWwtYWxyZWFkeS1pbi11c2VcIiAvKiBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UgKi8sXHJcbiAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXHJcbiAgICBbXCJNSVNTSU5HX1JFUV9UWVBFXCIgLyogU2VydmVyRXJyb3IuTUlTU0lOR19SRVFfVFlQRSAqL106IFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovLFxyXG4gICAgLy8gU2VuZCBQYXNzd29yZCByZXNldCBlbWFpbCBlcnJvcnM6XHJcbiAgICBbXCJFTUFJTF9OT1RfRk9VTkRcIiAvKiBTZXJ2ZXJFcnJvci5FTUFJTF9OT1RfRk9VTkQgKi9dOiBcInVzZXItbm90LWZvdW5kXCIgLyogQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQgKi8sXHJcbiAgICBbXCJSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVRcIiAvKiBTZXJ2ZXJFcnJvci5SRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVQgKi9dOiBcInRvby1tYW55LXJlcXVlc3RzXCIgLyogQXV0aEVycm9yQ29kZS5UT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVIgKi8sXHJcbiAgICBbXCJFWFBJUkVEX09PQl9DT0RFXCIgLyogU2VydmVyRXJyb3IuRVhQSVJFRF9PT0JfQ09ERSAqL106IFwiZXhwaXJlZC1hY3Rpb24tY29kZVwiIC8qIEF1dGhFcnJvckNvZGUuRVhQSVJFRF9PT0JfQ09ERSAqLyxcclxuICAgIFtcIklOVkFMSURfT09CX0NPREVcIiAvKiBTZXJ2ZXJFcnJvci5JTlZBTElEX09PQl9DT0RFICovXTogXCJpbnZhbGlkLWFjdGlvbi1jb2RlXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX09PQl9DT0RFICovLFxyXG4gICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxyXG4gICAgW1wiTUlTU0lOR19PT0JfQ09ERVwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfT09CX0NPREUgKi9dOiBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyxcclxuICAgIC8vIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIElEIHRva2VuIGluIHJlcXVlc3Q6XHJcbiAgICBbXCJDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU5cIiAvKiBTZXJ2ZXJFcnJvci5DUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4gKi9dOiBcInJlcXVpcmVzLXJlY2VudC1sb2dpblwiIC8qIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOICovLFxyXG4gICAgW1wiSU5WQUxJRF9JRF9UT0tFTlwiIC8qIFNlcnZlckVycm9yLklOVkFMSURfSURfVE9LRU4gKi9dOiBcImludmFsaWQtdXNlci10b2tlblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRIICovLFxyXG4gICAgW1wiVE9LRU5fRVhQSVJFRFwiIC8qIFNlcnZlckVycm9yLlRPS0VOX0VYUElSRUQgKi9dOiBcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCAqLyxcclxuICAgIFtcIlVTRVJfTk9UX0ZPVU5EXCIgLyogU2VydmVyRXJyb3IuVVNFUl9OT1RfRk9VTkQgKi9dOiBcInVzZXItdG9rZW4tZXhwaXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCAqLyxcclxuICAgIC8vIE90aGVyIGVycm9ycy5cclxuICAgIFtcIlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUlwiIC8qIFNlcnZlckVycm9yLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqL106IFwidG9vLW1hbnktcmVxdWVzdHNcIiAvKiBBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiAqLyxcclxuICAgIC8vIFBob25lIEF1dGggcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJJTlZBTElEX0NPREVcIiAvKiBTZXJ2ZXJFcnJvci5JTlZBTElEX0NPREUgKi9dOiBcImludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGVcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09ERSAqLyxcclxuICAgIFtcIklOVkFMSURfU0VTU0lPTl9JTkZPXCIgLyogU2VydmVyRXJyb3IuSU5WQUxJRF9TRVNTSU9OX0lORk8gKi9dOiBcImludmFsaWQtdmVyaWZpY2F0aW9uLWlkXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFU1NJT05fSU5GTyAqLyxcclxuICAgIFtcIklOVkFMSURfVEVNUE9SQVJZX1BST09GXCIgLyogU2VydmVyRXJyb3IuSU5WQUxJRF9URU1QT1JBUllfUFJPT0YgKi9dOiBcImludmFsaWQtY3JlZGVudGlhbFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UgKi8sXHJcbiAgICBbXCJNSVNTSU5HX1NFU1NJT05fSU5GT1wiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfU0VTU0lPTl9JTkZPICovXTogXCJtaXNzaW5nLXZlcmlmaWNhdGlvbi1pZFwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19TRVNTSU9OX0lORk8gKi8sXHJcbiAgICBbXCJTRVNTSU9OX0VYUElSRURcIiAvKiBTZXJ2ZXJFcnJvci5TRVNTSU9OX0VYUElSRUQgKi9dOiBcImNvZGUtZXhwaXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuQ09ERV9FWFBJUkVEICovLFxyXG4gICAgLy8gT3RoZXIgYWN0aW9uIGNvZGUgZXJyb3JzIHdoZW4gYWRkaXRpb25hbCBzZXR0aW5ncyBwYXNzZWQuXHJcbiAgICAvLyBNSVNTSU5HX0NPTlRJTlVFX1VSSSBpcyBnZXR0aW5nIG1hcHBlZCB0byBJTlRFUk5BTF9FUlJPUiBhYm92ZS5cclxuICAgIC8vIFRoaXMgaXMgT0sgYXMgdGhpcyBlcnJvciB3aWxsIGJlIGNhdWdodCBieSBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLlxyXG4gICAgW1wiTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRVwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUgKi9dOiBcIm1pc3NpbmctYW5kcm9pZC1wa2ctbmFtZVwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSAqLyxcclxuICAgIFtcIlVOQVVUSE9SSVpFRF9ET01BSU5cIiAvKiBTZXJ2ZXJFcnJvci5VTkFVVEhPUklaRURfRE9NQUlOICovXTogXCJ1bmF1dGhvcml6ZWQtY29udGludWUtdXJpXCIgLyogQXV0aEVycm9yQ29kZS5VTkFVVEhPUklaRURfRE9NQUlOICovLFxyXG4gICAgLy8gZ2V0UHJvamVjdENvbmZpZyBlcnJvcnMgd2hlbiBjbGllbnRJZCBpcyBwYXNzZWQuXHJcbiAgICBbXCJJTlZBTElEX09BVVRIX0NMSUVOVF9JRFwiIC8qIFNlcnZlckVycm9yLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEICovXTogXCJpbnZhbGlkLW9hdXRoLWNsaWVudC1pZFwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgKi8sXHJcbiAgICAvLyBVc2VyIGFjdGlvbnMgKHNpZ24tdXAgb3IgZGVsZXRpb24pIGRpc2FibGVkIGVycm9ycy5cclxuICAgIFtcIkFETUlOX09OTFlfT1BFUkFUSU9OXCIgLyogU2VydmVyRXJyb3IuQURNSU5fT05MWV9PUEVSQVRJT04gKi9dOiBcImFkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5BRE1JTl9PTkxZX09QRVJBVElPTiAqLyxcclxuICAgIC8vIE11bHRpIGZhY3RvciByZWxhdGVkIGVycm9ycy5cclxuICAgIFtcIklOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTFwiIC8qIFNlcnZlckVycm9yLklOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCAqL106IFwiaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9NRkFfU0VTU0lPTiAqLyxcclxuICAgIFtcIk1GQV9FTlJPTExNRU5UX05PVF9GT1VORFwiIC8qIFNlcnZlckVycm9yLk1GQV9FTlJPTExNRU5UX05PVF9GT1VORCAqL106IFwibXVsdGktZmFjdG9yLWluZm8tbm90LWZvdW5kXCIgLyogQXV0aEVycm9yQ29kZS5NRkFfSU5GT19OT1RfRk9VTkQgKi8sXHJcbiAgICBbXCJNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEXCIgLyogU2VydmVyRXJyb3IuTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRCAqL106IFwibWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mb1wiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfSU5GTyAqLyxcclxuICAgIFtcIk1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTFwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCAqL106IFwibWlzc2luZy1tdWx0aS1mYWN0b3Itc2Vzc2lvblwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfU0VTU0lPTiAqLyxcclxuICAgIFtcIlNFQ09ORF9GQUNUT1JfRVhJU1RTXCIgLyogU2VydmVyRXJyb3IuU0VDT05EX0ZBQ1RPUl9FWElTVFMgKi9dOiBcInNlY29uZC1mYWN0b3ItYWxyZWFkeS1pbi11c2VcIiAvKiBBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRCAqLyxcclxuICAgIFtcIlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERURcIiAvKiBTZXJ2ZXJFcnJvci5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEICovXTogXCJtYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgKi8sXHJcbiAgICAvLyBCbG9ja2luZyBmdW5jdGlvbnMgcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRVwiIC8qIFNlcnZlckVycm9yLkJMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFICovXTogXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8sXHJcbiAgICAvLyBSZWNhcHRjaGEgcmVsYXRlZCBlcnJvcnMuXHJcbiAgICBbXCJSRUNBUFRDSEFfTk9UX0VOQUJMRURcIiAvKiBTZXJ2ZXJFcnJvci5SRUNBUFRDSEFfTk9UX0VOQUJMRUQgKi9dOiBcInJlY2FwdGNoYS1ub3QtZW5hYmxlZFwiIC8qIEF1dGhFcnJvckNvZGUuUkVDQVBUQ0hBX05PVF9FTkFCTEVEICovLFxyXG4gICAgW1wiTUlTU0lOR19SRUNBUFRDSEFfVE9LRU5cIiAvKiBTZXJ2ZXJFcnJvci5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiAqL106IFwibWlzc2luZy1yZWNhcHRjaGEtdG9rZW5cIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOICovLFxyXG4gICAgW1wiSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU5cIiAvKiBTZXJ2ZXJFcnJvci5JTlZBTElEX1JFQ0FQVENIQV9UT0tFTiAqL106IFwiaW52YWxpZC1yZWNhcHRjaGEtdG9rZW5cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOICovLFxyXG4gICAgW1wiSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OXCIgLyogU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OICovXTogXCJpbnZhbGlkLXJlY2FwdGNoYS1hY3Rpb25cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX0FDVElPTiAqLyxcclxuICAgIFtcIk1JU1NJTkdfQ0xJRU5UX1RZUEVcIiAvKiBTZXJ2ZXJFcnJvci5NSVNTSU5HX0NMSUVOVF9UWVBFICovXTogXCJtaXNzaW5nLWNsaWVudC10eXBlXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFICovLFxyXG4gICAgW1wiTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTlwiIC8qIFNlcnZlckVycm9yLk1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gKi9dOiBcIm1pc3NpbmctcmVjYXB0Y2hhLXZlcnNpb25cIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gKi8sXHJcbiAgICBbXCJJTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OXCIgLyogU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTiAqL106IFwiaW52YWxpZC1yZWNhcHRjaGEtdmVyc2lvblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTiAqLyxcclxuICAgIFtcIklOVkFMSURfUkVRX1RZUEVcIiAvKiBTZXJ2ZXJFcnJvci5JTlZBTElEX1JFUV9UWVBFICovXTogXCJpbnZhbGlkLXJlcS10eXBlXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFUV9UWVBFICovXHJcbn07XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfQVBJX1RJTUVPVVRfTVMgPSBuZXcgRGVsYXkoMzAwMDAsIDYwMDAwKTtcclxuZnVuY3Rpb24gX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIGlmIChhdXRoLnRlbmFudElkICYmICFyZXF1ZXN0LnRlbmFudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdCksIHsgdGVuYW50SWQ6IGF1dGgudGVuYW50SWQgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgbWV0aG9kLCBwYXRoLCByZXF1ZXN0LCBjdXN0b21FcnJvck1hcCA9IHt9KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nKGF1dGgsIGN1c3RvbUVycm9yTWFwLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGJvZHkgPSB7fTtcclxuICAgICAgICBsZXQgcGFyYW1zID0ge307XHJcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcclxuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAvKiBIdHRwTWV0aG9kLkdFVCAqLykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcmVxdWVzdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdClcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBxdWVyeXN0cmluZyhPYmplY3QuYXNzaWduKHsga2V5OiBhdXRoLmNvbmZpZy5hcGlLZXkgfSwgcGFyYW1zKSkuc2xpY2UoMSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGF1dGguX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiIC8qIEh0dHBIZWFkZXIuQ09OVEVOVF9UWVBFICovXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICBpZiAoYXV0aC5sYW5ndWFnZUNvZGUpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtTG9jYWxlXCIgLyogSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0xPQ0FMRSAqL10gPSBhdXRoLmxhbmd1YWdlQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKShfZ2V0RmluYWxUYXJnZXQoYXV0aCwgYXV0aC5jb25maWcuYXBpSG9zdCwgcGF0aCwgcXVlcnkpLCBPYmplY3QuYXNzaWduKHsgbWV0aG9kLFxyXG4gICAgICAgICAgICBoZWFkZXJzLCByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyB9LCBib2R5KSk7XHJcbiAgICB9KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfcGVyZm9ybUZldGNoV2l0aEVycm9ySGFuZGxpbmcoYXV0aCwgY3VzdG9tRXJyb3JNYXAsIGZldGNoRm4pIHtcclxuICAgIGF1dGguX2NhbkluaXRFbXVsYXRvciA9IGZhbHNlO1xyXG4gICAgY29uc3QgZXJyb3JNYXAgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIFNFUlZFUl9FUlJPUl9NQVApLCBjdXN0b21FcnJvck1hcCk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtUaW1lb3V0ID0gbmV3IE5ldHdvcmtUaW1lb3V0KGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgICAgZmV0Y2hGbigpLFxyXG4gICAgICAgICAgICBuZXR3b3JrVGltZW91dC5wcm9taXNlXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgZmV0Y2ggc3VjY2VlZGVkIGFuZCB0aGUgbmV0d29ya1RpbWVvdXRcclxuICAgICAgICAvLyBkaWRuJ3QgdGhyb3c7IGNsZWFyIHRoZSBuZXR3b3JrIHRpbWVvdXQgZGVsYXkgc28gdGhhdCBOb2RlIHdvbid0IGhhbmdcclxuICAgICAgICBuZXR3b3JrVGltZW91dC5jbGVhck5ldHdvcmtUaW1lb3V0KCk7XHJcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICBpZiAoJ25lZWRDb25maXJtYXRpb24nIGluIGpzb24pIHtcclxuICAgICAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBcImFjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWxcIiAvKiBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OICovLCBqc29uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rICYmICEoJ2Vycm9yTWVzc2FnZScgaW4ganNvbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5vayA/IGpzb24uZXJyb3JNZXNzYWdlIDoganNvbi5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICBjb25zdCBbc2VydmVyRXJyb3JDb2RlLCBzZXJ2ZXJFcnJvck1lc3NhZ2VdID0gZXJyb3JNZXNzYWdlLnNwbGl0KCcgOiAnKTtcclxuICAgICAgICAgICAgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gXCJGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRFwiIC8qIFNlcnZlckVycm9yLkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEICovKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIFwiY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZVwiIC8qIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSAqLywganNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc2VydmVyRXJyb3JDb2RlID09PSBcIkVNQUlMX0VYSVNUU1wiIC8qIFNlcnZlckVycm9yLkVNQUlMX0VYSVNUUyAqLykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBcImVtYWlsLWFscmVhZHktaW4tdXNlXCIgLyogQXV0aEVycm9yQ29kZS5FTUFJTF9FWElTVFMgKi8sIGpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gXCJVU0VSX0RJU0FCTEVEXCIgLyogU2VydmVyRXJyb3IuVVNFUl9ESVNBQkxFRCAqLykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBcInVzZXItZGlzYWJsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlVTRVJfRElTQUJMRUQgKi8sIGpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dGhFcnJvciA9IGVycm9yTWFwW3NlcnZlckVycm9yQ29kZV0gfHxcclxuICAgICAgICAgICAgICAgIHNlcnZlckVycm9yQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgJy0nKTtcclxuICAgICAgICAgICAgaWYgKHNlcnZlckVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UoYXV0aCwgYXV0aEVycm9yLCBzZXJ2ZXJFcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgX2ZhaWwoYXV0aCwgYXV0aEVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoYW5naW5nIHRoaXMgdG8gYSBkaWZmZXJlbnQgZXJyb3IgY29kZSB3aWxsIGxvZyB1c2VyIG91dCB3aGVuIHRoZXJlIGlzIGEgbmV0d29yayBlcnJvclxyXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgdHJlYXQgYW55IGVycm9yIG90aGVyIHRoYW4gTkVUV09SS19SRVFVRVNUX0ZBSUxFRCBhcyB0b2tlbiBpcyBpbnZhbGlkLlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvYmxvYi80ZmJjNzM2MTBkNzBiZTRlMDg1MmU3ZGU2M2EzOWNiNzg5N2U4NTQ2L3BhY2thZ2VzL2F1dGgvc3JjL2NvcmUvYXV0aC9hdXRoX2ltcGwudHMjTDMwOS1MMzE2XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovLCB7ICdtZXNzYWdlJzogU3RyaW5nKGUpIH0pO1xyXG4gICAgfVxyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBtZXRob2QsIHBhdGgsIHJlcXVlc3QsIGN1c3RvbUVycm9yTWFwID0ge30pIHtcclxuICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBtZXRob2QsIHBhdGgsIHJlcXVlc3QsIGN1c3RvbUVycm9yTWFwKSk7XHJcbiAgICBpZiAoJ21mYVBlbmRpbmdDcmVkZW50aWFsJyBpbiBzZXJ2ZXJSZXNwb25zZSkge1xyXG4gICAgICAgIF9mYWlsKGF1dGgsIFwibXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWRcIiAvKiBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCAqLywge1xyXG4gICAgICAgICAgICBfc2VydmVyUmVzcG9uc2U6IHNlcnZlclJlc3BvbnNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VydmVyUmVzcG9uc2U7XHJcbn1cclxuZnVuY3Rpb24gX2dldEZpbmFsVGFyZ2V0KGF1dGgsIGhvc3QsIHBhdGgsIHF1ZXJ5KSB7XHJcbiAgICBjb25zdCBiYXNlID0gYCR7aG9zdH0ke3BhdGh9PyR7cXVlcnl9YDtcclxuICAgIGlmICghYXV0aC5jb25maWcuZW11bGF0b3IpIHtcclxuICAgICAgICByZXR1cm4gYCR7YXV0aC5jb25maWcuYXBpU2NoZW1lfTovLyR7YmFzZX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9lbXVsYXRvclVybChhdXRoLmNvbmZpZywgYmFzZSk7XHJcbn1cclxuY2xhc3MgTmV0d29ya1RpbWVvdXQge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgLy8gTm9kZSB0aW1lcnMgYW5kIGJyb3dzZXIgdGltZXJzIGFyZSBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSwgYnV0IHdlXHJcbiAgICAgICAgLy8gZG9uJ3QgY2FyZSBhYm91dCB0aGUgdmFsdWUgaGVyZVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgdGhpcy50aW1lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqLykpO1xyXG4gICAgICAgICAgICB9LCBERUZBVUxUX0FQSV9USU1FT1VUX01TLmdldCgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyTmV0d29ya1RpbWVvdXQoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgY29kZSwgcmVzcG9uc2UpIHtcclxuICAgIGNvbnN0IGVycm9yUGFyYW1zID0ge1xyXG4gICAgICAgIGFwcE5hbWU6IGF1dGgubmFtZVxyXG4gICAgfTtcclxuICAgIGlmIChyZXNwb25zZS5lbWFpbCkge1xyXG4gICAgICAgIGVycm9yUGFyYW1zLmVtYWlsID0gcmVzcG9uc2UuZW1haWw7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcG9uc2UucGhvbmVOdW1iZXIpIHtcclxuICAgICAgICBlcnJvclBhcmFtcy5waG9uZU51bWJlciA9IHJlc3BvbnNlLnBob25lTnVtYmVyO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZXJyb3IgPSBfY3JlYXRlRXJyb3IoYXV0aCwgY29kZSwgZXJyb3JQYXJhbXMpO1xyXG4gICAgLy8gV2Uga25vdyBjdXN0b21EYXRhIGlzIGRlZmluZWQgb24gZXJyb3IgYmVjYXVzZSBlcnJvclBhcmFtcyBpcyBkZWZpbmVkXHJcbiAgICBlcnJvci5jdXN0b21EYXRhLl90b2tlblJlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgICByZXR1cm4gZXJyb3I7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWNjb3VudChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6ZGVsZXRlXCIgLyogRW5kcG9pbnQuREVMRVRFX0FDQ09VTlQgKi8sIHJlcXVlc3QpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxpbmtlZEFjY291bnRzKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czp1cGRhdGVcIiAvKiBFbmRwb2ludC5TRVRfQUNDT1VOVF9JTkZPICovLCByZXF1ZXN0KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBnZXRBY2NvdW50SW5mbyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6bG9va3VwXCIgLyogRW5kcG9pbnQuR0VUX0FDQ09VTlRfSU5GTyAqLywgcmVxdWVzdCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHV0Y1RpbWVzdGFtcCkge1xyXG4gICAgaWYgKCF1dGNUaW1lc3RhbXApIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyBDb252ZXJ0IHRvIGRhdGUgb2JqZWN0LlxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShOdW1iZXIodXRjVGltZXN0YW1wKSk7XHJcbiAgICAgICAgLy8gVGVzdCBkYXRlIGlzIHZhbGlkLlxyXG4gICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gVVRDIGRhdGUgc3RyaW5nLlxyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b1VUQ1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gRG8gbm90aGluZy4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgSlNPTiBXZWIgVG9rZW4gKEpXVCkgdXNlZCB0byBpZGVudGlmeSB0aGUgdXNlciB0byBhIEZpcmViYXNlIHNlcnZpY2UuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgaXQgaGFzIG5vdCBleHBpcmVkIG9yIGlmIGl0IHdpbGwgbm90IGV4cGlyZSBpbiB0aGUgbmV4dCBmaXZlXHJcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldElkVG9rZW4odXNlciwgZm9yY2VSZWZyZXNoID0gZmFsc2UpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGVzZXJpYWxpemVkIEpTT04gV2ViIFRva2VuIChKV1QpIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHVzZXIgdG8gYSBGaXJlYmFzZSBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlmIGl0IGhhcyBub3QgZXhwaXJlZCBvciBpZiBpdCB3aWxsIG5vdCBleHBpcmUgaW4gdGhlIG5leHQgZml2ZVxyXG4gKiBtaW51dGVzLiBPdGhlcndpc2UsIHRoaXMgd2lsbCByZWZyZXNoIHRoZSB0b2tlbiBhbmQgcmV0dXJuIGEgbmV3IG9uZS5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIEZvcmNlIHJlZnJlc2ggcmVnYXJkbGVzcyBvZiB0b2tlbiBleHBpcmF0aW9uLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBnZXRJZFRva2VuUmVzdWx0KHVzZXIsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XHJcbiAgICBjb25zdCBjbGFpbXMgPSBfcGFyc2VUb2tlbih0b2tlbik7XHJcbiAgICBfYXNzZXJ0KGNsYWltcyAmJiBjbGFpbXMuZXhwICYmIGNsYWltcy5hdXRoX3RpbWUgJiYgY2xhaW1zLmlhdCwgdXNlckludGVybmFsLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIGNvbnN0IGZpcmViYXNlID0gdHlwZW9mIGNsYWltcy5maXJlYmFzZSA9PT0gJ29iamVjdCcgPyBjbGFpbXMuZmlyZWJhc2UgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBzaWduSW5Qcm92aWRlciA9IGZpcmViYXNlID09PSBudWxsIHx8IGZpcmViYXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJlYmFzZVsnc2lnbl9pbl9wcm92aWRlciddO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjbGFpbXMsXHJcbiAgICAgICAgdG9rZW4sXHJcbiAgICAgICAgYXV0aFRpbWU6IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmF1dGhfdGltZSkpLFxyXG4gICAgICAgIGlzc3VlZEF0VGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhjbGFpbXMuaWF0KSksXHJcbiAgICAgICAgZXhwaXJhdGlvblRpbWU6IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmV4cCkpLFxyXG4gICAgICAgIHNpZ25JblByb3ZpZGVyOiBzaWduSW5Qcm92aWRlciB8fCBudWxsLFxyXG4gICAgICAgIHNpZ25JblNlY29uZEZhY3RvcjogKGZpcmViYXNlID09PSBudWxsIHx8IGZpcmViYXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaXJlYmFzZVsnc2lnbl9pbl9zZWNvbmRfZmFjdG9yJ10pIHx8IG51bGxcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKHNlY29uZHMpIHtcclxuICAgIHJldHVybiBOdW1iZXIoc2Vjb25kcykgKiAxMDAwO1xyXG59XHJcbmZ1bmN0aW9uIF9wYXJzZVRva2VuKHRva2VuKSB7XHJcbiAgICBjb25zdCBbYWxnb3JpdGhtLCBwYXlsb2FkLCBzaWduYXR1cmVdID0gdG9rZW4uc3BsaXQoJy4nKTtcclxuICAgIGlmIChhbGdvcml0aG0gPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgIHBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgIHNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgX2xvZ0Vycm9yKCdKV1QgbWFsZm9ybWVkLCBjb250YWluZWQgZmV3ZXIgdGhhbiAzIHNlY3Rpb25zJyk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlNjREZWNvZGUocGF5bG9hZCk7XHJcbiAgICAgICAgaWYgKCFkZWNvZGVkKSB7XHJcbiAgICAgICAgICAgIF9sb2dFcnJvcignRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQgSldUIHBheWxvYWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBfbG9nRXJyb3IoJ0NhdWdodCBlcnJvciBwYXJzaW5nIEpXVCBwYXlsb2FkIGFzIEpTT04nLCBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEV4dHJhY3QgZXhwaXJlc0luIFRUTCBmcm9tIGEgdG9rZW4gYnkgc3VidHJhY3RpbmcgdGhlIGV4cGlyYXRpb24gZnJvbSB0aGUgaXNzdWFuY2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfdG9rZW5FeHBpcmVzSW4odG9rZW4pIHtcclxuICAgIGNvbnN0IHBhcnNlZFRva2VuID0gX3BhcnNlVG9rZW4odG9rZW4pO1xyXG4gICAgX2Fzc2VydChwYXJzZWRUb2tlbiwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uZXhwICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uaWF0ICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIE51bWJlcihwYXJzZWRUb2tlbi5leHApIC0gTnVtYmVyKHBhcnNlZFRva2VuLmlhdCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX2xvZ291dElmSW52YWxpZGF0ZWQodXNlciwgcHJvbWlzZSwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGlmIChieXBhc3NBdXRoU3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvciAmJiBpc1VzZXJJbnZhbGlkYXRlZChlKSkge1xyXG4gICAgICAgICAgICBpZiAodXNlci5hdXRoLmN1cnJlbnRVc2VyID09PSB1c2VyKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB1c2VyLmF1dGguc2lnbk91dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaXNVc2VySW52YWxpZGF0ZWQoeyBjb2RlIH0pIHtcclxuICAgIHJldHVybiAoY29kZSA9PT0gYGF1dGgvJHtcInVzZXItZGlzYWJsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlVTRVJfRElTQUJMRUQgKi99YCB8fFxyXG4gICAgICAgIGNvZGUgPT09IGBhdXRoLyR7XCJ1c2VyLXRva2VuLWV4cGlyZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQgKi99YCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgUHJvYWN0aXZlUmVmcmVzaCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1c2VyKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyByZXR1cm4gZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXHJcbiAgICAgICAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSAzMDAwMCAvKiBEdXJhdGlvbi5SRVRSWV9CQUNLT0ZGX01JTiAqLztcclxuICAgIH1cclxuICAgIF9zdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zY2hlZHVsZSgpO1xyXG4gICAgfVxyXG4gICAgX3N0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXJJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRJbnRlcnZhbCh3YXNFcnJvcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBpZiAod2FzRXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmVycm9yQmFja29mZjtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSBNYXRoLm1pbih0aGlzLmVycm9yQmFja29mZiAqIDIsIDk2MDAwMCAvKiBEdXJhdGlvbi5SRVRSWV9CQUNLT0ZGX01BWCAqLyk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlcnJvciBiYWNrb2ZmXHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmID0gMzAwMDAgLyogRHVyYXRpb24uUkVUUllfQkFDS09GRl9NSU4gKi87XHJcbiAgICAgICAgICAgIGNvbnN0IGV4cFRpbWUgPSAoX2EgPSB0aGlzLnVzZXIuc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbCA9IGV4cFRpbWUgLSBEYXRlLm5vdygpIC0gMzAwMDAwIC8qIER1cmF0aW9uLk9GRlNFVCAqLztcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzY2hlZHVsZSh3YXNFcnJvciA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICAvLyBKdXN0IGluIGNhc2UuLi5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMuZ2V0SW50ZXJ2YWwod2FzRXJyb3IpO1xyXG4gICAgICAgIHRoaXMudGltZXJJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLml0ZXJhdGlvbigpO1xyXG4gICAgICAgIH0sIGludGVydmFsKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGl0ZXJhdGlvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gT25seSByZXRyeSBvbiBuZXR3b3JrIGVycm9yc1xyXG4gICAgICAgICAgICBpZiAoKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5jb2RlKSA9PT1cclxuICAgICAgICAgICAgICAgIGBhdXRoLyR7XCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovfWApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoLyogd2FzRXJyb3IgKi8gdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgVXNlck1ldGFkYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZWRBdCwgbGFzdExvZ2luQXQpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRBdCA9IGNyZWF0ZWRBdDtcclxuICAgICAgICB0aGlzLmxhc3RMb2dpbkF0ID0gbGFzdExvZ2luQXQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplVGltZSgpIHtcclxuICAgICAgICB0aGlzLmxhc3RTaWduSW5UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMubGFzdExvZ2luQXQpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpb25UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMuY3JlYXRlZEF0KTtcclxuICAgIH1cclxuICAgIF9jb3B5KG1ldGFkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBtZXRhZGF0YS5jcmVhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5sYXN0TG9naW5BdCA9IG1ldGFkYXRhLmxhc3RMb2dpbkF0O1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVUaW1lKCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3JlYXRlZEF0OiB0aGlzLmNyZWF0ZWRBdCxcclxuICAgICAgICAgICAgbGFzdExvZ2luQXQ6IHRoaXMubGFzdExvZ2luQXRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGggPSB1c2VyLmF1dGg7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIGdldEFjY291bnRJbmZvKGF1dGgsIHsgaWRUb2tlbiB9KSk7XHJcbiAgICBfYXNzZXJ0KHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS51c2Vycy5sZW5ndGgsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIGNvbnN0IGNvcmVBY2NvdW50ID0gcmVzcG9uc2UudXNlcnNbMF07XHJcbiAgICB1c2VyLl9ub3RpZnlSZWxvYWRMaXN0ZW5lcihjb3JlQWNjb3VudCk7XHJcbiAgICBjb25zdCBuZXdQcm92aWRlckRhdGEgPSAoKF9hID0gY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aClcclxuICAgICAgICA/IGV4dHJhY3RQcm92aWRlckRhdGEoY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbylcclxuICAgICAgICA6IFtdO1xyXG4gICAgY29uc3QgcHJvdmlkZXJEYXRhID0gbWVyZ2VQcm92aWRlckRhdGEodXNlci5wcm92aWRlckRhdGEsIG5ld1Byb3ZpZGVyRGF0YSk7XHJcbiAgICAvLyBQcmVzZXJ2ZXMgdGhlIG5vbi1ub255bW91cyBzdGF0dXMgb2YgdGhlIHN0b3JlZCB1c2VyLCBldmVuIGlmIG5vIG1vcmVcclxuICAgIC8vIGNyZWRlbnRpYWxzIChmZWRlcmF0ZWQgb3IgZW1haWwvcGFzc3dvcmQpIGFyZSBsaW5rZWQgdG8gdGhlIHVzZXIuIElmXHJcbiAgICAvLyB0aGUgdXNlciB3YXMgcHJldmlvdXNseSBhbm9ueW1vdXMsIHRoZW4gdXNlIHByb3ZpZGVyIGRhdGEgdG8gdXBkYXRlLlxyXG4gICAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIGl0IHdhcyBub3QgYW5vbnltb3VzIGJlZm9yZSwgaXQgc2hvdWxkIG5ldmVyIGJlXHJcbiAgICAvLyBjb25zaWRlcmVkIGFub255bW91cyBub3cuXHJcbiAgICBjb25zdCBvbGRJc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XHJcbiAgICBjb25zdCBuZXdJc0Fub255bW91cyA9ICEodXNlci5lbWFpbCAmJiBjb3JlQWNjb3VudC5wYXNzd29yZEhhc2gpICYmICEocHJvdmlkZXJEYXRhID09PSBudWxsIHx8IHByb3ZpZGVyRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvdmlkZXJEYXRhLmxlbmd0aCk7XHJcbiAgICBjb25zdCBpc0Fub255bW91cyA9ICFvbGRJc0Fub255bW91cyA/IGZhbHNlIDogbmV3SXNBbm9ueW1vdXM7XHJcbiAgICBjb25zdCB1cGRhdGVzID0ge1xyXG4gICAgICAgIHVpZDogY29yZUFjY291bnQubG9jYWxJZCxcclxuICAgICAgICBkaXNwbGF5TmFtZTogY29yZUFjY291bnQuZGlzcGxheU5hbWUgfHwgbnVsbCxcclxuICAgICAgICBwaG90b1VSTDogY29yZUFjY291bnQucGhvdG9VcmwgfHwgbnVsbCxcclxuICAgICAgICBlbWFpbDogY29yZUFjY291bnQuZW1haWwgfHwgbnVsbCxcclxuICAgICAgICBlbWFpbFZlcmlmaWVkOiBjb3JlQWNjb3VudC5lbWFpbFZlcmlmaWVkIHx8IGZhbHNlLFxyXG4gICAgICAgIHBob25lTnVtYmVyOiBjb3JlQWNjb3VudC5waG9uZU51bWJlciB8fCBudWxsLFxyXG4gICAgICAgIHRlbmFudElkOiBjb3JlQWNjb3VudC50ZW5hbnRJZCB8fCBudWxsLFxyXG4gICAgICAgIHByb3ZpZGVyRGF0YSxcclxuICAgICAgICBtZXRhZGF0YTogbmV3IFVzZXJNZXRhZGF0YShjb3JlQWNjb3VudC5jcmVhdGVkQXQsIGNvcmVBY2NvdW50Lmxhc3RMb2dpbkF0KSxcclxuICAgICAgICBpc0Fub255bW91c1xyXG4gICAgfTtcclxuICAgIE9iamVjdC5hc3NpZ24odXNlciwgdXBkYXRlcyk7XHJcbn1cclxuLyoqXHJcbiAqIFJlbG9hZHMgdXNlciBhY2NvdW50IGRhdGEsIGlmIHNpZ25lZCBpbi5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVsb2FkKHVzZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXJJbnRlcm5hbCk7XHJcbiAgICAvLyBFdmVuIHRob3VnaCB0aGUgY3VycmVudCB1c2VyIGhhc24ndCBjaGFuZ2VkLCB1cGRhdGVcclxuICAgIC8vIGN1cnJlbnQgdXNlciB3aWxsIHRyaWdnZXIgYSBwZXJzaXN0ZW5jZSB1cGRhdGUgdy8gdGhlXHJcbiAgICAvLyBuZXcgaW5mby5cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xyXG4gICAgdXNlckludGVybmFsLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xyXG59XHJcbmZ1bmN0aW9uIG1lcmdlUHJvdmlkZXJEYXRhKG9yaWdpbmFsLCBuZXdEYXRhKSB7XHJcbiAgICBjb25zdCBkZWR1cGVkID0gb3JpZ2luYWwuZmlsdGVyKG8gPT4gIW5ld0RhdGEuc29tZShuID0+IG4ucHJvdmlkZXJJZCA9PT0gby5wcm92aWRlcklkKSk7XHJcbiAgICByZXR1cm4gWy4uLmRlZHVwZWQsIC4uLm5ld0RhdGFdO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RQcm92aWRlckRhdGEocHJvdmlkZXJzKSB7XHJcbiAgICByZXR1cm4gcHJvdmlkZXJzLm1hcCgoX2EpID0+IHtcclxuICAgICAgICB2YXIgeyBwcm92aWRlcklkIH0gPSBfYSwgcHJvdmlkZXIgPSBfX3Jlc3QoX2EsIFtcInByb3ZpZGVySWRcIl0pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgIHVpZDogcHJvdmlkZXIucmF3SWQgfHwgJycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBwcm92aWRlci5kaXNwbGF5TmFtZSB8fCBudWxsLFxyXG4gICAgICAgICAgICBlbWFpbDogcHJvdmlkZXIuZW1haWwgfHwgbnVsbCxcclxuICAgICAgICAgICAgcGhvbmVOdW1iZXI6IHByb3ZpZGVyLnBob25lTnVtYmVyIHx8IG51bGwsXHJcbiAgICAgICAgICAgIHBob3RvVVJMOiBwcm92aWRlci5waG90b1VybCB8fCBudWxsXHJcbiAgICAgICAgfTtcclxuICAgIH0pO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTdHNUb2tlbihhdXRoLCByZWZyZXNoVG9rZW4pIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nKGF1dGgsIHt9LCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHF1ZXJ5c3RyaW5nKHtcclxuICAgICAgICAgICAgJ2dyYW50X3R5cGUnOiAncmVmcmVzaF90b2tlbicsXHJcbiAgICAgICAgICAgICdyZWZyZXNoX3Rva2VuJzogcmVmcmVzaFRva2VuXHJcbiAgICAgICAgfSkuc2xpY2UoMSk7XHJcbiAgICAgICAgY29uc3QgeyB0b2tlbkFwaUhvc3QsIGFwaUtleSB9ID0gYXV0aC5jb25maWc7XHJcbiAgICAgICAgY29uc3QgdXJsID0gX2dldEZpbmFsVGFyZ2V0KGF1dGgsIHRva2VuQXBpSG9zdCwgXCIvdjEvdG9rZW5cIiAvKiBFbmRwb2ludC5UT0tFTiAqLywgYGtleT0ke2FwaUtleX1gKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYXV0aC5fZ2V0QWRkaXRpb25hbEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCIgLyogSHR0cEhlYWRlci5DT05URU5UX1RZUEUgKi9dID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICAgICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKSh1cmwsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sXHJcbiAgICAgICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgICAgIGJvZHlcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgLy8gVGhlIHJlc3BvbnNlIGNvbWVzIGJhY2sgaW4gc25ha2VfY2FzZS4gQ29udmVydCB0byBjYW1lbDpcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc190b2tlbixcclxuICAgICAgICBleHBpcmVzSW46IHJlc3BvbnNlLmV4cGlyZXNfaW4sXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoX3Rva2VuXHJcbiAgICB9O1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBXZSBuZWVkIHRvIG1hcmsgdGhpcyBjbGFzcyBhcyBpbnRlcm5hbCBleHBsaWNpdGx5IHRvIGV4Y2x1ZGUgaXQgaW4gdGhlIHB1YmxpYyB0eXBpbmdzLCBiZWNhdXNlXHJcbiAqIGl0IHJlZmVyZW5jZXMgQXV0aEludGVybmFsIHdoaWNoIGhhcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBVc2VySW50ZXJuYWwuXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY2xhc3MgU3RzVG9rZW5NYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbnVsbDtcclxuICAgIH1cclxuICAgIGdldCBpc0V4cGlyZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuICghdGhpcy5leHBpcmF0aW9uVGltZSB8fFxyXG4gICAgICAgICAgICBEYXRlLm5vdygpID4gdGhpcy5leHBpcmF0aW9uVGltZSAtIDMwMDAwIC8qIEJ1ZmZlci5UT0tFTl9SRUZSRVNIICovKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShyZXNwb25zZSkge1xyXG4gICAgICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIHJlc3BvbnNlLmlkVG9rZW4gIT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVzcG9uc2UucmVmcmVzaFRva2VuICE9PSAndW5kZWZpbmVkJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGNvbnN0IGV4cGlyZXNJbiA9ICdleHBpcmVzSW4nIGluIHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZS5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgICAgID8gTnVtYmVyKHJlc3BvbnNlLmV4cGlyZXNJbilcclxuICAgICAgICAgICAgOiBfdG9rZW5FeHBpcmVzSW4ocmVzcG9uc2UuaWRUb2tlbik7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKHJlc3BvbnNlLmlkVG9rZW4sIHJlc3BvbnNlLnJlZnJlc2hUb2tlbiwgZXhwaXJlc0luKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFRva2VuKGF1dGgsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKSB7XHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5hY2Nlc3NUb2tlbiB8fCB0aGlzLnJlZnJlc2hUb2tlbiwgYXV0aCwgXCJ1c2VyLXRva2VuLWV4cGlyZWRcIiAvKiBBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQgKi8pO1xyXG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIHRoaXMuYWNjZXNzVG9rZW4gJiYgIXRoaXMuaXNFeHBpcmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKGF1dGgsIHRoaXMucmVmcmVzaFRva2VuKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY2xlYXJSZWZyZXNoVG9rZW4oKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBudWxsO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVmcmVzaChhdXRoLCBvbGRUb2tlbikge1xyXG4gICAgICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXhwaXJlc0luIH0gPSBhd2FpdCByZXF1ZXN0U3RzVG9rZW4oYXV0aCwgb2xkVG9rZW4pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuLCBOdW1iZXIoZXhwaXJlc0luKSk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyZXNJblNlYykge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBleHBpcmVzSW5TZWMgKiAxMDAwO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKGFwcE5hbWUsIG9iamVjdCkge1xyXG4gICAgICAgIGNvbnN0IHsgcmVmcmVzaFRva2VuLCBhY2Nlc3NUb2tlbiwgZXhwaXJhdGlvblRpbWUgfSA9IG9iamVjdDtcclxuICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xyXG4gICAgICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0eXBlb2YgcmVmcmVzaFRva2VuID09PSAnc3RyaW5nJywgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8sIHtcclxuICAgICAgICAgICAgICAgIGFwcE5hbWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1hbmFnZXIucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0eXBlb2YgYWNjZXNzVG9rZW4gPT09ICdzdHJpbmcnLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgYXBwTmFtZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbWFuYWdlci5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXhwaXJhdGlvblRpbWUpIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0eXBlb2YgZXhwaXJhdGlvblRpbWUgPT09ICdudW1iZXInLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgYXBwTmFtZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbWFuYWdlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRoaXMucmVmcmVzaFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgZXhwaXJhdGlvblRpbWU6IHRoaXMuZXhwaXJhdGlvblRpbWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgX2Fzc2lnbihzdHNUb2tlbk1hbmFnZXIpIHtcclxuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gc3RzVG9rZW5NYW5hZ2VyLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lO1xyXG4gICAgfVxyXG4gICAgX2Nsb25lKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBTdHNUb2tlbk1hbmFnZXIoKSwgdGhpcy50b0pTT04oKSk7XHJcbiAgICB9XHJcbiAgICBfcGVyZm9ybVJlZnJlc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoYXNzZXJ0aW9uLCBhcHBOYW1lKSB7XHJcbiAgICBfYXNzZXJ0KHR5cGVvZiBhc3NlcnRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhc3NlcnRpb24gPT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLywgeyBhcHBOYW1lIH0pO1xyXG59XHJcbmNsYXNzIFVzZXJJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKF9hKSB7XHJcbiAgICAgICAgdmFyIHsgdWlkLCBhdXRoLCBzdHNUb2tlbk1hbmFnZXIgfSA9IF9hLCBvcHQgPSBfX3Jlc3QoX2EsIFtcInVpZFwiLCBcImF1dGhcIiwgXCJzdHNUb2tlbk1hbmFnZXJcIl0pO1xyXG4gICAgICAgIC8vIEZvciB0aGUgdXNlciBvYmplY3QsIHByb3ZpZGVyIGlzIGFsd2F5cyBGaXJlYmFzZS5cclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBcImZpcmViYXNlXCIgLyogUHJvdmlkZXJJZC5GSVJFQkFTRSAqLztcclxuICAgICAgICB0aGlzLnByb2FjdGl2ZVJlZnJlc2ggPSBuZXcgUHJvYWN0aXZlUmVmcmVzaCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlbG9hZExpc3RlbmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnVpZCA9IHVpZDtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyID0gc3RzVG9rZW5NYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IG9wdC5kaXNwbGF5TmFtZSB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMuZW1haWwgPSBvcHQuZW1haWwgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSBvcHQuZW1haWxWZXJpZmllZCB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gb3B0LnBob25lTnVtYmVyIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5waG90b1VSTCA9IG9wdC5waG90b1VSTCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNBbm9ueW1vdXMgPSBvcHQuaXNBbm9ueW1vdXMgfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9IG9wdC50ZW5hbnRJZCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJEYXRhID0gb3B0LnByb3ZpZGVyRGF0YSA/IFsuLi5vcHQucHJvdmlkZXJEYXRhXSA6IFtdO1xyXG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgVXNlck1ldGFkYXRhKG9wdC5jcmVhdGVkQXQgfHwgdW5kZWZpbmVkLCBvcHQubGFzdExvZ2luQXQgfHwgdW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldElkVG9rZW4oZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh0aGlzLCB0aGlzLnN0c1Rva2VuTWFuYWdlci5nZXRUb2tlbih0aGlzLmF1dGgsIGZvcmNlUmVmcmVzaCkpO1xyXG4gICAgICAgIF9hc3NlcnQoYWNjZXNzVG9rZW4sIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuICE9PSBhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5fbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47XHJcbiAgICB9XHJcbiAgICBnZXRJZFRva2VuUmVzdWx0KGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHJldHVybiBnZXRJZFRva2VuUmVzdWx0KHRoaXMsIGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcbiAgICByZWxvYWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlbG9hZCh0aGlzKTtcclxuICAgIH1cclxuICAgIF9hc3NpZ24odXNlcikge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLnVpZCA9PT0gdXNlci51aWQsIHRoaXMuYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB1c2VyLmRpc3BsYXlOYW1lO1xyXG4gICAgICAgIHRoaXMucGhvdG9VUkwgPSB1c2VyLnBob3RvVVJMO1xyXG4gICAgICAgIHRoaXMuZW1haWwgPSB1c2VyLmVtYWlsO1xyXG4gICAgICAgIHRoaXMuZW1haWxWZXJpZmllZCA9IHVzZXIuZW1haWxWZXJpZmllZDtcclxuICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gdXNlci5waG9uZU51bWJlcjtcclxuICAgICAgICB0aGlzLmlzQW5vbnltb3VzID0gdXNlci5pc0Fub255bW91cztcclxuICAgICAgICB0aGlzLnRlbmFudElkID0gdXNlci50ZW5hbnRJZDtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyRGF0YSA9IHVzZXIucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoT2JqZWN0LmFzc2lnbih7fSwgdXNlckluZm8pKSk7XHJcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5fY29weSh1c2VyLm1ldGFkYXRhKTtcclxuICAgICAgICB0aGlzLnN0c1Rva2VuTWFuYWdlci5fYXNzaWduKHVzZXIuc3RzVG9rZW5NYW5hZ2VyKTtcclxuICAgIH1cclxuICAgIF9jbG9uZShhdXRoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VXNlciA9IG5ldyBVc2VySW1wbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMpLCB7IGF1dGgsIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Nsb25lKCkgfSkpO1xyXG4gICAgICAgIG5ld1VzZXIubWV0YWRhdGEuX2NvcHkodGhpcy5tZXRhZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld1VzZXI7XHJcbiAgICB9XHJcbiAgICBfb25SZWxvYWQoY2FsbGJhY2spIHtcclxuICAgICAgICAvLyBUaGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBsaXN0ZW5lciwgYW5kIHRoYXQgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgTXVsdGlGYWN0b3JVc2VyXHJcbiAgICAgICAgX2Fzc2VydCghdGhpcy5yZWxvYWRMaXN0ZW5lciwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRMaXN0ZW5lciA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbG9hZFVzZXJJbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVJlbG9hZExpc3RlbmVyKHRoaXMucmVsb2FkVXNlckluZm8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfbm90aWZ5UmVsb2FkTGlzdGVuZXIodXNlckluZm8pIHtcclxuICAgICAgICBpZiAodGhpcy5yZWxvYWRMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZExpc3RlbmVyKHVzZXJJbmZvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIElmIG5vIGxpc3RlbmVyIGlzIHN1YnNjcmliZWQgeWV0LCBzYXZlIHRoZSByZXN1bHQgc28gaXQncyBhdmFpbGFibGUgd2hlbiB0aGV5IGRvIHN1YnNjcmliZVxyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gdXNlckluZm87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnByb2FjdGl2ZVJlZnJlc2guX3N0YXJ0KCk7XHJcbiAgICB9XHJcbiAgICBfc3RvcFByb2FjdGl2ZVJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoLl9zdG9wKCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IHRva2Vuc1JlZnJlc2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5pZFRva2VuICYmXHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmlkVG9rZW4gIT09IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIHRva2Vuc1JlZnJlc2hlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZWxvYWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHRva2Vuc1JlZnJlc2hlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBkZWxldGUoKSB7XHJcbiAgICAgICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHRoaXMuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgIGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMsIGRlbGV0ZUFjY291bnQodGhpcy5hdXRoLCB7IGlkVG9rZW4gfSkpO1xyXG4gICAgICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmNsZWFyUmVmcmVzaFRva2VuKCk7XHJcbiAgICAgICAgLy8gVE9ETzogRGV0ZXJtaW5lIGlmIGNhbmNlbGxhYmxlLXByb21pc2VzIGFyZSBuZWNlc3NhcnkgdG8gdXNlIGluIHRoaXMgY2xhc3Mgc28gdGhhdCBkZWxldGUoKVxyXG4gICAgICAgIC8vICAgICAgIGNhbmNlbHMgcGVuZGluZyBhY3Rpb25zLi4uXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aC5zaWduT3V0KCk7XHJcbiAgICB9XHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHVpZDogdGhpcy51aWQsIGVtYWlsOiB0aGlzLmVtYWlsIHx8IHVuZGVmaW5lZCwgZW1haWxWZXJpZmllZDogdGhpcy5lbWFpbFZlcmlmaWVkLCBkaXNwbGF5TmFtZTogdGhpcy5kaXNwbGF5TmFtZSB8fCB1bmRlZmluZWQsIGlzQW5vbnltb3VzOiB0aGlzLmlzQW5vbnltb3VzLCBwaG90b1VSTDogdGhpcy5waG90b1VSTCB8fCB1bmRlZmluZWQsIHBob25lTnVtYmVyOiB0aGlzLnBob25lTnVtYmVyIHx8IHVuZGVmaW5lZCwgdGVuYW50SWQ6IHRoaXMudGVuYW50SWQgfHwgdW5kZWZpbmVkLCBwcm92aWRlckRhdGE6IHRoaXMucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoT2JqZWN0LmFzc2lnbih7fSwgdXNlckluZm8pKSksIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIudG9KU09OKCksIFxyXG4gICAgICAgICAgICAvLyBSZWRpcmVjdCBldmVudCBJRCBtdXN0IGJlIG1haW50YWluZWQgaW4gY2FzZSB0aGVyZSBpcyBhIHBlbmRpbmdcclxuICAgICAgICAgICAgLy8gcmVkaXJlY3QgZXZlbnQuXHJcbiAgICAgICAgICAgIF9yZWRpcmVjdEV2ZW50SWQ6IHRoaXMuX3JlZGlyZWN0RXZlbnRJZCB9LCB0aGlzLm1ldGFkYXRhLnRvSlNPTigpKSwgeyBcclxuICAgICAgICAgICAgLy8gUmVxdWlyZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbGVnYWN5IFNESyAoZ28vZmlyZWJhc2UtYXV0aC1zZGstcGVyc2lzdGVuY2UtcGFyc2luZyk6XHJcbiAgICAgICAgICAgIGFwaUtleTogdGhpcy5hdXRoLmNvbmZpZy5hcGlLZXksIGFwcE5hbWU6IHRoaXMuYXV0aC5uYW1lIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJlZnJlc2hUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuIHx8ICcnO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIF9mcm9tSlNPTihhdXRoLCBvYmplY3QpIHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gKF9hID0gb2JqZWN0LmRpc3BsYXlOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgZW1haWwgPSAoX2IgPSBvYmplY3QuZW1haWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBwaG9uZU51bWJlciA9IChfYyA9IG9iamVjdC5waG9uZU51bWJlcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IHBob3RvVVJMID0gKF9kID0gb2JqZWN0LnBob3RvVVJMKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSAoX2UgPSBvYmplY3QudGVuYW50SWQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBfcmVkaXJlY3RFdmVudElkID0gKF9mID0gb2JqZWN0Ll9yZWRpcmVjdEV2ZW50SWQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSAoX2cgPSBvYmplY3QuY3JlYXRlZEF0KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgbGFzdExvZ2luQXQgPSAoX2ggPSBvYmplY3QubGFzdExvZ2luQXQpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCB7IHVpZCwgZW1haWxWZXJpZmllZCwgaXNBbm9ueW1vdXMsIHByb3ZpZGVyRGF0YSwgc3RzVG9rZW5NYW5hZ2VyOiBwbGFpbk9iamVjdFRva2VuTWFuYWdlciB9ID0gb2JqZWN0O1xyXG4gICAgICAgIF9hc3NlcnQodWlkICYmIHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3Qgc3RzVG9rZW5NYW5hZ2VyID0gU3RzVG9rZW5NYW5hZ2VyLmZyb21KU09OKHRoaXMubmFtZSwgcGxhaW5PYmplY3RUb2tlbk1hbmFnZXIpO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIHVpZCA9PT0gJ3N0cmluZycsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChkaXNwbGF5TmFtZSwgYXV0aC5uYW1lKTtcclxuICAgICAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChlbWFpbCwgYXV0aC5uYW1lKTtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiBlbWFpbFZlcmlmaWVkID09PSAnYm9vbGVhbicsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiBpc0Fub255bW91cyA9PT0gJ2Jvb2xlYW4nLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQocGhvbmVOdW1iZXIsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQocGhvdG9VUkwsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQodGVuYW50SWQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoX3JlZGlyZWN0RXZlbnRJZCwgYXV0aC5uYW1lKTtcclxuICAgICAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChjcmVhdGVkQXQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQobGFzdExvZ2luQXQsIGF1dGgubmFtZSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VySW1wbCh7XHJcbiAgICAgICAgICAgIHVpZCxcclxuICAgICAgICAgICAgYXV0aCxcclxuICAgICAgICAgICAgZW1haWwsXHJcbiAgICAgICAgICAgIGVtYWlsVmVyaWZpZWQsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgICBpc0Fub255bW91cyxcclxuICAgICAgICAgICAgcGhvdG9VUkwsXHJcbiAgICAgICAgICAgIHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZCxcclxuICAgICAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIGxhc3RMb2dpbkF0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyRGF0YSAmJiBBcnJheS5pc0FycmF5KHByb3ZpZGVyRGF0YSkpIHtcclxuICAgICAgICAgICAgdXNlci5wcm92aWRlckRhdGEgPSBwcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+IChPYmplY3QuYXNzaWduKHt9LCB1c2VySW5mbykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKF9yZWRpcmVjdEV2ZW50SWQpIHtcclxuICAgICAgICAgICAgdXNlci5fcmVkaXJlY3RFdmVudElkID0gX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgYSBVc2VyIGZyb20gYW4gaWRUb2tlbiBzZXJ2ZXIgcmVzcG9uc2VcclxuICAgICAqIEBwYXJhbSBhdXRoXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlblJlc3BvbnNlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhc3luYyBfZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoLCBpZFRva2VuUmVzcG9uc2UsIGlzQW5vbnltb3VzID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBzdHNUb2tlbk1hbmFnZXIgPSBuZXcgU3RzVG9rZW5NYW5hZ2VyKCk7XHJcbiAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLnVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEZpcmViYXNlIEF1dGggdXNlci5cclxuICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcclxuICAgICAgICAgICAgdWlkOiBpZFRva2VuUmVzcG9uc2UubG9jYWxJZCxcclxuICAgICAgICAgICAgYXV0aCxcclxuICAgICAgICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxyXG4gICAgICAgICAgICBpc0Fub255bW91c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFVwZGF0ZXMgdGhlIHVzZXIgaW5mbyBhbmQgZGF0YSBhbmQgcmVzb2x2ZXMgd2l0aCBhIHVzZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XHJcbiAgICAgICAgcmV0dXJuIHVzZXI7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgaW5zdGFuY2VDYWNoZSA9IG5ldyBNYXAoKTtcclxuZnVuY3Rpb24gX2dldEluc3RhbmNlKGNscykge1xyXG4gICAgZGVidWdBc3NlcnQoY2xzIGluc3RhbmNlb2YgRnVuY3Rpb24sICdFeHBlY3RlZCBhIGNsYXNzIGRlZmluaXRpb24nKTtcclxuICAgIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlQ2FjaGUuZ2V0KGNscyk7XHJcbiAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydChpbnN0YW5jZSBpbnN0YW5jZW9mIGNscywgJ0luc3RhbmNlIHN0b3JlZCBpbiBjYWNoZSBtaXNtYXRjaGVkIHdpdGggY2xhc3MnKTtcclxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBpbnN0YW5jZSA9IG5ldyBjbHMoKTtcclxuICAgIGluc3RhbmNlQ2FjaGUuc2V0KGNscywgaW5zdGFuY2UpO1xyXG4gICAgcmV0dXJuIGluc3RhbmNlO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEluTWVtb3J5UGVyc2lzdGVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJOT05FXCIgLyogUGVyc2lzdGVuY2VUeXBlLk5PTkUgKi87XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlID0ge307XHJcbiAgICB9XHJcbiAgICBhc3luYyBfaXNBdmFpbGFibGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3RvcmFnZVtrZXldO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlbW92ZShrZXkpIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlW2tleV07XHJcbiAgICB9XHJcbiAgICBfYWRkTGlzdGVuZXIoX2tleSwgX2xpc3RlbmVyKSB7XHJcbiAgICAgICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBpbi1tZW1vcnkgc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzL3dvcmtlcnNcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2tleSwgX2xpc3RlbmVyKSB7XHJcbiAgICAgICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBpbi1tZW1vcnkgc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzL3dvcmtlcnNcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cclxuSW5NZW1vcnlQZXJzaXN0ZW5jZS50eXBlID0gJ05PTkUnO1xyXG4vKipcclxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiB0eXBlICdOT05FJy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgaW5NZW1vcnlQZXJzaXN0ZW5jZSA9IEluTWVtb3J5UGVyc2lzdGVuY2U7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9wZXJzaXN0ZW5jZUtleU5hbWUoa2V5LCBhcGlLZXksIGFwcE5hbWUpIHtcclxuICAgIHJldHVybiBgJHtcImZpcmViYXNlXCIgLyogTmFtZXNwYWNlLlBFUlNJU1RFTkNFICovfToke2tleX06JHthcGlLZXl9OiR7YXBwTmFtZX1gO1xyXG59XHJcbmNsYXNzIFBlcnNpc3RlbmNlVXNlck1hbmFnZXIge1xyXG4gICAgY29uc3RydWN0b3IocGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpIHtcclxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLnVzZXJLZXkgPSB1c2VyS2V5O1xyXG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCBuYW1lIH0gPSB0aGlzLmF1dGg7XHJcbiAgICAgICAgdGhpcy5mdWxsVXNlcktleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUodGhpcy51c2VyS2V5LCBjb25maWcuYXBpS2V5LCBuYW1lKTtcclxuICAgICAgICB0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUoXCJwZXJzaXN0ZW5jZVwiIC8qIEtleU5hbWUuUEVSU0lTVEVOQ0VfVVNFUiAqLywgY29uZmlnLmFwaUtleSwgbmFtZSk7XHJcbiAgICAgICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IGF1dGguX29uU3RvcmFnZUV2ZW50LmJpbmQoYXV0aCk7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZS5fYWRkTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBzZXRDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuX3NldCh0aGlzLmZ1bGxVc2VyS2V5LCB1c2VyLnRvSlNPTigpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlLl9nZXQodGhpcy5mdWxsVXNlcktleSk7XHJcbiAgICAgICAgcmV0dXJuIGJsb2IgPyBVc2VySW1wbC5fZnJvbUpTT04odGhpcy5hdXRoLCBibG9iKSA6IG51bGw7XHJcbiAgICB9XHJcbiAgICByZW1vdmVDdXJyZW50VXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fcmVtb3ZlKHRoaXMuZnVsbFVzZXJLZXkpO1xyXG4gICAgfVxyXG4gICAgc2F2ZVBlcnNpc3RlbmNlRm9yUmVkaXJlY3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuX3NldCh0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSwgdGhpcy5wZXJzaXN0ZW5jZS50eXBlKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNldFBlcnNpc3RlbmNlKG5ld1BlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2UgPT09IG5ld1BlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2UgPSBuZXdQZXJzaXN0ZW5jZTtcclxuICAgICAgICBpZiAoY3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudFVzZXIoY3VycmVudFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRlbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLl9yZW1vdmVMaXN0ZW5lcih0aGlzLmZ1bGxVc2VyS2V5LCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGUoYXV0aCwgcGVyc2lzdGVuY2VIaWVyYXJjaHksIHVzZXJLZXkgPSBcImF1dGhVc2VyXCIgLyogS2V5TmFtZS5BVVRIX1VTRVIgKi8pIHtcclxuICAgICAgICBpZiAoIXBlcnNpc3RlbmNlSGllcmFyY2h5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIoX2dldEluc3RhbmNlKGluTWVtb3J5UGVyc2lzdGVuY2UpLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRWxpbWluYXRlIGFueSBwZXJzaXN0ZW5jZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZVxyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVBlcnNpc3RlbmNlcyA9IChhd2FpdCBQcm9taXNlLmFsbChwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgKHBlcnNpc3RlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSkpKS5maWx0ZXIocGVyc2lzdGVuY2UgPT4gcGVyc2lzdGVuY2UpO1xyXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgbGlzdGVkLCBvciBpbiBtZW1vcnkgaWYgbm9uZSBhdmFpbGFibGVcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IGF2YWlsYWJsZVBlcnNpc3RlbmNlc1swXSB8fFxyXG4gICAgICAgICAgICBfZ2V0SW5zdGFuY2UoaW5NZW1vcnlQZXJzaXN0ZW5jZSk7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gX3BlcnNpc3RlbmNlS2V5TmFtZSh1c2VyS2V5LCBhdXRoLmNvbmZpZy5hcGlLZXksIGF1dGgubmFtZSk7XHJcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGV4aXN0aW5nIHVzZXIsIHNldHRpbmcgdGhlIGNob3NlbiBwZXJzaXN0ZW5jZSB0byB0aGF0XHJcbiAgICAgICAgLy8gcGVyc2lzdGVuY2UgaWYgdGhlIHVzZXIgZXhpc3RzLlxyXG4gICAgICAgIGxldCB1c2VyVG9NaWdyYXRlID0gbnVsbDtcclxuICAgICAgICAvLyBOb3RlLCBoZXJlIHdlIGNoZWNrIGZvciBhIHVzZXIgaW4gX2FsbF8gcGVyc2lzdGVuY2VzLCBub3QganVzdCB0aGVcclxuICAgICAgICAvLyBvbmVzIGRlZW1lZCBhdmFpbGFibGUuIElmIHdlIGNhbiBtaWdyYXRlIGEgdXNlciBvdXQgb2YgYSBicm9rZW5cclxuICAgICAgICAvLyBwZXJzaXN0ZW5jZSwgd2Ugd2lsbCAoYnV0IG9ubHkgaWYgdGhhdCBwZXJzaXN0ZW5jZSBzdXBwb3J0cyBtaWdyYXRpb24pLlxyXG4gICAgICAgIGZvciAoY29uc3QgcGVyc2lzdGVuY2Ugb2YgcGVyc2lzdGVuY2VIaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBwZXJzaXN0ZW5jZS5fZ2V0KGtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBVc2VySW1wbC5fZnJvbUpTT04oYXV0aCwgYmxvYik7IC8vIHRocm93cyBmb3IgdW5wYXJzYWJsZSBibG9iICh3cm9uZyBmb3JtYXQpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJUb01pZ3JhdGUgPSB1c2VyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UgZmluZCB0aGUgdXNlciBpbiBhIHBlcnNpc3RlbmNlIHRoYXQgZG9lcyBzdXBwb3J0IG1pZ3JhdGlvbiwgdXNlXHJcbiAgICAgICAgLy8gdGhhdCBtaWdyYXRpb24gcGF0aCAob2Ygb25seSBwZXJzaXN0ZW5jZXMgdGhhdCBzdXBwb3J0IG1pZ3JhdGlvbilcclxuICAgICAgICBjb25zdCBtaWdyYXRpb25IaWVyYXJjaHkgPSBhdmFpbGFibGVQZXJzaXN0ZW5jZXMuZmlsdGVyKHAgPT4gcC5fc2hvdWxkQWxsb3dNaWdyYXRpb24pO1xyXG4gICAgICAgIC8vIElmIHRoZSBwZXJzaXN0ZW5jZSBkb2VzIF9ub3RfIGFsbG93IG1pZ3JhdGlvbiwganVzdCBmaW5pc2ggb2ZmIGhlcmVcclxuICAgICAgICBpZiAoIXNlbGVjdGVkUGVyc2lzdGVuY2UuX3Nob3VsZEFsbG93TWlncmF0aW9uIHx8XHJcbiAgICAgICAgICAgICFtaWdyYXRpb25IaWVyYXJjaHkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VVc2VyTWFuYWdlcihzZWxlY3RlZFBlcnNpc3RlbmNlLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IG1pZ3JhdGlvbkhpZXJhcmNoeVswXTtcclxuICAgICAgICBpZiAodXNlclRvTWlncmF0ZSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIG5vcm1hbGx5IHNob3VsZG4ndCB0aHJvdyBzaW5jZSBjaG9zZW5QZXJzaXN0ZW5jZS5pc0F2YWlsYWJsZSgpIGlzIHRydWUsIGJ1dCBpZiBpdCBkb2VzXHJcbiAgICAgICAgICAgIC8vIHdlJ2xsIGp1c3QgbGV0IGl0IGJ1YmJsZSB0byBzdXJmYWNlIHRoZSBlcnJvci5cclxuICAgICAgICAgICAgYXdhaXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZS5fc2V0KGtleSwgdXNlclRvTWlncmF0ZS50b0pTT04oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gY2xlYXIgdGhlIGtleSBpbiBvdGhlciBwZXJzaXN0ZW5jZXMgYnV0IGlnbm9yZSBlcnJvcnMuIFRoaXMgaGVscHMgcHJldmVudCBpc3N1ZXNcclxuICAgICAgICAvLyBzdWNoIGFzIHVzZXJzIGdldHRpbmcgc3R1Y2sgd2l0aCBhIHByZXZpb3VzIGFjY291bnQgYWZ0ZXIgc2lnbmluZyBvdXQgYW5kIHJlZnJlc2hpbmcgdGhlIHRhYi5cclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgKHBlcnNpc3RlbmNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwZXJzaXN0ZW5jZSAhPT0gc2VsZWN0ZWRQZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VVc2VyTWFuYWdlcihzZWxlY3RlZFBlcnNpc3RlbmNlLCBhdXRoLCB1c2VyS2V5KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogRGV0ZXJtaW5lIHRoZSBicm93c2VyIGZvciB0aGUgcHVycG9zZXMgb2YgcmVwb3J0aW5nIHVzYWdlIHRvIHRoZSBBUElcclxuICovXHJcbmZ1bmN0aW9uIF9nZXRCcm93c2VyTmFtZSh1c2VyQWdlbnQpIHtcclxuICAgIGNvbnN0IHVhID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAodWEuaW5jbHVkZXMoJ29wZXJhLycpIHx8IHVhLmluY2x1ZGVzKCdvcHIvJykgfHwgdWEuaW5jbHVkZXMoJ29waW9zLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiT3BlcmFcIiAvKiBCcm93c2VyTmFtZS5PUEVSQSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc0lFTW9iaWxlKHVhKSkge1xyXG4gICAgICAgIC8vIFdpbmRvd3MgcGhvbmUgSUVNb2JpbGUgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJJRU1vYmlsZVwiIC8qIEJyb3dzZXJOYW1lLklFTU9CSUxFICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodWEuaW5jbHVkZXMoJ21zaWUnKSB8fCB1YS5pbmNsdWRlcygndHJpZGVudC8nKSkge1xyXG4gICAgICAgIHJldHVybiBcIklFXCIgLyogQnJvd3Nlck5hbWUuSUUgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh1YS5pbmNsdWRlcygnZWRnZS8nKSkge1xyXG4gICAgICAgIHJldHVybiBcIkVkZ2VcIiAvKiBCcm93c2VyTmFtZS5FREdFICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzRmlyZWZveCh1YSkpIHtcclxuICAgICAgICByZXR1cm4gXCJGaXJlZm94XCIgLyogQnJvd3Nlck5hbWUuRklSRUZPWCAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdzaWxrLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiU2lsa1wiIC8qIEJyb3dzZXJOYW1lLlNJTEsgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChfaXNCbGFja0JlcnJ5KHVhKSkge1xyXG4gICAgICAgIC8vIEJsYWNrYmVycnkgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJCbGFja2JlcnJ5XCIgLyogQnJvd3Nlck5hbWUuQkxBQ0tCRVJSWSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc1dlYk9TKHVhKSkge1xyXG4gICAgICAgIC8vIFdlYk9TIGRlZmF1bHQgYnJvd3Nlci5cclxuICAgICAgICByZXR1cm4gXCJXZWJvc1wiIC8qIEJyb3dzZXJOYW1lLldFQk9TICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzU2FmYXJpKHVhKSkge1xyXG4gICAgICAgIHJldHVybiBcIlNhZmFyaVwiIC8qIEJyb3dzZXJOYW1lLlNBRkFSSSAqLztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCh1YS5pbmNsdWRlcygnY2hyb21lLycpIHx8IF9pc0Nocm9tZUlPUyh1YSkpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdlZGdlLycpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ2hyb21lXCIgLyogQnJvd3Nlck5hbWUuQ0hST01FICovO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzQW5kcm9pZCh1YSkpIHtcclxuICAgICAgICAvLyBBbmRyb2lkIHN0b2NrIGJyb3dzZXIuXHJcbiAgICAgICAgcmV0dXJuIFwiQW5kcm9pZFwiIC8qIEJyb3dzZXJOYW1lLkFORFJPSUQgKi87XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBNb3N0IG1vZGVybiBicm93c2VycyBoYXZlIG5hbWUvdmVyc2lvbiBhdCBlbmQgb2YgdXNlciBhZ2VudCBzdHJpbmcuXHJcbiAgICAgICAgY29uc3QgcmUgPSAvKFthLXpBLVpcXGRcXC5dKylcXC9bYS16QS1aXFxkXFwuXSokLztcclxuICAgICAgICBjb25zdCBtYXRjaGVzID0gdXNlckFnZW50Lm1hdGNoKHJlKTtcclxuICAgICAgICBpZiAoKG1hdGNoZXMgPT09IG51bGwgfHwgbWF0Y2hlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWF0Y2hlcy5sZW5ndGgpID09PSAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIk90aGVyXCIgLyogQnJvd3Nlck5hbWUuT1RIRVIgKi87XHJcbn1cclxuZnVuY3Rpb24gX2lzRmlyZWZveCh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvZmlyZWZveFxcLy9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc1NhZmFyaSh1c2VyQWdlbnQgPSBnZXRVQSgpKSB7XHJcbiAgICBjb25zdCB1YSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuICh1YS5pbmNsdWRlcygnc2FmYXJpLycpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdjaHJvbWUvJykgJiZcclxuICAgICAgICAhdWEuaW5jbHVkZXMoJ2NyaW9zLycpICYmXHJcbiAgICAgICAgIXVhLmluY2x1ZGVzKCdhbmRyb2lkJykpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0Nocm9tZUlPUyh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvY3Jpb3NcXC8vaS50ZXN0KHVhKTtcclxufVxyXG5mdW5jdGlvbiBfaXNJRU1vYmlsZSh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvaWVtb2JpbGUvaS50ZXN0KHVhKTtcclxufVxyXG5mdW5jdGlvbiBfaXNBbmRyb2lkKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC9hbmRyb2lkL2kudGVzdCh1YSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzQmxhY2tCZXJyeSh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAvYmxhY2tiZXJyeS9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc1dlYk9TKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgcmV0dXJuIC93ZWJvcy9pLnRlc3QodWEpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lPUyh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAoL2lwaG9uZXxpcGFkfGlwb2QvaS50ZXN0KHVhKSB8fFxyXG4gICAgICAgICgvbWFjaW50b3NoL2kudGVzdCh1YSkgJiYgL21vYmlsZS9pLnRlc3QodWEpKSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzSU9TN09yOCh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAoLyhpUGFkfGlQaG9uZXxpUG9kKS4qT1MgN19cXGQvaS50ZXN0KHVhKSB8fFxyXG4gICAgICAgIC8oaVBhZHxpUGhvbmV8aVBvZCkuKk9TIDhfXFxkL2kudGVzdCh1YSkpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lPU1N0YW5kYWxvbmUodWEgPSBnZXRVQSgpKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gX2lzSU9TKHVhKSAmJiAhISgoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhbmRhbG9uZSk7XHJcbn1cclxuZnVuY3Rpb24gX2lzSUUxMCgpIHtcclxuICAgIHJldHVybiBpc0lFKCkgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAxMDtcclxufVxyXG5mdW5jdGlvbiBfaXNNb2JpbGVCcm93c2VyKHVhID0gZ2V0VUEoKSkge1xyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IGdldEJyb3dzZXJOYW1lIGVxdWl2YWxlbnQgZm9yIE9TLlxyXG4gICAgcmV0dXJuIChfaXNJT1ModWEpIHx8XHJcbiAgICAgICAgX2lzQW5kcm9pZCh1YSkgfHxcclxuICAgICAgICBfaXNXZWJPUyh1YSkgfHxcclxuICAgICAgICBfaXNCbGFja0JlcnJ5KHVhKSB8fFxyXG4gICAgICAgIC93aW5kb3dzIHBob25lL2kudGVzdCh1YSkgfHxcclxuICAgICAgICBfaXNJRU1vYmlsZSh1YSkpO1xyXG59XHJcbmZ1bmN0aW9uIF9pc0lmcmFtZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY3VycmVudCB3aW5kb3cgaXMgbm90IHRoZSB0b3Agd2luZG93LlxyXG4gICAgICAgIC8vIElmIHNvLCByZXR1cm4gdHJ1ZS5cclxuICAgICAgICByZXR1cm4gISEod2luZG93ICYmIHdpbmRvdyAhPT0gd2luZG93LnRvcCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKlxyXG4gKiBEZXRlcm1pbmUgdGhlIFNESyB2ZXJzaW9uIHN0cmluZ1xyXG4gKi9cclxuZnVuY3Rpb24gX2dldENsaWVudFZlcnNpb24oY2xpZW50UGxhdGZvcm0sIGZyYW1ld29ya3MgPSBbXSkge1xyXG4gICAgbGV0IHJlcG9ydGVkUGxhdGZvcm07XHJcbiAgICBzd2l0Y2ggKGNsaWVudFBsYXRmb3JtKSB7XHJcbiAgICAgICAgY2FzZSBcIkJyb3dzZXJcIiAvKiBDbGllbnRQbGF0Zm9ybS5CUk9XU0VSICovOlxyXG4gICAgICAgICAgICAvLyBJbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIHJlcG9ydCB0aGUgYnJvd3NlciBuYW1lLlxyXG4gICAgICAgICAgICByZXBvcnRlZFBsYXRmb3JtID0gX2dldEJyb3dzZXJOYW1lKGdldFVBKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiV29ya2VyXCIgLyogQ2xpZW50UGxhdGZvcm0uV09SS0VSICovOlxyXG4gICAgICAgICAgICAvLyBUZWNobmljYWxseSBhIHdvcmtlciBydW5zIGZyb20gYSBicm93c2VyIGJ1dCB3ZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgYVxyXG4gICAgICAgICAgICAvLyB3b3JrZXIgZnJvbSBhIGJyb3dzZXIuXHJcbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBDaHJvbWUtV29ya2VyL0pzQ29yZS80LjkuMS9GaXJlYmFzZUNvcmUtd2ViLlxyXG4gICAgICAgICAgICByZXBvcnRlZFBsYXRmb3JtID0gYCR7X2dldEJyb3dzZXJOYW1lKGdldFVBKCkpfS0ke2NsaWVudFBsYXRmb3JtfWA7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJlcG9ydGVkUGxhdGZvcm0gPSBjbGllbnRQbGF0Zm9ybTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcG9ydGVkRnJhbWV3b3JrcyA9IGZyYW1ld29ya3MubGVuZ3RoXHJcbiAgICAgICAgPyBmcmFtZXdvcmtzLmpvaW4oJywnKVxyXG4gICAgICAgIDogJ0ZpcmViYXNlQ29yZS13ZWInOyAvKiBkZWZhdWx0IHZhbHVlIGlmIG5vIG90aGVyIGZyYW1ld29yayBpcyB1c2VkICovXHJcbiAgICByZXR1cm4gYCR7cmVwb3J0ZWRQbGF0Zm9ybX0vJHtcIkpzQ29yZVwiIC8qIENsaWVudEltcGxlbWVudGF0aW9uLkNPUkUgKi99LyR7U0RLX1ZFUlNJT059LyR7cmVwb3J0ZWRGcmFtZXdvcmtzfWA7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhUGFyYW1zKGF1dGgpIHtcclxuICAgIHJldHVybiAoKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIkdFVFwiIC8qIEh0dHBNZXRob2QuR0VUICovLCBcIi92MS9yZWNhcHRjaGFQYXJhbXNcIiAvKiBFbmRwb2ludC5HRVRfUkVDQVBUQ0hBX1BBUkFNICovKSkucmVjYXB0Y2hhU2l0ZUtleSB8fCAnJyk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhQ29uZmlnKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJHRVRcIiAvKiBIdHRwTWV0aG9kLkdFVCAqLywgXCIvdjIvcmVjYXB0Y2hhQ29uZmlnXCIgLyogRW5kcG9pbnQuR0VUX1JFQ0FQVENIQV9DT05GSUcgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNWMihncmVjYXB0Y2hhKSB7XHJcbiAgICByZXR1cm4gKGdyZWNhcHRjaGEgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIGdyZWNhcHRjaGEuZ2V0UmVzcG9uc2UgIT09IHVuZGVmaW5lZCk7XHJcbn1cclxuZnVuY3Rpb24gaXNFbnRlcnByaXNlKGdyZWNhcHRjaGEpIHtcclxuICAgIHJldHVybiAoZ3JlY2FwdGNoYSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgZ3JlY2FwdGNoYS5lbnRlcnByaXNlICE9PSB1bmRlZmluZWQpO1xyXG59XHJcbmNsYXNzIFJlY2FwdGNoYUNvbmZpZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZUNBUFRDSEEgc2l0ZSBrZXkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaXRlS2V5ID0gJyc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJlQ0FQVENIQSBlbmFibGVtZW50IHN0YXR1cyBvZiB0aGUge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSBmb3IgdGhlIGN1cnJlbnQgdGVuYW50LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW1haWxQYXNzd29yZEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVzcG9uc2UucmVjYXB0Y2hhS2V5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWNhcHRjaGFLZXkgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEV4YW1wbGUgcmVzcG9uc2UucmVjYXB0Y2hhS2V5OiBcInByb2plY3RzL3Byb2oxMjMva2V5cy9zaXRla2V5MTIzXCJcclxuICAgICAgICB0aGlzLnNpdGVLZXkgPSByZXNwb25zZS5yZWNhcHRjaGFLZXkuc3BsaXQoJy8nKVszXTtcclxuICAgICAgICB0aGlzLmVtYWlsUGFzc3dvcmRFbmFibGVkID0gcmVzcG9uc2UucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZS5zb21lKGVuZm9yY2VtZW50U3RhdGUgPT4gZW5mb3JjZW1lbnRTdGF0ZS5wcm92aWRlciA9PT0gJ0VNQUlMX1BBU1NXT1JEX1BST1ZJREVSJyAmJlxyXG4gICAgICAgICAgICBlbmZvcmNlbWVudFN0YXRlLmVuZm9yY2VtZW50U3RhdGUgIT09ICdPRkYnKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRTY3JpcHRQYXJlbnRFbGVtZW50KCkge1xyXG4gICAgdmFyIF9hLCBfYjtcclxuICAgIHJldHVybiAoX2IgPSAoX2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGRvY3VtZW50O1xyXG59XHJcbmZ1bmN0aW9uIF9sb2FkSlModXJsKSB7XHJcbiAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgdGltZW91dCBzdXBwb3J0ICYgY2FuY2VsbGF0aW9uXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzcmMnLCB1cmwpO1xyXG4gICAgICAgIGVsLm9ubG9hZCA9IHJlc29sdmU7XHJcbiAgICAgICAgZWwub25lcnJvciA9IGUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IF9jcmVhdGVFcnJvcihcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgICAgIGVycm9yLmN1c3RvbURhdGEgPSBlO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZWwudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgICAgIGVsLmNoYXJzZXQgPSAnVVRGLTgnO1xyXG4gICAgICAgIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBfZ2VuZXJhdGVDYWxsYmFja05hbWUocHJlZml4KSB7XHJcbiAgICByZXR1cm4gYF9fJHtwcmVmaXh9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKX1gO1xyXG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cclxuY29uc3QgUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVVJMID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2VudGVycHJpc2UuanM/cmVuZGVyPSc7XHJcbmNvbnN0IFJFQ0FQVENIQV9FTlRFUlBSSVNFX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhLWVudGVycHJpc2UnO1xyXG5jb25zdCBGQUtFX1RPS0VOID0gJ05PX1JFQ0FQVENIQSc7XHJcbmNsYXNzIFJlY2FwdGNoYUVudGVycHJpc2VWZXJpZmllciB7XHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYXV0aEV4dGVybiAtIFRoZSBjb3JyZXNwb25kaW5nIEZpcmViYXNlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGF1dGhFeHRlcm4pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGFwcGxpY2F0aW9uIHZlcmlmaWVyIChlLmcuIFwicmVjYXB0Y2hhLWVudGVycHJpc2VcIikuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVkVSSUZJRVJfVFlQRTtcclxuICAgICAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aEV4dGVybik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4ZWN1dGVzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIHZhbGlkaXR5IG9mIGEgcmVxdWVzdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmVyaWZ5KGFjdGlvbiA9ICd2ZXJpZnknLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xyXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlU2l0ZUtleShhdXRoKSB7XHJcbiAgICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aC50ZW5hbnRJZCA9PSBudWxsICYmIGF1dGguX2FnZW50UmVjYXB0Y2hhQ29uZmlnICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aC5fYWdlbnRSZWNhcHRjaGFDb25maWcuc2l0ZUtleTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChhdXRoLnRlbmFudElkICE9IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICBhdXRoLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW2F1dGgudGVuYW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aC5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1thdXRoLnRlbmFudElkXS5zaXRlS2V5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBnZXRSZWNhcHRjaGFDb25maWcoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGU6IFwiQ0xJRU5UX1RZUEVfV0VCXCIgLyogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIgKi8sXHJcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogXCJSRUNBUFRDSEFfRU5URVJQUklTRVwiIC8qIFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRSAqL1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlY2FwdGNoYUtleSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3JlY2FwdGNoYSBFbnRlcnByaXNlIHNpdGUga2V5IHVuZGVmaW5lZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBSZWNhcHRjaGFDb25maWcocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aC50ZW5hbnRJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGguX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aC50ZW5hbnRJZF0gPSBjb25maWc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY29uZmlnLnNpdGVLZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiByZXRyaWV2ZVJlY2FwdGNoYVRva2VuKHNpdGVLZXksIHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCBncmVjYXB0Y2hhID0gd2luZG93LmdyZWNhcHRjaGE7XHJcbiAgICAgICAgICAgIGlmIChpc0VudGVycHJpc2UoZ3JlY2FwdGNoYSkpIHtcclxuICAgICAgICAgICAgICAgIGdyZWNhcHRjaGEuZW50ZXJwcmlzZS5yZWFkeSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JlY2FwdGNoYS5lbnRlcnByaXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKHNpdGVLZXksIHsgYWN0aW9uIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHRva2VuID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShGQUtFX1RPS0VOKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KEVycm9yKCdObyByZUNBUFRDSEEgZW50ZXJwcmlzZSBzY3JpcHQgbG9hZGVkLicpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXRyaWV2ZVNpdGVLZXkodGhpcy5hdXRoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oc2l0ZUtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiBpc0VudGVycHJpc2Uod2luZG93LmdyZWNhcHRjaGEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVSZWNhcHRjaGFUb2tlbihzaXRlS2V5LCByZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1JlY2FwdGNoYVZlcmlmaWVyIGlzIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXInKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgX2xvYWRKUyhSRUNBUFRDSEFfRU5URVJQUklTRV9VUkwgKyBzaXRlS2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlUmVjYXB0Y2hhVG9rZW4oc2l0ZUtleSwgcmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGluamVjdFJlY2FwdGNoYUZpZWxkcyhhdXRoLCByZXF1ZXN0LCBhY3Rpb24sIGNhcHRjaGFSZXNwID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHZlcmlmaWVyID0gbmV3IFJlY2FwdGNoYUVudGVycHJpc2VWZXJpZmllcihhdXRoKTtcclxuICAgIGxldCBjYXB0Y2hhUmVzcG9uc2U7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNhcHRjaGFSZXNwb25zZSA9IGF3YWl0IHZlcmlmaWVyLnZlcmlmeShhY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY2FwdGNoYVJlc3BvbnNlID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KGFjdGlvbiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdSZXF1ZXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdCk7XHJcbiAgICBpZiAoIWNhcHRjaGFSZXNwKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdSZXF1ZXN0LCB7IGNhcHRjaGFSZXNwb25zZSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24obmV3UmVxdWVzdCwgeyAnY2FwdGNoYVJlc3AnOiBjYXB0Y2hhUmVzcG9uc2UgfSk7XHJcbiAgICB9XHJcbiAgICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHsgJ2NsaWVudFR5cGUnOiBcIkNMSUVOVF9UWVBFX1dFQlwiIC8qIFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCICovIH0pO1xyXG4gICAgT2JqZWN0LmFzc2lnbihuZXdSZXF1ZXN0LCB7XHJcbiAgICAgICAgJ3JlY2FwdGNoYVZlcnNpb24nOiBcIlJFQ0FQVENIQV9FTlRFUlBSSVNFXCIgLyogUmVjYXB0Y2hhVmVyc2lvbi5FTlRFUlBSSVNFICovXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuZXdSZXF1ZXN0O1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEF1dGhNaWRkbGV3YXJlUXVldWUge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCkge1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xyXG4gICAgfVxyXG4gICAgcHVzaENhbGxiYWNrKGNhbGxiYWNrLCBvbkFib3J0KSB7XHJcbiAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGNvdWxkIGJlIHN5bmMgb3IgYXN5bmMuIFdyYXAgaXQgaW50byBhXHJcbiAgICAgICAgLy8gZnVuY3Rpb24gdGhhdCBpcyBhbHdheXMgYXN5bmMuXHJcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKHVzZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHVzZXIpO1xyXG4gICAgICAgICAgICAgICAgLy8gRWl0aGVyIHJlc29sdmUgd2l0aCBleGlzdGluZyBwcm9taXNlIG9yIHdyYXAgYSBub24tcHJvbWlzZVxyXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGludG8gYSBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTeW5jIGNhbGxiYWNrIHRocm93cy5cclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgb25BYm9ydCBpZiBwcmVzZW50XHJcbiAgICAgICAgd3JhcHBlZENhbGxiYWNrLm9uQWJvcnQgPSBvbkFib3J0O1xyXG4gICAgICAgIHRoaXMucXVldWUucHVzaCh3cmFwcGVkQ2FsbGJhY2spO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5xdWV1ZS5sZW5ndGggLSAxO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFVuc3Vic2NyaWJlLiBSZXBsYWNlIHdpdGggbm8tb3AuIERvIG5vdCByZW1vdmUgZnJvbSBhcnJheSwgb3IgaXQgd2lsbCBkaXN0dXJiXHJcbiAgICAgICAgICAgIC8vIGluZGV4aW5nIG9mIG90aGVyIGVsZW1lbnRzLlxyXG4gICAgICAgICAgICB0aGlzLnF1ZXVlW2luZGV4XSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBydW5NaWRkbGV3YXJlKG5leHRVc2VyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0aC5jdXJyZW50VXNlciA9PT0gbmV4dFVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBXaGlsZSBydW5uaW5nIHRoZSBtaWRkbGV3YXJlLCBidWlsZCBhIHRlbXBvcmFyeSBzdGFjayBvZiBvbkFib3J0XHJcbiAgICAgICAgLy8gY2FsbGJhY2tzIHRvIGNhbGwgaWYgb25lIG1pZGRsZXdhcmUgY2FsbGJhY2sgcmVqZWN0cy5cclxuICAgICAgICBjb25zdCBvbkFib3J0U3RhY2sgPSBbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJlZm9yZVN0YXRlQ2FsbGJhY2sgb2YgdGhpcy5xdWV1ZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgYmVmb3JlU3RhdGVDYWxsYmFjayhuZXh0VXNlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHB1c2ggdGhlIG9uQWJvcnQgaWYgdGhlIGNhbGxiYWNrIHN1Y2NlZWRzXHJcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlU3RhdGVDYWxsYmFjay5vbkFib3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25BYm9ydFN0YWNrLnB1c2goYmVmb3JlU3RhdGVDYWxsYmFjay5vbkFib3J0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBSdW4gYWxsIG9uQWJvcnQsIHdpdGggc2VwYXJhdGUgdHJ5L2NhdGNoIHRvIGlnbm9yZSBhbnkgZXJyb3JzIGFuZFxyXG4gICAgICAgICAgICAvLyBjb250aW51ZVxyXG4gICAgICAgICAgICBvbkFib3J0U3RhY2sucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9uQWJvcnQgb2Ygb25BYm9ydFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9uQWJvcnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogc3dhbGxvdyBlcnJvciAqL1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IHRoaXMuYXV0aC5fZXJyb3JGYWN0b3J5LmNyZWF0ZShcImxvZ2luLWJsb2NrZWRcIiAvKiBBdXRoRXJyb3JDb2RlLkxPR0lOX0JMT0NLRUQgKi8sIHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZTogZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLm1lc3NhZ2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEF1dGhJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGFwcCwgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyLCBhcHBDaGVja1NlcnZpY2VQcm92aWRlciwgY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAgICAgdGhpcy5oZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIgPSBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXI7XHJcbiAgICAgICAgdGhpcy5hcHBDaGVja1NlcnZpY2VQcm92aWRlciA9IGFwcENoZWNrU2VydmljZVByb3ZpZGVyO1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZW11bGF0b3JDb25maWcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIHRoaXMuYXV0aFN0YXRlU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICB0aGlzLmlkVG9rZW5TdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuYmVmb3JlU3RhdGVRdWV1ZSA9IG5ldyBBdXRoTWlkZGxld2FyZVF1ZXVlKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVkaXJlY3RVc2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAvLyBBbnkgbmV0d29yayBjYWxscyB3aWxsIHNldCB0aGlzIHRvIHRydWUgYW5kIHByZXZlbnQgc3Vic2VxdWVudCBlbXVsYXRvclxyXG4gICAgICAgIC8vIGluaXRpYWxpemF0aW9uXHJcbiAgICAgICAgdGhpcy5fY2FuSW5pdEVtdWxhdG9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9lcnJvckZhY3RvcnkgPSBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlk7XHJcbiAgICAgICAgdGhpcy5fYWdlbnRSZWNhcHRjaGFDb25maWcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3MgPSB7fTtcclxuICAgICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm90aWZpZWQgVUlEIGZvciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIHByZXZlbnRcclxuICAgICAgICAvLyByZXBlYXRlZCBjYWxscyB0byB0aGUgY2FsbGJhY2tzLiBVbmRlZmluZWQgbWVhbnMgaXQncyBuZXZlciBiZWVuXHJcbiAgICAgICAgLy8gY2FsbGVkLCB3aGVyZWFzIG51bGwgbWVhbnMgaXQncyBiZWVuIGNhbGxlZCB3aXRoIGEgc2lnbmVkIG91dCB1c2VyXHJcbiAgICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudGVuYW50SWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB7IGFwcFZlcmlmaWNhdGlvbkRpc2FibGVkRm9yVGVzdGluZzogZmFsc2UgfTtcclxuICAgICAgICB0aGlzLmZyYW1ld29ya3MgPSBbXTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBhcHAubmFtZTtcclxuICAgICAgICB0aGlzLmNsaWVudFZlcnNpb24gPSBjb25maWcuc2RrQ2xpZW50VmVyc2lvbjtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplV2l0aFBlcnNpc3RlbmNlKHBlcnNpc3RlbmNlSGllcmFyY2h5LCBwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICBpZiAocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciA9IF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhcHAgZGVsZXRpb24gdGhyb3VnaG91dCBpbml0aWFsaXphdGlvbiAoYWZ0ZXIgZWFjaFxyXG4gICAgICAgIC8vIHByb21pc2UgcmVzb2x1dGlvbilcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UgPSB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbmNlTWFuYWdlciA9IGF3YWl0IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIuY3JlYXRlKHRoaXMsIHBlcnNpc3RlbmNlSGllcmFyY2h5KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSByZXNvbHZlciBlYXJseSBpZiBuZWNlc3NhcnkgKG9ubHkgYXBwbGljYWJsZSB0byB3ZWI6XHJcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgaWZyYW1lIHRvIGxvYWQgaW1tZWRpYXRlbHkgaW4gY2VydGFpbiBjYXNlcylcclxuICAgICAgICAgICAgaWYgKChfYSA9IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9zaG91bGRJbml0UHJvYWN0aXZlbHkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIGRvbid0IGhhbHQgYXV0aCBsb2FkaW5nXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIHRoZSBlcnJvciAqL1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUN1cnJlbnRVc2VyKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5vdGlmaWVkVWlkID0gKChfYiA9IHRoaXMuY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi51aWQpIHx8IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhlIHBlcnNpc3RlbmNlIGlzIGNoYW5nZWQgaW4gYW5vdGhlciB3aW5kb3csIHRoZSB1c2VyIG1hbmFnZXIgd2lsbCBsZXQgdXMga25vd1xyXG4gICAgICovXHJcbiAgICBhc3luYyBfb25TdG9yYWdlRXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyICYmICF1c2VyKSB7XHJcbiAgICAgICAgICAgIC8vIE5vIGNoYW5nZSwgZG8gbm90aGluZyAod2FzIHNpZ25lZCBvdXQgYW5kIHJlbWFpbmVkIHNpZ25lZCBvdXQpLlxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIHRoZSBzYW1lIHVzZXIgaXMgdG8gYmUgc3luY2hyb25pemVkLlxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyICYmIHVzZXIgJiYgdGhpcy5jdXJyZW50VXNlci51aWQgPT09IHVzZXIudWlkKSB7XHJcbiAgICAgICAgICAgIC8vIERhdGEgdXBkYXRlLCBzaW1wbHkgY29weSBkYXRhIGNoYW5nZXMuXHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9hc3NpZ24odXNlcik7XHJcbiAgICAgICAgICAgIC8vIElmIHRva2VucyBjaGFuZ2VkIGZyb20gcHJldmlvdXMgdXNlciB0b2tlbnMsIHRoaXMgd2lsbCB0cmlnZ2VyXHJcbiAgICAgICAgICAgIC8vIG5vdGlmeUF1dGhMaXN0ZW5lcnNfLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRVc2VyLmdldElkVG9rZW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgY3VycmVudCBBdXRoIHN0YXRlLiBFaXRoZXIgYSBuZXcgbG9naW4gb3IgbG9nb3V0LlxyXG4gICAgICAgIC8vIFNraXAgYmxvY2tpbmcgY2FsbGJhY2tzLCB0aGV5IHNob3VsZCBub3QgYXBwbHkgdG8gYSBjaGFuZ2UgaW4gYW5vdGhlciB0YWIuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIodXNlciwgLyogc2tpcEJlZm9yZVN0YXRlQ2FsbGJhY2tzICovIHRydWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZUN1cnJlbnRVc2VyKHBvcHVwUmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHBlbmRpbmcgcmVkaXJlY3QgZXZlbnQuXHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNseVN0b3JlZFVzZXIgPSAoYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLmdldEN1cnJlbnRVc2VyKCkpO1xyXG4gICAgICAgIGxldCBmdXR1cmVDdXJyZW50VXNlciA9IHByZXZpb3VzbHlTdG9yZWRVc2VyO1xyXG4gICAgICAgIGxldCBuZWVkc1RvY2hlY2tNaWRkbGV3YXJlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHBvcHVwUmVkaXJlY3RSZXNvbHZlciAmJiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVc2VyRXZlbnRJZCA9IChfYSA9IHRoaXMucmVkaXJlY3RVc2VyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVXNlckV2ZW50SWQgPSBmdXR1cmVDdXJyZW50VXNlciA9PT0gbnVsbCB8fCBmdXR1cmVDdXJyZW50VXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZnV0dXJlQ3VycmVudFVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cnlSZWRpcmVjdFNpZ25Jbihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RvcmVkIHVzZXIgKGkuZS4gdGhlIG9sZCBcImN1cnJlbnRVc2VyXCIpIGhhcyBhIHJlZGlyZWN0SWQgdGhhdFxyXG4gICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSByZWRpcmVjdCB1c2VyLCB0aGVuIHdlIHdhbnQgdG8gaW5pdGlhbGx5IHNpZ24gaW4gd2l0aCB0aGVcclxuICAgICAgICAgICAgLy8gbmV3IHVzZXIgb2JqZWN0IGZyb20gcmVzdWx0LlxyXG4gICAgICAgICAgICAvLyBUT0RPKHNhbWdobyk6IE1vcmUgdGhvcm91Z2hseSB0ZXN0IGFsbCBvZiB0aGlzXHJcbiAgICAgICAgICAgIGlmICgoIXJlZGlyZWN0VXNlckV2ZW50SWQgfHwgcmVkaXJlY3RVc2VyRXZlbnRJZCA9PT0gc3RvcmVkVXNlckV2ZW50SWQpICYmXHJcbiAgICAgICAgICAgICAgICAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdWx0LnVzZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBmdXR1cmVDdXJyZW50VXNlciA9IHJlc3VsdC51c2VyO1xyXG4gICAgICAgICAgICAgICAgbmVlZHNUb2NoZWNrTWlkZGxld2FyZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm8gdXNlciBpbiBwZXJzaXN0ZW5jZSwgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLiBTZXQgdG8gbnVsbC5cclxuICAgICAgICBpZiAoIWZ1dHVyZUN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZnV0dXJlQ3VycmVudFVzZXIuX3JlZGlyZWN0RXZlbnRJZCkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgcmVkaXJlY3QgbGluayBvcGVyYXRpb24sIHdlIGNhbiByZWxvYWQgYW5kIGJhaWwuXHJcbiAgICAgICAgICAgIC8vIEZpcnN0IHRob3VnaCwgZW5zdXJlIHRoYXQgd2UgY2hlY2sgdGhlIG1pZGRsZXdhcmUgaXMgaGFwcHkuXHJcbiAgICAgICAgICAgIGlmIChuZWVkc1RvY2hlY2tNaWRkbGV3YXJlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5ydW5NaWRkbGV3YXJlKGZ1dHVyZUN1cnJlbnRVc2VyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnV0dXJlQ3VycmVudFVzZXIgPSBwcmV2aW91c2x5U3RvcmVkVXNlcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHRoaXMgaXMgYXZhaWxhYmxlIHNpbmNlIHRoZSBiaXQgaXMgb25seSBzZXQgd2hlbiB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlciBpcyBhdmFpbGFibGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIuX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQodGhpcywgKCkgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmdXR1cmVDdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKGZ1dHVyZUN1cnJlbnRVc2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIsIHRoaXMsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKCk7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHVzZXIncyBldmVudCBJRCBtYXRjaGVzIHRoZSBjdXJyZW50IHVzZXIncyBldmVudCBJRCxcclxuICAgICAgICAvLyBETyBOT1QgcmVsb2FkIHRoZSBjdXJyZW50IHVzZXIsIG90aGVyd2lzZSB0aGV5J2xsIGJlIGNsZWFyZWQgZnJvbSBzdG9yYWdlLlxyXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoKSBmbG93LlxyXG4gICAgICAgIGlmICh0aGlzLnJlZGlyZWN0VXNlciAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VXNlci5fcmVkaXJlY3RFdmVudElkID09PSBmdXR1cmVDdXJyZW50VXNlci5fcmVkaXJlY3RFdmVudElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIoZnV0dXJlQ3VycmVudFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIoZnV0dXJlQ3VycmVudFVzZXIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdHJ5UmVkaXJlY3RTaWduSW4ocmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIC8vIFRoZSByZWRpcmVjdCB1c2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQgKGFuZCBzaWduZWQgaW4gaWYgYXZhaWxhYmxlKVxyXG4gICAgICAgIC8vIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uLiBBbGwgb2YgdGhlIG5vcm1hbCBzaWduIGluIGFuZCBsaW5rL3JlYXV0aFxyXG4gICAgICAgIC8vIGZsb3dzIGNhbGwgYmFjayBpbnRvIGF1dGggYW5kIHB1c2ggdGhpbmdzIG9udG8gdGhlIHByb21pc2UgcXVldWUuIFdlXHJcbiAgICAgICAgLy8gbmVlZCB0byBhd2FpdCB0aGUgcmVzdWx0IG9mIHRoZSByZWRpcmVjdCBzaWduIGluICppbnNpZGUgdGhlIHByb21pc2VcclxuICAgICAgICAvLyBxdWV1ZSouIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiB3ZSBydW4gaW50byBkZWFkbG9jay4gU2VlOlxyXG4gICAgICAgIC8vICAgIOKUjD4gW0luaXRpYWxpemF0aW9uXSDilIDilIDilIDilIDilIDilJBcclxuICAgICAgICAvLyAgICDilIw+IFs8b3RoZXIgcXVldWUgdGFza3M+XSDilIJcclxuICAgICAgICAvLyAgICDilJTilIAgW2dldFJlZGlyZWN0UmVzdWx0XSA84pSA4pSYXHJcbiAgICAgICAgLy8gICAgd2hlcmUgW10gYXJlIHRhc2tzIG9uIHRoZSBxdWV1ZSBhbmQgYXJyb3dzIGRlbm90ZSBhd2FpdHNcclxuICAgICAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIG5ldmVyIGNvbXBsZXRlIGJlY2F1c2UgaXQncyB3YWl0aW5nIG9uIHNvbWV0aGluZ1xyXG4gICAgICAgIC8vIHRoYXQncyB3YWl0aW5nIGZvciBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSFcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIEluc3RlYWQsIHRoaXMgbWV0aG9kIGNhbGxzIGdldFJlZGlyZWN0UmVzdWx0KCkgKHN0b3JlZCBpblxyXG4gICAgICAgIC8vIF9jb21wbGV0ZVJlZGlyZWN0Rm4pIHdpdGggYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgaW5zdHJ1Y3RzIGFsbCBvZlxyXG4gICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGF1dGggb3BlcmF0aW9ucyB0byBza2lwIGFueXRoaW5nIHRoYXQgbXV0YXRlcyBhdXRoIHN0YXRlLlxyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyIGlzIHNldCBzaW5jZSByZWRpcmVjdFJlc29sdmVyXHJcbiAgICAgICAgICAgIC8vIGlzIHBhc3NlZCBpbi4gVGhlIF9jb21wbGV0ZVJlZGlyZWN0Rm4gZXhwZWN0cyB0aGUgdW53cmFwcGVkIGV4dGVybi5cclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9jb21wbGV0ZVJlZGlyZWN0Rm4odGhpcywgcmVkaXJlY3RSZXNvbHZlciwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFN3YWxsb3cgYW55IGVycm9ycyBoZXJlOyB0aGUgY29kZSBjYW4gcmV0cmlldmUgdGhlbSBpblxyXG4gICAgICAgICAgICAvLyBnZXRSZWRpcmVjdFJlc3VsdCgpLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyByZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIodXNlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5jb2RlKSAhPT1cclxuICAgICAgICAgICAgICAgIGBhdXRoLyR7XCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovfWApIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZydzIHdyb25nIHdpdGggdGhlIHVzZXIncyB0b2tlbi4gTG9nIHRoZW0gb3V0IGFuZCByZW1vdmVcclxuICAgICAgICAgICAgICAgIC8vIHRoZW0gZnJvbSBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcik7XHJcbiAgICB9XHJcbiAgICB1c2VEZXZpY2VMYW5ndWFnZSgpIHtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF9nZXRVc2VyTGFuZ3VhZ2UoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9kZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyB1cGRhdGVDdXJyZW50VXNlcih1c2VyRXh0ZXJuKSB7XHJcbiAgICAgICAgLy8gVGhlIHB1YmxpYyB1cGRhdGVDdXJyZW50VXNlciBtZXRob2QgbmVlZHMgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHVzZXIsXHJcbiAgICAgICAgLy8gYW5kIGFsc28gY2hlY2sgdGhhdCB0aGUgcHJvamVjdCBtYXRjaGVzXHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJFeHRlcm5cclxuICAgICAgICAgICAgPyBnZXRNb2R1bGFySW5zdGFuY2UodXNlckV4dGVybilcclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIF9hc3NlcnQodXNlci5hdXRoLmNvbmZpZy5hcGlLZXkgPT09IHRoaXMuY29uZmlnLmFwaUtleSwgdGhpcywgXCJpbnZhbGlkLXVzZXItdG9rZW5cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVVUSCAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyICYmIHVzZXIuX2Nsb25lKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF91cGRhdGVDdXJyZW50VXNlcih1c2VyLCBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgX2Fzc2VydCh0aGlzLnRlbmFudElkID09PSB1c2VyLnRlbmFudElkLCB0aGlzLCBcInRlbmFudC1pZC1taXNtYXRjaFwiIC8qIEF1dGhFcnJvckNvZGUuVEVOQU5UX0lEX01JU01BVENIICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnJ1bk1pZGRsZXdhcmUodXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUF1dGhMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNpZ25PdXQoKSB7XHJcbiAgICAgICAgLy8gUnVuIGZpcnN0LCB0byBibG9jayBfc2V0UmVkaXJlY3RVc2VyKCkgaWYgYW55IGNhbGxiYWNrcyBmYWlsLlxyXG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5ydW5NaWRkbGV3YXJlKG51bGwpO1xyXG4gICAgICAgIC8vIENsZWFyIHRoZSByZWRpcmVjdCB1c2VyIHdoZW4gc2lnbk91dCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAodGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlciB8fCB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0UmVkaXJlY3RVc2VyKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcmV2ZW50IGNhbGxiYWNrcyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBpbiBfdXBkYXRlQ3VycmVudFVzZXIsIGFzXHJcbiAgICAgICAgLy8gdGhleSB3ZXJlIGFscmVhZHkgY2FsbGVkIGluIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcihudWxsLCAvKiBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MgKi8gdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBzZXRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldFBlcnNpc3RlbmNlKF9nZXRJbnN0YW5jZShwZXJzaXN0ZW5jZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZygpIHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldFJlY2FwdGNoYUNvbmZpZyh0aGlzLCB7XHJcbiAgICAgICAgICAgIGNsaWVudFR5cGU6IFwiQ0xJRU5UX1RZUEVfV0VCXCIgLyogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIgKi8sXHJcbiAgICAgICAgICAgIHZlcnNpb246IFwiUkVDQVBUQ0hBX0VOVEVSUFJJU0VcIiAvKiBSZWNhcHRjaGFWZXJzaW9uLkVOVEVSUFJJU0UgKi9cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgUmVjYXB0Y2hhQ29uZmlnKHJlc3BvbnNlKTtcclxuICAgICAgICBpZiAodGhpcy50ZW5hbnRJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FnZW50UmVjYXB0Y2hhQ29uZmlnID0gY29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1t0aGlzLnRlbmFudElkXSA9IGNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbmZpZy5lbWFpbFBhc3N3b3JkRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBjb25zdCB2ZXJpZmllciA9IG5ldyBSZWNhcHRjaGFFbnRlcnByaXNlVmVyaWZpZXIodGhpcyk7XHJcbiAgICAgICAgICAgIHZvaWQgdmVyaWZpZXIudmVyaWZ5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFJlY2FwdGNoYUNvbmZpZygpIHtcclxuICAgICAgICBpZiAodGhpcy50ZW5hbnRJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZ2VudFJlY2FwdGNoYUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW3RoaXMudGVuYW50SWRdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIF9nZXRQZXJzaXN0ZW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnBlcnNpc3RlbmNlLnR5cGU7XHJcbiAgICB9XHJcbiAgICBfdXBkYXRlRXJyb3JNYXAoZXJyb3JNYXApIHtcclxuICAgICAgICB0aGlzLl9lcnJvckZhY3RvcnkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhdXRoJywgJ0ZpcmViYXNlJywgZXJyb3JNYXAoKSk7XHJcbiAgICB9XHJcbiAgICBvbkF1dGhTdGF0ZUNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIodGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24sIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKTtcclxuICAgIH1cclxuICAgIGJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoY2FsbGJhY2ssIG9uQWJvcnQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnB1c2hDYWxsYmFjayhjYWxsYmFjaywgb25BYm9ydCk7XHJcbiAgICB9XHJcbiAgICBvbklkVG9rZW5DaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJTdGF0ZUxpc3RlbmVyKHRoaXMuaWRUb2tlblN1YnNjcmlwdGlvbiwgbmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhcGlLZXk6IHRoaXMuY29uZmlnLmFwaUtleSxcclxuICAgICAgICAgICAgYXV0aERvbWFpbjogdGhpcy5jb25maWcuYXV0aERvbWFpbixcclxuICAgICAgICAgICAgYXBwTmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICAgICAgICBjdXJyZW50VXNlcjogKF9hID0gdGhpcy5fY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b0pTT04oKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhc3luYyBfc2V0UmVkaXJlY3RVc2VyKHVzZXIsIHBvcHVwUmVkaXJlY3RSZXNvbHZlcikge1xyXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0TWFuYWdlciA9IGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgICAgICByZXR1cm4gdXNlciA9PT0gbnVsbFxyXG4gICAgICAgICAgICA/IHJlZGlyZWN0TWFuYWdlci5yZW1vdmVDdXJyZW50VXNlcigpXHJcbiAgICAgICAgICAgIDogcmVkaXJlY3RNYW5hZ2VyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyID0gKHBvcHVwUmVkaXJlY3RSZXNvbHZlciAmJiBfZ2V0SW5zdGFuY2UocG9wdXBSZWRpcmVjdFJlc29sdmVyKSkgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlcjtcclxuICAgICAgICAgICAgX2Fzc2VydChyZXNvbHZlciwgdGhpcywgXCJhcmd1bWVudC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyID0gYXdhaXQgUGVyc2lzdGVuY2VVc2VyTWFuYWdlci5jcmVhdGUodGhpcywgW19nZXRJbnN0YW5jZShyZXNvbHZlci5fcmVkaXJlY3RQZXJzaXN0ZW5jZSldLCBcInJlZGlyZWN0VXNlclwiIC8qIEtleU5hbWUuUkVESVJFQ1RfVVNFUiAqLyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RVc2VyID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfcmVkaXJlY3RVc2VyRm9ySWQoaWQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSd2ZSBjbGVhcmVkIGFueSBwZW5kaW5nIHBlcnNpc3RlbmNlIGFjdGlvbnMgaWYgd2UncmUgbm90IGluXHJcbiAgICAgICAgLy8gdGhlIGluaXRpYWxpemVyXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKChfYSA9IHRoaXMuX2N1cnJlbnRVc2VyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3JlZGlyZWN0RXZlbnRJZCkgPT09IGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VXNlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2IgPSB0aGlzLnJlZGlyZWN0VXNlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLl9yZWRpcmVjdEV2ZW50SWQpID09PSBpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFVzZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXIpIHtcclxuICAgICAgICBpZiAodXNlciA9PT0gdGhpcy5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBOb3RpZmllcyBsaXN0ZW5lcnMgb25seSBpZiB0aGUgdXNlciBpcyBjdXJyZW50ICovXHJcbiAgICBfbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHVzZXIpIHtcclxuICAgICAgICBpZiAodXNlciA9PT0gdGhpcy5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUF1dGhMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfa2V5KCkge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbmZpZy5hdXRoRG9tYWlufToke3RoaXMuY29uZmlnLmFwaUtleX06JHt0aGlzLm5hbWV9YDtcclxuICAgIH1cclxuICAgIF9zdGFydFByb2FjdGl2ZVJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHVzZXIgY2FzdCBhcyB0aGUgaW50ZXJuYWwgdHlwZSAqL1xyXG4gICAgZ2V0IF9jdXJyZW50VXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlcjtcclxuICAgIH1cclxuICAgIG5vdGlmeUF1dGhMaXN0ZW5lcnMoKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlkVG9rZW5TdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50VWlkID0gKF9iID0gKF9hID0gdGhpcy5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVpZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5sYXN0Tm90aWZpZWRVaWQgIT09IGN1cnJlbnRVaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSBjdXJyZW50VWlkO1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhTdGF0ZVN1YnNjcmlwdGlvbi5uZXh0KHRoaXMuY3VycmVudFVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlZ2lzdGVyU3RhdGVMaXN0ZW5lcihzdWJzY3JpcHRpb24sIG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHsgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2IgPSB0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbidcclxuICAgICAgICAgICAgPyBuZXh0T3JPYnNlcnZlclxyXG4gICAgICAgICAgICA6IG5leHRPck9ic2VydmVyLm5leHQuYmluZChuZXh0T3JPYnNlcnZlcik7XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2lzSW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUoKVxyXG4gICAgICAgICAgICA6IHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgICAgICBfYXNzZXJ0KHByb21pc2UsIHRoaXMsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAvLyBUaGUgY2FsbGJhY2sgbmVlZHMgdG8gYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHBlciB0aGUgc3BlYy5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXHJcbiAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IGNiKHRoaXMuY3VycmVudFVzZXIpKTtcclxuICAgICAgICBpZiAodHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb24uYWRkT2JzZXJ2ZXIobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihuZXh0T3JPYnNlcnZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVbnByb3RlY3RlZCAoZnJvbSByYWNlIGNvbmRpdGlvbnMpIG1ldGhvZCB0byBzZXQgdGhlIGN1cnJlbnQgdXNlci4gVGhpc1xyXG4gICAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgcXVldWVkIGNhbGxiYWNrLiBUaGlzIGlzIG5lY2Vzc2FyeVxyXG4gICAgICogYmVjYXVzZSB0aGUgcXVldWUgc2hvdWxkbid0IHJlbHkgb24gYW5vdGhlciBxdWV1ZWQgY2FsbGJhY2suXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyICYmIHRoaXMuY3VycmVudFVzZXIgIT09IHVzZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFVzZXIuX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh1c2VyICYmIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB1c2VyLl9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXI7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnJlbW92ZUN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcXVldWUoYWN0aW9uKSB7XHJcbiAgICAgICAgLy8gSW4gY2FzZSBzb21ldGhpbmcgZXJyb3JzLCB0aGUgY2FsbGJhY2sgc3RpbGwgc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlclxyXG4gICAgICAgIC8vIHRvIGtlZXAgdGhlIHByb21pc2UgY2hhaW4gYWxpdmVcclxuICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSB0aGlzLm9wZXJhdGlvbnMudGhlbihhY3Rpb24sIGFjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9ucztcclxuICAgIH1cclxuICAgIGdldCBhc3NlcnRlZFBlcnNpc3RlbmNlKCkge1xyXG4gICAgICAgIF9hc3NlcnQodGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXIsIHRoaXMsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfbG9nRnJhbWV3b3JrKGZyYW1ld29yaykge1xyXG4gICAgICAgIGlmICghZnJhbWV3b3JrIHx8IHRoaXMuZnJhbWV3b3Jrcy5pbmNsdWRlcyhmcmFtZXdvcmspKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnB1c2goZnJhbWV3b3JrKTtcclxuICAgICAgICAvLyBTb3J0IGFscGhhYmV0aWNhbGx5IHNvIHRoYXQgXCJGaXJlYmFzZUNvcmUtd2ViLEZpcmViYXNlVUktd2ViXCIgYW5kXHJcbiAgICAgICAgLy8gXCJGaXJlYmFzZVVJLXdlYixGaXJlYmFzZUNvcmUtd2ViXCIgYXJlbid0IHZpZXdlZCBhcyBkaWZmZXJlbnQuXHJcbiAgICAgICAgdGhpcy5mcmFtZXdvcmtzLnNvcnQoKTtcclxuICAgICAgICB0aGlzLmNsaWVudFZlcnNpb24gPSBfZ2V0Q2xpZW50VmVyc2lvbih0aGlzLmNvbmZpZy5jbGllbnRQbGF0Zm9ybSwgdGhpcy5fZ2V0RnJhbWV3b3JrcygpKTtcclxuICAgIH1cclxuICAgIF9nZXRGcmFtZXdvcmtzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyYW1ld29ya3M7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfZ2V0QWRkaXRpb25hbEhlYWRlcnMoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgaGVhZGVycyBvbiBldmVyeSByZXF1ZXN0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAgICAgW1wiWC1DbGllbnQtVmVyc2lvblwiIC8qIEh0dHBIZWFkZXIuWF9DTElFTlRfVkVSU0lPTiAqL106IHRoaXMuY2xpZW50VmVyc2lvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuYXBwLm9wdGlvbnMuYXBwSWQpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtZ21waWRcIiAvKiBIdHRwSGVhZGVyLlhfRklSRUJBU0VfR01QSUQgKi9dID0gdGhpcy5hcHAub3B0aW9ucy5hcHBJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgdGhlIGhlYXJ0YmVhdCBzZXJ2aWNlIGV4aXN0cywgYWRkIHRoZSBoZWFydGJlYXQgc3RyaW5nXHJcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0c0hlYWRlciA9IGF3YWl0ICgoX2EgPSB0aGlzLmhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlclxyXG4gICAgICAgICAgICAuZ2V0SW1tZWRpYXRlKHtcclxuICAgICAgICAgICAgb3B0aW9uYWw6IHRydWVcclxuICAgICAgICB9KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEhlYXJ0YmVhdHNIZWFkZXIoKSk7XHJcbiAgICAgICAgaWYgKGhlYXJ0YmVhdHNIZWFkZXIpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtQ2xpZW50XCIgLyogSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0NMSUVOVCAqL10gPSBoZWFydGJlYXRzSGVhZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiB0aGUgQXBwIENoZWNrIHNlcnZpY2UgZXhpc3RzLCBhZGQgdGhlIEFwcCBDaGVjayB0b2tlbiBpbiB0aGUgaGVhZGVyc1xyXG4gICAgICAgIGNvbnN0IGFwcENoZWNrVG9rZW4gPSBhd2FpdCB0aGlzLl9nZXRBcHBDaGVja1Rva2VuKCk7XHJcbiAgICAgICAgaWYgKGFwcENoZWNrVG9rZW4pIHtcclxuICAgICAgICAgICAgaGVhZGVyc1tcIlgtRmlyZWJhc2UtQXBwQ2hlY2tcIiAvKiBIdHRwSGVhZGVyLlhfRklSRUJBU0VfQVBQX0NIRUNLICovXSA9IGFwcENoZWNrVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2dldEFwcENoZWNrVG9rZW4oKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGFwcENoZWNrVG9rZW5SZXN1bHQgPSBhd2FpdCAoKF9hID0gdGhpcy5hcHBDaGVja1NlcnZpY2VQcm92aWRlclxyXG4gICAgICAgICAgICAuZ2V0SW1tZWRpYXRlKHsgb3B0aW9uYWw6IHRydWUgfSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUb2tlbigpKTtcclxuICAgICAgICBpZiAoYXBwQ2hlY2tUb2tlblJlc3VsdCA9PT0gbnVsbCB8fCBhcHBDaGVja1Rva2VuUmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcHBDaGVja1Rva2VuUmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnRleHQ6IGFwcENoZWNrLmdldFRva2VuKCkgd2lsbCBuZXZlciB0aHJvdyBldmVuIGlmIGFuIGVycm9yIGhhcHBlbmVkLlxyXG4gICAgICAgICAgICAvLyBJbiB0aGUgZXJyb3IgY2FzZSwgYSBkdW1teSB0b2tlbiB3aWxsIGJlIHJldHVybmVkIGFsb25nIHdpdGggYW4gZXJyb3IgZmllbGQgZGVzY3JpYmluZ1xyXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IuIEluIGdlbmVyYWwsIHdlIHNob3VsZG4ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBjb25kaXRpb24gYW5kIGp1c3QgdXNlXHJcbiAgICAgICAgICAgIC8vIHRoZSB0b2tlbiAoYWN0dWFsIG9yIGR1bW15KSB0byBzZW5kIHJlcXVlc3RzLlxyXG4gICAgICAgICAgICBfbG9nV2FybihgRXJyb3Igd2hpbGUgcmV0cmlldmluZyBBcHAgQ2hlY2sgdG9rZW46ICR7YXBwQ2hlY2tUb2tlblJlc3VsdC5lcnJvcn1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFwcENoZWNrVG9rZW5SZXN1bHQgPT09IG51bGwgfHwgYXBwQ2hlY2tUb2tlblJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXBwQ2hlY2tUb2tlblJlc3VsdC50b2tlbjtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogTWV0aG9kIHRvIGJlIHVzZWQgdG8gY2FzdCBkb3duIHRvIG91ciBwcml2YXRlIGltcGxtZW50YXRpb24gb2YgQXV0aC5cclxuICogSXQgd2lsbCBhbHNvIGhhbmRsZSB1bndyYXBwaW5nIGZyb20gdGhlIGNvbXBhdCB0eXBlIGlmIG5lY2Vzc2FyeVxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCBBdXRoIG9iamVjdCBwYXNzZWQgaW4gZnJvbSBkZXZlbG9wZXJcclxuICovXHJcbmZ1bmN0aW9uIF9jYXN0QXV0aChhdXRoKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xyXG59XHJcbi8qKiBIZWxwZXIgY2xhc3MgdG8gd3JhcCBzdWJzY3JpYmVyIGxvZ2ljICovXHJcbmNsYXNzIFN1YnNjcmlwdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFkZE9ic2VydmVyID0gY3JlYXRlU3Vic2NyaWJlKG9ic2VydmVyID0+ICh0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXIpKTtcclxuICAgIH1cclxuICAgIGdldCBuZXh0KCkge1xyXG4gICAgICAgIF9hc3NlcnQodGhpcy5vYnNlcnZlciwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIubmV4dC5iaW5kKHRoaXMub2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBJbml0aWFsaXplcyBhbiB7QGxpbmsgQXV0aH0gaW5zdGFuY2Ugd2l0aCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyXHJcbiAqIHtAbGluayBEZXBlbmRlbmNpZXN9LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRoYW5cclxuICoge0BsaW5rIGdldEF1dGh9LiBgZ2V0QXV0aGAgdXNlcyBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZhdWx0cyB0byBzdXBwbHlcclxuICogdGhlIHtAbGluayBEZXBlbmRlbmNpZXN9LiBJbiBnZW5lcmFsLCBgZ2V0QXV0aGAgaXMgdGhlIGVhc2llc3Qgd2F5IHRvXHJcbiAqIGluaXRpYWxpemUgQXV0aCBhbmQgd29ya3MgZm9yIG1vc3QgdXNlIGNhc2VzLiBVc2UgYGluaXRpYWxpemVBdXRoYCBpZiB5b3VcclxuICogbmVlZCBjb250cm9sIG92ZXIgd2hpY2ggcGVyc2lzdGVuY2UgbGF5ZXIgaXMgdXNlZCwgb3IgdG8gbWluaW1pemUgYnVuZGxlXHJcbiAqIHNpemUgaWYgeW91J3JlIG5vdCB1c2luZyBlaXRoZXIgYHNpZ25JbldpdGhQb3B1cGAgb3IgYHNpZ25JbldpdGhSZWRpcmVjdGAuXHJcbiAqXHJcbiAqIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcCBvbmx5IHVzZXMgYW5vbnltb3VzIGFjY291bnRzIGFuZCB5b3Ugb25seSB3YW50XHJcbiAqIGFjY291bnRzIHNhdmVkIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLCBpbml0aWFsaXplIGBBdXRoYCB3aXRoOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhdXRoID0gaW5pdGlhbGl6ZUF1dGgoYXBwLCB7XHJcbiAqICAgcGVyc2lzdGVuY2U6IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UsXHJcbiAqICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiB1bmRlZmluZWQsXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gaW5pdGlhbGl6ZUF1dGgoYXBwLCBkZXBzKSB7XHJcbiAgICBjb25zdCBwcm92aWRlciA9IF9nZXRQcm92aWRlcihhcHAsICdhdXRoJyk7XHJcbiAgICBpZiAocHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgICAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxPcHRpb25zID0gcHJvdmlkZXIuZ2V0T3B0aW9ucygpO1xyXG4gICAgICAgIGlmIChkZWVwRXF1YWwoaW5pdGlhbE9wdGlvbnMsIGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdm9pZCAwID8gZGVwcyA6IHt9KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXV0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiYWxyZWFkeS1pbml0aWFsaXplZFwiIC8qIEF1dGhFcnJvckNvZGUuQUxSRUFEWV9JTklUSUFMSVpFRCAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmluaXRpYWxpemUoeyBvcHRpb25zOiBkZXBzIH0pO1xyXG4gICAgcmV0dXJuIGF1dGg7XHJcbn1cclxuZnVuY3Rpb24gX2luaXRpYWxpemVBdXRoSW5zdGFuY2UoYXV0aCwgZGVwcykge1xyXG4gICAgY29uc3QgcGVyc2lzdGVuY2UgPSAoZGVwcyA9PT0gbnVsbCB8fCBkZXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZXBzLnBlcnNpc3RlbmNlKSB8fCBbXTtcclxuICAgIGNvbnN0IGhpZXJhcmNoeSA9IChBcnJheS5pc0FycmF5KHBlcnNpc3RlbmNlKSA/IHBlcnNpc3RlbmNlIDogW3BlcnNpc3RlbmNlXSkubWFwKF9nZXRJbnN0YW5jZSk7XHJcbiAgICBpZiAoZGVwcyA9PT0gbnVsbCB8fCBkZXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZXBzLmVycm9yTWFwKSB7XHJcbiAgICAgICAgYXV0aC5fdXBkYXRlRXJyb3JNYXAoZGVwcy5lcnJvck1hcCk7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIHByb21pc2UgaXMgaW50ZW5kZWQgdG8gZmxvYXQ7IGF1dGggaW5pdGlhbGl6YXRpb24gaGFwcGVucyBpbiB0aGVcclxuICAgIC8vIGJhY2tncm91bmQsIG1lYW53aGlsZSB0aGUgYXV0aCBvYmplY3QgbWF5IGJlIHVzZWQgYnkgdGhlIGFwcC5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgIGF1dGguX2luaXRpYWxpemVXaXRoUGVyc2lzdGVuY2UoaGllcmFyY2h5LCBkZXBzID09PSBudWxsIHx8IGRlcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcHMucG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxufVxuXG4vKipcclxuICogQ2hhbmdlcyB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEZpcmViYXNlIEF1dGggRW11bGF0b3IsIGluc3RlYWQgb2YgcHJvZHVjdGlvblxyXG4gKiBGaXJlYmFzZSBBdXRoIHNlcnZpY2VzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBmaXJzdCBjYWxsIHRvXHJcbiAqIHtAbGluayBpbml0aWFsaXplQXV0aH0uICBEbyBub3QgdXNlIHdpdGggcHJvZHVjdGlvbiBjcmVkZW50aWFscyBhcyBlbXVsYXRvclxyXG4gKiB0cmFmZmljIGlzIG5vdCBlbmNyeXB0ZWQuXHJcbiAqXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29ubmVjdEF1dGhFbXVsYXRvcihhdXRoLCAnaHR0cDovLzEyNy4wLjAuMTo5MDk5JywgeyBkaXNhYmxlV2FybmluZ3M6IHRydWUgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIGF0IHdoaWNoIHRoZSBlbXVsYXRvciBpcyBydW5uaW5nIChlZywgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5OScpLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBgb3B0aW9ucy5kaXNhYmxlV2FybmluZ3NgIGRlZmF1bHRzIHRvIGBmYWxzZWAuIFNldCBpdCB0b1xyXG4gKiBgdHJ1ZWAgdG8gZGlzYWJsZSB0aGUgd2FybmluZyBiYW5uZXIgYXR0YWNoZWQgdG8gdGhlIERPTS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gY29ubmVjdEF1dGhFbXVsYXRvcihhdXRoLCB1cmwsIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIF9hc3NlcnQoYXV0aEludGVybmFsLl9jYW5Jbml0RW11bGF0b3IsIGF1dGhJbnRlcm5hbCwgXCJlbXVsYXRvci1jb25maWctZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5FTVVMQVRPUl9DT05GSUdfRkFJTEVEICovKTtcclxuICAgIF9hc3NlcnQoL15odHRwcz86XFwvXFwvLy50ZXN0KHVybCksIGF1dGhJbnRlcm5hbCwgXCJpbnZhbGlkLWVtdWxhdG9yLXNjaGVtZVwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9FTVVMQVRPUl9TQ0hFTUUgKi8pO1xyXG4gICAgY29uc3QgZGlzYWJsZVdhcm5pbmdzID0gISEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRpc2FibGVXYXJuaW5ncyk7XHJcbiAgICBjb25zdCBwcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbCh1cmwpO1xyXG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBleHRyYWN0SG9zdEFuZFBvcnQodXJsKTtcclxuICAgIGNvbnN0IHBvcnRTdHIgPSBwb3J0ID09PSBudWxsID8gJycgOiBgOiR7cG9ydH1gO1xyXG4gICAgLy8gQWx3YXlzIHJlcGxhY2UgcGF0aCB3aXRoIFwiL1wiIChldmVuIGlmIGlucHV0IHVybCBoYWQgbm8gcGF0aCBhdCBhbGwsIG9yIGhhZCBhIGRpZmZlcmVudCBvbmUpLlxyXG4gICAgYXV0aEludGVybmFsLmNvbmZpZy5lbXVsYXRvciA9IHsgdXJsOiBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke3BvcnRTdHJ9L2AgfTtcclxuICAgIGF1dGhJbnRlcm5hbC5zZXR0aW5ncy5hcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmcgPSB0cnVlO1xyXG4gICAgYXV0aEludGVybmFsLmVtdWxhdG9yQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XHJcbiAgICAgICAgaG9zdCxcclxuICAgICAgICBwb3J0LFxyXG4gICAgICAgIHByb3RvY29sOiBwcm90b2NvbC5yZXBsYWNlKCc6JywgJycpLFxyXG4gICAgICAgIG9wdGlvbnM6IE9iamVjdC5mcmVlemUoeyBkaXNhYmxlV2FybmluZ3MgfSlcclxuICAgIH0pO1xyXG4gICAgaWYgKCFkaXNhYmxlV2FybmluZ3MpIHtcclxuICAgICAgICBlbWl0RW11bGF0b3JXYXJuaW5nKCk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sKHVybCkge1xyXG4gICAgY29uc3QgcHJvdG9jb2xFbmQgPSB1cmwuaW5kZXhPZignOicpO1xyXG4gICAgcmV0dXJuIHByb3RvY29sRW5kIDwgMCA/ICcnIDogdXJsLnN1YnN0cigwLCBwcm90b2NvbEVuZCArIDEpO1xyXG59XHJcbmZ1bmN0aW9uIGV4dHJhY3RIb3N0QW5kUG9ydCh1cmwpIHtcclxuICAgIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XHJcbiAgICBjb25zdCBhdXRob3JpdHkgPSAvKFxcL1xcLyk/KFtePyMvXSspLy5leGVjKHVybC5zdWJzdHIocHJvdG9jb2wubGVuZ3RoKSk7IC8vIEJldHdlZW4gLy8gYW5kIC8sID8gb3IgIy5cclxuICAgIGlmICghYXV0aG9yaXR5KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgaG9zdDogJycsIHBvcnQ6IG51bGwgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhvc3RBbmRQb3J0ID0gYXV0aG9yaXR5WzJdLnNwbGl0KCdAJykucG9wKCkgfHwgJyc7IC8vIFN0cmlwIG91dCBcInVzZXJuYW1lOnBhc3N3b3JkQFwiLlxyXG4gICAgY29uc3QgYnJhY2tldGVkSVB2NiA9IC9eKFxcW1teXFxdXStcXF0pKDp8JCkvLmV4ZWMoaG9zdEFuZFBvcnQpO1xyXG4gICAgaWYgKGJyYWNrZXRlZElQdjYpIHtcclxuICAgICAgICBjb25zdCBob3N0ID0gYnJhY2tldGVkSVB2NlsxXTtcclxuICAgICAgICByZXR1cm4geyBob3N0LCBwb3J0OiBwYXJzZVBvcnQoaG9zdEFuZFBvcnQuc3Vic3RyKGhvc3QubGVuZ3RoICsgMSkpIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBbaG9zdCwgcG9ydF0gPSBob3N0QW5kUG9ydC5zcGxpdCgnOicpO1xyXG4gICAgICAgIHJldHVybiB7IGhvc3QsIHBvcnQ6IHBhcnNlUG9ydChwb3J0KSB9O1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0U3RyKSB7XHJcbiAgICBpZiAoIXBvcnRTdHIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydFN0cik7XHJcbiAgICBpZiAoaXNOYU4ocG9ydCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3J0O1xyXG59XHJcbmZ1bmN0aW9uIGVtaXRFbXVsYXRvcldhcm5pbmcoKSB7XHJcbiAgICBmdW5jdGlvbiBhdHRhY2hCYW5uZXIoKSB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgY29uc3Qgc3R5ID0gZWwuc3R5bGU7XHJcbiAgICAgICAgZWwuaW5uZXJUZXh0ID1cclxuICAgICAgICAgICAgJ1J1bm5pbmcgaW4gZW11bGF0b3IgbW9kZS4gRG8gbm90IHVzZSB3aXRoIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuJztcclxuICAgICAgICBzdHkucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIHN0eS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBzdHkuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnO1xyXG4gICAgICAgIHN0eS5ib3JkZXIgPSAnLjFlbSBzb2xpZCAjMDAwMDAwJztcclxuICAgICAgICBzdHkuY29sb3IgPSAnI2I1MDAwMCc7XHJcbiAgICAgICAgc3R5LmJvdHRvbSA9ICcwcHgnO1xyXG4gICAgICAgIHN0eS5sZWZ0ID0gJzBweCc7XHJcbiAgICAgICAgc3R5Lm1hcmdpbiA9ICcwcHgnO1xyXG4gICAgICAgIHN0eS56SW5kZXggPSAnMTAwMDAnO1xyXG4gICAgICAgIHN0eS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmaXJlYmFzZS1lbXVsYXRvci13YXJuaW5nJyk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmluZm8gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oJ1dBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIEF1dGggRW11bGF0b3IsJyArXHJcbiAgICAgICAgICAgICcgd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGxvY2FsIHRlc3Rpbmcgb25seS4gIERvIG5vdCB1c2Ugd2l0aCcgK1xyXG4gICAgICAgICAgICAnIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhdHRhY2hCYW5uZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYXR0YWNoQmFubmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgQXV0aFByb3ZpZGVyfS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogSW1wbGVtZW50YXRpb25zIHNwZWNpZnkgdGhlIGRldGFpbHMgYWJvdXQgZWFjaCBhdXRoIHByb3ZpZGVyJ3MgY3JlZGVudGlhbCByZXF1aXJlbWVudHMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIEF1dGhDcmVkZW50aWFsIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgSUQgZm9yIHRoZSBjcmVkZW50aWFsLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgJ2ZhY2Vib29rLmNvbScsIG9yICdnb29nbGUuY29tJy5cclxuICAgICAqL1xyXG4gICAgcHJvdmlkZXJJZCwgXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBzaWduIGluIG1ldGhvZCBmb3IgdGhlIGNyZWRlbnRpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIEZvciBleGFtcGxlLCB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCwgb3JcclxuICAgICAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHNpZ24taW4gbWV0aG9kXHJcbiAgICAgKiBpZGVudGlmaWVyIGFzIHJldHVybmVkIGluIHtAbGluayBmZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbH0uXHJcbiAgICAgKi9cclxuICAgIHNpZ25Jbk1ldGhvZCkge1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7XHJcbiAgICAgICAgdGhpcy5zaWduSW5NZXRob2QgPSBzaWduSW5NZXRob2Q7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfZ2V0SWRUb2tlblJlc3BvbnNlKF9hdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfbGlua1RvSWRUb2tlbihfYXV0aCwgX2lkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoX2F1dGgpIHtcclxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZXNldFBhc3N3b3JkKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czpyZXNldFBhc3N3b3JkXCIgLyogRW5kcG9pbnQuUkVTRVRfUEFTU1dPUkQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxQYXNzd29yZChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6dXBkYXRlXCIgLyogRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTyAqLywgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gYXBwbHlBY3Rpb25Db2RlJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnVwZGF0ZVwiIC8qIEVuZHBvaW50LlNFVF9BQ0NPVU5UX0lORk8gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBhc3N3b3JkKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoUGFzc3dvcmRcIiAvKiBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEFTU1dPUkQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNlbmRPb2JDb2RlXCIgLyogRW5kcG9pbnQuU0VORF9PT0JfQ09ERSAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzZW5kRW1haWxWZXJpZmljYXRpb24kMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCQxKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QW5kQ2hhbmdlRW1haWwoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmskMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aEVtYWlsTGlua1wiIC8qIEVuZHBvaW50LlNJR05fSU5fV0lUSF9FTUFJTF9MSU5LICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoRW1haWxMaW5rXCIgLyogRW5kcG9pbnQuU0lHTl9JTl9XSVRIX0VNQUlMX0xJTksgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gZm9yXHJcbiAqIHtAbGluayBQcm92aWRlcklkfS5QQVNTV09SRFxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBDb3ZlcnMgYm90aCB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCBhbmRcclxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgRW1haWxBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2VtYWlsLCBcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9wYXNzd29yZCwgc2lnbkluTWV0aG9kLCBcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF90ZW5hbnRJZCA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcihcInBhc3N3b3JkXCIgLyogUHJvdmlkZXJJZC5QQVNTV09SRCAqLywgc2lnbkluTWV0aG9kKTtcclxuICAgICAgICB0aGlzLl9lbWFpbCA9IF9lbWFpbDtcclxuICAgICAgICB0aGlzLl9wYXNzd29yZCA9IF9wYXNzd29yZDtcclxuICAgICAgICB0aGlzLl90ZW5hbnRJZCA9IF90ZW5hbnRJZDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbUVtYWlsQW5kUGFzc3dvcmQoZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBFbWFpbEF1dGhDcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCwgXCJwYXNzd29yZFwiIC8qIFNpZ25Jbk1ldGhvZC5FTUFJTF9QQVNTV09SRCAqLyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21FbWFpbEFuZENvZGUoZW1haWwsIG9vYkNvZGUsIHRlbmFudElkID0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRW1haWxBdXRoQ3JlZGVudGlhbChlbWFpbCwgb29iQ29kZSwgXCJlbWFpbExpbmtcIiAvKiBTaWduSW5NZXRob2QuRU1BSUxfTElOSyAqLywgdGVuYW50SWQpO1xyXG4gICAgfVxyXG4gICAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICovXHJcbiAgICB0b0pTT04oKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogdGhpcy5zaWduSW5NZXRob2QsXHJcbiAgICAgICAgICAgIHRlbmFudElkOiB0aGlzLl90ZW5hbnRJZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgdG8gZGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBqc29uIC0gRWl0aGVyIGBvYmplY3RgIG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiBXaGVuIHN0cmluZyBpc1xyXG4gICAgICogcHJvdmlkZWQsIGBKU09OLnBhcnNlYCB3b3VsZCBiZSBjYWxsZWQgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XHJcbiAgICAgICAgaWYgKChvYmogPT09IG51bGwgfHwgb2JqID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYmouZW1haWwpICYmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvYmoucGFzc3dvcmQpKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouc2lnbkluTWV0aG9kID09PSBcInBhc3N3b3JkXCIgLyogU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEICovKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJvbUVtYWlsQW5kUGFzc3dvcmQob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9iai5zaWduSW5NZXRob2QgPT09IFwiZW1haWxMaW5rXCIgLyogU2lnbkluTWV0aG9kLkVNQUlMX0xJTksgKi8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcm9tRW1haWxBbmRDb2RlKG9iai5lbWFpbCwgb2JqLnBhc3N3b3JkLCBvYmoudGVuYW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXN5bmMgX2dldElkVG9rZW5SZXNwb25zZShhdXRoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5zaWduSW5NZXRob2QpIHtcclxuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCIgLyogU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEICovOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGU6IFwiQ0xJRU5UX1RZUEVfV0VCXCIgLyogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIgKi9cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoKF9hID0gYXV0aC5fZ2V0UmVjYXB0Y2hhQ29uZmlnKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbWFpbFBhc3N3b3JkRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKGF1dGgsIHJlcXVlc3QsIFwic2lnbkluV2l0aFBhc3N3b3JkXCIgLyogUmVjYXB0Y2hhQWN0aW9uTmFtZS5TSUdOX0lOX1dJVEhfUEFTU1dPUkQgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWduSW5XaXRoUGFzc3dvcmQoYXV0aCwgcmVxdWVzdFdpdGhSZWNhcHRjaGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhQYXNzd29yZChhdXRoLCByZXF1ZXN0KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7XCJtaXNzaW5nLXJlY2FwdGNoYS10b2tlblwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU4gKi99YCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ24taW4gd2l0aCBlbWFpbCBhZGRyZXNzIGFuZCBwYXNzd29yZCBpcyBwcm90ZWN0ZWQgYnkgcmVDQVBUQ0hBIGZvciB0aGlzIHByb2plY3QuIEF1dG9tYXRpY2FsbHkgdHJpZ2dlcmluZyB0aGUgcmVDQVBUQ0hBIGZsb3cgYW5kIHJlc3RhcnRpbmcgdGhlIHNpZ24taW4gZmxvdy4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKGF1dGgsIHJlcXVlc3QsIFwic2lnbkluV2l0aFBhc3N3b3JkXCIgLyogUmVjYXB0Y2hhQWN0aW9uTmFtZS5TSUdOX0lOX1dJVEhfUEFTU1dPUkQgKi8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhQYXNzd29yZChhdXRoLCByZXF1ZXN0V2l0aFJlY2FwdGNoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbExpbmtcIiAvKiBTaWduSW5NZXRob2QuRU1BSUxfTElOSyAqLzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduSW5XaXRoRW1haWxMaW5rJDEoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICBvb2JDb2RlOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXN5bmMgX2xpbmtUb0lkVG9rZW4oYXV0aCwgaWRUb2tlbikge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5zaWduSW5NZXRob2QpIHtcclxuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCIgLyogU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJlbWFpbExpbmtcIiAvKiBTaWduSW5NZXRob2QuRU1BSUxfTElOSyAqLzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBzaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZyhhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRUb2tlbixcclxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgb29iQ29kZTogdGhpcy5fcGFzc3dvcmRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aElkcFwiIC8qIEVuZHBvaW50LlNJR05fSU5fV0lUSF9JRFAgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgSURQX1JFUVVFU1RfVVJJJDEgPSAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBPQXV0aCBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEltcGxlbWVudGF0aW9ucyBzcGVjaWZ5IHRoZSBkZXRhaWxzIGFib3V0IGVhY2ggYXV0aCBwcm92aWRlcidzIGNyZWRlbnRpYWwgcmVxdWlyZW1lbnRzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBPQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Rva2VuID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbVBhcmFtcyhwYXJhbXMpIHtcclxuICAgICAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLnNpZ25Jbk1ldGhvZCk7XHJcbiAgICAgICAgaWYgKHBhcmFtcy5pZFRva2VuIHx8IHBhcmFtcy5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICAvLyBPQXV0aCAyIGFuZCBlaXRoZXIgSUQgdG9rZW4gb3IgYWNjZXNzIHRva2VuLlxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmlkVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQuaWRUb2tlbiA9IHBhcmFtcy5pZFRva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQWRkIG5vbmNlIGlmIGF2YWlsYWJsZSBhbmQgbm8gcGVuZGluZ1Rva2VuIGlzIHByZXNlbnQuXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMubm9uY2UgJiYgIXBhcmFtcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQubm9uY2UgPSBwYXJhbXMubm9uY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5wZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcGFyYW1zLnBlbmRpbmdUb2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwYXJhbXMub2F1dGhUb2tlbiAmJiBwYXJhbXMub2F1dGhUb2tlblNlY3JldCkge1xyXG4gICAgICAgICAgICAvLyBPQXV0aCAxIGFuZCBPQXV0aCB0b2tlbiB3aXRoIHRva2VuIHNlY3JldFxyXG4gICAgICAgICAgICBjcmVkLmFjY2Vzc1Rva2VuID0gcGFyYW1zLm9hdXRoVG9rZW47XHJcbiAgICAgICAgICAgIGNyZWQuc2VjcmV0ID0gcGFyYW1zLm9hdXRoVG9rZW5TZWNyZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBfZmFpbChcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjcmVkO1xyXG4gICAgfVxyXG4gICAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkVG9rZW46IHRoaXMuaWRUb2tlbixcclxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQsXHJcbiAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGVuZGluZ1Rva2VuLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogdGhpcy5zaWduSW5NZXRob2RcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGRlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW50byBhblxyXG4gICAgICoge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGpzb24gLSBJbnB1dCBjYW4gYmUgZWl0aGVyIE9iamVjdCBvciB0aGUgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cclxuICAgICAqIFdoZW4gc3RyaW5nIGlzIHByb3ZpZGVkLCBKU09OLnBhcnNlIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgSlNPTiBpbnB1dCBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XHJcbiAgICAgICAgY29uc3QgeyBwcm92aWRlcklkLCBzaWduSW5NZXRob2QgfSA9IG9iaiwgcmVzdCA9IF9fcmVzdChvYmosIFtcInByb3ZpZGVySWRcIiwgXCJzaWduSW5NZXRob2RcIl0pO1xyXG4gICAgICAgIGlmICghcHJvdmlkZXJJZCB8fCAhc2lnbkluTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBzaWduSW5NZXRob2QpO1xyXG4gICAgICAgIGNyZWQuaWRUb2tlbiA9IHJlc3QuaWRUb2tlbiB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY3JlZC5hY2Nlc3NUb2tlbiA9IHJlc3QuYWNjZXNzVG9rZW4gfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGNyZWQuc2VjcmV0ID0gcmVzdC5zZWNyZXQ7XHJcbiAgICAgICAgY3JlZC5ub25jZSA9IHJlc3Qubm9uY2U7XHJcbiAgICAgICAgY3JlZC5wZW5kaW5nVG9rZW4gPSByZXN0LnBlbmRpbmdUb2tlbiB8fCBudWxsO1xyXG4gICAgICAgIHJldHVybiBjcmVkO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfbGlua1RvSWRUb2tlbihhdXRoLCBpZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgYnVpbGRSZXF1ZXN0KCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RVcmk6IElEUF9SRVFVRVNUX1VSSSQxLFxyXG4gICAgICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ1Rva2VuID0gdGhpcy5wZW5kaW5nVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwb3N0Qm9keSA9IHt9O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pZFRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBwb3N0Qm9keVsnaWRfdG9rZW4nXSA9IHRoaXMuaWRUb2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcG9zdEJvZHlbJ2FjY2Vzc190b2tlbiddID0gdGhpcy5hY2Nlc3NUb2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWNyZXQpIHtcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5WydvYXV0aF90b2tlbl9zZWNyZXQnXSA9IHRoaXMuc2VjcmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBvc3RCb2R5Wydwcm92aWRlcklkJ10gPSB0aGlzLnByb3ZpZGVySWQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5vbmNlICYmICF0aGlzLnBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcG9zdEJvZHlbJ25vbmNlJ10gPSB0aGlzLm5vbmNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcXVlc3QucG9zdEJvZHkgPSBxdWVyeXN0cmluZyhwb3N0Qm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNlbmRWZXJpZmljYXRpb25Db2RlXCIgLyogRW5kcG9pbnQuU0VORF9WRVJJRklDQVRJT05fQ09ERSAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBob25lTnVtYmVyXCIgLyogRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBob25lTnVtYmVyJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcGVyZm9ybVNpZ25JblJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czpzaWduSW5XaXRoUGhvbmVOdW1iZXJcIiAvKiBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG4gICAgaWYgKHJlc3BvbnNlLnRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBcImFjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWxcIiAvKiBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OICovLCByZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbn1cclxuY29uc3QgVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXyA9IHtcclxuICAgIFtcIlVTRVJfTk9UX0ZPVU5EXCIgLyogU2VydmVyRXJyb3IuVVNFUl9OT1RfRk9VTkQgKi9dOiBcInVzZXItbm90LWZvdW5kXCIgLyogQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQgKi9cclxufTtcclxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICBjb25zdCBhcGlSZXF1ZXN0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0KSwgeyBvcGVyYXRpb246ICdSRUFVVEgnIH0pO1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhQaG9uZU51bWJlclwiIC8qIEVuZHBvaW50LlNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCBhcGlSZXF1ZXN0KSwgVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXyk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IHtAbGluayBQaG9uZUF1dGhQcm92aWRlcn0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFBob25lQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICBzdXBlcihcInBob25lXCIgLyogUHJvdmlkZXJJZC5QSE9ORSAqLywgXCJwaG9uZVwiIC8qIFNpZ25Jbk1ldGhvZC5QSE9ORSAqLyk7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21WZXJpZmljYXRpb24odmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFBob25lQXV0aENyZWRlbnRpYWwoeyB2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSB9KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbVRva2VuUmVzcG9uc2UocGhvbmVOdW1iZXIsIHRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQaG9uZUF1dGhDcmVkZW50aWFsKHsgcGhvbmVOdW1iZXIsIHRlbXBvcmFyeVByb29mIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhQaG9uZU51bWJlciQxKGF1dGgsIHRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2xpbmtUb0lkVG9rZW4oYXV0aCwgaWRUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBsaW5rV2l0aFBob25lTnVtYmVyJDEoYXV0aCwgT2JqZWN0LmFzc2lnbih7IGlkVG9rZW4gfSwgdGhpcy5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKSkpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3RpbmcoYXV0aCwgdGhpcy5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKSB7XHJcbiAgICAgICAgY29uc3QgeyB0ZW1wb3JhcnlQcm9vZiwgcGhvbmVOdW1iZXIsIHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlIH0gPSB0aGlzLnBhcmFtcztcclxuICAgICAgICBpZiAodGVtcG9yYXJ5UHJvb2YgJiYgcGhvbmVOdW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNlc3Npb25JbmZvOiB2ZXJpZmljYXRpb25JZCxcclxuICAgICAgICAgICAgY29kZTogdmVyaWZpY2F0aW9uQ29kZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gKi9cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICBjb25zdCBvYmogPSB7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLnBob25lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIG9iai5waG9uZU51bWJlciA9IHRoaXMucGFyYW1zLnBob25lTnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMudGVtcG9yYXJ5UHJvb2YpIHtcclxuICAgICAgICAgICAgb2JqLnRlbXBvcmFyeVByb29mID0gdGhpcy5wYXJhbXMudGVtcG9yYXJ5UHJvb2Y7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgICAgIG9iai52ZXJpZmljYXRpb25Db2RlID0gdGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uQ29kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbklkKSB7XHJcbiAgICAgICAgICAgIG9iai52ZXJpZmljYXRpb25JZCA9IHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbklkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgLyoqIEdlbmVyYXRlcyBhIHBob25lIGNyZWRlbnRpYWwgYmFzZWQgb24gYSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZy4gKi9cclxuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSwgcGhvbmVOdW1iZXIsIHRlbXBvcmFyeVByb29mIH0gPSBqc29uO1xyXG4gICAgICAgIGlmICghdmVyaWZpY2F0aW9uQ29kZSAmJlxyXG4gICAgICAgICAgICAhdmVyaWZpY2F0aW9uSWQgJiZcclxuICAgICAgICAgICAgIXBob25lTnVtYmVyICYmXHJcbiAgICAgICAgICAgICF0ZW1wb3JhcnlQcm9vZikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQaG9uZUF1dGhDcmVkZW50aWFsKHtcclxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uSWQsXHJcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvZGUsXHJcbiAgICAgICAgICAgIHBob25lTnVtYmVyLFxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlQcm9vZlxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBNYXBzIHRoZSBtb2RlIHN0cmluZyBpbiBhY3Rpb24gY29kZSBVUkwgdG8gQWN0aW9uIENvZGUgSW5mbyBvcGVyYXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSBtb2RlXHJcbiAqL1xyXG5mdW5jdGlvbiBwYXJzZU1vZGUobW9kZSkge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgICAgY2FzZSAncmVjb3ZlckVtYWlsJzpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUkVDT1ZFUl9FTUFJTFwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uUkVDT1ZFUl9FTUFJTCAqLztcclxuICAgICAgICBjYXNlICdyZXNldFBhc3N3b3JkJzpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUEFTU1dPUkRfUkVTRVRcIiAvKiBBY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VUICovO1xyXG4gICAgICAgIGNhc2UgJ3NpZ25Jbic6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkVNQUlMX1NJR05JTlwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOICovO1xyXG4gICAgICAgIGNhc2UgJ3ZlcmlmeUVtYWlsJzpcclxuICAgICAgICAgICAgcmV0dXJuIFwiVkVSSUZZX0VNQUlMXCIgLyogQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfRU1BSUwgKi87XHJcbiAgICAgICAgY2FzZSAndmVyaWZ5QW5kQ2hhbmdlRW1haWwnOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi87XHJcbiAgICAgICAgY2FzZSAncmV2ZXJ0U2Vjb25kRmFjdG9yQWRkaXRpb24nOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTlwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04gKi87XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEhlbHBlciB0byBwYXJzZSBGREwgbGlua3NcclxuICpcclxuICogQHBhcmFtIHVybFxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VEZWVwTGluayh1cmwpIHtcclxuICAgIGNvbnN0IGxpbmsgPSBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcodXJsKSlbJ2xpbmsnXTtcclxuICAgIC8vIERvdWJsZSBsaW5rIGNhc2UgKGF1dG9tYXRpYyByZWRpcmVjdCkuXHJcbiAgICBjb25zdCBkb3VibGVEZWVwTGluayA9IGxpbmtcclxuICAgICAgICA/IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhsaW5rKSlbJ2RlZXBfbGlua19pZCddXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgLy8gaU9TIGN1c3RvbSBzY2hlbWUgbGlua3MuXHJcbiAgICBjb25zdCBpT1NEZWVwTGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVsnZGVlcF9saW5rX2lkJ107XHJcbiAgICBjb25zdCBpT1NEb3VibGVEZWVwTGluayA9IGlPU0RlZXBMaW5rXHJcbiAgICAgICAgPyBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcoaU9TRGVlcExpbmspKVsnbGluayddXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgcmV0dXJuIGlPU0RvdWJsZURlZXBMaW5rIHx8IGlPU0RlZXBMaW5rIHx8IGRvdWJsZURlZXBMaW5rIHx8IGxpbmsgfHwgdXJsO1xyXG59XHJcbi8qKlxyXG4gKiBBIHV0aWxpdHkgY2xhc3MgdG8gcGFyc2UgZW1haWwgYWN0aW9uIFVSTHMgc3VjaCBhcyBwYXNzd29yZCByZXNldCwgZW1haWwgdmVyaWZpY2F0aW9uLFxyXG4gKiBlbWFpbCBsaW5rIHNpZ24gaW4sIGV0Yy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgQWN0aW9uQ29kZVVSTCB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBhY3Rpb25MaW5rIC0gVGhlIGxpbmsgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBVUkwuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihhY3Rpb25MaW5rKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGFjdGlvbkxpbmspKTtcclxuICAgICAgICBjb25zdCBhcGlLZXkgPSAoX2EgPSBzZWFyY2hQYXJhbXNbXCJhcGlLZXlcIiAvKiBRdWVyeUZpZWxkLkFQSV9LRVkgKi9dKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSAoX2IgPSBzZWFyY2hQYXJhbXNbXCJvb2JDb2RlXCIgLyogUXVlcnlGaWVsZC5DT0RFICovXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbDtcclxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBwYXJzZU1vZGUoKF9jID0gc2VhcmNoUGFyYW1zW1wibW9kZVwiIC8qIFF1ZXJ5RmllbGQuTU9ERSAqL10pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG51bGwpO1xyXG4gICAgICAgIC8vIFZhbGlkYXRlIEFQSSBrZXksIGNvZGUgYW5kIG1vZGUuXHJcbiAgICAgICAgX2Fzc2VydChhcGlLZXkgJiYgY29kZSAmJiBvcGVyYXRpb24sIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcclxuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xyXG4gICAgICAgIHRoaXMuY29udGludWVVcmwgPSAoX2QgPSBzZWFyY2hQYXJhbXNbXCJjb250aW51ZVVybFwiIC8qIFF1ZXJ5RmllbGQuQ09OVElOVUVfVVJMICovXSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogbnVsbDtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IChfZSA9IHNlYXJjaFBhcmFtc1tcImxhbmd1YWdlQ29kZVwiIC8qIFF1ZXJ5RmllbGQuTEFOR1VBR0VfQ09ERSAqL10pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9IChfZiA9IHNlYXJjaFBhcmFtc1tcInRlbmFudElkXCIgLyogUXVlcnlGaWVsZC5URU5BTlRfSUQgKi9dKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgdGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZyBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gaWYgdGhlIGxpbmsgaXMgdmFsaWQsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsaW5rICAtIFRoZSBlbWFpbCBhY3Rpb24gbGluayBzdHJpbmcuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlTGluayhsaW5rKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uTGluayA9IHBhcnNlRGVlcExpbmsobGluayk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25Db2RlVVJMKGFjdGlvbkxpbmspO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQYXJzZXMgdGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZyBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gaWZcclxuICogdGhlIGxpbmsgaXMgdmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlQWN0aW9uQ29kZVVSTChsaW5rKSB7XHJcbiAgICByZXR1cm4gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsobGluayk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIHtAbGluayBFbWFpbEF1dGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgRW1haWxBdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gRW1haWxBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cclxuICAgICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgYWNjb3VudCBwYXNzd29yZC5cclxuICAgICAqIEByZXR1cm5zIFRoZSBhdXRoIHByb3ZpZGVyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBFbWFpbEF1dGhDcmVkZW50aWFsLl9mcm9tRW1haWxBbmRQYXNzd29yZChlbWFpbCwgcGFzc3dvcmQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gdXNpbmcgYW4gZW1haWwgYW5kIGFuIGVtYWlsIGxpbmsgYWZ0ZXIgYSBzaWduIGluIHdpdGhcclxuICAgICAqIGVtYWlsIGxpbmsgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCBlbWFpbCk7XHJcbiAgICAgKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdXNlci5cclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSB1c2VkIHRvIHZlcmlmeSB0aGUgbGluay5cclxuICAgICAqIEBwYXJhbSBlbWFpbCAtIEVtYWlsIGFkZHJlc3MuXHJcbiAgICAgKiBAcGFyYW0gZW1haWxMaW5rIC0gU2lnbi1pbiBlbWFpbCBsaW5rLlxyXG4gICAgICogQHJldHVybnMgLSBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbFdpdGhMaW5rKGVtYWlsLCBlbWFpbExpbmspIHtcclxuICAgICAgICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVVcmwsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICByZXR1cm4gRW1haWxBdXRoQ3JlZGVudGlhbC5fZnJvbUVtYWlsQW5kQ29kZShlbWFpbCwgYWN0aW9uQ29kZVVybC5jb2RlLCBhY3Rpb25Db2RlVXJsLnRlbmFudElkKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXHJcbiAqL1xyXG5FbWFpbEF1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IFwicGFzc3dvcmRcIiAvKiBQcm92aWRlcklkLlBBU1NXT1JEICovO1xyXG4vKipcclxuICogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRC5cclxuICovXHJcbkVtYWlsQXV0aFByb3ZpZGVyLkVNQUlMX1BBU1NXT1JEX1NJR05fSU5fTUVUSE9EID0gXCJwYXNzd29yZFwiIC8qIFNpZ25Jbk1ldGhvZC5FTUFJTF9QQVNTV09SRCAqLztcclxuLyoqXHJcbiAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cclxuICovXHJcbkVtYWlsQXV0aFByb3ZpZGVyLkVNQUlMX0xJTktfU0lHTl9JTl9NRVRIT0QgPSBcImVtYWlsTGlua1wiIC8qIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LICovO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBGZWRlcmF0ZWQgcHJvdmlkZXJzIChPQXV0aCAoaW5jbHVkaW5nIE9JREMpLCBTQU1MKS5cclxuICpcclxuICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBmb3Igd2hpY2ggY3JlZGVudGlhbHMgc2hvdWxkIGJlIGdlbmVyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXJJZCkge1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9IG51bGw7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tUGFyYW1ldGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGxhbmd1YWdlIGdvZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIGxhbmd1YWdlIGNvZGVcclxuICAgICAqL1xyXG4gICAgc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlQ29kZSkge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgT0F1dGggY3VzdG9tIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiBhbiBPQXV0aCByZXF1ZXN0IGZvciBwb3B1cCBhbmQgcmVkaXJlY3Qgc2lnbi1pblxyXG4gICAgICogb3BlcmF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogRm9yIGEgZGV0YWlsZWQgbGlzdCwgY2hlY2sgdGhlIHJlc2VydmVkIHJlcXVpcmVkIE9BdXRoIDIuMCBwYXJhbWV0ZXJzIHN1Y2ggYXMgYGNsaWVudF9pZGAsXHJcbiAgICAgKiBgcmVkaXJlY3RfdXJpYCwgYHNjb3BlYCwgYHJlc3BvbnNlX3R5cGVgLCBhbmQgYHN0YXRlYCBhcmUgbm90IGFsbG93ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY3VzdG9tT0F1dGhQYXJhbWV0ZXJzIC0gVGhlIGN1c3RvbSBPQXV0aCBwYXJhbWV0ZXJzIHRvIHBhc3MgaW4gdGhlIE9BdXRoIHJlcXVlc3QuXHJcbiAgICAgKi9cclxuICAgIHNldEN1c3RvbVBhcmFtZXRlcnMoY3VzdG9tT0F1dGhQYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21QYXJhbWV0ZXJzID0gY3VzdG9tT0F1dGhQYXJhbWV0ZXJzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBDdXN0b21QYXJhbWV0ZXJzfS5cclxuICAgICAqL1xyXG4gICAgZ2V0Q3VzdG9tUGFyYW1ldGVycygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21QYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDb21tb24gY29kZSB0byBhbGwgT0F1dGggcHJvdmlkZXJzLiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlXHJcbiAqIHtAbGluayBPQXV0aFByb3ZpZGVyfSBzbyB0aGF0IGNoaWxkIHByb3ZpZGVycyAobGlrZVxyXG4gKiB7QGxpbmsgR29vZ2xlQXV0aFByb3ZpZGVyfSkgZG9uJ3QgaW5oZXJpdCB0aGUgYGNyZWRlbnRpYWxgIGluc3RhbmNlIG1ldGhvZC5cclxuICogSW5zdGVhZCwgdGhleSByZWx5IG9uIGEgc3RhdGljIGBjcmVkZW50aWFsYCBtZXRob2QuXHJcbiAqL1xyXG5jbGFzcyBCYXNlT0F1dGhQcm92aWRlciBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICB0aGlzLnNjb3BlcyA9IFtdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gT0F1dGggc2NvcGUgdG8gdGhlIGNyZWRlbnRpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNjb3BlIC0gUHJvdmlkZXIgT0F1dGggc2NvcGUgdG8gYWRkLlxyXG4gICAgICovXHJcbiAgICBhZGRTY29wZShzY29wZSkge1xyXG4gICAgICAgIC8vIElmIG5vdCBhbHJlYWR5IGFkZGVkLCBhZGQgc2NvcGUgdG8gbGlzdC5cclxuICAgICAgICBpZiAoIXRoaXMuc2NvcGVzLmluY2x1ZGVzKHNjb3BlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNjb3Blcy5wdXNoKHNjb3BlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgT0F1dGggc2NvcGVzLlxyXG4gICAgICovXHJcbiAgICBnZXRTY29wZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnNjb3Blc107XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGdlbmVyaWMge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XHJcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiBpZiAocmVzdWx0KSB7XHJcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBPQXV0aCBBY2Nlc3MgVG9rZW4gZm9yIHRoZSBwcm92aWRlci5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgT0F1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEgSlNPTiBzdHJpbmcgb3IgYSBwbGFpbiBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIEEgcGxhaW4gb2JqZWN0IG9yIGEgSlNPTiBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tSlNPTihqc29uKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XHJcbiAgICAgICAgX2Fzc2VydCgncHJvdmlkZXJJZCcgaW4gb2JqICYmICdzaWduSW5NZXRob2QnIGluIG9iaiwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMob2JqKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBnZW5lcmljIE9BdXRoIHByb3ZpZGVyJ3MgYWNjZXNzIHRva2VuIG9yIElEIHRva2VuLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBUaGUgcmF3IG5vbmNlIGlzIHJlcXVpcmVkIHdoZW4gYW4gSUQgdG9rZW4gd2l0aCBhIG5vbmNlIGZpZWxkIGlzIHByb3ZpZGVkLiBUaGUgU0hBLTI1NiBoYXNoIG9mXHJcbiAgICAgKiB0aGUgcmF3IG5vbmNlIG11c3QgbWF0Y2ggdGhlIG5vbmNlIGZpZWxkIGluIHRoZSBJRCB0b2tlbi5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogLy8gYGdvb2dsZVVzZXJgIGZyb20gdGhlIG9uc3VjY2VzcyBHb29nbGUgU2lnbiBJbiBjYWxsYmFjay5cclxuICAgICAqIC8vIEluaXRpYWxpemUgYSBnZW5lcmF0ZSBPQXV0aCBwcm92aWRlciB3aXRoIGEgYGdvb2dsZS5jb21gIHByb3ZpZGVySWQuXHJcbiAgICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XHJcbiAgICAgKiBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbCh7XHJcbiAgICAgKiAgIGlkVG9rZW46IGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4sXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBhcmFtcyAtIEVpdGhlciB0aGUgb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgSUQgdG9rZW4sIGFjY2VzcyB0b2tlbiBhbmQgcmF3IG5vbmNlXHJcbiAgICAgKiBvciB0aGUgSUQgdG9rZW4gc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBjcmVkZW50aWFsKHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVkZW50aWFsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgeyBub25jZTogcGFyYW1zLnJhd05vbmNlIH0pKTtcclxuICAgIH1cclxuICAgIC8qKiBBbiBpbnRlcm5hbCBjcmVkZW50aWFsIG1ldGhvZCB0aGF0IGFjY2VwdHMgbW9yZSBwZXJtaXNzaXZlIG9wdGlvbnMgKi9cclxuICAgIF9jcmVkZW50aWFsKHBhcmFtcykge1xyXG4gICAgICAgIF9hc3NlcnQocGFyYW1zLmlkVG9rZW4gfHwgcGFyYW1zLmFjY2Vzc1Rva2VuLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgLy8gRm9yIE9BdXRoQ3JlZGVudGlhbCwgc2lnbiBpbiBtZXRob2QgaXMgc2FtZSBhcyBwcm92aWRlcklkLlxyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpLCB7IHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kOiB0aGlzLnByb3ZpZGVySWQgfSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoUHJvdmlkZXIub2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoUHJvdmlkZXIub2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIG9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoeyBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZSB9KSB7XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IG9hdXRoSWRUb2tlbiwgb2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCwgcGVuZGluZ1Rva2VuLCBub25jZSwgcHJvdmlkZXJJZCB9ID0gdG9rZW5SZXNwb25zZTtcclxuICAgICAgICBpZiAoIW9hdXRoQWNjZXNzVG9rZW4gJiZcclxuICAgICAgICAgICAgIW9hdXRoVG9rZW5TZWNyZXQgJiZcclxuICAgICAgICAgICAgIW9hdXRoSWRUb2tlbiAmJlxyXG4gICAgICAgICAgICAhcGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXByb3ZpZGVySWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT0F1dGhQcm92aWRlcihwcm92aWRlcklkKS5fY3JlZGVudGlhbCh7XHJcbiAgICAgICAgICAgICAgICBpZFRva2VuOiBvYXV0aElkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogb2F1dGhBY2Nlc3NUb2tlbixcclxuICAgICAgICAgICAgICAgIG5vbmNlLFxyXG4gICAgICAgICAgICAgICAgcGVuZGluZ1Rva2VuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uRkFDRUJPT0suXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XHJcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiBpZiAocmVzdWx0KSB7XHJcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXHJcbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcclxuICpcclxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXHJcbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXHJcbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBGYWNlYm9va0F1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKFwiZmFjZWJvb2suY29tXCIgLyogUHJvdmlkZXJJZC5GQUNFQk9PSyAqLyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBGYWNlYm9vay5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogLy8gYGV2ZW50YCBmcm9tIHRoZSBGYWNlYm9vayBhdXRoLmF1dGhSZXNwb25zZUNoYW5nZSBjYWxsYmFjay5cclxuICAgICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsKGV2ZW50LmF1dGhSZXNwb25zZS5hY2Nlc3NUb2tlbik7XHJcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEZhY2Vib29rIGFjY2VzcyB0b2tlbi5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwoYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0QsXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSB8fCAhKCdvYXV0aEFjY2Vzc1Rva2VuJyBpbiB0b2tlblJlc3BvbnNlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsKHRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRkFDRUJPT0suICovXHJcbkZhY2Vib29rQXV0aFByb3ZpZGVyLkZBQ0VCT09LX1NJR05fSU5fTUVUSE9EID0gXCJmYWNlYm9vay5jb21cIiAvKiBTaWduSW5NZXRob2QuRkFDRUJPT0sgKi87XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5GQUNFQk9PSy4gKi9cclxuRmFjZWJvb2tBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcImZhY2Vib29rLmNvbVwiIC8qIFByb3ZpZGVySWQuRkFDRUJPT0sgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkdPT0dMRS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR29vZ2xlQXV0aFByb3ZpZGVyKCk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEdvb2dsZSBBY2Nlc3MgVG9rZW4uXHJcbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcclxuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgR29vZ2xlQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoXCJnb29nbGUuY29tXCIgLyogUHJvdmlkZXJJZC5HT09HTEUgKi8pO1xyXG4gICAgICAgIHRoaXMuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdvb2dsZS4gQXQgbGVhc3Qgb25lIG9mIElEIHRva2VuIGFuZCBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIC8vIFxcYGdvb2dsZVVzZXJcXGAgZnJvbSB0aGUgb25zdWNjZXNzIEdvb2dsZSBTaWduIEluIGNhbGxiYWNrLlxyXG4gICAgICogY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4pO1xyXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaWRUb2tlbiAtIEdvb2dsZSBJRCB0b2tlbi5cclxuICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEdvb2dsZSBhY2Nlc3MgdG9rZW4uXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKGlkVG9rZW4sIGFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IEdvb2dsZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcclxuICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBHb29nbGVBdXRoUHJvdmlkZXIuR09PR0xFX1NJR05fSU5fTUVUSE9ELFxyXG4gICAgICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgICAgICBhY2Nlc3NUb2tlblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXHJcbiAgICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBvYXV0aElkVG9rZW4sIG9hdXRoQWNjZXNzVG9rZW4gfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFvYXV0aElkVG9rZW4gJiYgIW9hdXRoQWNjZXNzVG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiBvYXV0aCAxIGNyZWRlbnRpYWwgb3IgYSBwaG9uZSBjcmVkZW50aWFsXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HT09HTEUuICovXHJcbkdvb2dsZUF1dGhQcm92aWRlci5HT09HTEVfU0lHTl9JTl9NRVRIT0QgPSBcImdvb2dsZS5jb21cIiAvKiBTaWduSW5NZXRob2QuR09PR0xFICovO1xyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLiAqL1xyXG5Hb29nbGVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcImdvb2dsZS5jb21cIiAvKiBQcm92aWRlcklkLkdPT0dMRSAqLztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR0lUSFVCLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBHaXRIdWIgcmVxdWlyZXMgYW4gT0F1dGggMi4wIHJlZGlyZWN0LCBzbyB5b3UgY2FuIGVpdGhlciBoYW5kbGUgdGhlIHJlZGlyZWN0IGRpcmVjdGx5LCBvciB1c2VcclxuICogdGhlIHtAbGluayBzaWduSW5XaXRoUG9wdXB9IGhhbmRsZXI6XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHaXRodWJBdXRoUHJvdmlkZXIoKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XHJcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdyZXBvJyk7XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XHJcbiAqXHJcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxyXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XHJcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGBgYFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBHaXRodWJBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcihcImdpdGh1Yi5jb21cIiAvKiBQcm92aWRlcklkLkdJVEhVQiAqLyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBHaXRodWIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gR2l0aHViIGFjY2VzcyB0b2tlbi5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwoYWNjZXNzVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcclxuICAgICAgICAgICAgcHJvdmlkZXJJZDogR2l0aHViQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxyXG4gICAgICAgICAgICBzaWduSW5NZXRob2Q6IEdpdGh1YkF1dGhQcm92aWRlci5HSVRIVUJfU0lHTl9JTl9NRVRIT0QsXHJcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHVzZXJDcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcclxuICAgICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoeyBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZSB9KSB7XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlIHx8ICEoJ29hdXRoQWNjZXNzVG9rZW4nIGluIHRva2VuUmVzcG9uc2UpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsKHRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uR0lUSFVCLiAqL1xyXG5HaXRodWJBdXRoUHJvdmlkZXIuR0lUSFVCX1NJR05fSU5fTUVUSE9EID0gXCJnaXRodWIuY29tXCIgLyogU2lnbkluTWV0aG9kLkdJVEhVQiAqLztcclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi4gKi9cclxuR2l0aHViQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJnaXRodWIuY29tXCIgLyogUHJvdmlkZXJJZC5HSVRIVUIgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IElEUF9SRVFVRVNUX1VSSSA9ICdodHRwOi8vbG9jYWxob3N0JztcclxuLyoqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFNBTUxBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgIHN1cGVyKHByb3ZpZGVySWQsIHByb3ZpZGVySWQpO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Rva2VuID0gcGVuZGluZ1Rva2VuO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBfbGlua1RvSWRUb2tlbihhdXRoLCBpZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XHJcbiAgICAgICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xyXG4gICAgICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNpZ25Jbk1ldGhvZDogdGhpcy5zaWduSW5NZXRob2QsXHJcbiAgICAgICAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZCxcclxuICAgICAgICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBlbmRpbmdUb2tlblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgdG8gZGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuXHJcbiAgICAgKiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ganNvbiAtIElucHV0IGNhbiBiZSBlaXRoZXIgT2JqZWN0IG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxyXG4gICAgICogV2hlbiBzdHJpbmcgaXMgcHJvdmlkZWQsIEpTT04ucGFyc2Ugd291bGQgYmUgY2FsbGVkIGZpcnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIElmIHRoZSBKU09OIGlucHV0IGRvZXMgbm90IHJlcHJlc2VudCBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcclxuICAgICAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcclxuICAgICAgICBjb25zdCB7IHByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZCwgcGVuZGluZ1Rva2VuIH0gPSBvYmo7XHJcbiAgICAgICAgaWYgKCFwcm92aWRlcklkIHx8XHJcbiAgICAgICAgICAgICFzaWduSW5NZXRob2QgfHxcclxuICAgICAgICAgICAgIXBlbmRpbmdUb2tlbiB8fFxyXG4gICAgICAgICAgICBwcm92aWRlcklkICE9PSBzaWduSW5NZXRob2QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgU0FNTEF1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBzdGF0aWMgbWV0aG9kIHRvIGF2b2lkIGV4cG9zaW5nIHRoZSBjb25zdHJ1Y3RvciB0byBlbmQgdXNlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBfY3JlYXRlKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBuZXcgU0FNTEF1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XHJcbiAgICB9XHJcbiAgICBidWlsZFJlcXVlc3QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogSURQX1JFUVVFU1RfVVJJLFxyXG4gICAgICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcclxuICAgICAgICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBlbmRpbmdUb2tlblxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgU0FNTF9QUk9WSURFUl9QUkVGSVggPSAnc2FtbC4nO1xyXG4vKipcclxuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gZm9yIFNBTUwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFNBTUxBdXRoUHJvdmlkZXIgZXh0ZW5kcyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3Rvci4gVGhlIHByb3ZpZGVySWQgbXVzdCBzdGFydCB3aXRoIFwic2FtbC5cIlxyXG4gICAgICogQHBhcmFtIHByb3ZpZGVySWQgLSBTQU1MIHByb3ZpZGVyIElELlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlcklkKSB7XHJcbiAgICAgICAgX2Fzc2VydChwcm92aWRlcklkLnN0YXJ0c1dpdGgoU0FNTF9QUk9WSURFUl9QUkVGSVgpLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgc3VwZXIocHJvdmlkZXJJZCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGFmdGVyIGFcclxuICAgICAqIHN1Y2Nlc3NmdWwgU0FNTCBmbG93IGNvbXBsZXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlLCB0byBnZXQgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSwgeW91IGNvdWxkIHdyaXRlIHRoZVxyXG4gICAgICogZm9sbG93aW5nIGNvZGU6XHJcbiAgICAgKlxyXG4gICAgICogYGBganNcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHNhbWxQcm92aWRlcik7XHJcbiAgICAgKiBjb25zdCBjcmVkZW50aWFsID0gU0FNTEF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdCh1c2VyQ3JlZGVudGlhbCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gU0FNTEF1dGhQcm92aWRlci5zYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBTQU1MQXV0aFByb3ZpZGVyLnNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIEpTT04gc3RyaW5nIG9yIGEgcGxhaW4gb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGpzb24gLSBBIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsRnJvbUpTT04oanNvbikge1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBTQU1MQXV0aENyZWRlbnRpYWwuZnJvbUpTT04oanNvbik7XHJcbiAgICAgICAgX2Fzc2VydChjcmVkZW50aWFsLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWw7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBwZW5kaW5nVG9rZW4sIHByb3ZpZGVySWQgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFwZW5kaW5nVG9rZW4gfHwgIXByb3ZpZGVySWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTQU1MQXV0aENyZWRlbnRpYWwuX2NyZWF0ZShwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uVFdJVFRFUi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgVHdpdHRlciBBY2Nlc3MgVG9rZW4gYW5kIFNlY3JldC5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogICBjb25zdCBzZWNyZXQgPSBjcmVkZW50aWFsLnNlY3JldDtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcclxuICpcclxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXHJcbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBUd2l0dGVyIEFjY2VzcyBUb2tlbiBhbmQgU2VjcmV0LlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xyXG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIGNvbnN0IHNlY3JldCA9IGNyZWRlbnRpYWwuc2VjcmV0O1xyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgVHdpdHRlckF1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKFwidHdpdHRlci5jb21cIiAvKiBQcm92aWRlcklkLlRXSVRURVIgKi8pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCBmb3IgVHdpdHRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdG9rZW4gLSBUd2l0dGVyIGFjY2VzcyB0b2tlbi5cclxuICAgICAqIEBwYXJhbSBzZWNyZXQgLSBUd2l0dGVyIHNlY3JldC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwodG9rZW4sIHNlY3JldCkge1xyXG4gICAgICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxyXG4gICAgICAgICAgICBzaWduSW5NZXRob2Q6IFR3aXR0ZXJBdXRoUHJvdmlkZXIuVFdJVFRFUl9TSUdOX0lOX01FVEhPRCxcclxuICAgICAgICAgICAgb2F1dGhUb2tlbjogdG9rZW4sXHJcbiAgICAgICAgICAgIG9hdXRoVG9rZW5TZWNyZXQ6IHNlY3JldFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QodXNlckNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xyXG4gICAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoeyBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZSB9KSB7XHJcbiAgICAgICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKCFvYXV0aEFjY2Vzc1Rva2VuIHx8ICFvYXV0aFRva2VuU2VjcmV0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsKG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LlRXSVRURVIuICovXHJcblR3aXR0ZXJBdXRoUHJvdmlkZXIuVFdJVFRFUl9TSUdOX0lOX01FVEhPRCA9IFwidHdpdHRlci5jb21cIiAvKiBTaWduSW5NZXRob2QuVFdJVFRFUiAqLztcclxuLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlRXSVRURVIuICovXHJcblR3aXR0ZXJBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQgPSBcInR3aXR0ZXIuY29tXCIgLyogUHJvdmlkZXJJZC5UV0lUVEVSICovO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduVXAoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25VcFwiIC8qIEVuZHBvaW50LlNJR05fVVAgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgVXNlckNyZWRlbnRpYWxJbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMudXNlciA9IHBhcmFtcy51c2VyO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9IHBhcmFtcy5wcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuUmVzcG9uc2UgPSBwYXJhbXMuX3Rva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gcGFyYW1zLm9wZXJhdGlvblR5cGU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aCwgb3BlcmF0aW9uVHlwZSwgaWRUb2tlblJlc3BvbnNlLCBpc0Fub255bW91cyA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IFVzZXJJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKGF1dGgsIGlkVG9rZW5SZXNwb25zZSwgaXNBbm9ueW1vdXMpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcclxuICAgICAgICBjb25zdCB1c2VyQ3JlZCA9IG5ldyBVc2VyQ3JlZGVudGlhbEltcGwoe1xyXG4gICAgICAgICAgICB1c2VyLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICBfdG9rZW5SZXNwb25zZTogaWRUb2tlblJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHVzZXJDcmVkO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFzeW5jIF9mb3JPcGVyYXRpb24odXNlciwgb3BlcmF0aW9uVHlwZSwgcmVzcG9uc2UpIHtcclxuICAgICAgICBhd2FpdCB1c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShyZXNwb25zZSwgLyogcmVsb2FkICovIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcclxuICAgICAgICAgICAgdXNlcixcclxuICAgICAgICAgICAgcHJvdmlkZXJJZCxcclxuICAgICAgICAgICAgX3Rva2VuUmVzcG9uc2U6IHJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gcHJvdmlkZXJJZEZvclJlc3BvbnNlKHJlc3BvbnNlKSB7XHJcbiAgICBpZiAocmVzcG9uc2UucHJvdmlkZXJJZCkge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS5wcm92aWRlcklkO1xyXG4gICAgfVxyXG4gICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gXCJwaG9uZVwiIC8qIFByb3ZpZGVySWQuUEhPTkUgKi87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gYXMgYW4gYW5vbnltb3VzIHVzZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gYW5vbnltb3VzIHVzZXIgc2lnbmVkIGluLCB0aGF0IHVzZXIgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhXHJcbiAqIG5ldyBhbm9ueW1vdXMgdXNlciBpZGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbkFub255bW91c2x5KGF1dGgpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgaWYgKChfYSA9IGF1dGhJbnRlcm5hbC5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzQW5vbnltb3VzKSB7XHJcbiAgICAgICAgLy8gSWYgYW4gYW5vbnltb3VzIHVzZXIgaXMgYWxyZWFkeSBzaWduZWQgaW4sIG5vIG5lZWQgdG8gc2lnbiB0aGVtIGluIGFnYWluLlxyXG4gICAgICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcclxuICAgICAgICAgICAgdXNlcjogYXV0aEludGVybmFsLmN1cnJlbnRVc2VyLFxyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBudWxsLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiBcInNpZ25JblwiIC8qIE9wZXJhdGlvblR5cGUuU0lHTl9JTiAqL1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduVXAoYXV0aEludGVybmFsLCB7XHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aEludGVybmFsLCBcInNpZ25JblwiIC8qIE9wZXJhdGlvblR5cGUuU0lHTl9JTiAqLywgcmVzcG9uc2UsIHRydWUpO1xyXG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcclxuICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBNdWx0aUZhY3RvckVycm9yIGV4dGVuZHMgRmlyZWJhc2VFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcikge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBzdXBlcihlcnJvci5jb2RlLCBlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb25UeXBlO1xyXG4gICAgICAgIHRoaXMudXNlciA9IHVzZXI7XHJcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcclxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTXVsdGlGYWN0b3JFcnJvci5wcm90b3R5cGUpO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRGF0YSA9IHtcclxuICAgICAgICAgICAgYXBwTmFtZTogYXV0aC5uYW1lLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZDogKF9hID0gYXV0aC50ZW5hbnRJZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBfc2VydmVyUmVzcG9uc2U6IGVycm9yLmN1c3RvbURhdGEuX3NlcnZlclJlc3BvbnNlLFxyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBfZnJvbUVycm9yQW5kT3BlcmF0aW9uKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvckVycm9yKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoYXV0aCwgb3BlcmF0aW9uVHlwZSwgY3JlZGVudGlhbCwgdXNlcikge1xyXG4gICAgY29uc3QgaWRUb2tlblByb3ZpZGVyID0gb3BlcmF0aW9uVHlwZSA9PT0gXCJyZWF1dGhlbnRpY2F0ZVwiIC8qIE9wZXJhdGlvblR5cGUuUkVBVVRIRU5USUNBVEUgKi9cclxuICAgICAgICA/IGNyZWRlbnRpYWwuX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKVxyXG4gICAgICAgIDogY3JlZGVudGlhbC5fZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpO1xyXG4gICAgcmV0dXJuIGlkVG9rZW5Qcm92aWRlci5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7XCJtdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuTUZBX1JFUVVJUkVEICovfWApIHtcclxuICAgICAgICAgICAgdGhyb3cgTXVsdGlGYWN0b3JFcnJvci5fZnJvbUVycm9yQW5kT3BlcmF0aW9uKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9KTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGFrZXMgYSBzZXQgb2YgVXNlckluZm8gcHJvdmlkZXIgZGF0YSBhbmQgY29udmVydHMgaXQgdG8gYSBzZXQgb2YgbmFtZXNcclxuICovXHJcbmZ1bmN0aW9uIHByb3ZpZGVyRGF0YUFzTmFtZXMocHJvdmlkZXJEYXRhKSB7XHJcbiAgICByZXR1cm4gbmV3IFNldChwcm92aWRlckRhdGFcclxuICAgICAgICAubWFwKCh7IHByb3ZpZGVySWQgfSkgPT4gcHJvdmlkZXJJZClcclxuICAgICAgICAuZmlsdGVyKHBpZCA9PiAhIXBpZCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBVbmxpbmtzIGEgcHJvdmlkZXIgZnJvbSBhIHVzZXIgYWNjb3VudC5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBUaGUgcHJvdmlkZXIgdG8gdW5saW5rLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiB1bmxpbmsodXNlciwgcHJvdmlkZXJJZCkge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyh0cnVlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVySWQpO1xyXG4gICAgY29uc3QgeyBwcm92aWRlclVzZXJJbmZvIH0gPSBhd2FpdCBkZWxldGVMaW5rZWRBY2NvdW50cyh1c2VySW50ZXJuYWwuYXV0aCwge1xyXG4gICAgICAgIGlkVG9rZW46IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKCksXHJcbiAgICAgICAgZGVsZXRlUHJvdmlkZXI6IFtwcm92aWRlcklkXVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwcm92aWRlcnNMZWZ0ID0gcHJvdmlkZXJEYXRhQXNOYW1lcyhwcm92aWRlclVzZXJJbmZvIHx8IFtdKTtcclxuICAgIHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEgPSB1c2VySW50ZXJuYWwucHJvdmlkZXJEYXRhLmZpbHRlcihwZCA9PiBwcm92aWRlcnNMZWZ0LmhhcyhwZC5wcm92aWRlcklkKSk7XHJcbiAgICBpZiAoIXByb3ZpZGVyc0xlZnQuaGFzKFwicGhvbmVcIiAvKiBQcm92aWRlcklkLlBIT05FICovKSkge1xyXG4gICAgICAgIHVzZXJJbnRlcm5hbC5waG9uZU51bWJlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcclxuICAgIHJldHVybiB1c2VySW50ZXJuYWw7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2xpbmskMSh1c2VyLCBjcmVkZW50aWFsLCBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh1c2VyLCBjcmVkZW50aWFsLl9saW5rVG9JZFRva2VuKHVzZXIuYXV0aCwgYXdhaXQgdXNlci5nZXRJZFRva2VuKCkpLCBieXBhc3NBdXRoU3RhdGUpO1xyXG4gICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIFwibGlua1wiIC8qIE9wZXJhdGlvblR5cGUuTElOSyAqLywgcmVzcG9uc2UpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9hc3NlcnRMaW5rZWRTdGF0dXMoZXhwZWN0ZWQsIHVzZXIsIHByb3ZpZGVyKSB7XHJcbiAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VyKTtcclxuICAgIGNvbnN0IHByb3ZpZGVySWRzID0gcHJvdmlkZXJEYXRhQXNOYW1lcyh1c2VyLnByb3ZpZGVyRGF0YSk7XHJcbiAgICBjb25zdCBjb2RlID0gZXhwZWN0ZWQgPT09IGZhbHNlXHJcbiAgICAgICAgPyBcInByb3ZpZGVyLWFscmVhZHktbGlua2VkXCIgLyogQXV0aEVycm9yQ29kZS5QUk9WSURFUl9BTFJFQURZX0xJTktFRCAqL1xyXG4gICAgICAgIDogXCJuby1zdWNoLXByb3ZpZGVyXCIgLyogQXV0aEVycm9yQ29kZS5OT19TVUNIX1BST1ZJREVSICovO1xyXG4gICAgX2Fzc2VydChwcm92aWRlcklkcy5oYXMocHJvdmlkZXIpID09PSBleHBlY3RlZCwgdXNlci5hdXRoLCBjb2RlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfcmVhdXRoZW50aWNhdGUodXNlciwgY3JlZGVudGlhbCwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHsgYXV0aCB9ID0gdXNlcjtcclxuICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBcInJlYXV0aGVudGljYXRlXCIgLyogT3BlcmF0aW9uVHlwZS5SRUFVVEhFTlRJQ0FURSAqLztcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh1c2VyLCBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoYXV0aCwgb3BlcmF0aW9uVHlwZSwgY3JlZGVudGlhbCwgdXNlciksIGJ5cGFzc0F1dGhTdGF0ZSk7XHJcbiAgICAgICAgX2Fzc2VydChyZXNwb25zZS5pZFRva2VuLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX3BhcnNlVG9rZW4ocmVzcG9uc2UuaWRUb2tlbik7XHJcbiAgICAgICAgX2Fzc2VydChwYXJzZWQsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBjb25zdCB7IHN1YjogbG9jYWxJZCB9ID0gcGFyc2VkO1xyXG4gICAgICAgIF9hc3NlcnQodXNlci51aWQgPT09IGxvY2FsSWQsIGF1dGgsIFwidXNlci1taXNtYXRjaFwiIC8qIEF1dGhFcnJvckNvZGUuVVNFUl9NSVNNQVRDSCAqLyk7XHJcbiAgICAgICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIG9wZXJhdGlvblR5cGUsIHJlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gQ29udmVydCB1c2VyIGRlbGV0ZWQgZXJyb3IgaW50byB1c2VyIG1pc21hdGNoXHJcbiAgICAgICAgaWYgKChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuY29kZSkgPT09IGBhdXRoLyR7XCJ1c2VyLW5vdC1mb3VuZFwiIC8qIEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVEICovfWApIHtcclxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgXCJ1c2VyLW1pc21hdGNoXCIgLyogQXV0aEVycm9yQ29kZS5VU0VSX01JU01BVENIICovKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBfc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgY3JlZGVudGlhbCwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBcInNpZ25JblwiIC8qIE9wZXJhdGlvblR5cGUuU0lHTl9JTiAqLztcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5KGF1dGgsIG9wZXJhdGlvblR5cGUsIGNyZWRlbnRpYWwpO1xyXG4gICAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aCwgb3BlcmF0aW9uVHlwZSwgcmVzcG9uc2UpO1xyXG4gICAgaWYgKCFieXBhc3NBdXRoU3RhdGUpIHtcclxuICAgICAgICBhd2FpdCBhdXRoLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgY3JlZGVudGlhbCkge1xyXG4gICAgcmV0dXJuIF9zaWduSW5XaXRoQ3JlZGVudGlhbChfY2FzdEF1dGgoYXV0aCksIGNyZWRlbnRpYWwpO1xyXG59XHJcbi8qKlxyXG4gKiBMaW5rcyB0aGUgdXNlciBhY2NvdW50IHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBBbiB7QGxpbmsgQXV0aFByb3ZpZGVyfSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY3JlZGVudGlhbC5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXV0aCBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aENyZWRlbnRpYWwodXNlciwgY3JlZGVudGlhbCkge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBjcmVkZW50aWFsLnByb3ZpZGVySWQpO1xyXG4gICAgcmV0dXJuIF9saW5rJDEodXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcclxufVxyXG4vKipcclxuICogUmUtYXV0aGVudGljYXRlcyBhIHVzZXIgdXNpbmcgYSBmcmVzaCBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBVc2UgYmVmb3JlIG9wZXJhdGlvbnMgc3VjaCBhcyB7QGxpbmsgdXBkYXRlUGFzc3dvcmR9IHRoYXQgcmVxdWlyZSB0b2tlbnMgZnJvbSByZWNlbnQgc2lnbi1pblxyXG4gKiBhdHRlbXB0cy4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVjb3ZlciBmcm9tIGEgYENSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTmAgZXJyb3JcclxuICogb3IgYSBgVE9LRU5fRVhQSVJFRGAgZXJyb3IuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCh1c2VyLCBjcmVkZW50aWFsKSB7XHJcbiAgICByZXR1cm4gX3JlYXV0aGVudGljYXRlKGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSwgY3JlZGVudGlhbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEN1c3RvbVRva2VuJDEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YxL2FjY291bnRzOnNpZ25JbldpdGhDdXN0b21Ub2tlblwiIC8qIEVuZHBvaW50LlNJR05fSU5fV0lUSF9DVVNUT01fVE9LRU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGEgY3VzdG9tIHRva2VuLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBDdXN0b20gdG9rZW5zIGFyZSB1c2VkIHRvIGludGVncmF0ZSBGaXJlYmFzZSBBdXRoIHdpdGggZXhpc3RpbmcgYXV0aCBzeXN0ZW1zLCBhbmQgbXVzdFxyXG4gKiBiZSBnZW5lcmF0ZWQgYnkgYW4gYXV0aCBiYWNrZW5kIHVzaW5nIHRoZVxyXG4gKiB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvcmVmZXJlbmNlL2FkbWluL25vZGUvYWRtaW4uYXV0aC5BdXRoI2NyZWF0ZWN1c3RvbXRva2VuIHwgY3JlYXRlQ3VzdG9tVG9rZW59XHJcbiAqIG1ldGhvZCBpbiB0aGUge0BsaW5rIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2F1dGgvYWRtaW4gfCBBZG1pbiBTREt9IC5cclxuICpcclxuICogRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdG9rZW4gaXMgaW52YWxpZCwgZXhwaXJlZCwgb3Igbm90IGFjY2VwdGVkIGJ5IHRoZSBGaXJlYmFzZSBBdXRoIHNlcnZpY2UuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGN1c3RvbVRva2VuIC0gVGhlIGN1c3RvbSB0b2tlbiB0byBzaWduIGluIHdpdGguXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDdXN0b21Ub2tlbihhdXRoLCBjdXN0b21Ub2tlbikge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduSW5XaXRoQ3VzdG9tVG9rZW4kMShhdXRoSW50ZXJuYWwsIHtcclxuICAgICAgICB0b2tlbjogY3VzdG9tVG9rZW4sXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH0pO1xyXG4gICAgY29uc3QgY3JlZCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoSW50ZXJuYWwsIFwic2lnbkluXCIgLyogT3BlcmF0aW9uVHlwZS5TSUdOX0lOICovLCByZXNwb25zZSk7XHJcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKGNyZWQudXNlcik7XHJcbiAgICByZXR1cm4gY3JlZDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jbGFzcyBNdWx0aUZhY3RvckluZm9JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGZhY3RvcklkLCByZXNwb25zZSkge1xyXG4gICAgICAgIHRoaXMuZmFjdG9ySWQgPSBmYWN0b3JJZDtcclxuICAgICAgICB0aGlzLnVpZCA9IHJlc3BvbnNlLm1mYUVucm9sbG1lbnRJZDtcclxuICAgICAgICB0aGlzLmVucm9sbG1lbnRUaW1lID0gbmV3IERhdGUocmVzcG9uc2UuZW5yb2xsZWRBdCkudG9VVENTdHJpbmcoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWU7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KSB7XHJcbiAgICAgICAgaWYgKCdwaG9uZUluZm8nIGluIGVucm9sbG1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgndG90cEluZm8nIGluIGVucm9sbG1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFRvdHBNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UoYXV0aCwgZW5yb2xsbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsIGV4dGVuZHMgTXVsdGlGYWN0b3JJbmZvSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xyXG4gICAgICAgIHN1cGVyKFwicGhvbmVcIiAvKiBGYWN0b3JJZC5QSE9ORSAqLywgcmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZUluZm87XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShfYXV0aCwgZW5yb2xsbWVudCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsKGVucm9sbG1lbnQpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFRvdHBNdWx0aUZhY3RvckluZm9JbXBsIGV4dGVuZHMgTXVsdGlGYWN0b3JJbmZvSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xyXG4gICAgICAgIHN1cGVyKFwidG90cFwiIC8qIEZhY3RvcklkLlRPVFAgKi8sIHJlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBfZnJvbVNlcnZlclJlc3BvbnNlKF9hdXRoLCBlbnJvbGxtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUb3RwTXVsdGlGYWN0b3JJbmZvSW1wbChlbnJvbGxtZW50KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KGF1dGgsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgX2Fzc2VydCgoKF9hID0gYWN0aW9uQ29kZVNldHRpbmdzLnVybCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwLCBhdXRoLCBcImludmFsaWQtY29udGludWUtdXJpXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPTlRJTlVFX1VSSSAqLyk7XHJcbiAgICBfYXNzZXJ0KHR5cGVvZiBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW4gPT09ICd1bmRlZmluZWQnIHx8XHJcbiAgICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluLmxlbmd0aCA+IDAsIGF1dGgsIFwiaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU4gKi8pO1xyXG4gICAgcmVxdWVzdC5jb250aW51ZVVybCA9IGFjdGlvbkNvZGVTZXR0aW5ncy51cmw7XHJcbiAgICByZXF1ZXN0LmR5bmFtaWNMaW5rRG9tYWluID0gYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluO1xyXG4gICAgcmVxdWVzdC5jYW5IYW5kbGVDb2RlSW5BcHAgPSBhY3Rpb25Db2RlU2V0dGluZ3MuaGFuZGxlQ29kZUluQXBwO1xyXG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MpIHtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MuYnVuZGxlSWQubGVuZ3RoID4gMCwgYXV0aCwgXCJtaXNzaW5nLWlvcy1idW5kbGUtaWRcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfSU9TX0JVTkRMRV9JRCAqLyk7XHJcbiAgICAgICAgcmVxdWVzdC5pT1NCdW5kbGVJZCA9IGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MuYnVuZGxlSWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQpIHtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLnBhY2thZ2VOYW1lLmxlbmd0aCA+IDAsIGF1dGgsIFwibWlzc2luZy1hbmRyb2lkLXBrZy1uYW1lXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FICovKTtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRJbnN0YWxsQXBwID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQuaW5zdGFsbEFwcDtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRNaW5pbXVtVmVyc2lvbkNvZGUgPVxyXG4gICAgICAgICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5taW5pbXVtVmVyc2lvbjtcclxuICAgICAgICByZXF1ZXN0LmFuZHJvaWRQYWNrYWdlTmFtZSA9IGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIHRvIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUbyBjb21wbGV0ZSB0aGUgcGFzc3dvcmQgcmVzZXQsIGNhbGwge0BsaW5rIGNvbmZpcm1QYXNzd29yZFJlc2V0fSB3aXRoIHRoZSBjb2RlIHN1cHBsaWVkIGluXHJcbiAqIHRoZSBlbWFpbCBzZW50IHRvIHRoZSB1c2VyLCBhbG9uZyB3aXRoIHRoZSBuZXcgcGFzc3dvcmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdXNlci5cclxuICogYXdhaXQgY29uZmlybVBhc3N3b3JkUmVzZXQoJ3VzZXJAZXhhbXBsZS5jb20nLCBjb2RlKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGF1dGgsIGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiUEFTU1dPUkRfUkVTRVRcIiAvKiBBY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VUICovLFxyXG4gICAgICAgIGVtYWlsLFxyXG4gICAgICAgIGNsaWVudFR5cGU6IFwiQ0xJRU5UX1RZUEVfV0VCXCIgLyogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIgKi9cclxuICAgIH07XHJcbiAgICBpZiAoKF9hID0gYXV0aEludGVybmFsLl9nZXRSZWNhcHRjaGFDb25maWcoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVtYWlsUGFzc3dvcmRFbmFibGVkKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdFdpdGhSZWNhcHRjaGEgPSBhd2FpdCBpbmplY3RSZWNhcHRjaGFGaWVsZHMoYXV0aEludGVybmFsLCByZXF1ZXN0LCBcImdldE9vYkNvZGVcIiAvKiBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERSAqLywgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgICAgICAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KGF1dGhJbnRlcm5hbCwgcmVxdWVzdFdpdGhSZWNhcHRjaGEsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHNlbmRQYXNzd29yZFJlc2V0RW1haWwkMShhdXRoSW50ZXJuYWwsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoSW50ZXJuYWwsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHNlbmRQYXNzd29yZFJlc2V0RW1haWwkMShhdXRoSW50ZXJuYWwsIHJlcXVlc3QpXHJcbiAgICAgICAgICAgIC5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7XCJtaXNzaW5nLXJlY2FwdGNoYS10b2tlblwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU4gKi99YCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1Bhc3N3b3JkIHJlc2V0cyBhcmUgcHJvdGVjdGVkIGJ5IHJlQ0FQVENIQSBmb3IgdGhpcyBwcm9qZWN0LiBBdXRvbWF0aWNhbGx5IHRyaWdnZXJpbmcgdGhlIHJlQ0FQVENIQSBmbG93IGFuZCByZXN0YXJ0aW5nIHRoZSBwYXNzd29yZCByZXNldCBmbG93LicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFdpdGhSZWNhcHRjaGEgPSBhd2FpdCBpbmplY3RSZWNhcHRjaGFGaWVsZHMoYXV0aEludGVybmFsLCByZXF1ZXN0LCBcImdldE9vYkNvZGVcIiAvKiBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERSAqLywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoSW50ZXJuYWwsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCQxKGF1dGhJbnRlcm5hbCwgcmVxdWVzdFdpdGhSZWNhcHRjaGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb21wbGV0ZXMgdGhlIHBhc3N3b3JkIHJlc2V0IHByb2Nlc3MsIGdpdmVuIGEgY29uZmlybWF0aW9uIGNvZGUgYW5kIG5ldyBwYXNzd29yZC5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgY29uZmlybWF0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cclxuICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY29uZmlybVBhc3N3b3JkUmVzZXQoYXV0aCwgb29iQ29kZSwgbmV3UGFzc3dvcmQpIHtcclxuICAgIGF3YWl0IHJlc2V0UGFzc3dvcmQoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCB7XHJcbiAgICAgICAgb29iQ29kZSxcclxuICAgICAgICBuZXdQYXNzd29yZFxyXG4gICAgfSk7XHJcbiAgICAvLyBEbyBub3QgcmV0dXJuIHRoZSBlbWFpbC5cclxufVxyXG4vKipcclxuICogQXBwbGllcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBhcHBseUFjdGlvbkNvZGUoYXV0aCwgb29iQ29kZSkge1xyXG4gICAgYXdhaXQgYXBwbHlBY3Rpb25Db2RlJDEoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCB7IG9vYkNvZGUgfSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgY29kZS5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBY3Rpb25Db2RlKGF1dGgsIG9vYkNvZGUpIHtcclxuICAgIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXNldFBhc3N3b3JkKGF1dGhNb2R1bGFyLCB7IG9vYkNvZGUgfSk7XHJcbiAgICAvLyBFbWFpbCBjb3VsZCBiZSBlbXB0eSBvbmx5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXMgRU1BSUxfU0lHTklOIG9yXHJcbiAgICAvLyBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTC5cclxuICAgIC8vIE5ldyBlbWFpbCBzaG91bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcclxuICAgIC8vIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLlxyXG4gICAgLy8gTXVsdGktZmFjdG9yIGluZm8gY291bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcclxuICAgIC8vIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OLlxyXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gcmVzcG9uc2UucmVxdWVzdFR5cGU7XHJcbiAgICBfYXNzZXJ0KG9wZXJhdGlvbiwgYXV0aE1vZHVsYXIsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBcIkVNQUlMX1NJR05JTlwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOICovOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMICovOlxyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLm5ld0VtYWlsLCBhdXRoTW9kdWxhciwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT05cIiAvKiBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OICovOlxyXG4gICAgICAgICAgICBfYXNzZXJ0KHJlc3BvbnNlLm1mYUluZm8sIGF1dGhNb2R1bGFyLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgX2Fzc2VydChyZXNwb25zZS5lbWFpbCwgYXV0aE1vZHVsYXIsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIH1cclxuICAgIC8vIFRoZSBtdWx0aS1mYWN0b3IgaW5mbyBmb3IgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb25cclxuICAgIGxldCBtdWx0aUZhY3RvckluZm8gPSBudWxsO1xyXG4gICAgaWYgKHJlc3BvbnNlLm1mYUluZm8pIHtcclxuICAgICAgICBtdWx0aUZhY3RvckluZm8gPSBNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UoX2Nhc3RBdXRoKGF1dGhNb2R1bGFyKSwgcmVzcG9uc2UubWZhSW5mbyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgZW1haWw6IChyZXNwb25zZS5yZXF1ZXN0VHlwZSA9PT0gXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi9cclxuICAgICAgICAgICAgICAgID8gcmVzcG9uc2UubmV3RW1haWxcclxuICAgICAgICAgICAgICAgIDogcmVzcG9uc2UuZW1haWwpIHx8IG51bGwsXHJcbiAgICAgICAgICAgIHByZXZpb3VzRW1haWw6IChyZXNwb25zZS5yZXF1ZXN0VHlwZSA9PT0gXCJWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwgKi9cclxuICAgICAgICAgICAgICAgID8gcmVzcG9uc2UuZW1haWxcclxuICAgICAgICAgICAgICAgIDogcmVzcG9uc2UubmV3RW1haWwpIHx8IG51bGwsXHJcbiAgICAgICAgICAgIG11bHRpRmFjdG9ySW5mb1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb3BlcmF0aW9uXHJcbiAgICB9O1xyXG59XHJcbi8qKlxyXG4gKiBDaGVja3MgYSBwYXNzd29yZCByZXNldCBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MgaWYgdmFsaWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGNvZGUgLSBBIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlKGF1dGgsIGNvZGUpIHtcclxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY2hlY2tBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgY29kZSk7XHJcbiAgICAvLyBFbWFpbCBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQgc2luY2UgYSBjb2RlIHdhcyBzZW50IHRvIGl0XHJcbiAgICByZXR1cm4gZGF0YS5lbWFpbDtcclxufVxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzcyBhbmQgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIE9uIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIHVzZXIgYWNjb3VudCwgdGhpcyB1c2VyIHdpbGwgYWxzbyBiZSBzaWduZWQgaW4gdG8geW91ciBhcHBsaWNhdGlvbi5cclxuICpcclxuICogVXNlciBhY2NvdW50IGNyZWF0aW9uIGNhbiBmYWlsIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgZXhpc3RzIG9yIHRoZSBwYXNzd29yZCBpcyBpbnZhbGlkLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgZW1haWwgYWRkcmVzcyBhY3RzIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGFuZCBlbmFibGVzIGFuIGVtYWlsLWJhc2VkXHJcbiAqIHBhc3N3b3JkIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIgYWNjb3VudCBhbmQgc2V0IHRoZSBpbml0aWFsIHVzZXIgcGFzc3dvcmQuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcidzIGNob3NlbiBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcclxuICAgICAgICBlbWFpbCxcclxuICAgICAgICBwYXNzd29yZCxcclxuICAgICAgICBjbGllbnRUeXBlOiBcIkNMSUVOVF9UWVBFX1dFQlwiIC8qIFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCICovXHJcbiAgICB9O1xyXG4gICAgbGV0IHNpZ25VcFJlc3BvbnNlO1xyXG4gICAgaWYgKChfYSA9IGF1dGhJbnRlcm5hbC5fZ2V0UmVjYXB0Y2hhQ29uZmlnKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbWFpbFBhc3N3b3JkRW5hYmxlZCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKGF1dGhJbnRlcm5hbCwgcmVxdWVzdCwgXCJzaWduVXBQYXNzd29yZFwiIC8qIFJlY2FwdGNoYUFjdGlvbk5hbWUuU0lHTl9VUF9QQVNTV09SRCAqLyk7XHJcbiAgICAgICAgc2lnblVwUmVzcG9uc2UgPSBzaWduVXAoYXV0aEludGVybmFsLCByZXF1ZXN0V2l0aFJlY2FwdGNoYSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBzaWduVXBSZXNwb25zZSA9IHNpZ25VcChhdXRoSW50ZXJuYWwsIHJlcXVlc3QpLmNhdGNoKGFzeW5jIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtcIm1pc3NpbmctcmVjYXB0Y2hhLXRva2VuXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiAqL31gKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2lnbi11cCBpcyBwcm90ZWN0ZWQgYnkgcmVDQVBUQ0hBIGZvciB0aGlzIHByb2plY3QuIEF1dG9tYXRpY2FsbHkgdHJpZ2dlcmluZyB0aGUgcmVDQVBUQ0hBIGZsb3cgYW5kIHJlc3RhcnRpbmcgdGhlIHNpZ24tdXAgZmxvdy4nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKGF1dGhJbnRlcm5hbCwgcmVxdWVzdCwgXCJzaWduVXBQYXNzd29yZFwiIC8qIFJlY2FwdGNoYUFjdGlvbk5hbWUuU0lHTl9VUF9QQVNTV09SRCAqLyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lnblVwKGF1dGhJbnRlcm5hbCwgcmVxdWVzdFdpdGhSZWNhcHRjaGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduVXBSZXNwb25zZS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoYXV0aEludGVybmFsLCBcInNpZ25JblwiIC8qIE9wZXJhdGlvblR5cGUuU0lHTl9JTiAqLywgcmVzcG9uc2UpO1xyXG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcclxuICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYW4gZW1haWwgYW5kIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGFuZCBwYXNzd29yZCBkbyBub3QgbWF0Y2guXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSB1c2VyJ3MgcGFzc3dvcmQgaXMgTk9UIHRoZSBwYXNzd29yZCB1c2VkIHRvIGFjY2VzcyB0aGUgdXNlcidzIGVtYWlsIGFjY291bnQuIFRoZVxyXG4gKiBlbWFpbCBhZGRyZXNzIHNlcnZlcyBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciwgYW5kIHRoZSBwYXNzd29yZCBpcyB1c2VkIHRvIGFjY2Vzc1xyXG4gKiB0aGUgdXNlcidzIGFjY291bnQgaW4geW91ciBGaXJlYmFzZSBwcm9qZWN0LiBTZWUgYWxzbzoge0BsaW5rIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZH0uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MuXHJcbiAqIEBwYXJhbSBwYXNzd29yZCAtIFRoZSB1c2VycyBwYXNzd29yZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICByZXR1cm4gc2lnbkluV2l0aENyZWRlbnRpYWwoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBTZW5kcyBhIHNpZ24taW4gZW1haWwgbGluayB0byB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoZSBzaWduLWluIG9wZXJhdGlvbiBoYXMgdG8gYWx3YXlzIGJlIGNvbXBsZXRlZCBpbiB0aGUgYXBwIHVubGlrZSBvdGhlciBvdXQgb2YgYmFuZCBlbWFpbFxyXG4gKiBhY3Rpb25zIChwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9ucykuIFRoaXMgaXMgYmVjYXVzZSwgYXQgdGhlIGVuZCBvZiB0aGUgZmxvdyxcclxuICogdGhlIHVzZXIgaXMgZXhwZWN0ZWQgdG8gYmUgc2lnbmVkIGluIGFuZCB0aGVpciBBdXRoIHN0YXRlIHBlcnNpc3RlZCB3aXRoaW4gdGhlIGFwcC5cclxuICpcclxuICogVG8gY29tcGxldGUgc2lnbiBpbiB3aXRoIHRoZSBlbWFpbCBsaW5rLCBjYWxsIHtAbGluayBzaWduSW5XaXRoRW1haWxMaW5rfSB3aXRoIHRoZSBlbWFpbFxyXG4gKiBhZGRyZXNzIGFuZCB0aGUgZW1haWwgbGluayBzdXBwbGllZCBpbiB0aGUgZW1haWwgc2VudCB0byB0aGUgdXNlci5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBhY3Rpb25Db2RlU2V0dGluZ3MgPSB7XHJcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxyXG4gKiAgIGlPUzoge1xyXG4gKiAgICAgIGJ1bmRsZUlkOiAnY29tLmV4YW1wbGUuaW9zJ1xyXG4gKiAgIH0sXHJcbiAqICAgYW5kcm9pZDoge1xyXG4gKiAgICAgcGFja2FnZU5hbWU6ICdjb20uZXhhbXBsZS5hbmRyb2lkJyxcclxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXHJcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xyXG4gKiAgIH0sXHJcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXHJcbiAqIH07XHJcbiAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB0aGUgdXNlci5cclxuICogaWYoaXNTaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsTGluaykpIHtcclxuICogICBhd2FpdCBzaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgZW1haWxMaW5rKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGhJbnRlcm5hbCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbCAtIFRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsIGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiRU1BSUxfU0lHTklOXCIgLyogQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU4gKi8sXHJcbiAgICAgICAgZW1haWwsXHJcbiAgICAgICAgY2xpZW50VHlwZTogXCJDTElFTlRfVFlQRV9XRUJcIiAvKiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQiAqL1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHNldEFjdGlvbkNvZGVTZXR0aW5ncyhyZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICBfYXNzZXJ0KGFjdGlvbkNvZGVTZXR0aW5ncy5oYW5kbGVDb2RlSW5BcHAsIGF1dGhJbnRlcm5hbCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChhdXRoSW50ZXJuYWwsIHJlcXVlc3QsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKChfYSA9IGF1dGhJbnRlcm5hbC5fZ2V0UmVjYXB0Y2hhQ29uZmlnKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbWFpbFBhc3N3b3JkRW5hYmxlZCkge1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKGF1dGhJbnRlcm5hbCwgcmVxdWVzdCwgXCJnZXRPb2JDb2RlXCIgLyogUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREUgKi8sIHRydWUpO1xyXG4gICAgICAgIHNldEFjdGlvbkNvZGVTZXR0aW5ncyhyZXF1ZXN0V2l0aFJlY2FwdGNoYSwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICAgICAgICBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwkMShhdXRoSW50ZXJuYWwsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHNldEFjdGlvbkNvZGVTZXR0aW5ncyhyZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgICAgIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbCQxKGF1dGhJbnRlcm5hbCwgcmVxdWVzdClcclxuICAgICAgICAgICAgLmNhdGNoKGFzeW5jIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtcIm1pc3NpbmctcmVjYXB0Y2hhLXRva2VuXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiAqL31gKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRW1haWwgbGluayBzaWduLWluIGlzIHByb3RlY3RlZCBieSByZUNBUFRDSEEgZm9yIHRoaXMgcHJvamVjdC4gQXV0b21hdGljYWxseSB0cmlnZ2VyaW5nIHRoZSByZUNBUFRDSEEgZmxvdyBhbmQgcmVzdGFydGluZyB0aGUgc2lnbi1pbiBmbG93LicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFdpdGhSZWNhcHRjaGEgPSBhd2FpdCBpbmplY3RSZWNhcHRjaGFGaWVsZHMoYXV0aEludGVybmFsLCByZXF1ZXN0LCBcImdldE9vYkNvZGVcIiAvKiBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERSAqLywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRBY3Rpb25Db2RlU2V0dGluZ3MocmVxdWVzdFdpdGhSZWNhcHRjaGEsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwkMShhdXRoSW50ZXJuYWwsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQ2hlY2tzIGlmIGFuIGluY29taW5nIGxpbmsgaXMgYSBzaWduLWluIHdpdGggZW1haWwgbGluayBzdWl0YWJsZSBmb3Ige0BsaW5rIHNpZ25JbldpdGhFbWFpbExpbmt9LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBlbWFpbExpbmsgLSBUaGUgbGluayBzZW50IHRvIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gaXNTaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsTGluaykge1xyXG4gICAgY29uc3QgYWN0aW9uQ29kZVVybCA9IEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGVtYWlsTGluayk7XHJcbiAgICByZXR1cm4gKGFjdGlvbkNvZGVVcmwgPT09IG51bGwgfHwgYWN0aW9uQ29kZVVybCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWN0aW9uQ29kZVVybC5vcGVyYXRpb24pID09PSBcIkVNQUlMX1NJR05JTlwiIC8qIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOICovO1xyXG59XHJcbi8qKlxyXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB1c2luZyBhbiBlbWFpbCBhbmQgc2lnbi1pbiBlbWFpbCBsaW5rLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiBubyBsaW5rIGlzIHBhc3NlZCwgdGhlIGxpbmsgaXMgaW5mZXJyZWQgZnJvbSB0aGUgY3VycmVudCBVUkwuXHJcbiAqXHJcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZCBvciBPVFAgaW4gZW1haWwgbGluayBleHBpcmVzLlxyXG4gKlxyXG4gKiBOb3RlOiBDb25maXJtIHRoZSBsaW5rIGlzIGEgc2lnbi1pbiBlbWFpbCBsaW5rIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZpcmViYXNlLmF1dGguQXV0aC5pc1NpZ25JbldpdGhFbWFpbExpbmsuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xyXG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcclxuICogICBpT1M6IHtcclxuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcclxuICogICB9LFxyXG4gKiAgIGFuZHJvaWQ6IHtcclxuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXHJcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxyXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcclxuICogICB9LFxyXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxyXG4gKiB9O1xyXG4gKiBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdGhlIHVzZXIuXHJcbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XHJcbiAqICAgYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGVtYWlsTGluayk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxyXG4gKiBAcGFyYW0gZW1haWxMaW5rIC0gVGhlIGxpbmsgc2VudCB0byB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCBjcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKGVtYWlsLCBlbWFpbExpbmsgfHwgX2dldEN1cnJlbnRVcmwoKSk7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgdGVuYW50IElEIGluIHRoZSBlbWFpbCBsaW5rIG1hdGNoZXMgdGhlIHRlbmFudCBJRCBvbiBBdXRoXHJcbiAgICAvLyBpbnN0YW5jZS5cclxuICAgIF9hc3NlcnQoY3JlZGVudGlhbC5fdGVuYW50SWQgPT09IChhdXRoTW9kdWxhci50ZW5hbnRJZCB8fCBudWxsKSwgYXV0aE1vZHVsYXIsIFwidGVuYW50LWlkLW1pc21hdGNoXCIgLyogQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0ggKi8pO1xyXG4gICAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGhNb2R1bGFyLCBjcmVkZW50aWFsKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoVXJpKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92MS9hY2NvdW50czpjcmVhdGVBdXRoVXJpXCIgLyogRW5kcG9pbnQuQ1JFQVRFX0FVVEhfVVJJICovLCBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdCkpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHNpZ24gaW4gbWV0aG9kcyBmb3IgdGhlIGdpdmVuIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGRpZmZlcmVudGlhdGUgbWV0aG9kcyBvZiBzaWduLWluIGZvciB0aGUgc2FtZSBwcm92aWRlciwgZWcuXHJcbiAqIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2hpY2ggaGFzIDIgbWV0aG9kcyBvZiBzaWduLWluLFxyXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCBhbmRcclxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsKGF1dGgsIGVtYWlsKSB7XHJcbiAgICAvLyBjcmVhdGVBdXRoVXJpIHJldHVybnMgYW4gZXJyb3IgaWYgY29udGludWUgVVJJIGlzIG5vdCBodHRwIG9yIGh0dHBzLlxyXG4gICAgLy8gRm9yIGVudmlyb25tZW50cyBsaWtlIENvcmRvdmEsIENocm9tZSBleHRlbnNpb25zLCBuYXRpdmUgZnJhbWV3b3JrcywgZmlsZVxyXG4gICAgLy8gc3lzdGVtcywgZXRjLCB1c2UgaHR0cDovL2xvY2FsaG9zdCBhcyBjb250aW51ZSBVUkwuXHJcbiAgICBjb25zdCBjb250aW51ZVVyaSA9IF9pc0h0dHBPckh0dHBzKCkgPyBfZ2V0Q3VycmVudFVybCgpIDogJ2h0dHA6Ly9sb2NhbGhvc3QnO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICBpZGVudGlmaWVyOiBlbWFpbCxcclxuICAgICAgICBjb250aW51ZVVyaVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHsgc2lnbmluTWV0aG9kcyB9ID0gYXdhaXQgY3JlYXRlQXV0aFVyaShnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCksIHJlcXVlc3QpO1xyXG4gICAgcmV0dXJuIHNpZ25pbk1ldGhvZHMgfHwgW107XHJcbn1cclxuLyoqXHJcbiAqIFNlbmRzIGEgdmVyaWZpY2F0aW9uIGVtYWlsIHRvIGEgdXNlci5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nIHtAbGluayBhcHBseUFjdGlvbkNvZGV9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uKHVzZXIsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdGhlIHVzZXIuXHJcbiAqIGF3YWl0IGFwcGx5QWN0aW9uQ29kZShhdXRoLCBjb2RlKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbFZlcmlmaWNhdGlvbih1c2VyLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiVkVSSUZZX0VNQUlMXCIgLyogQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfRU1BSUwgKi8sXHJcbiAgICAgICAgaWRUb2tlblxyXG4gICAgfTtcclxuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uJDEodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xyXG4gICAgaWYgKGVtYWlsICE9PSB1c2VyLmVtYWlsKSB7XHJcbiAgICAgICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSBuZXcgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhlIHVzZXIncyBlbWFpbCB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIG5ldyBvbmUgYWZ0ZXIgYmVpbmcgdmVyaWZpZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIGEgY3VzdG9tIGVtYWlsIGFjdGlvbiBoYW5kbGVyLCB5b3UgY2FuIGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjYWxsaW5nXHJcbiAqIHtAbGluayBhcHBseUFjdGlvbkNvZGV9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcclxuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXHJcbiAqICAgaU9TOiB7XHJcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXHJcbiAqICAgfSxcclxuICogICBhbmRyb2lkOiB7XHJcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxyXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcclxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXHJcbiAqICAgfSxcclxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcclxuICogfTtcclxuICogYXdhaXQgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodXNlciwgJ25ld2VtYWlsQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSB1cGRhdGUuXHJcbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsKHVzZXIsIG5ld0VtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgICAgcmVxdWVzdFR5cGU6IFwiVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcIiAvKiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMICovLFxyXG4gICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgbmV3RW1haWxcclxuICAgIH07XHJcbiAgICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdCh1c2VySW50ZXJuYWwuYXV0aCwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZW1haWwgfSA9IGF3YWl0IHZlcmlmeUFuZENoYW5nZUVtYWlsKHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0KTtcclxuICAgIGlmIChlbWFpbCAhPT0gdXNlci5lbWFpbCkge1xyXG4gICAgICAgIC8vIElmIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBlbWFpbCBvbiB1c2VyIGlzIG91dGRhdGVkLCByZWxvYWQgdGhlXHJcbiAgICAgICAgLy8gdXNlci5cclxuICAgICAgICBhd2FpdCB1c2VyLnJlbG9hZCgpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGUkMShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjEvYWNjb3VudHM6dXBkYXRlXCIgLyogRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTyAqLywgcmVxdWVzdCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFVwZGF0ZXMgYSB1c2VyJ3MgcHJvZmlsZSBkYXRhLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvZmlsZSAtIFRoZSBwcm9maWxlJ3MgYGRpc3BsYXlOYW1lYCBhbmQgYHBob3RvVVJMYCB0byB1cGRhdGUuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGUodXNlciwgeyBkaXNwbGF5TmFtZSwgcGhvdG9VUkw6IHBob3RvVXJsIH0pIHtcclxuICAgIGlmIChkaXNwbGF5TmFtZSA9PT0gdW5kZWZpbmVkICYmIHBob3RvVXJsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oKTtcclxuICAgIGNvbnN0IHByb2ZpbGVSZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgZGlzcGxheU5hbWUsXHJcbiAgICAgICAgcGhvdG9VcmwsXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH07XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXJJbnRlcm5hbCwgdXBkYXRlUHJvZmlsZSQxKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm9maWxlUmVxdWVzdCkpO1xyXG4gICAgdXNlckludGVybmFsLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWUgfHwgbnVsbDtcclxuICAgIHVzZXJJbnRlcm5hbC5waG90b1VSTCA9IHJlc3BvbnNlLnBob3RvVXJsIHx8IG51bGw7XHJcbiAgICAvLyBVcGRhdGUgdGhlIHBhc3N3b3JkIHByb3ZpZGVyIGFzIHdlbGxcclxuICAgIGNvbnN0IHBhc3N3b3JkUHJvdmlkZXIgPSB1c2VySW50ZXJuYWwucHJvdmlkZXJEYXRhLmZpbmQoKHsgcHJvdmlkZXJJZCB9KSA9PiBwcm92aWRlcklkID09PSBcInBhc3N3b3JkXCIgLyogUHJvdmlkZXJJZC5QQVNTV09SRCAqLyk7XHJcbiAgICBpZiAocGFzc3dvcmRQcm92aWRlcikge1xyXG4gICAgICAgIHBhc3N3b3JkUHJvdmlkZXIuZGlzcGxheU5hbWUgPSB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWU7XHJcbiAgICAgICAgcGFzc3dvcmRQcm92aWRlci5waG90b1VSTCA9IHVzZXJJbnRlcm5hbC5waG90b1VSTDtcclxuICAgIH1cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UpO1xyXG59XHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogQW4gZW1haWwgd2lsbCBiZSBzZW50IHRvIHRoZSBvcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChpZiBpdCB3YXMgc2V0KSB0aGF0IGFsbG93cyB0byByZXZva2UgdGhlXHJcbiAqIGVtYWlsIGFkZHJlc3MgY2hhbmdlLCBpbiBvcmRlciB0byBwcm90ZWN0IHRoZW0gZnJvbSBhY2NvdW50IGhpamFja2luZy5cclxuICpcclxuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXHJcbiAqIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXHJcbiAqIHtAbGluayByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsfS5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVFbWFpbCh1c2VyLCBuZXdFbWFpbCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG5ld0VtYWlsLCBudWxsKTtcclxufVxyXG4vKipcclxuICogVXBkYXRlcyB0aGUgdXNlcidzIHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseSBzaWduZWRcclxuICogaW4uIElmIHRoaXMgcmVxdWlyZW1lbnQgaXNuJ3QgbWV0LCBhc2sgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIGFnYWluIGFuZCB0aGVuIGNhbGxcclxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVQYXNzd29yZCh1c2VyLCBuZXdQYXNzd29yZCkge1xyXG4gICAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIG51bGwsIG5ld1Bhc3N3b3JkKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbE9yUGFzc3dvcmQodXNlciwgZW1haWwsIHBhc3N3b3JkKSB7XHJcbiAgICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XHJcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xyXG4gICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcclxuICAgIH07XHJcbiAgICBpZiAoZW1haWwpIHtcclxuICAgICAgICByZXF1ZXN0LmVtYWlsID0gZW1haWw7XHJcbiAgICB9XHJcbiAgICBpZiAocGFzc3dvcmQpIHtcclxuICAgICAgICByZXF1ZXN0LnBhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHVzZXIsIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwgcmVxdWVzdCkpO1xyXG4gICAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUGFyc2UgdGhlIGBBZGRpdGlvbmFsVXNlckluZm9gIGZyb20gdGhlIElEIHRva2VuIHJlc3BvbnNlLlxyXG4gKlxyXG4gKi9cclxuZnVuY3Rpb24gX2Zyb21JZFRva2VuUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKSB7XHJcbiAgICB2YXIgX2EsIF9iO1xyXG4gICAgaWYgKCFpZFRva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCB9ID0gaWRUb2tlblJlc3BvbnNlO1xyXG4gICAgY29uc3QgcHJvZmlsZSA9IGlkVG9rZW5SZXNwb25zZS5yYXdVc2VySW5mb1xyXG4gICAgICAgID8gSlNPTi5wYXJzZShpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm8pXHJcbiAgICAgICAgOiB7fTtcclxuICAgIGNvbnN0IGlzTmV3VXNlciA9IGlkVG9rZW5SZXNwb25zZS5pc05ld1VzZXIgfHxcclxuICAgICAgICBpZFRva2VuUmVzcG9uc2Uua2luZCA9PT0gXCJpZGVudGl0eXRvb2xraXQjU2lnbnVwTmV3VXNlclJlc3BvbnNlXCIgLyogSWRUb2tlblJlc3BvbnNlS2luZC5TaWdudXBOZXdVc2VyICovO1xyXG4gICAgaWYgKCFwcm92aWRlcklkICYmIChpZFRva2VuUmVzcG9uc2UgPT09IG51bGwgfHwgaWRUb2tlblJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpZFRva2VuUmVzcG9uc2UuaWRUb2tlbikpIHtcclxuICAgICAgICBjb25zdCBzaWduSW5Qcm92aWRlciA9IChfYiA9IChfYSA9IF9wYXJzZVRva2VuKGlkVG9rZW5SZXNwb25zZS5pZFRva2VuKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpcmViYXNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbJ3NpZ25faW5fcHJvdmlkZXInXTtcclxuICAgICAgICBpZiAoc2lnbkluUHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQcm92aWRlcklkID0gc2lnbkluUHJvdmlkZXIgIT09IFwiYW5vbnltb3VzXCIgLyogUHJvdmlkZXJJZC5BTk9OWU1PVVMgKi8gJiZcclxuICAgICAgICAgICAgICAgIHNpZ25JblByb3ZpZGVyICE9PSBcImN1c3RvbVwiIC8qIFByb3ZpZGVySWQuQ1VTVE9NICovXHJcbiAgICAgICAgICAgICAgICA/IHNpZ25JblByb3ZpZGVyXHJcbiAgICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgICAgIC8vIFVzZXMgZ2VuZXJpYyBjbGFzcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGxlZ2FjeSBTREsuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIGZpbHRlcmVkUHJvdmlkZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFwcm92aWRlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHByb3ZpZGVySWQpIHtcclxuICAgICAgICBjYXNlIFwiZmFjZWJvb2suY29tXCIgLyogUHJvdmlkZXJJZC5GQUNFQk9PSyAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWNlYm9va0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xyXG4gICAgICAgIGNhc2UgXCJnaXRodWIuY29tXCIgLyogUHJvdmlkZXJJZC5HSVRIVUIgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2l0aHViQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgcHJvZmlsZSk7XHJcbiAgICAgICAgY2FzZSBcImdvb2dsZS5jb21cIiAvKiBQcm92aWRlcklkLkdPT0dMRSAqLzpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHb29nbGVBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBwcm9maWxlKTtcclxuICAgICAgICBjYXNlIFwidHdpdHRlci5jb21cIiAvKiBQcm92aWRlcklkLlRXSVRURVIgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUsIGlkVG9rZW5SZXNwb25zZS5zY3JlZW5OYW1lIHx8IG51bGwpO1xyXG4gICAgICAgIGNhc2UgXCJjdXN0b21cIiAvKiBQcm92aWRlcklkLkNVU1RPTSAqLzpcclxuICAgICAgICBjYXNlIFwiYW5vbnltb3VzXCIgLyogUHJvdmlkZXJJZC5BTk9OWU1PVVMgKi86XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIG51bGwpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xyXG4gICAgY29uc3RydWN0b3IoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlID0ge30pIHtcclxuICAgICAgICB0aGlzLmlzTmV3VXNlciA9IGlzTmV3VXNlcjtcclxuICAgICAgICB0aGlzLnByb3ZpZGVySWQgPSBwcm92aWRlcklkO1xyXG4gICAgICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUsIHVzZXJuYW1lKSB7XHJcbiAgICAgICAgc3VwZXIoaXNOZXdVc2VyLCBwcm92aWRlcklkLCBwcm9maWxlKTtcclxuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8gZXh0ZW5kcyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvIHtcclxuICAgIGNvbnN0cnVjdG9yKGlzTmV3VXNlciwgcHJvZmlsZSkge1xyXG4gICAgICAgIHN1cGVyKGlzTmV3VXNlciwgXCJmYWNlYm9vay5jb21cIiAvKiBQcm92aWRlcklkLkZBQ0VCT09LICovLCBwcm9maWxlKTtcclxuICAgIH1cclxufVxyXG5jbGFzcyBHaXRodWJBZGRpdGlvbmFsVXNlckluZm8gZXh0ZW5kcyBGZWRlcmF0ZWRBZGRpdGlvbmFsVXNlckluZm9XaXRoVXNlcm5hbWUge1xyXG4gICAgY29uc3RydWN0b3IoaXNOZXdVc2VyLCBwcm9maWxlKSB7XHJcbiAgICAgICAgc3VwZXIoaXNOZXdVc2VyLCBcImdpdGh1Yi5jb21cIiAvKiBQcm92aWRlcklkLkdJVEhVQiAqLywgcHJvZmlsZSwgdHlwZW9mIChwcm9maWxlID09PSBudWxsIHx8IHByb2ZpbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2ZpbGUubG9naW4pID09PSAnc3RyaW5nJyA/IHByb2ZpbGUgPT09IG51bGwgfHwgcHJvZmlsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvZmlsZS5sb2dpbiA6IG51bGwpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xyXG4gICAgY29uc3RydWN0b3IoaXNOZXdVc2VyLCBwcm9maWxlKSB7XHJcbiAgICAgICAgc3VwZXIoaXNOZXdVc2VyLCBcImdvb2dsZS5jb21cIiAvKiBQcm92aWRlcklkLkdPT0dMRSAqLywgcHJvZmlsZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc05ld1VzZXIsIHByb2ZpbGUsIHNjcmVlbk5hbWUpIHtcclxuICAgICAgICBzdXBlcihpc05ld1VzZXIsIFwidHdpdHRlci5jb21cIiAvKiBQcm92aWRlcklkLlRXSVRURVIgKi8sIHByb2ZpbGUsIHNjcmVlbk5hbWUpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBwcm92aWRlciBzcGVjaWZpYyB7QGxpbmsgQWRkaXRpb25hbFVzZXJJbmZvfSBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGdldEFkZGl0aW9uYWxVc2VySW5mbyh1c2VyQ3JlZGVudGlhbCkge1xyXG4gICAgY29uc3QgeyB1c2VyLCBfdG9rZW5SZXNwb25zZSB9ID0gdXNlckNyZWRlbnRpYWw7XHJcbiAgICBpZiAodXNlci5pc0Fub255bW91cyAmJiAhX3Rva2VuUmVzcG9uc2UpIHtcclxuICAgICAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBzaWduSW5Bbm9ueW1vdXNseSgpIGdldHMgY2FsbGVkIHR3aWNlLlxyXG4gICAgICAgIC8vIE5vIG5ldHdvcmsgY2FsbCBpcyBtYWRlIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBhY3R1YWxseSBmaWxsIHRoaXMgaW5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwcm92aWRlcklkOiBudWxsLFxyXG4gICAgICAgICAgICBpc05ld1VzZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICBwcm9maWxlOiBudWxsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBfZnJvbUlkVG9rZW5SZXNwb25zZShfdG9rZW5SZXNwb25zZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gTm9uLW9wdGlvbmFsIGF1dGggbWV0aG9kcy5cclxuLyoqXHJcbiAqIENoYW5nZXMgdGhlIHR5cGUgb2YgcGVyc2lzdGVuY2Ugb24gdGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnRseSBzYXZlZFxyXG4gKiBgQXV0aGAgc2Vzc2lvbiBhbmQgYXBwbGllcyB0aGlzIHR5cGUgb2YgcGVyc2lzdGVuY2UgZm9yIGZ1dHVyZSBzaWduLWluIHJlcXVlc3RzLCBpbmNsdWRpbmdcclxuICogc2lnbi1pbiB3aXRoIHJlZGlyZWN0IHJlcXVlc3RzLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciBzaWduaW5nIGluIHRvIHNwZWNpZnkgd2hldGhlciB0aGVpciBzZXNzaW9uIHNob3VsZCBiZVxyXG4gKiByZW1lbWJlcmVkIG9yIG5vdC4gSXQgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gbmV2ZXIgcGVyc2lzdCB0aGUgYEF1dGhgIHN0YXRlIGZvciBhcHBsaWNhdGlvbnNcclxuICogdGhhdCBhcmUgc2hhcmVkIGJ5IG90aGVyIHVzZXJzIG9yIGhhdmUgc2Vuc2l0aXZlIGRhdGEuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogc2V0UGVyc2lzdGVuY2UoYXV0aCwgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwZXJzaXN0ZW5jZSAtIFRoZSB7QGxpbmsgUGVyc2lzdGVuY2V9IHRvIHVzZS5cclxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwZXJzaXN0ZW5jZSBjaGFuZ2UgaGFzIGNvbXBsZXRlZFxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRQZXJzaXN0ZW5jZShhdXRoLCBwZXJzaXN0ZW5jZSkge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5zZXRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZSk7XHJcbn1cclxuLyoqXHJcbiAqIExvYWRzIHRoZSByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBgQXV0aGAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgd2lsbCBsb2FkIHRoZSByZUNBUFRDSEEgY29uZmlnLCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVDQVBUQ0hBXHJcbiAqIHZlcmlmaWNhdGlvbiBmbG93IHNob3VsZCBiZSB0cmlnZ2VyZWQgZm9yIGVhY2ggYXV0aCBwcm92aWRlciwgaW50byB0aGVcclxuICogY3VycmVudCBBdXRoIHNlc3Npb24uXHJcbiAqXHJcbiAqIElmIGluaXRpYWxpemVSZWNhcHRjaGFDb25maWcoKSBpcyBub3QgaW52b2tlZCwgdGhlIGF1dGggZmxvdyB3aWxsIGFsd2F5cyBzdGFydFxyXG4gKiB3aXRob3V0IHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIElmIHRoZSBwcm92aWRlciBpcyBjb25maWd1cmVkIHRvIHJlcXVpcmUgcmVDQVBUQ0hBXHJcbiAqIHZlcmlmaWNhdGlvbiwgdGhlIFNESyB3aWxsIHRyYW5zcGFyZW50bHkgbG9hZCB0aGUgcmVDQVBUQ0hBIGNvbmZpZyBhbmQgcmVzdGFydCB0aGVcclxuICogYXV0aCBmbG93cy5cclxuICpcclxuICogVGh1cywgYnkgY2FsbGluZyB0aGlzIG9wdGlvbmFsIG1ldGhvZCwgeW91IHdpbGwgcmVkdWNlIHRoZSBsYXRlbmN5IG9mIGZ1dHVyZSBhdXRoIGZsb3dzLlxyXG4gKiBMb2FkaW5nIHRoZSByZUNBUFRDSEEgY29uZmlnIGVhcmx5IHdpbGwgYWxzbyBlbmhhbmNlIHRoZSBzaWduYWwgY29sbGVjdGVkIGJ5IHJlQ0FQVENIQS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGgpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIHJldHVybiBhdXRoSW50ZXJuYWwuaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZygpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGFuIG9ic2VydmVyIGZvciBjaGFuZ2VzIHRvIHRoZSBzaWduZWQtaW4gdXNlcidzIElEIHRva2VuLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIGluY2x1ZGVzIHNpZ24taW4sIHNpZ24tb3V0LCBhbmQgdG9rZW4gcmVmcmVzaCBldmVudHMuXHJcbiAqIFRoaXMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgdXBvbiBJRCB0b2tlbiBleHBpcmF0aW9uLiBVc2Uge0BsaW5rIFVzZXIuZ2V0SWRUb2tlbn0gdG8gcmVmcmVzaCB0aGUgSUQgdG9rZW4uXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIG5leHRPck9ic2VydmVyIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGNoYW5nZS5cclxuICogQHBhcmFtIGVycm9yIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuIEVycm9yc1xyXG4gKiBvbiBzaWduaW5nIGluL291dCBjYW4gYmUgY2F1Z2h0IGluIHByb21pc2VzIHJldHVybmVkIGZyb21cclxuICogc2lnbi1pbi9zaWduLW91dCBmdW5jdGlvbnMuXHJcbiAqIEBwYXJhbSBjb21wbGV0ZWQgLSBEZXByZWNhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5ldmVyIHRyaWdnZXJlZC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gb25JZFRva2VuQ2hhbmdlZChhdXRoLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCkge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5vbklkVG9rZW5DaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGVkKTtcclxufVxyXG4vKipcclxuICogQWRkcyBhIGJsb2NraW5nIGNhbGxiYWNrIHRoYXQgcnVucyBiZWZvcmUgYW4gYXV0aCBzdGF0ZSBjaGFuZ2VcclxuICogc2V0cyBhIG5ldyB1c2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBjYWxsYmFjayAtIGNhbGxiYWNrIHRyaWdnZXJlZCBiZWZvcmUgbmV3IHVzZXIgdmFsdWUgaXMgc2V0LlxyXG4gKiAgIElmIHRoaXMgdGhyb3dzLCBpdCBibG9ja3MgdGhlIHVzZXIgZnJvbSBiZWluZyBzZXQuXHJcbiAqIEBwYXJhbSBvbkFib3J0IC0gY2FsbGJhY2sgdHJpZ2dlcmVkIGlmIGEgbGF0ZXIgYGJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoKWBcclxuICogICBjYWxsYmFjayB0aHJvd3MsIGFsbG93aW5nIHlvdSB0byB1bmRvIGFueSBzaWRlIGVmZmVjdHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIGNhbGxiYWNrLCBvbkFib3J0KSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLmJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoY2FsbGJhY2ssIG9uQWJvcnQpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGFuIG9ic2VydmVyIGZvciBjaGFuZ2VzIHRvIHRoZSB1c2VyJ3Mgc2lnbi1pbiBzdGF0ZS5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVG8ga2VlcCB0aGUgb2xkIGJlaGF2aW9yLCBzZWUge0BsaW5rIG9uSWRUb2tlbkNoYW5nZWR9LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBuZXh0T3JPYnNlcnZlciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBjaGFuZ2UuXHJcbiAqIEBwYXJhbSBlcnJvciAtIERlcHJlY2F0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbmV2ZXIgdHJpZ2dlcmVkLiBFcnJvcnNcclxuICogb24gc2lnbmluZyBpbi9vdXQgY2FuIGJlIGNhdWdodCBpbiBwcm9taXNlcyByZXR1cm5lZCBmcm9tXHJcbiAqIHNpZ24taW4vc2lnbi1vdXQgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0gY29tcGxldGVkIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIG9uQXV0aFN0YXRlQ2hhbmdlZChhdXRoLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlZCkge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5vbkF1dGhTdGF0ZUNoYW5nZWQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZWQpO1xyXG59XHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIHRoZSBkZWZhdWx0IGRldmljZS9icm93c2VyIHByZWZlcmVuY2UuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gdXNlRGV2aWNlTGFuZ3VhZ2UoYXV0aCkge1xyXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVzZURldmljZUxhbmd1YWdlKCk7XHJcbn1cclxuLyoqXHJcbiAqIEFzeW5jaHJvbm91c2x5IHNldHMgdGhlIHByb3ZpZGVkIHVzZXIgYXMge0BsaW5rIEF1dGguY3VycmVudFVzZXJ9IG9uIHRoZVxyXG4gKiB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEEgbmV3IGluc3RhbmNlIGNvcHkgb2YgdGhlIHVzZXIgcHJvdmlkZWQgd2lsbCBiZSBtYWRlIGFuZCBzZXQgYXMgY3VycmVudFVzZXIuXHJcbiAqXHJcbiAqIFRoaXMgd2lsbCB0cmlnZ2VyIHtAbGluayBvbkF1dGhTdGF0ZUNoYW5nZWR9IGFuZCB7QGxpbmsgb25JZFRva2VuQ2hhbmdlZH0gbGlzdGVuZXJzXHJcbiAqIGxpa2Ugb3RoZXIgc2lnbiBpbiBtZXRob2RzLlxyXG4gKlxyXG4gKiBUaGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHVzZXIgdG8gYmUgdXBkYXRlZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEZpcmViYXNlXHJcbiAqIHByb2plY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIHVzZXIgLSBUaGUgbmV3IHtAbGluayBVc2VyfS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gdXBkYXRlQ3VycmVudFVzZXIoYXV0aCwgdXNlcikge1xyXG4gICAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS51cGRhdGVDdXJyZW50VXNlcih1c2VyKTtcclxufVxyXG4vKipcclxuICogU2lnbnMgb3V0IHRoZSBjdXJyZW50IHVzZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbk91dChhdXRoKSB7XHJcbiAgICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnNpZ25PdXQoKTtcclxufVxyXG4vKipcclxuICogRGVsZXRlcyBhbmQgc2lnbnMgb3V0IHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eS1zZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseVxyXG4gKiBzaWduZWQgaW4uIElmIHRoaXMgcmVxdWlyZW1lbnQgaXNuJ3QgbWV0LCBhc2sgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIGFnYWluIGFuZCB0aGVuIGNhbGxcclxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBkZWxldGVVc2VyKHVzZXIpIHtcclxuICAgIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZGVsZXRlKCk7XHJcbn1cblxuY2xhc3MgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBjcmVkZW50aWFsLCBhdXRoKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgICAgICB0aGlzLmNyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21JZHRva2VuKGlkVG9rZW4sIGF1dGgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXCJlbnJvbGxcIiAvKiBNdWx0aUZhY3RvclNlc3Npb25UeXBlLkVOUk9MTCAqLywgaWRUb2tlbiwgYXV0aCk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChtZmFQZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbChcInNpZ25pblwiIC8qIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTiAqLywgbWZhUGVuZGluZ0NyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMudHlwZSA9PT0gXCJlbnJvbGxcIiAvKiBNdWx0aUZhY3RvclNlc3Npb25UeXBlLkVOUk9MTCAqL1xyXG4gICAgICAgICAgICA/ICdpZFRva2VuJ1xyXG4gICAgICAgICAgICA6ICdwZW5kaW5nQ3JlZGVudGlhbCc7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbXVsdGlGYWN0b3JTZXNzaW9uOiB7XHJcbiAgICAgICAgICAgICAgICBba2V5XTogdGhpcy5jcmVkZW50aWFsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21KU09OKG9iaikge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9iai5tdWx0aUZhY3RvclNlc3Npb24pIHtcclxuICAgICAgICAgICAgaWYgKChfYSA9IG9iai5tdWx0aUZhY3RvclNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChvYmoubXVsdGlGYWN0b3JTZXNzaW9uLnBlbmRpbmdDcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgoX2IgPSBvYmoubXVsdGlGYWN0b3JTZXNzaW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWRUb2tlbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21JZHRva2VuKG9iai5tdWx0aUZhY3RvclNlc3Npb24uaWRUb2tlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwge1xyXG4gICAgY29uc3RydWN0b3Ioc2Vzc2lvbiwgaGludHMsIHNpZ25JblJlc29sdmVyKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuICAgICAgICB0aGlzLmhpbnRzID0gaGludHM7XHJcbiAgICAgICAgdGhpcy5zaWduSW5SZXNvbHZlciA9IHNpZ25JblJlc29sdmVyO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhdGljIF9mcm9tRXJyb3IoYXV0aEV4dGVybiwgZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xyXG4gICAgICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U7XHJcbiAgICAgICAgY29uc3QgaGludHMgPSAoc2VydmVyUmVzcG9uc2UubWZhSW5mbyB8fCBbXSkubWFwKGVucm9sbG1lbnQgPT4gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpKTtcclxuICAgICAgICBfYXNzZXJ0KHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChzZXJ2ZXJSZXNwb25zZS5tZmFQZW5kaW5nQ3JlZGVudGlhbCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvclJlc29sdmVySW1wbChzZXNzaW9uLCBoaW50cywgYXN5bmMgKGFzc2VydGlvbikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZmFSZXNwb25zZSA9IGF3YWl0IGFzc2VydGlvbi5fcHJvY2VzcyhhdXRoLCBzZXNzaW9uKTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgZnJvbSB0aGUgb2xkIGxvZ2luIHJlc3BvbnNlXHJcbiAgICAgICAgICAgIGRlbGV0ZSBzZXJ2ZXJSZXNwb25zZS5tZmFJbmZvO1xyXG4gICAgICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWw7XHJcbiAgICAgICAgICAgIC8vIFVzZSBpbiB0aGUgbmV3IHRva2VuICYgcmVmcmVzaCB0b2tlbiBpbiB0aGUgb2xkIHJlc3BvbnNlXHJcbiAgICAgICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2VydmVyUmVzcG9uc2UpLCB7IGlkVG9rZW46IG1mYVJlc3BvbnNlLmlkVG9rZW4sIHJlZnJlc2hUb2tlbjogbWZhUmVzcG9uc2UucmVmcmVzaFRva2VuIH0pO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgY29sbGFwc2UgdGhpcyBzd2l0Y2ggc3RhdGVtZW50IGludG8gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24gYW5kIGhhdmUgaXQgc3VwcG9ydCB0aGUgU0lHTl9JTiBjYXNlXHJcbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3Iub3BlcmF0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInNpZ25JblwiIC8qIE9wZXJhdGlvblR5cGUuU0lHTl9JTiAqLzpcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShhdXRoLCBlcnJvci5vcGVyYXRpb25UeXBlLCBpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGF1dGguX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhlbnRpY2F0ZVwiIC8qIE9wZXJhdGlvblR5cGUuUkVBVVRIRU5USUNBVEUgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgX2Fzc2VydChlcnJvci51c2VyLCBhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKGVycm9yLnVzZXIsIGVycm9yLm9wZXJhdGlvblR5cGUsIGlkVG9rZW5SZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIF9mYWlsKGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcmVzb2x2ZVNpZ25Jbihhc3NlcnRpb25FeHRlcm4pIHtcclxuICAgICAgICBjb25zdCBhc3NlcnRpb24gPSBhc3NlcnRpb25FeHRlcm47XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkluUmVzb2x2ZXIoYXNzZXJ0aW9uKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogUHJvdmlkZXMgYSB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGNvbXBsZXRpb24gb2YgYVxyXG4gKiBtdWx0aS1mYWN0b3IgZmxvdy5cclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUge0BsaW5rIE11bHRpRmFjdG9yRXJyb3J9IHJhaXNlZCBkdXJpbmcgYSBzaWduLWluLCBvclxyXG4gKiByZWF1dGhlbnRpY2F0aW9uIG9wZXJhdGlvbi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0TXVsdGlGYWN0b3JSZXNvbHZlcihhdXRoLCBlcnJvcikge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XHJcbiAgICBjb25zdCBlcnJvckludGVybmFsID0gZXJyb3I7XHJcbiAgICBfYXNzZXJ0KGVycm9yLmN1c3RvbURhdGEub3BlcmF0aW9uVHlwZSwgYXV0aE1vZHVsYXIsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgIF9hc3NlcnQoKF9hID0gZXJyb3JJbnRlcm5hbC5jdXN0b21EYXRhLl9zZXJ2ZXJSZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1mYVBlbmRpbmdDcmVkZW50aWFsLCBhdXRoTW9kdWxhciwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIE11bHRpRmFjdG9yUmVzb2x2ZXJJbXBsLl9mcm9tRXJyb3IoYXV0aE1vZHVsYXIsIGVycm9ySW50ZXJuYWwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHN0YXJ0RW5yb2xsUGhvbmVNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YyL2FjY291bnRzL21mYUVucm9sbG1lbnQ6c3RhcnRcIiAvKiBFbmRwb2ludC5TVEFSVF9NRkFfRU5ST0xMTUVOVCAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxyXG5mdW5jdGlvbiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplXCIgLyogRW5kcG9pbnQuRklOQUxJWkVfTUZBX0VOUk9MTE1FTlQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gc3RhcnRFbnJvbGxUb3RwTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OnN0YXJ0XCIgLyogRW5kcG9pbnQuU1RBUlRfTUZBX0VOUk9MTE1FTlQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gZmluYWxpemVFbnJvbGxUb3RwTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplXCIgLyogRW5kcG9pbnQuRklOQUxJWkVfTUZBX0VOUk9MTE1FTlQgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gd2l0aGRyYXdNZmEoYXV0aCwgcmVxdWVzdCkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIlBPU1RcIiAvKiBIdHRwTWV0aG9kLlBPU1QgKi8sIFwiL3YyL2FjY291bnRzL21mYUVucm9sbG1lbnQ6d2l0aGRyYXdcIiAvKiBFbmRwb2ludC5XSVRIRFJBV19NRkEgKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cblxuY2xhc3MgTXVsdGlGYWN0b3JVc2VySW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1c2VyKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IFtdO1xyXG4gICAgICAgIHVzZXIuX29uUmVsb2FkKHVzZXJJbmZvID0+IHtcclxuICAgICAgICAgICAgaWYgKHVzZXJJbmZvLm1mYUluZm8pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5yb2xsZWRGYWN0b3JzID0gdXNlckluZm8ubWZhSW5mby5tYXAoZW5yb2xsbWVudCA9PiBNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UodXNlci5hdXRoLCBlbnJvbGxtZW50KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBfZnJvbVVzZXIodXNlcikge1xyXG4gICAgICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JVc2VySW1wbCh1c2VyKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFNlc3Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21JZHRva2VuKGF3YWl0IHRoaXMudXNlci5nZXRJZFRva2VuKCksIHRoaXMudXNlci5hdXRoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGVucm9sbChhc3NlcnRpb25FeHRlcm4sIGRpc3BsYXlOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuO1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCkpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsaXplTWZhUmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZCh0aGlzLnVzZXIsIGFzc2VydGlvbi5fcHJvY2Vzcyh0aGlzLnVzZXIuYXV0aCwgc2Vzc2lvbiwgZGlzcGxheU5hbWUpKTtcclxuICAgICAgICAvLyBOZXcgdG9rZW5zIHdpbGwgYmUgaXNzdWVkIGFmdGVyIGVucm9sbG1lbnQgb2YgdGhlIG5ldyBzZWNvbmQgZmFjdG9ycy5cclxuICAgICAgICAvLyBUaGV5IG5lZWQgdG8gYmUgdXBkYXRlZCBvbiB0aGUgdXNlci5cclxuICAgICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGZpbmFsaXplTWZhUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIGdldCB0aGUgbmV3IG11bHRpLWZhY3RvciBpbmZvcm1hdGlvblxyXG4gICAgICAgIC8vIGZyb20gc2VydmVyLiBVU0VSX1JFTE9BREVEIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIGFuZCBgZW5yb2xsZWRGYWN0b3JzYFxyXG4gICAgICAgIC8vIHdpbGwgYmUgdXBkYXRlZC5cclxuICAgICAgICByZXR1cm4gdGhpcy51c2VyLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgdW5lbnJvbGwoaW5mb09yVWlkKSB7XHJcbiAgICAgICAgY29uc3QgbWZhRW5yb2xsbWVudElkID0gdHlwZW9mIGluZm9PclVpZCA9PT0gJ3N0cmluZycgPyBpbmZvT3JVaWQgOiBpbmZvT3JVaWQudWlkO1xyXG4gICAgICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMudXNlciwgd2l0aGRyYXdNZmEodGhpcy51c2VyLmF1dGgsIHtcclxuICAgICAgICAgICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgICAgICAgICBtZmFFbnJvbGxtZW50SWRcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNlY29uZCBmYWN0b3IgZnJvbSB0aGUgdXNlcidzIGxpc3QuXHJcbiAgICAgICAgICAgIHRoaXMuZW5yb2xsZWRGYWN0b3JzID0gdGhpcy5lbnJvbGxlZEZhY3RvcnMuZmlsdGVyKCh7IHVpZCB9KSA9PiB1aWQgIT09IG1mYUVucm9sbG1lbnRJZCk7XHJcbiAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBiYWNrZW5kIGRlY2lkZWQgdG8gcmV2b2tlIHRoZSB1c2VyJ3Mgc2Vzc2lvbixcclxuICAgICAgICAgICAgLy8gdGhlIHRva2VuUmVzcG9uc2UgbWF5IGJlIGVtcHR5LiBJZiB0aGUgdG9rZW5zIHdlcmUgbm90IHVwZGF0ZWQgKGFuZCB0aGV5XHJcbiAgICAgICAgICAgIC8vIGFyZSBub3cgaW52YWxpZCksIHJlbG9hZGluZyB0aGUgdXNlciB3aWxsIGRpc2NvdmVyIHRoaXMgYW5kIGludmFsaWRhdGVcclxuICAgICAgICAgICAgLy8gdGhlIHVzZXIncyBzdGF0ZSBhY2NvcmRpbmdseS5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShpZFRva2VuUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXIucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IG11bHRpRmFjdG9yVXNlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuLyoqXHJcbiAqIFRoZSB7QGxpbmsgTXVsdGlGYWN0b3JVc2VyfSBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBtdWx0aS1mYWN0b3IgcHJvcGVydGllcyBhbmQgb3BlcmF0aW9ucyByZWxhdGVkIHRvIHRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBtdWx0aUZhY3Rvcih1c2VyKSB7XHJcbiAgICBjb25zdCB1c2VyTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIGlmICghbXVsdGlGYWN0b3JVc2VyQ2FjaGUuaGFzKHVzZXJNb2R1bGFyKSkge1xyXG4gICAgICAgIG11bHRpRmFjdG9yVXNlckNhY2hlLnNldCh1c2VyTW9kdWxhciwgTXVsdGlGYWN0b3JVc2VySW1wbC5fZnJvbVVzZXIodXNlck1vZHVsYXIpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtdWx0aUZhY3RvclVzZXJDYWNoZS5nZXQodXNlck1vZHVsYXIpO1xyXG59XG5cbmNvbnN0IFNUT1JBR0VfQVZBSUxBQkxFX0tFWSA9ICdfX3Nhayc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGJyb3dzZXIgcGVyc2lzdGVuY2UgdHlwZXM6IGxvY2FsIGFuZCBzZXNzaW9uLlxyXG4vLyBCb3RoIGhhdmUgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYnV0IHVzZSBhIGRpZmZlcmVudCB1bmRlcmx5aW5nIHN0b3JhZ2VcclxuLy8gb2JqZWN0LlxyXG5jbGFzcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB7XHJcbiAgICBjb25zdHJ1Y3RvcihzdG9yYWdlUmV0cmlldmVyLCB0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlUmV0cmlldmVyID0gc3RvcmFnZVJldHJpZXZlcjtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG4gICAgX2lzQXZhaWxhYmxlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yYWdlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBqc29uID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGpzb24gPyBKU09OLnBhcnNlKGpzb24pIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHN0b3JhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVJldHJpZXZlcigpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSgpIHtcclxuICAgIGNvbnN0IHVhID0gZ2V0VUEoKTtcclxuICAgIHJldHVybiBfaXNTYWZhcmkodWEpIHx8IF9pc0lPUyh1YSk7XHJcbn1cclxuLy8gVGhlIHBvbGxpbmcgcGVyaW9kIGluIGNhc2UgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkXHJcbmNvbnN0IF9QT0xMSU5HX0lOVEVSVkFMX01TJDEgPSAxMDAwO1xyXG4vLyBUaGUgSUUgMTAgbG9jYWxTdG9yYWdlIGNyb3NzIHRhYiBzeW5jaHJvbml6YXRpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXHJcbmNvbnN0IElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZID0gMTA7XHJcbmNsYXNzIEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKCkgPT4gd2luZG93LmxvY2FsU3RvcmFnZSwgXCJMT0NBTFwiIC8qIFBlcnNpc3RlbmNlVHlwZS5MT0NBTCAqLyk7XHJcbiAgICAgICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IChldmVudCwgcG9sbCkgPT4gdGhpcy5vblN0b3JhZ2VFdmVudChldmVudCwgcG9sbCk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcclxuICAgICAgICB0aGlzLmxvY2FsQ2FjaGUgPSB7fTtcclxuICAgICAgICAvLyBzZXRUaW1lb3V0IHJldHVybiB2YWx1ZSBpcyBwbGF0Zm9ybSBzcGVjaWZpY1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIFNhZmFyaSBvciBpT1MgYnJvd3NlciBhbmQgZW1iZWRkZWQgaW4gYW4gaWZyYW1lLlxyXG4gICAgICAgIHRoaXMuc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkID0gX2lmcmFtZUNhbm5vdFN5bmNXZWJTdG9yYWdlKCkgJiYgX2lzSWZyYW1lKCk7XHJcbiAgICAgICAgLy8gV2hldGhlciB0byB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiB3aW5kb3cgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvUG9sbGluZyA9IF9pc01vYmlsZUJyb3dzZXIoKTtcclxuICAgICAgICB0aGlzLl9zaG91bGRBbGxvd01pZ3JhdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmb3JBbGxDaGFuZ2VkS2V5cyhjYikge1xyXG4gICAgICAgIC8vIENoZWNrIGFsbCBrZXlzIHdpdGggbGlzdGVuZXJzIG9uIHRoZW0uXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpKSB7XHJcbiAgICAgICAgICAgIC8vIEdldCB2YWx1ZSBmcm9tIGxvY2FsU3RvcmFnZS5cclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMubG9jYWxDYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAvLyBJZiBsb2NhbCBtYXAgdmFsdWUgZG9lcyBub3QgbWF0Y2gsIHRyaWdnZXIgbGlzdGVuZXIgd2l0aCBzdG9yYWdlIGV2ZW50LlxyXG4gICAgICAgICAgICAvLyBEaWZmZXJlbnRpYXRlIHRoaXMgc2ltdWxhdGVkIGV2ZW50IGZyb20gdGhlIHJlYWwgc3RvcmFnZSBldmVudC5cclxuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2Ioa2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb25TdG9yYWdlRXZlbnQoZXZlbnQsIHBvbGwgPSBmYWxzZSkge1xyXG4gICAgICAgIC8vIEtleSB3b3VsZCBiZSBudWxsIGluIHNvbWUgc2l0dWF0aW9ucywgbGlrZSB3aGVuIGxvY2FsU3RvcmFnZSBpcyBjbGVhcmVkXHJcbiAgICAgICAgaWYgKCFldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JBbGxDaGFuZ2VkS2V5cygoa2V5LCBfb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhrZXksIG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xyXG4gICAgICAgIC8vIENoZWNrIHRoZSBtZWNoYW5pc20gaG93IHRoaXMgZXZlbnQgd2FzIGRldGVjdGVkLlxyXG4gICAgICAgIC8vIFRoZSBmaXJzdCBldmVudCB3aWxsIGRpY3RhdGUgdGhlIG1lY2hhbmlzbSB0byBiZSB1c2VkLlxyXG4gICAgICAgIGlmIChwb2xsKSB7XHJcbiAgICAgICAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBwb2xsaW5nLlxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgc3RvcmFnZSBldmVudCBsaXN0ZW5lciB0byBwcmV2ZW50IHBvc3NpYmxlIGV2ZW50IGR1cGxpY2F0aW9uLlxyXG4gICAgICAgICAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBFbnZpcm9ubWVudCBkZXRlY3RzIHN0b3JhZ2UgY2hhbmdlcyB2aWEgc3RvcmFnZSBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHBvbGxpbmcgbGlzdGVuZXIgdG8gcHJldmVudCBwb3NzaWJsZSBldmVudCBkdXBsaWNhdGlvbi5cclxuICAgICAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTYWZhcmkgZW1iZWRkZWQgaWZyYW1lLiBTdG9yYWdlIGV2ZW50IHdpbGwgdHJpZ2dlciB3aXRoIHRoZSBkZWx0YVxyXG4gICAgICAgIC8vIGNoYW5nZXMgYnV0IG5vIGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBpZnJhbWUgbG9jYWxTdG9yYWdlLlxyXG4gICAgICAgIGlmICh0aGlzLnNhZmFyaUxvY2FsU3RvcmFnZU5vdFN5bmNlZCkge1xyXG4gICAgICAgICAgICAvLyBHZXQgY3VycmVudCBpZnJhbWUgcGFnZSB2YWx1ZS5cclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICAvLyBWYWx1ZSBub3Qgc3luY2hyb25pemVkLCBzeW5jaHJvbml6ZSBtYW51YWxseS5cclxuICAgICAgICAgICAgaWYgKGV2ZW50Lm5ld1ZhbHVlICE9PSBzdG9yZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm5ld1ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsdWUgY2hhbmdlZCBmcm9tIGN1cnJlbnQgdmFsdWUuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBldmVudC5uZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHZhbHVlIGRlbGV0ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxvY2FsQ2FjaGVba2V5XSA9PT0gZXZlbnQubmV3VmFsdWUgJiYgIXBvbGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgZGV0ZWN0ZWQgYW5kIHByb2Nlc3NlZCwgZG8gbm90IHRyaWdnZXIgbGlzdGVuZXJzIGFnYWluLlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRyaWdnZXJMaXN0ZW5lcnMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIEtlZXAgbG9jYWwgbWFwIHVwIHRvIGRhdGUgaW4gY2FzZSBzdG9yYWdlIGV2ZW50IGlzIHRyaWdnZXJlZCBiZWZvcmVcclxuICAgICAgICAgICAgLy8gcG9sbC5cclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgICAgICAgICBpZiAoIXBvbGwgJiYgdGhpcy5sb2NhbENhY2hlW2tleV0gPT09IHN0b3JlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWFsIHN0b3JhZ2UgZXZlbnQgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBkZXRlY3RlZCwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2VlbXMgdG8gdHJpZ2dlciBpbiBzb21lIElFIGJyb3dzZXJzIGZvciBzb21lIHJlYXNvbi5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhrZXksIHN0b3JlZFZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZiAoX2lzSUUxMCgpICYmXHJcbiAgICAgICAgICAgIHN0b3JlZFZhbHVlICE9PSBldmVudC5uZXdWYWx1ZSAmJlxyXG4gICAgICAgICAgICBldmVudC5uZXdWYWx1ZSAhPT0gZXZlbnQub2xkVmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gSUUgMTAgaGFzIHRoaXMgd2VpcmQgYnVnIHdoZXJlIGEgc3RvcmFnZSBldmVudCB3b3VsZCB0cmlnZ2VyIHdpdGggdGhlXHJcbiAgICAgICAgICAgIC8vIGNvcnJlY3Qga2V5LCBvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYnV0IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgZG9lc1xyXG4gICAgICAgICAgICAvLyBub3QgeWllbGQgdGhlIHVwZGF0ZWQgdmFsdWUgdW50aWwgYSBmZXcgbWlsbGlzZWNvbmRzLiBUaGlzIGVuc3VyZXNcclxuICAgICAgICAgICAgLy8gdGhpcyByZWNvdmVycyBmcm9tIHRoYXQgc2l0dWF0aW9uLlxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRyaWdnZXJMaXN0ZW5lcnMsIElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBub3RpZnlMaXN0ZW5lcnMoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNba2V5XTtcclxuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgQXJyYXkuZnJvbShsaXN0ZW5lcnMpKSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcih2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnRQb2xsaW5nKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mb3JBbGxDaGFuZ2VkS2V5cygoa2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdG9yYWdlRXZlbnQobmV3IFN0b3JhZ2VFdmVudCgnc3RvcmFnZScsIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVcclxuICAgICAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgICAgIC8qIHBvbGwgKi8gdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIF9QT0xMSU5HX0lOVEVSVkFMX01TJDEpO1xyXG4gICAgfVxyXG4gICAgc3RvcFBvbGxpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXR0YWNoTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIGRldGFjaExpc3RlbmVyKCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBfYWRkTGlzdGVuZXIoa2V5LCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIFdoZXRoZXIgYnJvd3NlciBjYW4gZGV0ZWN0IHN0b3JhZ2UgZXZlbnQgd2hlbiBpdCBoYWQgYWxyZWFkeSBiZWVuIHB1c2hlZCB0byB0aGUgYmFja2dyb3VuZC5cclxuICAgICAgICAgICAgLy8gVGhpcyBtYXkgaGFwcGVuIGluIHNvbWUgbW9iaWxlIGJyb3dzZXJzLiBBIGxvY2FsU3RvcmFnZSBjaGFuZ2UgaW4gdGhlIGZvcmVncm91bmQgd2luZG93XHJcbiAgICAgICAgICAgIC8vIHdpbGwgbm90IGJlIGRldGVjdGVkIGluIHRoZSBiYWNrZ3JvdW5kIHdpbmRvdyB2aWEgdGhlIHN0b3JhZ2UgZXZlbnQuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgd2FzIGRldGVjdGVkIGluIGlPUyA3LnggbW9iaWxlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9Qb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRhY2hMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldID0gbmV3IFNldCgpO1xyXG4gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5hZGQobGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgX3JlbW92ZUxpc3RlbmVyKGtleSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldLmRlbGV0ZShsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBsb2NhbCBjYWNoZSBvbiBiYXNlIG9wZXJhdGlvbnM6XHJcbiAgICBhc3luYyBfc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICBhd2FpdCBzdXBlci5fc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHN1cGVyLl9nZXQoa2V5KTtcclxuICAgICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfcmVtb3ZlKGtleSkge1xyXG4gICAgICAgIGF3YWl0IHN1cGVyLl9yZW1vdmUoa2V5KTtcclxuICAgICAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XHJcbiAgICB9XHJcbn1cclxuQnJvd3NlckxvY2FsUGVyc2lzdGVuY2UudHlwZSA9ICdMT0NBTCc7XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgYExPQ0FMYCB1c2luZyBgbG9jYWxTdG9yYWdlYFxyXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UgPSBCcm93c2VyTG9jYWxQZXJzaXN0ZW5jZTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSBleHRlbmRzIEJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCgpID0+IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSwgXCJTRVNTSU9OXCIgLyogUGVyc2lzdGVuY2VUeXBlLlNFU1NJT04gKi8pO1xyXG4gICAgfVxyXG4gICAgX2FkZExpc3RlbmVyKF9rZXksIF9saXN0ZW5lcikge1xyXG4gICAgICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2tleSwgX2xpc3RlbmVyKSB7XHJcbiAgICAgICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBzZXNzaW9uIHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93c1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxufVxyXG5Ccm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlLnR5cGUgPSAnU0VTU0lPTic7XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIGBTRVNTSU9OYCB1c2luZyBgc2Vzc2lvblN0b3JhZ2VgXHJcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlID0gQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFNoaW0gZm9yIFByb21pc2UuYWxsU2V0dGxlZCwgbm90ZSB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdCBvZiBgZnVsZmlsbGVkYCB2cyBgc3RhdHVzYC5cclxuICpcclxuICogQHBhcmFtIHByb21pc2VzIC0gQXJyYXkgb2YgcHJvbWlzZXMgdG8gd2FpdCBvbi5cclxuICovXHJcbmZ1bmN0aW9uIF9hbGxTZXR0bGVkKHByb21pc2VzKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMubWFwKGFzeW5jIChwcm9taXNlKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9taXNlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZnVsZmlsbGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKHJlYXNvbikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZnVsZmlsbGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlYXNvblxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0pKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIGNsYXNzIGZvciByZWNlaXZpbmcgbWVzc2FnZXMuXHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBSZWNlaXZlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihldmVudFRhcmdldCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQgPSBldmVudFRhcmdldDtcclxuICAgICAgICB0aGlzLmhhbmRsZXJzTWFwID0ge307XHJcbiAgICAgICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT2J0YWluIGFuIGluc3RhbmNlIG9mIGEgUmVjZWl2ZXIgZm9yIGEgZ2l2ZW4gZXZlbnQgdGFyZ2V0LCBpZiBub25lIGV4aXN0cyBpdCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50VGFyZ2V0IC0gQW4gZXZlbnQgdGFyZ2V0IChzdWNoIGFzIHdpbmRvdyBvciBzZWxmKSB0aHJvdWdoIHdoaWNoIHRoZSB1bmRlcmx5aW5nXHJcbiAgICAgKiBtZXNzYWdlcyB3aWxsIGJlIHJlY2VpdmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgX2dldEluc3RhbmNlKGV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgLy8gVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSBzaW5jZSBvYmplY3RzIGNhbid0IGJlIGtleXMgZm9yIG90aGVyXHJcbiAgICAgICAgLy8gb2JqZWN0cy4gSW4gYWRkaXRpb24sIHNldHRpbmcgYSB1bmlxdWUgcHJvcGVydHkgb24gYW4gZXZlbnQgdGFyZ2V0IGFzIGFcclxuICAgICAgICAvLyBoYXNoIG1hcCBrZXkgbWF5IG5vdCBiZSBhbGxvd2VkIGR1ZSB0byBDT1JTIHJlc3RyaWN0aW9ucy5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5yZWNlaXZlcnMuZmluZChyZWNlaXZlciA9PiByZWNlaXZlci5pc0xpc3RlbmluZ3RvKGV2ZW50VGFyZ2V0KSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IFJlY2VpdmVyKGV2ZW50VGFyZ2V0KTtcclxuICAgICAgICB0aGlzLnJlY2VpdmVycy5wdXNoKG5ld0luc3RhbmNlKTtcclxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBpc0xpc3RlbmluZ3RvKGV2ZW50VGFyZ2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUYXJnZXQgPT09IGV2ZW50VGFyZ2V0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGYW5zIG91dCBhIE1lc3NhZ2VFdmVudCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBTZW5kcyBhbiB7QGxpbmsgU3RhdHVzLkFDS30gdXBvbiByZWNlaXB0IGFuZCBhIHtAbGluayBTdGF0dXMuRE9ORX0gb25jZSBhbGwgaGFuZGxlcnMgaGF2ZVxyXG4gICAgICogZmluaXNoZWQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgTWVzc2FnZUV2ZW50LlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgYXN5bmMgaGFuZGxlRXZlbnQoZXZlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBldmVudDtcclxuICAgICAgICBjb25zdCB7IGV2ZW50SWQsIGV2ZW50VHlwZSwgZGF0YSB9ID0gbWVzc2FnZUV2ZW50LmRhdGE7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV07XHJcbiAgICAgICAgaWYgKCEoaGFuZGxlcnMgPT09IG51bGwgfHwgaGFuZGxlcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXJzLnNpemUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVzc2FnZUV2ZW50LnBvcnRzWzBdLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgc3RhdHVzOiBcImFja1wiIC8qIF9TdGF0dXMuQUNLICovLFxyXG4gICAgICAgICAgICBldmVudElkLFxyXG4gICAgICAgICAgICBldmVudFR5cGVcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20oaGFuZGxlcnMpLm1hcChhc3luYyAoaGFuZGxlcikgPT4gaGFuZGxlcihtZXNzYWdlRXZlbnQub3JpZ2luLCBkYXRhKSk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfYWxsU2V0dGxlZChwcm9taXNlcyk7XHJcbiAgICAgICAgbWVzc2FnZUV2ZW50LnBvcnRzWzBdLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgc3RhdHVzOiBcImRvbmVcIiAvKiBfU3RhdHVzLkRPTkUgKi8sXHJcbiAgICAgICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSxcclxuICAgICAgICAgICAgcmVzcG9uc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIF9zdWJzY3JpYmUoZXZlbnRUeXBlLCBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0gPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5hZGQoZXZlbnRIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgYW4gZXZlbnQgaGFuZGxlciBmcm9tIGEgcGFydGljdWxhciBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byB1bnN1YnNjcmliZSBmcm9tLlxyXG4gICAgICogQHBhcmFtIGV2ZW50SGFuZGxlciAtIE9wdGlub2FsIGV2ZW50IGhhbmRsZXIsIGlmIG5vbmUgcHJvdmlkZWQsIHVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBvbiB0aGlzIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgX3Vuc3Vic2NyaWJlKGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSAmJiBldmVudEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLmRlbGV0ZShldmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWV2ZW50SGFuZGxlciB8fCB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0uc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5SZWNlaXZlci5yZWNlaXZlcnMgPSBbXTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dlbmVyYXRlRXZlbnRJZChwcmVmaXggPSAnJywgZGlnaXRzID0gMTApIHtcclxuICAgIGxldCByYW5kb20gPSAnJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcclxuICAgICAgICByYW5kb20gKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByZWZpeCArIHJhbmRvbTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGFuZCB3YWl0aW5nIGZvciBhIGNvbXBsZXRpb24gcmVzcG9uc2UuXHJcbiAqXHJcbiAqL1xyXG5jbGFzcyBTZW5kZXIge1xyXG4gICAgY29uc3RydWN0b3IodGFyZ2V0KSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgdGhlIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBmcm9tIG91ciB0cmFja2luZyBTZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciB0byB1bnN1YnNjcmliZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xyXG4gICAgICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VDaGFubmVsKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIubWVzc2FnZUNoYW5uZWwucG9ydDEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIub25NZXNzYWdlKTtcclxuICAgICAgICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFJlY2VpdmVyIGxvY2F0ZWQgYXQge0BsaW5rIHRhcmdldH0uXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIFdlJ2xsIGZpcnN0IHdhaXQgYSBiaXQgZm9yIGFuIEFDSyAsIGlmIHdlIGdldCBvbmUgd2Ugd2lsbCB3YWl0IHNpZ25pZmljYW50bHkgbG9uZ2VyIHVudGlsIHRoZVxyXG4gICAgICogcmVjZWl2ZXIgaGFzIGhhZCBhIGNoYW5jZSB0byBmdWxseSBwcm9jZXNzIHRoZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBldmVudCB0byBzZW5kLlxyXG4gICAgICogQHBhcmFtIGRhdGEgLSBUaGUgcGF5bG9hZCBvZiB0aGUgZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gdGltZW91dCAtIFRpbWVvdXQgZm9yIHdhaXRpbmcgb24gYW4gQUNLIGZyb20gdGhlIHJlY2VpdmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHNldHRsZWQgcHJvbWlzZXMgZnJvbSBhbGwgdGhlIGhhbmRsZXJzIHRoYXQgd2VyZSBsaXN0ZW5pbmcgb24gdGhlIHJlY2VpdmVyLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBfc2VuZChldmVudFR5cGUsIGRhdGEsIHRpbWVvdXQgPSA1MCAvKiBfVGltZW91dER1cmF0aW9uLkFDSyAqLykge1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VDaGFubmVsID0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyA/IG5ldyBNZXNzYWdlQ2hhbm5lbCgpIDogbnVsbDtcclxuICAgICAgICBpZiAoIW1lc3NhZ2VDaGFubmVsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb25fdW5hdmFpbGFibGVcIiAvKiBfTWVzc2FnZUVycm9yLkNPTk5FQ1RJT05fVU5BVkFJTEFCTEUgKi8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgcmV0dXJuIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHR5cGVzLlxyXG4gICAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNhcmUgd2hhdCB0aGUgdmFsdWUgaXMgYnV0IFRTIHdvbid0IGFjY2VwdCB1bmtub3duIGFuZFxyXG4gICAgICAgIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBsZXQgY29tcGxldGlvblRpbWVyO1xyXG4gICAgICAgIGxldCBoYW5kbGVyO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKCcnLCAyMCk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwidW5zdXBwb3J0ZWRfZXZlbnRcIiAvKiBfTWVzc2FnZUVycm9yLlVOU1VQUE9SVEVEX0VWRU5UICovKSk7XHJcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgICAgICAgICBoYW5kbGVyID0ge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwsXHJcbiAgICAgICAgICAgICAgICBvbk1lc3NhZ2UoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBldmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUV2ZW50LmRhdGEuZXZlbnRJZCAhPT0gZXZlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZUV2ZW50LmRhdGEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhY2tcIiAvKiBfU3RhdHVzLkFDSyAqLzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNlaXZlciBzaG91bGQgQUNLIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFja1RpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ0aW1lb3V0XCIgLyogX01lc3NhZ2VFcnJvci5USU1FT1VUICovKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwIC8qIF9UaW1lb3V0RHVyYXRpb24uQ09NUExFVElPTiAqLyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRvbmVcIiAvKiBfU3RhdHVzLkRPTkUgKi86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmNlIHRoZSByZWNlaXZlcidzIGhhbmRsZXJzIGFyZSBmaW5pc2hlZCB3ZSB3aWxsIGdldCB0aGUgcmVzdWx0cy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjb21wbGV0aW9uVGltZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlRXZlbnQuZGF0YS5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY2tUaW1lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJpbnZhbGlkX3Jlc3BvbnNlXCIgLyogX01lc3NhZ2VFcnJvci5JTlZBTElEX1JFU1BPTlNFICovKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xyXG4gICAgICAgICAgICBtZXNzYWdlQ2hhbm5lbC5wb3J0MS5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlci5vbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGUsXHJcbiAgICAgICAgICAgICAgICBldmVudElkLFxyXG4gICAgICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgICAgICB9LCBbbWVzc2FnZUNoYW5uZWwucG9ydDJdKTtcclxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogTGF6eSBhY2Nlc3NvciBmb3Igd2luZG93LCBzaW5jZSB0aGUgY29tcGF0IGxheWVyIHdvbid0IHRyZWUgc2hha2UgdGhpcyBvdXQsXHJcbiAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCB0byBtZXNzIHdpdGggd2luZG93IHVubGVzcyB3ZSBoYXZlIHRvXHJcbiAqL1xyXG5mdW5jdGlvbiBfd2luZG93KCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdztcclxufVxyXG5mdW5jdGlvbiBfc2V0V2luZG93TG9jYXRpb24odXJsKSB7XHJcbiAgICBfd2luZG93KCkubG9jYXRpb24uaHJlZiA9IHVybDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2lzV29ya2VyKCkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgX3dpbmRvdygpWydXb3JrZXJHbG9iYWxTY29wZSddICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgIHR5cGVvZiBfd2luZG93KClbJ2ltcG9ydFNjcmlwdHMnXSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2dldEFjdGl2ZVNlcnZpY2VXb3JrZXIoKSB7XHJcbiAgICBpZiAoIShuYXZpZ2F0b3IgPT09IG51bGwgfHwgbmF2aWdhdG9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlcikpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHk7XHJcbiAgICAgICAgcmV0dXJuIHJlZ2lzdHJhdGlvbi5hY3RpdmU7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfZ2V0U2VydmljZVdvcmtlckNvbnRyb2xsZXIoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gKChfYSA9IG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udHJvbGxlcikgfHwgbnVsbDtcclxufVxyXG5mdW5jdGlvbiBfZ2V0V29ya2VyR2xvYmFsU2NvcGUoKSB7XHJcbiAgICByZXR1cm4gX2lzV29ya2VyKCkgPyBzZWxmIDogbnVsbDtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBEQl9OQU1FID0gJ2ZpcmViYXNlTG9jYWxTdG9yYWdlRGInO1xyXG5jb25zdCBEQl9WRVJTSU9OID0gMTtcclxuY29uc3QgREJfT0JKRUNUU1RPUkVfTkFNRSA9ICdmaXJlYmFzZUxvY2FsU3RvcmFnZSc7XHJcbmNvbnN0IERCX0RBVEFfS0VZUEFUSCA9ICdmYmFzZV9rZXknO1xyXG4vKipcclxuICogUHJvbWlzZSB3cmFwcGVyIGZvciBJREJSZXF1ZXN0XHJcbiAqXHJcbiAqIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgY2xlYW5seSBleHRlbmQgUHJvbWlzZTxUPiBzaW5jZSBwcm9taXNlcyBhcmUgbm90IGNhbGxhYmxlIGluIEVTNlxyXG4gKlxyXG4gKi9cclxuY2xhc3MgREJQcm9taXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xyXG4gICAgfVxyXG4gICAgdG9Qcm9taXNlKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlcXVlc3QucmVzdWx0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdCh0aGlzLnJlcXVlc3QuZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBnZXRPYmplY3RTdG9yZShkYiwgaXNSZWFkV3JpdGUpIHtcclxuICAgIHJldHVybiBkYlxyXG4gICAgICAgIC50cmFuc2FjdGlvbihbREJfT0JKRUNUU1RPUkVfTkFNRV0sIGlzUmVhZFdyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKVxyXG4gICAgICAgIC5vYmplY3RTdG9yZShEQl9PQkpFQ1RTVE9SRV9OQU1FKTtcclxufVxyXG5mdW5jdGlvbiBfZGVsZXRlRGF0YWJhc2UoKSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKERCX05BTUUpO1xyXG4gICAgcmV0dXJuIG5ldyBEQlByb21pc2UocmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbn1cclxuZnVuY3Rpb24gX29wZW5EYXRhYmFzZSgpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigndXBncmFkZW5lZWRlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGIgPSByZXF1ZXN0LnJlc3VsdDtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKERCX09CSkVDVFNUT1JFX05BTUUsIHsga2V5UGF0aDogREJfREFUQV9LRVlQQVRIIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRiID0gcmVxdWVzdC5yZXN1bHQ7XHJcbiAgICAgICAgICAgIC8vIFN0cmFuZ2UgYnVnIHRoYXQgb2NjdXJzIGluIEZpcmVmb3ggd2hlbiBtdWx0aXBsZSB0YWJzIGFyZSBvcGVuZWQgYXQgdGhlXHJcbiAgICAgICAgICAgIC8vIHNhbWUgdGltZS4gVGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgc2VlbXMgdG8gYmUgZGVsZXRpbmcgdGhlIGRhdGFiYXNlXHJcbiAgICAgICAgICAgIC8vIGFuZCByZS1pbml0aWFsaXppbmcgaXQuXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzYzNFxyXG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoREJfT0JKRUNUU1RPUkVfTkFNRSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2xvc2UgdGhlIGRhdGFiYXNlIG9yIGVsc2UgeW91IGdldCBhIGBibG9ja2VkYCBldmVudFxyXG4gICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IF9kZWxldGVEYXRhYmFzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShhd2FpdCBfb3BlbkRhdGFiYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9wdXRPYmplY3QoZGIsIGtleSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRPYmplY3RTdG9yZShkYiwgdHJ1ZSkucHV0KHtcclxuICAgICAgICBbREJfREFUQV9LRVlQQVRIXToga2V5LFxyXG4gICAgICAgIHZhbHVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBuZXcgREJQcm9taXNlKHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIGdldE9iamVjdChkYiwga2V5KSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIGZhbHNlKS5nZXQoa2V5KTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgREJQcm9taXNlKHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xyXG4gICAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLnZhbHVlO1xyXG59XHJcbmZ1bmN0aW9uIF9kZWxldGVPYmplY3QoZGIsIGtleSkge1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5kZWxldGUoa2V5KTtcclxuICAgIHJldHVybiBuZXcgREJQcm9taXNlKHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xyXG59XHJcbmNvbnN0IF9QT0xMSU5HX0lOVEVSVkFMX01TID0gODAwO1xyXG5jb25zdCBfVFJBTlNBQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xyXG5jbGFzcyBJbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudHlwZSA9IFwiTE9DQUxcIiAvKiBQZXJzaXN0ZW5jZVR5cGUuTE9DQUwgKi87XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkQWxsb3dNaWdyYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5sb2NhbENhY2hlID0ge307XHJcbiAgICAgICAgLy8gc2V0VGltZW91dCByZXR1cm4gdmFsdWUgaXMgcGxhdGZvcm0gc3BlY2lmaWNcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBlbmRpbmdXcml0ZXMgPSAwO1xyXG4gICAgICAgIHRoaXMucmVjZWl2ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VuZGVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlU2VydmljZVdvcmtlciA9IG51bGw7XHJcbiAgICAgICAgLy8gRmlyZSAmIGZvcmdldCB0aGUgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uIGFzIGl0IG1heSBuZXZlciByZXNvbHZlXHJcbiAgICAgICAgdGhpcy5fd29ya2VySW5pdGlhbGl6YXRpb25Qcm9taXNlID1cclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplU2VydmljZVdvcmtlck1lc3NhZ2luZygpLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX29wZW5EYigpIHtcclxuICAgICAgICBpZiAodGhpcy5kYikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYiA9IGF3YWl0IF9vcGVuRGF0YWJhc2UoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYjtcclxuICAgIH1cclxuICAgIGFzeW5jIF93aXRoUmV0cmllcyhvcCkge1xyXG4gICAgICAgIGxldCBudW1BdHRlbXB0cyA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5fb3BlbkRiKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgb3AoZGIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVtQXR0ZW1wdHMrKyA+IF9UUkFOU0FDVElPTl9SRVRSWV9DT1VOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRiID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGV4cG9uZW50aWFsIGJhY2tvZmZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW5kZXhlZERCIGV2ZW50cyBkbyBub3QgcHJvcGFnYXRlIGZyb20gdGhlIG1haW4gd2luZG93IHRvIHRoZSB3b3JrZXIgY29udGV4dC4gIFdlIHJlbHkgb24gYVxyXG4gICAgICogcG9zdE1lc3NhZ2UgaW50ZXJmYWNlIHRvIHNlbmQgdGhlc2UgZXZlbnRzIHRvIHRoZSB3b3JrZXIgb3Vyc2VsdmVzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2VydmljZVdvcmtlck1lc3NhZ2luZygpIHtcclxuICAgICAgICByZXR1cm4gX2lzV29ya2VyKCkgPyB0aGlzLmluaXRpYWxpemVSZWNlaXZlcigpIDogdGhpcy5pbml0aWFsaXplU2VuZGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFzIHRoZSB3b3JrZXIgd2Ugc2hvdWxkIGxpc3RlbiB0byBldmVudHMgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRpYWxpemVSZWNlaXZlcigpIHtcclxuICAgICAgICB0aGlzLnJlY2VpdmVyID0gUmVjZWl2ZXIuX2dldEluc3RhbmNlKF9nZXRXb3JrZXJHbG9iYWxTY29wZSgpKTtcclxuICAgICAgICAvLyBSZWZyZXNoIGZyb20gcGVyc2lzdGVuY2UgaWYgd2UgcmVjZWl2ZSBhIEtleUNoYW5nZWQgbWVzc2FnZS5cclxuICAgICAgICB0aGlzLnJlY2VpdmVyLl9zdWJzY3JpYmUoXCJrZXlDaGFuZ2VkXCIgLyogX0V2ZW50VHlwZS5LRVlfQ0hBTkdFRCAqLywgYXN5bmMgKF9vcmlnaW4sIGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuX3BvbGwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGtleVByb2Nlc3NlZDoga2V5cy5pbmNsdWRlcyhkYXRhLmtleSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBMZXQgdGhlIHNlbmRlciBrbm93IHRoYXQgd2UgYXJlIGxpc3RlbmluZyBzbyB0aGV5IGdpdmUgdXMgbW9yZSB0aW1lb3V0LlxyXG4gICAgICAgIHRoaXMucmVjZWl2ZXIuX3N1YnNjcmliZShcInBpbmdcIiAvKiBfRXZlbnRUeXBlLlBJTkcgKi8sIGFzeW5jIChfb3JpZ2luLCBfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gW1wia2V5Q2hhbmdlZFwiIC8qIF9FdmVudFR5cGUuS0VZX0NIQU5HRUQgKi9dO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcyB0aGUgbWFpbiB3aW5kb3csIHdlIHNob3VsZCBsZXQgdGhlIHdvcmtlciBrbm93IHdoZW4ga2V5cyBjaGFuZ2UgKHNldCBhbmQgcmVtb3ZlKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2aWNlV29ya2VyQ29udGFpbmVyL3JlYWR5IHwgU2VydmljZVdvcmtlckNvbnRhaW5lci5yZWFkeX1cclxuICAgICAqIG1heSBub3QgcmVzb2x2ZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNlbmRlcigpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBzZXJ2aWNlIHdvcmtlci5cclxuICAgICAgICB0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgPSBhd2FpdCBfZ2V0QWN0aXZlU2VydmljZVdvcmtlcigpO1xyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZW5kZXIgPSBuZXcgU2VuZGVyKHRoaXMuYWN0aXZlU2VydmljZVdvcmtlcik7XHJcbiAgICAgICAgLy8gUGluZyB0aGUgc2VydmljZSB3b3JrZXIgdG8gY2hlY2sgd2hhdCBldmVudHMgdGhleSBjYW4gaGFuZGxlLlxyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlbmRlci5fc2VuZChcInBpbmdcIiAvKiBfRXZlbnRUeXBlLlBJTkcgKi8sIHt9LCA4MDAgLyogX1RpbWVvdXREdXJhdGlvbi5MT05HX0FDSyAqLyk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCgoX2EgPSByZXN1bHRzWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZnVsZmlsbGVkKSAmJlxyXG4gICAgICAgICAgICAoKF9iID0gcmVzdWx0c1swXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZhbHVlLmluY2x1ZGVzKFwia2V5Q2hhbmdlZFwiIC8qIF9FdmVudFR5cGUuS0VZX0NIQU5HRUQgKi8pKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMZXQgdGhlIHdvcmtlciBrbm93IGFib3V0IGEgY2hhbmdlZCBrZXksIHRoZSBleGFjdCBrZXkgZG9lc24ndCB0ZWNobmljYWxseSBtYXR0ZXIgc2luY2UgdGhlXHJcbiAgICAgKiB3b3JrZXIgd2lsbCBqdXN0IHRyaWdnZXIgYSBmdWxsIHN5bmMgYW55d2F5LlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgb25lIHNlcnZpY2Ugd29ya2VyIHBlciBwYWdlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBrZXkgLSBTdG9yYWdlIGtleSB3aGljaCBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBub3RpZnlTZXJ2aWNlV29ya2VyKGtleSkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZW5kZXIgfHxcclxuICAgICAgICAgICAgIXRoaXMuYWN0aXZlU2VydmljZVdvcmtlciB8fFxyXG4gICAgICAgICAgICBfZ2V0U2VydmljZVdvcmtlckNvbnRyb2xsZXIoKSAhPT0gdGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kZXIuX3NlbmQoXCJrZXlDaGFuZ2VkXCIgLyogX0V2ZW50VHlwZS5LRVlfQ0hBTkdFRCAqLywgeyBrZXkgfSwgXHJcbiAgICAgICAgICAgIC8vIFVzZSBsb25nIHRpbWVvdXQgaWYgcmVjZWl2ZXIgaGFzIHByZXZpb3VzbHkgcmVzcG9uZGVkIHRvIGEgcGluZyBmcm9tIHVzLlxyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZVxyXG4gICAgICAgICAgICAgICAgPyA4MDAgLyogX1RpbWVvdXREdXJhdGlvbi5MT05HX0FDSyAqL1xyXG4gICAgICAgICAgICAgICAgOiA1MCAvKiBfVGltZW91dER1cmF0aW9uLkFDSyAqLyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgYmVzdCBlZmZvcnQgYXBwcm9hY2guIElnbm9yZSBlcnJvcnMuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX2lzQXZhaWxhYmxlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghaW5kZXhlZERCKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IF9wdXRPYmplY3QoZGIsIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSwgJzEnKTtcclxuICAgICAgICAgICAgYXdhaXQgX2RlbGV0ZU9iamVjdChkYiwgU1RPUkFHRV9BVkFJTEFCTEVfS0VZKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChfYSkgeyB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3dpdGhQZW5kaW5nV3JpdGUod3JpdGUpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdXcml0ZXMrKztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB3cml0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzLS07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXN5bmMgX3NldChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpdGhQZW5kaW5nV3JpdGUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGIpID0+IF9wdXRPYmplY3QoZGIsIGtleSwgdmFsdWUpKTtcclxuICAgICAgICAgICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm90aWZ5U2VydmljZVdvcmtlcihrZXkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBvYmogPSAoYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiKSA9PiBnZXRPYmplY3QoZGIsIGtleSkpKTtcclxuICAgICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IG9iajtcclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3JlbW92ZShrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2l0aFBlbmRpbmdXcml0ZShhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYikgPT4gX2RlbGV0ZU9iamVjdChkYiwga2V5KSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm90aWZ5U2VydmljZVdvcmtlcihrZXkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgX3BvbGwoKSB7XHJcbiAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgd2UgbmVlZCB0byBmYWxsYmFjayBpZiBnZXRBbGwgaXMgbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBnZXRBbGxSZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIGZhbHNlKS5nZXRBbGwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEQlByb21pc2UoZ2V0QWxsUmVxdWVzdCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd3JpdGVzIGluIHByb2dyZXNzIGFib3J0LCB3ZSdsbCBnZXQgcGlja2VkIHVwIG9uIHRoZSBuZXh0IHBvbGxcclxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nV3JpdGVzICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGtleXNJblJlc3VsdCA9IG5ldyBTZXQoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHsgZmJhc2Vfa2V5OiBrZXksIHZhbHVlIH0gb2YgcmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGtleXNJblJlc3VsdC5hZGQoa2V5KTtcclxuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMubG9jYWxDYWNoZVtrZXldKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgbG9jYWxLZXkgb2YgT2JqZWN0LmtleXModGhpcy5sb2NhbENhY2hlKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2NhbENhY2hlW2xvY2FsS2V5XSAmJiAha2V5c0luUmVzdWx0Lmhhcyhsb2NhbEtleSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERlbGV0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGxvY2FsS2V5LCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaChsb2NhbEtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9XHJcbiAgICBub3RpZnlMaXN0ZW5lcnMoa2V5LCBuZXdWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gbmV3VmFsdWU7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNba2V5XTtcclxuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgQXJyYXkuZnJvbShsaXN0ZW5lcnMpKSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdGFydFBvbGxpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4gdGhpcy5fcG9sbCgpLCBfUE9MTElOR19JTlRFUlZBTF9NUyk7XHJcbiAgICB9XHJcbiAgICBzdG9wUG9sbGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBfYWRkTGlzdGVuZXIoa2V5LCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldID0gbmV3IFNldCgpO1xyXG4gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXHJcbiAgICAgICAgICAgIHZvaWQgdGhpcy5fZ2V0KGtleSk7IC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgYmFja2dyb3VuZCBhc3luYyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseS5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5hZGQobGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgX3JlbW92ZUxpc3RlbmVyKGtleSwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldLmRlbGV0ZShsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1trZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuSW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZS50eXBlID0gJ0xPQ0FMJztcclxuLyoqXHJcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBpbmRleGVkREJgXHJcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlID0gSW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gc3RhcnRTaWduSW5QaG9uZU1mYShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhU2lnbkluOnN0YXJ0XCIgLyogRW5kcG9pbnQuU1RBUlRfTUZBX1NJR05fSU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gZmluYWxpemVTaWduSW5QaG9uZU1mYShhdXRoLCByZXF1ZXN0KSB7XHJcbiAgICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0KGF1dGgsIFwiUE9TVFwiIC8qIEh0dHBNZXRob2QuUE9TVCAqLywgXCIvdjIvYWNjb3VudHMvbWZhU2lnbkluOmZpbmFsaXplXCIgLyogRW5kcG9pbnQuRklOQUxJWkVfTUZBX1NJR05fSU4gKi8sIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KSk7XHJcbn1cclxuZnVuY3Rpb24gZmluYWxpemVTaWduSW5Ub3RwTWZhKGF1dGgsIHJlcXVlc3QpIHtcclxuICAgIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3QoYXV0aCwgXCJQT1NUXCIgLyogSHR0cE1ldGhvZC5QT1NUICovLCBcIi92Mi9hY2NvdW50cy9tZmFTaWduSW46ZmluYWxpemVcIiAvKiBFbmRwb2ludC5GSU5BTElaRV9NRkFfU0lHTl9JTiAqLywgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBfU09MVkVfVElNRV9NUyA9IDUwMDtcclxuY29uc3QgX0VYUElSQVRJT05fVElNRV9NUyA9IDYwMDAwO1xyXG5jb25zdCBfV0lER0VUX0lEX1NUQVJUID0gMTAwMDAwMDAwMDAwMDtcclxuY2xhc3MgTW9ja1JlQ2FwdGNoYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLmNvdW50ZXIgPSBfV0lER0VUX0lEX1NUQVJUO1xyXG4gICAgICAgIHRoaXMuX3dpZGdldHMgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoY29udGFpbmVyLCBwYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmNvdW50ZXI7XHJcbiAgICAgICAgdGhpcy5fd2lkZ2V0cy5zZXQoaWQsIG5ldyBNb2NrV2lkZ2V0KGNvbnRhaW5lciwgdGhpcy5hdXRoLm5hbWUsIHBhcmFtZXRlcnMgfHwge30pKTtcclxuICAgICAgICB0aGlzLmNvdW50ZXIrKztcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9XHJcbiAgICByZXNldChvcHRXaWRnZXRJZCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBjb25zdCBpZCA9IG9wdFdpZGdldElkIHx8IF9XSURHRVRfSURfU1RBUlQ7XHJcbiAgICAgICAgdm9pZCAoKF9hID0gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVsZXRlKCkpO1xyXG4gICAgICAgIHRoaXMuX3dpZGdldHMuZGVsZXRlKGlkKTtcclxuICAgIH1cclxuICAgIGdldFJlc3BvbnNlKG9wdFdpZGdldElkKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcclxuICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuX3dpZGdldHMuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldFJlc3BvbnNlKCkpIHx8ICcnO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgZXhlY3V0ZShvcHRXaWRnZXRJZCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBjb25zdCBpZCA9IG9wdFdpZGdldElkIHx8IF9XSURHRVRfSURfU1RBUlQ7XHJcbiAgICAgICAgdm9pZCAoKF9hID0gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXhlY3V0ZSgpKTtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgTW9ja1dpZGdldCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJPcklkLCBhcHBOYW1lLCBwYXJhbXMpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICB0aGlzLnRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VUb2tlbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jbGlja0hhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdHlwZW9mIGNvbnRhaW5lck9ySWQgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyT3JJZClcclxuICAgICAgICAgICAgOiBjb250YWluZXJPcklkO1xyXG4gICAgICAgIF9hc3NlcnQoY29udGFpbmVyLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLywgeyBhcHBOYW1lIH0pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdGhpcy5wYXJhbXMuc2l6ZSAhPT0gJ2ludmlzaWJsZSc7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVG9rZW47XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXJJZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBleGVjdXRlKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcclxuICAgICAgICBpZiAodGhpcy50aW1lcklkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg1MCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssICdleHBpcmVkLWNhbGxiYWNrJzogZXhwaXJlZENhbGxiYWNrIH0gPSB0aGlzLnBhcmFtcztcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMucmVzcG9uc2VUb2tlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUb2tlbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhwaXJlZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBfRVhQSVJBVElPTl9USU1FX01TKTtcclxuICAgICAgICB9LCBfU09MVkVfVElNRV9NUyk7XHJcbiAgICB9XHJcbiAgICBjaGVja0lmRGVsZXRlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVDQVBUQ0hBIG1vY2sgd2FzIGFscmVhZHkgZGVsZXRlZCEnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcobGVuKSB7XHJcbiAgICBjb25zdCBjaGFycyA9IFtdO1xyXG4gICAgY29uc3QgYWxsb3dlZENoYXJzID0gJzEyMzQ1Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjaGFycy5wdXNoKGFsbG93ZWRDaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsb3dlZENoYXJzLmxlbmd0aCkpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBSZUNhcHRjaGEgd2lsbCBsb2FkIHVzaW5nIHRoZSBzYW1lIGNhbGxiYWNrLCBzbyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbmVlZHNcclxuLy8gdG8gYmUga2VwdCBhcm91bmRcclxuY29uc3QgX0pTTE9BRF9DQUxMQkFDSyA9IF9nZW5lcmF0ZUNhbGxiYWNrTmFtZSgncmNiJyk7XHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVF9ERUxBWSA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG5jb25zdCBSRUNBUFRDSEFfQkFTRSA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanM/JztcclxuLyoqXHJcbiAqIExvYWRlciBmb3IgdGhlIEdSZUNhcHRjaGEgbGlicmFyeS4gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgb2YgdGhpcy5cclxuICovXHJcbmNsYXNzIFJlQ2FwdGNoYUxvYWRlckltcGwge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gJyc7XHJcbiAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDaGVjayBmb3IgYHJlbmRlcigpYCBtZXRob2QuIGB3aW5kb3cuZ3JlY2FwdGNoYWAgd2lsbCBleGlzdCBpZiB0aGUgRW50ZXJwcmlzZVxyXG4gICAgICAgICAqIHZlcnNpb24gb2YgdGhlIFJlQ0FQVENIQSBzY3JpcHQgd2FzIGxvYWRlZCBieSBzb21lb25lIGVsc2UgKGUuZy4gQXBwIENoZWNrKSBidXRcclxuICAgICAgICAgKiBgd2luZG93LmdyZWNhcHRjaGEucmVuZGVyKClgIHdpbGwgbm90LiBBbm90aGVyIGxvYWQgd2lsbCBhZGQgaXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saWJyYXJ5U2VwYXJhdGVseUxvYWRlZCA9ICEhKChfYSA9IF93aW5kb3coKS5ncmVjYXB0Y2hhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVuZGVyKTtcclxuICAgIH1cclxuICAgIGxvYWQoYXV0aCwgaGwgPSAnJykge1xyXG4gICAgICAgIF9hc3NlcnQoaXNIb3N0TGFuZ3VhZ2VWYWxpZChobCksIGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBpZiAodGhpcy5zaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpICYmIGlzVjIoX3dpbmRvdygpLmdyZWNhcHRjaGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3dpbmRvdygpLmdyZWNhcHRjaGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovKSk7XHJcbiAgICAgICAgICAgIH0sIE5FVFdPUktfVElNRU9VVF9ERUxBWS5nZXQoKSk7XHJcbiAgICAgICAgICAgIF93aW5kb3coKVtfSlNMT0FEX0NBTExCQUNLXSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIF93aW5kb3coKS5jbGVhclRpbWVvdXQobmV0d29ya1RpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIF93aW5kb3coKVtfSlNMT0FEX0NBTExCQUNLXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY2FwdGNoYSA9IF93aW5kb3coKS5ncmVjYXB0Y2hhO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZWNhcHRjaGEgfHwgIWlzVjIocmVjYXB0Y2hhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBncmVwdGNoYSByZW5kZXIgZnVuY3Rpb24gc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBkZXZlbG9wZXIgaGFzXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxsZWQgaXQgc2VwYXJhdGVseVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyID0gcmVjYXB0Y2hhLnJlbmRlcjtcclxuICAgICAgICAgICAgICAgIHJlY2FwdGNoYS5yZW5kZXIgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHJlbmRlcihjb250YWluZXIsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldElkO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gaGw7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlY2FwdGNoYSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke1JFQ0FQVENIQV9CQVNFfT8ke3F1ZXJ5c3RyaW5nKHtcclxuICAgICAgICAgICAgICAgIG9ubG9hZDogX0pTTE9BRF9DQUxMQkFDSyxcclxuICAgICAgICAgICAgICAgIHJlbmRlcjogJ2V4cGxpY2l0JyxcclxuICAgICAgICAgICAgICAgIGhsXHJcbiAgICAgICAgICAgIH0pfWA7XHJcbiAgICAgICAgICAgIF9sb2FkSlModXJsKS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQobmV0d29ya1RpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNsZWFyZWRPbmVJbnN0YW5jZSgpIHtcclxuICAgICAgICB0aGlzLmNvdW50ZXItLTtcclxuICAgIH1cclxuICAgIHNob3VsZFJlc29sdmVJbW1lZGlhdGVseShobCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICAvLyBXZSBjYW4gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZjpcclxuICAgICAgICAvLyAgIOKAoiBncmVjYXB0Y2hhIGlzIGFscmVhZHkgZGVmaW5lZCBBTkQgKFxyXG4gICAgICAgIC8vICAgICAxLiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIGNvZGVzIGFyZSB0aGUgc2FtZSBPUlxyXG4gICAgICAgIC8vICAgICAyLiB0aGVyZSBleGlzdHMgYWxyZWFkeSBhIFJlQ2FwdGNoYSBvbiB0aGUgcGFnZVxyXG4gICAgICAgIC8vICAgICAzLiB0aGUgbGlicmFyeSB3YXMgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGFwcFxyXG4gICAgICAgIC8vIEluIGNhc2VzICgyKSBhbmQgKDMpLCB3ZSBfY2FuJ3RfIHJlbG9hZCBhcyBpdCB3b3VsZCBicmVhayB0aGUgcmVjYXB0Y2hhc1xyXG4gICAgICAgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBhZ2VcclxuICAgICAgICByZXR1cm4gKCEhKChfYSA9IF93aW5kb3coKS5ncmVjYXB0Y2hhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVuZGVyKSAmJlxyXG4gICAgICAgICAgICAoaGwgPT09IHRoaXMuaG9zdExhbmd1YWdlIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIgPiAwIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpYnJhcnlTZXBhcmF0ZWx5TG9hZGVkKSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gaXNIb3N0TGFuZ3VhZ2VWYWxpZChobCkge1xyXG4gICAgcmV0dXJuIGhsLmxlbmd0aCA8PSA2ICYmIC9eXFxzKlthLXpBLVowLTlcXC1dKlxccyokLy50ZXN0KGhsKTtcclxufVxyXG5jbGFzcyBNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCB7XHJcbiAgICBhc3luYyBsb2FkKGF1dGgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1vY2tSZUNhcHRjaGEoYXV0aCk7XHJcbiAgICB9XHJcbiAgICBjbGVhcmVkT25lSW5zdGFuY2UoKSB7IH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBSRUNBUFRDSEFfVkVSSUZJRVJfVFlQRSA9ICdyZWNhcHRjaGEnO1xyXG5jb25zdCBERUZBVUxUX1BBUkFNUyA9IHtcclxuICAgIHRoZW1lOiAnbGlnaHQnLFxyXG4gICAgdHlwZTogJ2ltYWdlJ1xyXG59O1xyXG4vKipcclxuICogQW4ge0BsaW5rIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhLyB8IHJlQ0FQVENIQX0tYmFzZWQgYXBwbGljYXRpb24gdmVyaWZpZXIuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFJlY2FwdGNoYVZlcmlmaWVyIHtcclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250YWluZXJPcklkIC0gVGhlIHJlQ0FQVENIQSBjb250YWluZXIgcGFyYW1ldGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBUaGlzIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmVDQVBUQ0hBIGlzIGhpZGRlbiBvciB2aXNpYmxlLiBGb3IgYVxyXG4gICAgICogdmlzaWJsZSByZUNBUFRDSEEgdGhlIGNvbnRhaW5lciBtdXN0IGJlIGVtcHR5LiBJZiBhIHN0cmluZyBpcyB1c2VkLCBpdCBoYXMgdG8gY29ycmVzcG9uZCB0b1xyXG4gICAgICogYW4gZWxlbWVudCBJRC4gVGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBtdXN0IGFsc28gbXVzdCBiZSBpbiB0aGUgRE9NIGF0IHRoZSB0aW1lIG9mXHJcbiAgICAgKiBpbml0aWFsaXphdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIFRoZSBvcHRpb25hbCByZUNBUFRDSEEgcGFyYW1ldGVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogQ2hlY2sgdGhlIHJlQ0FQVENIQSBkb2NzIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gQWxsIHBhcmFtZXRlcnMgYXJlIGFjY2VwdGVkIGV4Y2VwdCBmb3JcclxuICAgICAqIHRoZSBzaXRla2V5LiBGaXJlYmFzZSBBdXRoIGJhY2tlbmQgcHJvdmlzaW9ucyBhIHJlQ0FQVENIQSBmb3IgZWFjaCBwcm9qZWN0IGFuZCB3aWxsXHJcbiAgICAgKiBjb25maWd1cmUgdGhpcyB1cG9uIHJlbmRlcmluZy4gRm9yIGFuIGludmlzaWJsZSByZUNBUFRDSEEsIGEgc2l6ZSBrZXkgbXVzdCBoYXZlIHRoZSB2YWx1ZVxyXG4gICAgICogJ2ludmlzaWJsZScuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGF1dGhFeHRlcm4gLSBUaGUgY29ycmVzcG9uZGluZyBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lck9ySWQsIHBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUyksIGF1dGhFeHRlcm4pIHtcclxuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiB2ZXJpZmllciB0eXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHJlbWFya3NcclxuICAgICAgICAgKiBGb3IgYSByZUNBUFRDSEEgdmVyaWZpZXIsIHRoaXMgaXMgJ3JlY2FwdGNoYScuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEU7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLndpZGdldElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZWNhcHRjaGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoRXh0ZXJuKTtcclxuICAgICAgICB0aGlzLmlzSW52aXNpYmxlID0gdGhpcy5wYXJhbWV0ZXJzLnNpemUgPT09ICdpbnZpc2libGUnO1xyXG4gICAgICAgIF9hc3NlcnQodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJywgdGhpcy5hdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovKTtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxyXG4gICAgICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XHJcbiAgICAgICAgX2Fzc2VydChjb250YWluZXIsIHRoaXMuYXV0aCwgXCJhcmd1bWVudC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IgKi8pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgICAgIHRoaXMucGFyYW1ldGVycy5jYWxsYmFjayA9IHRoaXMubWFrZVRva2VuQ2FsbGJhY2sodGhpcy5wYXJhbWV0ZXJzLmNhbGxiYWNrKTtcclxuICAgICAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIgPSB0aGlzLmF1dGguc2V0dGluZ3MuYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nXHJcbiAgICAgICAgICAgID8gbmV3IE1vY2tSZUNhcHRjaGFMb2FkZXJJbXBsKClcclxuICAgICAgICAgICAgOiBuZXcgUmVDYXB0Y2hhTG9hZGVySW1wbCgpO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVTdGFydGluZ1N0YXRlKCk7XHJcbiAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCBpZiBzZGsgdmVyc2lvbiBpcyBuZWVkZWRcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogV2FpdHMgZm9yIHRoZSB1c2VyIHRvIHNvbHZlIHRoZSByZUNBUFRDSEEgYW5kIHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB0b2tlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSByZUNBUFRDSEEgdG9rZW4uXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHZlcmlmeSgpIHtcclxuICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xyXG4gICAgICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5yZW5kZXIoKTtcclxuICAgICAgICBjb25zdCByZWNhcHRjaGEgPSB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZWNhcHRjaGEuZ2V0UmVzcG9uc2UoaWQpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdG9rZW5DaGFuZ2UgPSAodG9rZW4pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIElnbm9yZSB0b2tlbiBleHBpcmF0aW9ucy5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuZGVsZXRlKHRva2VuQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodG9rZW4pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzLmFkZCh0b2tlbkNoYW5nZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZWNhcHRjaGEuZXhlY3V0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgcmVDQVBUQ0hBIHdpZGdldCBvbiB0aGUgcGFnZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZUNBUFRDSEEgd2lkZ2V0IElELlxyXG4gICAgICovXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHByb21pc2UuIFNpbmNlIGl0J3Mgbm90IGFzeW5jICh3ZSB3YW50IHRvIHJldHVybiB0aGVcclxuICAgICAgICAgICAgLy8gX3NhbWVfIHByb21pc2UgaWYgcmVuZGVyaW5nIGlzIHN0aWxsIG9jY3VycmluZyksIHRoZSBBUEkgc3VyZmFjZSBzaG91bGRcclxuICAgICAgICAgICAgLy8gcmVqZWN0IHdpdGggdGhlIGVycm9yIHJhdGhlciB0aGFuIGp1c3QgdGhyb3dcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyUHJvbWlzZSA9IHRoaXMubWFrZVJlbmRlclByb21pc2UoKS5jYXRjaChlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJQcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJQcm9taXNlO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX3Jlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlc2V0KHRoaXMud2lkZ2V0SWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSByZUNBUFRDSEEgd2lkZ2V0IGZyb20gdGhlIHBhZ2UgYW5kIGRlc3Ryb3lzIHRoZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcmVjYXB0Y2hhTG9hZGVyLmNsZWFyZWRPbmVJbnN0YW5jZSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFsaWRhdGVTdGFydGluZ1N0YXRlKCkge1xyXG4gICAgICAgIF9hc3NlcnQoIXRoaXMucGFyYW1ldGVycy5zaXRla2V5LCB0aGlzLmF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMuaXNJbnZpc2libGUgfHwgIXRoaXMuY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSwgdGhpcy5hdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLCB0aGlzLmF1dGgsIFwib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi8pO1xyXG4gICAgfVxyXG4gICAgbWFrZVRva2VuQ2FsbGJhY2soZXhpc3RpbmcpIHtcclxuICAgICAgICByZXR1cm4gdG9rZW4gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIodG9rZW4pKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZXhpc3RpbmcodG9rZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEZ1bmMgPSBfd2luZG93KClbZXhpc3RpbmddO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxGdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRnVuYyh0b2tlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYXNzZXJ0Tm90RGVzdHJveWVkKCkge1xyXG4gICAgICAgIF9hc3NlcnQoIXRoaXMuZGVzdHJveWVkLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG1ha2VSZW5kZXJQcm9taXNlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy53aWRnZXRJZCkge1xyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3VhcmFudGVlZEVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ3VhcmFudGVlZEVtcHR5KTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGd1YXJhbnRlZWRFbXB0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLndpZGdldElkID0gdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlbmRlcihjb250YWluZXIsIHRoaXMucGFyYW1ldGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLndpZGdldElkO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICBfYXNzZXJ0KF9pc0h0dHBPckh0dHBzKCkgJiYgIV9pc1dvcmtlcigpLCB0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICBhd2FpdCBkb21SZWFkeSgpO1xyXG4gICAgICAgIHRoaXMucmVjYXB0Y2hhID0gYXdhaXQgdGhpcy5fcmVjYXB0Y2hhTG9hZGVyLmxvYWQodGhpcy5hdXRoLCB0aGlzLmF1dGgubGFuZ3VhZ2VDb2RlIHx8IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3Qgc2l0ZUtleSA9IGF3YWl0IGdldFJlY2FwdGNoYVBhcmFtcyh0aGlzLmF1dGgpO1xyXG4gICAgICAgIF9hc3NlcnQoc2l0ZUtleSwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXkgPSBzaXRlS2V5O1xyXG4gICAgfVxyXG4gICAgZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEoKSB7XHJcbiAgICAgICAgX2Fzc2VydCh0aGlzLnJlY2FwdGNoYSwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjYXB0Y2hhO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGRvbVJlYWR5KCkge1xyXG4gICAgbGV0IHJlc29sdmVyID0gbnVsbDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG9jdW1lbnQgbm90IHJlYWR5LCB3YWl0IGZvciBsb2FkIGJlZm9yZSByZXNvbHZpbmcuXHJcbiAgICAgICAgLy8gU2F2ZSByZXNvbHZlciwgc28gd2UgY2FuIHJlbW92ZSBsaXN0ZW5lciBpbiBjYXNlIGl0IHdhcyBleHRlcm5hbGx5XHJcbiAgICAgICAgLy8gY2FuY2VsbGVkLlxyXG4gICAgICAgIHJlc29sdmVyID0gKCkgPT4gcmVzb2x2ZSgpO1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih2ZXJpZmljYXRpb25JZCwgb25Db25maXJtYXRpb24pIHtcclxuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbklkID0gdmVyaWZpY2F0aW9uSWQ7XHJcbiAgICAgICAgdGhpcy5vbkNvbmZpcm1hdGlvbiA9IG9uQ29uZmlybWF0aW9uO1xyXG4gICAgfVxyXG4gICAgY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKHRoaXMudmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uQ29uZmlybWF0aW9uKGF1dGhDcmVkZW50aWFsKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgY29kZSB2aWEgU01TIHRvIHRoZSBnaXZlblxyXG4gKiBwaG9uZSBudW1iZXIsIGFuZCByZXR1cm5zIGEge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdH0uIEFmdGVyIHRoZSB1c2VyXHJcbiAqIHByb3ZpZGVzIHRoZSBjb2RlIHNlbnQgdG8gdGhlaXIgcGhvbmUsIGNhbGwge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtfVxyXG4gKiB3aXRoIHRoZSBjb2RlIHRvIHNpZ24gdGhlIHVzZXIgaW4uXHJcbiAqXHJcbiAqIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbiwge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfS5cclxuICogVGhpcyBmdW5jdGlvbiBjYW4gd29yayBvbiBvdGhlciBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVcclxuICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfSAobGlrZSBSZWFjdCBOYXRpdmUpLCBidXQgeW91IG5lZWQgdG8gdXNlIGFcclxuICogdGhpcmQtcGFydHkge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9IGltcGxlbWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxyXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IGZpcmViYXNlLmF1dGguUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcclxuICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcclxuICogLy8gT2J0YWluIGEgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gKiBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIsIGFwcFZlcmlmaWVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihhdXRoSW50ZXJuYWwsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoSW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXHJcbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxyXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBob25lTnVtYmVyKHVzZXIsIHBob25lTnVtYmVyLCBhcHBWZXJpZmllcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBcInBob25lXCIgLyogUHJvdmlkZXJJZC5QSE9ORSAqLyk7XHJcbiAgICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcih1c2VySW50ZXJuYWwuYXV0aCwgcGhvbmVOdW1iZXIsIGdldE1vZHVsYXJJbnN0YW5jZShhcHBWZXJpZmllcikpO1xyXG4gICAgcmV0dXJuIG5ldyBDb25maXJtYXRpb25SZXN1bHRJbXBsKHZlcmlmaWNhdGlvbklkLCBjcmVkID0+IGxpbmtXaXRoQ3JlZGVudGlhbCh1c2VySW50ZXJuYWwsIGNyZWQpKTtcclxufVxyXG4vKipcclxuICogUmUtYXV0aGVudGljYXRlcyBhIHVzZXIgdXNpbmcgYSBmcmVzaCBwaG9uZSBjcmVkZW50aWFsLlxyXG4gKlxyXG4gKiBAcmVtYXJrcyBVc2UgYmVmb3JlIG9wZXJhdGlvbnMgc3VjaCBhcyB7QGxpbmsgdXBkYXRlUGFzc3dvcmR9IHRoYXQgcmVxdWlyZSB0b2tlbnMgZnJvbSByZWNlbnQgc2lnbi1pbiBhdHRlbXB0cy5cclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHBob25lTnVtYmVyIC0gVGhlIHVzZXIncyBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0IChlLmcuICsxNjUwNTU1MDEwMSkuXHJcbiAqIEBwYXJhbSBhcHBWZXJpZmllciAtIFRoZSB7QGxpbmsgQXBwbGljYXRpb25WZXJpZmllcn0uXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyKHVzZXIsIHBob25lTnVtYmVyLCBhcHBWZXJpZmllcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBfdmVyaWZ5UGhvbmVOdW1iZXIodXNlckludGVybmFsLmF1dGgsIHBob25lTnVtYmVyLCBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIpKTtcclxuICAgIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PiByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKHVzZXJJbnRlcm5hbCwgY3JlZCkpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdmVyaWZpY2F0aW9uIElEIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgU01TIGNvZGUgdGhhdCBpcyBzZW50LlxyXG4gKlxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3ZlcmlmeVBob25lTnVtYmVyKGF1dGgsIG9wdGlvbnMsIHZlcmlmaWVyKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICBjb25zdCByZWNhcHRjaGFUb2tlbiA9IGF3YWl0IHZlcmlmaWVyLnZlcmlmeSgpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiByZWNhcHRjaGFUb2tlbiA9PT0gJ3N0cmluZycsIGF1dGgsIFwiYXJndW1lbnQtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SICovKTtcclxuICAgICAgICBfYXNzZXJ0KHZlcmlmaWVyLnR5cGUgPT09IFJFQ0FQVENIQV9WRVJJRklFUl9UWVBFLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgbGV0IHBob25lSW5mb09wdGlvbnM7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwaG9uZUluZm9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IG9wdGlvbnNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBob25lSW5mb09wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJ3Nlc3Npb24nIGluIHBob25lSW5mb09wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHBob25lSW5mb09wdGlvbnMuc2Vzc2lvbjtcclxuICAgICAgICAgICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgX2Fzc2VydChzZXNzaW9uLnR5cGUgPT09IFwiZW5yb2xsXCIgLyogTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEwgKi8sIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRFbnJvbGxQaG9uZU1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWRUb2tlbjogc2Vzc2lvbi5jcmVkZW50aWFsLFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lRW5yb2xsbWVudEluZm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IHBob25lSW5mb09wdGlvbnMucGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVTZXNzaW9uSW5mby5zZXNzaW9uSW5mbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF9hc3NlcnQoc2Vzc2lvbi50eXBlID09PSBcInNpZ25pblwiIC8qIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTiAqLywgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWZhRW5yb2xsbWVudElkID0gKChfYSA9IHBob25lSW5mb09wdGlvbnMubXVsdGlGYWN0b3JIaW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudWlkKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHBob25lSW5mb09wdGlvbnMubXVsdGlGYWN0b3JVaWQ7XHJcbiAgICAgICAgICAgICAgICBfYXNzZXJ0KG1mYUVucm9sbG1lbnRJZCwgYXV0aCwgXCJtaXNzaW5nLW11bHRpLWZhY3Rvci1pbmZvXCIgLyogQXV0aEVycm9yQ29kZS5NSVNTSU5HX01GQV9JTkZPICovKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRTaWduSW5QaG9uZU1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHNlc3Npb24uY3JlZGVudGlhbCxcclxuICAgICAgICAgICAgICAgICAgICBtZmFFbnJvbGxtZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcGhvbmVTaWduSW5JbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FwdGNoYVRva2VuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVSZXNwb25zZUluZm8uc2Vzc2lvbkluZm87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2Vzc2lvbkluZm8gfSA9IGF3YWl0IHNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUoYXV0aCwge1xyXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IHBob25lSW5mb09wdGlvbnMucGhvbmVOdW1iZXIsXHJcbiAgICAgICAgICAgICAgICByZWNhcHRjaGFUb2tlblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25JbmZvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHZlcmlmaWVyLl9yZXNldCgpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBcclxuICogLy8gJ3JlY2FwdGNoYS1jb250YWluZXInIGlzIHRoZSBJRCBvZiBhbiBlbGVtZW50IGluIHRoZSBET00uXHJcbiAqIGNvbnN0IGFwcGxpY2F0aW9uVmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIoJysxNjUwNTU1MDEwMScsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xyXG4gKiAvLyBPYnRhaW4gdGhlIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogY29uc3QgcGhvbmVDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAqIGF3YWl0IHVwZGF0ZVBob25lTnVtYmVyKHVzZXIsIHBob25lQ3JlZGVudGlhbCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIEEgY3JlZGVudGlhbCBhdXRoZW50aWNhdGluZyB0aGUgbmV3IHBob25lIG51bWJlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGhvbmVOdW1iZXIodXNlciwgY3JlZGVudGlhbCkge1xyXG4gICAgYXdhaXQgX2xpbmskMShnZXRNb2R1bGFySW5zdGFuY2UodXNlciksIGNyZWRlbnRpYWwpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgUGhvbmVBdXRoQ3JlZGVudGlhbH0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gJ3JlY2FwdGNoYS1jb250YWluZXInIGlzIHRoZSBJRCBvZiBhbiBlbGVtZW50IGluIHRoZSBET00uXHJcbiAqIGNvbnN0IGFwcGxpY2F0aW9uVmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XHJcbiAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIoJysxNjUwNTU1MDEwMScsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xyXG4gKiAvLyBPYnRhaW4gdGhlIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cclxuICogY29uc3QgcGhvbmVDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgcGhvbmVDcmVkZW50aWFsKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFBob25lQXV0aFByb3ZpZGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGF1dGggLSBUaGUgRmlyZWJhc2Uge0BsaW5rIEF1dGh9IGluc3RhbmNlIGluIHdoaWNoIHNpZ24taW5zIHNob3VsZCBvY2N1ci5cclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXHJcbiAgICAgICAgdGhpcy5wcm92aWRlcklkID0gUGhvbmVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogU3RhcnRzIGEgcGhvbmUgbnVtYmVyIGF1dGhlbnRpY2F0aW9uIGZsb3cgYnkgc2VuZGluZyBhIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHRoZSBnaXZlbiBwaG9uZVxyXG4gICAgICogbnVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcclxuICAgICAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIocGhvbmVOdW1iZXIsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xyXG4gICAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cclxuICAgICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAgICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSBmbG93IGlzIHByb3ZpZGVkIHVzaW5nIHRoZSBgc2lnbkluV2l0aFBob25lTnVtYmVyYCBtZXRob2QuXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBjb25zdCBjb25maXJtYXRpb25SZXN1bHQgPSBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xyXG4gICAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGhvbmVJbmZvT3B0aW9ucyAtIFRoZSB1c2VyJ3Mge0BsaW5rIFBob25lSW5mb09wdGlvbnN9LiBUaGUgcGhvbmUgbnVtYmVyIHNob3VsZCBiZSBpblxyXG4gICAgICogRS4xNjQgZm9ybWF0IChlLmcuICsxNjUwNTU1MDEwMSkuXHJcbiAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25WZXJpZmllciAtIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGFcclxuICAgICAqIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS4gVGhpcyBTREsgaW5jbHVkZXMgYSByZUNBUFRDSEEtYmFzZWQgaW1wbGVtZW50YXRpb24sXHJcbiAgICAgKiB7QGxpbmsgUmVjYXB0Y2hhVmVyaWZpZXJ9LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYSB2ZXJpZmljYXRpb24gSUQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvXHJcbiAgICAgKiB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbH0gdG8gaWRlbnRpZnkgdGhpcyBmbG93Li5cclxuICAgICAqL1xyXG4gICAgdmVyaWZ5UGhvbmVOdW1iZXIocGhvbmVPcHRpb25zLCBhcHBsaWNhdGlvblZlcmlmaWVyKSB7XHJcbiAgICAgICAgcmV0dXJuIF92ZXJpZnlQaG9uZU51bWJlcih0aGlzLmF1dGgsIHBob25lT3B0aW9ucywgZ2V0TW9kdWxhckluc3RhbmNlKGFwcGxpY2F0aW9uVmVyaWZpZXIpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHBob25lIGF1dGggY3JlZGVudGlhbCwgZ2l2ZW4gdGhlIHZlcmlmaWNhdGlvbiBJRCBmcm9tXHJcbiAgICAgKiB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXJ9IGFuZCB0aGUgY29kZSB0aGF0IHdhcyBzZW50IHRvIHRoZSB1c2VyJ3NcclxuICAgICAqIG1vYmlsZSBkZXZpY2UuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xyXG4gICAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIEFuIGFsdGVybmF0aXZlIGZsb3cgaXMgcHJvdmlkZWQgdXNpbmcgdGhlIGBzaWduSW5XaXRoUGhvbmVOdW1iZXJgIG1ldGhvZC5cclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxyXG4gICAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2ZXJpZmljYXRpb25JZCAtIFRoZSB2ZXJpZmljYXRpb24gSUQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXJ9LlxyXG4gICAgICogQHBhcmFtIHZlcmlmaWNhdGlvbkNvZGUgLSBUaGUgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlcidzIG1vYmlsZSBkZXZpY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpIHtcclxuICAgICAgICByZXR1cm4gUGhvbmVBdXRoQ3JlZGVudGlhbC5fZnJvbVZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxyXG4gICAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKSB7XHJcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHVzZXJDcmVkZW50aWFsO1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IHdoZW4gcGFzc2VkIGFuIGVycm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2Qgd29ya3MgZm9yIGVycm9ycyBsaWtlXHJcbiAgICAgKiBgYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsc2AuIFRoaXMgaXMgdXNlZnVsIGZvclxyXG4gICAgICogcmVjb3ZlcmluZyB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IGEgdXNlcidzIHBob25lIG51bWJlciBidXQgdGhlIG51bWJlclxyXG4gICAgICogaW4gcXVlc3Rpb24gaXMgYWxyZWFkeSB0aWVkIHRvIGFub3RoZXIgYWNjb3VudC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmdcclxuICAgICAqIGNvZGUgdHJpZXMgdG8gdXBkYXRlIHRoZSBjdXJyZW50IHVzZXIncyBwaG9uZSBudW1iZXIsIGFuZCBpZiB0aGF0XHJcbiAgICAgKiBmYWlscywgbGlua3MgdGhlIHVzZXIgd2l0aCB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBudW1iZXI6XHJcbiAgICAgKlxyXG4gICAgICogYGBganNcclxuICAgICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xyXG4gICAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihudW1iZXIsIHZlcmlmaWVyKTtcclxuICAgICAqIHRyeSB7XHJcbiAgICAgKiAgIGNvbnN0IGNvZGUgPSAnJzsgLy8gUHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgdmVyaWZpY2F0aW9uIGNvZGVcclxuICAgICAqICAgYXdhaXQgdXBkYXRlUGhvbmVOdW1iZXIoXHJcbiAgICAgKiAgICAgICBhdXRoLmN1cnJlbnRVc2VyLFxyXG4gICAgICogICAgICAgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgY29kZSkpO1xyXG4gICAgICogfSBjYXRjaCAoZSkge1xyXG4gICAgICogICBpZiAoKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnKSB7XHJcbiAgICAgKiAgICAgY29uc3QgY3JlZCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tRXJyb3IoZSk7XHJcbiAgICAgKiAgICAgYXdhaXQgbGlua1dpdGhDcmVkZW50aWFsKGF1dGguY3VycmVudFVzZXIsIGNyZWQpO1xyXG4gICAgICogICB9XHJcbiAgICAgKiB9XHJcbiAgICAgKlxyXG4gICAgICogLy8gQXQgdGhpcyBwb2ludCwgYXV0aC5jdXJyZW50VXNlci5waG9uZU51bWJlciA9PT0gbnVtYmVyLlxyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGdlbmVyYXRlIGEgY3JlZGVudGlhbCBmcm9tLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCgoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHsgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2UgfSkge1xyXG4gICAgICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9IHRva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKHBob25lTnVtYmVyICYmIHRlbXBvcmFyeVByb29mKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVG9rZW5SZXNwb25zZShwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXHJcblBob25lQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEID0gXCJwaG9uZVwiIC8qIFByb3ZpZGVySWQuUEhPTkUgKi87XHJcbi8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LlBIT05FLiAqL1xyXG5QaG9uZUF1dGhQcm92aWRlci5QSE9ORV9TSUdOX0lOX01FVEhPRCA9IFwicGhvbmVcIiAvKiBTaWduSW5NZXRob2QuUEhPTkUgKi87XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBDaG9vc2VzIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgdG8gdXNlLiBUaGlzIHByZWZlcnMgdGhlIG92ZXJyaWRlICh3aGljaFxyXG4gKiBpcyBkaXJlY3RseSBwYXNzZWQgaW4pLCBhbmQgZmFsbHMgYmFjayB0byB0aGUgcHJvcGVydHkgc2V0IG9uIHRoZSBhdXRoXHJcbiAqIG9iamVjdC4gSWYgbmVpdGhlciBhcmUgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIGVycm9ycyB3LyBhbiBhcmd1bWVudCBlcnJvci5cclxuICovXHJcbmZ1bmN0aW9uIF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGgsIHJlc29sdmVyT3ZlcnJpZGUpIHtcclxuICAgIGlmIChyZXNvbHZlck92ZXJyaWRlKSB7XHJcbiAgICAgICAgcmV0dXJuIF9nZXRJbnN0YW5jZShyZXNvbHZlck92ZXJyaWRlKTtcclxuICAgIH1cclxuICAgIF9hc3NlcnQoYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICByZXR1cm4gYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIElkcENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcclxuICAgICAgICBzdXBlcihcImN1c3RvbVwiIC8qIFByb3ZpZGVySWQuQ1VTVE9NICovLCBcImN1c3RvbVwiIC8qIFByb3ZpZGVySWQuQ1VTVE9NICovKTtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIH1cclxuICAgIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcclxuICAgIH1cclxuICAgIF9saW5rVG9JZFRva2VuKGF1dGgsIGlkVG9rZW4pIHtcclxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCB0aGlzLl9idWlsZElkcFJlcXVlc3QoaWRUb2tlbikpO1xyXG4gICAgfVxyXG4gICAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgdGhpcy5fYnVpbGRJZHBSZXF1ZXN0KCkpO1xyXG4gICAgfVxyXG4gICAgX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogdGhpcy5wYXJhbXMucmVxdWVzdFVyaSxcclxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnBhcmFtcy5zZXNzaW9uSWQsXHJcbiAgICAgICAgICAgIHBvc3RCb2R5OiB0aGlzLnBhcmFtcy5wb3N0Qm9keSxcclxuICAgICAgICAgICAgdGVuYW50SWQ6IHRoaXMucGFyYW1zLnRlbmFudElkLFxyXG4gICAgICAgICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGFyYW1zLnBlbmRpbmdUb2tlbixcclxuICAgICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXHJcbiAgICAgICAgICAgIHJldHVybklkcENyZWRlbnRpYWw6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpZFRva2VuKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIF9zaWduSW4ocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gX3NpZ25JbldpdGhDcmVkZW50aWFsKHBhcmFtcy5hdXRoLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcclxufVxyXG5mdW5jdGlvbiBfcmVhdXRoKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XHJcbiAgICBfYXNzZXJ0KHVzZXIsIGF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgIHJldHVybiBfcmVhdXRoZW50aWNhdGUodXNlciwgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSwgcGFyYW1zLmJ5cGFzc0F1dGhTdGF0ZSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2xpbmsocGFyYW1zKSB7XHJcbiAgICBjb25zdCB7IGF1dGgsIHVzZXIgfSA9IHBhcmFtcztcclxuICAgIF9hc3NlcnQodXNlciwgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIF9saW5rJDEodXNlciwgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSwgcGFyYW1zLmJ5cGFzc0F1dGhTdGF0ZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXHJcbiAqIGV2ZW50c1xyXG4gKi9cclxuY2xhc3MgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgsIGZpbHRlciwgcmVzb2x2ZXIsIHVzZXIsIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5hdXRoID0gYXV0aDtcclxuICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7XHJcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICB0aGlzLmJ5cGFzc0F1dGhTdGF0ZSA9IGJ5cGFzc0F1dGhTdGF0ZTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50TWFuYWdlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBBcnJheS5pc0FycmF5KGZpbHRlcikgPyBmaWx0ZXIgOiBbZmlsdGVyXTtcclxuICAgIH1cclxuICAgIGV4ZWN1dGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUHJvbWlzZSA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGF3YWl0IHRoaXMucmVzb2x2ZXIuX2luaXRpYWxpemUodGhpcy5hdXRoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25FeGVjdXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkF1dGhFdmVudChldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHsgdXJsUmVzcG9uc2UsIHNlc3Npb25JZCwgcG9zdEJvZHksIHRlbmFudElkLCBlcnJvciwgdHlwZSB9ID0gZXZlbnQ7XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGF1dGg6IHRoaXMuYXV0aCxcclxuICAgICAgICAgICAgcmVxdWVzdFVyaTogdXJsUmVzcG9uc2UsXHJcbiAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkLFxyXG4gICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50SWQgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBwb3N0Qm9keTogcG9zdEJvZHkgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXIsXHJcbiAgICAgICAgICAgIGJ5cGFzc0F1dGhTdGF0ZTogdGhpcy5ieXBhc3NBdXRoU3RhdGVcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZShhd2FpdCB0aGlzLmdldElkcFRhc2sodHlwZSkocGFyYW1zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICB0aGlzLnJlamVjdChlcnJvcik7XHJcbiAgICB9XHJcbiAgICBnZXRJZHBUYXNrKHR5cGUpIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInNpZ25JblZpYVBvcHVwXCIgLyogQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9QT1BVUCAqLzpcclxuICAgICAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVCAqLzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBfc2lnbkluO1xyXG4gICAgICAgICAgICBjYXNlIFwibGlua1ZpYVBvcHVwXCIgLyogQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9QT1BVUCAqLzpcclxuICAgICAgICAgICAgY2FzZSBcImxpbmtWaWFSZWRpcmVjdFwiIC8qIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX2xpbms7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZWF1dGhWaWFQb3B1cFwiIC8qIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9QT1BVUCAqLzpcclxuICAgICAgICAgICAgY2FzZSBcInJlYXV0aFZpYVJlZGlyZWN0XCIgLyogQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNUICovOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWF1dGg7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBfZmFpbCh0aGlzLmF1dGgsIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXNvbHZlKGNyZWQpIHtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCh0aGlzLnBlbmRpbmdQcm9taXNlLCAnUGVuZGluZyBwcm9taXNlIHdhcyBuZXZlciBzZXQnKTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlLnJlc29sdmUoY3JlZCk7XHJcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpO1xyXG4gICAgfVxyXG4gICAgcmVqZWN0KGVycm9yKSB7XHJcbiAgICAgICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcclxuICAgIH1cclxuICAgIHVucmVnaXN0ZXJBbmRDbGVhblVwKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmV2ZW50TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlci51bnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VUID0gbmV3IERlbGF5KDIwMDAsIDEwMDAwKTtcclxuLyoqXHJcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBwb3B1cC1iYXNlZCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiBzdWNjZWVkcywgcmV0dXJucyB0aGUgc2lnbmVkIGluIHVzZXIgYWxvbmcgd2l0aCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLiBJZiBzaWduIGluIHdhc1xyXG4gKiB1bnN1Y2Nlc3NmdWwsIHJldHVybnMgYW4gZXJyb3Igb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKlxyXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cclxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XHJcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcihhdXRoSW50ZXJuYWwsIHJlc29sdmVyKTtcclxuICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbihhdXRoSW50ZXJuYWwsIFwic2lnbkluVmlhUG9wdXBcIiAvKiBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1BPUFVQICovLCBwcm92aWRlciwgcmVzb2x2ZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XHJcbn1cclxuLyoqXHJcbiAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgT0F1dGhQcm92aWRlcn0gdXNpbmcgYSBwb3AtdXAgYmFzZWRcclxuICogT0F1dGggZmxvdy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogSWYgdGhlIHJlYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGNvbnRhaW4gdGhlIHVzZXIgYW5kIHRoZVxyXG4gKiBwcm92aWRlcidzIGNyZWRlbnRpYWwuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBSZWF1dGhlbnRpY2F0ZSB1c2luZyBhIHBvcHVwLlxyXG4gKiBhd2FpdCByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xyXG4gICAgY29uc3QgYWN0aW9uID0gbmV3IFBvcHVwT3BlcmF0aW9uKHVzZXJJbnRlcm5hbC5hdXRoLCBcInJlYXV0aFZpYVBvcHVwXCIgLyogQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1BPUFVQICovLCBwcm92aWRlciwgcmVzb2x2ZXJJbnRlcm5hbCwgdXNlckludGVybmFsKTtcclxuICAgIHJldHVybiBhY3Rpb24uZXhlY3V0ZU5vdE51bGwoKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIGF1dGhlbnRpY2F0ZWQgcHJvdmlkZXIgdG8gdGhlIHVzZXIgYWNjb3VudCB1c2luZyBhIHBvcC11cCBiYXNlZCBPQXV0aCBmbG93LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiBJZiB0aGUgbGlua2luZyBpcyBzdWNjZXNzZnVsLCB0aGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgY29udGFpbiB0aGUgdXNlciBhbmQgdGhlIHByb3ZpZGVyJ3MgY3JlZGVudGlhbC5cclxuICpcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XHJcbiAqIC8vIExpbmsgdXNpbmcgYSBwb3B1cC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogYXdhaXQgbGlua1dpdGhQb3B1cChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5hc3luYyBmdW5jdGlvbiBsaW5rV2l0aFBvcHVwKHVzZXIsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xyXG4gICAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBuZXcgUG9wdXBPcGVyYXRpb24odXNlckludGVybmFsLmF1dGgsIFwibGlua1ZpYVBvcHVwXCIgLyogQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9QT1BVUCAqLywgcHJvdmlkZXIsIHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbCk7XHJcbiAgICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XHJcbn1cclxuLyoqXHJcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXHJcbiAqIGV2ZW50c1xyXG4gKlxyXG4gKi9cclxuY2xhc3MgUG9wdXBPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xyXG4gICAgY29uc3RydWN0b3IoYXV0aCwgZmlsdGVyLCBwcm92aWRlciwgcmVzb2x2ZXIsIHVzZXIpIHtcclxuICAgICAgICBzdXBlcihhdXRoLCBmaWx0ZXIsIHJlc29sdmVyLCB1c2VyKTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcbiAgICAgICAgdGhpcy5hdXRoV2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBvbGxJZCA9IG51bGw7XHJcbiAgICAgICAgaWYgKFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbikge1xyXG4gICAgICAgICAgICBQb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24uY2FuY2VsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICBhc3luYyBleGVjdXRlTm90TnVsbCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcclxuICAgICAgICBfYXNzZXJ0KHJlc3VsdCwgdGhpcy5hdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGRlYnVnQXNzZXJ0KHRoaXMuZmlsdGVyLmxlbmd0aCA9PT0gMSwgJ1BvcHVwIG9wZXJhdGlvbnMgb25seSBoYW5kbGUgb25lIGV2ZW50Jyk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoKTtcclxuICAgICAgICB0aGlzLmF1dGhXaW5kb3cgPSBhd2FpdCB0aGlzLnJlc29sdmVyLl9vcGVuUG9wdXAodGhpcy5hdXRoLCB0aGlzLnByb3ZpZGVyLCB0aGlzLmZpbHRlclswXSwgLy8gVGhlcmUncyBhbHdheXMgb25lLCBzZWUgY29uc3RydWN0b3JcclxuICAgICAgICBldmVudElkKTtcclxuICAgICAgICB0aGlzLmF1dGhXaW5kb3cuYXNzb2NpYXRlZEV2ZW50ID0gZXZlbnRJZDtcclxuICAgICAgICAvLyBDaGVjayBmb3Igd2ViIHN0b3JhZ2Ugc3VwcG9ydCBhbmQgb3JpZ2luIHZhbGlkYXRpb24gX2FmdGVyXyB0aGUgcG9wdXAgaXNcclxuICAgICAgICAvLyBsb2FkZWQuIFRoZXNlIG9wZXJhdGlvbnMgYXJlIHNsb3cgKH4xIHNlY29uZCBvciBzbykgUmF0aGVyIHRoYW5cclxuICAgICAgICAvLyB3YWl0aW5nIG9uIHRoZW0gYmVmb3JlIG9wZW5pbmcgdGhlIHdpbmRvdywgb3B0aW1pc3RpY2FsbHkgb3BlbiB0aGUgcG9wdXBcclxuICAgICAgICAvLyBhbmQgY2hlY2sgZm9yIHN0b3JhZ2Ugc3VwcG9ydCBhdCB0aGUgc2FtZSB0aW1lLiBJZiBzdG9yYWdlIHN1cHBvcnQgaXNcclxuICAgICAgICAvLyBub3QgYXZhaWxhYmxlLCB0aGlzIHdpbGwgY2F1c2UgdGhlIHdob2xlIHRoaW5nIHRvIHJlamVjdCBwcm9wZXJseS4gSXRcclxuICAgICAgICAvLyB3aWxsIGFsc28gY2xvc2UgdGhlIHBvcHVwLCBidXQgc2luY2UgdGhlIHByb21pc2UgaGFzIGFscmVhZHkgcmVqZWN0ZWQsXHJcbiAgICAgICAgLy8gdGhlIHBvcHVwIGNsb3NlZCBieSB1c2VyIHBvbGwgd2lsbCByZWplY3QgaW50byB0aGUgdm9pZC5cclxuICAgICAgICB0aGlzLnJlc29sdmVyLl9vcmlnaW5WYWxpZGF0aW9uKHRoaXMuYXV0aCkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZXIuX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZCh0aGlzLmF1dGgsIGlzU3VwcG9ydGVkID0+IHtcclxuICAgICAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgXCJ3ZWItc3RvcmFnZS11bnN1cHBvcnRlZFwiIC8qIEF1dGhFcnJvckNvZGUuV0VCX1NUT1JBR0VfVU5TVVBQT1JURUQgKi8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEhhbmRsZSB1c2VyIGNsb3N1cmUuIE5vdGljZSB0aGlzIGRvZXMgKm5vdCogdXNlIGF3YWl0XHJcbiAgICAgICAgdGhpcy5wb2xsVXNlckNhbmNlbGxhdGlvbigpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGV2ZW50SWQoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5hdXRoV2luZG93KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNzb2NpYXRlZEV2ZW50KSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgY2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwiY2FuY2VsbGVkLXBvcHVwLXJlcXVlc3RcIiAvKiBBdXRoRXJyb3JDb2RlLkVYUElSRURfUE9QVVBfUkVRVUVTVCAqLykpO1xyXG4gICAgfVxyXG4gICAgY2xlYW5VcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRoV2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aFdpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wb2xsSWQpIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnBvbGxJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXV0aFdpbmRvdyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBwb2xsVXNlckNhbmNlbGxhdGlvbigpIHtcclxuICAgICAgICBjb25zdCBwb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgICAgICBpZiAoKF9iID0gKF9hID0gdGhpcy5hdXRoV2luZG93KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2luZG93KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHRpbWUgZm9yIHdoYXRldmVyIGFjdGlvbiB0b1xyXG4gICAgICAgICAgICAgICAgLy8gY29tcGxldGUuIFRoZSB3aW5kb3cgY291bGQgaGF2ZSBjbG9zZWQgYnV0IHRoZSBzaWduIGluIG5ldHdvcmtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgY291bGQgc3RpbGwgYmUgaW4gZmxpZ2h0LiBUaGlzIGlzIHNwZWNpZmljYWxseSB0cnVlIGZvclxyXG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBvciBpZiB0aGUgb3BlbmVyIGlzIGluIGFuIGlmcmFtZSwgaW4gd2hpY2ggY2FzZSB0aGUgb2F1dGhcclxuICAgICAgICAgICAgICAgIC8vIGhlbHBlciBjbG9zZXMgdGhlIHBvcHVwLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIFwicG9wdXAtY2xvc2VkLWJ5LXVzZXJcIiAvKiBBdXRoRXJyb3JDb2RlLlBPUFVQX0NMT1NFRF9CWV9VU0VSICovKSk7XHJcbiAgICAgICAgICAgICAgICB9LCA4MDAwIC8qIF9UaW1lb3V0LkFVVEhfRVZFTlQgKi8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9sbElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgX1BPTExfV0lORE9XX0NMT1NFX1RJTUVPVVQuZ2V0KCkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcG9sbCgpO1xyXG4gICAgfVxyXG59XHJcbi8vIE9ubHkgb25lIHBvcHVwIGlzIGV2ZXIgc2hvd24gYXQgb25jZS4gVGhlIGxpZmVjeWNsZSBvZiB0aGUgY3VycmVudCBwb3B1cFxyXG4vLyBjYW4gYmUgbWFuYWdlZCAvIGNhbmNlbGxlZCBieSB0aGUgY29uc3RydWN0b3IuXHJcblBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFBFTkRJTkdfUkVESVJFQ1RfS0VZID0gJ3BlbmRpbmdSZWRpcmVjdCc7XHJcbi8vIFdlIG9ubHkgZ2V0IG9uZSByZWRpcmVjdCBvdXRjb21lIGZvciBhbnkgb25lIGF1dGgsIHNvIGp1c3Qgc3RvcmUgaXRcclxuLy8gaW4gaGVyZS5cclxuY29uc3QgcmVkaXJlY3RPdXRjb21lTWFwID0gbmV3IE1hcCgpO1xyXG5jbGFzcyBSZWRpcmVjdEFjdGlvbiBleHRlbmRzIEFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoLCByZXNvbHZlciwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgICAgICBzdXBlcihhdXRoLCBbXHJcbiAgICAgICAgICAgIFwic2lnbkluVmlhUmVkaXJlY3RcIiAvKiBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUICovLFxyXG4gICAgICAgICAgICBcImxpbmtWaWFSZWRpcmVjdFwiIC8qIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwicmVhdXRoVmlhUmVkaXJlY3RcIiAvKiBBdXRoRXZlbnRUeXBlLlJFQVVUSF9WSUFfUkVESVJFQ1QgKi8sXHJcbiAgICAgICAgICAgIFwidW5rbm93blwiIC8qIEF1dGhFdmVudFR5cGUuVU5LTk9XTiAqL1xyXG4gICAgICAgIF0sIHJlc29sdmVyLCB1bmRlZmluZWQsIGJ5cGFzc0F1dGhTdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5ldmVudElkID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGUgdGhlIGV4ZWN1dGUgZnVuY3Rpb247IGlmIHdlIGFscmVhZHkgaGF2ZSBhIHJlZGlyZWN0IHJlc3VsdCwgdGhlblxyXG4gICAgICoganVzdCByZXR1cm4gaXQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XHJcbiAgICAgICAgbGV0IHJlYWR5T3V0Y29tZSA9IHJlZGlyZWN0T3V0Y29tZU1hcC5nZXQodGhpcy5hdXRoLl9rZXkoKSk7XHJcbiAgICAgICAgaWYgKCFyZWFkeU91dGNvbWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1BlbmRpbmdSZWRpcmVjdCA9IGF3YWl0IF9nZXRBbmRDbGVhclBlbmRpbmdSZWRpcmVjdFN0YXR1cyh0aGlzLnJlc29sdmVyLCB0aGlzLmF1dGgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFzUGVuZGluZ1JlZGlyZWN0ID8gYXdhaXQgc3VwZXIuZXhlY3V0ZSgpIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWFkeU91dGNvbWUgPSAoKSA9PiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KHRoaXMuYXV0aC5fa2V5KCksIHJlYWR5T3V0Y29tZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIHdlJ3JlIG5vdCBieXBhc3NpbmcgYXV0aCBzdGF0ZSwgdGhlIHJlYWR5IG91dGNvbWUgc2hvdWxkIGJlIHNldCB0b1xyXG4gICAgICAgIC8vIG51bGwuXHJcbiAgICAgICAgaWYgKCF0aGlzLmJ5cGFzc0F1dGhTdGF0ZSkge1xyXG4gICAgICAgICAgICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KHRoaXMuYXV0aC5fa2V5KCksICgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZWFkeU91dGNvbWUoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uQXV0aEV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwic2lnbkluVmlhUmVkaXJlY3RcIiAvKiBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUICovKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwidW5rbm93blwiIC8qIEF1dGhFdmVudFR5cGUuVU5LTk9XTiAqLykge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2VudGluZWwgdmFsdWUgaW5kaWNhdGluZyB0aGVyZSdzIG5vIHBlbmRpbmcgcmVkaXJlY3RcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGguX3JlZGlyZWN0VXNlckZvcklkKGV2ZW50LmV2ZW50SWQpO1xyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkF1dGhFdmVudChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyBvbkV4ZWN1dGlvbigpIHsgfVxyXG4gICAgY2xlYW5VcCgpIHsgfVxyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9nZXRBbmRDbGVhclBlbmRpbmdSZWRpcmVjdFN0YXR1cyhyZXNvbHZlciwgYXV0aCkge1xyXG4gICAgY29uc3Qga2V5ID0gcGVuZGluZ1JlZGlyZWN0S2V5KGF1dGgpO1xyXG4gICAgY29uc3QgcGVyc2lzdGVuY2UgPSByZXNvbHZlclBlcnNpc3RlbmNlKHJlc29sdmVyKTtcclxuICAgIGlmICghKGF3YWl0IHBlcnNpc3RlbmNlLl9pc0F2YWlsYWJsZSgpKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhhc1BlbmRpbmdSZWRpcmVjdCA9IChhd2FpdCBwZXJzaXN0ZW5jZS5fZ2V0KGtleSkpID09PSAndHJ1ZSc7XHJcbiAgICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XHJcbiAgICByZXR1cm4gaGFzUGVuZGluZ1JlZGlyZWN0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXIsIGF1dGgpIHtcclxuICAgIHJldHVybiByZXNvbHZlclBlcnNpc3RlbmNlKHJlc29sdmVyKS5fc2V0KHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKSwgJ3RydWUnKTtcclxufVxyXG5mdW5jdGlvbiBfY2xlYXJSZWRpcmVjdE91dGNvbWVzKCkge1xyXG4gICAgcmVkaXJlY3RPdXRjb21lTWFwLmNsZWFyKCk7XHJcbn1cclxuZnVuY3Rpb24gX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzdWx0KSB7XHJcbiAgICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KGF1dGguX2tleSgpLCByZXN1bHQpO1xyXG59XHJcbmZ1bmN0aW9uIHJlc29sdmVyUGVyc2lzdGVuY2UocmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfZ2V0SW5zdGFuY2UocmVzb2x2ZXIuX3JlZGlyZWN0UGVyc2lzdGVuY2UpO1xyXG59XHJcbmZ1bmN0aW9uIHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKSB7XHJcbiAgICByZXR1cm4gX3BlcnNpc3RlbmNlS2V5TmFtZShQRU5ESU5HX1JFRElSRUNUX0tFWSwgYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLm5hbWUpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBdXRoZW50aWNhdGVzIGEgRmlyZWJhc2UgY2xpZW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cclxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcclxuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgc2lnbkluV2l0aFJlZGlyZWN0fS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgc2NvcGVzIHRvIHRoZSBwcm92aWRlcjpcclxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcclxuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxyXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xyXG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcclxuICpcclxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcclxuICogaWYgKHJlc3VsdCkge1xyXG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXHJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xyXG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxyXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xyXG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcclxuICogfVxyXG4gKiAvLyBBcyB0aGlzIEFQSSBjYW4gYmUgdXNlZCBmb3Igc2lnbi1pbiwgbGlua2luZyBhbmQgcmVhdXRoZW50aWNhdGlvbixcclxuICogLy8gY2hlY2sgdGhlIG9wZXJhdGlvblR5cGUgdG8gZGV0ZXJtaW5lIHdoYXQgdHJpZ2dlcmVkIHRoaXMgcmVkaXJlY3RcclxuICogLy8gb3BlcmF0aW9uLlxyXG4gKiBjb25zdCBvcGVyYXRpb25UeXBlID0gcmVzdWx0Lm9wZXJhdGlvblR5cGU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxyXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgcmV0dXJuIF9zaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCByZXNvbHZlcikge1xyXG4gICAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xyXG4gICAgX2Fzc2VydEluc3RhbmNlT2YoYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXHJcbiAgICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xyXG4gICAgLy8gcmVkaXJlY3QgYW5kIGNyZWF0aW5nIGEgUEVORElOR19SRURJUkVDVF9LRVkgZW50cnkuXHJcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcihhdXRoSW50ZXJuYWwsIHJlc29sdmVyKTtcclxuICAgIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgYXV0aEludGVybmFsKTtcclxuICAgIHJldHVybiByZXNvbHZlckludGVybmFsLl9vcGVuUmVkaXJlY3QoYXV0aEludGVybmFsLCBwcm92aWRlciwgXCJzaWduSW5WaWFSZWRpcmVjdFwiIC8qIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1QgKi8pO1xyXG59XHJcbi8qKlxyXG4gKiBSZWF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cclxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcclxuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3R9LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cclxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIC8vIFJlYXV0aGVudGljYXRlIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGF3YWl0IHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHJlc3VsdC51c2VyLCBwcm92aWRlcik7XHJcbiAqIC8vIFRoaXMgd2lsbCBhZ2FpbiB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxyXG4gKlxyXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XHJcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cclxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXHJcbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXHJcbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxyXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIHJldHVybiBfcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XHJcbiAgICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XHJcbiAgICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXHJcbiAgICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xyXG4gICAgLy8gcmVkaXJlY3QgYW5kIGNyZWF0aW5nIGEgUEVORElOR19SRURJUkVDVF9LRVkgZW50cnkuXHJcbiAgICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXHJcbiAgICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcclxuICAgIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgdXNlckludGVybmFsLmF1dGgpO1xyXG4gICAgY29uc3QgZXZlbnRJZCA9IGF3YWl0IHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlckludGVybmFsKTtcclxuICAgIHJldHVybiByZXNvbHZlckludGVybmFsLl9vcGVuUmVkaXJlY3QodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBcInJlYXV0aFZpYVJlZGlyZWN0XCIgLyogQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNUICovLCBldmVudElkKTtcclxufVxyXG4vKipcclxuICogTGlua3MgdGhlIHtAbGluayBPQXV0aFByb3ZpZGVyfSB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cclxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcclxuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgbGlua1dpdGhSZWRpcmVjdH0uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBzb21lIG90aGVyIHByb3ZpZGVyLlxyXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xyXG4gKiAvLyBMaW5rIHVzaW5nIGEgcmVkaXJlY3QuXHJcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XHJcbiAqIGF3YWl0IGxpbmtXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cclxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXHJcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXHJcbiAqXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmZ1bmN0aW9uIGxpbmtXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSB7XHJcbiAgICByZXR1cm4gX2xpbmtXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIHtcclxuICAgIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcclxuICAgIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcclxuICAgIC8vIFdhaXQgZm9yIGF1dGggaW5pdGlhbGl6YXRpb24gdG8gY29tcGxldGUsIHRoaXMgd2lsbCBwcm9jZXNzIHBlbmRpbmcgcmVkaXJlY3RzIGFuZCBjbGVhciB0aGVcclxuICAgIC8vIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGluIHBlcnNpc3RlbmNlLiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3XHJcbiAgICAvLyByZWRpcmVjdCBhbmQgY3JlYXRpbmcgYSBQRU5ESU5HX1JFRElSRUNUX0tFWSBlbnRyeS5cclxuICAgIGF3YWl0IHVzZXJJbnRlcm5hbC5hdXRoLl9pbml0aWFsaXphdGlvblByb21pc2U7XHJcbiAgICAvLyBBbGxvdyB0aGUgcmVzb2x2ZXIgdG8gZXJyb3IgYmVmb3JlIHBlcnNpc3RpbmcgdGhlIHJlZGlyZWN0IHVzZXJcclxuICAgIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xyXG4gICAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBwcm92aWRlci5wcm92aWRlcklkKTtcclxuICAgIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgdXNlckludGVybmFsLmF1dGgpO1xyXG4gICAgY29uc3QgZXZlbnRJZCA9IGF3YWl0IHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlckludGVybmFsKTtcclxuICAgIHJldHVybiByZXNvbHZlckludGVybmFsLl9vcGVuUmVkaXJlY3QodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBcImxpbmtWaWFSZWRpcmVjdFwiIC8qIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QgKi8sIGV2ZW50SWQpO1xyXG59XHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfSBmcm9tIHRoZSByZWRpcmVjdC1iYXNlZCBzaWduLWluIGZsb3cuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIElmIHNpZ24taW4gc3VjY2VlZGVkLCByZXR1cm5zIHRoZSBzaWduZWQgaW4gdXNlci4gSWYgc2lnbi1pbiB3YXMgdW5zdWNjZXNzZnVsLCBmYWlscyB3aXRoIGFuXHJcbiAqIGVycm9yLiBJZiBubyByZWRpcmVjdCBvcGVyYXRpb24gd2FzIGNhbGxlZCwgcmV0dXJucyBgbnVsbGAuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxyXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xyXG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XHJcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XHJcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cclxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcclxuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXHJcbiAqXHJcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcclxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XHJcbiAqIGlmIChyZXN1bHQpIHtcclxuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcclxuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cclxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcclxuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XHJcbiAqIH1cclxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXHJcbiAqIC8vIGNoZWNrIHRoZSBvcGVyYXRpb25UeXBlIHRvIGRldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGlzIHJlZGlyZWN0XHJcbiAqIC8vIG9wZXJhdGlvbi5cclxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcclxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzb2x2ZXIpIHtcclxuICAgIGF3YWl0IF9jYXN0QXV0aChhdXRoKS5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgcmV0dXJuIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlciwgZmFsc2UpO1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlckV4dGVybiwgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcclxuICAgIGNvbnN0IHJlc29sdmVyID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICBjb25zdCBhY3Rpb24gPSBuZXcgUmVkaXJlY3RBY3Rpb24oYXV0aEludGVybmFsLCByZXNvbHZlciwgYnlwYXNzQXV0aFN0YXRlKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5leGVjdXRlKCk7XHJcbiAgICBpZiAocmVzdWx0ICYmICFieXBhc3NBdXRoU3RhdGUpIHtcclxuICAgICAgICBkZWxldGUgcmVzdWx0LnVzZXIuX3JlZGlyZWN0RXZlbnRJZDtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3BlcnNpc3RVc2VySWZDdXJyZW50KHJlc3VsdC51c2VyKTtcclxuICAgICAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3NldFJlZGlyZWN0VXNlcihudWxsLCByZXNvbHZlckV4dGVybik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlcikge1xyXG4gICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoYCR7dXNlci51aWR9Ojo6YCk7XHJcbiAgICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBldmVudElkO1xyXG4gICAgYXdhaXQgdXNlci5hdXRoLl9zZXRSZWRpcmVjdFVzZXIodXNlcik7XHJcbiAgICBhd2FpdCB1c2VyLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXIpO1xyXG4gICAgcmV0dXJuIGV2ZW50SWQ7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0b3JlIHRoZSBVSURzIG9mIHNlZW4gZXZlbnRzOyB0aGlzIGlzXHJcbi8vIHNldCB0byAxMCBtaW4gYnkgZGVmYXVsdFxyXG5jb25zdCBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUyA9IDEwICogNjAgKiAxMDAwO1xyXG5jbGFzcyBBdXRoRXZlbnRNYW5hZ2VyIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgfVxyXG4gICAgcmVnaXN0ZXJDb25zdW1lcihhdXRoRXZlbnRDb25zdW1lcikge1xyXG4gICAgICAgIHRoaXMuY29uc3VtZXJzLmFkZChhdXRoRXZlbnRDb25zdW1lcik7XHJcbiAgICAgICAgaWYgKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCAmJlxyXG4gICAgICAgICAgICB0aGlzLmlzRXZlbnRGb3JDb25zdW1lcih0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQsIGF1dGhFdmVudENvbnN1bWVyKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRUb0NvbnN1bWVyKHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCwgYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1bnJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnN1bWVycy5kZWxldGUoYXV0aEV2ZW50Q29uc3VtZXIpO1xyXG4gICAgfVxyXG4gICAgb25FdmVudChldmVudCkge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWRcclxuICAgICAgICBpZiAodGhpcy5oYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb25zdW1lcnMuZm9yRWFjaChjb25zdW1lciA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXZlbnRGb3JDb25zdW1lcihldmVudCwgY29uc3VtZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUV2ZW50VG9DYWNoZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgfHwgIWlzUmVkaXJlY3RFdmVudChldmVudCkpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgcmVkaXJlY3QgYmVmb3JlLCBvciB0aGlzIGlzIGEgcG9wdXAgZXZlbnQsXHJcbiAgICAgICAgICAgIC8vIGJhaWwgbm93XHJcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IHRydWU7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZGlyZWN0IHdhc24ndCBoYW5kbGVkLCBoYW5nIG9uIHRvIGl0XHJcbiAgICAgICAgaWYgKCFoYW5kbGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IGV2ZW50O1xyXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XHJcbiAgICB9XHJcbiAgICBzZW5kVG9Db25zdW1lcihldmVudCwgY29uc3VtZXIpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yICYmICFpc051bGxSZWRpcmVjdEV2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb2RlID0gKChfYSA9IGV2ZW50LmVycm9yLmNvZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zcGxpdCgnYXV0aC8nKVsxXSkgfHxcclxuICAgICAgICAgICAgICAgIFwiaW50ZXJuYWwtZXJyb3JcIiAvKiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SICovO1xyXG4gICAgICAgICAgICBjb25zdW1lci5vbkVycm9yKF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIGNvZGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN1bWVyLm9uQXV0aEV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpc0V2ZW50Rm9yQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRJZE1hdGNoZXMgPSBjb25zdW1lci5ldmVudElkID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgICghIWV2ZW50LmV2ZW50SWQgJiYgZXZlbnQuZXZlbnRJZCA9PT0gY29uc3VtZXIuZXZlbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnN1bWVyLmZpbHRlci5pbmNsdWRlcyhldmVudC50eXBlKSAmJiBldmVudElkTWF0Y2hlcztcclxuICAgIH1cclxuICAgIGhhc0V2ZW50QmVlbkhhbmRsZWQoZXZlbnQpIHtcclxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA+PVxyXG4gICAgICAgICAgICBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUykge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZEV2ZW50VWlkcy5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRFdmVudFVpZHMuaGFzKGV2ZW50VWlkKGV2ZW50KSk7XHJcbiAgICB9XHJcbiAgICBzYXZlRXZlbnRUb0NhY2hlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRFdmVudFVpZHMuYWRkKGV2ZW50VWlkKGV2ZW50KSk7XHJcbiAgICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkRXZlbnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBldmVudFVpZChlKSB7XHJcbiAgICByZXR1cm4gW2UudHlwZSwgZS5ldmVudElkLCBlLnNlc3Npb25JZCwgZS50ZW5hbnRJZF0uZmlsdGVyKHYgPT4gdikuam9pbignLScpO1xyXG59XHJcbmZ1bmN0aW9uIGlzTnVsbFJlZGlyZWN0RXZlbnQoeyB0eXBlLCBlcnJvciB9KSB7XHJcbiAgICByZXR1cm4gKHR5cGUgPT09IFwidW5rbm93blwiIC8qIEF1dGhFdmVudFR5cGUuVU5LTk9XTiAqLyAmJlxyXG4gICAgICAgIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSkgPT09IGBhdXRoLyR7XCJuby1hdXRoLWV2ZW50XCIgLyogQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UICovfWApO1xyXG59XHJcbmZ1bmN0aW9uIGlzUmVkaXJlY3RFdmVudChldmVudCkge1xyXG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBcInNpZ25JblZpYVJlZGlyZWN0XCIgLyogQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVCAqLzpcclxuICAgICAgICBjYXNlIFwibGlua1ZpYVJlZGlyZWN0XCIgLyogQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9SRURJUkVDVCAqLzpcclxuICAgICAgICBjYXNlIFwicmVhdXRoVmlhUmVkaXJlY3RcIiAvKiBBdXRoRXZlbnRUeXBlLlJFQVVUSF9WSUFfUkVESVJFQ1QgKi86XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGNhc2UgXCJ1bmtub3duXCIgLyogQXV0aEV2ZW50VHlwZS5VTktOT1dOICovOlxyXG4gICAgICAgICAgICByZXR1cm4gaXNOdWxsUmVkaXJlY3RFdmVudChldmVudCk7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF9nZXRQcm9qZWN0Q29uZmlnKGF1dGgsIHJlcXVlc3QgPSB7fSkge1xyXG4gICAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdChhdXRoLCBcIkdFVFwiIC8qIEh0dHBNZXRob2QuR0VUICovLCBcIi92MS9wcm9qZWN0c1wiIC8qIEVuZHBvaW50LkdFVF9QUk9KRUNUX0NPTkZJRyAqLywgcmVxdWVzdCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgSVBfQUREUkVTU19SRUdFWCA9IC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLztcclxuY29uc3QgSFRUUF9SRUdFWCA9IC9eaHR0cHM/LztcclxuYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpIHtcclxuICAgIC8vIFNraXAgb3JpZ2luIHZhbGlkYXRpb24gaWYgd2UgYXJlIGluIGFuIGVtdWxhdGVkIGVudmlyb25tZW50XHJcbiAgICBpZiAoYXV0aC5jb25maWcuZW11bGF0b3IpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB7IGF1dGhvcml6ZWREb21haW5zIH0gPSBhd2FpdCBfZ2V0UHJvamVjdENvbmZpZyhhdXRoKTtcclxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIGF1dGhvcml6ZWREb21haW5zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG1hdGNoRG9tYWluKGRvbWFpbikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoX2EpIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIGEgVVJMIGVycm9yOyBqdXN0IGNvbnRpbnVlIHNlYXJjaGluZ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEluIHRoZSBvbGQgU0RLLCB0aGlzIGVycm9yIGFsc28gcHJvdmlkZXMgaGVscGZ1bCBtZXNzYWdlcy5cclxuICAgIF9mYWlsKGF1dGgsIFwidW5hdXRob3JpemVkLWRvbWFpblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9PUklHSU4gKi8pO1xyXG59XHJcbmZ1bmN0aW9uIG1hdGNoRG9tYWluKGV4cGVjdGVkKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXJsID0gX2dldEN1cnJlbnRVcmwoKTtcclxuICAgIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xyXG4gICAgaWYgKGV4cGVjdGVkLnN0YXJ0c1dpdGgoJ2Nocm9tZS1leHRlbnNpb246Ly8nKSkge1xyXG4gICAgICAgIGNvbnN0IGNlVXJsID0gbmV3IFVSTChleHBlY3RlZCk7XHJcbiAgICAgICAgaWYgKGNlVXJsLmhvc3RuYW1lID09PSAnJyAmJiBob3N0bmFtZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIG5vdCBwYXJzaW5nIGNocm9tZSBVUkxzIHByb3Blcmx5XHJcbiAgICAgICAgICAgIHJldHVybiAocHJvdG9jb2wgPT09ICdjaHJvbWUtZXh0ZW5zaW9uOicgJiZcclxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJykgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVybC5yZXBsYWNlKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJywgJycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmIGNlVXJsLmhvc3RuYW1lID09PSBob3N0bmFtZTtcclxuICAgIH1cclxuICAgIGlmICghSFRUUF9SRUdFWC50ZXN0KHByb3RvY29sKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChJUF9BRERSRVNTX1JFR0VYLnRlc3QoZXhwZWN0ZWQpKSB7XHJcbiAgICAgICAgLy8gVGhlIGRvbWFpbiBoYXMgdG8gYmUgZXhhY3RseSBlcXVhbCB0byB0aGUgcGF0dGVybiwgYXMgYW4gSVAgZG9tYWluIHdpbGxcclxuICAgICAgICAvLyBvbmx5IGNvbnRhaW4gdGhlIElQLCBubyBleHRyYSBjaGFyYWN0ZXIuXHJcbiAgICAgICAgcmV0dXJuIGhvc3RuYW1lID09PSBleHBlY3RlZDtcclxuICAgIH1cclxuICAgIC8vIERvdHMgaW4gcGF0dGVybiBzaG91bGQgYmUgZXNjYXBlZC5cclxuICAgIGNvbnN0IGVzY2FwZWREb21haW5QYXR0ZXJuID0gZXhwZWN0ZWQucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xyXG4gICAgLy8gTm9uIGlwIGFkZHJlc3MgZG9tYWlucy5cclxuICAgIC8vIGRvbWFpbi5jb20gPSAqLmRvbWFpbi5jb20gT1IgZG9tYWluLmNvbVxyXG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeKC4rXFxcXC4nICsgZXNjYXBlZERvbWFpblBhdHRlcm4gKyAnfCcgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICcpJCcsICdpJyk7XHJcbiAgICByZXR1cm4gcmUudGVzdChob3N0bmFtZSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IE5FVFdPUktfVElNRU9VVCA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xyXG4vKipcclxuICogUmVzZXQgdW5sYW9kZWQgR0FwaSBtb2R1bGVzLiBJZiBnYXBpLmxvYWQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBlcnJvcixcclxuICogaXQgd2lsbCBzdG9wIHdvcmtpbmcgYWZ0ZXIgYSByZXRyaWFsLiBUaGlzIGlzIGEgaGFjayB0byBmaXggdGhpcyBpc3N1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpIHtcclxuICAgIC8vIENsZWFyIGxhc3QgZmFpbGVkIGdhcGkubG9hZCBzdGF0ZSB0byBmb3JjZSBuZXh0IGdhcGkubG9hZCB0byBmaXJzdFxyXG4gICAgLy8gbG9hZCB0aGUgZmFpbGVkIGdhcGkuaWZyYW1lcyBtb2R1bGUuXHJcbiAgICAvLyBHZXQgZ2FwaXguYmVhY29uIGNvbnRleHQuXHJcbiAgICBjb25zdCBiZWFjb24gPSBfd2luZG93KCkuX19fanNsO1xyXG4gICAgLy8gR2V0IGN1cnJlbnQgaGludC5cclxuICAgIGlmIChiZWFjb24gPT09IG51bGwgfHwgYmVhY29uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiZWFjb24uSCkge1xyXG4gICAgICAgIC8vIEdldCBnYXBpIGhpbnQuXHJcbiAgICAgICAgZm9yIChjb25zdCBoaW50IG9mIE9iamVjdC5rZXlzKGJlYWNvbi5IKSkge1xyXG4gICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgbW9kdWxlcy5cclxuICAgICAgICAgICAgYmVhY29uLkhbaGludF0uciA9IGJlYWNvbi5IW2hpbnRdLnIgfHwgW107XHJcbiAgICAgICAgICAgIC8vIExvYWRlZCBtb2R1bGVzLlxyXG4gICAgICAgICAgICBiZWFjb24uSFtoaW50XS5MID0gYmVhY29uLkhbaGludF0uTCB8fCBbXTtcclxuICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3RlZCBtb2R1bGVzIHRvIGEgY29weSBvZiB0aGUgbG9hZGVkIG1vZHVsZXMuXHJcbiAgICAgICAgICAgIGJlYWNvbi5IW2hpbnRdLnIgPSBbLi4uYmVhY29uLkhbaGludF0uTF07XHJcbiAgICAgICAgICAgIC8vIENsZWFyIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICBpZiAoYmVhY29uLkNQKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJlYWNvbi5DUC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZmFpbGVkIHBlbmRpbmcgY2FsbGJhY2tzLlxyXG4gICAgICAgICAgICAgICAgICAgIGJlYWNvbi5DUFtpXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gbG9hZEdhcGkoYXV0aCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAvLyBGdW5jdGlvbiB0byBydW4gd2hlbiBnYXBpLmxvYWQgaXMgcmVhZHkuXHJcbiAgICAgICAgZnVuY3Rpb24gbG9hZEdhcGlJZnJhbWUoKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBkZXZlbG9wZXIgbWF5IGhhdmUgdHJpZWQgdG8gcHJldmlvdXNseSBydW4gZ2FwaS5sb2FkIGFuZCBmYWlsZWQuXHJcbiAgICAgICAgICAgIC8vIFJ1biB0aGlzIHRvIGZpeCB0aGF0LlxyXG4gICAgICAgICAgICByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTtcclxuICAgICAgICAgICAgZ2FwaS5sb2FkKCdnYXBpLmlmcmFtZXMnLCB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb250aW1lb3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIHJlc2V0IG1heSBiZSBzdWZmaWNpZW50LCBidXQgaGF2aW5nIHRoaXMgcmVzZXQgYWZ0ZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIGVuc3VyZXMgdGhhdCBpZiB0aGUgZGV2ZWxvcGVyIGNhbGxzIGdhcGkubG9hZCBhZnRlciB0aGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkIGFuZCBiZWZvcmUgYW5vdGhlciBhdHRlbXB0IHRvIGVtYmVkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSwgaXQgd291bGQgd29yayBhbmQgd291bGQgbm90IGJlIGJyb2tlbiBiZWNhdXNlIG9mIG91clxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBhdHRlbXB0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgd2hlbiBnYXBpLmlmcmFtZXMuSWZyYW1lIG5vdCBsb2FkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRVbmxvYWRlZEdhcGlNb2R1bGVzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBcIm5ldHdvcmstcmVxdWVzdC1mYWlsZWRcIiAvKiBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQgKi8pKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBORVRXT1JLX1RJTUVPVVQuZ2V0KClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoX2IgPSAoX2EgPSBfd2luZG93KCkuZ2FwaSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmcmFtZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5JZnJhbWUpIHtcclxuICAgICAgICAgICAgLy8gSWYgZ2FwaS5pZnJhbWVzLklmcmFtZSBhdmFpbGFibGUsIHJlc29sdmUuXHJcbiAgICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCEhKChfYyA9IF93aW5kb3coKS5nYXBpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubG9hZCkpIHtcclxuICAgICAgICAgICAgLy8gR2FwaSBsb2FkZXIgcmVhZHksIGxvYWQgZ2FwaS5pZnJhbWVzLlxyXG4gICAgICAgICAgICBsb2FkR2FwaUlmcmFtZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGlmcmFtZSBjYWxsYmFjayB3aGVuIHRoaXMgaXMgY2FsbGVkIHNvIGFzIG5vdCB0byBvdmVyd3JpdGVcclxuICAgICAgICAgICAgLy8gYW55IHByZXZpb3VzIGRlZmluZWQgY2FsbGJhY2suIFRoaXMgaGFwcGVucyBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWRcclxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMgaW4gcGFyYWxsZWwgYW5kIGNvdWxkIHJlc3VsdCBpbiB0aGUgbGF0ZXIgY2FsbGJhY2tcclxuICAgICAgICAgICAgLy8gb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIG9uZS4gVGhpcyB3b3VsZCBlbmQgdXAgd2l0aCBhIGlmcmFtZVxyXG4gICAgICAgICAgICAvLyB0aW1lb3V0LlxyXG4gICAgICAgICAgICBjb25zdCBjYk5hbWUgPSBfZ2VuZXJhdGVDYWxsYmFja05hbWUoJ2lmcmFtZWZjYicpO1xyXG4gICAgICAgICAgICAvLyBHQXBpIGxvYWRlciBub3QgYXZhaWxhYmxlLCBkeW5hbWljYWxseSBsb2FkIHBsYXRmb3JtLmpzLlxyXG4gICAgICAgICAgICBfd2luZG93KClbY2JOYW1lXSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEdBcGkgbG9hZGVyIHNob3VsZCBiZSByZWFkeS5cclxuICAgICAgICAgICAgICAgIGlmICghIWdhcGkubG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRHYXBpSWZyYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBHYXBpIGxvYWRlciBmYWlsZWQsIHRocm93IGVycm9yLlxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgXCJuZXR3b3JrLXJlcXVlc3QtZmFpbGVkXCIgLyogQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEICovKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIExvYWQgR0FwaSBsb2FkZXIuXHJcbiAgICAgICAgICAgIHJldHVybiBfbG9hZEpTKGBodHRwczovL2FwaXMuZ29vZ2xlLmNvbS9qcy9hcGkuanM/b25sb2FkPSR7Y2JOYW1lfWApXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAvLyBSZXNldCBjYWNoZWQgcHJvbWlzZSB0byBhbGxvdyBmb3IgcmV0cmlhbC5cclxuICAgICAgICBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0pO1xyXG59XHJcbmxldCBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcclxuZnVuY3Rpb24gX2xvYWRHYXBpKGF1dGgpIHtcclxuICAgIGNhY2hlZEdBcGlMb2FkZXIgPSBjYWNoZWRHQXBpTG9hZGVyIHx8IGxvYWRHYXBpKGF1dGgpO1xyXG4gICAgcmV0dXJuIGNhY2hlZEdBcGlMb2FkZXI7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFBJTkdfVElNRU9VVCA9IG5ldyBEZWxheSg1MDAwLCAxNTAwMCk7XHJcbmNvbnN0IElGUkFNRV9QQVRIID0gJ19fL2F1dGgvaWZyYW1lJztcclxuY29uc3QgRU1VTEFURURfSUZSQU1FX1BBVEggPSAnZW11bGF0b3IvYXV0aC9pZnJhbWUnO1xyXG5jb25zdCBJRlJBTUVfQVRUUklCVVRFUyA9IHtcclxuICAgIHN0eWxlOiB7XHJcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgdG9wOiAnLTEwMHB4JyxcclxuICAgICAgICB3aWR0aDogJzFweCcsXHJcbiAgICAgICAgaGVpZ2h0OiAnMXB4J1xyXG4gICAgfSxcclxuICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJyxcclxuICAgIHRhYmluZGV4OiAnLTEnXHJcbn07XHJcbi8vIE1hcCBmcm9tIGFwaUhvc3QgdG8gZW5kcG9pbnQgSUQgZm9yIHBhc3NpbmcgaW50byBpZnJhbWUuIEluIGN1cnJlbnQgU0RLLCBhcGlIb3N0IGNhbiBiZSBzZXQgdG9cclxuLy8gYW55dGhpbmcgKG5vdCBmcm9tIGEgbGlzdCBvZiBlbmRwb2ludHMgd2l0aCBJRHMgYXMgaW4gbGVnYWN5KSwgc28gdGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0LlxyXG5jb25zdCBFSURfRlJPTV9BUElIT1NUID0gbmV3IE1hcChbXHJcbiAgICBbXCJpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb21cIiAvKiBEZWZhdWx0Q29uZmlnLkFQSV9IT1NUICovLCAncCddLFxyXG4gICAgWydzdGFnaW5nLWlkZW50aXR5dG9vbGtpdC5zYW5kYm94Lmdvb2dsZWFwaXMuY29tJywgJ3MnXSxcclxuICAgIFsndGVzdC1pZGVudGl0eXRvb2xraXQuc2FuZGJveC5nb29nbGVhcGlzLmNvbScsICd0J10gLy8gdGVzdFxyXG5dKTtcclxuZnVuY3Rpb24gZ2V0SWZyYW1lVXJsKGF1dGgpIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGF1dGguY29uZmlnO1xyXG4gICAgX2Fzc2VydChjb25maWcuYXV0aERvbWFpbiwgYXV0aCwgXCJhdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWRcIiAvKiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4gKi8pO1xyXG4gICAgY29uc3QgdXJsID0gY29uZmlnLmVtdWxhdG9yXHJcbiAgICAgICAgPyBfZW11bGF0b3JVcmwoY29uZmlnLCBFTVVMQVRFRF9JRlJBTUVfUEFUSClcclxuICAgICAgICA6IGBodHRwczovLyR7YXV0aC5jb25maWcuYXV0aERvbWFpbn0vJHtJRlJBTUVfUEFUSH1gO1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcclxuICAgICAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXHJcbiAgICAgICAgdjogU0RLX1ZFUlNJT05cclxuICAgIH07XHJcbiAgICBjb25zdCBlaWQgPSBFSURfRlJPTV9BUElIT1NULmdldChhdXRoLmNvbmZpZy5hcGlIb3N0KTtcclxuICAgIGlmIChlaWQpIHtcclxuICAgICAgICBwYXJhbXMuZWlkID0gZWlkO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZnJhbWV3b3JrcyA9IGF1dGguX2dldEZyYW1ld29ya3MoKTtcclxuICAgIGlmIChmcmFtZXdvcmtzLmxlbmd0aCkge1xyXG4gICAgICAgIHBhcmFtcy5mdyA9IGZyYW1ld29ya3Muam9pbignLCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3VybH0/JHtxdWVyeXN0cmluZyhwYXJhbXMpLnNsaWNlKDEpfWA7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX29wZW5JZnJhbWUoYXV0aCkge1xyXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IF9sb2FkR2FwaShhdXRoKTtcclxuICAgIGNvbnN0IGdhcGkgPSBfd2luZG93KCkuZ2FwaTtcclxuICAgIF9hc3NlcnQoZ2FwaSwgYXV0aCwgXCJpbnRlcm5hbC1lcnJvclwiIC8qIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgcmV0dXJuIGNvbnRleHQub3Blbih7XHJcbiAgICAgICAgd2hlcmU6IGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgdXJsOiBnZXRJZnJhbWVVcmwoYXV0aCksXHJcbiAgICAgICAgbWVzc2FnZUhhbmRsZXJzRmlsdGVyOiBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IElGUkFNRV9BVFRSSUJVVEVTLFxyXG4gICAgICAgIGRvbnRjbGVhcjogdHJ1ZVxyXG4gICAgfSwgKGlmcmFtZSkgPT4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGlmcmFtZS5yZXN0eWxlKHtcclxuICAgICAgICAgICAgLy8gUHJldmVudCBpZnJhbWUgZnJvbSBjbG9zaW5nIG9uIG1vdXNlIG91dC5cclxuICAgICAgICAgICAgc2V0SGlkZU9uTGVhdmU6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbmV0d29ya0Vycm9yID0gX2NyZWF0ZUVycm9yKGF1dGgsIFwibmV0d29yay1yZXF1ZXN0LWZhaWxlZFwiIC8qIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCAqLyk7XHJcbiAgICAgICAgLy8gQ29uZmlybSBpZnJhbWUgaXMgY29ycmVjdGx5IGxvYWRlZC5cclxuICAgICAgICAvLyBUbyBmYWxsYmFjayBvbiBmYWlsdXJlLCBzZXQgYSB0aW1lb3V0LlxyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtFcnJvclRpbWVyID0gX3dpbmRvdygpLnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QobmV0d29ya0Vycm9yKTtcclxuICAgICAgICB9LCBQSU5HX1RJTUVPVVQuZ2V0KCkpO1xyXG4gICAgICAgIC8vIENsZWFyIHRpbWVyIGFuZCByZXNvbHZlIHBlbmRpbmcgaWZyYW1lIHJlYWR5IHByb21pc2UuXHJcbiAgICAgICAgZnVuY3Rpb24gY2xlYXJUaW1lckFuZFJlc29sdmUoKSB7XHJcbiAgICAgICAgICAgIF93aW5kb3coKS5jbGVhclRpbWVvdXQobmV0d29ya0Vycm9yVGltZXIpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGlmcmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRoaXMgcmV0dXJucyBhbiBJVGhlbmFibGUuIEhvd2V2ZXIgdGhlIHJlamVjdCBwYXJ0IGRvZXMgbm90IGNhbGxcclxuICAgICAgICAvLyB3aGVuIHRoZSBpZnJhbWUgaXMgbm90IGxvYWRlZC5cclxuICAgICAgICBpZnJhbWUucGluZyhjbGVhclRpbWVyQW5kUmVzb2x2ZSkudGhlbihjbGVhclRpbWVyQW5kUmVzb2x2ZSwgKCkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QobmV0d29ya0Vycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgQkFTRV9QT1BVUF9PUFRJT05TID0ge1xyXG4gICAgbG9jYXRpb246ICd5ZXMnLFxyXG4gICAgcmVzaXphYmxlOiAneWVzJyxcclxuICAgIHN0YXR1c2JhcjogJ3llcycsXHJcbiAgICB0b29sYmFyOiAnbm8nXHJcbn07XHJcbmNvbnN0IERFRkFVTFRfV0lEVEggPSA1MDA7XHJcbmNvbnN0IERFRkFVTFRfSEVJR0hUID0gNjAwO1xyXG5jb25zdCBUQVJHRVRfQkxBTksgPSAnX2JsYW5rJztcclxuY29uc3QgRklSRUZPWF9FTVBUWV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdCc7XHJcbmNsYXNzIEF1dGhQb3B1cCB7XHJcbiAgICBjb25zdHJ1Y3Rvcih3aW5kb3cpIHtcclxuICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcclxuICAgICAgICB0aGlzLmFzc29jaWF0ZWRFdmVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfb3BlbihhdXRoLCB1cmwsIG5hbWUsIHdpZHRoID0gREVGQVVMVF9XSURUSCwgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQpIHtcclxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KCh3aW5kb3cuc2NyZWVuLmF2YWlsSGVpZ2h0IC0gaGVpZ2h0KSAvIDIsIDApLnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5tYXgoKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCAtIHdpZHRoKSAvIDIsIDApLnRvU3RyaW5nKCk7XHJcbiAgICBsZXQgdGFyZ2V0ID0gJyc7XHJcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBCQVNFX1BPUFVQX09QVElPTlMpLCB7IHdpZHRoOiB3aWR0aC50b1N0cmluZygpLCBoZWlnaHQ6IGhlaWdodC50b1N0cmluZygpLCB0b3AsXHJcbiAgICAgICAgbGVmdCB9KTtcclxuICAgIC8vIENocm9tZSBpT1MgNyBhbmQgOCBpcyByZXR1cm5pbmcgYW4gdW5kZWZpbmVkIHBvcHVwIHdpbiB3aGVuIHRhcmdldCBpc1xyXG4gICAgLy8gc3BlY2lmaWVkLCBldmVuIHRob3VnaCB0aGUgcG9wdXAgaXMgbm90IG5lY2Vzc2FyaWx5IGJsb2NrZWQuXHJcbiAgICBjb25zdCB1YSA9IGdldFVBKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgdGFyZ2V0ID0gX2lzQ2hyb21lSU9TKHVhKSA/IFRBUkdFVF9CTEFOSyA6IG5hbWU7XHJcbiAgICB9XHJcbiAgICBpZiAoX2lzRmlyZWZveCh1YSkpIHtcclxuICAgICAgICAvLyBGaXJlZm94IGNvbXBsYWlucyB3aGVuIGludmFsaWQgVVJMcyBhcmUgcG9wcGVkIG91dC4gSGFja3kgd2F5IHRvIGJ5cGFzcy5cclxuICAgICAgICB1cmwgPSB1cmwgfHwgRklSRUZPWF9FTVBUWV9VUkw7XHJcbiAgICAgICAgLy8gRmlyZWZveCBkaXNhYmxlcyBieSBkZWZhdWx0IHNjcm9sbGluZyBvbiBwb3B1cCB3aW5kb3dzLCB3aGljaCBjYW4gY3JlYXRlXHJcbiAgICAgICAgLy8gaXNzdWVzIHdoZW4gdGhlIHVzZXIgaGFzIG1hbnkgR29vZ2xlIGFjY291bnRzLCBmb3IgaW5zdGFuY2UuXHJcbiAgICAgICAgb3B0aW9ucy5zY3JvbGxiYXJzID0gJ3llcyc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zU3RyaW5nID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykucmVkdWNlKChhY2N1bSwgW2tleSwgdmFsdWVdKSA9PiBgJHthY2N1bX0ke2tleX09JHt2YWx1ZX0sYCwgJycpO1xyXG4gICAgaWYgKF9pc0lPU1N0YW5kYWxvbmUodWEpICYmIHRhcmdldCAhPT0gJ19zZWxmJykge1xyXG4gICAgICAgIG9wZW5Bc05ld1dpbmRvd0lPUyh1cmwgfHwgJycsIHRhcmdldCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRoUG9wdXAobnVsbCk7XHJcbiAgICB9XHJcbiAgICAvLyBhYm91dDpibGFuayBnZXR0aW5nIHNhbml0aXplZCBjYXVzaW5nIGJyb3dzZXJzIGxpa2UgSUUvRWRnZSB0byBkaXNwbGF5XHJcbiAgICAvLyBicmllZiBlcnJvciBtZXNzYWdlIGJlZm9yZSByZWRpcmVjdGluZyB0byBoYW5kbGVyLlxyXG4gICAgY29uc3QgbmV3V2luID0gd2luZG93Lm9wZW4odXJsIHx8ICcnLCB0YXJnZXQsIG9wdGlvbnNTdHJpbmcpO1xyXG4gICAgX2Fzc2VydChuZXdXaW4sIGF1dGgsIFwicG9wdXAtYmxvY2tlZFwiIC8qIEF1dGhFcnJvckNvZGUuUE9QVVBfQkxPQ0tFRCAqLyk7XHJcbiAgICAvLyBGbGFreSBvbiBJRSBlZGdlLCBlbmNhcHN1bGF0ZSB3aXRoIGEgdHJ5IGFuZCBjYXRjaC5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgbmV3V2luLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICByZXR1cm4gbmV3IEF1dGhQb3B1cChuZXdXaW4pO1xyXG59XHJcbmZ1bmN0aW9uIG9wZW5Bc05ld1dpbmRvd0lPUyh1cmwsIHRhcmdldCkge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBlbC5ocmVmID0gdXJsO1xyXG4gICAgZWwudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgY29uc3QgY2xpY2sgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xyXG4gICAgY2xpY2suaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAxLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMSwgbnVsbCk7XHJcbiAgICBlbC5kaXNwYXRjaEV2ZW50KGNsaWNrKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVVJMIGZvciBBdXRoZW50aWNhdGlvbiB3aWRnZXQgd2hpY2ggd2lsbCBpbml0aWF0ZSB0aGUgT0F1dGggaGFuZHNoYWtlXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuY29uc3QgV0lER0VUX1BBVEggPSAnX18vYXV0aC9oYW5kbGVyJztcclxuLyoqXHJcbiAqIFVSTCBmb3IgZW11bGF0ZWQgZW52aXJvbm1lbnRcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBFTVVMQVRPUl9XSURHRVRfUEFUSCA9ICdlbXVsYXRvci9hdXRoL2hhbmRsZXInO1xyXG4vKipcclxuICogRnJhZ21lbnQgbmFtZSBmb3IgdGhlIEFwcCBDaGVjayB0b2tlbiB0aGF0IGdldHMgcGFzc2VkIHRvIHRoZSB3aWRnZXRcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUQgPSBlbmNvZGVVUklDb21wb25lbnQoJ2ZhYycpO1xyXG5hc3luYyBmdW5jdGlvbiBfZ2V0UmVkaXJlY3RVcmwoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCByZWRpcmVjdFVybCwgZXZlbnRJZCwgYWRkaXRpb25hbFBhcmFtcykge1xyXG4gICAgX2Fzc2VydChhdXRoLmNvbmZpZy5hdXRoRG9tYWluLCBhdXRoLCBcImF1dGgtZG9tYWluLWNvbmZpZy1yZXF1aXJlZFwiIC8qIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BVVRIX0RPTUFJTiAqLyk7XHJcbiAgICBfYXNzZXJ0KGF1dGguY29uZmlnLmFwaUtleSwgYXV0aCwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBJX0tFWSAqLyk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgYXBpS2V5OiBhdXRoLmNvbmZpZy5hcGlLZXksXHJcbiAgICAgICAgYXBwTmFtZTogYXV0aC5uYW1lLFxyXG4gICAgICAgIGF1dGhUeXBlLFxyXG4gICAgICAgIHJlZGlyZWN0VXJsLFxyXG4gICAgICAgIHY6IFNES19WRVJTSU9OLFxyXG4gICAgICAgIGV2ZW50SWRcclxuICAgIH07XHJcbiAgICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpIHtcclxuICAgICAgICBwcm92aWRlci5zZXREZWZhdWx0TGFuZ3VhZ2UoYXV0aC5sYW5ndWFnZUNvZGUpO1xyXG4gICAgICAgIHBhcmFtcy5wcm92aWRlcklkID0gcHJvdmlkZXIucHJvdmlkZXJJZCB8fCAnJztcclxuICAgICAgICBpZiAoIWlzRW1wdHkocHJvdmlkZXIuZ2V0Q3VzdG9tUGFyYW1ldGVycygpKSkge1xyXG4gICAgICAgICAgICBwYXJhbXMuY3VzdG9tUGFyYW1ldGVycyA9IEpTT04uc3RyaW5naWZ5KHByb3ZpZGVyLmdldEN1c3RvbVBhcmFtZXRlcnMoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gc2V0IGFkZGl0aW9uYWxQYXJhbXMgZnJvbSB0aGUgcHJvdmlkZXIgYXMgd2VsbD9cclxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsUGFyYW1zIHx8IHt9KSkge1xyXG4gICAgICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIEJhc2VPQXV0aFByb3ZpZGVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gcHJvdmlkZXIuZ2V0U2NvcGVzKCkuZmlsdGVyKHNjb3BlID0+IHNjb3BlICE9PSAnJyk7XHJcbiAgICAgICAgaWYgKHNjb3Blcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5zY29wZXMgPSBzY29wZXMuam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhdXRoLnRlbmFudElkKSB7XHJcbiAgICAgICAgcGFyYW1zLnRpZCA9IGF1dGgudGVuYW50SWQ7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBtYXliZSBzZXQgZWlkIGFzIGVuZGlwb2ludElkXHJcbiAgICAvLyBUT0RPOiBtYXliZSBzZXQgZncgYXMgRnJhbWV3b3Jrcy5qb2luKFwiLFwiKVxyXG4gICAgY29uc3QgcGFyYW1zRGljdCA9IHBhcmFtcztcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtc0RpY3QpKSB7XHJcbiAgICAgICAgaWYgKHBhcmFtc0RpY3Rba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXNEaWN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gU2V0cyB0aGUgQXBwIENoZWNrIHRva2VuIHRvIHBhc3MgdG8gdGhlIHdpZGdldFxyXG4gICAgY29uc3QgYXBwQ2hlY2tUb2tlbiA9IGF3YWl0IGF1dGguX2dldEFwcENoZWNrVG9rZW4oKTtcclxuICAgIGNvbnN0IGFwcENoZWNrVG9rZW5GcmFnbWVudCA9IGFwcENoZWNrVG9rZW5cclxuICAgICAgICA/IGAjJHtGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUR9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGFwcENoZWNrVG9rZW4pfWBcclxuICAgICAgICA6ICcnO1xyXG4gICAgLy8gU3RhcnQgYXQgaW5kZXggMSB0byBza2lwIHRoZSBsZWFkaW5nICcmJyBpbiB0aGUgcXVlcnkgc3RyaW5nXHJcbiAgICByZXR1cm4gYCR7Z2V0SGFuZGxlckJhc2UoYXV0aCl9PyR7cXVlcnlzdHJpbmcocGFyYW1zRGljdCkuc2xpY2UoMSl9JHthcHBDaGVja1Rva2VuRnJhZ21lbnR9YDtcclxufVxyXG5mdW5jdGlvbiBnZXRIYW5kbGVyQmFzZSh7IGNvbmZpZyB9KSB7XHJcbiAgICBpZiAoIWNvbmZpZy5lbXVsYXRvcikge1xyXG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly8ke2NvbmZpZy5hdXRoRG9tYWlufS8ke1dJREdFVF9QQVRIfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX2VtdWxhdG9yVXJsKGNvbmZpZywgRU1VTEFUT1JfV0lER0VUX1BBVEgpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgc3BlY2lhbCB3ZWIgc3RvcmFnZSBldmVudFxyXG4gKlxyXG4gKi9cclxuY29uc3QgV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVkgPSAnd2ViU3RvcmFnZVN1cHBvcnQnO1xyXG5jbGFzcyBCcm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaWZyYW1lcyA9IHt9O1xyXG4gICAgICAgIHRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzID0ge307XHJcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XHJcbiAgICAgICAgdGhpcy5fY29tcGxldGVSZWRpcmVjdEZuID0gX2dldFJlZGlyZWN0UmVzdWx0O1xyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQgPSBfb3ZlcnJpZGVSZWRpcmVjdFJlc3VsdDtcclxuICAgIH1cclxuICAgIC8vIFdyYXBwaW5nIGluIGFzeW5jIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGF3YWl0IGFueXdoZXJlIGluIG9yZGVyXHJcbiAgICAvLyB0byBtYWtlIHN1cmUgZXJyb3JzIGFyZSByYWlzZWQgYXMgcHJvbWlzZSByZWplY3Rpb25zXHJcbiAgICBhc3luYyBfb3BlblBvcHVwKGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBkZWJ1Z0Fzc2VydCgoX2EgPSB0aGlzLmV2ZW50TWFuYWdlcnNbYXV0aC5fa2V5KCldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFuYWdlciwgJ19pbml0aWFsaXplKCkgbm90IGNhbGxlZCBiZWZvcmUgX29wZW5Qb3B1cCgpJyk7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgX2dldFJlZGlyZWN0VXJsKGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgX2dldEN1cnJlbnRVcmwoKSwgZXZlbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIF9vcGVuKGF1dGgsIHVybCwgX2dlbmVyYXRlRXZlbnRJZCgpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBldmVudElkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fb3JpZ2luVmFsaWRhdGlvbihhdXRoKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBfZ2V0UmVkaXJlY3RVcmwoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBfZ2V0Q3VycmVudFVybCgpLCBldmVudElkKTtcclxuICAgICAgICBfc2V0V2luZG93TG9jYXRpb24odXJsKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4geyB9KTtcclxuICAgIH1cclxuICAgIF9pbml0aWFsaXplKGF1dGgpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcclxuICAgICAgICBpZiAodGhpcy5ldmVudE1hbmFnZXJzW2tleV0pIHtcclxuICAgICAgICAgICAgY29uc3QgeyBtYW5hZ2VyLCBwcm9taXNlIH0gPSB0aGlzLmV2ZW50TWFuYWdlcnNba2V5XTtcclxuICAgICAgICAgICAgaWYgKG1hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFuYWdlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWJ1Z0Fzc2VydChwcm9taXNlLCAnSWYgbWFuYWdlciBpcyBub3Qgc2V0LCBwcm9taXNlIHNob3VsZCBiZScpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuaW5pdEFuZEdldE1hbmFnZXIoYXV0aCk7XHJcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2tleV0gPSB7IHByb21pc2UgfTtcclxuICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCwgdGhlIGtleSBzaG91bGQgYmUgcmVtb3ZlZCBzbyB0aGF0IHRoZVxyXG4gICAgICAgIC8vIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZCBsYXRlci5cclxuICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgaW5pdEFuZEdldE1hbmFnZXIoYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGF3YWl0IF9vcGVuSWZyYW1lKGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcclxuICAgICAgICBpZnJhbWUucmVnaXN0ZXIoJ2F1dGhFdmVudCcsIChpZnJhbWVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBfYXNzZXJ0KGlmcmFtZUV2ZW50ID09PSBudWxsIHx8IGlmcmFtZUV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpZnJhbWVFdmVudC5hdXRoRXZlbnQsIGF1dGgsIFwiaW52YWxpZC1hdXRoLWV2ZW50XCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhfRVZFTlQgKi8pO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBzcGxpdHRpbmcgcmVkaXJlY3QgYW5kIHBvcHVwIGV2ZW50cyBlYXJsaWVyIG9uXHJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBtYW5hZ2VyLm9uRXZlbnQoaWZyYW1lRXZlbnQuYXV0aEV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBoYW5kbGVkID8gXCJBQ0tcIiAvKiBHYXBpT3V0Y29tZS5BQ0sgKi8gOiBcIkVSUk9SXCIgLyogR2FwaU91dGNvbWUuRVJST1IgKi8gfTtcclxuICAgICAgICB9LCBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSKTtcclxuICAgICAgICB0aGlzLmV2ZW50TWFuYWdlcnNbYXV0aC5fa2V5KCldID0geyBtYW5hZ2VyIH07XHJcbiAgICAgICAgdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXSA9IGlmcmFtZTtcclxuICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgIH1cclxuICAgIF9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQoYXV0aCwgY2IpIHtcclxuICAgICAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmlmcmFtZXNbYXV0aC5fa2V5KCldO1xyXG4gICAgICAgIGlmcmFtZS5zZW5kKFdFQl9TVE9SQUdFX1NVUFBPUlRfS0VZLCB7IHR5cGU6IFdFQl9TVE9SQUdFX1NVUFBPUlRfS0VZIH0sIHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgY29uc3QgaXNTdXBwb3J0ZWQgPSAoX2EgPSByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN1bHRbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWV07XHJcbiAgICAgICAgICAgIGlmIChpc1N1cHBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjYighIWlzU3VwcG9ydGVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfZmFpbChhdXRoLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgfSwgZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUik7XHJcbiAgICB9XHJcbiAgICBfb3JpZ2luVmFsaWRhdGlvbihhdXRoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXV0aC5fa2V5KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luVmFsaWRhdGlvblByb21pc2VzW2tleV0gPSBfdmFsaWRhdGVPcmlnaW4oYXV0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9zaG91bGRJbml0UHJvYWN0aXZlbHkoKSB7XHJcbiAgICAgICAgLy8gTW9iaWxlIGJyb3dzZXJzIGFuZCBTYWZhcmkgbmVlZCB0byBvcHRpbWlzdGljYWxseSBpbml0aWFsaXplXHJcbiAgICAgICAgcmV0dXJuIF9pc01vYmlsZUJyb3dzZXIoKSB8fCBfaXNTYWZhcmkoKSB8fCBfaXNJT1MoKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGJyb3dzZXJcclxuICogYmFzZWQgYXBwbGljYXRpb25zLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jb25zdCBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyID0gQnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcjtcblxuY2xhc3MgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGZhY3RvcklkKSB7XHJcbiAgICAgICAgdGhpcy5mYWN0b3JJZCA9IGZhY3RvcklkO1xyXG4gICAgfVxyXG4gICAgX3Byb2Nlc3MoYXV0aCwgc2Vzc2lvbiwgZGlzcGxheU5hbWUpIHtcclxuICAgICAgICBzd2l0Y2ggKHNlc3Npb24udHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZW5yb2xsXCIgLyogTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEwgKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVFbnJvbGwoYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsLCBkaXNwbGF5TmFtZSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzaWduaW5cIiAvKiBNdWx0aUZhY3RvclNlc3Npb25UeXBlLlNJR05fSU4gKi86XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVTaWduSW4oYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ3VuZXhwZWN0ZWQgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICoge0Bpbmhlcml0ZG9jIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259XHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNsYXNzIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIGV4dGVuZHMgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIHtcclxuICAgIGNvbnN0cnVjdG9yKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICBzdXBlcihcInBob25lXCIgLyogRmFjdG9ySWQuUEhPTkUgKi8pO1xyXG4gICAgICAgIHRoaXMuY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21DcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsKGNyZWRlbnRpYWwpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX2ZpbmFsaXplRW5yb2xsKGF1dGgsIGlkVG9rZW4sIGRpc3BsYXlOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplRW5yb2xsUGhvbmVNZmEoYXV0aCwge1xyXG4gICAgICAgICAgICBpZFRva2VuLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcclxuICAgICAgICAgICAgcGhvbmVWZXJpZmljYXRpb25JbmZvOiB0aGlzLmNyZWRlbnRpYWwuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KClcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIF9maW5hbGl6ZVNpZ25JbihhdXRoLCBtZmFQZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBmaW5hbGl6ZVNpZ25JblBob25lTWZhKGF1dGgsIHtcclxuICAgICAgICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWwsXHJcbiAgICAgICAgICAgIHBob25lVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5jcmVkZW50aWFsLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGEge0BsaW5rIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259LlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5jbGFzcyBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yIHtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIGEge0BsaW5rIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259IHRvIGNvbmZpcm0gb3duZXJzaGlwIG9mIHRoZSBwaG9uZSBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwaG9uZUF1dGhDcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIHByb3ZpZGVkIGJ5IHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfS5cclxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259IHdoaWNoIGNhbiBiZSB1c2VkIHdpdGhcclxuICAgICAqIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyLnJlc29sdmVTaWduSW59XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhc3NlcnRpb24oY3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbC5fZnJvbUNyZWRlbnRpYWwoY3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwaG9uZSBzZWNvbmQgZmFjdG9yOiBgcGhvbmVgLlxyXG4gKi9cclxuUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvci5GQUNUT1JfSUQgPSAncGhvbmUnO1xuXG4vKipcclxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgVG90cE11bHRpRmFjdG9yR2VuZXJhdG9yIHtcclxuICAgIC8qKlxyXG4gICAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZlxyXG4gICAgICogdGhlIFRPVFAgKHRpbWUtYmFzZWQgb25lLXRpbWUgcGFzc3dvcmQpIHNlY29uZCBmYWN0b3IuXHJcbiAgICAgKiBUaGlzIGFzc2VydGlvbiBpcyB1c2VkIHRvIGNvbXBsZXRlIGVucm9sbG1lbnQgaW4gVE9UUCBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzZWNyZXQgQSB7QGxpbmsgVG90cFNlY3JldH0gY29udGFpbmluZyB0aGUgc2hhcmVkIHNlY3JldCBrZXkgYW5kIG90aGVyIFRPVFAgcGFyYW1ldGVycy5cclxuICAgICAqIEBwYXJhbSBvbmVUaW1lUGFzc3dvcmQgT25lLXRpbWUgcGFzc3dvcmQgZnJvbSBUT1RQIEFwcC5cclxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxyXG4gICAgICoge0BsaW5rIE11bHRpRmFjdG9yVXNlci5lbnJvbGx9LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXNzZXJ0aW9uRm9yRW5yb2xsbWVudChzZWNyZXQsIG9uZVRpbWVQYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tU2VjcmV0KHNlY3JldCwgb25lVGltZVBhc3N3b3JkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgVE9UUCBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICogVGhpcyBhc3NlcnRpb24gaXMgdXNlZCB0byBjb21wbGV0ZSBzaWduSW4gd2l0aCBUT1RQIGFzIHRoZSBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgaWRlbnRpZmllcyB0aGUgZW5yb2xsZWQgVE9UUCBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICogQHBhcmFtIG9uZVRpbWVQYXNzd29yZCBPbmUtdGltZSBwYXNzd29yZCBmcm9tIFRPVFAgQXBwLlxyXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXHJcbiAgICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzc2VydGlvbkZvclNpZ25JbihlbnJvbGxtZW50SWQsIG9uZVRpbWVQYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tRW5yb2xsbWVudElkKGVucm9sbG1lbnRJZCwgb25lVGltZVBhc3N3b3JkKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdG8ge0BsaW5rIFRvdHBTZWNyZXR9IHdoaWNoIGNvbnRhaW5zIHRoZSBUT1RQIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBwYXJhbWV0ZXJzLlxyXG4gICAgICogQ3JlYXRlcyBhIFRPVFAgc2VjcmV0IGFzIHBhcnQgb2YgZW5yb2xsaW5nIGEgVE9UUCBzZWNvbmQgZmFjdG9yLlxyXG4gICAgICogVXNlZCBmb3IgZ2VuZXJhdGluZyBhIFFSIGNvZGUgVVJMIG9yIGlucHV0dGluZyBpbnRvIGEgVE9UUCBhcHAuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBhdXRoIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgaW4gdGhlIG11bHRpRmFjdG9yU2Vzc2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUge0BsaW5rIE11bHRpRmFjdG9yU2Vzc2lvbn0gdGhhdCB0aGUgdXNlciBpcyBwYXJ0IG9mLlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHtAbGluayBUb3RwU2VjcmV0fS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFzeW5jIGdlbmVyYXRlU2VjcmV0KHNlc3Npb24pIHtcclxuICAgICAgICBjb25zdCBtZmFTZXNzaW9uID0gc2Vzc2lvbjtcclxuICAgICAgICBfYXNzZXJ0KHR5cGVvZiBtZmFTZXNzaW9uLmF1dGggIT09ICd1bmRlZmluZWQnLCBcImludGVybmFsLWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydEVucm9sbFRvdHBNZmEobWZhU2Vzc2lvbi5hdXRoLCB7XHJcbiAgICAgICAgICAgIGlkVG9rZW46IG1mYVNlc3Npb24uY3JlZGVudGlhbCxcclxuICAgICAgICAgICAgdG90cEVucm9sbG1lbnRJbmZvOiB7fVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBUb3RwU2VjcmV0Ll9mcm9tU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlKHJlc3BvbnNlLCBtZmFTZXNzaW9uLmF1dGgpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgVE9UUCBzZWNvbmQgZmFjdG9yOiBgdG90cGAuXHJcbiAqL1xyXG5Ub3RwTXVsdGlGYWN0b3JHZW5lcmF0b3IuRkFDVE9SX0lEID0gXCJ0b3RwXCIgLyogRmFjdG9ySWQuVE9UUCAqLztcclxuY2xhc3MgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCBleHRlbmRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihvdHAsIGVucm9sbG1lbnRJZCwgc2VjcmV0KSB7XHJcbiAgICAgICAgc3VwZXIoXCJ0b3RwXCIgLyogRmFjdG9ySWQuVE9UUCAqLyk7XHJcbiAgICAgICAgdGhpcy5vdHAgPSBvdHA7XHJcbiAgICAgICAgdGhpcy5lbnJvbGxtZW50SWQgPSBlbnJvbGxtZW50SWQ7XHJcbiAgICAgICAgdGhpcy5zZWNyZXQgPSBzZWNyZXQ7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21TZWNyZXQoc2VjcmV0LCBvdHApIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwob3RwLCB1bmRlZmluZWQsIHNlY3JldCk7XHJcbiAgICB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzdGF0aWMgX2Zyb21FbnJvbGxtZW50SWQoZW5yb2xsbWVudElkLCBvdHApIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwob3RwLCBlbnJvbGxtZW50SWQpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYXN5bmMgX2ZpbmFsaXplRW5yb2xsKGF1dGgsIGlkVG9rZW4sIGRpc3BsYXlOYW1lKSB7XHJcbiAgICAgICAgX2Fzc2VydCh0eXBlb2YgdGhpcy5zZWNyZXQgIT09ICd1bmRlZmluZWQnLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplRW5yb2xsVG90cE1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgIGlkVG9rZW4sXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxyXG4gICAgICAgICAgICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5zZWNyZXQuX21ha2VUb3RwVmVyaWZpY2F0aW9uSW5mbyh0aGlzLm90cClcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFzeW5jIF9maW5hbGl6ZVNpZ25JbihhdXRoLCBtZmFQZW5kaW5nQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIF9hc3NlcnQodGhpcy5lbnJvbGxtZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm90cCAhPT0gdW5kZWZpbmVkLCBhdXRoLCBcImFyZ3VtZW50LWVycm9yXCIgLyogQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLyk7XHJcbiAgICAgICAgY29uc3QgdG90cFZlcmlmaWNhdGlvbkluZm8gPSB7IHZlcmlmaWNhdGlvbkNvZGU6IHRoaXMub3RwIH07XHJcbiAgICAgICAgcmV0dXJuIGZpbmFsaXplU2lnbkluVG90cE1mYShhdXRoLCB7XHJcbiAgICAgICAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsLFxyXG4gICAgICAgICAgICBtZmFFbnJvbGxtZW50SWQ6IHRoaXMuZW5yb2xsbWVudElkLFxyXG4gICAgICAgICAgICB0b3RwVmVyaWZpY2F0aW9uSW5mb1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhIHtAbGluayBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb259LlxyXG4gKlxyXG4gKiBTdG9yZXMgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBwYXJhbWV0ZXJzIHRvIGdlbmVyYXRlIHRpbWUtYmFzZWQgT1RQcy5cclxuICogSW1wbGVtZW50cyBtZXRob2RzIHRvIHJldHJpZXZlIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBhbmQgZ2VuZXJhdGUgYSBRUiBjb2RlIFVSTC5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuY2xhc3MgVG90cFNlY3JldCB7XHJcbiAgICAvLyBUaGUgcHVibGljIG1lbWJlcnMgYXJlIGRlY2xhcmVkIG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIHNvIHRoZSBkb2NzIGNhbiBiZSBnZW5lcmF0ZWQuXHJcbiAgICBjb25zdHJ1Y3RvcihzZWNyZXRLZXksIGhhc2hpbmdBbGdvcml0aG0sIGNvZGVMZW5ndGgsIGNvZGVJbnRlcnZhbFNlY29uZHMsIGVucm9sbG1lbnRDb21wbGV0aW9uRGVhZGxpbmUsIHNlc3Npb25JbmZvLCBhdXRoKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IHNlc3Npb25JbmZvO1xyXG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XHJcbiAgICAgICAgdGhpcy5zZWNyZXRLZXkgPSBzZWNyZXRLZXk7XHJcbiAgICAgICAgdGhpcy5oYXNoaW5nQWxnb3JpdGhtID0gaGFzaGluZ0FsZ29yaXRobTtcclxuICAgICAgICB0aGlzLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuY29kZUludGVydmFsU2Vjb25kcyA9IGNvZGVJbnRlcnZhbFNlY29uZHM7XHJcbiAgICAgICAgdGhpcy5lbnJvbGxtZW50Q29tcGxldGlvbkRlYWRsaW5lID0gZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZTtcclxuICAgIH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXRpYyBfZnJvbVN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZShyZXNwb25zZSwgYXV0aCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgVG90cFNlY3JldChyZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uc2hhcmVkU2VjcmV0S2V5LCByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uaGFzaGluZ0FsZ29yaXRobSwgcmVzcG9uc2UudG90cFNlc3Npb25JbmZvLnZlcmlmaWNhdGlvbkNvZGVMZW5ndGgsIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5wZXJpb2RTZWMsIG5ldyBEYXRlKHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5maW5hbGl6ZUVucm9sbG1lbnRUaW1lKS50b1VUQ1N0cmluZygpLCByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uc2Vzc2lvbkluZm8sIGF1dGgpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgX21ha2VUb3RwVmVyaWZpY2F0aW9uSW5mbyhvdHApIHtcclxuICAgICAgICByZXR1cm4geyBzZXNzaW9uSW5mbzogdGhpcy5zZXNzaW9uSW5mbywgdmVyaWZpY2F0aW9uQ29kZTogb3RwIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBRUiBjb2RlIFVSTCBhcyBkZXNjcmliZWQgaW5cclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xlLWF1dGhlbnRpY2F0b3Ivd2lraS9LZXktVXJpLUZvcm1hdFxyXG4gICAgICogVGhpcyBjYW4gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFzIGEgUVIgY29kZSB0byBiZSBzY2FubmVkIGludG8gYSBUT1RQIGFwcCBsaWtlIEdvb2dsZSBBdXRoZW50aWNhdG9yLlxyXG4gICAgICogSWYgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVuc3BlY2lmaWVkLCBhbiBhY2NvdW50TmFtZSBvZiA8dXNlckVtYWlsPiBhbmQgaXNzdWVyIG9mIDxmaXJlYmFzZUFwcE5hbWU+IGFyZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhY2NvdW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudC9hcHAgYWxvbmcgd2l0aCBhIHVzZXIgaWRlbnRpZmllci5cclxuICAgICAqIEBwYXJhbSBpc3N1ZXIgaXNzdWVyIG9mIHRoZSBUT1RQIChsaWtlbHkgdGhlIGFwcCBuYW1lKS5cclxuICAgICAqIEByZXR1cm5zIEEgUVIgY29kZSBVUkwgc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBnZW5lcmF0ZVFyQ29kZVVybChhY2NvdW50TmFtZSwgaXNzdWVyKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGxldCB1c2VEZWZhdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChfaXNFbXB0eVN0cmluZyhhY2NvdW50TmFtZSkgfHwgX2lzRW1wdHlTdHJpbmcoaXNzdWVyKSkge1xyXG4gICAgICAgICAgICB1c2VEZWZhdWx0cyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh1c2VEZWZhdWx0cykge1xyXG4gICAgICAgICAgICBpZiAoX2lzRW1wdHlTdHJpbmcoYWNjb3VudE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBhY2NvdW50TmFtZSA9ICgoX2EgPSB0aGlzLmF1dGguY3VycmVudFVzZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbWFpbCkgfHwgJ3Vua25vd251c2VyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoX2lzRW1wdHlTdHJpbmcoaXNzdWVyKSkge1xyXG4gICAgICAgICAgICAgICAgaXNzdWVyID0gdGhpcy5hdXRoLm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGBvdHBhdXRoOi8vdG90cC8ke2lzc3Vlcn06JHthY2NvdW50TmFtZX0/c2VjcmV0PSR7dGhpcy5zZWNyZXRLZXl9Jmlzc3Vlcj0ke2lzc3Vlcn0mYWxnb3JpdGhtPSR7dGhpcy5oYXNoaW5nQWxnb3JpdGhtfSZkaWdpdHM9JHt0aGlzLmNvZGVMZW5ndGh9YDtcclxuICAgIH1cclxufVxyXG4vKiogQGludGVybmFsICovXHJcbmZ1bmN0aW9uIF9pc0VtcHR5U3RyaW5nKGlucHV0KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAndW5kZWZpbmVkJyB8fCAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlucHV0Lmxlbmd0aCkgPT09IDA7XHJcbn1cblxudmFyIG5hbWUgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG52YXIgdmVyc2lvbiA9IFwiMC4yMy4yXCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEF1dGhJbnRlcm9wIHtcclxuICAgIGNvbnN0cnVjdG9yKGF1dGgpIHtcclxuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICBnZXRVaWQoKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVpZCkgfHwgbnVsbDtcclxuICAgIH1cclxuICAgIGFzeW5jIGdldFRva2VuKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcclxuICAgICAgICBpZiAoIXRoaXMuYXV0aC5jdXJyZW50VXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudFVzZXIuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xyXG4gICAgICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuIH07XHJcbiAgICB9XHJcbiAgICBhZGRBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbExpc3RlbmVycy5oYXMobGlzdGVuZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmF1dGgub25JZFRva2VuQ2hhbmdlZCh1c2VyID0+IHtcclxuICAgICAgICAgICAgbGlzdGVuZXIoKHVzZXIgPT09IG51bGwgfHwgdXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdXNlci5zdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW4pIHx8IG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuc2V0KGxpc3RlbmVyLCB1bnN1YnNjcmliZSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICByZW1vdmVBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcclxuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyKTtcclxuICAgICAgICBpZiAoIXVuc3Vic2NyaWJlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbExpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xyXG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICBhc3NlcnRBdXRoQ29uZmlndXJlZCgpIHtcclxuICAgICAgICBfYXNzZXJ0KHRoaXMuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlLCBcImRlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGhcIiAvKiBBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSCAqLyk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsTGlzdGVuZXJzLnNpemUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGguX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFZlcnNpb25Gb3JQbGF0Zm9ybShjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgICAgIGNhc2UgXCJOb2RlXCIgLyogQ2xpZW50UGxhdGZvcm0uTk9ERSAqLzpcclxuICAgICAgICAgICAgcmV0dXJuICdub2RlJztcclxuICAgICAgICBjYXNlIFwiUmVhY3ROYXRpdmVcIiAvKiBDbGllbnRQbGF0Zm9ybS5SRUFDVF9OQVRJVkUgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAncm4nO1xyXG4gICAgICAgIGNhc2UgXCJXb3JrZXJcIiAvKiBDbGllbnRQbGF0Zm9ybS5XT1JLRVIgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAnd2Vid29ya2VyJztcclxuICAgICAgICBjYXNlIFwiQ29yZG92YVwiIC8qIENsaWVudFBsYXRmb3JtLkNPUkRPVkEgKi86XHJcbiAgICAgICAgICAgIHJldHVybiAnY29yZG92YSc7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxufVxyXG4vKiogQGludGVybmFsICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyQXV0aChjbGllbnRQbGF0Zm9ybSkge1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoXCJhdXRoXCIgLyogX0NvbXBvbmVudE5hbWUuQVVUSCAqLywgKGNvbnRhaW5lciwgeyBvcHRpb25zOiBkZXBzIH0pID0+IHtcclxuICAgICAgICBjb25zdCBhcHAgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcCcpLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlciA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignaGVhcnRiZWF0Jyk7XHJcbiAgICAgICAgY29uc3QgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcC1jaGVjay1pbnRlcm5hbCcpO1xyXG4gICAgICAgIGNvbnN0IHsgYXBpS2V5LCBhdXRoRG9tYWluIH0gPSBhcHAub3B0aW9ucztcclxuICAgICAgICBfYXNzZXJ0KGFwaUtleSAmJiAhYXBpS2V5LmluY2x1ZGVzKCc6JyksIFwiaW52YWxpZC1hcGkta2V5XCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVkgKi8sIHsgYXBwTmFtZTogYXBwLm5hbWUgfSk7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlLZXksXHJcbiAgICAgICAgICAgIGF1dGhEb21haW4sXHJcbiAgICAgICAgICAgIGNsaWVudFBsYXRmb3JtLFxyXG4gICAgICAgICAgICBhcGlIb3N0OiBcImlkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbVwiIC8qIERlZmF1bHRDb25maWcuQVBJX0hPU1QgKi8sXHJcbiAgICAgICAgICAgIHRva2VuQXBpSG9zdDogXCJzZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbVwiIC8qIERlZmF1bHRDb25maWcuVE9LRU5fQVBJX0hPU1QgKi8sXHJcbiAgICAgICAgICAgIGFwaVNjaGVtZTogXCJodHRwc1wiIC8qIERlZmF1bHRDb25maWcuQVBJX1NDSEVNRSAqLyxcclxuICAgICAgICAgICAgc2RrQ2xpZW50VmVyc2lvbjogX2dldENsaWVudFZlcnNpb24oY2xpZW50UGxhdGZvcm0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBhdXRoSW5zdGFuY2UgPSBuZXcgQXV0aEltcGwoYXBwLCBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIsIGFwcENoZWNrU2VydmljZVByb3ZpZGVyLCBjb25maWcpO1xyXG4gICAgICAgIF9pbml0aWFsaXplQXV0aEluc3RhbmNlKGF1dGhJbnN0YW5jZSwgZGVwcyk7XHJcbiAgICAgICAgcmV0dXJuIGF1dGhJbnN0YW5jZTtcclxuICAgIH0sIFwiUFVCTElDXCIgLyogQ29tcG9uZW50VHlwZS5QVUJMSUMgKi8pXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXV0aCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBieSBleHBsaWNpdGx5IGNhbGxpbmcgZ2V0QXV0aCgpIG9yIGluaXRpYWxpemVBdXRoKClcclxuICAgICAgICAgKiBGb3Igd2h5IHdlIGRvIHRoaXMsIFNlZSBnby9maXJlYmFzZS1uZXh0LWF1dGgtaW5pdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC5zZXRJbnN0YW50aWF0aW9uTW9kZShcIkVYUExJQ0lUXCIgLyogSW5zdGFudGlhdGlvbk1vZGUuRVhQTElDSVQgKi8pXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQmVjYXVzZSBhbGwgZmlyZWJhc2UgcHJvZHVjdHMgdGhhdCBkZXBlbmQgb24gYXV0aCBkZXBlbmQgb24gYXV0aC1pbnRlcm5hbCBkaXJlY3RseSxcclxuICAgICAgICAgKiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgYXV0aC1pbnRlcm5hbCBhZnRlciBhdXRoIGlzIGluaXRpYWxpemVkIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIG90aGVyIGZpcmViYXNlIHByb2R1Y3RzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC5zZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjaygoY29udGFpbmVyLCBfaW5zdGFuY2VJZGVudGlmaWVyLCBfaW5zdGFuY2UpID0+IHtcclxuICAgICAgICBjb25zdCBhdXRoSW50ZXJuYWxQcm92aWRlciA9IGNvbnRhaW5lci5nZXRQcm92aWRlcihcImF1dGgtaW50ZXJuYWxcIiAvKiBfQ29tcG9uZW50TmFtZS5BVVRIX0lOVEVSTkFMICovKTtcclxuICAgICAgICBhdXRoSW50ZXJuYWxQcm92aWRlci5pbml0aWFsaXplKCk7XHJcbiAgICB9KSk7XHJcbiAgICBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudChcImF1dGgtaW50ZXJuYWxcIiAvKiBfQ29tcG9uZW50TmFtZS5BVVRIX0lOVEVSTkFMICovLCBjb250YWluZXIgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGggPSBfY2FzdEF1dGgoY29udGFpbmVyLmdldFByb3ZpZGVyKFwiYXV0aFwiIC8qIF9Db21wb25lbnROYW1lLkFVVEggKi8pLmdldEltbWVkaWF0ZSgpKTtcclxuICAgICAgICByZXR1cm4gKGF1dGggPT4gbmV3IEF1dGhJbnRlcm9wKGF1dGgpKShhdXRoKTtcclxuICAgIH0sIFwiUFJJVkFURVwiIC8qIENvbXBvbmVudFR5cGUuUFJJVkFURSAqLykuc2V0SW5zdGFudGlhdGlvbk1vZGUoXCJFWFBMSUNJVFwiIC8qIEluc3RhbnRpYXRpb25Nb2RlLkVYUExJQ0lUICovKSk7XHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgZ2V0VmVyc2lvbkZvclBsYXRmb3JtKGNsaWVudFBsYXRmb3JtKSk7XHJcbiAgICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdlc20yMDE3Jyk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9JRF9UT0tFTl9NQVhfQUdFID0gNSAqIDYwO1xyXG5jb25zdCBhdXRoSWRUb2tlbk1heEFnZSA9IGdldEV4cGVyaW1lbnRhbFNldHRpbmcoJ2F1dGhJZFRva2VuTWF4QWdlJykgfHwgREVGQVVMVF9JRF9UT0tFTl9NQVhfQUdFO1xyXG5sZXQgbGFzdFBvc3RlZElkVG9rZW4gPSBudWxsO1xyXG5jb25zdCBtaW50Q29va2llRmFjdG9yeSA9ICh1cmwpID0+IGFzeW5jICh1c2VyKSA9PiB7XHJcbiAgICBjb25zdCBpZFRva2VuUmVzdWx0ID0gdXNlciAmJiAoYXdhaXQgdXNlci5nZXRJZFRva2VuUmVzdWx0KCkpO1xyXG4gICAgY29uc3QgaWRUb2tlbkFnZSA9IGlkVG9rZW5SZXN1bHQgJiZcclxuICAgICAgICAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBEYXRlLnBhcnNlKGlkVG9rZW5SZXN1bHQuaXNzdWVkQXRUaW1lKSkgLyAxMDAwO1xyXG4gICAgaWYgKGlkVG9rZW5BZ2UgJiYgaWRUb2tlbkFnZSA+IGF1dGhJZFRva2VuTWF4QWdlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gU3BlY2lmaWNhbGx5IHRyaXAgbnVsbCA9PiB1bmRlZmluZWQgd2hlbiBsb2dnZWQgb3V0LCB0byBkZWxldGUgYW55IGV4aXN0aW5nIGNvb2tpZVxyXG4gICAgY29uc3QgaWRUb2tlbiA9IGlkVG9rZW5SZXN1bHQgPT09IG51bGwgfHwgaWRUb2tlblJlc3VsdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaWRUb2tlblJlc3VsdC50b2tlbjtcclxuICAgIGlmIChsYXN0UG9zdGVkSWRUb2tlbiA9PT0gaWRUb2tlbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxhc3RQb3N0ZWRJZFRva2VuID0gaWRUb2tlbjtcclxuICAgIGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogaWRUb2tlbiA/ICdQT1NUJyA6ICdERUxFVEUnLFxyXG4gICAgICAgIGhlYWRlcnM6IGlkVG9rZW5cclxuICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtpZFRva2VufWBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA6IHt9XHJcbiAgICB9KTtcclxufTtcclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIEF1dGggaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0uXHJcbiAqIElmIG5vIGluc3RhbmNlIGV4aXN0cywgaW5pdGlhbGl6ZXMgYW4gQXV0aCBpbnN0YW5jZSB3aXRoIHBsYXRmb3JtLXNwZWNpZmljIGRlZmF1bHQgZGVwZW5kZW5jaWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gVGhlIEZpcmViYXNlIEFwcC5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QXV0aChhcHAgPSBnZXRBcHAoKSkge1xyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xyXG4gICAgaWYgKHByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRJbW1lZGlhdGUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGF1dGggPSBpbml0aWFsaXplQXV0aChhcHAsIHtcclxuICAgICAgICBwb3B1cFJlZGlyZWN0UmVzb2x2ZXI6IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXHJcbiAgICAgICAgcGVyc2lzdGVuY2U6IFtcclxuICAgICAgICAgICAgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSxcclxuICAgICAgICAgICAgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsXHJcbiAgICAgICAgICAgIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcclxuICAgICAgICBdXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGF1dGhUb2tlblN5bmNVcmwgPSBnZXRFeHBlcmltZW50YWxTZXR0aW5nKCdhdXRoVG9rZW5TeW5jVVJMJyk7XHJcbiAgICBpZiAoYXV0aFRva2VuU3luY1VybCkge1xyXG4gICAgICAgIGNvbnN0IG1pbnRDb29raWUgPSBtaW50Q29va2llRmFjdG9yeShhdXRoVG9rZW5TeW5jVXJsKTtcclxuICAgICAgICBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIG1pbnRDb29raWUsICgpID0+IG1pbnRDb29raWUoYXV0aC5jdXJyZW50VXNlcikpO1xyXG4gICAgICAgIG9uSWRUb2tlbkNoYW5nZWQoYXV0aCwgdXNlciA9PiBtaW50Q29va2llKHVzZXIpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGF1dGhFbXVsYXRvckhvc3QgPSBnZXREZWZhdWx0RW11bGF0b3JIb3N0KCdhdXRoJyk7XHJcbiAgICBpZiAoYXV0aEVtdWxhdG9ySG9zdCkge1xyXG4gICAgICAgIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgYGh0dHA6Ly8ke2F1dGhFbXVsYXRvckhvc3R9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXV0aDtcclxufVxyXG5yZWdpc3RlckF1dGgoXCJCcm93c2VyXCIgLyogQ2xpZW50UGxhdGZvcm0uQlJPV1NFUiAqLyk7XG5cbmV4cG9ydCB7IHNpZ25JbldpdGhDcmVkZW50aWFsIGFzICQsIEFjdGlvbkNvZGVPcGVyYXRpb24gYXMgQSwgc2lnbk91dCBhcyBCLCBkZWxldGVVc2VyIGFzIEMsIGRlYnVnRXJyb3JNYXAgYXMgRCwgcHJvZEVycm9yTWFwIGFzIEUsIEZhY3RvcklkIGFzIEYsIEFVVEhfRVJST1JfQ09ERVNfTUFQX0RPX05PVF9VU0VfSU5URVJOQUxMWSBhcyBHLCBpbml0aWFsaXplQXV0aCBhcyBILCBjb25uZWN0QXV0aEVtdWxhdG9yIGFzIEksIEF1dGhDcmVkZW50aWFsIGFzIEosIEVtYWlsQXV0aENyZWRlbnRpYWwgYXMgSywgT0F1dGhDcmVkZW50aWFsIGFzIEwsIFBob25lQXV0aENyZWRlbnRpYWwgYXMgTSwgaW5NZW1vcnlQZXJzaXN0ZW5jZSBhcyBOLCBPcGVyYXRpb25UeXBlIGFzIE8sIFBob25lQXV0aFByb3ZpZGVyIGFzIFAsIEVtYWlsQXV0aFByb3ZpZGVyIGFzIFEsIFJlY2FwdGNoYVZlcmlmaWVyIGFzIFIsIFNpZ25Jbk1ldGhvZCBhcyBTLCBUb3RwTXVsdGlGYWN0b3JHZW5lcmF0b3IgYXMgVCwgRmFjZWJvb2tBdXRoUHJvdmlkZXIgYXMgVSwgR29vZ2xlQXV0aFByb3ZpZGVyIGFzIFYsIEdpdGh1YkF1dGhQcm92aWRlciBhcyBXLCBPQXV0aFByb3ZpZGVyIGFzIFgsIFNBTUxBdXRoUHJvdmlkZXIgYXMgWSwgVHdpdHRlckF1dGhQcm92aWRlciBhcyBaLCBzaWduSW5Bbm9ueW1vdXNseSBhcyBfLCBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIGFzIGEsIGxpbmtXaXRoQ3JlZGVudGlhbCBhcyBhMCwgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCBhcyBhMSwgc2lnbkluV2l0aEN1c3RvbVRva2VuIGFzIGEyLCBzZW5kUGFzc3dvcmRSZXNldEVtYWlsIGFzIGEzLCBjb25maXJtUGFzc3dvcmRSZXNldCBhcyBhNCwgYXBwbHlBY3Rpb25Db2RlIGFzIGE1LCBjaGVja0FjdGlvbkNvZGUgYXMgYTYsIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlIGFzIGE3LCBjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQgYXMgYTgsIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkIGFzIGE5LCBfYXNzZXJ0IGFzIGFBLCBBdXRoRXZlbnRNYW5hZ2VyIGFzIGFCLCBfZ2V0SW5zdGFuY2UgYXMgYUMsIF9wZXJzaXN0ZW5jZUtleU5hbWUgYXMgYUQsIF9nZXRSZWRpcmVjdFJlc3VsdCBhcyBhRSwgX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQgYXMgYUYsIF9jbGVhclJlZGlyZWN0T3V0Y29tZXMgYXMgYUcsIF9jYXN0QXV0aCBhcyBhSCwgVXNlckltcGwgYXMgYUksIEF1dGhJbXBsIGFzIGFKLCBfZ2V0Q2xpZW50VmVyc2lvbiBhcyBhSywgX2dlbmVyYXRlRXZlbnRJZCBhcyBhTCwgQXV0aFBvcHVwIGFzIGFNLCBGZXRjaFByb3ZpZGVyIGFzIGFOLCBTQU1MQXV0aENyZWRlbnRpYWwgYXMgYU8sIHNlbmRTaWduSW5MaW5rVG9FbWFpbCBhcyBhYSwgaXNTaWduSW5XaXRoRW1haWxMaW5rIGFzIGFiLCBzaWduSW5XaXRoRW1haWxMaW5rIGFzIGFjLCBmZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbCBhcyBhZCwgc2VuZEVtYWlsVmVyaWZpY2F0aW9uIGFzIGFlLCB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCBhcyBhZiwgQWN0aW9uQ29kZVVSTCBhcyBhZywgcGFyc2VBY3Rpb25Db2RlVVJMIGFzIGFoLCB1cGRhdGVQcm9maWxlIGFzIGFpLCB1cGRhdGVFbWFpbCBhcyBhaiwgdXBkYXRlUGFzc3dvcmQgYXMgYWssIGdldElkVG9rZW4gYXMgYWwsIGdldElkVG9rZW5SZXN1bHQgYXMgYW0sIHVubGluayBhcyBhbiwgZ2V0QWRkaXRpb25hbFVzZXJJbmZvIGFzIGFvLCByZWxvYWQgYXMgYXAsIGdldE11bHRpRmFjdG9yUmVzb2x2ZXIgYXMgYXEsIG11bHRpRmFjdG9yIGFzIGFyLCBkZWJ1Z0Fzc2VydCBhcyBhcywgX2lzSU9TIGFzIGF0LCBfaXNBbmRyb2lkIGFzIGF1LCBfZmFpbCBhcyBhdiwgX2dldFJlZGlyZWN0VXJsIGFzIGF3LCBfZ2V0UHJvamVjdENvbmZpZyBhcyBheCwgX2lzSU9TN09yOCBhcyBheSwgX2NyZWF0ZUVycm9yIGFzIGF6LCBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSBhcyBiLCBzaWduSW5XaXRoUG9wdXAgYXMgYywgbGlua1dpdGhQb3B1cCBhcyBkLCByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cCBhcyBlLCBzaWduSW5XaXRoUmVkaXJlY3QgYXMgZiwgbGlua1dpdGhSZWRpcmVjdCBhcyBnLCByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCBhcyBoLCBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIGFzIGksIGdldFJlZGlyZWN0UmVzdWx0IGFzIGosIGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgYXMgaywgbGlua1dpdGhQaG9uZU51bWJlciBhcyBsLCBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yIGFzIG0sIFRvdHBTZWNyZXQgYXMgbiwgZ2V0QXV0aCBhcyBvLCBQcm92aWRlcklkIGFzIHAsIHNldFBlcnNpc3RlbmNlIGFzIHEsIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyIGFzIHIsIHNpZ25JbldpdGhQaG9uZU51bWJlciBhcyBzLCBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnIGFzIHQsIHVwZGF0ZVBob25lTnVtYmVyIGFzIHUsIG9uSWRUb2tlbkNoYW5nZWQgYXMgdiwgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCBhcyB3LCBvbkF1dGhTdGF0ZUNoYW5nZWQgYXMgeCwgdXNlRGV2aWNlTGFuZ3VhZ2UgYXMgeSwgdXBkYXRlQ3VycmVudFVzZXIgYXMgeiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgtZTNkNWQzZjQuanMubWFwXG4iLCJpbXBvcnQgeyBhcyBhcyBkZWJ1Z0Fzc2VydCwgYXQgYXMgX2lzSU9TLCBhdSBhcyBfaXNBbmRyb2lkLCBhdiBhcyBfZmFpbCwgYXcgYXMgX2dldFJlZGlyZWN0VXJsLCBheCBhcyBfZ2V0UHJvamVjdENvbmZpZywgYXkgYXMgX2lzSU9TN09yOCwgYXogYXMgX2NyZWF0ZUVycm9yLCBhQSBhcyBfYXNzZXJ0LCBhQiBhcyBBdXRoRXZlbnRNYW5hZ2VyLCBhQyBhcyBfZ2V0SW5zdGFuY2UsIGIgYXMgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsIGFEIGFzIF9wZXJzaXN0ZW5jZUtleU5hbWUsIGEgYXMgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSwgYUUgYXMgX2dldFJlZGlyZWN0UmVzdWx0LCBhRiBhcyBfb3ZlcnJpZGVSZWRpcmVjdFJlc3VsdCwgYUcgYXMgX2NsZWFyUmVkaXJlY3RPdXRjb21lcywgYUggYXMgX2Nhc3RBdXRoIH0gZnJvbSAnLi9pbmRleC1lM2Q1ZDNmNC5qcyc7XG5leHBvcnQgeyBBIGFzIEFjdGlvbkNvZGVPcGVyYXRpb24sIGFnIGFzIEFjdGlvbkNvZGVVUkwsIEogYXMgQXV0aENyZWRlbnRpYWwsIEcgYXMgQXV0aEVycm9yQ29kZXMsIGFKIGFzIEF1dGhJbXBsLCBhTSBhcyBBdXRoUG9wdXAsIEsgYXMgRW1haWxBdXRoQ3JlZGVudGlhbCwgUSBhcyBFbWFpbEF1dGhQcm92aWRlciwgVSBhcyBGYWNlYm9va0F1dGhQcm92aWRlciwgRiBhcyBGYWN0b3JJZCwgYU4gYXMgRmV0Y2hQcm92aWRlciwgVyBhcyBHaXRodWJBdXRoUHJvdmlkZXIsIFYgYXMgR29vZ2xlQXV0aFByb3ZpZGVyLCBMIGFzIE9BdXRoQ3JlZGVudGlhbCwgWCBhcyBPQXV0aFByb3ZpZGVyLCBPIGFzIE9wZXJhdGlvblR5cGUsIE0gYXMgUGhvbmVBdXRoQ3JlZGVudGlhbCwgUCBhcyBQaG9uZUF1dGhQcm92aWRlciwgbSBhcyBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yLCBwIGFzIFByb3ZpZGVySWQsIFIgYXMgUmVjYXB0Y2hhVmVyaWZpZXIsIGFPIGFzIFNBTUxBdXRoQ3JlZGVudGlhbCwgWSBhcyBTQU1MQXV0aFByb3ZpZGVyLCBTIGFzIFNpZ25Jbk1ldGhvZCwgVCBhcyBUb3RwTXVsdGlGYWN0b3JHZW5lcmF0b3IsIG4gYXMgVG90cFNlY3JldCwgWiBhcyBUd2l0dGVyQXV0aFByb3ZpZGVyLCBhSSBhcyBVc2VySW1wbCwgYUEgYXMgX2Fzc2VydCwgYUggYXMgX2Nhc3RBdXRoLCBhdiBhcyBfZmFpbCwgYUwgYXMgX2dlbmVyYXRlRXZlbnRJZCwgYUsgYXMgX2dldENsaWVudFZlcnNpb24sIGFDIGFzIF9nZXRJbnN0YW5jZSwgYUUgYXMgX2dldFJlZGlyZWN0UmVzdWx0LCBhRiBhcyBfb3ZlcnJpZGVSZWRpcmVjdFJlc3VsdCwgYUQgYXMgX3BlcnNpc3RlbmNlS2V5TmFtZSwgYTUgYXMgYXBwbHlBY3Rpb25Db2RlLCB3IGFzIGJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQsIGIgYXMgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsIGsgYXMgYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlciwgYSBhcyBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlLCBhNiBhcyBjaGVja0FjdGlvbkNvZGUsIGE0IGFzIGNvbmZpcm1QYXNzd29yZFJlc2V0LCBJIGFzIGNvbm5lY3RBdXRoRW11bGF0b3IsIGE4IGFzIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCwgRCBhcyBkZWJ1Z0Vycm9yTWFwLCBDIGFzIGRlbGV0ZVVzZXIsIGFkIGFzIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsLCBhbyBhcyBnZXRBZGRpdGlvbmFsVXNlckluZm8sIG8gYXMgZ2V0QXV0aCwgYWwgYXMgZ2V0SWRUb2tlbiwgYW0gYXMgZ2V0SWRUb2tlblJlc3VsdCwgYXEgYXMgZ2V0TXVsdGlGYWN0b3JSZXNvbHZlciwgaiBhcyBnZXRSZWRpcmVjdFJlc3VsdCwgTiBhcyBpbk1lbW9yeVBlcnNpc3RlbmNlLCBpIGFzIGluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UsIEggYXMgaW5pdGlhbGl6ZUF1dGgsIHQgYXMgaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZywgYWIgYXMgaXNTaWduSW5XaXRoRW1haWxMaW5rLCBhMCBhcyBsaW5rV2l0aENyZWRlbnRpYWwsIGwgYXMgbGlua1dpdGhQaG9uZU51bWJlciwgZCBhcyBsaW5rV2l0aFBvcHVwLCBnIGFzIGxpbmtXaXRoUmVkaXJlY3QsIGFyIGFzIG11bHRpRmFjdG9yLCB4IGFzIG9uQXV0aFN0YXRlQ2hhbmdlZCwgdiBhcyBvbklkVG9rZW5DaGFuZ2VkLCBhaCBhcyBwYXJzZUFjdGlvbkNvZGVVUkwsIEUgYXMgcHJvZEVycm9yTWFwLCBhMSBhcyByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsLCByIGFzIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyLCBlIGFzIHJlYXV0aGVudGljYXRlV2l0aFBvcHVwLCBoIGFzIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0LCBhcCBhcyByZWxvYWQsIGFlIGFzIHNlbmRFbWFpbFZlcmlmaWNhdGlvbiwgYTMgYXMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCwgYWEgYXMgc2VuZFNpZ25JbkxpbmtUb0VtYWlsLCBxIGFzIHNldFBlcnNpc3RlbmNlLCBfIGFzIHNpZ25JbkFub255bW91c2x5LCAkIGFzIHNpZ25JbldpdGhDcmVkZW50aWFsLCBhMiBhcyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4sIGE5IGFzIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkLCBhYyBhcyBzaWduSW5XaXRoRW1haWxMaW5rLCBzIGFzIHNpZ25JbldpdGhQaG9uZU51bWJlciwgYyBhcyBzaWduSW5XaXRoUG9wdXAsIGYgYXMgc2lnbkluV2l0aFJlZGlyZWN0LCBCIGFzIHNpZ25PdXQsIGFuIGFzIHVubGluaywgeiBhcyB1cGRhdGVDdXJyZW50VXNlciwgYWogYXMgdXBkYXRlRW1haWwsIGFrIGFzIHVwZGF0ZVBhc3N3b3JkLCB1IGFzIHVwZGF0ZVBob25lTnVtYmVyLCBhaSBhcyB1cGRhdGVQcm9maWxlLCB5IGFzIHVzZURldmljZUxhbmd1YWdlLCBhZiBhcyB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCwgYTcgYXMgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUgfSBmcm9tICcuL2luZGV4LWUzZDVkM2Y0LmpzJztcbmltcG9ydCB7IHF1ZXJ5c3RyaW5nRGVjb2RlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0ICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCAndHNsaWInO1xuaW1wb3J0ICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIF9jb3Jkb3ZhV2luZG93KCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSG93IGxvbmcgdG8gd2FpdCBhZnRlciB0aGUgYXBwIGNvbWVzIGJhY2sgaW50byBmb2N1cyBiZWZvcmUgY29uY2x1ZGluZyB0aGF0XHJcbiAqIHRoZSB1c2VyIGNsb3NlZCB0aGUgc2lnbiBpbiB0YWIuXHJcbiAqL1xyXG5jb25zdCBSRURJUkVDVF9USU1FT1VUX01TID0gMjAwMDtcclxuLyoqXHJcbiAqIEdlbmVyYXRlcyB0aGUgVVJMIGZvciB0aGUgT0F1dGggaGFuZGxlci5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF9nZW5lcmF0ZUhhbmRsZXJVcmwoYXV0aCwgZXZlbnQsIHByb3ZpZGVyKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICAvLyBHZXQgdGhlIGNvcmRvdmEgcGx1Z2luc1xyXG4gICAgY29uc3QgeyBCdWlsZEluZm8gfSA9IF9jb3Jkb3ZhV2luZG93KCk7XHJcbiAgICBkZWJ1Z0Fzc2VydChldmVudC5zZXNzaW9uSWQsICdBdXRoRXZlbnQgZGlkIG5vdCBjb250YWluIGEgc2Vzc2lvbiBJRCcpO1xyXG4gICAgY29uc3Qgc2Vzc2lvbkRpZ2VzdCA9IGF3YWl0IGNvbXB1dGVTaGEyNTYoZXZlbnQuc2Vzc2lvbklkKTtcclxuICAgIGNvbnN0IGFkZGl0aW9uYWxQYXJhbXMgPSB7fTtcclxuICAgIGlmIChfaXNJT1MoKSkge1xyXG4gICAgICAgIC8vIGlPUyBhcHAgaWRlbnRpZmllclxyXG4gICAgICAgIGFkZGl0aW9uYWxQYXJhbXNbJ2liaSddID0gQnVpbGRJbmZvLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoX2lzQW5kcm9pZCgpKSB7XHJcbiAgICAgICAgLy8gQW5kcm9pZCBhcHAgaWRlbnRpZmllclxyXG4gICAgICAgIGFkZGl0aW9uYWxQYXJhbXNbJ2FwbiddID0gQnVpbGRJbmZvLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICB9XHJcbiAgICAvLyBBZGQgdGhlIGRpc3BsYXkgbmFtZSBpZiBhdmFpbGFibGVcclxuICAgIGlmIChCdWlsZEluZm8uZGlzcGxheU5hbWUpIHtcclxuICAgICAgICBhZGRpdGlvbmFsUGFyYW1zWydhcHBEaXNwbGF5TmFtZSddID0gQnVpbGRJbmZvLmRpc3BsYXlOYW1lO1xyXG4gICAgfVxyXG4gICAgLy8gQXR0YWNoZWQgdGhlIGhhc2hlZCBzZXNzaW9uIElEXHJcbiAgICBhZGRpdGlvbmFsUGFyYW1zWydzZXNzaW9uSWQnXSA9IHNlc3Npb25EaWdlc3Q7XHJcbiAgICByZXR1cm4gX2dldFJlZGlyZWN0VXJsKGF1dGgsIHByb3ZpZGVyLCBldmVudC50eXBlLCB1bmRlZmluZWQsIChfYSA9IGV2ZW50LmV2ZW50SWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZCwgYWRkaXRpb25hbFBhcmFtcyk7XHJcbn1cclxuLyoqXHJcbiAqIFZhbGlkYXRlcyB0aGF0IHRoaXMgYXBwIGlzIHZhbGlkIGZvciB0aGlzIHByb2plY3QgY29uZmlndXJhdGlvblxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpIHtcclxuICAgIGNvbnN0IHsgQnVpbGRJbmZvIH0gPSBfY29yZG92YVdpbmRvdygpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHt9O1xyXG4gICAgaWYgKF9pc0lPUygpKSB7XHJcbiAgICAgICAgcmVxdWVzdC5pb3NCdW5kbGVJZCA9IEJ1aWxkSW5mby5wYWNrYWdlTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKF9pc0FuZHJvaWQoKSkge1xyXG4gICAgICAgIHJlcXVlc3QuYW5kcm9pZFBhY2thZ2VOYW1lID0gQnVpbGRJbmZvLnBhY2thZ2VOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgX2ZhaWwoYXV0aCwgXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICB9XHJcbiAgICAvLyBXaWxsIGZhaWwgYXV0b21hdGljYWxseSBpZiBwYWNrYWdlIG5hbWUgaXMgbm90IGF1dGhvcml6ZWRcclxuICAgIGF3YWl0IF9nZXRQcm9qZWN0Q29uZmlnKGF1dGgsIHJlcXVlc3QpO1xyXG59XHJcbmZ1bmN0aW9uIF9wZXJmb3JtUmVkaXJlY3QoaGFuZGxlclVybCkge1xyXG4gICAgLy8gR2V0IHRoZSBjb3Jkb3ZhIHBsdWdpbnNcclxuICAgIGNvbnN0IHsgY29yZG92YSB9ID0gX2NvcmRvdmFXaW5kb3coKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBjb3Jkb3ZhLnBsdWdpbnMuYnJvd3NlcnRhYi5pc0F2YWlsYWJsZShicm93c2VyVGFiSXNBdmFpbGFibGUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaWFiUmVmID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGJyb3dzZXJUYWJJc0F2YWlsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIub3BlblVybChoYW5kbGVyVXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IFJldHVybiB0aGUgaW5hcHBicm93c2VyIHJlZiB0aGF0J3MgcmV0dXJuZWQgZnJvbSB0aGUgb3BlbiBjYWxsXHJcbiAgICAgICAgICAgICAgICBpYWJSZWYgPSBjb3Jkb3ZhLkluQXBwQnJvd3Nlci5vcGVuKGhhbmRsZXJVcmwsIF9pc0lPUzdPcjgoKSA/ICdfYmxhbmsnIDogJ19zeXN0ZW0nLCAnbG9jYXRpb249eWVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShpYWJSZWYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGFwcCBhY3Rpdml0eSB0byBiZSBzZWVuIGJlZm9yZSByZXNvbHZpbmcuIEl0IGRvZXNcclxuICogdGhpcyBieSBhdHRhY2hpbmcgbGlzdGVuZXJzIHRvIHZhcmlvdXMgZG9tIGV2ZW50cy4gT25jZSB0aGUgYXBwIGlzIGRldGVybWluZWRcclxuICogdG8gYmUgdmlzaWJsZSwgdGhpcyBwcm9taXNlIHJlc29sdmVzLiBBRlRFUiB0aGF0IHJlc29sdXRpb24sIHRoZSBsaXN0ZW5lcnNcclxuICogYXJlIGRldGFjaGVkIGFuZCBhbnkgYnJvd3NlciB0YWJzIGxlZnQgb3BlbiB3aWxsIGJlIGNsb3NlZC5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIF93YWl0Rm9yQXBwUmVzdW1lKGF1dGgsIGV2ZW50TGlzdGVuZXIsIGlhYlJlZikge1xyXG4gICAgLy8gR2V0IHRoZSBjb3Jkb3ZhIHBsdWdpbnNcclxuICAgIGNvbnN0IHsgY29yZG92YSB9ID0gX2NvcmRvdmFXaW5kb3coKTtcclxuICAgIGxldCBjbGVhbnVwID0gKCkgPT4geyB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvbkNsb3NlVGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAvLyBERUZJTkUgQUxMIFRIRSBDQUxMQkFDS1MgPT09PT1cclxuICAgICAgICAgICAgZnVuY3Rpb24gYXV0aEV2ZW50U2VlbigpIHtcclxuICAgICAgICAgICAgICAgIHZhciBfYTtcclxuICAgICAgICAgICAgICAgIC8vIEF1dGggZXZlbnQgd2FzIGRldGVjdGVkLiBSZXNvbHZlIHRoaXMgcHJvbWlzZSBhbmQgY2xvc2UgdGhlIGV4dHJhXHJcbiAgICAgICAgICAgICAgICAvLyB3aW5kb3cgaWYgaXQncyBzdGlsbCBvcGVuLlxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2VCcm93c2VyVGFiID0gKF9hID0gY29yZG92YS5wbHVnaW5zLmJyb3dzZXJ0YWIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbG9zZTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xvc2VCcm93c2VyVGFiID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VCcm93c2VyVGFiKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBpbmFwcGJyb3dzZXIgZW1lYmVkZGVkIHdlYnZpZXcgaW4gaU9TNyBhbmQgOCBjYXNlIGlmIHN0aWxsXHJcbiAgICAgICAgICAgICAgICAvLyBvcGVuLlxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaWFiUmVmID09PSBudWxsIHx8IGlhYlJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaWFiUmVmLmNsb3NlKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlhYlJlZi5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc3VtZWQoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob25DbG9zZVRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGFscmVhZHkgcmFuOyBkbyBub3QgcmVydW4uXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb25DbG9zZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgdHdvIHNlZWNvbmRzIGFmdGVyIHJlc3VtZSB0aGVuIHJlamVjdC5cclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIFwicmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXJcIiAvKiBBdXRoRXJyb3JDb2RlLlJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSICovKSk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRURJUkVDVF9USU1FT1VUX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiB2aXNpYmlsaXR5Q2hhbmdlZCgpIHtcclxuICAgICAgICAgICAgICAgIGlmICgoZG9jdW1lbnQgPT09IG51bGwgfHwgZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSkgPT09ICd2aXNpYmxlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBBVFRBQ0ggQUxMIFRIRSBMSVNURU5FUlMgPT09PT1cclxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgYXV0aCBldmVudFxyXG4gICAgICAgICAgICBldmVudExpc3RlbmVyLmFkZFBhc3NpdmVMaXN0ZW5lcihhdXRoRXZlbnRTZWVuKTtcclxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciByZXN1bWUgYW5kIHZpc2liaWxpdHkgZXZlbnRzXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc3VtZScsIHJlc3VtZWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKF9pc0FuZHJvaWQoKSkge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2VkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gU0VUVVAgVEhFIENMRUFOVVAgRlVOQ1RJT04gPT09PT1cclxuICAgICAgICAgICAgY2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXIucmVtb3ZlUGFzc2l2ZUxpc3RlbmVyKGF1dGhFdmVudFNlZW4pO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzdW1lJywgcmVzdW1lZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHZpc2liaWxpdHlDaGFuZ2VkLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob25DbG9zZVRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChvbkNsb3NlVGltZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgY2xlYW51cCgpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIENvcmRvdmEgZW52aXJvbm1lbnQuIFRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0XHJcbiAqIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGNvcnJlY3Q7IG90aGVyd2lzZSBpdCB0aHJvd3MgYW4gZXJyb3Igd2l0aCB0aGVcclxuICogbWlzc2luZyBwbHVnaW4uXHJcbiAqL1xyXG5mdW5jdGlvbiBfY2hlY2tDb3Jkb3ZhQ29uZmlndXJhdGlvbihhdXRoKSB7XHJcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2s7XHJcbiAgICBjb25zdCB3aW4gPSBfY29yZG92YVdpbmRvdygpO1xyXG4gICAgLy8gQ2hlY2sgYWxsIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuXHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9yZG5ldC9jb3Jkb3ZhLXVuaXZlcnNhbC1saW5rcy1wbHVnaW5cclxuICAgIC8vIE5vdGUgdGhhdCBjb3Jkb3ZhLXVuaXZlcnNhbC1saW5rcy1wbHVnaW4gaGFzIGJlZW4gYWJhbmRvbmVkLlxyXG4gICAgLy8gQSBmb3JrIHdpdGggbGF0ZXN0IGZpeGVzIGlzIGF2YWlsYWJsZSBhdDpcclxuICAgIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2NvcmRvdmEtdW5pdmVyc2FsLWxpbmtzLXBsdWdpbi1maXhcclxuICAgIF9hc3NlcnQodHlwZW9mICgoX2EgPSB3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4udW5pdmVyc2FsTGlua3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUpID09PSAnZnVuY3Rpb24nLCBhdXRoLCBcImludmFsaWQtY29yZG92YS1jb25maWd1cmF0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqLywge1xyXG4gICAgICAgIG1pc3NpbmdQbHVnaW46ICdjb3Jkb3ZhLXVuaXZlcnNhbC1saW5rcy1wbHVnaW4tZml4J1xyXG4gICAgfSk7XHJcbiAgICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jb3Jkb3ZhLXBsdWdpbi1idWlsZGluZm9cclxuICAgIF9hc3NlcnQodHlwZW9mICgoX2IgPSB3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uQnVpbGRJbmZvKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFja2FnZU5hbWUpICE9PSAndW5kZWZpbmVkJywgYXV0aCwgXCJpbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvblwiIC8qIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT04gKi8sIHtcclxuICAgICAgICBtaXNzaW5nUGx1Z2luOiAnY29yZG92YS1wbHVnaW4tYnVpbGRJbmZvJ1xyXG4gICAgfSk7XHJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2NvcmRvdmEtcGx1Z2luLWJyb3dzZXJ0YWJcclxuICAgIF9hc3NlcnQodHlwZW9mICgoX2UgPSAoX2QgPSAoX2MgPSB3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uY29yZG92YSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBsdWdpbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5icm93c2VydGFiKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Uub3BlblVybCkgPT09ICdmdW5jdGlvbicsIGF1dGgsIFwiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OICovLCB7XHJcbiAgICAgICAgbWlzc2luZ1BsdWdpbjogJ2NvcmRvdmEtcGx1Z2luLWJyb3dzZXJ0YWInXHJcbiAgICB9KTtcclxuICAgIF9hc3NlcnQodHlwZW9mICgoX2ggPSAoX2cgPSAoX2YgPSB3aW4gPT09IG51bGwgfHwgd2luID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW4uY29yZG92YSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnBsdWdpbnMpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5icm93c2VydGFiKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2guaXNBdmFpbGFibGUpID09PSAnZnVuY3Rpb24nLCBhdXRoLCBcImludmFsaWQtY29yZG92YS1jb25maWd1cmF0aW9uXCIgLyogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiAqLywge1xyXG4gICAgICAgIG1pc3NpbmdQbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiJ1xyXG4gICAgfSk7XHJcbiAgICAvLyBodHRwczovL2NvcmRvdmEuYXBhY2hlLm9yZy9kb2NzL2VuL2xhdGVzdC9yZWZlcmVuY2UvY29yZG92YS1wbHVnaW4taW5hcHBicm93c2VyL1xyXG4gICAgX2Fzc2VydCh0eXBlb2YgKChfayA9IChfaiA9IHdpbiA9PT0gbnVsbCB8fCB3aW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbi5jb3Jkb3ZhKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouSW5BcHBCcm93c2VyKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2sub3BlbikgPT09ICdmdW5jdGlvbicsIGF1dGgsIFwiaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb25cIiAvKiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OICovLCB7XHJcbiAgICAgICAgbWlzc2luZ1BsdWdpbjogJ2NvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlcidcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgU0hBLTI1NiBvZiBhIHNlc3Npb24gSUQuIFRoZSBTdWJ0bGVDcnlwdG8gaW50ZXJmYWNlIGlzIG9ubHlcclxuICogYXZhaWxhYmxlIGluIFwic2VjdXJlXCIgY29udGV4dHMsIHdoaWNoIGNvdmVycyBDb3Jkb3ZhICh3aGljaCBpcyBzZXJ2ZWQgb24gYSBmaWxlXHJcbiAqIHByb3RvY29sKS5cclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaGEyNTYoc2Vzc2lvbklkKSB7XHJcbiAgICBjb25zdCBieXRlcyA9IHN0cmluZ1RvQXJyYXlCdWZmZXIoc2Vzc2lvbklkKTtcclxuICAgIC8vIFRPRE86IEZvciBJRTExIGNyeXB0byBoYXMgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdGhpcyBvcGVyYXRpb24gY29tZXMgYmFja1xyXG4gICAgLy8gICAgICAgYXMgYW4gb2JqZWN0LCBub3QgYSBwcm9taXNlLiBUaGlzIGlzIHRoZSBvbGQgcHJvcG9zZWQgc3RhbmRhcmQgdGhhdFxyXG4gICAgLy8gICAgICAgaXMgdXNlZCBieSBJRTExOlxyXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtV2ViQ3J5cHRvQVBJLTIwMTMwMTA4LyNjcnlwdG9vcGVyYXRpb24taW50ZXJmYWNlXHJcbiAgICBjb25zdCBidWYgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKTtcclxuICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnVmKSk7XHJcbiAgICByZXR1cm4gYXJyLm1hcChudW0gPT4gbnVtLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcclxufVxyXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5QnVmZmVyKHN0cikge1xyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW50IHRvIGRlYWwgd2l0aCBhbiBBU0NJSSBjaGFyc2V0IGFuZCBtYWtlc1xyXG4gICAgLy8gY2VydGFpbiBzaW1wbGlmeWluZyBhc3N1bXB0aW9ucy5cclxuICAgIGRlYnVnQXNzZXJ0KC9bMC05YS16QS1aXSsvLnRlc3Qoc3RyKSwgJ0NhbiBvbmx5IGNvbnZlcnQgYWxwaGEtbnVtZXJpYyBzdHJpbmdzJyk7XHJcbiAgICBpZiAodHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCk7XHJcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2aWV3O1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFNFU1NJT05fSURfTEVOR1RIID0gMjA7XHJcbi8qKiBDdXN0b20gQXV0aEV2ZW50TWFuYWdlciB0aGF0IGFkZHMgcGFzc2l2ZSBsaXN0ZW5lcnMgdG8gZXZlbnRzICovXHJcbmNsYXNzIENvcmRvdmFBdXRoRXZlbnRNYW5hZ2VyIGV4dGVuZHMgQXV0aEV2ZW50TWFuYWdlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMucGFzc2l2ZUxpc3RlbmVycyA9IG5ldyBTZXQoKTtcclxuICAgICAgICB0aGlzLmluaXRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZUluaWFsaXplZCA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBhZGRQYXNzaXZlTGlzdGVuZXIoY2IpIHtcclxuICAgICAgICB0aGlzLnBhc3NpdmVMaXN0ZW5lcnMuYWRkKGNiKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVBhc3NpdmVMaXN0ZW5lcihjYikge1xyXG4gICAgICAgIHRoaXMucGFzc2l2ZUxpc3RlbmVycy5kZWxldGUoY2IpO1xyXG4gICAgfVxyXG4gICAgLy8gSW4gYSBDb3Jkb3ZhIGVudmlyb25tZW50LCB0aGlzIG1hbmFnZXIgY2FuIGxpdmUgdGhyb3VnaCBtdWx0aXBsZSByZWRpcmVjdFxyXG4gICAgLy8gb3BlcmF0aW9uc1xyXG4gICAgcmVzZXRSZWRpcmVjdCgpIHtcclxuICAgICAgICB0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGFzSGFuZGxlZFBvdGVudGlhbFJlZGlyZWN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKiogT3ZlcnJpZGUgdGhlIG9uRXZlbnQgbWV0aG9kICovXHJcbiAgICBvbkV2ZW50KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlSW5pYWxpemVkKCk7XHJcbiAgICAgICAgdGhpcy5wYXNzaXZlTGlzdGVuZXJzLmZvckVhY2goY2IgPT4gY2IoZXZlbnQpKTtcclxuICAgICAgICByZXR1cm4gc3VwZXIub25FdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBpbml0aWFsaXplZCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmluaXRQcm9taXNlO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSAocGFydGlhbCkge0BsaW5rIEF1dGhFdmVudH0uXHJcbiAqL1xyXG5mdW5jdGlvbiBfZ2VuZXJhdGVOZXdFdmVudChhdXRoLCB0eXBlLCBldmVudElkID0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlLFxyXG4gICAgICAgIGV2ZW50SWQsXHJcbiAgICAgICAgdXJsUmVzcG9uc2U6IG51bGwsXHJcbiAgICAgICAgc2Vzc2lvbklkOiBnZW5lcmF0ZVNlc3Npb25JZCgpLFxyXG4gICAgICAgIHBvc3RCb2R5OiBudWxsLFxyXG4gICAgICAgIHRlbmFudElkOiBhdXRoLnRlbmFudElkLFxyXG4gICAgICAgIGVycm9yOiBfY3JlYXRlRXJyb3IoYXV0aCwgXCJuby1hdXRoLWV2ZW50XCIgLyogQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UICovKVxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBfc2F2ZVBhcnRpYWxFdmVudChhdXRoLCBldmVudCkge1xyXG4gICAgcmV0dXJuIHN0b3JhZ2UoKS5fc2V0KHBlcnNpc3RlbmNlS2V5KGF1dGgpLCBldmVudCk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gX2dldEFuZFJlbW92ZUV2ZW50KGF1dGgpIHtcclxuICAgIGNvbnN0IGV2ZW50ID0gKGF3YWl0IHN0b3JhZ2UoKS5fZ2V0KHBlcnNpc3RlbmNlS2V5KGF1dGgpKSk7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBhd2FpdCBzdG9yYWdlKCkuX3JlbW92ZShwZXJzaXN0ZW5jZUtleShhdXRoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXZlbnQ7XHJcbn1cclxuZnVuY3Rpb24gX2V2ZW50RnJvbVBhcnRpYWxBbmRVcmwocGFydGlhbEV2ZW50LCB1cmwpIHtcclxuICAgIHZhciBfYSwgX2I7XHJcbiAgICAvLyBQYXJzZSB0aGUgZGVlcCBsaW5rIHdpdGhpbiB0aGUgZHluYW1pYyBsaW5rIFVSTC5cclxuICAgIGNvbnN0IGNhbGxiYWNrVXJsID0gX2dldERlZXBMaW5rRnJvbUNhbGxiYWNrKHVybCk7XHJcbiAgICAvLyBDb25maXJtIGl0IGlzIGFjdHVhbGx5IGEgY2FsbGJhY2sgVVJMLlxyXG4gICAgLy8gQ3VycmVudGx5IHRoZSB1bml2ZXJzYWwgbGluayB3aWxsIGJlIG9mIHRoaXMgZm9ybWF0OlxyXG4gICAgLy8gaHR0cHM6Ly88QVVUSF9ET01BSU4+L19fL2F1dGgvY2FsbGJhY2s8T0FVVEhfUkVTUE9OU0U+XHJcbiAgICAvLyBUaGlzIGlzIGEgZmFrZSBVUkwgYnV0IGlzIG5vdCBpbnRlbmRlZCB0byB0YWtlIHRoZSB1c2VyIGFueXdoZXJlXHJcbiAgICAvLyBhbmQganVzdCByZWRpcmVjdCB0byB0aGUgYXBwLlxyXG4gICAgaWYgKGNhbGxiYWNrVXJsLmluY2x1ZGVzKCcvX18vYXV0aC9jYWxsYmFjaycpKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIFVSTC5cclxuICAgICAgICAvLyBUaGlzIG1lY2hhbmlzbSBpcyBhbHNvIHVzZWQgdG8gcGFzcyBlcnJvcnMgYmFjayB0byB0aGUgYXBwOlxyXG4gICAgICAgIC8vIGh0dHBzOi8vPEFVVEhfRE9NQUlOPi9fXy9hdXRoL2NhbGxiYWNrP2ZpcmViYXNlRXJyb3I9PFNUUklOR0lGSUVEX0VSUk9SPlxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHNlYXJjaFBhcmFtc09yRW1wdHkoY2FsbGJhY2tVcmwpO1xyXG4gICAgICAgIC8vIEdldCB0aGUgZXJyb3Igb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZ2lmaWVkIGVycm9yIGlmIGZvdW5kLlxyXG4gICAgICAgIGNvbnN0IGVycm9yT2JqZWN0ID0gcGFyYW1zWydmaXJlYmFzZUVycm9yJ11cclxuICAgICAgICAgICAgPyBwYXJzZUpzb25Pck51bGwoZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtc1snZmlyZWJhc2VFcnJvciddKSlcclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSAoX2IgPSAoX2EgPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3RbJ2NvZGUnXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNwbGl0KCdhdXRoLycpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbMV07XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjb2RlID8gX2NyZWF0ZUVycm9yKGNvZGUpIDogbnVsbDtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IHBhcnRpYWxFdmVudC50eXBlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRJZDogcGFydGlhbEV2ZW50LmV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogcGFydGlhbEV2ZW50LnRlbmFudElkLFxyXG4gICAgICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgICAgICB1cmxSZXNwb25zZTogbnVsbCxcclxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHBvc3RCb2R5OiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogcGFydGlhbEV2ZW50LnR5cGUsXHJcbiAgICAgICAgICAgICAgICBldmVudElkOiBwYXJ0aWFsRXZlbnQuZXZlbnRJZCxcclxuICAgICAgICAgICAgICAgIHRlbmFudElkOiBwYXJ0aWFsRXZlbnQudGVuYW50SWQsXHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHBhcnRpYWxFdmVudC5zZXNzaW9uSWQsXHJcbiAgICAgICAgICAgICAgICB1cmxSZXNwb25zZTogY2FsbGJhY2tVcmwsXHJcbiAgICAgICAgICAgICAgICBwb3N0Qm9keTogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbmZ1bmN0aW9uIGdlbmVyYXRlU2Vzc2lvbklkKCkge1xyXG4gICAgY29uc3QgY2hhcnMgPSBbXTtcclxuICAgIGNvbnN0IGFsbG93ZWRDaGFycyA9ICcxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFNFU1NJT05fSURfTEVOR1RIOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGxvd2VkQ2hhcnMubGVuZ3RoKTtcclxuICAgICAgICBjaGFycy5wdXNoKGFsbG93ZWRDaGFycy5jaGFyQXQoaWR4KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XHJcbn1cclxuZnVuY3Rpb24gc3RvcmFnZSgpIHtcclxuICAgIHJldHVybiBfZ2V0SW5zdGFuY2UoYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UpO1xyXG59XHJcbmZ1bmN0aW9uIHBlcnNpc3RlbmNlS2V5KGF1dGgpIHtcclxuICAgIHJldHVybiBfcGVyc2lzdGVuY2VLZXlOYW1lKFwiYXV0aEV2ZW50XCIgLyogS2V5TmFtZS5BVVRIX0VWRU5UICovLCBhdXRoLmNvbmZpZy5hcGlLZXksIGF1dGgubmFtZSk7XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKGpzb24pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nXHJcbmZ1bmN0aW9uIF9nZXREZWVwTGlua0Zyb21DYWxsYmFjayh1cmwpIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHNlYXJjaFBhcmFtc09yRW1wdHkodXJsKTtcclxuICAgIGNvbnN0IGxpbmsgPSBwYXJhbXNbJ2xpbmsnXSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJhbXNbJ2xpbmsnXSkgOiB1bmRlZmluZWQ7XHJcbiAgICAvLyBEb3VibGUgbGluayBjYXNlIChhdXRvbWF0aWMgcmVkaXJlY3QpXHJcbiAgICBjb25zdCBkb3VibGVEZWVwTGluayA9IHNlYXJjaFBhcmFtc09yRW1wdHkobGluaylbJ2xpbmsnXTtcclxuICAgIC8vIGlPUyBjdXN0b20gc2NoZW1lIGxpbmtzLlxyXG4gICAgY29uc3QgaU9TRGVlcExpbmsgPSBwYXJhbXNbJ2RlZXBfbGlua19pZCddXHJcbiAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zWydkZWVwX2xpbmtfaWQnXSlcclxuICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlPU0RvdWJsZURlZXBMaW5rID0gc2VhcmNoUGFyYW1zT3JFbXB0eShpT1NEZWVwTGluaylbJ2xpbmsnXTtcclxuICAgIHJldHVybiBpT1NEb3VibGVEZWVwTGluayB8fCBpT1NEZWVwTGluayB8fCBkb3VibGVEZWVwTGluayB8fCBsaW5rIHx8IHVybDtcclxufVxyXG4vKipcclxuICogT3B0aW1pc3RpY2FsbHkgdHJpZXMgdG8gZ2V0IHNlYXJjaCBwYXJhbXMgZnJvbSBhIHN0cmluZywgb3IgZWxzZSByZXR1cm5zIGFuXHJcbiAqIGVtcHR5IHNlYXJjaCBwYXJhbXMgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gc2VhcmNoUGFyYW1zT3JFbXB0eSh1cmwpIHtcclxuICAgIGlmICghKHVybCA9PT0gbnVsbCB8fCB1cmwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVybC5pbmNsdWRlcygnPycpKSkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuICAgIGNvbnN0IFtfLCAuLi5yZXN0XSA9IHVybC5zcGxpdCgnPycpO1xyXG4gICAgcmV0dXJuIHF1ZXJ5c3RyaW5nRGVjb2RlKHJlc3Quam9pbignPycpKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGluaXRpYWwgYXV0aCBldmVudCBiZWZvcmUgY29uY2x1ZGluZyBub1xyXG4gKiByZWRpcmVjdCBwZW5kaW5nXHJcbiAqL1xyXG5jb25zdCBJTklUSUFMX0VWRU5UX1RJTUVPVVRfTVMgPSA1MDA7XHJcbmNsYXNzIENvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkSW5pdFByb2FjdGl2ZWx5ID0gdHJ1ZTsgLy8gVGhpcyBpcyBsaWdodHdlaWdodCBmb3IgQ29yZG92YVxyXG4gICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VycyA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlUmVkaXJlY3RGbiA9IF9nZXRSZWRpcmVjdFJlc3VsdDtcclxuICAgICAgICB0aGlzLl9vdmVycmlkZVJlZGlyZWN0UmVzdWx0ID0gX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZShhdXRoKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYXV0aC5fa2V5KCk7XHJcbiAgICAgICAgbGV0IG1hbmFnZXIgPSB0aGlzLmV2ZW50TWFuYWdlcnMuZ2V0KGtleSk7XHJcbiAgICAgICAgaWYgKCFtYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgQ29yZG92YUF1dGhFdmVudE1hbmFnZXIoYXV0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2Vycy5zZXQoa2V5LCBtYW5hZ2VyKTtcclxuICAgICAgICAgICAgdGhpcy5hdHRhY2hDYWxsYmFja0xpc3RlbmVycyhhdXRoLCBtYW5hZ2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgICB9XHJcbiAgICBfb3BlblBvcHVwKGF1dGgpIHtcclxuICAgICAgICBfZmFpbChhdXRoLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBldmVudElkKSB7XHJcbiAgICAgICAgX2NoZWNrQ29yZG92YUNvbmZpZ3VyYXRpb24oYXV0aCk7XHJcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IGF3YWl0IHRoaXMuX2luaXRpYWxpemUoYXV0aCk7XHJcbiAgICAgICAgYXdhaXQgbWFuYWdlci5pbml0aWFsaXplZCgpO1xyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwZXJzaXN0ZWQgcmVkaXJlY3Qgc3RhdGVzLiBUaGlzIGRvZXMgbm90IG1hdHRlciBvbiBXZWIgd2hlcmVcclxuICAgICAgICAvLyB0aGUgcmVkaXJlY3QgYWx3YXlzIGJsb3dzIGF3YXkgYXBwbGljYXRpb24gc3RhdGUgZW50aXJlbHkuIE9uIENvcmRvdmEsXHJcbiAgICAgICAgLy8gdGhlIGFwcCBtYWludGFpbnMgY29udHJvbCBmbG93IHRocm91Z2ggdGhlIHJlZGlyZWN0LlxyXG4gICAgICAgIG1hbmFnZXIucmVzZXRSZWRpcmVjdCgpO1xyXG4gICAgICAgIF9jbGVhclJlZGlyZWN0T3V0Y29tZXMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9vcmlnaW5WYWxpZGF0aW9uKGF1dGgpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gX2dlbmVyYXRlTmV3RXZlbnQoYXV0aCwgYXV0aFR5cGUsIGV2ZW50SWQpO1xyXG4gICAgICAgIGF3YWl0IF9zYXZlUGFydGlhbEV2ZW50KGF1dGgsIGV2ZW50KTtcclxuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBfZ2VuZXJhdGVIYW5kbGVyVXJsKGF1dGgsIGV2ZW50LCBwcm92aWRlcik7XHJcbiAgICAgICAgY29uc3QgaWFiUmVmID0gYXdhaXQgX3BlcmZvcm1SZWRpcmVjdCh1cmwpO1xyXG4gICAgICAgIHJldHVybiBfd2FpdEZvckFwcFJlc3VtZShhdXRoLCBtYW5hZ2VyLCBpYWJSZWYpO1xyXG4gICAgfVxyXG4gICAgX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChfYXV0aCwgX2NiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xyXG4gICAgfVxyXG4gICAgX29yaWdpblZhbGlkYXRpb24oYXV0aCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGF1dGguX2tleSgpO1xyXG4gICAgICAgIGlmICghdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSkge1xyXG4gICAgICAgICAgICB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldID0gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XTtcclxuICAgIH1cclxuICAgIGF0dGFjaENhbGxiYWNrTGlzdGVuZXJzKGF1dGgsIG1hbmFnZXIpIHtcclxuICAgICAgICAvLyBHZXQgdGhlIGdsb2JhbCBwbHVnaW5zXHJcbiAgICAgICAgY29uc3QgeyB1bml2ZXJzYWxMaW5rcywgaGFuZGxlT3BlblVSTCwgQnVpbGRJbmZvIH0gPSBfY29yZG92YVdpbmRvdygpO1xyXG4gICAgICAgIGNvbnN0IG5vRXZlbnRUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBzZWUgdGhhdCBpbml0aWFsIGV2ZW50LiBDbGVhciBhbnkgcGVuZGluZyBvYmplY3QgYW5kXHJcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoIG5vIGV2ZW50XHJcbiAgICAgICAgICAgIGF3YWl0IF9nZXRBbmRSZW1vdmVFdmVudChhdXRoKTtcclxuICAgICAgICAgICAgbWFuYWdlci5vbkV2ZW50KGdlbmVyYXRlTm9FdmVudCgpKTtcclxuICAgICAgICB9LCBJTklUSUFMX0VWRU5UX1RJTUVPVVRfTVMpO1xyXG4gICAgICAgIGNvbnN0IHVuaXZlcnNhbExpbmtzQ2IgPSBhc3luYyAoZXZlbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYW4gZXZlbnQgc28gd2UgY2FuIGNsZWFyIHRoZSBubyBldmVudCB0aW1lb3V0XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChub0V2ZW50VGltZW91dCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxFdmVudCA9IGF3YWl0IF9nZXRBbmRSZW1vdmVFdmVudChhdXRoKTtcclxuICAgICAgICAgICAgbGV0IGZpbmFsRXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocGFydGlhbEV2ZW50ICYmIChldmVudERhdGEgPT09IG51bGwgfHwgZXZlbnREYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBldmVudERhdGFbJ3VybCddKSkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxFdmVudCA9IF9ldmVudEZyb21QYXJ0aWFsQW5kVXJsKHBhcnRpYWxFdmVudCwgZXZlbnREYXRhWyd1cmwnXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gSWYgZmluYWxFdmVudCBpcyBuZXZlciBmaWxsZWQsIHRyaWdnZXIgd2l0aCBubyBldmVudFxyXG4gICAgICAgICAgICBtYW5hZ2VyLm9uRXZlbnQoZmluYWxFdmVudCB8fCBnZW5lcmF0ZU5vRXZlbnQoKSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBVbml2ZXJzYWwgbGlua3Mgc3Vic2NyaWJlciBkb2Vzbid0IGV4aXN0IGZvciBpT1MsIHNvIHdlIG5lZWQgdG8gY2hlY2tcclxuICAgICAgICBpZiAodHlwZW9mIHVuaXZlcnNhbExpbmtzICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICB0eXBlb2YgdW5pdmVyc2FsTGlua3Muc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHVuaXZlcnNhbExpbmtzLnN1YnNjcmliZShudWxsLCB1bml2ZXJzYWxMaW5rc0NiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaU9TIDcgb3IgOCBjdXN0b20gVVJMIHNjaGVtZXMuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBhbHNvIHRoZSBjdXJyZW50IGRlZmF1bHQgYmVoYXZpb3IgZm9yIGlPUyA5Ky5cclxuICAgICAgICAvLyBGb3IgdGhpcyB0byB3b3JrLCBjb3Jkb3ZhLXBsdWdpbi1jdXN0b211cmxzY2hlbWUgbmVlZHMgdG8gYmUgaW5zdGFsbGVkLlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FZGR5VmVyYnJ1Z2dlbi9DdXN0b20tVVJMLXNjaGVtZVxyXG4gICAgICAgIC8vIERvIG5vdCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRldmVsb3BlcidzIFVSTCBoYW5kbGVyLlxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSGFuZGxlT3BlblVSTCA9IGhhbmRsZU9wZW5VUkw7XHJcbiAgICAgICAgY29uc3QgcGFja2FnZVByZWZpeCA9IGAke0J1aWxkSW5mby5wYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpfTovL2A7XHJcbiAgICAgICAgX2NvcmRvdmFXaW5kb3coKS5oYW5kbGVPcGVuVVJMID0gYXN5bmMgKHVybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwYWNrYWdlUHJlZml4KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0aGlzIGludGVudGlvbmFsbHkgdG8gZmxvYXRcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcclxuICAgICAgICAgICAgICAgIHVuaXZlcnNhbExpbmtzQ2IoeyB1cmwgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgZGV2ZWxvcGVyJ3MgaGFuZGxlciBpZiBpdCBpcyBwcmVzZW50LlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nSGFuZGxlT3BlblVSTCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0hhbmRsZU9wZW5VUkwodXJsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRldmVsb3BlciBlcnJvci4gRG9uJ3Qgc3RvcCB0aGUgZmxvdyBvZiB0aGUgU0RLLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSBzdWl0YWJsZSBmb3IgQ29yZG92YVxyXG4gKiBiYXNlZCBhcHBsaWNhdGlvbnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmNvbnN0IGNvcmRvdmFQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBDb3Jkb3ZhUG9wdXBSZWRpcmVjdFJlc29sdmVyO1xyXG5mdW5jdGlvbiBnZW5lcmF0ZU5vRXZlbnQoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6IFwidW5rbm93blwiIC8qIEF1dGhFdmVudFR5cGUuVU5LTk9XTiAqLyxcclxuICAgICAgICBldmVudElkOiBudWxsLFxyXG4gICAgICAgIHNlc3Npb25JZDogbnVsbCxcclxuICAgICAgICB1cmxSZXNwb25zZTogbnVsbCxcclxuICAgICAgICBwb3N0Qm9keTogbnVsbCxcclxuICAgICAgICB0ZW5hbnRJZDogbnVsbCxcclxuICAgICAgICBlcnJvcjogX2NyZWF0ZUVycm9yKFwibm8tYXV0aC1ldmVudFwiIC8qIEF1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVCAqLylcclxuICAgIH07XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgZnJhbWV3b3JrcyAoZS5nLiBGaXJlYmFzZVVJLXdlYikgdG8gbG9nIHRoZWlyIHVzYWdlLlxyXG4vLyBJdCBpcyBub3QgaW50ZW5kZWQgZm9yIGRpcmVjdCB1c2UgYnkgZGV2ZWxvcGVyIGFwcHMuIE5PIGpzZG9jIGhlcmUgdG8gaW50ZW50aW9uYWxseSBsZWF2ZSBpdCBvdXRcclxuLy8gb2YgYXV0b2dlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHBhZ2VzIHRvIHJlZHVjZSBhY2NpZGVudGFsIG1pc3VzZS5cclxuZnVuY3Rpb24gYWRkRnJhbWV3b3JrRm9yTG9nZ2luZyhhdXRoLCBmcmFtZXdvcmspIHtcclxuICAgIF9jYXN0QXV0aChhdXRoKS5fbG9nRnJhbWV3b3JrKGZyYW1ld29yayk7XHJcbn1cblxuZXhwb3J0IHsgYWRkRnJhbWV3b3JrRm9yTG9nZ2luZywgY29yZG92YVBvcHVwUmVkaXJlY3RSZXNvbHZlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJuYWwuanMubWFwXG4iLCJpbXBvcnQgeyBfcmVnaXN0ZXJDb21wb25lbnQsIHJlZ2lzdGVyVmVyc2lvbiwgX2dldFByb3ZpZGVyLCBnZXRBcHAsIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UsIFNES19WRVJTSU9OIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IsIGNyZWF0ZU1vY2tVc2VyVG9rZW4sIGdldE1vZHVsYXJJbnN0YW5jZSwgZGVlcEVxdWFsLCBnZXREZWZhdWx0RW11bGF0b3JIb3N0bmFtZUFuZFBvcnQsIGdldFVBLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNTYWZhcmkgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBJbnRlZ2VyLCBYaHJJbywgRXZlbnRUeXBlLCBFcnJvckNvZGUsIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQsIGdldFN0YXRFdmVudFRhcmdldCwgRmV0Y2hYbWxIdHRwRmFjdG9yeSwgV2ViQ2hhbm5lbCwgRXZlbnQsIFN0YXQsIE1kNSB9IGZyb20gJ0BmaXJlYmFzZS93ZWJjaGFubmVsLXdyYXBwZXInO1xuXG5jb25zdCBiID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIG51bGxhYmxlIFVJRC4gTW9zdGx5IGV4aXN0cyB0byBtYWtlIGNvZGUgbW9yZVxuICogcmVhZGFibGUuXG4gKi9cbmNsYXNzIFYge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy51aWQgPSB0O1xuICAgIH1cbiAgICBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gICAgICAgIHJldHVybiBudWxsICE9IHRoaXMudWlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEga2V5IHJlcHJlc2VudGluZyB0aGlzIHVzZXIsIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICovICAgIHRvS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSA/IFwidWlkOlwiICsgdGhpcy51aWQgOiBcImFub255bW91cy11c2VyXCI7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdC51aWQgPT09IHRoaXMudWlkO1xuICAgIH1cbn1cblxuLyoqIEEgdXNlciB3aXRoIGEgbnVsbCBVSUQuICovIFYuVU5BVVRIRU5USUNBVEVEID0gbmV3IFYobnVsbCksIFxuLy8gVE9ETyhtaWtlbGVoZW4pOiBMb29rIGludG8gZ2V0dGluZyBhIHByb3BlciB1aWQtZXF1aXZhbGVudCBmb3Jcbi8vIG5vbi1GaXJlYmFzZUF1dGggcHJvdmlkZXJzLlxuVi5HT09HTEVfQ1JFREVOVElBTFMgPSBuZXcgVihcImdvb2dsZS1jcmVkZW50aWFscy11aWRcIiksIFYuRklSU1RfUEFSVFkgPSBuZXcgVihcImZpcnN0LXBhcnR5LXVpZFwiKSwgXG5WLk1PQ0tfVVNFUiA9IG5ldyBWKFwibW9jay11c2VyXCIpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xubGV0IFMgPSBcIjkuMjMuMFwiO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgRCA9IG5ldyBMb2dnZXIoXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCIpO1xuXG4vLyBIZWxwZXIgbWV0aG9kcyBhcmUgbmVlZGVkIGJlY2F1c2UgdmFyaWFibGVzIGNhbid0IGJlIGV4cG9ydGVkIGFzIHJlYWQvd3JpdGVcbmZ1bmN0aW9uIEMoKSB7XG4gICAgcmV0dXJuIEQubG9nTGV2ZWw7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgdmVyYm9zaXR5IG9mIENsb3VkIEZpcmVzdG9yZSBsb2dzIChkZWJ1ZywgZXJyb3IsIG9yIHNpbGVudCkuXG4gKlxuICogQHBhcmFtIGxvZ0xldmVsIC0gVGhlIHZlcmJvc2l0eSB5b3Ugc2V0IGZvciBhY3Rpdml0eSBhbmQgZXJyb3IgbG9nZ2luZy4gQ2FuXG4gKiAgIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczpcbiAqXG4gKiAgIDx1bD5cbiAqICAgICA8bGk+YGRlYnVnYCBmb3IgdGhlIG1vc3QgdmVyYm9zZSBsb2dnaW5nIGxldmVsLCBwcmltYXJpbHkgZm9yXG4gKiAgICAgZGVidWdnaW5nLjwvbGk+XG4gKiAgICAgPGxpPmBlcnJvcmAgdG8gbG9nIGVycm9ycyBvbmx5LjwvbGk+XG4gKiAgICAgPGxpPjxjb2RlPmBzaWxlbnRgIHRvIHR1cm4gb2ZmIGxvZ2dpbmcuPC9saT5cbiAqICAgPC91bD5cbiAqLyBmdW5jdGlvbiB4KHQpIHtcbiAgICBELnNldExvZ0xldmVsKHQpO1xufVxuXG5mdW5jdGlvbiBOKHQsIC4uLmUpIHtcbiAgICBpZiAoRC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5ERUJVRykge1xuICAgICAgICBjb25zdCBuID0gZS5tYXAoJCk7XG4gICAgICAgIEQuZGVidWcoYEZpcmVzdG9yZSAoJHtTfSk6ICR7dH1gLCAuLi5uKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGsodCwgLi4uZSkge1xuICAgIGlmIChELmxvZ0xldmVsIDw9IExvZ0xldmVsLkVSUk9SKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcCgkKTtcbiAgICAgICAgRC5lcnJvcihgRmlyZXN0b3JlICgke1N9KTogJHt0fWAsIC4uLm4pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBNKHQsIC4uLmUpIHtcbiAgICBpZiAoRC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5XQVJOKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcCgkKTtcbiAgICAgICAgRC53YXJuKGBGaXJlc3RvcmUgKCR7U30pOiAke3R9YCwgLi4ubik7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFkZGl0aW9uYWwgbG9nIHBhcmFtZXRlciB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqLyBmdW5jdGlvbiAkKHQpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuIHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGUgPSB0LCBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENvbnZlcnRpbmcgdG8gSlNPTiBmYWlsZWQsIGp1c3QgbG9nIHRoZSBvYmplY3QgZGlyZWN0bHlcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4gICAgLyoqIEZvcm1hdHMgYW4gb2JqZWN0IGFzIGEgSlNPTiBzdHJpbmcsIHN1aXRhYmxlIGZvciBsb2dnaW5nLiAqL1xuICAgIHZhciBlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBVbmNvbmRpdGlvbmFsbHkgZmFpbHMsIHRocm93aW5nIGFuIEVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXG4gKiBNZXNzYWdlcyBhcmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMuXG4gKlxuICogUmV0dXJucyBgbmV2ZXJgIGFuZCBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9uczpcbiAqIEBleGFtcGxlXG4gKiBsZXQgZnV0dXJlVmFyID0gZmFpbCgnbm90IGltcGxlbWVudGVkIHlldCcpO1xuICovIGZ1bmN0aW9uIE8odCA9IFwiVW5leHBlY3RlZCBzdGF0ZVwiKSB7XG4gICAgLy8gTG9nIHRoZSBmYWlsdXJlIGluIGFkZGl0aW9uIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwganVzdCBpbiBjYXNlIHRoZVxuICAgIC8vIGV4Y2VwdGlvbiBpcyBzd2FsbG93ZWQuXG4gICAgY29uc3QgZSA9IGBGSVJFU1RPUkUgKCR7U30pIElOVEVSTkFMIEFTU0VSVElPTiBGQUlMRUQ6IGAgKyB0O1xuICAgIC8vIE5PVEU6IFdlIGRvbid0IHVzZSBGaXJlc3RvcmVFcnJvciBoZXJlIGJlY2F1c2UgdGhlc2UgYXJlIGludGVybmFsIGZhaWx1cmVzXG4gICAgLy8gdGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGUgdXNlci4gKEFsc28gaXQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXJcbiAgICAvLyBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIGVycm9yIGFuZCBhc3NlcnQgbW9kdWxlcyB3aGljaCBkb2Vzbid0IHdvcmsuKVxuICAgIHRocm93IGsoZSksIG5ldyBFcnJvcihlKTtcbn1cblxuLyoqXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcbiAqIGdpdmVuIG1lc3NhZ2UgaWYgaXQgZGlkLlxuICpcbiAqIE1lc3NhZ2VzIGFyZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqLyBmdW5jdGlvbiBGKHQsIGUpIHtcbiAgICB0IHx8IE8oKTtcbn1cblxuLyoqXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcbiAqIGdpdmVuIG1lc3NhZ2UgaWYgaXQgZGlkLlxuICpcbiAqIFRoZSBjb2RlIG9mIGNhbGxzaXRlcyBpbnZva2luZyB0aGlzIGZ1bmN0aW9uIGFyZSBzdHJpcHBlZCBvdXQgaW4gcHJvZHVjdGlvblxuICogYnVpbGRzLiBBbnkgc2lkZS1lZmZlY3RzIG9mIGNvZGUgd2l0aGluIHRoZSBkZWJ1Z0Fzc2VydCgpIGludm9jYXRpb24gd2lsbCBub3RcbiAqIGhhcHBlbiBpbiB0aGlzIGNhc2UuXG4gKlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gQih0LCBlKSB7XG4gICAgdCB8fCBPKCk7XG59XG5cbi8qKlxuICogQ2FzdHMgYG9iamAgdG8gYFRgLiBJbiBub24tcHJvZHVjdGlvbiBidWlsZHMsIHZlcmlmaWVzIHRoYXQgYG9iamAgaXMgYW5cbiAqIGluc3RhbmNlIG9mIGBUYCBiZWZvcmUgY2FzdGluZy5cbiAqLyBmdW5jdGlvbiBMKHQsIFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmUpIHtcbiAgICByZXR1cm4gdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgcSA9IHtcbiAgICAvLyBDYXVzZXMgYXJlIGNvcGllZCBmcm9tOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ncnBjL2dycGMvYmxvYi9iY2VlYzk0ZWE0ZmM1ZjAwODVkODEyMzVkOGUxYzA2Nzk4ZGMzNDFhL2luY2x1ZGUvZ3JwYyUyQiUyQi9pbXBsL2NvZGVnZW4vc3RhdHVzX2NvZGVfZW51bS5oXG4gICAgLyoqIE5vdCBhbiBlcnJvcjsgcmV0dXJuZWQgb24gc3VjY2Vzcy4gKi9cbiAgICBPSzogXCJva1wiLFxuICAgIC8qKiBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQgKHR5cGljYWxseSBieSB0aGUgY2FsbGVyKS4gKi9cbiAgICBDQU5DRUxMRUQ6IFwiY2FuY2VsbGVkXCIsXG4gICAgLyoqIFVua25vd24gZXJyb3Igb3IgYW4gZXJyb3IgZnJvbSBhIGRpZmZlcmVudCBlcnJvciBkb21haW4uICovXG4gICAgVU5LTk9XTjogXCJ1bmtub3duXCIsXG4gICAgLyoqXG4gICAgICogQ2xpZW50IHNwZWNpZmllZCBhbiBpbnZhbGlkIGFyZ3VtZW50LiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb21cbiAgICAgKiBGQUlMRURfUFJFQ09ORElUSU9OLiBJTlZBTElEX0FSR1VNRU5UIGluZGljYXRlcyBhcmd1bWVudHMgdGhhdCBhcmVcbiAgICAgKiBwcm9ibGVtYXRpYyByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtIChlLmcuLCBhIG1hbGZvcm1lZCBmaWxlXG4gICAgICogbmFtZSkuXG4gICAgICovXG4gICAgSU5WQUxJRF9BUkdVTUVOVDogXCJpbnZhbGlkLWFyZ3VtZW50XCIsXG4gICAgLyoqXG4gICAgICogRGVhZGxpbmUgZXhwaXJlZCBiZWZvcmUgb3BlcmF0aW9uIGNvdWxkIGNvbXBsZXRlLiBGb3Igb3BlcmF0aW9ucyB0aGF0XG4gICAgICogY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtLCB0aGlzIGVycm9yIG1heSBiZSByZXR1cm5lZCBldmVuIGlmIHRoZVxuICAgICAqIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gRm9yIGV4YW1wbGUsIGEgc3VjY2Vzc2Z1bCByZXNwb25zZVxuICAgICAqIGZyb20gYSBzZXJ2ZXIgY291bGQgaGF2ZSBiZWVuIGRlbGF5ZWQgbG9uZyBlbm91Z2ggZm9yIHRoZSBkZWFkbGluZSB0b1xuICAgICAqIGV4cGlyZS5cbiAgICAgKi9cbiAgICBERUFETElORV9FWENFRURFRDogXCJkZWFkbGluZS1leGNlZWRlZFwiLFxuICAgIC8qKiBTb21lIHJlcXVlc3RlZCBlbnRpdHkgKGUuZy4sIGZpbGUgb3IgZGlyZWN0b3J5KSB3YXMgbm90IGZvdW5kLiAqL1xuICAgIE5PVF9GT1VORDogXCJub3QtZm91bmRcIixcbiAgICAvKipcbiAgICAgKiBTb21lIGVudGl0eSB0aGF0IHdlIGF0dGVtcHRlZCB0byBjcmVhdGUgKGUuZy4sIGZpbGUgb3IgZGlyZWN0b3J5KSBhbHJlYWR5XG4gICAgICogZXhpc3RzLlxuICAgICAqL1xuICAgIEFMUkVBRFlfRVhJU1RTOiBcImFscmVhZHktZXhpc3RzXCIsXG4gICAgLyoqXG4gICAgICogVGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi5cbiAgICAgKiBQRVJNSVNTSU9OX0RFTklFRCBtdXN0IG5vdCBiZSB1c2VkIGZvciByZWplY3Rpb25zIGNhdXNlZCBieSBleGhhdXN0aW5nXG4gICAgICogc29tZSByZXNvdXJjZSAodXNlIFJFU09VUkNFX0VYSEFVU1RFRCBpbnN0ZWFkIGZvciB0aG9zZSBlcnJvcnMpLlxuICAgICAqIFBFUk1JU1NJT05fREVOSUVEIG11c3Qgbm90IGJlIHVzZWQgaWYgdGhlIGNhbGxlciBjYW4gbm90IGJlIGlkZW50aWZpZWRcbiAgICAgKiAodXNlIFVOQVVUSEVOVElDQVRFRCBpbnN0ZWFkIGZvciB0aG9zZSBlcnJvcnMpLlxuICAgICAqL1xuICAgIFBFUk1JU1NJT05fREVOSUVEOiBcInBlcm1pc3Npb24tZGVuaWVkXCIsXG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSB2YWxpZCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBmb3IgdGhlXG4gICAgICogb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIFVOQVVUSEVOVElDQVRFRDogXCJ1bmF1dGhlbnRpY2F0ZWRcIixcbiAgICAvKipcbiAgICAgKiBTb21lIHJlc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZCwgcGVyaGFwcyBhIHBlci11c2VyIHF1b3RhLCBvciBwZXJoYXBzIHRoZVxuICAgICAqIGVudGlyZSBmaWxlIHN5c3RlbSBpcyBvdXQgb2Ygc3BhY2UuXG4gICAgICovXG4gICAgUkVTT1VSQ0VfRVhIQVVTVEVEOiBcInJlc291cmNlLWV4aGF1c3RlZFwiLFxuICAgIC8qKlxuICAgICAqIE9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3lzdGVtIGlzIG5vdCBpbiBhIHN0YXRlIHJlcXVpcmVkIGZvclxuICAgICAqIHRoZSBvcGVyYXRpb24ncyBleGVjdXRpb24uIEZvciBleGFtcGxlLCBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZCBtYXkgYmVcbiAgICAgKiBub24tZW1wdHksIGFuIHJtZGlyIG9wZXJhdGlvbiBpcyBhcHBsaWVkIHRvIGEgbm9uLWRpcmVjdG9yeSwgZXRjLlxuICAgICAqXG4gICAgICogQSBsaXRtdXMgdGVzdCB0aGF0IG1heSBoZWxwIGEgc2VydmljZSBpbXBsZW1lbnRvciBpbiBkZWNpZGluZ1xuICAgICAqIGJldHdlZW4gRkFJTEVEX1BSRUNPTkRJVElPTiwgQUJPUlRFRCwgYW5kIFVOQVZBSUxBQkxFOlxuICAgICAqICAoYSkgVXNlIFVOQVZBSUxBQkxFIGlmIHRoZSBjbGllbnQgY2FuIHJldHJ5IGp1c3QgdGhlIGZhaWxpbmcgY2FsbC5cbiAgICAgKiAgKGIpIFVzZSBBQk9SVEVEIGlmIHRoZSBjbGllbnQgc2hvdWxkIHJldHJ5IGF0IGEgaGlnaGVyLWxldmVsXG4gICAgICogICAgICAoZS5nLiwgcmVzdGFydGluZyBhIHJlYWQtbW9kaWZ5LXdyaXRlIHNlcXVlbmNlKS5cbiAgICAgKiAgKGMpIFVzZSBGQUlMRURfUFJFQ09ORElUSU9OIGlmIHRoZSBjbGllbnQgc2hvdWxkIG5vdCByZXRyeSB1bnRpbFxuICAgICAqICAgICAgdGhlIHN5c3RlbSBzdGF0ZSBoYXMgYmVlbiBleHBsaWNpdGx5IGZpeGVkLiBFLmcuLCBpZiBhbiBcInJtZGlyXCJcbiAgICAgKiAgICAgIGZhaWxzIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBpcyBub24tZW1wdHksIEZBSUxFRF9QUkVDT05ESVRJT05cbiAgICAgKiAgICAgIHNob3VsZCBiZSByZXR1cm5lZCBzaW5jZSB0aGUgY2xpZW50IHNob3VsZCBub3QgcmV0cnkgdW5sZXNzXG4gICAgICogICAgICB0aGV5IGhhdmUgZmlyc3QgZml4ZWQgdXAgdGhlIGRpcmVjdG9yeSBieSBkZWxldGluZyBmaWxlcyBmcm9tIGl0LlxuICAgICAqICAoZCkgVXNlIEZBSUxFRF9QUkVDT05ESVRJT04gaWYgdGhlIGNsaWVudCBwZXJmb3JtcyBjb25kaXRpb25hbFxuICAgICAqICAgICAgUkVTVCBHZXQvVXBkYXRlL0RlbGV0ZSBvbiBhIHJlc291cmNlIGFuZCB0aGUgcmVzb3VyY2Ugb24gdGhlXG4gICAgICogICAgICBzZXJ2ZXIgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmRpdGlvbi4gRS5nLiwgY29uZmxpY3RpbmdcbiAgICAgKiAgICAgIHJlYWQtbW9kaWZ5LXdyaXRlIG9uIHRoZSBzYW1lIHJlc291cmNlLlxuICAgICAqL1xuICAgIEZBSUxFRF9QUkVDT05ESVRJT046IFwiZmFpbGVkLXByZWNvbmRpdGlvblwiLFxuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQsIHR5cGljYWxseSBkdWUgdG8gYSBjb25jdXJyZW5jeSBpc3N1ZSBsaWtlXG4gICAgICogc2VxdWVuY2VyIGNoZWNrIGZhaWx1cmVzLCB0cmFuc2FjdGlvbiBhYm9ydHMsIGV0Yy5cbiAgICAgKlxuICAgICAqIFNlZSBsaXRtdXMgdGVzdCBhYm92ZSBmb3IgZGVjaWRpbmcgYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OLCBBQk9SVEVELFxuICAgICAqIGFuZCBVTkFWQUlMQUJMRS5cbiAgICAgKi9cbiAgICBBQk9SVEVEOiBcImFib3J0ZWRcIixcbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBwYXN0IHRoZSB2YWxpZCByYW5nZS4gRS5nLiwgc2Vla2luZyBvciByZWFkaW5nXG4gICAgICogcGFzdCBlbmQgb2YgZmlsZS5cbiAgICAgKlxuICAgICAqIFVubGlrZSBJTlZBTElEX0FSR1VNRU5ULCB0aGlzIGVycm9yIGluZGljYXRlcyBhIHByb2JsZW0gdGhhdCBtYXkgYmUgZml4ZWRcbiAgICAgKiBpZiB0aGUgc3lzdGVtIHN0YXRlIGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIDMyLWJpdCBmaWxlIHN5c3RlbSB3aWxsXG4gICAgICogZ2VuZXJhdGUgSU5WQUxJRF9BUkdVTUVOVCBpZiBhc2tlZCB0byByZWFkIGF0IGFuIG9mZnNldCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAgICAgKiByYW5nZSBbMCwyXjMyLTFdLCBidXQgaXQgd2lsbCBnZW5lcmF0ZSBPVVRfT0ZfUkFOR0UgaWYgYXNrZWQgdG8gcmVhZCBmcm9tXG4gICAgICogYW4gb2Zmc2V0IHBhc3QgdGhlIGN1cnJlbnQgZmlsZSBzaXplLlxuICAgICAqXG4gICAgICogVGhlcmUgaXMgYSBmYWlyIGJpdCBvZiBvdmVybGFwIGJldHdlZW4gRkFJTEVEX1BSRUNPTkRJVElPTiBhbmRcbiAgICAgKiBPVVRfT0ZfUkFOR0UuIFdlIHJlY29tbWVuZCB1c2luZyBPVVRfT0ZfUkFOR0UgKHRoZSBtb3JlIHNwZWNpZmljIGVycm9yKVxuICAgICAqIHdoZW4gaXQgYXBwbGllcyBzbyB0aGF0IGNhbGxlcnMgd2hvIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIHNwYWNlIGNhblxuICAgICAqIGVhc2lseSBsb29rIGZvciBhbiBPVVRfT0ZfUkFOR0UgZXJyb3IgdG8gZGV0ZWN0IHdoZW4gdGhleSBhcmUgZG9uZS5cbiAgICAgKi9cbiAgICBPVVRfT0ZfUkFOR0U6IFwib3V0LW9mLXJhbmdlXCIsXG4gICAgLyoqIE9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgb3Igbm90IHN1cHBvcnRlZC9lbmFibGVkIGluIHRoaXMgc2VydmljZS4gKi9cbiAgICBVTklNUExFTUVOVEVEOiBcInVuaW1wbGVtZW50ZWRcIixcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBlcnJvcnMuIE1lYW5zIHNvbWUgaW52YXJpYW50cyBleHBlY3RlZCBieSB1bmRlcmx5aW5nIFN5c3RlbSBoYXNcbiAgICAgKiBiZWVuIGJyb2tlbi4gSWYgeW91IHNlZSBvbmUgb2YgdGhlc2UgZXJyb3JzLCBTb21ldGhpbmcgaXMgdmVyeSBicm9rZW4uXG4gICAgICovXG4gICAgSU5URVJOQUw6IFwiaW50ZXJuYWxcIixcbiAgICAvKipcbiAgICAgKiBUaGUgc2VydmljZSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUuIFRoaXMgaXMgYSBtb3N0IGxpa2VseSBhIHRyYW5zaWVudFxuICAgICAqIGNvbmRpdGlvbiBhbmQgbWF5IGJlIGNvcnJlY3RlZCBieSByZXRyeWluZyB3aXRoIGEgYmFja29mZi5cbiAgICAgKlxuICAgICAqIFNlZSBsaXRtdXMgdGVzdCBhYm92ZSBmb3IgZGVjaWRpbmcgYmV0d2VlbiBGQUlMRURfUFJFQ09ORElUSU9OLCBBQk9SVEVELFxuICAgICAqIGFuZCBVTkFWQUlMQUJMRS5cbiAgICAgKi9cbiAgICBVTkFWQUlMQUJMRTogXCJ1bmF2YWlsYWJsZVwiLFxuICAgIC8qKiBVbnJlY292ZXJhYmxlIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uLiAqL1xuICAgIERBVEFfTE9TUzogXCJkYXRhLWxvc3NcIlxufTtcblxuLyoqIEFuIGVycm9yIHJldHVybmVkIGJ5IGEgRmlyZXN0b3JlIG9wZXJhdGlvbi4gKi8gY2xhc3MgVSBleHRlbmRzIEZpcmViYXNlRXJyb3Ige1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIGJhY2tlbmQgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBIGN1c3RvbSBlcnJvciBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICBlKSB7XG4gICAgICAgIHN1cGVyKHQsIGUpLCB0aGlzLmNvZGUgPSB0LCB0aGlzLm1lc3NhZ2UgPSBlLCBcbiAgICAgICAgLy8gSEFDSzogV2Ugd3JpdGUgYSB0b1N0cmluZyBwcm9wZXJ0eSBkaXJlY3RseSBiZWNhdXNlIEVycm9yIGlzIG5vdCBhIHJlYWxcbiAgICAgICAgLy8gY2xhc3MgYW5kIHNvIGluaGVyaXRhbmNlIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LiBXZSBjb3VsZCBhbHRlcm5hdGl2ZWx5XG4gICAgICAgIC8vIGRvIHRoZSBzYW1lIFwiYmFjay1kb29yIGluaGVyaXRhbmNlXCIgdHJpY2sgdGhhdCBGaXJlYmFzZUVycm9yIGRvZXMuXG4gICAgICAgIHRoaXMudG9TdHJpbmcgPSAoKSA9PiBgJHt0aGlzLm5hbWV9OiBbY29kZT0ke3RoaXMuY29kZX1dOiAke3RoaXMubWVzc2FnZX1gO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY2xhc3MgSyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gdCwgdGhpcy5yZWplY3QgPSBlO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBHIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudXNlciA9IGUsIHRoaXMudHlwZSA9IFwiT0F1dGhcIiwgdGhpcy5oZWFkZXJzID0gbmV3IE1hcCwgdGhpcy5oZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke3R9YCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgQ3JlZGVudGlhbHNQcm92aWRlciB0aGF0IGFsd2F5cyB5aWVsZHMgYW4gZW1wdHkgdG9rZW4uXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBRIHtcbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge31cbiAgICBzdGFydCh0LCBlKSB7XG4gICAgICAgIC8vIEZpcmUgd2l0aCBpbml0aWFsIHVzZXIuXG4gICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gZShWLlVOQVVUSEVOVElDQVRFRCkpKTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7fVxufVxuXG4vKipcbiAqIEEgQ3JlZGVudGlhbHNQcm92aWRlciB0aGF0IGFsd2F5cyByZXR1cm5zIGEgY29uc3RhbnQgdG9rZW4uIFVzZWQgZm9yXG4gKiBlbXVsYXRvciB0b2tlbiBtb2NraW5nLlxuICovIGNsYXNzIGoge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcmVzIHRoZSBsaXN0ZW5lciByZWdpc3RlcmVkIHdpdGggc2V0Q2hhbmdlTGlzdGVuZXIoKVxuICAgICAgICAgKiBUaGlzIGlzbid0IGFjdHVhbGx5IG5lY2Vzc2FyeSBzaW5jZSB0aGUgVUlEIG5ldmVyIGNoYW5nZXMsIGJ1dCB3ZSB1c2UgdGhpc1xuICAgICAgICAgKiB0byB2ZXJpZnkgdGhlIGxpc3RlbiBjb250cmFjdCBpcyBhZGhlcmVkIHRvIGluIHRlc3RzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IG51bGw7XG4gICAgfVxuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9rZW4pO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlVG9rZW4oKSB7fVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IGUsIFxuICAgICAgICAvLyBGaXJlIHdpdGggaW5pdGlhbCB1c2VyLlxuICAgICAgICB0LmVucXVldWVSZXRyeWFibGUoKCgpID0+IGUodGhpcy50b2tlbi51c2VyKSkpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IG51bGw7XG4gICAgfVxufVxuXG5jbGFzcyB6IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMudCA9IHQsIFxuICAgICAgICAvKiogVHJhY2tzIHRoZSBjdXJyZW50IFVzZXIuICovXG4gICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBWLlVOQVVUSEVOVElDQVRFRCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3VudGVyIHVzZWQgdG8gZGV0ZWN0IGlmIHRoZSB0b2tlbiBjaGFuZ2VkIHdoaWxlIGEgZ2V0VG9rZW4gcmVxdWVzdCB3YXNcbiAgICAgICAgICogb3V0c3RhbmRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmkgPSAwLCB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmF1dGggPSBudWxsO1xuICAgIH1cbiAgICBzdGFydCh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gdGhpcy5pO1xuICAgICAgICAvLyBBIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHByZXZlbnRzIGRvdWJsZS1maXJpbmcgZm9yIHRoZSBzYW1lIHRva2VuIGNoYW5nZS5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gdCA9PiB0aGlzLmkgIT09IG4gPyAobiA9IHRoaXMuaSwgZSh0KSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgLy8gQSBwcm9taXNlIHRoYXQgY2FuIGJlIHdhaXRlZCBvbiB0byBibG9jayBvbiB0aGUgbmV4dCB0b2tlbiBjaGFuZ2UuXG4gICAgICAgIC8vIFRoaXMgcHJvbWlzZSBpcyByZS1jcmVhdGVkIGFmdGVyIGVhY2ggY2hhbmdlLlxuICAgICAgICAgICAgICAgIGxldCBpID0gbmV3IEs7XG4gICAgICAgIHRoaXMubyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaSsrLCB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy51KCksIGkucmVzb2x2ZSgpLCBpID0gbmV3IEssIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gcyh0aGlzLmN1cnJlbnRVc2VyKSkpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IGk7XG4gICAgICAgICAgICB0LmVucXVldWVSZXRyeWFibGUoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlLnByb21pc2UsIGF3YWl0IHModGhpcy5jdXJyZW50VXNlcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sIG8gPSB0ID0+IHtcbiAgICAgICAgICAgIE4oXCJGaXJlYmFzZUF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyXCIsIFwiQXV0aCBkZXRlY3RlZFwiKSwgdGhpcy5hdXRoID0gdCwgdGhpcy5hdXRoLmFkZEF1dGhUb2tlbkxpc3RlbmVyKHRoaXMubyksIFxuICAgICAgICAgICAgcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnQub25Jbml0KCh0ID0+IG8odCkpKSwgXG4gICAgICAgIC8vIE91ciB1c2VycyBjYW4gaW5pdGlhbGl6ZSBBdXRoIHJpZ2h0IGFmdGVyIEZpcmVzdG9yZSwgc28gd2UgZ2l2ZSBpdFxuICAgICAgICAvLyBhIGNoYW5jZSB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgY29tcG9uZW50IGZyYW1ld29yayBiZWZvcmUgd2VcbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc3RhcnQgdXAgaW4gdW5hdXRoZW50aWNhdGVkIG1vZGUuXG4gICAgICAgIHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudC5nZXRJbW1lZGlhdGUoe1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogITBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ID8gbyh0KSA6IChcbiAgICAgICAgICAgICAgICAvLyBJZiBhdXRoIGlzIHN0aWxsIG5vdCBhdmFpbGFibGUsIHByb2NlZWQgd2l0aCBgbnVsbGAgdXNlclxuICAgICAgICAgICAgICAgIE4oXCJGaXJlYmFzZUF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyXCIsIFwiQXV0aCBub3QgeWV0IGRldGVjdGVkXCIpLCBpLnJlc29sdmUoKSwgaSA9IG5ldyBLKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIDApLCByKCk7XG4gICAgfVxuICAgIGdldFRva2VuKCkge1xuICAgICAgICAvLyBUYWtlIG5vdGUgb2YgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHRva2VuQ291bnRlciBzbyB0aGF0IHRoaXMgbWV0aG9kXG4gICAgICAgIC8vIGNhbiBmYWlsICh3aXRoIGFuIEFCT1JURUQgZXJyb3IpIGlmIHRoZXJlIGlzIGEgdG9rZW4gY2hhbmdlIHdoaWxlIHRoZVxuICAgICAgICAvLyByZXF1ZXN0IGlzIG91dHN0YW5kaW5nLlxuICAgICAgICBjb25zdCB0ID0gdGhpcy5pLCBlID0gdGhpcy5mb3JjZVJlZnJlc2g7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlUmVmcmVzaCA9ICExLCB0aGlzLmF1dGggPyB0aGlzLmF1dGguZ2V0VG9rZW4oZSkudGhlbigoZSA9PiBcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSByZXF1ZXN0IHNpbmNlIHRoZSB0b2tlbiBjaGFuZ2VkIHdoaWxlIHRoZSByZXF1ZXN0IHdhc1xuICAgICAgICAvLyBvdXRzdGFuZGluZyBzbyB0aGUgcmVzcG9uc2UgaXMgcG90ZW50aWFsbHkgZm9yIGEgcHJldmlvdXMgdXNlciAod2hpY2hcbiAgICAgICAgLy8gdXNlciwgd2UgY2FuJ3QgYmUgc3VyZSkuXG4gICAgICAgIHRoaXMuaSAhPT0gdCA/IChOKFwiRmlyZWJhc2VBdXRoQ3JlZGVudGlhbHNQcm92aWRlclwiLCBcImdldFRva2VuIGFib3J0ZWQgZHVlIHRvIHRva2VuIGNoYW5nZS5cIiksIFxuICAgICAgICB0aGlzLmdldFRva2VuKCkpIDogZSA/IChGKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUuYWNjZXNzVG9rZW4pLCBuZXcgRyhlLmFjY2Vzc1Rva2VuLCB0aGlzLmN1cnJlbnRVc2VyKSkgOiBudWxsKSkgOiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGludmFsaWRhdGVUb2tlbigpIHtcbiAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2ggPSAhMDtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgucmVtb3ZlQXV0aFRva2VuTGlzdGVuZXIodGhpcy5vKTtcbiAgICB9XG4gICAgLy8gQXV0aC5nZXRVaWQoKSBjYW4gcmV0dXJuIG51bGwgZXZlbiB3aXRoIGEgdXNlciBsb2dnZWQgaW4uIEl0IGlzIGJlY2F1c2VcbiAgICAvLyBnZXRVaWQoKSBpcyBzeW5jaHJvbm91cywgYnV0IHRoZSBhdXRoIGNvZGUgcG9wdWxhdGluZyBVaWQgaXMgYXN5bmNocm9ub3VzLlxuICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgQXV0aFRva2VuTGlzdGVuZXIgY2FsbGJhY2tcbiAgICAvLyB0byBndWFyYW50ZWUgdG8gZ2V0IHRoZSBhY3R1YWwgdXNlci5cbiAgICB1KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5hdXRoICYmIHRoaXMuYXV0aC5nZXRVaWQoKTtcbiAgICAgICAgcmV0dXJuIEYobnVsbCA9PT0gdCB8fCBcInN0cmluZ1wiID09IHR5cGVvZiB0KSwgbmV3IFYodCk7XG4gICAgfVxufVxuXG4vKlxuICogRmlyc3RQYXJ0eVRva2VuIHByb3ZpZGVzIGEgZnJlc2ggdG9rZW4gZWFjaCB0aW1lIGl0cyB2YWx1ZVxuICogaXMgcmVxdWVzdGVkLCBiZWNhdXNlIGlmIHRoZSB0b2tlbiBpcyB0b28gb2xkLCByZXF1ZXN0cyB3aWxsIGJlIHJlamVjdGVkLlxuICogVGVjaG5pY2FsbHkgdGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeSBzaW5jZSB0aGUgU0RLIHNob3VsZCBncmFjZWZ1bGx5XG4gKiByZWNvdmVyIGZyb20gdW5hdXRoZW50aWNhdGVkIGVycm9ycyAoc2VlIGIvMzMxNDc4MTggZm9yIGNvbnRleHQpLCBidXQgaXQnc1xuICogc2FmZXIgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24gYXMtaXMuXG4gKi8gY2xhc3MgVyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmggPSB0LCB0aGlzLmwgPSBlLCB0aGlzLm0gPSBuLCB0aGlzLnR5cGUgPSBcIkZpcnN0UGFydHlcIiwgdGhpcy51c2VyID0gVi5GSVJTVF9QQVJUWSwgXG4gICAgICAgIHRoaXMuZyA9IG5ldyBNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiwgdXNpbmcgYSBwcm92aWRlZCBmYWN0b3J5IGZ1bmN0aW9uLCBvciByZXR1cm5cbiAgICAgKiBudWxsLlxuICAgICAqLyAgICBwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tID8gdGhpcy5tKCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgaGVhZGVycygpIHtcbiAgICAgICAgdGhpcy5nLnNldChcIlgtR29vZy1BdXRoVXNlclwiLCB0aGlzLmgpO1xuICAgICAgICAvLyBVc2UgYXJyYXkgbm90YXRpb24gdG8gcHJldmVudCBtaW5pZmljYXRpb25cbiAgICAgICAgY29uc3QgdCA9IHRoaXMucCgpO1xuICAgICAgICByZXR1cm4gdCAmJiB0aGlzLmcuc2V0KFwiQXV0aG9yaXphdGlvblwiLCB0KSwgdGhpcy5sICYmIHRoaXMuZy5zZXQoXCJYLUdvb2ctSWFtLUF1dGhvcml6YXRpb24tVG9rZW5cIiwgdGhpcy5sKSwgXG4gICAgICAgIHRoaXMuZztcbiAgICB9XG59XG5cbi8qXG4gKiBQcm92aWRlcyB1c2VyIGNyZWRlbnRpYWxzIHJlcXVpcmVkIGZvciB0aGUgRmlyZXN0b3JlIEphdmFTY3JpcHQgU0RLXG4gKiB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIHVzaW5nIHRlY2huaXF1ZSB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlXG4gKiB0byBhcHBsaWNhdGlvbnMgaG9zdGVkIGJ5IEdvb2dsZS5cbiAqLyBjbGFzcyBIIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuaCA9IHQsIHRoaXMubCA9IGUsIHRoaXMubSA9IG47XG4gICAgfVxuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBXKHRoaXMuaCwgdGhpcy5sLCB0aGlzLm0pKTtcbiAgICB9XG4gICAgc3RhcnQodCwgZSkge1xuICAgICAgICAvLyBGaXJlIHdpdGggaW5pdGlhbCB1aWQuXG4gICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gZShWLkZJUlNUX1BBUlRZKSkpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHt9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge31cbn1cblxuY2xhc3MgSiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdCwgdGhpcy50eXBlID0gXCJBcHBDaGVja1wiLCB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwLCB0ICYmIHQubGVuZ3RoID4gMCAmJiB0aGlzLmhlYWRlcnMuc2V0KFwieC1maXJlYmFzZS1hcHBjaGVja1wiLCB0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5cbmNsYXNzIFkge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5JID0gdCwgdGhpcy5mb3JjZVJlZnJlc2ggPSAhMSwgdGhpcy5hcHBDaGVjayA9IG51bGwsIHRoaXMuVCA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHQgPT4ge1xuICAgICAgICAgICAgbnVsbCAhPSB0LmVycm9yICYmIE4oXCJGaXJlYmFzZUFwcENoZWNrVG9rZW5Qcm92aWRlclwiLCBgRXJyb3IgZ2V0dGluZyBBcHAgQ2hlY2sgdG9rZW47IHVzaW5nIHBsYWNlaG9sZGVyIHRva2VuIGluc3RlYWQuIEVycm9yOiAke3QuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRva2VuICE9PSB0aGlzLlQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5UID0gdC50b2tlbiwgTihcIkZpcmViYXNlQXBwQ2hlY2tUb2tlblByb3ZpZGVyXCIsIGBSZWNlaXZlZCAke24gPyBcIm5ld1wiIDogXCJleGlzdGluZ1wifSB0b2tlbi5gKSwgXG4gICAgICAgICAgICBuID8gZSh0LnRva2VuKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm8gPSBlID0+IHtcbiAgICAgICAgICAgIHQuZW5xdWV1ZVJldHJ5YWJsZSgoKCkgPT4gbihlKSkpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzID0gdCA9PiB7XG4gICAgICAgICAgICBOKFwiRmlyZWJhc2VBcHBDaGVja1Rva2VuUHJvdmlkZXJcIiwgXCJBcHBDaGVjayBkZXRlY3RlZFwiKSwgdGhpcy5hcHBDaGVjayA9IHQsIHRoaXMuYXBwQ2hlY2suYWRkVG9rZW5MaXN0ZW5lcih0aGlzLm8pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLkkub25Jbml0KCh0ID0+IHModCkpKSwgXG4gICAgICAgIC8vIE91ciB1c2VycyBjYW4gaW5pdGlhbGl6ZSBBcHBDaGVjayBhZnRlciBGaXJlc3RvcmUsIHNvIHdlIGdpdmUgaXRcbiAgICAgICAgLy8gYSBjaGFuY2UgdG8gcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIGNvbXBvbmVudCBmcmFtZXdvcmsuXG4gICAgICAgIHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hcHBDaGVjaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkkuZ2V0SW1tZWRpYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6ICEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdCA/IHModCkgOiBcbiAgICAgICAgICAgICAgICAvLyBJZiBBcHBDaGVjayBpcyBzdGlsbCBub3QgYXZhaWxhYmxlLCBwcm9jZWVkIHdpdGhvdXQgaXQuXG4gICAgICAgICAgICAgICAgTihcIkZpcmViYXNlQXBwQ2hlY2tUb2tlblByb3ZpZGVyXCIsIFwiQXBwQ2hlY2sgbm90IHlldCBkZXRlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIDApO1xuICAgIH1cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuZm9yY2VSZWZyZXNoO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZVJlZnJlc2ggPSAhMSwgdGhpcy5hcHBDaGVjayA/IHRoaXMuYXBwQ2hlY2suZ2V0VG9rZW4odCkudGhlbigodCA9PiB0ID8gKEYoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdC50b2tlbiksIFxuICAgICAgICB0aGlzLlQgPSB0LnRva2VuLCBuZXcgSih0LnRva2VuKSkgOiBudWxsKSkgOiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGludmFsaWRhdGVUb2tlbigpIHtcbiAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2ggPSAhMDtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIHRoaXMuYXBwQ2hlY2sgJiYgdGhpcy5hcHBDaGVjay5yZW1vdmVUb2tlbkxpc3RlbmVyKHRoaXMubyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIEFwcENoZWNrIHRva2VuIHByb3ZpZGVyIHRoYXQgYWx3YXlzIHlpZWxkcyBhbiBlbXB0eSB0b2tlbi5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIFgge1xuICAgIGdldFRva2VuKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBKKFwiXCIpKTtcbiAgICB9XG4gICAgaW52YWxpZGF0ZVRva2VuKCkge31cbiAgICBzdGFydCh0LCBlKSB7fVxuICAgIHNodXRkb3duKCkge31cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBDcmVkZW50aWFsc1Byb3ZpZGVyIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZlxuICogdGhlIGNyZWRlbnRpYWxzIHBhc3NlZCBpbi5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogR2VuZXJhdGVzIGBuQnl0ZXNgIG9mIHJhbmRvbSBieXRlcy5cbiAqXG4gKiBJZiBgbkJ5dGVzIDwgMGAgLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gWih0KSB7XG4gICAgLy8gUG9seWZpbGxzIGZvciBJRSBhbmQgV2ViV29ya2VyIGJ5IHVzaW5nIGBzZWxmYCBhbmQgYG1zQ3J5cHRvYCB3aGVuIGBjcnlwdG9gIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgY29uc3QgZSA9IFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2Ygc2VsZiAmJiAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0byksIG4gPSBuZXcgVWludDhBcnJheSh0KTtcbiAgICBpZiAoZSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzKSBlLmdldFJhbmRvbVZhbHVlcyhuKTsgZWxzZSBcbiAgICAvLyBGYWxscyBiYWNrIHRvIE1hdGgucmFuZG9tXG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0OyBlKyspIG5bZV0gPSBNYXRoLmZsb29yKDI1NiAqIE1hdGgucmFuZG9tKCkpO1xuICAgIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyB0dCB7XG4gICAgc3RhdGljIEEoKSB7XG4gICAgICAgIC8vIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgIGNvbnN0IHQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCIsIGUgPSBNYXRoLmZsb29yKDI1NiAvIHQubGVuZ3RoKSAqIHQubGVuZ3RoO1xuICAgICAgICAvLyBUaGUgbGFyZ2VzdCBieXRlIHZhbHVlIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBgY2hhci5sZW5ndGhgLlxuICAgICAgICAgICAgICAgIGxldCBuID0gXCJcIjtcbiAgICAgICAgZm9yICg7bi5sZW5ndGggPCAyMDsgKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gWig0MCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIFxuICAgICAgICAgICAgLy8gT25seSBhY2NlcHQgdmFsdWVzIHRoYXQgYXJlIFswLCBtYXhNdWx0aXBsZSksIHRoaXMgZW5zdXJlcyB0aGV5IGNhblxuICAgICAgICAgICAgLy8gYmUgZXZlbmx5IG1hcHBlZCB0byBpbmRpY2VzIG9mIGBjaGFyc2AgdmlhIGEgbW9kdWxvIG9wZXJhdGlvbi5cbiAgICAgICAgICAgIG4ubGVuZ3RoIDwgMjAgJiYgc1tpXSA8IGUgJiYgKG4gKz0gdC5jaGFyQXQoc1tpXSAlIHQubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxufVxuXG5mdW5jdGlvbiBldCh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPCBlID8gLTEgOiB0ID4gZSA/IDEgOiAwO1xufVxuXG4vKiogSGVscGVyIHRvIGNvbXBhcmUgYXJyYXlzIHVzaW5nIGlzRXF1YWwoKS4gKi8gZnVuY3Rpb24gbnQodCwgZSwgbikge1xuICAgIHJldHVybiB0Lmxlbmd0aCA9PT0gZS5sZW5ndGggJiYgdC5ldmVyeSgoKHQsIHMpID0+IG4odCwgZVtzXSkpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgbGV4aWNvZ3JhcGhpY2FsbHktZm9sbG93aW5nIHN0cmluZy4gVGhpcyBpcyB1c2VmdWwgdG9cbiAqIGNvbnN0cnVjdCBhbiBpbmNsdXNpdmUgcmFuZ2UgZm9yIGluZGV4ZWRkYiBpdGVyYXRvcnMuXG4gKi8gZnVuY3Rpb24gc3QodCkge1xuICAgIC8vIFJldHVybiB0aGUgaW5wdXQgc3RyaW5nLCB3aXRoIGFuIGFkZGl0aW9uYWwgTlVMIGJ5dGUgYXBwZW5kZWQuXG4gICAgcmV0dXJuIHQgKyBcIlxcMFwiO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVGhlIGVhcmxpZXN0IGRhdGUgc3VwcG9ydGVkIGJ5IEZpcmVzdG9yZSB0aW1lc3RhbXBzICgwMDAxLTAxLTAxVDAwOjAwOjAwWikuXG4vKipcbiAqIEEgYFRpbWVzdGFtcGAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZSBvclxuICogY2FsZW5kYXIsIHJlcHJlc2VudGVkIGFzIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0IG5hbm9zZWNvbmRcbiAqIHJlc29sdXRpb24gaW4gVVRDIEVwb2NoIHRpbWUuXG4gKlxuICogSXQgaXMgZW5jb2RlZCB1c2luZyB0aGUgUHJvbGVwdGljIEdyZWdvcmlhbiBDYWxlbmRhciB3aGljaCBleHRlbmRzIHRoZVxuICogR3JlZ29yaWFuIGNhbGVuZGFyIGJhY2t3YXJkcyB0byB5ZWFyIG9uZS4gSXQgaXMgZW5jb2RlZCBhc3N1bWluZyBhbGwgbWludXRlc1xuICogYXJlIDYwIHNlY29uZHMgbG9uZywgaS5lLiBsZWFwIHNlY29uZHMgYXJlIFwic21lYXJlZFwiIHNvIHRoYXQgbm8gbGVhcCBzZWNvbmRcbiAqIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24uIFJhbmdlIGlzIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG9cbiAqIDk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5Wi5cbiAqXG4gKiBGb3IgZXhhbXBsZXMgYW5kIGZ1cnRoZXIgc3BlY2lmaWNhdGlvbnMsIHJlZmVyIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvYmxvYi9tYXN0ZXIvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gfCBUaW1lc3RhbXAgZGVmaW5pdGlvbn0uXG4gKi9cbmNsYXNzIGl0IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRpbWVzdGFtcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWNvbmRzIC0gVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouIE11c3QgYmUgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0b1xuICAgICAqICAgICA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuXG4gICAgICogQHBhcmFtIG5hbm9zZWNvbmRzIC0gVGhlIG5vbi1uZWdhdGl2ZSBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZFxuICAgICAqICAgICByZXNvbHV0aW9uLiBOZWdhdGl2ZSBzZWNvbmQgdmFsdWVzIHdpdGggZnJhY3Rpb25zIG11c3Qgc3RpbGwgaGF2ZVxuICAgICAqICAgICBub24tbmVnYXRpdmUgbmFub3NlY29uZHMgdmFsdWVzIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlXG4gICAgICogICAgIGZyb20gMCB0byA5OTksOTk5LDk5OSBpbmNsdXNpdmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIGZyYWN0aW9ucyBvZiBhIHNlY29uZCBhdCBuYW5vc2Vjb25kIHJlc29sdXRpb24uKlxuICAgICAqL1xuICAgIGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vjb25kcyA9IHQsIHRoaXMubmFub3NlY29uZHMgPSBlLCBlIDwgMCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmIChlID49IDFlOSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBuYW5vc2Vjb25kcyBvdXQgb2YgcmFuZ2U6IFwiICsgZSk7XG4gICAgICAgIGlmICh0IDwgLTYyMTM1NTk2ODAwKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiVGltZXN0YW1wIHNlY29uZHMgb3V0IG9mIHJhbmdlOiBcIiArIHQpO1xuICAgICAgICAvLyBUaGlzIHdpbGwgYnJlYWsgaW4gdGhlIHllYXIgMTAsMDAwLlxuICAgICAgICAgICAgICAgIGlmICh0ID49IDI1MzQwMjMwMDgwMCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlRpbWVzdGFtcCBzZWNvbmRzIG91dCBvZiByYW5nZTogXCIgKyB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgd2l0aCB0aGUgY3VycmVudCBkYXRlLCB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgbmV3IHRpbWVzdGFtcCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZGF0ZS5cbiAgICAgKi8gICAgc3RhdGljIG5vdygpIHtcbiAgICAgICAgcmV0dXJuIGl0LmZyb21NaWxsaXMoRGF0ZS5ub3coKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGluaXRpYWxpemUgdGhlIGBUaW1lc3RhbXBgIGZyb20uXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIGRhdGUuXG4gICAgICovICAgIHN0YXRpYyBmcm9tRGF0ZSh0KSB7XG4gICAgICAgIHJldHVybiBpdC5mcm9tTWlsbGlzKHQuZ2V0VGltZSgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0aW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2hcbiAgICAgKiAgICAgMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICogQHJldHVybnMgQSBuZXcgYFRpbWVzdGFtcGAgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXMgdGhlIGdpdmVuXG4gICAgICogICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAgICovICAgIHN0YXRpYyBmcm9tTWlsbGlzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodCAvIDFlMyksIG4gPSBNYXRoLmZsb29yKDFlNiAqICh0IC0gMWUzICogZSkpO1xuICAgICAgICByZXR1cm4gbmV3IGl0KGUsIG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGBUaW1lc3RhbXBgIHRvIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0LiBUaGlzIGNvbnZlcnNpb25cbiAgICAgKiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbiBzaW5jZSBgRGF0ZWAgb2JqZWN0cyBvbmx5IHN1cHBvcnQgbWlsbGlzZWNvbmRcbiAgICAgKiBwcmVjaXNpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHBvaW50IGluIHRpbWUgYXNcbiAgICAgKiAgICAgdGhpcyBgVGltZXN0YW1wYCwgd2l0aCBtaWxsaXNlY29uZCBwcmVjaXNpb24uXG4gICAgICovICAgIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudG9NaWxsaXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgYFRpbWVzdGFtcGAgdG8gYSBudW1lcmljIHRpbWVzdGFtcCAoaW4gbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgICogZXBvY2gpLiBUaGlzIG9wZXJhdGlvbiBjYXVzZXMgYSBsb3NzIG9mIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBwb2ludCBpbiB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0aW1lc3RhbXAsIHJlcHJlc2VudGVkIGFzXG4gICAgICogICAgIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouXG4gICAgICovICAgIHRvTWlsbGlzKCkge1xuICAgICAgICByZXR1cm4gMWUzICogdGhpcy5zZWNvbmRzICsgdGhpcy5uYW5vc2Vjb25kcyAvIDFlNjtcbiAgICB9XG4gICAgX2NvbXBhcmVUbyh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZHMgPT09IHQuc2Vjb25kcyA/IGV0KHRoaXMubmFub3NlY29uZHMsIHQubmFub3NlY29uZHMpIDogZXQodGhpcy5zZWNvbmRzLCB0LnNlY29uZHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgVGltZXN0YW1wYCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIG90aGVyIC0gVGhlIGBUaW1lc3RhbXBgIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYFRpbWVzdGFtcGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0LnNlY29uZHMgPT09IHRoaXMuc2Vjb25kcyAmJiB0Lm5hbm9zZWNvbmRzID09PSB0aGlzLm5hbm9zZWNvbmRzO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBgVGltZXN0YW1wYC4gKi8gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlRpbWVzdGFtcChzZWNvbmRzPVwiICsgdGhpcy5zZWNvbmRzICsgXCIsIG5hbm9zZWNvbmRzPVwiICsgdGhpcy5uYW5vc2Vjb25kcyArIFwiKVwiO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYFRpbWVzdGFtcGAuICovICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRoaXMuc2Vjb25kcyxcbiAgICAgICAgICAgIG5hbm9zZWNvbmRzOiB0aGlzLm5hbm9zZWNvbmRzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgcHJpbWl0aXZlIHN0cmluZywgd2hpY2ggYWxsb3dzIGBUaW1lc3RhbXBgIG9iamVjdHNcbiAgICAgKiB0byBiZSBjb21wYXJlZCB1c2luZyB0aGUgYD5gLCBgPD1gLCBgPj1gIGFuZCBgPmAgb3BlcmF0b3JzLlxuICAgICAqLyAgICB2YWx1ZU9mKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtIDxzZWNvbmRzPi48bmFub3NlY29uZHM+IHdoZXJlXG4gICAgICAgIC8vIDxzZWNvbmRzPiBpcyB0cmFuc2xhdGVkIHRvIGhhdmUgYSBub24tbmVnYXRpdmUgdmFsdWUgYW5kIGJvdGggPHNlY29uZHM+XG4gICAgICAgIC8vIGFuZCA8bmFub3NlY29uZHM+IGFyZSBsZWZ0LXBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBhIGNvbnNpc3RlbnQgbGVuZ3RoLlxuICAgICAgICAvLyBTdHJpbmdzIHdpdGggdGhpcyBmb3JtYXQgdGhlbiBoYXZlIGEgbGV4aW9ncmFwaGljYWwgb3JkZXJpbmcgdGhhdCBtYXRjaGVzXG4gICAgICAgIC8vIHRoZSBleHBlY3RlZCBvcmRlcmluZy4gVGhlIDxzZWNvbmRzPiB0cmFuc2xhdGlvbiBpcyBkb25lIHRvIGF2b2lkIGhhdmluZ1xuICAgICAgICAvLyBhIGxlYWRpbmcgbmVnYXRpdmUgc2lnbiAoaS5lLiBhIGxlYWRpbmcgJy0nIGNoYXJhY3RlcikgaW4gaXRzIHN0cmluZ1xuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiwgd2hpY2ggd291bGQgYWZmZWN0IGl0cyBsZXhpb2dyYXBoaWNhbCBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgdCA9IHRoaXMuc2Vjb25kcyAtIC02MjEzNTU5NjgwMDtcbiAgICAgICAgLy8gTm90ZTogVXAgdG8gMTIgZGVjaW1hbCBkaWdpdHMgYXJlIHJlcXVpcmVkIHRvIHJlcHJlc2VudCBhbGwgdmFsaWRcbiAgICAgICAgLy8gJ3NlY29uZHMnIHZhbHVlcy5cbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnBhZFN0YXJ0KDEyLCBcIjBcIikgKyBcIi5cIiArIFN0cmluZyh0aGlzLm5hbm9zZWNvbmRzKS5wYWRTdGFydCg5LCBcIjBcIik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHZlcnNpb24gb2YgYSBkb2N1bWVudCBpbiBGaXJlc3RvcmUuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHZlcnNpb25cbiAqIHRpbWVzdGFtcCwgc3VjaCBhcyB1cGRhdGVfdGltZSBvciByZWFkX3RpbWUuXG4gKi8gY2xhc3MgcnQge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVRpbWVzdGFtcCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgcnQodCk7XG4gICAgfVxuICAgIHN0YXRpYyBtaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgcnQobmV3IGl0KDAsIDApKTtcbiAgICB9XG4gICAgc3RhdGljIG1heCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBydChuZXcgaXQoMjUzNDAyMzAwNzk5LCA5OTk5OTk5OTkpKTtcbiAgICB9XG4gICAgY29tcGFyZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLl9jb21wYXJlVG8odC50aW1lc3RhbXApO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wLmlzRXF1YWwodC50aW1lc3RhbXApO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIG51bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbiBmb3IgdXNlIGluIHNwZWMgdGVzdHMuICovICAgIHRvTWljcm9zZWNvbmRzKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHRvIG1pY3Jvc2Vjb25kcy5cbiAgICAgICAgcmV0dXJuIDFlNiAqIHRoaXMudGltZXN0YW1wLnNlY29uZHMgKyB0aGlzLnRpbWVzdGFtcC5uYW5vc2Vjb25kcyAvIDFlMztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBcIlNuYXBzaG90VmVyc2lvbihcIiArIHRoaXMudGltZXN0YW1wLnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICB9XG4gICAgdG9UaW1lc3RhbXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVzdGFtcDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFBhdGggcmVwcmVzZW50cyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIHN0cmluZyBzZWdtZW50cy5cbiAqL1xuY2xhc3Mgb3Qge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdm9pZCAwID09PSBlID8gZSA9IDAgOiBlID4gdC5sZW5ndGggJiYgTygpLCB2b2lkIDAgPT09IG4gPyBuID0gdC5sZW5ndGggLSBlIDogbiA+IHQubGVuZ3RoIC0gZSAmJiBPKCksIFxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gdCwgdGhpcy5vZmZzZXQgPSBlLCB0aGlzLmxlbiA9IG47XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbjtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiAwID09PSBvdC5jb21wYXJhdG9yKHRoaXMsIHQpO1xuICAgIH1cbiAgICBjaGlsZCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnNlZ21lbnRzLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmxpbWl0KCkpO1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIG90ID8gdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGUucHVzaCh0KTtcbiAgICAgICAgfSkpIDogZS5wdXNoKHQpLCB0aGlzLmNvbnN0cnVjdChlKTtcbiAgICB9XG4gICAgLyoqIFRoZSBpbmRleCBvZiBvbmUgcGFzdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBwYXRoLiAqLyAgICBsaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIHBvcEZpcnN0KHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPSB2b2lkIDAgPT09IHQgPyAxIDogdCwgdGhpcy5jb25zdHJ1Y3QodGhpcy5zZWdtZW50cywgdGhpcy5vZmZzZXQgKyB0LCB0aGlzLmxlbmd0aCAtIHQpO1xuICAgIH1cbiAgICBwb3BMYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3QodGhpcy5zZWdtZW50cywgdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGZpcnN0U2VnbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHNbdGhpcy5vZmZzZXRdO1xuICAgIH1cbiAgICBsYXN0U2VnbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzW3RoaXMub2Zmc2V0ICsgdF07XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAwID09PSB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgaXNQcmVmaXhPZih0KSB7XG4gICAgICAgIGlmICh0Lmxlbmd0aCA8IHRoaXMubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdGhpcy5sZW5ndGg7IGUrKykgaWYgKHRoaXMuZ2V0KGUpICE9PSB0LmdldChlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGlzSW1tZWRpYXRlUGFyZW50T2YodCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggKyAxICE9PSB0Lmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IHRoaXMubGVuZ3RoOyBlKyspIGlmICh0aGlzLmdldChlKSAhPT0gdC5nZXQoZSkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmb3JFYWNoKHQpIHtcbiAgICAgICAgZm9yIChsZXQgZSA9IHRoaXMub2Zmc2V0LCBuID0gdGhpcy5saW1pdCgpOyBlIDwgbjsgZSsrKSB0KHRoaXMuc2VnbWVudHNbZV0pO1xuICAgIH1cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5zbGljZSh0aGlzLm9mZnNldCwgdGhpcy5saW1pdCgpKTtcbiAgICB9XG4gICAgc3RhdGljIGNvbXBhcmF0b3IodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gTWF0aC5taW4odC5sZW5ndGgsIGUubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBuOyBzKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmdldChzKSwgaSA9IGUuZ2V0KHMpO1xuICAgICAgICAgICAgaWYgKG4gPCBpKSByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAobiA+IGkpIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Lmxlbmd0aCA8IGUubGVuZ3RoID8gLTEgOiB0Lmxlbmd0aCA+IGUubGVuZ3RoID8gMSA6IDA7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgc2xhc2gtc2VwYXJhdGVkIHBhdGggZm9yIG5hdmlnYXRpbmcgcmVzb3VyY2VzIChkb2N1bWVudHMgYW5kIGNvbGxlY3Rpb25zKVxuICogd2l0aGluIEZpcmVzdG9yZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyB1dCBleHRlbmRzIG90IHtcbiAgICBjb25zdHJ1Y3QodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3IHV0KHQsIGUsIG4pO1xuICAgIH1cbiAgICBjYW5vbmljYWxTdHJpbmcoKSB7XG4gICAgICAgIC8vIE5PVEU6IFRoZSBjbGllbnQgaXMgaWdub3JhbnQgb2YgYW55IHBhdGggc2VnbWVudHMgY29udGFpbmluZyBlc2NhcGVcbiAgICAgICAgLy8gc2VxdWVuY2VzIChlLmcuIF9faWQxMjNfXykgYW5kIGp1c3QgcGFzc2VzIHRoZW0gdGhyb3VnaCByYXcgKHRoZXkgZXhpc3RcbiAgICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJlcXVlbnRseSkuXG4gICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5qb2luKFwiL1wiKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVzb3VyY2UgcGF0aCBmcm9tIHRoZSBnaXZlbiBzbGFzaC1kZWxpbWl0ZWQgc3RyaW5nLiBJZiBtdWx0aXBsZVxuICAgICAqIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGFsbCBjb21wb25lbnRzIGFyZSBjb21iaW5lZC4gTGVhZGluZyBhbmQgdHJhaWxpbmdcbiAgICAgKiBzbGFzaGVzIGZyb20gYWxsIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAgICovICAgIHN0YXRpYyBmcm9tU3RyaW5nKC4uLnQpIHtcbiAgICAgICAgLy8gTk9URTogVGhlIGNsaWVudCBpcyBpZ25vcmFudCBvZiBhbnkgcGF0aCBzZWdtZW50cyBjb250YWluaW5nIGVzY2FwZVxuICAgICAgICAvLyBzZXF1ZW5jZXMgKGUuZy4gX19pZDEyM19fKSBhbmQganVzdCBwYXNzZXMgdGhlbSB0aHJvdWdoIHJhdyAodGhleSBleGlzdFxuICAgICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmcmVxdWVudGx5KS5cbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkge1xuICAgICAgICAgICAgaWYgKG4uaW5kZXhPZihcIi8vXCIpID49IDApIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgc2VnbWVudCAoJHtufSkuIFBhdGhzIG11c3Qgbm90IGNvbnRhaW4gLy8gaW4gdGhlbS5gKTtcbiAgICAgICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWxpbmcgc2xhc2hlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHVzaCguLi5uLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHQgPT4gdC5sZW5ndGggPiAwKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgdXQoZSk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBuZXcgdXQoW10pO1xuICAgIH1cbn1cblxuY29uc3QgY3QgPSAvXltfYS16QS1aXVtfYS16QS1aMC05XSokLztcblxuLyoqXG4gKiBBIGRvdC1zZXBhcmF0ZWQgcGF0aCBmb3IgbmF2aWdhdGluZyBzdWItb2JqZWN0cyB3aXRoaW4gYSBkb2N1bWVudC5cbiAqIEBpbnRlcm5hbFxuICovIGNsYXNzIGF0IGV4dGVuZHMgb3Qge1xuICAgIGNvbnN0cnVjdCh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgYXQodCwgZSwgbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvdWxkIGJlIHVzZWQgYXMgYSBzZWdtZW50IGluIGEgZmllbGQgcGF0aFxuICAgICAqIHdpdGhvdXQgZXNjYXBpbmcuXG4gICAgICovICAgIHN0YXRpYyBpc1ZhbGlkSWRlbnRpZmllcih0KSB7XG4gICAgICAgIHJldHVybiBjdC50ZXN0KHQpO1xuICAgIH1cbiAgICBjYW5vbmljYWxTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5tYXAoKHQgPT4gKHQgPSB0LnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9gL2csIFwiXFxcXGBcIiksIFxuICAgICAgICBhdC5pc1ZhbGlkSWRlbnRpZmllcih0KSB8fCAodCA9IFwiYFwiICsgdCArIFwiYFwiKSwgdCkpKS5qb2luKFwiLlwiKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmaWVsZCByZWZlcmVuY2VzIHRoZSBrZXkgb2YgYSBkb2N1bWVudC5cbiAgICAgKi8gICAgaXNLZXlGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIDEgPT09IHRoaXMubGVuZ3RoICYmIFwiX19uYW1lX19cIiA9PT0gdGhpcy5nZXQoMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBkZXNpZ25hdGluZyB0aGUga2V5IG9mIGEgZG9jdW1lbnQuXG4gICAgICovICAgIHN0YXRpYyBrZXlGaWVsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhdChbIFwiX19uYW1lX19cIiBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgZmllbGQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIHNlcnZlci1mb3JtYXR0ZWQgc3RyaW5nLlxuICAgICAqXG4gICAgICogLSBTcGxpdHRpbmcgdGhlIGVtcHR5IHN0cmluZyBpcyBub3QgYWxsb3dlZCAoZm9yIG5vdyBhdCBsZWFzdCkuXG4gICAgICogLSBFbXB0eSBzZWdtZW50cyB3aXRoaW4gdGhlIHN0cmluZyAoZS5nLiBpZiB0aGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlXG4gICAgICogICBzZXBhcmF0b3JzKSBhcmUgbm90IGFsbG93ZWQuXG4gICAgICpcbiAgICAgKiBUT0RPKGIvMzcyNDQxNTcpOiB3ZSBzaG91bGQgbWFrZSB0aGlzIG1vcmUgc3RyaWN0LiBSaWdodCBub3csIGl0IGFsbG93c1xuICAgICAqIG5vbi1pZGVudGlmaWVyIHBhdGggY29tcG9uZW50cywgZXZlbiBpZiB0aGV5IGFyZW4ndCBlc2NhcGVkLlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVNlcnZlckZvcm1hdCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgbGV0IG4gPSBcIlwiLCBzID0gMDtcbiAgICAgICAgY29uc3QgaSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgwID09PSBuLmxlbmd0aCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBmaWVsZCBwYXRoICgke3R9KS4gUGF0aHMgbXVzdCBub3QgYmUgZW1wdHksIGJlZ2luIHdpdGggJy4nLCBlbmQgd2l0aCAnLicsIG9yIGNvbnRhaW4gJy4uJ2ApO1xuICAgICAgICAgICAgZS5wdXNoKG4pLCBuID0gXCJcIjtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHIgPSAhMTtcbiAgICAgICAgZm9yICg7cyA8IHQubGVuZ3RoOyApIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0W3NdO1xuICAgICAgICAgICAgaWYgKFwiXFxcXFwiID09PSBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHMgKyAxID09PSB0Lmxlbmd0aCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlBhdGggaGFzIHRyYWlsaW5nIGVzY2FwZSBjaGFyYWN0ZXI6IFwiICsgdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHRbcyArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChcIlxcXFxcIiAhPT0gZSAmJiBcIi5cIiAhPT0gZSAmJiBcImBcIiAhPT0gZSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlBhdGggaGFzIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiBcIiArIHQpO1xuICAgICAgICAgICAgICAgIG4gKz0gZSwgcyArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIFwiYFwiID09PSBlID8gKHIgPSAhciwgcysrKSA6IFwiLlwiICE9PSBlIHx8IHIgPyAobiArPSBlLCBzKyspIDogKGkoKSwgcysrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSgpLCByKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiVW50ZXJtaW5hdGVkIGAgaW4gcGF0aDogXCIgKyB0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBhdChlKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhdChbXSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBodCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBhdGggPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVBhdGgodCkge1xuICAgICAgICByZXR1cm4gbmV3IGh0KHV0LmZyb21TdHJpbmcodCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5hbWUodCkge1xuICAgICAgICByZXR1cm4gbmV3IGh0KHV0LmZyb21TdHJpbmcodCkucG9wRmlyc3QoNSkpO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgaHQodXQuZW1wdHlQYXRoKCkpO1xuICAgIH1cbiAgICBnZXQgY29sbGVjdGlvbkdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoLnBvcExhc3QoKS5sYXN0U2VnbWVudCgpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkb2N1bWVudCBpcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25JZC4gKi8gICAgaGFzQ29sbGVjdGlvbklkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5sZW5ndGggPj0gMiAmJiB0aGlzLnBhdGguZ2V0KHRoaXMucGF0aC5sZW5ndGggLSAyKSA9PT0gdDtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gZ3JvdXAgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBjb2xsZWN0aW9uKSBmb3IgdGhpcyBrZXkuICovICAgIGdldENvbGxlY3Rpb25Hcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5nZXQodGhpcy5wYXRoLmxlbmd0aCAtIDIpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggdG8gdGhlIHBhcmVudCBjb2xsZWN0aW9uLiAqLyAgICBnZXRDb2xsZWN0aW9uUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aC5wb3BMYXN0KCk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdCAmJiAwID09PSB1dC5jb21wYXJhdG9yKHRoaXMucGF0aCwgdC5wYXRoKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdGgudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgc3RhdGljIGNvbXBhcmF0b3IodCwgZSkge1xuICAgICAgICByZXR1cm4gdXQuY29tcGFyYXRvcih0LnBhdGgsIGUucGF0aCk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0RvY3VtZW50S2V5KHQpIHtcbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoICUgMiA9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGRvY3VtZW50IGtleSB3aXRoIHRoZSBnaXZlbiBzZWdtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWdtZW50cyAtIFRoZSBzZWdtZW50cyBvZiB0aGUgcGF0aCB0byB0aGUgZG9jdW1lbnRcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiBEb2N1bWVudEtleVxuICAgICAqLyAgICBzdGF0aWMgZnJvbVNlZ21lbnRzKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBodChuZXcgdXQodC5zbGljZSgpKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUaGUgaW5pdGlhbCBtdXRhdGlvbiBiYXRjaCBpZCBmb3IgZWFjaCBpbmRleC4gR2V0cyB1cGRhdGVkIGR1cmluZyBpbmRleFxuICogYmFja2ZpbGwuXG4gKi9cbi8qKlxuICogQW4gaW5kZXggZGVmaW5pdGlvbiBmb3IgZmllbGQgaW5kZXhlcyBpbiBGaXJlc3RvcmUuXG4gKlxuICogRXZlcnkgaW5kZXggaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29sbGVjdGlvbi4gVGhlIGRlZmluaXRpb24gY29udGFpbnMgYSBsaXN0XG4gKiBvZiBmaWVsZHMgYW5kIHRoZWlyIGluZGV4IGtpbmQgKHdoaWNoIGNhbiBiZSBgQVNDRU5ESU5HYCwgYERFU0NFTkRJTkdgIG9yXG4gKiBgQ09OVEFJTlNgIGZvciBBcnJheUNvbnRhaW5zL0FycmF5Q29udGFpbnNBbnkgcXVlcmllcykuXG4gKlxuICogVW5saWtlIHRoZSBiYWNrZW5kLCB0aGUgU0RLIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBjb2xsZWN0aW9uIG9yXG4gKiBjb2xsZWN0aW9uIGdyb3VwLXNjb3BlZCBpbmRpY2VzLiBFdmVyeSBpbmRleCBjYW4gYmUgdXNlZCBmb3IgYm90aCBzaW5nbGVcbiAqIGNvbGxlY3Rpb24gYW5kIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcmllcy5cbiAqL1xuY2xhc3MgbHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBJRC4gUmV0dXJucyAtMSBpZiB0aGUgaW5kZXggSUQgaXMgbm90IGF2YWlsYWJsZSAoZS5nLiB0aGUgaW5kZXhcbiAgICAgKiBoYXMgbm90IHlldCBiZWVuIHBlcnNpc3RlZCkuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSBjb2xsZWN0aW9uIElEIHRoaXMgaW5kZXggYXBwbGllcyB0by4gKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIGZpZWxkIHNlZ21lbnRzIGZvciB0aGlzIGluZGV4LiAqL1xuICAgIG4sIFxuICAgIC8qKiBTaG93cyBob3cgdXAtdG8tZGF0ZSB0aGUgaW5kZXggaXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuICovXG4gICAgcykge1xuICAgICAgICB0aGlzLmluZGV4SWQgPSB0LCB0aGlzLmNvbGxlY3Rpb25Hcm91cCA9IGUsIHRoaXMuZmllbGRzID0gbiwgdGhpcy5pbmRleFN0YXRlID0gcztcbiAgICB9XG59XG5cbi8qKiBBbiBJRCBmb3IgYW4gaW5kZXggdGhhdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkIHRvIHBlcnNpc3RlbmNlLiAgKi9cbi8qKiBSZXR1cm5zIHRoZSBBcnJheUNvbnRhaW5zL0FycmF5Q29udGFpbnNBbnkgc2VnbWVudCBmb3IgdGhpcyBpbmRleC4gKi9cbmZ1bmN0aW9uIGZ0KHQpIHtcbiAgICByZXR1cm4gdC5maWVsZHMuZmluZCgodCA9PiAyIC8qIEluZGV4S2luZC5DT05UQUlOUyAqLyA9PT0gdC5raW5kKSk7XG59XG5cbi8qKiBSZXR1cm5zIGFsbCBkaXJlY3Rpb25hbCAoYXNjZW5kaW5nL2Rlc2NlbmRpbmcpIHNlZ21lbnRzIGZvciB0aGlzIGluZGV4LiAqLyBmdW5jdGlvbiBkdCh0KSB7XG4gICAgcmV0dXJuIHQuZmllbGRzLmZpbHRlcigodCA9PiAyIC8qIEluZGV4S2luZC5DT05UQUlOUyAqLyAhPT0gdC5raW5kKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JkZXIgb2YgdGhlIGRvY3VtZW50IGtleSBjb21wb25lbnQgZm9yIHRoZSBnaXZlbiBpbmRleC5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBXZWIgSW5kZXhlZERiIGltcGxlbWVudGF0aW9uLlxuICovXG4vKipcbiAqIENvbXBhcmVzIGluZGV4ZXMgYnkgY29sbGVjdGlvbiBncm91cCBhbmQgc2VnbWVudHMuIElnbm9yZXMgdXBkYXRlIHRpbWUgYW5kXG4gKiBpbmRleCBJRC5cbiAqL1xuZnVuY3Rpb24gd3QodCwgZSkge1xuICAgIGxldCBuID0gZXQodC5jb2xsZWN0aW9uR3JvdXAsIGUuY29sbGVjdGlvbkdyb3VwKTtcbiAgICBpZiAoMCAhPT0gbikgcmV0dXJuIG47XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBNYXRoLm1pbih0LmZpZWxkcy5sZW5ndGgsIGUuZmllbGRzLmxlbmd0aCk7ICsrcykgaWYgKG4gPSBtdCh0LmZpZWxkc1tzXSwgZS5maWVsZHNbc10pLCBcbiAgICAwICE9PSBuKSByZXR1cm4gbjtcbiAgICByZXR1cm4gZXQodC5maWVsZHMubGVuZ3RoLCBlLmZpZWxkcy5sZW5ndGgpO1xufVxuXG4vKiogUmV0dXJucyBhIGRlYnVnIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCBpbmRleCAqLyBsdC5VTktOT1dOX0lEID0gLTE7XG5cbi8qKiBBbiBpbmRleCBjb21wb25lbnQgY29uc2lzdGluZyBvZiBmaWVsZCBwYXRoIGFuZCBpbmRleCB0eXBlLiAgKi9cbmNsYXNzIF90IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIGZpZWxkIHBhdGggb2YgdGhlIGNvbXBvbmVudC4gKi9cbiAgICB0LCBcbiAgICAvKiogVGhlIGZpZWxkcyBzb3J0aW5nIG9yZGVyLiAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy5maWVsZFBhdGggPSB0LCB0aGlzLmtpbmQgPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbXQodCwgZSkge1xuICAgIGNvbnN0IG4gPSBhdC5jb21wYXJhdG9yKHQuZmllbGRQYXRoLCBlLmZpZWxkUGF0aCk7XG4gICAgcmV0dXJuIDAgIT09IG4gPyBuIDogZXQodC5raW5kLCBlLmtpbmQpO1xufVxuXG4vKipcbiAqIFN0b3JlcyB0aGUgXCJoaWdoIHdhdGVyIG1hcmtcIiB0aGF0IGluZGljYXRlcyBob3cgdXBkYXRlZCB0aGUgSW5kZXggaXMgZm9yIHRoZVxuICogY3VycmVudCB1c2VyLlxuICovIGNsYXNzIGd0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlbiB0aGUgaW5kZXggd2FzIGxhc3QgdXBkYXRlZCAocmVsYXRpdmUgdG8gb3RoZXIgaW5kZXhlcykuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSB0aGUgbGF0ZXN0IGluZGV4ZWQgcmVhZCB0aW1lLCBkb2N1bWVudCBhbmQgYmF0Y2ggaWQuICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLnNlcXVlbmNlTnVtYmVyID0gdCwgdGhpcy5vZmZzZXQgPSBlO1xuICAgIH1cbiAgICAvKiogVGhlIHN0YXRlIG9mIGFuIGluZGV4IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBiYWNrZmlsbGVkLiAqLyAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgZ3QoMCwgSXQubWluKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9mZnNldCB0aGF0IG1hdGNoZXMgYWxsIGRvY3VtZW50cyB3aXRoIGEgcmVhZCB0aW1lIGhpZ2hlciB0aGFuXG4gKiBgcmVhZFRpbWVgLlxuICovIGZ1bmN0aW9uIHl0KHQsIGUpIHtcbiAgICAvLyBXZSB3YW50IHRvIGNyZWF0ZSBhbiBvZmZzZXQgdGhhdCBtYXRjaGVzIGFsbCBkb2N1bWVudHMgd2l0aCBhIHJlYWQgdGltZVxuICAgIC8vIGdyZWF0ZXIgdGhhbiB0aGUgcHJvdmlkZWQgcmVhZCB0aW1lLiBUbyBkbyBzbywgd2UgdGVjaG5pY2FsbHkgbmVlZCB0b1xuICAgIC8vIGNyZWF0ZSBhbiBvZmZzZXQgZm9yIGAocmVhZFRpbWUsIE1BWF9ET0NVTUVOVF9LRVkpYC4gV2hpbGUgd2UgY291bGQgdXNlXG4gICAgLy8gVW5pY29kZSBjb2RlcG9pbnRzIHRvIGdlbmVyYXRlIE1BWF9ET0NVTUVOVF9LRVksIGl0IGlzIG11Y2ggZWFzaWVyIHRvIHVzZVxuICAgIC8vIGAocmVhZFRpbWUgKyAxLCBEb2N1bWVudEtleS5lbXB0eSgpKWAgc2luY2UgYD4gRG9jdW1lbnRLZXkuZW1wdHkoKWAgbWF0Y2hlc1xuICAgIC8vIGFsbCB2YWxpZCBkb2N1bWVudCBJRHMuXG4gICAgY29uc3QgbiA9IHQudG9UaW1lc3RhbXAoKS5zZWNvbmRzLCBzID0gdC50b1RpbWVzdGFtcCgpLm5hbm9zZWNvbmRzICsgMSwgaSA9IHJ0LmZyb21UaW1lc3RhbXAoMWU5ID09PSBzID8gbmV3IGl0KG4gKyAxLCAwKSA6IG5ldyBpdChuLCBzKSk7XG4gICAgcmV0dXJuIG5ldyBJdChpLCBodC5lbXB0eSgpLCBlKTtcbn1cblxuLyoqIENyZWF0ZXMgYSBuZXcgb2Zmc2V0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBkb2N1bWVudC4gKi8gZnVuY3Rpb24gcHQodCkge1xuICAgIHJldHVybiBuZXcgSXQodC5yZWFkVGltZSwgdC5rZXksIC0xKTtcbn1cblxuLyoqXG4gKiBTdG9yZXMgdGhlIGxhdGVzdCByZWFkIHRpbWUsIGRvY3VtZW50IGFuZCBiYXRjaCBJRCB0aGF0IHdlcmUgcHJvY2Vzc2VkIGZvciBhblxuICogaW5kZXguXG4gKi8gY2xhc3MgSXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgcmVhZCB0aW1lIHZlcnNpb24gdGhhdCBoYXMgYmVlbiBpbmRleGVkIGJ5IEZpcmVzdG9yZSBmb3IgdGhpc1xuICAgICAqIGZpZWxkIGluZGV4LlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIGxhc3QgZG9jdW1lbnQgdGhhdCB3YXMgaW5kZXhlZCBmb3IgdGhpcyBxdWVyeS4gVXNlXG4gICAgICogYERvY3VtZW50S2V5LmVtcHR5KClgIGlmIG5vIGRvY3VtZW50IGhhcyBiZWVuIGluZGV4ZWQuXG4gICAgICovXG4gICAgZSwgXG4gICAgLypcbiAgICAgKiBUaGUgbGFyZ2VzdCBtdXRhdGlvbiBiYXRjaCBpZCB0aGF0J3MgYmVlbiBwcm9jZXNzZWQgYnkgRmlyZXN0b3JlLlxuICAgICAqL1xuICAgIG4pIHtcbiAgICAgICAgdGhpcy5yZWFkVGltZSA9IHQsIHRoaXMuZG9jdW1lbnRLZXkgPSBlLCB0aGlzLmxhcmdlc3RCYXRjaElkID0gbjtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYW4gb2Zmc2V0IHRoYXQgc29ydHMgYmVmb3JlIGFsbCByZWd1bGFyIG9mZnNldHMuICovICAgIHN0YXRpYyBtaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgSXQocnQubWluKCksIGh0LmVtcHR5KCksIC0xKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYW4gb2Zmc2V0IHRoYXQgc29ydHMgYWZ0ZXIgYWxsIHJlZ3VsYXIgb2Zmc2V0cy4gKi8gICAgc3RhdGljIG1heCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJdChydC5tYXgoKSwgaHQuZW1wdHkoKSwgLTEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gVHQodCwgZSkge1xuICAgIGxldCBuID0gdC5yZWFkVGltZS5jb21wYXJlVG8oZS5yZWFkVGltZSk7XG4gICAgcmV0dXJuIDAgIT09IG4gPyBuIDogKG4gPSBodC5jb21wYXJhdG9yKHQuZG9jdW1lbnRLZXksIGUuZG9jdW1lbnRLZXkpLCAwICE9PSBuID8gbiA6IGV0KHQubGFyZ2VzdEJhdGNoSWQsIGUubGFyZ2VzdEJhdGNoSWQpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgRXQgPSBcIlRoZSBjdXJyZW50IHRhYiBpcyBub3QgaW4gdGhlIHJlcXVpcmVkIHN0YXRlIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byByZWZyZXNoIHRoZSBicm93c2VyIHRhYi5cIjtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGVyc2lzdGVuY2UgdHJhbnNhY3Rpb24sIGVuY2Fwc3VsYXRpbmcgYm90aCB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2VxdWVuY2UgbnVtYmVycyBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBvbkNvbW1pdHRlZCBsaXN0ZW5lcnMuXG4gKlxuICogV2hlbiB5b3UgY2FsbCBQZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbigpLCBpdCB3aWxsIGNyZWF0ZSBhIHRyYW5zYWN0aW9uIGFuZFxuICogcGFzcyBpdCB0byB5b3VyIGNhbGxiYWNrLiBZb3UgdGhlbiBwYXNzIGl0IHRvIGFueSBtZXRob2QgdGhhdCBvcGVyYXRlc1xuICogb24gcGVyc2lzdGVuY2UuXG4gKi8gY2xhc3MgQXQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIGFkZE9uQ29tbWl0dGVkTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLm9uQ29tbWl0dGVkTGlzdGVuZXJzLnB1c2godCk7XG4gICAgfVxuICAgIHJhaXNlT25Db21taXR0ZWRFdmVudCgpIHtcbiAgICAgICAgdGhpcy5vbkNvbW1pdHRlZExpc3RlbmVycy5mb3JFYWNoKCh0ID0+IHQoKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVmVyaWZpZXMgdGhlIGVycm9yIHRocm93biBieSBhIExvY2FsU3RvcmUgb3BlcmF0aW9uLiBJZiBhIExvY2FsU3RvcmVcbiAqIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBwcmltYXJ5IGxlYXNlIGhhcyBiZWVuIHRha2VuIGJ5IGFub3RoZXIgY2xpZW50LFxuICogd2UgaWdub3JlIHRoZSBlcnJvciAodGhlIHBlcnNpc3RlbmNlIGxheWVyIHdpbGwgaW1tZWRpYXRlbHkgY2FsbFxuICogYGFwcGx5UHJpbWFyeUxlYXNlYCB0byBwcm9wYWdhdGUgdGhlIHByaW1hcnkgc3RhdGUgY2hhbmdlKS4gQWxsIG90aGVyIGVycm9yc1xuICogYXJlIHJlLXRocm93bi5cbiAqXG4gKiBAcGFyYW0gZXJyIC0gQW4gZXJyb3IgcmV0dXJuZWQgYnkgYSBMb2NhbFN0b3JlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHdlIHJlY292ZXJlZCwgb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICovIGFzeW5jIGZ1bmN0aW9uIHZ0KHQpIHtcbiAgICBpZiAodC5jb2RlICE9PSBxLkZBSUxFRF9QUkVDT05ESVRJT04gfHwgdC5tZXNzYWdlICE9PSBFdCkgdGhyb3cgdDtcbiAgICBOKFwiTG9jYWxTdG9yZVwiLCBcIlVuZXhwZWN0ZWRseSBsb3N0IHByaW1hcnkgbGVhc2VcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFBlcnNpc3RlbmNlUHJvbWlzZSBpcyBlc3NlbnRpYWxseSBhIHJlLWltcGxlbWVudGF0aW9uIG9mIFByb21pc2UgZXhjZXB0XG4gKiBpdCBoYXMgYSAubmV4dCgpIG1ldGhvZCBpbnN0ZWFkIG9mIC50aGVuKCkgYW5kIC5uZXh0KCkgYW5kIC5jYXRjaCgpIGNhbGxiYWNrc1xuICogYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgd2hlbiBhIFBlcnNpc3RlbmNlUHJvbWlzZSByZXNvbHZlcyByYXRoZXIgdGhhblxuICogYXN5bmNocm9ub3VzbHkgKFByb21pc2UgaW1wbGVtZW50YXRpb25zIHVzZSBzZXRJbW1lZGlhdGUoKSBvciBzaW1pbGFyKS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBpbnRlcm9wZXJhdGUgd2l0aCBJbmRleGVkREIgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5XG4gKiBjb21taXQgdHJhbnNhY3Rpb25zIGlmIGNvbnRyb2wgaXMgcmV0dXJuZWQgdG8gdGhlIGV2ZW50IGxvb3Agd2l0aG91dFxuICogc3luY2hyb25vdXNseSBpbml0aWF0aW5nIGFub3RoZXIgb3BlcmF0aW9uIG9uIHRoZSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBOT1RFOiAudGhlbigpIGFuZCAuY2F0Y2goKSBvbmx5IGFsbG93IGEgc2luZ2xlIGNvbnN1bWVyLCB1bmxpa2Ugbm9ybWFsXG4gKiBQcm9taXNlcy5cbiAqLyBjbGFzcyBSdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAvLyBOT1RFOiBuZXh0L2NhdGNoQ2FsbGJhY2sgd2lsbCBhbHdheXMgcG9pbnQgdG8gb3VyIG93biB3cmFwcGVyIGZ1bmN0aW9ucyxcbiAgICAgICAgLy8gbm90IHRoZSB1c2VyJ3MgcmF3IG5leHQoKSBvciBjYXRjaCgpIGNhbGxiYWNrcy5cbiAgICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsLCB0aGlzLmNhdGNoQ2FsbGJhY2sgPSBudWxsLCBcbiAgICAgICAgLy8gV2hlbiB0aGUgb3BlcmF0aW9uIHJlc29sdmVzLCB3ZSdsbCBzZXQgcmVzdWx0IG9yIGVycm9yIGFuZCBtYXJrIGlzRG9uZS5cbiAgICAgICAgdGhpcy5yZXN1bHQgPSB2b2lkIDAsIHRoaXMuZXJyb3IgPSB2b2lkIDAsIHRoaXMuaXNEb25lID0gITEsIFxuICAgICAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIC50aGVuKCkgb3IgLmNhdGNoKCkgYXJlIGNhbGxlZCBhbmQgcHJldmVudHMgYWRkaXRpb25hbFxuICAgICAgICAvLyBjaGFpbmluZy5cbiAgICAgICAgdGhpcy5jYWxsYmFja0F0dGFjaGVkID0gITEsIHQoKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0RvbmUgPSAhMCwgdGhpcy5yZXN1bHQgPSB0LCB0aGlzLm5leHRDYWxsYmFjayAmJiBcbiAgICAgICAgICAgIC8vIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkIHVubGVzcyBUIGlzIFZvaWQsIGJ1dCB3ZSBjYW4ndCBleHByZXNzXG4gICAgICAgICAgICAvLyB0aGF0IGluIHRoZSB0eXBlIHN5c3RlbS5cbiAgICAgICAgICAgIHRoaXMubmV4dENhbGxiYWNrKHQpO1xuICAgICAgICB9KSwgKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0RvbmUgPSAhMCwgdGhpcy5lcnJvciA9IHQsIHRoaXMuY2F0Y2hDYWxsYmFjayAmJiB0aGlzLmNhdGNoQ2FsbGJhY2sodCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY2F0Y2godCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KHZvaWQgMCwgdCk7XG4gICAgfVxuICAgIG5leHQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsYmFja0F0dGFjaGVkICYmIE8oKSwgdGhpcy5jYWxsYmFja0F0dGFjaGVkID0gITAsIHRoaXMuaXNEb25lID8gdGhpcy5lcnJvciA/IHRoaXMud3JhcEZhaWx1cmUoZSwgdGhpcy5lcnJvcikgOiB0aGlzLndyYXBTdWNjZXNzKHQsIHRoaXMucmVzdWx0KSA6IG5ldyBSdCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmV4dENhbGxiYWNrID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwU3VjY2Vzcyh0LCBlKS5uZXh0KG4sIHMpO1xuICAgICAgICAgICAgfSwgdGhpcy5jYXRjaENhbGxiYWNrID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cmFwRmFpbHVyZShlLCB0KS5uZXh0KG4sIHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB0b1Byb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubmV4dCh0LCBlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB3cmFwVXNlckZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0KCk7XG4gICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFJ0ID8gZSA6IFJ0LnJlc29sdmUoZSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdC5yZWplY3QodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JhcFN1Y2Nlc3ModCwgZSkge1xuICAgICAgICByZXR1cm4gdCA/IHRoaXMud3JhcFVzZXJGdW5jdGlvbigoKCkgPT4gdChlKSkpIDogUnQucmVzb2x2ZShlKTtcbiAgICB9XG4gICAgd3JhcEZhaWx1cmUodCwgZSkge1xuICAgICAgICByZXR1cm4gdCA/IHRoaXMud3JhcFVzZXJGdW5jdGlvbigoKCkgPT4gdChlKSkpIDogUnQucmVqZWN0KGUpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVzb2x2ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUnQoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICBlKHQpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHN0YXRpYyByZWplY3QodCkge1xuICAgICAgICByZXR1cm4gbmV3IFJ0KCgoZSwgbikgPT4ge1xuICAgICAgICAgICAgbih0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzdGF0aWMgd2FpdEZvcihcbiAgICAvLyBBY2NlcHQgYWxsIFByb21pc2UgdHlwZXMgaW4gd2FpdEZvcigpLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdCkge1xuICAgICAgICByZXR1cm4gbmV3IFJ0KCgoZSwgbikgPT4ge1xuICAgICAgICAgICAgbGV0IHMgPSAwLCBpID0gMCwgciA9ICExO1xuICAgICAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICArK3MsIHQubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICArK2ksIHIgJiYgaSA9PT0gcyAmJiBlKCk7XG4gICAgICAgICAgICAgICAgfSksICh0ID0+IG4odCkpKTtcbiAgICAgICAgICAgIH0pKSwgciA9ICEwLCBpID09PSBzICYmIGUoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIHRoYXQgYXN5bmNocm9ub3VzbHkgZXZhbHVhdGUgdG8gYVxuICAgICAqIGJvb2xlYW4sIGltcGxlbWVudHMgYSBzaG9ydC1jaXJjdWl0aW5nIGBvcmAgYmV0d2VlbiB0aGUgcmVzdWx0cy4gUHJlZGljYXRlc1xuICAgICAqIHdpbGwgYmUgZXZhbHVhdGVkIHVudGlsIG9uZSBvZiB0aGVtIHJldHVybnMgYHRydWVgLCB0aGVuIHN0b3AuIFRoZSBmaW5hbFxuICAgICAqIHJlc3VsdCB3aWxsIGJlIHdoZXRoZXIgYW55IG9mIHRoZW0gcmV0dXJuZWQgYHRydWVgLlxuICAgICAqLyAgICBzdGF0aWMgb3IodCkge1xuICAgICAgICBsZXQgZSA9IFJ0LnJlc29sdmUoITEpO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZSA9IGUubmV4dCgodCA9PiB0ID8gUnQucmVzb2x2ZSh0KSA6IG4oKSkpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgc3RhdGljIGZvckVhY2godCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBuLnB1c2goZS5jYWxsKHRoaXMsIHQsIHMpKTtcbiAgICAgICAgfSkpLCB0aGlzLndhaXRGb3Iobik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmN1cnJlbnRseSBtYXAgYWxsIGFycmF5IGVsZW1lbnRzIHRocm91Z2ggYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICAgICAqLyAgICBzdGF0aWMgbWFwQXJyYXkodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJ0KCgobiwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHQubGVuZ3RoLCByID0gbmV3IEFycmF5KGkpO1xuICAgICAgICAgICAgbGV0IG8gPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgdSA9IDA7IHUgPCBpOyB1KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gdTtcbiAgICAgICAgICAgICAgICBlKHRbY10pLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByW2NdID0gdCwgKytvLCBvID09PSBpICYmIG4ocik7XG4gICAgICAgICAgICAgICAgfSksICh0ID0+IHModCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byByZWN1cnNpdmUgUGVyc2lzdGVuY2VQcm9taXNlIGNhbGxzLCB0aGF0IGF2b2lkc1xuICAgICAqIHBvdGVudGlhbCBtZW1vcnkgcHJvYmxlbXMgZnJvbSB1bmJvdW5kZWQgY2hhaW5zIG9mIHByb21pc2VzLlxuICAgICAqXG4gICAgICogVGhlIGBhY3Rpb25gIHdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgd2hpbGUgYGNvbmRpdGlvbmAgaXMgdHJ1ZS5cbiAgICAgKi8gICAgc3RhdGljIGRvV2hpbGUodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJ0KCgobiwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAhMCA9PT0gdCgpID8gZSgpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaSgpO1xuICAgICAgICAgICAgICAgIH0pLCBzKSA6IG4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBSZWZlcmVuY2VzIHRvIGB3aW5kb3dgIGFyZSBndWFyZGVkIGJ5IFNpbXBsZURiLmlzQXZhaWxhYmxlKClcbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuLyoqXG4gKiBXcmFwcyBhbiBJREJUcmFuc2FjdGlvbiBhbmQgZXhwb3NlcyBhIHN0b3JlKCkgbWV0aG9kIHRvIGdldCBhIGhhbmRsZSB0byBhXG4gKiBzcGVjaWZpYyBvYmplY3Qgc3RvcmUuXG4gKi9cbmNsYXNzIFB0IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gdCwgdGhpcy50cmFuc2FjdGlvbiA9IGUsIHRoaXMuYWJvcnRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBJbmRleGVkRGIgdHJhbnNhY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnYgPSBuZXcgSywgdGhpcy50cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52LnJlc29sdmUoKTtcbiAgICAgICAgfSwgdGhpcy50cmFuc2FjdGlvbi5vbmFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgZS5lcnJvciA/IHRoaXMudi5yZWplY3QobmV3IFN0KHQsIGUuZXJyb3IpKSA6IHRoaXMudi5yZXNvbHZlKCk7XG4gICAgICAgIH0sIHRoaXMudHJhbnNhY3Rpb24ub25lcnJvciA9IGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IGt0KGUudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIHRoaXMudi5yZWplY3QobmV3IFN0KHQsIG4pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIG9wZW4odCwgZSwgbiwgcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQdChlLCB0LnRyYW5zYWN0aW9uKHMsIG4pKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFN0KGUsIHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBSKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52LnByb21pc2U7XG4gICAgfVxuICAgIGFib3J0KHQpIHtcbiAgICAgICAgdCAmJiB0aGlzLnYucmVqZWN0KHQpLCB0aGlzLmFib3J0ZWQgfHwgKE4oXCJTaW1wbGVEYlwiLCBcIkFib3J0aW5nIHRyYW5zYWN0aW9uOlwiLCB0ID8gdC5tZXNzYWdlIDogXCJDbGllbnQtaW5pdGlhdGVkIGFib3J0XCIpLCBcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gITAsIHRoaXMudHJhbnNhY3Rpb24uYWJvcnQoKSk7XG4gICAgfVxuICAgIFAoKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIFYzIEluZGV4ZWREQiwgd2UgaW52b2tlIGNvbW1pdCgpIGV4cGxpY2l0bHkgdG9cbiAgICAgICAgLy8gc3BlZWQgdXAgaW5kZXggREIgcHJvY2Vzc2luZyBpZiB0aGUgZXZlbnQgbG9vcCByZW1haW5zIGJsb2Nrcy5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdCA9IHRoaXMudHJhbnNhY3Rpb247XG4gICAgICAgIHRoaXMuYWJvcnRlZCB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuY29tbWl0IHx8IHQuY29tbWl0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBTaW1wbGVEYlN0b3JlPEtleVR5cGUsIFZhbHVlVHlwZT4gZm9yIHRoZSBzcGVjaWZpZWQgc3RvcmUuIEFsbFxuICAgICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBTaW1wbGVEYlN0b3JlIGhhcHBlbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpc1xuICAgICAqIHRyYW5zYWN0aW9uIGFuZCBpdCBjYW5ub3QgYmUgdXNlZCBhbnltb3JlIG9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogY29tcGxldGVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHdlIGNhbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhhdCB0aGUgS2V5VHlwZSBhbmQgVmFsdWVUeXBlIGFyZVxuICAgICAqIGNvcnJlY3QsIGJ1dCB0aGV5IGFsbG93IHR5cGUgc2FmZXR5IHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvbnN1bWluZyBjb2RlLlxuICAgICAqLyAgICBzdG9yZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHQpO1xuICAgICAgICByZXR1cm4gbmV3IEN0KGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIEluZGV4ZWREYiB3aXRoIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgdGhhdCB1c2VzXG4gKiBQcm9taXNlLWxpa2UgcmV0dXJuIHZhbHVlcyB0byBjaGFpbiBvcGVyYXRpb25zLiBSZWFsIHByb21pc2VzIGNhbm5vdCBiZSB1c2VkXG4gKiBzaW5jZSAudGhlbigpIGNvbnRpbnVhdGlvbnMgYXJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IChlLmcuIHZpYVxuICogLnNldEltbWVkaWF0ZSksIHdoaWNoIHdvdWxkIGNhdXNlIEluZGV4ZWREQiB0byBlbmQgdGhlIHRyYW5zYWN0aW9uLlxuICogU2VlIFBlcnNpc3RlbmNlUHJvbWlzZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovIGNsYXNzIGJ0IHtcbiAgICAvKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2ltcGxlRGIgd3JhcHBlciBmb3IgSW5kZXhlZERiIGRhdGFiYXNlIGBuYW1lYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgdmVyc2lvbmAgbXVzdCBub3QgYmUgYSBkb3duZ3JhZGUuIEluZGV4ZWREQiBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICogZG93bmdyYWRpbmcgdGhlIHNjaGVtYSB2ZXJzaW9uLiBXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgYW55IHdheSB0byBkb1xuICAgICAqIHZlcnNpb25pbmcgb3V0c2lkZSBvZiBJbmRleGVkREIncyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYXMgb25seVxuICAgICAqIHZlcnNpb24tdXBncmFkZSB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gZG8gdGhpbmdzIGxpa2UgY3JlYXRlXG4gICAgICogb2JqZWN0c3RvcmVzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gdCwgdGhpcy52ZXJzaW9uID0gZSwgdGhpcy5WID0gbjtcbiAgICAgICAgLy8gTk9URTogQWNjb3JkaW5nIHRvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTcwNTAsIHRoZVxuICAgICAgICAvLyBidWcgd2UncmUgY2hlY2tpbmcgZm9yIHNob3VsZCBleGlzdCBpbiBpT1MgPj0gMTIuMiBhbmQgPCAxMywgYnV0IGZvclxuICAgICAgICAvLyB3aGF0ZXZlciByZWFzb24gaXQncyBtdWNoIGhhcmRlciB0byBoaXQgYWZ0ZXIgMTIuMiBzbyB3ZSBvbmx5IHByb2FjdGl2ZWx5XG4gICAgICAgIC8vIGxvZyBvbiAxMi4yLlxuICAgICAgICAxMi4yID09PSBidC5TKGdldFVBKCkpICYmIGsoXCJGaXJlc3RvcmUgcGVyc2lzdGVuY2Ugc3VmZmVycyBmcm9tIGEgYnVnIGluIGlPUyAxMi4yIFNhZmFyaSB0aGF0IG1heSBjYXVzZSB5b3VyIGFwcCB0byBzdG9wIHdvcmtpbmcuIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvNTY0OTYyOTYvMTEwOTE1IGZvciBkZXRhaWxzIGFuZCBhIHBvdGVudGlhbCB3b3JrYXJvdW5kLlwiKTtcbiAgICB9XG4gICAgLyoqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBkYXRhYmFzZS4gKi8gICAgc3RhdGljIGRlbGV0ZSh0KSB7XG4gICAgICAgIHJldHVybiBOKFwiU2ltcGxlRGJcIiwgXCJSZW1vdmluZyBkYXRhYmFzZTpcIiwgdCksIHh0KHdpbmRvdy5pbmRleGVkREIuZGVsZXRlRGF0YWJhc2UodCkpLnRvUHJvbWlzZSgpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIEluZGV4ZWREQiBpcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuICovICAgIHN0YXRpYyBEKCkge1xuICAgICAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKGJ0LkMoKSkgcmV0dXJuICEwO1xuICAgICAgICAvLyBXZSBleHRlbnNpdmVseSB1c2UgaW5kZXhlZCBhcnJheSB2YWx1ZXMgYW5kIGNvbXBvdW5kIGtleXMsXG4gICAgICAgIC8vIHdoaWNoIElFIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0LiBIb3dldmVyLCB0aGV5IHN0aWxsIGhhdmUgaW5kZXhlZERCXG4gICAgICAgIC8vIGRlZmluZWQgb24gdGhlIHdpbmRvdywgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgdGhlbSBoZXJlIGFuZCBtYWtlIHN1cmVcbiAgICAgICAgLy8gdG8gcmV0dXJuIHRoYXQgcGVyc2lzdGVuY2UgaXMgbm90IGVuYWJsZWQgZm9yIHRob3NlIGJyb3dzZXJzLlxuICAgICAgICAvLyBGb3IgdHJhY2tpbmcgc3VwcG9ydCBvZiB0aGlzIGZlYXR1cmUsIHNlZSBoZXJlOlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL3N0YXR1cy9pbmRleGVkZGJhcnJheXNhbmRtdWx0aWVudHJ5c3VwcG9ydC9cbiAgICAgICAgLy8gQ2hlY2sgdGhlIFVBIHN0cmluZyB0byBmaW5kIG91dCB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gZ2V0VUEoKSwgZSA9IGJ0LlModCksIG4gPSAwIDwgZSAmJiBlIDwgMTAsIHMgPSBidC5OKHQpLCBpID0gMCA8IHMgJiYgcyA8IDQuNTtcbiAgICAgICAgLy8gSUUgMTBcbiAgICAgICAgLy8gdWEgPSAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNi4wKSc7XG4gICAgICAgIC8vIElFIDExXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMzsgVHJpZGVudC83LjA7IHJ2OjExLjApIGxpa2UgR2Vja28nO1xuICAgICAgICAvLyBFZGdlXG4gICAgICAgIC8vIHVhID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLFxuICAgICAgICAvLyBsaWtlIEdlY2tvKSBDaHJvbWUvMzkuMC4yMTcxLjcxIFNhZmFyaS81MzcuMzYgRWRnZS8xMi4wJztcbiAgICAgICAgLy8gaU9TIFNhZmFyaTogRGlzYWJsZSBmb3IgdXNlcnMgcnVubmluZyBpT1MgdmVyc2lvbiA8IDEwLlxuICAgICAgICAgICAgICAgIHJldHVybiAhKHQuaW5kZXhPZihcIk1TSUUgXCIpID4gMCB8fCB0LmluZGV4T2YoXCJUcmlkZW50L1wiKSA+IDAgfHwgdC5pbmRleE9mKFwiRWRnZS9cIikgPiAwIHx8IG4gfHwgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmFja2luZyBJbmRleGVkREIgc3RvcmUgaXMgdGhlIE5vZGUgSW5kZXhlZERCU2hpbVxuICAgICAqIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4ZW1jbGlvbi9JbmRleGVkREJTaGltKS5cbiAgICAgKi8gICAgc3RhdGljIEMoKSB7XG4gICAgICAgIHZhciB0O1xuICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgcHJvY2VzcyAmJiBcIllFU1wiID09PSAobnVsbCA9PT0gKHQgPSBwcm9jZXNzLmVudikgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5rKTtcbiAgICB9XG4gICAgLyoqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZyb20gYSB0cmFuc2FjdGlvbi4gKi8gICAgc3RhdGljIE0odCwgZSkge1xuICAgICAgICByZXR1cm4gdC5zdG9yZShlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIC8qKiBQYXJzZSBVc2VyIEFnZW50IHRvIGRldGVybWluZSBpT1MgdmVyc2lvbi4gUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICovXG4gICAgc3RhdGljIFModCkge1xuICAgICAgICBjb25zdCBlID0gdC5tYXRjaCgvaSg/OnBob25lfHBhZHxwb2QpIG9zIChbXFxkX10rKS9pKSwgbiA9IGUgPyBlWzFdLnNwbGl0KFwiX1wiKS5zbGljZSgwLCAyKS5qb2luKFwiLlwiKSA6IFwiLTFcIjtcbiAgICAgICAgcmV0dXJuIE51bWJlcihuKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIC8qKiBQYXJzZSBVc2VyIEFnZW50IHRvIGRldGVybWluZSBBbmRyb2lkIHZlcnNpb24uIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLiAqL1xuICAgIHN0YXRpYyBOKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL0FuZHJvaWQgKFtcXGQuXSspL2kpLCBuID0gZSA/IGVbMV0uc3BsaXQoXCIuXCIpLnNsaWNlKDAsIDIpLmpvaW4oXCIuXCIpIDogXCItMVwiO1xuICAgICAgICByZXR1cm4gTnVtYmVyKG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLCBjcmVhdGluZyBvciB1cGdyYWRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgICAqLyAgICBhc3luYyAkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGIgfHwgKE4oXCJTaW1wbGVEYlwiLCBcIk9wZW5pbmcgZGF0YWJhc2U6XCIsIHRoaXMubmFtZSksIHRoaXMuZGIgPSBhd2FpdCBuZXcgUHJvbWlzZSgoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8obWlrZWxlaGVuKTogSW52ZXN0aWdhdGUgYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkvVXNpbmdfSW5kZXhlZERCXG4gICAgICAgICAgICAvLyBzdWdnZXN0cyBJRTkgYW5kIG9sZGVyIFdlYktpdCBicm93c2VycyBoYW5kbGUgdXBncmFkZVxuICAgICAgICAgICAgLy8gZGlmZmVyZW50bHkuIFRoZXkgZXhwZWN0IHNldFZlcnNpb24sIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0lEQlZlcnNpb25DaGFuZ2VSZXF1ZXN0L3NldFZlcnNpb25cbiAgICAgICAgICAgIGNvbnN0IHMgPSBpbmRleGVkREIub3Blbih0aGlzLm5hbWUsIHRoaXMudmVyc2lvbik7XG4gICAgICAgICAgICBzLm9uc3VjY2VzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgZShuKTtcbiAgICAgICAgICAgIH0sIHMub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG4obmV3IFN0KHQsIFwiQ2Fubm90IHVwZ3JhZGUgSW5kZXhlZERCIHNjaGVtYSB3aGlsZSBhbm90aGVyIHRhYiBpcyBvcGVuLiBDbG9zZSBhbGwgdGFicyB0aGF0IGFjY2VzcyBGaXJlc3RvcmUgYW5kIHJlbG9hZCB0aGlzIHBhZ2UgdG8gcHJvY2VlZC5cIikpO1xuICAgICAgICAgICAgfSwgcy5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LmVycm9yO1xuICAgICAgICAgICAgICAgIFwiVmVyc2lvbkVycm9yXCIgPT09IHMubmFtZSA/IG4obmV3IFUocS5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgRmlyZXN0b3JlIFNESyB3YXMgcHJldmlvdXNseSB1c2VkIGFuZCBzbyB0aGUgcGVyc2lzdGVkIGRhdGEgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHlvdSBhcmUgbm93IHVzaW5nLiBUaGUgU0RLIHdpbGwgb3BlcmF0ZSB3aXRoIHBlcnNpc3RlbmNlIGRpc2FibGVkLiBJZiB5b3UgbmVlZCBwZXJzaXN0ZW5jZSwgcGxlYXNlIHJlLXVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBTREsgb3IgZWxzZSBjbGVhciB0aGUgcGVyc2lzdGVkIEluZGV4ZWREQiBkYXRhIGZvciB5b3VyIGFwcCB0byBzdGFydCBmcmVzaC5cIikpIDogXCJJbnZhbGlkU3RhdGVFcnJvclwiID09PSBzLm5hbWUgPyBuKG5ldyBVKHEuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJVbmFibGUgdG8gb3BlbiBhbiBJbmRleGVkREIgY29ubmVjdGlvbi4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gcnVubmluZyBpbiBhIHByaXZhdGUgYnJvd3Npbmcgc2Vzc2lvbiBvbiBhIGJyb3dzZXIgd2hvc2UgcHJpdmF0ZSBicm93c2luZyBzZXNzaW9ucyBkbyBub3Qgc3VwcG9ydCBJbmRleGVkREI6IFwiICsgcykpIDogbihuZXcgU3QodCwgcykpO1xuICAgICAgICAgICAgfSwgcy5vbnVwZ3JhZGVuZWVkZWQgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBOKFwiU2ltcGxlRGJcIiwgJ0RhdGFiYXNlIFwiJyArIHRoaXMubmFtZSArICdcIiByZXF1aXJlcyB1cGdyYWRlIGZyb20gdmVyc2lvbjonLCB0Lm9sZFZlcnNpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5WLk8oZSwgcy50cmFuc2FjdGlvbiwgdC5vbGRWZXJzaW9uLCB0aGlzLnZlcnNpb24pLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgTihcIlNpbXBsZURiXCIsIFwiRGF0YWJhc2UgdXBncmFkZSB0byB2ZXJzaW9uIFwiICsgdGhpcy52ZXJzaW9uICsgXCIgY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpKSwgdGhpcy5GICYmICh0aGlzLmRiLm9udmVyc2lvbmNoYW5nZSA9IHQgPT4gdGhpcy5GKHQpKSwgdGhpcy5kYjtcbiAgICB9XG4gICAgQih0KSB7XG4gICAgICAgIHRoaXMuRiA9IHQsIHRoaXMuZGIgJiYgKHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gZSA9PiB0KGUpKTtcbiAgICB9XG4gICAgYXN5bmMgcnVuVHJhbnNhY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gXCJyZWFkb25seVwiID09PSBlO1xuICAgICAgICBsZXQgciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICsrcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYiA9IGF3YWl0IHRoaXMuJCh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gUHQub3Blbih0aGlzLmRiLCB0LCBpID8gXCJyZWFkb25seVwiIDogXCJyZWFkd3JpdGVcIiwgbiksIHIgPSBzKGUpLm5leHQoKHQgPT4gKGUuUCgpLCBcbiAgICAgICAgICAgICAgICB0KSkpLmNhdGNoKCh0ID0+IChcbiAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgdHJhbnNhY3Rpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yLlxuICAgICAgICAgICAgICAgIGUuYWJvcnQodCksIFJ0LnJlamVjdCh0KSkpKS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBBcyBub3RlZCBhYm92ZSwgZXJyb3JzIGFyZSBwcm9wYWdhdGVkIGJ5IGFib3J0aW5nIHRoZSB0cmFuc2FjdGlvbi4gU29cbiAgICAgICAgICAgICAgICAvLyB3ZSBzd2FsbG93IGFueSBlcnJvciBoZXJlIHRvIGF2b2lkIHRoZSBicm93c2VyIGxvZ2dpbmcgaXQgYXMgdW5oYW5kbGVkLlxuICAgICAgICAgICAgICAgIHJldHVybiByLmNhdGNoKCgoKSA9PiB7fSkpLCBcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUgKGkuZS4gSW5kZXhlZERiJ3Mgb25zdWNjZXNzIGV2ZW50IHRvXG4gICAgICAgICAgICAgICAgLy8gZmlyZSksIGJ1dCBzdGlsbCByZXR1cm4gdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uRm5SZXN1bHQgYmFjayB0byB0aGVcbiAgICAgICAgICAgICAgICAvLyBjYWxsZXIuXG4gICAgICAgICAgICAgICAgYXdhaXQgZS5SLCByO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LCBuID0gXCJGaXJlYmFzZUVycm9yXCIgIT09IGUubmFtZSAmJiByIDwgMztcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHNjaG1pZHQtc2ViYXN0aWFuKTogV2UgY291bGQgcHJvYmFibHkgYmUgc21hcnRlciBhYm91dCB0aGlzIGFuZFxuICAgICAgICAgICAgICAgIC8vIG5vdCByZXRyeSBleGNlcHRpb25zIHRoYXQgYXJlIGxpa2VseSB1bnJlY292ZXJhYmxlIChzdWNoIGFzIHF1b3RhXG4gICAgICAgICAgICAgICAgLy8gZXhjZWVkZWQgZXJyb3JzKS5cbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgdXNlIGFuIGluc3RhbmNlb2YgY2hlY2sgZm9yIEZpcmVzdG9yZUV4Y2VwdGlvbiwgc2luY2UgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGlzIHdyYXBwZWQgaW4gYSBnZW5lcmljIGVycm9yIGJ5IG91ciBhc3luYy9hd2FpdCBoYW5kbGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE4oXCJTaW1wbGVEYlwiLCBcIlRyYW5zYWN0aW9uIGZhaWxlZCB3aXRoIGVycm9yOlwiLCBlLm1lc3NhZ2UsIFwiUmV0cnlpbmc6XCIsIG4pLCBcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCksICFuKSByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuZGIgJiYgdGhpcy5kYi5jbG9zZSgpLCB0aGlzLmRiID0gdm9pZCAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZm9yIGl0ZXJhdGluZyBvdmVyIGEga2V5IHJhbmdlIG9yIGluZGV4LiBJdCBhbGxvd3MgYW4gaXRlcmF0ZVxuICogY2FsbGJhY2sgdG8gZGVsZXRlIHRoZSBjdXJyZW50bHktcmVmZXJlbmNlZCBvYmplY3QsIG9yIGp1bXAgdG8gYSBuZXcga2V5XG4gKiB3aXRoaW4gdGhlIGtleSByYW5nZSBvciBpbmRleC5cbiAqLyBjbGFzcyBWdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLkwgPSB0LCB0aGlzLnEgPSAhMSwgdGhpcy5VID0gbnVsbDtcbiAgICB9XG4gICAgZ2V0IGlzRG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucTtcbiAgICB9XG4gICAgZ2V0IEsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlU7XG4gICAgfVxuICAgIHNldCBjdXJzb3IodCkge1xuICAgICAgICB0aGlzLkwgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gc3RvcCBpdGVyYXRpb24gYXQgYW55IHBvaW50LlxuICAgICAqLyAgICBkb25lKCkge1xuICAgICAgICB0aGlzLnEgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHNraXAgdG8gdGhhdCBuZXh0IGtleSwgd2hpY2ggY291bGQgYmVcbiAgICAgKiBhbiBpbmRleCBvciBhIHByaW1hcnkga2V5LlxuICAgICAqLyAgICBHKHQpIHtcbiAgICAgICAgdGhpcy5VID0gdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoZSBjdXJyZW50IGN1cnNvciB2YWx1ZSBmcm9tIHRoZSBvYmplY3Qgc3RvcmUuXG4gICAgICpcbiAgICAgKiBOT1RFOiBZb3UgQ0FOTk9UIGRvIHRoaXMgd2l0aCBhIGtleXNPbmx5IHF1ZXJ5LlxuICAgICAqLyAgICBkZWxldGUoKSB7XG4gICAgICAgIHJldHVybiB4dCh0aGlzLkwuZGVsZXRlKCkpO1xuICAgIH1cbn1cblxuLyoqIEFuIGVycm9yIHRoYXQgd3JhcHMgZXhjZXB0aW9ucyB0aGF0IHRocm93biBkdXJpbmcgSW5kZXhlZERCIGV4ZWN1dGlvbi4gKi8gY2xhc3MgU3QgZXh0ZW5kcyBVIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHEuVU5BVkFJTEFCTEUsIGBJbmRleGVkREIgdHJhbnNhY3Rpb24gJyR7dH0nIGZhaWxlZDogJHtlfWApLCB0aGlzLm5hbWUgPSBcIkluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKiBWZXJpZmllcyB3aGV0aGVyIGBlYCBpcyBhbiBJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yLiAqLyBmdW5jdGlvbiBEdCh0KSB7XG4gICAgLy8gVXNlIG5hbWUgZXF1YWxpdHksIGFzIGluc3RhbmNlb2YgY2hlY2tzIG9uIGVycm9ycyBkb24ndCB3b3JrIHdpdGggZXJyb3JzXG4gICAgLy8gdGhhdCB3cmFwIG90aGVyIGVycm9ycy5cbiAgICByZXR1cm4gXCJJbmRleGVkRGJUcmFuc2FjdGlvbkVycm9yXCIgPT09IHQubmFtZTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIGFuIElEQk9iamVjdFN0b3JlIHByb3ZpZGluZyBhbiBBUEkgdGhhdDpcbiAqXG4gKiAxKSBIYXMgZ2VuZXJpYyBLZXlUeXBlIC8gVmFsdWVUeXBlIHBhcmFtZXRlcnMgdG8gcHJvdmlkZSBzdHJvbmdseS10eXBlZFxuICogbWV0aG9kcyBmb3IgYWN0aW5nIGFnYWluc3QgdGhlIG9iamVjdCBzdG9yZS5cbiAqIDIpIERlYWxzIHdpdGggSW5kZXhlZERCJ3Mgb25zdWNjZXNzIC8gb25lcnJvciBldmVudCBjYWxsYmFja3MsIG1ha2luZyBldmVyeVxuICogbWV0aG9kIHJldHVybiBhIFBlcnNpc3RlbmNlUHJvbWlzZSBpbnN0ZWFkLlxuICogMykgUHJvdmlkZXMgYSBoaWdoZXItbGV2ZWwgQVBJIHRvIGF2b2lkIG5lZWRpbmcgdG8gZG8gZXhjZXNzaXZlIHdyYXBwaW5nIG9mXG4gKiBpbnRlcm1lZGlhdGUgSW5kZXhlZERCIHR5cGVzIChJREJDdXJzb3JXaXRoVmFsdWUsIGV0Yy4pXG4gKi8gY2xhc3MgQ3Qge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHQ7XG4gICAgfVxuICAgIHB1dCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gKE4oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBuID0gdGhpcy5zdG9yZS5wdXQoZSwgdCkpIDogKE4oXCJTaW1wbGVEYlwiLCBcIlBVVFwiLCB0aGlzLnN0b3JlLm5hbWUsIFwiPGF1dG8ta2V5PlwiLCB0KSwgXG4gICAgICAgIG4gPSB0aGlzLnN0b3JlLnB1dCh0KSksIHh0KG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IHZhbHVlIGludG8gYW4gT2JqZWN0IFN0b3JlIGFuZCByZXR1cm5zIHRoZSBuZXcga2V5LiBTaW1pbGFyIHRvXG4gICAgICogSW5kZXhlZERiJ3MgYGFkZCgpYCwgdGhpcyBtZXRob2Qgd2lsbCBmYWlsIG9uIHByaW1hcnkga2V5IGNvbGxpc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIHdyaXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKi8gICAgYWRkKHQpIHtcbiAgICAgICAgTihcIlNpbXBsZURiXCIsIFwiQUREXCIsIHRoaXMuc3RvcmUubmFtZSwgdCwgdCk7XG4gICAgICAgIHJldHVybiB4dCh0aGlzLnN0b3JlLmFkZCh0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIHNwZWNpZmllZCBzdG9yZSwgb3IgbnVsbFxuICAgICAqIGlmIG5vIG9iamVjdCBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKlxuICAgICAqIEBrZXkgVGhlIGtleSBvZiB0aGUgb2JqZWN0IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IgbnVsbCBpZiBubyBvYmplY3QgZXhpc3RzLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICAvLyBXZSdyZSBkb2luZyBhbiB1bnNhZmUgY2FzdCB0byBWYWx1ZVR5cGUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB4dCh0aGlzLnN0b3JlLmdldCh0KSkubmV4dCgoZSA9PiAoXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBub25leGlzdGVuY2UgdG8gbnVsbC5cbiAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gbnVsbCksIE4oXCJTaW1wbGVEYlwiLCBcIkdFVFwiLCB0aGlzLnN0b3JlLm5hbWUsIHQsIGUpLCBlKSkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICBOKFwiU2ltcGxlRGJcIiwgXCJERUxFVEVcIiwgdGhpcy5zdG9yZS5uYW1lLCB0KTtcbiAgICAgICAgcmV0dXJuIHh0KHRoaXMuc3RvcmUuZGVsZXRlKHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgd2UgZXZlciBuZWVkIG1vcmUgb2YgdGhlIGNvdW50IHZhcmlhbnRzLCB3ZSBjYW4gYWRkIG92ZXJsb2Fkcy4gRm9yIG5vdyxcbiAgICAgKiBhbGwgd2UgbmVlZCBpcyB0byBjb3VudCBldmVyeXRoaW5nIGluIGEgc3RvcmUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc3RvcmUuXG4gICAgICovICAgIGNvdW50KCkge1xuICAgICAgICBOKFwiU2ltcGxlRGJcIiwgXCJDT1VOVFwiLCB0aGlzLnN0b3JlLm5hbWUpO1xuICAgICAgICByZXR1cm4geHQodGhpcy5zdG9yZS5jb3VudCgpKTtcbiAgICB9XG4gICAgaih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLm9wdGlvbnModCwgZSk7XG4gICAgICAgIC8vIFVzZSBgZ2V0QWxsKClgIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIEluZGV4ZWREQiB2MywgYXMgaXQgaXMgcm91Z2hseVxuICAgICAgICAvLyAyMCUgZmFzdGVyLiBVbmZvcnR1bmF0ZWx5LCBnZXRBbGwoKSBkb2VzIG5vdCBzdXBwb3J0IGN1c3RvbSBpbmRpY2VzLlxuICAgICAgICAgICAgICAgIGlmIChuLmluZGV4IHx8IFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgdGhpcy5zdG9yZS5nZXRBbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnNvcihuKSwgZSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuVyh0LCAoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBlLnB1c2gobik7XG4gICAgICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnN0b3JlLmdldEFsbChuLnJhbmdlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUnQoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgdC5vbmVycm9yID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG4odC50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sIHQub25zdWNjZXNzID0gdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUodC50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBmaXJzdCBgY291bnRgIGVsZW1lbnRzIGZyb20gdGhlIHByb3ZpZGVkIGluZGV4IHJhbmdlLiBMb2FkcyBhbGxcbiAgICAgKiBlbGVtZW50cyBpZiBubyBsaW1pdCBpcyBwcm92aWRlZC5cbiAgICAgKi8gICAgSCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmdldEFsbCh0LCBudWxsID09PSBlID8gdm9pZCAwIDogZSk7XG4gICAgICAgIHJldHVybiBuZXcgUnQoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBuLm9uZXJyb3IgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBlKHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIH0sIG4ub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdChlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBKKHQsIGUpIHtcbiAgICAgICAgTihcIlNpbXBsZURiXCIsIFwiREVMRVRFIEFMTFwiLCB0aGlzLnN0b3JlLm5hbWUpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5vcHRpb25zKHQsIGUpO1xuICAgICAgICBuLlkgPSAhMTtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuY3Vyc29yKG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5XKHMsICgodCwgZSwgbikgPT4gbi5kZWxldGUoKSkpO1xuICAgIH1cbiAgICBYKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIGUgPyBuID0gdCA6IChuID0ge30sIGUgPSB0KTtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuY3Vyc29yKG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5XKHMsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGEgc3RvcmUsIGJ1dCB3YWl0cyBmb3IgdGhlIGdpdmVuIGNhbGxiYWNrIHRvIGNvbXBsZXRlIGZvclxuICAgICAqIGVhY2ggZW50cnkgYmVmb3JlIGl0ZXJhdGluZyB0aGUgbmV4dCBlbnRyeS4gVGhpcyBhbGxvd3MgdGhlIGNhbGxiYWNrIHRvIGRvXG4gICAgICogYXN5bmNocm9ub3VzIHdvcmsgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlcmF0aW9uIHNob3VsZCBjb250aW51ZS5cbiAgICAgKlxuICAgICAqIFRoZSBwcm92aWRlZCBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGB0cnVlYCB0byBjb250aW51ZSBpdGVyYXRpb24sIGFuZFxuICAgICAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqLyAgICBaKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuY3Vyc29yKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSdCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGUub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBrdCh0LnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcyhlKTtcbiAgICAgICAgICAgIH0sIGUub25zdWNjZXNzID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBzID8gdChzLnByaW1hcnlLZXksIHMudmFsdWUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ID8gcy5jb250aW51ZSgpIDogbigpO1xuICAgICAgICAgICAgICAgIH0pKSA6IG4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgVyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgcmV0dXJuIG5ldyBSdCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIHQub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIGkodC50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfSwgdC5vbnN1Y2Nlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghaSkgcmV0dXJuIHZvaWQgcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuZXcgVnQoaSksIG8gPSBlKGkucHJpbWFyeUtleSwgaS52YWx1ZSwgcik7XG4gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gby5jYXRjaCgodCA9PiAoci5kb25lKCksIFJ0LnJlamVjdCh0KSkpKTtcbiAgICAgICAgICAgICAgICAgICAgbi5wdXNoKHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByLmlzRG9uZSA/IHMoKSA6IG51bGwgPT09IHIuSyA/IGkuY29udGludWUoKSA6IGkuY29udGludWUoci5LKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBSdC53YWl0Rm9yKG4pKSk7XG4gICAgfVxuICAgIG9wdGlvbnModCwgZSkge1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IG4gPSB0IDogZSA9IHQpLCB7XG4gICAgICAgICAgICBpbmRleDogbixcbiAgICAgICAgICAgIHJhbmdlOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIGN1cnNvcih0KSB7XG4gICAgICAgIGxldCBlID0gXCJuZXh0XCI7XG4gICAgICAgIGlmICh0LnJldmVyc2UgJiYgKGUgPSBcInByZXZcIiksIHQuaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnN0b3JlLmluZGV4KHQuaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuWSA/IG4ub3BlbktleUN1cnNvcih0LnJhbmdlLCBlKSA6IG4ub3BlbkN1cnNvcih0LnJhbmdlLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5vcGVuQ3Vyc29yKHQucmFuZ2UsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbiBJREJSZXF1ZXN0IGluIGEgUGVyc2lzdGVuY2VQcm9taXNlLCB1c2luZyB0aGUgb25zdWNjZXNzIC8gb25lcnJvclxuICogaGFuZGxlcnMgdG8gcmVzb2x2ZSAvIHJlamVjdCB0aGUgUGVyc2lzdGVuY2VQcm9taXNlIGFzIGFwcHJvcHJpYXRlLlxuICovIGZ1bmN0aW9uIHh0KHQpIHtcbiAgICByZXR1cm4gbmV3IFJ0KCgoZSwgbikgPT4ge1xuICAgICAgICB0Lm9uc3VjY2VzcyA9IHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIGUobik7XG4gICAgICAgIH0sIHQub25lcnJvciA9IHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IGt0KHQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgICAgIG4oZSk7XG4gICAgICAgIH07XG4gICAgfSkpO1xufVxuXG4vLyBHdWFyZCBzbyB3ZSBvbmx5IHJlcG9ydCB0aGUgZXJyb3Igb25jZS5cbmxldCBOdCA9ICExO1xuXG5mdW5jdGlvbiBrdCh0KSB7XG4gICAgY29uc3QgZSA9IGJ0LlMoZ2V0VUEoKSk7XG4gICAgaWYgKGUgPj0gMTIuMiAmJiBlIDwgMTMpIHtcbiAgICAgICAgY29uc3QgZSA9IFwiQW4gaW50ZXJuYWwgZXJyb3Igd2FzIGVuY291bnRlcmVkIGluIHRoZSBJbmRleGVkIERhdGFiYXNlIHNlcnZlclwiO1xuICAgICAgICBpZiAodC5tZXNzYWdlLmluZGV4T2YoZSkgPj0gMCkge1xuICAgICAgICAgICAgLy8gV3JhcCBlcnJvciBpbiBhIG1vcmUgZGVzY3JpcHRpdmUgb25lLlxuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBVKFwiaW50ZXJuYWxcIiwgYElPU19JTkRFWEVEREJfQlVHMTogSW5kZXhlZERiIGhhcyB0aHJvd24gJyR7ZX0nLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYW4gdW5hdm9pZGFibGUgYnVnIGluIGlPUy4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS81NjQ5NjI5Ni8xMTA5MTUgZm9yIGRldGFpbHMgYW5kIGEgcG90ZW50aWFsIHdvcmthcm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gTnQgfHwgKE50ID0gITAsIFxuICAgICAgICAgICAgLy8gVGhyb3cgYSBnbG9iYWwgZXhjZXB0aW9uIG91dHNpZGUgb2YgdGhpcyBwcm9taXNlIGNoYWluLCBmb3IgdGhlIHVzZXIgdG9cbiAgICAgICAgICAgIC8vIHBvdGVudGlhbGx5IGNhdGNoLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IHQ7XG4gICAgICAgICAgICB9KSwgMCkpLCB0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuXG4vKiogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHNjaGVkdWxpbmcgb2YgSW5kZXggQmFja2ZpbGxlci4gKi9cbmNsYXNzIE10IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZSA9IHQsIHRoaXMudHQgPSBlLCB0aGlzLnRhc2sgPSBudWxsO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5ldCgxNWUzKTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy50YXNrICYmICh0aGlzLnRhc2suY2FuY2VsKCksIHRoaXMudGFzayA9IG51bGwpO1xuICAgIH1cbiAgICBnZXQgc3RhcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMudGFzaztcbiAgICB9XG4gICAgZXQodCkge1xuICAgICAgICBOKFwiSW5kZXhCYWNraWxsZXJcIiwgYFNjaGVkdWxlZCBpbiAke3R9bXNgKSwgdGhpcy50YXNrID0gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBZnRlckRlbGF5KFwiaW5kZXhfYmFja2ZpbGxcIiAvKiBUaW1lcklkLkluZGV4QmFja2ZpbGwgKi8gLCB0LCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgTihcIkluZGV4QmFja2lsbGVyXCIsIGBEb2N1bWVudHMgd3JpdHRlbjogJHthd2FpdCB0aGlzLnR0Lm50KCl9YCk7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgRHQodCkgPyBOKFwiSW5kZXhCYWNraWxsZXJcIiwgXCJJZ25vcmluZyBJbmRleGVkREIgZXJyb3IgZHVyaW5nIGluZGV4IGJhY2tmaWxsOiBcIiwgdCkgOiBhd2FpdCB2dCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZXQoNmU0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuLyoqIEltcGxlbWVudHMgdGhlIHN0ZXBzIGZvciBiYWNrZmlsbGluZyBpbmRleGVzLiAqLyBjbGFzcyAkdCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogTG9jYWxTdG9yZSBwcm92aWRlcyBhY2Nlc3MgdG8gSW5kZXhNYW5hZ2VyIGFuZCBMb2NhbERvY3VtZW50Vmlldy5cbiAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgdXBkYXRlIHdoZW4gdGhlIHVzZXIgY2hhbmdlcy4gQ29uc2VxdWVudGx5LFxuICAgICAqIG1ha2luZyBhIGxvY2FsIGNvcHkgb2YgSW5kZXhNYW5hZ2VyIGFuZCBMb2NhbERvY3VtZW50VmlldyB3aWxsIHJlcXVpcmVcbiAgICAgKiB1cGRhdGVzIG92ZXIgdGltZS4gVGhlIHNpbXBsZXIgc29sdXRpb24gaXMgdG8gcmVseSBvbiBMb2NhbFN0b3JlIHRvIGhhdmVcbiAgICAgKiBhbiB1cC10by1kYXRlIHJlZmVyZW5jZXMgdG8gSW5kZXhNYW5hZ2VyIGFuZCBMb2NhbERvY3VtZW50U3RvcmUuXG4gICAgICovXG4gICAgdCwgZSkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmUgPSB0LCB0aGlzLnBlcnNpc3RlbmNlID0gZTtcbiAgICB9XG4gICAgYXN5bmMgbnQodCA9IDUwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQmFja2ZpbGwgSW5kZXhlc1wiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsIChlID0+IHRoaXMuc3QoZSwgdCkpKTtcbiAgICB9XG4gICAgLyoqIFdyaXRlcyBpbmRleCBlbnRyaWVzIHVudGlsIHRoZSBjYXAgaXMgcmVhY2hlZC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBwcm9jZXNzZWQuICovICAgIHN0KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBTZXQ7XG4gICAgICAgIGxldCBzID0gZSwgaSA9ICEwO1xuICAgICAgICByZXR1cm4gUnQuZG9XaGlsZSgoKCkgPT4gITAgPT09IGkgJiYgcyA+IDApLCAoKCkgPT4gdGhpcy5sb2NhbFN0b3JlLmluZGV4TWFuYWdlci5nZXROZXh0Q29sbGVjdGlvbkdyb3VwVG9VcGRhdGUodCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gZSAmJiAhbi5oYXMoZSkpIHJldHVybiBOKFwiSW5kZXhCYWNraWxsZXJcIiwgYFByb2Nlc3NpbmcgY29sbGVjdGlvbjogJHtlfWApLCBcbiAgICAgICAgICAgIHRoaXMuaXQodCwgZSwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgcyAtPSB0LCBuLmFkZChlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGkgPSAhMTtcbiAgICAgICAgfSkpKSkubmV4dCgoKCkgPT4gZSAtIHMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGVudHJpZXMgZm9yIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uIGdyb3VwLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHByb2Nlc3NlZC5cbiAgICAgKi8gICAgaXQodCwgZSwgbikge1xuICAgICAgICAvLyBVc2UgdGhlIGVhcmxpZXN0IG9mZnNldCBvZiBhbGwgZmllbGQgaW5kZXhlcyB0byBxdWVyeSB0aGUgbG9jYWwgY2FjaGUuXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmUuaW5kZXhNYW5hZ2VyLmdldE1pbk9mZnNldEZyb21Db2xsZWN0aW9uR3JvdXAodCwgZSkubmV4dCgocyA9PiB0aGlzLmxvY2FsU3RvcmUubG9jYWxEb2N1bWVudHMuZ2V0TmV4dERvY3VtZW50cyh0LCBlLCBzLCBuKS5uZXh0KChuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmNoYW5nZXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JlLmluZGV4TWFuYWdlci51cGRhdGVJbmRleEVudHJpZXModCwgaSkubmV4dCgoKCkgPT4gdGhpcy5ydChzLCBuKSkpLm5leHQoKG4gPT4gKE4oXCJJbmRleEJhY2tpbGxlclwiLCBgVXBkYXRpbmcgb2Zmc2V0OiAke259YCksIFxuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JlLmluZGV4TWFuYWdlci51cGRhdGVDb2xsZWN0aW9uR3JvdXAodCwgZSwgbikpKSkubmV4dCgoKCkgPT4gaS5zaXplKSk7XG4gICAgICAgIH0pKSkpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgbmV4dCBvZmZzZXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGRvY3VtZW50cy4gKi8gICAgcnQodCwgZSkge1xuICAgICAgICBsZXQgbiA9IHQ7XG4gICAgICAgIHJldHVybiBlLmNoYW5nZXMuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBwdChlKTtcbiAgICAgICAgICAgIFR0KHMsIG4pID4gMCAmJiAobiA9IHMpO1xuICAgICAgICB9KSksIG5ldyBJdChuLnJlYWRUaW1lLCBuLmRvY3VtZW50S2V5LCBNYXRoLm1heChlLmJhdGNoSWQsIHQubGFyZ2VzdEJhdGNoSWQpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGBMaXN0ZW5TZXF1ZW5jZWAgaXMgYSBtb25vdG9uaWMgc2VxdWVuY2UuIEl0IGlzIGluaXRpYWxpemVkIHdpdGggYSBtaW5pbXVtIHZhbHVlIHRvXG4gKiBleGNlZWQuIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIG5leHQgd2lsbCByZXR1cm4gaW5jcmVhc2luZyB2YWx1ZXMuIElmIHByb3ZpZGVkIHdpdGggYVxuICogYFNlcXVlbmNlTnVtYmVyU3luY2VyYCwgaXQgd2lsbCBhZGRpdGlvbmFsbHkgYnVtcCBpdHMgbmV4dCB2YWx1ZSB3aGVuIHRvbGQgb2YgYSBuZXcgdmFsdWUsIGFzXG4gKiB3ZWxsIGFzIHdyaXRlIG91dCBzZXF1ZW5jZSBudW1iZXJzIHRoYXQgaXQgcHJvZHVjZXMgdmlhIGBuZXh0KClgLlxuICovIGNsYXNzIE90IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHQsIGUgJiYgKGUuc2VxdWVuY2VOdW1iZXJIYW5kbGVyID0gdCA9PiB0aGlzLm90KHQpLCB0aGlzLnV0ID0gdCA9PiBlLndyaXRlU2VxdWVuY2VOdW1iZXIodCkpO1xuICAgIH1cbiAgICBvdCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzVmFsdWUgPSBNYXRoLm1heCh0LCB0aGlzLnByZXZpb3VzVmFsdWUpLCB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSArK3RoaXMucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXQgJiYgdGhpcy51dCh0KSwgdDtcbiAgICB9XG59XG5cbk90LmN0ID0gLTE7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZWl0aGVyIHVuZGVmaW5lZCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBGdCh0KSB7XG4gICAgcmV0dXJuIG51bGwgPT0gdDtcbn1cblxuLyoqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgcmVwcmVzZW50cyAtMC4gKi8gZnVuY3Rpb24gQnQodCkge1xuICAgIC8vIERldGVjdCBpZiB0aGUgdmFsdWUgaXMgLTAuMC4gQmFzZWQgb24gcG9seWZpbGwgZnJvbVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgIHJldHVybiAwID09PSB0ICYmIDEgLyB0ID09IC0xIC8gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGFuZCBpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdCBmb3IgYmVpbmcgYW4gaW50ZWdlciBhbmQgaW4gdGhlIHNhZmUgcmFuZ2VcbiAqLyBmdW5jdGlvbiBMdCh0KSB7XG4gICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgJiYgTnVtYmVyLmlzSW50ZWdlcih0KSAmJiAhQnQodCkgJiYgdCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiB0ID49IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBFbmNvZGVzIGEgcmVzb3VyY2UgcGF0aCBpbnRvIGEgSW5kZXhlZERiLWNvbXBhdGlibGUgc3RyaW5nIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIHF0KHQpIHtcbiAgICBsZXQgZSA9IFwiXCI7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSBlLmxlbmd0aCA+IDAgJiYgKGUgPSBLdChlKSksIGUgPSBVdCh0LmdldChuKSwgZSk7XG4gICAgcmV0dXJuIEt0KGUpO1xufVxuXG4vKiogRW5jb2RlcyBhIHNpbmdsZSBzZWdtZW50IG9mIGEgcmVzb3VyY2UgcGF0aCBpbnRvIHRoZSBnaXZlbiByZXN1bHQgKi8gZnVuY3Rpb24gVXQodCwgZSkge1xuICAgIGxldCBuID0gZTtcbiAgICBjb25zdCBzID0gdC5sZW5ndGg7XG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCBzOyBlKyspIHtcbiAgICAgICAgY29uc3QgcyA9IHQuY2hhckF0KGUpO1xuICAgICAgICBzd2l0Y2ggKHMpIHtcbiAgICAgICAgICBjYXNlIFwiXFwwXCI6XG4gICAgICAgICAgICBuICs9IFwiXHUwMDAxXHUwMDEwXCI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJcdTAwMDFcIjpcbiAgICAgICAgICAgIG4gKz0gXCJcdTAwMDFcdTAwMTFcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG4gKz0gcztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cblxuLyoqIEVuY29kZXMgYSBwYXRoIHNlcGFyYXRvciBpbnRvIHRoZSBnaXZlbiByZXN1bHQgKi8gZnVuY3Rpb24gS3QodCkge1xuICAgIHJldHVybiB0ICsgXCJcdTAwMDFcdTAwMDFcIjtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBnaXZlbiBJbmRleGVkRGItY29tcGF0aWJsZSBzdHJpbmcgZm9ybSBvZiBhIHJlc291cmNlIHBhdGggaW50b1xuICogYSBSZXNvdXJjZVBhdGggaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSB3aXRoXG4gKiBkZWNvZGluZyByZXNvdXJjZSBuYW1lcyBmcm9tIHRoZSBzZXJ2ZXI7IHRob3NlIGFyZSBPbmUgUGxhdGZvcm0gZm9ybWF0XG4gKiBzdHJpbmdzLlxuICovIGZ1bmN0aW9uIEd0KHQpIHtcbiAgICAvLyBFdmVudCB0aGUgZW1wdHkgcGF0aCBtdXN0IGVuY29kZSBhcyBhIHBhdGggb2YgYXQgbGVhc3QgbGVuZ3RoIDIuIEEgcGF0aFxuICAgIC8vIHdpdGggZXhhY3RseSAyIG11c3QgYmUgdGhlIGVtcHR5IHBhdGguXG4gICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgIGlmIChGKGUgPj0gMiksIDIgPT09IGUpIHJldHVybiBGKFwiXHUwMDAxXCIgPT09IHQuY2hhckF0KDApICYmIFwiXHUwMDAxXCIgPT09IHQuY2hhckF0KDEpKSwgdXQuZW1wdHlQYXRoKCk7XG4gICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgY2Fubm90IGV4aXN0IHBhc3QgdGhlIHNlY29uZC10by1sYXN0IHBvc2l0aW9uIGluIHRoZVxuICAgIC8vIHNvdXJjZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgX19QUklWQVRFX2xhc3RSZWFzb25hYmxlRXNjYXBlSW5kZXggPSBlIC0gMiwgbiA9IFtdO1xuICAgIGxldCBzID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGU7ICkge1xuICAgICAgICAvLyBUaGUgbGFzdCB0d28gY2hhcmFjdGVycyBvZiBhIHZhbGlkIGVuY29kZWQgcGF0aCBtdXN0IGJlIGEgc2VwYXJhdG9yLCBzb1xuICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGFuIGVuZCB0byB0aGlzIHNlZ21lbnQuXG4gICAgICAgIGNvbnN0IGUgPSB0LmluZGV4T2YoXCJcdTAwMDFcIiwgaSk7XG4gICAgICAgIChlIDwgMCB8fCBlID4gX19QUklWQVRFX2xhc3RSZWFzb25hYmxlRXNjYXBlSW5kZXgpICYmIE8oKTtcbiAgICAgICAgc3dpdGNoICh0LmNoYXJBdChlICsgMSkpIHtcbiAgICAgICAgICBjYXNlIFwiXHUwMDAxXCI6XG4gICAgICAgICAgICBjb25zdCByID0gdC5zdWJzdHJpbmcoaSwgZSk7XG4gICAgICAgICAgICBsZXQgbztcbiAgICAgICAgICAgIDAgPT09IHMubGVuZ3RoID8gXG4gICAgICAgICAgICAvLyBBdm9pZCBjb3B5aW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgYSBzZWdtZW50IHRoYXQgZXhjbHVkZXMgXFwwXG4gICAgICAgICAgICAvLyBhbmQgXFwwMDFcbiAgICAgICAgICAgIG8gPSByIDogKHMgKz0gciwgbyA9IHMsIHMgPSBcIlwiKSwgbi5wdXNoKG8pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiXHUwMDEwXCI6XG4gICAgICAgICAgICBzICs9IHQuc3Vic3RyaW5nKGksIGUpLCBzICs9IFwiXFwwXCI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJcdTAwMTFcIjpcbiAgICAgICAgICAgIC8vIFRoZSBlc2NhcGUgY2hhcmFjdGVyIGNhbiBiZSB1c2VkIGluIHRoZSBvdXRwdXQgdG8gZW5jb2RlIGl0c2VsZi5cbiAgICAgICAgICAgIHMgKz0gdC5zdWJzdHJpbmcoaSwgZSArIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgTygpO1xuICAgICAgICB9XG4gICAgICAgIGkgPSBlICsgMjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB1dChuKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgUXQgPSBbIFwidXNlcklkXCIsIFwiYmF0Y2hJZFwiIF07XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIE5hbWUgb2YgdGhlIEluZGV4ZWREYiBvYmplY3Qgc3RvcmUuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBuYW1lICdvd25lcicgaXMgY2hvc2VuIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoXG4gKiBvbGRlciBjbGllbnRzIHRoYXQgb25seSBzdXBwb3J0ZWQgc2luZ2xlIGxvY2tlZCBhY2Nlc3MgdG8gdGhlIHBlcnNpc3RlbmNlXG4gKiBsYXllci5cbiAqL1xuLyoqXG4gKiBDcmVhdGVzIGEgW3VzZXJJZCwgZW5jb2RlZFBhdGhdIGtleSBmb3IgdXNlIGluIHRoZSBEYkRvY3VtZW50TXV0YXRpb25zXG4gKiBpbmRleCB0byBpdGVyYXRlIG92ZXIgYWxsIGF0IGRvY3VtZW50IG11dGF0aW9ucyBmb3IgYSBnaXZlbiBwYXRoIG9yIGxvd2VyLlxuICovXG5mdW5jdGlvbiBqdCh0LCBlKSB7XG4gICAgcmV0dXJuIFsgdCwgcXQoZSkgXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVsbCBpbmRleCBrZXkgb2YgW3VzZXJJZCwgZW5jb2RlZFBhdGgsIGJhdGNoSWRdIGZvciBpbnNlcnRpbmdcbiAqIGFuZCBkZWxldGluZyBpbnRvIHRoZSBEYkRvY3VtZW50TXV0YXRpb25zIGluZGV4LlxuICovIGZ1bmN0aW9uIHp0KHQsIGUsIG4pIHtcbiAgICByZXR1cm4gWyB0LCBxdChlKSwgbiBdO1xufVxuXG4vKipcbiAqIEJlY2F1c2Ugd2Ugc3RvcmUgYWxsIHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3RvcmUgaW4gdGhlIGtleSxcbiAqIHRoZXJlIGlzIG5vIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byBzdG9yZSBhcyB0aGUgdmFsdWUuIFRoZSByYXcgKHVuZW5jb2RlZClcbiAqIHBhdGggY2Fubm90IGJlIHN0b3JlZCBiZWNhdXNlIEluZGV4ZWREYiBkb2Vzbid0IHN0b3JlIHByb3RvdHlwZVxuICogaW5mb3JtYXRpb24uXG4gKi8gY29uc3QgV3QgPSB7fSwgSHQgPSBbIFwicHJlZml4UGF0aFwiLCBcImNvbGxlY3Rpb25Hcm91cFwiLCBcInJlYWRUaW1lXCIsIFwiZG9jdW1lbnRJZFwiIF0sIEp0ID0gWyBcInByZWZpeFBhdGhcIiwgXCJjb2xsZWN0aW9uR3JvdXBcIiwgXCJkb2N1bWVudElkXCIgXSwgWXQgPSBbIFwiY29sbGVjdGlvbkdyb3VwXCIsIFwicmVhZFRpbWVcIiwgXCJwcmVmaXhQYXRoXCIsIFwiZG9jdW1lbnRJZFwiIF0sIFh0ID0gWyBcImNhbm9uaWNhbElkXCIsIFwidGFyZ2V0SWRcIiBdLCBadCA9IFsgXCJ0YXJnZXRJZFwiLCBcInBhdGhcIiBdLCB0ZSA9IFsgXCJwYXRoXCIsIFwidGFyZ2V0SWRcIiBdLCBlZSA9IFsgXCJjb2xsZWN0aW9uSWRcIiwgXCJwYXJlbnRcIiBdLCBuZSA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIgXSwgc2UgPSBbIFwidWlkXCIsIFwic2VxdWVuY2VOdW1iZXJcIiBdLCBpZSA9IFsgXCJpbmRleElkXCIsIFwidWlkXCIsIFwiYXJyYXlWYWx1ZVwiLCBcImRpcmVjdGlvbmFsVmFsdWVcIiwgXCJvcmRlcmVkRG9jdW1lbnRLZXlcIiwgXCJkb2N1bWVudEtleVwiIF0sIHJlID0gWyBcImluZGV4SWRcIiwgXCJ1aWRcIiwgXCJvcmRlcmVkRG9jdW1lbnRLZXlcIiBdLCBvZSA9IFsgXCJ1c2VySWRcIiwgXCJjb2xsZWN0aW9uUGF0aFwiLCBcImRvY3VtZW50SWRcIiBdLCB1ZSA9IFsgXCJ1c2VySWRcIiwgXCJjb2xsZWN0aW9uUGF0aFwiLCBcImxhcmdlc3RCYXRjaElkXCIgXSwgY2UgPSBbIFwidXNlcklkXCIsIFwiY29sbGVjdGlvbkdyb3VwXCIsIFwibGFyZ2VzdEJhdGNoSWRcIiBdLCBhZSA9IFsgLi4uWyAuLi5bIC4uLlsgLi4uWyBcIm11dGF0aW9uUXVldWVzXCIsIFwibXV0YXRpb25zXCIsIFwiZG9jdW1lbnRNdXRhdGlvbnNcIiwgXCJyZW1vdGVEb2N1bWVudHNcIiwgXCJ0YXJnZXRzXCIsIFwib3duZXJcIiwgXCJ0YXJnZXRHbG9iYWxcIiwgXCJ0YXJnZXREb2N1bWVudHNcIiBdLCBcImNsaWVudE1ldGFkYXRhXCIgXSwgXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiIF0sIFwiY29sbGVjdGlvblBhcmVudHNcIiBdLCBcImJ1bmRsZXNcIiwgXCJuYW1lZFF1ZXJpZXNcIiBdLCBoZSA9IFsgLi4uYWUsIFwiZG9jdW1lbnRPdmVybGF5c1wiIF0sIGxlID0gWyBcIm11dGF0aW9uUXVldWVzXCIsIFwibXV0YXRpb25zXCIsIFwiZG9jdW1lbnRNdXRhdGlvbnNcIiwgXCJyZW1vdGVEb2N1bWVudHNWMTRcIiwgXCJ0YXJnZXRzXCIsIFwib3duZXJcIiwgXCJ0YXJnZXRHbG9iYWxcIiwgXCJ0YXJnZXREb2N1bWVudHNcIiwgXCJjbGllbnRNZXRhZGF0YVwiLCBcInJlbW90ZURvY3VtZW50R2xvYmFsXCIsIFwiY29sbGVjdGlvblBhcmVudHNcIiwgXCJidW5kbGVzXCIsIFwibmFtZWRRdWVyaWVzXCIsIFwiZG9jdW1lbnRPdmVybGF5c1wiIF0sIGZlID0gbGUsIGRlID0gWyAuLi5mZSwgXCJpbmRleENvbmZpZ3VyYXRpb25cIiwgXCJpbmRleFN0YXRlXCIsIFwiaW5kZXhFbnRyaWVzXCIgXTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNsYXNzIHdlIGV4dGVuZHMgQXQge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5odCA9IHQsIHRoaXMuY3VycmVudFNlcXVlbmNlTnVtYmVyID0gZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9lKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICByZXR1cm4gYnQuTShuLmh0LCBlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gbWUodCkge1xuICAgIGxldCBlID0gMDtcbiAgICBmb3IgKGNvbnN0IG4gaW4gdCkgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pICYmIGUrKztcbiAgICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gZ2UodCwgZSkge1xuICAgIGZvciAoY29uc3QgbiBpbiB0KSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikgJiYgZShuLCB0W25dKTtcbn1cblxuZnVuY3Rpb24geWUodCkge1xuICAgIGZvciAoY29uc3QgZSBpbiB0KSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIGUpKSByZXR1cm4gITE7XG4gICAgcmV0dXJuICEwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gQW4gaW1tdXRhYmxlIHNvcnRlZCBtYXAgaW1wbGVtZW50YXRpb24sIGJhc2VkIG9uIGEgTGVmdC1sZWFuaW5nIFJlZC1CbGFja1xuLy8gdHJlZS5cbmNsYXNzIHBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IHQsIHRoaXMucm9vdCA9IGUgfHwgVGUuRU1QVFk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBtYXAsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgYWRkZWQgb3IgcmVwbGFjZWQuXG4gICAgaW5zZXJ0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwZSh0aGlzLmNvbXBhcmF0b3IsIHRoaXMucm9vdC5pbnNlcnQodCwgZSwgdGhpcy5jb21wYXJhdG9yKS5jb3B5KG51bGwsIG51bGwsIFRlLkJMQUNLLCBudWxsLCBudWxsKSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBtYXAsIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgcmVtb3ZlZC5cbiAgICByZW1vdmUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHBlKHRoaXMuY29tcGFyYXRvciwgdGhpcy5yb290LnJlbW92ZSh0LCB0aGlzLmNvbXBhcmF0b3IpLmNvcHkobnVsbCwgbnVsbCwgVGUuQkxBQ0ssIG51bGwsIG51bGwpKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciBudWxsLlxuICAgIGdldCh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy5yb290O1xuICAgICAgICBmb3IgKDshZS5pc0VtcHR5KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuY29tcGFyYXRvcih0LCBlLmtleSk7XG4gICAgICAgICAgICBpZiAoMCA9PT0gbikgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgICAgICBuIDwgMCA/IGUgPSBlLmxlZnQgOiBuID4gMCAmJiAoZSA9IGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGlzIHNvcnRlZCBtYXAsIG9yIC0xIGlmIGl0IGRvZXNuJ3RcbiAgICAvLyBleGlzdC5cbiAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5vZGVzIHRoYXQgd2VyZSBwcnVuZWQgd2hlbiBkZXNjZW5kaW5nIHJpZ2h0XG4gICAgICAgIGxldCBlID0gMCwgbiA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yICg7IW4uaXNFbXB0eSgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmNvbXBhcmF0b3IodCwgbi5rZXkpO1xuICAgICAgICAgICAgaWYgKDAgPT09IHMpIHJldHVybiBlICsgbi5sZWZ0LnNpemU7XG4gICAgICAgICAgICBzIDwgMCA/IG4gPSBuLmxlZnQgOiAoXG4gICAgICAgICAgICAvLyBDb3VudCBhbGwgbm9kZXMgbGVmdCBvZiB0aGUgbm9kZSBwbHVzIHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgICAgZSArPSBuLmxlZnQuc2l6ZSArIDEsIG4gPSBuLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb2RlIG5vdCBmb3VuZFxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc0VtcHR5KCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbWFwLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LnNpemU7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1pbmltdW0ga2V5IGluIHRoZSBtYXAuXG4gICAgbWluS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290Lm1pbktleSgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGtleSBpbiB0aGUgbWFwLlxuICAgIG1heEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5tYXhLZXkoKTtcbiAgICB9XG4gICAgLy8gVHJhdmVyc2VzIHRoZSBtYXAgaW4ga2V5IG9yZGVyIGFuZCBjYWxscyB0aGUgc3BlY2lmaWVkIGFjdGlvbiBmdW5jdGlvblxuICAgIC8vIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXMgYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgaW5vcmRlclRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuaW5vcmRlclRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0KGUsIG4pLCAhMSkpKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0LnB1c2goYCR7ZX06JHtufWApLCAhMSkpKSwgYHske3Quam9pbihcIiwgXCIpfX1gO1xuICAgIH1cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIG1hcCBpbiByZXZlcnNlIGtleSBvcmRlciBhbmQgY2FsbHMgdGhlIHNwZWNpZmllZCBhY3Rpb25cbiAgICAvLyBmdW5jdGlvbiBmb3IgZWFjaCBrZXkvdmFsdWUgcGFpci4gSWYgYWN0aW9uIHJldHVybnMgdHJ1ZSwgdHJhdmVyc2FsIGlzXG4gICAgLy8gYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgcmV2ZXJzZVRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QucmV2ZXJzZVRyYXZlcnNhbCh0KTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBTb3J0ZWRNYXAuXG4gICAgZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSWUodGhpcy5yb290LCBudWxsLCB0aGlzLmNvbXBhcmF0b3IsICExKTtcbiAgICB9XG4gICAgZ2V0SXRlcmF0b3JGcm9tKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZSh0aGlzLnJvb3QsIHQsIHRoaXMuY29tcGFyYXRvciwgITEpO1xuICAgIH1cbiAgICBnZXRSZXZlcnNlSXRlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSWUodGhpcy5yb290LCBudWxsLCB0aGlzLmNvbXBhcmF0b3IsICEwKTtcbiAgICB9XG4gICAgZ2V0UmV2ZXJzZUl0ZXJhdG9yRnJvbSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgSWUodGhpcy5yb290LCB0LCB0aGlzLmNvbXBhcmF0b3IsICEwKTtcbiAgICB9XG59XG5cbiAvLyBlbmQgU29ydGVkTWFwXG4vLyBBbiBpdGVyYXRvciBvdmVyIGFuIExMUkJOb2RlLlxuY2xhc3MgSWUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5pc1JldmVyc2UgPSBzLCB0aGlzLm5vZGVTdGFjayA9IFtdO1xuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGZvciAoOyF0LmlzRW1wdHkoKTsgKSBpZiAoaSA9IGUgPyBuKHQua2V5LCBlKSA6IDEsIFxuICAgICAgICAvLyBmbGlwIHRoZSBjb21wYXJpc29uIGlmIHdlJ3JlIGdvaW5nIGluIHJldmVyc2VcbiAgICAgICAgZSAmJiBzICYmIChpICo9IC0xKSwgaSA8IDApIFxuICAgICAgICAvLyBUaGlzIG5vZGUgaXMgbGVzcyB0aGFuIG91ciBzdGFydCBrZXkuIGlnbm9yZSBpdFxuICAgICAgICB0ID0gdGhpcy5pc1JldmVyc2UgPyB0LmxlZnQgOiB0LnJpZ2h0OyBlbHNlIHtcbiAgICAgICAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGV4YWN0bHkgZXF1YWwgdG8gb3VyIHN0YXJ0IGtleS4gUHVzaCBpdCBvbiB0aGUgc3RhY2ssXG4gICAgICAgICAgICAgICAgLy8gYnV0IHN0b3AgaXRlcmF0aW5nO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZVN0YWNrLnB1c2godCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgZ3JlYXRlciB0aGFuIG91ciBzdGFydCBrZXksIGFkZCBpdCB0byB0aGUgc3RhY2sgYW5kIG1vdmVcbiAgICAgICAgICAgIC8vIHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICAgICAgdGhpcy5ub2RlU3RhY2sucHVzaCh0KSwgdCA9IHRoaXMuaXNSZXZlcnNlID8gdC5yaWdodCA6IHQubGVmdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXROZXh0KCkge1xuICAgICAgICBsZXQgdCA9IHRoaXMubm9kZVN0YWNrLnBvcCgpO1xuICAgICAgICBjb25zdCBlID0ge1xuICAgICAgICAgICAga2V5OiB0LmtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0LnZhbHVlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmlzUmV2ZXJzZSkgZm9yICh0ID0gdC5sZWZ0OyAhdC5pc0VtcHR5KCk7ICkgdGhpcy5ub2RlU3RhY2sucHVzaCh0KSwgdCA9IHQucmlnaHQ7IGVsc2UgZm9yICh0ID0gdC5yaWdodDsgIXQuaXNFbXB0eSgpOyApIHRoaXMubm9kZVN0YWNrLnB1c2godCksIFxuICAgICAgICB0ID0gdC5sZWZ0O1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgaGFzTmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZVN0YWNrLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIHBlZWsoKSB7XG4gICAgICAgIGlmICgwID09PSB0aGlzLm5vZGVTdGFjay5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5ub2RlU3RhY2tbdGhpcy5ub2RlU3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHQua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHQudmFsdWVcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbiAvLyBlbmQgU29ydGVkTWFwSXRlcmF0b3Jcbi8vIFJlcHJlc2VudHMgYSBub2RlIGluIGEgTGVmdC1sZWFuaW5nIFJlZC1CbGFjayB0cmVlLlxuY2xhc3MgVGUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCB0aGlzLnZhbHVlID0gZSwgdGhpcy5jb2xvciA9IG51bGwgIT0gbiA/IG4gOiBUZS5SRUQsIHRoaXMubGVmdCA9IG51bGwgIT0gcyA/IHMgOiBUZS5FTVBUWSwgXG4gICAgICAgIHRoaXMucmlnaHQgPSBudWxsICE9IGkgPyBpIDogVGUuRU1QVFksIHRoaXMuc2l6ZSA9IHRoaXMubGVmdC5zaXplICsgMSArIHRoaXMucmlnaHQuc2l6ZTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbm9kZSwgb3B0aW9uYWxseSByZXBsYWNpbmcgcGllY2VzIG9mIGl0LlxuICAgIGNvcHkodCwgZSwgbiwgcywgaSkge1xuICAgICAgICByZXR1cm4gbmV3IFRlKG51bGwgIT0gdCA/IHQgOiB0aGlzLmtleSwgbnVsbCAhPSBlID8gZSA6IHRoaXMudmFsdWUsIG51bGwgIT0gbiA/IG4gOiB0aGlzLmNvbG9yLCBudWxsICE9IHMgPyBzIDogdGhpcy5sZWZ0LCBudWxsICE9IGkgPyBpIDogdGhpcy5yaWdodCk7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgLy8gVHJhdmVyc2VzIHRoZSB0cmVlIGluIGtleSBvcmRlciBhbmQgY2FsbHMgdGhlIHNwZWNpZmllZCBhY3Rpb24gZnVuY3Rpb25cbiAgICAvLyBmb3IgZWFjaCBub2RlLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXMgYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgaW5vcmRlclRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQuaW5vcmRlclRyYXZlcnNhbCh0KSB8fCB0KHRoaXMua2V5LCB0aGlzLnZhbHVlKSB8fCB0aGlzLnJpZ2h0Lmlub3JkZXJUcmF2ZXJzYWwodCk7XG4gICAgfVxuICAgIC8vIFRyYXZlcnNlcyB0aGUgdHJlZSBpbiByZXZlcnNlIGtleSBvcmRlciBhbmQgY2FsbHMgdGhlIHNwZWNpZmllZCBhY3Rpb25cbiAgICAvLyBmdW5jdGlvbiBmb3IgZWFjaCBub2RlLiBJZiBhY3Rpb24gcmV0dXJucyB0cnVlLCB0cmF2ZXJzYWwgaXMgYWJvcnRlZC5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgdmFsdWUgcmV0dXJuZWQgYnkgYWN0aW9uLCBvciB0aGUgbGFzdCBmYWxzZXlcbiAgICAvLyB2YWx1ZSByZXR1cm5lZCBieSBhY3Rpb24uXG4gICAgcmV2ZXJzZVRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJldmVyc2VUcmF2ZXJzYWwodCkgfHwgdCh0aGlzLmtleSwgdGhpcy52YWx1ZSkgfHwgdGhpcy5sZWZ0LnJldmVyc2VUcmF2ZXJzYWwodCk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1pbmltdW0gbm9kZSBpbiB0aGUgdHJlZS5cbiAgICBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQuaXNFbXB0eSgpID8gdGhpcyA6IHRoaXMubGVmdC5taW4oKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgbWF4aW11bSBrZXkgaW4gdGhlIHRyZWUuXG4gICAgbWluS2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oKS5rZXk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG1heGltdW0ga2V5IGluIHRoZSB0cmVlLlxuICAgIG1heEtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuaXNFbXB0eSgpID8gdGhpcy5rZXkgOiB0aGlzLnJpZ2h0Lm1heEtleSgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIG5ldyB0cmVlLCB3aXRoIHRoZSBrZXkvdmFsdWUgYWRkZWQuXG4gICAgaW5zZXJ0KHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSB0aGlzO1xuICAgICAgICBjb25zdCBpID0gbih0LCBzLmtleSk7XG4gICAgICAgIHJldHVybiBzID0gaSA8IDAgPyBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgcy5sZWZ0Lmluc2VydCh0LCBlLCBuKSwgbnVsbCkgOiAwID09PSBpID8gcy5jb3B5KG51bGwsIGUsIG51bGwsIG51bGwsIG51bGwpIDogcy5jb3B5KG51bGwsIG51bGwsIG51bGwsIG51bGwsIHMucmlnaHQuaW5zZXJ0KHQsIGUsIG4pKSwgXG4gICAgICAgIHMuZml4VXAoKTtcbiAgICB9XG4gICAgcmVtb3ZlTWluKCkge1xuICAgICAgICBpZiAodGhpcy5sZWZ0LmlzRW1wdHkoKSkgcmV0dXJuIFRlLkVNUFRZO1xuICAgICAgICBsZXQgdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0LmxlZnQuaXNSZWQoKSB8fCB0LmxlZnQubGVmdC5pc1JlZCgpIHx8ICh0ID0gdC5tb3ZlUmVkTGVmdCgpKSwgdCA9IHQuY29weShudWxsLCBudWxsLCBudWxsLCB0LmxlZnQucmVtb3ZlTWluKCksIG51bGwpLCBcbiAgICAgICAgdC5maXhVcCgpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIG5ldyB0cmVlLCB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlbSByZW1vdmVkLlxuICAgIHJlbW92ZSh0LCBlKSB7XG4gICAgICAgIGxldCBuLCBzID0gdGhpcztcbiAgICAgICAgaWYgKGUodCwgcy5rZXkpIDwgMCkgcy5sZWZ0LmlzRW1wdHkoKSB8fCBzLmxlZnQuaXNSZWQoKSB8fCBzLmxlZnQubGVmdC5pc1JlZCgpIHx8IChzID0gcy5tb3ZlUmVkTGVmdCgpKSwgXG4gICAgICAgIHMgPSBzLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgcy5sZWZ0LnJlbW92ZSh0LCBlKSwgbnVsbCk7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHMubGVmdC5pc1JlZCgpICYmIChzID0gcy5yb3RhdGVSaWdodCgpKSwgcy5yaWdodC5pc0VtcHR5KCkgfHwgcy5yaWdodC5pc1JlZCgpIHx8IHMucmlnaHQubGVmdC5pc1JlZCgpIHx8IChzID0gcy5tb3ZlUmVkUmlnaHQoKSksIFxuICAgICAgICAgICAgMCA9PT0gZSh0LCBzLmtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocy5yaWdodC5pc0VtcHR5KCkpIHJldHVybiBUZS5FTVBUWTtcbiAgICAgICAgICAgICAgICBuID0gcy5yaWdodC5taW4oKSwgcyA9IHMuY29weShuLmtleSwgbi52YWx1ZSwgbnVsbCwgbnVsbCwgcy5yaWdodC5yZW1vdmVNaW4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzID0gcy5jb3B5KG51bGwsIG51bGwsIG51bGwsIG51bGwsIHMucmlnaHQucmVtb3ZlKHQsIGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcy5maXhVcCgpO1xuICAgIH1cbiAgICBpc1JlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3I7XG4gICAgfVxuICAgIC8vIFJldHVybnMgbmV3IHRyZWUgYWZ0ZXIgcGVyZm9ybWluZyBhbnkgbmVlZGVkIHJvdGF0aW9ucy5cbiAgICBmaXhVcCgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdC5yaWdodC5pc1JlZCgpICYmICF0LmxlZnQuaXNSZWQoKSAmJiAodCA9IHQucm90YXRlTGVmdCgpKSwgdC5sZWZ0LmlzUmVkKCkgJiYgdC5sZWZ0LmxlZnQuaXNSZWQoKSAmJiAodCA9IHQucm90YXRlUmlnaHQoKSksIFxuICAgICAgICB0LmxlZnQuaXNSZWQoKSAmJiB0LnJpZ2h0LmlzUmVkKCkgJiYgKHQgPSB0LmNvbG9yRmxpcCgpKSwgdDtcbiAgICB9XG4gICAgbW92ZVJlZExlZnQoKSB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5jb2xvckZsaXAoKTtcbiAgICAgICAgcmV0dXJuIHQucmlnaHQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5jb3B5KG51bGwsIG51bGwsIG51bGwsIG51bGwsIHQucmlnaHQucm90YXRlUmlnaHQoKSksIFxuICAgICAgICB0ID0gdC5yb3RhdGVMZWZ0KCksIHQgPSB0LmNvbG9yRmxpcCgpKSwgdDtcbiAgICB9XG4gICAgbW92ZVJlZFJpZ2h0KCkge1xuICAgICAgICBsZXQgdCA9IHRoaXMuY29sb3JGbGlwKCk7XG4gICAgICAgIHJldHVybiB0LmxlZnQubGVmdC5pc1JlZCgpICYmICh0ID0gdC5yb3RhdGVSaWdodCgpLCB0ID0gdC5jb2xvckZsaXAoKSksIHQ7XG4gICAgfVxuICAgIHJvdGF0ZUxlZnQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvcHkobnVsbCwgbnVsbCwgVGUuUkVELCBudWxsLCB0aGlzLnJpZ2h0LmxlZnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5jb3B5KG51bGwsIG51bGwsIHRoaXMuY29sb3IsIHQsIG51bGwpO1xuICAgIH1cbiAgICByb3RhdGVSaWdodCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY29weShudWxsLCBudWxsLCBUZS5SRUQsIHRoaXMubGVmdC5yaWdodCwgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQuY29weShudWxsLCBudWxsLCB0aGlzLmNvbG9yLCBudWxsLCB0KTtcbiAgICB9XG4gICAgY29sb3JGbGlwKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5sZWZ0LmNvcHkobnVsbCwgbnVsbCwgIXRoaXMubGVmdC5jb2xvciwgbnVsbCwgbnVsbCksIGUgPSB0aGlzLnJpZ2h0LmNvcHkobnVsbCwgbnVsbCwgIXRoaXMucmlnaHQuY29sb3IsIG51bGwsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb3B5KG51bGwsIG51bGwsICF0aGlzLmNvbG9yLCB0LCBlKTtcbiAgICB9XG4gICAgLy8gRm9yIHRlc3RpbmcuXG4gICAgY2hlY2tNYXhEZXB0aCgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY2hlY2soKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHQpIDw9IHRoaXMuc2l6ZSArIDE7XG4gICAgfVxuICAgIC8vIEluIGEgYmFsYW5jZWQgUkIgdHJlZSwgdGhlIGJsYWNrLWRlcHRoIChudW1iZXIgb2YgYmxhY2sgbm9kZXMpIGZyb20gcm9vdCB0b1xuICAgIC8vIGxlYXZlcyBpcyBlcXVhbCBvbiBib3RoIHNpZGVzLiAgVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IG9yIGFzc2VydHMuXG4gICAgY2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVkKCkgJiYgdGhpcy5sZWZ0LmlzUmVkKCkpIHRocm93IE8oKTtcbiAgICAgICAgaWYgKHRoaXMucmlnaHQuaXNSZWQoKSkgdGhyb3cgTygpO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5sZWZ0LmNoZWNrKCk7XG4gICAgICAgIGlmICh0ICE9PSB0aGlzLnJpZ2h0LmNoZWNrKCkpIHRocm93IE8oKTtcbiAgICAgICAgcmV0dXJuIHQgKyAodGhpcy5pc1JlZCgpID8gMCA6IDEpO1xuICAgIH1cbn1cblxuIC8vIGVuZCBMTFJCTm9kZVxuLy8gRW1wdHkgbm9kZSBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgTExSQiB0cmVlcy5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5UZS5FTVBUWSA9IG51bGwsIFRlLlJFRCA9ICEwLCBUZS5CTEFDSyA9ICExO1xuXG4vLyBlbmQgTExSQkVtcHR5Tm9kZVxuVGUuRU1QVFkgPSBuZXcgXG4vLyBSZXByZXNlbnRzIGFuIGVtcHR5IG5vZGUgKGEgbGVhZiBub2RlIGluIHRoZSBSZWQtQmxhY2sgVHJlZSkuXG5jbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuICAgIGdldCBrZXkoKSB7XG4gICAgICAgIHRocm93IE8oKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICB0aHJvdyBPKCk7XG4gICAgfVxuICAgIGdldCBjb2xvcigpIHtcbiAgICAgICAgdGhyb3cgTygpO1xuICAgIH1cbiAgICBnZXQgbGVmdCgpIHtcbiAgICAgICAgdGhyb3cgTygpO1xuICAgIH1cbiAgICBnZXQgcmlnaHQoKSB7XG4gICAgICAgIHRocm93IE8oKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICBjb3B5KHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0cmVlLCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIGFkZGVkLlxuICAgIGluc2VydCh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGUodCwgZSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0cmVlLCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IHJlbW92ZWQuXG4gICAgcmVtb3ZlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgaW5vcmRlclRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgcmV2ZXJzZVRyYXZlcnNhbCh0KSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgbWluS2V5KCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbWF4S2V5KCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNSZWQoKSB7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgLy8gRm9yIHRlc3RpbmcuXG4gICAgY2hlY2tNYXhEZXB0aCgpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBjaGVjaygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogU29ydGVkU2V0IGlzIGFuIGltbXV0YWJsZSAoY29weS1vbi13cml0ZSkgY29sbGVjdGlvbiB0aGF0IGhvbGRzIGVsZW1lbnRzXG4gKiBpbiBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIHByb3ZpZGVkIGNvbXBhcmF0b3IuXG4gKlxuICogTk9URTogaWYgcHJvdmlkZWQgY29tcGFyYXRvciByZXR1cm5zIDAgZm9yIHR3byBlbGVtZW50cywgd2UgY29uc2lkZXIgdGhlbSB0b1xuICogYmUgZXF1YWwhXG4gKi9cbmNsYXNzIEVlIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY29tcGFyYXRvciA9IHQsIHRoaXMuZGF0YSA9IG5ldyBwZSh0aGlzLmNvbXBhcmF0b3IpO1xuICAgIH1cbiAgICBoYXModCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5kYXRhLmdldCh0KTtcbiAgICB9XG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWluS2V5KCk7XG4gICAgfVxuICAgIGxhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWF4S2V5KCk7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNpemU7XG4gICAgfVxuICAgIGluZGV4T2YodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmluZGV4T2YodCk7XG4gICAgfVxuICAgIC8qKiBJdGVyYXRlcyBlbGVtZW50cyBpbiBvcmRlciBkZWZpbmVkIGJ5IFwiY29tcGFyYXRvclwiICovICAgIGZvckVhY2godCkge1xuICAgICAgICB0aGlzLmRhdGEuaW5vcmRlclRyYXZlcnNhbCgoKGUsIG4pID0+ICh0KGUpLCAhMSkpKTtcbiAgICB9XG4gICAgLyoqIEl0ZXJhdGVzIG92ZXIgYGVsZW1gcyBzdWNoIHRoYXQ6IHJhbmdlWzBdICZsdDs9IGVsZW0gJmx0OyByYW5nZVsxXS4gKi8gICAgZm9yRWFjaEluUmFuZ2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbSh0WzBdKTtcbiAgICAgICAgZm9yICg7bi5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgcyA9IG4uZ2V0TmV4dCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyYXRvcihzLmtleSwgdFsxXSkgPj0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgZShzLmtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBgZWxlbWBzIHN1Y2ggdGhhdDogc3RhcnQgJmx0Oz0gZWxlbSB1bnRpbCBmYWxzZSBpcyByZXR1cm5lZC5cbiAgICAgKi8gICAgZm9yRWFjaFdoaWxlKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIGZvciAobiA9IHZvaWQgMCAhPT0gZSA/IHRoaXMuZGF0YS5nZXRJdGVyYXRvckZyb20oZSkgOiB0aGlzLmRhdGEuZ2V0SXRlcmF0b3IoKTsgbi5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgaWYgKCF0KG4uZ2V0TmV4dCgpLmtleSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogRmluZHMgdGhlIGxlYXN0IGVsZW1lbnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBlbGVtYC4gKi8gICAgZmlyc3RBZnRlck9yRXF1YWwodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5kYXRhLmdldEl0ZXJhdG9yRnJvbSh0KTtcbiAgICAgICAgcmV0dXJuIGUuaGFzTmV4dCgpID8gZS5nZXROZXh0KCkua2V5IDogbnVsbDtcbiAgICB9XG4gICAgZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWUodGhpcy5kYXRhLmdldEl0ZXJhdG9yKCkpO1xuICAgIH1cbiAgICBnZXRJdGVyYXRvckZyb20odCkge1xuICAgICAgICByZXR1cm4gbmV3IEFlKHRoaXMuZGF0YS5nZXRJdGVyYXRvckZyb20odCkpO1xuICAgIH1cbiAgICAvKiogSW5zZXJ0cyBvciB1cGRhdGVzIGFuIGVsZW1lbnQgKi8gICAgYWRkKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmRhdGEucmVtb3ZlKHQpLmluc2VydCh0LCAhMCkpO1xuICAgIH1cbiAgICAvKiogRGVsZXRlcyBhbiBlbGVtZW50ICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhcyh0KSA/IHRoaXMuY29weSh0aGlzLmRhdGEucmVtb3ZlKHQpKSA6IHRoaXM7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaXNFbXB0eSgpO1xuICAgIH1cbiAgICB1bmlvbldpdGgodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXM7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBgcmVzdWx0YCBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXJnZXIgb25lIG9mIHRoZSB0d28gc2V0cy5cbiAgICAgICAgICAgICAgICByZXR1cm4gZS5zaXplIDwgdC5zaXplICYmIChlID0gdCwgdCA9IHRoaXMpLCB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgZSA9IGUuYWRkKHQpO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgRWUpKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0aGlzLnNpemUgIT09IHQuc2l6ZSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5kYXRhLmdldEl0ZXJhdG9yKCksIG4gPSB0LmRhdGEuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ZS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuZ2V0TmV4dCgpLmtleSwgcyA9IG4uZ2V0TmV4dCgpLmtleTtcbiAgICAgICAgICAgIGlmICgwICE9PSB0aGlzLmNvbXBhcmF0b3IodCwgcykpIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICB0LnB1c2goZSk7XG4gICAgICAgIH0pKSwgdDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaCgoZSA9PiB0LnB1c2goZSkpKSwgXCJTb3J0ZWRTZXQoXCIgKyB0LnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICB9XG4gICAgY29weSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRWUodGhpcy5jb21wYXJhdG9yKTtcbiAgICAgICAgcmV0dXJuIGUuZGF0YSA9IHQsIGU7XG4gICAgfVxufVxuXG5jbGFzcyBBZSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLml0ZXIgPSB0O1xuICAgIH1cbiAgICBnZXROZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVyLmdldE5leHQoKS5rZXk7XG4gICAgfVxuICAgIGhhc05leHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXIuaGFzTmV4dCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gc29ydGVkIHNldHMgZm9yIGVxdWFsaXR5IHVzaW5nIHRoZWlyIG5hdHVyYWwgb3JkZXJpbmcuIFRoZVxuICogbWV0aG9kIGNvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gYW5kIGludm9rZXMgYG9uQWRkYCBmb3IgZXZlcnkgZWxlbWVudCB0aGF0XG4gKiBpcyBpbiBgYWZ0ZXJgIGJ1dCBub3QgYGJlZm9yZWAuIGBvblJlbW92ZWAgaXMgaW52b2tlZCBmb3IgZXZlcnkgZWxlbWVudCBpblxuICogYGJlZm9yZWAgYnV0IG1pc3NpbmcgZnJvbSBgYWZ0ZXJgLlxuICpcbiAqIFRoZSBtZXRob2QgY3JlYXRlcyBhIGNvcHkgb2YgYm90aCBgYmVmb3JlYCBhbmQgYGFmdGVyYCBhbmQgcnVucyBpbiBPKG4gbG9nXG4gKiBuKSwgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzLlxuICpcbiAqIEBwYXJhbSBiZWZvcmUgLSBUaGUgZWxlbWVudHMgdGhhdCBleGlzdCBpbiB0aGUgb3JpZ2luYWwgc2V0LlxuICogQHBhcmFtIGFmdGVyIC0gVGhlIGVsZW1lbnRzIHRvIGRpZmYgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc2V0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgLSBUaGUgY29tcGFyYXRvciBmb3IgdGhlIGVsZW1lbnRzIGluIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gKiBAcGFyYW0gb25BZGQgLSBBIGZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZXZlcnkgZWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYFxuICogYWZ0ZXJgIGJ1dCBub3QgYGJlZm9yZWAuXG4gKiBAcGFyYW0gb25SZW1vdmUgLSBBIGZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZXZlcnkgZWxlbWVudCB0aGF0IGlzIHBhcnQgb2ZcbiAqIGBiZWZvcmVgIGJ1dCBub3QgYGFmdGVyYC5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3Igb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIHZlKHQpIHtcbiAgICByZXR1cm4gdC5oYXNOZXh0KCkgPyB0LmdldE5leHQoKSA6IHZvaWQgMDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgZmllbGRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFydGlhbGx5IHBhdGNoIGEgZG9jdW1lbnQuXG4gKiBGaWVsZE1hc2sgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIE9iamVjdFZhbHVlLlxuICogRXhhbXBsZXM6XG4gKiAgIGZvbyAtIE92ZXJ3cml0ZXMgZm9vIGVudGlyZWx5IHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLiBJZiBmb28gaXMgbm90XG4gKiAgICAgICAgIHByZXNlbnQgaW4gdGhlIGNvbXBhbmlvbiBPYmplY3RWYWx1ZSwgdGhlIGZpZWxkIGlzIGRlbGV0ZWQuXG4gKiAgIGZvby5iYXIgLSBPdmVyd3JpdGVzIG9ubHkgdGhlIGZpZWxkIGJhciBvZiB0aGUgb2JqZWN0IGZvby5cbiAqICAgICAgICAgICAgIElmIGZvbyBpcyBub3QgYW4gb2JqZWN0LCBmb28gaXMgcmVwbGFjZWQgd2l0aCBhbiBvYmplY3RcbiAqICAgICAgICAgICAgIGNvbnRhaW5pbmcgZm9vXG4gKi8gY2xhc3MgUmUge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5maWVsZHMgPSB0LCBcbiAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiB2YWxpZGF0aW9uIG9mIEZpZWxkTWFza1xuICAgICAgICAvLyBTb3J0IHRoZSBmaWVsZCBtYXNrIHRvIHN1cHBvcnQgYEZpZWxkTWFzay5pc0VxdWFsKClgIGFuZCBhc3NlcnQgYmVsb3cuXG4gICAgICAgIHQuc29ydChhdC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlKFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBGaWVsZE1hc2sgb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgYWxsIHRoZSBnaXZlblxuICAgICAqIGZpZWxkcyBwYXRocyB0byB0aGlzIGZpZWxkIG1hc2suXG4gICAgICovICAgIHVuaW9uV2l0aCh0KSB7XG4gICAgICAgIGxldCBlID0gbmV3IEVlKGF0LmNvbXBhcmF0b3IpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5maWVsZHMpIGUgPSBlLmFkZCh0KTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHQpIGUgPSBlLmFkZChuKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZShlLnRvQXJyYXkoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgYGZpZWxkUGF0aGAgaXMgaW5jbHVkZWQgYnkgYXQgbGVhc3Qgb25lIGZpZWxkIGluIHRoaXMgZmllbGRcbiAgICAgKiBtYXNrLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBPKG4pIG9wZXJhdGlvbiwgd2hlcmUgYG5gIGlzIHRoZSBzaXplIG9mIHRoZSBmaWVsZCBtYXNrLlxuICAgICAqLyAgICBjb3ZlcnModCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5maWVsZHMpIGlmIChlLmlzUHJlZml4T2YodCkpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIG50KHRoaXMuZmllbGRzLCB0LmZpZWxkcywgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGVycm9yIGVuY291bnRlcmVkIHdoaWxlIGRlY29kaW5nIGJhc2U2NCBzdHJpbmcuXG4gKi8gY2xhc3MgUGUgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMubmFtZSA9IFwiQmFzZTY0RGVjb2RlRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogQ29udmVydHMgYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcgdG8gYSBiaW5hcnkgc3RyaW5nLiAqL1xuLyoqIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIEJhc2U2NCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqL1xuZnVuY3Rpb24gYmUoKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGF0b2I7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltbXV0YWJsZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBcInByb3RvXCIgYnl0ZSBzdHJpbmcuXG4gKlxuICogUHJvdG8gYnl0ZSBzdHJpbmdzIGNhbiBlaXRoZXIgYmUgQmFzZTY0LWVuY29kZWQgc3RyaW5ncyBvciBVaW50OEFycmF5cyB3aGVuXG4gKiBzZW50IG9uIHRoZSB3aXJlLiBUaGlzIGNsYXNzIGFic3RyYWN0cyBhd2F5IHRoaXMgZGlmZmVyZW50aWF0aW9uIGJ5IGhvbGRpbmdcbiAqIHRoZSBwcm90byBieXRlIHN0cmluZyBpbiBhIGNvbW1vbiBjbGFzcyB0aGF0IG11c3QgYmUgY29udmVydGVkIGludG8gYSBzdHJpbmdcbiAqIGJlZm9yZSBiZWluZyBzZW50IGFzIGEgcHJvdG8uXG4gKiBAaW50ZXJuYWxcbiAqLyBjbGFzcyBWZSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmJpbmFyeVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQmFzZTY0U3RyaW5nKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0b2IodCk7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBgRE9NRXhjZXB0aW9uYCBpcyBkZWZpbmVkIGJlZm9yZSB1c2luZyBpdCB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIFwiUmVmZXJlbmNlRXJyb3I6IFByb3BlcnR5ICdET01FeGNlcHRpb24nIGRvZXNuJ3QgZXhpc3RcIiBpbiByZWFjdC1uYXRpdmUuXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzcxMTUpXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRE9NRXhjZXB0aW9uICYmIHQgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gPyBuZXcgUGUoXCJJbnZhbGlkIGJhc2U2NCBzdHJpbmc6IFwiICsgdCkgOiB0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBDb252ZXJ0cyBhIGJpbmFyeSBzdHJpbmcgdG8gYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcuICovICh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWZShlKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21VaW50OEFycmF5KHQpIHtcbiAgICAgICAgLy8gVE9ETyhpbmRleGluZyk7IFJlbW92ZSB0aGUgY29weSBvZiB0aGUgYnl0ZSBzdHJpbmcgaGVyZSBhcyB0aGlzIG1ldGhvZFxuICAgICAgICAvLyBpcyBmcmVxdWVudGx5IGNhbGxlZCBkdXJpbmcgaW5kZXhpbmcuXG4gICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhbiBVaW50OGFycmF5IHRvIGEgYmluYXJ5IHN0cmluZy5cbiAqL1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBsZXQgZSA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pIGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0W25dKTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBiaW5hcnkgc3RyaW5nIHRvIGFuIFVpbnQ4QXJyYXkuXG4gKi8gKHQpO1xuICAgICAgICByZXR1cm4gbmV3IFZlKGUpO1xuICAgIH1cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgbGV0IHQgPSAwO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dDogKCkgPT4gdCA8IHRoaXMuYmluYXJ5U3RyaW5nLmxlbmd0aCA/IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5iaW5hcnlTdHJpbmcuY2hhckNvZGVBdCh0KyspLFxuICAgICAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgdG9CYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiB0ID0gdGhpcy5iaW5hcnlTdHJpbmcsIGJ0b2EodCk7XG4gICAgICAgIHZhciB0O1xuICAgIH1cbiAgICB0b1VpbnQ4QXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSBlW25dID0gdC5jaGFyQ29kZUF0KG4pO1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAgICAgLy8gQSBSZWdFeHAgbWF0Y2hpbmcgSVNPIDg2MDEgVVRDIHRpbWVzdGFtcHMgd2l0aCBvcHRpb25hbCBmcmFjdGlvbi5cbiAgICAgICAgKHRoaXMuYmluYXJ5U3RyaW5nKTtcbiAgICB9XG4gICAgYXBwcm94aW1hdGVCeXRlU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIDIgKiB0aGlzLmJpbmFyeVN0cmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbXBhcmVUbyh0KSB7XG4gICAgICAgIHJldHVybiBldCh0aGlzLmJpbmFyeVN0cmluZywgdC5iaW5hcnlTdHJpbmcpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5U3RyaW5nID09PSB0LmJpbmFyeVN0cmluZztcbiAgICB9XG59XG5cblZlLkVNUFRZX0JZVEVfU1RSSU5HID0gbmV3IFZlKFwiXCIpO1xuXG5jb25zdCBTZSA9IG5ldyBSZWdFeHAoL15cXGR7NH0tXFxkXFxkLVxcZFxcZFRcXGRcXGQ6XFxkXFxkOlxcZFxcZCg/OlxcLihcXGQrKSk/WiQvKTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcG9zc2libGUgUHJvdG8gdmFsdWVzIGZvciBhIHRpbWVzdGFtcCB2YWx1ZSBpbnRvIGEgXCJzZWNvbmRzIGFuZFxuICogbmFub3NcIiByZXByZXNlbnRhdGlvbi5cbiAqLyBmdW5jdGlvbiBEZSh0KSB7XG4gICAgLy8gVGhlIGpzb24gaW50ZXJmYWNlIChmb3IgdGhlIGJyb3dzZXIpIHdpbGwgcmV0dXJuIGFuIGlzbyB0aW1lc3RhbXAgc3RyaW5nLFxuICAgIC8vIHdoaWxlIHRoZSBwcm90byBqcyBsaWJyYXJ5IChmb3Igbm9kZSkgd2lsbCByZXR1cm4gYVxuICAgIC8vIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgaW5zdGFuY2UuXG4gICAgaWYgKEYoISF0KSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICAvLyBUaGUgZGF0ZSBzdHJpbmcgY2FuIGhhdmUgaGlnaGVyIHByZWNpc2lvbiAobmFub3MpIHRoYW4gdGhlIERhdGUgY2xhc3NcbiAgICAgICAgLy8gKG1pbGxpcyksIHNvIHdlIGRvIHNvbWUgY3VzdG9tIHBhcnNpbmcgaGVyZS5cbiAgICAgICAgLy8gUGFyc2UgdGhlIG5hbm9zIHJpZ2h0IG91dCBvZiB0aGUgc3RyaW5nLlxuICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgIGNvbnN0IG4gPSBTZS5leGVjKHQpO1xuICAgICAgICBpZiAoRighIW4pLCBuWzFdKSB7XG4gICAgICAgICAgICAvLyBQYWQgdGhlIGZyYWN0aW9uIG91dCB0byA5IGRpZ2l0cyAobmFub3MpLlxuICAgICAgICAgICAgbGV0IHQgPSBuWzFdO1xuICAgICAgICAgICAgdCA9ICh0ICsgXCIwMDAwMDAwMDBcIikuc3Vic3RyKDAsIDkpLCBlID0gTnVtYmVyKHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhcnNlIHRoZSBkYXRlIHRvIGdldCB0aGUgc2Vjb25kcy5cbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IERhdGUodCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWNvbmRzOiBNYXRoLmZsb29yKHMuZ2V0VGltZSgpIC8gMWUzKSxcbiAgICAgICAgICAgIG5hbm9zOiBlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHNlY29uZHM6IENlKHQuc2Vjb25kcyksXG4gICAgICAgIG5hbm9zOiBDZSh0Lm5hbm9zKVxuICAgIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHBvc3NpYmxlIFByb3RvIHR5cGVzIGZvciBudW1iZXJzIGludG8gYSBKYXZhU2NyaXB0IG51bWJlci5cbiAqIFJldHVybnMgMCBpZiB0aGUgdmFsdWUgaXMgbm90IG51bWVyaWMuXG4gKi8gZnVuY3Rpb24gQ2UodCkge1xuICAgIC8vIFRPRE8oYmpvcm5pY2spOiBIYW5kbGUgaW50NjQgZ3JlYXRlciB0aGFuIDUzIGJpdHMuXG4gICAgcmV0dXJuIFwibnVtYmVyXCIgPT0gdHlwZW9mIHQgPyB0IDogXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IE51bWJlcih0KSA6IDA7XG59XG5cbi8qKiBDb252ZXJ0cyB0aGUgcG9zc2libGUgUHJvdG8gdHlwZXMgZm9yIEJsb2JzIGludG8gYSBCeXRlU3RyaW5nLiAqLyBmdW5jdGlvbiB4ZSh0KSB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyBWZS5mcm9tQmFzZTY0U3RyaW5nKHQpIDogVmUuZnJvbVVpbnQ4QXJyYXkodCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2NhbGx5LWFwcGxpZWQgU2VydmVyVGltZXN0YW1wLlxuICpcbiAqIFNlcnZlciBUaW1lc3RhbXBzIGFyZSBiYWNrZWQgYnkgTWFwVmFsdWVzIHRoYXQgY29udGFpbiBhbiBpbnRlcm5hbCBmaWVsZFxuICogYF9fdHlwZV9fYCB3aXRoIGEgdmFsdWUgb2YgYHNlcnZlcl90aW1lc3RhbXBgLiBUaGUgcHJldmlvdXMgdmFsdWUgYW5kIGxvY2FsXG4gKiB3cml0ZSB0aW1lIGFyZSBzdG9yZWQgaW4gaXRzIGBfX3ByZXZpb3VzX3ZhbHVlX19gIGFuZCBgX19sb2NhbF93cml0ZV90aW1lX19gXG4gKiBmaWVsZHMgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIE5vdGVzOlxuICogLSBTZXJ2ZXJUaW1lc3RhbXBWYWx1ZSBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYXMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhXG4gKiAgIHRyYW5zZm9ybS4gVGhleSBjYW4gb25seSBleGlzdCBpbiB0aGUgbG9jYWwgdmlldyBvZiBhIGRvY3VtZW50LiBUaGVyZWZvcmVcbiAqICAgdGhleSBkbyBub3QgbmVlZCB0byBiZSBwYXJzZWQgb3Igc2VyaWFsaXplZC5cbiAqIC0gV2hlbiBldmFsdWF0ZWQgbG9jYWxseSAoZS5nLiBmb3Igc25hcHNob3QuZGF0YSgpKSwgdGhleSBieSBkZWZhdWx0XG4gKiAgIGV2YWx1YXRlIHRvIGBudWxsYC4gVGhpcyBiZWhhdmlvciBjYW4gYmUgY29uZmlndXJlZCBieSBwYXNzaW5nIGN1c3RvbVxuICogICBGaWVsZFZhbHVlT3B0aW9ucyB0byB2YWx1ZSgpLlxuICogLSBXaXRoIHJlc3BlY3QgdG8gb3RoZXIgU2VydmVyVGltZXN0YW1wVmFsdWVzLCB0aGV5IHNvcnQgYnkgdGhlaXJcbiAqICAgbG9jYWxXcml0ZVRpbWUuXG4gKi8gZnVuY3Rpb24gTmUodCkge1xuICAgIHZhciBlLCBuO1xuICAgIHJldHVybiBcInNlcnZlcl90aW1lc3RhbXBcIiA9PT0gKG51bGwgPT09IChuID0gKChudWxsID09PSAoZSA9IG51bGwgPT0gdCA/IHZvaWQgMCA6IHQubWFwVmFsdWUpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZmllbGRzKSB8fCB7fSkuX190eXBlX18pIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uc3RyaW5nVmFsdWUpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU2VydmVyVGltZXN0YW1wIHByb3RvIHZhbHVlICh1c2luZyB0aGUgaW50ZXJuYWwgZm9ybWF0KS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgYmVmb3JlIHRoaXMgU2VydmVyVGltZXN0YW1wIHdhcyBzZXQuXG4gKlxuICogUHJlc2VydmluZyB0aGUgcHJldmlvdXMgdmFsdWVzIGFsbG93cyB0aGUgdXNlciB0byBkaXNwbGF5IHRoZSBsYXN0IHJlc29sZWRcbiAqIHZhbHVlIHVudGlsIHRoZSBiYWNrZW5kIHJlc3BvbmRzIHdpdGggdGhlIHRpbWVzdGFtcC5cbiAqL1xuZnVuY3Rpb24ga2UodCkge1xuICAgIGNvbnN0IGUgPSB0Lm1hcFZhbHVlLmZpZWxkcy5fX3ByZXZpb3VzX3ZhbHVlX187XG4gICAgcmV0dXJuIE5lKGUpID8ga2UoZSkgOiBlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhpcyB0aW1lc3RhbXAgd2FzIGZpcnN0IHNldC5cbiAqLyBmdW5jdGlvbiBNZSh0KSB7XG4gICAgY29uc3QgZSA9IERlKHQubWFwVmFsdWUuZmllbGRzLl9fbG9jYWxfd3JpdGVfdGltZV9fLnRpbWVzdGFtcFZhbHVlKTtcbiAgICByZXR1cm4gbmV3IGl0KGUuc2Vjb25kcywgZS5uYW5vcyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzICRlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgRGF0YWJhc2VJbmZvIHVzaW5nIHRoZSBwcm92aWRlZCBob3N0LCBkYXRhYmFzZUlkIGFuZFxuICAgICAqIHBlcnNpc3RlbmNlS2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFiYXNlSWQgLSBUaGUgZGF0YWJhc2UgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBhcHBJZCAtIFRoZSBGaXJlYmFzZSBBcHAgSWQuXG4gICAgICogQHBhcmFtIHBlcnNpc3RlbmNlS2V5IC0gQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBGaXJlc3RvcmUncyBsb2NhbFxuICAgICAqIHN0b3JhZ2UgKHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2VJZCkuXG4gICAgICogQHBhcmFtIGhvc3QgLSBUaGUgRmlyZXN0b3JlIGJhY2tlbmQgaG9zdCB0byBjb25uZWN0IHRvLlxuICAgICAqIEBwYXJhbSBzc2wgLSBXaGV0aGVyIHRvIHVzZSBTU0wgd2hlbiBjb25uZWN0aW5nLlxuICAgICAqIEBwYXJhbSBmb3JjZUxvbmdQb2xsaW5nIC0gV2hldGhlciB0byB1c2UgdGhlIGZvcmNlTG9uZ1BvbGxpbmcgb3B0aW9uXG4gICAgICogd2hlbiB1c2luZyBXZWJDaGFubmVsIGFzIHRoZSBuZXR3b3JrIHRyYW5zcG9ydC5cbiAgICAgKiBAcGFyYW0gYXV0b0RldGVjdExvbmdQb2xsaW5nIC0gV2hldGhlciB0byB1c2UgdGhlIGRldGVjdEJ1ZmZlcmluZ1Byb3h5XG4gICAgICogb3B0aW9uIHdoZW4gdXNpbmcgV2ViQ2hhbm5lbCBhcyB0aGUgbmV0d29yayB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGxvbmdQb2xsaW5nT3B0aW9ucyBPcHRpb25zIHRoYXQgY29uZmlndXJlIGxvbmctcG9sbGluZy5cbiAgICAgKiBAcGFyYW0gdXNlRmV0Y2hTdHJlYW1zIFdoZXRoZXIgdG8gdXNlIHRoZSBGZXRjaCBBUEkgaW5zdGVhZCBvZlxuICAgICAqIFhNTEhUVFBSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgciwgbywgdSwgYykge1xuICAgICAgICB0aGlzLmRhdGFiYXNlSWQgPSB0LCB0aGlzLmFwcElkID0gZSwgdGhpcy5wZXJzaXN0ZW5jZUtleSA9IG4sIHRoaXMuaG9zdCA9IHMsIHRoaXMuc3NsID0gaSwgXG4gICAgICAgIHRoaXMuZm9yY2VMb25nUG9sbGluZyA9IHIsIHRoaXMuYXV0b0RldGVjdExvbmdQb2xsaW5nID0gbywgdGhpcy5sb25nUG9sbGluZ09wdGlvbnMgPSB1LCBcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgPSBjO1xuICAgIH1cbn1cblxuLyoqIFRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWUgZm9yIGEgcHJvamVjdC4gKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZGF0YWJhc2UgSUQgYSBGaXJlc3RvcmUgY2xpZW50IGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBPZSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnByb2plY3RJZCA9IHQsIHRoaXMuZGF0YWJhc2UgPSBlIHx8IFwiKGRlZmF1bHQpXCI7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPZShcIlwiLCBcIlwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRGVmYXVsdERhdGFiYXNlKCkge1xuICAgICAgICByZXR1cm4gXCIoZGVmYXVsdClcIiA9PT0gdGhpcy5kYXRhYmFzZTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgT2UgJiYgdC5wcm9qZWN0SWQgPT09IHRoaXMucHJvamVjdElkICYmIHQuZGF0YWJhc2UgPT09IHRoaXMuZGF0YWJhc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgRmUgPSB7XG4gICAgbWFwVmFsdWU6IHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBfX3R5cGVfXzoge1xuICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIl9fbWF4X19cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSwgQmUgPSB7XG4gICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxufTtcblxuLyoqIEV4dHJhY3RzIHRoZSBiYWNrZW5kJ3MgdHlwZSBvcmRlciBmb3IgdGhlIHByb3ZpZGVkIHZhbHVlLiAqL1xuZnVuY3Rpb24gTGUodCkge1xuICAgIHJldHVybiBcIm51bGxWYWx1ZVwiIGluIHQgPyAwIC8qIFR5cGVPcmRlci5OdWxsVmFsdWUgKi8gOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyAxIC8qIFR5cGVPcmRlci5Cb29sZWFuVmFsdWUgKi8gOiBcImludGVnZXJWYWx1ZVwiIGluIHQgfHwgXCJkb3VibGVWYWx1ZVwiIGluIHQgPyAyIC8qIFR5cGVPcmRlci5OdW1iZXJWYWx1ZSAqLyA6IFwidGltZXN0YW1wVmFsdWVcIiBpbiB0ID8gMyAvKiBUeXBlT3JkZXIuVGltZXN0YW1wVmFsdWUgKi8gOiBcInN0cmluZ1ZhbHVlXCIgaW4gdCA/IDUgLyogVHlwZU9yZGVyLlN0cmluZ1ZhbHVlICovIDogXCJieXRlc1ZhbHVlXCIgaW4gdCA/IDYgLyogVHlwZU9yZGVyLkJsb2JWYWx1ZSAqLyA6IFwicmVmZXJlbmNlVmFsdWVcIiBpbiB0ID8gNyAvKiBUeXBlT3JkZXIuUmVmVmFsdWUgKi8gOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8gOCAvKiBUeXBlT3JkZXIuR2VvUG9pbnRWYWx1ZSAqLyA6IFwiYXJyYXlWYWx1ZVwiIGluIHQgPyA5IC8qIFR5cGVPcmRlci5BcnJheVZhbHVlICovIDogXCJtYXBWYWx1ZVwiIGluIHQgPyBOZSh0KSA/IDQgLyogVHlwZU9yZGVyLlNlcnZlclRpbWVzdGFtcFZhbHVlICovIDogZW4odCkgPyA5MDA3MTk5MjU0NzQwOTkxIC8qIFR5cGVPcmRlci5NYXhWYWx1ZSAqLyA6IDEwIC8qIFR5cGVPcmRlci5PYmplY3RWYWx1ZSAqLyA6IE8oKTtcbn1cblxuLyoqIFRlc3RzIGBsZWZ0YCBhbmQgYHJpZ2h0YCBmb3IgZXF1YWxpdHkgYmFzZWQgb24gdGhlIGJhY2tlbmQgc2VtYW50aWNzLiAqLyBmdW5jdGlvbiBxZSh0LCBlKSB7XG4gICAgaWYgKHQgPT09IGUpIHJldHVybiAhMDtcbiAgICBjb25zdCBuID0gTGUodCk7XG4gICAgaWYgKG4gIT09IExlKGUpKSByZXR1cm4gITE7XG4gICAgc3dpdGNoIChuKSB7XG4gICAgICBjYXNlIDAgLyogVHlwZU9yZGVyLk51bGxWYWx1ZSAqLyA6XG4gICAgICBjYXNlIDkwMDcxOTkyNTQ3NDA5OTEgLyogVHlwZU9yZGVyLk1heFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuICEwO1xuXG4gICAgICBjYXNlIDEgLyogVHlwZU9yZGVyLkJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiB0LmJvb2xlYW5WYWx1ZSA9PT0gZS5ib29sZWFuVmFsdWU7XG5cbiAgICAgIGNhc2UgNCAvKiBUeXBlT3JkZXIuU2VydmVyVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gTWUodCkuaXNFcXVhbChNZShlKSk7XG5cbiAgICAgIGNhc2UgMyAvKiBUeXBlT3JkZXIuVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQudGltZXN0YW1wVmFsdWUgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZS50aW1lc3RhbXBWYWx1ZSAmJiB0LnRpbWVzdGFtcFZhbHVlLmxlbmd0aCA9PT0gZS50aW1lc3RhbXBWYWx1ZS5sZW5ndGgpIFxuICAgICAgICAgICAgLy8gVXNlIHN0cmluZyBlcXVhbGl0eSBmb3IgSVNPIDg2MDEgdGltZXN0YW1wc1xuICAgICAgICAgICAgcmV0dXJuIHQudGltZXN0YW1wVmFsdWUgPT09IGUudGltZXN0YW1wVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBuID0gRGUodC50aW1lc3RhbXBWYWx1ZSksIHMgPSBEZShlLnRpbWVzdGFtcFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuLnNlY29uZHMgPT09IHMuc2Vjb25kcyAmJiBuLm5hbm9zID09PSBzLm5hbm9zO1xuICAgICAgICB9KHQsIGUpO1xuXG4gICAgICBjYXNlIDUgLyogVHlwZU9yZGVyLlN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIHQuc3RyaW5nVmFsdWUgPT09IGUuc3RyaW5nVmFsdWU7XG5cbiAgICAgIGNhc2UgNiAvKiBUeXBlT3JkZXIuQmxvYlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiB4ZSh0LmJ5dGVzVmFsdWUpLmlzRXF1YWwoeGUoZS5ieXRlc1ZhbHVlKSk7XG4gICAgICAgIH0odCwgZSk7XG5cbiAgICAgIGNhc2UgNyAvKiBUeXBlT3JkZXIuUmVmVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gdC5yZWZlcmVuY2VWYWx1ZSA9PT0gZS5yZWZlcmVuY2VWYWx1ZTtcblxuICAgICAgY2FzZSA4IC8qIFR5cGVPcmRlci5HZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBDZSh0Lmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpID09PSBDZShlLmdlb1BvaW50VmFsdWUubGF0aXR1ZGUpICYmIENlKHQuZ2VvUG9pbnRWYWx1ZS5sb25naXR1ZGUpID09PSBDZShlLmdlb1BvaW50VmFsdWUubG9uZ2l0dWRlKTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSAyIC8qIFR5cGVPcmRlci5OdW1iZXJWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBpZiAoXCJpbnRlZ2VyVmFsdWVcIiBpbiB0ICYmIFwiaW50ZWdlclZhbHVlXCIgaW4gZSkgcmV0dXJuIENlKHQuaW50ZWdlclZhbHVlKSA9PT0gQ2UoZS5pbnRlZ2VyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKFwiZG91YmxlVmFsdWVcIiBpbiB0ICYmIFwiZG91YmxlVmFsdWVcIiBpbiBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IENlKHQuZG91YmxlVmFsdWUpLCBzID0gQ2UoZS5kb3VibGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gPT09IHMgPyBCdChuKSA9PT0gQnQocykgOiBpc05hTihuKSAmJiBpc05hTihzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSh0LCBlKTtcblxuICAgICAgY2FzZSA5IC8qIFR5cGVPcmRlci5BcnJheVZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIG50KHQuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10sIGUuYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10sIHFlKTtcblxuICAgICAgY2FzZSAxMCAvKiBUeXBlT3JkZXIuT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQubWFwVmFsdWUuZmllbGRzIHx8IHt9LCBzID0gZS5tYXBWYWx1ZS5maWVsZHMgfHwge307XG4gICAgICAgICAgICBpZiAobWUobikgIT09IG1lKHMpKSByZXR1cm4gITE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gbikgaWYgKG4uaGFzT3duUHJvcGVydHkodCkgJiYgKHZvaWQgMCA9PT0gc1t0XSB8fCAhcWUoblt0XSwgc1t0XSkpKSByZXR1cm4gITE7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXJyYXlWYWx1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuICovICh0LCBlKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIE8oKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFVlKHQsIGUpIHtcbiAgICByZXR1cm4gdm9pZCAwICE9PSAodC52YWx1ZXMgfHwgW10pLmZpbmQoKHQgPT4gcWUodCwgZSkpKTtcbn1cblxuZnVuY3Rpb24gS2UodCwgZSkge1xuICAgIGlmICh0ID09PSBlKSByZXR1cm4gMDtcbiAgICBjb25zdCBuID0gTGUodCksIHMgPSBMZShlKTtcbiAgICBpZiAobiAhPT0gcykgcmV0dXJuIGV0KG4sIHMpO1xuICAgIHN3aXRjaCAobikge1xuICAgICAgY2FzZSAwIC8qIFR5cGVPcmRlci5OdWxsVmFsdWUgKi8gOlxuICAgICAgY2FzZSA5MDA3MTk5MjU0NzQwOTkxIC8qIFR5cGVPcmRlci5NYXhWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiAwO1xuXG4gICAgICBjYXNlIDEgLyogVHlwZU9yZGVyLkJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBldCh0LmJvb2xlYW5WYWx1ZSwgZS5ib29sZWFuVmFsdWUpO1xuXG4gICAgICBjYXNlIDIgLyogVHlwZU9yZGVyLk51bWJlclZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBDZSh0LmludGVnZXJWYWx1ZSB8fCB0LmRvdWJsZVZhbHVlKSwgcyA9IENlKGUuaW50ZWdlclZhbHVlIHx8IGUuZG91YmxlVmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG4gPCBzID8gLTEgOiBuID4gcyA/IDEgOiBuID09PSBzID8gMCA6IFxuICAgICAgICAgICAgLy8gb25lIG9yIGJvdGggYXJlIE5hTi5cbiAgICAgICAgICAgIGlzTmFOKG4pID8gaXNOYU4ocykgPyAwIDogLTEgOiAxO1xuICAgICAgICB9KHQsIGUpO1xuXG4gICAgICBjYXNlIDMgLyogVHlwZU9yZGVyLlRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIEdlKHQudGltZXN0YW1wVmFsdWUsIGUudGltZXN0YW1wVmFsdWUpO1xuXG4gICAgICBjYXNlIDQgLyogVHlwZU9yZGVyLlNlcnZlclRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIEdlKE1lKHQpLCBNZShlKSk7XG5cbiAgICAgIGNhc2UgNSAvKiBUeXBlT3JkZXIuU3RyaW5nVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZXQodC5zdHJpbmdWYWx1ZSwgZS5zdHJpbmdWYWx1ZSk7XG5cbiAgICAgIGNhc2UgNiAvKiBUeXBlT3JkZXIuQmxvYlZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB4ZSh0KSwgcyA9IHhlKGUpO1xuICAgICAgICAgICAgcmV0dXJuIG4uY29tcGFyZVRvKHMpO1xuICAgICAgICB9KHQuYnl0ZXNWYWx1ZSwgZS5ieXRlc1ZhbHVlKTtcblxuICAgICAgY2FzZSA3IC8qIFR5cGVPcmRlci5SZWZWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zcGxpdChcIi9cIiksIHMgPSBlLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbi5sZW5ndGggJiYgdCA8IHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gZXQoblt0XSwgc1t0XSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IGUpIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV0KG4ubGVuZ3RoLCBzLmxlbmd0aCk7XG4gICAgICAgIH0odC5yZWZlcmVuY2VWYWx1ZSwgZS5yZWZlcmVuY2VWYWx1ZSk7XG5cbiAgICAgIGNhc2UgOCAvKiBUeXBlT3JkZXIuR2VvUG9pbnRWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gZXQoQ2UodC5sYXRpdHVkZSksIENlKGUubGF0aXR1ZGUpKTtcbiAgICAgICAgICAgIGlmICgwICE9PSBuKSByZXR1cm4gbjtcbiAgICAgICAgICAgIHJldHVybiBldChDZSh0LmxvbmdpdHVkZSksIENlKGUubG9uZ2l0dWRlKSk7XG4gICAgICAgIH0odC5nZW9Qb2ludFZhbHVlLCBlLmdlb1BvaW50VmFsdWUpO1xuXG4gICAgICBjYXNlIDkgLyogVHlwZU9yZGVyLkFycmF5VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQudmFsdWVzIHx8IFtdLCBzID0gZS52YWx1ZXMgfHwgW107XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IG4ubGVuZ3RoICYmIHQgPCBzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEtlKG5bdF0sIHNbdF0pO1xuICAgICAgICAgICAgICAgIGlmIChlKSByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldChuLmxlbmd0aCwgcy5sZW5ndGgpO1xuICAgICAgICB9KHQuYXJyYXlWYWx1ZSwgZS5hcnJheVZhbHVlKTtcblxuICAgICAgY2FzZSAxMCAvKiBUeXBlT3JkZXIuT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQgPT09IEZlLm1hcFZhbHVlICYmIGUgPT09IEZlLm1hcFZhbHVlKSByZXR1cm4gMDtcbiAgICAgICAgICAgIGlmICh0ID09PSBGZS5tYXBWYWx1ZSkgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAoZSA9PT0gRmUubWFwVmFsdWUpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LmZpZWxkcyB8fCB7fSwgcyA9IE9iamVjdC5rZXlzKG4pLCBpID0gZS5maWVsZHMgfHwge30sIHIgPSBPYmplY3Qua2V5cyhpKTtcbiAgICAgICAgICAgIC8vIEV2ZW4gdGhvdWdoIE1hcFZhbHVlcyBhcmUgbGlrZWx5IHNvcnRlZCBjb3JyZWN0bHkgYmFzZWQgb24gdGhlaXIgaW5zZXJ0aW9uXG4gICAgICAgICAgICAvLyBvcmRlciAoZS5nLiB3aGVuIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQpLCBsb2NhbCBtb2RpZmljYXRpb25zIGNhbiBicmluZ1xuICAgICAgICAgICAgLy8gZWxlbWVudHMgb3V0IG9mIG9yZGVyLiBXZSBuZWVkIHRvIHJlLXNvcnQgdGhlIGVsZW1lbnRzIHRvIGVuc3VyZSB0aGF0XG4gICAgICAgICAgICAvLyBjYW5vbmljYWwgSURzIGFyZSBpbmRlcGVuZGVudCBvZiBpbnNlcnRpb24gb3JkZXIuXG4gICAgICAgICAgICBzLnNvcnQoKSwgci5zb3J0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHMubGVuZ3RoICYmIHQgPCByLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IGV0KHNbdF0sIHJbdF0pO1xuICAgICAgICAgICAgICAgIGlmICgwICE9PSBlKSByZXR1cm4gZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvID0gS2UobltzW3RdXSwgaVtyW3RdXSk7XG4gICAgICAgICAgICAgICAgaWYgKDAgIT09IG8pIHJldHVybiBvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV0KHMubGVuZ3RoLCByLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGNhbm9uaWNhbCBJRCBmb3IgdGhlIHByb3ZpZGVkIGZpZWxkIHZhbHVlIChhcyB1c2VkIGluIFRhcmdldFxuICogc2VyaWFsaXphdGlvbikuXG4gKi8gKHQubWFwVmFsdWUsIGUubWFwVmFsdWUpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBPKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBHZSh0LCBlKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgZSAmJiB0Lmxlbmd0aCA9PT0gZS5sZW5ndGgpIHJldHVybiBldCh0LCBlKTtcbiAgICBjb25zdCBuID0gRGUodCksIHMgPSBEZShlKSwgaSA9IGV0KG4uc2Vjb25kcywgcy5zZWNvbmRzKTtcbiAgICByZXR1cm4gMCAhPT0gaSA/IGkgOiBldChuLm5hbm9zLCBzLm5hbm9zKTtcbn1cblxuZnVuY3Rpb24gUWUodCkge1xuICAgIHJldHVybiBqZSh0KTtcbn1cblxuZnVuY3Rpb24gamUodCkge1xuICAgIHJldHVybiBcIm51bGxWYWx1ZVwiIGluIHQgPyBcIm51bGxcIiA6IFwiYm9vbGVhblZhbHVlXCIgaW4gdCA/IFwiXCIgKyB0LmJvb2xlYW5WYWx1ZSA6IFwiaW50ZWdlclZhbHVlXCIgaW4gdCA/IFwiXCIgKyB0LmludGVnZXJWYWx1ZSA6IFwiZG91YmxlVmFsdWVcIiBpbiB0ID8gXCJcIiArIHQuZG91YmxlVmFsdWUgOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IERlKHQpO1xuICAgICAgICByZXR1cm4gYHRpbWUoJHtlLnNlY29uZHN9LCR7ZS5uYW5vc30pYDtcbiAgICB9KHQudGltZXN0YW1wVmFsdWUpIDogXCJzdHJpbmdWYWx1ZVwiIGluIHQgPyB0LnN0cmluZ1ZhbHVlIDogXCJieXRlc1ZhbHVlXCIgaW4gdCA/IHhlKHQuYnl0ZXNWYWx1ZSkudG9CYXNlNjQoKSA6IFwicmVmZXJlbmNlVmFsdWVcIiBpbiB0ID8gKG4gPSB0LnJlZmVyZW5jZVZhbHVlLCBcbiAgICBodC5mcm9tTmFtZShuKS50b1N0cmluZygpKSA6IFwiZ2VvUG9pbnRWYWx1ZVwiIGluIHQgPyBgZ2VvKCR7KGUgPSB0Lmdlb1BvaW50VmFsdWUpLmxhdGl0dWRlfSwke2UubG9uZ2l0dWRlfSlgIDogXCJhcnJheVZhbHVlXCIgaW4gdCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGUgPSBcIltcIiwgbiA9ICEwO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdC52YWx1ZXMgfHwgW10pIG4gPyBuID0gITEgOiBlICs9IFwiLFwiLCBlICs9IGplKHMpO1xuICAgICAgICByZXR1cm4gZSArIFwiXVwiO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYW4gYXBwcm94aW1hdGUgKGFuZCB3aWxkbHkgaW5hY2N1cmF0ZSkgaW4tbWVtb3J5IHNpemUgZm9yIHRoZSBmaWVsZFxuICogdmFsdWUuXG4gKlxuICogVGhlIG1lbW9yeSBzaXplIHRha2VzIGludG8gYWNjb3VudCBvbmx5IHRoZSBhY3R1YWwgdXNlciBkYXRhIGFzIGl0IHJlc2lkZXNcbiAqIGluIG1lbW9yeSBhbmQgaWdub3JlcyBvYmplY3Qgb3ZlcmhlYWQuXG4gKi8gKHQuYXJyYXlWYWx1ZSkgOiBcIm1hcFZhbHVlXCIgaW4gdCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgLy8gSXRlcmF0aW9uIG9yZGVyIGluIEphdmFTY3JpcHQgaXMgbm90IGd1YXJhbnRlZWQuIFRvIGVuc3VyZSB0aGF0IHdlIGdlbmVyYXRlXG4gICAgICAgIC8vIG1hdGNoaW5nIGNhbm9uaWNhbCBJRHMgZm9yIGlkZW50aWNhbCBtYXBzLCB3ZSBuZWVkIHRvIHNvcnQgdGhlIGtleXMuXG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3Qua2V5cyh0LmZpZWxkcyB8fCB7fSkuc29ydCgpO1xuICAgICAgICBsZXQgbiA9IFwie1wiLCBzID0gITA7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSBzID8gcyA9ICExIDogbiArPSBcIixcIiwgbiArPSBgJHtpfToke2plKHQuZmllbGRzW2ldKX1gO1xuICAgICAgICByZXR1cm4gbiArIFwifVwiO1xuICAgIH0odC5tYXBWYWx1ZSkgOiBPKCk7XG4gICAgdmFyIGUsIG47XG59XG5cbmZ1bmN0aW9uIHplKHQpIHtcbiAgICBzd2l0Y2ggKExlKHQpKSB7XG4gICAgICBjYXNlIDAgLyogVHlwZU9yZGVyLk51bGxWYWx1ZSAqLyA6XG4gICAgICBjYXNlIDEgLyogVHlwZU9yZGVyLkJvb2xlYW5WYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiA0O1xuXG4gICAgICBjYXNlIDIgLyogVHlwZU9yZGVyLk51bWJlclZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIDg7XG5cbiAgICAgIGNhc2UgMyAvKiBUeXBlT3JkZXIuVGltZXN0YW1wVmFsdWUgKi8gOlxuICAgICAgY2FzZSA4IC8qIFR5cGVPcmRlci5HZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgLy8gR2VvUG9pbnRzIGFyZSBtYWRlIHVwIG9mIHR3byBkaXN0aW5jdCBudW1iZXJzIChsYXRpdHVkZSArIGxvbmdpdHVkZSlcbiAgICAgICAgcmV0dXJuIDE2O1xuXG4gICAgICBjYXNlIDQgLyogVHlwZU9yZGVyLlNlcnZlclRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgY29uc3QgZSA9IGtlKHQpO1xuICAgICAgICByZXR1cm4gZSA/IDE2ICsgemUoZSkgOiAxNjtcblxuICAgICAgY2FzZSA1IC8qIFR5cGVPcmRlci5TdHJpbmdWYWx1ZSAqLyA6XG4gICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0RhdGFfc3RydWN0dXJlczpcbiAgICAgICAgLy8gXCJKYXZhU2NyaXB0J3MgU3RyaW5nIHR5cGUgaXMgWy4uLl0gYSBzZXQgb2YgZWxlbWVudHMgb2YgMTYtYml0IHVuc2lnbmVkXG4gICAgICAgIC8vIGludGVnZXIgdmFsdWVzXCJcbiAgICAgICAgcmV0dXJuIDIgKiB0LnN0cmluZ1ZhbHVlLmxlbmd0aDtcblxuICAgICAgY2FzZSA2IC8qIFR5cGVPcmRlci5CbG9iVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4geGUodC5ieXRlc1ZhbHVlKS5hcHByb3hpbWF0ZUJ5dGVTaXplKCk7XG5cbiAgICAgIGNhc2UgNyAvKiBUeXBlT3JkZXIuUmVmVmFsdWUgKi8gOlxuICAgICAgICByZXR1cm4gdC5yZWZlcmVuY2VWYWx1ZS5sZW5ndGg7XG5cbiAgICAgIGNhc2UgOSAvKiBUeXBlT3JkZXIuQXJyYXlWYWx1ZSAqLyA6XG4gICAgICAgIHJldHVybiAodC5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSkucmVkdWNlKCgodCwgZSkgPT4gdCArIHplKGUpKSwgMCk7XG5cbiAgICAgIGNhc2UgMTAgLyogVHlwZU9yZGVyLk9iamVjdFZhbHVlICovIDpcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgICAgIHJldHVybiBnZSh0LmZpZWxkcywgKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgZSArPSB0Lmxlbmd0aCArIHplKG4pO1xuICAgICAgICAgICAgfSkpLCBlO1xuICAgICAgICB9KHQubWFwVmFsdWUpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBPKCk7XG4gICAgfVxufVxuXG4vKiogUmV0dXJucyBhIHJlZmVyZW5jZSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGRhdGFiYXNlIGFuZCBrZXkuICovXG5mdW5jdGlvbiBXZSh0LCBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVmZXJlbmNlVmFsdWU6IGBwcm9qZWN0cy8ke3QucHJvamVjdElkfS9kYXRhYmFzZXMvJHt0LmRhdGFiYXNlfS9kb2N1bWVudHMvJHtlLnBhdGguY2Fub25pY2FsU3RyaW5nKCl9YFxuICAgIH07XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBJbnRlZ2VyVmFsdWUgLiAqLyBmdW5jdGlvbiBIZSh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcImludGVnZXJWYWx1ZVwiIGluIHQ7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIERvdWJsZVZhbHVlLiAqL1xuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIEFycmF5VmFsdWUuICovXG5mdW5jdGlvbiBKZSh0KSB7XG4gICAgcmV0dXJuICEhdCAmJiBcImFycmF5VmFsdWVcIiBpbiB0O1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBOdWxsVmFsdWUuICovIGZ1bmN0aW9uIFllKHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwibnVsbFZhbHVlXCIgaW4gdDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIE5hTi4gKi8gZnVuY3Rpb24gWGUodCkge1xuICAgIHJldHVybiAhIXQgJiYgXCJkb3VibGVWYWx1ZVwiIGluIHQgJiYgaXNOYU4oTnVtYmVyKHQuZG91YmxlVmFsdWUpKTtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgTWFwVmFsdWUuICovIGZ1bmN0aW9uIFplKHQpIHtcbiAgICByZXR1cm4gISF0ICYmIFwibWFwVmFsdWVcIiBpbiB0O1xufVxuXG4vKiogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBgc291cmNlYC4gKi8gZnVuY3Rpb24gdG4odCkge1xuICAgIGlmICh0Lmdlb1BvaW50VmFsdWUpIHJldHVybiB7XG4gICAgICAgIGdlb1BvaW50VmFsdWU6IE9iamVjdC5hc3NpZ24oe30sIHQuZ2VvUG9pbnRWYWx1ZSlcbiAgICB9O1xuICAgIGlmICh0LnRpbWVzdGFtcFZhbHVlICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQudGltZXN0YW1wVmFsdWUpIHJldHVybiB7XG4gICAgICAgIHRpbWVzdGFtcFZhbHVlOiBPYmplY3QuYXNzaWduKHt9LCB0LnRpbWVzdGFtcFZhbHVlKVxuICAgIH07XG4gICAgaWYgKHQubWFwVmFsdWUpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZ2UodC5tYXBWYWx1ZS5maWVsZHMsICgodCwgbikgPT4gZS5tYXBWYWx1ZS5maWVsZHNbdF0gPSB0bihuKSkpLCBlO1xuICAgIH1cbiAgICBpZiAodC5hcnJheVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBhcnJheVZhbHVlOiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8ICh0LmFycmF5VmFsdWUudmFsdWVzIHx8IFtdKS5sZW5ndGg7ICsrbikgZS5hcnJheVZhbHVlLnZhbHVlc1tuXSA9IHRuKHQuYXJyYXlWYWx1ZS52YWx1ZXNbbl0pO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHQpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBWYWx1ZSByZXByZXNlbnRzIHRoZSBjYW5vbmljYWwge0BsaW5rICNNQVhfVkFMVUV9IC4gKi8gZnVuY3Rpb24gZW4odCkge1xuICAgIHJldHVybiBcIl9fbWF4X19cIiA9PT0gKCgodC5tYXBWYWx1ZSB8fCB7fSkuZmllbGRzIHx8IHt9KS5fX3R5cGVfXyB8fCB7fSkuc3RyaW5nVmFsdWU7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBsb3dlc3QgdmFsdWUgZm9yIHRoZSBnaXZlbiB2YWx1ZSB0eXBlIChpbmNsdXNpdmUpLiAqLyBmdW5jdGlvbiBubih0KSB7XG4gICAgcmV0dXJuIFwibnVsbFZhbHVlXCIgaW4gdCA/IEJlIDogXCJib29sZWFuVmFsdWVcIiBpbiB0ID8ge1xuICAgICAgICBib29sZWFuVmFsdWU6ICExXG4gICAgfSA6IFwiaW50ZWdlclZhbHVlXCIgaW4gdCB8fCBcImRvdWJsZVZhbHVlXCIgaW4gdCA/IHtcbiAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgIH0gOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IHtcbiAgICAgICAgdGltZXN0YW1wVmFsdWU6IHtcbiAgICAgICAgICAgIHNlY29uZHM6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG4gICAgICAgIH1cbiAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIHN0cmluZ1ZhbHVlOiBcIlwiXG4gICAgfSA6IFwiYnl0ZXNWYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIGJ5dGVzVmFsdWU6IFwiXCJcbiAgICB9IDogXCJyZWZlcmVuY2VWYWx1ZVwiIGluIHQgPyBXZShPZS5lbXB0eSgpLCBodC5lbXB0eSgpKSA6IFwiZ2VvUG9pbnRWYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIGdlb1BvaW50VmFsdWU6IHtcbiAgICAgICAgICAgIGxhdGl0dWRlOiAtOTAsXG4gICAgICAgICAgICBsb25naXR1ZGU6IC0xODBcbiAgICAgICAgfVxuICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiB0ID8ge1xuICAgICAgICBhcnJheVZhbHVlOiB7fVxuICAgIH0gOiBcIm1hcFZhbHVlXCIgaW4gdCA/IHtcbiAgICAgICAgbWFwVmFsdWU6IHt9XG4gICAgfSA6IE8oKTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGxhcmdlc3QgdmFsdWUgZm9yIHRoZSBnaXZlbiB2YWx1ZSB0eXBlIChleGNsdXNpdmUpLiAqLyBmdW5jdGlvbiBzbih0KSB7XG4gICAgcmV0dXJuIFwibnVsbFZhbHVlXCIgaW4gdCA/IHtcbiAgICAgICAgYm9vbGVhblZhbHVlOiAhMVxuICAgIH0gOiBcImJvb2xlYW5WYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIGRvdWJsZVZhbHVlOiBOYU5cbiAgICB9IDogXCJpbnRlZ2VyVmFsdWVcIiBpbiB0IHx8IFwiZG91YmxlVmFsdWVcIiBpbiB0ID8ge1xuICAgICAgICB0aW1lc3RhbXBWYWx1ZToge1xuICAgICAgICAgICAgc2Vjb25kczogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbiAgICAgICAgfVxuICAgIH0gOiBcInRpbWVzdGFtcFZhbHVlXCIgaW4gdCA/IHtcbiAgICAgICAgc3RyaW5nVmFsdWU6IFwiXCJcbiAgICB9IDogXCJzdHJpbmdWYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIGJ5dGVzVmFsdWU6IFwiXCJcbiAgICB9IDogXCJieXRlc1ZhbHVlXCIgaW4gdCA/IFdlKE9lLmVtcHR5KCksIGh0LmVtcHR5KCkpIDogXCJyZWZlcmVuY2VWYWx1ZVwiIGluIHQgPyB7XG4gICAgICAgIGdlb1BvaW50VmFsdWU6IHtcbiAgICAgICAgICAgIGxhdGl0dWRlOiAtOTAsXG4gICAgICAgICAgICBsb25naXR1ZGU6IC0xODBcbiAgICAgICAgfVxuICAgIH0gOiBcImdlb1BvaW50VmFsdWVcIiBpbiB0ID8ge1xuICAgICAgICBhcnJheVZhbHVlOiB7fVxuICAgIH0gOiBcImFycmF5VmFsdWVcIiBpbiB0ID8ge1xuICAgICAgICBtYXBWYWx1ZToge31cbiAgICB9IDogXCJtYXBWYWx1ZVwiIGluIHQgPyBGZSA6IE8oKTtcbn1cblxuZnVuY3Rpb24gcm4odCwgZSkge1xuICAgIGNvbnN0IG4gPSBLZSh0LnZhbHVlLCBlLnZhbHVlKTtcbiAgICByZXR1cm4gMCAhPT0gbiA/IG4gOiB0LmluY2x1c2l2ZSAmJiAhZS5pbmNsdXNpdmUgPyAtMSA6ICF0LmluY2x1c2l2ZSAmJiBlLmluY2x1c2l2ZSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBvbih0LCBlKSB7XG4gICAgY29uc3QgbiA9IEtlKHQudmFsdWUsIGUudmFsdWUpO1xuICAgIHJldHVybiAwICE9PSBuID8gbiA6IHQuaW5jbHVzaXZlICYmICFlLmluY2x1c2l2ZSA/IDEgOiAhdC5pbmNsdXNpdmUgJiYgZS5pbmNsdXNpdmUgPyAtMSA6IDA7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIE9iamVjdFZhbHVlIHJlcHJlc2VudHMgYSBNYXBWYWx1ZSBpbiB0aGUgRmlyZXN0b3JlIFByb3RvIGFuZCBvZmZlcnMgdGhlXG4gKiBhYmlsaXR5IHRvIGFkZCBhbmQgcmVtb3ZlIGZpZWxkcyAodmlhIHRoZSBPYmplY3RWYWx1ZUJ1aWxkZXIpLlxuICovIGNsYXNzIHVuIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0O1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgdW4oe1xuICAgICAgICAgICAgbWFwVmFsdWU6IHt9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvciBudWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggLSB0aGUgcGF0aCB0byBzZWFyY2hcbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgYXQgdGhlIHBhdGggb3IgbnVsbCBpZiB0aGUgcGF0aCBpcyBub3Qgc2V0LlxuICAgICAqLyAgICBmaWVsZCh0KSB7XG4gICAgICAgIGlmICh0LmlzRW1wdHkoKSkgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggLSAxOyArK24pIGlmIChlID0gKGUubWFwVmFsdWUuZmllbGRzIHx8IHt9KVt0LmdldChuKV0sIFxuICAgICAgICAgICAgIVplKGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBlID0gKGUubWFwVmFsdWUuZmllbGRzIHx8IHt9KVt0Lmxhc3RTZWdtZW50KCldLCBlIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmllbGQgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhdGggLSBUaGUgZmllbGQgcGF0aCB0byBzZXQuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKi8gICAgc2V0KHQsIGUpIHtcbiAgICAgICAgdGhpcy5nZXRGaWVsZHNNYXAodC5wb3BMYXN0KCkpW3QubGFzdFNlZ21lbnQoKV0gPSB0bihlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcHJvdmlkZWQgZmllbGRzIHRvIHRoZSBwcm92aWRlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtIEEgbWFwIG9mIGZpZWxkcyB0byB2YWx1ZXMgKG9yIG51bGwgZm9yIGRlbGV0ZXMpLlxuICAgICAqLyAgICBzZXRBbGwodCkge1xuICAgICAgICBsZXQgZSA9IGF0LmVtcHR5UGF0aCgpLCBuID0ge30sIHMgPSBbXTtcbiAgICAgICAgdC5mb3JFYWNoKCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlLmlzSW1tZWRpYXRlUGFyZW50T2YoaSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXQgdGhpcyBwYXJlbnQgbG9jYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRGaWVsZHNNYXAoZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseUNoYW5nZXModCwgbiwgcyksIG4gPSB7fSwgcyA9IFtdLCBlID0gaS5wb3BMYXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID8gbltpLmxhc3RTZWdtZW50KCldID0gdG4odCkgOiBzLnB1c2goaS5sYXN0U2VnbWVudCgpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRGaWVsZHNNYXAoZSk7XG4gICAgICAgIHRoaXMuYXBwbHlDaGFuZ2VzKGksIG4sIHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBmaWVsZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZXJlIGlzIG5vIGZpZWxkIGF0IHRoZVxuICAgICAqIHNwZWNpZmllZCBwYXRoLCBub3RoaW5nIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBmaWVsZCBwYXRoIHRvIHJlbW92ZS5cbiAgICAgKi8gICAgZGVsZXRlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZmllbGQodC5wb3BMYXN0KCkpO1xuICAgICAgICBaZShlKSAmJiBlLm1hcFZhbHVlLmZpZWxkcyAmJiBkZWxldGUgZS5tYXBWYWx1ZS5maWVsZHNbdC5sYXN0U2VnbWVudCgpXTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiBxZSh0aGlzLnZhbHVlLCB0LnZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwIHRoYXQgY29udGFpbnMgdGhlIGxlYWYgZWxlbWVudCBvZiBgcGF0aGAuIElmIHRoZSBwYXJlbnRcbiAgICAgKiBlbnRyeSBkb2VzIG5vdCB5ZXQgZXhpc3QsIG9yIGlmIGl0IGlzIG5vdCBhIG1hcCwgYSBuZXcgbWFwIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgKi8gICAgZ2V0RmllbGRzTWFwKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBlLm1hcFZhbHVlLmZpZWxkcyB8fCAoZS5tYXBWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZpZWxkczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgbGV0IHMgPSBlLm1hcFZhbHVlLmZpZWxkc1t0LmdldChuKV07XG4gICAgICAgICAgICBaZShzKSAmJiBzLm1hcFZhbHVlLmZpZWxkcyB8fCAocyA9IHtcbiAgICAgICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZS5tYXBWYWx1ZS5maWVsZHNbdC5nZXQobildID0gcyksIGUgPSBzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlLm1hcFZhbHVlLmZpZWxkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgYGZpZWxkc01hcGAgYnkgYWRkaW5nLCByZXBsYWNpbmcgb3IgZGVsZXRpbmcgdGhlIHNwZWNpZmllZFxuICAgICAqIGVudHJpZXMuXG4gICAgICovICAgIGFwcGx5Q2hhbmdlcyh0LCBlLCBuKSB7XG4gICAgICAgIGdlKGUsICgoZSwgbikgPT4gdFtlXSA9IG4pKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIG4pIGRlbGV0ZSB0W2VdO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB1bih0bih0aGlzLnZhbHVlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBGaWVsZE1hc2sgYnVpbHQgZnJvbSBhbGwgZmllbGRzIGluIGEgTWFwVmFsdWUuXG4gKi8gZnVuY3Rpb24gY24odCkge1xuICAgIGNvbnN0IGUgPSBbXTtcbiAgICByZXR1cm4gZ2UodC5maWVsZHMsICgodCwgbikgPT4ge1xuICAgICAgICBjb25zdCBzID0gbmV3IGF0KFsgdCBdKTtcbiAgICAgICAgaWYgKFplKG4pKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gY24obi5tYXBWYWx1ZSkuZmllbGRzO1xuICAgICAgICAgICAgaWYgKDAgPT09IHQubGVuZ3RoKSBcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSBlbXB0eSBtYXAgYnkgYWRkaW5nIGl0IHRvIHRoZSBGaWVsZE1hc2suXG4gICAgICAgICAgICBlLnB1c2gocyk7IGVsc2UgXG4gICAgICAgICAgICAvLyBGb3IgbmVzdGVkIGFuZCBub24tZW1wdHkgT2JqZWN0VmFsdWVzLCBhZGQgdGhlIEZpZWxkUGF0aCBvZiB0aGVcbiAgICAgICAgICAgIC8vIGxlYWYgbm9kZXMuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZS5wdXNoKHMuY2hpbGQobikpO1xuICAgICAgICB9IGVsc2UgXG4gICAgICAgIC8vIEZvciBuZXN0ZWQgYW5kIG5vbi1lbXB0eSBPYmplY3RWYWx1ZXMsIGFkZCB0aGUgRmllbGRQYXRoIG9mIHRoZSBsZWFmXG4gICAgICAgIC8vIG5vZGVzLlxuICAgICAgICBlLnB1c2gocyk7XG4gICAgfSkpLCBuZXcgUmUoZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBkb2N1bWVudCBpbiBGaXJlc3RvcmUgd2l0aCBhIGtleSwgdmVyc2lvbiwgZGF0YSBhbmQgd2hldGhlciBpdFxuICogaGFzIGxvY2FsIG11dGF0aW9ucyBhcHBsaWVkIHRvIGl0LlxuICpcbiAqIERvY3VtZW50cyBjYW4gdHJhbnNpdGlvbiBiZXR3ZWVuIHN0YXRlcyB2aWEgYGNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQoKWAsXG4gKiBgY29udmVydFRvTm9Eb2N1bWVudCgpYCBhbmQgYGNvbnZlcnRUb1Vua25vd25Eb2N1bWVudCgpYC4gSWYgYSBkb2N1bWVudCBkb2VzXG4gKiBub3QgdHJhbnNpdGlvbiB0byBvbmUgb2YgdGhlc2Ugc3RhdGVzIGV2ZW4gYWZ0ZXIgYWxsIG11dGF0aW9ucyBoYXZlIGJlZW5cbiAqIGFwcGxpZWQsIGBpc1ZhbGlkRG9jdW1lbnQoKWAgcmV0dXJucyBmYWxzZSBhbmQgdGhlIGRvY3VtZW50IHNob3VsZCBiZSByZW1vdmVkXG4gKiBmcm9tIGFsbCB2aWV3cy5cbiAqLyBjbGFzcyBhbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgciwgbykge1xuICAgICAgICB0aGlzLmtleSA9IHQsIHRoaXMuZG9jdW1lbnRUeXBlID0gZSwgdGhpcy52ZXJzaW9uID0gbiwgdGhpcy5yZWFkVGltZSA9IHMsIHRoaXMuY3JlYXRlVGltZSA9IGksIFxuICAgICAgICB0aGlzLmRhdGEgPSByLCB0aGlzLmRvY3VtZW50U3RhdGUgPSBvO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCBubyBrbm93biB2ZXJzaW9uIG9yIGRhdGEsIGJ1dCB3aGljaCBjYW4gc2VydmUgYXNcbiAgICAgKiBiYXNlIGRvY3VtZW50IGZvciBtdXRhdGlvbnMuXG4gICAgICovICAgIHN0YXRpYyBuZXdJbnZhbGlkRG9jdW1lbnQodCkge1xuICAgICAgICByZXR1cm4gbmV3IGFuKHQsIDAgLyogRG9jdW1lbnRUeXBlLklOVkFMSUQgKi8gLCBcbiAgICAgICAgLyogdmVyc2lvbiAqLyBydC5taW4oKSwgXG4gICAgICAgIC8qIHJlYWRUaW1lICovIHJ0Lm1pbigpLCBcbiAgICAgICAgLyogY3JlYXRlVGltZSAqLyBydC5taW4oKSwgdW4uZW1wdHkoKSwgMCAvKiBEb2N1bWVudFN0YXRlLlNZTkNFRCAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdGhhdCBpcyBrbm93biB0byBleGlzdCB3aXRoIHRoZSBnaXZlbiBkYXRhIGF0IHRoZVxuICAgICAqIGdpdmVuIHZlcnNpb24uXG4gICAgICovICAgIHN0YXRpYyBuZXdGb3VuZERvY3VtZW50KHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhbih0LCAxIC8qIERvY3VtZW50VHlwZS5GT1VORF9ET0NVTUVOVCAqLyAsIFxuICAgICAgICAvKiB2ZXJzaW9uICovIGUsIFxuICAgICAgICAvKiByZWFkVGltZSAqLyBydC5taW4oKSwgXG4gICAgICAgIC8qIGNyZWF0ZVRpbWUgKi8gbiwgcywgMCAvKiBEb2N1bWVudFN0YXRlLlNZTkNFRCAqLyk7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHRoYXQgaXMga25vd24gdG8gbm90IGV4aXN0IGF0IHRoZSBnaXZlbiB2ZXJzaW9uLiAqLyAgICBzdGF0aWMgbmV3Tm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgYW4odCwgMiAvKiBEb2N1bWVudFR5cGUuTk9fRE9DVU1FTlQgKi8gLCBcbiAgICAgICAgLyogdmVyc2lvbiAqLyBlLCBcbiAgICAgICAgLyogcmVhZFRpbWUgKi8gcnQubWluKCksIFxuICAgICAgICAvKiBjcmVhdGVUaW1lICovIHJ0Lm1pbigpLCB1bi5lbXB0eSgpLCAwIC8qIERvY3VtZW50U3RhdGUuU1lOQ0VEICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB0aGF0IGlzIGtub3duIHRvIGV4aXN0IGF0IHRoZSBnaXZlbiB2ZXJzaW9uIGJ1dFxuICAgICAqIHdob3NlIGRhdGEgaXMgbm90IGtub3duIChlLmcuIGEgZG9jdW1lbnQgdGhhdCB3YXMgdXBkYXRlZCB3aXRob3V0IGEga25vd25cbiAgICAgKiBiYXNlIGRvY3VtZW50KS5cbiAgICAgKi8gICAgc3RhdGljIG5ld1Vua25vd25Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgYW4odCwgMyAvKiBEb2N1bWVudFR5cGUuVU5LTk9XTl9ET0NVTUVOVCAqLyAsIFxuICAgICAgICAvKiB2ZXJzaW9uICovIGUsIFxuICAgICAgICAvKiByZWFkVGltZSAqLyBydC5taW4oKSwgXG4gICAgICAgIC8qIGNyZWF0ZVRpbWUgKi8gcnQubWluKCksIHVuLmVtcHR5KCksIDIgLyogRG9jdW1lbnRTdGF0ZS5IQVNfQ09NTUlUVEVEX01VVEFUSU9OUyAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGRvY3VtZW50IHR5cGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBleGlzdHMgYW5kIHRoYXQgaXRzIHZlcnNpb25cbiAgICAgKiBhbmQgZGF0YSBhcmUga25vd24uXG4gICAgICovICAgIGNvbnZlcnRUb0ZvdW5kRG9jdW1lbnQodCwgZSkge1xuICAgICAgICAvLyBJZiBhIGRvY3VtZW50IGlzIHN3aXRjaGluZyBzdGF0ZSBmcm9tIGJlaW5nIGFuIGludmFsaWQgb3IgZGVsZXRlZFxuICAgICAgICAvLyBkb2N1bWVudCB0byBhIHZhbGlkIChGT1VORF9ET0NVTUVOVCkgZG9jdW1lbnQsIGVpdGhlciBkdWUgdG8gcmVjZWl2aW5nIGFuXG4gICAgICAgIC8vIHVwZGF0ZSBmcm9tIFdhdGNoIG9yIGR1ZSB0byBhcHBseWluZyBhIGxvY2FsIHNldCBtdXRhdGlvbiBvbiB0b3BcbiAgICAgICAgLy8gb2YgYSBkZWxldGVkIGRvY3VtZW50LCBvdXIgYmVzdCBndWVzcyBhYm91dCBpdHMgY3JlYXRlVGltZSB3b3VsZCBiZSB0aGVcbiAgICAgICAgLy8gdmVyc2lvbiBhdCB3aGljaCB0aGUgZG9jdW1lbnQgdHJhbnNpdGlvbmVkIHRvIGEgRk9VTkRfRE9DVU1FTlQuXG4gICAgICAgIHJldHVybiAhdGhpcy5jcmVhdGVUaW1lLmlzRXF1YWwocnQubWluKCkpIHx8IDIgLyogRG9jdW1lbnRUeXBlLk5PX0RPQ1VNRU5UICovICE9PSB0aGlzLmRvY3VtZW50VHlwZSAmJiAwIC8qIERvY3VtZW50VHlwZS5JTlZBTElEICovICE9PSB0aGlzLmRvY3VtZW50VHlwZSB8fCAodGhpcy5jcmVhdGVUaW1lID0gdCksIFxuICAgICAgICB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLmRvY3VtZW50VHlwZSA9IDEgLyogRG9jdW1lbnRUeXBlLkZPVU5EX0RPQ1VNRU5UICovICwgdGhpcy5kYXRhID0gZSwgXG4gICAgICAgIHRoaXMuZG9jdW1lbnRTdGF0ZSA9IDAgLyogRG9jdW1lbnRTdGF0ZS5TWU5DRUQgKi8gLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBkb2N1bWVudCB0eXBlIHRvIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndCBleGlzdCBhdCB0aGUgZ2l2ZW5cbiAgICAgKiB2ZXJzaW9uLlxuICAgICAqLyAgICBjb252ZXJ0VG9Ob0RvY3VtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbiA9IHQsIHRoaXMuZG9jdW1lbnRUeXBlID0gMiAvKiBEb2N1bWVudFR5cGUuTk9fRE9DVU1FTlQgKi8gLCBcbiAgICAgICAgdGhpcy5kYXRhID0gdW4uZW1wdHkoKSwgdGhpcy5kb2N1bWVudFN0YXRlID0gMCAvKiBEb2N1bWVudFN0YXRlLlNZTkNFRCAqLyAsIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGRvY3VtZW50IHR5cGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBleGlzdHMgYXQgYSBnaXZlbiB2ZXJzaW9uIGJ1dFxuICAgICAqIHRoYXQgaXRzIGRhdGEgaXMgbm90IGtub3duIChlLmcuIGEgZG9jdW1lbnQgdGhhdCB3YXMgdXBkYXRlZCB3aXRob3V0IGEga25vd25cbiAgICAgKiBiYXNlIGRvY3VtZW50KS5cbiAgICAgKi8gICAgY29udmVydFRvVW5rbm93bkRvY3VtZW50KHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbiA9IHQsIHRoaXMuZG9jdW1lbnRUeXBlID0gMyAvKiBEb2N1bWVudFR5cGUuVU5LTk9XTl9ET0NVTUVOVCAqLyAsIFxuICAgICAgICB0aGlzLmRhdGEgPSB1bi5lbXB0eSgpLCB0aGlzLmRvY3VtZW50U3RhdGUgPSAyIC8qIERvY3VtZW50U3RhdGUuSEFTX0NPTU1JVFRFRF9NVVRBVElPTlMgKi8gLCBcbiAgICAgICAgdGhpcztcbiAgICB9XG4gICAgc2V0SGFzQ29tbWl0dGVkTXV0YXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFN0YXRlID0gMiAvKiBEb2N1bWVudFN0YXRlLkhBU19DT01NSVRURURfTVVUQVRJT05TICovICwgdGhpcztcbiAgICB9XG4gICAgc2V0SGFzTG9jYWxNdXRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50U3RhdGUgPSAxIC8qIERvY3VtZW50U3RhdGUuSEFTX0xPQ0FMX01VVEFUSU9OUyAqLyAsIHRoaXMudmVyc2lvbiA9IHJ0Lm1pbigpLCBcbiAgICAgICAgdGhpcztcbiAgICB9XG4gICAgc2V0UmVhZFRpbWUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGltZSA9IHQsIHRoaXM7XG4gICAgfVxuICAgIGdldCBoYXNMb2NhbE11dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIDEgLyogRG9jdW1lbnRTdGF0ZS5IQVNfTE9DQUxfTVVUQVRJT05TICovID09PSB0aGlzLmRvY3VtZW50U3RhdGU7XG4gICAgfVxuICAgIGdldCBoYXNDb21taXR0ZWRNdXRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIERvY3VtZW50U3RhdGUuSEFTX0NPTU1JVFRFRF9NVVRBVElPTlMgKi8gPT09IHRoaXMuZG9jdW1lbnRTdGF0ZTtcbiAgICB9XG4gICAgZ2V0IGhhc1BlbmRpbmdXcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0xvY2FsTXV0YXRpb25zIHx8IHRoaXMuaGFzQ29tbWl0dGVkTXV0YXRpb25zO1xuICAgIH1cbiAgICBpc1ZhbGlkRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAwIC8qIERvY3VtZW50VHlwZS5JTlZBTElEICovICE9PSB0aGlzLmRvY3VtZW50VHlwZTtcbiAgICB9XG4gICAgaXNGb3VuZERvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4gMSAvKiBEb2N1bWVudFR5cGUuRk9VTkRfRE9DVU1FTlQgKi8gPT09IHRoaXMuZG9jdW1lbnRUeXBlO1xuICAgIH1cbiAgICBpc05vRG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiAyIC8qIERvY3VtZW50VHlwZS5OT19ET0NVTUVOVCAqLyA9PT0gdGhpcy5kb2N1bWVudFR5cGU7XG4gICAgfVxuICAgIGlzVW5rbm93bkRvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4gMyAvKiBEb2N1bWVudFR5cGUuVU5LTk9XTl9ET0NVTUVOVCAqLyA9PT0gdGhpcy5kb2N1bWVudFR5cGU7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGFuICYmIHRoaXMua2V5LmlzRXF1YWwodC5rZXkpICYmIHRoaXMudmVyc2lvbi5pc0VxdWFsKHQudmVyc2lvbikgJiYgdGhpcy5kb2N1bWVudFR5cGUgPT09IHQuZG9jdW1lbnRUeXBlICYmIHRoaXMuZG9jdW1lbnRTdGF0ZSA9PT0gdC5kb2N1bWVudFN0YXRlICYmIHRoaXMuZGF0YS5pc0VxdWFsKHQuZGF0YSk7XG4gICAgfVxuICAgIG11dGFibGVDb3B5KCkge1xuICAgICAgICByZXR1cm4gbmV3IGFuKHRoaXMua2V5LCB0aGlzLmRvY3VtZW50VHlwZSwgdGhpcy52ZXJzaW9uLCB0aGlzLnJlYWRUaW1lLCB0aGlzLmNyZWF0ZVRpbWUsIHRoaXMuZGF0YS5jbG9uZSgpLCB0aGlzLmRvY3VtZW50U3RhdGUpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBEb2N1bWVudCgke3RoaXMua2V5fSwgJHt0aGlzLnZlcnNpb259LCAke0pTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS52YWx1ZSl9LCB7Y3JlYXRlVGltZTogJHt0aGlzLmNyZWF0ZVRpbWV9fSksIHtkb2N1bWVudFR5cGU6ICR7dGhpcy5kb2N1bWVudFR5cGV9fSksIHtkb2N1bWVudFN0YXRlOiAke3RoaXMuZG9jdW1lbnRTdGF0ZX19KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHRoZSB2YWx1ZSBmb3IgZmllbGQgYGZpZWxkYCBpbiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiBUaHJvd3MgaWZcbiAqIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBpbiBib3RoIGRvY3VtZW50cy5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhIGJvdW5kIG9mIGEgcXVlcnkuXG4gKlxuICogVGhlIGJvdW5kIGlzIHNwZWNpZmllZCB3aXRoIHRoZSBnaXZlbiBjb21wb25lbnRzIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIGFuZFxuICogd2hldGhlciBpdCdzIGp1c3QgYmVmb3JlIG9yIGp1c3QgYWZ0ZXIgdGhlIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB3aGF0ZXZlciB0aGVcbiAqIHF1ZXJ5IG9yZGVyIGlzKS5cbiAqXG4gKiBUaGUgcG9zaXRpb24gcmVwcmVzZW50cyBhIGxvZ2ljYWwgaW5kZXggcG9zaXRpb24gZm9yIGEgcXVlcnkuIEl0J3MgYSBwcmVmaXhcbiAqIG9mIHZhbHVlcyBmb3IgdGhlIChwb3RlbnRpYWxseSBpbXBsaWNpdCkgb3JkZXIgYnkgY2xhdXNlcyBvZiBhIHF1ZXJ5LlxuICpcbiAqIEJvdW5kIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkb2N1bWVudCBjb21lcyBiZWZvcmUgb3JcbiAqIGFmdGVyIGEgYm91bmQuIFRoaXMgaXMgaW5mbHVlbmNlZCBieSB3aGV0aGVyIHRoZSBwb3NpdGlvbiBpcyBqdXN0IGJlZm9yZSBvclxuICoganVzdCBhZnRlciB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICovXG5jbGFzcyBobiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdCwgdGhpcy5pbmNsdXNpdmUgPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbG4odCwgZSwgbikge1xuICAgIGxldCBzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQucG9zaXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgciA9IGVbaV0sIG8gPSB0LnBvc2l0aW9uW2ldO1xuICAgICAgICBpZiAoci5maWVsZC5pc0tleUZpZWxkKCkpIHMgPSBodC5jb21wYXJhdG9yKGh0LmZyb21OYW1lKG8ucmVmZXJlbmNlVmFsdWUpLCBuLmtleSk7IGVsc2Uge1xuICAgICAgICAgICAgcyA9IEtlKG8sIG4uZGF0YS5maWVsZChyLmZpZWxkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiZGVzY1wiIC8qIERpcmVjdGlvbi5ERVNDRU5ESU5HICovID09PSByLmRpciAmJiAocyAqPSAtMSksIDAgIT09IHMpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBkb2N1bWVudCBzb3J0cyBhZnRlciBhIGJvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBzb3J0XG4gKiBvcmRlci5cbiAqLyBmdW5jdGlvbiBmbih0LCBlKSB7XG4gICAgaWYgKG51bGwgPT09IHQpIHJldHVybiBudWxsID09PSBlO1xuICAgIGlmIChudWxsID09PSBlKSByZXR1cm4gITE7XG4gICAgaWYgKHQuaW5jbHVzaXZlICE9PSBlLmluY2x1c2l2ZSB8fCB0LnBvc2l0aW9uLmxlbmd0aCAhPT0gZS5wb3NpdGlvbi5sZW5ndGgpIHJldHVybiAhMTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQucG9zaXRpb24ubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgaWYgKCFxZSh0LnBvc2l0aW9uW25dLCBlLnBvc2l0aW9uW25dKSkgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXR1cm4gITA7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIG9yZGVyaW5nIG9uIGEgZmllbGQsIGluIHNvbWUgRGlyZWN0aW9uLiBEaXJlY3Rpb24gZGVmYXVsdHMgdG8gQVNDRU5ESU5HLlxuICovIGNsYXNzIGRuIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlID0gXCJhc2NcIiAvKiBEaXJlY3Rpb24uQVNDRU5ESU5HICovKSB7XG4gICAgICAgIHRoaXMuZmllbGQgPSB0LCB0aGlzLmRpciA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB3bih0LCBlKSB7XG4gICAgcmV0dXJuIHQuZGlyID09PSBlLmRpciAmJiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIF9uIHt9XG5cbmNsYXNzIG1uIGV4dGVuZHMgX24ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5maWVsZCA9IHQsIHRoaXMub3AgPSBlLCB0aGlzLnZhbHVlID0gbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZpbHRlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqLyAgICBzdGF0aWMgY3JlYXRlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHQuaXNLZXlGaWVsZCgpID8gXCJpblwiIC8qIE9wZXJhdG9yLklOICovID09PSBlIHx8IFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovID09PSBlID8gdGhpcy5jcmVhdGVLZXlGaWVsZEluRmlsdGVyKHQsIGUsIG4pIDogbmV3IFBuKHQsIGUsIG4pIDogXCJhcnJheS1jb250YWluc1wiIC8qIE9wZXJhdG9yLkFSUkFZX0NPTlRBSU5TICovID09PSBlID8gbmV3IERuKHQsIG4pIDogXCJpblwiIC8qIE9wZXJhdG9yLklOICovID09PSBlID8gbmV3IENuKHQsIG4pIDogXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gPT09IGUgPyBuZXcgeG4odCwgbikgOiBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIE9wZXJhdG9yLkFSUkFZX0NPTlRBSU5TX0FOWSAqLyA9PT0gZSA/IG5ldyBObih0LCBuKSA6IG5ldyBtbih0LCBlLCBuKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUtleUZpZWxkSW5GaWx0ZXIodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gXCJpblwiIC8qIE9wZXJhdG9yLklOICovID09PSBlID8gbmV3IGJuKHQsIG4pIDogbmV3IFZuKHQsIG4pO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZGF0YS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICAgICAgLy8gVHlwZXMgZG8gbm90IGhhdmUgdG8gbWF0Y2ggaW4gTk9UX0VRVUFMIGZpbHRlcnMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIT1cIiAvKiBPcGVyYXRvci5OT1RfRVFVQUwgKi8gPT09IHRoaXMub3AgPyBudWxsICE9PSBlICYmIHRoaXMubWF0Y2hlc0NvbXBhcmlzb24oS2UoZSwgdGhpcy52YWx1ZSkpIDogbnVsbCAhPT0gZSAmJiBMZSh0aGlzLnZhbHVlKSA9PT0gTGUoZSkgJiYgdGhpcy5tYXRjaGVzQ29tcGFyaXNvbihLZShlLCB0aGlzLnZhbHVlKSk7XG4gICAgICAgIC8vIE9ubHkgY29tcGFyZSB0eXBlcyB3aXRoIG1hdGNoaW5nIGJhY2tlbmQgb3JkZXIgKHN1Y2ggYXMgZG91YmxlIGFuZCBpbnQpLlxuICAgICAgICB9XG4gICAgbWF0Y2hlc0NvbXBhcmlzb24odCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMub3ApIHtcbiAgICAgICAgICBjYXNlIFwiPFwiIC8qIE9wZXJhdG9yLkxFU1NfVEhBTiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdCA8IDA7XG5cbiAgICAgICAgICBjYXNlIFwiPD1cIiAvKiBPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMDtcblxuICAgICAgICAgIGNhc2UgXCI9PVwiIC8qIE9wZXJhdG9yLkVRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiAwID09PSB0O1xuXG4gICAgICAgICAgY2FzZSBcIiE9XCIgLyogT3BlcmF0b3IuTk9UX0VRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiAwICE9PSB0O1xuXG4gICAgICAgICAgY2FzZSBcIj5cIiAvKiBPcGVyYXRvci5HUkVBVEVSX1RIQU4gKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQgPiAwO1xuXG4gICAgICAgICAgY2FzZSBcIj49XCIgLyogT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMICovIDpcbiAgICAgICAgICAgIHJldHVybiB0ID49IDA7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0luZXF1YWxpdHkoKSB7XG4gICAgICAgIHJldHVybiBbIFwiPFwiIC8qIE9wZXJhdG9yLkxFU1NfVEhBTiAqLyAsIFwiPD1cIiAvKiBPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwgKi8gLCBcIj5cIiAvKiBPcGVyYXRvci5HUkVBVEVSX1RIQU4gKi8gLCBcIj49XCIgLyogT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMICovICwgXCIhPVwiIC8qIE9wZXJhdG9yLk5PVF9FUVVBTCAqLyAsIFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovIF0uaW5kZXhPZih0aGlzLm9wKSA+PSAwO1xuICAgIH1cbiAgICBnZXRGbGF0dGVuZWRGaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gWyB0aGlzIF07XG4gICAgfVxuICAgIGdldEZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiBbIHRoaXMgXTtcbiAgICB9XG4gICAgZ2V0Rmlyc3RJbmVxdWFsaXR5RmllbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5lcXVhbGl0eSgpID8gdGhpcy5maWVsZCA6IG51bGw7XG4gICAgfVxufVxuXG5jbGFzcyBnbiBleHRlbmRzIF9uIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZmlsdGVycyA9IHQsIHRoaXMub3AgPSBlLCB0aGlzLmx0ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZpbHRlciBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqLyAgICBzdGF0aWMgY3JlYXRlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBnbih0LCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiB5bih0aGlzKSA/IHZvaWQgMCA9PT0gdGhpcy5maWx0ZXJzLmZpbmQoKGUgPT4gIWUubWF0Y2hlcyh0KSkpIDogdm9pZCAwICE9PSB0aGlzLmZpbHRlcnMuZmluZCgoZSA9PiBlLm1hdGNoZXModCkpKTtcbiAgICB9XG4gICAgZ2V0RmxhdHRlbmVkRmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMubHQgfHwgKHRoaXMubHQgPSB0aGlzLmZpbHRlcnMucmVkdWNlKCgodCwgZSkgPT4gdC5jb25jYXQoZS5nZXRGbGF0dGVuZWRGaWx0ZXJzKCkpKSwgW10pKSwgXG4gICAgICAgIHRoaXMubHQ7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBtdXRhYmxlIGNvcHkgb2YgYHRoaXMuZmlsdGVyc2BcbiAgICBnZXRGaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5maWx0ZXJzKTtcbiAgICB9XG4gICAgZ2V0Rmlyc3RJbmVxdWFsaXR5RmllbGQoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmZ0KCh0ID0+IHQuaXNJbmVxdWFsaXR5KCkpKTtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHQgPyB0LmZpZWxkIDogbnVsbDtcbiAgICB9XG4gICAgLy8gUGVyZm9ybXMgYSBkZXB0aC1maXJzdCBzZWFyY2ggdG8gZmluZCBhbmQgcmV0dXJuIHRoZSBmaXJzdCBGaWVsZEZpbHRlciBpbiB0aGUgY29tcG9zaXRlIGZpbHRlclxuICAgIC8vIHRoYXQgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUuIFJldHVybnMgYG51bGxgIGlmIG5vbmUgb2YgdGhlIEZpZWxkRmlsdGVycyBzYXRpc2Z5IHRoZVxuICAgIC8vIHByZWRpY2F0ZS5cbiAgICBmdCh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmdldEZsYXR0ZW5lZEZpbHRlcnMoKSkgaWYgKHQoZSkpIHJldHVybiBlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHluKHQpIHtcbiAgICByZXR1cm4gXCJhbmRcIiAvKiBDb21wb3NpdGVPcGVyYXRvci5BTkQgKi8gPT09IHQub3A7XG59XG5cbmZ1bmN0aW9uIHBuKHQpIHtcbiAgICByZXR1cm4gXCJvclwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLk9SICovID09PSB0Lm9wO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpbHRlciBpcyBhIGNvbmp1bmN0aW9uIG9mIGZpZWxkIGZpbHRlcnMgb25seS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG4gKi8gZnVuY3Rpb24gSW4odCkge1xuICAgIHJldHVybiBUbih0KSAmJiB5bih0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmaWx0ZXIgZG9lcyBub3QgY29udGFpbiBhbnkgY29tcG9zaXRlIGZpbHRlcnMuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIGZ1bmN0aW9uIFRuKHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5maWx0ZXJzKSBpZiAoZSBpbnN0YW5jZW9mIGduKSByZXR1cm4gITE7XG4gICAgcmV0dXJuICEwO1xufVxuXG5mdW5jdGlvbiBFbih0KSB7XG4gICAgaWYgKHQgaW5zdGFuY2VvZiBtbikgXG4gICAgLy8gVE9ETyhiLzI5MTgzMTY1KTogVGVjaG5pY2FsbHksIHRoaXMgd29uJ3QgYmUgdW5pcXVlIGlmIHR3byB2YWx1ZXMgaGF2ZVxuICAgIC8vIHRoZSBzYW1lIGRlc2NyaXB0aW9uLCBzdWNoIGFzIHRoZSBpbnQgMyBhbmQgdGhlIHN0cmluZyBcIjNcIi4gU28gd2Ugc2hvdWxkXG4gICAgLy8gYWRkIHRoZSB0eXBlcyBpbiBoZXJlIHNvbWVob3csIHRvby5cbiAgICByZXR1cm4gdC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSArIHQub3AudG9TdHJpbmcoKSArIFFlKHQudmFsdWUpO1xuICAgIGlmIChJbih0KSkgXG4gICAgLy8gT2xkZXIgU0RLIHZlcnNpb25zIHVzZSBhbiBpbXBsaWNpdCBBTkQgb3BlcmF0aW9uIGJldHdlZW4gdGhlaXIgZmlsdGVycy5cbiAgICAvLyBJbiB0aGUgbmV3IFNESyB2ZXJzaW9ucywgdGhlIGRldmVsb3BlciBtYXkgdXNlIGFuIGV4cGxpY2l0IEFORCBmaWx0ZXIuXG4gICAgLy8gVG8gc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIG9sZCB1c2FnZXMsIHdlIGFkZCBhIHNwZWNpYWwgY2FzZSB0byBlbnN1cmVcbiAgICAvLyB0aGUgY2Fub25pY2FsIElEIGZvciB0aGVzZSB0d28gYXJlIHRoZSBzYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAvLyBgY29sLndoZXJlRXF1YWxzKFwiYVwiLCAxKS53aGVyZUVxdWFscyhcImJcIiwgMilgIHNob3VsZCBoYXZlIHRoZSBzYW1lXG4gICAgLy8gY2Fub25pY2FsIElEIGFzIGBjb2wud2hlcmUoYW5kKGVxdWFscyhcImFcIiwxKSwgZXF1YWxzKFwiYlwiLDIpKSlgLlxuICAgIHJldHVybiB0LmZpbHRlcnMubWFwKCh0ID0+IEVuKHQpKSkuam9pbihcIixcIik7XG4gICAge1xuICAgICAgICAvLyBmaWx0ZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVGaWx0ZXJcbiAgICAgICAgY29uc3QgZSA9IHQuZmlsdGVycy5tYXAoKHQgPT4gRW4odCkpKS5qb2luKFwiLFwiKTtcbiAgICAgICAgcmV0dXJuIGAke3Qub3B9KCR7ZX0pYDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIEFuKHQsIGUpIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIG1uID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIG1uICYmIHQub3AgPT09IGUub3AgJiYgdC5maWVsZC5pc0VxdWFsKGUuZmllbGQpICYmIHFlKHQudmFsdWUsIGUudmFsdWUpO1xuICAgIH0odCwgZSkgOiB0IGluc3RhbmNlb2YgZ24gPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgZ24gJiYgdC5vcCA9PT0gZS5vcCAmJiB0LmZpbHRlcnMubGVuZ3RoID09PSBlLmZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5maWx0ZXJzLnJlZHVjZSgoKHQsIG4sIHMpID0+IHQgJiYgQW4obiwgZS5maWx0ZXJzW3NdKSksICEwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyBhIG5ldyBjb21wb3NpdGUgZmlsdGVyIHRoYXQgY29udGFpbnMgYWxsIGZpbHRlciBmcm9tXG4gKiBgY29tcG9zaXRlRmlsdGVyYCBwbHVzIGFsbCB0aGUgZ2l2ZW4gZmlsdGVycyBpbiBgb3RoZXJGaWx0ZXJzYC5cbiAqLyAodCwgZSkgOiB2b2lkIE8oKTtcbn1cblxuZnVuY3Rpb24gdm4odCwgZSkge1xuICAgIGNvbnN0IG4gPSB0LmZpbHRlcnMuY29uY2F0KGUpO1xuICAgIHJldHVybiBnbi5jcmVhdGUobiwgdC5vcCk7XG59XG5cbi8qKiBSZXR1cm5zIGEgZGVidWcgZGVzY3JpcHRpb24gZm9yIGBmaWx0ZXJgLiAqLyBmdW5jdGlvbiBSbih0KSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBtbiA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIGAke3QuZmllbGQuY2Fub25pY2FsU3RyaW5nKCl9ICR7dC5vcH0gJHtRZSh0LnZhbHVlKX1gO1xuICAgIH1cbiAgICAvKiogRmlsdGVyIHRoYXQgbWF0Y2hlcyBvbiBrZXkgZmllbGRzIChpLmUuICdfX25hbWVfXycpLiAqLyAodCkgOiB0IGluc3RhbmNlb2YgZ24gPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiB0Lm9wLnRvU3RyaW5nKCkgKyBcIiB7XCIgKyB0LmdldEZpbHRlcnMoKS5tYXAoUm4pLmpvaW4oXCIgLFwiKSArIFwifVwiO1xuICAgIH0odCkgOiBcIkZpbHRlclwiO1xufVxuXG5jbGFzcyBQbiBleHRlbmRzIG1uIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKHQsIGUsIG4pLCB0aGlzLmtleSA9IGh0LmZyb21OYW1lKG4ucmVmZXJlbmNlVmFsdWUpO1xuICAgIH1cbiAgICBtYXRjaGVzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IGh0LmNvbXBhcmF0b3IodC5rZXksIHRoaXMua2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlc0NvbXBhcmlzb24oZSk7XG4gICAgfVxufVxuXG4vKiogRmlsdGVyIHRoYXQgbWF0Y2hlcyBvbiBrZXkgZmllbGRzIHdpdGhpbiBhbiBhcnJheS4gKi8gY2xhc3MgYm4gZXh0ZW5kcyBtbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImluXCIgLyogT3BlcmF0b3IuSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0gU24oXCJpblwiIC8qIE9wZXJhdG9yLklOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuLyoqIEZpbHRlciB0aGF0IG1hdGNoZXMgb24ga2V5IGZpZWxkcyBub3QgcHJlc2VudCB3aXRoaW4gYW4gYXJyYXkuICovIGNsYXNzIFZuIGV4dGVuZHMgbW4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gLCBlKSwgdGhpcy5rZXlzID0gU24oXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5rZXlzLnNvbWUoKGUgPT4gZS5pc0VxdWFsKHQua2V5KSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gU24odCwgZSkge1xuICAgIHZhciBuO1xuICAgIHJldHVybiAoKG51bGwgPT09IChuID0gZS5hcnJheVZhbHVlKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnZhbHVlcykgfHwgW10pLm1hcCgodCA9PiBodC5mcm9tTmFtZSh0LnJlZmVyZW5jZVZhbHVlKSkpO1xufVxuXG4vKiogQSBGaWx0ZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBhcnJheS1jb250YWlucyBvcGVyYXRvci4gKi8gY2xhc3MgRG4gZXh0ZW5kcyBtbiB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0LCBcImFycmF5LWNvbnRhaW5zXCIgLyogT3BlcmF0b3IuQVJSQVlfQ09OVEFJTlMgKi8gLCBlKTtcbiAgICB9XG4gICAgbWF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBKZShlKSAmJiBVZShlLmFycmF5VmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgSU4gb3BlcmF0b3IuICovIGNsYXNzIENuIGV4dGVuZHMgbW4ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgXCJpblwiIC8qIE9wZXJhdG9yLklOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiBVZSh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgbm90LWluIG9wZXJhdG9yLiAqLyBjbGFzcyB4biBleHRlbmRzIG1uIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBpZiAoVWUodGhpcy52YWx1ZS5hcnJheVZhbHVlLCB7XG4gICAgICAgICAgICBudWxsVmFsdWU6IFwiTlVMTF9WQUxVRVwiXG4gICAgICAgIH0pKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0LmRhdGEuZmllbGQodGhpcy5maWVsZCk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICFVZSh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIGUpO1xuICAgIH1cbn1cblxuLyoqIEEgRmlsdGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYXJyYXktY29udGFpbnMtYW55IG9wZXJhdG9yLiAqLyBjbGFzcyBObiBleHRlbmRzIG1uIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogT3BlcmF0b3IuQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgZSk7XG4gICAgfVxuICAgIG1hdGNoZXModCkge1xuICAgICAgICBjb25zdCBlID0gdC5kYXRhLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgICAgICByZXR1cm4gISghSmUoZSkgfHwgIWUuYXJyYXlWYWx1ZS52YWx1ZXMpICYmIGUuYXJyYXlWYWx1ZS52YWx1ZXMuc29tZSgodCA9PiBVZSh0aGlzLnZhbHVlLmFycmF5VmFsdWUsIHQpKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZ1xuY2xhc3Mga24ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUgPSBudWxsLCBuID0gW10sIHMgPSBbXSwgaSA9IG51bGwsIHIgPSBudWxsLCBvID0gbnVsbCkge1xuICAgICAgICB0aGlzLnBhdGggPSB0LCB0aGlzLmNvbGxlY3Rpb25Hcm91cCA9IGUsIHRoaXMub3JkZXJCeSA9IG4sIHRoaXMuZmlsdGVycyA9IHMsIHRoaXMubGltaXQgPSBpLCBcbiAgICAgICAgdGhpcy5zdGFydEF0ID0gciwgdGhpcy5lbmRBdCA9IG8sIHRoaXMuZHQgPSBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIFRhcmdldCB3aXRoIGEgcGF0aCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBjb25zdHJhaW50cy5cbiAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gKlxuICogTk9URTogeW91IHNob3VsZCBhbHdheXMgY29uc3RydWN0IGBUYXJnZXRgIGZyb20gYFF1ZXJ5LnRvVGFyZ2V0YCBpbnN0ZWFkIG9mXG4gKiB1c2luZyB0aGlzIGZhY3RvcnkgbWV0aG9kLCBiZWNhdXNlIGBRdWVyeWAgcHJvdmlkZXMgYW4gaW1wbGljaXQgYG9yZGVyQnlgXG4gKiBwcm9wZXJ0eS5cbiAqLyBmdW5jdGlvbiBNbih0LCBlID0gbnVsbCwgbiA9IFtdLCBzID0gW10sIGkgPSBudWxsLCByID0gbnVsbCwgbyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IGtuKHQsIGUsIG4sIHMsIGksIHIsIG8pO1xufVxuXG5mdW5jdGlvbiAkbih0KSB7XG4gICAgY29uc3QgZSA9IEwodCk7XG4gICAgaWYgKG51bGwgPT09IGUuZHQpIHtcbiAgICAgICAgbGV0IHQgPSBlLnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgICAgIG51bGwgIT09IGUuY29sbGVjdGlvbkdyb3VwICYmICh0ICs9IFwifGNnOlwiICsgZS5jb2xsZWN0aW9uR3JvdXApLCB0ICs9IFwifGY6XCIsIHQgKz0gZS5maWx0ZXJzLm1hcCgodCA9PiBFbih0KSkpLmpvaW4oXCIsXCIpLCBcbiAgICAgICAgdCArPSBcInxvYjpcIiwgdCArPSBlLm9yZGVyQnkubWFwKCh0ID0+IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oYi8yOTE4MzE2NSk6IE1ha2UgdGhpcyBjb2xsaXNpb24gcm9idXN0LlxuICAgICAgICAgICAgcmV0dXJuIHQuZmllbGQuY2Fub25pY2FsU3RyaW5nKCkgKyB0LmRpcjtcbiAgICAgICAgfSh0KSkpLmpvaW4oXCIsXCIpLCBGdChlLmxpbWl0KSB8fCAodCArPSBcInxsOlwiLCB0ICs9IGUubGltaXQpLCBlLnN0YXJ0QXQgJiYgKHQgKz0gXCJ8bGI6XCIsIFxuICAgICAgICB0ICs9IGUuc3RhcnRBdC5pbmNsdXNpdmUgPyBcImI6XCIgOiBcImE6XCIsIHQgKz0gZS5zdGFydEF0LnBvc2l0aW9uLm1hcCgodCA9PiBRZSh0KSkpLmpvaW4oXCIsXCIpKSwgXG4gICAgICAgIGUuZW5kQXQgJiYgKHQgKz0gXCJ8dWI6XCIsIHQgKz0gZS5lbmRBdC5pbmNsdXNpdmUgPyBcImE6XCIgOiBcImI6XCIsIHQgKz0gZS5lbmRBdC5wb3NpdGlvbi5tYXAoKHQgPT4gUWUodCkpKS5qb2luKFwiLFwiKSksIFxuICAgICAgICBlLmR0ID0gdDtcbiAgICB9XG4gICAgcmV0dXJuIGUuZHQ7XG59XG5cbmZ1bmN0aW9uIE9uKHQsIGUpIHtcbiAgICBpZiAodC5saW1pdCAhPT0gZS5saW1pdCkgcmV0dXJuICExO1xuICAgIGlmICh0Lm9yZGVyQnkubGVuZ3RoICE9PSBlLm9yZGVyQnkubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lm9yZGVyQnkubGVuZ3RoOyBuKyspIGlmICghd24odC5vcmRlckJ5W25dLCBlLm9yZGVyQnlbbl0pKSByZXR1cm4gITE7XG4gICAgaWYgKHQuZmlsdGVycy5sZW5ndGggIT09IGUuZmlsdGVycy5sZW5ndGgpIHJldHVybiAhMTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQuZmlsdGVycy5sZW5ndGg7IG4rKykgaWYgKCFBbih0LmZpbHRlcnNbbl0sIGUuZmlsdGVyc1tuXSkpIHJldHVybiAhMTtcbiAgICByZXR1cm4gdC5jb2xsZWN0aW9uR3JvdXAgPT09IGUuY29sbGVjdGlvbkdyb3VwICYmICghIXQucGF0aC5pc0VxdWFsKGUucGF0aCkgJiYgKCEhZm4odC5zdGFydEF0LCBlLnN0YXJ0QXQpICYmIGZuKHQuZW5kQXQsIGUuZW5kQXQpKSk7XG59XG5cbmZ1bmN0aW9uIEZuKHQpIHtcbiAgICByZXR1cm4gaHQuaXNEb2N1bWVudEtleSh0LnBhdGgpICYmIG51bGwgPT09IHQuY29sbGVjdGlvbkdyb3VwICYmIDAgPT09IHQuZmlsdGVycy5sZW5ndGg7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBmaWVsZCBmaWx0ZXJzIHRoYXQgdGFyZ2V0IHRoZSBnaXZlbiBmaWVsZCBwYXRoLiAqLyBmdW5jdGlvbiBCbih0LCBlKSB7XG4gICAgcmV0dXJuIHQuZmlsdGVycy5maWx0ZXIoKHQgPT4gdCBpbnN0YW5jZW9mIG1uICYmIHQuZmllbGQuaXNFcXVhbChlKSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlcyB0aGF0IGFyZSB1c2VkIGluIEFSUkFZX0NPTlRBSU5TIG9yIEFSUkFZX0NPTlRBSU5TX0FOWVxuICogZmlsdGVycy4gUmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggZmlsdGVycy5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB1c2UgYXMgdGhlIGxvd2VyIGJvdW5kIGZvciBhc2NlbmRpbmcgaW5kZXggc2VnbWVudCBhdFxuICogdGhlIHByb3ZpZGVkIGBmaWVsZFBhdGhgIChvciB0aGUgdXBwZXIgYm91bmQgZm9yIGFuIGRlc2NlbmRpbmcgc2VnbWVudCkuXG4gKi9cbmZ1bmN0aW9uIExuKHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IEJlLCBpID0gITA7XG4gICAgLy8gUHJvY2VzcyBhbGwgZmlsdGVycyB0byBmaW5kIGEgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZpZWxkIHNlZ21lbnRcbiAgICBmb3IgKGNvbnN0IG4gb2YgQm4odCwgZSkpIHtcbiAgICAgICAgbGV0IHQgPSBCZSwgZSA9ICEwO1xuICAgICAgICBzd2l0Y2ggKG4ub3ApIHtcbiAgICAgICAgICBjYXNlIFwiPFwiIC8qIE9wZXJhdG9yLkxFU1NfVEhBTiAqLyA6XG4gICAgICAgICAgY2FzZSBcIjw9XCIgLyogT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMICovIDpcbiAgICAgICAgICAgIHQgPSBubihuLnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIj09XCIgLyogT3BlcmF0b3IuRVFVQUwgKi8gOlxuICAgICAgICAgIGNhc2UgXCJpblwiIC8qIE9wZXJhdG9yLklOICovIDpcbiAgICAgICAgICBjYXNlIFwiPj1cIiAvKiBPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgdCA9IG4udmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCI+XCIgLyogT3BlcmF0b3IuR1JFQVRFUl9USEFOICovIDpcbiAgICAgICAgICAgIHQgPSBuLnZhbHVlLCBlID0gITE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE9wZXJhdG9yLk5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgY2FzZSBcIm5vdC1pblwiIC8qIE9wZXJhdG9yLk5PVF9JTiAqLyA6XG4gICAgICAgICAgICB0ID0gQmU7XG4gLy8gUmVtYWluaW5nIGZpbHRlcnMgY2Fubm90IGJlIHVzZWQgYXMgbG93ZXIgYm91bmRzLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcm4oe1xuICAgICAgICAgICAgdmFsdWU6IHMsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGlcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGVcbiAgICAgICAgfSkgPCAwICYmIChzID0gdCwgaSA9IGUpO1xuICAgIH1cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIGJvdW5kLCBjb21wYXJlIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgZXhpc3RpbmdcbiAgICAvLyByYW5nZSB0byBzZWUgaWYgd2UgY2FuIG5hcnJvdyB0aGUgc2NvcGUuXG4gICAgICAgIGlmIChudWxsICE9PSBuKSBmb3IgKGxldCByID0gMDsgciA8IHQub3JkZXJCeS5sZW5ndGg7ICsrcikge1xuICAgICAgICBpZiAodC5vcmRlckJ5W3JdLmZpZWxkLmlzRXF1YWwoZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuLnBvc2l0aW9uW3JdO1xuICAgICAgICAgICAgcm4oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogaVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogbi5pbmNsdXNpdmVcbiAgICAgICAgICAgIH0pIDwgMCAmJiAocyA9IHQsIGkgPSBuLmluY2x1c2l2ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogcyxcbiAgICAgICAgaW5jbHVzaXZlOiBpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB1c2UgYXMgdGhlIHVwcGVyIGJvdW5kIGZvciBhc2NlbmRpbmcgaW5kZXggc2VnbWVudCBhdFxuICogdGhlIHByb3ZpZGVkIGBmaWVsZFBhdGhgIChvciB0aGUgbG93ZXIgYm91bmQgZm9yIGEgZGVzY2VuZGluZyBzZWdtZW50KS5cbiAqLyBmdW5jdGlvbiBxbih0LCBlLCBuKSB7XG4gICAgbGV0IHMgPSBGZSwgaSA9ICEwO1xuICAgIC8vIFByb2Nlc3MgYWxsIGZpbHRlcnMgdG8gZmluZCBhIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZCBzZWdtZW50XG4gICAgZm9yIChjb25zdCBuIG9mIEJuKHQsIGUpKSB7XG4gICAgICAgIGxldCB0ID0gRmUsIGUgPSAhMDtcbiAgICAgICAgc3dpdGNoIChuLm9wKSB7XG4gICAgICAgICAgY2FzZSBcIj49XCIgLyogT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMICovIDpcbiAgICAgICAgICBjYXNlIFwiPlwiIC8qIE9wZXJhdG9yLkdSRUFURVJfVEhBTiAqLyA6XG4gICAgICAgICAgICB0ID0gc24obi52YWx1ZSksIGUgPSAhMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIj09XCIgLyogT3BlcmF0b3IuRVFVQUwgKi8gOlxuICAgICAgICAgIGNhc2UgXCJpblwiIC8qIE9wZXJhdG9yLklOICovIDpcbiAgICAgICAgICBjYXNlIFwiPD1cIiAvKiBPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwgKi8gOlxuICAgICAgICAgICAgdCA9IG4udmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCI8XCIgLyogT3BlcmF0b3IuTEVTU19USEFOICovIDpcbiAgICAgICAgICAgIHQgPSBuLnZhbHVlLCBlID0gITE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE9wZXJhdG9yLk5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgY2FzZSBcIm5vdC1pblwiIC8qIE9wZXJhdG9yLk5PVF9JTiAqLyA6XG4gICAgICAgICAgICB0ID0gRmU7XG4gLy8gUmVtYWluaW5nIGZpbHRlcnMgY2Fubm90IGJlIHVzZWQgYXMgdXBwZXIgYm91bmRzLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgb24oe1xuICAgICAgICAgICAgdmFsdWU6IHMsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGlcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGVcbiAgICAgICAgfSkgPiAwICYmIChzID0gdCwgaSA9IGUpO1xuICAgIH1cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIGJvdW5kLCBjb21wYXJlIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgZXhpc3RpbmdcbiAgICAvLyByYW5nZSB0byBzZWUgaWYgd2UgY2FuIG5hcnJvdyB0aGUgc2NvcGUuXG4gICAgICAgIGlmIChudWxsICE9PSBuKSBmb3IgKGxldCByID0gMDsgciA8IHQub3JkZXJCeS5sZW5ndGg7ICsrcikge1xuICAgICAgICBpZiAodC5vcmRlckJ5W3JdLmZpZWxkLmlzRXF1YWwoZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBuLnBvc2l0aW9uW3JdO1xuICAgICAgICAgICAgb24oe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBzLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogaVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogbi5pbmNsdXNpdmVcbiAgICAgICAgICAgIH0pID4gMCAmJiAocyA9IHQsIGkgPSBuLmluY2x1c2l2ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogcyxcbiAgICAgICAgaW5jbHVzaXZlOiBpXG4gICAgfTtcbn1cblxuLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWdtZW50cyBvZiBhIHBlcmZlY3QgaW5kZXggZm9yIHRoaXMgdGFyZ2V0LiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUXVlcnkgZW5jYXBzdWxhdGVzIGFsbCB0aGUgcXVlcnkgYXR0cmlidXRlcyB3ZSBzdXBwb3J0IGluIHRoZSBTREsuIEl0IGNhblxuICogYmUgcnVuIGFnYWluc3QgdGhlIExvY2FsU3RvcmUsIGFzIHdlbGwgYXMgYmUgY29udmVydGVkIHRvIGEgYFRhcmdldGAgdG9cbiAqIHF1ZXJ5IHRoZSBSZW1vdGVTdG9yZSByZXN1bHRzLlxuICpcbiAqIFZpc2libGUgZm9yIHRlc3RpbmcuXG4gKi9cbmNsYXNzIFVuIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIFF1ZXJ5IHdpdGggYSBwYXRoIGFuZCBvcHRpb25hbCBhZGRpdGlvbmFsIHF1ZXJ5IGNvbnN0cmFpbnRzLlxuICAgICAqIFBhdGggbXVzdCBjdXJyZW50bHkgYmUgZW1wdHkgaWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gZ3JvdXAgcXVlcnkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSA9IG51bGwsIG4gPSBbXSwgcyA9IFtdLCBpID0gbnVsbCwgciA9IFwiRlwiIC8qIExpbWl0VHlwZS5GaXJzdCAqLyAsIG8gPSBudWxsLCB1ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnBhdGggPSB0LCB0aGlzLmNvbGxlY3Rpb25Hcm91cCA9IGUsIHRoaXMuZXhwbGljaXRPcmRlckJ5ID0gbiwgdGhpcy5maWx0ZXJzID0gcywgXG4gICAgICAgIHRoaXMubGltaXQgPSBpLCB0aGlzLmxpbWl0VHlwZSA9IHIsIHRoaXMuc3RhcnRBdCA9IG8sIHRoaXMuZW5kQXQgPSB1LCB0aGlzLnd0ID0gbnVsbCwgXG4gICAgICAgIC8vIFRoZSBjb3JyZXNwb25kaW5nIGBUYXJnZXRgIG9mIHRoaXMgYFF1ZXJ5YCBpbnN0YW5jZS5cbiAgICAgICAgdGhpcy5fdCA9IG51bGwsIHRoaXMuc3RhcnRBdCwgdGhpcy5lbmRBdDtcbiAgICB9XG59XG5cbi8qKiBDcmVhdGVzIGEgbmV3IFF1ZXJ5IGluc3RhbmNlIHdpdGggdGhlIG9wdGlvbnMgcHJvdmlkZWQuICovIGZ1bmN0aW9uIEtuKHQsIGUsIG4sIHMsIGksIHIsIG8sIHUpIHtcbiAgICByZXR1cm4gbmV3IFVuKHQsIGUsIG4sIHMsIGksIHIsIG8sIHUpO1xufVxuXG4vKiogQ3JlYXRlcyBhIG5ldyBRdWVyeSBmb3IgYSBxdWVyeSB0aGF0IG1hdGNoZXMgYWxsIGRvY3VtZW50cyBhdCBgcGF0aGAgKi8gZnVuY3Rpb24gR24odCkge1xuICAgIHJldHVybiBuZXcgVW4odCk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYSBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJ5IGludG8gYSBjb2xsZWN0aW9uIHF1ZXJ5IGF0IGFcbiAqIHNwZWNpZmljIHBhdGguIFRoaXMgaXMgdXNlZCB3aGVuIGV4ZWN1dGluZyBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJpZXMsIHNpbmNlXG4gKiB3ZSBoYXZlIHRvIHNwbGl0IHRoZSBxdWVyeSBpbnRvIGEgc2V0IG9mIGNvbGxlY3Rpb24gcXVlcmllcyBhdCBtdWx0aXBsZVxuICogcGF0aHMuXG4gKi9cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcXVlcnkgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcXVlcnkgY29uc3RyYWludHMgdGhhdFxuICogY291bGQgcmVtb3ZlIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIFFuKHQpIHtcbiAgICByZXR1cm4gMCA9PT0gdC5maWx0ZXJzLmxlbmd0aCAmJiBudWxsID09PSB0LmxpbWl0ICYmIG51bGwgPT0gdC5zdGFydEF0ICYmIG51bGwgPT0gdC5lbmRBdCAmJiAoMCA9PT0gdC5leHBsaWNpdE9yZGVyQnkubGVuZ3RoIHx8IDEgPT09IHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCAmJiB0LmV4cGxpY2l0T3JkZXJCeVswXS5maWVsZC5pc0tleUZpZWxkKCkpO1xufVxuXG5mdW5jdGlvbiBqbih0KSB7XG4gICAgcmV0dXJuIHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCA+IDAgPyB0LmV4cGxpY2l0T3JkZXJCeVswXS5maWVsZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHpuKHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5maWx0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlLmdldEZpcnN0SW5lcXVhbGl0eUZpZWxkKCk7XG4gICAgICAgIGlmIChudWxsICE9PSB0KSByZXR1cm4gdDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBRdWVyeSBmb3IgYSBjb2xsZWN0aW9uIGdyb3VwIHF1ZXJ5IHRoYXQgbWF0Y2hlcyBhbGwgZG9jdW1lbnRzXG4gKiB3aXRoaW4gdGhlIHByb3ZpZGVkIGNvbGxlY3Rpb24gZ3JvdXAuXG4gKi9cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGEgY29sbGVjdGlvbiBncm91cCByYXRoZXIgdGhhbiBhIHNwZWNpZmljXG4gKiBjb2xsZWN0aW9uLlxuICovXG5mdW5jdGlvbiBXbih0KSB7XG4gICAgcmV0dXJuIG51bGwgIT09IHQuY29sbGVjdGlvbkdyb3VwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGltcGxpY2l0IG9yZGVyIGJ5IGNvbnN0cmFpbnQgdGhhdCBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIFF1ZXJ5LFxuICogd2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRlciBieSBjb25zdHJhaW50cyB0aGUgdXNlciBwcm92aWRlZCAoZS5nLlxuICogdGhlIFNESyBhbmQgYmFja2VuZCBhbHdheXMgb3JkZXJzIGJ5IGBfX25hbWVfX2ApLlxuICovIGZ1bmN0aW9uIEhuKHQpIHtcbiAgICBjb25zdCBlID0gTCh0KTtcbiAgICBpZiAobnVsbCA9PT0gZS53dCkge1xuICAgICAgICBlLnd0ID0gW107XG4gICAgICAgIGNvbnN0IHQgPSB6bihlKSwgbiA9IGpuKGUpO1xuICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiBudWxsID09PSBuKSBcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gaW1wbGljaXRseSBhZGQga2V5IG9yZGVyaW5nLCB3ZSBtdXN0IGFsc28gYWRkIHRoZVxuICAgICAgICAvLyBpbmVxdWFsaXR5IGZpbHRlciBmaWVsZCBmb3IgaXQgdG8gYmUgYSB2YWxpZCBxdWVyeS5cbiAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGluZXF1YWxpdHkgZmllbGQgYW5kIGtleSBvcmRlcmluZyBpcyBhc2NlbmRpbmcuXG4gICAgICAgIHQuaXNLZXlGaWVsZCgpIHx8IGUud3QucHVzaChuZXcgZG4odCkpLCBlLnd0LnB1c2gobmV3IGRuKGF0LmtleUZpZWxkKCksIFwiYXNjXCIgLyogRGlyZWN0aW9uLkFTQ0VORElORyAqLykpOyBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0ID0gITE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgZS5leHBsaWNpdE9yZGVyQnkpIGUud3QucHVzaChuKSwgbi5maWVsZC5pc0tleUZpZWxkKCkgJiYgKHQgPSAhMCk7XG4gICAgICAgICAgICBpZiAoIXQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIGltcGxpY2l0IGtleSBvcmRlcmluZyBhbHdheXMgbWF0Y2hlcyB0aGUgbGFzdFxuICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IG9yZGVyIGJ5XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCA+IDAgPyBlLmV4cGxpY2l0T3JkZXJCeVtlLmV4cGxpY2l0T3JkZXJCeS5sZW5ndGggLSAxXS5kaXIgOiBcImFzY1wiIC8qIERpcmVjdGlvbi5BU0NFTkRJTkcgKi87XG4gICAgICAgICAgICAgICAgZS53dC5wdXNoKG5ldyBkbihhdC5rZXlGaWVsZCgpLCB0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGUud3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBgUXVlcnlgIGluc3RhbmNlIHRvIGl0J3MgY29ycmVzcG9uZGluZyBgVGFyZ2V0YCByZXByZXNlbnRhdGlvbi5cbiAqLyBmdW5jdGlvbiBKbih0KSB7XG4gICAgY29uc3QgZSA9IEwodCk7XG4gICAgaWYgKCFlLl90KSBpZiAoXCJGXCIgLyogTGltaXRUeXBlLkZpcnN0ICovID09PSBlLmxpbWl0VHlwZSkgZS5fdCA9IE1uKGUucGF0aCwgZS5jb2xsZWN0aW9uR3JvdXAsIEhuKGUpLCBlLmZpbHRlcnMsIGUubGltaXQsIGUuc3RhcnRBdCwgZS5lbmRBdCk7IGVsc2Uge1xuICAgICAgICAvLyBGbGlwIHRoZSBvcmRlckJ5IGRpcmVjdGlvbnMgc2luY2Ugd2Ugd2FudCB0aGUgbGFzdCByZXN1bHRzXG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIEhuKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gXCJkZXNjXCIgLyogRGlyZWN0aW9uLkRFU0NFTkRJTkcgKi8gPT09IG4uZGlyID8gXCJhc2NcIiAvKiBEaXJlY3Rpb24uQVNDRU5ESU5HICovIDogXCJkZXNjXCIgLyogRGlyZWN0aW9uLkRFU0NFTkRJTkcgKi87XG4gICAgICAgICAgICB0LnB1c2gobmV3IGRuKG4uZmllbGQsIGUpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBuZWVkIHRvIHN3YXAgdGhlIGN1cnNvcnMgdG8gbWF0Y2ggdGhlIG5vdy1mbGlwcGVkIHF1ZXJ5IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBlLmVuZEF0ID8gbmV3IGhuKGUuZW5kQXQucG9zaXRpb24sIGUuZW5kQXQuaW5jbHVzaXZlKSA6IG51bGwsIHMgPSBlLnN0YXJ0QXQgPyBuZXcgaG4oZS5zdGFydEF0LnBvc2l0aW9uLCBlLnN0YXJ0QXQuaW5jbHVzaXZlKSA6IG51bGw7XG4gICAgICAgIC8vIE5vdyByZXR1cm4gYXMgYSBMaW1pdFR5cGUuRmlyc3QgcXVlcnkuXG4gICAgICAgIGUuX3QgPSBNbihlLnBhdGgsIGUuY29sbGVjdGlvbkdyb3VwLCB0LCBlLmZpbHRlcnMsIGUubGltaXQsIG4sIHMpO1xuICAgIH1cbiAgICByZXR1cm4gZS5fdDtcbn1cblxuZnVuY3Rpb24gWW4odCwgZSkge1xuICAgIGUuZ2V0Rmlyc3RJbmVxdWFsaXR5RmllbGQoKSwgem4odCk7XG4gICAgY29uc3QgbiA9IHQuZmlsdGVycy5jb25jYXQoWyBlIF0pO1xuICAgIHJldHVybiBuZXcgVW4odC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgdC5leHBsaWNpdE9yZGVyQnkuc2xpY2UoKSwgbiwgdC5saW1pdCwgdC5saW1pdFR5cGUsIHQuc3RhcnRBdCwgdC5lbmRBdCk7XG59XG5cbmZ1bmN0aW9uIFhuKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gbmV3IFVuKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCBlLCBuLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xufVxuXG5mdW5jdGlvbiBabih0LCBlKSB7XG4gICAgcmV0dXJuIE9uKEpuKHQpLCBKbihlKSkgJiYgdC5saW1pdFR5cGUgPT09IGUubGltaXRUeXBlO1xufVxuXG4vLyBUT0RPKGIvMjkxODMxNjUpOiBUaGlzIGlzIHVzZWQgdG8gZ2V0IGEgdW5pcXVlIHN0cmluZyBmcm9tIGEgcXVlcnkgdG8sIGZvclxuLy8gZXhhbXBsZSwgdXNlIGFzIGEgZGljdGlvbmFyeSBrZXksIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaXMgc3ViamVjdCB0b1xuLy8gY29sbGlzaW9ucy4gTWFrZSBpdCBjb2xsaXNpb24tZnJlZS5cbmZ1bmN0aW9uIHRzKHQpIHtcbiAgICByZXR1cm4gYCR7JG4oSm4odCkpfXxsdDoke3QubGltaXRUeXBlfWA7XG59XG5cbmZ1bmN0aW9uIGVzKHQpIHtcbiAgICByZXR1cm4gYFF1ZXJ5KHRhcmdldD0ke2Z1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0LnBhdGguY2Fub25pY2FsU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBudWxsICE9PSB0LmNvbGxlY3Rpb25Hcm91cCAmJiAoZSArPSBcIiBjb2xsZWN0aW9uR3JvdXA9XCIgKyB0LmNvbGxlY3Rpb25Hcm91cCksIFxuICAgICAgICB0LmZpbHRlcnMubGVuZ3RoID4gMCAmJiAoZSArPSBgLCBmaWx0ZXJzOiBbJHt0LmZpbHRlcnMubWFwKCh0ID0+IFJuKHQpKSkuam9pbihcIiwgXCIpfV1gKSwgXG4gICAgICAgIEZ0KHQubGltaXQpIHx8IChlICs9IFwiLCBsaW1pdDogXCIgKyB0LmxpbWl0KSwgdC5vcmRlckJ5Lmxlbmd0aCA+IDAgJiYgKGUgKz0gYCwgb3JkZXJCeTogWyR7dC5vcmRlckJ5Lm1hcCgodCA9PiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dC5maWVsZC5jYW5vbmljYWxTdHJpbmcoKX0gKCR7dC5kaXJ9KWA7XG4gICAgICAgIH0odCkpKS5qb2luKFwiLCBcIil9XWApLCB0LnN0YXJ0QXQgJiYgKGUgKz0gXCIsIHN0YXJ0QXQ6IFwiLCBlICs9IHQuc3RhcnRBdC5pbmNsdXNpdmUgPyBcImI6XCIgOiBcImE6XCIsIFxuICAgICAgICBlICs9IHQuc3RhcnRBdC5wb3NpdGlvbi5tYXAoKHQgPT4gUWUodCkpKS5qb2luKFwiLFwiKSksIHQuZW5kQXQgJiYgKGUgKz0gXCIsIGVuZEF0OiBcIiwgXG4gICAgICAgIGUgKz0gdC5lbmRBdC5pbmNsdXNpdmUgPyBcImE6XCIgOiBcImI6XCIsIGUgKz0gdC5lbmRBdC5wb3NpdGlvbi5tYXAoKHQgPT4gUWUodCkpKS5qb2luKFwiLFwiKSksIFxuICAgICAgICBgVGFyZ2V0KCR7ZX0pYDtcbiAgICB9KEpuKHQpKX07IGxpbWl0VHlwZT0ke3QubGltaXRUeXBlfSlgO1xufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIGBkb2NgIG1hdGNoZXMgdGhlIGNvbnN0cmFpbnRzIG9mIGBxdWVyeWAuICovIGZ1bmN0aW9uIG5zKHQsIGUpIHtcbiAgICByZXR1cm4gZS5pc0ZvdW5kRG9jdW1lbnQoKSAmJiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLmtleS5wYXRoO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdC5jb2xsZWN0aW9uR3JvdXAgPyBlLmtleS5oYXNDb2xsZWN0aW9uSWQodC5jb2xsZWN0aW9uR3JvdXApICYmIHQucGF0aC5pc1ByZWZpeE9mKG4pIDogaHQuaXNEb2N1bWVudEtleSh0LnBhdGgpID8gdC5wYXRoLmlzRXF1YWwobikgOiB0LnBhdGguaXNJbW1lZGlhdGVQYXJlbnRPZihuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBBIGRvY3VtZW50IG11c3QgaGF2ZSBhIHZhbHVlIGZvciBldmVyeSBvcmRlcmluZyBjbGF1c2UgaW4gb3JkZXIgdG8gc2hvdyB1cFxuICogaW4gdGhlIHJlc3VsdHMuXG4gKi8gKHQsIGUpICYmIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gV2UgbXVzdCB1c2UgYHF1ZXJ5T3JkZXJCeSgpYCB0byBnZXQgdGhlIGxpc3Qgb2YgYWxsIG9yZGVyQnlzIChib3RoIGltcGxpY2l0IGFuZCBleHBsaWNpdCkuXG4gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgT1IgcXVlcmllcywgb3JkZXJCeSBhcHBsaWVzIHRvIGFsbCBkaXNqdW5jdGlvbiB0ZXJtcyBhbmQgaW1wbGljaXQgb3JkZXJCeXMgbXVzdFxuICAgICAgICAvLyBiZSB0YWtlbiBpbnRvIGFjY291bnQuIEZvciBleGFtcGxlLCB0aGUgcXVlcnkgXCJhID4gMSB8fCBiPT0xXCIgaGFzIGFuIGltcGxpY2l0IFwib3JkZXJCeSBhXCIgZHVlXG4gICAgICAgIC8vIHRvIHRoZSBpbmVxdWFsaXR5LCBhbmQgaXMgZXZhbHVhdGVkIGFzIFwiYSA+IDEgb3JkZXJCeSBhIHx8IGI9PTEgb3JkZXJCeSBhXCIuXG4gICAgICAgIC8vIEEgZG9jdW1lbnQgd2l0aCBjb250ZW50IG9mIHtiOjF9IG1hdGNoZXMgdGhlIGZpbHRlcnMsIGJ1dCBkb2VzIG5vdCBtYXRjaCB0aGUgb3JkZXJCeSBiZWNhdXNlXG4gICAgICAgIC8vIGl0J3MgbWlzc2luZyB0aGUgZmllbGQgJ2EnLlxuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgSG4odCkpIFxuICAgICAgICAvLyBvcmRlciBieSBrZXkgYWx3YXlzIG1hdGNoZXNcbiAgICAgICAgaWYgKCFuLmZpZWxkLmlzS2V5RmllbGQoKSAmJiBudWxsID09PSBlLmRhdGEuZmllbGQobi5maWVsZCkpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH0odCwgZSkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdC5maWx0ZXJzKSBpZiAoIW4ubWF0Y2hlcyhlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIC8qKiBNYWtlcyBzdXJlIGEgZG9jdW1lbnQgaXMgd2l0aGluIHRoZSBib3VuZHMsIGlmIHByb3ZpZGVkLiAqLyAodCwgZSkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBpZiAodC5zdGFydEF0ICYmICFcbiAgICAgICAgLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBkb2N1bWVudCBzb3J0cyBiZWZvcmUgYSBib3VuZCB1c2luZyB0aGUgcHJvdmlkZWQgc29ydFxuICogb3JkZXIuXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgY29uc3QgcyA9IGxuKHQsIGUsIG4pO1xuICAgICAgICAgICAgcmV0dXJuIHQuaW5jbHVzaXZlID8gcyA8PSAwIDogcyA8IDA7XG4gICAgICAgIH0odC5zdGFydEF0LCBIbih0KSwgZSkpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHQuZW5kQXQgJiYgIWZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBsbih0LCBlLCBuKTtcbiAgICAgICAgICAgIHJldHVybiB0LmluY2x1c2l2ZSA/IHMgPj0gMCA6IHMgPiAwO1xuICAgICAgICB9KHQuZW5kQXQsIEhuKHQpLCBlKSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIC8qKlxuICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBncm91cCB0aGF0IHRoaXMgcXVlcnkgdGFyZ2V0cy5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBXZWIgU0RLIHRvIGZhY2lsaXRhdGUgbXVsdGktdGFiXG4gKiBzeW5jaHJvbml6YXRpb24gZm9yIHF1ZXJ5IHJlc3VsdHMuXG4gKi8gKHQsIGUpO1xufVxuXG5mdW5jdGlvbiBzcyh0KSB7XG4gICAgcmV0dXJuIHQuY29sbGVjdGlvbkdyb3VwIHx8ICh0LnBhdGgubGVuZ3RoICUgMiA9PSAxID8gdC5wYXRoLmxhc3RTZWdtZW50KCkgOiB0LnBhdGguZ2V0KHQucGF0aC5sZW5ndGggLSAyKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0d28gZG9jdW1lbnRzXG4gKiBiYXNlZCBvbiB0aGUgUXVlcnkncyBvcmRlcmluZyBjb25zdHJhaW50LlxuICovIGZ1bmN0aW9uIGlzKHQpIHtcbiAgICByZXR1cm4gKGUsIG4pID0+IHtcbiAgICAgICAgbGV0IHMgPSAhMTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIEhuKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gcnMoaSwgZSwgbik7XG4gICAgICAgICAgICBpZiAoMCAhPT0gdCkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBzID0gcyB8fCBpLmZpZWxkLmlzS2V5RmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBycyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IHQuZmllbGQuaXNLZXlGaWVsZCgpID8gaHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gZS5kYXRhLmZpZWxkKHQpLCBpID0gbi5kYXRhLmZpZWxkKHQpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gcyAmJiBudWxsICE9PSBpID8gS2UocywgaSkgOiBPKCk7XG4gICAgfSh0LmZpZWxkLCBlLCBuKTtcbiAgICBzd2l0Y2ggKHQuZGlyKSB7XG4gICAgICBjYXNlIFwiYXNjXCIgLyogRGlyZWN0aW9uLkFTQ0VORElORyAqLyA6XG4gICAgICAgIHJldHVybiBzO1xuXG4gICAgICBjYXNlIFwiZGVzY1wiIC8qIERpcmVjdGlvbi5ERVNDRU5ESU5HICovIDpcbiAgICAgICAgcmV0dXJuIC0xICogcztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIE8oKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgbWFwIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBvYmplY3RzIGFzIGtleXMuIE9iamVjdHMgbXVzdCBoYXZlIGFuXG4gKiBhc3NvY2lhdGVkIGVxdWFscyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBpbW11dGFibGUuIEVudHJpZXMgaW4gdGhlIG1hcCBhcmVcbiAqIHN0b3JlZCB0b2dldGhlciB3aXRoIHRoZSBrZXkgYmVpbmcgcHJvZHVjZWQgZnJvbSB0aGUgbWFwS2V5Rm4uIFRoaXMgbWFwXG4gKiBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgY29sbGlzaW9ucyBvZiBrZXlzLlxuICovIGNsYXNzIG9zIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMubWFwS2V5Rm4gPSB0LCB0aGlzLmVxdWFsc0ZuID0gZSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaW5uZXIgbWFwIGZvciBhIGtleS92YWx1ZSBwYWlyLiBEdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIGNvbGxpc2lvbnMgd2VcbiAgICAgICAgICoga2VlcCBhIGxpc3Qgb2YgZW50cmllcyB0aGF0IHdlIGRvIGEgbGluZWFyIHNlYXJjaCB0aHJvdWdoIHRvIGZpbmQgYW4gYWN0dWFsXG4gICAgICAgICAqIG1hdGNoLiBOb3RlIHRoYXQgY29sbGlzaW9ucyBzaG91bGQgYmUgcmFyZSwgc28gd2Ugc3RpbGwgZXhwZWN0IG5lYXJcbiAgICAgICAgICogY29uc3RhbnQgdGltZSBsb29rdXBzIGluIHByYWN0aWNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbm5lciA9IHt9LCBcbiAgICAgICAgLyoqIFRoZSBudW1iZXIgb2YgZW50cmllcyBzdG9yZWQgaW4gdGhlIG1hcCAqL1xuICAgICAgICB0aGlzLmlubmVyU2l6ZSA9IDA7XG4gICAgfVxuICAgIC8qKiBHZXQgYSB2YWx1ZSBmb3IgdGhpcyBrZXksIG9yIHVuZGVmaW5lZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4gKi8gICAgZ2V0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMubWFwS2V5Rm4odCksIG4gPSB0aGlzLmlubmVyW2VdO1xuICAgICAgICBpZiAodm9pZCAwICE9PSBuKSBmb3IgKGNvbnN0IFtlLCBzXSBvZiBuKSBpZiAodGhpcy5lcXVhbHNGbihlLCB0KSkgcmV0dXJuIHM7XG4gICAgfVxuICAgIGhhcyh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuZ2V0KHQpO1xuICAgIH1cbiAgICAvKiogUHV0IHRoaXMga2V5IGFuZCB2YWx1ZSBpbiB0aGUgbWFwLiAqLyAgICBzZXQodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5tYXBLZXlGbih0KSwgcyA9IHRoaXMuaW5uZXJbbl07XG4gICAgICAgIGlmICh2b2lkIDAgPT09IHMpIHJldHVybiB0aGlzLmlubmVyW25dID0gWyBbIHQsIGUgXSBdLCB2b2lkIHRoaXMuaW5uZXJTaXplKys7XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcy5sZW5ndGg7IG4rKykgaWYgKHRoaXMuZXF1YWxzRm4oc1tuXVswXSwgdCkpIFxuICAgICAgICAvLyBUaGlzIGlzIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGVudHJ5IGFuZCBkb2VzIG5vdCBpbmNyZWFzZSBgaW5uZXJTaXplYC5cbiAgICAgICAgcmV0dXJuIHZvaWQgKHNbbl0gPSBbIHQsIGUgXSk7XG4gICAgICAgIHMucHVzaChbIHQsIGUgXSksIHRoaXMuaW5uZXJTaXplKys7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGlzIGtleSBmcm9tIHRoZSBtYXAuIFJldHVybnMgYSBib29sZWFuIGlmIGFueXRoaW5nIHdhcyBkZWxldGVkLlxuICAgICAqLyAgICBkZWxldGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5tYXBLZXlGbih0KSwgbiA9IHRoaXMuaW5uZXJbZV07XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG4pIHJldHVybiAhMTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBuLmxlbmd0aDsgcysrKSBpZiAodGhpcy5lcXVhbHNGbihuW3NdWzBdLCB0KSkgcmV0dXJuIDEgPT09IG4ubGVuZ3RoID8gZGVsZXRlIHRoaXMuaW5uZXJbZV0gOiBuLnNwbGljZShzLCAxKSwgXG4gICAgICAgIHRoaXMuaW5uZXJTaXplLS0sICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZvckVhY2godCkge1xuICAgICAgICBnZSh0aGlzLmlubmVyLCAoKGUsIG4pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2UsIHNdIG9mIG4pIHQoZSwgcyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHllKHRoaXMuaW5uZXIpO1xuICAgIH1cbiAgICBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclNpemU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCB1cyA9IG5ldyBwZShodC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gY3MoKSB7XG4gICAgcmV0dXJuIHVzO1xufVxuXG5jb25zdCBhcyA9IG5ldyBwZShodC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gaHMoLi4udCkge1xuICAgIGxldCBlID0gYXM7XG4gICAgZm9yIChjb25zdCBuIG9mIHQpIGUgPSBlLmluc2VydChuLmtleSwgbik7XG4gICAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIGxzKHQpIHtcbiAgICBsZXQgZSA9IGFzO1xuICAgIHJldHVybiB0LmZvckVhY2goKCh0LCBuKSA9PiBlID0gZS5pbnNlcnQodCwgbi5vdmVybGF5ZWREb2N1bWVudCkpKSwgZTtcbn1cblxuZnVuY3Rpb24gZnMoKSB7XG4gICAgcmV0dXJuIHdzKCk7XG59XG5cbmZ1bmN0aW9uIGRzKCkge1xuICAgIHJldHVybiB3cygpO1xufVxuXG5mdW5jdGlvbiB3cygpIHtcbiAgICByZXR1cm4gbmV3IG9zKCh0ID0+IHQudG9TdHJpbmcoKSksICgodCwgZSkgPT4gdC5pc0VxdWFsKGUpKSk7XG59XG5cbmNvbnN0IF9zID0gbmV3IHBlKGh0LmNvbXBhcmF0b3IpO1xuXG5jb25zdCBtcyA9IG5ldyBFZShodC5jb21wYXJhdG9yKTtcblxuZnVuY3Rpb24gZ3MoLi4udCkge1xuICAgIGxldCBlID0gbXM7XG4gICAgZm9yIChjb25zdCBuIG9mIHQpIGUgPSBlLmFkZChuKTtcbiAgICByZXR1cm4gZTtcbn1cblxuY29uc3QgeXMgPSBuZXcgRWUoZXQpO1xuXG5mdW5jdGlvbiBwcygpIHtcbiAgICByZXR1cm4geXM7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJldHVybnMgYW4gRG91YmxlVmFsdWUgZm9yIGB2YWx1ZWAgdGhhdCBpcyBlbmNvZGVkIGJhc2VkIHRoZSBzZXJpYWxpemVyJ3NcbiAqIGB1c2VQcm90bzNKc29uYCBzZXR0aW5nLlxuICovIGZ1bmN0aW9uIElzKHQsIGUpIHtcbiAgICBpZiAodC51c2VQcm90bzNKc29uKSB7XG4gICAgICAgIGlmIChpc05hTihlKSkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIk5hTlwiXG4gICAgICAgIH07XG4gICAgICAgIGlmIChlID09PSAxIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIkluZmluaXR5XCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGUgPT09IC0xIC8gMCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBcIi1JbmZpbml0eVwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRvdWJsZVZhbHVlOiBCdChlKSA/IFwiLTBcIiA6IGVcbiAgICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSW50ZWdlclZhbHVlIGZvciBgdmFsdWVgLlxuICovIGZ1bmN0aW9uIFRzKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnRlZ2VyVmFsdWU6IFwiXCIgKyB0XG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgZm9yIGEgbnVtYmVyIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50byBhIHByb3RvLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBJbnRlZ2VyVmFsdWUgaWYgaXQgY2FuIHNhZmVseSByZXByZXNlbnQgdGhlIHZhbHVlLFxuICogb3RoZXJ3aXNlIGEgRG91YmxlVmFsdWUgaXMgcmV0dXJuZWQuXG4gKi8gZnVuY3Rpb24gRXModCwgZSkge1xuICAgIHJldHVybiBMdChlKSA/IFRzKGUpIDogSXModCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVXNlZCB0byByZXByZXNlbnQgYSBmaWVsZCB0cmFuc2Zvcm0gb24gYSBtdXRhdGlvbi4gKi8gY2xhc3MgQXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RydWN0dXJhbCB0eXBlIG9mIGBUcmFuc2Zvcm1PcGVyYXRpb25gIGlzIHVuaXF1ZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTQ1MVxuICAgICAgICB0aGlzLl8gPSB2b2lkIDA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2NhbCB0cmFuc2Zvcm0gcmVzdWx0IGFnYWluc3QgdGhlIHByb3ZpZGVkIGBwcmV2aW91c1ZhbHVlYCxcbiAqIG9wdGlvbmFsbHkgdXNpbmcgdGhlIHByb3ZpZGVkIGxvY2FsV3JpdGVUaW1lLlxuICovIGZ1bmN0aW9uIHZzKHQsIGUsIG4pIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGJzID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgX190eXBlX186IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic2VydmVyX3RpbWVzdGFtcFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBfX2xvY2FsX3dyaXRlX3RpbWVfXzoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBWYWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFub3M6IHQubmFub3NlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGF2b2lkIHN0b3JpbmcgZGVlcGx5IG5lc3RlZCBzZXJ2ZXIgdGltZXN0YW1wIG1hcCB2YWx1ZXNcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBuZXZlciB1c2UgdGhlIGludGVybWVkaWF0ZSBcInByZXZpb3VzIHZhbHVlc1wiLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZTpcbiAgICAgICAgLy8gcHJldmlvdXM6IDQyTCwgYWRkOiB0MSwgcmVzdWx0OiB0MSAtPiA0MkxcbiAgICAgICAgLy8gcHJldmlvdXM6IHQxLCAgYWRkOiB0MiwgcmVzdWx0OiB0MiAtPiA0MkwgKE5PVCB0MiAtPiB0MSAtPiA0MkwpXG4gICAgICAgIC8vIHByZXZpb3VzOiB0MiwgIGFkZDogdDMsIHJlc3VsdDogdDMgLT4gNDJMIChOT1QgdDMgLT4gdDIgLT4gdDEgLT4gNDJMKVxuICAgICAgICAvLyBgZ2V0UHJldmlvdXNWYWx1ZWAgcmVjdXJzaXZlbHkgdHJhdmVyc2VzIHNlcnZlciB0aW1lc3RhbXBzIHRvIGZpbmQgdGhlXG4gICAgICAgIC8vIGxlYXN0IHJlY2VudCBWYWx1ZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBOZShlKSAmJiAoZSA9IGtlKGUpKSwgZSAmJiAobi5maWVsZHMuX19wcmV2aW91c192YWx1ZV9fID0gZSksIFxuICAgICAgICB7XG4gICAgICAgICAgICBtYXBWYWx1ZTogblxuICAgICAgICB9O1xuICAgIH0obiwgZSkgOiB0IGluc3RhbmNlb2YgVnMgPyBTcyh0LCBlKSA6IHQgaW5zdGFuY2VvZiBEcyA/IENzKHQsIGUpIDogZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFNpbmNlIEphdmFTY3JpcHQncyBpbnRlZ2VyIGFyaXRobWV0aWMgaXMgbGltaXRlZCB0byA1MyBiaXRcbiAgICAgICAgLy8gcHJlY2lzaW9uIGFuZCByZXNvbHZlcyBvdmVyZmxvd3MgYnkgcmVkdWNpbmcgcHJlY2lzaW9uLCB3ZSBkbyBub3RcbiAgICAgICAgLy8gbWFudWFsbHkgY2FwIG92ZXJmbG93cyBhdCAyXjYzLlxuICAgICAgICBjb25zdCBuID0gUHModCwgZSksIHMgPSBOcyhuKSArIE5zKHQuZ3QpO1xuICAgICAgICByZXR1cm4gSGUobikgJiYgSGUodC5ndCkgPyBUcyhzKSA6IElzKHQuc2VyaWFsaXplciwgcyk7XG4gICAgfSh0LCBlKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIGZpbmFsIHRyYW5zZm9ybSByZXN1bHQgYWZ0ZXIgdGhlIHRyYW5zZm9ybSBoYXMgYmVlbiBhY2tub3dsZWRnZWRcbiAqIGJ5IHRoZSBzZXJ2ZXIsIHBvdGVudGlhbGx5IHVzaW5nIHRoZSBzZXJ2ZXItcHJvdmlkZWQgdHJhbnNmb3JtUmVzdWx0LlxuICovIGZ1bmN0aW9uIFJzKHQsIGUsIG4pIHtcbiAgICAvLyBUaGUgc2VydmVyIGp1c3Qgc2VuZHMgbnVsbCBhcyB0aGUgdHJhbnNmb3JtIHJlc3VsdCBmb3IgYXJyYXkgb3BlcmF0aW9ucyxcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGNhbGN1bGF0ZSBhIHJlc3VsdCB0aGUgc2FtZSBhcyB3ZSBkbyBmb3IgbG9jYWxcbiAgICAvLyBhcHBsaWNhdGlvbnMuXG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBWcyA/IFNzKHQsIGUpIDogdCBpbnN0YW5jZW9mIERzID8gQ3ModCwgZSkgOiBuO1xufVxuXG4vKipcbiAqIElmIHRoaXMgdHJhbnNmb3JtIG9wZXJhdGlvbiBpcyBub3QgaWRlbXBvdGVudCwgcmV0dXJucyB0aGUgYmFzZSB2YWx1ZSB0b1xuICogcGVyc2lzdCBmb3IgdGhpcyB0cmFuc2Zvcm0uIElmIGEgYmFzZSB2YWx1ZSBpcyByZXR1cm5lZCwgdGhlIHRyYW5zZm9ybVxuICogb3BlcmF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIHRvIHRoaXMgYmFzZSB2YWx1ZSwgZXZlbiBpZiBkb2N1bWVudCBoYXNcbiAqIGFscmVhZHkgYmVlbiB1cGRhdGVkLlxuICpcbiAqIEJhc2UgdmFsdWVzIHByb3ZpZGUgY29uc2lzdGVudCBiZWhhdmlvciBmb3Igbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtcyBhbmRcbiAqIGFsbG93IHVzIHRvIHJldHVybiB0aGUgc2FtZSBsYXRlbmN5LWNvbXBlbnNhdGVkIHZhbHVlIGV2ZW4gaWYgdGhlIGJhY2tlbmRcbiAqIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlIHRyYW5zZm9ybSBvcGVyYXRpb24uIFRoZSBiYXNlIHZhbHVlIGlzIG51bGwgZm9yXG4gKiBpZGVtcG90ZW50IHRyYW5zZm9ybXMsIGFzIHRoZXkgY2FuIGJlIHJlLXBsYXllZCBldmVuIGlmIHRoZSBiYWNrZW5kIGhhc1xuICogYWxyZWFkeSBhcHBsaWVkIHRoZW0uXG4gKlxuICogQHJldHVybnMgYSBiYXNlIHZhbHVlIHRvIHN0b3JlIGFsb25nIHdpdGggdGhlIG11dGF0aW9uLCBvciBudWxsIGZvclxuICogaWRlbXBvdGVudCB0cmFuc2Zvcm1zLlxuICovIGZ1bmN0aW9uIFBzKHQsIGUpIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIHhzID8gSGUobiA9IGUpIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuICEhdCAmJiBcImRvdWJsZVZhbHVlXCIgaW4gdDtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGVpdGhlciBhbiBJbnRlZ2VyVmFsdWUgb3IgYSBEb3VibGVWYWx1ZS4gKi8gKG4pID8gZSA6IHtcbiAgICAgICAgaW50ZWdlclZhbHVlOiAwXG4gICAgfSA6IG51bGw7XG4gICAgdmFyIG47XG59XG5cbi8qKiBUcmFuc2Zvcm1zIGEgdmFsdWUgaW50byBhIHNlcnZlci1nZW5lcmF0ZWQgdGltZXN0YW1wLiAqL1xuY2xhc3MgYnMgZXh0ZW5kcyBBcyB7fVxuXG4vKiogVHJhbnNmb3JtcyBhbiBhcnJheSB2YWx1ZSB2aWEgYSB1bmlvbiBvcGVyYXRpb24uICovIGNsYXNzIFZzIGV4dGVuZHMgQXMge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5lbGVtZW50cyA9IHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBTcyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGtzKGUpO1xuICAgIGZvciAoY29uc3QgZSBvZiB0LmVsZW1lbnRzKSBuLnNvbWUoKHQgPT4gcWUodCwgZSkpKSB8fCBuLnB1c2goZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXlWYWx1ZToge1xuICAgICAgICAgICAgdmFsdWVzOiBuXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKiogVHJhbnNmb3JtcyBhbiBhcnJheSB2YWx1ZSB2aWEgYSByZW1vdmUgb3BlcmF0aW9uLiAqLyBjbGFzcyBEcyBleHRlbmRzIEFzIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZWxlbWVudHMgPSB0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gQ3ModCwgZSkge1xuICAgIGxldCBuID0ga3MoZSk7XG4gICAgZm9yIChjb25zdCBlIG9mIHQuZWxlbWVudHMpIG4gPSBuLmZpbHRlcigodCA9PiAhcWUodCwgZSkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhcnJheVZhbHVlOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IG5cbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyB0aGUgYmFja2VuZCBzZW1hbnRpY3MgZm9yIGxvY2FsbHkgY29tcHV0ZWQgTlVNRVJJQ19BREQgKGluY3JlbWVudClcbiAqIHRyYW5zZm9ybXMuIENvbnZlcnRzIGFsbCBmaWVsZCB2YWx1ZXMgdG8gaW50ZWdlcnMgb3IgZG91YmxlcywgYnV0IHVubGlrZSB0aGVcbiAqIGJhY2tlbmQgZG9lcyBub3QgY2FwIGludGVnZXIgdmFsdWVzIGF0IDJeNjMuIEluc3RlYWQsIEphdmFTY3JpcHQgbnVtYmVyXG4gKiBhcml0aG1ldGljIGlzIHVzZWQgYW5kIHByZWNpc2lvbiBsb3NzIGNhbiBvY2N1ciBmb3IgdmFsdWVzIGdyZWF0ZXIgdGhhbiAyXjUzLlxuICovIGNsYXNzIHhzIGV4dGVuZHMgQXMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5zZXJpYWxpemVyID0gdCwgdGhpcy5ndCA9IGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBOcyh0KSB7XG4gICAgcmV0dXJuIENlKHQuaW50ZWdlclZhbHVlIHx8IHQuZG91YmxlVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBrcyh0KSB7XG4gICAgcmV0dXJuIEplKHQpICYmIHQuYXJyYXlWYWx1ZS52YWx1ZXMgPyB0LmFycmF5VmFsdWUudmFsdWVzLnNsaWNlKCkgOiBbXTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBBIGZpZWxkIHBhdGggYW5kIHRoZSBUcmFuc2Zvcm1PcGVyYXRpb24gdG8gcGVyZm9ybSB1cG9uIGl0LiAqLyBjbGFzcyBNcyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmZpZWxkID0gdCwgdGhpcy50cmFuc2Zvcm0gPSBlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gJHModCwgZSkge1xuICAgIHJldHVybiB0LmZpZWxkLmlzRXF1YWwoZS5maWVsZCkgJiYgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFZzICYmIGUgaW5zdGFuY2VvZiBWcyB8fCB0IGluc3RhbmNlb2YgRHMgJiYgZSBpbnN0YW5jZW9mIERzID8gbnQodC5lbGVtZW50cywgZS5lbGVtZW50cywgcWUpIDogdCBpbnN0YW5jZW9mIHhzICYmIGUgaW5zdGFuY2VvZiB4cyA/IHFlKHQuZ3QsIGUuZ3QpIDogdCBpbnN0YW5jZW9mIGJzICYmIGUgaW5zdGFuY2VvZiBicztcbiAgICB9KHQudHJhbnNmb3JtLCBlLnRyYW5zZm9ybSk7XG59XG5cbi8qKiBUaGUgcmVzdWx0IG9mIHN1Y2Nlc3NmdWxseSBhcHBseWluZyBhIG11dGF0aW9uIHRvIHRoZSBiYWNrZW5kLiAqL1xuY2xhc3MgT3Mge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIGF0IHdoaWNoIHRoZSBtdXRhdGlvbiB3YXMgY29tbWl0dGVkOlxuICAgICAqXG4gICAgICogLSBGb3IgbW9zdCBvcGVyYXRpb25zLCB0aGlzIGlzIHRoZSB1cGRhdGVUaW1lIGluIHRoZSBXcml0ZVJlc3VsdC5cbiAgICAgKiAtIEZvciBkZWxldGVzLCB0aGUgY29tbWl0VGltZSBvZiB0aGUgV3JpdGVSZXNwb25zZSAoYmVjYXVzZSBkZWxldGVzIGFyZVxuICAgICAqICAgbm90IHN0b3JlZCBhbmQgaGF2ZSBubyB1cGRhdGVUaW1lKS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGVzZSB2ZXJzaW9ucyBjYW4gYmUgZGlmZmVyZW50OiBOby1vcCB3cml0ZXMgd2lsbCBub3QgY2hhbmdlXG4gICAgICogdGhlIHVwZGF0ZVRpbWUgZXZlbiB0aG91Z2ggdGhlIGNvbW1pdFRpbWUgYWR2YW5jZXMuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdGluZyBmaWVsZHMgcmV0dXJuZWQgZnJvbSB0aGUgYmFja2VuZCBhZnRlciBhIG11dGF0aW9uXG4gICAgICogY29udGFpbmluZyBmaWVsZCB0cmFuc2Zvcm1zIGhhcyBiZWVuIGNvbW1pdHRlZC4gQ29udGFpbnMgb25lIEZpZWxkVmFsdWVcbiAgICAgKiBmb3IgZWFjaCBGaWVsZFRyYW5zZm9ybSB0aGF0IHdhcyBpbiB0aGUgbXV0YXRpb24uXG4gICAgICpcbiAgICAgKiBXaWxsIGJlIGVtcHR5IGlmIHRoZSBtdXRhdGlvbiBkaWQgbm90IGNvbnRhaW4gYW55IGZpZWxkIHRyYW5zZm9ybXMuXG4gICAgICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB0LCB0aGlzLnRyYW5zZm9ybVJlc3VsdHMgPSBlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgcHJlY29uZGl0aW9uIGZvciBhIG11dGF0aW9uLiBUaGlzIGZvbGxvd3MgdGhlIG1vZGVsIHRoYXQgdGhlXG4gKiBiYWNrZW5kIGFjY2VwdHMgd2l0aCB0aGUgc3BlY2lhbCBjYXNlIG9mIGFuIGV4cGxpY2l0IFwiZW1wdHlcIiBwcmVjb25kaXRpb25cbiAqIChtZWFuaW5nIG5vIHByZWNvbmRpdGlvbikuXG4gKi8gY2xhc3MgRnMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lID0gdCwgdGhpcy5leGlzdHMgPSBlO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBlbXB0eSBQcmVjb25kaXRpb24uICovICAgIHN0YXRpYyBub25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZzO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBQcmVjb25kaXRpb24gd2l0aCBhbiBleGlzdHMgZmxhZy4gKi8gICAgc3RhdGljIGV4aXN0cyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnModm9pZCAwLCB0KTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgUHJlY29uZGl0aW9uIGJhc2VkIG9uIGEgdmVyc2lvbiBhIGRvY3VtZW50IGV4aXN0cyBhdC4gKi8gICAgc3RhdGljIHVwZGF0ZVRpbWUodCkge1xuICAgICAgICByZXR1cm4gbmV3IEZzKHQpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoaXMgUHJlY29uZGl0aW9uIGlzIGVtcHR5LiAqLyAgICBnZXQgaXNOb25lKCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aGlzLnVwZGF0ZVRpbWUgJiYgdm9pZCAwID09PSB0aGlzLmV4aXN0cztcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4aXN0cyA9PT0gdC5leGlzdHMgJiYgKHRoaXMudXBkYXRlVGltZSA/ICEhdC51cGRhdGVUaW1lICYmIHRoaXMudXBkYXRlVGltZS5pc0VxdWFsKHQudXBkYXRlVGltZSkgOiAhdC51cGRhdGVUaW1lKTtcbiAgICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByZWNvbmRpdGlvbnMgaXMgdmFsaWQgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC4gKi8gZnVuY3Rpb24gQnModCwgZSkge1xuICAgIHJldHVybiB2b2lkIDAgIT09IHQudXBkYXRlVGltZSA/IGUuaXNGb3VuZERvY3VtZW50KCkgJiYgZS52ZXJzaW9uLmlzRXF1YWwodC51cGRhdGVUaW1lKSA6IHZvaWQgMCA9PT0gdC5leGlzdHMgfHwgdC5leGlzdHMgPT09IGUuaXNGb3VuZERvY3VtZW50KCk7XG59XG5cbi8qKlxuICogQSBtdXRhdGlvbiBkZXNjcmliZXMgYSBzZWxmLWNvbnRhaW5lZCBjaGFuZ2UgdG8gYSBkb2N1bWVudC4gTXV0YXRpb25zIGNhblxuICogY3JlYXRlLCByZXBsYWNlLCBkZWxldGUsIGFuZCB1cGRhdGUgc3Vic2V0cyBvZiBkb2N1bWVudHMuXG4gKlxuICogTXV0YXRpb25zIG5vdCBvbmx5IGFjdCBvbiB0aGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50IGJ1dCBhbHNvIGl0cyB2ZXJzaW9uLlxuICpcbiAqIEZvciBsb2NhbCBtdXRhdGlvbnMgKG11dGF0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiBjb21taXR0ZWQgeWV0KSwgd2UgcHJlc2VydmVcbiAqIHRoZSBleGlzdGluZyB2ZXJzaW9uIGZvciBTZXQgYW5kIFBhdGNoIG11dGF0aW9ucy4gRm9yIERlbGV0ZSBtdXRhdGlvbnMsIHdlXG4gKiByZXNldCB0aGUgdmVyc2lvbiB0byAwLlxuICpcbiAqIEhlcmUncyB0aGUgZXhwZWN0ZWQgdHJhbnNpdGlvbiB0YWJsZS5cbiAqXG4gKiBNVVRBVElPTiAgICAgICAgICAgQVBQTElFRCBUTyAgICAgICAgICAgIFJFU1VMVFMgSU5cbiAqXG4gKiBTZXRNdXRhdGlvbiAgICAgICAgRG9jdW1lbnQodjMpICAgICAgICAgIERvY3VtZW50KHYzKVxuICogU2V0TXV0YXRpb24gICAgICAgIE5vRG9jdW1lbnQodjMpICAgICAgICBEb2N1bWVudCh2MClcbiAqIFNldE11dGF0aW9uICAgICAgICBJbnZhbGlkRG9jdW1lbnQodjApICAgRG9jdW1lbnQodjApXG4gKiBQYXRjaE11dGF0aW9uICAgICAgRG9jdW1lbnQodjMpICAgICAgICAgIERvY3VtZW50KHYzKVxuICogUGF0Y2hNdXRhdGlvbiAgICAgIE5vRG9jdW1lbnQodjMpICAgICAgICBOb0RvY3VtZW50KHYzKVxuICogUGF0Y2hNdXRhdGlvbiAgICAgIEludmFsaWREb2N1bWVudCh2MCkgICBVbmtub3duRG9jdW1lbnQodjMpXG4gKiBEZWxldGVNdXRhdGlvbiAgICAgRG9jdW1lbnQodjMpICAgICAgICAgIE5vRG9jdW1lbnQodjApXG4gKiBEZWxldGVNdXRhdGlvbiAgICAgTm9Eb2N1bWVudCh2MykgICAgICAgIE5vRG9jdW1lbnQodjApXG4gKiBEZWxldGVNdXRhdGlvbiAgICAgSW52YWxpZERvY3VtZW50KHYwKSAgIE5vRG9jdW1lbnQodjApXG4gKlxuICogRm9yIGFja25vd2xlZGdlZCBtdXRhdGlvbnMsIHdlIHVzZSB0aGUgdXBkYXRlVGltZSBvZiB0aGUgV3JpdGVSZXNwb25zZSBhc1xuICogdGhlIHJlc3VsdGluZyB2ZXJzaW9uIGZvciBTZXQgYW5kIFBhdGNoIG11dGF0aW9ucy4gQXMgZGVsZXRlcyBoYXZlIG5vXG4gKiBleHBsaWNpdCB1cGRhdGUgdGltZSwgd2UgdXNlIHRoZSBjb21taXRUaW1lIG9mIHRoZSBXcml0ZVJlc3BvbnNlIGZvclxuICogRGVsZXRlIG11dGF0aW9ucy5cbiAqXG4gKiBJZiBhIG11dGF0aW9uIGlzIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZCBidXQgZmFpbHMgdGhlIHByZWNvbmRpdGlvbiBjaGVja1xuICogbG9jYWxseSwgd2UgdHJhbnNpdGlvbiB0byBhbiBgVW5rbm93bkRvY3VtZW50YCBhbmQgcmVseSBvbiBXYXRjaCB0byBzZW5kIHVzXG4gKiB0aGUgdXBkYXRlZCB2ZXJzaW9uLlxuICpcbiAqIEZpZWxkIHRyYW5zZm9ybXMgYXJlIHVzZWQgb25seSB3aXRoIFBhdGNoIGFuZCBTZXQgTXV0YXRpb25zLiBXZSB1c2UgdGhlXG4gKiBgdXBkYXRlVHJhbnNmb3Jtc2AgbWVzc2FnZSB0byBzdG9yZSB0cmFuc2Zvcm1zLCByYXRoZXIgdGhhbiB0aGUgYHRyYW5zZm9ybXNgc1xuICogbWVzc2FnZXMuXG4gKlxuICogIyMgU3ViY2xhc3NpbmcgTm90ZXNcbiAqXG4gKiBFdmVyeSB0eXBlIG9mIG11dGF0aW9uIG5lZWRzIHRvIGltcGxlbWVudCBpdHMgb3duIGFwcGx5VG9SZW1vdGVEb2N1bWVudCgpIGFuZFxuICogYXBwbHlUb0xvY2FsVmlldygpIHRvIGltcGxlbWVudCB0aGUgYWN0dWFsIGJlaGF2aW9yIG9mIGFwcGx5aW5nIHRoZSBtdXRhdGlvblxuICogdG8gc29tZSBzb3VyY2UgZG9jdW1lbnQgKHNlZSBgc2V0TXV0YXRpb25BcHBseVRvUmVtb3RlRG9jdW1lbnQoKWAgZm9yIGFuXG4gKiBleGFtcGxlKS5cbiAqLyBjbGFzcyBMcyB7fVxuXG4vKipcbiAqIEEgdXRpbGl0eSBtZXRob2QgdG8gY2FsY3VsYXRlIGEgYE11dGF0aW9uYCByZXByZXNlbnRpbmcgdGhlIG92ZXJsYXkgZnJvbSB0aGVcbiAqIGZpbmFsIHN0YXRlIG9mIHRoZSBkb2N1bWVudCwgYW5kIGEgYEZpZWxkTWFza2AgcmVwcmVzZW50aW5nIHRoZSBmaWVsZHMgdGhhdFxuICogYXJlIG11dGF0ZWQgYnkgdGhlIGxvY2FsIG11dGF0aW9ucy5cbiAqLyBmdW5jdGlvbiBxcyh0LCBlKSB7XG4gICAgaWYgKCF0Lmhhc0xvY2FsTXV0YXRpb25zIHx8IGUgJiYgMCA9PT0gZS5maWVsZHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAvLyBtYXNrIGlzIG51bGwgd2hlbiBzZXRzIG9yIGRlbGV0ZXMgYXJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgICAgIGlmIChudWxsID09PSBlKSByZXR1cm4gdC5pc05vRG9jdW1lbnQoKSA/IG5ldyBZcyh0LmtleSwgRnMubm9uZSgpKSA6IG5ldyBqcyh0LmtleSwgdC5kYXRhLCBGcy5ub25lKCkpO1xuICAgIHtcbiAgICAgICAgY29uc3QgbiA9IHQuZGF0YSwgcyA9IHVuLmVtcHR5KCk7XG4gICAgICAgIGxldCBpID0gbmV3IEVlKGF0LmNvbXBhcmF0b3IpO1xuICAgICAgICBmb3IgKGxldCB0IG9mIGUuZmllbGRzKSBpZiAoIWkuaGFzKHQpKSB7XG4gICAgICAgICAgICBsZXQgZSA9IG4uZmllbGQodCk7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZGVsZXRpbmcgYSBuZXN0ZWQgZmllbGQsIHdlIHRha2UgdGhlIGltbWVkaWF0ZSBwYXJlbnQgYXNcbiAgICAgICAgICAgIC8vIHRoZSBtYXNrIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZXN1bHRpbmcgbXV0YXRpb24uXG4gICAgICAgICAgICAvLyBKdXN0aWZpY2F0aW9uOiBOZXN0ZWQgZmllbGRzIGNhbiBjcmVhdGUgcGFyZW50IGZpZWxkcyBpbXBsaWNpdGx5LiBJZlxuICAgICAgICAgICAgLy8gb25seSBhIGxlYWYgZW50cnkgaXMgZGVsZXRlZCBpbiBsYXRlciBtdXRhdGlvbnMsIHRoZSBwYXJlbnQgZmllbGRcbiAgICAgICAgICAgIC8vIHNob3VsZCBzdGlsbCByZW1haW4sIGJ1dCB3ZSBtYXkgaGF2ZSBsb3N0IHRoaXMgaW5mb3JtYXRpb24uXG4gICAgICAgICAgICAvLyBDb25zaWRlciBtdXRhdGlvbiAoZm9vLmJhciAxKSwgdGhlbiBtdXRhdGlvbiAoZm9vLmJhciBkZWxldGUoKSkuXG4gICAgICAgICAgICAvLyBUaGlzIGxlYXZlcyB0aGUgZmluYWwgcmVzdWx0IChmb28sIHt9KS4gRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGBkb2NgXG4gICAgICAgICAgICAvLyBoYXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBgZm9vYCBpcyBub3QgaW4gYG1hc2tgLCBhbmQgdGhlIHJlc3VsdGluZ1xuICAgICAgICAgICAgLy8gbXV0YXRpb24gd291bGQgbWlzcyBgZm9vYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IGUgJiYgdC5sZW5ndGggPiAxICYmICh0ID0gdC5wb3BMYXN0KCksIGUgPSBuLmZpZWxkKHQpKSwgbnVsbCA9PT0gZSA/IHMuZGVsZXRlKHQpIDogcy5zZXQodCwgZSksIFxuICAgICAgICAgICAgaSA9IGkuYWRkKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgenModC5rZXksIHMsIG5ldyBSZShpLnRvQXJyYXkoKSksIEZzLm5vbmUoKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhpcyBtdXRhdGlvbiB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQgZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wdXRpbmcgYVxuICogbmV3IHJlbW90ZSBkb2N1bWVudC4gSWYgdGhlIGlucHV0IGRvY3VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHN0YXRlXG4gKiAoZS5nLiBpdCBpcyBpbnZhbGlkIG9yIG91dGRhdGVkKSwgdGhlIGRvY3VtZW50IHR5cGUgbWF5IHRyYW5zaXRpb24gdG9cbiAqIHVua25vd24uXG4gKlxuICogQHBhcmFtIG11dGF0aW9uIC0gVGhlIG11dGF0aW9uIHRvIGFwcGx5LlxuICogQHBhcmFtIGRvY3VtZW50IC0gVGhlIGRvY3VtZW50IHRvIG11dGF0ZS4gVGhlIGlucHV0IGRvY3VtZW50IGNhbiBiZSBhblxuICogICAgIGludmFsaWQgZG9jdW1lbnQgaWYgdGhlIGNsaWVudCBoYXMgbm8ga25vd2xlZGdlIG9mIHRoZSBwcmUtbXV0YXRpb24gc3RhdGVcbiAqICAgICBvZiB0aGUgZG9jdW1lbnQuXG4gKiBAcGFyYW0gbXV0YXRpb25SZXN1bHQgLSBUaGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBtdXRhdGlvbiBmcm9tIHRoZSBiYWNrZW5kLlxuICovIGZ1bmN0aW9uIFVzKHQsIGUsIG4pIHtcbiAgICB0IGluc3RhbmNlb2YganMgPyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIC8vIFVubGlrZSBzZXRNdXRhdGlvbkFwcGx5VG9Mb2NhbFZpZXcsIGlmIHdlJ3JlIGFwcGx5aW5nIGEgbXV0YXRpb24gdG8gYVxuICAgICAgICAvLyByZW1vdGUgZG9jdW1lbnQgdGhlIHNlcnZlciBoYXMgYWNjZXB0ZWQgdGhlIG11dGF0aW9uIHNvIHRoZSBwcmVjb25kaXRpb25cbiAgICAgICAgLy8gbXVzdCBoYXZlIGhlbGQuXG4gICAgICAgIGNvbnN0IHMgPSB0LnZhbHVlLmNsb25lKCksIGkgPSBIcyh0LmZpZWxkVHJhbnNmb3JtcywgZSwgbi50cmFuc2Zvcm1SZXN1bHRzKTtcbiAgICAgICAgcy5zZXRBbGwoaSksIGUuY29udmVydFRvRm91bmREb2N1bWVudChuLnZlcnNpb24sIHMpLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpO1xuICAgIH0odCwgZSwgbikgOiB0IGluc3RhbmNlb2YgenMgPyBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGlmICghQnModC5wcmVjb25kaXRpb24sIGUpKSBcbiAgICAgICAgLy8gU2luY2UgdGhlIG11dGF0aW9uIHdhcyBub3QgcmVqZWN0ZWQsIHdlIGtub3cgdGhhdCB0aGUgcHJlY29uZGl0aW9uXG4gICAgICAgIC8vIG1hdGNoZWQgb24gdGhlIGJhY2tlbmQuIFdlIHRoZXJlZm9yZSBtdXN0IG5vdCBoYXZlIHRoZSBleHBlY3RlZCB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIHRoZSBkb2N1bWVudCBpbiBvdXIgY2FjaGUgYW5kIGNvbnZlcnQgdG8gYW4gVW5rbm93bkRvY3VtZW50IHdpdGggYVxuICAgICAgICAvLyBrbm93biB1cGRhdGVUaW1lLlxuICAgICAgICByZXR1cm4gdm9pZCBlLmNvbnZlcnRUb1Vua25vd25Eb2N1bWVudChuLnZlcnNpb24pO1xuICAgICAgICBjb25zdCBzID0gSHModC5maWVsZFRyYW5zZm9ybXMsIGUsIG4udHJhbnNmb3JtUmVzdWx0cyksIGkgPSBlLmRhdGE7XG4gICAgICAgIGkuc2V0QWxsKFdzKHQpKSwgaS5zZXRBbGwocyksIGUuY29udmVydFRvRm91bmREb2N1bWVudChuLnZlcnNpb24sIGkpLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpO1xuICAgIH0odCwgZSwgbikgOiBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIC8vIFVubGlrZSBhcHBseVRvTG9jYWxWaWV3LCBpZiB3ZSdyZSBhcHBseWluZyBhIG11dGF0aW9uIHRvIGEgcmVtb3RlXG4gICAgICAgIC8vIGRvY3VtZW50IHRoZSBzZXJ2ZXIgaGFzIGFjY2VwdGVkIHRoZSBtdXRhdGlvbiBzbyB0aGUgcHJlY29uZGl0aW9uIG11c3RcbiAgICAgICAgLy8gaGF2ZSBoZWxkLlxuICAgICAgICBlLmNvbnZlcnRUb05vRG9jdW1lbnQobi52ZXJzaW9uKS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKTtcbiAgICB9KDAsIGUsIG4pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhpcyBtdXRhdGlvbiB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQgZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wdXRpbmdcbiAqIHRoZSBuZXcgbG9jYWwgdmlldyBvZiBhIGRvY3VtZW50LiBJZiB0aGUgaW5wdXQgZG9jdW1lbnQgZG9lc24ndCBtYXRjaCB0aGVcbiAqIGV4cGVjdGVkIHN0YXRlLCB0aGUgZG9jdW1lbnQgaXMgbm90IG1vZGlmaWVkLlxuICpcbiAqIEBwYXJhbSBtdXRhdGlvbiAtIFRoZSBtdXRhdGlvbiB0byBhcHBseS5cbiAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBtdXRhdGUuIFRoZSBpbnB1dCBkb2N1bWVudCBjYW4gYmUgYW5cbiAqICAgICBpbnZhbGlkIGRvY3VtZW50IGlmIHRoZSBjbGllbnQgaGFzIG5vIGtub3dsZWRnZSBvZiB0aGUgcHJlLW11dGF0aW9uIHN0YXRlXG4gKiAgICAgb2YgdGhlIGRvY3VtZW50LlxuICogQHBhcmFtIHByZXZpb3VzTWFzayAtIFRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCBiZWZvcmUgYXBwbHlpbmcgdGhpcyBtdXRhdGlvbi5cbiAqIEBwYXJhbSBsb2NhbFdyaXRlVGltZSAtIEEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIGxvY2FsIHdyaXRlIHRpbWUgb2YgdGhlXG4gKiAgICAgYmF0Y2ggdGhpcyBtdXRhdGlvbiBpcyBhIHBhcnQgb2YuXG4gKiBAcmV0dXJucyBBIGBGaWVsZE1hc2tgIHJlcHJlc2VudGluZyB0aGUgZmllbGRzIHRoYXQgYXJlIGNoYW5nZWQgYnkgYXBwbHlpbmcgdGhpcyBtdXRhdGlvbi5cbiAqLyBmdW5jdGlvbiBLcyh0LCBlLCBuLCBzKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBqcyA/IGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgaWYgKCFCcyh0LnByZWNvbmRpdGlvbiwgZSkpIFxuICAgICAgICAvLyBUaGUgbXV0YXRpb24gZmFpbGVkIHRvIGFwcGx5IChlLmcuIGEgZG9jdW1lbnQgSUQgY3JlYXRlZCB3aXRoIGFkZCgpXG4gICAgICAgIC8vIGNhdXNlZCBhIG5hbWUgY29sbGlzaW9uKS5cbiAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGNvbnN0IGkgPSB0LnZhbHVlLmNsb25lKCksIHIgPSBKcyh0LmZpZWxkVHJhbnNmb3JtcywgcywgZSk7XG4gICAgICAgIHJldHVybiBpLnNldEFsbChyKSwgZS5jb252ZXJ0VG9Gb3VuZERvY3VtZW50KGUudmVyc2lvbiwgaSkuc2V0SGFzTG9jYWxNdXRhdGlvbnMoKSwgXG4gICAgICAgIG51bGw7XG4gLy8gU2V0TXV0YXRpb24gb3ZlcndyaXRlcyBhbGwgZmllbGRzLlxuICAgICAgICB9XG4gICAgLyoqXG4gKiBBIG11dGF0aW9uIHRoYXQgbW9kaWZpZXMgZmllbGRzIG9mIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGggdGhlXG4gKiBnaXZlbiB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIGFwcGxpZWQgdGhyb3VnaCBhIGZpZWxkIG1hc2s6XG4gKlxuICogICogV2hlbiBhIGZpZWxkIGlzIGluIGJvdGggdGhlIG1hc2sgYW5kIHRoZSB2YWx1ZXMsIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkXG4gKiAgICBpcyB1cGRhdGVkLlxuICogICogV2hlbiBhIGZpZWxkIGlzIGluIG5laXRoZXIgdGhlIG1hc2sgbm9yIHRoZSB2YWx1ZXMsIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICBmaWVsZCBpcyB1bm1vZGlmaWVkLlxuICogICogV2hlbiBhIGZpZWxkIGlzIGluIHRoZSBtYXNrIGJ1dCBub3QgaW4gdGhlIHZhbHVlcywgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRcbiAqICAgIGlzIGRlbGV0ZWQuXG4gKiAgKiBXaGVuIGEgZmllbGQgaXMgbm90IGluIHRoZSBtYXNrIGJ1dCBpcyBpbiB0aGUgdmFsdWVzLCB0aGUgdmFsdWVzIG1hcCBpc1xuICogICAgaWdub3JlZC5cbiAqLyAodCwgZSwgbiwgcykgOiB0IGluc3RhbmNlb2YgenMgPyBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIGlmICghQnModC5wcmVjb25kaXRpb24sIGUpKSByZXR1cm4gbjtcbiAgICAgICAgY29uc3QgaSA9IEpzKHQuZmllbGRUcmFuc2Zvcm1zLCBzLCBlKSwgciA9IGUuZGF0YTtcbiAgICAgICAgaWYgKHIuc2V0QWxsKFdzKHQpKSwgci5zZXRBbGwoaSksIGUuY29udmVydFRvRm91bmREb2N1bWVudChlLnZlcnNpb24sIHIpLnNldEhhc0xvY2FsTXV0YXRpb25zKCksIFxuICAgICAgICBudWxsID09PSBuKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG4udW5pb25XaXRoKHQuZmllbGRNYXNrLmZpZWxkcykudW5pb25XaXRoKHQuZmllbGRUcmFuc2Zvcm1zLm1hcCgodCA9PiB0LmZpZWxkKSkpO1xuICAgIH1cbiAgICAvKipcbiAqIFJldHVybnMgYSBGaWVsZFBhdGgvVmFsdWUgbWFwIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIFBhdGNoTXV0YXRpb24uXG4gKi8gKHQsIGUsIG4sIHMpIDogZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBpZiAoQnModC5wcmVjb25kaXRpb24sIGUpKSByZXR1cm4gZS5jb252ZXJ0VG9Ob0RvY3VtZW50KGUudmVyc2lvbikuc2V0SGFzTG9jYWxNdXRhdGlvbnMoKSwgXG4gICAgICAgIG51bGw7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAvKipcbiAqIEEgbXV0YXRpb24gdGhhdCB2ZXJpZmllcyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGhcbiAqIHRoZSBwcm92aWRlZCBwcmVjb25kaXRpb24uXG4gKlxuICogVGhlIGB2ZXJpZnlgIG9wZXJhdGlvbiBpcyBvbmx5IHVzZWQgaW4gVHJhbnNhY3Rpb25zLCBhbmQgdGhpcyBjbGFzcyBzZXJ2ZXNcbiAqIHByaW1hcmlseSB0byBmYWNpbGl0YXRlIHNlcmlhbGl6YXRpb24gaW50byBwcm90b3MuXG4gKi8gKHQsIGUsIG4pO1xufVxuXG4vKipcbiAqIElmIHRoaXMgbXV0YXRpb24gaXMgbm90IGlkZW1wb3RlbnQsIHJldHVybnMgdGhlIGJhc2UgdmFsdWUgdG8gcGVyc2lzdCB3aXRoXG4gKiB0aGlzIG11dGF0aW9uLiBJZiBhIGJhc2UgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZSBtdXRhdGlvbiBpcyBhbHdheXMgYXBwbGllZFxuICogdG8gdGhpcyBiYXNlIHZhbHVlLCBldmVuIGlmIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZC5cbiAqXG4gKiBUaGUgYmFzZSB2YWx1ZSBpcyBhIHNwYXJzZSBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBvbmx5IHRoZSBkb2N1bWVudFxuICogZmllbGRzIGZvciB3aGljaCB0aGlzIG11dGF0aW9uIGNvbnRhaW5zIGEgbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtYXRpb25cbiAqIChlLmcuIGEgbnVtZXJpYyBpbmNyZW1lbnQpLiBUaGUgcHJvdmlkZWQgdmFsdWUgZ3VhcmFudGVlcyBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBmb3Igbm9uLWlkZW1wb3RlbnQgdHJhbnNmb3JtcyBhbmQgYWxsb3cgdXMgdG8gcmV0dXJuIHRoZSBzYW1lXG4gKiBsYXRlbmN5LWNvbXBlbnNhdGVkIHZhbHVlIGV2ZW4gaWYgdGhlIGJhY2tlbmQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGVcbiAqIG11dGF0aW9uLiBUaGUgYmFzZSB2YWx1ZSBpcyBudWxsIGZvciBpZGVtcG90ZW50IG11dGF0aW9ucywgYXMgdGhleSBjYW4gYmVcbiAqIHJlLXBsYXllZCBldmVuIGlmIHRoZSBiYWNrZW5kIGhhcyBhbHJlYWR5IGFwcGxpZWQgdGhlbS5cbiAqXG4gKiBAcmV0dXJucyBhIGJhc2UgdmFsdWUgdG8gc3RvcmUgYWxvbmcgd2l0aCB0aGUgbXV0YXRpb24sIG9yIG51bGwgZm9yXG4gKiBpZGVtcG90ZW50IG11dGF0aW9ucy5cbiAqLyBmdW5jdGlvbiBHcyh0LCBlKSB7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGZvciAoY29uc3QgcyBvZiB0LmZpZWxkVHJhbnNmb3Jtcykge1xuICAgICAgICBjb25zdCB0ID0gZS5kYXRhLmZpZWxkKHMuZmllbGQpLCBpID0gUHMocy50cmFuc2Zvcm0sIHQgfHwgbnVsbCk7XG4gICAgICAgIG51bGwgIT0gaSAmJiAobnVsbCA9PT0gbiAmJiAobiA9IHVuLmVtcHR5KCkpLCBuLnNldChzLmZpZWxkLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBuIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIFFzKHQsIGUpIHtcbiAgICByZXR1cm4gdC50eXBlID09PSBlLnR5cGUgJiYgKCEhdC5rZXkuaXNFcXVhbChlLmtleSkgJiYgKCEhdC5wcmVjb25kaXRpb24uaXNFcXVhbChlLnByZWNvbmRpdGlvbikgJiYgKCEhZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0ICYmIHZvaWQgMCA9PT0gZSB8fCAhKCF0IHx8ICFlKSAmJiBudCh0LCBlLCAoKHQsIGUpID0+ICRzKHQsIGUpKSk7XG4gICAgfSh0LmZpZWxkVHJhbnNmb3JtcywgZS5maWVsZFRyYW5zZm9ybXMpICYmICgwIC8qIE11dGF0aW9uVHlwZS5TZXQgKi8gPT09IHQudHlwZSA/IHQudmFsdWUuaXNFcXVhbChlLnZhbHVlKSA6IDEgLyogTXV0YXRpb25UeXBlLlBhdGNoICovICE9PSB0LnR5cGUgfHwgdC5kYXRhLmlzRXF1YWwoZS5kYXRhKSAmJiB0LmZpZWxkTWFzay5pc0VxdWFsKGUuZmllbGRNYXNrKSkpKSk7XG59XG5cbi8qKlxuICogQSBtdXRhdGlvbiB0aGF0IGNyZWF0ZXMgb3IgcmVwbGFjZXMgdGhlIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBrZXkgd2l0aCB0aGVcbiAqIG9iamVjdCB2YWx1ZSBjb250ZW50cy5cbiAqLyBjbGFzcyBqcyBleHRlbmRzIExzIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzID0gW10pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5rZXkgPSB0LCB0aGlzLnZhbHVlID0gZSwgdGhpcy5wcmVjb25kaXRpb24gPSBuLCB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IHMsIFxuICAgICAgICB0aGlzLnR5cGUgPSAwIC8qIE11dGF0aW9uVHlwZS5TZXQgKi87XG4gICAgfVxuICAgIGdldEZpZWxkTWFzaygpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5jbGFzcyB6cyBleHRlbmRzIExzIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpID0gW10pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5rZXkgPSB0LCB0aGlzLmRhdGEgPSBlLCB0aGlzLmZpZWxkTWFzayA9IG4sIHRoaXMucHJlY29uZGl0aW9uID0gcywgXG4gICAgICAgIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gaSwgdGhpcy50eXBlID0gMSAvKiBNdXRhdGlvblR5cGUuUGF0Y2ggKi87XG4gICAgfVxuICAgIGdldEZpZWxkTWFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRNYXNrO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gV3ModCkge1xuICAgIGNvbnN0IGUgPSBuZXcgTWFwO1xuICAgIHJldHVybiB0LmZpZWxkTWFzay5maWVsZHMuZm9yRWFjaCgobiA9PiB7XG4gICAgICAgIGlmICghbi5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0LmRhdGEuZmllbGQobik7XG4gICAgICAgICAgICBlLnNldChuLCBzKTtcbiAgICAgICAgfVxuICAgIH0pKSwgZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGlzdCBvZiBcInRyYW5zZm9ybSByZXN1bHRzXCIgKGEgdHJhbnNmb3JtIHJlc3VsdCBpcyBhIGZpZWxkIHZhbHVlXG4gKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIHRyYW5zZm9ybSkgZm9yIHVzZSBhZnRlciBhIG11dGF0aW9uXG4gKiBjb250YWluaW5nIHRyYW5zZm9ybXMgaGFzIGJlZW4gYWNrbm93bGVkZ2VkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogQHBhcmFtIGZpZWxkVHJhbnNmb3JtcyAtIFRoZSBmaWVsZCB0cmFuc2Zvcm1zIHRvIGFwcGx5IHRoZSByZXN1bHQgdG8uXG4gKiBAcGFyYW0gbXV0YWJsZURvY3VtZW50IC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50IGFmdGVyIGFwcGx5aW5nIGFsbFxuICogcHJldmlvdXMgbXV0YXRpb25zLlxuICogQHBhcmFtIHNlcnZlclRyYW5zZm9ybVJlc3VsdHMgLSBUaGUgdHJhbnNmb3JtIHJlc3VsdHMgcmVjZWl2ZWQgYnkgdGhlIHNlcnZlci5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm0gcmVzdWx0cyBsaXN0LlxuICovIGZ1bmN0aW9uIEhzKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gbmV3IE1hcDtcbiAgICBGKHQubGVuZ3RoID09PSBuLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0W2ldLCBvID0gci50cmFuc2Zvcm0sIHUgPSBlLmRhdGEuZmllbGQoci5maWVsZCk7XG4gICAgICAgIHMuc2V0KHIuZmllbGQsIFJzKG8sIHUsIG5baV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxpc3Qgb2YgXCJ0cmFuc2Zvcm0gcmVzdWx0c1wiIChhIHRyYW5zZm9ybSByZXN1bHQgaXMgYSBmaWVsZCB2YWx1ZVxuICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYSB0cmFuc2Zvcm0pIGZvciB1c2Ugd2hlbiBhcHBseWluZyBhXG4gKiB0cmFuc2Zvcm0gbG9jYWxseS5cbiAqXG4gKiBAcGFyYW0gZmllbGRUcmFuc2Zvcm1zIC0gVGhlIGZpZWxkIHRyYW5zZm9ybXMgdG8gYXBwbHkgdGhlIHJlc3VsdCB0by5cbiAqIEBwYXJhbSBsb2NhbFdyaXRlVGltZSAtIFRoZSBsb2NhbCB0aW1lIG9mIHRoZSBtdXRhdGlvbiAodXNlZCB0b1xuICogICAgIGdlbmVyYXRlIFNlcnZlclRpbWVzdGFtcFZhbHVlcykuXG4gKiBAcGFyYW0gbXV0YWJsZURvY3VtZW50IC0gVGhlIGRvY3VtZW50IHRvIGFwcGx5IHRyYW5zZm9ybXMgb24uXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtIHJlc3VsdHMgbGlzdC5cbiAqLyBmdW5jdGlvbiBKcyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IG5ldyBNYXA7XG4gICAgZm9yIChjb25zdCBpIG9mIHQpIHtcbiAgICAgICAgY29uc3QgdCA9IGkudHJhbnNmb3JtLCByID0gbi5kYXRhLmZpZWxkKGkuZmllbGQpO1xuICAgICAgICBzLnNldChpLmZpZWxkLCB2cyh0LCByLCBlKSk7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuXG4vKiogQSBtdXRhdGlvbiB0aGF0IGRlbGV0ZXMgdGhlIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBrZXkuICovIGNsYXNzIFlzIGV4dGVuZHMgTHMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5rZXkgPSB0LCB0aGlzLnByZWNvbmRpdGlvbiA9IGUsIHRoaXMudHlwZSA9IDIgLyogTXV0YXRpb25UeXBlLkRlbGV0ZSAqLyAsIFxuICAgICAgICB0aGlzLmZpZWxkVHJhbnNmb3JtcyA9IFtdO1xuICAgIH1cbiAgICBnZXRGaWVsZE1hc2soKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuY2xhc3MgWHMgZXh0ZW5kcyBMcyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmtleSA9IHQsIHRoaXMucHJlY29uZGl0aW9uID0gZSwgdGhpcy50eXBlID0gMyAvKiBNdXRhdGlvblR5cGUuVmVyaWZ5ICovICwgXG4gICAgICAgIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gW107XG4gICAgfVxuICAgIGdldEZpZWxkTWFzaygpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGJhdGNoIG9mIG11dGF0aW9ucyB0aGF0IHdpbGwgYmUgc2VudCBhcyBvbmUgdW5pdCB0byB0aGUgYmFja2VuZC5cbiAqLyBjbGFzcyBacyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGJhdGNoSWQgLSBUaGUgdW5pcXVlIElEIG9mIHRoaXMgbXV0YXRpb24gYmF0Y2guXG4gICAgICogQHBhcmFtIGxvY2FsV3JpdGVUaW1lIC0gVGhlIG9yaWdpbmFsIHdyaXRlIHRpbWUgb2YgdGhpcyBtdXRhdGlvbi5cbiAgICAgKiBAcGFyYW0gYmFzZU11dGF0aW9ucyAtIE11dGF0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBiYXNlXG4gICAgICogdmFsdWVzIHdoZW4gdGhpcyBtdXRhdGlvbiBpcyBhcHBsaWVkIGxvY2FsbHkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9jYWxseVxuICAgICAqIG92ZXJ3cml0ZSB2YWx1ZXMgdGhhdCBhcmUgcGVyc2lzdGVkIGluIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUuIEJhc2VcbiAgICAgKiBtdXRhdGlvbnMgYXJlIG5ldmVyIHNlbnQgdG8gdGhlIGJhY2tlbmQuXG4gICAgICogQHBhcmFtIG11dGF0aW9ucyAtIFRoZSB1c2VyLXByb3ZpZGVkIG11dGF0aW9ucyBpbiB0aGlzIG11dGF0aW9uIGJhdGNoLlxuICAgICAqIFVzZXItcHJvdmlkZWQgbXV0YXRpb25zIGFyZSBhcHBsaWVkIGJvdGggbG9jYWxseSBhbmQgcmVtb3RlbHkgb24gdGhlXG4gICAgICogYmFja2VuZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hJZCA9IHQsIHRoaXMubG9jYWxXcml0ZVRpbWUgPSBlLCB0aGlzLmJhc2VNdXRhdGlvbnMgPSBuLCB0aGlzLm11dGF0aW9ucyA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYWxsIHRoZSBtdXRhdGlvbnMgaW4gdGhpcyBNdXRhdGlvbkJhdGNoIHRvIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnRcbiAgICAgKiB0byBjb21wdXRlIHRoZSBzdGF0ZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnQgLSBUaGUgZG9jdW1lbnQgdG8gYXBwbHkgbXV0YXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSBiYXRjaFJlc3VsdCAtIFRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIE11dGF0aW9uQmF0Y2ggdG8gdGhlXG4gICAgICogYmFja2VuZC5cbiAgICAgKi8gICAgYXBwbHlUb1JlbW90ZURvY3VtZW50KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUubXV0YXRpb25SZXN1bHRzO1xuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IHRoaXMubXV0YXRpb25zLmxlbmd0aDsgZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy5tdXRhdGlvbnNbZV07XG4gICAgICAgICAgICBpZiAocy5rZXkuaXNFcXVhbCh0LmtleSkpIHtcbiAgICAgICAgICAgICAgICBVcyhzLCB0LCBuW2VdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbG9jYWwgdmlldyBvZiBhIGRvY3VtZW50IGdpdmVuIGFsbCB0aGUgbXV0YXRpb25zIGluIHRoaXNcbiAgICAgKiBiYXRjaC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB0byBhcHBseSBtdXRhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIG11dGF0ZWRGaWVsZHMgLSBGaWVsZHMgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCBiZWZvcmUgYXBwbHlpbmcgdGhpcyBtdXRhdGlvbiBiYXRjaC5cbiAgICAgKiBAcmV0dXJucyBBIGBGaWVsZE1hc2tgIHJlcHJlc2VudGluZyBhbGwgdGhlIGZpZWxkcyB0aGF0IGFyZSBtdXRhdGVkLlxuICAgICAqLyAgICBhcHBseVRvTG9jYWxWaWV3KHQsIGUpIHtcbiAgICAgICAgLy8gRmlyc3QsIGFwcGx5IHRoZSBiYXNlIHN0YXRlLiBUaGlzIGFsbG93cyB1cyB0byBhcHBseSBub24taWRlbXBvdGVudFxuICAgICAgICAvLyB0cmFuc2Zvcm0gYWdhaW5zdCBhIGNvbnNpc3RlbnQgc2V0IG9mIHZhbHVlcy5cbiAgICAgICAgZm9yIChjb25zdCBuIG9mIHRoaXMuYmFzZU11dGF0aW9ucykgbi5rZXkuaXNFcXVhbCh0LmtleSkgJiYgKGUgPSBLcyhuLCB0LCBlLCB0aGlzLmxvY2FsV3JpdGVUaW1lKSk7XG4gICAgICAgIC8vIFNlY29uZCwgYXBwbHkgYWxsIHVzZXItcHJvdmlkZWQgbXV0YXRpb25zLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLm11dGF0aW9ucykgbi5rZXkuaXNFcXVhbCh0LmtleSkgJiYgKGUgPSBLcyhuLCB0LCBlLCB0aGlzLmxvY2FsV3JpdGVUaW1lKSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbG9jYWwgdmlldyBmb3IgYWxsIHByb3ZpZGVkIGRvY3VtZW50cyBnaXZlbiB0aGUgbXV0YXRpb25zIGluXG4gICAgICogdGhpcyBiYXRjaC4gUmV0dXJucyBhIGBEb2N1bWVudEtleWAgdG8gYE11dGF0aW9uYCBtYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG9cbiAgICAgKiByZXBsYWNlIGFsbCB0aGUgbXV0YXRpb24gYXBwbGljYXRpb25zLlxuICAgICAqLyAgICBhcHBseVRvTG9jYWxEb2N1bWVudFNldCh0LCBlKSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBPKG5eMikuIElmIHdlIGFwcGx5IHRoZSBtdXRhdGlvbnNcbiAgICAgICAgLy8gZGlyZWN0bHkgKGFzIGRvbmUgaW4gYGFwcGx5VG9Mb2NhbFZpZXcoKWApLCB3ZSBjYW4gcmVkdWNlIHRoZSBjb21wbGV4aXR5XG4gICAgICAgIC8vIHRvIE8obikuXG4gICAgICAgIGNvbnN0IG4gPSBkcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tdXRhdGlvbnMuZm9yRWFjaCgocyA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gdC5nZXQocy5rZXkpLCByID0gaS5vdmVybGF5ZWREb2N1bWVudDtcbiAgICAgICAgICAgIC8vIFRPRE8obXV0YWJsZWRvY3VtZW50cyk6IFRoaXMgbWV0aG9kIHNob3VsZCB0YWtlIGEgTXV0YWJsZURvY3VtZW50TWFwXG4gICAgICAgICAgICAvLyBhbmQgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIGNhc3QuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbyA9IHRoaXMuYXBwbHlUb0xvY2FsVmlldyhyLCBpLm11dGF0ZWRGaWVsZHMpO1xuICAgICAgICAgICAgLy8gU2V0IG11dGF0ZWRGaWVsZHMgdG8gbnVsbCBpZiB0aGUgZG9jdW1lbnQgaXMgb25seSBmcm9tIGxvY2FsIG11dGF0aW9ucy5cbiAgICAgICAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIFNldCBvciBEZWxldGUgbXV0YXRpb24sIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGNyZWF0ZSBhXG4gICAgICAgICAgICAvLyBwYXRjaCBtdXRhdGlvbiBhcyB0aGUgb3ZlcmxheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBlLmhhcyhzLmtleSkgPyBudWxsIDogbztcbiAgICAgICAgICAgIGNvbnN0IHUgPSBxcyhyLCBvKTtcbiAgICAgICAgICAgIG51bGwgIT09IHUgJiYgbi5zZXQocy5rZXksIHUpLCByLmlzVmFsaWREb2N1bWVudCgpIHx8IHIuY29udmVydFRvTm9Eb2N1bWVudChydC5taW4oKSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXV0YXRpb25zLnJlZHVjZSgoKHQsIGUpID0+IHQuYWRkKGUua2V5KSksIGdzKCkpO1xuICAgIH1cbiAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmF0Y2hJZCA9PT0gdC5iYXRjaElkICYmIG50KHRoaXMubXV0YXRpb25zLCB0Lm11dGF0aW9ucywgKCh0LCBlKSA9PiBRcyh0LCBlKSkpICYmIG50KHRoaXMuYmFzZU11dGF0aW9ucywgdC5iYXNlTXV0YXRpb25zLCAoKHQsIGUpID0+IFFzKHQsIGUpKSk7XG4gICAgfVxufVxuXG4vKiogVGhlIHJlc3VsdCBvZiBhcHBseWluZyBhIG11dGF0aW9uIGJhdGNoIHRvIHRoZSBiYWNrZW5kLiAqLyBjbGFzcyB0aSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgXG4gICAgLyoqXG4gICAgICogQSBwcmUtY29tcHV0ZWQgbWFwcGluZyBmcm9tIGVhY2ggbXV0YXRlZCBkb2N1bWVudCB0byB0aGUgcmVzdWx0aW5nXG4gICAgICogdmVyc2lvbi5cbiAgICAgKi9cbiAgICBzKSB7XG4gICAgICAgIHRoaXMuYmF0Y2ggPSB0LCB0aGlzLmNvbW1pdFZlcnNpb24gPSBlLCB0aGlzLm11dGF0aW9uUmVzdWx0cyA9IG4sIHRoaXMuZG9jVmVyc2lvbnMgPSBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE11dGF0aW9uQmF0Y2hSZXN1bHQgZm9yIHRoZSBnaXZlbiBiYXRjaCBhbmQgcmVzdWx0cy4gVGhlcmVcbiAgICAgKiBtdXN0IGJlIG9uZSByZXN1bHQgZm9yIGVhY2ggbXV0YXRpb24gaW4gdGhlIGJhdGNoLiBUaGlzIHN0YXRpYyBmYWN0b3J5XG4gICAgICogY2FjaGVzIGEgZG9jdW1lbnQ9Jmd0O3ZlcnNpb24gbWFwcGluZyAoZG9jVmVyc2lvbnMpLlxuICAgICAqLyAgICBzdGF0aWMgZnJvbSh0LCBlLCBuKSB7XG4gICAgICAgIEYodC5tdXRhdGlvbnMubGVuZ3RoID09PSBuLmxlbmd0aCk7XG4gICAgICAgIGxldCBzID0gX3M7XG4gICAgICAgIGNvbnN0IGkgPSB0Lm11dGF0aW9ucztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBpLmxlbmd0aDsgdCsrKSBzID0gcy5pbnNlcnQoaVt0XS5rZXksIG5bdF0udmVyc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgdGkodCwgZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBvdmVybGF5IGNvbXB1dGVkIGJ5IEZpcmVzdG9yZS5cbiAqXG4gKiBIb2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIG11dGF0aW9uIGFuZCB0aGUgbGFyZ2VzdCBiYXRjaCBpZCBpbiBGaXJlc3RvcmUgd2hlblxuICogdGhlIG11dGF0aW9uIHdhcyBjcmVhdGVkLlxuICovIGNsYXNzIGVpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMubGFyZ2VzdEJhdGNoSWQgPSB0LCB0aGlzLm11dGF0aW9uID0gZTtcbiAgICB9XG4gICAgZ2V0S2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdXRhdGlvbi5rZXk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gdCAmJiB0aGlzLm11dGF0aW9uID09PSB0Lm11dGF0aW9uO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBPdmVybGF5e1xcbiAgICAgIGxhcmdlc3RCYXRjaElkOiAke3RoaXMubGFyZ2VzdEJhdGNoSWR9LFxcbiAgICAgIG11dGF0aW9uOiAke3RoaXMubXV0YXRpb24udG9TdHJpbmcoKX1cXG4gICAgfWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQWdncmVnYXRlIHR5cGUuXG4gKi8gY2xhc3Mgbmkge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5hbGlhcyA9IHQsIHRoaXMueXQgPSBlLCB0aGlzLmZpZWxkUGF0aCA9IG47XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBzaSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmNvdW50ID0gdCwgdGhpcy51bmNoYW5nZWROYW1lcyA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBFcnJvciBDb2RlcyBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgd2F5cyBHUlBDIGNhbiBmYWlsLiBUaGVzZSBhcmUgY29waWVkXG4gKiBkaXJlY3RseSBmcm9tIEdSUEMncyBzb3VyY2VzIGhlcmU6XG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2dycGMvZ3JwYy9ibG9iL2JjZWVjOTRlYTRmYzVmMDA4NWQ4MTIzNWQ4ZTFjMDY3OThkYzM0MWEvaW5jbHVkZS9ncnBjJTJCJTJCL2ltcGwvY29kZWdlbi9zdGF0dXNfY29kZV9lbnVtLmhcbiAqXG4gKiBJbXBvcnRhbnQhIFRoZSBuYW1lcyBvZiB0aGVzZSBpZGVudGlmaWVycyBtYXR0ZXIgYmVjYXVzZSB0aGUgc3RyaW5nIGZvcm1zXG4gKiBhcmUgdXNlZCBmb3IgcmV2ZXJzZSBsb29rdXBzIGZyb20gdGhlIHdlYmNoYW5uZWwgc3RyZWFtLiBEbyBOT1QgY2hhbmdlIHRoZVxuICogbmFtZXMgb2YgdGhlc2UgaWRlbnRpZmllcnMgb3IgY2hhbmdlIHRoaXMgaW50byBhIGNvbnN0IGVudW0uXG4gKi8gdmFyIGlpLCByaTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXJyb3IgY29kZSByZXByZXNlbnRzIGEgcGVybWFuZW50IGVycm9yIHdoZW4gcmVjZWl2ZWRcbiAqIGluIHJlc3BvbnNlIHRvIGEgbm9uLXdyaXRlIG9wZXJhdGlvbi5cbiAqXG4gKiBTZWUgaXNQZXJtYW5lbnRXcml0ZUVycm9yIGZvciBjbGFzc2lmeWluZyB3cml0ZSBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIG9pKHQpIHtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPKCk7XG5cbiAgICAgIGNhc2UgcS5DQU5DRUxMRUQ6XG4gICAgICBjYXNlIHEuVU5LTk9XTjpcbiAgICAgIGNhc2UgcS5ERUFETElORV9FWENFRURFRDpcbiAgICAgIGNhc2UgcS5SRVNPVVJDRV9FWEhBVVNURUQ6XG4gICAgICBjYXNlIHEuSU5URVJOQUw6XG4gICAgICBjYXNlIHEuVU5BVkFJTEFCTEU6XG4gLy8gVW5hdXRoZW50aWNhdGVkIG1lYW5zIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggb3VyIHRva2VuIGFuZCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIHJldHJ5IHdpdGggbmV3IGNyZWRlbnRpYWxzIHdoaWNoIHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICAgIGNhc2UgcS5VTkFVVEhFTlRJQ0FURUQ6XG4gICAgICAgIHJldHVybiAhMTtcblxuICAgICAgY2FzZSBxLklOVkFMSURfQVJHVU1FTlQ6XG4gICAgICBjYXNlIHEuTk9UX0ZPVU5EOlxuICAgICAgY2FzZSBxLkFMUkVBRFlfRVhJU1RTOlxuICAgICAgY2FzZSBxLlBFUk1JU1NJT05fREVOSUVEOlxuICAgICAgY2FzZSBxLkZBSUxFRF9QUkVDT05ESVRJT046XG4gLy8gQWJvcnRlZCBtaWdodCBiZSByZXRyaWVkIGluIHNvbWUgc2NlbmFyaW9zLCBidXQgdGhhdCBpcyBkZXBlbmRhbnQgb25cbiAgICAgICAgLy8gdGhlIGNvbnRleHQgYW5kIHNob3VsZCBoYW5kbGVkIGluZGl2aWR1YWxseSBieSB0aGUgY2FsbGluZyBjb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwaXMvZGVzaWduL2Vycm9ycy5cbiAgICAgICAgICAgICAgY2FzZSBxLkFCT1JURUQ6XG4gICAgICBjYXNlIHEuT1VUX09GX1JBTkdFOlxuICAgICAgY2FzZSBxLlVOSU1QTEVNRU5URUQ6XG4gICAgICBjYXNlIHEuREFUQV9MT1NTOlxuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBlcnJvciBjb2RlIHJlcHJlc2VudHMgYSBwZXJtYW5lbnQgZXJyb3Igd2hlbiByZWNlaXZlZFxuICogaW4gcmVzcG9uc2UgdG8gYSB3cml0ZSBvcGVyYXRpb24uXG4gKlxuICogV3JpdGUgb3BlcmF0aW9ucyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UgYXMgb2YgYi8xMTk0Mzc3NjQsIEFCT1JURURcbiAqIGVycm9ycyBvbiB0aGUgd3JpdGUgc3RyZWFtIHNob3VsZCBiZSByZXRyaWVkIHRvbyAoZXZlbiB0aG91Z2ggQUJPUlRFRCBlcnJvcnNcbiAqIGFyZSBub3QgZ2VuZXJhbGx5IHJldHJ5YWJsZSkuXG4gKlxuICogTm90ZSB0aGF0IGR1cmluZyB0aGUgaW5pdGlhbCBoYW5kc2hha2Ugb24gdGhlIHdyaXRlIHN0cmVhbSBhbiBBQk9SVEVEIGVycm9yXG4gKiBzaWduYWxzIHRoYXQgd2Ugc2hvdWxkIGRpc2NhcmQgb3VyIHN0cmVhbSB0b2tlbiAoaS5lLiBpdCBpcyBwZXJtYW5lbnQpLiBUaGlzXG4gKiBtZWFucyBhIGhhbmRzaGFrZSBlcnJvciBzaG91bGQgYmUgY2xhc3NpZmllZCB3aXRoIGlzUGVybWFuZW50RXJyb3IsIGFib3ZlLlxuICovXG4vKipcbiAqIE1hcHMgYW4gZXJyb3IgQ29kZSBmcm9tIEdSUEMgc3RhdHVzIGNvZGUgbnVtYmVyLCBsaWtlIDAsIDEsIG9yIDE0LiBUaGVzZVxuICogYXJlIG5vdCB0aGUgc2FtZSBhcyBIVFRQIHN0YXR1cyBjb2Rlcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgQ29kZSBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbiBHUlBDIHN0YXR1cyBjb2RlLiBGYWlscyBpZiB0aGVyZVxuICogICAgIGlzIG5vIG1hdGNoLlxuICovXG5mdW5jdGlvbiB1aSh0KSB7XG4gICAgaWYgKHZvaWQgMCA9PT0gdCkgXG4gICAgLy8gVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLCBidXQgaW4gY2VydGFpbiBlcnJvciBjYXNlcyAobGlrZSB0cnlpbmdcbiAgICAvLyB0byBzZW5kIGludmFsaWQgcHJvdG8gbWVzc2FnZXMpIHdlIG1heSBnZXQgYW4gZXJyb3Igd2l0aCBubyBHUlBDIGNvZGUuXG4gICAgcmV0dXJuIGsoXCJHUlBDIGVycm9yIGhhcyBubyAuY29kZVwiKSwgcS5VTktOT1dOO1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgY2FzZSBpaS5PSzpcbiAgICAgICAgcmV0dXJuIHEuT0s7XG5cbiAgICAgIGNhc2UgaWkuQ0FOQ0VMTEVEOlxuICAgICAgICByZXR1cm4gcS5DQU5DRUxMRUQ7XG5cbiAgICAgIGNhc2UgaWkuVU5LTk9XTjpcbiAgICAgICAgcmV0dXJuIHEuVU5LTk9XTjtcblxuICAgICAgY2FzZSBpaS5ERUFETElORV9FWENFRURFRDpcbiAgICAgICAgcmV0dXJuIHEuREVBRExJTkVfRVhDRUVERUQ7XG5cbiAgICAgIGNhc2UgaWkuUkVTT1VSQ0VfRVhIQVVTVEVEOlxuICAgICAgICByZXR1cm4gcS5SRVNPVVJDRV9FWEhBVVNURUQ7XG5cbiAgICAgIGNhc2UgaWkuSU5URVJOQUw6XG4gICAgICAgIHJldHVybiBxLklOVEVSTkFMO1xuXG4gICAgICBjYXNlIGlpLlVOQVZBSUxBQkxFOlxuICAgICAgICByZXR1cm4gcS5VTkFWQUlMQUJMRTtcblxuICAgICAgY2FzZSBpaS5VTkFVVEhFTlRJQ0FURUQ6XG4gICAgICAgIHJldHVybiBxLlVOQVVUSEVOVElDQVRFRDtcblxuICAgICAgY2FzZSBpaS5JTlZBTElEX0FSR1VNRU5UOlxuICAgICAgICByZXR1cm4gcS5JTlZBTElEX0FSR1VNRU5UO1xuXG4gICAgICBjYXNlIGlpLk5PVF9GT1VORDpcbiAgICAgICAgcmV0dXJuIHEuTk9UX0ZPVU5EO1xuXG4gICAgICBjYXNlIGlpLkFMUkVBRFlfRVhJU1RTOlxuICAgICAgICByZXR1cm4gcS5BTFJFQURZX0VYSVNUUztcblxuICAgICAgY2FzZSBpaS5QRVJNSVNTSU9OX0RFTklFRDpcbiAgICAgICAgcmV0dXJuIHEuUEVSTUlTU0lPTl9ERU5JRUQ7XG5cbiAgICAgIGNhc2UgaWkuRkFJTEVEX1BSRUNPTkRJVElPTjpcbiAgICAgICAgcmV0dXJuIHEuRkFJTEVEX1BSRUNPTkRJVElPTjtcblxuICAgICAgY2FzZSBpaS5BQk9SVEVEOlxuICAgICAgICByZXR1cm4gcS5BQk9SVEVEO1xuXG4gICAgICBjYXNlIGlpLk9VVF9PRl9SQU5HRTpcbiAgICAgICAgcmV0dXJuIHEuT1VUX09GX1JBTkdFO1xuXG4gICAgICBjYXNlIGlpLlVOSU1QTEVNRU5URUQ6XG4gICAgICAgIHJldHVybiBxLlVOSU1QTEVNRU5URUQ7XG5cbiAgICAgIGNhc2UgaWkuREFUQV9MT1NTOlxuICAgICAgICByZXR1cm4gcS5EQVRBX0xPU1M7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEhUVFAgcmVzcG9uc2UncyBlcnJvciBzdGF0dXMgdG8gdGhlIGVxdWl2YWxlbnQgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0gc3RhdHVzIC0gQW4gSFRUUCBlcnJvciByZXNwb25zZSBzdGF0dXMgKFwiRkFJTEVEX1BSRUNPTkRJVElPTlwiLFxuICogXCJVTktOT1dOXCIsIGV0Yy4pXG4gKiBAcmV0dXJucyBUaGUgZXF1aXZhbGVudCBDb2RlLiBOb24tbWF0Y2hpbmcgcmVzcG9uc2VzIGFyZSBtYXBwZWQgdG9cbiAqICAgICBDb2RlLlVOS05PV04uXG4gKi8gKHJpID0gaWkgfHwgKGlpID0ge30pKVtyaS5PSyA9IDBdID0gXCJPS1wiLCByaVtyaS5DQU5DRUxMRUQgPSAxXSA9IFwiQ0FOQ0VMTEVEXCIsIFxucmlbcmkuVU5LTk9XTiA9IDJdID0gXCJVTktOT1dOXCIsIHJpW3JpLklOVkFMSURfQVJHVU1FTlQgPSAzXSA9IFwiSU5WQUxJRF9BUkdVTUVOVFwiLCBcbnJpW3JpLkRFQURMSU5FX0VYQ0VFREVEID0gNF0gPSBcIkRFQURMSU5FX0VYQ0VFREVEXCIsIHJpW3JpLk5PVF9GT1VORCA9IDVdID0gXCJOT1RfRk9VTkRcIiwgXG5yaVtyaS5BTFJFQURZX0VYSVNUUyA9IDZdID0gXCJBTFJFQURZX0VYSVNUU1wiLCByaVtyaS5QRVJNSVNTSU9OX0RFTklFRCA9IDddID0gXCJQRVJNSVNTSU9OX0RFTklFRFwiLCBcbnJpW3JpLlVOQVVUSEVOVElDQVRFRCA9IDE2XSA9IFwiVU5BVVRIRU5USUNBVEVEXCIsIHJpW3JpLlJFU09VUkNFX0VYSEFVU1RFRCA9IDhdID0gXCJSRVNPVVJDRV9FWEhBVVNURURcIiwgXG5yaVtyaS5GQUlMRURfUFJFQ09ORElUSU9OID0gOV0gPSBcIkZBSUxFRF9QUkVDT05ESVRJT05cIiwgcmlbcmkuQUJPUlRFRCA9IDEwXSA9IFwiQUJPUlRFRFwiLCBcbnJpW3JpLk9VVF9PRl9SQU5HRSA9IDExXSA9IFwiT1VUX09GX1JBTkdFXCIsIHJpW3JpLlVOSU1QTEVNRU5URUQgPSAxMl0gPSBcIlVOSU1QTEVNRU5URURcIiwgXG5yaVtyaS5JTlRFUk5BTCA9IDEzXSA9IFwiSU5URVJOQUxcIiwgcmlbcmkuVU5BVkFJTEFCTEUgPSAxNF0gPSBcIlVOQVZBSUxBQkxFXCIsIHJpW3JpLkRBVEFfTE9TUyA9IDE1XSA9IFwiREFUQV9MT1NTXCI7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIE1hbmFnZXMgXCJ0ZXN0aW5nIGhvb2tzXCIsIGhvb2tzIGludG8gdGhlIGludGVybmFscyBvZiB0aGUgU0RLIHRvIHZlcmlmeVxuICogaW50ZXJuYWwgc3RhdGUgYW5kIGV2ZW50cyBkdXJpbmcgaW50ZWdyYXRpb24gdGVzdHMuIERvIG5vdCB1c2UgdGhpcyBjbGFzc1xuICogZXhjZXB0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byByZXRyaWV2ZSB0aGUgZ2xvYmFsIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzOlxuICogMS4gVGhlIGBpbnN0YW5jZWAgcHJvcGVydHksIHdoaWNoIHJldHVybnMgbnVsbCBpZiB0aGUgZ2xvYmFsIHNpbmdsZXRvblxuICogICAgICBpbnN0YW5jZSBoYXMgbm90IGJlZW4gY3JlYXRlZC4gVXNlIHRoaXMgcHJvcGVydHkgaWYgdGhlIGNhbGxlciBzaG91bGRcbiAqICAgICAgXCJkbyBub3RoaW5nXCIgaWYgdGhlcmUgYXJlIG5vIHRlc3RpbmcgaG9va3MgcmVnaXN0ZXJlZCwgc3VjaCBhcyB3aGVuXG4gKiAgICAgIGRlbGl2ZXJpbmcgYW4gZXZlbnQgdG8gbm90aWZ5IHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICogMi4gVGhlIGBnZXRPckNyZWF0ZUluc3RhbmNlKClgIG1ldGhvZCwgd2hpY2ggY3JlYXRlcyB0aGUgZ2xvYmFsIHNpbmdsZXRvblxuICogICAgICBpbnN0YW5jZSBpZiBpdCBoYXMgbm90IGJlZW4gY3JlYXRlZC4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZSBpbnN0YW5jZSBpc1xuICogICAgICBuZWVkZWQgdG8sIGZvciBleGFtcGxlLCByZWdpc3RlciBhIGNhbGxiYWNrLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBjaSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMub25FeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaENhbGxiYWNrcyA9IG5ldyBNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBvciBudWxsIGlmIGl0IGhhcyBub3QgYmVlblxuICAgICAqIGluaXRpYWxpemVkLlxuICAgICAqLyAgICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4gYWk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBjcmVhdGluZyBpdCBpZiBpcyBoYXMgbmV2ZXJcbiAgICAgKiBiZWVuIGNyZWF0ZWQgYmVmb3JlLlxuICAgICAqLyAgICBzdGF0aWMgZ2V0T3JDcmVhdGVJbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgPT09IGFpICYmIChhaSA9IG5ldyBjaSksIGFpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBub3RpZmllZCB3aGVuIGFuIGV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2hcbiAgICAgKiBvY2N1cnMgaW4gdGhlIFdhdGNoIGxpc3RlbiBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBUaGUgcmVsYXRpdmUgb3JkZXIgaW4gd2hpY2ggY2FsbGJhY2tzIGFyZSBub3RpZmllZCBpcyB1bnNwZWNpZmllZDsgZG8gbm90XG4gICAgICogcmVseSBvbiBhbnkgcGFydGljdWxhciBvcmRlcmluZy4gSWYgYSBnaXZlbiBjYWxsYmFjayBpcyByZWdpc3RlcmVkIG11bHRpcGxlXG4gICAgICogdGltZXMgdGhlbiBpdCB3aWxsIGJlIG5vdGlmaWVkIG11bHRpcGxlIHRpbWVzLCBvbmNlIHBlciByZWdpc3RyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZSB1cG9uIGV4aXN0ZW5jZSBmaWx0ZXIgbWlzbWF0Y2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHVucmVnaXN0ZXJzIHRoZSBnaXZlbiBjYWxsYmFjazsgb25seVxuICAgICAqIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBkb2VzIGFueXRoaW5nOyBhbGwgc3Vic2VxdWVudFxuICAgICAqIGludm9jYXRpb25zIGRvIG5vdGhpbmcuXG4gICAgICovICAgIG9uRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2godCkge1xuICAgICAgICBjb25zdCBlID0gU3ltYm9sKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm9uRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hDYWxsYmFja3Muc2V0KGUsIHQpLCAoKSA9PiB0aGlzLm9uRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hDYWxsYmFja3MuZGVsZXRlKGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGFsbCBjdXJyZW50bHktcmVnaXN0ZXJlZCBgb25FeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaGAgY2FsbGJhY2tzLlxuICAgICAqIEBwYXJhbSBpbmZvIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoLlxuICAgICAqLyAgICBub3RpZnlPbkV4aXN0ZW5jZUZpbHRlck1pc21hdGNoKHQpIHtcbiAgICAgICAgdGhpcy5vbkV4aXN0ZW5jZUZpbHRlck1pc21hdGNoQ2FsbGJhY2tzLmZvckVhY2goKGUgPT4gZSh0KSkpO1xuICAgIH1cbn1cblxuLyoqIFRoZSBnbG9iYWwgc2luZ2xldG9uIGluc3RhbmNlIG9mIGBUZXN0aW5nSG9va3NgLiAqLyBsZXQgYWkgPSBudWxsO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgUGxhdGZvcm0ncyAnVGV4dEVuY29kZXInIGltcGxlbWVudGF0aW9uLlxuICovIGZ1bmN0aW9uIGhpKCkge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXI7XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFBsYXRmb3JtJ3MgJ1RleHREZWNvZGVyJyBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNvbnN0IGxpID0gbmV3IEludGVnZXIoWyA0Mjk0OTY3Mjk1LCA0Mjk0OTY3Mjk1IF0sIDApO1xuXG4vLyBIYXNoIGEgc3RyaW5nIHVzaW5nIG1kNSBoYXNoaW5nIGFsZ29yaXRobS5cbmZ1bmN0aW9uIGZpKHQpIHtcbiAgICBjb25zdCBlID0gaGkoKS5lbmNvZGUodCksIG4gPSBuZXcgTWQ1O1xuICAgIHJldHVybiBuLnVwZGF0ZShlKSwgbmV3IFVpbnQ4QXJyYXkobi5kaWdlc3QoKSk7XG59XG5cbi8vIEludGVycHJldCB0aGUgMTYgYnl0ZXMgYXJyYXkgYXMgdHdvIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgZW5jb2RlZCB1c2luZ1xuLy8gMuKAmXMgY29tcGxlbWVudCB1c2luZyBsaXR0bGUgZW5kaWFuLlxuZnVuY3Rpb24gZGkodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgRGF0YVZpZXcodC5idWZmZXIpLCBuID0gZS5nZXRVaW50MzIoMCwgLyogbGl0dGxlRW5kaWFuPSAqLyAhMCksIHMgPSBlLmdldFVpbnQzMig0LCAvKiBsaXR0bGVFbmRpYW49ICovICEwKSwgaSA9IGUuZ2V0VWludDMyKDgsIC8qIGxpdHRsZUVuZGlhbj0gKi8gITApLCByID0gZS5nZXRVaW50MzIoMTIsIC8qIGxpdHRsZUVuZGlhbj0gKi8gITApO1xuICAgIHJldHVybiBbIG5ldyBJbnRlZ2VyKFsgbiwgcyBdLCAwKSwgbmV3IEludGVnZXIoWyBpLCByIF0sIDApIF07XG59XG5cbmNsYXNzIHdpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIGlmICh0aGlzLmJpdG1hcCA9IHQsIHRoaXMucGFkZGluZyA9IGUsIHRoaXMuaGFzaENvdW50ID0gbiwgZSA8IDAgfHwgZSA+PSA4KSB0aHJvdyBuZXcgX2koYEludmFsaWQgcGFkZGluZzogJHtlfWApO1xuICAgICAgICBpZiAobiA8IDApIHRocm93IG5ldyBfaShgSW52YWxpZCBoYXNoIGNvdW50OiAke259YCk7XG4gICAgICAgIGlmICh0Lmxlbmd0aCA+IDAgJiYgMCA9PT0gdGhpcy5oYXNoQ291bnQpIFxuICAgICAgICAvLyBPbmx5IGVtcHR5IGJsb29tIGZpbHRlciBjYW4gaGF2ZSAwIGhhc2ggY291bnQuXG4gICAgICAgIHRocm93IG5ldyBfaShgSW52YWxpZCBoYXNoIGNvdW50OiAke259YCk7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCAmJiAwICE9PSBlKSBcbiAgICAgICAgLy8gRW1wdHkgYmxvb20gZmlsdGVyIHNob3VsZCBoYXZlIDAgcGFkZGluZy5cbiAgICAgICAgdGhyb3cgbmV3IF9pKGBJbnZhbGlkIHBhZGRpbmcgd2hlbiBiaXRtYXAgbGVuZ3RoIGlzIDA6ICR7ZX1gKTtcbiAgICAgICAgdGhpcy5JdCA9IDggKiB0Lmxlbmd0aCAtIGUsIFxuICAgICAgICAvLyBTZXQgdGhlIGJpdCBjb3VudCBpbiBJbnRlZ2VyIHRvIGF2b2lkIHJlcGV0aXRpb24gaW4gbWlnaHRDb250YWluKCkuXG4gICAgICAgIHRoaXMuVHQgPSBJbnRlZ2VyLmZyb21OdW1iZXIodGhpcy5JdCk7XG4gICAgfVxuICAgIC8vIENhbGN1bGF0ZSB0aGUgaXRoIGhhc2ggdmFsdWUgYmFzZWQgb24gdGhlIGhhc2hlZCA2NGJpdCBpbnRlZ2VycyxcbiAgICAvLyBhbmQgY2FsY3VsYXRlIGl0cyBjb3JyZXNwb25kaW5nIGJpdCBpbmRleCBpbiB0aGUgYml0bWFwIHRvIGJlIGNoZWNrZWQuXG4gICAgRXQodCwgZSwgbikge1xuICAgICAgICAvLyBDYWxjdWxhdGUgaGFzaGVkIHZhbHVlIGgoaSkgPSBoMSArIChpICogaDIpLlxuICAgICAgICBsZXQgcyA9IHQuYWRkKGUubXVsdGlwbHkoSW50ZWdlci5mcm9tTnVtYmVyKG4pKSk7XG4gICAgICAgIC8vIFdyYXAgaWYgaGFzaCB2YWx1ZSBvdmVyZmxvdyA2NGJpdC5cbiAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gcy5jb21wYXJlKGxpKSAmJiAocyA9IG5ldyBJbnRlZ2VyKFsgcy5nZXRCaXRzKDApLCBzLmdldEJpdHMoMSkgXSwgMCkpLCBcbiAgICAgICAgcy5tb2R1bG8odGhpcy5UdCkudG9OdW1iZXIoKTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGJpdCBvbiB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIGJpdG1hcCBpcyBzZXQgdG8gMS5cbiAgICBBdCh0KSB7XG4gICAgICAgIHJldHVybiAwICE9ICh0aGlzLmJpdG1hcFtNYXRoLmZsb29yKHQgLyA4KV0gJiAxIDw8IHQgJSA4KTtcbiAgICB9XG4gICAgdnQodCkge1xuICAgICAgICAvLyBFbXB0eSBiaXRtYXAgc2hvdWxkIGFsd2F5cyByZXR1cm4gZmFsc2Ugb24gbWVtYmVyc2hpcCBjaGVjay5cbiAgICAgICAgaWYgKDAgPT09IHRoaXMuSXQpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IGZpKHQpLCBbbiwgc10gPSBkaShlKTtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0aGlzLmhhc2hDb3VudDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5FdChuLCBzLCB0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5BdChlKSkgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgLyoqIENyZWF0ZSBibG9vbSBmaWx0ZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gKi8gICAgc3RhdGljIGNyZWF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0ICUgOCA9PSAwID8gMCA6IDggLSB0ICUgOCwgaSA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbCh0IC8gOCkpLCByID0gbmV3IHdpKGksIHMsIGUpO1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCh0ID0+IHIuaW5zZXJ0KHQpKSksIHI7XG4gICAgfVxuICAgIGluc2VydCh0KSB7XG4gICAgICAgIGlmICgwID09PSB0aGlzLkl0KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGUgPSBmaSh0KSwgW24sIHNdID0gZGkoZSk7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5oYXNoQ291bnQ7IHQrKykge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuRXQobiwgcywgdCk7XG4gICAgICAgICAgICB0aGlzLlJ0KGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJ0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IE1hdGguZmxvb3IodCAvIDgpLCBuID0gdCAlIDg7XG4gICAgICAgIHRoaXMuYml0bWFwW2VdIHw9IDEgPDwgbjtcbiAgICB9XG59XG5cbmNsYXNzIF9pIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLm5hbWUgPSBcIkJsb29tRmlsdGVyRXJyb3JcIjtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGV2ZW50IGZyb20gdGhlIFJlbW90ZVN0b3JlLiBJdCBpcyBzcGxpdCBpbnRvIHRhcmdldENoYW5nZXMgKGNoYW5nZXMgdG8gdGhlXG4gKiBzdGF0ZSBvciB0aGUgc2V0IG9mIGRvY3VtZW50cyBpbiBvdXIgd2F0Y2hlZCB0YXJnZXRzKSBhbmQgZG9jdW1lbnRVcGRhdGVzXG4gKiAoY2hhbmdlcyB0byB0aGUgYWN0dWFsIGRvY3VtZW50cykuXG4gKi8gY2xhc3MgbWkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBzbmFwc2hvdCB2ZXJzaW9uIHRoaXMgZXZlbnQgYnJpbmdzIHVzIHVwIHRvLCBvciBNSU4gaWYgbm90IHNldC5cbiAgICAgKi9cbiAgICB0LCBcbiAgICAvKipcbiAgICAgKiBBIG1hcCBmcm9tIHRhcmdldCB0byBjaGFuZ2VzIHRvIHRoZSB0YXJnZXQuIFNlZSBUYXJnZXRDaGFuZ2UuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgdGFyZ2V0cyB0aGF0IGlzIGtub3duIHRvIGJlIGluY29uc2lzdGVudCwgYW5kIHRoZSBwdXJwb3NlIGZvclxuICAgICAqIHJlLWxpc3RlbmluZy4gTGlzdGVucyBmb3IgdGhlc2UgdGFyZ2V0cyBzaG91bGQgYmUgcmUtZXN0YWJsaXNoZWQgd2l0aG91dFxuICAgICAqIHJlc3VtZSB0b2tlbnMuXG4gICAgICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2Ygd2hpY2ggZG9jdW1lbnRzIGhhdmUgY2hhbmdlZCBvciBiZWVuIGRlbGV0ZWQsIGFsb25nIHdpdGggdGhlXG4gICAgICogZG9jJ3MgbmV3IHZhbHVlcyAoaWYgbm90IGRlbGV0ZWQpLlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHdoaWNoIGRvY3VtZW50IHVwZGF0ZXMgYXJlIGR1ZSBvbmx5IHRvIGxpbWJvIHJlc29sdXRpb24gdGFyZ2V0cy5cbiAgICAgKi9cbiAgICBpKSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RWZXJzaW9uID0gdCwgdGhpcy50YXJnZXRDaGFuZ2VzID0gZSwgdGhpcy50YXJnZXRNaXNtYXRjaGVzID0gbiwgdGhpcy5kb2N1bWVudFVwZGF0ZXMgPSBzLCBcbiAgICAgICAgdGhpcy5yZXNvbHZlZExpbWJvRG9jdW1lbnRzID0gaTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSEFDSzogVmlld3MgcmVxdWlyZSBSZW1vdGVFdmVudHMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZpZXcgaXNcbiAgICAgKiBDVVJSRU5ULCBidXQgc2Vjb25kYXJ5IHRhYnMgZG9uJ3QgcmVjZWl2ZSByZW1vdGUgZXZlbnRzLiBTbyB0aGlzIG1ldGhvZCBpc1xuICAgICAqIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgUmVtb3RlRXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBhXG4gICAgICogQ1VSUkVOVCBzdGF0dXMgY2hhbmdlIHRvIGEgVmlldywgZm9yIHF1ZXJpZXMgZXhlY3V0ZWQgaW4gYSBkaWZmZXJlbnQgdGFiLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHlcbiAgICBzdGF0aWMgY3JlYXRlU3ludGhlc2l6ZWRSZW1vdGVFdmVudEZvckN1cnJlbnRDaGFuZ2UodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gbmV3IE1hcDtcbiAgICAgICAgcmV0dXJuIHMuc2V0KHQsIGdpLmNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlLCBuKSksIG5ldyBtaShydC5taW4oKSwgcywgbmV3IHBlKGV0KSwgY3MoKSwgZ3MoKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgVGFyZ2V0Q2hhbmdlIHNwZWNpZmllcyB0aGUgc2V0IG9mIGNoYW5nZXMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAqIGEgUmVtb3RlRXZlbnQuIFRoZXNlIGNoYW5nZXMgdHJhY2sgd2hpY2ggZG9jdW1lbnRzIGFyZSBhZGRlZCwgbW9kaWZpZWQgb3JcbiAqIHJlbW92ZWQsIGFzIHdlbGwgYXMgdGhlIHRhcmdldCdzIHJlc3VtZSB0b2tlbiBhbmQgd2hldGhlciB0aGUgdGFyZ2V0IGlzXG4gKiBtYXJrZWQgQ1VSUkVOVC5cbiAqIFRoZSBhY3R1YWwgY2hhbmdlcyAqdG8qIGRvY3VtZW50cyBhcmUgbm90IHBhcnQgb2YgdGhlIFRhcmdldENoYW5nZSBzaW5jZVxuICogZG9jdW1lbnRzIG1heSBiZSBwYXJ0IG9mIG11bHRpcGxlIHRhcmdldHMuXG4gKi8gY2xhc3MgZ2kge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEFuIG9wYXF1ZSwgc2VydmVyLWFzc2lnbmVkIHRva2VuIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGEgcXVlcnkgdG8gYmUgcmVzdW1lZFxuICAgICAqIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAqIHF1ZXJ5LiBUaGUgcmVzdW1lIHRva2VuIGVzc2VudGlhbGx5IGlkZW50aWZpZXMgYSBwb2ludCBpbiB0aW1lIGZyb20gd2hpY2hcbiAgICAgKiB0aGUgc2VydmVyIHNob3VsZCByZXN1bWUgc2VuZGluZyByZXN1bHRzLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSBcImN1cnJlbnRcIiAoc3luY2VkKSBzdGF0dXMgb2YgdGhpcyB0YXJnZXQuIE5vdGUgdGhhdCBcImN1cnJlbnRcIlxuICAgICAqIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlIFJQQyBwcm90b2NvbCB0aGF0IGltcGxpZXMgdGhhdCBhIHRhcmdldCBpc1xuICAgICAqIGJvdGggdXAtdG8tZGF0ZSBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB3YXRjaCBzdHJlYW0uXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBkb2N1bWVudHMgdGhhdCB3ZXJlIG5ld2x5IGFzc2lnbmVkIHRvIHRoaXMgdGFyZ2V0IGFzIHBhcnQgb2ZcbiAgICAgKiB0aGlzIHJlbW90ZSBldmVudC5cbiAgICAgKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGlzIHRhcmdldCBidXQgcmVjZWl2ZWRcbiAgICAgKiBhbiB1cGRhdGUgZHVyaW5nIHRoaXMgcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgZG9jdW1lbnRzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhpcyB0YXJnZXQgYXMgcGFydCBvZiB0aGlzXG4gICAgICogcmVtb3RlIGV2ZW50LlxuICAgICAqL1xuICAgIGkpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVUb2tlbiA9IHQsIHRoaXMuY3VycmVudCA9IGUsIHRoaXMuYWRkZWREb2N1bWVudHMgPSBuLCB0aGlzLm1vZGlmaWVkRG9jdW1lbnRzID0gcywgXG4gICAgICAgIHRoaXMucmVtb3ZlZERvY3VtZW50cyA9IGk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3ludGhlc2l6ZWQgVGFyZ2V0Q2hhbmdlcyB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAgICogYXBwbHkgYSBDVVJSRU5UIHN0YXR1cyBjaGFuZ2UgdG8gYSBWaWV3IChmb3IgcXVlcmllcyBleGVjdXRlZCBpbiBhIGRpZmZlcmVudFxuICAgICAqIHRhYikgb3IgZm9yIG5ldyBxdWVyaWVzICh0byByYWlzZSBzbmFwc2hvdHMgd2l0aCBjb3JyZWN0IENVUlJFTlQgc3RhdHVzKS5cbiAgICAgKi8gICAgc3RhdGljIGNyZWF0ZVN5bnRoZXNpemVkVGFyZ2V0Q2hhbmdlRm9yQ3VycmVudENoYW5nZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgZ2kobiwgZSwgZ3MoKSwgZ3MoKSwgZ3MoKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hhbmdlZCBkb2N1bWVudCBhbmQgYSBsaXN0IG9mIHRhcmdldCBpZHMgdG8gd2hpY2ggdGhpcyBjaGFuZ2VcbiAqIGFwcGxpZXMuXG4gKlxuICogSWYgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZCBOb0RvY3VtZW50IHdpbGwgYmUgcHJvdmlkZWQuXG4gKi8gY2xhc3MgeWkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgbmV3IGRvY3VtZW50IGFwcGxpZXMgdG8gYWxsIG9mIHRoZXNlIHRhcmdldHMuICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSBuZXcgZG9jdW1lbnQgaXMgcmVtb3ZlZCBmcm9tIGFsbCBvZiB0aGVzZSB0YXJnZXRzLiAqL1xuICAgIGUsIFxuICAgIC8qKiBUaGUga2V5IG9mIHRoZSBkb2N1bWVudCBmb3IgdGhpcyBjaGFuZ2UuICovXG4gICAgbiwgXG4gICAgLyoqXG4gICAgICogVGhlIG5ldyBkb2N1bWVudCBvciBOb0RvY3VtZW50IGlmIGl0IHdhcyBkZWxldGVkLiBJcyBudWxsIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IHdlbnQgb3V0IG9mIHZpZXcgd2l0aG91dCB0aGUgc2VydmVyIHNlbmRpbmcgYSBuZXcgZG9jdW1lbnQuXG4gICAgICovXG4gICAgcykge1xuICAgICAgICB0aGlzLlB0ID0gdCwgdGhpcy5yZW1vdmVkVGFyZ2V0SWRzID0gZSwgdGhpcy5rZXkgPSBuLCB0aGlzLmJ0ID0gcztcbiAgICB9XG59XG5cbmNsYXNzIHBpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0SWQgPSB0LCB0aGlzLlZ0ID0gZTtcbiAgICB9XG59XG5cbmNsYXNzIElpIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogV2hhdCBraW5kIG9mIGNoYW5nZSBvY2N1cnJlZCB0byB0aGUgd2F0Y2ggdGFyZ2V0LiAqL1xuICAgIHQsIFxuICAgIC8qKiBUaGUgdGFyZ2V0IElEcyB0aGF0IHdlcmUgYWRkZWQvcmVtb3ZlZC9zZXQuICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogQW4gb3BhcXVlLCBzZXJ2ZXItYXNzaWduZWQgdG9rZW4gdGhhdCBhbGxvd3Mgd2F0Y2hpbmcgYSB0YXJnZXQgdG8gYmVcbiAgICAgKiByZXN1bWVkIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCByZXRyYW5zbWl0dGluZyBhbGwgdGhlIGRhdGEgdGhhdFxuICAgICAqIG1hdGNoZXMgdGhlIHRhcmdldC4gVGhlIHJlc3VtZSB0b2tlbiBlc3NlbnRpYWxseSBpZGVudGlmaWVzIGEgcG9pbnQgaW5cbiAgICAgKiB0aW1lIGZyb20gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVzdW1lIHNlbmRpbmcgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBuID0gVmUuRU1QVFlfQllURV9TVFJJTkdcbiAgICAvKiogQW4gUlBDIGVycm9yIGluZGljYXRpbmcgd2h5IHRoZSB3YXRjaCBmYWlsZWQuICovICwgcyA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHQsIHRoaXMudGFyZ2V0SWRzID0gZSwgdGhpcy5yZXN1bWVUb2tlbiA9IG4sIHRoaXMuY2F1c2UgPSBzO1xuICAgIH1cbn1cblxuLyoqIFRyYWNrcyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBXYXRjaCB0YXJnZXQuICovIGNsYXNzIFRpIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgcGVuZGluZyByZXNwb25zZXMgKGFkZHMgb3IgcmVtb3ZlcykgdGhhdCB3ZSBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgICogV2Ugb25seSBjb25zaWRlciB0YXJnZXRzIGFjdGl2ZSB0aGF0IGhhdmUgbm8gcGVuZGluZyByZXNwb25zZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlN0ID0gMCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIGNoYW5nZXMgYXJlIGNvbnRpbnVvdXNseSB1cGRhdGVkIGFzIHdlIHJlY2VpdmUgZG9jdW1lbnQgdXBkYXRlcyBhbmRcbiAgICAgICAgICogYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYWdhaW5zdCB0aGUgbGFzdCBpc3N1ZWQgc25hcHNob3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkR0ID0gdmkoKSwgXG4gICAgICAgIC8qKiBTZWUgcHVibGljIGdldHRlcnMgZm9yIGV4cGxhbmF0aW9ucyBvZiB0aGVzZSBmaWVsZHMuICovXG4gICAgICAgIHRoaXMuQ3QgPSBWZS5FTVBUWV9CWVRFX1NUUklORywgdGhpcy54dCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyB0YXJnZXQgc3RhdGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBuZXh0IHNuYXBzaG90LiBXZVxuICAgICAgICAgKiBpbml0aWFsaXplIHRvIHRydWUgc28gdGhhdCBuZXdseS1hZGRlZCB0YXJnZXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmV4dFxuICAgICAgICAgKiBSZW1vdGVFdmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuTnQgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHRhcmdldCBoYXMgYmVlbiBtYXJrZWQgJ2N1cnJlbnQnLlxuICAgICAqXG4gICAgICogJ0N1cnJlbnQnIGhhcyBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlIFJQQyBwcm90b2NvbDogSXQgaW1wbGllcyB0aGF0IHRoZVxuICAgICAqIFdhdGNoIGJhY2tlbmQgaGFzIHNlbnQgdXMgYWxsIGNoYW5nZXMgdXAgdG8gdGhlIHBvaW50IGF0IHdoaWNoIHRoZSB0YXJnZXRcbiAgICAgKiB3YXMgYWRkZWQgYW5kIHRoYXQgdGhlIHRhcmdldCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHdhdGNoXG4gICAgICogc3RyZWFtLlxuICAgICAqLyAgICBnZXQgY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHQ7XG4gICAgfVxuICAgIC8qKiBUaGUgbGFzdCByZXN1bWUgdG9rZW4gc2VudCB0byB1cyBmb3IgdGhpcyB0YXJnZXQuICovICAgIGdldCByZXN1bWVUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3Q7XG4gICAgfVxuICAgIC8qKiBXaGV0aGVyIHRoaXMgdGFyZ2V0IGhhcyBwZW5kaW5nIHRhcmdldCBhZGRzIG9yIHRhcmdldCByZW1vdmVzLiAqLyAgICBnZXQga3QoKSB7XG4gICAgICAgIHJldHVybiAwICE9PSB0aGlzLlN0O1xuICAgIH1cbiAgICAvKiogV2hldGhlciB3ZSBoYXZlIG1vZGlmaWVkIGFueSBzdGF0ZSB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgc25hcHNob3QuICovICAgIGdldCBNdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuTnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIHJlc3VtZSB0b2tlbiB0byB0aGUgVGFyZ2V0Q2hhbmdlLCBidXQgb25seSB3aGVuIGl0IGhhcyBhIG5ld1xuICAgICAqIHZhbHVlLiBFbXB0eSByZXN1bWVUb2tlbnMgYXJlIGRpc2NhcmRlZC5cbiAgICAgKi8gICAgJHQodCkge1xuICAgICAgICB0LmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDAgJiYgKHRoaXMuTnQgPSAhMCwgdGhpcy5DdCA9IHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGFyZ2V0IGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogVG8gcmVzZXQgdGhlIGRvY3VtZW50IGNoYW5nZXMgYWZ0ZXIgcmFpc2luZyB0aGlzIHNuYXBzaG90LCBjYWxsXG4gICAgICogYGNsZWFyUGVuZGluZ0NoYW5nZXMoKWAuXG4gICAgICovICAgIE90KCkge1xuICAgICAgICBsZXQgdCA9IGdzKCksIGUgPSBncygpLCBuID0gZ3MoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuRHQuZm9yRWFjaCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIDAgLyogQ2hhbmdlVHlwZS5BZGRlZCAqLyA6XG4gICAgICAgICAgICAgICAgdCA9IHQuYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMiAvKiBDaGFuZ2VUeXBlLk1vZGlmaWVkICovIDpcbiAgICAgICAgICAgICAgICBlID0gZS5hZGQocyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxIC8qIENoYW5nZVR5cGUuUmVtb3ZlZCAqLyA6XG4gICAgICAgICAgICAgICAgbiA9IG4uYWRkKHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSksIG5ldyBnaSh0aGlzLkN0LCB0aGlzLnh0LCB0LCBlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBkb2N1bWVudCBjaGFuZ2VzIGFuZCBzZXRzIGBoYXNQZW5kaW5nQ2hhbmdlc2AgdG8gZmFsc2UuXG4gICAgICovICAgIEZ0KCkge1xuICAgICAgICB0aGlzLk50ID0gITEsIHRoaXMuRHQgPSB2aSgpO1xuICAgIH1cbiAgICBCdCh0LCBlKSB7XG4gICAgICAgIHRoaXMuTnQgPSAhMCwgdGhpcy5EdCA9IHRoaXMuRHQuaW5zZXJ0KHQsIGUpO1xuICAgIH1cbiAgICBMdCh0KSB7XG4gICAgICAgIHRoaXMuTnQgPSAhMCwgdGhpcy5EdCA9IHRoaXMuRHQucmVtb3ZlKHQpO1xuICAgIH1cbiAgICBxdCgpIHtcbiAgICAgICAgdGhpcy5TdCArPSAxO1xuICAgIH1cbiAgICBVdCgpIHtcbiAgICAgICAgdGhpcy5TdCAtPSAxO1xuICAgIH1cbiAgICBLdCgpIHtcbiAgICAgICAgdGhpcy5OdCA9ICEwLCB0aGlzLnh0ID0gITA7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIGNsYXNzIHRvIGFjY3VtdWxhdGUgd2F0Y2ggY2hhbmdlcyBpbnRvIGEgUmVtb3RlRXZlbnQuXG4gKi9cbmNsYXNzIEVpIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuR3QgPSB0LCBcbiAgICAgICAgLyoqIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhbGwgdHJhY2tlZCB0YXJnZXRzLiAqL1xuICAgICAgICB0aGlzLlF0ID0gbmV3IE1hcCwgXG4gICAgICAgIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgZG9jdW1lbnRzIHRvIHVwZGF0ZSBzaW5jZSB0aGUgbGFzdCByYWlzZWQgc25hcHNob3QuICovXG4gICAgICAgIHRoaXMuanQgPSBjcygpLCBcbiAgICAgICAgLyoqIEEgbWFwcGluZyBvZiBkb2N1bWVudCBrZXlzIHRvIHRoZWlyIHNldCBvZiB0YXJnZXQgSURzLiAqL1xuICAgICAgICB0aGlzLnp0ID0gQWkoKSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIG1hcCBvZiB0YXJnZXRzIHdpdGggZXhpc3RlbmNlIGZpbHRlciBtaXNtYXRjaGVzLiBUaGVzZSB0YXJnZXRzIGFyZVxuICAgICAgICAgKiBrbm93biB0byBiZSBpbmNvbnNpc3RlbnQgYW5kIHRoZWlyIGxpc3RlbnMgbmVlZHMgdG8gYmUgcmUtZXN0YWJsaXNoZWQgYnlcbiAgICAgICAgICogUmVtb3RlU3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLld0ID0gbmV3IHBlKGV0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuZCBhZGRzIHRoZSBEb2N1bWVudFdhdGNoQ2hhbmdlIHRvIHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzLlxuICAgICAqLyAgICBIdCh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LlB0KSB0LmJ0ICYmIHQuYnQuaXNGb3VuZERvY3VtZW50KCkgPyB0aGlzLkp0KGUsIHQuYnQpIDogdGhpcy5ZdChlLCB0LmtleSwgdC5idCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LnJlbW92ZWRUYXJnZXRJZHMpIHRoaXMuWXQoZSwgdC5rZXksIHQuYnQpO1xuICAgIH1cbiAgICAvKiogUHJvY2Vzc2VzIGFuZCBhZGRzIHRoZSBXYXRjaFRhcmdldENoYW5nZSB0byB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcy4gKi8gICAgWHQodCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUYXJnZXQodCwgKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuWnQoZSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHQuc3RhdGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAwIC8qIFdhdGNoVGFyZ2V0Q2hhbmdlU3RhdGUuTm9DaGFuZ2UgKi8gOlxuICAgICAgICAgICAgICAgIHRoaXMudGUoZSkgJiYgbi4kdCh0LnJlc3VtZVRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDEgLyogV2F0Y2hUYXJnZXRDaGFuZ2VTdGF0ZS5BZGRlZCAqLyA6XG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLlV0KCksIG4ua3QgfHwgXG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGZyZXNobHkgYWRkZWQgdGFyZ2V0LCBzbyB3ZSBuZWVkIHRvIHJlc2V0IGFueSBzdGF0ZVxuICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgaGFkIHByZXZpb3VzbHkuIFRoaXMgY2FuIGhhcHBlbiBlLmcuIHdoZW4gcmVtb3ZlIGFuZCBhZGRcbiAgICAgICAgICAgICAgICAvLyBiYWNrIGEgdGFyZ2V0IGZvciBleGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoZXMuXG4gICAgICAgICAgICAgICAgbi5GdCgpLCBuLiR0KHQucmVzdW1lVG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXRjaFRhcmdldENoYW5nZVN0YXRlLlJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiByZW1vdmVkIHRhcmdldHMgdG8gd2UgY2FuIHBvc3QtZmlsdGVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgdGFyZ2V0IGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGFja3MgbmVlZGVkIGZyb20gd2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyB0YXJnZXRJZC5cbiAgICAgICAgICAgICAgICBuLlV0KCksIG4ua3QgfHwgdGhpcy5yZW1vdmVUYXJnZXQoZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAzIC8qIFdhdGNoVGFyZ2V0Q2hhbmdlU3RhdGUuQ3VycmVudCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy50ZShlKSAmJiAobi5LdCgpLCBuLiR0KHQucmVzdW1lVG9rZW4pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDQgLyogV2F0Y2hUYXJnZXRDaGFuZ2VTdGF0ZS5SZXNldCAqLyA6XG4gICAgICAgICAgICAgICAgdGhpcy50ZShlKSAmJiAoXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRhcmdldCBhbmQgc3ludGhlc2l6ZXMgcmVtb3ZlcyBmb3IgYWxsIGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgLy8gZG9jdW1lbnRzLiBUaGUgYmFja2VuZCB3aWxsIHJlLWFkZCBhbnkgZG9jdW1lbnRzIHRoYXQgc3RpbGxcbiAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgdGFyZ2V0IGJlZm9yZSBpdCBzZW5kcyB0aGUgbmV4dCBnbG9iYWwgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgdGhpcy5lZShlKSwgbi4kdCh0LnJlc3VtZVRva2VuKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBPKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBhbGwgdGFyZ2V0SWRzIHRoYXQgdGhlIHdhdGNoIGNoYW5nZSBhcHBsaWVzIHRvOiBlaXRoZXIgdGhlXG4gICAgICogdGFyZ2V0SWRzIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSBjaGFuZ2Ugb3IgdGhlIHRhcmdldElkcyBvZiBhbGwgY3VycmVudGx5XG4gICAgICogYWN0aXZlIHRhcmdldHMuXG4gICAgICovICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICB0LnRhcmdldElkcy5sZW5ndGggPiAwID8gdC50YXJnZXRJZHMuZm9yRWFjaChlKSA6IHRoaXMuUXQuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIHRoaXMudGUobikgJiYgZShuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGV4aXN0ZW5jZSBmaWx0ZXJzIGFuZCBzeW50aGVzaXplcyBkZWxldGVzIGZvciBmaWx0ZXIgbWlzbWF0Y2hlcy5cbiAgICAgKiBUYXJnZXRzIHRoYXQgYXJlIGludmFsaWRhdGVkIGJ5IGZpbHRlciBtaXNtYXRjaGVzIGFyZSBhZGRlZCB0b1xuICAgICAqIGBwZW5kaW5nVGFyZ2V0UmVzZXRzYC5cbiAgICAgKi8gICAgbmUodCkge1xuICAgICAgICB2YXIgZTtcbiAgICAgICAgY29uc3QgbiA9IHQudGFyZ2V0SWQsIHMgPSB0LlZ0LmNvdW50LCBpID0gdGhpcy5zZShuKTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBpLnRhcmdldDtcbiAgICAgICAgICAgIGlmIChGbihyKSkgaWYgKDAgPT09IHMpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZXhpc3RlbmNlIGZpbHRlciB0b2xkIHVzIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdC4gV2UgZGVkdWNlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGV4aXN0IGFuZCBhcHBseSBhIGRlbGV0ZWQgZG9jdW1lbnQgdG9cbiAgICAgICAgICAgICAgICAvLyBvdXIgdXBkYXRlcy4gV2l0aG91dCBhcHBseWluZyB0aGlzIGRlbGV0ZWQgZG9jdW1lbnQgdGhlcmUgbWlnaHQgYmVcbiAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHF1ZXJ5IHRoYXQgd2lsbCByYWlzZSB0aGlzIGRvY3VtZW50IGFzIHBhcnQgb2YgYSBzbmFwc2hvdFxuICAgICAgICAgICAgICAgIC8vIHVudGlsIGl0IGlzIHJlc29sdmVkLCBlc3NlbnRpYWxseSBleHBvc2luZyBpbmNvbnNpc3RlbmN5IGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBxdWVyaWVzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgaHQoci5wYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLll0KG4sIHQsIGFuLm5ld05vRG9jdW1lbnQodCwgcnQubWluKCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBGKDEgPT09IHMpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5pZShuKTtcbiAgICAgICAgICAgICAgICAvLyBFeGlzdGVuY2UgZmlsdGVyIG1pc21hdGNoLiBNYXJrIHRoZSBkb2N1bWVudHMgYXMgYmVpbmcgaW4gbGltYm8sIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJhaXNlIGEgc25hcHNob3Qgd2l0aCBgaXNGcm9tQ2FjaGU6dHJ1ZWAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IGJsb29tIGZpbHRlciB0byBpZGVudGlmeSBhbmQgbWFyayByZW1vdmVkIGRvY3VtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMucmUodCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgwIC8qIEJsb29tRmlsdGVyQXBwbGljYXRpb25TdGF0dXMuU3VjY2VzcyAqLyAhPT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYmxvb20gZmlsdGVyIGFwcGxpY2F0aW9uIGZhaWxzLCB3ZSByZXNldCB0aGUgbWFwcGluZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgcmUtcnVuIG9mIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWUobik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gMiAvKiBCbG9vbUZpbHRlckFwcGxpY2F0aW9uU3RhdHVzLkZhbHNlUG9zaXRpdmUgKi8gPT09IHMgPyBcIlRhcmdldFB1cnBvc2VFeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaEJsb29tXCIgLyogVGFyZ2V0UHVycG9zZS5FeGlzdGVuY2VGaWx0ZXJNaXNtYXRjaEJsb29tICovIDogXCJUYXJnZXRQdXJwb3NlRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hcIiAvKiBUYXJnZXRQdXJwb3NlLkV4aXN0ZW5jZUZpbHRlck1pc21hdGNoICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XdCA9IHRoaXMuV3QuaW5zZXJ0KG4sIHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IChlID0gY2kuaW5zdGFuY2UpIHx8IHZvaWQgMCA9PT0gZSB8fCBlLm5vdGlmeU9uRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2goZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIGksIHIsIG8sIHUsIGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQ2FjaGVDb3VudDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2VGaWx0ZXJDb3VudDogbi5jb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IG4udW5jaGFuZ2VkTmFtZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBoICYmIChhLmJsb29tRmlsdGVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQ6IDAgLyogQmxvb21GaWx0ZXJBcHBsaWNhdGlvblN0YXR1cy5TdWNjZXNzICovID09PSB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hDb3VudDogbnVsbCAhPT0gKHMgPSBudWxsID09IGggPyB2b2lkIDAgOiBoLmhhc2hDb3VudCkgJiYgdm9pZCAwICE9PSBzID8gcyA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwTGVuZ3RoOiBudWxsICE9PSAobyA9IG51bGwgPT09IChyID0gbnVsbCA9PT0gKGkgPSBudWxsID09IGggPyB2b2lkIDAgOiBoLmJpdHMpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuYml0bWFwKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLmxlbmd0aCkgJiYgdm9pZCAwICE9PSBvID8gbyA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogbnVsbCAhPT0gKGMgPSBudWxsID09PSAodSA9IG51bGwgPT0gaCA/IHZvaWQgMCA6IGguYml0cykgfHwgdm9pZCAwID09PSB1ID8gdm9pZCAwIDogdS5wYWRkaW5nKSAmJiB2b2lkIDAgIT09IGMgPyBjIDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyAocywgaSwgdC5WdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBseSBibG9vbSBmaWx0ZXIgdG8gcmVtb3ZlIHRoZSBkZWxldGVkIGRvY3VtZW50cywgYW5kIHJldHVybiB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0dXMuXG4gICAgICovICAgIHJlKHQsIGUpIHtcbiAgICAgICAgY29uc3Qge3VuY2hhbmdlZE5hbWVzOiBuLCBjb3VudDogc30gPSB0LlZ0O1xuICAgICAgICBpZiAoIW4gfHwgIW4uYml0cykgcmV0dXJuIDEgLyogQmxvb21GaWx0ZXJBcHBsaWNhdGlvblN0YXR1cy5Ta2lwcGVkICovO1xuICAgICAgICBjb25zdCB7Yml0czoge2JpdG1hcDogaSA9IFwiXCIsIHBhZGRpbmc6IHIgPSAwfSwgaGFzaENvdW50OiBvID0gMH0gPSBuO1xuICAgICAgICBsZXQgdSwgYztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHUgPSB4ZShpKS50b1VpbnQ4QXJyYXkoKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQZSkgcmV0dXJuIE0oXCJEZWNvZGluZyB0aGUgYmFzZTY0IGJsb29tIGZpbHRlciBpbiBleGlzdGVuY2UgZmlsdGVyIGZhaWxlZCAoXCIgKyB0Lm1lc3NhZ2UgKyBcIik7IGlnbm9yaW5nIHRoZSBibG9vbSBmaWx0ZXIgYW5kIGZhbGxpbmcgYmFjayB0byBmdWxsIHJlLXF1ZXJ5LlwiKSwgXG4gICAgICAgICAgICAxIC8qIEJsb29tRmlsdGVyQXBwbGljYXRpb25TdGF0dXMuU2tpcHBlZCAqLztcbiAgICAgICAgICAgIHRocm93IHQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEJsb29tRmlsdGVyIHRocm93cyBlcnJvciBpZiB0aGUgaW5wdXRzIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgYyA9IG5ldyB3aSh1LCByLCBvKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuIE0odCBpbnN0YW5jZW9mIF9pID8gXCJCbG9vbUZpbHRlciBlcnJvcjogXCIgOiBcIkFwcGx5aW5nIGJsb29tIGZpbHRlciBmYWlsZWQ6IFwiLCB0KSwgXG4gICAgICAgICAgICAxIC8qIEJsb29tRmlsdGVyQXBwbGljYXRpb25TdGF0dXMuU2tpcHBlZCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoMCA9PT0gYy5JdCkgcmV0dXJuIDEgLyogQmxvb21GaWx0ZXJBcHBsaWNhdGlvblN0YXR1cy5Ta2lwcGVkICovO1xuICAgICAgICByZXR1cm4gcyAhPT0gZSAtIHRoaXMub2UodC50YXJnZXRJZCwgYykgPyAyIC8qIEJsb29tRmlsdGVyQXBwbGljYXRpb25TdGF0dXMuRmFsc2VQb3NpdGl2ZSAqLyA6IDAgLyogQmxvb21GaWx0ZXJBcHBsaWNhdGlvblN0YXR1cy5TdWNjZXNzICovO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgb3V0IHJlbW92ZWQgZG9jdW1lbnRzIGJhc2VkIG9uIGJsb29tIGZpbHRlciBtZW1iZXJzaGlwIHJlc3VsdCBhbmRcbiAgICAgKiByZXR1cm4gbnVtYmVyIG9mIGRvY3VtZW50cyByZW1vdmVkLlxuICAgICAqLyAgICBvZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLkd0LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCk7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgcmV0dXJuIG4uZm9yRWFjaCgobiA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5HdC51ZSgpLCByID0gYHByb2plY3RzLyR7aS5wcm9qZWN0SWR9L2RhdGFiYXNlcy8ke2kuZGF0YWJhc2V9L2RvY3VtZW50cy8ke24ucGF0aC5jYW5vbmljYWxTdHJpbmcoKX1gO1xuICAgICAgICAgICAgZS52dChyKSB8fCAodGhpcy5ZdCh0LCBuLCAvKnVwZGF0ZWREb2N1bWVudD0qLyBudWxsKSwgcysrKTtcbiAgICAgICAgfSkpLCBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgY3VycmVudGx5IGFjY3VtdWxhdGVkIHN0YXRlIGludG8gYSByZW1vdGUgZXZlbnQgYXQgdGhlXG4gICAgICogcHJvdmlkZWQgc25hcHNob3QgdmVyc2lvbi4gUmVzZXRzIHRoZSBhY2N1bXVsYXRlZCBjaGFuZ2VzIGJlZm9yZSByZXR1cm5pbmcuXG4gICAgICovICAgIGNlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBNYXA7XG4gICAgICAgIHRoaXMuUXQuZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnNlKHMpO1xuICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgICBpZiAobi5jdXJyZW50ICYmIEZuKGkudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudCBxdWVyaWVzIGZvciBkb2N1bWVudCB0aGF0IGRvbid0IGV4aXN0IGNhbiBwcm9kdWNlIGFuIGVtcHR5XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBzZXQuIFRvIHVwZGF0ZSBvdXIgbG9jYWwgY2FjaGUsIHdlIHN5bnRoZXNpemUgYSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgaWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSByZWNlaXZlZCB0aGUgZG9jdW1lbnQuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXMgdGhlIGxpbWJvIHN0YXRlIG9mIHRoZSBkb2N1bWVudCwgcmVtb3ZpbmcgaXQgZnJvbVxuICAgICAgICAgICAgICAgICAgICAvLyBsaW1ib0RvY3VtZW50UmVmcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYW4gZXhwbGljaXQgbG9va3VwIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIHJlc3VsdGluZyBpbiBhbiBleHBsaWNpdCBkZWxldGUgbWVzc2FnZSBhbmQgd2UgY291bGRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsb2dpYy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBodChpLnRhcmdldC5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdGhpcy5qdC5nZXQoZSkgfHwgdGhpcy5hZShzLCBlKSB8fCB0aGlzLll0KHMsIGUsIGFuLm5ld05vRG9jdW1lbnQoZSwgdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuLk10ICYmIChlLnNldChzLCBuLk90KCkpLCBuLkZ0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBuID0gZ3MoKTtcbiAgICAgICAgLy8gV2UgZXh0cmFjdCB0aGUgc2V0IG9mIGxpbWJvLW9ubHkgZG9jdW1lbnQgdXBkYXRlcyBhcyB0aGUgR0MgbG9naWNcbiAgICAgICAgLy8gc3BlY2lhbC1jYXNlcyBkb2N1bWVudHMgdGhhdCBkbyBub3QgYXBwZWFyIGluIHRoZSB0YXJnZXQgY2FjaGUuXG4gICAgICAgIFxuICAgICAgICAvLyBUT0RPKGdzb2x0aXMpOiBFeHBhbmQgb24gdGhpcyBjb21tZW50IG9uY2UgR0MgaXMgYXZhaWxhYmxlIGluIHRoZSBKU1xuICAgICAgICAvLyBjbGllbnQuXG4gICAgICAgICAgICAgICAgdGhpcy56dC5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHMgPSAhMDtcbiAgICAgICAgICAgIGUuZm9yRWFjaFdoaWxlKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5zZSh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgXCJUYXJnZXRQdXJwb3NlTGltYm9SZXNvbHV0aW9uXCIgLyogVGFyZ2V0UHVycG9zZS5MaW1ib1Jlc29sdXRpb24gKi8gPT09IGUucHVycG9zZSB8fCAocyA9ICExLCBcbiAgICAgICAgICAgICAgICAhMSk7XG4gICAgICAgICAgICB9KSksIHMgJiYgKG4gPSBuLmFkZCh0KSk7XG4gICAgICAgIH0pKSwgdGhpcy5qdC5mb3JFYWNoKCgoZSwgbikgPT4gbi5zZXRSZWFkVGltZSh0KSkpO1xuICAgICAgICBjb25zdCBzID0gbmV3IG1pKHQsIGUsIHRoaXMuV3QsIHRoaXMuanQsIG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5qdCA9IGNzKCksIHRoaXMuenQgPSBBaSgpLCB0aGlzLld0ID0gbmV3IHBlKGV0KSwgcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgcHJvdmlkZWQgZG9jdW1lbnQgdG8gdGhlIGludGVybmFsIGxpc3Qgb2YgZG9jdW1lbnQgdXBkYXRlcyBhbmRcbiAgICAgKiBpdHMgZG9jdW1lbnQga2V5IHRvIHRoZSBnaXZlbiB0YXJnZXQncyBtYXBwaW5nLlxuICAgICAqL1xuICAgIC8vIFZpc2libGUgZm9yIHRlc3RpbmcuXG4gICAgSnQodCwgZSkge1xuICAgICAgICBpZiAoIXRoaXMudGUodCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuYWUodCwgZS5rZXkpID8gMiAvKiBDaGFuZ2VUeXBlLk1vZGlmaWVkICovIDogMCAvKiBDaGFuZ2VUeXBlLkFkZGVkICovO1xuICAgICAgICB0aGlzLlp0KHQpLkJ0KGUua2V5LCBuKSwgdGhpcy5qdCA9IHRoaXMuanQuaW5zZXJ0KGUua2V5LCBlKSwgdGhpcy56dCA9IHRoaXMuenQuaW5zZXJ0KGUua2V5LCB0aGlzLmhlKGUua2V5KS5hZGQodCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm92aWRlZCBkb2N1bWVudCBmcm9tIHRoZSB0YXJnZXQgbWFwcGluZy4gSWYgdGhlXG4gICAgICogZG9jdW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIHRhcmdldCwgYnV0IHRoZSBkb2N1bWVudCdzIHN0YXRlIGlzIHN0aWxsXG4gICAgICoga25vd24gKGUuZy4gd2Uga25vdyB0aGF0IHRoZSBkb2N1bWVudCB3YXMgZGVsZXRlZCBvciB3ZSByZWNlaXZlZCB0aGUgY2hhbmdlXG4gICAgICogdGhhdCBjYXVzZWQgdGhlIGZpbHRlciBtaXNtYXRjaCksIHRoZSBuZXcgZG9jdW1lbnQgY2FuIGJlIHByb3ZpZGVkXG4gICAgICogdG8gdXBkYXRlIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUuXG4gICAgICovXG4gICAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbiAgICBZdCh0LCBlLCBuKSB7XG4gICAgICAgIGlmICghdGhpcy50ZSh0KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5adCh0KTtcbiAgICAgICAgdGhpcy5hZSh0LCBlKSA/IHMuQnQoZSwgMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8pIDogXG4gICAgICAgIC8vIFRoZSBkb2N1bWVudCBtYXkgaGF2ZSBlbnRlcmVkIGFuZCBsZWZ0IHRoZSB0YXJnZXQgYmVmb3JlIHdlIHJhaXNlZCBhXG4gICAgICAgIC8vIHNuYXBzaG90LCBzbyB3ZSBjYW4ganVzdCBpZ25vcmUgdGhlIGNoYW5nZS5cbiAgICAgICAgcy5MdChlKSwgdGhpcy56dCA9IHRoaXMuenQuaW5zZXJ0KGUsIHRoaXMuaGUoZSkuZGVsZXRlKHQpKSwgbiAmJiAodGhpcy5qdCA9IHRoaXMuanQuaW5zZXJ0KGUsIG4pKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0KHQpIHtcbiAgICAgICAgdGhpcy5RdC5kZWxldGUodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgb2YgZG9jdW1lbnRzIGluIHRoZSB0YXJnZXQuIFRoaXMgaW5jbHVkZXMgYm90aFxuICAgICAqIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgdGhlIExvY2FsU3RvcmUgY29uc2lkZXJzIHRvIGJlIHBhcnQgb2YgdGhlXG4gICAgICogdGFyZ2V0IGFzIHdlbGwgYXMgYW55IGFjY3VtdWxhdGVkIGNoYW5nZXMuXG4gICAgICovICAgIGllKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuWnQodCkuT3QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuR3QuZ2V0UmVtb3RlS2V5c0ZvclRhcmdldCh0KS5zaXplICsgZS5hZGRlZERvY3VtZW50cy5zaXplIC0gZS5yZW1vdmVkRG9jdW1lbnRzLnNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFja3MgbmVlZGVkIGZyb20gd2F0Y2ggYmVmb3JlIHdlIGNhbiBjb25zaWRlciB0aGVcbiAgICAgKiBzZXJ2ZXIgdG8gYmUgJ2luLXN5bmMnIHdpdGggdGhlIGNsaWVudCdzIGFjdGl2ZSB0YXJnZXRzLlxuICAgICAqLyAgICBxdCh0KSB7XG4gICAgICAgIHRoaXMuWnQodCkucXQoKTtcbiAgICB9XG4gICAgWnQodCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuUXQuZ2V0KHQpO1xuICAgICAgICByZXR1cm4gZSB8fCAoZSA9IG5ldyBUaSwgdGhpcy5RdC5zZXQodCwgZSkpLCBlO1xuICAgIH1cbiAgICBoZSh0KSB7XG4gICAgICAgIGxldCBlID0gdGhpcy56dC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlIHx8IChlID0gbmV3IEVlKGV0KSwgdGhpcy56dCA9IHRoaXMuenQuaW5zZXJ0KHQsIGUpKSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBpcyBzdGlsbCBpbnRlcmVzdGVkIGluIHRoaXMgdGFyZ2V0IChieSBjYWxsaW5nXG4gICAgICogYGdldFRhcmdldERhdGFGb3JUYXJnZXQoKWApIGFuZCB0aGF0IHdlIGFyZSBub3Qgd2FpdGluZyBmb3IgcGVuZGluZyBBRERzXG4gICAgICogZnJvbSB3YXRjaC5cbiAgICAgKi8gICAgdGUodCkge1xuICAgICAgICBjb25zdCBlID0gbnVsbCAhPT0gdGhpcy5zZSh0KTtcbiAgICAgICAgcmV0dXJuIGUgfHwgTihcIldhdGNoQ2hhbmdlQWdncmVnYXRvclwiLCBcIkRldGVjdGVkIGluYWN0aXZlIHRhcmdldFwiLCB0KSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVGFyZ2V0RGF0YSBmb3IgYW4gYWN0aXZlIHRhcmdldCAoaS5lLiBhIHRhcmdldCB0aGF0IHRoZSB1c2VyXG4gICAgICogaXMgc3RpbGwgaW50ZXJlc3RlZCBpbiB0aGF0IGhhcyBubyBvdXRzdGFuZGluZyB0YXJnZXQgY2hhbmdlIHJlcXVlc3RzKS5cbiAgICAgKi8gICAgc2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5RdC5nZXQodCk7XG4gICAgICAgIHJldHVybiBlICYmIGUua3QgPyBudWxsIDogdGhpcy5HdC5sZSh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiBhIFdhdGNoIHRhcmdldCB0byBpdHMgaW5pdGlhbCBzdGF0ZSAoZS5nLiBzZXRzXG4gICAgICogJ2N1cnJlbnQnIHRvIGZhbHNlLCBjbGVhcnMgdGhlIHJlc3VtZSB0b2tlbiBhbmQgcmVtb3ZlcyBpdHMgdGFyZ2V0IG1hcHBpbmdcbiAgICAgKiBmcm9tIGFsbCBkb2N1bWVudHMpLlxuICAgICAqLyAgICBlZSh0KSB7XG4gICAgICAgIHRoaXMuUXQuc2V0KHQsIG5ldyBUaSk7XG4gICAgICAgIHRoaXMuR3QuZ2V0UmVtb3RlS2V5c0ZvclRhcmdldCh0KS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHRoaXMuWXQodCwgZSwgLyp1cGRhdGVkRG9jdW1lbnQ9Ki8gbnVsbCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBMb2NhbFN0b3JlIGNvbnNpZGVycyB0aGUgZG9jdW1lbnQgdG8gYmUgcGFydCBvZiB0aGVcbiAgICAgKiBzcGVjaWZpZWQgdGFyZ2V0LlxuICAgICAqLyAgICBhZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkd0LmdldFJlbW90ZUtleXNGb3JUYXJnZXQodCkuaGFzKGUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gQWkoKSB7XG4gICAgcmV0dXJuIG5ldyBwZShodC5jb21wYXJhdG9yKTtcbn1cblxuZnVuY3Rpb24gdmkoKSB7XG4gICAgcmV0dXJuIG5ldyBwZShodC5jb21wYXJhdG9yKTtcbn1cblxuY29uc3QgUmkgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICAgIGFzYzogXCJBU0NFTkRJTkdcIixcbiAgICAgICAgZGVzYzogXCJERVNDRU5ESU5HXCJcbiAgICB9O1xuICAgIHJldHVybiB0O1xufSkoKSwgUGkgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICAgIFwiPFwiOiBcIkxFU1NfVEhBTlwiLFxuICAgICAgICBcIjw9XCI6IFwiTEVTU19USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiPlwiOiBcIkdSRUFURVJfVEhBTlwiLFxuICAgICAgICBcIj49XCI6IFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiPT1cIjogXCJFUVVBTFwiLFxuICAgICAgICBcIiE9XCI6IFwiTk9UX0VRVUFMXCIsXG4gICAgICAgIFwiYXJyYXktY29udGFpbnNcIjogXCJBUlJBWV9DT05UQUlOU1wiLFxuICAgICAgICBpbjogXCJJTlwiLFxuICAgICAgICBcIm5vdC1pblwiOiBcIk5PVF9JTlwiLFxuICAgICAgICBcImFycmF5LWNvbnRhaW5zLWFueVwiOiBcIkFSUkFZX0NPTlRBSU5TX0FOWVwiXG4gICAgfTtcbiAgICByZXR1cm4gdDtcbn0pKCksIGJpID0gKCgpID0+IHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgICBhbmQ6IFwiQU5EXCIsXG4gICAgICAgIG9yOiBcIk9SXCJcbiAgICB9O1xuICAgIHJldHVybiB0O1xufSkoKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBKc29uT2JqZWN0IHZhbHVlcyBmb3IgdGhlIERhdGFzdG9yZSBBUEkgc3VpdGFibGUgZm9yXG4gKiBzZW5kaW5nIHRvIGVpdGhlciBHUlBDIHN0dWIgbWV0aG9kcyBvciB2aWEgdGhlIEpTT04vSFRUUCBSRVNUIEFQSS5cbiAqXG4gKiBUaGUgc2VyaWFsaXplciBzdXBwb3J0cyBib3RoIFByb3RvYnVmLmpzIGFuZCBQcm90bzMgSlNPTiBmb3JtYXRzLiBCeVxuICogc2V0dGluZyBgdXNlUHJvdG8zSnNvbmAgdG8gdHJ1ZSwgdGhlIHNlcmlhbGl6ZXIgd2lsbCB1c2UgdGhlIFByb3RvMyBKU09OXG4gKiBmb3JtYXQuXG4gKlxuICogRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIFByb3RvMyBKU09OIGZvcm1hdCBjaGVja1xuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKlxuICogVE9ETyhrbGltdCk6IFdlIGNhbiByZW1vdmUgdGhlIGRhdGFiYXNlSWQgYXJndW1lbnQgaWYgd2Uga2VlcCB0aGUgZnVsbFxuICogcmVzb3VyY2UgbmFtZSBpbiBkb2N1bWVudHMuXG4gKi9cbmNsYXNzIFZpIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VJZCA9IHQsIHRoaXMudXNlUHJvdG8zSnNvbiA9IGU7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYSBudW1iZXIgKG9yIG51bGwpIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50b1xuICogYSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSBwcm90by5cbiAqIERPIE5PVCBVU0UgVEhJUyBGT1IgQU5ZVEhJTkcgRUxTRS5cbiAqIFRoaXMgbWV0aG9kIGNoZWF0cy4gSXQncyB0eXBlZCBhcyByZXR1cm5pbmcgXCJudW1iZXJcIiBiZWNhdXNlIHRoYXQncyB3aGF0XG4gKiBvdXIgZ2VuZXJhdGVkIHByb3RvIGludGVyZmFjZXMgc2F5IEludDMyVmFsdWUgbXVzdCBiZS4gQnV0IEdSUEMgYWN0dWFsbHlcbiAqIGV4cGVjdHMgYSB7IHZhbHVlOiA8bnVtYmVyPiB9IHN0cnVjdC5cbiAqL1xuZnVuY3Rpb24gU2kodCwgZSkge1xuICAgIHJldHVybiB0LnVzZVByb3RvM0pzb24gfHwgRnQoZSkgPyBlIDoge1xuICAgICAgICB2YWx1ZTogZVxuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG51bWJlciAob3IgbnVsbCkgZnJvbSBhIGdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIHByb3RvLlxuICovXG4vKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYSBEYXRlIHRoYXQncyBhcHByb3ByaWF0ZSB0byBwdXQgaW50byBhIHByb3RvLlxuICovXG5mdW5jdGlvbiBEaSh0LCBlKSB7XG4gICAgaWYgKHQudXNlUHJvdG8zSnNvbikge1xuICAgICAgICByZXR1cm4gYCR7bmV3IERhdGUoMWUzICogZS5zZWNvbmRzKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZCovLCBcIlwiKS5yZXBsYWNlKFwiWlwiLCBcIlwiKX0uJHsoXCIwMDAwMDAwMDBcIiArIGUubmFub3NlY29uZHMpLnNsaWNlKC05KX1aYDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2Vjb25kczogXCJcIiArIGUuc2Vjb25kcyxcbiAgICAgICAgbmFub3M6IGUubmFub3NlY29uZHNcbiAgICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB2YWx1ZSBmb3IgYnl0ZXMgdGhhdCdzIGFwcHJvcHJpYXRlIHRvIHB1dCBpbiBhIHByb3RvLlxuICpcbiAqIFZpc2libGUgZm9yIHRlc3RpbmcuXG4gKi9cbmZ1bmN0aW9uIENpKHQsIGUpIHtcbiAgICByZXR1cm4gdC51c2VQcm90bzNKc29uID8gZS50b0Jhc2U2NCgpIDogZS50b1VpbnQ4QXJyYXkoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgQnl0ZVN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdG8gc3RyaW5nIHZhbHVlLlxuICovIGZ1bmN0aW9uIHhpKHQsIGUpIHtcbiAgICByZXR1cm4gRGkodCwgZS50b1RpbWVzdGFtcCgpKTtcbn1cblxuZnVuY3Rpb24gTmkodCkge1xuICAgIHJldHVybiBGKCEhdCksIHJ0LmZyb21UaW1lc3RhbXAoZnVuY3Rpb24odCkge1xuICAgICAgICBjb25zdCBlID0gRGUodCk7XG4gICAgICAgIHJldHVybiBuZXcgaXQoZS5zZWNvbmRzLCBlLm5hbm9zKTtcbiAgICB9KHQpKTtcbn1cblxuZnVuY3Rpb24ga2kodCwgZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgdXQoWyBcInByb2plY3RzXCIsIHQucHJvamVjdElkLCBcImRhdGFiYXNlc1wiLCB0LmRhdGFiYXNlIF0pO1xuICAgIH0odCkuY2hpbGQoXCJkb2N1bWVudHNcIikuY2hpbGQoZSkuY2Fub25pY2FsU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIE1pKHQpIHtcbiAgICBjb25zdCBlID0gdXQuZnJvbVN0cmluZyh0KTtcbiAgICByZXR1cm4gRih1cihlKSksIGU7XG59XG5cbmZ1bmN0aW9uICRpKHQsIGUpIHtcbiAgICByZXR1cm4ga2kodC5kYXRhYmFzZUlkLCBlLnBhdGgpO1xufVxuXG5mdW5jdGlvbiBPaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IE1pKGUpO1xuICAgIGlmIChuLmdldCgxKSAhPT0gdC5kYXRhYmFzZUlkLnByb2plY3RJZCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlRyaWVkIHRvIGRlc2VyaWFsaXplIGtleSBmcm9tIGRpZmZlcmVudCBwcm9qZWN0OiBcIiArIG4uZ2V0KDEpICsgXCIgdnMgXCIgKyB0LmRhdGFiYXNlSWQucHJvamVjdElkKTtcbiAgICBpZiAobi5nZXQoMykgIT09IHQuZGF0YWJhc2VJZC5kYXRhYmFzZSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlRyaWVkIHRvIGRlc2VyaWFsaXplIGtleSBmcm9tIGRpZmZlcmVudCBkYXRhYmFzZTogXCIgKyBuLmdldCgzKSArIFwiIHZzIFwiICsgdC5kYXRhYmFzZUlkLmRhdGFiYXNlKTtcbiAgICByZXR1cm4gbmV3IGh0KHFpKG4pKTtcbn1cblxuZnVuY3Rpb24gRmkodCwgZSkge1xuICAgIHJldHVybiBraSh0LmRhdGFiYXNlSWQsIGUpO1xufVxuXG5mdW5jdGlvbiBCaSh0KSB7XG4gICAgY29uc3QgZSA9IE1pKHQpO1xuICAgIC8vIEluIHYxYmV0YTEgcXVlcmllcyBmb3IgY29sbGVjdGlvbnMgYXQgdGhlIHJvb3QgZGlkIG5vdCBoYXZlIGEgdHJhaWxpbmdcbiAgICAvLyBcIi9kb2N1bWVudHNcIi4gSW4gdjEgYWxsIHJlc291cmNlIHBhdGhzIGNvbnRhaW4gXCIvZG9jdW1lbnRzXCIuIFByZXNlcnZlIHRoZVxuICAgIC8vIGFiaWxpdHkgdG8gcmVhZCB0aGUgdjFiZXRhMSBmb3JtIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcXVlcmllcyBwZXJzaXN0ZWRcbiAgICAvLyBpbiB0aGUgbG9jYWwgdGFyZ2V0IGNhY2hlLlxuICAgICAgICByZXR1cm4gNCA9PT0gZS5sZW5ndGggPyB1dC5lbXB0eVBhdGgoKSA6IHFpKGUpO1xufVxuXG5mdW5jdGlvbiBMaSh0KSB7XG4gICAgcmV0dXJuIG5ldyB1dChbIFwicHJvamVjdHNcIiwgdC5kYXRhYmFzZUlkLnByb2plY3RJZCwgXCJkYXRhYmFzZXNcIiwgdC5kYXRhYmFzZUlkLmRhdGFiYXNlIF0pLmNhbm9uaWNhbFN0cmluZygpO1xufVxuXG5mdW5jdGlvbiBxaSh0KSB7XG4gICAgcmV0dXJuIEYodC5sZW5ndGggPiA0ICYmIFwiZG9jdW1lbnRzXCIgPT09IHQuZ2V0KDQpKSwgdC5wb3BGaXJzdCg1KTtcbn1cblxuLyoqIENyZWF0ZXMgYSBEb2N1bWVudCBwcm90byBmcm9tIGtleSBhbmQgZmllbGRzIChidXQgbm8gY3JlYXRlL3VwZGF0ZSB0aW1lKSAqLyBmdW5jdGlvbiBVaSh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJGkodCwgZSksXG4gICAgICAgIGZpZWxkczogbi52YWx1ZS5tYXBWYWx1ZS5maWVsZHNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBLaSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IE9pKHQsIGUubmFtZSksIGkgPSBOaShlLnVwZGF0ZVRpbWUpLCByID0gZS5jcmVhdGVUaW1lID8gTmkoZS5jcmVhdGVUaW1lKSA6IHJ0Lm1pbigpLCBvID0gbmV3IHVuKHtcbiAgICAgICAgbWFwVmFsdWU6IHtcbiAgICAgICAgICAgIGZpZWxkczogZS5maWVsZHNcbiAgICAgICAgfVxuICAgIH0pLCB1ID0gYW4ubmV3Rm91bmREb2N1bWVudChzLCBpLCByLCBvKTtcbiAgICByZXR1cm4gbiAmJiB1LnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpLCBuID8gdS5zZXRIYXNDb21taXR0ZWRNdXRhdGlvbnMoKSA6IHU7XG59XG5cbmZ1bmN0aW9uIEdpKHQsIGUpIHtcbiAgICByZXR1cm4gXCJmb3VuZFwiIGluIGUgPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIEYoISFlLmZvdW5kKSwgZS5mb3VuZC5uYW1lLCBlLmZvdW5kLnVwZGF0ZVRpbWU7XG4gICAgICAgIGNvbnN0IG4gPSBPaSh0LCBlLmZvdW5kLm5hbWUpLCBzID0gTmkoZS5mb3VuZC51cGRhdGVUaW1lKSwgaSA9IGUuZm91bmQuY3JlYXRlVGltZSA/IE5pKGUuZm91bmQuY3JlYXRlVGltZSkgOiBydC5taW4oKSwgciA9IG5ldyB1bih7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczogZS5mb3VuZC5maWVsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhbi5uZXdGb3VuZERvY3VtZW50KG4sIHMsIGksIHIpO1xuICAgIH0odCwgZSkgOiBcIm1pc3NpbmdcIiBpbiBlID8gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBGKCEhZS5taXNzaW5nKSwgRighIWUucmVhZFRpbWUpO1xuICAgICAgICBjb25zdCBuID0gT2kodCwgZS5taXNzaW5nKSwgcyA9IE5pKGUucmVhZFRpbWUpO1xuICAgICAgICByZXR1cm4gYW4ubmV3Tm9Eb2N1bWVudChuLCBzKTtcbiAgICB9KHQsIGUpIDogTygpO1xufVxuXG5mdW5jdGlvbiBRaSh0LCBlKSB7XG4gICAgbGV0IG47XG4gICAgaWYgKFwidGFyZ2V0Q2hhbmdlXCIgaW4gZSkge1xuICAgICAgICBlLnRhcmdldENoYW5nZTtcbiAgICAgICAgLy8gcHJvdG8zIGRlZmF1bHQgdmFsdWUgaXMgdW5zZXQgaW4gSlNPTiAodW5kZWZpbmVkKSwgc28gdXNlICdOT19DSEFOR0UnXG4gICAgICAgIC8vIGlmIHVuc2V0XG4gICAgICAgIGNvbnN0IHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJOT19DSEFOR0VcIiA9PT0gdCA/IDAgLyogV2F0Y2hUYXJnZXRDaGFuZ2VTdGF0ZS5Ob0NoYW5nZSAqLyA6IFwiQUREXCIgPT09IHQgPyAxIC8qIFdhdGNoVGFyZ2V0Q2hhbmdlU3RhdGUuQWRkZWQgKi8gOiBcIlJFTU9WRVwiID09PSB0ID8gMiAvKiBXYXRjaFRhcmdldENoYW5nZVN0YXRlLlJlbW92ZWQgKi8gOiBcIkNVUlJFTlRcIiA9PT0gdCA/IDMgLyogV2F0Y2hUYXJnZXRDaGFuZ2VTdGF0ZS5DdXJyZW50ICovIDogXCJSRVNFVFwiID09PSB0ID8gNCAvKiBXYXRjaFRhcmdldENoYW5nZVN0YXRlLlJlc2V0ICovIDogTygpO1xuICAgICAgICB9KGUudGFyZ2V0Q2hhbmdlLnRhcmdldENoYW5nZVR5cGUgfHwgXCJOT19DSEFOR0VcIiksIGkgPSBlLnRhcmdldENoYW5nZS50YXJnZXRJZHMgfHwgW10sIHIgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdC51c2VQcm90bzNKc29uID8gKEYodm9pZCAwID09PSBlIHx8IFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpLCBWZS5mcm9tQmFzZTY0U3RyaW5nKGUgfHwgXCJcIikpIDogKEYodm9pZCAwID09PSBlIHx8IGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSwgXG4gICAgICAgICAgICBWZS5mcm9tVWludDhBcnJheShlIHx8IG5ldyBVaW50OEFycmF5KSk7XG4gICAgICAgIH0odCwgZS50YXJnZXRDaGFuZ2UucmVzdW1lVG9rZW4pLCBvID0gZS50YXJnZXRDaGFuZ2UuY2F1c2UsIHUgPSBvICYmIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB2b2lkIDAgPT09IHQuY29kZSA/IHEuVU5LTk9XTiA6IHVpKHQuY29kZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFUoZSwgdC5tZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICB9KG8pO1xuICAgICAgICBuID0gbmV3IElpKHMsIGksIHIsIHUgfHwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChcImRvY3VtZW50Q2hhbmdlXCIgaW4gZSkge1xuICAgICAgICBlLmRvY3VtZW50Q2hhbmdlO1xuICAgICAgICBjb25zdCBzID0gZS5kb2N1bWVudENoYW5nZTtcbiAgICAgICAgcy5kb2N1bWVudCwgcy5kb2N1bWVudC5uYW1lLCBzLmRvY3VtZW50LnVwZGF0ZVRpbWU7XG4gICAgICAgIGNvbnN0IGkgPSBPaSh0LCBzLmRvY3VtZW50Lm5hbWUpLCByID0gTmkocy5kb2N1bWVudC51cGRhdGVUaW1lKSwgbyA9IHMuZG9jdW1lbnQuY3JlYXRlVGltZSA/IE5pKHMuZG9jdW1lbnQuY3JlYXRlVGltZSkgOiBydC5taW4oKSwgdSA9IG5ldyB1bih7XG4gICAgICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgICAgIGZpZWxkczogcy5kb2N1bWVudC5maWVsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksIGMgPSBhbi5uZXdGb3VuZERvY3VtZW50KGksIHIsIG8sIHUpLCBhID0gcy50YXJnZXRJZHMgfHwgW10sIGggPSBzLnJlbW92ZWRUYXJnZXRJZHMgfHwgW107XG4gICAgICAgIG4gPSBuZXcgeWkoYSwgaCwgYy5rZXksIGMpO1xuICAgIH0gZWxzZSBpZiAoXCJkb2N1bWVudERlbGV0ZVwiIGluIGUpIHtcbiAgICAgICAgZS5kb2N1bWVudERlbGV0ZTtcbiAgICAgICAgY29uc3QgcyA9IGUuZG9jdW1lbnREZWxldGU7XG4gICAgICAgIHMuZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGkgPSBPaSh0LCBzLmRvY3VtZW50KSwgciA9IHMucmVhZFRpbWUgPyBOaShzLnJlYWRUaW1lKSA6IHJ0Lm1pbigpLCBvID0gYW4ubmV3Tm9Eb2N1bWVudChpLCByKSwgdSA9IHMucmVtb3ZlZFRhcmdldElkcyB8fCBbXTtcbiAgICAgICAgbiA9IG5ldyB5aShbXSwgdSwgby5rZXksIG8pO1xuICAgIH0gZWxzZSBpZiAoXCJkb2N1bWVudFJlbW92ZVwiIGluIGUpIHtcbiAgICAgICAgZS5kb2N1bWVudFJlbW92ZTtcbiAgICAgICAgY29uc3QgcyA9IGUuZG9jdW1lbnRSZW1vdmU7XG4gICAgICAgIHMuZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGkgPSBPaSh0LCBzLmRvY3VtZW50KSwgciA9IHMucmVtb3ZlZFRhcmdldElkcyB8fCBbXTtcbiAgICAgICAgbiA9IG5ldyB5aShbXSwgciwgaSwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEoXCJmaWx0ZXJcIiBpbiBlKSkgcmV0dXJuIE8oKTtcbiAgICAgICAge1xuICAgICAgICAgICAgZS5maWx0ZXI7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5maWx0ZXI7XG4gICAgICAgICAgICB0LnRhcmdldElkO1xuICAgICAgICAgICAgY29uc3Qge2NvdW50OiBzID0gMCwgdW5jaGFuZ2VkTmFtZXM6IGl9ID0gdCwgciA9IG5ldyBzaShzLCBpKSwgbyA9IHQudGFyZ2V0SWQ7XG4gICAgICAgICAgICBuID0gbmV3IHBpKG8sIHIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuXG5mdW5jdGlvbiBqaSh0LCBlKSB7XG4gICAgbGV0IG47XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBqcykgbiA9IHtcbiAgICAgICAgdXBkYXRlOiBVaSh0LCBlLmtleSwgZS52YWx1ZSlcbiAgICB9OyBlbHNlIGlmIChlIGluc3RhbmNlb2YgWXMpIG4gPSB7XG4gICAgICAgIGRlbGV0ZTogJGkodCwgZS5rZXkpXG4gICAgfTsgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIHpzKSBuID0ge1xuICAgICAgICB1cGRhdGU6IFVpKHQsIGUua2V5LCBlLmRhdGEpLFxuICAgICAgICB1cGRhdGVNYXNrOiBvcihlLmZpZWxkTWFzaylcbiAgICB9OyBlbHNlIHtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFhzKSkgcmV0dXJuIE8oKTtcbiAgICAgICAgbiA9IHtcbiAgICAgICAgICAgIHZlcmlmeTogJGkodCwgZS5rZXkpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBlLmZpZWxkVHJhbnNmb3Jtcy5sZW5ndGggPiAwICYmIChuLnVwZGF0ZVRyYW5zZm9ybXMgPSBlLmZpZWxkVHJhbnNmb3Jtcy5tYXAoKHQgPT4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS50cmFuc2Zvcm07XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2YgYnMpIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZFBhdGg6IGUuZmllbGQuY2Fub25pY2FsU3RyaW5nKCksXG4gICAgICAgICAgICBzZXRUb1NlcnZlclZhbHVlOiBcIlJFUVVFU1RfVElNRVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2YgVnMpIHJldHVybiB7XG4gICAgICAgICAgICBmaWVsZFBhdGg6IGUuZmllbGQuY2Fub25pY2FsU3RyaW5nKCksXG4gICAgICAgICAgICBhcHBlbmRNaXNzaW5nRWxlbWVudHM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IG4uZWxlbWVudHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBEcykgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkUGF0aDogZS5maWVsZC5jYW5vbmljYWxTdHJpbmcoKSxcbiAgICAgICAgICAgIHJlbW92ZUFsbEZyb21BcnJheToge1xuICAgICAgICAgICAgICAgIHZhbHVlczogbi5lbGVtZW50c1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAobiBpbnN0YW5jZW9mIHhzKSByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRQYXRoOiBlLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpLFxuICAgICAgICAgICAgaW5jcmVtZW50OiBuLmd0XG4gICAgICAgIH07XG4gICAgICAgIHRocm93IE8oKTtcbiAgICB9KDAsIHQpKSkpLCBlLnByZWNvbmRpdGlvbi5pc05vbmUgfHwgKG4uY3VycmVudERvY3VtZW50ID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlLnVwZGF0ZVRpbWUgPyB7XG4gICAgICAgICAgICB1cGRhdGVUaW1lOiB4aSh0LCBlLnVwZGF0ZVRpbWUpXG4gICAgICAgIH0gOiB2b2lkIDAgIT09IGUuZXhpc3RzID8ge1xuICAgICAgICAgICAgZXhpc3RzOiBlLmV4aXN0c1xuICAgICAgICB9IDogTygpO1xuICAgIH0odCwgZS5wcmVjb25kaXRpb24pKSwgbjtcbn1cblxuZnVuY3Rpb24gemkodCwgZSkge1xuICAgIGNvbnN0IG4gPSBlLmN1cnJlbnREb2N1bWVudCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdC51cGRhdGVUaW1lID8gRnMudXBkYXRlVGltZShOaSh0LnVwZGF0ZVRpbWUpKSA6IHZvaWQgMCAhPT0gdC5leGlzdHMgPyBGcy5leGlzdHModC5leGlzdHMpIDogRnMubm9uZSgpO1xuICAgIH0oZS5jdXJyZW50RG9jdW1lbnQpIDogRnMubm9uZSgpLCBzID0gZS51cGRhdGVUcmFuc2Zvcm1zID8gZS51cGRhdGVUcmFuc2Zvcm1zLm1hcCgoZSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGxldCBuID0gbnVsbDtcbiAgICAgICAgaWYgKFwic2V0VG9TZXJ2ZXJWYWx1ZVwiIGluIGUpIEYoXCJSRVFVRVNUX1RJTUVcIiA9PT0gZS5zZXRUb1NlcnZlclZhbHVlKSwgbiA9IG5ldyBiczsgZWxzZSBpZiAoXCJhcHBlbmRNaXNzaW5nRWxlbWVudHNcIiBpbiBlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5hcHBlbmRNaXNzaW5nRWxlbWVudHMudmFsdWVzIHx8IFtdO1xuICAgICAgICAgICAgbiA9IG5ldyBWcyh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChcInJlbW92ZUFsbEZyb21BcnJheVwiIGluIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLnJlbW92ZUFsbEZyb21BcnJheS52YWx1ZXMgfHwgW107XG4gICAgICAgICAgICBuID0gbmV3IERzKHQpO1xuICAgICAgICB9IGVsc2UgXCJpbmNyZW1lbnRcIiBpbiBlID8gbiA9IG5ldyB4cyh0LCBlLmluY3JlbWVudCkgOiBPKCk7XG4gICAgICAgIGNvbnN0IHMgPSBhdC5mcm9tU2VydmVyRm9ybWF0KGUuZmllbGRQYXRoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNcyhzLCBuKTtcbiAgICB9KHQsIGUpKSkgOiBbXTtcbiAgICBpZiAoZS51cGRhdGUpIHtcbiAgICAgICAgZS51cGRhdGUubmFtZTtcbiAgICAgICAgY29uc3QgaSA9IE9pKHQsIGUudXBkYXRlLm5hbWUpLCByID0gbmV3IHVuKHtcbiAgICAgICAgICAgIG1hcFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBlLnVwZGF0ZS5maWVsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlLnVwZGF0ZU1hc2spIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZmllbGRQYXRocyB8fCBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlKGUubWFwKCh0ID0+IGF0LmZyb21TZXJ2ZXJGb3JtYXQodCkpKSk7XG4gICAgICAgICAgICB9KGUudXBkYXRlTWFzayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHpzKGksIHIsIHQsIG4sIHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcganMoaSwgciwgbiwgcyk7XG4gICAgfVxuICAgIGlmIChlLmRlbGV0ZSkge1xuICAgICAgICBjb25zdCBzID0gT2kodCwgZS5kZWxldGUpO1xuICAgICAgICByZXR1cm4gbmV3IFlzKHMsIG4pO1xuICAgIH1cbiAgICBpZiAoZS52ZXJpZnkpIHtcbiAgICAgICAgY29uc3QgcyA9IE9pKHQsIGUudmVyaWZ5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBYcyhzLCBuKTtcbiAgICB9XG4gICAgcmV0dXJuIE8oKTtcbn1cblxuZnVuY3Rpb24gV2kodCwgZSkge1xuICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID4gMCA/IChGKHZvaWQgMCAhPT0gZSksIHQubWFwKCh0ID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gTk9URTogRGVsZXRlcyBkb24ndCBoYXZlIGFuIHVwZGF0ZVRpbWUuXG4gICAgICAgIGxldCBuID0gdC51cGRhdGVUaW1lID8gTmkodC51cGRhdGVUaW1lKSA6IE5pKGUpO1xuICAgICAgICByZXR1cm4gbi5pc0VxdWFsKHJ0Lm1pbigpKSAmJiAoXG4gICAgICAgIC8vIFRoZSBGaXJlc3RvcmUgRW11bGF0b3IgY3VycmVudGx5IHJldHVybnMgYW4gdXBkYXRlIHRpbWUgb2YgMCBmb3JcbiAgICAgICAgLy8gZGVsZXRlcyBvZiBub24tZXhpc3RpbmcgZG9jdW1lbnRzIChyYXRoZXIgdGhhbiBudWxsKS4gVGhpcyBicmVha3MgdGhlXG4gICAgICAgIC8vIHRlc3QgXCJnZXQgZGVsZXRlZCBkb2Mgd2hpbGUgb2ZmbGluZSB3aXRoIHNvdXJjZT1jYWNoZVwiIGFzIE5vRG9jdW1lbnRzXG4gICAgICAgIC8vIHdpdGggdmVyc2lvbiAwIGFyZSBmaWx0ZXJlZCBieSBJbmRleGVkRGIncyBSZW1vdGVEb2N1bWVudENhY2hlLlxuICAgICAgICAvLyBUT0RPKCMyMTQ5KTogUmVtb3ZlIHRoaXMgd2hlbiBFbXVsYXRvciBpcyBmaXhlZFxuICAgICAgICBuID0gTmkoZSkpLCBuZXcgT3MobiwgdC50cmFuc2Zvcm1SZXN1bHRzIHx8IFtdKTtcbiAgICB9KHQsIGUpKSkpIDogW107XG59XG5cbmZ1bmN0aW9uIEhpKHQsIGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkb2N1bWVudHM6IFsgRmkodCwgZS5wYXRoKSBdXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gSmkodCwgZSkge1xuICAgIC8vIERpc3NlY3QgdGhlIHBhdGggaW50byBwYXJlbnQsIGNvbGxlY3Rpb25JZCwgYW5kIG9wdGlvbmFsIGtleSBmaWx0ZXIuXG4gICAgY29uc3QgbiA9IHtcbiAgICAgICAgc3RydWN0dXJlZFF1ZXJ5OiB7fVxuICAgIH0sIHMgPSBlLnBhdGg7XG4gICAgbnVsbCAhPT0gZS5jb2xsZWN0aW9uR3JvdXAgPyAobi5wYXJlbnQgPSBGaSh0LCBzKSwgbi5zdHJ1Y3R1cmVkUXVlcnkuZnJvbSA9IFsge1xuICAgICAgICBjb2xsZWN0aW9uSWQ6IGUuY29sbGVjdGlvbkdyb3VwLFxuICAgICAgICBhbGxEZXNjZW5kYW50czogITBcbiAgICB9IF0pIDogKG4ucGFyZW50ID0gRmkodCwgcy5wb3BMYXN0KCkpLCBuLnN0cnVjdHVyZWRRdWVyeS5mcm9tID0gWyB7XG4gICAgICAgIGNvbGxlY3Rpb25JZDogcy5sYXN0U2VnbWVudCgpXG4gICAgfSBdKTtcbiAgICBjb25zdCBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIHJyKGduLmNyZWF0ZSh0LCBcImFuZFwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLkFORCAqLykpO1xuICAgIH0oZS5maWx0ZXJzKTtcbiAgICBpICYmIChuLnN0cnVjdHVyZWRRdWVyeS53aGVyZSA9IGkpO1xuICAgIGNvbnN0IHIgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICByZXR1cm4gdC5tYXAoKHQgPT4gXG4gICAgICAgIC8vIHZpc2libGUgZm9yIHRlc3RpbmdcbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWVsZDogc3IodC5maWVsZCksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiB0cih0LmRpcilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0odCkpKTtcbiAgICB9KGUub3JkZXJCeSk7XG4gICAgciAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkub3JkZXJCeSA9IHIpO1xuICAgIGNvbnN0IG8gPSBTaSh0LCBlLmxpbWl0KTtcbiAgICB2YXIgdTtcbiAgICByZXR1cm4gbnVsbCAhPT0gbyAmJiAobi5zdHJ1Y3R1cmVkUXVlcnkubGltaXQgPSBvKSwgZS5zdGFydEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5zdGFydEF0ID0ge1xuICAgICAgICBiZWZvcmU6ICh1ID0gZS5zdGFydEF0KS5pbmNsdXNpdmUsXG4gICAgICAgIHZhbHVlczogdS5wb3NpdGlvblxuICAgIH0pLCBlLmVuZEF0ICYmIChuLnN0cnVjdHVyZWRRdWVyeS5lbmRBdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlZm9yZTogIXQuaW5jbHVzaXZlLFxuICAgICAgICAgICAgdmFsdWVzOiB0LnBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgfShlLmVuZEF0KSksIG47XG59XG5cbmZ1bmN0aW9uIFlpKHQpIHtcbiAgICBsZXQgZSA9IEJpKHQucGFyZW50KTtcbiAgICBjb25zdCBuID0gdC5zdHJ1Y3R1cmVkUXVlcnksIHMgPSBuLmZyb20gPyBuLmZyb20ubGVuZ3RoIDogMDtcbiAgICBsZXQgaSA9IG51bGw7XG4gICAgaWYgKHMgPiAwKSB7XG4gICAgICAgIEYoMSA9PT0gcyk7XG4gICAgICAgIGNvbnN0IHQgPSBuLmZyb21bMF07XG4gICAgICAgIHQuYWxsRGVzY2VuZGFudHMgPyBpID0gdC5jb2xsZWN0aW9uSWQgOiBlID0gZS5jaGlsZCh0LmNvbGxlY3Rpb25JZCk7XG4gICAgfVxuICAgIGxldCByID0gW107XG4gICAgbi53aGVyZSAmJiAociA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFppKHQpO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGduICYmIEluKGUpKSByZXR1cm4gZS5nZXRGaWx0ZXJzKCk7XG4gICAgICAgIHJldHVybiBbIGUgXTtcbiAgICB9KG4ud2hlcmUpKTtcbiAgICBsZXQgbyA9IFtdO1xuICAgIG4ub3JkZXJCeSAmJiAobyA9IG4ub3JkZXJCeS5tYXAoKHQgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gbmV3IGRuKGlyKHQuZmllbGQpLCBcbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFTQ0VORElOR1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImFzY1wiIC8qIERpcmVjdGlvbi5BU0NFTkRJTkcgKi87XG5cbiAgICAgICAgICAgICAgY2FzZSBcIkRFU0NFTkRJTkdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkZXNjXCIgLyogRGlyZWN0aW9uLkRFU0NFTkRJTkcgKi87XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICAgICAodC5kaXJlY3Rpb24pKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgICh0KSkpKTtcbiAgICBsZXQgdSA9IG51bGw7XG4gICAgbi5saW1pdCAmJiAodSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHJldHVybiBlID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgdCA/IHQudmFsdWUgOiB0LCBGdChlKSA/IG51bGwgOiBlO1xuICAgIH0obi5saW1pdCkpO1xuICAgIGxldCBjID0gbnVsbDtcbiAgICBuLnN0YXJ0QXQgJiYgKGMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuYmVmb3JlLCBuID0gdC52YWx1ZXMgfHwgW107XG4gICAgICAgIHJldHVybiBuZXcgaG4obiwgZSk7XG4gICAgfShuLnN0YXJ0QXQpKTtcbiAgICBsZXQgYSA9IG51bGw7XG4gICAgcmV0dXJuIG4uZW5kQXQgJiYgKGEgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhdC5iZWZvcmUsIG4gPSB0LnZhbHVlcyB8fCBbXTtcbiAgICAgICAgcmV0dXJuIG5ldyBobihuLCBlKTtcbiAgICB9XG4gICAgLy8gdmlzaWJsZSBmb3IgdGVzdGluZ1xuICAgIChuLmVuZEF0KSksIEtuKGUsIGksIG8sIHIsIHUsIFwiRlwiIC8qIExpbWl0VHlwZS5GaXJzdCAqLyAsIGMsIGEpO1xufVxuXG5mdW5jdGlvbiBYaSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSBcIlRhcmdldFB1cnBvc2VMaXN0ZW5cIiAvKiBUYXJnZXRQdXJwb3NlLkxpc3RlbiAqLyA6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAgIGNhc2UgXCJUYXJnZXRQdXJwb3NlRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hcIiAvKiBUYXJnZXRQdXJwb3NlLkV4aXN0ZW5jZUZpbHRlck1pc21hdGNoICovIDpcbiAgICAgICAgICAgIHJldHVybiBcImV4aXN0ZW5jZS1maWx0ZXItbWlzbWF0Y2hcIjtcblxuICAgICAgICAgIGNhc2UgXCJUYXJnZXRQdXJwb3NlRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hCbG9vbVwiIC8qIFRhcmdldFB1cnBvc2UuRXhpc3RlbmNlRmlsdGVyTWlzbWF0Y2hCbG9vbSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gXCJleGlzdGVuY2UtZmlsdGVyLW1pc21hdGNoLWJsb29tXCI7XG5cbiAgICAgICAgICBjYXNlIFwiVGFyZ2V0UHVycG9zZUxpbWJvUmVzb2x1dGlvblwiIC8qIFRhcmdldFB1cnBvc2UuTGltYm9SZXNvbHV0aW9uICovIDpcbiAgICAgICAgICAgIHJldHVybiBcImxpbWJvLWRvY3VtZW50XCI7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE8oKTtcbiAgICAgICAgfVxuICAgIH0oZS5wdXJwb3NlKTtcbiAgICByZXR1cm4gbnVsbCA9PSBuID8gbnVsbCA6IHtcbiAgICAgICAgXCJnb29nLWxpc3Rlbi10YWdzXCI6IG5cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBaaSh0KSB7XG4gICAgcmV0dXJuIHZvaWQgMCAhPT0gdC51bmFyeUZpbHRlciA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgc3dpdGNoICh0LnVuYXJ5RmlsdGVyLm9wKSB7XG4gICAgICAgICAgY2FzZSBcIklTX05BTlwiOlxuICAgICAgICAgICAgY29uc3QgZSA9IGlyKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICAgICAgcmV0dXJuIG1uLmNyZWF0ZShlLCBcIj09XCIgLyogT3BlcmF0b3IuRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICAgICAgZG91YmxlVmFsdWU6IE5hTlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwiSVNfTlVMTFwiOlxuICAgICAgICAgICAgY29uc3QgbiA9IGlyKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICAgICAgcmV0dXJuIG1uLmNyZWF0ZShuLCBcIj09XCIgLyogT3BlcmF0b3IuRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlIFwiSVNfTk9UX05BTlwiOlxuICAgICAgICAgICAgY29uc3QgcyA9IGlyKHQudW5hcnlGaWx0ZXIuZmllbGQpO1xuICAgICAgICAgICAgcmV0dXJuIG1uLmNyZWF0ZShzLCBcIiE9XCIgLyogT3BlcmF0b3IuTk9UX0VRVUFMICovICwge1xuICAgICAgICAgICAgICAgIGRvdWJsZVZhbHVlOiBOYU5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSBcIklTX05PVF9OVUxMXCI6XG4gICAgICAgICAgICBjb25zdCBpID0gaXIodC51bmFyeUZpbHRlci5maWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gbW4uY3JlYXRlKGksIFwiIT1cIiAvKiBPcGVyYXRvci5OT1RfRVFVQUwgKi8gLCB7XG4gICAgICAgICAgICAgICAgbnVsbFZhbHVlOiBcIk5VTExfVkFMVUVcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE8oKTtcbiAgICAgICAgfVxuICAgIH0odCkgOiB2b2lkIDAgIT09IHQuZmllbGRGaWx0ZXIgPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBtbi5jcmVhdGUoaXIodC5maWVsZEZpbHRlci5maWVsZCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgICBjYXNlIFwiRVFVQUxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI9PVwiIC8qIE9wZXJhdG9yLkVRVUFMICovO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJOT1RfRVFVQUxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIhPVwiIC8qIE9wZXJhdG9yLk5PVF9FUVVBTCAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiR1JFQVRFUl9USEFOXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPlwiIC8qIE9wZXJhdG9yLkdSRUFURVJfVEhBTiAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPj1cIiAvKiBPcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUwgKi87XG5cbiAgICAgICAgICAgICAgY2FzZSBcIkxFU1NfVEhBTlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIjxcIiAvKiBPcGVyYXRvci5MRVNTX1RIQU4gKi87XG5cbiAgICAgICAgICAgICAgY2FzZSBcIkxFU1NfVEhBTl9PUl9FUVVBTFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIjw9XCIgLyogT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMICovO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJBUlJBWV9DT05UQUlOU1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImFycmF5LWNvbnRhaW5zXCIgLyogT3BlcmF0b3IuQVJSQVlfQ09OVEFJTlMgKi87XG5cbiAgICAgICAgICAgICAgY2FzZSBcIklOXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5cIiAvKiBPcGVyYXRvci5JTiAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiTk9UX0lOXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovO1xuXG4gICAgICAgICAgICAgIGNhc2UgXCJBUlJBWV9DT05UQUlOU19BTllcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOU19BTlkgKi87XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHQuZmllbGRGaWx0ZXIub3ApLCB0LmZpZWxkRmlsdGVyLnZhbHVlKTtcbiAgICB9KHQpIDogdm9pZCAwICE9PSB0LmNvbXBvc2l0ZUZpbHRlciA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIGduLmNyZWF0ZSh0LmNvbXBvc2l0ZUZpbHRlci5maWx0ZXJzLm1hcCgodCA9PiBaaSh0KSkpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkFORFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImFuZFwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLkFORCAqLztcblxuICAgICAgICAgICAgICBjYXNlIFwiT1JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvclwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLk9SICovO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSh0LmNvbXBvc2l0ZUZpbHRlci5vcCkpO1xuICAgIH0odCkgOiBPKCk7XG59XG5cbmZ1bmN0aW9uIHRyKHQpIHtcbiAgICByZXR1cm4gUmlbdF07XG59XG5cbmZ1bmN0aW9uIGVyKHQpIHtcbiAgICByZXR1cm4gUGlbdF07XG59XG5cbmZ1bmN0aW9uIG5yKHQpIHtcbiAgICByZXR1cm4gYmlbdF07XG59XG5cbmZ1bmN0aW9uIHNyKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZFBhdGg6IHQuY2Fub25pY2FsU3RyaW5nKClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBpcih0KSB7XG4gICAgcmV0dXJuIGF0LmZyb21TZXJ2ZXJGb3JtYXQodC5maWVsZFBhdGgpO1xufVxuXG5mdW5jdGlvbiBycih0KSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBtbiA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgaWYgKFwiPT1cIiAvKiBPcGVyYXRvci5FUVVBTCAqLyA9PT0gdC5vcCkge1xuICAgICAgICAgICAgaWYgKFhlKHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVuYXJ5RmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzcih0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTkFOXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFllKHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVuYXJ5RmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzcih0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTlVMTFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChcIiE9XCIgLyogT3BlcmF0b3IuTk9UX0VRVUFMICovID09PSB0Lm9wKSB7XG4gICAgICAgICAgICBpZiAoWGUodC52YWx1ZSkpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdW5hcnlGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHNyKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgICAgICBvcDogXCJJU19OT1RfTkFOXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFllKHQudmFsdWUpKSByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVuYXJ5RmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzcih0LmZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgb3A6IFwiSVNfTk9UX05VTExcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpZWxkRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgZmllbGQ6IHNyKHQuZmllbGQpLFxuICAgICAgICAgICAgICAgIG9wOiBlcih0Lm9wKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdC52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0odCkgOiB0IGluc3RhbmNlb2YgZ24gPyBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LmdldEZpbHRlcnMoKS5tYXAoKHQgPT4gcnIodCkpKTtcbiAgICAgICAgaWYgKDEgPT09IGUubGVuZ3RoKSByZXR1cm4gZVswXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZpbHRlcjoge1xuICAgICAgICAgICAgICAgIG9wOiBucih0Lm9wKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSh0KSA6IE8oKTtcbn1cblxuZnVuY3Rpb24gb3IodCkge1xuICAgIGNvbnN0IGUgPSBbXTtcbiAgICByZXR1cm4gdC5maWVsZHMuZm9yRWFjaCgodCA9PiBlLnB1c2godC5jYW5vbmljYWxTdHJpbmcoKSkpKSwge1xuICAgICAgICBmaWVsZFBhdGhzOiBlXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdXIodCkge1xuICAgIC8vIFJlc291cmNlIG5hbWVzIGhhdmUgYXQgbGVhc3QgNCBjb21wb25lbnRzIChwcm9qZWN0IElELCBkYXRhYmFzZSBJRClcbiAgICByZXR1cm4gdC5sZW5ndGggPj0gNCAmJiBcInByb2plY3RzXCIgPT09IHQuZ2V0KDApICYmIFwiZGF0YWJhc2VzXCIgPT09IHQuZ2V0KDIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbW11dGFibGUgc2V0IG9mIG1ldGFkYXRhIHRoYXQgdGhlIGxvY2FsIHN0b3JlIHRyYWNrcyBmb3IgZWFjaCB0YXJnZXQuXG4gKi8gY2xhc3MgY3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgdGFyZ2V0IGJlaW5nIGxpc3RlbmVkIHRvLiAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgSUQgdG8gd2hpY2ggdGhlIHRhcmdldCBjb3JyZXNwb25kczsgQXNzaWduZWQgYnkgdGhlXG4gICAgICogTG9jYWxTdG9yZSBmb3IgdXNlciBsaXN0ZW5zIGFuZCBieSB0aGUgU3luY0VuZ2luZSBmb3IgbGltYm8gd2F0Y2hlcy5cbiAgICAgKi9cbiAgICBlLCBcbiAgICAvKiogVGhlIHB1cnBvc2Ugb2YgdGhlIHRhcmdldC4gKi9cbiAgICBuLCBcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGR1cmluZyB3aGljaCB0aGlzIHRhcmdldCBkYXRhXG4gICAgICogd2FzIG1vZGlmaWVkLlxuICAgICAqL1xuICAgIHMsIFxuICAgIC8qKiBUaGUgbGF0ZXN0IHNuYXBzaG90IHZlcnNpb24gc2VlbiBmb3IgdGhpcyB0YXJnZXQuICovXG4gICAgaSA9IHJ0Lm1pbigpXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gc25hcHNob3QgdmVyc2lvbiBhdCB3aGljaCB0aGUgYXNzb2NpYXRlZCB2aWV3XG4gICAgICogY29udGFpbmVkIG5vIGxpbWJvIGRvY3VtZW50cy5cbiAgICAgKi8gLCByID0gcnQubWluKClcbiAgICAvKipcbiAgICAgKiBBbiBvcGFxdWUsIHNlcnZlci1hc3NpZ25lZCB0b2tlbiB0aGF0IGFsbG93cyB3YXRjaGluZyBhIHRhcmdldCB0byBiZVxuICAgICAqIHJlc3VtZWQgYWZ0ZXIgZGlzY29ubmVjdGluZyB3aXRob3V0IHJldHJhbnNtaXR0aW5nIGFsbCB0aGUgZGF0YSB0aGF0XG4gICAgICogbWF0Y2hlcyB0aGUgdGFyZ2V0LiBUaGUgcmVzdW1lIHRva2VuIGVzc2VudGlhbGx5IGlkZW50aWZpZXMgYSBwb2ludCBpblxuICAgICAqIHRpbWUgZnJvbSB3aGljaCB0aGUgc2VydmVyIHNob3VsZCByZXN1bWUgc2VuZGluZyByZXN1bHRzLlxuICAgICAqLyAsIG8gPSBWZS5FTVBUWV9CWVRFX1NUUklOR1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgbGFzdCBtYXRjaGVkIHRoZSBxdWVyeSBhdCB0aGUgcmVzdW1lIHRva2VuIG9yXG4gICAgICogcmVhZCB0aW1lLiBEb2N1bWVudHMgYXJlIGNvdW50ZWQgb25seSB3aGVuIG1ha2luZyBhIGxpc3RlbiByZXF1ZXN0IHdpdGhcbiAgICAgKiByZXN1bWUgdG9rZW4gb3IgcmVhZCB0aW1lLCBvdGhlcndpc2UsIGtlZXAgaXQgbnVsbC5cbiAgICAgKi8gLCB1ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHQsIHRoaXMudGFyZ2V0SWQgPSBlLCB0aGlzLnB1cnBvc2UgPSBuLCB0aGlzLnNlcXVlbmNlTnVtYmVyID0gcywgdGhpcy5zbmFwc2hvdFZlcnNpb24gPSBpLCBcbiAgICAgICAgdGhpcy5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID0gciwgdGhpcy5yZXN1bWVUb2tlbiA9IG8sIHRoaXMuZXhwZWN0ZWRDb3VudCA9IHU7XG4gICAgfVxuICAgIC8qKiBDcmVhdGVzIGEgbmV3IHRhcmdldCBkYXRhIGluc3RhbmNlIHdpdGggYW4gdXBkYXRlZCBzZXF1ZW5jZSBudW1iZXIuICovICAgIHdpdGhTZXF1ZW5jZU51bWJlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3IodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdCwgdGhpcy5zbmFwc2hvdFZlcnNpb24sIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiwgdGhpcy5yZXN1bWVUb2tlbiwgdGhpcy5leHBlY3RlZENvdW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgZGF0YSBpbnN0YW5jZSB3aXRoIGFuIHVwZGF0ZWQgcmVzdW1lIHRva2VuIGFuZFxuICAgICAqIHNuYXBzaG90IHZlcnNpb24uXG4gICAgICovICAgIHdpdGhSZXN1bWVUb2tlbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgY3IodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdGhpcy5zZXF1ZW5jZU51bWJlciwgZSwgdGhpcy5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uLCB0LCBcbiAgICAgICAgLyogZXhwZWN0ZWRDb3VudD0gKi8gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFyZ2V0IGRhdGEgaW5zdGFuY2Ugd2l0aCBhbiB1cGRhdGVkIGV4cGVjdGVkIGNvdW50LlxuICAgICAqLyAgICB3aXRoRXhwZWN0ZWRDb3VudCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3IodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdGhpcy5zZXF1ZW5jZU51bWJlciwgdGhpcy5zbmFwc2hvdFZlcnNpb24sIHRoaXMubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiwgdGhpcy5yZXN1bWVUb2tlbiwgdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFyZ2V0IGRhdGEgaW5zdGFuY2Ugd2l0aCBhbiB1cGRhdGVkIGxhc3QgbGltYm8gZnJlZVxuICAgICAqIHNuYXBzaG90IHZlcnNpb24gbnVtYmVyLlxuICAgICAqLyAgICB3aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgY3IodGhpcy50YXJnZXQsIHRoaXMudGFyZ2V0SWQsIHRoaXMucHVycG9zZSwgdGhpcy5zZXF1ZW5jZU51bWJlciwgdGhpcy5zbmFwc2hvdFZlcnNpb24sIHQsIHRoaXMucmVzdW1lVG9rZW4sIHRoaXMuZXhwZWN0ZWRDb3VudCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFNlcmlhbGl6ZXIgZm9yIHZhbHVlcyBzdG9yZWQgaW4gdGhlIExvY2FsU3RvcmUuICovIGNsYXNzIGFyIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZmUgPSB0O1xuICAgIH1cbn1cblxuLyoqIERlY29kZXMgYSByZW1vdGUgZG9jdW1lbnQgZnJvbSBzdG9yYWdlIGxvY2FsbHkgdG8gYSBEb2N1bWVudC4gKi8gZnVuY3Rpb24gaHIodCwgZSkge1xuICAgIGxldCBuO1xuICAgIGlmIChlLmRvY3VtZW50KSBuID0gS2kodC5mZSwgZS5kb2N1bWVudCwgISFlLmhhc0NvbW1pdHRlZE11dGF0aW9ucyk7IGVsc2UgaWYgKGUubm9Eb2N1bWVudCkge1xuICAgICAgICBjb25zdCB0ID0gaHQuZnJvbVNlZ21lbnRzKGUubm9Eb2N1bWVudC5wYXRoKSwgcyA9IHdyKGUubm9Eb2N1bWVudC5yZWFkVGltZSk7XG4gICAgICAgIG4gPSBhbi5uZXdOb0RvY3VtZW50KHQsIHMpLCBlLmhhc0NvbW1pdHRlZE11dGF0aW9ucyAmJiBuLnNldEhhc0NvbW1pdHRlZE11dGF0aW9ucygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghZS51bmtub3duRG9jdW1lbnQpIHJldHVybiBPKCk7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBodC5mcm9tU2VnbWVudHMoZS51bmtub3duRG9jdW1lbnQucGF0aCksIHMgPSB3cihlLnVua25vd25Eb2N1bWVudC52ZXJzaW9uKTtcbiAgICAgICAgICAgIG4gPSBhbi5uZXdVbmtub3duRG9jdW1lbnQodCwgcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGUucmVhZFRpbWUgJiYgbi5zZXRSZWFkVGltZShmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgaXQodFswXSwgdFsxXSk7XG4gICAgICAgIHJldHVybiBydC5mcm9tVGltZXN0YW1wKGUpO1xuICAgIH0oZS5yZWFkVGltZSkpLCBuO1xufVxuXG4vKiogRW5jb2RlcyBhIGRvY3VtZW50IGZvciBzdG9yYWdlIGxvY2FsbHkuICovIGZ1bmN0aW9uIGxyKHQsIGUpIHtcbiAgICBjb25zdCBuID0gZS5rZXksIHMgPSB7XG4gICAgICAgIHByZWZpeFBhdGg6IG4uZ2V0Q29sbGVjdGlvblBhdGgoKS5wb3BMYXN0KCkudG9BcnJheSgpLFxuICAgICAgICBjb2xsZWN0aW9uR3JvdXA6IG4uY29sbGVjdGlvbkdyb3VwLFxuICAgICAgICBkb2N1bWVudElkOiBuLnBhdGgubGFzdFNlZ21lbnQoKSxcbiAgICAgICAgcmVhZFRpbWU6IGZyKGUucmVhZFRpbWUpLFxuICAgICAgICBoYXNDb21taXR0ZWRNdXRhdGlvbnM6IGUuaGFzQ29tbWl0dGVkTXV0YXRpb25zXG4gICAgfTtcbiAgICBpZiAoZS5pc0ZvdW5kRG9jdW1lbnQoKSkgcy5kb2N1bWVudCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICRpKHQsIGUua2V5KSxcbiAgICAgICAgICAgIGZpZWxkczogZS5kYXRhLnZhbHVlLm1hcFZhbHVlLmZpZWxkcyxcbiAgICAgICAgICAgIHVwZGF0ZVRpbWU6IERpKHQsIGUudmVyc2lvbi50b1RpbWVzdGFtcCgpKSxcbiAgICAgICAgICAgIGNyZWF0ZVRpbWU6IERpKHQsIGUuY3JlYXRlVGltZS50b1RpbWVzdGFtcCgpKVxuICAgICAgICB9O1xuICAgIH0odC5mZSwgZSk7IGVsc2UgaWYgKGUuaXNOb0RvY3VtZW50KCkpIHMubm9Eb2N1bWVudCA9IHtcbiAgICAgICAgcGF0aDogbi5wYXRoLnRvQXJyYXkoKSxcbiAgICAgICAgcmVhZFRpbWU6IGRyKGUudmVyc2lvbilcbiAgICB9OyBlbHNlIHtcbiAgICAgICAgaWYgKCFlLmlzVW5rbm93bkRvY3VtZW50KCkpIHJldHVybiBPKCk7XG4gICAgICAgIHMudW5rbm93bkRvY3VtZW50ID0ge1xuICAgICAgICAgICAgcGF0aDogbi5wYXRoLnRvQXJyYXkoKSxcbiAgICAgICAgICAgIHZlcnNpb246IGRyKGUudmVyc2lvbilcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIGZyKHQpIHtcbiAgICBjb25zdCBlID0gdC50b1RpbWVzdGFtcCgpO1xuICAgIHJldHVybiBbIGUuc2Vjb25kcywgZS5uYW5vc2Vjb25kcyBdO1xufVxuXG5mdW5jdGlvbiBkcih0KSB7XG4gICAgY29uc3QgZSA9IHQudG9UaW1lc3RhbXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZWNvbmRzOiBlLnNlY29uZHMsXG4gICAgICAgIG5hbm9zZWNvbmRzOiBlLm5hbm9zZWNvbmRzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gd3IodCkge1xuICAgIGNvbnN0IGUgPSBuZXcgaXQodC5zZWNvbmRzLCB0Lm5hbm9zZWNvbmRzKTtcbiAgICByZXR1cm4gcnQuZnJvbVRpbWVzdGFtcChlKTtcbn1cblxuLyoqIEVuY29kZXMgYSBiYXRjaCBvZiBtdXRhdGlvbnMgaW50byBhIERiTXV0YXRpb25CYXRjaCBmb3IgbG9jYWwgc3RvcmFnZS4gKi9cbi8qKiBEZWNvZGVzIGEgRGJNdXRhdGlvbkJhdGNoIGludG8gYSBNdXRhdGlvbkJhdGNoICovXG5mdW5jdGlvbiBfcih0LCBlKSB7XG4gICAgY29uc3QgbiA9IChlLmJhc2VNdXRhdGlvbnMgfHwgW10pLm1hcCgoZSA9PiB6aSh0LmZlLCBlKSkpO1xuICAgIC8vIFNxdWFzaCBvbGQgdHJhbnNmb3JtIG11dGF0aW9ucyBpbnRvIGV4aXN0aW5nIHBhdGNoIG9yIHNldCBtdXRhdGlvbnMuXG4gICAgLy8gVGhlIHJlcGxhY2VtZW50IG9mIHJlcHJlc2VudGluZyBgdHJhbnNmb3Jtc2Agd2l0aCBgdXBkYXRlX3RyYW5zZm9ybXNgXG4gICAgLy8gb24gdGhlIFNESyBtZWFucyB0aGF0IG9sZCBgdHJhbnNmb3JtYCBtdXRhdGlvbnMgc3RvcmVkIGluIEluZGV4ZWREQiBuZWVkXG4gICAgLy8gdG8gYmUgdXBkYXRlZCB0byBgdXBkYXRlX3RyYW5zZm9ybXNgLlxuICAgIC8vIFRPRE8oYi8xNzQ2MDgzNzQpOiBSZW1vdmUgdGhpcyBjb2RlIG9uY2Ugd2UgcGVyZm9ybSBhIHNjaGVtYSBtaWdyYXRpb24uXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5tdXRhdGlvbnMubGVuZ3RoIC0gMTsgKyt0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLm11dGF0aW9uc1t0XTtcbiAgICAgICAgaWYgKHQgKyAxIDwgZS5tdXRhdGlvbnMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZS5tdXRhdGlvbnNbdCArIDFdLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGUubXV0YXRpb25zW3QgKyAxXTtcbiAgICAgICAgICAgIG4udXBkYXRlVHJhbnNmb3JtcyA9IHMudHJhbnNmb3JtLmZpZWxkVHJhbnNmb3JtcywgZS5tdXRhdGlvbnMuc3BsaWNlKHQgKyAxLCAxKSwgXG4gICAgICAgICAgICArK3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcyA9IGUubXV0YXRpb25zLm1hcCgoZSA9PiB6aSh0LmZlLCBlKSkpLCBpID0gaXQuZnJvbU1pbGxpcyhlLmxvY2FsV3JpdGVUaW1lTXMpO1xuICAgIHJldHVybiBuZXcgWnMoZS5iYXRjaElkLCBpLCBuLCBzKTtcbn1cblxuLyoqIERlY29kZXMgYSBEYlRhcmdldCBpbnRvIFRhcmdldERhdGEgKi8gZnVuY3Rpb24gbXIodCkge1xuICAgIGNvbnN0IGUgPSB3cih0LnJlYWRUaW1lKSwgbiA9IHZvaWQgMCAhPT0gdC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uID8gd3IodC5sYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uKSA6IHJ0Lm1pbigpO1xuICAgIGxldCBzO1xuICAgIHZhciBpO1xuICAgIHJldHVybiB2b2lkIDAgIT09IHQucXVlcnkuZG9jdW1lbnRzID8gKEYoMSA9PT0gKGkgPSB0LnF1ZXJ5KS5kb2N1bWVudHMubGVuZ3RoKSwgXG4gICAgcyA9IEpuKEduKEJpKGkuZG9jdW1lbnRzWzBdKSkpKSA6IHMgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBKbihZaSh0KSk7XG4gICAgfSh0LnF1ZXJ5KSwgbmV3IGNyKHMsIHQudGFyZ2V0SWQsIFwiVGFyZ2V0UHVycG9zZUxpc3RlblwiIC8qIFRhcmdldFB1cnBvc2UuTGlzdGVuICovICwgdC5sYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIsIGUsIG4sIFZlLmZyb21CYXNlNjRTdHJpbmcodC5yZXN1bWVUb2tlbikpO1xufVxuXG4vKiogRW5jb2RlcyBUYXJnZXREYXRhIGludG8gYSBEYlRhcmdldCBmb3Igc3RvcmFnZSBsb2NhbGx5LiAqLyBmdW5jdGlvbiBncih0LCBlKSB7XG4gICAgY29uc3QgbiA9IGRyKGUuc25hcHNob3RWZXJzaW9uKSwgcyA9IGRyKGUubGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbik7XG4gICAgbGV0IGk7XG4gICAgaSA9IEZuKGUudGFyZ2V0KSA/IEhpKHQuZmUsIGUudGFyZ2V0KSA6IEppKHQuZmUsIGUudGFyZ2V0KTtcbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGUgcmVzdW1lVG9rZW4gYXMgYSBCeXRlU3RyaW5nIGluIEluZGV4ZWREYiwgc28gd2VcbiAgICAvLyBjb252ZXJ0IGl0IHRvIGEgYmFzZTY0IHN0cmluZyBmb3Igc3RvcmFnZS5cbiAgICAgICAgY29uc3QgciA9IGUucmVzdW1lVG9rZW4udG9CYXNlNjQoKTtcbiAgICAvLyBsYXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgaXMgYWx3YXlzIDAgdW50aWwgd2UgZG8gcmVhbCBHQy5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0SWQ6IGUudGFyZ2V0SWQsXG4gICAgICAgIGNhbm9uaWNhbElkOiAkbihlLnRhcmdldCksXG4gICAgICAgIHJlYWRUaW1lOiBuLFxuICAgICAgICByZXN1bWVUb2tlbjogcixcbiAgICAgICAgbGFzdExpc3RlblNlcXVlbmNlTnVtYmVyOiBlLnNlcXVlbmNlTnVtYmVyLFxuICAgICAgICBsYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uOiBzLFxuICAgICAgICBxdWVyeTogaVxuICAgIH07XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpZ3VyaW5nIG91dCB3aGF0IGtpbmQgb2YgcXVlcnkgaGFzIGJlZW4gc3RvcmVkLlxuICovXG4vKipcbiAqIEVuY29kZXMgYSBgQnVuZGxlZFF1ZXJ5YCBmcm9tIGJ1bmRsZSBwcm90byB0byBhIFF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBUaGlzIHJlY29uc3RydWN0cyB0aGUgb3JpZ2luYWwgcXVlcnkgdXNlZCB0byBidWlsZCB0aGUgYnVuZGxlIGJlaW5nIGxvYWRlZCxcbiAqIGluY2x1ZGluZyBmZWF0dXJlcyBleGlzdHMgb25seSBpbiBTREtzIChmb3IgZXhhbXBsZTogbGltaXQtdG8tbGFzdCkuXG4gKi9cbmZ1bmN0aW9uIHlyKHQpIHtcbiAgICBjb25zdCBlID0gWWkoe1xuICAgICAgICBwYXJlbnQ6IHQucGFyZW50LFxuICAgICAgICBzdHJ1Y3R1cmVkUXVlcnk6IHQuc3RydWN0dXJlZFF1ZXJ5XG4gICAgfSk7XG4gICAgcmV0dXJuIFwiTEFTVFwiID09PSB0LmxpbWl0VHlwZSA/IFhuKGUsIGUubGltaXQsIFwiTFwiIC8qIExpbWl0VHlwZS5MYXN0ICovKSA6IGU7XG59XG5cbi8qKiBFbmNvZGVzIGEgTmFtZWRRdWVyeSBwcm90byBvYmplY3QgdG8gYSBOYW1lZFF1ZXJ5IG1vZGVsIG9iamVjdC4gKi9cbi8qKiBFbmNvZGVzIGEgRGJEb2N1bWVudE92ZXJsYXkgb2JqZWN0IHRvIGFuIE92ZXJsYXkgbW9kZWwgb2JqZWN0LiAqL1xuZnVuY3Rpb24gcHIodCwgZSkge1xuICAgIHJldHVybiBuZXcgZWkoZS5sYXJnZXN0QmF0Y2hJZCwgemkodC5mZSwgZS5vdmVybGF5TXV0YXRpb24pKTtcbn1cblxuLyoqIERlY29kZXMgYW4gT3ZlcmxheSBtb2RlbCBvYmplY3QgaW50byBhIERiRG9jdW1lbnRPdmVybGF5IG9iamVjdC4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgRGJEb2N1bWVudE92ZXJsYXlLZXkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXNlciBhbmRcbiAqIGRvY3VtZW50IGtleS5cbiAqL1xuZnVuY3Rpb24gSXIodCwgZSkge1xuICAgIGNvbnN0IG4gPSBlLnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICByZXR1cm4gWyB0LCBxdChlLnBhdGgucG9wTGFzdCgpKSwgbiBdO1xufVxuXG5mdW5jdGlvbiBUcih0LCBlLCBuLCBzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZXhJZDogdCxcbiAgICAgICAgdWlkOiBlLnVpZCB8fCBcIlwiLFxuICAgICAgICBzZXF1ZW5jZU51bWJlcjogbixcbiAgICAgICAgcmVhZFRpbWU6IGRyKHMucmVhZFRpbWUpLFxuICAgICAgICBkb2N1bWVudEtleTogcXQocy5kb2N1bWVudEtleS5wYXRoKSxcbiAgICAgICAgbGFyZ2VzdEJhdGNoSWQ6IHMubGFyZ2VzdEJhdGNoSWRcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBFciB7XG4gICAgZ2V0QnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gQXIodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IChlID0gdCkuYnVuZGxlSWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlVGltZTogd3IoZS5jcmVhdGVUaW1lKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlLnZlcnNpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIERiQnVuZGxlIHRvIGEgQnVuZGxlTWV0YWRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIEJ1bmRsZU1ldGFkYXRhIHRvIGEgRGJCdW5kbGUuICovICAgICAgICB9KSk7XG4gICAgfVxuICAgIHNhdmVCdW5kbGVNZXRhZGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBBcih0KS5wdXQoe1xuICAgICAgICAgICAgYnVuZGxlSWQ6IChuID0gZSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVUaW1lOiBkcihOaShuLmNyZWF0ZVRpbWUpKSxcbiAgICAgICAgICAgIHZlcnNpb246IG4udmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIC8qKiBFbmNvZGVzIGEgRGJOYW1lZFF1ZXJ5IHRvIGEgTmFtZWRRdWVyeS4gKi8gICAgfVxuICAgIGdldE5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gdnIodCkuZ2V0KGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogKGUgPSB0KS5uYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB5cihlLmJ1bmRsZWRRdWVyeSksXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IHdyKGUucmVhZFRpbWUpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGU7XG4gICAgICAgICAgICAvKiogRW5jb2RlcyBhIE5hbWVkUXVlcnkgZnJvbSBhIGJ1bmRsZSBwcm90byB0byBhIERiTmFtZWRRdWVyeS4gKi8gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc2F2ZU5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gdnIodCkucHV0KGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBkcihOaSh0LnJlYWRUaW1lKSksXG4gICAgICAgICAgICAgICAgYnVuZGxlZFF1ZXJ5OiB0LmJ1bmRsZWRRdWVyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgYnVuZGxlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gQXIodCkge1xuICAgIHJldHVybiBfZSh0LCBcImJ1bmRsZXNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBuYW1lZFF1ZXJpZXMgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIHZyKHQpIHtcbiAgICByZXR1cm4gX2UodCwgXCJuYW1lZFF1ZXJpZXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50T3ZlcmxheUNhY2hlIHVzaW5nIEluZGV4ZWREYi5cbiAqLyBjbGFzcyBSciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgZG9jdW1lbnQgc2VyaWFsaXplci5cbiAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXJJZCBmb3Igd2hpY2ggd2UgYXJlIGFjY2Vzc2luZyBvdmVybGF5cy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHQsIHRoaXMudXNlcklkID0gZTtcbiAgICB9XG4gICAgc3RhdGljIGRlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUudWlkIHx8IFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgUnIodCwgbik7XG4gICAgfVxuICAgIGdldE92ZXJsYXkodCwgZSkge1xuICAgICAgICByZXR1cm4gUHIodCkuZ2V0KElyKHRoaXMudXNlcklkLCBlKSkubmV4dCgodCA9PiB0ID8gcHIodGhpcy5zZXJpYWxpemVyLCB0KSA6IG51bGwpKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZnMoKTtcbiAgICAgICAgcmV0dXJuIFJ0LmZvckVhY2goZSwgKGUgPT4gdGhpcy5nZXRPdmVybGF5KHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgbnVsbCAhPT0gdCAmJiBuLnNldChlLCB0KTtcbiAgICAgICAgfSkpKSkubmV4dCgoKCkgPT4gbikpO1xuICAgIH1cbiAgICBzYXZlT3ZlcmxheXModCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgIHJldHVybiBuLmZvckVhY2goKChuLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gbmV3IGVpKGUsIGkpO1xuICAgICAgICAgICAgcy5wdXNoKHRoaXMud2UodCwgcikpO1xuICAgICAgICB9KSksIFJ0LndhaXRGb3Iocyk7XG4gICAgfVxuICAgIHJlbW92ZU92ZXJsYXlzRm9yQmF0Y2hJZCh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU2V0O1xuICAgICAgICAvLyBHZXQgdGhlIHNldCBvZiB1bmlxdWUgY29sbGVjdGlvbiBwYXRocy5cbiAgICAgICAgICAgICAgICBlLmZvckVhY2goKHQgPT4gcy5hZGQocXQodC5nZXRDb2xsZWN0aW9uUGF0aCgpKSkpKTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICByZXR1cm4gcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIHRoaXMudXNlcklkLCBlLCBuIF0sIFsgdGhpcy51c2VySWQsIGUsIG4gKyAxIF0sIFxuICAgICAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICAgICAgaS5wdXNoKFByKHQpLkooXCJjb2xsZWN0aW9uUGF0aE92ZXJsYXlJbmRleFwiLCBzKSk7XG4gICAgICAgIH0pKSwgUnQud2FpdEZvcihpKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXNGb3JDb2xsZWN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IGZzKCksIGkgPSBxdChlKSwgciA9IElEQktleVJhbmdlLmJvdW5kKFsgdGhpcy51c2VySWQsIGksIG4gXSwgWyB0aGlzLnVzZXJJZCwgaSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBQcih0KS5qKFwiY29sbGVjdGlvblBhdGhPdmVybGF5SW5kZXhcIiwgcikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBwcih0aGlzLnNlcmlhbGl6ZXIsIGUpO1xuICAgICAgICAgICAgICAgIHMuc2V0KHQuZ2V0S2V5KCksIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXNGb3JDb2xsZWN0aW9uR3JvdXAodCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gZnMoKTtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIC8vIFdlIHdhbnQgYmF0Y2ggSURzIGxhcmdlciB0aGFuIGBzaW5jZUJhdGNoSWRgLCBhbmQgc28gdGhlIGxvd2VyIGJvdW5kXG4gICAgICAgIC8vIGlzIG5vdCBpbmNsdXNpdmUuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IElEQktleVJhbmdlLmJvdW5kKFsgdGhpcy51c2VySWQsIGUsIG4gXSwgWyB0aGlzLnVzZXJJZCwgZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMCk7XG4gICAgICAgIHJldHVybiBQcih0KS5YKHtcbiAgICAgICAgICAgIGluZGV4OiBcImNvbGxlY3Rpb25Hcm91cE92ZXJsYXlJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IG9cbiAgICAgICAgfSwgKCh0LCBlLCBuKSA9PiB7XG4gICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byByZXR1cm4gcGFydGlhbCBiYXRjaCBvdmVybGF5cywgZXZlbiBpZiB0aGUgc2l6ZVxuICAgICAgICAgICAgLy8gb2YgdGhlIHJlc3VsdCBzZXQgZXhjZWVkcyB0aGUgZ2l2ZW4gYGNvdW50YCBhcmd1bWVudC4gVGhlcmVmb3JlLCB3ZVxuICAgICAgICAgICAgLy8gY29udGludWUgdG8gYWdncmVnYXRlIHJlc3VsdHMgZXZlbiBhZnRlciB0aGUgcmVzdWx0IHNpemUgZXhjZWVkc1xuICAgICAgICAgICAgLy8gYGNvdW50YCBpZiB0aGVyZSBhcmUgbW9yZSBvdmVybGF5cyBmcm9tIHRoZSBgY3VycmVudEJhdGNoSWRgLlxuICAgICAgICAgICAgY29uc3QgbyA9IHByKHRoaXMuc2VyaWFsaXplciwgZSk7XG4gICAgICAgICAgICBpLnNpemUoKSA8IHMgfHwgby5sYXJnZXN0QmF0Y2hJZCA9PT0gciA/IChpLnNldChvLmdldEtleSgpLCBvKSwgciA9IG8ubGFyZ2VzdEJhdGNoSWQpIDogbi5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIHdlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFByKHQpLnB1dChmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICBjb25zdCBbcywgaSwgcl0gPSBJcihlLCBuLm11dGF0aW9uLmtleSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVzZXJJZDogZSxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uUGF0aDogaSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudElkOiByLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Hcm91cDogbi5tdXRhdGlvbi5rZXkuZ2V0Q29sbGVjdGlvbkdyb3VwKCksXG4gICAgICAgICAgICAgICAgbGFyZ2VzdEJhdGNoSWQ6IG4ubGFyZ2VzdEJhdGNoSWQsXG4gICAgICAgICAgICAgICAgb3ZlcmxheU11dGF0aW9uOiBqaSh0LmZlLCBuLm11dGF0aW9uKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSh0aGlzLnNlcmlhbGl6ZXIsIHRoaXMudXNlcklkLCBlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgZG9jdW1lbnQgb3ZlcmxheSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gUHIodCkge1xuICAgIHJldHVybiBfZSh0LCBcImRvY3VtZW50T3ZlcmxheXNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBOb3RlOiBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGJhY2tlbmQuIENvZGUgdGhhdCBpcyBub3QgdXNlZCBieVxuLy8gRmlyZXN0b3JlIHdhcyByZW1vdmVkLlxuLyoqIEZpcmVzdG9yZSBpbmRleCB2YWx1ZSB3cml0ZXIuICAqL1xuY2xhc3MgYnIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cbiAgICAvLyBUaGUgd3JpdGUgbWV0aG9kcyBiZWxvdyBzaG9ydC1jaXJjdWl0IHdyaXRpbmcgdGVybWluYXRvcnMgZm9yIHZhbHVlc1xuICAgIC8vIGNvbnRhaW5pbmcgYSAodGVybWluYXRpbmcpIHRydW5jYXRlZCB2YWx1ZS5cbiAgICAvLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgcmVzdWx0aW5nIGVuY29kaW5nIGZvcjpcbiAgICAvLyBbXCJiYXJcIiwgWzIsIFwiZm9vXCJdXSAtPiAoU1RSSU5HLCBcImJhclwiLCBURVJNLCBBUlJBWSwgTlVNQkVSLCAyLCBTVFJJTkcsIFwiZm9vXCIsIFRFUk0sIFRFUk0sIFRFUk0pXG4gICAgLy8gW1wiYmFyXCIsIFsyLCB0cnVuY2F0ZWQoXCJmb29cIildXSAtPiAoU1RSSU5HLCBcImJhclwiLCBURVJNLCBBUlJBWSwgTlVNQkVSLCAyLCBTVFJJTkcsIFwiZm9vXCIsIFRSVU5DKVxuICAgIC8vIFtcImJhclwiLCB0cnVuY2F0ZWQoW1wiZm9vXCJdKV0gLT4gKFNUUklORywgXCJiYXJcIiwgVEVSTSwgQVJSQVkuIFNUUklORywgXCJmb29cIiwgVEVSTSwgVFJVTkMpXG4gICAgLyoqIFdyaXRlcyBhbiBpbmRleCB2YWx1ZS4gICovXG4gICAgX2UodCwgZSkge1xuICAgICAgICB0aGlzLm1lKHQsIGUpLCBcbiAgICAgICAgLy8gV3JpdGUgc2VwYXJhdG9yIHRvIHNwbGl0IGluZGV4IHZhbHVlc1xuICAgICAgICAvLyAoc2VlIGdvL2ZpcmVzdG9yZS1zdG9yYWdlLWZvcm1hdCNlbmNvZGluZ3MpLlxuICAgICAgICBlLmdlKCk7XG4gICAgfVxuICAgIG1lKHQsIGUpIHtcbiAgICAgICAgaWYgKFwibnVsbFZhbHVlXCIgaW4gdCkgdGhpcy55ZShlLCA1KTsgZWxzZSBpZiAoXCJib29sZWFuVmFsdWVcIiBpbiB0KSB0aGlzLnllKGUsIDEwKSwgXG4gICAgICAgIGUucGUodC5ib29sZWFuVmFsdWUgPyAxIDogMCk7IGVsc2UgaWYgKFwiaW50ZWdlclZhbHVlXCIgaW4gdCkgdGhpcy55ZShlLCAxNSksIGUucGUoQ2UodC5pbnRlZ2VyVmFsdWUpKTsgZWxzZSBpZiAoXCJkb3VibGVWYWx1ZVwiIGluIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBDZSh0LmRvdWJsZVZhbHVlKTtcbiAgICAgICAgICAgIGlzTmFOKG4pID8gdGhpcy55ZShlLCAxMykgOiAodGhpcy55ZShlLCAxNSksIEJ0KG4pID8gXG4gICAgICAgICAgICAvLyAtMC4wLCAwIGFuZCAwLjAgYXJlIGFsbCBjb25zaWRlcmVkIHRoZSBzYW1lXG4gICAgICAgICAgICBlLnBlKDApIDogZS5wZShuKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJ0aW1lc3RhbXBWYWx1ZVwiIGluIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRpbWVzdGFtcFZhbHVlO1xuICAgICAgICAgICAgdGhpcy55ZShlLCAyMCksIFwic3RyaW5nXCIgPT0gdHlwZW9mIG4gPyBlLkllKG4pIDogKGUuSWUoYCR7bi5zZWNvbmRzIHx8IFwiXCJ9YCksIGUucGUobi5uYW5vcyB8fCAwKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJzdHJpbmdWYWx1ZVwiIGluIHQpIHRoaXMuVGUodC5zdHJpbmdWYWx1ZSwgZSksIHRoaXMuRWUoZSk7IGVsc2UgaWYgKFwiYnl0ZXNWYWx1ZVwiIGluIHQpIHRoaXMueWUoZSwgMzApLCBcbiAgICAgICAgZS5BZSh4ZSh0LmJ5dGVzVmFsdWUpKSwgdGhpcy5FZShlKTsgZWxzZSBpZiAoXCJyZWZlcmVuY2VWYWx1ZVwiIGluIHQpIHRoaXMudmUodC5yZWZlcmVuY2VWYWx1ZSwgZSk7IGVsc2UgaWYgKFwiZ2VvUG9pbnRWYWx1ZVwiIGluIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0Lmdlb1BvaW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnllKGUsIDQ1KSwgZS5wZShuLmxhdGl0dWRlIHx8IDApLCBlLnBlKG4ubG9uZ2l0dWRlIHx8IDApO1xuICAgICAgICB9IGVsc2UgXCJtYXBWYWx1ZVwiIGluIHQgPyBlbih0KSA/IHRoaXMueWUoZSwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIDogKHRoaXMuUmUodC5tYXBWYWx1ZSwgZSksIFxuICAgICAgICB0aGlzLkVlKGUpKSA6IFwiYXJyYXlWYWx1ZVwiIGluIHQgPyAodGhpcy5QZSh0LmFycmF5VmFsdWUsIGUpLCB0aGlzLkVlKGUpKSA6IE8oKTtcbiAgICB9XG4gICAgVGUodCwgZSkge1xuICAgICAgICB0aGlzLnllKGUsIDI1KSwgdGhpcy5iZSh0LCBlKTtcbiAgICB9XG4gICAgYmUodCwgZSkge1xuICAgICAgICBlLkllKHQpO1xuICAgIH1cbiAgICBSZSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0LmZpZWxkcyB8fCB7fTtcbiAgICAgICAgdGhpcy55ZShlLCA1NSk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhuKSkgdGhpcy5UZSh0LCBlKSwgdGhpcy5tZShuW3RdLCBlKTtcbiAgICB9XG4gICAgUGUodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdC52YWx1ZXMgfHwgW107XG4gICAgICAgIHRoaXMueWUoZSwgNTApO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgbikgdGhpcy5tZSh0LCBlKTtcbiAgICB9XG4gICAgdmUodCwgZSkge1xuICAgICAgICB0aGlzLnllKGUsIDM3KTtcbiAgICAgICAgaHQuZnJvbU5hbWUodCkucGF0aC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMueWUoZSwgNjApLCB0aGlzLmJlKHQsIGUpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHllKHQsIGUpIHtcbiAgICAgICAgdC5wZShlKTtcbiAgICB9XG4gICAgRWUodCkge1xuICAgICAgICAvLyBXaGlsZSB0aGUgU0RLIGRvZXMgbm90IGltcGxlbWVudCB0cnVuY2F0aW9uLCB0aGUgdHJ1bmNhdGlvbiBtYXJrZXIgaXNcbiAgICAgICAgLy8gdXNlZCB0byB0ZXJtaW5hdGUgYWxsIHZhcmlhYmxlIGxlbmd0aCB2YWx1ZXMgKHdoaWNoIGFyZSBzdHJpbmdzLCBieXRlcyxcbiAgICAgICAgLy8gcmVmZXJlbmNlcywgYXJyYXlzIGFuZCBtYXBzKS5cbiAgICAgICAgdC5wZSgyKTtcbiAgICB9XG59XG5cbmJyLlZlID0gbmV3IGJyO1xuXG4vKipcbiAqIENvdW50cyB0aGUgbnVtYmVyIG9mIHplcm9zIGluIGEgYnl0ZS5cbiAqXG4gKiBWaXNpYmxlIGZvciB0ZXN0aW5nLlxuICovXG5mdW5jdGlvbiBWcih0KSB7XG4gICAgaWYgKDAgPT09IHQpIHJldHVybiA4O1xuICAgIGxldCBlID0gMDtcbiAgICByZXR1cm4gdCA+PiA0ID09IDAgJiYgKFxuICAgIC8vIFRlc3QgaWYgdGhlIGZpcnN0IGZvdXIgYml0cyBhcmUgemVyby5cbiAgICBlICs9IDQsIHQgPDw9IDQpLCB0ID4+IDYgPT0gMCAmJiAoXG4gICAgLy8gVGVzdCBpZiB0aGUgZmlyc3QgdHdvIChvciBuZXh0IHR3bykgYml0cyBhcmUgemVyby5cbiAgICBlICs9IDIsIHQgPDw9IDIpLCB0ID4+IDcgPT0gMCAmJiAoXG4gICAgLy8gVGVzdCBpZiB0aGUgcmVtYWluaW5nIGJpdCBpcyB6ZXJvLlxuICAgIGUgKz0gMSksIGU7XG59XG5cbi8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgXCJ2YWx1ZVwiLiBMZWFkaW5nIHplcm8gYnl0ZXNcbiAqIGFyZSBza2lwcGVkLlxuICovXG5mdW5jdGlvbiBTcih0KSB7XG4gICAgLy8gVGhpcyBpcyBqdXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHRoZSB1bnNpZ25lZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyLlxuICAgIGNvbnN0IGUgPSA2NCAtIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDg7ICsrbikge1xuICAgICAgICAgICAgY29uc3QgcyA9IFZyKDI1NSAmIHRbbl0pO1xuICAgICAgICAgICAgaWYgKGUgKz0gcywgOCAhPT0gcykgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSh0KTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKGUgLyA4KTtcbn1cblxuLyoqXG4gKiBPcmRlcmVkQ29kZVdyaXRlciBpcyBhIG1pbmltYWwtYWxsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgd3JpdGluZ1xuICogYmVoYXZpb3IgZGVmaW5lZCBieSB0aGUgYmFja2VuZC5cbiAqXG4gKiBUaGUgY29kZSBpcyBwb3J0ZWQgZnJvbSBpdHMgSmF2YSBjb3VudGVycGFydC5cbiAqLyBjbGFzcyBEciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTAyNCksIHRoaXMucG9zaXRpb24gPSAwO1xuICAgIH1cbiAgICBTZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgbGV0IG4gPSBlLm5leHQoKTtcbiAgICAgICAgZm9yICg7IW4uZG9uZTsgKSB0aGlzLkRlKG4udmFsdWUpLCBuID0gZS5uZXh0KCk7XG4gICAgICAgIHRoaXMuQ2UoKTtcbiAgICB9XG4gICAgeGUodCkge1xuICAgICAgICBjb25zdCBlID0gdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgIGxldCBuID0gZS5uZXh0KCk7XG4gICAgICAgIGZvciAoOyFuLmRvbmU7ICkgdGhpcy5OZShuLnZhbHVlKSwgbiA9IGUubmV4dCgpO1xuICAgICAgICB0aGlzLmtlKCk7XG4gICAgfVxuICAgIC8qKiBXcml0ZXMgdXRmOCBieXRlcyBpbnRvIHRoaXMgYnl0ZSBzZXF1ZW5jZSwgYXNjZW5kaW5nLiAqLyAgICBNZSh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgaWYgKHQgPCAxMjgpIHRoaXMuRGUodCk7IGVsc2UgaWYgKHQgPCAyMDQ4KSB0aGlzLkRlKDk2MCB8IHQgPj4+IDYpLCB0aGlzLkRlKDEyOCB8IDYzICYgdCk7IGVsc2UgaWYgKGUgPCBcIlxcdWQ4MDBcIiB8fCBcIlxcdWRiZmZcIiA8IGUpIHRoaXMuRGUoNDgwIHwgdCA+Pj4gMTIpLCBcbiAgICAgICAgICAgIHRoaXMuRGUoMTI4IHwgNjMgJiB0ID4+PiA2KSwgdGhpcy5EZSgxMjggfCA2MyAmIHQpOyBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS5jb2RlUG9pbnRBdCgwKTtcbiAgICAgICAgICAgICAgICB0aGlzLkRlKDI0MCB8IHQgPj4+IDE4KSwgdGhpcy5EZSgxMjggfCA2MyAmIHQgPj4+IDEyKSwgdGhpcy5EZSgxMjggfCA2MyAmIHQgPj4+IDYpLCBcbiAgICAgICAgICAgICAgICB0aGlzLkRlKDEyOCB8IDYzICYgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5DZSgpO1xuICAgIH1cbiAgICAvKiogV3JpdGVzIHV0ZjggYnl0ZXMgaW50byB0aGlzIGJ5dGUgc2VxdWVuY2UsIGRlc2NlbmRpbmcgKi8gICAgJGUodCkge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGlmICh0IDwgMTI4KSB0aGlzLk5lKHQpOyBlbHNlIGlmICh0IDwgMjA0OCkgdGhpcy5OZSg5NjAgfCB0ID4+PiA2KSwgdGhpcy5OZSgxMjggfCA2MyAmIHQpOyBlbHNlIGlmIChlIDwgXCJcXHVkODAwXCIgfHwgXCJcXHVkYmZmXCIgPCBlKSB0aGlzLk5lKDQ4MCB8IHQgPj4+IDEyKSwgXG4gICAgICAgICAgICB0aGlzLk5lKDEyOCB8IDYzICYgdCA+Pj4gNiksIHRoaXMuTmUoMTI4IHwgNjMgJiB0KTsgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5OZSgyNDAgfCB0ID4+PiAxOCksIHRoaXMuTmUoMTI4IHwgNjMgJiB0ID4+PiAxMiksIHRoaXMuTmUoMTI4IHwgNjMgJiB0ID4+PiA2KSwgXG4gICAgICAgICAgICAgICAgdGhpcy5OZSgxMjggfCA2MyAmIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMua2UoKTtcbiAgICB9XG4gICAgT2UodCkge1xuICAgICAgICAvLyBWYWx1ZXMgYXJlIGVuY29kZWQgd2l0aCBhIHNpbmdsZSBieXRlIGxlbmd0aCBwcmVmaXgsIGZvbGxvd2VkIGJ5IHRoZVxuICAgICAgICAvLyBhY3R1YWwgdmFsdWUgaW4gYmlnLWVuZGlhbiBmb3JtYXQgd2l0aCBsZWFkaW5nIDAgYnl0ZXMgZHJvcHBlZC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuRmUodCksIG4gPSBTcihlKTtcbiAgICAgICAgdGhpcy5CZSgxICsgbiksIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSAyNTUgJiBuO1xuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoXG4gICAgICAgIGZvciAobGV0IHQgPSBlLmxlbmd0aCAtIG47IHQgPCBlLmxlbmd0aDsgKyt0KSB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gMjU1ICYgZVt0XTtcbiAgICB9XG4gICAgTGUodCkge1xuICAgICAgICAvLyBWYWx1ZXMgYXJlIGVuY29kZWQgd2l0aCBhIHNpbmdsZSBieXRlIGxlbmd0aCBwcmVmaXgsIGZvbGxvd2VkIGJ5IHRoZVxuICAgICAgICAvLyBpbnZlcnRlZCB2YWx1ZSBpbiBiaWctZW5kaWFuIGZvcm1hdCB3aXRoIGxlYWRpbmcgMCBieXRlcyBkcm9wcGVkLlxuICAgICAgICBjb25zdCBlID0gdGhpcy5GZSh0KSwgbiA9IFNyKGUpO1xuICAgICAgICB0aGlzLkJlKDEgKyBuKSwgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IH4oMjU1ICYgbik7XG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGhcbiAgICAgICAgZm9yIChsZXQgdCA9IGUubGVuZ3RoIC0gbjsgdCA8IGUubGVuZ3RoOyArK3QpIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSB+KDI1NSAmIGVbdF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGhlIFwiaW5maW5pdHlcIiBieXRlIHNlcXVlbmNlIHRoYXQgc29ydHMgYWZ0ZXIgYWxsIG90aGVyIGJ5dGVcbiAgICAgKiBzZXF1ZW5jZXMgd3JpdHRlbiBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICovICAgIHFlKCkge1xuICAgICAgICB0aGlzLlVlKDI1NSksIHRoaXMuVWUoMjU1KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBcImluZmluaXR5XCIgYnl0ZSBzZXF1ZW5jZSB0aGF0IHNvcnRzIGJlZm9yZSBhbGwgb3RoZXIgYnl0ZVxuICAgICAqIHNlcXVlbmNlcyB3cml0dGVuIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICovICAgIEtlKCkge1xuICAgICAgICB0aGlzLkdlKDI1NSksIHRoaXMuR2UoMjU1KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBidWZmZXIgc3VjaCB0aGF0IGl0IGlzIHRoZSBzYW1lIGFzIHdoZW4gaXQgd2FzIG5ld2x5XG4gICAgICogY29uc3RydWN0ZWQuXG4gICAgICovICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG4gICAgc2VlZCh0KSB7XG4gICAgICAgIHRoaXMuQmUodC5sZW5ndGgpLCB0aGlzLmJ1ZmZlci5zZXQodCwgdGhpcy5wb3NpdGlvbiksIHRoaXMucG9zaXRpb24gKz0gdC5sZW5ndGg7XG4gICAgfVxuICAgIC8qKiBNYWtlcyBhIGNvcHkgb2YgdGhlIGVuY29kZWQgYnl0ZXMgaW4gdGhpcyBidWZmZXIuICAqLyAgICBRZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMucG9zaXRpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGB2YWxgIGludG8gYW4gZW5jb2Rpbmcgc28gdGhhdCB0aGUgb3JkZXIgbWF0Y2hlcyB0aGUgSUVFRSA3NTRcbiAgICAgKiBmbG9hdGluZy1wb2ludCBjb21wYXJpc29uIHJlc3VsdHMgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6XG4gICAgICogICAtMC4wIDwgMC4wXG4gICAgICogICBhbGwgbm9uLU5hTiA8IE5hTlxuICAgICAqICAgTmFOID0gTmFOXG4gICAgICovICAgIEZlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAvKiogQ29udmVydHMgYSBKYXZhU2NyaXB0IG51bWJlciB0byBhIGJ5dGUgYXJyYXkgKHVzaW5nIGJpZyBlbmRpYW4gZW5jb2RpbmcpLiAqL1xuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcig4KSk7XG4gICAgICAgICAgICByZXR1cm4gZS5zZXRGbG9hdDY0KDAsIHQsIC8qIGxpdHRsZUVuZGlhbj0gKi8gITEpLCBuZXcgVWludDhBcnJheShlLmJ1ZmZlcik7XG4gICAgICAgIH0odCksIG4gPSAwICE9ICgxMjggJiBlWzBdKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IGJpdCBpcyBzZXQuIFdlIHVzZSBhIGJpdCBtYXNrIHNpbmNlIHZhbHVlWzBdIGlzXG4gICAgICAgIC8vIGVuY29kZWQgYXMgYSBudW1iZXIgZnJvbSAwIHRvIDI1NS5cbiAgICAgICAgICAgICAgICAvLyBSZXZlcnQgdGhlIHR3byBjb21wbGVtZW50IHRvIGdldCBuYXR1cmFsIG9yZGVyaW5nXG4gICAgICAgIGVbMF0gXj0gbiA/IDI1NSA6IDEyODtcbiAgICAgICAgZm9yIChsZXQgdCA9IDE7IHQgPCBlLmxlbmd0aDsgKyt0KSBlW3RdIF49IG4gPyAyNTUgOiAwO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgLyoqIFdyaXRlcyBhIHNpbmdsZSBieXRlIGFzY2VuZGluZyB0byB0aGUgYnVmZmVyLiAqLyAgICBEZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAyNTUgJiB0O1xuICAgICAgICAwID09PSBlID8gKHRoaXMuVWUoMCksIHRoaXMuVWUoMjU1KSkgOiAyNTUgPT09IGUgPyAodGhpcy5VZSgyNTUpLCB0aGlzLlVlKDApKSA6IHRoaXMuVWUoZSk7XG4gICAgfVxuICAgIC8qKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSBkZXNjZW5kaW5nIHRvIHRoZSBidWZmZXIuICAqLyAgICBOZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSAyNTUgJiB0O1xuICAgICAgICAwID09PSBlID8gKHRoaXMuR2UoMCksIHRoaXMuR2UoMjU1KSkgOiAyNTUgPT09IGUgPyAodGhpcy5HZSgyNTUpLCB0aGlzLkdlKDApKSA6IHRoaXMuR2UodCk7XG4gICAgfVxuICAgIENlKCkge1xuICAgICAgICB0aGlzLlVlKDApLCB0aGlzLlVlKDEpO1xuICAgIH1cbiAgICBrZSgpIHtcbiAgICAgICAgdGhpcy5HZSgwKSwgdGhpcy5HZSgxKTtcbiAgICB9XG4gICAgVWUodCkge1xuICAgICAgICB0aGlzLkJlKDEpLCB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gdDtcbiAgICB9XG4gICAgR2UodCkge1xuICAgICAgICB0aGlzLkJlKDEpLCB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gfnQ7XG4gICAgfVxuICAgIEJlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQgKyB0aGlzLnBvc2l0aW9uO1xuICAgICAgICBpZiAoZSA8PSB0aGlzLmJ1ZmZlci5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgLy8gVHJ5IGRvdWJsaW5nLlxuICAgICAgICAgICAgICAgIGxldCBuID0gMiAqIHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgLy8gU3RpbGwgbm90IGJpZyBlbm91Z2g/IEp1c3QgYWxsb2NhdGUgdGhlIHJpZ2h0IHNpemUuXG4gICAgICAgICAgICAgICAgbiA8IGUgJiYgKG4gPSBlKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgYnVmZmVyLlxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgICAgcy5zZXQodGhpcy5idWZmZXIpLCAvLyBjb3B5IG9sZCBkYXRhXG4gICAgICAgIHRoaXMuYnVmZmVyID0gcztcbiAgICB9XG59XG5cbmNsYXNzIENyIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuamUgPSB0O1xuICAgIH1cbiAgICBBZSh0KSB7XG4gICAgICAgIHRoaXMuamUuU2UodCk7XG4gICAgfVxuICAgIEllKHQpIHtcbiAgICAgICAgdGhpcy5qZS5NZSh0KTtcbiAgICB9XG4gICAgcGUodCkge1xuICAgICAgICB0aGlzLmplLk9lKHQpO1xuICAgIH1cbiAgICBnZSgpIHtcbiAgICAgICAgdGhpcy5qZS5xZSgpO1xuICAgIH1cbn1cblxuY2xhc3MgeHIge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5qZSA9IHQ7XG4gICAgfVxuICAgIEFlKHQpIHtcbiAgICAgICAgdGhpcy5qZS54ZSh0KTtcbiAgICB9XG4gICAgSWUodCkge1xuICAgICAgICB0aGlzLmplLiRlKHQpO1xuICAgIH1cbiAgICBwZSh0KSB7XG4gICAgICAgIHRoaXMuamUuTGUodCk7XG4gICAgfVxuICAgIGdlKCkge1xuICAgICAgICB0aGlzLmplLktlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYERpcmVjdGlvbmFsSW5kZXhCeXRlRW5jb2RlcmAgdXNpbmcgYE9yZGVyZWRDb2RlV3JpdGVyYCBmb3IgdGhlXG4gKiBhY3R1YWwgZW5jb2RpbmcuXG4gKi8gY2xhc3MgTnIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmplID0gbmV3IERyLCB0aGlzLnplID0gbmV3IENyKHRoaXMuamUpLCB0aGlzLldlID0gbmV3IHhyKHRoaXMuamUpO1xuICAgIH1cbiAgICBzZWVkKHQpIHtcbiAgICAgICAgdGhpcy5qZS5zZWVkKHQpO1xuICAgIH1cbiAgICBIZSh0KSB7XG4gICAgICAgIHJldHVybiAwIC8qIEluZGV4S2luZC5BU0NFTkRJTkcgKi8gPT09IHQgPyB0aGlzLnplIDogdGhpcy5XZTtcbiAgICB9XG4gICAgUWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmplLlFlKCk7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmplLnJlc2V0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFJlcHJlc2VudHMgYW4gaW5kZXggZW50cnkgc2F2ZWQgYnkgdGhlIFNESyBpbiBwZXJzaXN0ZWQgc3RvcmFnZS4gKi8gY2xhc3Mga3Ige1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5pbmRleElkID0gdCwgdGhpcy5kb2N1bWVudEtleSA9IGUsIHRoaXMuYXJyYXlWYWx1ZSA9IG4sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZSA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gSW5kZXhFbnRyeSBlbnRyeSB0aGF0IHNvcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50XG4gICAgICogZGlyZWN0aW9uYWwgdmFsdWUuXG4gICAgICovICAgIEplKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5kaXJlY3Rpb25hbFZhbHVlLmxlbmd0aCwgZSA9IDAgPT09IHQgfHwgMjU1ID09PSB0aGlzLmRpcmVjdGlvbmFsVmFsdWVbdCAtIDFdID8gdCArIDEgOiB0LCBuID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICAgIHJldHVybiBuLnNldCh0aGlzLmRpcmVjdGlvbmFsVmFsdWUsIDApLCBlICE9PSB0ID8gbi5zZXQoWyAwIF0sIHRoaXMuZGlyZWN0aW9uYWxWYWx1ZS5sZW5ndGgpIDogKytuW24ubGVuZ3RoIC0gMV0sIFxuICAgICAgICBuZXcga3IodGhpcy5pbmRleElkLCB0aGlzLmRvY3VtZW50S2V5LCB0aGlzLmFycmF5VmFsdWUsIG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTXIodCwgZSkge1xuICAgIGxldCBuID0gdC5pbmRleElkIC0gZS5pbmRleElkO1xuICAgIHJldHVybiAwICE9PSBuID8gbiA6IChuID0gJHIodC5hcnJheVZhbHVlLCBlLmFycmF5VmFsdWUpLCAwICE9PSBuID8gbiA6IChuID0gJHIodC5kaXJlY3Rpb25hbFZhbHVlLCBlLmRpcmVjdGlvbmFsVmFsdWUpLCBcbiAgICAwICE9PSBuID8gbiA6IGh0LmNvbXBhcmF0b3IodC5kb2N1bWVudEtleSwgZS5kb2N1bWVudEtleSkpKTtcbn1cblxuZnVuY3Rpb24gJHIodCwgZSkge1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggJiYgbiA8IGUubGVuZ3RoOyArK24pIHtcbiAgICAgICAgY29uc3QgcyA9IHRbbl0gLSBlW25dO1xuICAgICAgICBpZiAoMCAhPT0gcykgcmV0dXJuIHM7XG4gICAgfVxuICAgIHJldHVybiB0Lmxlbmd0aCAtIGUubGVuZ3RoO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGxpZ2h0IHF1ZXJ5IHBsYW5uZXIgZm9yIEZpcmVzdG9yZS5cbiAqXG4gKiBUaGlzIGNsYXNzIG1hdGNoZXMgYSBgRmllbGRJbmRleGAgYWdhaW5zdCBhIEZpcmVzdG9yZSBRdWVyeSBgVGFyZ2V0YC4gSXRcbiAqIGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGluZGV4IGNhbiBiZSB1c2VkIHRvIHNlcnZlIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd2Nhc2VzIHNvbWUgcG9zc2libGUgaW5kZXggY29uZmlndXJhdGlvbnM6XG4gKlxuICogUXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW5kZXhcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQywgYiBERVNDXG4gKiB3aGVyZSgnYScsICc9PScsICdhJykud2hlcmUoJ2InLCAnPT0nLCAnYicpICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPT0nLCAnYScpLndoZXJlKCdiJywgJz09JywgJ2InKSAgICAgICAgIHwgYiBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpICAgICAgICAgICAgICAgICAgfCBhIEFTQ1xuICogd2hlcmUoJ2EnLCAnPj0nLCAnYScpLm9yZGVyQnkoJ2EnLCAnZGVzYycpICAgICAgICAgIHwgYSBERVNDXG4gKiB3aGVyZSgnYScsICc+PScsICdhJykub3JkZXJCeSgnYScpLm9yZGVyQnkoJ2InKSAgICAgfCBhIEFTQywgYiBBU0NcbiAqIHdoZXJlKCdhJywgJz49JywgJ2EnKS5vcmRlckJ5KCdhJykub3JkZXJCeSgnYicpICAgICB8IGEgQVNDXG4gKiB3aGVyZSgnYScsICdhcnJheS1jb250YWlucycsICdhJykub3JkZXJCeSgnYicpICAgICAgfCBhIENPTlRBSU5TLCBiIEFTQ0VORElOR1xuICogd2hlcmUoJ2EnLCAnYXJyYXktY29udGFpbnMnLCAnYScpLm9yZGVyQnkoJ2InKSAgICAgIHwgYSBDT05UQUlOU1xuICovIGNsYXNzIE9yIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbklkID0gbnVsbCAhPSB0LmNvbGxlY3Rpb25Hcm91cCA/IHQuY29sbGVjdGlvbkdyb3VwIDogdC5wYXRoLmxhc3RTZWdtZW50KCksIFxuICAgICAgICB0aGlzLlllID0gdC5vcmRlckJ5LCB0aGlzLlhlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlO1xuICAgICAgICAgICAgdC5pc0luZXF1YWxpdHkoKSA/IHRoaXMuWmUgPSB0IDogdGhpcy5YZS5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaW5kZXggY2FuIGJlIHVzZWQgdG8gc2VydmUgdGhlIFRhcmdldEluZGV4TWF0Y2hlcidzXG4gICAgICogdGFyZ2V0LlxuICAgICAqXG4gICAgICogQW4gaW5kZXggaXMgY29uc2lkZXJlZCBjYXBhYmxlIG9mIHNlcnZpbmcgdGhlIHRhcmdldCB3aGVuOlxuICAgICAqIC0gVGhlIHRhcmdldCB1c2VzIGFsbCBpbmRleCBzZWdtZW50cyBmb3IgaXRzIGZpbHRlcnMgYW5kIG9yZGVyQnkgY2xhdXNlcy5cbiAgICAgKiAgIFRoZSB0YXJnZXQgY2FuIGhhdmUgYWRkaXRpb25hbCBmaWx0ZXIgYW5kIG9yZGVyQnkgY2xhdXNlcywgYnV0IG5vdFxuICAgICAqICAgZmV3ZXIuXG4gICAgICogLSBJZiBhbiBBcnJheUNvbnRhaW5zL0FycmF5Q29udGFpbnNBbnlmaWx0ZXIgaXMgdXNlZCwgdGhlIGluZGV4IG11c3QgYWxzb1xuICAgICAqICAgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYENPTlRBSU5TYCBzZWdtZW50LlxuICAgICAqIC0gQWxsIGRpcmVjdGlvbmFsIGluZGV4IHNlZ21lbnRzIGNhbiBiZSBtYXBwZWQgdG8gdGhlIHRhcmdldCBhcyBhIHNlcmllcyBvZlxuICAgICAqICAgZXF1YWxpdHkgZmlsdGVycywgYSBzaW5nbGUgaW5lcXVhbGl0eSBmaWx0ZXIgYW5kIGEgc2VyaWVzIG9mIG9yZGVyQnlcbiAgICAgKiAgIGNsYXVzZXMuXG4gICAgICogLSBUaGUgc2VnbWVudHMgdGhhdCByZXByZXNlbnQgdGhlIGVxdWFsaXR5IGZpbHRlcnMgbWF5IGFwcGVhciBvdXQgb2Ygb3JkZXIuXG4gICAgICogLSBUaGUgb3B0aW9uYWwgc2VnbWVudCBmb3IgdGhlIGluZXF1YWxpdHkgZmlsdGVyIG11c3QgYXBwZWFyIGFmdGVyIGFsbFxuICAgICAqICAgZXF1YWxpdHkgc2VnbWVudHMuXG4gICAgICogLSBUaGUgc2VnbWVudHMgdGhhdCByZXByZXNlbnQgdGhhdCBvcmRlckJ5IGNsYXVzZSBvZiB0aGUgdGFyZ2V0IG11c3QgYXBwZWFyXG4gICAgICogICBpbiBvcmRlciBhZnRlciBhbGwgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgc2VnbWVudHMuIFNpbmdsZSBvcmRlckJ5XG4gICAgICogICBjbGF1c2VzIGNhbm5vdCBiZSBza2lwcGVkLCBidXQgYSBjb250aW51b3VzIG9yZGVyQnkgc3VmZml4IG1heSBiZVxuICAgICAqICAgb21pdHRlZC5cbiAgICAgKi8gICAgdG4odCkge1xuICAgICAgICBGKHQuY29sbGVjdGlvbkdyb3VwID09PSB0aGlzLmNvbGxlY3Rpb25JZCk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQsIGZpbmQgYSBtYXRjaGluZyBmaWx0ZXIuXG4gICAgICAgIGNvbnN0IGUgPSBmdCh0KTtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gZSAmJiAhdGhpcy5lbihlKSkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBuID0gZHQodCk7XG4gICAgICAgIGxldCBzID0gbmV3IFNldCwgaSA9IDAsIHIgPSAwO1xuICAgICAgICAvLyBQcm9jZXNzIGFsbCBlcXVhbGl0aWVzIGZpcnN0LiBFcXVhbGl0aWVzIGNhbiBhcHBlYXIgb3V0IG9mIG9yZGVyLlxuICAgICAgICBmb3IgKDtpIDwgbi5sZW5ndGggJiYgdGhpcy5lbihuW2ldKTsgKytpKSBzID0gcy5hZGQobltpXS5maWVsZFBhdGguY2Fub25pY2FsU3RyaW5nKCkpO1xuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgcHJvY2Vzc2VkIGFsbCBzZWdtZW50cywgYWxsIHNlZ21lbnRzIGFyZSB1c2VkIHRvIHNlcnZlXG4gICAgICAgIC8vIHRoZSBlcXVhbGl0eSBmaWx0ZXJzIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBtYXAgYW55IHNlZ21lbnRzIHRvIHRoZVxuICAgICAgICAvLyB0YXJnZXQncyBpbmVxdWFsaXR5IGFuZCBvcmRlckJ5IGNsYXVzZXMuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IG4ubGVuZ3RoKSByZXR1cm4gITA7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMuWmUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGluZXF1YWxpdHkgZmlsdGVyIGFuZCB0aGUgZmllbGQgd2FzIG5vdCBpbiBvbmUgb2YgdGhlXG4gICAgICAgICAgICAvLyBlcXVhbGl0eSBmaWx0ZXJzIGFib3ZlLCB0aGUgbmV4dCBzZWdtZW50IG11c3QgbWF0Y2ggYm90aCB0aGUgZmlsdGVyXG4gICAgICAgICAgICAvLyBhbmQgdGhlIGZpcnN0IG9yZGVyQnkgY2xhdXNlLlxuICAgICAgICAgICAgaWYgKCFzLmhhcyh0aGlzLlplLmZpZWxkLmNhbm9uaWNhbFN0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuW2ldO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ubih0aGlzLlplLCB0KSB8fCAhdGhpcy5zbih0aGlzLlllW3IrK10sIHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICArK2k7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBzZWdtZW50cyBuZWVkIHRvIHJlcHJlc2VudCB0aGUgcHJlZml4IG9mIHRoZSB0YXJnZXQnc1xuICAgICAgICAvLyBvcmRlckJ5LlxuICAgICAgICAgICAgICAgIGZvciAoO2kgPCBuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbltpXTtcbiAgICAgICAgICAgIGlmIChyID49IHRoaXMuWWUubGVuZ3RoIHx8ICF0aGlzLnNuKHRoaXMuWWVbcisrXSwgdCkpIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGVuKHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuWGUpIGlmICh0aGlzLm5uKGUsIHQpKSByZXR1cm4gITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgbm4odCwgZSkge1xuICAgICAgICBpZiAodm9pZCAwID09PSB0IHx8ICF0LmZpZWxkLmlzRXF1YWwoZS5maWVsZFBhdGgpKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IG4gPSBcImFycmF5LWNvbnRhaW5zXCIgLyogT3BlcmF0b3IuQVJSQVlfQ09OVEFJTlMgKi8gPT09IHQub3AgfHwgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOU19BTlkgKi8gPT09IHQub3A7XG4gICAgICAgIHJldHVybiAyIC8qIEluZGV4S2luZC5DT05UQUlOUyAqLyA9PT0gZS5raW5kID09PSBuO1xuICAgIH1cbiAgICBzbih0LCBlKSB7XG4gICAgICAgIHJldHVybiAhIXQuZmllbGQuaXNFcXVhbChlLmZpZWxkUGF0aCkgJiYgKDAgLyogSW5kZXhLaW5kLkFTQ0VORElORyAqLyA9PT0gZS5raW5kICYmIFwiYXNjXCIgLyogRGlyZWN0aW9uLkFTQ0VORElORyAqLyA9PT0gdC5kaXIgfHwgMSAvKiBJbmRleEtpbmQuREVTQ0VORElORyAqLyA9PT0gZS5raW5kICYmIFwiZGVzY1wiIC8qIERpcmVjdGlvbi5ERVNDRU5ESU5HICovID09PSB0LmRpcik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGhlbHAgd2l0aCBib29sZWFuIGxvZ2ljIHRyYW5zZm9ybWF0aW9ucyBuZWVkZWQgZm9yIGhhbmRsaW5nXG4gKiBjb21wbGV4IGZpbHRlcnMgdXNlZCBpbiBxdWVyaWVzLlxuICovXG4vKipcbiAqIFRoZSBgaW5gIGZpbHRlciBpcyBvbmx5IGEgc3ludGFjdGljIHN1Z2FyIG92ZXIgYSBkaXNqdW5jdGlvbiBvZiBlcXVhbGl0aWVzLiBGb3IgaW5zdGFuY2U6IGBhIGluXG4gKiBbMSwyLDNdYCBpcyBpbiBmYWN0IGBhPT0xIHx8IGE9PTIgfHwgYT09M2AuIFRoaXMgbWV0aG9kIGV4cGFuZHMgYW55IGBpbmAgZmlsdGVyIGluIHRoZSBnaXZlblxuICogaW5wdXQgaW50byBhIGRpc2p1bmN0aW9uIG9mIGVxdWFsaXR5IGZpbHRlcnMgYW5kIHJldHVybnMgdGhlIGV4cGFuZGVkIGZpbHRlci5cbiAqLyBmdW5jdGlvbiBGcih0KSB7XG4gICAgdmFyIGUsIG47XG4gICAgaWYgKEYodCBpbnN0YW5jZW9mIG1uIHx8IHQgaW5zdGFuY2VvZiBnbiksIHQgaW5zdGFuY2VvZiBtbikge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENuKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gKG51bGwgPT09IChuID0gbnVsbCA9PT0gKGUgPSB0LnZhbHVlLmFycmF5VmFsdWUpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUudmFsdWVzKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLm1hcCgoZSA9PiBtbi5jcmVhdGUodC5maWVsZCwgXCI9PVwiIC8qIE9wZXJhdG9yLkVRVUFMICovICwgZSkpKSkgfHwgW107XG4gICAgICAgICAgICByZXR1cm4gZ24uY3JlYXRlKHMsIFwib3JcIiAvKiBDb21wb3NpdGVPcGVyYXRvci5PUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSByZWFjaGVkIG90aGVyIGtpbmRzIG9mIGZpZWxkIGZpbHRlcnMuXG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cbiAgICAvLyBXZSBoYXZlIGEgY29tcG9zaXRlIGZpbHRlci5cbiAgICAgICAgY29uc3QgcyA9IHQuZmlsdGVycy5tYXAoKHQgPT4gRnIodCkpKTtcbiAgICByZXR1cm4gZ24uY3JlYXRlKHMsIHQub3ApO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgY29tcG9zaXRlIGZpbHRlciwgcmV0dXJucyB0aGUgbGlzdCBvZiB0ZXJtcyBpbiBpdHMgZGlzanVuY3RpdmUgbm9ybWFsIGZvcm0uXG4gKlxuICogPHA+RWFjaCBlbGVtZW50IGluIHRoZSByZXR1cm4gdmFsdWUgaXMgb25lIHRlcm0gb2YgdGhlIHJlc3VsdGluZyBETkYuIEZvciBpbnN0YW5jZTogRm9yIHRoZVxuICogaW5wdXQ6IChBIHx8IEIpICYmIEMsIHRoZSBETkYgZm9ybSBpczogKEEgJiYgQykgfHwgKEIgJiYgQyksIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdFxuICogd2l0aCB0d28gZWxlbWVudHM6IGEgY29tcG9zaXRlIGZpbHRlciB0aGF0IHBlcmZvcm1zIChBICYmIEMpLCBhbmQgYSBjb21wb3NpdGUgZmlsdGVyIHRoYXRcbiAqIHBlcmZvcm1zIChCICYmIEMpLlxuICpcbiAqIEBwYXJhbSBmaWx0ZXIgdGhlIGNvbXBvc2l0ZSBmaWx0ZXIgdG8gY2FsY3VsYXRlIERORiB0cmFuc2Zvcm0gZm9yLlxuICogQHJldHVybiB0aGUgdGVybXMgaW4gdGhlIERORiB0cmFuc2Zvcm0uXG4gKi8gZnVuY3Rpb24gQnIodCkge1xuICAgIGlmICgwID09PSB0LmdldEZpbHRlcnMoKS5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBjb25zdCBlID0gS3IoRnIodCkpO1xuICAgIHJldHVybiBGKFVyKGUpKSwgTHIoZSkgfHwgcXIoZSkgPyBbIGUgXSA6IGUuZ2V0RmlsdGVycygpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSBzaW5nbGUgZmllbGQgZmlsdGVyLiBlLmcuIChhID09IDEwKS4gKi8gZnVuY3Rpb24gTHIodCkge1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgbW47XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgdGhlIGNvbmp1bmN0aW9uIG9mIG9uZSBvciBtb3JlIGZpZWxkIGZpbHRlcnMuIGUuZy4gKGEgPT0gMTBcbiAqICYmIGIgPT0gMjApXG4gKi8gZnVuY3Rpb24gcXIodCkge1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgZ24gJiYgSW4odCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGluIGRpc2p1bmN0aXZlIG5vcm1hbCBmb3JtIChETkYpLlxuICpcbiAqIDxwPkluIGJvb2xlYW4gbG9naWMsIGEgZGlzanVuY3RpdmUgbm9ybWFsIGZvcm0gKERORikgaXMgYSBjYW5vbmljYWwgbm9ybWFsIGZvcm0gb2YgYSBsb2dpY2FsXG4gKiBmb3JtdWxhIGNvbnNpc3Rpbmcgb2YgYSBkaXNqdW5jdGlvbiBvZiBjb25qdW5jdGlvbnM7IGl0IGNhbiBhbHNvIGJlIGRlc2NyaWJlZCBhcyBhbiBPUiBvZiBBTkRzLlxuICpcbiAqIDxwPkZvciBtb3JlIGluZm8sIHZpc2l0OiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EaXNqdW5jdGl2ZV9ub3JtYWxfZm9ybVxuICovIGZ1bmN0aW9uIFVyKHQpIHtcbiAgICByZXR1cm4gTHIodCkgfHwgcXIodCkgfHwgXG4gICAgLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyB0aGUgZGlzanVuY3Rpb24gb2Ygb25lIG9yIG1vcmUgXCJmbGF0IGNvbmp1bmN0aW9uc1wiIGFuZFxuICogZmllbGQgZmlsdGVycy4gZS5nLiAoYSA9PSAxMCkgfHwgKGI9PTIwICYmIGM9PTMwKVxuICovXG4gICAgZnVuY3Rpb24odCkge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGduICYmIHBuKHQpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5nZXRGaWx0ZXJzKCkpIGlmICghTHIoZSkgJiYgIXFyKGUpKSByZXR1cm4gITE7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICExO1xuICAgIH0odCk7XG59XG5cbmZ1bmN0aW9uIEtyKHQpIHtcbiAgICBpZiAoRih0IGluc3RhbmNlb2YgbW4gfHwgdCBpbnN0YW5jZW9mIGduKSwgdCBpbnN0YW5jZW9mIG1uKSByZXR1cm4gdDtcbiAgICBpZiAoMSA9PT0gdC5maWx0ZXJzLmxlbmd0aCkgcmV0dXJuIEtyKHQuZmlsdGVyc1swXSk7XG4gICAgLy8gQ29tcHV0ZSBETkYgZm9yIGVhY2ggb2YgdGhlIHN1YmZpbHRlcnMgZmlyc3RcbiAgICAgICAgY29uc3QgZSA9IHQuZmlsdGVycy5tYXAoKHQgPT4gS3IodCkpKTtcbiAgICBsZXQgbiA9IGduLmNyZWF0ZShlLCB0Lm9wKTtcbiAgICByZXR1cm4gbiA9IGpyKG4pLCBVcihuKSA/IG4gOiAoRihuIGluc3RhbmNlb2YgZ24pLCBGKHluKG4pKSwgRihuLmZpbHRlcnMubGVuZ3RoID4gMSksIFxuICAgIG4uZmlsdGVycy5yZWR1Y2UoKCh0LCBlKSA9PiBHcih0LCBlKSkpKTtcbn1cblxuZnVuY3Rpb24gR3IodCwgZSkge1xuICAgIGxldCBuO1xuICAgIHJldHVybiBGKHQgaW5zdGFuY2VvZiBtbiB8fCB0IGluc3RhbmNlb2YgZ24pLCBGKGUgaW5zdGFuY2VvZiBtbiB8fCBlIGluc3RhbmNlb2YgZ24pLCBcbiAgICAvLyBGaWVsZEZpbHRlciBGaWVsZEZpbHRlclxuICAgIG4gPSB0IGluc3RhbmNlb2YgbW4gPyBlIGluc3RhbmNlb2YgbW4gPyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIENvbmp1bmN0aW9uIGRpc3RyaWJ1dGlvbiBmb3IgdHdvIGZpZWxkIGZpbHRlcnMgaXMgdGhlIGNvbmp1bmN0aW9uIG9mIHRoZW0uXG4gICAgICAgIHJldHVybiBnbi5jcmVhdGUoWyB0LCBlIF0sIFwiYW5kXCIgLyogQ29tcG9zaXRlT3BlcmF0b3IuQU5EICovKTtcbiAgICB9KHQsIGUpIDogUXIodCwgZSkgOiBlIGluc3RhbmNlb2YgbW4gPyBRcihlLCB0KSA6IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIGZvdXIgY2FzZXM6XG4gICAgICAgIC8vIChBICYgQikgJiAoQyAmIEQpIC0tPiAoQSAmIEIgJiBDICYgRClcbiAgICAgICAgLy8gKEEgJiBCKSAmIChDIHwgRCkgLS0+IChBICYgQiAmIEMpIHwgKEEgJiBCICYgRClcbiAgICAgICAgLy8gKEEgfCBCKSAmIChDICYgRCkgLS0+IChDICYgRCAmIEEpIHwgKEMgJiBEICYgQilcbiAgICAgICAgLy8gKEEgfCBCKSAmIChDIHwgRCkgLS0+IChBICYgQykgfCAoQSAmIEQpIHwgKEIgJiBDKSB8IChCICYgRClcbiAgICAgICAgLy8gQ2FzZSAxIGlzIGEgbWVyZ2UuXG4gICAgICAgIGlmIChGKHQuZmlsdGVycy5sZW5ndGggPiAwICYmIGUuZmlsdGVycy5sZW5ndGggPiAwKSwgeW4odCkgJiYgeW4oZSkpIHJldHVybiB2bih0LCBlLmdldEZpbHRlcnMoKSk7XG4gICAgICAgIC8vIENhc2UgMiwzLDQgYWxsIGhhdmUgYXQgbGVhc3Qgb25lIHNpZGUgKGxocyBvciByaHMpIHRoYXQgaXMgYSBkaXNqdW5jdGlvbi4gSW4gYWxsIHRocmVlIGNhc2VzXG4gICAgICAgIC8vIHdlIHNob3VsZCB0YWtlIGVhY2ggZWxlbWVudCBvZiB0aGUgZGlzanVuY3Rpb24gYW5kIGRpc3RyaWJ1dGUgaXQgb3ZlciB0aGUgb3RoZXIgc2lkZSwgYW5kXG4gICAgICAgIC8vIHJldHVybiB0aGUgZGlzanVuY3Rpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiByZXN1bHRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBwbih0KSA/IHQgOiBlLCBzID0gcG4odCkgPyBlIDogdCwgaSA9IG4uZmlsdGVycy5tYXAoKHQgPT4gR3IodCwgcykpKTtcbiAgICAgICAgcmV0dXJuIGduLmNyZWF0ZShpLCBcIm9yXCIgLyogQ29tcG9zaXRlT3BlcmF0b3IuT1IgKi8pO1xuICAgIH0odCwgZSksIGpyKG4pO1xufVxuXG5mdW5jdGlvbiBRcih0LCBlKSB7XG4gICAgLy8gVGhlcmUgYXJlIHR3byBjYXNlczpcbiAgICAvLyBBICYgKEIgJiBDKSAtLT4gKEEgJiBCICYgQylcbiAgICAvLyBBICYgKEIgfCBDKSAtLT4gKEEgJiBCKSB8IChBICYgQylcbiAgICBpZiAoeW4oZSkpIFxuICAgIC8vIENhc2UgMVxuICAgIHJldHVybiB2bihlLCB0LmdldEZpbHRlcnMoKSk7XG4gICAge1xuICAgICAgICAvLyBDYXNlIDJcbiAgICAgICAgY29uc3QgbiA9IGUuZmlsdGVycy5tYXAoKGUgPT4gR3IodCwgZSkpKTtcbiAgICAgICAgcmV0dXJuIGduLmNyZWF0ZShuLCBcIm9yXCIgLyogQ29tcG9zaXRlT3BlcmF0b3IuT1IgKi8pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBhc3NvY2lhdGl2aXR5IHByb3BlcnR5IHRvIHRoZSBnaXZlbiBmaWx0ZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBmaWx0ZXIuXG4gKlxuICogPHVsPlxuICogICA8bGk+QSB8IChCIHwgQykgPT0gKEEgfCBCKSB8IEMgPT0gKEEgfCBCIHwgQylcbiAqICAgPGxpPkEgJiAoQiAmIEMpID09IChBICYgQikgJiBDID09IChBICYgQiAmIEMpXG4gKiA8L3VsPlxuICpcbiAqIDxwPkZvciBtb3JlIGluZm8sIHZpc2l0OiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Bc3NvY2lhdGl2ZV9wcm9wZXJ0eSNQcm9wb3NpdGlvbmFsX2xvZ2ljXG4gKi8gZnVuY3Rpb24ganIodCkge1xuICAgIGlmIChGKHQgaW5zdGFuY2VvZiBtbiB8fCB0IGluc3RhbmNlb2YgZ24pLCB0IGluc3RhbmNlb2YgbW4pIHJldHVybiB0O1xuICAgIGNvbnN0IGUgPSB0LmdldEZpbHRlcnMoKTtcbiAgICAvLyBJZiB0aGUgY29tcG9zaXRlIGZpbHRlciBvbmx5IGNvbnRhaW5zIDEgZmlsdGVyLCBhcHBseSBhc3NvY2lhdGl2aXR5IHRvIGl0LlxuICAgICAgICBpZiAoMSA9PT0gZS5sZW5ndGgpIHJldHVybiBqcihlWzBdKTtcbiAgICAvLyBBc3NvY2lhdGl2aXR5IGFwcGxpZWQgdG8gYSBmbGF0IGNvbXBvc2l0ZSBmaWx0ZXIgcmVzdWx0cyBpcyBpdHNlbGYuXG4gICAgICAgIGlmIChUbih0KSkgcmV0dXJuIHQ7XG4gICAgLy8gRmlyc3QgYXBwbHkgYXNzb2NpYXRpdml0eSB0byBhbGwgc3ViZmlsdGVycy4gVGhpcyB3aWxsIGluIHR1cm4gcmVjdXJzaXZlbHkgYXBwbHlcbiAgICAvLyBhc3NvY2lhdGl2aXR5IHRvIGFsbCBuZXN0ZWQgY29tcG9zaXRlIGZpbHRlcnMgYW5kIGZpZWxkIGZpbHRlcnMuXG4gICAgICAgIGNvbnN0IG4gPSBlLm1hcCgodCA9PiBqcih0KSkpLCBzID0gW107XG4gICAgLy8gRm9yIGNvbXBvc2l0ZSBzdWJmaWx0ZXJzIHRoYXQgcGVyZm9ybSB0aGUgc2FtZSBraW5kIG9mIGxvZ2ljYWwgb3BlcmF0aW9uIGFzIGBjb21wb3NpdGVGaWx0ZXJgXG4gICAgLy8gdGFrZSBvdXQgdGhlaXIgZmlsdGVycyBhbmQgYWRkIHRoZW0gdG8gYGNvbXBvc2l0ZUZpbHRlcmAuIEZvciBleGFtcGxlOlxuICAgIC8vIGNvbXBvc2l0ZUZpbHRlciA9IChBIHwgKEIgfCBDIHwgRCkpXG4gICAgLy8gY29tcG9zaXRlU3ViZmlsdGVyID0gKEIgfCBDIHwgRClcbiAgICAvLyBSZXN1bHQ6IChBIHwgQiB8IEMgfCBEKVxuICAgIC8vIE5vdGUgdGhhdCB0aGUgYGNvbXBvc2l0ZVN1YmZpbHRlcmAgaGFzIGJlZW4gZWxpbWluYXRlZCwgYW5kIGl0cyBmaWx0ZXJzIChCLCBDLCBEKSBoYXZlIGJlZW5cbiAgICAvLyBhZGRlZCB0byB0aGUgdG9wLWxldmVsIFwiY29tcG9zaXRlRmlsdGVyXCIuXG4gICAgICAgIHJldHVybiBuLmZvckVhY2goKGUgPT4ge1xuICAgICAgICBlIGluc3RhbmNlb2YgbW4gPyBzLnB1c2goZSkgOiBlIGluc3RhbmNlb2YgZ24gJiYgKGUub3AgPT09IHQub3AgPyBcbiAgICAgICAgLy8gY29tcG9zaXRlRmlsdGVyOiAoQSB8IChCIHwgQykpXG4gICAgICAgIC8vIGNvbXBvc2l0ZVN1YmZpbHRlcjogKEIgfCBDKVxuICAgICAgICAvLyBSZXN1bHQ6IChBIHwgQiB8IEMpXG4gICAgICAgIHMucHVzaCguLi5lLmZpbHRlcnMpIDogXG4gICAgICAgIC8vIGNvbXBvc2l0ZUZpbHRlcjogKEEgfCAoQiAmIEMpKVxuICAgICAgICAvLyBjb21wb3NpdGVTdWJmaWx0ZXI6IChCICYgQylcbiAgICAgICAgLy8gUmVzdWx0OiAoQSB8IChCICYgQykpXG4gICAgICAgIHMucHVzaChlKSk7XG4gICAgfSkpLCAxID09PSBzLmxlbmd0aCA/IHNbMF0gOiBnbi5jcmVhdGUocywgdC5vcCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiBJbmRleE1hbmFnZXIuXG4gKi8gY2xhc3MgenIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJuID0gbmV3IFdyO1xuICAgIH1cbiAgICBhZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJuLmFkZChlKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKHRoaXMucm4uZ2V0RW50cmllcyhlKSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRzTWF0Y2hpbmdUYXJnZXQodCwgZSkge1xuICAgICAgICAvLyBGaWVsZCBpbmRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgZ2V0SW5kZXhUeXBlKHQsIGUpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoMCAvKiBJbmRleFR5cGUuTk9ORSAqLyk7XG4gICAgfVxuICAgIGdldEZpZWxkSW5kZXhlcyh0LCBlKSB7XG4gICAgICAgIC8vIEZpZWxkIGluZGljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtZW1vcnkgcGVyc2lzdGVuY2UuXG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKFtdKTtcbiAgICB9XG4gICAgZ2V0TmV4dENvbGxlY3Rpb25Hcm91cFRvVXBkYXRlKHQpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGdldE1pbk9mZnNldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKEl0Lm1pbigpKTtcbiAgICB9XG4gICAgZ2V0TWluT2Zmc2V0RnJvbUNvbGxlY3Rpb25Hcm91cCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKEl0Lm1pbigpKTtcbiAgICB9XG4gICAgdXBkYXRlQ29sbGVjdGlvbkdyb3VwKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgdXBkYXRlSW5kZXhFbnRyaWVzKHQsIGUpIHtcbiAgICAgICAgLy8gRmllbGQgaW5kaWNlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1lbW9yeSBwZXJzaXN0ZW5jZS5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbGxlY3Rpb24tcGFyZW50IGluZGV4IGV4cG9zZWQgYnkgTWVtb3J5SW5kZXhNYW5hZ2VyLlxuICogQWxzbyB1c2VkIGZvciBpbi1tZW1vcnkgY2FjaGluZyBieSBJbmRleGVkRGJJbmRleE1hbmFnZXIgYW5kIGluaXRpYWwgaW5kZXggcG9wdWxhdGlvblxuICogaW4gaW5kZXhlZGRiX3NjaGVtYS50c1xuICovIGNsYXNzIFdyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0ZWQuXG4gICAgYWRkKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgbiA9IHQucG9wTGFzdCgpLCBzID0gdGhpcy5pbmRleFtlXSB8fCBuZXcgRWUodXQuY29tcGFyYXRvciksIGkgPSAhcy5oYXMobik7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4W2VdID0gcy5hZGQobiksIGk7XG4gICAgfVxuICAgIGhhcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0Lmxhc3RTZWdtZW50KCksIG4gPSB0LnBvcExhc3QoKSwgcyA9IHRoaXMuaW5kZXhbZV07XG4gICAgICAgIHJldHVybiBzICYmIHMuaGFzKG4pO1xuICAgIH1cbiAgICBnZXRFbnRyaWVzKHQpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmluZGV4W3RdIHx8IG5ldyBFZSh1dC5jb21wYXJhdG9yKSkudG9BcnJheSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gY29uc3QgSHIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuLyoqXG4gKiBBIHBlcnNpc3RlZCBpbXBsZW1lbnRhdGlvbiBvZiBJbmRleE1hbmFnZXIuXG4gKlxuICogUE9SVElORyBOT1RFOiBVbmxpa2UgaU9TIGFuZCBBbmRyb2lkLCB0aGUgV2ViIFNESyBkb2VzIG5vdCBtZW1vaXplIGluZGV4XG4gKiBkYXRhIGFzIGl0IHN1cHBvcnRzIG11bHRpLXRhYiBhY2Nlc3MuXG4gKi9cbmNsYXNzIEpyIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMudXNlciA9IHQsIHRoaXMuZGF0YWJhc2VJZCA9IGUsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW4tbWVtb3J5IGNvcHkgb2YgdGhlIGluZGV4IGVudHJpZXMgd2UndmUgYWxyZWFkeSB3cml0dGVuIHNpbmNlIHRoZSBTREtcbiAgICAgICAgICogbGF1bmNoZWQuIFVzZWQgdG8gYXZvaWQgcmUtd3JpdGluZyB0aGUgc2FtZSBlbnRyeSByZXBlYXRlZGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGlzICpOT1QqIGEgY29tcGxldGUgY2FjaGUgb2Ygd2hhdCdzIGluIHBlcnNpc3RlbmNlIGFuZCBzbyBjYW4gbmV2ZXIgYmVcbiAgICAgICAgICogdXNlZCB0byBzYXRpc2Z5IHJlYWRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbiA9IG5ldyBXciwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGZyb20gYSB0YXJnZXQgdG8gaXRzIGVxdWl2YWxlbnQgbGlzdCBvZiBzdWItdGFyZ2V0cy4gRWFjaCBzdWItdGFyZ2V0XG4gICAgICAgICAqIGNvbnRhaW5zIG9ubHkgb25lIHRlcm0gZnJvbSB0aGUgdGFyZ2V0J3MgZGlzanVuY3RpdmUgbm9ybWFsIGZvcm0gKERORikuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuID0gbmV3IG9zKCh0ID0+ICRuKHQpKSwgKCh0LCBlKSA9PiBPbih0LCBlKSkpLCB0aGlzLnVpZCA9IHQudWlkIHx8IFwiXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgZW50cnkgdG8gdGhlIGNvbGxlY3Rpb24gcGFyZW50IGluZGV4LlxuICAgICAqXG4gICAgICogUmVwZWF0ZWQgY2FsbHMgZm9yIHRoZSBzYW1lIGNvbGxlY3Rpb25QYXRoIHNob3VsZCBiZSBhdm9pZGVkIHdpdGhpbiBhXG4gICAgICogdHJhbnNhY3Rpb24gYXMgSW5kZXhlZERiSW5kZXhNYW5hZ2VyIG9ubHkgY2FjaGVzIHdyaXRlcyBvbmNlIGEgdHJhbnNhY3Rpb25cbiAgICAgKiBoYXMgYmVlbiBjb21taXR0ZWQuXG4gICAgICovICAgIGFkZFRvQ29sbGVjdGlvblBhcmVudEluZGV4KHQsIGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9uLmhhcyhlKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGUubGFzdFNlZ21lbnQoKSwgcyA9IGUucG9wTGFzdCgpO1xuICAgICAgICAgICAgdC5hZGRPbkNvbW1pdHRlZExpc3RlbmVyKCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb2xsZWN0aW9uIHRvIHRoZSBpbiBtZW1vcnkgY2FjaGUgb25seSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzXG4gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGNvbW1pdHRlZC5cbiAgICAgICAgICAgICAgICB0aGlzLm9uLmFkZChlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbklkOiBuLFxuICAgICAgICAgICAgICAgIHBhcmVudDogcXQocylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gWXIodCkucHV0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldENvbGxlY3Rpb25QYXJlbnRzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtdLCBzID0gSURCS2V5UmFuZ2UuYm91bmQoWyBlLCBcIlwiIF0sIFsgc3QoZSksIFwiXCIgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApO1xuICAgICAgICByZXR1cm4gWXIodCkuaihzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjb2xsZWN0aW9uSWQgZ3VhcmQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSAoYW5kIGlzbid0IGFzIGxvbmdcbiAgICAgICAgICAgICAgICAvLyBhcyB3ZSdyZSBydW5uaW5nIGluIGEgcmVhbCBicm93c2VyKSwgYnV0IHRoZXJlJ3MgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAvLyBpbmRleGVkZGJzaGltIHRoYXQgYnJlYWtzIG91ciByYW5nZSBpbiBvdXIgdGVzdHMgcnVubmluZyBpbiBub2RlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9heGVtY2xpb24vSW5kZXhlZERCU2hpbS9pc3N1ZXMvMzM0XG4gICAgICAgICAgICAgICAgaWYgKHMuY29sbGVjdGlvbklkICE9PSBlKSBicmVhaztcbiAgICAgICAgICAgICAgICBuLnB1c2goR3Qocy5wYXJlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGFkZEZpZWxkSW5kZXgodCwgZSkge1xuICAgICAgICAvLyBUT0RPKGluZGV4aW5nKTogVmVyaWZ5IHRoYXQgdGhlIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IElEIHdvcmtzIGluXG4gICAgICAgIC8vIFNhZmFyaSAmIEZpcmVmb3guXG4gICAgICAgIGNvbnN0IG4gPSBacih0KSwgcyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXhJZDogdC5pbmRleElkLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Hcm91cDogdC5jb2xsZWN0aW9uR3JvdXAsXG4gICAgICAgICAgICAgICAgZmllbGRzOiB0LmZpZWxkcy5tYXAoKHQgPT4gWyB0LmZpZWxkUGF0aC5jYW5vbmljYWxTdHJpbmcoKSwgdC5raW5kIF0pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlKTtcbiAgICAgICAgZGVsZXRlIHMuaW5kZXhJZDtcbiAgICAgICAgLy8gYGluZGV4SWRgIGlzIGF1dG8tcG9wdWxhdGVkIGJ5IEluZGV4ZWREYlxuICAgICAgICBjb25zdCBpID0gbi5hZGQocyk7XG4gICAgICAgIGlmIChlLmluZGV4U3RhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0byh0KTtcbiAgICAgICAgICAgIHJldHVybiBpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIG4ucHV0KFRyKHQsIHRoaXMudXNlciwgZS5pbmRleFN0YXRlLnNlcXVlbmNlTnVtYmVyLCBlLmluZGV4U3RhdGUub2Zmc2V0KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkubmV4dCgpO1xuICAgIH1cbiAgICBkZWxldGVGaWVsZEluZGV4KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFpyKHQpLCBzID0gdG8odCksIGkgPSBYcih0KTtcbiAgICAgICAgcmV0dXJuIG4uZGVsZXRlKGUuaW5kZXhJZCkubmV4dCgoKCkgPT4gcy5kZWxldGUoSURCS2V5UmFuZ2UuYm91bmQoWyBlLmluZGV4SWQgXSwgWyBlLmluZGV4SWQgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKSkpKS5uZXh0KCgoKSA9PiBpLmRlbGV0ZShJREJLZXlSYW5nZS5ib3VuZChbIGUuaW5kZXhJZCBdLCBbIGUuaW5kZXhJZCArIDEgXSwgXG4gICAgICAgIC8qbG93ZXJPcGVuPSovICExLCBcbiAgICAgICAgLyp1cHBlck9wZW49Ki8gITApKSkpO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ1RhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBYcih0KTtcbiAgICAgICAgbGV0IHMgPSAhMDtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBNYXA7XG4gICAgICAgIHJldHVybiBSdC5mb3JFYWNoKHRoaXMuY24oZSksIChlID0+IHRoaXMuYW4odCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBzICYmIChzID0gISF0KSwgaS5zZXQoZSwgdCk7XG4gICAgICAgIH0pKSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSBncygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBbXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnQuZm9yRWFjaChpLCAoKGksIHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG87XG4gICAgICAgICAgICAgICAgICAgIE4oXCJJbmRleGVkRGJJbmRleE1hbmFnZXJcIiwgYFVzaW5nIGluZGV4ICR7byA9IGksIGBpZD0ke28uaW5kZXhJZH18Y2c9JHtvLmNvbGxlY3Rpb25Hcm91cH18Zj0ke28uZmllbGRzLm1hcCgodCA9PiBgJHt0LmZpZWxkUGF0aH06JHt0LmtpbmR9YCkpLmpvaW4oXCIsXCIpfWB9IHRvIGV4ZWN1dGUgJHskbihlKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdSA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBmdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IG4pIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIEJuKHQsIG4uZmllbGRQYXRoKSkgc3dpdGNoIChlLm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOU19BTlkgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlLmFycmF5VmFsdWUudmFsdWVzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheS1jb250YWluc1wiIC8qIE9wZXJhdG9yLkFSUkFZX0NPTlRBSU5TICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyBlLnZhbHVlIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtYWluaW5nIGZpbHRlcnMgYXJlIG5vdCBhcnJheSBmaWx0ZXJzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZhbHVlcyB0aGF0IGFyZSB1c2VkIGluICE9IG9yIE5PVF9JTiBmaWx0ZXJzLiBSZXR1cm5zXG4gKiBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggZmlsdGVycy5cbiAqLyAociwgaSksIGMgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gbmV3IE1hcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBkdChlKSkgZm9yIChjb25zdCBlIG9mIEJuKHQsIHMuZmllbGRQYXRoKSkgc3dpdGNoIChlLm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9PVwiIC8qIE9wZXJhdG9yLkVRVUFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImluXCIgLyogT3BlcmF0b3IuSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuY29kZSBlcXVhbGl0eSBwcmVmaXgsIHdoaWNoIGlzIGVuY29kZWQgaW4gdGhlIGluZGV4IHZhbHVlIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbmVxdWFsaXR5IChlLmcuIGBhID09ICdhJyAmJiBiICE9ICdiJ2AgaXMgZW5jb2RlZCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB2YWx1ZSAhPSAnYWInYCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zZXQocy5maWVsZFBhdGguY2Fub25pY2FsU3RyaW5nKCksIGUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiIT1cIiAvKiBPcGVyYXRvci5OT1RfRVFVQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdEluL05vdEVxdWFsIGlzIGFsd2F5cyBhIHN1ZmZpeC4gVGhlcmUgY2Fubm90IGJlIGFueSByZW1haW5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50cyBhbmQgaGVuY2Ugd2UgY2FuIHJldHVybiBlYXJseSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnNldChzLmZpZWxkUGF0aC5jYW5vbmljYWxTdHJpbmcoKSwgZS52YWx1ZSksIEFycmF5LmZyb20obi52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtYWluaW5nIGZpbHRlcnMgY2Fubm90IGJlIHVzZWQgYXMgbm90SW4gYm91bmRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gKiBSZXR1cm5zIGEgbG93ZXIgYm91bmQgb2YgZmllbGQgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBzdGFydGluZyBwb2ludCB0b1xuICogc2NhbiB0aGUgaW5kZXggZGVmaW5lZCBieSBgZmllbGRJbmRleGAuIFJldHVybnMgYE1JTl9WQUxVRWAgaWYgbm8gbG93ZXIgYm91bmRcbiAqIGV4aXN0cy5cbiAqLyAociwgaSksIGEgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggc2VnbWVudCwgcmV0cmlldmUgYSBsb3dlciBib3VuZCBpZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGZpbHRlciBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRBdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBkdChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAwIC8qIEluZGV4S2luZC5BU0NFTkRJTkcgKi8gPT09IGkua2luZCA/IExuKHQsIGkuZmllbGRQYXRoLCB0LnN0YXJ0QXQpIDogcW4odCwgaS5maWVsZFBhdGgsIHQuc3RhcnRBdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGUudmFsdWUpLCBzICYmIChzID0gZS5pbmNsdXNpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBobihuLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvKipcbiAqIFJldHVybnMgYW4gdXBwZXIgYm91bmQgb2YgZmllbGQgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZW5kaW5nIHBvaW50XG4gKiB3aGVuIHNjYW5uaW5nIHRoZSBpbmRleCBkZWZpbmVkIGJ5IGBmaWVsZEluZGV4YC4gUmV0dXJucyBgTUFYX1ZBTFVFYCBpZiBub1xuICogdXBwZXIgYm91bmQgZXhpc3RzLlxuICovIChyLCBpKSwgaCA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gITA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWdtZW50LCByZXRyaWV2ZSBhbiB1cHBlciBib3VuZCBpZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGZpbHRlciBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kQXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgZHQoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gMCAvKiBJbmRleEtpbmQuQVNDRU5ESU5HICovID09PSBpLmtpbmQgPyBxbih0LCBpLmZpZWxkUGF0aCwgdC5lbmRBdCkgOiBMbih0LCBpLmZpZWxkUGF0aCwgdC5lbmRBdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGUudmFsdWUpLCBzICYmIChzID0gZS5pbmNsdXNpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBobihuLCBzKTtcbiAgICAgICAgICAgICAgICAgICAgfShyLCBpKSwgbCA9IHRoaXMuaG4oaSwgciwgYSksIGYgPSB0aGlzLmhuKGksIHIsIGgpLCBkID0gdGhpcy5sbihpLCByLCBjKSwgdyA9IHRoaXMuZm4oaS5pbmRleElkLCB1LCBsLCBhLmluY2x1c2l2ZSwgZiwgaC5pbmNsdXNpdmUsIGQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnQuZm9yRWFjaCh3LCAoaSA9PiBuLkgoaSwgZS5saW1pdCkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBodC5mcm9tU2VnbWVudHMoZS5kb2N1bWVudEtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXMobikgfHwgKHQgPSB0LmFkZChuKSwgcy5wdXNoKG4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSdC5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGNuKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLnVuLmdldCh0KTtcbiAgICAgICAgaWYgKGUpIHJldHVybiBlO1xuICAgICAgICBpZiAoMCA9PT0gdC5maWx0ZXJzLmxlbmd0aCkgZSA9IFsgdCBdOyBlbHNlIHtcbiAgICAgICAgICAgIGUgPSBCcihnbi5jcmVhdGUodC5maWx0ZXJzLCBcImFuZFwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLkFORCAqLykpLm1hcCgoZSA9PiBNbih0LnBhdGgsIHQuY29sbGVjdGlvbkdyb3VwLCB0Lm9yZGVyQnksIGUuZ2V0RmlsdGVycygpLCB0LmxpbWl0LCB0LnN0YXJ0QXQsIHQuZW5kQXQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudW4uc2V0KHQsIGUpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEga2V5IHJhbmdlIHF1ZXJ5IG9uIGBEYkluZGV4RW50cnlTdG9yZWAgdGhhdCB1bmlvbnMgYWxsXG4gICAgICogYm91bmRzLlxuICAgICAqLyAgICBmbih0LCBlLCBuLCBzLCBpLCByLCBvKSB7XG4gICAgICAgIC8vIFRoZSBudW1iZXIgb2YgdG90YWwgaW5kZXggc2NhbnMgd2UgdW5pb24gdG9nZXRoZXIuIFRoaXMgaXMgc2ltaWxhciB0byBhXG4gICAgICAgIC8vIGRpc3RyaWJ1dGVkIG5vcm1hbCBmb3JtLCBidXQgYWRhcHRlZCBmb3IgYXJyYXkgdmFsdWVzLiBXZSBjcmVhdGUgYSBzaW5nbGVcbiAgICAgICAgLy8gaW5kZXggcmFuZ2UgcGVyIHZhbHVlIGluIGFuIEFSUkFZX0NPTlRBSU5TIG9yIEFSUkFZX0NPTlRBSU5TX0FOWSBmaWx0ZXJcbiAgICAgICAgLy8gY29tYmluZWQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIHF1ZXJ5IGJvdW5kcy5cbiAgICAgICAgY29uc3QgdSA9IChudWxsICE9IGUgPyBlLmxlbmd0aCA6IDEpICogTWF0aC5tYXgobi5sZW5ndGgsIGkubGVuZ3RoKSwgYyA9IHUgLyAobnVsbCAhPSBlID8gZS5sZW5ndGggOiAxKSwgYSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IHU7ICsraCkge1xuICAgICAgICAgICAgY29uc3QgdSA9IGUgPyB0aGlzLmRuKGVbaCAvIGNdKSA6IEhyLCBsID0gdGhpcy53bih0LCB1LCBuW2ggJSBjXSwgcyksIGYgPSB0aGlzLl9uKHQsIHUsIGlbaCAlIGNdLCByKSwgZCA9IG8ubWFwKChlID0+IHRoaXMud24odCwgdSwgZSwgXG4gICAgICAgICAgICAvKiBpbmNsdXNpdmU9ICovICEwKSkpO1xuICAgICAgICAgICAgYS5wdXNoKC4uLnRoaXMuY3JlYXRlUmFuZ2UobCwgZiwgZCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICAvKiogR2VuZXJhdGVzIHRoZSBsb3dlciBib3VuZCBmb3IgYGFycmF5VmFsdWVgIGFuZCBgZGlyZWN0aW9uYWxWYWx1ZWAuICovICAgIHduKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBrcih0LCBodC5lbXB0eSgpLCBlLCBuKTtcbiAgICAgICAgcmV0dXJuIHMgPyBpIDogaS5KZSgpO1xuICAgIH1cbiAgICAvKiogR2VuZXJhdGVzIHRoZSB1cHBlciBib3VuZCBmb3IgYGFycmF5VmFsdWVgIGFuZCBgZGlyZWN0aW9uYWxWYWx1ZWAuICovICAgIF9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBrcih0LCBodC5lbXB0eSgpLCBlLCBuKTtcbiAgICAgICAgcmV0dXJuIHMgPyBpLkplKCkgOiBpO1xuICAgIH1cbiAgICBhbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgT3IoZSksIHMgPSBudWxsICE9IGUuY29sbGVjdGlvbkdyb3VwID8gZS5jb2xsZWN0aW9uR3JvdXAgOiBlLnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRJbmRleGVzKHQsIHMpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBpbmRleCB3aXRoIHRoZSBtb3N0IG51bWJlciBvZiBzZWdtZW50cy5cbiAgICAgICAgICAgIGxldCBlID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0KSB7XG4gICAgICAgICAgICAgICAgbi50bihzKSAmJiAoIWUgfHwgcy5maWVsZHMubGVuZ3RoID4gZS5maWVsZHMubGVuZ3RoKSAmJiAoZSA9IHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0SW5kZXhUeXBlKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSAyIC8qIEluZGV4VHlwZS5GVUxMICovO1xuICAgICAgICBjb25zdCBzID0gdGhpcy5jbihlKTtcbiAgICAgICAgcmV0dXJuIFJ0LmZvckVhY2gocywgKGUgPT4gdGhpcy5hbih0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHQgPyAwIC8qIEluZGV4VHlwZS5OT05FICovICE9PSBuICYmIHQuZmllbGRzLmxlbmd0aCA8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZSA9IG5ldyBFZShhdC5jb21wYXJhdG9yKSwgbiA9ICExO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiB0LmZpbHRlcnMpIGZvciAoY29uc3QgdCBvZiBzLmdldEZsYXR0ZW5lZEZpbHRlcnMoKSkgXG4gICAgICAgICAgICAgICAgLy8gX19uYW1lX18gaXMgbm90IGFuIGV4cGxpY2l0IHNlZ21lbnQgb2YgYW55IGluZGV4LCBzbyB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICAgICAgICAgLy8gY291bnQgaXQuXG4gICAgICAgICAgICAgICAgdC5maWVsZC5pc0tleUZpZWxkKCkgfHwgKFxuICAgICAgICAgICAgICAgIC8vIEFSUkFZX0NPTlRBSU5TIG9yIEFSUkFZX0NPTlRBSU5TX0FOWSBmaWx0ZXJzIG11c3QgYmUgY291bnRlZCBzZXBhcmF0ZWx5LlxuICAgICAgICAgICAgICAgIC8vIEZvciBpbnN0YW5jZSwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhbiBpbmRleCBmb3IgXCJhIEFSUkFZIGEgQVNDXCIuIEV2ZW5cbiAgICAgICAgICAgICAgICAvLyB0aG91Z2ggdGhlc2UgYXJlIG9uIHRoZSBzYW1lIGZpZWxkLCB0aGV5IHNob3VsZCBiZSBjb3VudGVkIGFzIHR3b1xuICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIHNlZ21lbnRzIGluIGFuIGluZGV4LlxuICAgICAgICAgICAgICAgIFwiYXJyYXktY29udGFpbnNcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOUyAqLyA9PT0gdC5vcCB8fCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIE9wZXJhdG9yLkFSUkFZX0NPTlRBSU5TX0FOWSAqLyA9PT0gdC5vcCA/IG4gPSAhMCA6IGUgPSBlLmFkZCh0LmZpZWxkKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHQub3JkZXJCeSkgXG4gICAgICAgICAgICAgICAgLy8gX19uYW1lX18gaXMgbm90IGFuIGV4cGxpY2l0IHNlZ21lbnQgb2YgYW55IGluZGV4LCBzbyB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICAgICAgICAgLy8gY291bnQgaXQuXG4gICAgICAgICAgICAgICAgbi5maWVsZC5pc0tleUZpZWxkKCkgfHwgKGUgPSBlLmFkZChuLmZpZWxkKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuc2l6ZSArIChuID8gMSA6IDApO1xuICAgICAgICAgICAgfShlKSAmJiAobiA9IDEgLyogSW5kZXhUeXBlLlBBUlRJQUwgKi8pIDogbiA9IDAgLyogSW5kZXhUeXBlLk5PTkUgKi87XG4gICAgICAgIH0pKSkpLm5leHQoKCgpID0+IFxuICAgICAgICAvLyBPUiBxdWVyaWVzIGhhdmUgbW9yZSB0aGFuIG9uZSBzdWItdGFyZ2V0IChvbmUgc3ViLXRhcmdldCBwZXIgRE5GIHRlcm0pLiBXZSBjdXJyZW50bHkgY29uc2lkZXJcbiAgICAgICAgLy8gT1IgcXVlcmllcyB0aGF0IGhhdmUgYSBgbGltaXRgIHRvIGhhdmUgYSBwYXJ0aWFsIGluZGV4LiBGb3Igc3VjaCBxdWVyaWVzIHdlIHBlcmZvcm0gc29ydGluZ1xuICAgICAgICAvLyBhbmQgYXBwbHkgdGhlIGxpbWl0IGluIG1lbW9yeSBhcyBhIHBvc3QtcHJvY2Vzc2luZyBzdGVwLlxuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gdC5saW1pdDtcbiAgICAgICAgfShlKSAmJiBzLmxlbmd0aCA+IDEgJiYgMiAvKiBJbmRleFR5cGUuRlVMTCAqLyA9PT0gbiA/IDEgLyogSW5kZXhUeXBlLlBBUlRJQUwgKi8gOiBuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJ5dGUgZW5jb2RlZCBmb3JtIG9mIHRoZSBkaXJlY3Rpb25hbCB2YWx1ZXMgaW4gdGhlIGZpZWxkIGluZGV4LlxuICAgICAqIFJldHVybnMgYG51bGxgIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGFsbCBmaWVsZHMgc3BlY2lmaWVkIGluIHRoZVxuICAgICAqIGluZGV4LlxuICAgICAqLyAgICBtbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTnI7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBkdCh0KSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuZGF0YS5maWVsZChzLmZpZWxkUGF0aCk7XG4gICAgICAgICAgICBpZiAobnVsbCA9PSB0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLkhlKHMua2luZCk7XG4gICAgICAgICAgICBici5WZS5fZSh0LCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbi5RZSgpO1xuICAgIH1cbiAgICAvKiogRW5jb2RlcyBhIHNpbmdsZSB2YWx1ZSB0byB0aGUgYXNjZW5kaW5nIGluZGV4IGZvcm1hdC4gKi8gICAgZG4odCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IE5yO1xuICAgICAgICByZXR1cm4gYnIuVmUuX2UodCwgZS5IZSgwIC8qIEluZGV4S2luZC5BU0NFTkRJTkcgKi8pKSwgZS5RZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGVuY29kZWQgZm9ybSBvZiB0aGUgZG9jdW1lbnQga2V5IHRoYXQgc29ydHMgYmFzZWQgb24gdGhlIGtleVxuICAgICAqIG9yZGVyaW5nIG9mIHRoZSBmaWVsZCBpbmRleC5cbiAgICAgKi8gICAgZ24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IE5yO1xuICAgICAgICByZXR1cm4gYnIuVmUuX2UoV2UodGhpcy5kYXRhYmFzZUlkLCBlKSwgbi5IZShmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gZHQodCk7XG4gICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5sZW5ndGggPyAwIC8qIEluZGV4S2luZC5BU0NFTkRJTkcgKi8gOiBlW2UubGVuZ3RoIC0gMV0ua2luZDtcbiAgICAgICAgfSh0KSkpLCBuLlFlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZXMgdGhlIGdpdmVuIGZpZWxkIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gYHRhcmdldGAuXG4gICAgICogRm9yIElOIHF1ZXJpZXMsIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgaXMgcmV0dXJuZWQuXG4gICAgICovICAgIGxuKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKG51bGwgPT09IG4pIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHMgPSBbXTtcbiAgICAgICAgcy5wdXNoKG5ldyBOcik7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGR0KHQpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbltpKytdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHMpIGlmICh0aGlzLnluKGUsIHIuZmllbGRQYXRoKSAmJiBKZSh0KSkgcyA9IHRoaXMucG4ocywgciwgdCk7IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuLkhlKHIua2luZCk7XG4gICAgICAgICAgICAgICAgYnIuVmUuX2UodCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuSW4ocyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZXMgdGhlIGdpdmVuIGJvdW5kcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gYHRhcmdldGAuIEZvciBJTlxuICAgICAqIHF1ZXJpZXMsIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgaXMgcmV0dXJuZWQuXG4gICAgICovICAgIGhuKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG4odCwgZSwgbi5wb3NpdGlvbik7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIHRoZSBieXRlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgcHJvdmlkZWQgZW5jb2RlcnMuICovICAgIEluKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pIGVbbl0gPSB0W25dLlFlKCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2VwYXJhdGUgZW5jb2RlciBmb3IgZWFjaCBlbGVtZW50IG9mIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogVGhlIG1ldGhvZCBhcHBlbmRzIGVhY2ggdmFsdWUgdG8gYWxsIGV4aXN0aW5nIGVuY29kZXJzIChlLmcuIGZpbHRlcihcImFcIixcbiAgICAgKiBcIj09XCIsIFwiYTFcIikuZmlsdGVyKFwiYlwiLCBcImluXCIsIFtcImIxXCIsIFwiYjJcIl0pIGJlY29tZXMgW1wiYTEsYjFcIiwgXCJhMSxiMlwiXSkuIEFcbiAgICAgKiBsaXN0IG9mIG5ldyBlbmNvZGVycyBpcyByZXR1cm5lZC5cbiAgICAgKi8gICAgcG4odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gWyAuLi50IF0sIGkgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIG4uYXJyYXlWYWx1ZS52YWx1ZXMgfHwgW10pIGZvciAoY29uc3QgbiBvZiBzKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbmV3IE5yO1xuICAgICAgICAgICAgcy5zZWVkKG4uUWUoKSksIGJyLlZlLl9lKHQsIHMuSGUoZS5raW5kKSksIGkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgeW4odCwgZSkge1xuICAgICAgICByZXR1cm4gISF0LmZpbHRlcnMuZmluZCgodCA9PiB0IGluc3RhbmNlb2YgbW4gJiYgdC5maWVsZC5pc0VxdWFsKGUpICYmIChcImluXCIgLyogT3BlcmF0b3IuSU4gKi8gPT09IHQub3AgfHwgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gPT09IHQub3ApKSk7XG4gICAgfVxuICAgIGdldEZpZWxkSW5kZXhlcyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBacih0KSwgcyA9IHRvKHQpO1xuICAgICAgICByZXR1cm4gKGUgPyBuLmooXCJjb2xsZWN0aW9uR3JvdXBJbmRleFwiLCBJREJLZXlSYW5nZS5ib3VuZChlLCBlKSkgOiBuLmooKSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgICAgICByZXR1cm4gUnQuZm9yRWFjaCh0LCAodCA9PiBzLmdldChbIHQuaW5kZXhJZCwgdGhpcy51aWQgXSkubmV4dCgobiA9PiB7XG4gICAgICAgICAgICAgICAgZS5wdXNoKGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGUgPyBuZXcgZ3QoZS5zZXF1ZW5jZU51bWJlciwgbmV3IEl0KHdyKGUucmVhZFRpbWUpLCBuZXcgaHQoR3QoZS5kb2N1bWVudEtleSkpLCBlLmxhcmdlc3RCYXRjaElkKSkgOiBndC5lbXB0eSgpLCBzID0gdC5maWVsZHMubWFwKCgoW3QsIGVdKSA9PiBuZXcgX3QoYXQuZnJvbVNlcnZlckZvcm1hdCh0KSwgZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBsdCh0LmluZGV4SWQsIHQuY29sbGVjdGlvbkdyb3VwLCBzLCBuKTtcbiAgICAgICAgICAgICAgICB9KHQsIG4pKTtcbiAgICAgICAgICAgIH0pKSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXROZXh0Q29sbGVjdGlvbkdyb3VwVG9VcGRhdGUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEluZGV4ZXModCkubmV4dCgodCA9PiAwID09PSB0Lmxlbmd0aCA/IG51bGwgOiAodC5zb3J0KCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuaW5kZXhTdGF0ZS5zZXF1ZW5jZU51bWJlciAtIGUuaW5kZXhTdGF0ZS5zZXF1ZW5jZU51bWJlcjtcbiAgICAgICAgICAgIHJldHVybiAwICE9PSBuID8gbiA6IGV0KHQuY29sbGVjdGlvbkdyb3VwLCBlLmNvbGxlY3Rpb25Hcm91cCk7XG4gICAgICAgIH0pKSwgdFswXS5jb2xsZWN0aW9uR3JvdXApKSk7XG4gICAgfVxuICAgIHVwZGF0ZUNvbGxlY3Rpb25Hcm91cCh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBacih0KSwgaSA9IHRvKHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5Ubih0KS5uZXh0KCh0ID0+IHMuaihcImNvbGxlY3Rpb25Hcm91cEluZGV4XCIsIElEQktleVJhbmdlLmJvdW5kKGUsIGUpKS5uZXh0KChlID0+IFJ0LmZvckVhY2goZSwgKGUgPT4gaS5wdXQoVHIoZS5pbmRleElkLCB0aGlzLnVzZXIsIHQsIG4pKSkpKSkpKTtcbiAgICB9XG4gICAgdXBkYXRlSW5kZXhFbnRyaWVzKHQsIGUpIHtcbiAgICAgICAgLy8gUG9ydGluZyBOb3RlOiBgZ2V0RmllbGRJbmRleGVzKClgIG9uIFdlYiBkb2VzIG5vdCBjYWNoZSBpbmRleCBsb29rdXBzIGFzXG4gICAgICAgIC8vIGl0IGNvdWxkIGJlIHVzZWQgYWNyb3NzIGRpZmZlcmVudCBJbmRleGVkREIgdHJhbnNhY3Rpb25zLiBBcyBhbnkgY2FjaGVkXG4gICAgICAgIC8vIGRhdGEgbWlnaHQgYmUgaW52YWxpZGF0ZWQgYnkgb3RoZXIgbXVsdGktdGFiIGNsaWVudHMsIHdlIGNhbiBvbmx5IHRydXN0XG4gICAgICAgIC8vIGRhdGEgd2l0aGluIGEgc2luZ2xlIEluZGV4ZWREQiB0cmFuc2FjdGlvbi4gV2UgdGhlcmVmb3JlIGFkZCBhIGNhY2hlXG4gICAgICAgIC8vIGhlcmUuXG4gICAgICAgIGNvbnN0IG4gPSBuZXcgTWFwO1xuICAgICAgICByZXR1cm4gUnQuZm9yRWFjaChlLCAoKGUsIHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmdldChlLmNvbGxlY3Rpb25Hcm91cCk7XG4gICAgICAgICAgICByZXR1cm4gKGkgPyBSdC5yZXNvbHZlKGkpIDogdGhpcy5nZXRGaWVsZEluZGV4ZXModCwgZS5jb2xsZWN0aW9uR3JvdXApKS5uZXh0KChpID0+IChuLnNldChlLmNvbGxlY3Rpb25Hcm91cCwgaSksIFxuICAgICAgICAgICAgUnQuZm9yRWFjaChpLCAobiA9PiB0aGlzLkVuKHQsIGUsIG4pLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkFuKHMsIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmlzRXF1YWwoaSkgPyBSdC5yZXNvbHZlKCkgOiB0aGlzLnZuKHQsIHMsIG4sIGUsIGkpO1xuICAgICAgICAgICAgfSkpKSkpKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgUm4odCwgZSwgbiwgcykge1xuICAgICAgICByZXR1cm4gWHIodCkucHV0KHtcbiAgICAgICAgICAgIGluZGV4SWQ6IHMuaW5kZXhJZCxcbiAgICAgICAgICAgIHVpZDogdGhpcy51aWQsXG4gICAgICAgICAgICBhcnJheVZhbHVlOiBzLmFycmF5VmFsdWUsXG4gICAgICAgICAgICBkaXJlY3Rpb25hbFZhbHVlOiBzLmRpcmVjdGlvbmFsVmFsdWUsXG4gICAgICAgICAgICBvcmRlcmVkRG9jdW1lbnRLZXk6IHRoaXMuZ24obiwgZS5rZXkpLFxuICAgICAgICAgICAgZG9jdW1lbnRLZXk6IGUua2V5LnBhdGgudG9BcnJheSgpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBQbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHJldHVybiBYcih0KS5kZWxldGUoWyBzLmluZGV4SWQsIHRoaXMudWlkLCBzLmFycmF5VmFsdWUsIHMuZGlyZWN0aW9uYWxWYWx1ZSwgdGhpcy5nbihuLCBlLmtleSksIGUua2V5LnBhdGgudG9BcnJheSgpIF0pO1xuICAgIH1cbiAgICBFbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBYcih0KTtcbiAgICAgICAgbGV0IGkgPSBuZXcgRWUoTXIpO1xuICAgICAgICByZXR1cm4gcy5YKHtcbiAgICAgICAgICAgIGluZGV4OiBcImRvY3VtZW50S2V5SW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBJREJLZXlSYW5nZS5vbmx5KFsgbi5pbmRleElkLCB0aGlzLnVpZCwgdGhpcy5nbihuLCBlKSBdKVxuICAgICAgICB9LCAoKHQsIHMpID0+IHtcbiAgICAgICAgICAgIGkgPSBpLmFkZChuZXcga3Iobi5pbmRleElkLCBlLCBzLmFycmF5VmFsdWUsIHMuZGlyZWN0aW9uYWxWYWx1ZSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LiAqLyAgICBBbih0LCBlKSB7XG4gICAgICAgIGxldCBuID0gbmV3IEVlKE1yKTtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMubW4oZSwgdCk7XG4gICAgICAgIGlmIChudWxsID09IHMpIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gZnQoZSk7XG4gICAgICAgIGlmIChudWxsICE9IGkpIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0LmRhdGEuZmllbGQoaS5maWVsZFBhdGgpO1xuICAgICAgICAgICAgaWYgKEplKHIpKSBmb3IgKGNvbnN0IGkgb2Ygci5hcnJheVZhbHVlLnZhbHVlcyB8fCBbXSkgbiA9IG4uYWRkKG5ldyBrcihlLmluZGV4SWQsIHQua2V5LCB0aGlzLmRuKGkpLCBzKSk7XG4gICAgICAgIH0gZWxzZSBuID0gbi5hZGQobmV3IGtyKGUuaW5kZXhJZCwgdC5rZXksIEhyLCBzKSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBpbmRleCBlbnRyaWVzIGZvciB0aGUgcHJvdmlkZWQgZG9jdW1lbnQgYnkgZGVsZXRpbmcgZW50cmllc1xuICAgICAqIHRoYXQgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkIGluIGBuZXdFbnRyaWVzYCBhbmQgYWRkaW5nIGFsbCBuZXdseSBhZGRlZFxuICAgICAqIGVudHJpZXMuXG4gICAgICovICAgIHZuKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgTihcIkluZGV4ZWREYkluZGV4TWFuYWdlclwiLCBcIlVwZGF0aW5nIGluZGV4IGVudHJpZXMgZm9yIGRvY3VtZW50ICclcydcIiwgZS5rZXkpO1xuICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdC5nZXRJdGVyYXRvcigpLCBvID0gZS5nZXRJdGVyYXRvcigpO1xuICAgICAgICAgICAgbGV0IHUgPSB2ZShyKSwgYyA9IHZlKG8pO1xuICAgICAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSB0d28gc2V0cyBhdCB0aGUgc2FtZSB0aW1lLCB1c2luZyB0aGUgb3JkZXJpbmcgZGVmaW5lZCBieVxuICAgICAgICAgICAgLy8gYGNvbXBhcmF0b3JgLlxuICAgICAgICAgICAgZm9yICg7dSB8fCBjOyApIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9ICExLCBlID0gITE7XG4gICAgICAgICAgICAgICAgaWYgKHUgJiYgYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbih1LCBjKTtcbiAgICAgICAgICAgICAgICAgICAgcyA8IDAgPyBcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgaWYgdGhlIG5leHQgZWxlbWVudCBpbiBvdXIgb3JkZXJlZFxuICAgICAgICAgICAgICAgICAgICAvLyB3YWxrdGhyb3VnaCBpcyBvbmx5IGluIGBiZWZvcmVgLlxuICAgICAgICAgICAgICAgICAgICBlID0gITAgOiBzID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IHdhcyBhZGRlZCBpZiB0aGUgbmV4dCBlbGVtZW50IGluIG91ciBvcmRlcmVkIHdhbGt0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgIC8vIGlzIG9ubHkgaW4gYGFmdGVyYC5cbiAgICAgICAgICAgICAgICAgICAgdCA9ICEwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgbnVsbCAhPSB1ID8gZSA9ICEwIDogdCA9ICEwO1xuICAgICAgICAgICAgICAgIHQgPyAocyhjKSwgYyA9IHZlKG8pKSA6IGUgPyAoaSh1KSwgdSA9IHZlKHIpKSA6ICh1ID0gdmUociksIGMgPSB2ZShvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0ocywgaSwgTXIsIChcbiAgICAgICAgLyogb25BZGQ9ICovIHMgPT4ge1xuICAgICAgICAgICAgci5wdXNoKHRoaXMuUm4odCwgZSwgbiwgcykpO1xuICAgICAgICB9KSwgKFxuICAgICAgICAvKiBvblJlbW92ZT0gKi8gcyA9PiB7XG4gICAgICAgICAgICByLnB1c2godGhpcy5Qbih0LCBlLCBuLCBzKSk7XG4gICAgICAgIH0pKSwgUnQud2FpdEZvcihyKTtcbiAgICB9XG4gICAgVG4odCkge1xuICAgICAgICBsZXQgZSA9IDE7XG4gICAgICAgIHJldHVybiB0byh0KS5YKHtcbiAgICAgICAgICAgIGluZGV4OiBcInNlcXVlbmNlTnVtYmVySW5kZXhcIixcbiAgICAgICAgICAgIHJldmVyc2U6ICEwLFxuICAgICAgICAgICAgcmFuZ2U6IElEQktleVJhbmdlLnVwcGVyQm91bmQoWyB0aGlzLnVpZCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgXSlcbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBzLmRvbmUoKSwgZSA9IG4uc2VxdWVuY2VOdW1iZXIgKyAxO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHNldCBvZiBJREIgcmFuZ2VzIHRoYXQgc3BsaXRzIHRoZSBleGlzdGluZyByYW5nZSBhbmQgZXhjbHVkZXNcbiAgICAgKiBhbnkgdmFsdWVzIHRoYXQgbWF0Y2ggdGhlIGBub3RJblZhbHVlYCBmcm9tIHRoZXNlIHJhbmdlcy4gQXMgYW4gZXhhbXBsZSxcbiAgICAgKiAnW2ZvbyA+IDIgJiYgZm9vICE9IDNdYCBiZWNvbWVzICBgW2ZvbyA+IDIgJiYgPCAzLCBmb28gPiAzXWAuXG4gICAgICovICAgIGNyZWF0ZVJhbmdlKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gVGhlIG5vdEluIHZhbHVlcyBuZWVkIHRvIGJlIHNvcnRlZCBhbmQgdW5pcXVlIHNvIHRoYXQgd2UgY2FuIHJldHVybiBhXG4gICAgICAgIC8vIHNvcnRlZCBzZXQgb2Ygbm9uLW92ZXJsYXBwaW5nIHJhbmdlcy5cbiAgICAgICAgbiA9IG4uc29ydCgoKHQsIGUpID0+IE1yKHQsIGUpKSkuZmlsdGVyKCgodCwgZSwgbikgPT4gIWUgfHwgMCAhPT0gTXIodCwgbltlIC0gMV0pKSk7XG4gICAgICAgIGNvbnN0IHMgPSBbXTtcbiAgICAgICAgcy5wdXNoKHQpO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygbikge1xuICAgICAgICAgICAgY29uc3QgbiA9IE1yKGksIHQpLCByID0gTXIoaSwgZSk7XG4gICAgICAgICAgICBpZiAoMCA9PT0gbikgXG4gICAgICAgICAgICAvLyBgbm90SW5WYWx1ZWAgaXMgdGhlIGxvd2VyIGJvdW5kLiBXZSB0aGVyZWZvcmUgbmVlZCB0byByYWlzZSB0aGUgYm91bmRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBuZXh0IHZhbHVlLlxuICAgICAgICAgICAgc1swXSA9IHQuSmUoKTsgZWxzZSBpZiAobiA+IDAgJiYgciA8IDApIFxuICAgICAgICAgICAgLy8gYG5vdEluVmFsdWVgIGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJhbmdlXG4gICAgICAgICAgICBzLnB1c2goaSksIHMucHVzaChpLkplKCkpOyBlbHNlIGlmIChyID4gMCkgXG4gICAgICAgICAgICAvLyBgbm90SW5WYWx1ZWAgKGFuZCBhbGwgZm9sbG93aW5nIHZhbHVlcykgYXJlIG91dCBvZiB0aGUgcmFuZ2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHMucHVzaChlKTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHMubGVuZ3RoOyB0ICs9IDIpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciB0d28gYm91bmRzIHRoYXQgd2lsbCBjcmVhdGUgYW4gdW5tYXRjaGFibGUga2V5IHJhbmdlLFxuICAgICAgICAgICAgLy8gdGhlbiB3ZSByZXR1cm4gYW4gZW1wdHkgc2V0IG9mIGtleSByYW5nZXMuXG4gICAgICAgICAgICBpZiAodGhpcy5ibihzW3RdLCBzW3QgKyAxXSkpIHJldHVybiBbXTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBbIHNbdF0uaW5kZXhJZCwgdGhpcy51aWQsIHNbdF0uYXJyYXlWYWx1ZSwgc1t0XS5kaXJlY3Rpb25hbFZhbHVlLCBIciwgW10gXSwgbiA9IFsgc1t0ICsgMV0uaW5kZXhJZCwgdGhpcy51aWQsIHNbdCArIDFdLmFycmF5VmFsdWUsIHNbdCArIDFdLmRpcmVjdGlvbmFsVmFsdWUsIEhyLCBbXSBdO1xuICAgICAgICAgICAgaS5wdXNoKElEQktleVJhbmdlLmJvdW5kKGUsIG4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgYm4odCwgZSkge1xuICAgICAgICAvLyBJZiBsb3dlciBib3VuZCBpcyBncmVhdGVyIHRoYW4gdGhlIHVwcGVyIGJvdW5kLCB0aGVuIHRoZSBrZXlcbiAgICAgICAgLy8gcmFuZ2UgY2FuIG5ldmVyIGJlIG1hdGNoZWQuXG4gICAgICAgIHJldHVybiBNcih0LCBlKSA+IDA7XG4gICAgfVxuICAgIGdldE1pbk9mZnNldEZyb21Db2xsZWN0aW9uR3JvdXAodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZEluZGV4ZXModCwgZSkubmV4dChlbyk7XG4gICAgfVxuICAgIGdldE1pbk9mZnNldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5tYXBBcnJheSh0aGlzLmNuKGUpLCAoZSA9PiB0aGlzLmFuKHQsIGUpLm5leHQoKHQgPT4gdCB8fCBPKCkpKSkpLm5leHQoZW8pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGNvbGxlY3Rpb25QYXJlbnRzXG4gKiBkb2N1bWVudCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBZcih0KSB7XG4gICAgcmV0dXJuIF9lKHQsIFwiY29sbGVjdGlvblBhcmVudHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBlbnRyeSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gWHIodCkge1xuICAgIHJldHVybiBfZSh0LCBcImluZGV4RW50cmllc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGluZGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIFpyKHQpIHtcbiAgICByZXR1cm4gX2UodCwgXCJpbmRleENvbmZpZ3VyYXRpb25cIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBpbmRleCBzdGF0ZSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gdG8odCkge1xuICAgIHJldHVybiBfZSh0LCBcImluZGV4U3RhdGVcIik7XG59XG5cbmZ1bmN0aW9uIGVvKHQpIHtcbiAgICBGKDAgIT09IHQubGVuZ3RoKTtcbiAgICBsZXQgZSA9IHRbMF0uaW5kZXhTdGF0ZS5vZmZzZXQsIG4gPSBlLmxhcmdlc3RCYXRjaElkO1xuICAgIGZvciAobGV0IHMgPSAxOyBzIDwgdC5sZW5ndGg7IHMrKykge1xuICAgICAgICBjb25zdCBpID0gdFtzXS5pbmRleFN0YXRlLm9mZnNldDtcbiAgICAgICAgVHQoaSwgZSkgPCAwICYmIChlID0gaSksIG4gPCBpLmxhcmdlc3RCYXRjaElkICYmIChuID0gaS5sYXJnZXN0QmF0Y2hJZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSXQoZS5yZWFkVGltZSwgZS5kb2N1bWVudEtleSwgbik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IG5vID0ge1xuICAgIGRpZFJ1bjogITEsXG4gICAgc2VxdWVuY2VOdW1iZXJzQ29sbGVjdGVkOiAwLFxuICAgIHRhcmdldHNSZW1vdmVkOiAwLFxuICAgIGRvY3VtZW50c1JlbW92ZWQ6IDBcbn07XG5cbmNsYXNzIHNvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBXaGVuIHdlIGF0dGVtcHQgdG8gY29sbGVjdCwgd2Ugd2lsbCBvbmx5IGRvIHNvIGlmIHRoZSBjYWNoZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAgLy8gdGhyZXNob2xkLiBQYXNzaW5nIGBDT0xMRUNUSU9OX0RJU0FCTEVEYCBoZXJlIHdpbGwgY2F1c2UgY29sbGVjdGlvbiB0byBhbHdheXMgYmUgc2tpcHBlZC5cbiAgICB0LCBcbiAgICAvLyBUaGUgcGVyY2VudGFnZSBvZiBzZXF1ZW5jZSBudW1iZXJzIHRoYXQgd2Ugd2lsbCBhdHRlbXB0IHRvIGNvbGxlY3RcbiAgICBlLCBcbiAgICAvLyBBIGNhcCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgdGhhdCB3aWxsIGJlIGNvbGxlY3RlZC4gVGhpcyBwcmV2ZW50c1xuICAgIC8vIHVzIGZyb20gY29sbGVjdGluZyBhIGh1Z2UgbnVtYmVyIG9mIHNlcXVlbmNlIG51bWJlcnMgaWYgdGhlIGNhY2hlIGhhcyBncm93biB2ZXJ5IGxhcmdlLlxuICAgIG4pIHtcbiAgICAgICAgdGhpcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID0gdCwgdGhpcy5wZXJjZW50aWxlVG9Db2xsZWN0ID0gZSwgdGhpcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0ID0gbjtcbiAgICB9XG4gICAgc3RhdGljIHdpdGhDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gbmV3IHNvKHQsIHNvLkRFRkFVTFRfQ09MTEVDVElPTl9QRVJDRU5USUxFLCBzby5ERUZBVUxUX01BWF9TRVFVRU5DRV9OVU1CRVJTX1RPX0NPTExFQ1QpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGVsZXRlIGEgbXV0YXRpb24gYmF0Y2ggYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IG11dGF0aW9ucy5cbiAqIEByZXR1cm5zIEEgUGVyc2lzdGVuY2VQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBtdXRhdGlvbnMgdGhhdCB3ZXJlIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIGlvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gdC5zdG9yZShcIm11dGF0aW9uc1wiKSwgaSA9IHQuc3RvcmUoXCJkb2N1bWVudE11dGF0aW9uc1wiKSwgciA9IFtdLCBvID0gSURCS2V5UmFuZ2Uub25seShuLmJhdGNoSWQpO1xuICAgIGxldCB1ID0gMDtcbiAgICBjb25zdCBjID0gcy5YKHtcbiAgICAgICAgcmFuZ2U6IG9cbiAgICB9LCAoKHQsIGUsIG4pID0+ICh1KyssIG4uZGVsZXRlKCkpKSk7XG4gICAgci5wdXNoKGMubmV4dCgoKCkgPT4ge1xuICAgICAgICBGKDEgPT09IHUpO1xuICAgIH0pKSk7XG4gICAgY29uc3QgYSA9IFtdO1xuICAgIGZvciAoY29uc3QgdCBvZiBuLm11dGF0aW9ucykge1xuICAgICAgICBjb25zdCBzID0genQoZSwgdC5rZXkucGF0aCwgbi5iYXRjaElkKTtcbiAgICAgICAgci5wdXNoKGkuZGVsZXRlKHMpKSwgYS5wdXNoKHQua2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIFJ0LndhaXRGb3IocikubmV4dCgoKCkgPT4gYSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXBwcm94aW1hdGUgc2l6ZSBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICovIGZ1bmN0aW9uIHJvKHQpIHtcbiAgICBpZiAoIXQpIHJldHVybiAwO1xuICAgIGxldCBlO1xuICAgIGlmICh0LmRvY3VtZW50KSBlID0gdC5kb2N1bWVudDsgZWxzZSBpZiAodC51bmtub3duRG9jdW1lbnQpIGUgPSB0LnVua25vd25Eb2N1bWVudDsgZWxzZSB7XG4gICAgICAgIGlmICghdC5ub0RvY3VtZW50KSB0aHJvdyBPKCk7XG4gICAgICAgIGUgPSB0Lm5vRG9jdW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKS5sZW5ndGg7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogQSBtdXRhdGlvbiBxdWV1ZSBmb3IgYSBzcGVjaWZpYyB1c2VyLCBiYWNrZWQgYnkgSW5kZXhlZERCLiAqLyBzby5ERUZBVUxUX0NPTExFQ1RJT05fUEVSQ0VOVElMRSA9IDEwLCBcbnNvLkRFRkFVTFRfTUFYX1NFUVVFTkNFX05VTUJFUlNfVE9fQ09MTEVDVCA9IDFlMywgc28uREVGQVVMVCA9IG5ldyBzbyg0MTk0MzA0MCwgc28uREVGQVVMVF9DT0xMRUNUSU9OX1BFUkNFTlRJTEUsIHNvLkRFRkFVTFRfTUFYX1NFUVVFTkNFX05VTUJFUlNfVE9fQ09MTEVDVCksIFxuc28uRElTQUJMRUQgPSBuZXcgc28oLTEsIDAsIDApO1xuXG5jbGFzcyBvbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogVGhlIG5vcm1hbGl6ZWQgdXNlcklkIChlLmcuIG51bGwgVUlEID0+IFwiXCIgdXNlcklkKSB1c2VkIHRvIHN0b3JlIC9cbiAgICAgKiByZXRyaWV2ZSBtdXRhdGlvbnMuXG4gICAgICovXG4gICAgdCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnVzZXJJZCA9IHQsIHRoaXMuc2VyaWFsaXplciA9IGUsIHRoaXMuaW5kZXhNYW5hZ2VyID0gbiwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IHMsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGVzIHRoZSBkb2N1bWVudCBrZXlzIGZvciBwZW5kaW5nIG11dGF0aW9uIGJhdGNoZXMuIElmIHRoZSBtdXRhdGlvblxuICAgICAgICAgKiBoYXMgYmVlbiByZW1vdmVkIGZyb20gSW5kZXhlZERiLCB0aGUgY2FjaGVkIHZhbHVlIG1heSBjb250aW51ZSB0b1xuICAgICAgICAgKiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBiYXRjaCdzIGRvY3VtZW50IGtleXMuIFRvIHJlbW92ZSBhIGNhY2hlZCB2YWx1ZVxuICAgICAgICAgKiBsb2NhbGx5LCBgcmVtb3ZlQ2FjaGVkTXV0YXRpb25LZXlzKClgIHNob3VsZCBiZSBpbnZva2VkIGVpdGhlciBkaXJlY3RseVxuICAgICAgICAgKiBvciB0aHJvdWdoIGByZW1vdmVNdXRhdGlvbkJhdGNoZXMoKWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIFdpdGggbXVsdGktdGFiLCB3aGVuIHRoZSBwcmltYXJ5IGNsaWVudCBhY2tub3dsZWRnZXMgb3IgcmVqZWN0cyBhIG11dGF0aW9uLFxuICAgICAgICAgKiB0aGlzIGNhY2hlIGlzIHVzZWQgYnkgc2Vjb25kYXJ5IGNsaWVudHMgdG8gaW52YWxpZGF0ZSB0aGUgbG9jYWxcbiAgICAgICAgICogdmlldyBvZiB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGFmZmVjdGVkIGJ5IHRoZSBtdXRhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgICAgIHRoaXMuVm4gPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBtdXRhdGlvbiBxdWV1ZSBmb3IgdGhlIGdpdmVuIHVzZXIuXG4gICAgICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgbXV0YXRpb24gcXVldWUuXG4gICAgICogQHBhcmFtIHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciB0byB1c2Ugd2hlbiBwZXJzaXN0aW5nIHRvIEluZGV4ZWREYi5cbiAgICAgKi8gICAgc3RhdGljIGRlKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgLy8gVE9ETyhtY2cpOiBGaWd1cmUgb3V0IHdoYXQgY29uc3RyYWludHMgdGhlcmUgYXJlIG9uIHVzZXJJRHNcbiAgICAgICAgLy8gSW4gcGFydGljdWxhciwgYXJlIHRoZXJlIGFueSByZXNlcnZlZCBjaGFyYWN0ZXJzPyBhcmUgZW1wdHkgaWRzIGFsbG93ZWQ/XG4gICAgICAgIC8vIEZvciB0aGUgbW9tZW50IHN0b3JlIHRoZXNlIHRvZ2V0aGVyIGluIHRoZSBzYW1lIG11dGF0aW9ucyB0YWJsZSBhc3N1bWluZ1xuICAgICAgICAvLyB0aGF0IGVtcHR5IHVzZXJJRHMgYXJlbid0IGFsbG93ZWQuXG4gICAgICAgIEYoXCJcIiAhPT0gdC51aWQpO1xuICAgICAgICBjb25zdCBpID0gdC5pc0F1dGhlbnRpY2F0ZWQoKSA/IHQudWlkIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG5ldyBvbyhpLCBlLCBuLCBzKTtcbiAgICB9XG4gICAgY2hlY2tFbXB0eSh0KSB7XG4gICAgICAgIGxldCBlID0gITA7XG4gICAgICAgIGNvbnN0IG4gPSBJREJLZXlSYW5nZS5ib3VuZChbIHRoaXMudXNlcklkLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgXSwgWyB0aGlzLnVzZXJJZCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIF0pO1xuICAgICAgICByZXR1cm4gY28odCkuWCh7XG4gICAgICAgICAgICBpbmRleDogXCJ1c2VyTXV0YXRpb25zSW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBuXG4gICAgICAgIH0sICgodCwgbiwgcykgPT4ge1xuICAgICAgICAgICAgZSA9ICExLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICB9XG4gICAgYWRkTXV0YXRpb25CYXRjaCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSBhbyh0KSwgciA9IGNvKHQpO1xuICAgICAgICAvLyBUaGUgSW5kZXhlZERiIGltcGxlbWVudGF0aW9uIGluIENocm9tZSAoYW5kIEZpcmVmb3gpIGRvZXMgbm90IGhhbmRsZVxuICAgICAgICAvLyBjb21wb3VuZCBpbmRpY2VzIHRoYXQgaW5jbHVkZSBhdXRvLWdlbmVyYXRlZCBrZXlzIGNvcnJlY3RseS4gVG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgdGhlIGluZGV4IGVudHJ5IGlzIGFkZGVkIGNvcnJlY3RseSBpbiBhbGwgYnJvd3NlcnMsIHdlIHBlcmZvcm0gdHdvXG4gICAgICAgIC8vIHdyaXRlczogVGhlIGZpcnN0IHdyaXRlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIG5leHQgYXV0by1nZW5lcmF0ZWQgQmF0Y2hcbiAgICAgICAgLy8gSUQsIGFuZCB0aGUgc2Vjb25kIHdyaXRlIHBvcHVsYXRlcyB0aGUgaW5kZXggYW5kIHN0b3JlcyB0aGUgYWN0dWFsXG4gICAgICAgIC8vIG11dGF0aW9uIGJhdGNoLlxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTcwMTk3MlxuICAgICAgICAvLyBXZSB3cml0ZSBhbiBlbXB0eSBvYmplY3QgdG8gb2J0YWluIGtleVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gci5hZGQoe30pLm5leHQoKG8gPT4ge1xuICAgICAgICAgICAgRihcIm51bWJlclwiID09IHR5cGVvZiBvKTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgWnMobywgZSwgbiwgcyksIGMgPSBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG4uYmFzZU11dGF0aW9ucy5tYXAoKGUgPT4gamkodC5mZSwgZSkpKSwgaSA9IG4ubXV0YXRpb25zLm1hcCgoZSA9PiBqaSh0LmZlLCBlKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZDogZSxcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hJZDogbi5iYXRjaElkLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbFdyaXRlVGltZU1zOiBuLmxvY2FsV3JpdGVUaW1lLnRvTWlsbGlzKCksXG4gICAgICAgICAgICAgICAgICAgIGJhc2VNdXRhdGlvbnM6IHMsXG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uczogaVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHRoaXMuc2VyaWFsaXplciwgdGhpcy51c2VySWQsIHUpLCBhID0gW107XG4gICAgICAgICAgICBsZXQgaCA9IG5ldyBFZSgoKHQsIGUpID0+IGV0KHQuY2Fub25pY2FsU3RyaW5nKCksIGUuY2Fub25pY2FsU3RyaW5nKCkpKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB6dCh0aGlzLnVzZXJJZCwgdC5rZXkucGF0aCwgbyk7XG4gICAgICAgICAgICAgICAgaCA9IGguYWRkKHQua2V5LnBhdGgucG9wTGFzdCgpKSwgYS5wdXNoKHIucHV0KGMpKSwgYS5wdXNoKGkucHV0KGUsIFd0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaC5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgICAgICBhLnB1c2godGhpcy5pbmRleE1hbmFnZXIuYWRkVG9Db2xsZWN0aW9uUGFyZW50SW5kZXgodCwgZSkpO1xuICAgICAgICAgICAgfSkpLCB0LmFkZE9uQ29tbWl0dGVkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLlZuW29dID0gdS5rZXlzKCk7XG4gICAgICAgICAgICB9KSksIFJ0LndhaXRGb3IoYSkubmV4dCgoKCkgPT4gdSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkge1xuICAgICAgICByZXR1cm4gY28odCkuZ2V0KGUpLm5leHQoKHQgPT4gdCA/IChGKHQudXNlcklkID09PSB0aGlzLnVzZXJJZCksIF9yKHRoaXMuc2VyaWFsaXplciwgdCkpIDogbnVsbCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBrZXlzIGZvciB0aGUgbXV0YXRpb24gYmF0Y2ggd2l0aCB0aGUgZ2l2ZW4gYmF0Y2hJZC5cbiAgICAgKiBGb3IgcHJpbWFyeSBjbGllbnRzLCB0aGlzIG1ldGhvZCByZXR1cm5zIGBudWxsYCBhZnRlclxuICAgICAqIGByZW1vdmVNdXRhdGlvbkJhdGNoZXMoKWAgaGFzIGJlZW4gY2FsbGVkLiBTZWNvbmRhcnkgY2xpZW50cyByZXR1cm4gYVxuICAgICAqIGNhY2hlZCByZXN1bHQgdW50aWwgYHJlbW92ZUNhY2hlZE11dGF0aW9uS2V5cygpYCBpcyBpbnZva2VkLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgU24odCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5WbltlXSA/IFJ0LnJlc29sdmUodGhpcy5WbltlXSkgOiB0aGlzLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LmtleXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5WbltlXSA9IG4sIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXROZXh0TXV0YXRpb25CYXRjaEFmdGVyQmF0Y2hJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlICsgMSwgcyA9IElEQktleVJhbmdlLmxvd2VyQm91bmQoWyB0aGlzLnVzZXJJZCwgbiBdKTtcbiAgICAgICAgbGV0IGkgPSBudWxsO1xuICAgICAgICByZXR1cm4gY28odCkuWCh7XG4gICAgICAgICAgICBpbmRleDogXCJ1c2VyTXV0YXRpb25zSW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBzXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgZS51c2VySWQgPT09IHRoaXMudXNlcklkICYmIChGKGUuYmF0Y2hJZCA+PSBuKSwgaSA9IF9yKHRoaXMuc2VyaWFsaXplciwgZSkpLCBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFVuYWNrbm93bGVkZ2VkQmF0Y2hJZCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS51cHBlckJvdW5kKFsgdGhpcy51c2VySWQsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgbGV0IG4gPSAtMTtcbiAgICAgICAgcmV0dXJuIGNvKHQpLlgoe1xuICAgICAgICAgICAgaW5kZXg6IFwidXNlck11dGF0aW9uc0luZGV4XCIsXG4gICAgICAgICAgICByYW5nZTogZSxcbiAgICAgICAgICAgIHJldmVyc2U6ICEwXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgbiA9IGUuYmF0Y2hJZCwgcy5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBJREJLZXlSYW5nZS5ib3VuZChbIHRoaXMudXNlcklkLCAtMSBdLCBbIHRoaXMudXNlcklkLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgXSk7XG4gICAgICAgIHJldHVybiBjbyh0KS5qKFwidXNlck11dGF0aW9uc0luZGV4XCIsIGUpLm5leHQoKHQgPT4gdC5tYXAoKHQgPT4gX3IodGhpcy5zZXJpYWxpemVyLCB0KSkpKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ0RvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgLy8gU2NhbiB0aGUgZG9jdW1lbnQtbXV0YXRpb24gaW5kZXggc3RhcnRpbmcgd2l0aCBhIHByZWZpeCBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIHRoZSBnaXZlbiBkb2N1bWVudEtleS5cbiAgICAgICAgY29uc3QgbiA9IGp0KHRoaXMudXNlcklkLCBlLnBhdGgpLCBzID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChuKSwgaSA9IFtdO1xuICAgICAgICByZXR1cm4gYW8odCkuWCh7XG4gICAgICAgICAgICByYW5nZTogc1xuICAgICAgICB9LCAoKG4sIHMsIHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvLCB1LCBjXSA9IG4sIGEgPSBHdCh1KTtcbiAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgcm93cyBtYXRjaGluZyBleGFjdGx5IHRoZSBzcGVjaWZpYyBrZXkgb2ZcbiAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgIC8vIG9yZGVyIHRlcm1pbmF0b3JzIGJlZm9yZSBwYXRoIHNlcGFyYXRvcnMsIHdlJ2xsIGVuY291bnRlciBhbGxcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCByb3dzIGZvciBkb2N1bWVudEtleSBjb250aWd1b3VzbHkuIEluIHBhcnRpY3VsYXIsIGFsbFxuICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgLy8gZG9jdW1lbnRzIG5lc3RlZCBpbiBhIHN1YmNvbGxlY3Rpb24gYmVuZWF0aCBkb2N1bWVudEtleSBzbyB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN0b3AgYXMgc29vbiBhcyB3ZSBoaXQgYW55IHN1Y2ggcm93LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKGEpKSBcbiAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIG11dGF0aW9uIGJhdGNoIGluIHRoZSBzdG9yZS5cbiAgICAgICAgICAgIHJldHVybiBjbyh0KS5nZXQoYykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0KSB0aHJvdyBPKCk7XG4gICAgICAgICAgICAgICAgRih0LnVzZXJJZCA9PT0gdGhpcy51c2VySWQpLCBpLnB1c2goX3IodGhpcy5zZXJpYWxpemVyLCB0KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGkpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBuZXcgRWUoZXQpO1xuICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IGp0KHRoaXMudXNlcklkLCBlLnBhdGgpLCByID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChpKSwgbyA9IGFvKHQpLlgoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiByXG4gICAgICAgICAgICB9LCAoKHQsIHMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbciwgbywgdV0gPSB0LCBjID0gR3Qobyk7XG4gICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciByb3dzIG1hdGNoaW5nIGV4YWN0bHkgdGhlIHNwZWNpZmljIGtleSBvZlxuICAgICAgICAgICAgICAgIC8vIGludGVyZXN0LiBOb3RlIHRoYXQgYmVjYXVzZSB3ZSBvcmRlciBieSBwYXRoIGZpcnN0LCBhbmQgd2VcbiAgICAgICAgICAgICAgICAvLyBvcmRlciB0ZXJtaW5hdG9ycyBiZWZvcmUgcGF0aCBzZXBhcmF0b3JzLCB3ZSdsbCBlbmNvdW50ZXIgYWxsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IHJvd3MgZm9yIGRvY3VtZW50S2V5IGNvbnRpZ3VvdXNseS4gSW4gcGFydGljdWxhciwgYWxsXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJvd3MgZm9yIGRvY3VtZW50S2V5IHdpbGwgb2NjdXIgYmVmb3JlIGFueSByb3dzIGZvclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50cyBuZXN0ZWQgaW4gYSBzdWJjb2xsZWN0aW9uIGJlbmVhdGggZG9jdW1lbnRLZXkgc28gd2VcbiAgICAgICAgICAgICAgICAvLyBjYW4gc3RvcCBhcyBzb29uIGFzIHdlIGhpdCBhbnkgc3VjaCByb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPT09IHRoaXMudXNlcklkICYmIGUucGF0aC5pc0VxdWFsKGMpID8gbiA9IG4uYWRkKHUpIDogaS5kb25lKCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBzLnB1c2gobyk7XG4gICAgICAgIH0pKSwgUnQud2FpdEZvcihzKS5uZXh0KCgoKSA9PiB0aGlzLkRuKHQsIG4pKSk7XG4gICAgfVxuICAgIGdldEFsbE11dGF0aW9uQmF0Y2hlc0FmZmVjdGluZ1F1ZXJ5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUucGF0aCwgcyA9IG4ubGVuZ3RoICsgMSwgaSA9IGp0KHRoaXMudXNlcklkLCBuKSwgciA9IElEQktleVJhbmdlLmxvd2VyQm91bmQoaSk7XG4gICAgICAgIC8vIENvbGxlY3QgdXAgdW5pcXVlIGJhdGNoSURzIGVuY291bnRlcmVkIGR1cmluZyBhIHNjYW4gb2YgdGhlIGluZGV4LiBVc2UgYVxuICAgICAgICAvLyBTb3J0ZWRTZXQgdG8gYWNjdW11bGF0ZSBiYXRjaCBJRHMgc28gdGhleSBjYW4gYmUgdHJhdmVyc2VkIGluIG9yZGVyIGluIGFcbiAgICAgICAgLy8gc2NhbiBvZiB0aGUgbWFpbiB0YWJsZS5cbiAgICAgICAgbGV0IG8gPSBuZXcgRWUoZXQpO1xuICAgICAgICByZXR1cm4gYW8odCkuWCh7XG4gICAgICAgICAgICByYW5nZTogclxuICAgICAgICB9LCAoKHQsIGUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtyLCB1LCBjXSA9IHQsIGEgPSBHdCh1KTtcbiAgICAgICAgICAgIHIgPT09IHRoaXMudXNlcklkICYmIG4uaXNQcmVmaXhPZihhKSA/IFxuICAgICAgICAgICAgLy8gUm93cyB3aXRoIGRvY3VtZW50IGtleXMgbW9yZSB0aGFuIG9uZSBzZWdtZW50IGxvbmdlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gcXVlcnkgcGF0aCBjYW4ndCBiZSBtYXRjaGVzLiBGb3IgZXhhbXBsZSwgYSBxdWVyeSBvbiAncm9vbXMnXG4gICAgICAgICAgICAvLyBjYW4ndCBtYXRjaCB0aGUgZG9jdW1lbnQgL3Jvb21zL2FiYy9tZXNzYWdlcy94eXguXG4gICAgICAgICAgICAvLyBUT0RPKG1jZyk6IHdlJ2xsIG5lZWQgYSBkaWZmZXJlbnQgc2Nhbm5lciB3aGVuIHdlIGltcGxlbWVudFxuICAgICAgICAgICAgLy8gYW5jZXN0b3IgcXVlcmllcy5cbiAgICAgICAgICAgIGEubGVuZ3RoID09PSBzICYmIChvID0gby5hZGQoYykpIDogaS5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB0aGlzLkRuKHQsIG8pKSk7XG4gICAgfVxuICAgIERuKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtdLCBzID0gW107XG4gICAgICAgIC8vIFRPRE8ocm9ja3dvb2QpOiBJbXBsZW1lbnQgdGhpcyB1c2luZyBpdGVyYXRlLlxuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHMucHVzaChjbyh0KS5nZXQoZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHQpIHRocm93IE8oKTtcbiAgICAgICAgICAgICAgICBGKHQudXNlcklkID09PSB0aGlzLnVzZXJJZCksIG4ucHVzaChfcih0aGlzLnNlcmlhbGl6ZXIsIHQpKTtcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pKSwgUnQud2FpdEZvcihzKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIHJlbW92ZU11dGF0aW9uQmF0Y2godCwgZSkge1xuICAgICAgICByZXR1cm4gaW8odC5odCwgdGhpcy51c2VySWQsIGUpLm5leHQoKG4gPT4gKHQuYWRkT25Db21taXR0ZWRMaXN0ZW5lcigoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5DbihlLmJhdGNoSWQpO1xuICAgICAgICB9KSksIFJ0LmZvckVhY2gobiwgKGUgPT4gdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBlKSkpKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlZCBrZXlzIGZvciBhIG11dGF0aW9uIGJhdGNoLiBUaGlzIG1ldGhvZCBzaG91bGQgYmVcbiAgICAgKiBjYWxsZWQgYnkgc2Vjb25kYXJ5IGNsaWVudHMgYWZ0ZXIgdGhleSBwcm9jZXNzIG11dGF0aW9uIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgZnJvbSBwcmltYXJ5IGNsaWVudHMgYXNcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBlbnRyaWVzIGFyZSBjbGVhcmVkIHdoZW4gYW4gYWNrbm93bGVkZ2VkIG9yXG4gICAgICogcmVqZWN0ZWQgYmF0Y2ggaXMgcmVtb3ZlZCBmcm9tIHRoZSBtdXRhdGlvbiBxdWV1ZS5cbiAgICAgKi9cbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5XG4gICAgQ24odCkge1xuICAgICAgICBkZWxldGUgdGhpcy5Wblt0XTtcbiAgICB9XG4gICAgcGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0VtcHR5KHQpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFlKSByZXR1cm4gUnQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGVudHJpZXMgaW4gdGhlIGRvY3VtZW50TXV0YXRpb25zIGluZGV4IGlmXG4gICAgICAgICAgICAvLyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gSURCS2V5UmFuZ2UubG93ZXJCb3VuZChbIHRoaXMudXNlcklkIF0pO1xuICAgICAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIGFvKHQpLlgoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiBuXG4gICAgICAgICAgICB9LCAoKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodFswXSA9PT0gdGhpcy51c2VySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IEd0KHRbMV0pO1xuICAgICAgICAgICAgICAgICAgICBzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG4uZG9uZSgpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBGKDAgPT09IHMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB1byh0LCB0aGlzLnVzZXJJZCwgZSk7XG4gICAgfVxuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkgKHN0YXRlIGlzIGhlbGQgaW4gbWVtb3J5IGluIG90aGVyIGNsaWVudHMpLlxuICAgIC8qKiBSZXR1cm5zIHRoZSBtdXRhdGlvbiBxdWV1ZSdzIG1ldGFkYXRhIGZyb20gSW5kZXhlZERiLiAqL1xuICAgIHhuKHQpIHtcbiAgICAgICAgcmV0dXJuIGhvKHQpLmdldCh0aGlzLnVzZXJJZCkubmV4dCgodCA9PiB0IHx8IHtcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQsXG4gICAgICAgICAgICBsYXN0QWNrbm93bGVkZ2VkQmF0Y2hJZDogLTEsXG4gICAgICAgICAgICBsYXN0U3RyZWFtVG9rZW46IFwiXCJcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtdXRhdGlvbiBxdWV1ZSBmb3IgdGhlIGdpdmVuIHVzZXIgY29udGFpbnMgYSBwZW5kaW5nXG4gKiAgICAgICAgIG11dGF0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICovIGZ1bmN0aW9uIHVvKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0ganQoZSwgbi5wYXRoKSwgaSA9IHNbMV0sIHIgPSBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHMpO1xuICAgIGxldCBvID0gITE7XG4gICAgcmV0dXJuIGFvKHQpLlgoe1xuICAgICAgICByYW5nZTogcixcbiAgICAgICAgWTogITBcbiAgICB9LCAoKHQsIG4sIHMpID0+IHtcbiAgICAgICAgY29uc3QgW3IsIHUsIC8qYmF0Y2hJRCovIGNdID0gdDtcbiAgICAgICAgciA9PT0gZSAmJiB1ID09PSBpICYmIChvID0gITApLCBzLmRvbmUoKTtcbiAgICB9KSkubmV4dCgoKCkgPT4gbykpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGFueSBtdXRhdGlvbiBxdWV1ZSBjb250YWlucyB0aGUgZ2l2ZW4gZG9jdW1lbnQuICovXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgbXV0YXRpb25zIG9iamVjdCBzdG9yZS5cbiAqL1xuZnVuY3Rpb24gY28odCkge1xuICAgIHJldHVybiBfZSh0LCBcIm11dGF0aW9uc1wiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIG11dGF0aW9uUXVldWVzIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBhbyh0KSB7XG4gICAgcmV0dXJuIF9lKHQsIFwiZG9jdW1lbnRNdXRhdGlvbnNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSBtdXRhdGlvblF1ZXVlcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gaG8odCkge1xuICAgIHJldHVybiBfZSh0LCBcIm11dGF0aW9uUXVldWVzXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIE9mZnNldCB0byBlbnN1cmUgbm9uLW92ZXJsYXBwaW5nIHRhcmdldCBpZHMuICovXG4vKipcbiAqIEdlbmVyYXRlcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGFyZ2V0IElEcyBmb3Igc2VuZGluZyB0YXJnZXRzIHRvIHRoZVxuICogd2F0Y2ggc3RyZWFtLlxuICpcbiAqIFRoZSBjbGllbnQgY29uc3RydWN0cyB0d28gZ2VuZXJhdG9ycywgb25lIGZvciB0aGUgdGFyZ2V0IGNhY2hlLCBhbmQgb25lIGZvclxuICogZm9yIHRoZSBzeW5jIGVuZ2luZSAodG8gZ2VuZXJhdGUgbGltYm8gZG9jdW1lbnRzIHRhcmdldHMpLiBUaGVzZVxuICogZ2VuZXJhdG9ycyBwcm9kdWNlIG5vbi1vdmVybGFwcGluZyBJRHMgKGJ5IHVzaW5nIGV2ZW4gYW5kIG9kZCBJRHNcbiAqIHJlc3BlY3RpdmVseSkuXG4gKlxuICogQnkgc2VwYXJhdGluZyB0aGUgdGFyZ2V0IElEIHNwYWNlLCB0aGUgcXVlcnkgY2FjaGUgY2FuIGdlbmVyYXRlIHRhcmdldCBJRHNcbiAqIHRoYXQgcGVyc2lzdCBhY3Jvc3MgY2xpZW50IHJlc3RhcnRzLCB3aGlsZSBzeW5jIGVuZ2luZSBjYW4gaW5kZXBlbmRlbnRseVxuICogZ2VuZXJhdGUgaW4tbWVtb3J5IHRhcmdldCBJRHMgdGhhdCBhcmUgdHJhbnNpZW50IGFuZCBjYW4gYmUgcmV1c2VkIGFmdGVyIGFcbiAqIHJlc3RhcnQuXG4gKi9cbmNsYXNzIGxvIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuTm4gPSB0O1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ObiArPSAyLCB0aGlzLk5uO1xuICAgIH1cbiAgICBzdGF0aWMga24oKSB7XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgY2FjaGUgZ2VuZXJhdG9yIG11c3QgcmV0dXJuICcyJyBpbiBpdHMgZmlyc3QgY2FsbCB0byBgbmV4dCgpYFxuICAgICAgICAvLyBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbnRpYXRpb24gaW4gdGhlIHByb3RvY29sIGxheWVyIGJldHdlZW4gYW4gdW5zZXRcbiAgICAgICAgLy8gbnVtYmVyIGFuZCB0aGUgbnVtYmVyICcwJy4gSWYgd2Ugd2VyZSB0byBzZW50IGEgdGFyZ2V0IHdpdGggdGFyZ2V0IElEXG4gICAgICAgIC8vICcwJywgdGhlIGJhY2tlbmQgd291bGQgY29uc2lkZXIgaXQgdW5zZXQgYW5kIHJlcGxhY2UgaXQgd2l0aCBpdHMgb3duIElELlxuICAgICAgICByZXR1cm4gbmV3IGxvKDApO1xuICAgIH1cbiAgICBzdGF0aWMgTW4oKSB7XG4gICAgICAgIC8vIFN5bmMgZW5naW5lIGFzc2lnbnMgdGFyZ2V0IElEcyBmb3IgbGltYm8gZG9jdW1lbnQgZGV0ZWN0aW9uLlxuICAgICAgICByZXR1cm4gbmV3IGxvKC0xKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIGZvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSB0LCB0aGlzLnNlcmlhbGl6ZXIgPSBlO1xuICAgIH1cbiAgICAvLyBQT1JUSU5HIE5PVEU6IFdlIGRvbid0IGNhY2hlIGdsb2JhbCBtZXRhZGF0YSBmb3IgdGhlIHRhcmdldCBjYWNoZSwgc2luY2VcbiAgICAvLyBzb21lIG9mIGl0IChpbiBwYXJ0aWN1bGFyIGBoaWdoZXN0VGFyZ2V0SWRgKSBjYW4gYmUgbW9kaWZpZWQgYnkgc2Vjb25kYXJ5XG4gICAgLy8gdGFicy4gV2UgY291bGQgcGVyaGFwcyBiZSBtb3JlIGdyYW51bGFyIChhbmQgZS5nLiBzdGlsbCBjYWNoZVxuICAgIC8vIGBsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uYCBpbiBtZW1vcnkpIGJ1dCBmb3Igc2ltcGxpY2l0eSB3ZSBjdXJyZW50bHkgZ29cbiAgICAvLyB0byBJbmRleGVkRGIgd2hlbmV2ZXIgd2UgbmVlZCB0byByZWFkIG1ldGFkYXRhLiBXZSBjYW4gcmV2aXNpdCBpZiBpdCB0dXJuc1xuICAgIC8vIG91dCB0byBoYXZlIGEgbWVhbmluZ2Z1bCBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgYWxsb2NhdGVUYXJnZXRJZCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRuKHQpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBsbyhlLmhpZ2hlc3RUYXJnZXRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZS5oaWdoZXN0VGFyZ2V0SWQgPSBuLm5leHQoKSwgdGhpcy5Pbih0LCBlKS5uZXh0KCgoKSA9PiBlLmhpZ2hlc3RUYXJnZXRJZCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24odCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbih0KS5uZXh0KCh0ID0+IHJ0LmZyb21UaW1lc3RhbXAobmV3IGl0KHQubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbi5zZWNvbmRzLCB0Lmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24ubmFub3NlY29uZHMpKSkpO1xuICAgIH1cbiAgICBnZXRIaWdoZXN0U2VxdWVuY2VOdW1iZXIodCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kbih0KS5uZXh0KCh0ID0+IHQuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyKSk7XG4gICAgfVxuICAgIHNldFRhcmdldHNNZXRhZGF0YSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRuKHQpLm5leHQoKHMgPT4gKHMuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyID0gZSwgbiAmJiAocy5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uID0gbi50b1RpbWVzdGFtcCgpKSwgXG4gICAgICAgIGUgPiBzLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciAmJiAocy5oaWdoZXN0TGlzdGVuU2VxdWVuY2VOdW1iZXIgPSBlKSwgdGhpcy5Pbih0LCBzKSkpKTtcbiAgICB9XG4gICAgYWRkVGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZuKHQsIGUpLm5leHQoKCgpID0+IHRoaXMuJG4odCkubmV4dCgobiA9PiAobi50YXJnZXRDb3VudCArPSAxLCB0aGlzLkJuKGUsIG4pLCBcbiAgICAgICAgdGhpcy5Pbih0LCBuKSkpKSkpO1xuICAgIH1cbiAgICB1cGRhdGVUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuRm4odCwgZSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCgoKSA9PiB3byh0KS5kZWxldGUoZS50YXJnZXRJZCkpKS5uZXh0KCgoKSA9PiB0aGlzLiRuKHQpKSkubmV4dCgoZSA9PiAoRihlLnRhcmdldENvdW50ID4gMCksIFxuICAgICAgICBlLnRhcmdldENvdW50IC09IDEsIHRoaXMuT24odCwgZSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3BzIGFueSB0YXJnZXRzIHdpdGggc2VxdWVuY2UgbnVtYmVyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdXBwZXIgYm91bmQsIGV4Y2VwdGluZyB0aG9zZVxuICAgICAqIHByZXNlbnQgaW4gYGFjdGl2ZVRhcmdldElkc2AuIERvY3VtZW50IGFzc29jaWF0aW9ucyBmb3IgdGhlIHJlbW92ZWQgdGFyZ2V0cyBhcmUgYWxzbyByZW1vdmVkLlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0YXJnZXRzIHJlbW92ZWQuXG4gICAgICovICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgIGNvbnN0IGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHdvKHQpLlgoKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1ID0gbXIobyk7XG4gICAgICAgICAgICB1LnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQodS50YXJnZXRJZCkgJiYgKHMrKywgaS5wdXNoKHRoaXMucmVtb3ZlVGFyZ2V0RGF0YSh0LCB1KSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gUnQud2FpdEZvcihpKSkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiB3aXRoIGVhY2ggYFRhcmdldERhdGFgIHRoYXQgd2UgaGF2ZSBjYWNoZWQuXG4gICAgICovICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICByZXR1cm4gd28odCkuWCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBtcihuKTtcbiAgICAgICAgICAgIGUocyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgJG4odCkge1xuICAgICAgICByZXR1cm4gX28odCkuZ2V0KFwidGFyZ2V0R2xvYmFsS2V5XCIpLm5leHQoKHQgPT4gKEYobnVsbCAhPT0gdCksIHQpKSk7XG4gICAgfVxuICAgIE9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIF9vKHQpLnB1dChcInRhcmdldEdsb2JhbEtleVwiLCBlKTtcbiAgICB9XG4gICAgRm4odCwgZSkge1xuICAgICAgICByZXR1cm4gd28odCkucHV0KGdyKHRoaXMuc2VyaWFsaXplciwgZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbi1wbGFjZSB1cGRhdGVzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSB0byBhY2NvdW50IGZvciB2YWx1ZXMgaW4gdGhlIGdpdmVuXG4gICAgICogVGFyZ2V0RGF0YS4gU2F2aW5nIGlzIGRvbmUgc2VwYXJhdGVseS4gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdlcmUgYW55XG4gICAgICogY2hhbmdlcyB0byB0aGUgbWV0YWRhdGEuXG4gICAgICovICAgIEJuKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSAhMTtcbiAgICAgICAgcmV0dXJuIHQudGFyZ2V0SWQgPiBlLmhpZ2hlc3RUYXJnZXRJZCAmJiAoZS5oaWdoZXN0VGFyZ2V0SWQgPSB0LnRhcmdldElkLCBuID0gITApLCBcbiAgICAgICAgdC5zZXF1ZW5jZU51bWJlciA+IGUuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyICYmIChlLmhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlciA9IHQuc2VxdWVuY2VOdW1iZXIsIFxuICAgICAgICBuID0gITApLCBuO1xuICAgIH1cbiAgICBnZXRUYXJnZXRDb3VudCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRuKHQpLm5leHQoKHQgPT4gdC50YXJnZXRDb3VudCkpO1xuICAgIH1cbiAgICBnZXRUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgLy8gSXRlcmF0aW5nIGJ5IHRoZSBjYW5vbmljYWxJZCBtYXkgeWllbGQgbW9yZSB0aGFuIG9uZSByZXN1bHQgYmVjYXVzZVxuICAgICAgICAvLyBjYW5vbmljYWxJZCB2YWx1ZXMgYXJlIG5vdCByZXF1aXJlZCB0byBiZSB1bmlxdWUgcGVyIHRhcmdldC4gVGhpcyBxdWVyeVxuICAgICAgICAvLyBkZXBlbmRzIG9uIHRoZSBxdWVyeVRhcmdldHMgaW5kZXggdG8gYmUgZWZmaWNpZW50LlxuICAgICAgICBjb25zdCBuID0gJG4oZSksIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIG4sIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSBdLCBbIG4sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSBdKTtcbiAgICAgICAgbGV0IGkgPSBudWxsO1xuICAgICAgICByZXR1cm4gd28odCkuWCh7XG4gICAgICAgICAgICByYW5nZTogcyxcbiAgICAgICAgICAgIGluZGV4OiBcInF1ZXJ5VGFyZ2V0c0luZGV4XCJcbiAgICAgICAgfSwgKCh0LCBuLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gbXIobik7XG4gICAgICAgICAgICAvLyBBZnRlciBmaW5kaW5nIGEgcG90ZW50aWFsIG1hdGNoLCBjaGVjayB0aGF0IHRoZSB0YXJnZXQgaXNcbiAgICAgICAgICAgIC8vIGFjdHVhbGx5IGVxdWFsIHRvIHRoZSByZXF1ZXN0ZWQgdGFyZ2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgT24oZSwgci50YXJnZXQpICYmIChpID0gciwgcy5kb25lKCkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gaSkpO1xuICAgIH1cbiAgICBhZGRNYXRjaGluZ0tleXModCwgZSwgbikge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFRoZSByZXZlcnNlIGluZGV4IChkb2N1bWVudHNUYXJnZXRzKSBpcyBtYWludGFpbmVkIGJ5XG4gICAgICAgIC8vIEluZGV4ZWREYi5cbiAgICAgICAgY29uc3QgcyA9IFtdLCBpID0gbW8odCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IHF0KGUucGF0aCk7XG4gICAgICAgICAgICBzLnB1c2goaS5wdXQoe1xuICAgICAgICAgICAgICAgIHRhcmdldElkOiBuLFxuICAgICAgICAgICAgICAgIHBhdGg6IHJcbiAgICAgICAgICAgIH0pKSwgcy5wdXNoKHRoaXMucmVmZXJlbmNlRGVsZWdhdGUuYWRkUmVmZXJlbmNlKHQsIG4sIGUpKTtcbiAgICAgICAgfSkpLCBSdC53YWl0Rm9yKHMpO1xuICAgIH1cbiAgICByZW1vdmVNYXRjaGluZ0tleXModCwgZSwgbikge1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IFRoZSByZXZlcnNlIGluZGV4IChkb2N1bWVudHNUYXJnZXRzKSBpcyBtYWludGFpbmVkIGJ5XG4gICAgICAgIC8vIEluZGV4ZWREYi5cbiAgICAgICAgY29uc3QgcyA9IG1vKHQpO1xuICAgICAgICByZXR1cm4gUnQuZm9yRWFjaChlLCAoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gcXQoZS5wYXRoKTtcbiAgICAgICAgICAgIHJldHVybiBSdC53YWl0Rm9yKFsgcy5kZWxldGUoWyBuLCBpIF0pLCB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLnJlbW92ZVJlZmVyZW5jZSh0LCBuLCBlKSBdKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBtbyh0KSwgcyA9IElEQktleVJhbmdlLmJvdW5kKFsgZSBdLCBbIGUgKyAxIF0sIFxuICAgICAgICAvKmxvd2VyT3Blbj0qLyAhMSwgXG4gICAgICAgIC8qdXBwZXJPcGVuPSovICEwKTtcbiAgICAgICAgcmV0dXJuIG4uZGVsZXRlKHMpO1xuICAgIH1cbiAgICBnZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBJREJLZXlSYW5nZS5ib3VuZChbIGUgXSwgWyBlICsgMSBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCksIHMgPSBtbyh0KTtcbiAgICAgICAgbGV0IGkgPSBncygpO1xuICAgICAgICByZXR1cm4gcy5YKHtcbiAgICAgICAgICAgIHJhbmdlOiBuLFxuICAgICAgICAgICAgWTogITBcbiAgICAgICAgfSwgKCh0LCBlLCBuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gR3QodFsxXSksIHIgPSBuZXcgaHQocyk7XG4gICAgICAgICAgICBpID0gaS5hZGQocik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIGNvbnRhaW5zS2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHF0KGUucGF0aCksIHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIG4gXSwgWyBzdChuKSBdLCBcbiAgICAgICAgLypsb3dlck9wZW49Ki8gITEsIFxuICAgICAgICAvKnVwcGVyT3Blbj0qLyAhMCk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgcmV0dXJuIG1vKHQpLlgoe1xuICAgICAgICAgICAgaW5kZXg6IFwiZG9jdW1lbnRUYXJnZXRzSW5kZXhcIixcbiAgICAgICAgICAgIFk6ICEwLFxuICAgICAgICAgICAgcmFuZ2U6IHNcbiAgICAgICAgfSwgKChbdCwgZV0sIG4sIHMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhdmluZyBhIHNlbnRpbmVsIHJvdyBmb3IgYSBkb2N1bWVudCBkb2VzIG5vdCBjb3VudCBhcyBjb250YWluaW5nIHRoYXQgZG9jdW1lbnQ7XG4gICAgICAgICAgICAvLyBGb3IgdGhlIHRhcmdldCBjYWNoZSwgY29udGFpbmluZyB0aGUgZG9jdW1lbnQgbWVhbnMgdGhlIGRvY3VtZW50IGlzIHBhcnQgb2Ygc29tZVxuICAgICAgICAgICAgLy8gdGFyZ2V0LlxuICAgICAgICAgICAgMCAhPT0gdCAmJiAoaSsrLCBzLmRvbmUoKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb29rcyB1cCBhIFRhcmdldERhdGEgZW50cnkgYnkgdGFyZ2V0IElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldElkIC0gVGhlIHRhcmdldCBJRCBvZiB0aGUgVGFyZ2V0RGF0YSBlbnRyeSB0byBsb29rIHVwLlxuICAgICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgVGFyZ2V0RGF0YSBlbnRyeSwgb3IgbnVsbCBpZiB0aGUgY2FjaGUgaGFzIG5vIGVudHJ5IGZvclxuICAgICAqIHRoZSB0YXJnZXQuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICBsZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB3byh0KS5nZXQoZSkubmV4dCgodCA9PiB0ID8gbXIodCkgOiBudWxsKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcXVlcmllcyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gd28odCkge1xuICAgIHJldHVybiBfZSh0LCBcInRhcmdldHNcIik7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGdldCBhIHR5cGVkIFNpbXBsZURiU3RvcmUgZm9yIHRoZSB0YXJnZXQgZ2xvYmFscyBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gX28odCkge1xuICAgIHJldHVybiBfZSh0LCBcInRhcmdldEdsb2JhbFwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGRvY3VtZW50IHRhcmdldCBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gbW8odCkge1xuICAgIHJldHVybiBfZSh0LCBcInRhcmdldERvY3VtZW50c1wiKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gZ28oW3QsIGVdLCBbbiwgc10pIHtcbiAgICBjb25zdCBpID0gZXQodCwgbik7XG4gICAgcmV0dXJuIDAgPT09IGkgPyBldChlLCBzKSA6IGk7XG59XG5cbi8qKlxuICogVXNlZCB0byBjYWxjdWxhdGUgdGhlIG50aCBzZXF1ZW5jZSBudW1iZXIuIEtlZXBzIGEgcm9sbGluZyBidWZmZXIgb2YgdGhlXG4gKiBsb3dlc3QgbiB2YWx1ZXMgcGFzc2VkIHRvIGBhZGRFbGVtZW50YCwgYW5kIGZpbmFsbHkgcmVwb3J0cyB0aGUgbGFyZ2VzdCBvZlxuICogdGhlbSBpbiBgbWF4VmFsdWVgLlxuICovIGNsYXNzIHlvIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuTG4gPSB0LCB0aGlzLmJ1ZmZlciA9IG5ldyBFZShnbyksIHRoaXMucW4gPSAwO1xuICAgIH1cbiAgICBVbigpIHtcbiAgICAgICAgcmV0dXJuICsrdGhpcy5xbjtcbiAgICB9XG4gICAgS24odCkge1xuICAgICAgICBjb25zdCBlID0gWyB0LCB0aGlzLlVuKCkgXTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyLnNpemUgPCB0aGlzLkxuKSB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLmFkZChlKTsgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5idWZmZXIubGFzdCgpO1xuICAgICAgICAgICAgZ28oZSwgdCkgPCAwICYmICh0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLmRlbGV0ZSh0KS5hZGQoZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgLy8gR3VhcmFudGVlZCB0byBiZSBub24tZW1wdHkuIElmIHdlIGRlY2lkZSB3ZSBhcmUgbm90IGNvbGxlY3RpbmcgYW55XG4gICAgICAgIC8vIHNlcXVlbmNlIG51bWJlcnMsIG50aFNlcXVlbmNlTnVtYmVyIGJlbG93IHNob3J0LWNpcmN1aXRzLiBJZiB3ZSBoYXZlXG4gICAgICAgIC8vIGRlY2lkZWQgdGhhdCB3ZSBhcmUgY29sbGVjdGluZyBuIHNlcXVlbmNlIG51bWJlcnMsIGl0J3MgYmVjYXVzZSBuIGlzIHNvbWVcbiAgICAgICAgLy8gcGVyY2VudGFnZSBvZiB0aGUgZXhpc3Rpbmcgc2VxdWVuY2UgbnVtYmVycy4gVGhhdCBtZWFucyB3ZSBzaG91bGQgbmV2ZXJcbiAgICAgICAgLy8gYmUgaW4gYSBzaXR1YXRpb24gd2hlcmUgd2UgYXJlIGNvbGxlY3Rpbmcgc2VxdWVuY2UgbnVtYmVycyBidXQgZG9uJ3RcbiAgICAgICAgLy8gYWN0dWFsbHkgaGF2ZSBhbnkuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sYXN0KClbMF07XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBzY2hlZHVsaW5nIG9mIExSVSBnYXJiYWdlIGNvbGxlY3Rpb24uIEl0IGhhbmRsZXMgY2hlY2tpbmdcbiAqIHdoZXRoZXIgb3Igbm90IEdDIGlzIGVuYWJsZWQsIGFzIHdlbGwgYXMgd2hpY2ggZGVsYXkgdG8gdXNlIGJlZm9yZSB0aGUgbmV4dCBydW4uXG4gKi8gY2xhc3MgcG8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5nYXJiYWdlQ29sbGVjdG9yID0gdCwgdGhpcy5hc3luY1F1ZXVlID0gZSwgdGhpcy5sb2NhbFN0b3JlID0gbiwgdGhpcy5HbiA9IG51bGw7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICAtMSAhPT0gdGhpcy5nYXJiYWdlQ29sbGVjdG9yLnBhcmFtcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkICYmIHRoaXMuUW4oNmU0KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5HbiAmJiAodGhpcy5Hbi5jYW5jZWwoKSwgdGhpcy5HbiA9IG51bGwpO1xuICAgIH1cbiAgICBnZXQgc3RhcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuR247XG4gICAgfVxuICAgIFFuKHQpIHtcbiAgICAgICAgTihcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYEdhcmJhZ2UgY29sbGVjdGlvbiBzY2hlZHVsZWQgaW4gJHt0fW1zYCksIHRoaXMuR24gPSB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFmdGVyRGVsYXkoXCJscnVfZ2FyYmFnZV9jb2xsZWN0aW9uXCIgLyogVGltZXJJZC5McnVHYXJiYWdlQ29sbGVjdGlvbiAqLyAsIHQsIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLkduID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2NhbFN0b3JlLmNvbGxlY3RHYXJiYWdlKHRoaXMuZ2FyYmFnZUNvbGxlY3Rvcik7XG4gICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgRHQodCkgPyBOKFwiTHJ1R2FyYmFnZUNvbGxlY3RvclwiLCBcIklnbm9yaW5nIEluZGV4ZWREQiBlcnJvciBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uOiBcIiwgdCkgOiBhd2FpdCB2dCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuUW4oM2U1KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHRoZSBzdGVwcyBmb3IgTFJVIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqLyBjbGFzcyBJbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmpuID0gdCwgdGhpcy5wYXJhbXMgPSBlO1xuICAgIH1cbiAgICBjYWxjdWxhdGVUYXJnZXRDb3VudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpuLnpuKHQpLm5leHQoKHQgPT4gTWF0aC5mbG9vcihlIC8gMTAwICogdCkpKTtcbiAgICB9XG4gICAgbnRoU2VxdWVuY2VOdW1iZXIodCwgZSkge1xuICAgICAgICBpZiAoMCA9PT0gZSkgcmV0dXJuIFJ0LnJlc29sdmUoT3QuY3QpO1xuICAgICAgICBjb25zdCBuID0gbmV3IHlvKGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5qbi5mb3JFYWNoVGFyZ2V0KHQsICh0ID0+IG4uS24odC5zZXF1ZW5jZU51bWJlcikpKS5uZXh0KCgoKSA9PiB0aGlzLmpuLlduKHQsICh0ID0+IG4uS24odCkpKSkpLm5leHQoKCgpID0+IG4ubWF4VmFsdWUpKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpuLnJlbW92ZVRhcmdldHModCwgZSwgbik7XG4gICAgfVxuICAgIHJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam4ucmVtb3ZlT3JwaGFuZWREb2N1bWVudHModCwgZSk7XG4gICAgfVxuICAgIGNvbGxlY3QodCwgZSkge1xuICAgICAgICByZXR1cm4gLTEgPT09IHRoaXMucGFyYW1zLmNhY2hlU2l6ZUNvbGxlY3Rpb25UaHJlc2hvbGQgPyAoTihcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgXCJHYXJiYWdlIGNvbGxlY3Rpb24gc2tpcHBlZDsgZGlzYWJsZWRcIiksIFxuICAgICAgICBSdC5yZXNvbHZlKG5vKSkgOiB0aGlzLmdldENhY2hlU2l6ZSh0KS5uZXh0KChuID0+IG4gPCB0aGlzLnBhcmFtcy5jYWNoZVNpemVDb2xsZWN0aW9uVGhyZXNob2xkID8gKE4oXCJMcnVHYXJiYWdlQ29sbGVjdG9yXCIsIGBHYXJiYWdlIGNvbGxlY3Rpb24gc2tpcHBlZDsgQ2FjaGUgc2l6ZSAke259IGlzIGxvd2VyIHRoYW4gdGhyZXNob2xkICR7dGhpcy5wYXJhbXMuY2FjaGVTaXplQ29sbGVjdGlvblRocmVzaG9sZH1gKSwgXG4gICAgICAgIG5vKSA6IHRoaXMuSG4odCwgZSkpKTtcbiAgICB9XG4gICAgZ2V0Q2FjaGVTaXplKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam4uZ2V0Q2FjaGVTaXplKHQpO1xuICAgIH1cbiAgICBIbih0LCBlKSB7XG4gICAgICAgIGxldCBuLCBzLCBpLCByLCBvLCBjLCBhO1xuICAgICAgICBjb25zdCBoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlVGFyZ2V0Q291bnQodCwgdGhpcy5wYXJhbXMucGVyY2VudGlsZVRvQ29sbGVjdCkubmV4dCgoZSA9PiAoXG4gICAgICAgIC8vIENhcCBhdCB0aGUgY29uZmlndXJlZCBtYXhcbiAgICAgICAgZSA+IHRoaXMucGFyYW1zLm1heGltdW1TZXF1ZW5jZU51bWJlcnNUb0NvbGxlY3QgPyAoTihcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYENhcHBpbmcgc2VxdWVuY2UgbnVtYmVycyB0byBjb2xsZWN0IGRvd24gdG8gdGhlIG1heGltdW0gb2YgJHt0aGlzLnBhcmFtcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0fSBmcm9tICR7ZX1gKSwgXG4gICAgICAgIHMgPSB0aGlzLnBhcmFtcy5tYXhpbXVtU2VxdWVuY2VOdW1iZXJzVG9Db2xsZWN0KSA6IHMgPSBlLCByID0gRGF0ZS5ub3coKSwgdGhpcy5udGhTZXF1ZW5jZU51bWJlcih0LCBzKSkpKS5uZXh0KChzID0+IChuID0gcywgXG4gICAgICAgIG8gPSBEYXRlLm5vdygpLCB0aGlzLnJlbW92ZVRhcmdldHModCwgbiwgZSkpKSkubmV4dCgoZSA9PiAoaSA9IGUsIGMgPSBEYXRlLm5vdygpLCBcbiAgICAgICAgdGhpcy5yZW1vdmVPcnBoYW5lZERvY3VtZW50cyh0LCBuKSkpKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGlmIChhID0gRGF0ZS5ub3coKSwgQygpIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgICAgICAgICAgICAgTihcIkxydUdhcmJhZ2VDb2xsZWN0b3JcIiwgYExSVSBHYXJiYWdlIENvbGxlY3Rpb25cXG5cXHRDb3VudGVkIHRhcmdldHMgaW4gJHtyIC0gaH1tc1xcblxcdERldGVybWluZWQgbGVhc3QgcmVjZW50bHkgdXNlZCAke3N9IGluIGAgKyAobyAtIHIpICsgXCJtc1xcblwiICsgYFxcdFJlbW92ZWQgJHtpfSB0YXJnZXRzIGluIGAgKyAoYyAtIG8pICsgXCJtc1xcblwiICsgYFxcdFJlbW92ZWQgJHt0fSBkb2N1bWVudHMgaW4gYCArIChhIC0gYykgKyBcIm1zXFxuXCIgKyBgVG90YWwgRHVyYXRpb246ICR7YSAtIGh9bXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSdC5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBkaWRSdW46ICEwLFxuICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyc0NvbGxlY3RlZDogcyxcbiAgICAgICAgICAgICAgICB0YXJnZXRzUmVtb3ZlZDogaSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudHNSZW1vdmVkOiB0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gVG8odCwgZSkge1xuICAgIHJldHVybiBuZXcgSW8odCwgZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogUHJvdmlkZXMgTFJVIGZ1bmN0aW9uYWxpdHkgZm9yIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS4gKi8gY2xhc3MgRW8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5kYiA9IHQsIHRoaXMuZ2FyYmFnZUNvbGxlY3RvciA9IFRvKHRoaXMsIGUpO1xuICAgIH1cbiAgICB6bih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkpuKHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLmdldFRhcmdldENvdW50KHQpLm5leHQoKHQgPT4gZS5uZXh0KChlID0+IHQgKyBlKSkpKTtcbiAgICB9XG4gICAgSm4odCkge1xuICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLlduKHQsICh0ID0+IHtcbiAgICAgICAgICAgIGUrKztcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUpKTtcbiAgICB9XG4gICAgZm9yRWFjaFRhcmdldCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkuZm9yRWFjaFRhcmdldCh0LCBlKTtcbiAgICB9XG4gICAgV24odCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Zbih0LCAoKHQsIG4pID0+IGUobikpKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIEFvKHQsIG4pO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gQW8odCwgbik7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldHModCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5kYi5nZXRUYXJnZXRDYWNoZSgpLnJlbW92ZVRhcmdldHModCwgZSwgbik7XG4gICAgfVxuICAgIG1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIEFvKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd291bGQgcHJldmVudCB0aGlzIGRvY3VtZW50IGZyb20gYmVpbmcgZ2FyYmFnZVxuICAgICAqIGNvbGxlY3RlZCwgZ2l2ZW4gdGhhdCB0aGUgZG9jdW1lbnQgaW4gcXVlc3Rpb24gaXMgbm90IHByZXNlbnQgaW4gYW55XG4gICAgICogdGFyZ2V0cyBhbmQgaGFzIGEgc2VxdWVuY2UgbnVtYmVyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdXBwZXIgYm91bmQgZm9yXG4gICAgICogdGhlIGNvbGxlY3Rpb24gcnVuLlxuICAgICAqLyAgICBYbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBsZXQgbiA9ICExO1xuICAgICAgICAgICAgcmV0dXJuIGhvKHQpLlooKHMgPT4gdW8odCwgcywgZSkubmV4dCgodCA9PiAodCAmJiAobiA9ICEwKSwgUnQucmVzb2x2ZSghdCkpKSkpKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgICAgIH0odCwgZSk7XG4gICAgfVxuICAgIHJlbW92ZU9ycGhhbmVkRG9jdW1lbnRzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuZGIuZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpLm5ld0NoYW5nZUJ1ZmZlcigpLCBzID0gW107XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuWW4odCwgKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBpZiAobyA8PSBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuWG4odCwgcikubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZSkgXG4gICAgICAgICAgICAgICAgICAgIC8vIE91ciBzaXplIGFjY291bnRpbmcgcmVxdWlyZXMgdXMgdG8gcmVhZCBhbGwgZG9jdW1lbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmluZyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSsrLCBuLmdldEVudHJ5KHQsIHIpLm5leHQoKCgpID0+IChuLnJlbW92ZUVudHJ5KHIsIHJ0Lm1pbigpKSwgbW8odCkuZGVsZXRlKFsgMCwgcXQoci5wYXRoKSBdKSkpKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcy5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkubmV4dCgoKCkgPT4gUnQud2FpdEZvcihzKSkpLm5leHQoKCgpID0+IG4uYXBwbHkodCkpKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLndpdGhTZXF1ZW5jZU51bWJlcih0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFRhcmdldENhY2hlKCkudXBkYXRlVGFyZ2V0RGF0YSh0LCBuKTtcbiAgICB9XG4gICAgdXBkYXRlTGltYm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiBBbyh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBwcm92aWRlZCBmdW5jdGlvbiBmb3IgZWFjaCBkb2N1bWVudCBpbiB0aGUgY2FjaGUgdGhhdCBpcyAnb3JwaGFuZWQnLiBPcnBoYW5lZFxuICAgICAqIG1lYW5zIG5vdCBhIHBhcnQgb2YgYW55IHRhcmdldCwgc28gdGhlIG9ubHkgZW50cnkgaW4gdGhlIHRhcmdldC1kb2N1bWVudCBpbmRleCBmb3JcbiAgICAgKiB0aGF0IGRvY3VtZW50IHdpbGwgYmUgdGhlIHNlbnRpbmVsIHJvdyAodGFyZ2V0SWQgMCksIHdoaWNoIHdpbGwgYWxzbyBoYXZlIHRoZSBzZXF1ZW5jZVxuICAgICAqIG51bWJlciBmb3IgdGhlIGxhc3QgdGltZSB0aGUgZG9jdW1lbnQgd2FzIGFjY2Vzc2VkLlxuICAgICAqLyAgICBZbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBtbyh0KTtcbiAgICAgICAgbGV0IHMsIGkgPSBPdC5jdDtcbiAgICAgICAgcmV0dXJuIG4uWCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudFRhcmdldHNJbmRleFwiXG4gICAgICAgIH0sICgoW3QsIG5dLCB7cGF0aDogciwgc2VxdWVuY2VOdW1iZXI6IG99KSA9PiB7XG4gICAgICAgICAgICAwID09PSB0ID8gKFxuICAgICAgICAgICAgLy8gaWYgbmV4dFRvUmVwb3J0IGlzIHZhbGlkLCByZXBvcnQgaXQsIHRoaXMgaXMgYSBuZXcga2V5IHNvIHRoZVxuICAgICAgICAgICAgLy8gbGFzdCBvbmUgbXVzdCBub3QgYmUgYSBtZW1iZXIgb2YgYW55IHRhcmdldHMuXG4gICAgICAgICAgICBpICE9PSBPdC5jdCAmJiBlKG5ldyBodChHdChzKSksIGkpLCBcbiAgICAgICAgICAgIC8vIHNldCBuZXh0VG9SZXBvcnQgdG8gYmUgdGhpcyBzZXF1ZW5jZSBudW1iZXIuIEl0J3MgdGhlIG5leHQgb25lIHdlXG4gICAgICAgICAgICAvLyBtaWdodCByZXBvcnQsIGlmIHdlIGRvbid0IGZpbmQgYW55IHRhcmdldHMgZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHNlcXVlbmNlIG51bWJlciBtdXN0IGJlIGRlZmluZWQgd2hlbiB0aGUgdGFyZ2V0SWRcbiAgICAgICAgICAgIC8vIGlzIDAuXG4gICAgICAgICAgICBpID0gbywgcyA9IHIpIDogXG4gICAgICAgICAgICAvLyBzZXQgbmV4dFRvUmVwb3J0IHRvIGJlIGludmFsaWQsIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byByZXBvcnRcbiAgICAgICAgICAgIC8vIHRoaXMgb25lIHNpbmNlIHdlIGZvdW5kIGEgdGFyZ2V0IGZvciBpdC5cbiAgICAgICAgICAgIGkgPSBPdC5jdDtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJlcG9ydCBzZXF1ZW5jZSBudW1iZXJzIGFmdGVyIGdldHRpbmcgdG8gdGhlIG5leHQga2V5LCB3ZVxuICAgICAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpZiB0aGUgbGFzdCBrZXkgd2UgaXRlcmF0ZWQgb3ZlciB3YXMgYW4gb3JwaGFuZWRcbiAgICAgICAgICAgIC8vIGRvY3VtZW50IGFuZCByZXBvcnQgaXQuXG4gICAgICAgICAgICBpICE9PSBPdC5jdCAmJiBlKG5ldyBodChHdChzKSksIGkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldENhY2hlU2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5nZXRTaXplKHQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gQW8odCwgZSkge1xuICAgIHJldHVybiBtbyh0KS5wdXQoXG4gICAgLyoqXG4gKiBAcmV0dXJucyBBIHZhbHVlIHN1aXRhYmxlIGZvciB3cml0aW5nIGEgc2VudGluZWwgcm93IGluIHRoZSB0YXJnZXQtZG9jdW1lbnRcbiAqIHN0b3JlLlxuICovXG4gICAgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFyZ2V0SWQ6IDAsXG4gICAgICAgICAgICBwYXRoOiBxdCh0LnBhdGgpLFxuICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IGVcbiAgICAgICAgfTtcbiAgICB9KGUsIHQuY3VycmVudFNlcXVlbmNlTnVtYmVyKSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGluLW1lbW9yeSBidWZmZXIgb2YgZW50cmllcyB0byBiZSB3cml0dGVuIHRvIGEgUmVtb3RlRG9jdW1lbnRDYWNoZS5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIGJhdGNoIHVwIGEgc2V0IG9mIGNoYW5nZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2FjaGUsIGJ1dFxuICogYWRkaXRpb25hbGx5IHN1cHBvcnRzIHJlYWRpbmcgZW50cmllcyBiYWNrIHdpdGggdGhlIGBnZXRFbnRyeSgpYCBtZXRob2QsXG4gKiBmYWxsaW5nIGJhY2sgdG8gdGhlIHVuZGVybHlpbmcgUmVtb3RlRG9jdW1lbnRDYWNoZSBpZiBubyBlbnRyeSBpc1xuICogYnVmZmVyZWQuXG4gKlxuICogRW50cmllcyBhZGRlZCB0byB0aGUgY2FjaGUgKm11c3QqIGJlIHJlYWQgZmlyc3QuIFRoaXMgaXMgdG8gZmFjaWxpdGF0ZVxuICogY2FsY3VsYXRpbmcgdGhlIHNpemUgZGVsdGEgb2YgdGhlIHBlbmRpbmcgY2hhbmdlcy5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IFRoaXMgY2xhc3Mgd2FzIGltcGxlbWVudGVkIHRoZW4gcmVtb3ZlZCBmcm9tIG90aGVyIHBsYXRmb3Jtcy5cbiAqIElmIGJ5dGUtY291bnRpbmcgZW5kcyB1cCBiZWluZyBuZWVkZWQgb24gdGhlIG90aGVyIHBsYXRmb3JtcywgY29uc2lkZXJcbiAqIHBvcnRpbmcgdGhpcyBjbGFzcyBhcyBwYXJ0IG9mIHRoYXQgaW1wbGVtZW50YXRpb24gd29yay5cbiAqLyBjbGFzcyB2byB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIEEgbWFwcGluZyBvZiBkb2N1bWVudCBrZXkgdG8gdGhlIG5ldyBjYWNoZSBlbnRyeSB0aGF0IHNob3VsZCBiZSB3cml0dGVuLlxuICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgb3MoKHQgPT4gdC50b1N0cmluZygpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKSwgdGhpcy5jaGFuZ2VzQXBwbGllZCA9ICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWZmZXJzIGEgYFJlbW90ZURvY3VtZW50Q2FjaGUuYWRkRW50cnkoKWAgY2FsbC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb25seSBtb2RpZnkgZG9jdW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkIHZpYVxuICAgICAqIGBnZXRFbnRyeSgpL2dldEVudHJpZXMoKWAgKGVuZm9yY2VkIHZpYSBJbmRleGVkRGJzIGBhcHBseSgpYCkuXG4gICAgICovICAgIGFkZEVudHJ5KHQpIHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RBcHBsaWVkKCksIHRoaXMuY2hhbmdlcy5zZXQodC5rZXksIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWZmZXJzIGEgYFJlbW90ZURvY3VtZW50Q2FjaGUucmVtb3ZlRW50cnkoKWAgY2FsbC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb25seSByZW1vdmUgZG9jdW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkIHZpYVxuICAgICAqIGBnZXRFbnRyeSgpL2dldEVudHJpZXMoKWAgKGVuZm9yY2VkIHZpYSBJbmRleGVkRGJzIGBhcHBseSgpYCkuXG4gICAgICovICAgIHJlbW92ZUVudHJ5KHQsIGUpIHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RBcHBsaWVkKCksIHRoaXMuY2hhbmdlcy5zZXQodCwgYW4ubmV3SW52YWxpZERvY3VtZW50KHQpLnNldFJlYWRUaW1lKGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgYW4gZW50cnkgaW4gdGhlIGNhY2hlLiBUaGUgYnVmZmVyZWQgY2hhbmdlcyB3aWxsIGZpcnN0IGJlIGNoZWNrZWQsXG4gICAgICogYW5kIGlmIG5vIGJ1ZmZlcmVkIGNoYW5nZSBhcHBsaWVzLCB0aGlzIHdpbGwgZm9yd2FyZCB0b1xuICAgICAqIGBSZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJ5KClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIHBlcmZvcm0gYW55IHBlcnNpc3RlbmNlXG4gICAgICogICAgIG9wZXJhdGlvbnMuXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5IC0gVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIGRvY3VtZW50IG9yIGFuIGludmFsaWQgZG9jdW1lbnQgaWYgd2UgaGF2ZSBub3RoaW5nXG4gICAgICogY2FjaGVkLlxuICAgICAqLyAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QXBwbGllZCgpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5jaGFuZ2VzLmdldChlKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gbiA/IFJ0LnJlc29sdmUobikgOiB0aGlzLmdldEZyb21DYWNoZSh0LCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgc2V2ZXJhbCBlbnRyaWVzIGluIHRoZSBjYWNoZSwgZm9yd2FyZGluZyB0b1xuICAgICAqIGBSZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJ5KClgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRvIHBlcmZvcm0gYW55IHBlcnNpc3RlbmNlXG4gICAgICogICAgIG9wZXJhdGlvbnMuXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBlbnRyaWVzIHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgQSBtYXAgb2YgY2FjaGVkIGRvY3VtZW50cywgaW5kZXhlZCBieSBrZXkuIElmIGFuIGVudHJ5IGNhbm5vdCBiZVxuICAgICAqICAgICBmb3VuZCwgdGhlIGNvcnJlc3BvbmRpbmcga2V5IHdpbGwgYmUgbWFwcGVkIHRvIGFuIGludmFsaWQgZG9jdW1lbnQuXG4gICAgICovICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxGcm9tQ2FjaGUodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYnVmZmVyZWQgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBSZW1vdGVEb2N1bWVudENhY2hlLCB1c2luZ1xuICAgICAqIHRoZSBwcm92aWRlZCB0cmFuc2FjdGlvbi5cbiAgICAgKi8gICAgYXBwbHkodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnROb3RBcHBsaWVkKCksIHRoaXMuY2hhbmdlc0FwcGxpZWQgPSAhMCwgdGhpcy5hcHBseUNoYW5nZXModCk7XG4gICAgfVxuICAgIC8qKiBIZWxwZXIgdG8gYXNzZXJ0IHRoaXMuY2hhbmdlcyBpcyBub3QgbnVsbCAgKi8gICAgYXNzZXJ0Tm90QXBwbGllZCgpIHt9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoZSBSZW1vdGVEb2N1bWVudENhY2hlIGZvciBJbmRleGVkRGIuIFRvIGNvbnN0cnVjdCwgaW52b2tlXG4gKiBgbmV3SW5kZXhlZERiUmVtb3RlRG9jdW1lbnRDYWNoZSgpYC5cbiAqLyBjbGFzcyBSbyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0O1xuICAgIH1cbiAgICBzZXRJbmRleE1hbmFnZXIodCkge1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHN1cHBsaWVkIGVudHJpZXMgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQWxsIGNhbGxzIG9mIGBhZGRFbnRyeWAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYCB0byBlbnN1cmUgcHJvcGVyIGFjY291bnRpbmcgb2YgbWV0YWRhdGEuXG4gICAgICovICAgIGFkZEVudHJ5KHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIFNvKHQpLnB1dChuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGRvY3VtZW50IGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQWxsIGNhbGxzIG9mIGByZW1vdmVFbnRyeWAgIGFyZSByZXF1aXJlZCB0byBnbyB0aHJvdWdoIHRoZSBSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlclxuICAgICAqIHJldHVybmVkIGJ5IGBuZXdDaGFuZ2VCdWZmZXIoKWAgdG8gZW5zdXJlIHByb3BlciBhY2NvdW50aW5nIG9mIG1ldGFkYXRhLlxuICAgICAqLyAgICByZW1vdmVFbnRyeSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBTbyh0KS5kZWxldGUoXG4gICAgICAgIC8qKlxuICogUmV0dXJucyBhIGtleSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkb2N1bWVudCBsb29rdXBzIHZpYSB0aGUgcHJpbWFyeSBrZXkgb2ZcbiAqIHRoZSBEYlJlbW90ZURvY3VtZW50IG9iamVjdCBzdG9yZS5cbiAqL1xuICAgICAgICBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5wYXRoLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIHJldHVybiBbIFxuICAgICAgICAgICAgLyogcHJlZml4IHBhdGggKi8gbi5zbGljZSgwLCBuLmxlbmd0aCAtIDIpLCBcbiAgICAgICAgICAgIC8qIGNvbGxlY3Rpb24gaWQgKi8gbltuLmxlbmd0aCAtIDJdLCBmcihlKSwgXG4gICAgICAgICAgICAvKiBkb2N1bWVudCBpZCAqLyBuW24ubGVuZ3RoIC0gMV0gXTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJldHVybnMgYSBrZXkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZG9jdW1lbnQgbG9va3VwcyBvbiB0aGVcbiAqIGBEYlJlbW90ZURvY3VtZW50RG9jdW1lbnRDb2xsZWN0aW9uR3JvdXBJbmRleGAgaW5kZXguXG4gKi8gKGUsIG4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCBjYWNoZSBzaXplLlxuICAgICAqXG4gICAgICogQ2FsbGVycyB0byBgYWRkRW50cnkoKWAgYW5kIGByZW1vdmVFbnRyeSgpYCAqbXVzdCogY2FsbCB0aGlzIGFmdGVyd2FyZHMgdG8gdXBkYXRlIHRoZVxuICAgICAqIGNhY2hlJ3MgbWV0YWRhdGEuXG4gICAgICovICAgIHVwZGF0ZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGEodCkubmV4dCgobiA9PiAobi5ieXRlU2l6ZSArPSBlLCB0aGlzLlpuKHQsIG4pKSkpO1xuICAgIH1cbiAgICBnZXRFbnRyeSh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gYW4ubmV3SW52YWxpZERvY3VtZW50KGUpO1xuICAgICAgICByZXR1cm4gU28odCkuWCh7XG4gICAgICAgICAgICBpbmRleDogXCJkb2N1bWVudEtleUluZGV4XCIsXG4gICAgICAgICAgICByYW5nZTogSURCS2V5UmFuZ2Uub25seShEbyhlKSlcbiAgICAgICAgfSwgKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBuID0gdGhpcy50cyhlLCBzKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9va3MgdXAgYW4gZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50S2V5IC0gVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIGRvY3VtZW50IGVudHJ5IGFuZCBpdHMgc2l6ZS5cbiAgICAgKi8gICAgZXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IHtcbiAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICBkb2N1bWVudDogYW4ubmV3SW52YWxpZERvY3VtZW50KGUpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBTbyh0KS5YKHtcbiAgICAgICAgICAgIGluZGV4OiBcImRvY3VtZW50S2V5SW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBJREJLZXlSYW5nZS5vbmx5KERvKGUpKVxuICAgICAgICB9LCAoKHQsIHMpID0+IHtcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQ6IHRoaXMudHMoZSwgcyksXG4gICAgICAgICAgICAgICAgc2l6ZTogcm8ocylcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIGdldEVudHJpZXModCwgZSkge1xuICAgICAgICBsZXQgbiA9IGNzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5zKHQsIGUsICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMudHModCwgZSk7XG4gICAgICAgICAgICBuID0gbi5pbnNlcnQodCwgcyk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHNldmVyYWwgZW50cmllcyBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRLZXlzIC0gVGhlIHNldCBvZiBrZXlzIGVudHJpZXMgdG8gbG9vayB1cC5cbiAgICAgKiBAcmV0dXJucyBBIG1hcCBvZiBkb2N1bWVudHMgaW5kZXhlZCBieSBrZXkgYW5kIGEgbWFwIG9mIHNpemVzIGluZGV4ZWQgYnlcbiAgICAgKiAgICAga2V5ICh6ZXJvIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBleGlzdCkuXG4gICAgICovICAgIHNzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBjcygpLCBzID0gbmV3IHBlKGh0LmNvbXBhcmF0b3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5ucyh0LCBlLCAoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnRzKHQsIGUpO1xuICAgICAgICAgICAgbiA9IG4uaW5zZXJ0KHQsIGkpLCBzID0gcy5pbnNlcnQodCwgcm8oZSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gKHtcbiAgICAgICAgICAgIGRvY3VtZW50czogbixcbiAgICAgICAgICAgIHJzOiBzXG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIG5zKHQsIGUsIG4pIHtcbiAgICAgICAgaWYgKGUuaXNFbXB0eSgpKSByZXR1cm4gUnQucmVzb2x2ZSgpO1xuICAgICAgICBsZXQgcyA9IG5ldyBFZSh4byk7XG4gICAgICAgIGUuZm9yRWFjaCgodCA9PiBzID0gcy5hZGQodCkpKTtcbiAgICAgICAgY29uc3QgaSA9IElEQktleVJhbmdlLmJvdW5kKERvKHMuZmlyc3QoKSksIERvKHMubGFzdCgpKSksIHIgPSBzLmdldEl0ZXJhdG9yKCk7XG4gICAgICAgIGxldCBvID0gci5nZXROZXh0KCk7XG4gICAgICAgIHJldHVybiBTbyh0KS5YKHtcbiAgICAgICAgICAgIGluZGV4OiBcImRvY3VtZW50S2V5SW5kZXhcIixcbiAgICAgICAgICAgIHJhbmdlOiBpXG4gICAgICAgIH0sICgodCwgZSwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IGh0LmZyb21TZWdtZW50cyhbIC4uLmUucHJlZml4UGF0aCwgZS5jb2xsZWN0aW9uR3JvdXAsIGUuZG9jdW1lbnRJZCBdKTtcbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2gga2V5cyBub3QgZm91bmQgaW4gY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDtvICYmIHhvKG8sIGkpIDwgMDsgKSBuKG8sIG51bGwpLCBvID0gci5nZXROZXh0KCk7XG4gICAgICAgICAgICBvICYmIG8uaXNFcXVhbChpKSAmJiAoXG4gICAgICAgICAgICAvLyBLZXkgZm91bmQgaW4gY2FjaGUuXG4gICAgICAgICAgICBuKG8sIGUpLCBvID0gci5oYXNOZXh0KCkgPyByLmdldE5leHQoKSA6IG51bGwpLCBcbiAgICAgICAgICAgIC8vIFNraXAgdG8gdGhlIG5leHQga2V5IChpZiB0aGVyZSBpcyBvbmUpLlxuICAgICAgICAgICAgbyA/IHMuRyhEbyhvKSkgOiBzLmRvbmUoKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSBrZXlzIGFyZSBub3QgaW4gdGhlIGNhY2hlLiBPbmUgY2FzZSB3aGVyZSBgaXRlcmF0ZWBcbiAgICAgICAgICAgIC8vIGFib3ZlIHdvbid0IGdvIHRocm91Z2ggdGhlbSBpcyB3aGVuIHRoZSBjYWNoZSBpcyBlbXB0eS5cbiAgICAgICAgICAgIGZvciAoO287ICkgbihvLCBudWxsKSwgbyA9IHIuaGFzTmV4dCgpID8gci5nZXROZXh0KCkgOiBudWxsO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gZS5wYXRoLCByID0gWyBpLnBvcExhc3QoKS50b0FycmF5KCksIGkubGFzdFNlZ21lbnQoKSwgZnIobi5yZWFkVGltZSksIG4uZG9jdW1lbnRLZXkucGF0aC5pc0VtcHR5KCkgPyBcIlwiIDogbi5kb2N1bWVudEtleS5wYXRoLmxhc3RTZWdtZW50KCkgXSwgbyA9IFsgaS5wb3BMYXN0KCkudG9BcnJheSgpLCBpLmxhc3RTZWdtZW50KCksIFsgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIF0sIFwiXCIgXTtcbiAgICAgICAgcmV0dXJuIFNvKHQpLmooSURCS2V5UmFuZ2UuYm91bmQociwgbywgITApKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGxldCBuID0gY3MoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMudHMoaHQuZnJvbVNlZ21lbnRzKGkucHJlZml4UGF0aC5jb25jYXQoaS5jb2xsZWN0aW9uR3JvdXAsIGkuZG9jdW1lbnRJZCkpLCBpKTtcbiAgICAgICAgICAgICAgICB0LmlzRm91bmREb2N1bWVudCgpICYmIChucyhlLCB0KSB8fCBzLmhhcyh0LmtleSkpICYmIChcbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgdGhlIGRvY3VtZW50IG1hdGNoZXMgdGhlIGdpdmVuIHF1ZXJ5LCBvciBpdCBpcyBtdXRhdGVkLlxuICAgICAgICAgICAgICAgIG4gPSBuLmluc2VydCh0LmtleSwgdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgZ2V0QWxsRnJvbUNvbGxlY3Rpb25Hcm91cCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGxldCBpID0gY3MoKTtcbiAgICAgICAgY29uc3QgciA9IENvKGUsIG4pLCBvID0gQ28oZSwgSXQubWF4KCkpO1xuICAgICAgICByZXR1cm4gU28odCkuWCh7XG4gICAgICAgICAgICBpbmRleDogXCJjb2xsZWN0aW9uR3JvdXBJbmRleFwiLFxuICAgICAgICAgICAgcmFuZ2U6IElEQktleVJhbmdlLmJvdW5kKHIsIG8sICEwKVxuICAgICAgICB9LCAoKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLnRzKGh0LmZyb21TZWdtZW50cyhlLnByZWZpeFBhdGguY29uY2F0KGUuY29sbGVjdGlvbkdyb3VwLCBlLmRvY3VtZW50SWQpKSwgZSk7XG4gICAgICAgICAgICBpID0gaS5pbnNlcnQoci5rZXksIHIpLCBpLnNpemUgPT09IHMgJiYgbi5kb25lKCk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSk7XG4gICAgfVxuICAgIG5ld0NoYW5nZUJ1ZmZlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYm8odGhpcywgISF0ICYmIHQudHJhY2tSZW1vdmFscyk7XG4gICAgfVxuICAgIGdldFNpemUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRhZGF0YSh0KS5uZXh0KCh0ID0+IHQuYnl0ZVNpemUpKTtcbiAgICB9XG4gICAgZ2V0TWV0YWRhdGEodCkge1xuICAgICAgICByZXR1cm4gVm8odCkuZ2V0KFwicmVtb3RlRG9jdW1lbnRHbG9iYWxLZXlcIikubmV4dCgodCA9PiAoRighIXQpLCB0KSkpO1xuICAgIH1cbiAgICBabih0LCBlKSB7XG4gICAgICAgIHJldHVybiBWbyh0KS5wdXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjb2RlcyBgZGJSZW1vdGVEb2NgIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCAob3IgYW4gaW52YWxpZCBkb2N1bWVudCBpZlxuICAgICAqIHRoZSBkb2N1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgZm9ybWF0IHVzZWQgZm9yIHNlbnRpbmVsIGRlbGV0ZXMpLlxuICAgICAqLyAgICB0cyh0LCBlKSB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gaHIodGhpcy5zZXJpYWxpemVyLCBlKTtcbiAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGEgc2VudGluZWwgcmVtb3ZhbCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0aGVcbiAgICAgICAgICAgIC8vIGBnZXROZXdEb2N1bWVudENoYW5nZXMoKWBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQuaXNOb0RvY3VtZW50KCkgJiYgdC52ZXJzaW9uLmlzRXF1YWwocnQubWluKCkpKSkgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuLm5ld0ludmFsaWREb2N1bWVudCh0KTtcbiAgICB9XG59XG5cbi8qKiBDcmVhdGVzIGEgbmV3IEluZGV4ZWREYlJlbW90ZURvY3VtZW50Q2FjaGUuICovIGZ1bmN0aW9uIFBvKHQpIHtcbiAgICByZXR1cm4gbmV3IFJvKHQpO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGRldGFpbHMgb2YgYWRkaW5nIGFuZCB1cGRhdGluZyBkb2N1bWVudHMgaW4gdGhlIEluZGV4ZWREYlJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKlxuICogVW5saWtlIHRoZSBNZW1vcnlSZW1vdGVEb2N1bWVudENoYW5nZUJ1ZmZlciwgdGhlIEluZGV4ZWREYiBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGUgc2l6ZVxuICogZGVsdGEgZm9yIGFsbCBzdWJtaXR0ZWQgY2hhbmdlcy4gVGhpcyBhdm9pZHMgaGF2aW5nIHRvIHJlLXJlYWQgYWxsIGRvY3VtZW50cyBmcm9tIEluZGV4ZWREYlxuICogd2hlbiB3ZSBhcHBseSB0aGUgY2hhbmdlcy5cbiAqLyBjbGFzcyBibyBleHRlbmRzIHZvIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRDYWNoZSAtIFRoZSBJbmRleGVkRGJSZW1vdGVEb2N1bWVudENhY2hlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvLlxuICAgICAqIEBwYXJhbSB0cmFja1JlbW92YWxzIC0gV2hldGhlciB0byBjcmVhdGUgc2VudGluZWwgZGVsZXRlcyB0aGF0IGNhbiBiZSB0cmFja2VkIGJ5XG4gICAgICogYGdldE5ld0RvY3VtZW50Q2hhbmdlcygpYC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMub3MgPSB0LCB0aGlzLnRyYWNrUmVtb3ZhbHMgPSBlLCBcbiAgICAgICAgLy8gQSBtYXAgb2YgZG9jdW1lbnQgc2l6ZXMgYW5kIHJlYWQgdGltZXMgcHJpb3IgdG8gYXBwbHlpbmcgdGhlIGNoYW5nZXMgaW5cbiAgICAgICAgLy8gdGhpcyBidWZmZXIuXG4gICAgICAgIHRoaXMudXMgPSBuZXcgb3MoKHQgPT4gdC50b1N0cmluZygpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKTtcbiAgICB9XG4gICAgYXBwbHlDaGFuZ2VzKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBsZXQgbiA9IDAsIHMgPSBuZXcgRWUoKCh0LCBlKSA9PiBldCh0LmNhbm9uaWNhbFN0cmluZygpLCBlLmNhbm9uaWNhbFN0cmluZygpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VzLmZvckVhY2goKChpLCByKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gdGhpcy51cy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoZS5wdXNoKHRoaXMub3MucmVtb3ZlRW50cnkodCwgaSwgby5yZWFkVGltZSkpLCByLmlzVmFsaWREb2N1bWVudCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdSA9IGxyKHRoaXMub3Muc2VyaWFsaXplciwgcik7XG4gICAgICAgICAgICAgICAgcyA9IHMuYWRkKGkucGF0aC5wb3BMYXN0KCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBybyh1KTtcbiAgICAgICAgICAgICAgICBuICs9IGMgLSBvLnNpemUsIGUucHVzaCh0aGlzLm9zLmFkZEVudHJ5KHQsIGksIHUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobiAtPSBvLnNpemUsIHRoaXMudHJhY2tSZW1vdmFscykge1xuICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHRyYWNrIHJlbW92YWxzLCB3ZSBzdG9yZSBhIFwic2VudGluZWwgZGVsZXRlXCIgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gUmVtb3RlRG9jdW1lbnRDYWNoZS4gVGhpcyBlbnRyeSBpcyByZXByZXNlbnRlZCBieSBhIE5vRG9jdW1lbnRcbiAgICAgICAgICAgICAgICAvLyB3aXRoIGEgdmVyc2lvbiBvZiAwIGFuZCBpZ25vcmVkIGJ5IGBtYXliZURlY29kZURvY3VtZW50KClgIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlZCBpbiBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBscih0aGlzLm9zLnNlcmlhbGl6ZXIsIHIuY29udmVydFRvTm9Eb2N1bWVudChydC5taW4oKSkpO1xuICAgICAgICAgICAgICAgIGUucHVzaCh0aGlzLm9zLmFkZEVudHJ5KHQsIGksIG4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCBzLmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgZS5wdXNoKHRoaXMub3MuaW5kZXhNYW5hZ2VyLmFkZFRvQ29sbGVjdGlvblBhcmVudEluZGV4KHQsIG4pKTtcbiAgICAgICAgfSkpLCBlLnB1c2godGhpcy5vcy51cGRhdGVNZXRhZGF0YSh0LCBuKSksIFJ0LndhaXRGb3IoZSk7XG4gICAgfVxuICAgIGdldEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgc2l6ZSBvZiBldmVyeXRoaW5nIHdlIGxvYWQgZnJvbSB0aGUgY2FjaGUgc28gd2UgY2FuIGNvbXB1dGUgYSBkZWx0YSBsYXRlci5cbiAgICAgICAgcmV0dXJuIHRoaXMub3MuZXModCwgZSkubmV4dCgodCA9PiAodGhpcy51cy5zZXQoZSwge1xuICAgICAgICAgICAgc2l6ZTogdC5zaXplLFxuICAgICAgICAgICAgcmVhZFRpbWU6IHQuZG9jdW1lbnQucmVhZFRpbWVcbiAgICAgICAgfSksIHQuZG9jdW1lbnQpKSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgc2l6ZSBvZiBldmVyeXRoaW5nIHdlIGxvYWQgZnJvbSB0aGUgY2FjaGUgc28gd2UgY2FuIGNvbXB1dGVcbiAgICAgICAgLy8gYSBkZWx0YSBsYXRlci5cbiAgICAgICAgcmV0dXJuIHRoaXMub3Muc3ModCwgZSkubmV4dCgoKHtkb2N1bWVudHM6IHQsIHJzOiBlfSkgPT4gKFxuICAgICAgICAvLyBOb3RlOiBgZ2V0QWxsRnJvbUNhY2hlYCByZXR1cm5zIHR3byBtYXBzIGluc3RlYWQgb2YgYSBzaW5nbGUgbWFwIGZyb21cbiAgICAgICAgLy8ga2V5cyB0byBgRG9jdW1lbnRTaXplRW50cnlgcy4gVGhpcyBpcyB0byBhbGxvdyByZXR1cm5pbmcgdGhlXG4gICAgICAgIC8vIGBNdXRhYmxlRG9jdW1lbnRNYXBgIGRpcmVjdGx5LCB3aXRob3V0IGEgY29udmVyc2lvbi5cbiAgICAgICAgZS5mb3JFYWNoKCgoZSwgbikgPT4ge1xuICAgICAgICAgICAgdGhpcy51cy5zZXQoZSwge1xuICAgICAgICAgICAgICAgIHNpemU6IG4sXG4gICAgICAgICAgICAgICAgcmVhZFRpbWU6IHQuZ2V0KGUpLnJlYWRUaW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpLCB0KSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gVm8odCkge1xuICAgIHJldHVybiBfZSh0LCBcInJlbW90ZURvY3VtZW50R2xvYmFsXCIpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcmVtb3RlRG9jdW1lbnRzIG9iamVjdCBzdG9yZS5cbiAqLyBmdW5jdGlvbiBTbyh0KSB7XG4gICAgcmV0dXJuIF9lKHQsIFwicmVtb3RlRG9jdW1lbnRzVjE0XCIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBrZXkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZG9jdW1lbnQgbG9va3VwcyBvbiB0aGVcbiAqIGBEYlJlbW90ZURvY3VtZW50RG9jdW1lbnRLZXlJbmRleGAgaW5kZXguXG4gKi8gZnVuY3Rpb24gRG8odCkge1xuICAgIGNvbnN0IGUgPSB0LnBhdGgudG9BcnJheSgpO1xuICAgIHJldHVybiBbIFxuICAgIC8qIHByZWZpeCBwYXRoICovIGUuc2xpY2UoMCwgZS5sZW5ndGggLSAyKSwgXG4gICAgLyogY29sbGVjdGlvbiBpZCAqLyBlW2UubGVuZ3RoIC0gMl0sIFxuICAgIC8qIGRvY3VtZW50IGlkICovIGVbZS5sZW5ndGggLSAxXSBdO1xufVxuXG5mdW5jdGlvbiBDbyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGUuZG9jdW1lbnRLZXkucGF0aC50b0FycmF5KCk7XG4gICAgcmV0dXJuIFsgXG4gICAgLyogY29sbGVjdGlvbiBpZCAqLyB0LCBmcihlLnJlYWRUaW1lKSwgXG4gICAgLyogcHJlZml4IHBhdGggKi8gbi5zbGljZSgwLCBuLmxlbmd0aCAtIDIpLCBcbiAgICAvKiBkb2N1bWVudCBpZCAqLyBuLmxlbmd0aCA+IDAgPyBuW24ubGVuZ3RoIC0gMV0gOiBcIlwiIF07XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciB0aGF0IGNvbXBhcmVzIGRvY3VtZW50IGtleXMgYWNjb3JkaW5nIHRvIHRoZSBwcmltYXJ5IGtleSBzb3J0aW5nXG4gKiB1c2VkIGJ5IHRoZSBgRGJSZW1vdGVEb2N1bWVudERvY3VtZW50YCBzdG9yZSAoYnkgcHJlZml4IHBhdGgsIGNvbGxlY3Rpb24gaWRcbiAqIGFuZCB0aGVuIGRvY3VtZW50IElEKS5cbiAqXG4gKiBWaXNpYmxlIGZvciB0ZXN0aW5nLlxuICovIGZ1bmN0aW9uIHhvKHQsIGUpIHtcbiAgICBjb25zdCBuID0gdC5wYXRoLnRvQXJyYXkoKSwgcyA9IGUucGF0aC50b0FycmF5KCk7XG4gICAgLy8gVGhlIG9yZGVyaW5nIGlzIGJhc2VkIG9uIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9ibGluay8rL2ZlNWMyMWZlZjk0ZGFlNzFjMWMzMzQ0Nzc1YjhkOGE3ZjdlNmQ5ZWMvU291cmNlL21vZHVsZXMvaW5kZXhlZGRiL0lEQktleS5jcHAjNzRcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCBuLmxlbmd0aCAtIDIgJiYgdCA8IHMubGVuZ3RoIC0gMjsgKyt0KSBpZiAoaSA9IGV0KG5bdF0sIHNbdF0pLCBcbiAgICBpKSByZXR1cm4gaTtcbiAgICByZXR1cm4gaSA9IGV0KG4ubGVuZ3RoLCBzLmxlbmd0aCksIGkgfHwgKGkgPSBldChuW24ubGVuZ3RoIC0gMl0sIHNbcy5sZW5ndGggLSAyXSksIFxuICAgIGkgfHwgZXQobltuLmxlbmd0aCAtIDFdLCBzW3MubGVuZ3RoIC0gMV0pKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogU2NoZW1hIFZlcnNpb24gZm9yIHRoZSBXZWIgY2xpZW50OlxuICogMS4gIEluaXRpYWwgdmVyc2lvbiBpbmNsdWRpbmcgTXV0YXRpb24gUXVldWUsIFF1ZXJ5IENhY2hlLCBhbmQgUmVtb3RlXG4gKiAgICAgRG9jdW1lbnQgQ2FjaGVcbiAqIDIuICBVc2VkIHRvIGVuc3VyZSBhIHRhcmdldEdsb2JhbCBvYmplY3QgZXhpc3RzIGFuZCBhZGQgdGFyZ2V0Q291bnQgdG8gaXQuIE5vXG4gKiAgICAgbG9uZ2VyIHJlcXVpcmVkIGJlY2F1c2UgbWlncmF0aW9uIDMgdW5jb25kaXRpb25hbGx5IGNsZWFycyBpdC5cbiAqIDMuICBEcm9wcGVkIGFuZCByZS1jcmVhdGVkIFF1ZXJ5IENhY2hlIHRvIGRlYWwgd2l0aCBjYWNoZSBjb3JydXB0aW9uIHJlbGF0ZWRcbiAqICAgICB0byBsaW1ibyByZXNvbHV0aW9uLiBBZGRyZXNzZXNcbiAqICAgICBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtaW9zLXNkay9pc3N1ZXMvMTU0OFxuICogNC4gIE11bHRpLVRhYiBTdXBwb3J0LlxuICogNS4gIFJlbW92YWwgb2YgaGVsZCB3cml0ZSBhY2tzLlxuICogNi4gIENyZWF0ZSBkb2N1bWVudCBnbG9iYWwgZm9yIHRyYWNraW5nIGRvY3VtZW50IGNhY2hlIHNpemUuXG4gKiA3LiAgRW5zdXJlIGV2ZXJ5IGNhY2hlZCBkb2N1bWVudCBoYXMgYSBzZW50aW5lbCByb3cgd2l0aCBhIHNlcXVlbmNlIG51bWJlci5cbiAqIDguICBBZGQgY29sbGVjdGlvbi1wYXJlbnQgaW5kZXggZm9yIENvbGxlY3Rpb24gR3JvdXAgcXVlcmllcy5cbiAqIDkuICBDaGFuZ2UgUmVtb3RlRG9jdW1lbnRDaGFuZ2VzIHN0b3JlIHRvIGJlIGtleWVkIGJ5IHJlYWRUaW1lIHJhdGhlciB0aGFuXG4gKiAgICAgYW4gYXV0by1pbmNyZW1lbnRpbmcgSUQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIEluZGV4LUZyZWUgcXVlcmllcy5cbiAqIDEwLiBSZXdyaXRlIHRoZSBjYW5vbmljYWwgSURzIHRvIHRoZSBleHBsaWNpdCBQcm90b2J1Zi1iYXNlZCBmb3JtYXQuXG4gKiAxMS4gQWRkIGJ1bmRsZXMgYW5kIG5hbWVkX3F1ZXJpZXMgZm9yIGJ1bmRsZSBzdXBwb3J0LlxuICogMTIuIEFkZCBkb2N1bWVudCBvdmVybGF5cy5cbiAqIDEzLiBSZXdyaXRlIHRoZSBrZXlzIG9mIHRoZSByZW1vdGUgZG9jdW1lbnQgY2FjaGUgdG8gYWxsb3cgZm9yIGVmZmljaWVudFxuICogICAgIGRvY3VtZW50IGxvb2t1cCB2aWEgYGdldEFsbCgpYC5cbiAqIDE0LiBBZGQgb3ZlcmxheXMuXG4gKiAxNS4gQWRkIGluZGV4aW5nIHN1cHBvcnQuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2NhbCB2aWV3IChvdmVybGF5KSBvZiBhIGRvY3VtZW50LCBhbmQgdGhlIGZpZWxkcyB0aGF0IGFyZVxuICogbG9jYWxseSBtdXRhdGVkLlxuICovXG5jbGFzcyBObyB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkcyB0aGF0IGFyZSBsb2NhbGx5IG11dGF0ZWQgYnkgcGF0Y2ggbXV0YXRpb25zLlxuICAgICAqXG4gICAgICogSWYgdGhlIG92ZXJsYXllZFx0ZG9jdW1lbnQgaXMgZnJvbSBzZXQgb3IgZGVsZXRlIG11dGF0aW9ucywgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogSWYgdGhlcmUgaXMgbm8gb3ZlcmxheSAobXV0YXRpb24pIGZvciB0aGUgZG9jdW1lbnQsIHRoaXMgaXMgYW4gZW1wdHkgYEZpZWxkTWFza2AuXG4gICAgICovXG4gICAgZSkge1xuICAgICAgICB0aGlzLm92ZXJsYXllZERvY3VtZW50ID0gdCwgdGhpcy5tdXRhdGVkRmllbGRzID0gZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgcmVhZG9ubHkgdmlldyBvZiB0aGUgbG9jYWwgc3RhdGUgb2YgYWxsIGRvY3VtZW50cyB3ZSdyZSB0cmFja2luZyAoaS5lLiB3ZVxuICogaGF2ZSBhIGNhY2hlZCB2ZXJzaW9uIGluIHJlbW90ZURvY3VtZW50Q2FjaGUgb3IgbG9jYWwgbXV0YXRpb25zIGZvciB0aGVcbiAqIGRvY3VtZW50KS4gVGhlIHZpZXcgaXMgY29tcHV0ZWQgYnkgYXBwbHlpbmcgdGhlIG11dGF0aW9ucyBpbiB0aGVcbiAqIE11dGF0aW9uUXVldWUgdG8gdGhlIFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKi8gY2xhc3Mga28ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5yZW1vdGVEb2N1bWVudENhY2hlID0gdCwgdGhpcy5tdXRhdGlvblF1ZXVlID0gZSwgdGhpcy5kb2N1bWVudE92ZXJsYXlDYWNoZSA9IG4sIFxuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbG9jYWwgdmlldyBvZiB0aGUgZG9jdW1lbnQgaWRlbnRpZmllZCBieSBga2V5YC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIExvY2FsIHZpZXcgb2YgdGhlIGRvY3VtZW50IG9yIG51bGwgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY2FjaGVkXG4gICAgICogc3RhdGUgZm9yIGl0LlxuICAgICAqLyAgICBnZXREb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRPdmVybGF5Q2FjaGUuZ2V0T3ZlcmxheSh0LCBlKS5uZXh0KChzID0+IChuID0gcywgdGhpcy5yZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJ5KHQsIGUpKSkpLm5leHQoKHQgPT4gKG51bGwgIT09IG4gJiYgS3Mobi5tdXRhdGlvbiwgdCwgUmUuZW1wdHkoKSwgaXQubm93KCkpLCBcbiAgICAgICAgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG9jYWwgdmlldyBvZiB0aGUgZG9jdW1lbnRzIGlkZW50aWZpZWQgYnkgYGtleXNgLlxuICAgICAqXG4gICAgICogSWYgd2UgZG9uJ3QgaGF2ZSBjYWNoZWQgc3RhdGUgZm9yIGEgZG9jdW1lbnQgaW4gYGtleXNgLCBhIE5vRG9jdW1lbnQgd2lsbFxuICAgICAqIGJlIHN0b3JlZCBmb3IgdGhhdCBrZXkgaW4gdGhlIHJlc3VsdGluZyBzZXQuXG4gICAgICovICAgIGdldERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW90ZURvY3VtZW50Q2FjaGUuZ2V0RW50cmllcyh0LCBlKS5uZXh0KChlID0+IHRoaXMuZ2V0TG9jYWxWaWV3T2ZEb2N1bWVudHModCwgZSwgZ3MoKSkubmV4dCgoKCkgPT4gZSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gYGdldERvY3VtZW50c2AsIGJ1dCBjcmVhdGVzIHRoZSBsb2NhbCB2aWV3IGZyb20gdGhlIGdpdmVuXG4gICAgICogYGJhc2VEb2NzYCB3aXRob3V0IHJldHJpZXZpbmcgZG9jdW1lbnRzIGZyb20gdGhlIGxvY2FsIHN0b3JlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRoaXMgb3BlcmF0aW9uIGlzIHNjb3BlZCB0by5cbiAgICAgKiBAcGFyYW0gZG9jcyAtIFRoZSBkb2N1bWVudHMgdG8gYXBwbHkgbG9jYWwgbXV0YXRpb25zIHRvIGdldCB0aGUgbG9jYWwgdmlld3MuXG4gICAgICogQHBhcmFtIGV4aXN0ZW5jZVN0YXRlQ2hhbmdlZCAtIFRoZSBzZXQgb2YgZG9jdW1lbnQga2V5cyB3aG9zZSBleGlzdGVuY2Ugc3RhdGVcbiAgICAgKiAgIGlzIGNoYW5nZWQuIFRoaXMgaXMgdXNlZnVsIHRvIGRldGVybWluZSBpZiBzb21lIGRvY3VtZW50cyBvdmVybGF5IG5lZWRzXG4gICAgICogICB0byBiZSByZWNhbGN1bGF0ZWQuXG4gICAgICovICAgIGdldExvY2FsVmlld09mRG9jdW1lbnRzKHQsIGUsIG4gPSBncygpKSB7XG4gICAgICAgIGNvbnN0IHMgPSBmcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3B1bGF0ZU92ZXJsYXlzKHQsIHMsIGUpLm5leHQoKCgpID0+IHRoaXMuY29tcHV0ZVZpZXdzKHQsIGUsIHMsIG4pLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgbGV0IGUgPSBocygpO1xuICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBlID0gZS5pbnNlcnQodCwgbi5vdmVybGF5ZWREb2N1bWVudCk7XG4gICAgICAgICAgICB9KSksIGU7XG4gICAgICAgIH0pKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBvdmVybGF5ZWQgZG9jdW1lbnRzIGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQgbWFwLCB3aGljaCB3aWxsIGluY2x1ZGVcbiAgICAgKiB0aGUgbG9jYWwgdmlldyBvZiB0aG9zZSBkb2N1bWVudHMgYW5kIGEgYEZpZWxkTWFza2AgaW5kaWNhdGluZyB3aGljaCBmaWVsZHNcbiAgICAgKiBhcmUgbXV0YXRlZCBsb2NhbGx5LCBgbnVsbGAgaWYgb3ZlcmxheSBpcyBhIFNldCBvciBEZWxldGUgbXV0YXRpb24uXG4gICAgICovICAgIGdldE92ZXJsYXllZERvY3VtZW50cyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBmcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3B1bGF0ZU92ZXJsYXlzKHQsIG4sIGUpLm5leHQoKCgpID0+IHRoaXMuY29tcHV0ZVZpZXdzKHQsIGUsIG4sIGdzKCkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIG92ZXJsYXlzIGZvciB7QGNvZGUgZG9jc30gYW5kIGFkZHMgdGhlbSB0byBwcm92aWRlZCBvdmVybGF5IG1hcFxuICAgICAqIGlmIHRoZSBtYXAgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuIGVudHJ5IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQga2V5LlxuICAgICAqLyAgICBwb3B1bGF0ZU92ZXJsYXlzKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IFtdO1xuICAgICAgICByZXR1cm4gbi5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGUuaGFzKHQpIHx8IHMucHVzaCh0KTtcbiAgICAgICAgfSkpLCB0aGlzLmRvY3VtZW50T3ZlcmxheUNhY2hlLmdldE92ZXJsYXlzKHQsIHMpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgdC5mb3JFYWNoKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgICAgIGUuc2V0KHQsIG4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsb2NhbCB2aWV3IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3MgLSBUaGUgZG9jdW1lbnRzIHRvIGNvbXB1dGUgdmlld3MgZm9yLiBJdCBhbHNvIGhhcyB0aGUgYmFzZVxuICAgICAqICAgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRzLlxuICAgICAqIEBwYXJhbSBvdmVybGF5cyAtIFRoZSBvdmVybGF5cyB0aGF0IG5lZWQgdG8gYmUgYXBwbGllZCB0byB0aGUgZ2l2ZW4gYmFzZVxuICAgICAqICAgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRzLlxuICAgICAqIEBwYXJhbSBleGlzdGVuY2VTdGF0ZUNoYW5nZWQgLSBBIHNldCBvZiBkb2N1bWVudHMgd2hvc2UgZXhpc3RlbmNlIHN0YXRlc1xuICAgICAqICAgbWlnaHQgaGF2ZSBjaGFuZ2VkLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmUtY2FsY3VsYXRlXG4gICAgICogICBvdmVybGF5cyBmcm9tIG11dGF0aW9uIHF1ZXVlcy5cbiAgICAgKiBAcmV0dXJuIEEgbWFwIHJlcHJlc2VudHMgdGhlIGxvY2FsIGRvY3VtZW50cyB2aWV3LlxuICAgICAqLyAgICBjb21wdXRlVmlld3ModCwgZSwgbiwgcykge1xuICAgICAgICBsZXQgaSA9IGNzKCk7XG4gICAgICAgIGNvbnN0IHIgPSB3cygpLCBvID0gd3MoKTtcbiAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG8gPSBuLmdldChlLmtleSk7XG4gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBhbiBvdmVybGF5IGlmIHRoZSBkb2N1bWVudCdzIGV4aXN0ZW5jZSBzdGF0ZSBjaGFuZ2VkIGR1ZSB0b1xuICAgICAgICAgICAgLy8gYSByZW1vdGUgZXZlbnQgKmFuZCogdGhlIG92ZXJsYXkgaXMgYSBQYXRjaE11dGF0aW9uLiBUaGlzIGlzIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIGRvY3VtZW50IGV4aXN0ZW5jZSBzdGF0ZSBjYW4gY2hhbmdlIGlmIHNvbWUgcGF0Y2ggbXV0YXRpb24nc1xuICAgICAgICAgICAgLy8gcHJlY29uZGl0aW9ucyBhcmUgbWV0LlxuICAgICAgICAgICAgLy8gTk9URTogd2UgcmVjYWxjdWxhdGUgd2hlbiBgb3ZlcmxheWAgaXMgdW5kZWZpbmVkIGFzIHdlbGwsIGJlY2F1c2UgdGhlcmVcbiAgICAgICAgICAgIC8vIG1pZ2h0IGJlIGEgcGF0Y2ggbXV0YXRpb24gd2hvc2UgcHJlY29uZGl0aW9uIGRvZXMgbm90IG1hdGNoIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIGNoYW5nZSAoaGVuY2Ugb3ZlcmxheSBpcyB1bmRlZmluZWQpLCBidXQgd291bGQgbm93IG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcy5oYXMoZS5rZXkpICYmICh2b2lkIDAgPT09IG8gfHwgby5tdXRhdGlvbiBpbnN0YW5jZW9mIHpzKSA/IGkgPSBpLmluc2VydChlLmtleSwgZSkgOiB2b2lkIDAgIT09IG8gPyAoci5zZXQoZS5rZXksIG8ubXV0YXRpb24uZ2V0RmllbGRNYXNrKCkpLCBcbiAgICAgICAgICAgIEtzKG8ubXV0YXRpb24sIGUsIG8ubXV0YXRpb24uZ2V0RmllbGRNYXNrKCksIGl0Lm5vdygpKSkgOiBcbiAgICAgICAgICAgIC8vIG5vIG92ZXJsYXkgZXhpc3RzXG4gICAgICAgICAgICAvLyBVc2luZyBFTVBUWSB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyBvdmVybGF5IGZvciB0aGUgZG9jdW1lbnQuXG4gICAgICAgICAgICByLnNldChlLmtleSwgUmUuZW1wdHkoKSk7XG4gICAgICAgIH0pKSwgdGhpcy5yZWNhbGN1bGF0ZUFuZFNhdmVPdmVybGF5cyh0LCBpKS5uZXh0KCh0ID0+ICh0LmZvckVhY2goKCh0LCBlKSA9PiByLnNldCh0LCBlKSkpLCBcbiAgICAgICAgZS5mb3JFYWNoKCgodCwgZSkgPT4ge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICByZXR1cm4gby5zZXQodCwgbmV3IE5vKGUsIG51bGwgIT09IChuID0gci5nZXQodCkpICYmIHZvaWQgMCAhPT0gbiA/IG4gOiBudWxsKSk7XG4gICAgICAgIH0pKSwgbykpKTtcbiAgICB9XG4gICAgcmVjYWxjdWxhdGVBbmRTYXZlT3ZlcmxheXModCwgZSkge1xuICAgICAgICBjb25zdCBuID0gd3MoKTtcbiAgICAgICAgLy8gQSByZXZlcnNlIGxvb2t1cCBtYXAgZnJvbSBiYXRjaCBpZCB0byB0aGUgZG9jdW1lbnRzIHdpdGhpbiB0aGF0IGJhdGNoLlxuICAgICAgICAgICAgICAgIGxldCBzID0gbmV3IHBlKCgodCwgZSkgPT4gdCAtIGUpKSwgaSA9IGdzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWUuZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHQpIGkua2V5cygpLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBlLmdldCh0KTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGxldCBvID0gbi5nZXQodCkgfHwgUmUuZW1wdHkoKTtcbiAgICAgICAgICAgICAgICBvID0gaS5hcHBseVRvTG9jYWxWaWV3KHIsIG8pLCBuLnNldCh0LCBvKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1ID0gKHMuZ2V0KGkuYmF0Y2hJZCkgfHwgZ3MoKSkuYWRkKHQpO1xuICAgICAgICAgICAgICAgIHMgPSBzLmluc2VydChpLmJhdGNoSWQsIHUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IFtdLCBvID0gcy5nZXRSZXZlcnNlSXRlcmF0b3IoKTtcbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBiYXRjaCBJRHMsIGFuZCBza2lwIGRvY3VtZW50cyB0aGF0IGFyZVxuICAgICAgICAgICAgLy8gYWxyZWFkeSBzYXZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoO28uaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gby5nZXROZXh0KCksIHUgPSBzLmtleSwgYyA9IHMudmFsdWUsIGEgPSBkcygpO1xuICAgICAgICAgICAgICAgIGMuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaS5oYXModCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBxcyhlLmdldCh0KSwgbi5nZXQodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcyAmJiBhLnNldCh0LCBzKSwgaSA9IGkuYWRkKHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpLCByLnB1c2godGhpcy5kb2N1bWVudE92ZXJsYXlDYWNoZS5zYXZlT3ZlcmxheXModCwgdSwgYSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJ0LndhaXRGb3Iocik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyBvdmVybGF5cyBieSByZWFkaW5nIHRoZSBkb2N1bWVudHMgZnJvbSByZW1vdGUgZG9jdW1lbnQgY2FjaGVcbiAgICAgKiBmaXJzdCwgYW5kIHNhdmVzIHRoZW0gYWZ0ZXIgdGhleSBhcmUgY2FsY3VsYXRlZC5cbiAgICAgKi8gICAgcmVjYWxjdWxhdGVBbmRTYXZlT3ZlcmxheXNGb3JEb2N1bWVudEtleXModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGVEb2N1bWVudENhY2hlLmdldEVudHJpZXModCwgZSkubmV4dCgoZSA9PiB0aGlzLnJlY2FsY3VsYXRlQW5kU2F2ZU92ZXJsYXlzKHQsIGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgYWdhaW5zdCB0aGUgbG9jYWwgdmlldyBvZiBhbGwgZG9jdW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHBlcnNpc3RlbmNlIHRyYW5zYWN0aW9uLlxuICAgICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBxdWVyeSB0byBtYXRjaCBkb2N1bWVudHMgYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gUmVhZCB0aW1lIGFuZCBrZXkgdG8gc3RhcnQgc2Nhbm5pbmcgYnkgKGV4Y2x1c2l2ZSkuXG4gICAgICovICAgIGdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbikge1xuICAgICAgICAvKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgcXVlcnkgbWF0Y2hlcyBhIHNpbmdsZSBkb2N1bWVudCBieSBwYXRoIChyYXRoZXIgdGhhbiBhXG4gKiBjb2xsZWN0aW9uKS5cbiAqL1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0LmlzRG9jdW1lbnRLZXkodC5wYXRoKSAmJiBudWxsID09PSB0LmNvbGxlY3Rpb25Hcm91cCAmJiAwID09PSB0LmZpbHRlcnMubGVuZ3RoO1xuICAgICAgICB9KGUpID8gdGhpcy5nZXREb2N1bWVudHNNYXRjaGluZ0RvY3VtZW50UXVlcnkodCwgZS5wYXRoKSA6IFduKGUpID8gdGhpcy5nZXREb2N1bWVudHNNYXRjaGluZ0NvbGxlY3Rpb25Hcm91cFF1ZXJ5KHQsIGUsIG4pIDogdGhpcy5nZXREb2N1bWVudHNNYXRjaGluZ0NvbGxlY3Rpb25RdWVyeSh0LCBlLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb2xsZWN0aW9uIGdyb3VwLCByZXR1cm5zIHRoZSBuZXh0IGRvY3VtZW50cyB0aGF0IGZvbGxvdyB0aGUgcHJvdmlkZWQgb2Zmc2V0LCBhbG9uZ1xuICAgICAqIHdpdGggYW4gdXBkYXRlZCBiYXRjaCBJRC5cbiAgICAgKlxuICAgICAqIDxwPlRoZSBkb2N1bWVudHMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgYXJlIG9yZGVyZWQgYnkgcmVtb3RlIHZlcnNpb24gZnJvbSB0aGUgcHJvdmlkZWRcbiAgICAgKiBvZmZzZXQuIElmIHRoZXJlIGFyZSBubyBtb3JlIHJlbW90ZSBkb2N1bWVudHMgYWZ0ZXIgdGhlIHByb3ZpZGVkIG9mZnNldCwgZG9jdW1lbnRzIHdpdGhcbiAgICAgKiBtdXRhdGlvbnMgaW4gb3JkZXIgb2YgYmF0Y2ggaWQgZnJvbSB0aGUgb2Zmc2V0IGFyZSByZXR1cm5lZC4gU2luY2UgYWxsIGRvY3VtZW50cyBpbiBhIGJhdGNoIGFyZVxuICAgICAqIHJldHVybmVkIHRvZ2V0aGVyLCB0aGUgdG90YWwgbnVtYmVyIG9mIGRvY3VtZW50cyByZXR1cm5lZCBjYW4gZXhjZWVkIHtAY29kZSBjb3VudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0gY29sbGVjdGlvbkdyb3VwIFRoZSBjb2xsZWN0aW9uIGdyb3VwIGZvciB0aGUgZG9jdW1lbnRzLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBpbmRleCBpbnRvLlxuICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cyB0byByZXR1cm5cbiAgICAgKiBAcmV0dXJuIEEgTG9jYWxXcml0ZVJlc3VsdCB3aXRoIHRoZSBkb2N1bWVudHMgdGhhdCBmb2xsb3cgdGhlIHByb3ZpZGVkIG9mZnNldCBhbmQgdGhlIGxhc3QgcHJvY2Vzc2VkIGJhdGNoIGlkLlxuICAgICAqLyAgICBnZXROZXh0RG9jdW1lbnRzKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlRG9jdW1lbnRDYWNoZS5nZXRBbGxGcm9tQ29sbGVjdGlvbkdyb3VwKHQsIGUsIG4sIHMpLm5leHQoKGkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IHMgLSBpLnNpemUgPiAwID8gdGhpcy5kb2N1bWVudE92ZXJsYXlDYWNoZS5nZXRPdmVybGF5c0ZvckNvbGxlY3Rpb25Hcm91cCh0LCBlLCBuLmxhcmdlc3RCYXRjaElkLCBzIC0gaS5zaXplKSA6IFJ0LnJlc29sdmUoZnMoKSk7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbHNpdGUgd2lsbCB1c2UgdGhlIGxhcmdlc3QgYmF0Y2ggSUQgdG9nZXRoZXIgd2l0aCB0aGUgbGF0ZXN0IHJlYWQgdGltZSB0byBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbmV3IGluZGV4IG9mZnNldC4gU2luY2Ugd2Ugb25seSBwcm9jZXNzIGJhdGNoIElEcyBpZiBhbGwgcmVtb3RlIGRvY3VtZW50cyBoYXZlIGJlZW4gcmVhZCxcbiAgICAgICAgICAgIC8vIG5vIG92ZXJsYXkgd2lsbCBpbmNyZWFzZSB0aGUgb3ZlcmFsbCByZWFkIHRpbWUuIFRoaXMgaXMgd2h5IHdlIG9ubHkgbmVlZCB0byBzcGVjaWFsIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSBiYXRjaCBpZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvID0gLTEsIHUgPSBpO1xuICAgICAgICAgICAgcmV0dXJuIHIubmV4dCgoZSA9PiBSdC5mb3JFYWNoKGUsICgoZSwgbikgPT4gKG8gPCBuLmxhcmdlc3RCYXRjaElkICYmIChvID0gbi5sYXJnZXN0QmF0Y2hJZCksIFxuICAgICAgICAgICAgaS5nZXQoZSkgPyBSdC5yZXNvbHZlKCkgOiB0aGlzLnJlbW90ZURvY3VtZW50Q2FjaGUuZ2V0RW50cnkodCwgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdSA9IHUuaW5zZXJ0KGUsIHQpO1xuICAgICAgICAgICAgfSkpKSkpLm5leHQoKCgpID0+IHRoaXMucG9wdWxhdGVPdmVybGF5cyh0LCBlLCBpKSkpLm5leHQoKCgpID0+IHRoaXMuY29tcHV0ZVZpZXdzKHQsIHUsIGUsIGdzKCkpKSkubmV4dCgodCA9PiAoe1xuICAgICAgICAgICAgICAgIGJhdGNoSWQ6IG8sXG4gICAgICAgICAgICAgICAgY2hhbmdlczogbHModClcbiAgICAgICAgICAgIH0pKSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ0RvY3VtZW50UXVlcnkodCwgZSkge1xuICAgICAgICAvLyBKdXN0IGRvIGEgc2ltcGxlIGRvY3VtZW50IGxvb2t1cC5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RG9jdW1lbnQodCwgbmV3IGh0KGUpKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGxldCBlID0gaHMoKTtcbiAgICAgICAgICAgIHJldHVybiB0LmlzRm91bmREb2N1bWVudCgpICYmIChlID0gZS5pbnNlcnQodC5rZXksIHQpKSwgZTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBnZXREb2N1bWVudHNNYXRjaGluZ0NvbGxlY3Rpb25Hcm91cFF1ZXJ5KHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IGUuY29sbGVjdGlvbkdyb3VwO1xuICAgICAgICBsZXQgaSA9IGhzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlci5nZXRDb2xsZWN0aW9uUGFyZW50cyh0LCBzKS5uZXh0KChyID0+IFJ0LmZvckVhY2gociwgKHIgPT4ge1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuKGUsIFxuICAgICAgICAgICAgICAgIC8qY29sbGVjdGlvbkdyb3VwPSovIG51bGwsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCB0LmVuZEF0KTtcbiAgICAgICAgICAgIH0oZSwgci5jaGlsZChzKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREb2N1bWVudHNNYXRjaGluZ0NvbGxlY3Rpb25RdWVyeSh0LCBvLCBuKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBpLmluc2VydCh0LCBlKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBpKSkpKTtcbiAgICB9XG4gICAgZ2V0RG9jdW1lbnRzTWF0Y2hpbmdDb2xsZWN0aW9uUXVlcnkodCwgZSwgbikge1xuICAgICAgICAvLyBRdWVyeSB0aGUgcmVtb3RlIGRvY3VtZW50cyBhbmQgb3ZlcmxheSBtdXRhdGlvbnMuXG4gICAgICAgIGxldCBzO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudE92ZXJsYXlDYWNoZS5nZXRPdmVybGF5c0ZvckNvbGxlY3Rpb24odCwgZS5wYXRoLCBuLmxhcmdlc3RCYXRjaElkKS5uZXh0KChpID0+IChzID0gaSwgXG4gICAgICAgIHRoaXMucmVtb3RlRG9jdW1lbnRDYWNoZS5nZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIGUsIG4sIHMpKSkpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgLy8gQXMgZG9jdW1lbnRzIG1pZ2h0IG1hdGNoIHRoZSBxdWVyeSBiZWNhdXNlIG9mIHRoZWlyIG92ZXJsYXkgd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gaW5jbHVkZSBkb2N1bWVudHMgZm9yIGFsbCBvdmVybGF5cyBpbiB0aGUgaW5pdGlhbCBkb2N1bWVudCBzZXQuXG4gICAgICAgICAgICBzLmZvckVhY2goKChlLCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IG4uZ2V0S2V5KCk7XG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gdC5nZXQocykgJiYgKHQgPSB0Lmluc2VydChzLCBhbi5uZXdJbnZhbGlkRG9jdW1lbnQocykpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBvdmVybGF5cyBhbmQgbWF0Y2ggYWdhaW5zdCB0aGUgcXVlcnkuXG4gICAgICAgICAgICBsZXQgbiA9IGhzKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5mb3JFYWNoKCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzLmdldCh0KTtcbiAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHIgJiYgS3Moci5tdXRhdGlvbiwgaSwgUmUuZW1wdHkoKSwgaXQubm93KCkpLCBcbiAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBpbnNlcnQgdGhlIGRvY3VtZW50cyB0aGF0IHN0aWxsIG1hdGNoIHRoZSBxdWVyeVxuICAgICAgICAgICAgICAgIG5zKGUsIGkpICYmIChuID0gbi5pbnNlcnQodCwgaSkpO1xuICAgICAgICAgICAgfSkpLCBuO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBNbyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0LCB0aGlzLmNzID0gbmV3IE1hcCwgdGhpcy5ocyA9IG5ldyBNYXA7XG4gICAgfVxuICAgIGdldEJ1bmRsZU1ldGFkYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUodGhpcy5jcy5nZXQoZSkpO1xuICAgIH1cbiAgICBzYXZlQnVuZGxlTWV0YWRhdGEodCwgZSkge1xuICAgICAgICAvKiogRGVjb2RlcyBhIEJ1bmRsZU1ldGFkYXRhIHByb3RvIGludG8gYSBCdW5kbGVNZXRhZGF0YSBvYmplY3QuICovXG4gICAgICAgIHZhciBuO1xuICAgICAgICByZXR1cm4gdGhpcy5jcy5zZXQoZS5pZCwge1xuICAgICAgICAgICAgaWQ6IChuID0gZSkuaWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiBuLnZlcnNpb24sXG4gICAgICAgICAgICBjcmVhdGVUaW1lOiBOaShuLmNyZWF0ZVRpbWUpXG4gICAgICAgIH0pLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldE5hbWVkUXVlcnkodCwgZSkge1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSh0aGlzLmhzLmdldChlKSk7XG4gICAgfVxuICAgIHNhdmVOYW1lZFF1ZXJ5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHMuc2V0KGUubmFtZSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHlyKHQuYnVuZGxlZFF1ZXJ5KSxcbiAgICAgICAgICAgICAgICByZWFkVGltZTogTmkodC5yZWFkVGltZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oZSkpLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRPdmVybGF5Q2FjaGUuXG4gKi8gY2xhc3MgJG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBBIG1hcCBzb3J0ZWQgYnkgRG9jdW1lbnRLZXksIHdob3NlIHZhbHVlIGlzIGEgcGFpciBvZiB0aGUgbGFyZ2VzdCBiYXRjaCBpZFxuICAgICAgICAvLyBmb3IgdGhlIG92ZXJsYXkgYW5kIHRoZSBvdmVybGF5IGl0c2VsZi5cbiAgICAgICAgdGhpcy5vdmVybGF5cyA9IG5ldyBwZShodC5jb21wYXJhdG9yKSwgdGhpcy5scyA9IG5ldyBNYXA7XG4gICAgfVxuICAgIGdldE92ZXJsYXkodCwgZSkge1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSh0aGlzLm92ZXJsYXlzLmdldChlKSk7XG4gICAgfVxuICAgIGdldE92ZXJsYXlzKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGZzKCk7XG4gICAgICAgIHJldHVybiBSdC5mb3JFYWNoKGUsIChlID0+IHRoaXMuZ2V0T3ZlcmxheSh0LCBlKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIG51bGwgIT09IHQgJiYgbi5zZXQoZSwgdCk7XG4gICAgICAgIH0pKSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgc2F2ZU92ZXJsYXlzKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG4uZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2UodCwgZSwgcyk7XG4gICAgICAgIH0pKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVPdmVybGF5c0ZvckJhdGNoSWQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gdGhpcy5scy5nZXQobik7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHMgJiYgKHMuZm9yRWFjaCgodCA9PiB0aGlzLm92ZXJsYXlzID0gdGhpcy5vdmVybGF5cy5yZW1vdmUodCkpKSwgXG4gICAgICAgIHRoaXMubHMuZGVsZXRlKG4pKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRPdmVybGF5c0ZvckNvbGxlY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gZnMoKSwgaSA9IGUubGVuZ3RoICsgMSwgciA9IG5ldyBodChlLmNoaWxkKFwiXCIpKSwgbyA9IHRoaXMub3ZlcmxheXMuZ2V0SXRlcmF0b3JGcm9tKHIpO1xuICAgICAgICBmb3IgKDtvLmhhc05leHQoKTsgKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gby5nZXROZXh0KCkudmFsdWUsIHIgPSB0LmdldEtleSgpO1xuICAgICAgICAgICAgaWYgKCFlLmlzUHJlZml4T2Yoci5wYXRoKSkgYnJlYWs7XG4gICAgICAgICAgICAvLyBEb2N1bWVudHMgZnJvbSBzdWItY29sbGVjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHIucGF0aC5sZW5ndGggPT09IGkgJiYgKHQubGFyZ2VzdEJhdGNoSWQgPiBuICYmIHMuc2V0KHQuZ2V0S2V5KCksIHQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZShzKTtcbiAgICB9XG4gICAgZ2V0T3ZlcmxheXNGb3JDb2xsZWN0aW9uR3JvdXAodCwgZSwgbiwgcykge1xuICAgICAgICBsZXQgaSA9IG5ldyBwZSgoKHQsIGUpID0+IHQgLSBlKSk7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm92ZXJsYXlzLmdldEl0ZXJhdG9yKCk7XG4gICAgICAgIGZvciAoO3IuaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSByLmdldE5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0LmdldEtleSgpLmdldENvbGxlY3Rpb25Hcm91cCgpID09PSBlICYmIHQubGFyZ2VzdEJhdGNoSWQgPiBuKSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSBpLmdldCh0Lmxhcmdlc3RCYXRjaElkKTtcbiAgICAgICAgICAgICAgICBudWxsID09PSBlICYmIChlID0gZnMoKSwgaSA9IGkuaW5zZXJ0KHQubGFyZ2VzdEJhdGNoSWQsIGUpKSwgZS5zZXQodC5nZXRLZXkoKSwgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbyA9IGZzKCksIHUgPSBpLmdldEl0ZXJhdG9yKCk7XG4gICAgICAgIGZvciAoO3UuaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGlmICh1LmdldE5leHQoKS52YWx1ZS5mb3JFYWNoKCgodCwgZSkgPT4gby5zZXQodCwgZSkpKSwgby5zaXplKCkgPj0gcykgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUobyk7XG4gICAgfVxuICAgIHdlKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBvZiB0aGUgb3ZlcmxheSB0byBpdHMgYmF0Y2ggaWQuXG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLm92ZXJsYXlzLmdldChuLmtleSk7XG4gICAgICAgIGlmIChudWxsICE9PSBzKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5scy5nZXQocy5sYXJnZXN0QmF0Y2hJZCkuZGVsZXRlKG4ua2V5KTtcbiAgICAgICAgICAgIHRoaXMubHMuc2V0KHMubGFyZ2VzdEJhdGNoSWQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3ZlcmxheXMgPSB0aGlzLm92ZXJsYXlzLmluc2VydChuLmtleSwgbmV3IGVpKGUsIG4pKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhc3NvY2lhdGlvbiBvZiB0aGlzIG92ZXJsYXkgdG8gdGhlIGdpdmVuIGxhcmdlc3RCYXRjaElkLlxuICAgICAgICBsZXQgaSA9IHRoaXMubHMuZ2V0KGUpO1xuICAgICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSBncygpLCB0aGlzLmxzLnNldChlLCBpKSksIHRoaXMubHMuc2V0KGUsIGkuYWRkKG4ua2V5KSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlcyB0byBhIGRvY3VtZW50IGZyb20gc29tZSBraW5kIG9mIG51bWJlcmVkIGVudGl0eVxuICogKGVpdGhlciBhIHRhcmdldCBJRCBvciBiYXRjaCBJRCkuIEFzIHJlZmVyZW5jZXMgYXJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbVxuICogdGhlIHNldCBjb3JyZXNwb25kaW5nIGV2ZW50cyBhcmUgZW1pdHRlZCB0byBhIHJlZ2lzdGVyZWQgZ2FyYmFnZSBjb2xsZWN0b3IuXG4gKlxuICogRWFjaCByZWZlcmVuY2UgaXMgcmVwcmVzZW50ZWQgYnkgYSBEb2N1bWVudFJlZmVyZW5jZSBvYmplY3QuIEVhY2ggb2YgdGhlbVxuICogY29udGFpbnMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSByZWZlcmVuY2UuIFRoZXkgYXJlIGFsbFxuICogc3RvcmVkIHByaW1hcmlseSBpbiBhIHNldCBzb3J0ZWQgYnkga2V5LiBBIGRvY3VtZW50IGlzIGNvbnNpZGVyZWQgZ2FyYmFnZSBpZlxuICogdGhlcmUncyBubyByZWZlcmVuY2VzIGluIHRoYXQgc2V0ICh0aGlzIGNhbiBiZSBlZmZpY2llbnRseSBjaGVja2VkIHRoYW5rcyB0b1xuICogc29ydGluZyBieSBrZXkpLlxuICpcbiAqIFJlZmVyZW5jZVNldCBhbHNvIGtlZXBzIGEgc2Vjb25kYXJ5IHNldCB0aGF0IGNvbnRhaW5zIHJlZmVyZW5jZXMgc29ydGVkIGJ5XG4gKiBJRHMuIFRoaXMgb25lIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkgaW1wbGVtZW50IHJlbW92YWwgb2YgYWxsIHJlZmVyZW5jZXMgYnlcbiAqIHNvbWUgdGFyZ2V0IElELlxuICovIGNsYXNzIE9vIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gQSBzZXQgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byBhIGRvY3VtZW50IHNvcnRlZCBieSBrZXkuXG4gICAgICAgIHRoaXMuZnMgPSBuZXcgRWUoRm8uZHMpLCBcbiAgICAgICAgLy8gQSBzZXQgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byBhIGRvY3VtZW50IHNvcnRlZCBieSB0YXJnZXQgaWQuXG4gICAgICAgIHRoaXMud3MgPSBuZXcgRWUoRm8uX3MpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSByZWZlcmVuY2Ugc2V0IGNvbnRhaW5zIG5vIHJlZmVyZW5jZXMuICovICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZzLmlzRW1wdHkoKTtcbiAgICB9XG4gICAgLyoqIEFkZHMgYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGRvY3VtZW50IGtleSBmb3IgdGhlIGdpdmVuIElELiAqLyAgICBhZGRSZWZlcmVuY2UodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IEZvKHQsIGUpO1xuICAgICAgICB0aGlzLmZzID0gdGhpcy5mcy5hZGQobiksIHRoaXMud3MgPSB0aGlzLndzLmFkZChuKTtcbiAgICB9XG4gICAgLyoqIEFkZCByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiBkb2N1bWVudCBrZXlzIGZvciB0aGUgZ2l2ZW4gSUQuICovICAgIGdzKHQsIGUpIHtcbiAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHRoaXMuYWRkUmVmZXJlbmNlKHQsIGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGRvY3VtZW50IGtleSBmb3IgdGhlIGdpdmVuXG4gICAgICogSUQuXG4gICAgICovICAgIHJlbW92ZVJlZmVyZW5jZSh0LCBlKSB7XG4gICAgICAgIHRoaXMueXMobmV3IEZvKHQsIGUpKTtcbiAgICB9XG4gICAgcHModCwgZSkge1xuICAgICAgICB0LmZvckVhY2goKHQgPT4gdGhpcy5yZW1vdmVSZWZlcmVuY2UodCwgZSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCByZWZlcmVuY2VzIHdpdGggYSBnaXZlbiBJRC4gQ2FsbHMgcmVtb3ZlUmVmKCkgZm9yIGVhY2gga2V5XG4gICAgICogcmVtb3ZlZC5cbiAgICAgKi8gICAgSXModCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IGh0KG5ldyB1dChbXSkpLCBuID0gbmV3IEZvKGUsIHQpLCBzID0gbmV3IEZvKGUsIHQgKyAxKSwgaSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy53cy5mb3JFYWNoSW5SYW5nZShbIG4sIHMgXSwgKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy55cyh0KSwgaS5wdXNoKHQua2V5KTtcbiAgICAgICAgfSkpLCBpO1xuICAgIH1cbiAgICBUcygpIHtcbiAgICAgICAgdGhpcy5mcy5mb3JFYWNoKCh0ID0+IHRoaXMueXModCkpKTtcbiAgICB9XG4gICAgeXModCkge1xuICAgICAgICB0aGlzLmZzID0gdGhpcy5mcy5kZWxldGUodCksIHRoaXMud3MgPSB0aGlzLndzLmRlbGV0ZSh0KTtcbiAgICB9XG4gICAgRXModCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IGh0KG5ldyB1dChbXSkpLCBuID0gbmV3IEZvKGUsIHQpLCBzID0gbmV3IEZvKGUsIHQgKyAxKTtcbiAgICAgICAgbGV0IGkgPSBncygpO1xuICAgICAgICByZXR1cm4gdGhpcy53cy5mb3JFYWNoSW5SYW5nZShbIG4sIHMgXSwgKHQgPT4ge1xuICAgICAgICAgICAgaSA9IGkuYWRkKHQua2V5KTtcbiAgICAgICAgfSkpLCBpO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRm8odCwgMCksIG4gPSB0aGlzLmZzLmZpcnN0QWZ0ZXJPckVxdWFsKGUpO1xuICAgICAgICByZXR1cm4gbnVsbCAhPT0gbiAmJiB0LmlzRXF1YWwobi5rZXkpO1xuICAgIH1cbn1cblxuY2xhc3MgRm8ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5rZXkgPSB0LCB0aGlzLkFzID0gZTtcbiAgICB9XG4gICAgLyoqIENvbXBhcmUgYnkga2V5IHRoZW4gYnkgSUQgKi8gICAgc3RhdGljIGRzKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGh0LmNvbXBhcmF0b3IodC5rZXksIGUua2V5KSB8fCBldCh0LkFzLCBlLkFzKTtcbiAgICB9XG4gICAgLyoqIENvbXBhcmUgYnkgSUQgdGhlbiBieSBrZXkgKi8gICAgc3RhdGljIF9zKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIGV0KHQuQXMsIGUuQXMpIHx8IGh0LmNvbXBhcmF0b3IodC5rZXksIGUua2V5KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIEJvIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuaW5kZXhNYW5hZ2VyID0gdCwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IGUsIFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNldCBvZiBhbGwgbXV0YXRpb25zIHRoYXQgaGF2ZSBiZWVuIHNlbnQgYnV0IG5vdCB5ZXQgYmVlbiBhcHBsaWVkIHRvXG4gICAgICAgICAqIHRoZSBiYWNrZW5kLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tdXRhdGlvblF1ZXVlID0gW10sIFxuICAgICAgICAvKiogTmV4dCB2YWx1ZSB0byB1c2Ugd2hlbiBhc3NpZ25pbmcgc2VxdWVudGlhbCBJRHMgdG8gZWFjaCBtdXRhdGlvbiBiYXRjaC4gKi9cbiAgICAgICAgdGhpcy52cyA9IDEsIFxuICAgICAgICAvKiogQW4gb3JkZXJlZCBtYXBwaW5nIGJldHdlZW4gZG9jdW1lbnRzIGFuZCB0aGUgbXV0YXRpb25zIGJhdGNoIElEcy4gKi9cbiAgICAgICAgdGhpcy5ScyA9IG5ldyBFZShGby5kcyk7XG4gICAgfVxuICAgIGNoZWNrRW1wdHkodCkge1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSgwID09PSB0aGlzLm11dGF0aW9uUXVldWUubGVuZ3RoKTtcbiAgICB9XG4gICAgYWRkTXV0YXRpb25CYXRjaCh0LCBlLCBuLCBzKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLnZzO1xuICAgICAgICB0aGlzLnZzKyssIHRoaXMubXV0YXRpb25RdWV1ZS5sZW5ndGggPiAwICYmIHRoaXMubXV0YXRpb25RdWV1ZVt0aGlzLm11dGF0aW9uUXVldWUubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgWnMoaSwgZSwgbiwgcyk7XG4gICAgICAgIHRoaXMubXV0YXRpb25RdWV1ZS5wdXNoKHIpO1xuICAgICAgICAvLyBUcmFjayByZWZlcmVuY2VzIGJ5IGRvY3VtZW50IGtleSBhbmQgaW5kZXggY29sbGVjdGlvbiBwYXJlbnRzLlxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgcykgdGhpcy5ScyA9IHRoaXMuUnMuYWRkKG5ldyBGbyhlLmtleSwgaSkpLCB0aGlzLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBlLmtleS5wYXRoLnBvcExhc3QoKSk7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKHIpO1xuICAgIH1cbiAgICBsb29rdXBNdXRhdGlvbkJhdGNoKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUodGhpcy5QcyhlKSk7XG4gICAgfVxuICAgIGdldE5leHRNdXRhdGlvbkJhdGNoQWZ0ZXJCYXRjaElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUgKyAxLCBzID0gdGhpcy5icyhuKSwgaSA9IHMgPCAwID8gMCA6IHM7XG4gICAgICAgIC8vIFRoZSByZXF1ZXN0ZWQgYmF0Y2hJZCBtYXkgc3RpbGwgYmUgb3V0IG9mIHJhbmdlIHNvIG5vcm1hbGl6ZSBpdCB0byB0aGVcbiAgICAgICAgLy8gc3RhcnQgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgICAgIHJldHVybiBSdC5yZXNvbHZlKHRoaXMubXV0YXRpb25RdWV1ZS5sZW5ndGggPiBpID8gdGhpcy5tdXRhdGlvblF1ZXVlW2ldIDogbnVsbCk7XG4gICAgfVxuICAgIGdldEhpZ2hlc3RVbmFja25vd2xlZGdlZEJhdGNoSWQoKSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKDAgPT09IHRoaXMubXV0YXRpb25RdWV1ZS5sZW5ndGggPyAtMSA6IHRoaXMudnMgLSAxKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUodGhpcy5tdXRhdGlvblF1ZXVlLnNsaWNlKCkpO1xuICAgIH1cbiAgICBnZXRBbGxNdXRhdGlvbkJhdGNoZXNBZmZlY3RpbmdEb2N1bWVudEtleSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgRm8oZSwgMCksIHMgPSBuZXcgRm8oZSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSwgaSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5Scy5mb3JFYWNoSW5SYW5nZShbIG4sIHMgXSwgKHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuUHModC5Bcyk7XG4gICAgICAgICAgICBpLnB1c2goZSk7XG4gICAgICAgIH0pKSwgUnQucmVzb2x2ZShpKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nRG9jdW1lbnRLZXlzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBuZXcgRWUoZXQpO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgRm8odCwgMCksIHMgPSBuZXcgRm8odCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgICAgIHRoaXMuUnMuZm9yRWFjaEluUmFuZ2UoWyBlLCBzIF0sICh0ID0+IHtcbiAgICAgICAgICAgICAgICBuID0gbi5hZGQodC5Bcyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKSwgUnQucmVzb2x2ZSh0aGlzLlZzKG4pKTtcbiAgICB9XG4gICAgZ2V0QWxsTXV0YXRpb25CYXRjaGVzQWZmZWN0aW5nUXVlcnkodCwgZSkge1xuICAgICAgICAvLyBVc2UgdGhlIHF1ZXJ5IHBhdGggYXMgYSBwcmVmaXggZm9yIHRlc3RpbmcgaWYgYSBkb2N1bWVudCBtYXRjaGVzIHRoZVxuICAgICAgICAvLyBxdWVyeS5cbiAgICAgICAgY29uc3QgbiA9IGUucGF0aCwgcyA9IG4ubGVuZ3RoICsgMTtcbiAgICAgICAgLy8gQ29uc3RydWN0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIGZvciBhY3R1YWxseSBzY2FubmluZyB0aGUgaW5kZXguIFVubGlrZVxuICAgICAgICAvLyB0aGUgcHJlZml4IHRoZSBkb2N1bWVudCBrZXkgaW4gdGhpcyByZWZlcmVuY2UgbXVzdCBoYXZlIGFuIGV2ZW4gbnVtYmVyIG9mXG4gICAgICAgIC8vIHNlZ21lbnRzLiBUaGUgZW1wdHkgc2VnbWVudCBjYW4gYmUgdXNlZCBhIHN1ZmZpeCBvZiB0aGUgcXVlcnkgcGF0aFxuICAgICAgICAvLyBiZWNhdXNlIGl0IHByZWNlZGVzIGFsbCBvdGhlciBzZWdtZW50cyBpbiBhbiBvcmRlcmVkIHRyYXZlcnNhbC5cbiAgICAgICAgbGV0IGkgPSBuO1xuICAgICAgICBodC5pc0RvY3VtZW50S2V5KGkpIHx8IChpID0gaS5jaGlsZChcIlwiKSk7XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgRm8obmV3IGh0KGkpLCAwKTtcbiAgICAgICAgLy8gRmluZCB1bmlxdWUgYmF0Y2hJRHMgcmVmZXJlbmNlZCBieSBhbGwgZG9jdW1lbnRzIHBvdGVudGlhbGx5IG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWVyeS5cbiAgICAgICAgICAgICAgICBsZXQgbyA9IG5ldyBFZShldCk7XG4gICAgICAgIHJldHVybiB0aGlzLlJzLmZvckVhY2hXaGlsZSgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5rZXkucGF0aDtcbiAgICAgICAgICAgIHJldHVybiAhIW4uaXNQcmVmaXhPZihlKSAmJiAoXG4gICAgICAgICAgICAvLyBSb3dzIHdpdGggZG9jdW1lbnQga2V5cyBtb3JlIHRoYW4gb25lIHNlZ21lbnQgbG9uZ2VyIHRoYW4gdGhlIHF1ZXJ5XG4gICAgICAgICAgICAvLyBwYXRoIGNhbid0IGJlIG1hdGNoZXMuIEZvciBleGFtcGxlLCBhIHF1ZXJ5IG9uICdyb29tcycgY2FuJ3QgbWF0Y2hcbiAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCAvcm9vbXMvYWJjL21lc3NhZ2VzL3h5eC5cbiAgICAgICAgICAgIC8vIFRPRE8obWNnKTogd2UnbGwgbmVlZCBhIGRpZmZlcmVudCBzY2FubmVyIHdoZW4gd2UgaW1wbGVtZW50XG4gICAgICAgICAgICAvLyBhbmNlc3RvciBxdWVyaWVzLlxuICAgICAgICAgICAgZS5sZW5ndGggPT09IHMgJiYgKG8gPSBvLmFkZCh0LkFzKSksICEwKTtcbiAgICAgICAgfSksIHIpLCBSdC5yZXNvbHZlKHRoaXMuVnMobykpO1xuICAgIH1cbiAgICBWcyh0KSB7XG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBhcnJheSBvZiBtYXRjaGluZyBiYXRjaGVzLCBzb3J0ZWQgYnkgYmF0Y2hJRCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAvLyBtdWx0aXBsZSBtdXRhdGlvbnMgYWZmZWN0aW5nIHRoZSBzYW1lIGRvY3VtZW50IGtleSBhcmUgYXBwbGllZCBpbiBvcmRlci5cbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICByZXR1cm4gdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLlBzKHQpO1xuICAgICAgICAgICAgbnVsbCAhPT0gbiAmJiBlLnB1c2gobik7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG4gICAgcmVtb3ZlTXV0YXRpb25CYXRjaCh0LCBlKSB7XG4gICAgICAgIEYoMCA9PT0gdGhpcy5TcyhlLmJhdGNoSWQsIFwicmVtb3ZlZFwiKSksIHRoaXMubXV0YXRpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgICBsZXQgbiA9IHRoaXMuUnM7XG4gICAgICAgIHJldHVybiBSdC5mb3JFYWNoKGUubXV0YXRpb25zLCAocyA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gbmV3IEZvKHMua2V5LCBlLmJhdGNoSWQpO1xuICAgICAgICAgICAgcmV0dXJuIG4gPSBuLmRlbGV0ZShpKSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZS5tYXJrUG90ZW50aWFsbHlPcnBoYW5lZCh0LCBzLmtleSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLlJzID0gbjtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBDbih0KSB7XG4gICAgICAgIC8vIE5vLW9wIHNpbmNlIHRoZSBtZW1vcnkgbXV0YXRpb24gcXVldWUgZG9lcyBub3QgbWFpbnRhaW4gYSBzZXBhcmF0ZSBjYWNoZS5cbiAgICB9XG4gICAgY29udGFpbnNLZXkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IEZvKGUsIDApLCBzID0gdGhpcy5Scy5maXJzdEFmdGVyT3JFcXVhbChuKTtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoZS5pc0VxdWFsKHMgJiYgcy5rZXkpKTtcbiAgICB9XG4gICAgcGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdXRhdGlvblF1ZXVlLmxlbmd0aCwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGJhdGNoSWQgaW4gdGhlIG11dGF0aW9uIHF1ZXVlIGFuZCBhc3NlcnRzIHRoYXRcbiAgICAgKiB0aGUgcmVzdWx0aW5nIGluZGV4IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiYXRjaElkIC0gVGhlIGJhdGNoSWQgdG8gc2VhcmNoIGZvclxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBkb2luZywgcGhyYXNlZCBpbiBwYXNzaXZlXG4gICAgICogZm9ybSAoZS5nLiBcImFja25vd2xlZGdlZFwiIGluIGEgcm91dGluZSB0aGF0IGFja25vd2xlZGdlcyBiYXRjaGVzKS5cbiAgICAgKi8gICAgU3ModCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5icyh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBiYXRjaElkIGluIHRoZSBtdXRhdGlvbiBxdWV1ZS4gVGhpcyBvcGVyYXRpb25cbiAgICAgKiBpcyBPKDEpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGNvbXB1dGVkIGluZGV4IG9mIHRoZSBiYXRjaCB3aXRoIHRoZSBnaXZlbiBiYXRjaElkLCBiYXNlZCBvblxuICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgcXVldWUuIE5vdGUgdGhpcyBpbmRleCBjYW4gYmUgbmVnYXRpdmUgaWYgdGhlIHJlcXVlc3RlZFxuICAgICAqIGJhdGNoSWQgaGFzIGFscmVhZHkgYmVlbiByZW12b2VkIGZyb20gdGhlIHF1ZXVlIG9yIHBhc3QgdGhlIGVuZCBvZiB0aGVcbiAgICAgKiBxdWV1ZSBpZiB0aGUgYmF0Y2hJZCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFzdCBhZGRlZCBiYXRjaC5cbiAgICAgKi8gICAgYnModCkge1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy5tdXRhdGlvblF1ZXVlLmxlbmd0aCkgXG4gICAgICAgIC8vIEFzIGFuIGluZGV4IHRoaXMgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgLy8gRXhhbWluZSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIHRvIGZpZ3VyZSBvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVcbiAgICAgICAgLy8gYmF0Y2hJZCBhbmQgaW5kZXhlcyBpbiB0aGUgYXJyYXkuIE5vdGUgdGhhdCBzaW5jZSB0aGUgcXVldWUgaXMgb3JkZXJlZFxuICAgICAgICAvLyBieSBiYXRjaElkLCBpZiB0aGUgZmlyc3QgYmF0Y2ggaGFzIGEgbGFyZ2VyIGJhdGNoSWQgdGhlbiB0aGUgcmVxdWVzdGVkXG4gICAgICAgIC8vIGJhdGNoSWQgZG9lc24ndCBleGlzdCBpbiB0aGUgcXVldWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgLSB0aGlzLm11dGF0aW9uUXVldWVbMF0uYmF0Y2hJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSB2ZXJzaW9uIG9mIGxvb2t1cE11dGF0aW9uQmF0Y2ggdGhhdCBkb2Vzbid0IHJldHVybiBhIHByb21pc2UsIHRoaXMgbWFrZXNcbiAgICAgKiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VzIHRoaXMgY29kZSBlYXNpZXIgdG8gcmVhZCBhbmQgbW9yZSBlZmZpY2VudC5cbiAgICAgKi8gICAgUHModCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5icyh0KTtcbiAgICAgICAgaWYgKGUgPCAwIHx8IGUgPj0gdGhpcy5tdXRhdGlvblF1ZXVlLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLm11dGF0aW9uUXVldWVbZV07XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUaGUgbWVtb3J5LW9ubHkgUmVtb3RlRG9jdW1lbnRDYWNoZSBmb3IgSW5kZXhlZERiLiBUbyBjb25zdHJ1Y3QsIGludm9rZVxuICogYG5ld01lbW9yeVJlbW90ZURvY3VtZW50Q2FjaGUoKWAuXG4gKi9cbmNsYXNzIExvIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2l6ZXIgLSBVc2VkIHRvIGFzc2VzcyB0aGUgc2l6ZSBvZiBhIGRvY3VtZW50LiBGb3IgZWFnZXIgR0MsIHRoaXMgaXNcbiAgICAgKiBleHBlY3RlZCB0byBqdXN0IHJldHVybiAwIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgZG9pbmcgdGhlIHdvcmsgb2ZcbiAgICAgKiBjYWxjdWxhdGluZyB0aGUgc2l6ZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuRHMgPSB0LCBcbiAgICAgICAgLyoqIFVuZGVybHlpbmcgY2FjaGUgb2YgZG9jdW1lbnRzIGFuZCB0aGVpciByZWFkIHRpbWVzLiAqL1xuICAgICAgICB0aGlzLmRvY3MgPSBuZXcgcGUoaHQuY29tcGFyYXRvciksIFxuICAgICAgICAvKiogU2l6ZSBvZiBhbGwgY2FjaGVkIGRvY3VtZW50cy4gKi9cbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG4gICAgc2V0SW5kZXhNYW5hZ2VyKHQpIHtcbiAgICAgICAgdGhpcy5pbmRleE1hbmFnZXIgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzdXBwbGllZCBlbnRyeSB0byB0aGUgY2FjaGUgYW5kIHVwZGF0ZXMgdGhlIGNhY2hlIHNpemUgYXMgYXBwcm9wcmlhdGUuXG4gICAgICpcbiAgICAgKiBBbGwgY2FsbHMgb2YgYGFkZEVudHJ5YCAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYC5cbiAgICAgKi8gICAgYWRkRW50cnkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5rZXksIHMgPSB0aGlzLmRvY3MuZ2V0KG4pLCBpID0gcyA/IHMuc2l6ZSA6IDAsIHIgPSB0aGlzLkRzKGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NzID0gdGhpcy5kb2NzLmluc2VydChuLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZS5tdXRhYmxlQ29weSgpLFxuICAgICAgICAgICAgc2l6ZTogclxuICAgICAgICB9KSwgdGhpcy5zaXplICs9IHIgLSBpLCB0aGlzLmluZGV4TWFuYWdlci5hZGRUb0NvbGxlY3Rpb25QYXJlbnRJbmRleCh0LCBuLnBhdGgucG9wTGFzdCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVudHJ5IGZyb20gdGhlIGNhY2hlIGFuZCB1cGRhdGVzIHRoZSBjYWNoZSBzaXplIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqXG4gICAgICogQWxsIGNhbGxzIG9mIGByZW1vdmVFbnRyeWAgYXJlIHJlcXVpcmVkIHRvIGdvIHRocm91Z2ggdGhlIFJlbW90ZURvY3VtZW50Q2hhbmdlQnVmZmVyXG4gICAgICogcmV0dXJuZWQgYnkgYG5ld0NoYW5nZUJ1ZmZlcigpYC5cbiAgICAgKi8gICAgcmVtb3ZlRW50cnkodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5kb2NzLmdldCh0KTtcbiAgICAgICAgZSAmJiAodGhpcy5kb2NzID0gdGhpcy5kb2NzLnJlbW92ZSh0KSwgdGhpcy5zaXplIC09IGUuc2l6ZSk7XG4gICAgfVxuICAgIGdldEVudHJ5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuZG9jcy5nZXQoZSk7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKG4gPyBuLmRvY3VtZW50Lm11dGFibGVDb3B5KCkgOiBhbi5uZXdJbnZhbGlkRG9jdW1lbnQoZSkpO1xuICAgIH1cbiAgICBnZXRFbnRyaWVzKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBjcygpO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmRvY3MuZ2V0KHQpO1xuICAgICAgICAgICAgbiA9IG4uaW5zZXJ0KHQsIGUgPyBlLmRvY3VtZW50Lm11dGFibGVDb3B5KCkgOiBhbi5uZXdJbnZhbGlkRG9jdW1lbnQodCkpO1xuICAgICAgICB9KSksIFJ0LnJlc29sdmUobik7XG4gICAgfVxuICAgIGdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbiwgcykge1xuICAgICAgICBsZXQgaSA9IGNzKCk7XG4gICAgICAgIC8vIERvY3VtZW50cyBhcmUgb3JkZXJlZCBieSBrZXksIHNvIHdlIGNhbiB1c2UgYSBwcmVmaXggc2NhbiB0byBuYXJyb3cgZG93blxuICAgICAgICAvLyB0aGUgZG9jdW1lbnRzIHdlIG5lZWQgdG8gbWF0Y2ggdGhlIHF1ZXJ5IGFnYWluc3QuXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGUucGF0aCwgbyA9IG5ldyBodChyLmNoaWxkKFwiXCIpKSwgdSA9IHRoaXMuZG9jcy5nZXRJdGVyYXRvckZyb20obyk7XG4gICAgICAgIGZvciAoO3UuaGFzTmV4dCgpOyApIHtcbiAgICAgICAgICAgIGNvbnN0IHtrZXk6IHQsIHZhbHVlOiB7ZG9jdW1lbnQ6IG99fSA9IHUuZ2V0TmV4dCgpO1xuICAgICAgICAgICAgaWYgKCFyLmlzUHJlZml4T2YodC5wYXRoKSkgYnJlYWs7XG4gICAgICAgICAgICB0LnBhdGgubGVuZ3RoID4gci5sZW5ndGggKyAxIHx8IChUdChwdChvKSwgbikgPD0gMCB8fCAocy5oYXMoby5rZXkpIHx8IG5zKGUsIG8pKSAmJiAoaSA9IGkuaW5zZXJ0KG8ua2V5LCBvLm11dGFibGVDb3B5KCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUoaSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21Db2xsZWN0aW9uR3JvdXAodCwgZSwgbiwgcykge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgSW5kZXhCYWNrZmlsbGVyIGlmIHBlcnNpc3RlbmNlXG4gICAgICAgIC8vIGlzIGVuYWJsZWQuXG4gICAgICAgIE8oKTtcbiAgICB9XG4gICAgQ3ModCwgZSkge1xuICAgICAgICByZXR1cm4gUnQuZm9yRWFjaCh0aGlzLmRvY3MsICh0ID0+IGUodCkpKTtcbiAgICB9XG4gICAgbmV3Q2hhbmdlQnVmZmVyKHQpIHtcbiAgICAgICAgLy8gYHRyYWNrUmVtb3ZhbHNgIGlzIGlnbm9yZXMgc2luY2UgdGhlIE1lbW9yeVJlbW90ZURvY3VtZW50Q2FjaGUga2VlcHNcbiAgICAgICAgLy8gYSBzZXBhcmF0ZSBjaGFuZ2Vsb2cgYW5kIGRvZXMgbm90IG5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgcmVtb3ZhbHMuXG4gICAgICAgIHJldHVybiBuZXcgcW8odGhpcyk7XG4gICAgfVxuICAgIGdldFNpemUodCkge1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSh0aGlzLnNpemUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1lbW9yeS1vbmx5IFJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKlxuICogQHBhcmFtIHNpemVyIC0gVXNlZCB0byBhc3Nlc3MgdGhlIHNpemUgb2YgYSBkb2N1bWVudC4gRm9yIGVhZ2VyIEdDLCB0aGlzIGlzXG4gKiBleHBlY3RlZCB0byBqdXN0IHJldHVybiAwIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgZG9pbmcgdGhlIHdvcmsgb2ZcbiAqIGNhbGN1bGF0aW5nIHRoZSBzaXplLlxuICovXG4vKipcbiAqIEhhbmRsZXMgdGhlIGRldGFpbHMgb2YgYWRkaW5nIGFuZCB1cGRhdGluZyBkb2N1bWVudHMgaW4gdGhlIE1lbW9yeVJlbW90ZURvY3VtZW50Q2FjaGUuXG4gKi9cbmNsYXNzIHFvIGV4dGVuZHMgdm8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5vcyA9IHQ7XG4gICAgfVxuICAgIGFwcGx5Q2hhbmdlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlcy5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgcy5pc1ZhbGlkRG9jdW1lbnQoKSA/IGUucHVzaCh0aGlzLm9zLmFkZEVudHJ5KHQsIHMpKSA6IHRoaXMub3MucmVtb3ZlRW50cnkobik7XG4gICAgICAgIH0pKSwgUnQud2FpdEZvcihlKTtcbiAgICB9XG4gICAgZ2V0RnJvbUNhY2hlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3MuZ2V0RW50cnkodCwgZSk7XG4gICAgfVxuICAgIGdldEFsbEZyb21DYWNoZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9zLmdldEVudHJpZXModCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjbGFzcyBVbyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgdGFyZ2V0IHRvIHRoZSBkYXRhIGFib3V0IHRoYXQgdGFyZ2V0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnhzID0gbmV3IG9zKCh0ID0+ICRuKHQpKSwgT24pLCBcbiAgICAgICAgLyoqIFRoZSBsYXN0IHJlY2VpdmVkIHNuYXBzaG90IHZlcnNpb24uICovXG4gICAgICAgIHRoaXMubGFzdFJlbW90ZVNuYXBzaG90VmVyc2lvbiA9IHJ0Lm1pbigpLCBcbiAgICAgICAgLyoqIFRoZSBoaWdoZXN0IG51bWJlcmVkIHRhcmdldCBJRCBlbmNvdW50ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5oaWdoZXN0VGFyZ2V0SWQgPSAwLCBcbiAgICAgICAgLyoqIFRoZSBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciBlbmNvdW50ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5OcyA9IDAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBvcmRlcmVkIGJpZGlyZWN0aW9uYWwgbWFwcGluZyBiZXR3ZWVuIGRvY3VtZW50cyBhbmQgdGhlIHJlbW90ZSB0YXJnZXRcbiAgICAgICAgICogSURzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5rcyA9IG5ldyBPbywgdGhpcy50YXJnZXRDb3VudCA9IDAsIHRoaXMuTXMgPSBsby5rbigpO1xuICAgIH1cbiAgICBmb3JFYWNoVGFyZ2V0KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHMuZm9yRWFjaCgoKHQsIG4pID0+IGUobikpKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXRMYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUodGhpcy5sYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uKTtcbiAgICB9XG4gICAgZ2V0SGlnaGVzdFNlcXVlbmNlTnVtYmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUodGhpcy5Ocyk7XG4gICAgfVxuICAgIGFsbG9jYXRlVGFyZ2V0SWQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaWdoZXN0VGFyZ2V0SWQgPSB0aGlzLk1zLm5leHQoKSwgUnQucmVzb2x2ZSh0aGlzLmhpZ2hlc3RUYXJnZXRJZCk7XG4gICAgfVxuICAgIHNldFRhcmdldHNNZXRhZGF0YSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuICYmICh0aGlzLmxhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24gPSBuKSwgZSA+IHRoaXMuTnMgJiYgKHRoaXMuTnMgPSBlKSwgXG4gICAgICAgIFJ0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgRm4odCkge1xuICAgICAgICB0aGlzLnhzLnNldCh0LnRhcmdldCwgdCk7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldElkO1xuICAgICAgICBlID4gdGhpcy5oaWdoZXN0VGFyZ2V0SWQgJiYgKHRoaXMuTXMgPSBuZXcgbG8oZSksIHRoaXMuaGlnaGVzdFRhcmdldElkID0gZSksIHQuc2VxdWVuY2VOdW1iZXIgPiB0aGlzLk5zICYmICh0aGlzLk5zID0gdC5zZXF1ZW5jZU51bWJlcik7XG4gICAgfVxuICAgIGFkZFRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5GbihlKSwgdGhpcy50YXJnZXRDb3VudCArPSAxLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHVwZGF0ZVRhcmdldERhdGEodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5GbihlKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXREYXRhKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHMuZGVsZXRlKGUudGFyZ2V0KSwgdGhpcy5rcy5JcyhlLnRhcmdldElkKSwgdGhpcy50YXJnZXRDb3VudCAtPSAxLCBcbiAgICAgICAgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXRzKHQsIGUsIG4pIHtcbiAgICAgICAgbGV0IHMgPSAwO1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLnhzLmZvckVhY2goKChyLCBvKSA9PiB7XG4gICAgICAgICAgICBvLnNlcXVlbmNlTnVtYmVyIDw9IGUgJiYgbnVsbCA9PT0gbi5nZXQoby50YXJnZXRJZCkgJiYgKHRoaXMueHMuZGVsZXRlKHIpLCBpLnB1c2godGhpcy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBvLnRhcmdldElkKSksIFxuICAgICAgICAgICAgcysrKTtcbiAgICAgICAgfSkpLCBSdC53YWl0Rm9yKGkpLm5leHQoKCgpID0+IHMpKTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0Q291bnQodCkge1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSh0aGlzLnRhcmdldENvdW50KTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0RGF0YSh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnhzLmdldChlKSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gUnQucmVzb2x2ZShuKTtcbiAgICB9XG4gICAgYWRkTWF0Y2hpbmdLZXlzKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua3MuZ3MoZSwgbiksIFJ0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5rcy5wcyhlLCBuKTtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUsIGkgPSBbXTtcbiAgICAgICAgcmV0dXJuIHMgJiYgZS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIGkucHVzaChzLm1hcmtQb3RlbnRpYWxseU9ycGhhbmVkKHQsIGUpKTtcbiAgICAgICAgfSkpLCBSdC53YWl0Rm9yKGkpO1xuICAgIH1cbiAgICByZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtzLklzKGUpLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldE1hdGNoaW5nS2V5c0ZvclRhcmdldElkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMua3MuRXMoZSk7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKG4pO1xuICAgIH1cbiAgICBjb250YWluc0tleSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKHRoaXMua3MuY29udGFpbnNLZXkoZSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBtZW1vcnktYmFja2VkIGluc3RhbmNlIG9mIFBlcnNpc3RlbmNlLiBEYXRhIGlzIHN0b3JlZCBvbmx5IGluIFJBTSBhbmRcbiAqIG5vdCBwZXJzaXN0ZWQgYWNyb3NzIHNlc3Npb25zLlxuICovXG5jbGFzcyBLbyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBkZWxlZ2F0ZS4gVGhpc1xuICAgICAqIGFsbG93cyBib3RoIHRoZSBkZWxlZ2F0ZSBhbmQgdGhpcyBpbnN0YW5jZSB0byBoYXZlIHN0cm9uZyByZWZlcmVuY2VzIHRvXG4gICAgICogZWFjaCBvdGhlciB3aXRob3V0IGhhdmluZyBudWxsYWJsZSBmaWVsZHMgdGhhdCB3b3VsZCB0aGVuIG5lZWQgdG8gYmVcbiAgICAgKiBjaGVja2VkIG9yIGFzc2VydGVkIG9uIGV2ZXJ5IGFjY2Vzcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuJHMgPSB7fSwgdGhpcy5vdmVybGF5cyA9IHt9LCB0aGlzLk9zID0gbmV3IE90KDApLCB0aGlzLkZzID0gITEsIHRoaXMuRnMgPSAhMCwgXG4gICAgICAgIHRoaXMucmVmZXJlbmNlRGVsZWdhdGUgPSB0KHRoaXMpLCB0aGlzLkJzID0gbmV3IFVvKHRoaXMpO1xuICAgICAgICB0aGlzLmluZGV4TWFuYWdlciA9IG5ldyB6ciwgdGhpcy5yZW1vdGVEb2N1bWVudENhY2hlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbyh0KTtcbiAgICAgICAgfSgodCA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLkxzKHQpKSksIHRoaXMuc2VyaWFsaXplciA9IG5ldyBhcihlKSwgdGhpcy5xcyA9IG5ldyBNbyh0aGlzLnNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgLy8gTm8gZHVyYWJsZSBzdGF0ZSB0byBlbnN1cmUgaXMgY2xvc2VkIG9uIHNodXRkb3duLlxuICAgICAgICByZXR1cm4gdGhpcy5GcyA9ICExLCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZzO1xuICAgIH1cbiAgICBzZXREYXRhYmFzZURlbGV0ZWRMaXN0ZW5lcigpIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIHNldE5ldHdvcmtFbmFibGVkKCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgZ2V0SW5kZXhNYW5hZ2VyKHQpIHtcbiAgICAgICAgLy8gV2UgZG8gbm90IGN1cnJlbnRseSBzdXBwb3J0IGluZGljZXMgZm9yIG1lbW9yeSBwZXJzaXN0ZW5jZSwgc28gd2UgY2FuXG4gICAgICAgIC8vIHJldHVybiB0aGUgc2FtZSBzaGFyZWQgaW5zdGFuY2Ugb2YgdGhlIG1lbW9yeSBpbmRleCBtYW5hZ2VyLlxuICAgICAgICByZXR1cm4gdGhpcy5pbmRleE1hbmFnZXI7XG4gICAgfVxuICAgIGdldERvY3VtZW50T3ZlcmxheUNhY2hlKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLm92ZXJsYXlzW3QudG9LZXkoKV07XG4gICAgICAgIHJldHVybiBlIHx8IChlID0gbmV3ICRvLCB0aGlzLm92ZXJsYXlzW3QudG9LZXkoKV0gPSBlKSwgZTtcbiAgICB9XG4gICAgZ2V0TXV0YXRpb25RdWV1ZSh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gdGhpcy4kc1t0LnRvS2V5KCldO1xuICAgICAgICByZXR1cm4gbiB8fCAobiA9IG5ldyBCbyhlLCB0aGlzLnJlZmVyZW5jZURlbGVnYXRlKSwgdGhpcy4kc1t0LnRvS2V5KCldID0gbiksIG47XG4gICAgfVxuICAgIGdldFRhcmdldENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CcztcbiAgICB9XG4gICAgZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlRG9jdW1lbnRDYWNoZTtcbiAgICB9XG4gICAgZ2V0QnVuZGxlQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnFzO1xuICAgIH1cbiAgICBydW5UcmFuc2FjdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIE4oXCJNZW1vcnlQZXJzaXN0ZW5jZVwiLCBcIlN0YXJ0aW5nIHRyYW5zYWN0aW9uOlwiLCB0KTtcbiAgICAgICAgY29uc3QgcyA9IG5ldyBHbyh0aGlzLk9zLm5leHQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLlVzKCksIG4ocykubmV4dCgodCA9PiB0aGlzLnJlZmVyZW5jZURlbGVnYXRlLktzKHMpLm5leHQoKCgpID0+IHQpKSkpLnRvUHJvbWlzZSgpLnRoZW4oKHQgPT4gKHMucmFpc2VPbkNvbW1pdHRlZEV2ZW50KCksIFxuICAgICAgICB0KSkpO1xuICAgIH1cbiAgICBHcyh0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5vcihPYmplY3QudmFsdWVzKHRoaXMuJHMpLm1hcCgobiA9PiAoKSA9PiBuLmNvbnRhaW5zS2V5KHQsIGUpKSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZW1vcnkgcGVyc2lzdGVuY2UgaXMgbm90IGFjdHVhbGx5IHRyYW5zYWN0aW9uYWwsIGJ1dCBmdXR1cmUgaW1wbGVtZW50YXRpb25zXG4gKiBtYXkgaGF2ZSB0cmFuc2FjdGlvbi1zY29wZWQgc3RhdGUuXG4gKi8gY2xhc3MgR28gZXh0ZW5kcyBBdCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmN1cnJlbnRTZXF1ZW5jZU51bWJlciA9IHQ7XG4gICAgfVxufVxuXG5jbGFzcyBRbyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgXG4gICAgICAgIC8qKiBUcmFja3MgYWxsIGRvY3VtZW50cyB0aGF0IGFyZSBhY3RpdmUgaW4gUXVlcnkgdmlld3MuICovXG4gICAgICAgIHRoaXMuUXMgPSBuZXcgT28sIFxuICAgICAgICAvKiogVGhlIGxpc3Qgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIHBvdGVudGlhbGx5IEdDZWQgYWZ0ZXIgZWFjaCB0cmFuc2FjdGlvbi4gKi9cbiAgICAgICAgdGhpcy5qcyA9IG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyB6cyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUW8odCk7XG4gICAgfVxuICAgIGdldCBXcygpIHtcbiAgICAgICAgaWYgKHRoaXMuanMpIHJldHVybiB0aGlzLmpzO1xuICAgICAgICB0aHJvdyBPKCk7XG4gICAgfVxuICAgIGFkZFJlZmVyZW5jZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlFzLmFkZFJlZmVyZW5jZShuLCBlKSwgdGhpcy5Xcy5kZWxldGUobi50b1N0cmluZygpKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5Rcy5yZW1vdmVSZWZlcmVuY2UobiwgZSksIHRoaXMuV3MuYWRkKG4udG9TdHJpbmcoKSksIFJ0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgbWFya1BvdGVudGlhbGx5T3JwaGFuZWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Xcy5hZGQoZS50b1N0cmluZygpKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVUYXJnZXQodCwgZSkge1xuICAgICAgICB0aGlzLlFzLklzKGUudGFyZ2V0SWQpLmZvckVhY2goKHQgPT4gdGhpcy5Xcy5hZGQodC50b1N0cmluZygpKSkpO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpO1xuICAgICAgICByZXR1cm4gbi5nZXRNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBlLnRhcmdldElkKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHQuZm9yRWFjaCgodCA9PiB0aGlzLldzLmFkZCh0LnRvU3RyaW5nKCkpKSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBuLnJlbW92ZVRhcmdldERhdGEodCwgZSkpKTtcbiAgICB9XG4gICAgVXMoKSB7XG4gICAgICAgIHRoaXMuanMgPSBuZXcgU2V0O1xuICAgIH1cbiAgICBLcyh0KSB7XG4gICAgICAgIC8vIFJlbW92ZSBuZXdseSBvcnBoYW5lZCBkb2N1bWVudHMuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnBlcnNpc3RlbmNlLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKS5uZXdDaGFuZ2VCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIFJ0LmZvckVhY2godGhpcy5XcywgKG4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IGh0LmZyb21QYXRoKG4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuSHModCwgcykubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCBlLnJlbW92ZUVudHJ5KHMsIHJ0Lm1pbigpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+ICh0aGlzLmpzID0gbnVsbCwgZS5hcHBseSh0KSkpKTtcbiAgICB9XG4gICAgdXBkYXRlTGltYm9Eb2N1bWVudCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhzKHQsIGUpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgdCA/IHRoaXMuV3MuZGVsZXRlKGUudG9TdHJpbmcoKSkgOiB0aGlzLldzLmFkZChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIExzKHQpIHtcbiAgICAgICAgLy8gRm9yIGVhZ2VyIEdDLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBkb2N1bWVudCBzaXplLCB0aGVyZSBhcmUgbm8gc2l6ZSB0aHJlc2hvbGRzLlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgSHModCwgZSkge1xuICAgICAgICByZXR1cm4gUnQub3IoWyAoKSA9PiBSdC5yZXNvbHZlKHRoaXMuUXMuY29udGFpbnNLZXkoZSkpLCAoKSA9PiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkuY29udGFpbnNLZXkodCwgZSksICgpID0+IHRoaXMucGVyc2lzdGVuY2UuR3ModCwgZSkgXSk7XG4gICAgfVxufVxuXG5jbGFzcyBqbyB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdCwgdGhpcy5KcyA9IG5ldyBvcygodCA9PiBxdCh0LnBhdGgpKSwgKCh0LCBlKSA9PiB0LmlzRXF1YWwoZSkpKSwgXG4gICAgICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RvciA9IFRvKHRoaXMsIGUpO1xuICAgIH1cbiAgICBzdGF0aWMgenModCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IGpvKHQsIGUpO1xuICAgIH1cbiAgICAvLyBOby1vcHMsIHByZXNlbnQgc28gbWVtb3J5IHBlcnNpc3RlbmNlIGRvZXNuJ3QgaGF2ZSB0byBjYXJlIHdoaWNoIGRlbGVnYXRlXG4gICAgLy8gaXQgaGFzLlxuICAgIFVzKCkge31cbiAgICBLcyh0KSB7XG4gICAgICAgIHJldHVybiBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGZvckVhY2hUYXJnZXQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpLmZvckVhY2hUYXJnZXQodCwgZSk7XG4gICAgfVxuICAgIHpuKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuSm4odCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkuZ2V0VGFyZ2V0Q291bnQodCkubmV4dCgodCA9PiBlLm5leHQoKGUgPT4gdCArIGUpKSkpO1xuICAgIH1cbiAgICBKbih0KSB7XG4gICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuV24odCwgKHQgPT4ge1xuICAgICAgICAgICAgZSsrO1xuICAgICAgICB9KSkubmV4dCgoKCkgPT4gZSkpO1xuICAgIH1cbiAgICBXbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBSdC5mb3JFYWNoKHRoaXMuSnMsICgobiwgcykgPT4gdGhpcy5Ybih0LCBuLCBzKS5uZXh0KCh0ID0+IHQgPyBSdC5yZXNvbHZlKCkgOiBlKHMpKSkpKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkucmVtb3ZlVGFyZ2V0cyh0LCBlLCBuKTtcbiAgICB9XG4gICAgcmVtb3ZlT3JwaGFuZWREb2N1bWVudHModCwgZSkge1xuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlcnNpc3RlbmNlLmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKSwgaSA9IHMubmV3Q2hhbmdlQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBzLkNzKHQsIChzID0+IHRoaXMuWG4odCwgcywgZSkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICB0IHx8IChuKyssIGkucmVtb3ZlRW50cnkocywgcnQubWluKCkpKTtcbiAgICAgICAgfSkpKSkubmV4dCgoKCkgPT4gaS5hcHBseSh0KSkpLm5leHQoKCgpID0+IG4pKTtcbiAgICB9XG4gICAgbWFya1BvdGVudGlhbGx5T3JwaGFuZWQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Kcy5zZXQoZSwgdC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldCh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlLndpdGhTZXF1ZW5jZU51bWJlcih0LmN1cnJlbnRTZXF1ZW5jZU51bWJlcik7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmdldFRhcmdldENhY2hlKCkudXBkYXRlVGFyZ2V0RGF0YSh0LCBuKTtcbiAgICB9XG4gICAgYWRkUmVmZXJlbmNlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSnMuc2V0KG4sIHQuY3VycmVudFNlcXVlbmNlTnVtYmVyKSwgUnQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdmVSZWZlcmVuY2UodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gdGhpcy5Kcy5zZXQobiwgdC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5Kcy5zZXQoZSwgdC5jdXJyZW50U2VxdWVuY2VOdW1iZXIpLCBSdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIExzKHQpIHtcbiAgICAgICAgbGV0IGUgPSB0LmtleS50b1N0cmluZygpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHQuaXNGb3VuZERvY3VtZW50KCkgJiYgKGUgKz0gemUodC5kYXRhLnZhbHVlKSksIGU7XG4gICAgfVxuICAgIFhuKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIFJ0Lm9yKFsgKCkgPT4gdGhpcy5wZXJzaXN0ZW5jZS5Hcyh0LCBlKSwgKCkgPT4gdGhpcy5wZXJzaXN0ZW5jZS5nZXRUYXJnZXRDYWNoZSgpLmNvbnRhaW5zS2V5KHQsIGUpLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5Kcy5nZXQoZSk7XG4gICAgICAgICAgICByZXR1cm4gUnQucmVzb2x2ZSh2b2lkIDAgIT09IHQgJiYgdCA+IG4pO1xuICAgICAgICB9IF0pO1xuICAgIH1cbiAgICBnZXRDYWNoZVNpemUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5nZXRSZW1vdGVEb2N1bWVudENhY2hlKCkuZ2V0U2l6ZSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogUGVyZm9ybXMgZGF0YWJhc2UgY3JlYXRpb24gYW5kIHNjaGVtYSB1cGdyYWRlcy4gKi8gY2xhc3Mgem8ge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgZGF0YWJhc2UgY3JlYXRpb24gYW5kIHNjaGVtYSB1cGdyYWRlcy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpbiBwcm9kdWN0aW9uLCB0aGlzIG1ldGhvZCBpcyBvbmx5IGV2ZXIgdXNlZCB0byB1cGdyYWRlIHRoZSBzY2hlbWFcbiAgICAgKiB0byBTQ0hFTUFfVkVSU0lPTi4gRGlmZmVyZW50IHZhbHVlcyBvZiB0b1ZlcnNpb24gYXJlIG9ubHkgdXNlZCBmb3IgdGVzdGluZ1xuICAgICAqIGFuZCBsb2NhbCBmZWF0dXJlIGRldmVsb3BtZW50LlxuICAgICAqLyAgICBPKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgY29uc3QgaSA9IG5ldyBQdChcImNyZWF0ZU9yVXBncmFkZVwiLCBlKTtcbiAgICAgICAgbiA8IDEgJiYgcyA+PSAxICYmIChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwib3duZXJcIik7XG4gICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJtdXRhdGlvblF1ZXVlc1wiLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogXCJ1c2VySWRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImJhdGNoSWRcIixcbiAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJ1c2VyTXV0YXRpb25zSW5kZXhcIiwgUXQsIHtcbiAgICAgICAgICAgICAgICB1bmlxdWU6ICEwXG4gICAgICAgICAgICB9KSwgdC5jcmVhdGVPYmplY3RTdG9yZShcImRvY3VtZW50TXV0YXRpb25zXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogVXBncmFkZSBmdW5jdGlvbiB0byBtaWdyYXRlIHRoZSAnbXV0YXRpb25zJyBzdG9yZSBmcm9tIFYxIHRvIFYzLiBMb2Fkc1xuICogYW5kIHJld3JpdGVzIGFsbCBkYXRhLlxuICovICh0KSwgV28odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgIH0odCkpO1xuICAgICAgICAvLyBNaWdyYXRpb24gMiB0byBwb3B1bGF0ZSB0aGUgdGFyZ2V0R2xvYmFsIG9iamVjdCBubyBsb25nZXIgbmVlZGVkIHNpbmNlXG4gICAgICAgIC8vIG1pZ3JhdGlvbiAzIHVuY29uZGl0aW9uYWxseSBjbGVhcnMgaXQuXG4gICAgICAgICAgICAgICAgbGV0IHIgPSBSdC5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBuIDwgMyAmJiBzID49IDMgJiYgKFxuICAgICAgICAvLyBCcmFuZCBuZXcgY2xpZW50cyBkb24ndCBuZWVkIHRvIGRyb3AgYW5kIHJlY3JlYXRlLS1vbmx5IGNsaWVudHMgdGhhdFxuICAgICAgICAvLyBwb3RlbnRpYWxseSBoYXZlIGNvcnJ1cHQgZGF0YS5cbiAgICAgICAgMCAhPT0gbiAmJiAoIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXREb2N1bWVudHNcIiksIHQuZGVsZXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXRzXCIpLCB0LmRlbGV0ZU9iamVjdFN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpO1xuICAgICAgICB9KHQpLCBXbyh0KSksIHIgPSByLm5leHQoKCgpID0+IFxuICAgICAgICAvKipcbiAqIENyZWF0ZXMgdGhlIHRhcmdldCBnbG9iYWwgc2luZ2xldG9uIHJvdy5cbiAqXG4gKiBAcGFyYW0gdHhuIC0gVGhlIHZlcnNpb24gdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgaW5kZXhlZGRiXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RvcmUoXCJ0YXJnZXRHbG9iYWxcIiksIG4gPSB7XG4gICAgICAgICAgICAgICAgaGlnaGVzdFRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgIGhpZ2hlc3RMaXN0ZW5TZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgICAgICAgICAgICBsYXN0UmVtb3RlU25hcHNob3RWZXJzaW9uOiBydC5taW4oKS50b1RpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgIHRhcmdldENvdW50OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGUucHV0KFwidGFyZ2V0R2xvYmFsS2V5XCIsIG4pO1xuICAgICAgICB9KGkpKSkpLCBuIDwgNCAmJiBzID49IDQgJiYgKDAgIT09IG4gJiYgKFxuICAgICAgICAvLyBTY2hlbWEgdmVyc2lvbiAzIHVzZXMgYXV0by1nZW5lcmF0ZWQga2V5cyB0byBnZW5lcmF0ZSBnbG9iYWxseSB1bmlxdWVcbiAgICAgICAgLy8gbXV0YXRpb24gYmF0Y2ggSURzICh0aGlzIHdhcyBwcmV2aW91c2x5IGVuc3VyZWQgaW50ZXJuYWxseSBieSB0aGVcbiAgICAgICAgLy8gY2xpZW50KS4gVG8gbWlncmF0ZSB0byB0aGUgbmV3IHNjaGVtYSwgd2UgaGF2ZSB0byByZWFkIGFsbCBtdXRhdGlvbnNcbiAgICAgICAgLy8gYW5kIHdyaXRlIHRoZW0gYmFjayBvdXQuIFdlIHByZXNlcnZlIHRoZSBleGlzdGluZyBiYXRjaCBJRHMgdG8gZ3VhcmFudGVlXG4gICAgICAgIC8vIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgb2JqZWN0IHN0b3Jlcy4gQW55IGZ1cnRoZXIgbXV0YXRpb24gYmF0Y2ggSURzIHdpbGxcbiAgICAgICAgLy8gYmUgYXV0by1nZW5lcmF0ZWQuXG4gICAgICAgIHIgPSByLm5leHQoKCgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlLnN0b3JlKFwibXV0YXRpb25zXCIpLmooKS5uZXh0KChuID0+IHtcbiAgICAgICAgICAgICAgICB0LmRlbGV0ZU9iamVjdFN0b3JlKFwibXV0YXRpb25zXCIpO1xuICAgICAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJtdXRhdGlvbnNcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImJhdGNoSWRcIixcbiAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudDogITBcbiAgICAgICAgICAgICAgICB9KS5jcmVhdGVJbmRleChcInVzZXJNdXRhdGlvbnNJbmRleFwiLCBRdCwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUuc3RvcmUoXCJtdXRhdGlvbnNcIiksIGkgPSBuLm1hcCgodCA9PiBzLnB1dCh0KSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdC53YWl0Rm9yKGkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KHQsIGkpKSkpLCByID0gci5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICAhZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJjbGllbnRNZXRhZGF0YVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IFwiY2xpZW50SWRcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfSkpKSwgbiA8IDUgJiYgcyA+PSA1ICYmIChyID0gci5uZXh0KCgoKSA9PiB0aGlzLllzKGkpKSkpLCBuIDwgNiAmJiBzID49IDYgJiYgKHIgPSByLm5leHQoKCgpID0+IChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwicmVtb3RlRG9jdW1lbnRHbG9iYWxcIik7XG4gICAgICAgIH0odCksIHRoaXMuWHMoaSkpKSkpLCBuIDwgNyAmJiBzID49IDcgJiYgKHIgPSByLm5leHQoKCgpID0+IHRoaXMuWnMoaSkpKSksIG4gPCA4ICYmIHMgPj0gOCAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy50aSh0LCBpKSkpKSwgXG4gICAgICAgIG4gPCA5ICYmIHMgPj0gOSAmJiAociA9IHIubmV4dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTXVsdGktVGFiIHVzZWQgdG8gbWFuYWdlIGl0cyBvd24gY2hhbmdlbG9nLCBidXQgdGhpcyBoYXMgYmVlbiBtb3ZlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIERiUmVtb3RlRG9jdW1lbnQgb2JqZWN0IHN0b3JlIGl0c2VsZi4gU2luY2UgdGhlIHByZXZpb3VzIGNoYW5nZVxuICAgICAgICAgICAgLy8gbG9nIG9ubHkgY29udGFpbmVkIHRyYW5zaWVudCBkYXRhLCB3ZSBjYW4gZHJvcCBpdHMgb2JqZWN0IHN0b3JlLlxuICAgICAgICAgICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0Lm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoXCJyZW1vdGVEb2N1bWVudENoYW5nZXNcIikgJiYgdC5kZWxldGVPYmplY3RTdG9yZShcInJlbW90ZURvY3VtZW50Q2hhbmdlc1wiKTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgICAgICAvLyBOb3RlOiBTY2hlbWEgdmVyc2lvbiA5IHVzZWQgdG8gY3JlYXRlIGEgcmVhZCB0aW1lIGluZGV4IGZvciB0aGVcbiAgICAgICAgICAgIC8vIFJlbW90ZURvY3VtZW50Q2FjaGUuIFRoaXMgaXMgbm93IGRvbmUgd2l0aCBzY2hlbWEgdmVyc2lvbiAxMy5cbiAgICAgICAgICAgICAgICB9KSkpLCBuIDwgMTAgJiYgcyA+PSAxMCAmJiAociA9IHIubmV4dCgoKCkgPT4gdGhpcy5laShpKSkpKSwgbiA8IDExICYmIHMgPj0gMTEgJiYgKHIgPSByLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImJ1bmRsZXNcIiwge1xuICAgICAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImJ1bmRsZUlkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwibmFtZWRRdWVyaWVzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAga2V5UGF0aDogXCJuYW1lXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0odCk7XG4gICAgICAgIH0pKSksIG4gPCAxMiAmJiBzID49IDEyICYmIChyID0gci5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICAhZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiZG9jdW1lbnRPdmVybGF5c1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGtleVBhdGg6IG9lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZS5jcmVhdGVJbmRleChcImNvbGxlY3Rpb25QYXRoT3ZlcmxheUluZGV4XCIsIHVlLCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgICAgICB9KSwgZS5jcmVhdGVJbmRleChcImNvbGxlY3Rpb25Hcm91cE92ZXJsYXlJbmRleFwiLCBjZSwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6ICExXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KHQpO1xuICAgICAgICB9KSkpLCBuIDwgMTMgJiYgcyA+PSAxMyAmJiAociA9IHIubmV4dCgoKCkgPT4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJyZW1vdGVEb2N1bWVudHNWMTRcIiwge1xuICAgICAgICAgICAgICAgIGtleVBhdGg6IEh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGUuY3JlYXRlSW5kZXgoXCJkb2N1bWVudEtleUluZGV4XCIsIEp0KSwgZS5jcmVhdGVJbmRleChcImNvbGxlY3Rpb25Hcm91cEluZGV4XCIsIFl0KTtcbiAgICAgICAgfSh0KSkpLm5leHQoKCgpID0+IHRoaXMubmkodCwgaSkpKS5uZXh0KCgoKSA9PiB0LmRlbGV0ZU9iamVjdFN0b3JlKFwicmVtb3RlRG9jdW1lbnRzXCIpKSkpLCBcbiAgICAgICAgbiA8IDE0ICYmIHMgPj0gMTQgJiYgKHIgPSByLm5leHQoKCgpID0+IHRoaXMuc2kodCwgaSkpKSksIG4gPCAxNSAmJiBzID49IDE1ICYmIChyID0gci5uZXh0KCgoKSA9PiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiaW5kZXhDb25maWd1cmF0aW9uXCIsIHtcbiAgICAgICAgICAgICAgICBrZXlQYXRoOiBcImluZGV4SWRcIixcbiAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50OiAhMFxuICAgICAgICAgICAgfSkuY3JlYXRlSW5kZXgoXCJjb2xsZWN0aW9uR3JvdXBJbmRleFwiLCBcImNvbGxlY3Rpb25Hcm91cFwiLCB7XG4gICAgICAgICAgICAgICAgdW5pcXVlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LmNyZWF0ZU9iamVjdFN0b3JlKFwiaW5kZXhTdGF0ZVwiLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogbmVcbiAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwic2VxdWVuY2VOdW1iZXJJbmRleFwiLCBzZSwge1xuICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdC5jcmVhdGVPYmplY3RTdG9yZShcImluZGV4RW50cmllc1wiLCB7XG4gICAgICAgICAgICAgICAga2V5UGF0aDogaWVcbiAgICAgICAgICAgIH0pLmNyZWF0ZUluZGV4KFwiZG9jdW1lbnRLZXlJbmRleFwiLCByZSwge1xuICAgICAgICAgICAgICAgIHVuaXF1ZTogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KHQpKSkpLCByO1xuICAgIH1cbiAgICBYcyh0KSB7XG4gICAgICAgIGxldCBlID0gMDtcbiAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIikuWCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGUgKz0gcm8obik7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgICAgIGJ5dGVTaXplOiBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHQuc3RvcmUoXCJyZW1vdGVEb2N1bWVudEdsb2JhbFwiKS5wdXQoXCJyZW1vdGVEb2N1bWVudEdsb2JhbEtleVwiLCBuKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBZcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwibXV0YXRpb25RdWV1ZXNcIiksIG4gPSB0LnN0b3JlKFwibXV0YXRpb25zXCIpO1xuICAgICAgICByZXR1cm4gZS5qKCkubmV4dCgoZSA9PiBSdC5mb3JFYWNoKGUsIChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBJREJLZXlSYW5nZS5ib3VuZChbIGUudXNlcklkLCAtMSBdLCBbIGUudXNlcklkLCBlLmxhc3RBY2tub3dsZWRnZWRCYXRjaElkIF0pO1xuICAgICAgICAgICAgcmV0dXJuIG4uaihcInVzZXJNdXRhdGlvbnNJbmRleFwiLCBzKS5uZXh0KChuID0+IFJ0LmZvckVhY2gobiwgKG4gPT4ge1xuICAgICAgICAgICAgICAgIEYobi51c2VySWQgPT09IGUudXNlcklkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gX3IodGhpcy5zZXJpYWxpemVyLCBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW8odCwgZS51c2VySWQsIHMpLm5leHQoKCgpID0+IHt9KSk7XG4gICAgICAgICAgICB9KSkpKTtcbiAgICAgICAgfSkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCBldmVyeSBkb2N1bWVudCBpbiB0aGUgcmVtb3RlIGRvY3VtZW50IGNhY2hlIGhhcyBhIGNvcnJlc3BvbmRpbmcgc2VudGluZWwgcm93XG4gICAgICogd2l0aCBhIHNlcXVlbmNlIG51bWJlci4gTWlzc2luZyByb3dzIGFyZSBnaXZlbiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIHNlcXVlbmNlIG51bWJlci5cbiAgICAgKi8gICAgWnModCkge1xuICAgICAgICBjb25zdCBlID0gdC5zdG9yZShcInRhcmdldERvY3VtZW50c1wiKSwgbiA9IHQuc3RvcmUoXCJyZW1vdGVEb2N1bWVudHNcIik7XG4gICAgICAgIHJldHVybiB0LnN0b3JlKFwidGFyZ2V0R2xvYmFsXCIpLmdldChcInRhcmdldEdsb2JhbEtleVwiKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiBuLlgoKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyB1dChuKSwgbyA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsgMCwgcXQodCkgXTtcbiAgICAgICAgICAgICAgICB9KHIpO1xuICAgICAgICAgICAgICAgIHMucHVzaChlLmdldChvKS5uZXh0KChuID0+IG4gPyBSdC5yZXNvbHZlKCkgOiAobiA9PiBlLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldElkOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBxdChuKSxcbiAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IHQuaGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyXG4gICAgICAgICAgICAgICAgfSkpKHIpKSkpO1xuICAgICAgICAgICAgfSkpLm5leHQoKCgpID0+IFJ0LndhaXRGb3IocykpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB0aSh0LCBlKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5kZXguXG4gICAgICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiLCB7XG4gICAgICAgICAgICBrZXlQYXRoOiBlZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbiA9IGUuc3RvcmUoXCJjb2xsZWN0aW9uUGFyZW50c1wiKSwgcyA9IG5ldyBXciwgaSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKHMuYWRkKHQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQubGFzdFNlZ21lbnQoKSwgcyA9IHQucG9wTGFzdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnB1dCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBxdChzKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIZWxwZXIgdG8gYWRkIGFuIGluZGV4IGVudHJ5IGlmZiB3ZSBoYXZlbid0IGFscmVhZHkgd3JpdHRlbiBpdC5cbiAgICAgICAgICAgICAgICAvLyBJbmRleCBleGlzdGluZyByZW1vdGUgZG9jdW1lbnRzLlxuICAgICAgICByZXR1cm4gZS5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKS5YKHtcbiAgICAgICAgICAgIFk6ICEwXG4gICAgICAgIH0sICgodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IG5ldyB1dCh0KTtcbiAgICAgICAgICAgIHJldHVybiBpKG4ucG9wTGFzdCgpKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IGUuc3RvcmUoXCJkb2N1bWVudE11dGF0aW9uc1wiKS5YKHtcbiAgICAgICAgICAgIFk6ICEwXG4gICAgICAgIH0sICgoW3QsIGUsIG5dLCBzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByID0gR3QoZSk7XG4gICAgICAgICAgICByZXR1cm4gaShyLnBvcExhc3QoKSk7XG4gICAgICAgIH0pKSkpO1xuICAgIH1cbiAgICBlaSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0LnN0b3JlKFwidGFyZ2V0c1wiKTtcbiAgICAgICAgcmV0dXJuIGUuWCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBtcihuKSwgaSA9IGdyKHRoaXMuc2VyaWFsaXplciwgcyk7XG4gICAgICAgICAgICByZXR1cm4gZS5wdXQoaSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgbmkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gZS5zdG9yZShcInJlbW90ZURvY3VtZW50c1wiKSwgcyA9IFtdO1xuICAgICAgICByZXR1cm4gbi5YKCgodCwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IGUuc3RvcmUoXCJyZW1vdGVEb2N1bWVudHNWMTRcIiksIHIgPSAobyA9IG4sIG8uZG9jdW1lbnQgPyBuZXcgaHQodXQuZnJvbVN0cmluZyhvLmRvY3VtZW50Lm5hbWUpLnBvcEZpcnN0KDUpKSA6IG8ubm9Eb2N1bWVudCA/IGh0LmZyb21TZWdtZW50cyhvLm5vRG9jdW1lbnQucGF0aCkgOiBvLnVua25vd25Eb2N1bWVudCA/IGh0LmZyb21TZWdtZW50cyhvLnVua25vd25Eb2N1bWVudC5wYXRoKSA6IE8oKSkucGF0aC50b0FycmF5KCk7XG4gICAgICAgICAgICB2YXIgbztcbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICAgICAgICAgICAgY29uc3QgdSA9IHtcbiAgICAgICAgICAgICAgICBwcmVmaXhQYXRoOiByLnNsaWNlKDAsIHIubGVuZ3RoIC0gMiksXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkdyb3VwOiByW3IubGVuZ3RoIC0gMl0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZDogcltyLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgIHJlYWRUaW1lOiBuLnJlYWRUaW1lIHx8IFsgMCwgMCBdLFxuICAgICAgICAgICAgICAgIHVua25vd25Eb2N1bWVudDogbi51bmtub3duRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgbm9Eb2N1bWVudDogbi5ub0RvY3VtZW50LFxuICAgICAgICAgICAgICAgIGRvY3VtZW50OiBuLmRvY3VtZW50LFxuICAgICAgICAgICAgICAgIGhhc0NvbW1pdHRlZE11dGF0aW9uczogISFuLmhhc0NvbW1pdHRlZE11dGF0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHMucHVzaChpLnB1dCh1KSk7XG4gICAgICAgIH0pKS5uZXh0KCgoKSA9PiBSdC53YWl0Rm9yKHMpKSk7XG4gICAgfVxuICAgIHNpKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGUuc3RvcmUoXCJtdXRhdGlvbnNcIiksIHMgPSBQbyh0aGlzLnNlcmlhbGl6ZXIpLCBpID0gbmV3IEtvKFFvLnpzLCB0aGlzLnNlcmlhbGl6ZXIuZmUpO1xuICAgICAgICByZXR1cm4gbi5qKCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IE1hcDtcbiAgICAgICAgICAgIHJldHVybiB0LmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBlO1xuICAgICAgICAgICAgICAgIGxldCBzID0gbnVsbCAhPT0gKGUgPSBuLmdldCh0LnVzZXJJZCkpICYmIHZvaWQgMCAhPT0gZSA/IGUgOiBncygpO1xuICAgICAgICAgICAgICAgIF9yKHRoaXMuc2VyaWFsaXplciwgdCkua2V5cygpLmZvckVhY2goKHQgPT4gcyA9IHMuYWRkKHQpKSksIG4uc2V0KHQudXNlcklkLCBzKTtcbiAgICAgICAgICAgIH0pKSwgUnQuZm9yRWFjaChuLCAoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gbmV3IFYobiksIG8gPSBSci5kZSh0aGlzLnNlcmlhbGl6ZXIsIHIpLCB1ID0gaS5nZXRJbmRleE1hbmFnZXIociksIGMgPSBvby5kZShyLCB0aGlzLnNlcmlhbGl6ZXIsIHUsIGkucmVmZXJlbmNlRGVsZWdhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcga28ocywgYywgbywgdSkucmVjYWxjdWxhdGVBbmRTYXZlT3ZlcmxheXNGb3JEb2N1bWVudEtleXMobmV3IHdlKGUsIE90LmN0KSwgdCkubmV4dCgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBXbyh0KSB7XG4gICAgdC5jcmVhdGVPYmplY3RTdG9yZShcInRhcmdldERvY3VtZW50c1wiLCB7XG4gICAgICAgIGtleVBhdGg6IFp0XG4gICAgfSkuY3JlYXRlSW5kZXgoXCJkb2N1bWVudFRhcmdldHNJbmRleFwiLCB0ZSwge1xuICAgICAgICB1bmlxdWU6ICEwXG4gICAgfSk7XG4gICAgLy8gTk9URTogVGhpcyBpcyB1bmlxdWUgb25seSBiZWNhdXNlIHRoZSBUYXJnZXRJZCBpcyB0aGUgc3VmZml4LlxuICAgIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXRzXCIsIHtcbiAgICAgICAga2V5UGF0aDogXCJ0YXJnZXRJZFwiXG4gICAgfSkuY3JlYXRlSW5kZXgoXCJxdWVyeVRhcmdldHNJbmRleFwiLCBYdCwge1xuICAgICAgICB1bmlxdWU6ICEwXG4gICAgfSksIHQuY3JlYXRlT2JqZWN0U3RvcmUoXCJ0YXJnZXRHbG9iYWxcIik7XG59XG5cbmNvbnN0IEhvID0gXCJGYWlsZWQgdG8gb2J0YWluIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUbyBhbGxvdyBzaGFyZWQgYWNjZXNzLCBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uIGhhcyB0byBiZSBlbmFibGVkIGluIGFsbCB0YWJzLiBJZiB5b3UgYXJlIHVzaW5nIGBleHBlcmltZW50YWxGb3JjZU93bmluZ1RhYjp0cnVlYCwgbWFrZSBzdXJlIHRoYXQgb25seSBvbmUgdGFiIGhhcyBwZXJzaXN0ZW5jZSBlbmFibGVkIGF0IGFueSBnaXZlbiB0aW1lLlwiO1xuXG4vKipcbiAqIE9sZGVzdCBhY2NlcHRhYmxlIGFnZSBpbiBtaWxsaXNlY29uZHMgZm9yIGNsaWVudCBtZXRhZGF0YSBiZWZvcmUgdGhlIGNsaWVudFxuICogaXMgY29uc2lkZXJlZCBpbmFjdGl2ZSBhbmQgaXRzIGFzc29jaWF0ZWQgZGF0YSBpcyBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqL1xuLyoqXG4gKiBBbiBJbmRleGVkREItYmFja2VkIGluc3RhbmNlIG9mIFBlcnNpc3RlbmNlLiBEYXRhIGlzIHN0b3JlZCBwZXJzaXN0ZW50bHlcbiAqIGFjcm9zcyBzZXNzaW9ucy5cbiAqXG4gKiBPbiBXZWIgb25seSwgdGhlIEZpcmVzdG9yZSBTREtzIHN1cHBvcnQgc2hhcmVkIGFjY2VzcyB0byBpdHMgcGVyc2lzdGVuY2VcbiAqIGxheWVyLiBUaGlzIGFsbG93cyBtdWx0aXBsZSBicm93c2VyIHRhYnMgdG8gcmVhZCBhbmQgd3JpdGUgdG8gSW5kZXhlZERiIGFuZFxuICogdG8gc3luY2hyb25pemUgc3RhdGUgZXZlbiB3aXRob3V0IG5ldHdvcmsgY29ubmVjdGl2aXR5LiBTaGFyZWQgYWNjZXNzIGlzXG4gKiBjdXJyZW50bHkgb3B0aW9uYWwgYW5kIG5vdCBlbmFibGVkIHVubGVzcyBhbGwgY2xpZW50cyBpbnZva2VcbiAqIGBlbmFibGVQZXJzaXN0ZW5jZSgpYCB3aXRoIGB7c3luY2hyb25pemVUYWJzOnRydWV9YC5cbiAqXG4gKiBJbiBtdWx0aS10YWIgbW9kZSwgaWYgbXVsdGlwbGUgY2xpZW50cyBhcmUgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBTREtcbiAqIHdpbGwgZGVzaWduYXRlIG9uZSBjbGllbnQgYXMgdGhlIOKAnHByaW1hcnkgY2xpZW504oCdLiBBbiBlZmZvcnQgaXMgbWFkZSB0byBwaWNrXG4gKiBhIHZpc2libGUsIG5ldHdvcmstY29ubmVjdGVkIGFuZCBhY3RpdmUgY2xpZW50LCBhbmQgdGhpcyBjbGllbnQgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBsZXR0aW5nIG90aGVyIGNsaWVudHMga25vdyBhYm91dCBpdHMgcHJlc2VuY2UuIFRoZSBwcmltYXJ5XG4gKiBjbGllbnQgd3JpdGVzIGEgdW5pcXVlIGNsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciAodGhlIGNsaWVudCBJRCkgdG9cbiAqIEluZGV4ZWREYuKAmXMg4oCcb3duZXLigJ0gc3RvcmUgZXZlcnkgNCBzZWNvbmRzLiBJZiB0aGUgcHJpbWFyeSBjbGllbnQgZmFpbHMgdG9cbiAqIHVwZGF0ZSB0aGlzIGVudHJ5LCBhbm90aGVyIGNsaWVudCBjYW4gYWNxdWlyZSB0aGUgbGVhc2UgYW5kIHRha2Ugb3ZlciBhc1xuICogcHJpbWFyeS5cbiAqXG4gKiBTb21lIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMgaW4gdGhlIFNESyBhcmUgZGVzaWduYXRlZCBhcyBwcmltYXJ5LWNsaWVudCBvbmx5XG4gKiBvcGVyYXRpb25zLiBUaGlzIGluY2x1ZGVzIHRoZSBhY2tub3dsZWRnbWVudCBvZiBtdXRhdGlvbnMgYW5kIGFsbCB1cGRhdGVzIG9mXG4gKiByZW1vdGUgZG9jdW1lbnRzLiBUaGUgZWZmZWN0cyBvZiB0aGVzZSBvcGVyYXRpb25zIGFyZSB3cml0dGVuIHRvIHBlcnNpc3RlbmNlXG4gKiBhbmQgdGhlbiBicm9hZGNhc3QgdG8gb3RoZXIgdGFicyB2aWEgTG9jYWxTdG9yYWdlIChzZWVcbiAqIGBXZWJTdG9yYWdlU2hhcmVkQ2xpZW50U3RhdGVgKSwgd2hpY2ggdGhlbiByZWZyZXNoIHRoZWlyIHN0YXRlIGZyb21cbiAqIHBlcnNpc3RlbmNlLlxuICpcbiAqIFNpbWlsYXJseSwgdGhlIHByaW1hcnkgY2xpZW50IGxpc3RlbnMgdG8gbm90aWZpY2F0aW9ucyBzZW50IGJ5IHNlY29uZGFyeVxuICogY2xpZW50cyB0byBkaXNjb3ZlciBwZXJzaXN0ZW5jZSBjaGFuZ2VzIHdyaXR0ZW4gYnkgc2Vjb25kYXJ5IGNsaWVudHMsIHN1Y2ggYXNcbiAqIHRoZSBhZGRpdGlvbiBvZiBuZXcgbXV0YXRpb25zIGFuZCBxdWVyeSB0YXJnZXRzLlxuICpcbiAqIElmIG11bHRpLXRhYiBpcyBub3QgZW5hYmxlZCBhbmQgYW5vdGhlciB0YWIgYWxyZWFkeSBvYnRhaW5lZCB0aGUgcHJpbWFyeVxuICogbGVhc2UsIEluZGV4ZWREYlBlcnNpc3RlbmNlIGVudGVycyBhIGZhaWxlZCBzdGF0ZSBhbmQgYWxsIHN1YnNlcXVlbnRcbiAqIG9wZXJhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuXG4gKlxuICogQWRkaXRpb25hbGx5LCB0aGVyZSBpcyBhbiBvcHRpbWl6YXRpb24gc28gdGhhdCB3aGVuIGEgdGFiIGlzIGNsb3NlZCwgdGhlXG4gKiBwcmltYXJ5IGxlYXNlIGlzIHJlbGVhc2VkIGltbWVkaWF0ZWx5ICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIG1ha2VcbiAqIHN1cmUgdGhhdCBhIHJlZnJlc2hlZCB0YWIgaXMgYWJsZSB0byBpbW1lZGlhdGVseSByZS1hY3F1aXJlIHRoZSBwcmltYXJ5XG4gKiBsZWFzZSkuIFVuZm9ydHVuYXRlbHksIEluZGV4ZWREQiBjYW5ub3QgYmUgcmVsaWFibHkgdXNlZCBpbiB3aW5kb3cudW5sb2FkXG4gKiBzaW5jZSBpdCBpcyBhbiBhc3luY2hyb25vdXMgQVBJLiBTbyBpbiBhZGRpdGlvbiB0byBhdHRlbXB0aW5nIHRvIGdpdmUgdXAgdGhlXG4gKiBsZWFzZSwgdGhlIGxlYXNlaG9sZGVyIHdyaXRlcyBpdHMgY2xpZW50IElEIHRvIGEgXCJ6b21iaWVkQ2xpZW50XCIgZW50cnkgaW5cbiAqIExvY2FsU3RvcmFnZSB3aGljaCBhY3RzIGFzIGFuIGluZGljYXRvciB0aGF0IGFub3RoZXIgdGFiIHNob3VsZCBnbyBhaGVhZCBhbmRcbiAqIHRha2UgdGhlIHByaW1hcnkgbGVhc2UgaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBsZWFzZSB0aW1lc3RhbXAuXG4gKlxuICogVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSBgc3luY2hyb25pemVUYWJzYCBzZWN0aW9uIHdoZW4gbXVsdGktdGFiIGlzIG5vXG4gKiBsb25nZXIgb3B0aW9uYWwuXG4gKi9cbmNsYXNzIEpvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHN5bmNocm9uaXplIHRoZSBpbi1tZW1vcnkgc3RhdGUgb2YgbXVsdGlwbGUgdGFicyBhbmQgc2hhcmVcbiAgICAgKiBhY2Nlc3MgdG8gbG9jYWwgcGVyc2lzdGVuY2UuXG4gICAgICovXG4gICAgdCwgZSwgbiwgcywgaSwgciwgbywgdSwgYywgXG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIHRydWUsIGZvcmNlZnVsbHkgb2J0YWlucyBkYXRhYmFzZSBhY2Nlc3MuIEV4aXN0aW5nIHRhYnMgd2lsbFxuICAgICAqIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBJbmRleGVkREIuXG4gICAgICovXG4gICAgYSwgaCA9IDE1KSB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uID0gdCwgdGhpcy5wZXJzaXN0ZW5jZUtleSA9IGUsIHRoaXMuY2xpZW50SWQgPSBuLCBcbiAgICAgICAgdGhpcy5paSA9IGksIHRoaXMud2luZG93ID0gciwgdGhpcy5kb2N1bWVudCA9IG8sIHRoaXMucmkgPSBjLCB0aGlzLm9pID0gYSwgdGhpcy51aSA9IGgsIFxuICAgICAgICB0aGlzLk9zID0gbnVsbCwgdGhpcy5GcyA9ICExLCB0aGlzLmlzUHJpbWFyeSA9ICExLCB0aGlzLm5ldHdvcmtFbmFibGVkID0gITAsIFxuICAgICAgICAvKiogT3VyIHdpbmRvdy51bmxvYWQgaGFuZGxlciwgaWYgcmVnaXN0ZXJlZC4gKi9cbiAgICAgICAgdGhpcy5jaSA9IG51bGwsIHRoaXMuaW5Gb3JlZ3JvdW5kID0gITEsIFxuICAgICAgICAvKiogT3VyICd2aXNpYmlsaXR5Y2hhbmdlJyBsaXN0ZW5lciBpZiByZWdpc3RlcmVkLiAqL1xuICAgICAgICB0aGlzLmFpID0gbnVsbCwgXG4gICAgICAgIC8qKiBUaGUgY2xpZW50IG1ldGFkYXRhIHJlZnJlc2ggdGFzay4gKi9cbiAgICAgICAgdGhpcy5oaSA9IG51bGwsIFxuICAgICAgICAvKiogVGhlIGxhc3QgdGltZSB3ZSBnYXJiYWdlIGNvbGxlY3RlZCB0aGUgY2xpZW50IG1ldGFkYXRhIG9iamVjdCBzdG9yZS4gKi9cbiAgICAgICAgdGhpcy5saSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgXG4gICAgICAgIC8qKiBBIGxpc3RlbmVyIHRvIG5vdGlmeSBvbiBwcmltYXJ5IHN0YXRlIGNoYW5nZXMuICovXG4gICAgICAgIHRoaXMuZmkgPSB0ID0+IFByb21pc2UucmVzb2x2ZSgpLCAhSm8uRCgpKSB0aHJvdyBuZXcgVShxLlVOSU1QTEVNRU5URUQsIFwiVGhpcyBwbGF0Zm9ybSBpcyBlaXRoZXIgbWlzc2luZyBJbmRleGVkREIgb3IgaXMga25vd24gdG8gaGF2ZSBhbiBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uLiBPZmZsaW5lIHBlcnNpc3RlbmNlIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSA9IG5ldyBFbyh0aGlzLCBzKSwgdGhpcy5kaSA9IGUgKyBcIm1haW5cIiwgdGhpcy5zZXJpYWxpemVyID0gbmV3IGFyKHUpLCBcbiAgICAgICAgdGhpcy53aSA9IG5ldyBidCh0aGlzLmRpLCB0aGlzLnVpLCBuZXcgem8odGhpcy5zZXJpYWxpemVyKSksIHRoaXMuQnMgPSBuZXcgZm8odGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSwgdGhpcy5zZXJpYWxpemVyKSwgXG4gICAgICAgIHRoaXMucmVtb3RlRG9jdW1lbnRDYWNoZSA9IFBvKHRoaXMuc2VyaWFsaXplciksIHRoaXMucXMgPSBuZXcgRXIsIHRoaXMud2luZG93ICYmIHRoaXMud2luZG93LmxvY2FsU3RvcmFnZSA/IHRoaXMuX2kgPSB0aGlzLndpbmRvdy5sb2NhbFN0b3JhZ2UgOiAodGhpcy5faSA9IG51bGwsIFxuICAgICAgICAhMSA9PT0gYSAmJiBrKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJMb2NhbFN0b3JhZ2UgaXMgdW5hdmFpbGFibGUuIEFzIGEgcmVzdWx0LCBwZXJzaXN0ZW5jZSBtYXkgbm90IHdvcmsgcmVsaWFibHkuIEluIHBhcnRpY3VsYXIgZW5hYmxlUGVyc2lzdGVuY2UoKSBjb3VsZCBmYWlsIGltbWVkaWF0ZWx5IGFmdGVyIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBzdGFydCBJbmRleGVkRGIgcGVyc2lzdGVuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHBlcnNpc3RlbmNlIHdhcyBlbmFibGVkLlxuICAgICAqLyAgICBzdGFydCgpIHtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBleHBlY3RlZCB0byBmYWlsIHNvbWV0aW1lcyAoaW4gdGhlIGNhc2Ugb2YgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gYWxyZWFkeSBoYXZpbmcgdGhlIHBlcnNpc3RlbmNlIGxvY2spLCBzbyBpdCdzIHRoZSBmaXJzdCB0aGluZyB3ZSBzaG91bGRcbiAgICAgICAgLy8gZG8uXG4gICAgICAgIHJldHVybiB0aGlzLm1pKCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJpbWFyeSAmJiAhdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbikgXG4gICAgICAgICAgICAvLyBGYWlsIGBzdGFydCgpYCBpZiBgc3luY2hyb25pemVUYWJzYCBpcyBkaXNhYmxlZCBhbmQgd2UgY2Fubm90XG4gICAgICAgICAgICAvLyBvYnRhaW4gdGhlIHByaW1hcnkgbGVhc2UuXG4gICAgICAgICAgICB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIEhvKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdpKCksIHRoaXMueWkoKSwgdGhpcy5waSgpLCB0aGlzLnJ1blRyYW5zYWN0aW9uKFwiZ2V0SGlnaGVzdExpc3RlblNlcXVlbmNlTnVtYmVyXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gdGhpcy5Ccy5nZXRIaWdoZXN0U2VxdWVuY2VOdW1iZXIodCkpKTtcbiAgICAgICAgfSkpLnRoZW4oKHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5PcyA9IG5ldyBPdCh0LCB0aGlzLnJpKTtcbiAgICAgICAgfSkpLnRoZW4oKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuRnMgPSAhMDtcbiAgICAgICAgfSkpLmNhdGNoKCh0ID0+ICh0aGlzLndpICYmIHRoaXMud2kuY2xvc2UoKSwgUHJvbWlzZS5yZWplY3QodCkpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgcHJpbWFyeSBzdGF0ZSBvZiB0aGVcbiAgICAgKiBpbnN0YW5jZSBjaGFuZ2VzLiBVcG9uIHJlZ2lzdGVyaW5nLCB0aGlzIGxpc3RlbmVyIGlzIGludm9rZWQgaW1tZWRpYXRlbHlcbiAgICAgKiB3aXRoIHRoZSBjdXJyZW50IHByaW1hcnkgc3RhdGUuXG4gICAgICpcbiAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBXZWIgbXVsdGktdGFiLlxuICAgICAqLyAgICBJaSh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpID0gYXN5bmMgZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydGVkKSByZXR1cm4gdChlKTtcbiAgICAgICAgfSwgdCh0aGlzLmlzUHJpbWFyeSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZGF0YWJhc2UgcmVjZWl2ZXMgYVxuICAgICAqIHZlcnNpb24gY2hhbmdlIGV2ZW50IGluZGljYXRpbmcgdGhhdCBpdCBoYXMgZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyKHQpIHtcbiAgICAgICAgdGhpcy53aS5CKChhc3luYyBlID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgSW5kZXhlZERCLlxuICAgICAgICAgICAgbnVsbCA9PT0gZS5uZXdWZXJzaW9uICYmIGF3YWl0IHQoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGp1c3RzIHRoZSBjdXJyZW50IG5ldHdvcmsgc3RhdGUgaW4gdGhlIGNsaWVudCdzIG1ldGFkYXRhLCBwb3RlbnRpYWxseVxuICAgICAqIGFmZmVjdGluZyB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICAgKlxuICAgICAqIFBPUlRJTkcgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFdlYiBtdWx0aS10YWIuXG4gICAgICovICAgIHNldE5ldHdvcmtFbmFibGVkKHQpIHtcbiAgICAgICAgdGhpcy5uZXR3b3JrRW5hYmxlZCAhPT0gdCAmJiAodGhpcy5uZXR3b3JrRW5hYmxlZCA9IHQsIFxuICAgICAgICAvLyBTY2hlZHVsZSBhIHByaW1hcnkgbGVhc2UgcmVmcmVzaCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbi4gVGhlIGV2ZW50dWFsXG4gICAgICAgIC8vIGxlYXNlIHVwZGF0ZSB3aWxsIGJlIHByb3BhZ2F0ZWQgdmlhIGBwcmltYXJ5U3RhdGVMaXN0ZW5lcmAuXG4gICAgICAgIHRoaXMuaWkuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkICYmIGF3YWl0IHRoaXMubWkoKTtcbiAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY2xpZW50IG1ldGFkYXRhIGluIEluZGV4ZWREYiBhbmQgYXR0ZW1wdHMgdG8gZWl0aGVyIG9idGFpbiBvclxuICAgICAqIGV4dGVuZCB0aGUgcHJpbWFyeSBsZWFzZSBmb3IgdGhlIGxvY2FsIGNsaWVudC4gQXN5bmNocm9ub3VzbHkgbm90aWZpZXMgdGhlXG4gICAgICogcHJpbWFyeSBzdGF0ZSBsaXN0ZW5lciBpZiB0aGUgY2xpZW50IGVpdGhlciBuZXdseSBvYnRhaW5lZCBvciByZWxlYXNlZCBpdHNcbiAgICAgKiBwcmltYXJ5IGxlYXNlLlxuICAgICAqLyAgICBtaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJ1cGRhdGVDbGllbnRNZXRhZGF0YUFuZFRyeUJlY29tZVByaW1hcnlcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gWG8odCkucHV0KHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbmV0d29ya0VuYWJsZWQ6IHRoaXMubmV0d29ya0VuYWJsZWQsXG4gICAgICAgICAgICBpbkZvcmVncm91bmQ6IHRoaXMuaW5Gb3JlZ3JvdW5kXG4gICAgICAgIH0pLm5leHQoKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUHJpbWFyeSkgcmV0dXJuIHRoaXMuVGkodCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdCB8fCAodGhpcy5pc1ByaW1hcnkgPSAhMSwgdGhpcy5paS5lbnF1ZXVlUmV0cnlhYmxlKCgoKSA9PiB0aGlzLmZpKCExKSkpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLm5leHQoKCgpID0+IHRoaXMuRWkodCkpKS5uZXh0KChlID0+IHRoaXMuaXNQcmltYXJ5ICYmICFlID8gdGhpcy5BaSh0KS5uZXh0KCgoKSA9PiAhMSkpIDogISFlICYmIHRoaXMudmkodCkubmV4dCgoKCkgPT4gITApKSkpKSkuY2F0Y2goKHQgPT4ge1xuICAgICAgICAgICAgaWYgKER0KHQpKSBcbiAgICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3RhdGUuIEFueSBzdWJzZXF1ZW50IGFjY2VzcyB0b1xuICAgICAgICAgICAgLy8gSW5kZXhlZERCIHdpbGwgdmVyaWZ5IHRoZSBsZWFzZS5cbiAgICAgICAgICAgIHJldHVybiBOKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJGYWlsZWQgdG8gZXh0ZW5kIG93bmVyIGxlYXNlOiBcIiwgdCksIHRoaXMuaXNQcmltYXJ5O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uKSB0aHJvdyB0O1xuICAgICAgICAgICAgcmV0dXJuIE4oXCJJbmRleGVkRGJQZXJzaXN0ZW5jZVwiLCBcIlJlbGVhc2luZyBvd25lciBsZWFzZSBhZnRlciBlcnJvciBkdXJpbmcgbGVhc2UgcmVmcmVzaFwiLCB0KSwgXG4gICAgICAgICAgICAvKiBpc1ByaW1hcnk9ICovICExO1xuICAgICAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSAhPT0gdCAmJiB0aGlzLmlpLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMuZmkodCkpKSwgdGhpcy5pc1ByaW1hcnkgPSB0O1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIFRpKHQpIHtcbiAgICAgICAgcmV0dXJuIFlvKHQpLmdldChcIm93bmVyXCIpLm5leHQoKHQgPT4gUnQucmVzb2x2ZSh0aGlzLlJpKHQpKSkpO1xuICAgIH1cbiAgICBQaSh0KSB7XG4gICAgICAgIHJldHVybiBYbyh0KS5kZWxldGUodGhpcy5jbGllbnRJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gdGhyZXNob2xkIGhhcyBwYXNzZWQsIHBydW5lcyB0aGVcbiAgICAgKiBSZW1vdGVEb2N1bWVudENoYW5nZXMgYW5kIHRoZSBDbGllbnRNZXRhZGF0YSBzdG9yZSBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVcbiAgICAgKiB0aW1lIG9mIGFsbCBjbGllbnRzLlxuICAgICAqLyAgICBhc3luYyBiaSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQcmltYXJ5ICYmICF0aGlzLlZpKHRoaXMubGksIDE4ZTUpKSB7XG4gICAgICAgICAgICB0aGlzLmxpID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLnJ1blRyYW5zYWN0aW9uKFwibWF5YmVHYXJiYWdlQ29sbGVjdE11bHRpQ2xpZW50U3RhdGVcIiwgXCJyZWFkd3JpdGUtcHJpbWFyeVwiLCAodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IF9lKHQsIFwiY2xpZW50TWV0YWRhdGFcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaigpLm5leHQoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5TaSh0LCAxOGU1KSwgcyA9IHQuZmlsdGVyKCh0ID0+IC0xID09PSBuLmluZGV4T2YodCkpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIG1ldGFkYXRhIGZvciBjbGllbnRzIHRoYXQgYXJlIG5vIGxvbmdlciBjb25zaWRlcmVkIGFjdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ0LmZvckVhY2gocywgKHQgPT4gZS5kZWxldGUodC5jbGllbnRJZCkpKS5uZXh0KCgoKSA9PiBzKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLmNhdGNoKCgoKSA9PiBbXSkpO1xuICAgICAgICAgICAgLy8gRGVsZXRlIHBvdGVudGlhbCBsZWZ0b3ZlciBlbnRyaWVzIHRoYXQgbWF5IGNvbnRpbnVlIHRvIG1hcmsgdGhlXG4gICAgICAgICAgICAvLyBpbmFjdGl2ZSBjbGllbnRzIGFzIHpvbWJpZWQgaW4gTG9jYWxTdG9yYWdlLlxuICAgICAgICAgICAgLy8gSWRlYWxseSB3ZSdkIGRlbGV0ZSB0aGUgSW5kZXhlZERiIGFuZCBMb2NhbFN0b3JhZ2Ugem9tYmllIGVudHJpZXMgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY2xpZW50IGF0b21pY2FsbHksIGJ1dCB3ZSBjYW4ndC4gU28gd2Ugb3B0IHRvIGRlbGV0ZSB0aGUgSW5kZXhlZERiXG4gICAgICAgICAgICAvLyBlbnRyaWVzIGZpcnN0IHRvIGF2b2lkIHBvdGVudGlhbGx5IHJldml2aW5nIGEgem9tYmllZCBjbGllbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faSkgZm9yIChjb25zdCBlIG9mIHQpIHRoaXMuX2kucmVtb3ZlSXRlbSh0aGlzLkRpKGUuY2xpZW50SWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYSByZWN1cnJpbmcgdGltZXIgdG8gdXBkYXRlIHRoZSBjbGllbnQgbWV0YWRhdGEgYW5kIHRvIGVpdGhlclxuICAgICAqIGV4dGVuZCBvciBhY3F1aXJlIHRoZSBwcmltYXJ5IGxlYXNlIGlmIHRoZSBjbGllbnQgaXMgZWxpZ2libGUuXG4gICAgICovICAgIHBpKCkge1xuICAgICAgICB0aGlzLmhpID0gdGhpcy5paS5lbnF1ZXVlQWZ0ZXJEZWxheShcImNsaWVudF9tZXRhZGF0YV9yZWZyZXNoXCIgLyogVGltZXJJZC5DbGllbnRNZXRhZGF0YVJlZnJlc2ggKi8gLCA0ZTMsICgoKSA9PiB0aGlzLm1pKCkudGhlbigoKCkgPT4gdGhpcy5iaSgpKSkudGhlbigoKCkgPT4gdGhpcy5waSgpKSkpKTtcbiAgICB9XG4gICAgLyoqIENoZWNrcyB3aGV0aGVyIGBjbGllbnRgIGlzIHRoZSBsb2NhbCBjbGllbnQuICovICAgIFJpKHQpIHtcbiAgICAgICAgcmV0dXJuICEhdCAmJiB0Lm93bmVySWQgPT09IHRoaXMuY2xpZW50SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2YWx1YXRlIHRoZSBzdGF0ZSBvZiBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZSBsb2NhbFxuICAgICAqIGNsaWVudCBpcyBvciBjYW4gYWN0IGFzIHRoZSBob2xkZXIgb2YgdGhlIHByaW1hcnkgbGVhc2UuIFJldHVybnMgd2hldGhlclxuICAgICAqIHRoZSBjbGllbnQgaXMgZWxpZ2libGUgZm9yIHRoZSBsZWFzZSwgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGFjcXVpcmUgaXQuXG4gICAgICogTWF5IHJldHVybiAnZmFsc2UnIGV2ZW4gaWYgdGhlcmUgaXMgbm8gYWN0aXZlIGxlYXNlaG9sZGVyIGFuZCBhbm90aGVyXG4gICAgICogKGZvcmVncm91bmQpIGNsaWVudCBzaG91bGQgYmVjb21lIGxlYXNlaG9sZGVyIGluc3RlYWQuXG4gICAgICovICAgIEVpKHQpIHtcbiAgICAgICAgaWYgKHRoaXMub2kpIHJldHVybiBSdC5yZXNvbHZlKCEwKTtcbiAgICAgICAgcmV0dXJuIFlvKHQpLmdldChcIm93bmVyXCIpLm5leHQoKGUgPT4ge1xuICAgICAgICAgICAgLy8gQSBjbGllbnQgaXMgZWxpZ2libGUgZm9yIHRoZSBwcmltYXJ5IGxlYXNlIGlmOlxuICAgICAgICAgICAgLy8gLSBpdHMgbmV0d29yayBpcyBlbmFibGVkIGFuZCB0aGUgY2xpZW50J3MgdGFiIGlzIGluIHRoZSBmb3JlZ3JvdW5kLlxuICAgICAgICAgICAgLy8gLSBpdHMgbmV0d29yayBpcyBlbmFibGVkIGFuZCBubyBvdGhlciBjbGllbnQncyB0YWIgaXMgaW4gdGhlXG4gICAgICAgICAgICAvLyAgIGZvcmVncm91bmQuXG4gICAgICAgICAgICAvLyAtIGV2ZXJ5IGNsaWVudHMgbmV0d29yayBpcyBkaXNhYmxlZCBhbmQgdGhlIGNsaWVudCdzIHRhYiBpcyBpbiB0aGVcbiAgICAgICAgICAgIC8vICAgZm9yZWdyb3VuZC5cbiAgICAgICAgICAgIC8vIC0gZXZlcnkgY2xpZW50cyBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCBubyBvdGhlciBjbGllbnQncyB0YWIgaXMgaW5cbiAgICAgICAgICAgIC8vICAgdGhlIGZvcmVncm91bmQuXG4gICAgICAgICAgICAvLyAtIHRoZSBgZm9yY2VPd25pbmdUYWJgIHNldHRpbmcgd2FzIHBhc3NlZCBpbi5cbiAgICAgICAgICAgIGlmIChudWxsICE9PSBlICYmIHRoaXMuVmkoZS5sZWFzZVRpbWVzdGFtcE1zLCA1ZTMpICYmICF0aGlzLkNpKGUub3duZXJJZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5SaShlKSAmJiB0aGlzLm5ldHdvcmtFbmFibGVkKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLlJpKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5hbGxvd1RhYlN5bmNocm9uaXphdGlvbikgXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIGBjYW5BY3RBc1ByaW1hcnlgIGNoZWNrIGlmIHRoZSBjdXJyZW50IGxlYXNlaG9sZGVyIGhhc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb3B0ZWQgaW50byBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLiBJZiB0aGlzIGhhcHBlbnMgYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHN0YXJ0dXAsIHdlIHJlamVjdCB0aGUgUHJvbWlzZSByZXR1cm5lZCBieVxuICAgICAgICAgICAgICAgICAgICAvLyBgZW5hYmxlUGVyc2lzdGVuY2UoKWAgYW5kIHRoZSB1c2VyIGNhbiBjb250aW51ZSB0byB1c2UgRmlyZXN0b3JlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggaW4tbWVtb3J5IHBlcnNpc3RlbmNlLlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGZhaWxzIGR1cmluZyBhIGxlYXNlIHJlZnJlc2gsIHdlIHdpbGwgaW5zdGVhZCBibG9jayB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gQXN5bmNRdWV1ZSBmcm9tIGV4ZWN1dGluZyBmdXJ0aGVyIG9wZXJhdGlvbnMuIE5vdGUgdGhhdCB0aGlzIGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdGFibGUgc2luY2UgbWl4aW5nICYgbWF0Y2hpbmcgZGlmZmVyZW50IGBzeW5jaHJvbml6ZVRhYnNgXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmdzIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xMTQyMjYyMzQpOiBSZW1vdmUgdGhpcyBjaGVjayB3aGVuIGBzeW5jaHJvbml6ZVRhYnNgIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBubyBsb25nZXIgYmUgdHVybmVkIG9mZi5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFUocS5GQUlMRURfUFJFQ09ORElUSU9OLCBIbyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gISghdGhpcy5uZXR3b3JrRW5hYmxlZCB8fCAhdGhpcy5pbkZvcmVncm91bmQpIHx8IFhvKHQpLmooKS5uZXh0KCh0ID0+IHZvaWQgMCA9PT0gdGhpcy5TaSh0LCA1ZTMpLmZpbmQoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudElkICE9PSB0LmNsaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAhdGhpcy5uZXR3b3JrRW5hYmxlZCAmJiB0Lm5ldHdvcmtFbmFibGVkLCBuID0gIXRoaXMuaW5Gb3JlZ3JvdW5kICYmIHQuaW5Gb3JlZ3JvdW5kLCBzID0gdGhpcy5uZXR3b3JrRW5hYmxlZCA9PT0gdC5uZXR3b3JrRW5hYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUgfHwgbiAmJiBzKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9KSkubmV4dCgodCA9PiAodGhpcy5pc1ByaW1hcnkgIT09IHQgJiYgTihcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJHt0ID8gXCJpc1wiIDogXCJpcyBub3RcIn0gZWxpZ2libGUgZm9yIGEgcHJpbWFyeSBsZWFzZS5gKSwgXG4gICAgICAgIHQpKSk7XG4gICAgfVxuICAgIGFzeW5jIHNodXRkb3duKCkge1xuICAgICAgICAvLyBUaGUgc2h1dGRvd24oKSBvcGVyYXRpb25zIGFyZSBpZGVtcG90ZW50IGFuZCBjYW4gYmUgY2FsbGVkIGV2ZW4gd2hlblxuICAgICAgICAvLyBzdGFydCgpIGFib3J0ZWQgKGUuZy4gYmVjYXVzZSBpdCBjb3VsZG4ndCBhY3F1aXJlIHRoZSBwZXJzaXN0ZW5jZSBsZWFzZSkuXG4gICAgICAgIHRoaXMuRnMgPSAhMSwgdGhpcy54aSgpLCB0aGlzLmhpICYmICh0aGlzLmhpLmNhbmNlbCgpLCB0aGlzLmhpID0gbnVsbCksIHRoaXMuTmkoKSwgXG4gICAgICAgIHRoaXMua2koKSwgXG4gICAgICAgIC8vIFVzZSBgU2ltcGxlRGIucnVuVHJhbnNhY3Rpb25gIGRpcmVjdGx5IHRvIGF2b2lkIGZhaWxpbmcgaWYgYW5vdGhlciB0YWJcbiAgICAgICAgLy8gaGFzIG9idGFpbmVkIHRoZSBwcmltYXJ5IGxlYXNlLlxuICAgICAgICBhd2FpdCB0aGlzLndpLnJ1blRyYW5zYWN0aW9uKFwic2h1dGRvd25cIiwgXCJyZWFkd3JpdGVcIiwgWyBcIm93bmVyXCIsIFwiY2xpZW50TWV0YWRhdGFcIiBdLCAodCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IHdlKHQsIE90LmN0KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkFpKGUpLm5leHQoKCgpID0+IHRoaXMuUGkoZSkpKTtcbiAgICAgICAgfSkpLCB0aGlzLndpLmNsb3NlKCksIFxuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudHJ5IG1hcmtpbmcgdGhlIGNsaWVudCBhcyB6b21iaWVkIGZyb20gTG9jYWxTdG9yYWdlIHNpbmNlXG4gICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGl0cyBtZXRhZGF0YSBmcm9tIEluZGV4ZWREYi5cbiAgICAgICAgdGhpcy5NaSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNsaWVudHMgdGhhdCBhcmUgbm90IHpvbWJpZWQgYW5kIGhhdmUgYW4gdXBkYXRlVGltZSB3aXRoaW4gdGhlXG4gICAgICogcHJvdmlkZWQgdGhyZXNob2xkLlxuICAgICAqLyAgICBTaSh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0LmZpbHRlcigodCA9PiB0aGlzLlZpKHQudXBkYXRlVGltZU1zLCBlKSAmJiAhdGhpcy5DaSh0LmNsaWVudElkKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBJRHMgb2YgdGhlIGNsaWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZS4gSWYgbXVsdGktdGFiXG4gICAgICogaXMgbm90IHN1cHBvcnRlZCwgcmV0dXJucyBhbiBhcnJheSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxvY2FsIGNsaWVudCdzXG4gICAgICogSUQuXG4gICAgICpcbiAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBXZWIgbXVsdGktdGFiLlxuICAgICAqLyAgICAkaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuVHJhbnNhY3Rpb24oXCJnZXRBY3RpdmVDbGllbnRzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gWG8odCkuaigpLm5leHQoKHQgPT4gdGhpcy5TaSh0LCAxOGU1KS5tYXAoKHQgPT4gdC5jbGllbnRJZCkpKSkpKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkZzO1xuICAgIH1cbiAgICBnZXRNdXRhdGlvblF1ZXVlKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG9vLmRlKHQsIHRoaXMuc2VyaWFsaXplciwgZSwgdGhpcy5yZWZlcmVuY2VEZWxlZ2F0ZSk7XG4gICAgfVxuICAgIGdldFRhcmdldENhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5CcztcbiAgICB9XG4gICAgZ2V0UmVtb3RlRG9jdW1lbnRDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3RlRG9jdW1lbnRDYWNoZTtcbiAgICB9XG4gICAgZ2V0SW5kZXhNYW5hZ2VyKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKcih0LCB0aGlzLnNlcmlhbGl6ZXIuZmUuZGF0YWJhc2VJZCk7XG4gICAgfVxuICAgIGdldERvY3VtZW50T3ZlcmxheUNhY2hlKHQpIHtcbiAgICAgICAgcmV0dXJuIFJyLmRlKHRoaXMuc2VyaWFsaXplciwgdCk7XG4gICAgfVxuICAgIGdldEJ1bmRsZUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xcztcbiAgICB9XG4gICAgcnVuVHJhbnNhY3Rpb24odCwgZSwgbikge1xuICAgICAgICBOKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJTdGFydGluZyB0cmFuc2FjdGlvbjpcIiwgdCk7XG4gICAgICAgIGNvbnN0IHMgPSBcInJlYWRvbmx5XCIgPT09IGUgPyBcInJlYWRvbmx5XCIgOiBcInJlYWR3cml0ZVwiLCBpID0gMTUgPT09IChyID0gdGhpcy51aSkgPyBkZSA6IDE0ID09PSByID8gZmUgOiAxMyA9PT0gciA/IGxlIDogMTIgPT09IHIgPyBoZSA6IDExID09PSByID8gYWUgOiB2b2lkIE8oKTtcbiAgICAgICAgLyoqIFJldHVybnMgdGhlIG9iamVjdCBzdG9yZXMgZm9yIHRoZSBwcm92aWRlZCBzY2hlbWEuICovXG4gICAgICAgIHZhciByO1xuICAgICAgICBsZXQgbztcbiAgICAgICAgLy8gRG8gYWxsIHRyYW5zYWN0aW9ucyBhcyByZWFkd3JpdGUgYWdhaW5zdCBhbGwgb2JqZWN0IHN0b3Jlcywgc2luY2Ugd2VcbiAgICAgICAgLy8gYXJlIHRoZSBvbmx5IHJlYWRlci93cml0ZXIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2kucnVuVHJhbnNhY3Rpb24odCwgcywgaSwgKHMgPT4gKG8gPSBuZXcgd2UocywgdGhpcy5PcyA/IHRoaXMuT3MubmV4dCgpIDogT3QuY3QpLCBcbiAgICAgICAgXCJyZWFkd3JpdGUtcHJpbWFyeVwiID09PSBlID8gdGhpcy5UaShvKS5uZXh0KCh0ID0+ICEhdCB8fCB0aGlzLkVpKG8pKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWUpIHRocm93IGsoYEZhaWxlZCB0byBvYnRhaW4gcHJpbWFyeSBsZWFzZSBmb3IgYWN0aW9uICcke3R9Jy5gKSwgdGhpcy5pc1ByaW1hcnkgPSAhMSwgXG4gICAgICAgICAgICB0aGlzLmlpLmVucXVldWVSZXRyeWFibGUoKCgpID0+IHRoaXMuZmkoITEpKSksIG5ldyBVKHEuRkFJTEVEX1BSRUNPTkRJVElPTiwgRXQpO1xuICAgICAgICAgICAgcmV0dXJuIG4obyk7XG4gICAgICAgIH0pKS5uZXh0KCh0ID0+IHRoaXMudmkobykubmV4dCgoKCkgPT4gdCkpKSkgOiB0aGlzLk9pKG8pLm5leHQoKCgpID0+IG4obykpKSkpKS50aGVuKCh0ID0+IChvLnJhaXNlT25Db21taXR0ZWRFdmVudCgpLCBcbiAgICAgICAgdCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCB0YWIgaXMgdGhlIHByaW1hcnkgbGVhc2Vob2xkZXIgb3IgYWx0ZXJuYXRpdmVseVxuICAgICAqIHRoYXQgdGhlIGxlYXNlaG9sZGVyIGhhcyBvcHRlZCBpbnRvIG11bHRpLXRhYiBzeW5jaHJvbml6YXRpb24uXG4gICAgICovXG4gICAgLy8gVE9ETyhiLzExNDIyNjIzNCk6IFJlbW92ZSB0aGlzIGNoZWNrIHdoZW4gYHN5bmNocm9uaXplVGFic2AgY2FuIG5vIGxvbmdlclxuICAgIC8vIGJlIHR1cm5lZCBvZmYuXG4gICAgT2kodCkge1xuICAgICAgICByZXR1cm4gWW8odCkuZ2V0KFwib3duZXJcIikubmV4dCgodCA9PiB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiB0aGlzLlZpKHQubGVhc2VUaW1lc3RhbXBNcywgNWUzKSAmJiAhdGhpcy5DaSh0Lm93bmVySWQpICYmICF0aGlzLlJpKHQpICYmICEodGhpcy5vaSB8fCB0aGlzLmFsbG93VGFiU3luY2hyb25pemF0aW9uICYmIHQuYWxsb3dUYWJTeW5jaHJvbml6YXRpb24pKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIEhvKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPYnRhaW5zIG9yIGV4dGVuZHMgdGhlIG5ldyBwcmltYXJ5IGxlYXNlIGZvciB0aGUgbG9jYWwgY2xpZW50LiBUaGlzXG4gICAgICogbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBjbGllbnQgaXMgZWxpZ2libGUgZm9yIHRoaXMgbGVhc2UuXG4gICAgICovICAgIHZpKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIG93bmVySWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICAgICAgICBhbGxvd1RhYlN5bmNocm9uaXphdGlvbjogdGhpcy5hbGxvd1RhYlN5bmNocm9uaXphdGlvbixcbiAgICAgICAgICAgIGxlYXNlVGltZXN0YW1wTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFlvKHQpLnB1dChcIm93bmVyXCIsIGUpO1xuICAgIH1cbiAgICBzdGF0aWMgRCgpIHtcbiAgICAgICAgcmV0dXJuIGJ0LkQoKTtcbiAgICB9XG4gICAgLyoqIENoZWNrcyB0aGUgcHJpbWFyeSBsZWFzZSBhbmQgcmVtb3ZlcyBpdCBpZiB3ZSBhcmUgdGhlIGN1cnJlbnQgcHJpbWFyeS4gKi8gICAgQWkodCkge1xuICAgICAgICBjb25zdCBlID0gWW8odCk7XG4gICAgICAgIHJldHVybiBlLmdldChcIm93bmVyXCIpLm5leHQoKHQgPT4gdGhpcy5SaSh0KSA/IChOKFwiSW5kZXhlZERiUGVyc2lzdGVuY2VcIiwgXCJSZWxlYXNpbmcgcHJpbWFyeSBsZWFzZS5cIiksIFxuICAgICAgICBlLmRlbGV0ZShcIm93bmVyXCIpKSA6IFJ0LnJlc29sdmUoKSkpO1xuICAgIH1cbiAgICAvKiogVmVyaWZpZXMgdGhhdCBgdXBkYXRlVGltZU1zYCBpcyB3aXRoaW4gYG1heEFnZU1zYC4gKi8gICAgVmkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuICEodCA8IG4gLSBlKSAmJiAoISh0ID4gbikgfHwgKGsoYERldGVjdGVkIGFuIHVwZGF0ZSB0aW1lIHRoYXQgaXMgaW4gdGhlIGZ1dHVyZTogJHt0fSA+ICR7bn1gKSwgXG4gICAgICAgICExKSk7XG4gICAgfVxuICAgIGdpKCkge1xuICAgICAgICBudWxsICE9PSB0aGlzLmRvY3VtZW50ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICYmICh0aGlzLmFpID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5paS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiAodGhpcy5pbkZvcmVncm91bmQgPSBcInZpc2libGVcIiA9PT0gdGhpcy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUsIFxuICAgICAgICAgICAgdGhpcy5taSgpKSkpO1xuICAgICAgICB9LCB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMuYWkpLCB0aGlzLmluRm9yZWdyb3VuZCA9IFwidmlzaWJsZVwiID09PSB0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSk7XG4gICAgfVxuICAgIE5pKCkge1xuICAgICAgICB0aGlzLmFpICYmICh0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMuYWkpLCB0aGlzLmFpID0gbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgd2luZG93LnVubG9hZCBoYW5kbGVyIHRoYXQgd2lsbCBzeW5jaHJvbm91c2x5IHdyaXRlIG91clxuICAgICAqIGNsaWVudElkIHRvIGEgXCJ6b21iaWUgY2xpZW50IGlkXCIgbG9jYXRpb24gaW4gTG9jYWxTdG9yYWdlLiBUaGlzIGNhbiBiZSB1c2VkXG4gICAgICogYnkgdGFicyB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgcHJpbWFyeSBsZWFzZSB0byBkZXRlcm1pbmUgdGhhdCB0aGUgbGVhc2VcbiAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQgZXZlbiBpZiB0aGUgdGltZXN0YW1wIGlzIHJlY2VudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHlcbiAgICAgKiBpbXBvcnRhbnQgZm9yIHRoZSByZWZyZXNoIGNhc2UgKHNvIHRoZSB0YWIgY29ycmVjdGx5IHJlLWFjcXVpcmVzIHRoZVxuICAgICAqIHByaW1hcnkgbGVhc2UpLiBMb2NhbFN0b3JhZ2UgaXMgdXNlZCBmb3IgdGhpcyByYXRoZXIgdGhhbiBJbmRleGVkRGIgYmVjYXVzZVxuICAgICAqIGl0IGlzIGEgc3luY2hyb25vdXMgQVBJIGFuZCBzbyBjYW4gYmUgdXNlZCByZWxpYWJseSBmcm9tICBhbiB1bmxvYWRcbiAgICAgKiBoYW5kbGVyLlxuICAgICAqLyAgICB5aSgpIHtcbiAgICAgICAgdmFyIHQ7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgKG51bGwgPT09ICh0ID0gdGhpcy53aW5kb3cpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuYWRkRXZlbnRMaXN0ZW5lcikgJiYgKHRoaXMuY2kgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBOb3RlOiBJbiB0aGVvcnksIHRoaXMgc2hvdWxkIGJlIHNjaGVkdWxlZCBvbiB0aGUgQXN5bmNRdWV1ZSBzaW5jZSBpdFxuICAgICAgICAgICAgLy8gYWNjZXNzZXMgaW50ZXJuYWwgc3RhdGUuIFdlIGV4ZWN1dGUgdGhpcyBjb2RlIGRpcmVjdGx5IGR1cmluZyBzaHV0ZG93blxuICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIGl0IGdldHMgYSBjaGFuY2UgdG8gcnVuLlxuICAgICAgICAgICAgdGhpcy54aSgpO1xuICAgICAgICAgICAgY29uc3QgdCA9IC8oPzpWZXJzaW9ufE1vYmlsZSlcXC8xWzQ1Nl0vO1xuICAgICAgICAgICAgaXNTYWZhcmkoKSAmJiAobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2godCkgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCh0KSkgJiYgXG4gICAgICAgICAgICAvLyBPbiBTYWZhcmkgMTQsIDE1LCBhbmQgMTYsIHdlIGRvIG5vdCBydW4gYW55IGNsZWFudXAgYWN0aW9ucyBhcyBpdCBtaWdodFxuICAgICAgICAgICAgLy8gdHJpZ2dlciBhIGJ1ZyB0aGF0IHByZXZlbnRzIFNhZmFyaSBmcm9tIHJlLW9wZW5pbmcgSW5kZXhlZERCIGR1cmluZ1xuICAgICAgICAgICAgLy8gdGhlIG5leHQgcGFnZSBsb2FkLlxuICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjY1NDdcbiAgICAgICAgICAgIHRoaXMuaWkuZW50ZXJSZXN0cmljdGVkTW9kZSgvKiBwdXJnZUV4aXN0aW5nVGFza3M9ICovICEwKSwgdGhpcy5paS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiB0aGlzLnNodXRkb3duKCkpKTtcbiAgICAgICAgfSwgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMuY2kpKTtcbiAgICB9XG4gICAga2koKSB7XG4gICAgICAgIHRoaXMuY2kgJiYgKHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLmNpKSwgdGhpcy5jaSA9IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBjbGllbnQgaXMgXCJ6b21iaWVkXCIgYmFzZWQgb24gaXRzIExvY2FsU3RvcmFnZSBlbnRyeS5cbiAgICAgKiBDbGllbnRzIGJlY29tZSB6b21iaWVkIHdoZW4gdGhlaXIgdGFiIGNsb3NlcyB3aXRob3V0IHJ1bm5pbmcgYWxsIG9mIHRoZVxuICAgICAqIGNsZWFudXAgbG9naWMgaW4gYHNodXRkb3duKClgLlxuICAgICAqLyAgICBDaSh0KSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbiA9IG51bGwgIT09IChudWxsID09PSAoZSA9IHRoaXMuX2kpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZ2V0SXRlbSh0aGlzLkRpKHQpKSk7XG4gICAgICAgICAgICByZXR1cm4gTihcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIGBDbGllbnQgJyR7dH0nICR7biA/IFwiaXNcIiA6IFwiaXMgbm90XCJ9IHpvbWJpZWQgaW4gTG9jYWxTdG9yYWdlYCksIFxuICAgICAgICAgICAgbjtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgaWYgTG9jYWxTdG9yYWdlIGlzbid0IHdvcmtpbmcuXG4gICAgICAgICAgICByZXR1cm4gayhcIkluZGV4ZWREYlBlcnNpc3RlbmNlXCIsIFwiRmFpbGVkIHRvIGdldCB6b21iaWVkIGNsaWVudCBpZC5cIiwgdCksICExO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY29yZCBjbGllbnQgYXMgem9tYmllZCAoYSBjbGllbnQgdGhhdCBoYWQgaXRzIHRhYiBjbG9zZWQpLiBab21iaWVkXG4gICAgICogY2xpZW50cyBhcmUgaWdub3JlZCBkdXJpbmcgcHJpbWFyeSB0YWIgc2VsZWN0aW9uLlxuICAgICAqLyAgICB4aSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2kpIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9pLnNldEl0ZW0odGhpcy5EaSh0aGlzLmNsaWVudElkKSwgU3RyaW5nKERhdGUubm93KCkpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gR3JhY2VmdWxseSBoYW5kbGUgaWYgTG9jYWxTdG9yYWdlIGlzbid0IGF2YWlsYWJsZSAvIHdvcmtpbmcuXG4gICAgICAgICAgICBrKFwiRmFpbGVkIHRvIHNldCB6b21iaWUgY2xpZW50IGlkLlwiLCB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogUmVtb3ZlcyB0aGUgem9tYmllZCBjbGllbnQgZW50cnkgaWYgaXQgZXhpc3RzLiAqLyAgICBNaSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2kpIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9pLnJlbW92ZUl0ZW0odGhpcy5EaSh0aGlzLmNsaWVudElkKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZVxuICAgICAgICB9XG4gICAgfVxuICAgIERpKHQpIHtcbiAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfem9tYmllXyR7dGhpcy5wZXJzaXN0ZW5jZUtleX1fJHt0fWA7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgYSB0eXBlZCBTaW1wbGVEYlN0b3JlIGZvciB0aGUgcHJpbWFyeSBjbGllbnQgb2JqZWN0IHN0b3JlLlxuICovIGZ1bmN0aW9uIFlvKHQpIHtcbiAgICByZXR1cm4gX2UodCwgXCJvd25lclwiKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IGEgdHlwZWQgU2ltcGxlRGJTdG9yZSBmb3IgdGhlIGNsaWVudCBtZXRhZGF0YSBvYmplY3Qgc3RvcmUuXG4gKi8gZnVuY3Rpb24gWG8odCkge1xuICAgIHJldHVybiBfZSh0LCBcImNsaWVudE1ldGFkYXRhXCIpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHN0cmluZyB1c2VkIGFzIGEgcHJlZml4IHdoZW4gc3RvcmluZyBkYXRhIGluIEluZGV4ZWREQiBhbmRcbiAqIExvY2FsU3RvcmFnZS5cbiAqLyBmdW5jdGlvbiBabyh0LCBlKSB7XG4gICAgLy8gVXNlIHR3byBkaWZmZXJlbnQgcHJlZml4IGZvcm1hdHM6XG4gICAgLy8gICAqIGZpcmVzdG9yZSAvIHBlcnNpc3RlbmNlS2V5IC8gcHJvamVjdElEIC4gZGF0YWJhc2VJRCAvIC4uLlxuICAgIC8vICAgKiBmaXJlc3RvcmUgLyBwZXJzaXN0ZW5jZUtleSAvIHByb2plY3RJRCAvIC4uLlxuICAgIC8vIHByb2plY3RJRHMgYXJlIEROUy1jb21wYXRpYmxlIG5hbWVzIGFuZCBjYW5ub3QgY29udGFpbiBkb3RzXG4gICAgLy8gc28gdGhlcmUncyBubyBkYW5nZXIgb2YgY29sbGlzaW9ucy5cbiAgICBsZXQgbiA9IHQucHJvamVjdElkO1xuICAgIHJldHVybiB0LmlzRGVmYXVsdERhdGFiYXNlIHx8IChuICs9IFwiLlwiICsgdC5kYXRhYmFzZSksIFwiZmlyZXN0b3JlL1wiICsgZSArIFwiL1wiICsgbiArIFwiL1wiO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHNldCBvZiBjaGFuZ2VzIHRvIHdoYXQgZG9jdW1lbnRzIGFyZSBjdXJyZW50bHkgaW4gdmlldyBhbmQgb3V0IG9mIHZpZXcgZm9yXG4gKiBhIGdpdmVuIHF1ZXJ5LiBUaGVzZSBjaGFuZ2VzIGFyZSBzZW50IHRvIHRoZSBMb2NhbFN0b3JlIGJ5IHRoZSBWaWV3ICh2aWFcbiAqIHRoZSBTeW5jRW5naW5lKSBhbmQgYXJlIHVzZWQgdG8gcGluIC8gdW5waW4gZG9jdW1lbnRzIGFzIGFwcHJvcHJpYXRlLlxuICovXG5jbGFzcyB0dSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnRhcmdldElkID0gdCwgdGhpcy5mcm9tQ2FjaGUgPSBlLCB0aGlzLkZpID0gbiwgdGhpcy5CaSA9IHM7XG4gICAgfVxuICAgIHN0YXRpYyBMaSh0LCBlKSB7XG4gICAgICAgIGxldCBuID0gZ3MoKSwgcyA9IGdzKCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBlLmRvY0NoYW5nZXMpIHN3aXRjaCAodC50eXBlKSB7XG4gICAgICAgICAgY2FzZSAwIC8qIENoYW5nZVR5cGUuQWRkZWQgKi8gOlxuICAgICAgICAgICAgbiA9IG4uYWRkKHQuZG9jLmtleSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgcyA9IHMuYWRkKHQuZG9jLmtleSk7XG4gLy8gZG8gbm90aGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyB0dSh0LCBlLmZyb21DYWNoZSwgbiwgcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUaGUgRmlyZXN0b3JlIHF1ZXJ5IGVuZ2luZS5cbiAqXG4gKiBGaXJlc3RvcmUgcXVlcmllcyBjYW4gYmUgZXhlY3V0ZWQgaW4gdGhyZWUgbW9kZXMuIFRoZSBRdWVyeSBFbmdpbmUgZGV0ZXJtaW5lc1xuICogd2hhdCBtb2RlIHRvIHVzZSBiYXNlZCBvbiB3aGF0IGRhdGEgaXMgcGVyc2lzdGVkLiBUaGUgbW9kZSBvbmx5IGRldGVybWluZXNcbiAqIHRoZSBydW50aW1lIGNvbXBsZXhpdHkgb2YgdGhlIHF1ZXJ5IC0gdGhlIHJlc3VsdCBzZXQgaXMgZXF1aXZhbGVudCBhY3Jvc3MgYWxsXG4gKiBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogVGhlIFF1ZXJ5IGVuZ2luZSB3aWxsIHVzZSBpbmRleGVkLWJhc2VkIGV4ZWN1dGlvbiBpZiBhIHVzZXIgaGFzIGNvbmZpZ3VyZWRcbiAqIGFueSBpbmRleCB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcXVlcnkgKHZpYSBgc2V0SW5kZXhDb25maWd1cmF0aW9uKClgKS5cbiAqIE90aGVyd2lzZSwgdGhlIGVuZ2luZSB3aWxsIHRyeSB0byBvcHRpbWl6ZSB0aGUgcXVlcnkgYnkgcmUtdXNpbmcgYSBwcmV2aW91c2x5XG4gKiBwZXJzaXN0ZWQgcXVlcnkgcmVzdWx0LiBJZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHdpbGwgYmUgZXhlY3V0ZWRcbiAqIHZpYSBhIGZ1bGwgY29sbGVjdGlvbiBzY2FuLlxuICpcbiAqIEluZGV4LWJhc2VkIGV4ZWN1dGlvbiBpcyB0aGUgZGVmYXVsdCB3aGVuIGF2YWlsYWJsZS4gVGhlIHF1ZXJ5IGVuZ2luZVxuICogc3VwcG9ydHMgcGFydGlhbCBpbmRleGVkIGV4ZWN1dGlvbiBhbmQgbWVyZ2VzIHRoZSByZXN1bHQgZnJvbSB0aGUgaW5kZXhcbiAqIGxvb2t1cCB3aXRoIGRvY3VtZW50cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGluZGV4ZWQuIFRoZSBpbmRleCBldmFsdWF0aW9uXG4gKiBtYXRjaGVzIHRoZSBiYWNrZW5kJ3MgZm9ybWF0IGFuZCBhcyBzdWNoLCB0aGUgU0RLIGNhbiB1c2UgaW5kZXhpbmcgZm9yIGFsbFxuICogcXVlcmllcyB0aGF0IHRoZSBiYWNrZW5kIHN1cHBvcnRzLlxuICpcbiAqIElmIG5vIGluZGV4IGV4aXN0cywgdGhlIHF1ZXJ5IGVuZ2luZSB0cmllcyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgdGFyZ2V0XG4gKiBkb2N1bWVudCBtYXBwaW5nIGluIHRoZSBUYXJnZXRDYWNoZS4gVGhlc2UgbWFwcGluZ3MgZXhpc3RzIGZvciBhbGwgcXVlcmllc1xuICogdGhhdCBoYXZlIGJlZW4gc3luY2VkIHdpdGggdGhlIGJhY2tlbmQgYXQgbGVhc3Qgb25jZSBhbmQgYWxsb3cgdGhlIHF1ZXJ5XG4gKiBlbmdpbmUgdG8gb25seSByZWFkIGRvY3VtZW50cyB0aGF0IHByZXZpb3VzbHkgbWF0Y2hlZCBhIHF1ZXJ5IHBsdXMgYW55XG4gKiBkb2N1bWVudHMgdGhhdCB3ZXJlIGVkaXRlZCBhZnRlciB0aGUgcXVlcnkgd2FzIGxhc3QgbGlzdGVuZWQgdG8uXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlbiB0aGlzIG9wdGltaXphdGlvbiBpcyBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlXG4gKiB0aGUgc2FtZSByZXN1bHRzIGFzIGZ1bGwgY29sbGVjdGlvbiBzY2Fucy4gSW4gdGhlc2UgY2FzZXMsIHF1ZXJ5XG4gKiBwcm9jZXNzaW5nIGZhbGxzIGJhY2sgdG8gZnVsbCBzY2Fucy4gVGhlc2UgY2FzZXMgYXJlOlxuICpcbiAqIC0gTGltaXQgcXVlcmllcyB3aGVyZSBhIGRvY3VtZW50IHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgcHJldmlvdXNseSBubyBsb25nZXJcbiAqICAgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gKlxuICogLSBMaW1pdCBxdWVyaWVzIHdoZXJlIGEgZG9jdW1lbnQgZWRpdCBtYXkgY2F1c2UgdGhlIGRvY3VtZW50IHRvIHNvcnQgYmVsb3dcbiAqICAgYW5vdGhlciBkb2N1bWVudCB0aGF0IGlzIGluIHRoZSBsb2NhbCBjYWNoZS5cbiAqXG4gKiAtIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gQ1VSUkVOVCBvciBmcmVlIG9mIGxpbWJvIGRvY3VtZW50cy5cbiAqLyBjbGFzcyBldSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucWkgPSAhMTtcbiAgICB9XG4gICAgLyoqIFNldHMgdGhlIGRvY3VtZW50IHZpZXcgdG8gcXVlcnkgYWdhaW5zdC4gKi8gICAgaW5pdGlhbGl6ZSh0LCBlKSB7XG4gICAgICAgIHRoaXMuVWkgPSB0LCB0aGlzLmluZGV4TWFuYWdlciA9IGUsIHRoaXMucWkgPSAhMDtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYWxsIGxvY2FsIGRvY3VtZW50cyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHF1ZXJ5LiAqLyAgICBnZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIGUsIG4sIHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuS2kodCwgZSkubmV4dCgoaSA9PiBpIHx8IHRoaXMuR2kodCwgZSwgcywgbikpKS5uZXh0KChuID0+IG4gfHwgdGhpcy5RaSh0LCBlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbiBpbmRleGVkIHF1ZXJ5IHRoYXQgZXZhbHVhdGVzIHRoZSBxdWVyeSBiYXNlZCBvbiBhIGNvbGxlY3Rpb24nc1xuICAgICAqIHBlcnNpc3RlZCBpbmRleCB2YWx1ZXMuIFJldHVybnMgYG51bGxgIGlmIGFuIGluZGV4IGlzIG5vdCBhdmFpbGFibGUuXG4gICAgICovICAgIEtpKHQsIGUpIHtcbiAgICAgICAgaWYgKFFuKGUpKSBcbiAgICAgICAgLy8gUXVlcmllcyB0aGF0IG1hdGNoIGFsbCBkb2N1bWVudHMgZG9uJ3QgYmVuZWZpdCBmcm9tIHVzaW5nXG4gICAgICAgIC8vIGtleS1iYXNlZCBsb29rdXBzLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBzY2FuIGFsbCBkb2N1bWVudHMgaW4gYVxuICAgICAgICAvLyBjb2xsZWN0aW9uLCByYXRoZXIgdGhhbiB0byBwZXJmb3JtIGluZGl2aWR1YWwgbG9va3Vwcy5cbiAgICAgICAgcmV0dXJuIFJ0LnJlc29sdmUobnVsbCk7XG4gICAgICAgIGxldCBuID0gSm4oZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4TWFuYWdlci5nZXRJbmRleFR5cGUodCwgbikubmV4dCgocyA9PiAwIC8qIEluZGV4VHlwZS5OT05FICovID09PSBzID8gbnVsbCA6IChudWxsICE9PSBlLmxpbWl0ICYmIDEgLyogSW5kZXhUeXBlLlBBUlRJQUwgKi8gPT09IHMgJiYgKFxuICAgICAgICAvLyBXZSBjYW5ub3QgYXBwbHkgYSBsaW1pdCBmb3IgdGFyZ2V0cyB0aGF0IGFyZSBzZXJ2ZWQgdXNpbmcgYSBwYXJ0aWFsXG4gICAgICAgIC8vIGluZGV4LiBJZiBhIHBhcnRpYWwgaW5kZXggd2lsbCBiZSB1c2VkIHRvIHNlcnZlIHRoZSB0YXJnZXQsIHRoZVxuICAgICAgICAvLyBxdWVyeSBtYXkgcmV0dXJuIGEgc3VwZXJzZXQgb2YgZG9jdW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHRhcmdldFxuICAgICAgICAvLyAoZS5nLiBpZiB0aGUgaW5kZXggZG9lc24ndCBpbmNsdWRlIGFsbCB0aGUgdGFyZ2V0J3MgZmlsdGVycyksIG9yXG4gICAgICAgIC8vIG1heSByZXR1cm4gdGhlIGNvcnJlY3Qgc2V0IG9mIGRvY3VtZW50cyBpbiB0aGUgd3Jvbmcgb3JkZXIgKGUuZy4gaWZcbiAgICAgICAgLy8gdGhlIGluZGV4IGRvZXNuJ3QgaW5jbHVkZSBhIHNlZ21lbnQgZm9yIG9uZSBvZiB0aGUgb3JkZXJCeXMpLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIGEgbGltaXQgc2hvdWxkIG5vdCBiZSBhcHBsaWVkIGluIHN1Y2ggY2FzZXMuXG4gICAgICAgIGUgPSBYbihlLCBudWxsLCBcIkZcIiAvKiBMaW1pdFR5cGUuRmlyc3QgKi8pLCBuID0gSm4oZSkpLCB0aGlzLmluZGV4TWFuYWdlci5nZXREb2N1bWVudHNNYXRjaGluZ1RhcmdldCh0LCBuKS5uZXh0KChzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBncyguLi5zKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlVpLmdldERvY3VtZW50cyh0LCBpKS5uZXh0KChzID0+IHRoaXMuaW5kZXhNYW5hZ2VyLmdldE1pbk9mZnNldCh0LCBuKS5uZXh0KChuID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5qaShlLCBzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56aShlLCByLCBpLCBuLnJlYWRUaW1lKSA/IHRoaXMuS2kodCwgWG4oZSwgbnVsbCwgXCJGXCIgLyogTGltaXRUeXBlLkZpcnN0ICovKSkgOiB0aGlzLldpKHQsIHIsIGUsIG4pO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgIH0pKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBxdWVyeSBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgcGVyc2lzdGVkIHF1ZXJ5IG1hcHBpbmcuIFJldHVybnNcbiAgICAgKiBgbnVsbGAgaWYgdGhlIG1hcHBpbmcgaXMgbm90IGF2YWlsYWJsZSBvciBjYW5ub3QgYmUgdXNlZC5cbiAgICAgKi8gICAgR2kodCwgZSwgbiwgcykge1xuICAgICAgICByZXR1cm4gUW4oZSkgfHwgcy5pc0VxdWFsKHJ0Lm1pbigpKSA/IHRoaXMuUWkodCwgZSkgOiB0aGlzLlVpLmdldERvY3VtZW50cyh0LCBuKS5uZXh0KChpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmppKGUsIGkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuemkoZSwgciwgbiwgcykgPyB0aGlzLlFpKHQsIGUpIDogKEMoKSA8PSBMb2dMZXZlbC5ERUJVRyAmJiBOKFwiUXVlcnlFbmdpbmVcIiwgXCJSZS11c2luZyBwcmV2aW91cyByZXN1bHQgZnJvbSAlcyB0byBleGVjdXRlIHF1ZXJ5OiAlc1wiLCBzLnRvU3RyaW5nKCksIGVzKGUpKSwgXG4gICAgICAgICAgICB0aGlzLldpKHQsIHIsIGUsIHl0KHMsIC0xKSkpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIFF1ZXJpZXMgdGhhdCBoYXZlIG5ldmVyIHNlZW4gYSBzbmFwc2hvdCB3aXRob3V0IGxpbWJvIGZyZWUgZG9jdW1lbnRzXG4gICAgICAgIC8vIHNob3VsZCBhbHNvIGJlIHJ1biBhcyBhIGZ1bGwgY29sbGVjdGlvbiBzY2FuLlxuICAgICAgICB9XG4gICAgLyoqIEFwcGxpZXMgdGhlIHF1ZXJ5IGZpbHRlciBhbmQgc29ydGluZyB0byB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzLiAgKi8gICAgamkodCwgZSkge1xuICAgICAgICAvLyBTb3J0IHRoZSBkb2N1bWVudHMgYW5kIHJlLWFwcGx5IHRoZSBxdWVyeSBmaWx0ZXIgc2luY2UgcHJldmlvdXNseVxuICAgICAgICAvLyBtYXRjaGluZyBkb2N1bWVudHMgZG8gbm90IG5lY2Vzc2FyaWx5IHN0aWxsIG1hdGNoIHRoZSBxdWVyeS5cbiAgICAgICAgbGV0IG4gPSBuZXcgRWUoaXModCkpO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCgoZSwgcykgPT4ge1xuICAgICAgICAgICAgbnModCwgcykgJiYgKG4gPSBuLmFkZChzKSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGxpbWl0IHF1ZXJ5IG5lZWRzIHRvIGJlIHJlZmlsbGVkIGZyb20gY2FjaGUsIG1ha2luZyBpdFxuICAgICAqIGluZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSBzb3J0ZWRQcmV2aW91c1Jlc3VsdHMgLSBUaGUgZG9jdW1lbnRzIHRoYXQgbWF0Y2hlZCB0aGUgcXVlcnkgd2hlbiBpdFxuICAgICAqIHdhcyBsYXN0IHN5bmNocm9uaXplZCwgc29ydGVkIGJ5IHRoZSBxdWVyeSdzIGNvbXBhcmF0b3IuXG4gICAgICogQHBhcmFtIHJlbW90ZUtleXMgLSBUaGUgZG9jdW1lbnQga2V5cyB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5IGF0IHRoZSBsYXN0XG4gICAgICogc25hcHNob3QuXG4gICAgICogQHBhcmFtIGxpbWJvRnJlZVNuYXBzaG90VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIG9mIHRoZSBzbmFwc2hvdCB3aGVuIHRoZVxuICAgICAqIHF1ZXJ5IHdhcyBsYXN0IHN5bmNocm9uaXplZC5cbiAgICAgKi8gICAgemkodCwgZSwgbiwgcykge1xuICAgICAgICBpZiAobnVsbCA9PT0gdC5saW1pdCkgXG4gICAgICAgIC8vIFF1ZXJpZXMgd2l0aG91dCBsaW1pdHMgZG8gbm90IG5lZWQgdG8gYmUgcmVmaWxsZWQuXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgaWYgKG4uc2l6ZSAhPT0gZS5zaXplKSBcbiAgICAgICAgLy8gVGhlIHF1ZXJ5IG5lZWRzIHRvIGJlIHJlZmlsbGVkIGlmIGEgcHJldmlvdXNseSBtYXRjaGluZyBkb2N1bWVudCBub1xuICAgICAgICAvLyBsb25nZXIgbWF0Y2hlcy5cbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAvLyBMaW1pdCBxdWVyaWVzIGFyZSBub3QgZWxpZ2libGUgZm9yIGluZGV4LWZyZWUgcXVlcnkgZXhlY3V0aW9uIGlmIHRoZXJlIGlzXG4gICAgICAgIC8vIGEgcG90ZW50aWFsIHRoYXQgYW4gb2xkZXIgZG9jdW1lbnQgZnJvbSBjYWNoZSBub3cgc29ydHMgYmVmb3JlIGEgZG9jdW1lbnRcbiAgICAgICAgLy8gdGhhdCB3YXMgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBsaW1pdC4gVGhpcywgaG93ZXZlciwgY2FuIG9ubHkgaGFwcGVuIGlmXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCBhdCB0aGUgZWRnZSBvZiB0aGUgbGltaXQgZ29lcyBvdXQgb2YgbGltaXQuXG4gICAgICAgIC8vIElmIGEgZG9jdW1lbnQgdGhhdCBpcyBub3QgdGhlIGxpbWl0IGJvdW5kYXJ5IHNvcnRzIGRpZmZlcmVudGx5LFxuICAgICAgICAvLyB0aGUgYm91bmRhcnkgb2YgdGhlIGxpbWl0IGl0c2VsZiBkaWQgbm90IGNoYW5nZSBhbmQgZG9jdW1lbnRzIGZyb20gY2FjaGVcbiAgICAgICAgLy8gd2lsbCBjb250aW51ZSB0byBiZSBcInJlamVjdGVkXCIgYnkgdGhpcyBib3VuZGFyeS4gVGhlcmVmb3JlLCB3ZSBjYW4gaWdub3JlXG4gICAgICAgIC8vIGFueSBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZSBsYXN0IGRvY3VtZW50LlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBcIkZcIiAvKiBMaW1pdFR5cGUuRmlyc3QgKi8gPT09IHQubGltaXRUeXBlID8gZS5sYXN0KCkgOiBlLmZpcnN0KCk7XG4gICAgICAgIHJldHVybiAhIWkgJiYgKGkuaGFzUGVuZGluZ1dyaXRlcyB8fCBpLnZlcnNpb24uY29tcGFyZVRvKHMpID4gMCk7XG4gICAgfVxuICAgIFFpKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIEMoKSA8PSBMb2dMZXZlbC5ERUJVRyAmJiBOKFwiUXVlcnlFbmdpbmVcIiwgXCJVc2luZyBmdWxsIGNvbGxlY3Rpb24gc2NhbiB0byBleGVjdXRlIHF1ZXJ5OlwiLCBlcyhlKSksIFxuICAgICAgICB0aGlzLlVpLmdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgSXQubWluKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21iaW5lcyB0aGUgcmVzdWx0cyBmcm9tIGFuIGluZGV4ZWQgZXhlY3V0aW9uIHdpdGggdGhlIHJlbWFpbmluZyBkb2N1bWVudHNcbiAgICAgKiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGluZGV4ZWQuXG4gICAgICovICAgIFdpKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgYWxsIHJlc3VsdHMgZm9yIGRvY3VtZW50cyB0aGF0IHdlcmUgdXBkYXRlZCBzaW5jZSB0aGUgb2Zmc2V0LlxuICAgICAgICByZXR1cm4gdGhpcy5VaS5nZXREb2N1bWVudHNNYXRjaGluZ1F1ZXJ5KHQsIG4sIHMpLm5leHQoKHQgPT4gKFxuICAgICAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHJlc3VsdHNcbiAgICAgICAgZS5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQgPSB0Lmluc2VydChlLmtleSwgZSk7XG4gICAgICAgIH0pKSwgdCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEltcGxlbWVudHMgYExvY2FsU3RvcmVgIGludGVyZmFjZS5cbiAqXG4gKiBOb3RlOiBzb21lIGZpZWxkIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBtaWdodCBoYXZlIHB1YmxpYyBhY2Nlc3MgbGV2ZWwsIGJ1dFxuICogdGhlIGNsYXNzIGlzIG5vdCBleHBvcnRlZCBzbyB0aGV5IGFyZSBvbmx5IGFjY2Vzc2libGUgZnJvbSB0aGlzIG1vZHVsZS5cbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGltcGxlbWVudCBvcHRpb25hbCBmZWF0dXJlcyAobGlrZSBidW5kbGVzKSBpbiBmcmVlXG4gKiBmdW5jdGlvbnMsIHN1Y2ggdGhhdCB0aGV5IGFyZSB0cmVlLXNoYWtlYWJsZS5cbiAqL1xuY2xhc3MgbnUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBNYW5hZ2VzIG91ciBpbi1tZW1vcnkgb3IgZHVyYWJsZSBwZXJzaXN0ZW5jZS4gKi9cbiAgICB0LCBlLCBuLCBzKSB7XG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2UgPSB0LCB0aGlzLkhpID0gZSwgdGhpcy5zZXJpYWxpemVyID0gcywgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgdGFyZ2V0SUQgdG8gZGF0YSBhYm91dCBpdHMgdGFyZ2V0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFdlIGFyZSB1c2luZyBhbiBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgb24gV2ViIHRvIG1ha2UgcmUtcnVuc1xuICAgICAgICAgKiBvZiBgYXBwbHlSZW1vdGVFdmVudCgpYCBpZGVtcG90ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5KaSA9IG5ldyBwZShldCksIFxuICAgICAgICAvKiogTWFwcyBhIHRhcmdldCB0byBpdHMgdGFyZ2V0SUQuICovXG4gICAgICAgIC8vIFRPRE8od3VhbmR5KTogRXZhbHVhdGUgaWYgVGFyZ2V0SWQgY2FuIGJlIHBhcnQgb2YgVGFyZ2V0LlxuICAgICAgICB0aGlzLllpID0gbmV3IG9zKCh0ID0+ICRuKHQpKSwgT24pLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcGVyIGNvbGxlY3Rpb24gZ3JvdXAgaW5kZXggb2YgdGhlIGxhc3QgcmVhZCB0aW1lIHByb2Nlc3NlZCBieVxuICAgICAgICAgKiBgZ2V0TmV3RG9jdW1lbnRDaGFuZ2VzKClgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBQT1JUSU5HIE5PVEU6IFRoaXMgaXMgb25seSB1c2VkIGZvciBtdWx0aS10YWIgc3luY2hyb25pemF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5YaSA9IG5ldyBNYXAsIHRoaXMuWmkgPSB0LmdldFJlbW90ZURvY3VtZW50Q2FjaGUoKSwgdGhpcy5CcyA9IHQuZ2V0VGFyZ2V0Q2FjaGUoKSwgXG4gICAgICAgIHRoaXMucXMgPSB0LmdldEJ1bmRsZUNhY2hlKCksIHRoaXMudHIobik7XG4gICAgfVxuICAgIHRyKHQpIHtcbiAgICAgICAgLy8gVE9ETyhpbmRleGluZyk6IEFkZCBzcGVjIHRlc3RzIHRoYXQgdGVzdCB0aGVzZSBjb21wb25lbnRzIGNoYW5nZSBhZnRlciBhXG4gICAgICAgIC8vIHVzZXIgY2hhbmdlXG4gICAgICAgIHRoaXMuZG9jdW1lbnRPdmVybGF5Q2FjaGUgPSB0aGlzLnBlcnNpc3RlbmNlLmdldERvY3VtZW50T3ZlcmxheUNhY2hlKHQpLCB0aGlzLmluZGV4TWFuYWdlciA9IHRoaXMucGVyc2lzdGVuY2UuZ2V0SW5kZXhNYW5hZ2VyKHQpLCBcbiAgICAgICAgdGhpcy5tdXRhdGlvblF1ZXVlID0gdGhpcy5wZXJzaXN0ZW5jZS5nZXRNdXRhdGlvblF1ZXVlKHQsIHRoaXMuaW5kZXhNYW5hZ2VyKSwgdGhpcy5sb2NhbERvY3VtZW50cyA9IG5ldyBrbyh0aGlzLlppLCB0aGlzLm11dGF0aW9uUXVldWUsIHRoaXMuZG9jdW1lbnRPdmVybGF5Q2FjaGUsIHRoaXMuaW5kZXhNYW5hZ2VyKSwgXG4gICAgICAgIHRoaXMuWmkuc2V0SW5kZXhNYW5hZ2VyKHRoaXMuaW5kZXhNYW5hZ2VyKSwgdGhpcy5IaS5pbml0aWFsaXplKHRoaXMubG9jYWxEb2N1bWVudHMsIHRoaXMuaW5kZXhNYW5hZ2VyKTtcbiAgICB9XG4gICAgY29sbGVjdEdhcmJhZ2UodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkNvbGxlY3QgZ2FyYmFnZVwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsIChlID0+IHQuY29sbGVjdChlLCB0aGlzLkppKSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3UoXG4vKiogTWFuYWdlcyBvdXIgaW4tbWVtb3J5IG9yIGR1cmFibGUgcGVyc2lzdGVuY2UuICovXG50LCBlLCBuLCBzKSB7XG4gICAgcmV0dXJuIG5ldyBudSh0LCBlLCBuLCBzKTtcbn1cblxuLyoqXG4gKiBUZWxscyB0aGUgTG9jYWxTdG9yZSB0aGF0IHRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCB1c2VyIGhhcyBjaGFuZ2VkLlxuICpcbiAqIEluIHJlc3BvbnNlIHRoZSBsb2NhbCBzdG9yZSBzd2l0Y2hlcyB0aGUgbXV0YXRpb24gcXVldWUgdG8gdGhlIG5ldyB1c2VyIGFuZFxuICogcmV0dXJucyBhbnkgcmVzdWx0aW5nIGRvY3VtZW50IGNoYW5nZXMuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogQW5kcm9pZCBhbmQgaU9TIG9ubHkgcmV0dXJuIHRoZSBkb2N1bWVudHMgYWZmZWN0ZWQgYnkgdGhlXG4vLyBjaGFuZ2UuXG5hc3luYyBmdW5jdGlvbiBpdSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCk7XG4gICAgcmV0dXJuIGF3YWl0IG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJIYW5kbGUgdXNlciBjaGFuZ2VcIiwgXCJyZWFkb25seVwiLCAodCA9PiB7XG4gICAgICAgIC8vIFN3YXAgb3V0IHRoZSBtdXRhdGlvbiBxdWV1ZSwgZ3JhYmJpbmcgdGhlIHBlbmRpbmcgbXV0YXRpb24gYmF0Y2hlc1xuICAgICAgICAvLyBiZWZvcmUgYW5kIGFmdGVyLlxuICAgICAgICBsZXQgcztcbiAgICAgICAgcmV0dXJuIG4ubXV0YXRpb25RdWV1ZS5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkubmV4dCgoaSA9PiAocyA9IGksIG4udHIoZSksIG4ubXV0YXRpb25RdWV1ZS5nZXRBbGxNdXRhdGlvbkJhdGNoZXModCkpKSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpID0gW10sIHIgPSBbXTtcbiAgICAgICAgICAgIC8vIFVuaW9uIHRoZSBvbGQvbmV3IGNoYW5nZWQga2V5cy5cbiAgICAgICAgICAgIGxldCBvID0gZ3MoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBzKSB7XG4gICAgICAgICAgICAgICAgaS5wdXNoKHQuYmF0Y2hJZCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQubXV0YXRpb25zKSBvID0gby5hZGQoZS5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgICAgICByLnB1c2godC5iYXRjaElkKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5tdXRhdGlvbnMpIG8gPSBvLmFkZChlLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHNldCBvZiBhbGwgKHBvdGVudGlhbGx5KSBjaGFuZ2VkIGRvY3VtZW50cyBhbmQgdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIG9mIG11dGF0aW9uIGJhdGNoIElEcyB0aGF0IHdlcmUgYWZmZWN0ZWQgYnkgY2hhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubG9jYWxEb2N1bWVudHMuZ2V0RG9jdW1lbnRzKHQsIG8pLm5leHQoKHQgPT4gKHtcbiAgICAgICAgICAgICAgICBlcjogdCxcbiAgICAgICAgICAgICAgICByZW1vdmVkQmF0Y2hJZHM6IGksXG4gICAgICAgICAgICAgICAgYWRkZWRCYXRjaElkczogclxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH0pKTtcbn1cblxuLyogQWNjZXB0cyBsb2NhbGx5IGdlbmVyYXRlZCBNdXRhdGlvbnMgYW5kIGNvbW1pdCB0aGVtIHRvIHN0b3JhZ2UuICovXG4vKipcbiAqIEFja25vd2xlZGdlcyB0aGUgZ2l2ZW4gYmF0Y2guXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggd2hlbiBhIGJhdGNoIGlzIGFja25vd2xlZGdlZCwgdGhlIGxvY2FsIHN0b3JlIHdpbGxcbiAqXG4gKiAgKyByZW1vdmUgdGhlIGJhdGNoIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlO1xuICogICsgYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSBkb2N1bWVudCBjYWNoZTtcbiAqICArIHJlY2FsY3VsYXRlIHRoZSBsYXRlbmN5IGNvbXBlbnNhdGVkIHZpZXcgaW1wbGllZCBieSB0aG9zZSBjaGFuZ2VzICh0aGVyZVxuICogICAgbWF5IGJlIG11dGF0aW9ucyBpbiB0aGUgcXVldWUgdGhhdCBhZmZlY3QgdGhlIGRvY3VtZW50cyBidXQgaGF2ZW4ndCBiZWVuXG4gKiAgICBhY2tub3dsZWRnZWQgeWV0KTsgYW5kXG4gKiAgKyBnaXZlIHRoZSBjaGFuZ2VkIGRvY3VtZW50cyBiYWNrIHRoZSBzeW5jIGVuZ2luZVxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgKG1vZGlmaWVkKSBkb2N1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIHJ1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFja25vd2xlZGdlIGJhdGNoXCIsIFwicmVhZHdyaXRlLXByaW1hcnlcIiwgKHQgPT4ge1xuICAgICAgICBjb25zdCBzID0gZS5iYXRjaC5rZXlzKCksIGkgPSBuLlppLm5ld0NoYW5nZUJ1ZmZlcih7XG4gICAgICAgICAgICB0cmFja1JlbW92YWxzOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmJhdGNoLCByID0gaS5rZXlzKCk7XG4gICAgICAgICAgICBsZXQgbyA9IFJ0LnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goKHQgPT4ge1xuICAgICAgICAgICAgICAgIG8gPSBvLm5leHQoKCgpID0+IHMuZ2V0RW50cnkoZSwgdCkpKS5uZXh0KChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZG9jVmVyc2lvbnMuZ2V0KHQpO1xuICAgICAgICAgICAgICAgICAgICBGKG51bGwgIT09IHIpLCBlLnZlcnNpb24uY29tcGFyZVRvKHIpIDwgMCAmJiAoaS5hcHBseVRvUmVtb3RlRG9jdW1lbnQoZSwgbiksIGUuaXNWYWxpZERvY3VtZW50KCkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGNvbW1pdFZlcnNpb24gYXMgdGhlIHJlYWRUaW1lIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBkb2N1bWVudCdzIHVwZGF0ZVRpbWUgc2luY2UgdGhlIHVwZGF0ZVRpbWUgaXMgbm90IGFkdmFuY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciB1cGRhdGVzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAgICAgZS5zZXRSZWFkVGltZShuLmNvbW1pdFZlcnNpb24pLCBzLmFkZEVudHJ5KGUpKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLCBvLm5leHQoKCgpID0+IHQubXV0YXRpb25RdWV1ZS5yZW1vdmVNdXRhdGlvbkJhdGNoKGUsIGkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFJldHVybnMgdGhlIGxvY2FsIHZpZXcgb2YgdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSBhIG11dGF0aW9uIGJhdGNoLiAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuICAgICAgICAobiwgdCwgZSwgaSkubmV4dCgoKCkgPT4gaS5hcHBseSh0KSkpLm5leHQoKCgpID0+IG4ubXV0YXRpb25RdWV1ZS5wZXJmb3JtQ29uc2lzdGVuY3lDaGVjayh0KSkpLm5leHQoKCgpID0+IG4uZG9jdW1lbnRPdmVybGF5Q2FjaGUucmVtb3ZlT3ZlcmxheXNGb3JCYXRjaElkKHQsIHMsIGUuYmF0Y2guYmF0Y2hJZCkpKS5uZXh0KCgoKSA9PiBuLmxvY2FsRG9jdW1lbnRzLnJlY2FsY3VsYXRlQW5kU2F2ZU92ZXJsYXlzRm9yRG9jdW1lbnRLZXlzKHQsIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gZ3MoKTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5tdXRhdGlvblJlc3VsdHMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICB0Lm11dGF0aW9uUmVzdWx0c1tuXS50cmFuc2Zvcm1SZXN1bHRzLmxlbmd0aCA+IDAgJiYgKGUgPSBlLmFkZCh0LmJhdGNoLm11dGF0aW9uc1tuXS5rZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmVtb3ZlcyBtdXRhdGlvbnMgZnJvbSB0aGUgTXV0YXRpb25RdWV1ZSBmb3IgdGhlIHNwZWNpZmllZCBiYXRjaDtcbiAqIExvY2FsRG9jdW1lbnRzIHdpbGwgYmUgcmVjYWxjdWxhdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgbW9kaWZpZWQgZG9jdW1lbnRzLlxuICovIChlKSkpKS5uZXh0KCgoKSA9PiBuLmxvY2FsRG9jdW1lbnRzLmdldERvY3VtZW50cyh0LCBzKSkpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNvbnNpc3RlbnQgc25hcHNob3QgcHJvY2Vzc2VkICh1c2VkIGJ5IHRoZSBSZW1vdGVTdG9yZSB0b1xuICogZGV0ZXJtaW5lIHdoZXRoZXIgdG8gYnVmZmVyIGluY29taW5nIHNuYXBzaG90cyBmcm9tIHRoZSBiYWNrZW5kKS5cbiAqL1xuZnVuY3Rpb24gb3UodCkge1xuICAgIGNvbnN0IGUgPSBMKHQpO1xuICAgIHJldHVybiBlLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IGxhc3QgcmVtb3RlIHNuYXBzaG90IHZlcnNpb25cIiwgXCJyZWFkb25seVwiLCAodCA9PiBlLkJzLmdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24odCkpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBcImdyb3VuZC1zdGF0ZVwiIChyZW1vdGUpIGRvY3VtZW50cy4gV2UgYXNzdW1lIHRoYXQgdGhlIHJlbW90ZVxuICogZXZlbnQgcmVmbGVjdHMgYW55IHdyaXRlIGJhdGNoZXMgdGhhdCBoYXZlIGJlZW4gYWNrbm93bGVkZ2VkIG9yIHJlamVjdGVkXG4gKiAoaS5lLiB3ZSBkbyBub3QgcmUtYXBwbHkgbG9jYWwgbXV0YXRpb25zIHRvIHVwZGF0ZXMgZnJvbSB0aGlzIGV2ZW50KS5cbiAqXG4gKiBMb2NhbERvY3VtZW50cyBhcmUgcmUtY2FsY3VsYXRlZCBpZiB0aGVyZSBhcmUgcmVtYWluaW5nIG11dGF0aW9ucyBpbiB0aGVcbiAqIHF1ZXVlLlxuICovIGZ1bmN0aW9uIHV1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KSwgcyA9IGUuc25hcHNob3RWZXJzaW9uO1xuICAgIGxldCBpID0gbi5KaTtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFwcGx5IHJlbW90ZSBldmVudFwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsICh0ID0+IHtcbiAgICAgICAgY29uc3QgciA9IG4uWmkubmV3Q2hhbmdlQnVmZmVyKHtcbiAgICAgICAgICAgIHRyYWNrUmVtb3ZhbHM6ICEwXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZXNldCBuZXdUYXJnZXREYXRhQnlUYXJnZXRNYXAgaW4gY2FzZSB0aGlzIHRyYW5zYWN0aW9uIGdldHMgcmUtcnVuLlxuICAgICAgICAgICAgICAgIGkgPSBuLkppO1xuICAgICAgICBjb25zdCBvID0gW107XG4gICAgICAgIGUudGFyZ2V0Q2hhbmdlcy5mb3JFYWNoKCgociwgdSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYyA9IGkuZ2V0KHUpO1xuICAgICAgICAgICAgaWYgKCFjKSByZXR1cm47XG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgcmVtb3RlIGtleXMgaWYgdGhlIHRhcmdldCBpcyBzdGlsbCBhY3RpdmUuIFRoaXNcbiAgICAgICAgICAgIC8vIGVuc3VyZXMgdGhhdCB3ZSBjYW4gcGVyc2lzdCB0aGUgdXBkYXRlZCB0YXJnZXQgZGF0YSBhbG9uZyB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgdXBkYXRlZCBhc3NpZ25tZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKG4uQnMucmVtb3ZlTWF0Y2hpbmdLZXlzKHQsIHIucmVtb3ZlZERvY3VtZW50cywgdSkubmV4dCgoKCkgPT4gbi5Ccy5hZGRNYXRjaGluZ0tleXModCwgci5hZGRlZERvY3VtZW50cywgdSkpKSk7XG4gICAgICAgICAgICBsZXQgYSA9IGMud2l0aFNlcXVlbmNlTnVtYmVyKHQuY3VycmVudFNlcXVlbmNlTnVtYmVyKTtcbiAgICAgICAgICAgIG51bGwgIT09IGUudGFyZ2V0TWlzbWF0Y2hlcy5nZXQodSkgPyBhID0gYS53aXRoUmVzdW1lVG9rZW4oVmUuRU1QVFlfQllURV9TVFJJTkcsIHJ0Lm1pbigpKS53aXRoTGFzdExpbWJvRnJlZVNuYXBzaG90VmVyc2lvbihydC5taW4oKSkgOiByLnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDAgJiYgKGEgPSBhLndpdGhSZXN1bWVUb2tlbihyLnJlc3VtZVRva2VuLCBzKSksIFxuICAgICAgICAgICAgaSA9IGkuaW5zZXJ0KHUsIGEpLCBcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IGRhdGEgaWYgdGhlcmUgYXJlIHRhcmdldCBjaGFuZ2VzIChvciBpZlxuICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlKS5cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBuZXdUYXJnZXREYXRhIHNob3VsZCBiZSBwZXJzaXN0ZWQgZHVyaW5nIGFuIHVwZGF0ZSBvZlxuICogYW4gYWN0aXZlIHRhcmdldC4gVGFyZ2V0RGF0YSBzaG91bGQgYWx3YXlzIGJlIHBlcnNpc3RlZCB3aGVuIGEgdGFyZ2V0IGlzXG4gKiBiZWluZyByZWxlYXNlZCBhbmQgc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24uXG4gKlxuICogV2hpbGUgdGhlIHRhcmdldCBpcyBhY3RpdmUsIFRhcmdldERhdGEgdXBkYXRlcyBjYW4gYmUgb21pdHRlZCB3aGVuIG5vdGhpbmdcbiAqIGFib3V0IHRoZSB0YXJnZXQgaGFzIGNoYW5nZWQgZXhjZXB0IG1ldGFkYXRhIGxpa2UgdGhlIHJlc3VtZSB0b2tlbiBvclxuICogc25hcHNob3QgdmVyc2lvbi4gT2NjYXNpb25hbGx5IGl0J3Mgd29ydGggdGhlIGV4dHJhIHdyaXRlIHRvIHByZXZlbnQgdGhlc2VcbiAqIHZhbHVlcyBmcm9tIGdldHRpbmcgdG9vIHN0YWxlIGFmdGVyIGEgY3Jhc2gsIGJ1dCB0aGlzIGRvZXNuJ3QgaGF2ZSB0byBiZVxuICogdG9vIGZyZXF1ZW50LlxuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHBlcnNpc3QgdGFyZ2V0IGRhdGEgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgcmVzdW1lIHRva2VuLlxuICAgICAgICAgICAgICAgIGlmICgwID09PSB0LnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSkgcmV0dXJuICEwO1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IHJlc3VtZSB0b2tlbiBjaGFuZ2VzIHRvIGJlIGJ1ZmZlcmVkIGluZGVmaW5pdGVseS4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIGFsbG93cyB1cyB0byBiZSByZWFzb25hYmx5IHVwLXRvLWRhdGUgYWZ0ZXIgYSBjcmFzaCBhbmQgYXZvaWRzIG5lZWRpbmdcbiAgICAgICAgICAgICAgICAvLyB0byBsb29wIG92ZXIgYWxsIGFjdGl2ZSBxdWVyaWVzIG9uIHNodXRkb3duLiBFc3BlY2lhbGx5IGluIHRoZSBicm93c2VyXG4gICAgICAgICAgICAgICAgLy8gd2UgbWF5IG5vdCBnZXQgdGltZSB0byBkbyBhbnl0aGluZyBpbnRlcmVzdGluZyB3aGlsZSB0aGUgY3VycmVudCB0YWIgaXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5zbmFwc2hvdFZlcnNpb24udG9NaWNyb3NlY29uZHMoKSAtIHQuc25hcHNob3RWZXJzaW9uLnRvTWljcm9zZWNvbmRzKCkgPj0gM2U4KSByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIHRoZSBvbmx5IHRoaW5nIHRoYXQgaGFzIGNoYW5nZWQgYWJvdXQgYSB0YXJnZXQgaXMgaXRzIHJlc3VtZVxuICAgICAgICAgICAgICAgIC8vIHRva2VuIGl0J3Mgbm90IHdvcnRoIHBlcnNpc3RpbmcuIE5vdGUgdGhhdCB0aGUgUmVtb3RlU3RvcmUga2VlcHMgYW5cbiAgICAgICAgICAgICAgICAvLyBpbi1tZW1vcnkgdmlldyBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YXJnZXRzIHdoaWNoIGluY2x1ZGVzIHRoZSBjdXJyZW50XG4gICAgICAgICAgICAgICAgLy8gcmVzdW1lIHRva2VuLCBzbyBzdHJlYW0gZmFpbHVyZSBvciB1c2VyIGNoYW5nZXMgd2lsbCBzdGlsbCB1c2UgYW5cbiAgICAgICAgICAgICAgICAvLyB1cC10by1kYXRlIHJlc3VtZSB0b2tlbiByZWdhcmRsZXNzIG9mIHdoYXQgd2UgZG8gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRkZWREb2N1bWVudHMuc2l6ZSArIG4ubW9kaWZpZWREb2N1bWVudHMuc2l6ZSArIG4ucmVtb3ZlZERvY3VtZW50cy5zaXplID4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogTm90aWZpZXMgbG9jYWwgc3RvcmUgb2YgdGhlIGNoYW5nZWQgdmlld3MgdG8gbG9jYWxseSBwaW4gZG9jdW1lbnRzLlxuICovIChjLCBhLCByKSAmJiBvLnB1c2gobi5Ccy51cGRhdGVUYXJnZXREYXRhKHQsIGEpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICBsZXQgdSA9IGNzKCksIGMgPSBncygpO1xuICAgICAgICAvLyBIQUNLOiBUaGUgb25seSByZWFzb24gd2UgYWxsb3cgYSBudWxsIHNuYXBzaG90IHZlcnNpb24gaXMgc28gdGhhdCB3ZVxuICAgICAgICAvLyBjYW4gc3ludGhlc2l6ZSByZW1vdGUgZXZlbnRzIHdoZW4gd2UgZ2V0IHBlcm1pc3Npb24gZGVuaWVkIGVycm9ycyB3aGlsZVxuICAgICAgICAvLyB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgc3RhdGUgb2YgYSBsb2NhbGx5IGNhY2hlZCBkb2N1bWVudCB0aGF0IGlzIGluXG4gICAgICAgIC8vIGxpbWJvLlxuICAgICAgICBpZiAoZS5kb2N1bWVudFVwZGF0ZXMuZm9yRWFjaCgocyA9PiB7XG4gICAgICAgICAgICBlLnJlc29sdmVkTGltYm9Eb2N1bWVudHMuaGFzKHMpICYmIG8ucHVzaChuLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLnVwZGF0ZUxpbWJvRG9jdW1lbnQodCwgcykpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBFYWNoIGxvb3AgaXRlcmF0aW9uIG9ubHkgYWZmZWN0cyBpdHMgXCJvd25cIiBkb2MsIHNvIGl0J3Mgc2FmZSB0byBnZXQgYWxsXG4gICAgICAgIC8vIHRoZSByZW1vdGUgZG9jdW1lbnRzIGluIGFkdmFuY2UgaW4gYSBzaW5nbGUgY2FsbC5cbiAgICAgICAgby5wdXNoKGN1KHQsIHIsIGUuZG9jdW1lbnRVcGRhdGVzKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgIHUgPSB0Lm5yLCBjID0gdC5zcjtcbiAgICAgICAgfSkpKSwgIXMuaXNFcXVhbChydC5taW4oKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuLkJzLmdldExhc3RSZW1vdGVTbmFwc2hvdFZlcnNpb24odCkubmV4dCgoZSA9PiBuLkJzLnNldFRhcmdldHNNZXRhZGF0YSh0LCB0LmN1cnJlbnRTZXF1ZW5jZU51bWJlciwgcykpKTtcbiAgICAgICAgICAgIG8ucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnQud2FpdEZvcihvKS5uZXh0KCgoKSA9PiByLmFwcGx5KHQpKSkubmV4dCgoKCkgPT4gbi5sb2NhbERvY3VtZW50cy5nZXRMb2NhbFZpZXdPZkRvY3VtZW50cyh0LCB1LCBjKSkpLm5leHQoKCgpID0+IHUpKTtcbiAgICB9KSkudGhlbigodCA9PiAobi5KaSA9IGksIHQpKSk7XG59XG5cbi8qKlxuICogUG9wdWxhdGVzIGRvY3VtZW50IGNoYW5nZSBidWZmZXIgd2l0aCBkb2N1bWVudHMgZnJvbSBiYWNrZW5kIG9yIGEgYnVuZGxlLlxuICogUmV0dXJucyB0aGUgZG9jdW1lbnQgY2hhbmdlcyByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aG9zZSBkb2N1bWVudHMsIGFuZFxuICogYWxzbyBhIHNldCBvZiBkb2N1bWVudHMgd2hvc2UgZXhpc3RlbmNlIHN0YXRlIGFyZSBjaGFuZ2VkIGFzIGEgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSB0eG4gLSBUcmFuc2FjdGlvbiB0byB1c2UgdG8gcmVhZCBleGlzdGluZyBkb2N1bWVudHMgZnJvbSBzdG9yYWdlLlxuICogQHBhcmFtIGRvY3VtZW50QnVmZmVyIC0gRG9jdW1lbnQgYnVmZmVyIHRvIGNvbGxlY3QgdGhlIHJlc3VsdGVkIGNoYW5nZXMgdG8gYmVcbiAqICAgICAgICBhcHBsaWVkIHRvIHN0b3JhZ2UuXG4gKiBAcGFyYW0gZG9jdW1lbnRzIC0gRG9jdW1lbnRzIHRvIGJlIGFwcGxpZWQuXG4gKi8gZnVuY3Rpb24gY3UodCwgZSwgbikge1xuICAgIGxldCBzID0gZ3MoKSwgaSA9IGdzKCk7XG4gICAgcmV0dXJuIG4uZm9yRWFjaCgodCA9PiBzID0gcy5hZGQodCkpKSwgZS5nZXRFbnRyaWVzKHQsIHMpLm5leHQoKHQgPT4ge1xuICAgICAgICBsZXQgcyA9IGNzKCk7XG4gICAgICAgIHJldHVybiBuLmZvckVhY2goKChuLCByKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvID0gdC5nZXQobik7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBzZWUgaWYgdGhlcmUgaXMgYSBleGlzdGVuY2Ugc3RhdGUgY2hhbmdlIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgci5pc0ZvdW5kRG9jdW1lbnQoKSAhPT0gby5pc0ZvdW5kRG9jdW1lbnQoKSAmJiAoaSA9IGkuYWRkKG4pKSwgXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIHN0ZXBzIGJlbG93IGlzIGltcG9ydGFudCwgc2luY2Ugd2Ugd2FudFxuICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgcmVqZWN0ZWQgbGltYm8gcmVzb2x1dGlvbnMgKHdoaWNoIGZhYnJpY2F0ZVxuICAgICAgICAgICAgLy8gTm9Eb2N1bWVudHMgd2l0aCBTbmFwc2hvdFZlcnNpb24ubWluKCkpIG5ldmVyIGFkZCBkb2N1bWVudHMgdG9cbiAgICAgICAgICAgIC8vIGNhY2hlLlxuICAgICAgICAgICAgci5pc05vRG9jdW1lbnQoKSAmJiByLnZlcnNpb24uaXNFcXVhbChydC5taW4oKSkgPyAoXG4gICAgICAgICAgICAvLyBOb0RvY3VtZW50cyB3aXRoIFNuYXBzaG90VmVyc2lvbi5taW4oKSBhcmUgdXNlZCBpbiBtYW51ZmFjdHVyZWRcbiAgICAgICAgICAgIC8vIGV2ZW50cy4gV2UgcmVtb3ZlIHRoZXNlIGRvY3VtZW50cyBmcm9tIGNhY2hlIHNpbmNlIHdlIGxvc3RcbiAgICAgICAgICAgIC8vIGFjY2Vzcy5cbiAgICAgICAgICAgIGUucmVtb3ZlRW50cnkobiwgci5yZWFkVGltZSksIHMgPSBzLmluc2VydChuLCByKSkgOiAhby5pc1ZhbGlkRG9jdW1lbnQoKSB8fCByLnZlcnNpb24uY29tcGFyZVRvKG8udmVyc2lvbikgPiAwIHx8IDAgPT09IHIudmVyc2lvbi5jb21wYXJlVG8oby52ZXJzaW9uKSAmJiBvLmhhc1BlbmRpbmdXcml0ZXMgPyAoZS5hZGRFbnRyeShyKSwgXG4gICAgICAgICAgICBzID0gcy5pbnNlcnQobiwgcikpIDogTihcIkxvY2FsU3RvcmVcIiwgXCJJZ25vcmluZyBvdXRkYXRlZCB3YXRjaCB1cGRhdGUgZm9yIFwiLCBuLCBcIi4gQ3VycmVudCB2ZXJzaW9uOlwiLCBvLnZlcnNpb24sIFwiIFdhdGNoIHZlcnNpb246XCIsIHIudmVyc2lvbik7XG4gICAgICAgIH0pKSwge1xuICAgICAgICAgICAgbnI6IHMsXG4gICAgICAgICAgICBzcjogaVxuICAgICAgICB9O1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBtdXRhdGlvbiBiYXRjaCBhZnRlciB0aGUgcGFzc2VkIGluIGJhdGNoSWQgaW4gdGhlIG11dGF0aW9uIHF1ZXVlXG4gKiBvciBudWxsIGlmIGVtcHR5LlxuICogQHBhcmFtIGFmdGVyQmF0Y2hJZCAtIElmIHByb3ZpZGVkLCB0aGUgYmF0Y2ggdG8gc2VhcmNoIGFmdGVyLlxuICogQHJldHVybnMgVGhlIG5leHQgbXV0YXRpb24gb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3Qgb25lLlxuICovXG5mdW5jdGlvbiBhdSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCk7XG4gICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgbmV4dCBtdXRhdGlvbiBiYXRjaFwiLCBcInJlYWRvbmx5XCIsICh0ID0+ICh2b2lkIDAgPT09IGUgJiYgKGUgPSAtMSksIFxuICAgIG4ubXV0YXRpb25RdWV1ZS5nZXROZXh0TXV0YXRpb25CYXRjaEFmdGVyQmF0Y2hJZCh0LCBlKSkpKTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIERvY3VtZW50IHdpdGggYSBnaXZlbiBrZXkgb3IgbnVsbCBpZiBub3RcbiAqIGZvdW5kIC0gdXNlZCBmb3IgdGVzdGluZy5cbiAqL1xuLyoqXG4gKiBBc3NpZ25zIHRoZSBnaXZlbiB0YXJnZXQgYW4gaW50ZXJuYWwgSUQgc28gdGhhdCBpdHMgcmVzdWx0cyBjYW4gYmUgcGlubmVkIHNvXG4gKiB0aGV5IGRvbid0IGdldCBHQydkLiBBIHRhcmdldCBtdXN0IGJlIGFsbG9jYXRlZCBpbiB0aGUgbG9jYWwgc3RvcmUgYmVmb3JlXG4gKiB0aGUgc3RvcmUgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIGl0cyB2aWV3LlxuICpcbiAqIEFsbG9jYXRpbmcgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgYFRhcmdldGAgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIGBUYXJnZXREYXRhYFxuICogZm9yIHRoYXQgYFRhcmdldGAuXG4gKi9cbmZ1bmN0aW9uIGh1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIkFsbG9jYXRlIHRhcmdldFwiLCBcInJlYWR3cml0ZVwiLCAodCA9PiB7XG4gICAgICAgIGxldCBzO1xuICAgICAgICByZXR1cm4gbi5Ccy5nZXRUYXJnZXREYXRhKHQsIGUpLm5leHQoKGkgPT4gaSA/IChcbiAgICAgICAgLy8gVGhpcyB0YXJnZXQgaGFzIGJlZW4gbGlzdGVuZWQgdG8gcHJldmlvdXNseSwgc28gcmV1c2UgdGhlXG4gICAgICAgIC8vIHByZXZpb3VzIHRhcmdldElELlxuICAgICAgICAvLyBUT0RPKG1jZyk6IGZyZXNoZW4gbGFzdCBhY2Nlc3NlZCBkYXRlP1xuICAgICAgICBzID0gaSwgUnQucmVzb2x2ZShzKSkgOiBuLkJzLmFsbG9jYXRlVGFyZ2V0SWQodCkubmV4dCgoaSA9PiAocyA9IG5ldyBjcihlLCBpLCBcIlRhcmdldFB1cnBvc2VMaXN0ZW5cIiAvKiBUYXJnZXRQdXJwb3NlLkxpc3RlbiAqLyAsIHQuY3VycmVudFNlcXVlbmNlTnVtYmVyKSwgXG4gICAgICAgIG4uQnMuYWRkVGFyZ2V0RGF0YSh0LCBzKS5uZXh0KCgoKSA9PiBzKSkpKSkpKTtcbiAgICB9KSkudGhlbigodCA9PiB7XG4gICAgICAgIC8vIElmIE11bHRpLVRhYiBpcyBlbmFibGVkLCB0aGUgZXhpc3RpbmcgdGFyZ2V0IGRhdGEgbWF5IGJlIG5ld2VyIHRoYW5cbiAgICAgICAgLy8gdGhlIGluLW1lbW9yeSBkYXRhXG4gICAgICAgIGNvbnN0IHMgPSBuLkppLmdldCh0LnRhcmdldElkKTtcbiAgICAgICAgcmV0dXJuIChudWxsID09PSBzIHx8IHQuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhzLnNuYXBzaG90VmVyc2lvbikgPiAwKSAmJiAobi5KaSA9IG4uSmkuaW5zZXJ0KHQudGFyZ2V0SWQsIHQpLCBcbiAgICAgICAgbi5ZaS5zZXQoZSwgdC50YXJnZXRJZCkpLCB0O1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBUYXJnZXREYXRhIGFzIHNlZW4gYnkgdGhlIExvY2FsU3RvcmUsIGluY2x1ZGluZyB1cGRhdGVzIHRoYXQgbWF5XG4gKiBoYXZlIG5vdCB5ZXQgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFRhcmdldENhY2hlLlxuICovXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nLlxuLyoqXG4gKiBVbnBpbnMgYWxsIHRoZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YXJnZXQuIElmXG4gKiBga2VlcFBlcnNpc3RlZFRhcmdldERhdGFgIGlzIHNldCB0byBmYWxzZSBhbmQgRWFnZXIgR0MgZW5hYmxlZCwgdGhlIG1ldGhvZFxuICogZGlyZWN0bHkgcmVtb3ZlcyB0aGUgYXNzb2NpYXRlZCB0YXJnZXQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgY2FjaGUuXG4gKlxuICogUmVsZWFzaW5nIGEgbm9uLWV4aXN0aW5nIGBUYXJnZXRgIGlzIGEgbm8tb3AuXG4gKi9cbi8vIFBPUlRJTkcgTk9URTogYGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhYCBpcyBtdWx0aS10YWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIGx1KHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gTCh0KSwgaSA9IHMuSmkuZ2V0KGUpLCByID0gbiA/IFwicmVhZHdyaXRlXCIgOiBcInJlYWR3cml0ZS1wcmltYXJ5XCI7XG4gICAgdHJ5IHtcbiAgICAgICAgbiB8fCBhd2FpdCBzLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiUmVsZWFzZSB0YXJnZXRcIiwgciwgKHQgPT4gcy5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5yZW1vdmVUYXJnZXQodCwgaSkpKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGlmICghRHQodCkpIHRocm93IHQ7XG4gICAgICAgIC8vIEFsbCBgcmVsZWFzZVRhcmdldGAgZG9lcyBpcyByZWNvcmQgdGhlIGZpbmFsIG1ldGFkYXRhIHN0YXRlIGZvciB0aGVcbiAgICAgICAgLy8gdGFyZ2V0LCBidXQgd2UndmUgYmVlbiByZWNvcmRpbmcgdGhpcyBwZXJpb2RpY2FsbHkgZHVyaW5nIHRhcmdldFxuICAgICAgICAvLyBhY3Rpdml0eS4gSWYgd2UgbG9zZSB0aGlzIHdyaXRlIHRoaXMgY291bGQgY2F1c2UgYSB2ZXJ5IHNsaWdodFxuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIHRoZSBvcmRlciBvZiB0YXJnZXQgZGVsZXRpb24gZHVyaW5nIEdDLCBidXQgd2VcbiAgICAgICAgLy8gZG9uJ3QgZGVmaW5lIGV4YWN0IExSVSBzZW1hbnRpY3Mgc28gdGhpcyBpcyBhY2NlcHRhYmxlLlxuICAgICAgICBOKFwiTG9jYWxTdG9yZVwiLCBgRmFpbGVkIHRvIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXJzIGZvciB0YXJnZXQgJHtlfTogJHt0fWApO1xuICAgIH1cbiAgICBzLkppID0gcy5KaS5yZW1vdmUoZSksIHMuWWkuZGVsZXRlKGkudGFyZ2V0KTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBzcGVjaWZpZWQgcXVlcnkgYWdhaW5zdCB0aGUgbG9jYWwgc3RvcmUgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMsXG4gKiBwb3RlbnRpYWxseSB0YWtpbmcgYWR2YW50YWdlIG9mIHF1ZXJ5IGRhdGEgZnJvbSBwcmV2aW91cyBleGVjdXRpb25zIChzdWNoXG4gKiBhcyB0aGUgc2V0IG9mIHJlbW90ZSBrZXlzKS5cbiAqXG4gKiBAcGFyYW0gdXNlUHJldmlvdXNSZXN1bHRzIC0gV2hldGhlciByZXN1bHRzIGZyb20gcHJldmlvdXMgZXhlY3V0aW9ucyBjYW5cbiAqIGJlIHVzZWQgdG8gb3B0aW1pemUgdGhpcyBxdWVyeSBleGVjdXRpb24uXG4gKi8gZnVuY3Rpb24gZnUodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBMKHQpO1xuICAgIGxldCBpID0gcnQubWluKCksIHIgPSBncygpO1xuICAgIHJldHVybiBzLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiRXhlY3V0ZSBxdWVyeVwiLCBcInJlYWRvbmx5XCIsICh0ID0+IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEwodCksIGkgPSBzLllpLmdldChuKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaSA/IFJ0LnJlc29sdmUocy5KaS5nZXQoaSkpIDogcy5Ccy5nZXRUYXJnZXREYXRhKGUsIG4pO1xuICAgIH0ocywgdCwgSm4oZSkpLm5leHQoKGUgPT4ge1xuICAgICAgICBpZiAoZSkgcmV0dXJuIGkgPSBlLmxhc3RMaW1ib0ZyZWVTbmFwc2hvdFZlcnNpb24sIHMuQnMuZ2V0TWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgZS50YXJnZXRJZCkubmV4dCgodCA9PiB7XG4gICAgICAgICAgICByID0gdDtcbiAgICAgICAgfSkpO1xuICAgIH0pKS5uZXh0KCgoKSA9PiBzLkhpLmdldERvY3VtZW50c01hdGNoaW5nUXVlcnkodCwgZSwgbiA/IGkgOiBydC5taW4oKSwgbiA/IHIgOiBncygpKSkpLm5leHQoKHQgPT4gKF91KHMsIHNzKGUpLCB0KSwgXG4gICAge1xuICAgICAgICBkb2N1bWVudHM6IHQsXG4gICAgICAgIGlyOiByXG4gICAgfSkpKSkpO1xufVxuXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuZnVuY3Rpb24gZHUodCwgZSkge1xuICAgIGNvbnN0IG4gPSBMKHQpLCBzID0gTChuLkJzKSwgaSA9IG4uSmkuZ2V0KGUpO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKGkudGFyZ2V0KSA6IG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgdGFyZ2V0IGRhdGFcIiwgXCJyZWFkb25seVwiLCAodCA9PiBzLmxlKHQsIGUpLm5leHQoKHQgPT4gdCA/IHQudGFyZ2V0IDogbnVsbCkpKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2V0IG9mIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwuXG4gKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCByZXR1cm5zIHRoZSBzZXQgb2YgY2hhbmdlcyBzaW5jZSBjbGllbnRcbiAqIGluaXRpYWxpemF0aW9uLiBGdXJ0aGVyIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGRvY3VtZW50IHRoYXQgaGF2ZSBjaGFuZ2VkXG4gKiBzaW5jZSB0aGUgcHJpb3IgY2FsbC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmZ1bmN0aW9uIHd1KHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KSwgcyA9IG4uWGkuZ2V0KGUpIHx8IHJ0Lm1pbigpO1xuICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXhpbXVtIHJlYWQgdGltZSBmb3IgdGhlIGNvbGxlY3Rpb24uIFRoaXMgc2hvdWxkIGFsd2F5c1xuICAgIC8vIGV4aXN0LCBidXQgdG8gcmVkdWNlIHRoZSBjaGFuY2UgZm9yIHJlZ3Jlc3Npb25zIHdlIGRlZmF1bHQgdG9cbiAgICAvLyBTbmFwc2hvdFZlcnNpb24uTWluKClcbiAgICAvLyBUT0RPKGluZGV4aW5nKTogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IG5ldyBkb2N1bWVudCBjaGFuZ2VzXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5aaS5nZXRBbGxGcm9tQ29sbGVjdGlvbkdyb3VwKHQsIGUsIHl0KHMsIC0xKSwgXG4gICAgLyogbGltaXQ9ICovIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSkpLnRoZW4oKHQgPT4gKF91KG4sIGUsIHQpLCB0KSkpO1xufVxuXG4vKiogU2V0cyB0aGUgY29sbGVjdGlvbiBncm91cCdzIG1heGltdW0gcmVhZCB0aW1lIGZyb20gdGhlIGdpdmVuIGRvY3VtZW50cy4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5mdW5jdGlvbiBfdSh0LCBlLCBuKSB7XG4gICAgbGV0IHMgPSB0LlhpLmdldChlKSB8fCBydC5taW4oKTtcbiAgICBuLmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgIGUucmVhZFRpbWUuY29tcGFyZVRvKHMpID4gMCAmJiAocyA9IGUucmVhZFRpbWUpO1xuICAgIH0pKSwgdC5YaS5zZXQoZSwgcyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0YXJnZXQgdXNpbmcgdGhlIGdpdmVuIGJ1bmRsZSBuYW1lLCB3aGljaCB3aWxsIGJlIHVzZWQgdG9cbiAqIGhvbGQgdGhlIGtleXMgb2YgYWxsIGRvY3VtZW50cyBmcm9tIHRoZSBidW5kbGUgaW4gcXVlcnktZG9jdW1lbnQgbWFwcGluZ3MuXG4gKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbG9hZGVkIGRvY3VtZW50cyBkbyBub3QgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkXG4gKiByaWdodCBhd2F5LlxuICovXG4vKipcbiAqIEFwcGxpZXMgdGhlIGRvY3VtZW50cyBmcm9tIGEgYnVuZGxlIHRvIHRoZSBcImdyb3VuZC1zdGF0ZVwiIChyZW1vdGUpXG4gKiBkb2N1bWVudHMuXG4gKlxuICogTG9jYWxEb2N1bWVudHMgYXJlIHJlLWNhbGN1bGF0ZWQgaWYgdGhlcmUgYXJlIHJlbWFpbmluZyBtdXRhdGlvbnMgaW4gdGhlXG4gKiBxdWV1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbXUodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBMKHQpO1xuICAgIGxldCByID0gZ3MoKSwgbyA9IGNzKCk7XG4gICAgZm9yIChjb25zdCB0IG9mIG4pIHtcbiAgICAgICAgY29uc3QgbiA9IGUucnIodC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgdC5kb2N1bWVudCAmJiAociA9IHIuYWRkKG4pKTtcbiAgICAgICAgY29uc3QgcyA9IGUudXIodCk7XG4gICAgICAgIHMuc2V0UmVhZFRpbWUoZS5jcih0Lm1ldGFkYXRhLnJlYWRUaW1lKSksIG8gPSBvLmluc2VydChuLCBzKTtcbiAgICB9XG4gICAgY29uc3QgdSA9IGkuWmkubmV3Q2hhbmdlQnVmZmVyKHtcbiAgICAgICAgdHJhY2tSZW1vdmFsczogITBcbiAgICB9KSwgYyA9IGF3YWl0IGh1KGksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgLy8gSXQgaXMgT0sgdGhhdCB0aGUgcGF0aCB1c2VkIGZvciB0aGUgcXVlcnkgaXMgbm90IHZhbGlkLCBiZWNhdXNlIHRoaXMgd2lsbFxuICAgICAgICAvLyBub3QgYmUgcmVhZCBhbmQgcXVlcmllZC5cbiAgICAgICAgcmV0dXJuIEpuKEduKHV0LmZyb21TdHJpbmcoYF9fYnVuZGxlX18vZG9jcy8ke3R9YCkpKTtcbiAgICB9KHMpKTtcbiAgICAvLyBBbGxvY2F0ZXMgYSB0YXJnZXQgdG8gaG9sZCBhbGwgZG9jdW1lbnQga2V5cyBmcm9tIHRoZSBidW5kbGUsIHN1Y2ggdGhhdFxuICAgIC8vIHRoZXkgd2lsbCBub3QgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkIHJpZ2h0IGF3YXkuXG4gICAgICAgIHJldHVybiBpLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQXBwbHkgYnVuZGxlIGRvY3VtZW50c1wiLCBcInJlYWR3cml0ZVwiLCAodCA9PiBjdSh0LCB1LCBvKS5uZXh0KChlID0+ICh1LmFwcGx5KHQpLCBcbiAgICBlKSkpLm5leHQoKGUgPT4gaS5Ccy5yZW1vdmVNYXRjaGluZ0tleXNGb3JUYXJnZXRJZCh0LCBjLnRhcmdldElkKS5uZXh0KCgoKSA9PiBpLkJzLmFkZE1hdGNoaW5nS2V5cyh0LCByLCBjLnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkubG9jYWxEb2N1bWVudHMuZ2V0TG9jYWxWaWV3T2ZEb2N1bWVudHModCwgZS5uciwgZS5zcikpKS5uZXh0KCgoKSA9PiBlLm5yKSkpKSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSBpZiB0aGUgZ2l2ZW4gYnVuZGxlIGhhcyBhbHJlYWR5XG4gKiBiZWVuIGxvYWRlZCBhbmQgdGhlIGNyZWF0ZSB0aW1lIGlzIG5ld2VyIHRoYW4gdGhlIGN1cnJlbnQgbG9hZGluZyBidW5kbGUuXG4gKi9cbi8qKlxuICogU2F2ZXMgdGhlIGdpdmVuIGBOYW1lZFF1ZXJ5YCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ3UodCwgZSwgbiA9IGdzKCkpIHtcbiAgICAvLyBBbGxvY2F0ZSBhIHRhcmdldCBmb3IgdGhlIG5hbWVkIHF1ZXJ5IHN1Y2ggdGhhdCBpdCBjYW4gYmUgcmVzdW1lZFxuICAgIC8vIGZyb20gYXNzb2NpYXRlZCByZWFkIHRpbWUgaWYgdXNlcnMgdXNlIGl0IHRvIGxpc3Rlbi5cbiAgICAvLyBOT1RFOiB0aGlzIGFsc28gbWVhbnMgaWYgbm8gY29ycmVzcG9uZGluZyB0YXJnZXQgZXhpc3RzLCB0aGUgbmV3IHRhcmdldFxuICAgIC8vIHdpbGwgcmVtYWluIGFjdGl2ZSBhbmQgd2lsbCBub3QgZ2V0IGNvbGxlY3RlZCwgdW5sZXNzIHVzZXJzIGhhcHBlbiB0b1xuICAgIC8vIHVubGlzdGVuIHRoZSBxdWVyeSBzb21laG93LlxuICAgIGNvbnN0IHMgPSBhd2FpdCBodSh0LCBKbih5cihlLmJ1bmRsZWRRdWVyeSkpKSwgaSA9IEwodCk7XG4gICAgcmV0dXJuIGkucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJTYXZlIG5hbWVkIHF1ZXJ5XCIsIFwicmVhZHdyaXRlXCIsICh0ID0+IHtcbiAgICAgICAgY29uc3QgciA9IE5pKGUucmVhZFRpbWUpO1xuICAgICAgICAvLyBTaW1wbHkgc2F2ZSB0aGUgcXVlcnkgaXRzZWxmIGlmIGl0IGlzIG9sZGVyIHRoYW4gd2hhdCB0aGUgU0RLIGFscmVhZHlcbiAgICAgICAgLy8gaGFzLlxuICAgICAgICAgICAgICAgIGlmIChzLnNuYXBzaG90VmVyc2lvbi5jb21wYXJlVG8ocikgPj0gMCkgcmV0dXJuIGkucXMuc2F2ZU5hbWVkUXVlcnkodCwgZSk7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyB0YXJnZXQgZGF0YSBiZWNhdXNlIHRoZSBxdWVyeSBmcm9tIHRoZSBidW5kbGUgaXMgbmV3ZXIuXG4gICAgICAgICAgICAgICAgY29uc3QgbyA9IHMud2l0aFJlc3VtZVRva2VuKFZlLkVNUFRZX0JZVEVfU1RSSU5HLCByKTtcbiAgICAgICAgcmV0dXJuIGkuSmkgPSBpLkppLmluc2VydChvLnRhcmdldElkLCBvKSwgaS5Ccy51cGRhdGVUYXJnZXREYXRhKHQsIG8pLm5leHQoKCgpID0+IGkuQnMucmVtb3ZlTWF0Y2hpbmdLZXlzRm9yVGFyZ2V0SWQodCwgcy50YXJnZXRJZCkpKS5uZXh0KCgoKSA9PiBpLkJzLmFkZE1hdGNoaW5nS2V5cyh0LCBuLCBzLnRhcmdldElkKSkpLm5leHQoKCgpID0+IGkucXMuc2F2ZU5hbWVkUXVlcnkodCwgZSkpKTtcbiAgICB9KSk7XG59XG5cbi8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgYSBjbGllbnQgc3RhdGUgaW4gV2ViU3RvcmFnZSAqL1xuZnVuY3Rpb24geXUodCwgZSkge1xuICAgIHJldHVybiBgZmlyZXN0b3JlX2NsaWVudHNfJHt0fV8ke2V9YDtcbn1cblxuLy8gVGhlIGZvcm1hdCBvZiB0aGUgV2ViU3RvcmFnZSBrZXkgdGhhdCBzdG9yZXMgdGhlIG11dGF0aW9uIHN0YXRlIGlzOlxuLy8gICAgIGZpcmVzdG9yZV9tdXRhdGlvbnNfPHBlcnNpc3RlbmNlX3ByZWZpeD5fPGJhdGNoX2lkPlxuLy8gICAgIChmb3IgdW5hdXRoZW50aWNhdGVkIHVzZXJzKVxuLy8gb3I6IGZpcmVzdG9yZV9tdXRhdGlvbnNfPHBlcnNpc3RlbmNlX3ByZWZpeD5fPGJhdGNoX2lkPl88dXNlcl91aWQ+XG5cbi8vICd1c2VyX3VpZCcgaXMgbGFzdCB0byBhdm9pZCBuZWVkaW5nIHRvIGVzY2FwZSAnXycgY2hhcmFjdGVycyB0aGF0IGl0IG1pZ2h0XG4vLyBjb250YWluLlxuLyoqIEFzc2VtYmxlcyB0aGUga2V5IGZvciBhIG11dGF0aW9uIGJhdGNoIGluIFdlYlN0b3JhZ2UgKi9cbmZ1bmN0aW9uIHB1KHQsIGUsIG4pIHtcbiAgICBsZXQgcyA9IGBmaXJlc3RvcmVfbXV0YXRpb25zXyR7dH1fJHtufWA7XG4gICAgcmV0dXJuIGUuaXNBdXRoZW50aWNhdGVkKCkgJiYgKHMgKz0gYF8ke2UudWlkfWApLCBzO1xufVxuXG4vLyBUaGUgZm9ybWF0IG9mIHRoZSBXZWJTdG9yYWdlIGtleSB0aGF0IHN0b3JlcyBhIHF1ZXJ5IHRhcmdldCdzIG1ldGFkYXRhIGlzOlxuLy8gICAgIGZpcmVzdG9yZV90YXJnZXRzXzxwZXJzaXN0ZW5jZV9wcmVmaXg+Xzx0YXJnZXRfaWQ+XG4vKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIGEgcXVlcnkgc3RhdGUgaW4gV2ViU3RvcmFnZSAqL1xuZnVuY3Rpb24gSXUodCwgZSkge1xuICAgIHJldHVybiBgZmlyZXN0b3JlX3RhcmdldHNfJHt0fV8ke2V9YDtcbn1cblxuLy8gVGhlIFdlYlN0b3JhZ2UgcHJlZml4IHRoYXQgc3RvcmVzIHRoZSBwcmltYXJ5IHRhYidzIG9ubGluZSBzdGF0ZS4gVGhlXG4vLyBmb3JtYXQgb2YgdGhlIGtleSBpczpcbi8vICAgICBmaXJlc3RvcmVfb25saW5lX3N0YXRlXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XG4vKipcbiAqIEhvbGRzIHRoZSBzdGF0ZSBvZiBhIG11dGF0aW9uIGJhdGNoLCBpbmNsdWRpbmcgaXRzIHVzZXIgSUQsIGJhdGNoIElEIGFuZFxuICogd2hldGhlciB0aGUgYmF0Y2ggaXMgJ3BlbmRpbmcnLCAnYWNrbm93bGVkZ2VkJyBvciAncmVqZWN0ZWQnLlxuICovXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nXG5jbGFzcyBUdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLnVzZXIgPSB0LCB0aGlzLmJhdGNoSWQgPSBlLCB0aGlzLnN0YXRlID0gbiwgdGhpcy5lcnJvciA9IHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIE11dGF0aW9uTWV0YWRhdGEgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiBpbiBXZWJTdG9yYWdlLlxuICAgICAqIExvZ3MgYSB3YXJuaW5nIGFuZCByZXR1cm5zIG51bGwgaWYgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpcyBub3QgdmFsaWQuXG4gICAgICovICAgIHN0YXRpYyBhcih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBKU09OLnBhcnNlKG4pO1xuICAgICAgICBsZXQgaSwgciA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHMgJiYgLTEgIT09IFsgXCJwZW5kaW5nXCIsIFwiYWNrbm93bGVkZ2VkXCIsIFwicmVqZWN0ZWRcIiBdLmluZGV4T2Yocy5zdGF0ZSkgJiYgKHZvaWQgMCA9PT0gcy5lcnJvciB8fCBcIm9iamVjdFwiID09IHR5cGVvZiBzLmVycm9yKTtcbiAgICAgICAgcmV0dXJuIHIgJiYgcy5lcnJvciAmJiAociA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIHMuZXJyb3IubWVzc2FnZSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBzLmVycm9yLmNvZGUsIFxuICAgICAgICByICYmIChpID0gbmV3IFUocy5lcnJvci5jb2RlLCBzLmVycm9yLm1lc3NhZ2UpKSksIHIgPyBuZXcgVHUodCwgZSwgcy5zdGF0ZSwgaSkgOiAoayhcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgbXV0YXRpb24gc3RhdGUgZm9yIElEICcke2V9JzogJHtufWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxuICAgIGhyKCkge1xuICAgICAgICBjb25zdCB0ID0ge1xuICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICB1cGRhdGVUaW1lTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgJiYgKHQuZXJyb3IgPSB7XG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVycm9yLmNvZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSksIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIb2xkcyB0aGUgc3RhdGUgb2YgYSBxdWVyeSB0YXJnZXQsIGluY2x1ZGluZyBpdHMgdGFyZ2V0IElEIGFuZCB3aGV0aGVyIHRoZVxuICogdGFyZ2V0IGlzICdub3QtY3VycmVudCcsICdjdXJyZW50JyBvciAncmVqZWN0ZWQnLlxuICovXG4vLyBWaXNpYmxlIGZvciB0ZXN0aW5nXG5jbGFzcyBFdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLnRhcmdldElkID0gdCwgdGhpcy5zdGF0ZSA9IGUsIHRoaXMuZXJyb3IgPSBuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBRdWVyeVRhcmdldE1ldGFkYXRhIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgYXIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgbGV0IHMsIGkgPSBcIm9iamVjdFwiID09IHR5cGVvZiBuICYmIC0xICE9PSBbIFwibm90LWN1cnJlbnRcIiwgXCJjdXJyZW50XCIsIFwicmVqZWN0ZWRcIiBdLmluZGV4T2Yobi5zdGF0ZSkgJiYgKHZvaWQgMCA9PT0gbi5lcnJvciB8fCBcIm9iamVjdFwiID09IHR5cGVvZiBuLmVycm9yKTtcbiAgICAgICAgcmV0dXJuIGkgJiYgbi5lcnJvciAmJiAoaSA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIG4uZXJyb3IubWVzc2FnZSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBuLmVycm9yLmNvZGUsIFxuICAgICAgICBpICYmIChzID0gbmV3IFUobi5lcnJvci5jb2RlLCBuLmVycm9yLm1lc3NhZ2UpKSksIGkgPyBuZXcgRXUodCwgbi5zdGF0ZSwgcykgOiAoayhcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgdGFyZ2V0IHN0YXRlIGZvciBJRCAnJHt0fSc6ICR7ZX1gKSwgXG4gICAgICAgIG51bGwpO1xuICAgIH1cbiAgICBocigpIHtcbiAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdXBkYXRlVGltZU1zOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yICYmICh0LmVycm9yID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5lcnJvci5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5lcnJvci5tZXNzYWdlXG4gICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBpbW11dGFibGUgQ2xpZW50U3RhdGUgZm9yIGEgY2xpZW50IHJlYWQgZnJvbVxuICogV2ViU3RvcmFnZSwgY29udGFpbmluZyB0aGUgbGlzdCBvZiBhY3RpdmUgcXVlcnkgdGFyZ2V0cy5cbiAqLyBjbGFzcyBBdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0gdCwgdGhpcy5hY3RpdmVUYXJnZXRJZHMgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBSZW1vdGVDbGllbnRTdGF0ZSBmcm9tIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGluIFdlYlN0b3JhZ2UuXG4gICAgICogTG9ncyBhIHdhcm5pbmcgYW5kIHJldHVybnMgbnVsbCBpZiB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIGlzIG5vdCB2YWxpZC5cbiAgICAgKi8gICAgc3RhdGljIGFyKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEpTT04ucGFyc2UoZSk7XG4gICAgICAgIGxldCBzID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgbiAmJiBuLmFjdGl2ZVRhcmdldElkcyBpbnN0YW5jZW9mIEFycmF5LCBpID0gcHMoKTtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHMgJiYgdCA8IG4uYWN0aXZlVGFyZ2V0SWRzLmxlbmd0aDsgKyt0KSBzID0gTHQobi5hY3RpdmVUYXJnZXRJZHNbdF0pLCBcbiAgICAgICAgaSA9IGkuYWRkKG4uYWN0aXZlVGFyZ2V0SWRzW3RdKTtcbiAgICAgICAgcmV0dXJuIHMgPyBuZXcgQXUodCwgaSkgOiAoayhcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBGYWlsZWQgdG8gcGFyc2UgY2xpZW50IGRhdGEgZm9yIGluc3RhbmNlICcke3R9JzogJHtlfWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb25saW5lIHN0YXRlIGZvciBhbGwgY2xpZW50cyBwYXJ0aWNpcGF0aW5nIGluXG4gKiBtdWx0aS10YWIuIFRoZSBvbmxpbmUgc3RhdGUgaXMgb25seSB3cml0dGVuIHRvIGJ5IHRoZSBwcmltYXJ5IGNsaWVudCwgYW5kXG4gKiB1c2VkIGluIHNlY29uZGFyeSBjbGllbnRzIHRvIHVwZGF0ZSB0aGVpciBxdWVyeSB2aWV3cy5cbiAqLyBjbGFzcyB2dSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0gdCwgdGhpcy5vbmxpbmVTdGF0ZSA9IGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIFNoYXJlZE9ubGluZVN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gaW4gV2ViU3RvcmFnZS5cbiAgICAgKiBMb2dzIGEgd2FybmluZyBhbmQgcmV0dXJucyBudWxsIGlmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgaXMgbm90IHZhbGlkLlxuICAgICAqLyAgICBzdGF0aWMgYXIodCkge1xuICAgICAgICBjb25zdCBlID0gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIGUgJiYgLTEgIT09IFsgXCJVbmtub3duXCIsIFwiT25saW5lXCIsIFwiT2ZmbGluZVwiIF0uaW5kZXhPZihlLm9ubGluZVN0YXRlKSAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBlLmNsaWVudElkID8gbmV3IHZ1KGUuY2xpZW50SWQsIGUub25saW5lU3RhdGUpIDogKGsoXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBgRmFpbGVkIHRvIHBhcnNlIG9ubGluZSBzdGF0ZTogJHt0fWApLCBcbiAgICAgICAgbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIE1ldGFkYXRhIHN0YXRlIG9mIHRoZSBsb2NhbCBjbGllbnQuIFVubGlrZSBgUmVtb3RlQ2xpZW50U3RhdGVgLCB0aGlzIGNsYXNzIGlzXG4gKiBtdXRhYmxlIGFuZCBrZWVwcyB0cmFjayBvZiBhbGwgcGVuZGluZyBtdXRhdGlvbnMsIHdoaWNoIGFsbG93cyB1cyB0b1xuICogdXBkYXRlIHRoZSByYW5nZSBvZiBwZW5kaW5nIG11dGF0aW9uIGJhdGNoIElEcyBhcyBuZXcgbXV0YXRpb25zIGFyZSBhZGRlZCBvclxuICogcmVtb3ZlZC5cbiAqXG4gKiBUaGUgZGF0YSBpbiBgTG9jYWxDbGllbnRTdGF0ZWAgaXMgbm90IHJlYWQgZnJvbSBXZWJTdG9yYWdlIGFuZCBpbnN0ZWFkXG4gKiB1cGRhdGVkIHZpYSBpdHMgaW5zdGFuY2UgbWV0aG9kcy4gVGhlIHVwZGF0ZWQgc3RhdGUgY2FuIGJlIHNlcmlhbGl6ZWQgdmlhXG4gKiBgdG9XZWJTdG9yYWdlSlNPTigpYC5cbiAqL1xuLy8gVmlzaWJsZSBmb3IgdGVzdGluZy5cbmNsYXNzIFJ1IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVUYXJnZXRJZHMgPSBwcygpO1xuICAgIH1cbiAgICBscih0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gdGhpcy5hY3RpdmVUYXJnZXRJZHMuYWRkKHQpO1xuICAgIH1cbiAgICBkcih0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0SWRzID0gdGhpcy5hY3RpdmVUYXJnZXRJZHMuZGVsZXRlKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIGVudHJ5IGludG8gYSBKU09OLWVuY29kZWQgZm9ybWF0IHdlIGNhbiB1c2UgZm9yIFdlYlN0b3JhZ2UuXG4gICAgICogRG9lcyBub3QgZW5jb2RlIGBjbGllbnRJZGAgYXMgaXQgaXMgcGFydCBvZiB0aGUga2V5IGluIFdlYlN0b3JhZ2UuXG4gICAgICovICAgIGhyKCkge1xuICAgICAgICBjb25zdCB0ID0ge1xuICAgICAgICAgICAgYWN0aXZlVGFyZ2V0SWRzOiB0aGlzLmFjdGl2ZVRhcmdldElkcy50b0FycmF5KCksXG4gICAgICAgICAgICB1cGRhdGVUaW1lTXM6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCB1c2VzIFdlYlN0b3JhZ2UgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIGFzIHRoZVxuICogYmFja2luZyBzdG9yZSBmb3IgdGhlIFNoYXJlZENsaWVudFN0YXRlLiBJdCBrZWVwcyB0cmFjayBvZiBhbGwgYWN0aXZlXG4gKiBjbGllbnRzIGFuZCBzdXBwb3J0cyBtb2RpZmljYXRpb25zIG9mIHRoZSBsb2NhbCBjbGllbnQncyBkYXRhLlxuICovIGNsYXNzIFB1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMud2luZG93ID0gdCwgdGhpcy5paSA9IGUsIHRoaXMucGVyc2lzdGVuY2VLZXkgPSBuLCB0aGlzLndyID0gcywgdGhpcy5zeW5jRW5naW5lID0gbnVsbCwgXG4gICAgICAgIHRoaXMub25saW5lU3RhdGVIYW5kbGVyID0gbnVsbCwgdGhpcy5zZXF1ZW5jZU51bWJlckhhbmRsZXIgPSBudWxsLCB0aGlzLl9yID0gdGhpcy5tci5iaW5kKHRoaXMpLCBcbiAgICAgICAgdGhpcy5nciA9IG5ldyBwZShldCksIHRoaXMuc3RhcnRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIFdlYlN0b3JhZ2UgZXZlbnRzIHRoYXQgb2NjdXIgYmVmb3JlIGBzdGFydCgpYCBpcyBjYWxsZWQuIFRoZXNlXG4gICAgICAgICAqIGV2ZW50cyBhcmUgcmVwbGF5ZWQgb25jZSBgV2ViU3RvcmFnZVNoYXJlZENsaWVudFN0YXRlYCBpcyBzdGFydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy55ciA9IFtdO1xuICAgICAgICAvLyBFc2NhcGUgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBtZW50aW9uZWQgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9HdWlkZS9SZWd1bGFyX0V4cHJlc3Npb25zXG4gICAgICAgIGNvbnN0IHIgPSBuLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlID0gdGhpcy53aW5kb3cubG9jYWxTdG9yYWdlLCB0aGlzLmN1cnJlbnRVc2VyID0gaSwgdGhpcy5wciA9IHl1KHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMud3IpLCBcbiAgICAgICAgdGhpcy5JciA9IFxuICAgICAgICAvKiogQXNzZW1ibGVzIHRoZSBrZXkgZm9yIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlci4gKi9cbiAgICAgICAgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfc2VxdWVuY2VfbnVtYmVyXyR7dH1gO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgdGhpcy5nciA9IHRoaXMuZ3IuaW5zZXJ0KHRoaXMud3IsIG5ldyBSdSksIHRoaXMuVHIgPSBuZXcgUmVnRXhwKGBeZmlyZXN0b3JlX2NsaWVudHNfJHtyfV8oW15fXSopJGApLCBcbiAgICAgICAgdGhpcy5FciA9IG5ldyBSZWdFeHAoYF5maXJlc3RvcmVfbXV0YXRpb25zXyR7cn1fKFxcXFxkKykoPzpfKC4qKSk/JGApLCB0aGlzLkFyID0gbmV3IFJlZ0V4cChgXmZpcmVzdG9yZV90YXJnZXRzXyR7cn1fKFxcXFxkKykkYCksIFxuICAgICAgICB0aGlzLnZyID0gXG4gICAgICAgIC8qKiBBc3NlbWJsZXMgdGhlIGtleSBmb3IgdGhlIG9ubGluZSBzdGF0ZSBvZiB0aGUgcHJpbWFyeSB0YWIuICovXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIHJldHVybiBgZmlyZXN0b3JlX29ubGluZV9zdGF0ZV8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV2ViU3RvcmFnZSBwcmVmaXggdGhhdCBwbGF5cyBhcyBhIGV2ZW50IHRvIGluZGljYXRlIHRoZSByZW1vdGUgZG9jdW1lbnRzXG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgY2hhbmdlZCBkdWUgdG8gc29tZSBzZWNvbmRhcnkgdGFicyBsb2FkaW5nIGEgYnVuZGxlLlxuICAgICAgICAvLyBmb3JtYXQgb2YgdGhlIGtleSBpczpcbiAgICAgICAgLy8gICAgIGZpcmVzdG9yZV9idW5kbGVfbG9hZGVkX3YyXzxwZXJzaXN0ZW5jZUtleT5cbiAgICAgICAgLy8gVGhlIHZlcnNpb24gZW5kaW5nIHdpdGggXCJ2MlwiIHN0b3JlcyB0aGUgbGlzdCBvZiBtb2RpZmllZCBjb2xsZWN0aW9uIGdyb3Vwcy5cbiAgICAgICAgKHRoaXMucGVyc2lzdGVuY2VLZXkpLCB0aGlzLlJyID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgcmV0dXJuIGBmaXJlc3RvcmVfYnVuZGxlX2xvYWRlZF92Ml8ke3R9YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgV2ViU3RvcmFnZSBrZXkgcHJlZml4IGZvciB0aGUga2V5IHRoYXQgc3RvcmVzIHRoZSBsYXN0IHNlcXVlbmNlIG51bWJlciBhbGxvY2F0ZWQuIFRoZSBrZXlcbiAgICAgICAgLy8gbG9va3MgbGlrZSAnZmlyZXN0b3JlX3NlcXVlbmNlX251bWJlcl88cGVyc2lzdGVuY2VfcHJlZml4PicuXG4gICAgICAgICh0aGlzLnBlcnNpc3RlbmNlS2V5KSwgXG4gICAgICAgIC8vIFJhdGhlciB0aGFuIGFkZGluZyB0aGUgc3RvcmFnZSBvYnNlcnZlciBkdXJpbmcgc3RhcnQoKSwgd2UgYWRkIHRoZVxuICAgICAgICAvLyBzdG9yYWdlIG9ic2VydmVyIGR1cmluZyBpbml0aWFsaXphdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgY29sbGVjdFxuICAgICAgICAvLyBldmVudHMgYmVmb3JlIG90aGVyIGNvbXBvbmVudHMgcG9wdWxhdGUgdGhlaXIgaW5pdGlhbCBzdGF0ZSAoZHVyaW5nIHRoZWlyXG4gICAgICAgIC8vIHJlc3BlY3RpdmUgc3RhcnQoKSBjYWxscykuIE90aGVyd2lzZSwgd2UgbWlnaHQgZm9yIGV4YW1wbGUgbWlzcyBhXG4gICAgICAgIC8vIG11dGF0aW9uIHRoYXQgaXMgYWRkZWQgYWZ0ZXIgTG9jYWxTdG9yZSdzIHN0YXJ0KCkgcHJvY2Vzc2VkIHRoZSBleGlzdGluZ1xuICAgICAgICAvLyBtdXRhdGlvbnMgYnV0IGJlZm9yZSB3ZSBvYnNlcnZlIFdlYlN0b3JhZ2UgZXZlbnRzLlxuICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic3RvcmFnZVwiLCB0aGlzLl9yKTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgJ3RydWUnIGlmIFdlYlN0b3JhZ2UgaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiAqLyAgICBzdGF0aWMgRCh0KSB7XG4gICAgICAgIHJldHVybiAhKCF0IHx8ICF0LmxvY2FsU3RvcmFnZSk7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KCkge1xuICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjbGllbnRzIHRvIGJhY2tmaWxsIHRoZSBkYXRhIGluXG4gICAgICAgIC8vIFNoYXJlZENsaWVudFN0YXRlLlxuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5zeW5jRW5naW5lLiRpKCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSB7XG4gICAgICAgICAgICBpZiAoZSA9PT0gdGhpcy53cikgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRJdGVtKHl1KHRoaXMucGVyc2lzdGVuY2VLZXksIGUpKTtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IEF1LmFyKGUsIHQpO1xuICAgICAgICAgICAgICAgIG4gJiYgKHRoaXMuZ3IgPSB0aGlzLmdyLmluc2VydChuLmNsaWVudElkLCBuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5QcigpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBvbmxpbmUgc3RhdGUgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIGhhbmRsZXJcbiAgICAgICAgLy8gaWYgYXBwbGljYWJsZS5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMudnIpO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYnIoZSk7XG4gICAgICAgICAgICB0ICYmIHRoaXMuVnIodCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMueXIpIHRoaXMubXIodCk7XG4gICAgICAgIHRoaXMueXIgPSBbXSwgXG4gICAgICAgIC8vIFJlZ2lzdGVyIGEgd2luZG93IHVubG9hZCBob29rIHRvIHJlbW92ZSB0aGUgY2xpZW50IG1ldGFkYXRhIGVudHJ5IGZyb21cbiAgICAgICAgLy8gV2ViU3RvcmFnZSBldmVuIGlmIGBzaHV0ZG93bigpYCB3YXMgbm90IGNhbGxlZC5cbiAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsICgoKSA9PiB0aGlzLnNodXRkb3duKCkpKSwgdGhpcy5zdGFydGVkID0gITA7XG4gICAgfVxuICAgIHdyaXRlU2VxdWVuY2VOdW1iZXIodCkge1xuICAgICAgICB0aGlzLnNldEl0ZW0odGhpcy5JciwgSlNPTi5zdHJpbmdpZnkodCkpO1xuICAgIH1cbiAgICBnZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLlNyKHRoaXMuZ3IpO1xuICAgIH1cbiAgICBpc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgbGV0IGUgPSAhMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3IuZm9yRWFjaCgoKG4sIHMpID0+IHtcbiAgICAgICAgICAgIHMuYWN0aXZlVGFyZ2V0SWRzLmhhcyh0KSAmJiAoZSA9ICEwKTtcbiAgICAgICAgfSkpLCBlO1xuICAgIH1cbiAgICBhZGRQZW5kaW5nTXV0YXRpb24odCkge1xuICAgICAgICB0aGlzLkRyKHQsIFwicGVuZGluZ1wiKTtcbiAgICB9XG4gICAgdXBkYXRlTXV0YXRpb25TdGF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuRHIodCwgZSwgbiksIFxuICAgICAgICAvLyBPbmNlIGEgZmluYWwgbXV0YXRpb24gcmVzdWx0IGlzIG9ic2VydmVkIGJ5IG90aGVyIGNsaWVudHMsIHRoZXkgbm8gbG9uZ2VyXG4gICAgICAgIC8vIGFjY2VzcyB0aGUgbXV0YXRpb24ncyBtZXRhZGF0YSBlbnRyeS4gU2luY2UgV2ViU3RvcmFnZSByZXBsYXlzIGV2ZW50c1xuICAgICAgICAvLyBpbiBvcmRlciwgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGVudHJ5IHJpZ2h0IGFmdGVyIHVwZGF0aW5nIGl0LlxuICAgICAgICB0aGlzLkNyKHQpO1xuICAgIH1cbiAgICBhZGRMb2NhbFF1ZXJ5VGFyZ2V0KHQpIHtcbiAgICAgICAgbGV0IGUgPSBcIm5vdC1jdXJyZW50XCI7XG4gICAgICAgIC8vIExvb2t1cCBhbiBleGlzdGluZyBxdWVyeSBzdGF0ZSBpZiB0aGUgdGFyZ2V0IElEIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gYnkgYW5vdGhlciB0YWJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZVF1ZXJ5VGFyZ2V0KHQpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oSXUodGhpcy5wZXJzaXN0ZW5jZUtleSwgdCkpO1xuICAgICAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gRXUuYXIodCwgbik7XG4gICAgICAgICAgICAgICAgcyAmJiAoZSA9IHMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLk5yLmxyKHQpLCB0aGlzLlByKCksIGU7XG4gICAgfVxuICAgIHJlbW92ZUxvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICB0aGlzLk5yLmRyKHQpLCB0aGlzLlByKCk7XG4gICAgfVxuICAgIGlzTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLk5yLmFjdGl2ZVRhcmdldElkcy5oYXModCk7XG4gICAgfVxuICAgIGNsZWFyUXVlcnlTdGF0ZSh0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShJdSh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSk7XG4gICAgfVxuICAgIHVwZGF0ZVF1ZXJ5U3RhdGUodCwgZSwgbikge1xuICAgICAgICB0aGlzLmtyKHQsIGUsIG4pO1xuICAgIH1cbiAgICBoYW5kbGVVc2VyQ2hhbmdlKHQsIGUsIG4pIHtcbiAgICAgICAgZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuQ3IodCk7XG4gICAgICAgIH0pKSwgdGhpcy5jdXJyZW50VXNlciA9IHQsIG4uZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFkZFBlbmRpbmdNdXRhdGlvbih0KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzZXRPbmxpbmVTdGF0ZSh0KSB7XG4gICAgICAgIHRoaXMuTXIodCk7XG4gICAgfVxuICAgIG5vdGlmeUJ1bmRsZUxvYWRlZCh0KSB7XG4gICAgICAgIHRoaXMuJHIodCk7XG4gICAgfVxuICAgIHNodXRkb3duKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgJiYgKHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzdG9yYWdlXCIsIHRoaXMuX3IpLCB0aGlzLnJlbW92ZUl0ZW0odGhpcy5wciksIFxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSAhMSk7XG4gICAgfVxuICAgIGdldEl0ZW0odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odCk7XG4gICAgICAgIHJldHVybiBOKFwiU2hhcmVkQ2xpZW50U3RhdGVcIiwgXCJSRUFEXCIsIHQsIGUpLCBlO1xuICAgIH1cbiAgICBzZXRJdGVtKHQsIGUpIHtcbiAgICAgICAgTihcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiU0VUXCIsIHQsIGUpLCB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0LCBlKTtcbiAgICB9XG4gICAgcmVtb3ZlSXRlbSh0KSB7XG4gICAgICAgIE4oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIlJFTU9WRVwiLCB0KSwgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odCk7XG4gICAgfVxuICAgIG1yKHQpIHtcbiAgICAgICAgLy8gTm90ZTogVGhlIGZ1bmN0aW9uIGlzIHR5cGVkIHRvIHRha2UgRXZlbnQgdG8gYmUgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aFxuICAgICAgICAvLyBgV2luZG93LmFkZEV2ZW50TGlzdGVuZXJgLlxuICAgICAgICBjb25zdCBlID0gdDtcbiAgICAgICAgaWYgKGUuc3RvcmFnZUFyZWEgPT09IHRoaXMuc3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKE4oXCJTaGFyZWRDbGllbnRTdGF0ZVwiLCBcIkVWRU5UXCIsIGUua2V5LCBlLm5ld1ZhbHVlKSwgZS5rZXkgPT09IHRoaXMucHIpIHJldHVybiB2b2lkIGsoXCJSZWNlaXZlZCBXZWJTdG9yYWdlIG5vdGlmaWNhdGlvbiBmb3IgbG9jYWwgY2hhbmdlLiBBbm90aGVyIGNsaWVudCBtaWdodCBoYXZlIGdhcmJhZ2UtY29sbGVjdGVkIG91ciBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHRoaXMuaWkuZW5xdWV1ZVJldHJ5YWJsZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUua2V5KSBpZiAodGhpcy5Uci50ZXN0KGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLk9yKGUua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gcih0LCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5CcihlLmtleSwgZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLkZyKHQuY2xpZW50SWQsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuRXIudGVzdChlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuTHIoZS5rZXksIGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdGhpcy5xcih0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLkFyLnRlc3QoZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlVyKGUua2V5LCBlLm5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgcmV0dXJuIHRoaXMuS3IodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMudnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlLm5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYnIoZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHJldHVybiB0aGlzLlZyKHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSB0aGlzLklyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gT3QuY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdCkgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IEpTT04ucGFyc2UodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYoXCJudW1iZXJcIiA9PSB0eXBlb2YgbiksIGUgPSBuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayhcIlNoYXJlZENsaWVudFN0YXRlXCIsIFwiRmFpbGVkIHRvIHJlYWQgc2VxdWVuY2UgbnVtYmVyIGZyb20gV2ViU3RvcmFnZVwiLCB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAqIGBNZW1vcnlTaGFyZWRDbGllbnRTdGF0ZWAgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgU2hhcmVkQ2xpZW50U3RhdGUgZm9yXG4gKiBjbGllbnRzIHVzaW5nIG1lbW9yeSBwZXJzaXN0ZW5jZS4gVGhlIHN0YXRlIGluIHRoaXMgY2xhc3MgcmVtYWlucyBmdWxseVxuICogaXNvbGF0ZWQgYW5kIG5vIHN5bmNocm9uaXphdGlvbiBpcyBwZXJmb3JtZWQuXG4gKi8gKGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdCAhPT0gT3QuY3QgJiYgdGhpcy5zZXF1ZW5jZU51bWJlckhhbmRsZXIodCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IHRoaXMuUnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkdyKGUubmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoKHQgPT4gdGhpcy5zeW5jRW5naW5lLlFyKHQpKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMueXIucHVzaChlKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgTnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyLmdldCh0aGlzLndyKTtcbiAgICB9XG4gICAgUHIoKSB7XG4gICAgICAgIHRoaXMuc2V0SXRlbSh0aGlzLnByLCB0aGlzLk5yLmhyKCkpO1xuICAgIH1cbiAgICBEcih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgVHUodGhpcy5jdXJyZW50VXNlciwgdCwgZSwgbiksIGkgPSBwdSh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0aGlzLmN1cnJlbnRVc2VyLCB0KTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKGksIHMuaHIoKSk7XG4gICAgfVxuICAgIENyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHB1KHRoaXMucGVyc2lzdGVuY2VLZXksIHRoaXMuY3VycmVudFVzZXIsIHQpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oZSk7XG4gICAgfVxuICAgIE1yKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHtcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLndyLFxuICAgICAgICAgICAgb25saW5lU3RhdGU6IHRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0odGhpcy52ciwgSlNPTi5zdHJpbmdpZnkoZSkpO1xuICAgIH1cbiAgICBrcih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBJdSh0aGlzLnBlcnNpc3RlbmNlS2V5LCB0KSwgaSA9IG5ldyBFdSh0LCBlLCBuKTtcbiAgICAgICAgdGhpcy5zZXRJdGVtKHMsIGkuaHIoKSk7XG4gICAgfVxuICAgICRyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odCkpO1xuICAgICAgICB0aGlzLnNldEl0ZW0odGhpcy5SciwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGNsaWVudCBzdGF0ZSBrZXkgaW4gV2ViU3RvcmFnZS4gUmV0dXJucyBudWxsIGlmIHRoZSBrZXkgZG9lcyBub3RcbiAgICAgKiBtYXRjaCB0aGUgZXhwZWN0ZWQga2V5IGZvcm1hdC5cbiAgICAgKi8gICAgT3IodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5Uci5leGVjKHQpO1xuICAgICAgICByZXR1cm4gZSA/IGVbMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBjbGllbnQgc3RhdGUgaW4gV2ViU3RvcmFnZS4gUmV0dXJucyAnbnVsbCcgaWYgdGhlIHZhbHVlIGNvdWxkIG5vdFxuICAgICAqIGJlIHBhcnNlZC5cbiAgICAgKi8gICAgQnIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5Pcih0KTtcbiAgICAgICAgcmV0dXJuIEF1LmFyKG4sIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBtdXRhdGlvbiBiYXRjaCBzdGF0ZSBpbiBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWVcbiAgICAgKiBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICAgICAqLyAgICBMcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLkVyLmV4ZWModCksIHMgPSBOdW1iZXIoblsxXSksIGkgPSB2b2lkIDAgIT09IG5bMl0gPyBuWzJdIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIFR1LmFyKG5ldyBWKGkpLCBzLCBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgcXVlcnkgdGFyZ2V0IHN0YXRlIGZyb20gV2ViU3RvcmFnZS4gUmV0dXJucyAnbnVsbCcgaWYgdGhlIHZhbHVlXG4gICAgICogY291bGQgbm90IGJlIHBhcnNlZC5cbiAgICAgKi8gICAgVXIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5Bci5leGVjKHQpLCBzID0gTnVtYmVyKG5bMV0pO1xuICAgICAgICByZXR1cm4gRXUuYXIocywgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhbiBvbmxpbmUgc3RhdGUgZnJvbSBXZWJTdG9yYWdlLiBSZXR1cm5zICdudWxsJyBpZiB0aGUgdmFsdWVcbiAgICAgKiBjb3VsZCBub3QgYmUgcGFyc2VkLlxuICAgICAqLyAgICBicih0KSB7XG4gICAgICAgIHJldHVybiB2dS5hcih0KTtcbiAgICB9XG4gICAgR3IodCkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0KTtcbiAgICB9XG4gICAgYXN5bmMgcXIodCkge1xuICAgICAgICBpZiAodC51c2VyLnVpZCA9PT0gdGhpcy5jdXJyZW50VXNlci51aWQpIHJldHVybiB0aGlzLnN5bmNFbmdpbmUuanIodC5iYXRjaElkLCB0LnN0YXRlLCB0LmVycm9yKTtcbiAgICAgICAgTihcIlNoYXJlZENsaWVudFN0YXRlXCIsIGBJZ25vcmluZyBtdXRhdGlvbiBmb3Igbm9uLWFjdGl2ZSB1c2VyICR7dC51c2VyLnVpZH1gKTtcbiAgICB9XG4gICAgS3IodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jRW5naW5lLnpyKHQudGFyZ2V0SWQsIHQuc3RhdGUsIHQuZXJyb3IpO1xuICAgIH1cbiAgICBGcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlID8gdGhpcy5nci5pbnNlcnQodCwgZSkgOiB0aGlzLmdyLnJlbW92ZSh0KSwgcyA9IHRoaXMuU3IodGhpcy5nciksIGkgPSB0aGlzLlNyKG4pLCByID0gW10sIG8gPSBbXTtcbiAgICAgICAgcmV0dXJuIGkuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICBzLmhhcyh0KSB8fCByLnB1c2godCk7XG4gICAgICAgIH0pKSwgcy5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIGkuaGFzKHQpIHx8IG8ucHVzaCh0KTtcbiAgICAgICAgfSkpLCB0aGlzLnN5bmNFbmdpbmUuV3IociwgbykudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nciA9IG47XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgVnIodCkge1xuICAgICAgICAvLyBXZSBjaGVjayB3aGV0aGVyIHRoZSBjbGllbnQgdGhhdCB3cm90ZSB0aGlzIG9ubGluZSBzdGF0ZSBpcyBzdGlsbCBhY3RpdmVcbiAgICAgICAgLy8gYnkgY29tcGFyaW5nIGl0cyBjbGllbnQgSUQgdG8gdGhlIGxpc3Qgb2YgY2xpZW50cyBrZXB0IGFjdGl2ZSBpblxuICAgICAgICAvLyBJbmRleGVkRGIuIElmIGEgY2xpZW50IGRvZXMgbm90IHVwZGF0ZSB0aGVpciBJbmRleGVkRGIgY2xpZW50IHN0YXRlXG4gICAgICAgIC8vIHdpdGhpbiA1IHNlY29uZHMsIGl0IGlzIGNvbnNpZGVyZWQgaW5hY3RpdmUgYW5kIHdlIGRvbid0IGVtaXQgYW4gb25saW5lXG4gICAgICAgIC8vIHN0YXRlIGV2ZW50LlxuICAgICAgICB0aGlzLmdyLmdldCh0LmNsaWVudElkKSAmJiB0aGlzLm9ubGluZVN0YXRlSGFuZGxlcih0Lm9ubGluZVN0YXRlKTtcbiAgICB9XG4gICAgU3IodCkge1xuICAgICAgICBsZXQgZSA9IHBzKCk7XG4gICAgICAgIHJldHVybiB0LmZvckVhY2goKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICBlID0gZS51bmlvbldpdGgobi5hY3RpdmVUYXJnZXRJZHMpO1xuICAgICAgICB9KSksIGU7XG4gICAgfVxufVxuXG5jbGFzcyBidSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuSHIgPSBuZXcgUnUsIHRoaXMuSnIgPSB7fSwgdGhpcy5vbmxpbmVTdGF0ZUhhbmRsZXIgPSBudWxsLCB0aGlzLnNlcXVlbmNlTnVtYmVySGFuZGxlciA9IG51bGw7XG4gICAgfVxuICAgIGFkZFBlbmRpbmdNdXRhdGlvbih0KSB7XG4gICAgICAgIC8vIE5vIG9wLlxuICAgIH1cbiAgICB1cGRhdGVNdXRhdGlvblN0YXRlKHQsIGUsIG4pIHtcbiAgICAgICAgLy8gTm8gb3AuXG4gICAgfVxuICAgIGFkZExvY2FsUXVlcnlUYXJnZXQodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5Ici5scih0KSwgdGhpcy5Kclt0XSB8fCBcIm5vdC1jdXJyZW50XCI7XG4gICAgfVxuICAgIHVwZGF0ZVF1ZXJ5U3RhdGUodCwgZSwgbikge1xuICAgICAgICB0aGlzLkpyW3RdID0gZTtcbiAgICB9XG4gICAgcmVtb3ZlTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHRoaXMuSHIuZHIodCk7XG4gICAgfVxuICAgIGlzTG9jYWxRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhyLmFjdGl2ZVRhcmdldElkcy5oYXModCk7XG4gICAgfVxuICAgIGNsZWFyUXVlcnlTdGF0ZSh0KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLkpyW3RdO1xuICAgIH1cbiAgICBnZXRBbGxBY3RpdmVRdWVyeVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhyLmFjdGl2ZVRhcmdldElkcztcbiAgICB9XG4gICAgaXNBY3RpdmVRdWVyeVRhcmdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLkhyLmFjdGl2ZVRhcmdldElkcy5oYXModCk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5IciA9IG5ldyBSdSwgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGhhbmRsZVVzZXJDaGFuZ2UodCwgZSwgbikge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgc2V0T25saW5lU3RhdGUodCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG4gICAgc2h1dGRvd24oKSB7fVxuICAgIHdyaXRlU2VxdWVuY2VOdW1iZXIodCkge31cbiAgICBub3RpZnlCdW5kbGVMb2FkZWQodCkge1xuICAgICAgICAvLyBObyBvcC5cbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIFZ1IHtcbiAgICBZcih0KSB7XG4gICAgICAgIC8vIE5vLW9wLlxuICAgIH1cbiAgICBzaHV0ZG93bigpIHtcbiAgICAgICAgLy8gTm8tb3AuXG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gUmVmZXJlbmNlcyB0byBgd2luZG93YCBhcmUgZ3VhcmRlZCBieSBCcm93c2VyQ29ubmVjdGl2aXR5TW9uaXRvci5pc0F2YWlsYWJsZSgpXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbi8qKlxuICogQnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBDb25uZWN0aXZpdHlNb25pdG9yLlxuICovXG5jbGFzcyBTdSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuWHIgPSAoKSA9PiB0aGlzLlpyKCksIHRoaXMuZW8gPSAoKSA9PiB0aGlzLm5vKCksIHRoaXMuc28gPSBbXSwgdGhpcy5pbygpO1xuICAgIH1cbiAgICBZcih0KSB7XG4gICAgICAgIHRoaXMuc28ucHVzaCh0KTtcbiAgICB9XG4gICAgc2h1dGRvd24oKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIHRoaXMuWHIpLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5lbyk7XG4gICAgfVxuICAgIGlvKCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLlhyKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMuZW8pO1xuICAgIH1cbiAgICBacigpIHtcbiAgICAgICAgTihcIkNvbm5lY3Rpdml0eU1vbml0b3JcIiwgXCJOZXR3b3JrIGNvbm5lY3Rpdml0eSBjaGFuZ2VkOiBBVkFJTEFCTEVcIik7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLnNvKSB0KDAgLyogTmV0d29ya1N0YXR1cy5BVkFJTEFCTEUgKi8pO1xuICAgIH1cbiAgICBubygpIHtcbiAgICAgICAgTihcIkNvbm5lY3Rpdml0eU1vbml0b3JcIiwgXCJOZXR3b3JrIGNvbm5lY3Rpdml0eSBjaGFuZ2VkOiBVTkFWQUlMQUJMRVwiKTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuc28pIHQoMSAvKiBOZXR3b3JrU3RhdHVzLlVOQVZBSUxBQkxFICovKTtcbiAgICB9XG4gICAgLy8gVE9ETyhjaGVuYnJpYW4pOiBDb25zaWRlciBwYXNzaW5nIGluIHdpbmRvdyBlaXRoZXIgaW50byB0aGlzIGNvbXBvbmVudCBvclxuICAgIC8vIGhlcmUgZm9yIHRlc3RpbmcgdmlhIEZha2VXaW5kb3cuXG4gICAgLyoqIENoZWNrcyB0aGF0IGFsbCB1c2VkIGF0dHJpYnV0ZXMgb2Ygd2luZG93IGFyZSBhdmFpbGFibGUuICovXG4gICAgc3RhdGljIEQoKSB7XG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgJiYgdm9pZCAwICE9PSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAmJiB2b2lkIDAgIT09IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIG1vc3QgcmVjZW50IGludm9jYXRpb24gb2ZcbiAqIGBnZW5lcmF0ZVVuaXF1ZURlYnVnSWQoKWAsIG9yIG51bGwgaWYgaXQgaGFzIG5ldmVyIGJlZW4gaW52b2tlZC5cbiAqLyBsZXQgRHUgPSBudWxsO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhbmQgcmV0dXJucyBhbiBpbml0aWFsIHZhbHVlIGZvciBgbGFzdFVuaXF1ZURlYnVnSWRgLlxuICpcbiAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyByYW5kb21seSBzZWxlY3RlZCBmcm9tIGEgcmFuZ2Ugb2YgaW50ZWdlcnMgdGhhdCBhcmVcbiAqIHJlcHJlc2VudGVkIGFzIDggaGV4YWRlY2ltYWwgZGlnaXRzLiBUaGlzIG1lYW5zIHRoYXQgKHdpdGhpbiByZWFzb24pIGFueVxuICogbnVtYmVycyBnZW5lcmF0ZWQgYnkgaW5jcmVtZW50aW5nIHRoZSByZXR1cm5lZCBudW1iZXIgYnkgMSB3aWxsIGFsc28gYmVcbiAqIHJlcHJlc2VudGVkIGJ5IDggaGV4YWRlY2ltYWwgZGlnaXRzLiBUaGlzIGxlYWRzIHRvIGFsbCBcIklEc1wiIGhhdmluZyB0aGUgc2FtZVxuICogbGVuZ3RoIHdoZW4gY29udmVydGVkIHRvIGEgaGV4YWRlY2ltYWwgc3RyaW5nLCBtYWtpbmcgcmVhZGluZyBsb2dzIGNvbnRhaW5pbmdcbiAqIHRoZXNlIElEcyBlYXNpZXIgdG8gZm9sbG93LiBBbmQgc2luY2UgdGhlIHJldHVybiB2YWx1ZSBpcyByYW5kb21seSBzZWxlY3RlZFxuICogaXQgd2lsbCBoZWxwIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2dzIGZyb20gZGlmZmVyZW50IGV4ZWN1dGlvbnMuXG4gKi9cbi8qKlxuICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgdW5pcXVlIElEIGFzIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICpcbiAqIFRoZSByZXR1cm5lZCBJRCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGRlYnVnIGxvZ2dpbmcgbWVzc2FnZXMgdG8gaGVscFxuICogY29ycmVsYXRlIGxvZyBtZXNzYWdlcyB0aGF0IG1heSBiZSBzcGF0aWFsbHkgc2VwYXJhdGVkIGluIHRoZSBsb2dzLCBidXRcbiAqIGxvZ2ljYWxseSByZWxhdGVkLiBGb3IgZXhhbXBsZSwgYSBuZXR3b3JrIGNvbm5lY3Rpb24gY291bGQgaW5jbHVkZSB0aGUgc2FtZVxuICogXCJkZWJ1ZyBJRFwiIHN0cmluZyBpbiBhbGwgb2YgaXRzIGxvZyBtZXNzYWdlcyB0byBoZWxwIHRyYWNlIGEgc3BlY2lmaWNcbiAqIGNvbm5lY3Rpb24gb3ZlciB0aW1lLlxuICpcbiAqIEByZXR1cm4gdGhlIDEwLWNoYXJhY3RlciBnZW5lcmF0ZWQgSUQgKGUuZy4gXCIweGExYjJjM2Q0XCIpLlxuICovXG5mdW5jdGlvbiBDdSgpIHtcbiAgICByZXR1cm4gbnVsbCA9PT0gRHUgPyBEdSA9IDI2ODQzNTQ1NiArIE1hdGgucm91bmQoMjE0NzQ4MzY0OCAqIE1hdGgucmFuZG9tKCkpIDogRHUrKywgXG4gICAgXCIweFwiICsgRHUudG9TdHJpbmcoMTYpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCB4dSA9IHtcbiAgICBCYXRjaEdldERvY3VtZW50czogXCJiYXRjaEdldFwiLFxuICAgIENvbW1pdDogXCJjb21taXRcIixcbiAgICBSdW5RdWVyeTogXCJydW5RdWVyeVwiLFxuICAgIFJ1bkFnZ3JlZ2F0aW9uUXVlcnk6IFwicnVuQWdncmVnYXRpb25RdWVyeVwiXG59O1xuXG4vKipcbiAqIE1hcHMgUlBDIG5hbWVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFJFU1QgZW5kcG9pbnQgbmFtZS5cbiAqXG4gKiBXZSB1c2UgYXJyYXkgbm90YXRpb24gdG8gYXZvaWQgbWFuZ2xpbmcuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGhlbHBlciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFN0cmVhbSBpbnRlcmZhY2UgdG9cbiAqIGJyaWRnZSB0byBvdGhlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBhcmUgc3RyZWFtcyBidXQgZG8gbm90IGltcGxlbWVudCB0aGVcbiAqIGludGVyZmFjZS4gVGhlIHN0cmVhbSBjYWxsYmFja3MgYXJlIGludm9rZWQgd2l0aCB0aGUgY2FsbE9uLi4uIG1ldGhvZHMuXG4gKi9cbmNsYXNzIE51IHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMucm8gPSB0LnJvLCB0aGlzLm9vID0gdC5vbztcbiAgICB9XG4gICAgdW8odCkge1xuICAgICAgICB0aGlzLmNvID0gdDtcbiAgICB9XG4gICAgYW8odCkge1xuICAgICAgICB0aGlzLmhvID0gdDtcbiAgICB9XG4gICAgb25NZXNzYWdlKHQpIHtcbiAgICAgICAgdGhpcy5sbyA9IHQ7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLm9vKCk7XG4gICAgfVxuICAgIHNlbmQodCkge1xuICAgICAgICB0aGlzLnJvKHQpO1xuICAgIH1cbiAgICBmbygpIHtcbiAgICAgICAgdGhpcy5jbygpO1xuICAgIH1cbiAgICB3byh0KSB7XG4gICAgICAgIHRoaXMuaG8odCk7XG4gICAgfVxuICAgIF9vKHQpIHtcbiAgICAgICAgdGhpcy5sbyh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IGt1ID0gXCJXZWJDaGFubmVsQ29ubmVjdGlvblwiO1xuXG5jbGFzcyBNdSBleHRlbmRzIFxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgUmVzdC1iYXNlZCBjb25uZWN0aW9ucyB0byB0aGUgYmFja2VuZCAoV2ViQ2hhbm5lbCBhbmRcbiAqIEhUVFApLlxuICovXG5jbGFzcyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmRhdGFiYXNlSW5mbyA9IHQsIHRoaXMuZGF0YWJhc2VJZCA9IHQuZGF0YWJhc2VJZDtcbiAgICAgICAgY29uc3QgZSA9IHQuc3NsID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIHRoaXMubW8gPSBlICsgXCI6Ly9cIiArIHQuaG9zdCwgdGhpcy55byA9IFwicHJvamVjdHMvXCIgKyB0aGlzLmRhdGFiYXNlSWQucHJvamVjdElkICsgXCIvZGF0YWJhc2VzL1wiICsgdGhpcy5kYXRhYmFzZUlkLmRhdGFiYXNlICsgXCIvZG9jdW1lbnRzXCI7XG4gICAgfVxuICAgIGdldCBwbygpIHtcbiAgICAgICAgLy8gQm90aCBgaW52b2tlUlBDKClgIGFuZCBgaW52b2tlU3RyZWFtaW5nUlBDKClgIHVzZSB0aGVpciBgcGF0aGAgYXJndW1lbnRzIHRvIGRldGVybWluZVxuICAgICAgICAvLyB3aGVyZSB0byBydW4gdGhlIHF1ZXJ5LCBhbmQgZXhwZWN0IHRoZSBgcmVxdWVzdGAgdG8gTk9UIHNwZWNpZnkgdGhlIFwicGF0aFwiLlxuICAgICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIElvKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IEN1KCksIG8gPSB0aGlzLlRvKHQsIGUpO1xuICAgICAgICBOKFwiUmVzdENvbm5lY3Rpb25cIiwgYFNlbmRpbmcgUlBDICcke3R9JyAke3J9OmAsIG8sIG4pO1xuICAgICAgICBjb25zdCB1ID0ge307XG4gICAgICAgIHJldHVybiB0aGlzLkVvKHUsIHMsIGkpLCB0aGlzLkFvKHQsIG8sIHUsIG4pLnRoZW4oKGUgPT4gKE4oXCJSZXN0Q29ubmVjdGlvblwiLCBgUmVjZWl2ZWQgUlBDICcke3R9JyAke3J9OiBgLCBlKSwgXG4gICAgICAgIGUpKSwgKGUgPT4ge1xuICAgICAgICAgICAgdGhyb3cgTShcIlJlc3RDb25uZWN0aW9uXCIsIGBSUEMgJyR7dH0nICR7cn0gZmFpbGVkIHdpdGggZXJyb3I6IGAsIGUsIFwidXJsOiBcIiwgbywgXCJyZXF1ZXN0OlwiLCBuKSwgXG4gICAgICAgICAgICBlO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHZvKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgLy8gVGhlIFJFU1QgQVBJIGF1dG9tYXRpY2FsbHkgYWdncmVnYXRlcyBhbGwgb2YgdGhlIHN0cmVhbWVkIHJlc3VsdHMsIHNvIHdlXG4gICAgICAgIC8vIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGludm9rZSgpIG1ldGhvZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuSW8odCwgZSwgbiwgcywgaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIHRoZSBoZWFkZXJzIGZvciBhIHJlcXVlc3QsIGFkZGluZyBhbnkgYXV0aG9yaXphdGlvbiB0b2tlbiBpZlxuICAgICAqIHByZXNlbnQgYW5kIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqLyAgICBFbyh0LCBlLCBuKSB7XG4gICAgICAgIHRbXCJYLUdvb2ctQXBpLUNsaWVudFwiXSA9IFwiZ2wtanMvIGZpcmUvXCIgKyBTLCBcbiAgICAgICAgLy8gQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIHdpbGwgYXZvaWQgcHJlZmxpZ2h0IHJlcXVlc3RzIHdoaWNoIG1pZ2h0XG4gICAgICAgIC8vIG1lc3Mgd2l0aCBDT1JTIGFuZCByZWRpcmVjdHMgYnkgcHJveGllcy4gSWYgd2UgYWRkIGN1c3RvbSBoZWFkZXJzXG4gICAgICAgIC8vIHdlIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhpcyBjb2RlIHRvIHBvdGVudGlhbGx5IHVzZSB0aGUgJGh0dHBPdmVyd3JpdGVcbiAgICAgICAgLy8gcGFyYW1ldGVyIHN1cHBvcnRlZCBieSBFU0YgdG8gYXZvaWQgdHJpZ2dlcmluZyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICAgIHRbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvcGxhaW5cIiwgdGhpcy5kYXRhYmFzZUluZm8uYXBwSWQgJiYgKHRbXCJYLUZpcmViYXNlLUdNUElEXCJdID0gdGhpcy5kYXRhYmFzZUluZm8uYXBwSWQpLCBcbiAgICAgICAgZSAmJiBlLmhlYWRlcnMuZm9yRWFjaCgoKGUsIG4pID0+IHRbbl0gPSBlKSksIG4gJiYgbi5oZWFkZXJzLmZvckVhY2goKChlLCBuKSA9PiB0W25dID0gZSkpO1xuICAgIH1cbiAgICBUbyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSB4dVt0XTtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubW99L3YxLyR7ZX06JHtufWA7XG4gICAgfVxufSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcih0KSwgdGhpcy5mb3JjZUxvbmdQb2xsaW5nID0gdC5mb3JjZUxvbmdQb2xsaW5nLCB0aGlzLmF1dG9EZXRlY3RMb25nUG9sbGluZyA9IHQuYXV0b0RldGVjdExvbmdQb2xsaW5nLCBcbiAgICAgICAgdGhpcy51c2VGZXRjaFN0cmVhbXMgPSB0LnVzZUZldGNoU3RyZWFtcywgdGhpcy5sb25nUG9sbGluZ09wdGlvbnMgPSB0LmxvbmdQb2xsaW5nT3B0aW9ucztcbiAgICB9XG4gICAgQW8odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gQ3UoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgociwgbykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdSA9IG5ldyBYaHJJbztcbiAgICAgICAgICAgIHUuc2V0V2l0aENyZWRlbnRpYWxzKCEwKSwgdS5saXN0ZW5PbmNlKEV2ZW50VHlwZS5DT01QTEVURSwgKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHUuZ2V0TGFzdEVycm9yQ29kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGUuTk9fRVJST1I6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdS5nZXRSZXNwb25zZUpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE4oa3UsIGBYSFIgZm9yIFJQQyAnJHt0fScgJHtpfSByZWNlaXZlZDpgLCBKU09OLnN0cmluZ2lmeShlKSksIHIoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLlRJTUVPVVQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBOKGt1LCBgUlBDICcke3R9JyAke2l9IHRpbWVkIG91dGApLCBvKG5ldyBVKHEuREVBRExJTkVfRVhDRUVERUQsIFwiUmVxdWVzdCB0aW1lIG91dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlLkhUVFBfRVJST1I6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdS5nZXRTdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOKGt1LCBgUlBDICcke3R9JyAke2l9IGZhaWxlZCB3aXRoIHN0YXR1czpgLCBuLCBcInJlc3BvbnNlIHRleHQ6XCIsIHUuZ2V0UmVzcG9uc2VUZXh0KCkpLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSB1LmdldFJlc3BvbnNlSnNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgKHQgPSB0WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbnVsbCA9PSB0ID8gdm9pZCAwIDogdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnN0YXR1cyAmJiBlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhxKS5pbmRleE9mKGUpID49IDAgPyBlIDogcS5VTktOT1dOO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhuZXcgVSh0LCBlLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgbyhuZXcgVShxLlVOS05PV04sIFwiU2VydmVyIHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBcIiArIHUuZ2V0U3RhdHVzKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlY2VpdmVkIGFuIEhUVFBfRVJST1IgYnV0IHRoZXJlJ3Mgbm8gc3RhdHVzIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG1vc3QgcHJvYmFibHkgYSBjb25uZWN0aW9uIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICBvKG5ldyBVKHEuVU5BVkFJTEFCTEUsIFwiQ29ubmVjdGlvbiBmYWlsZWQuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIE8oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIE4oa3UsIGBSUEMgJyR7dH0nICR7aX0gY29tcGxldGVkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBKU09OLnN0cmluZ2lmeShzKTtcbiAgICAgICAgICAgIE4oa3UsIGBSUEMgJyR7dH0nICR7aX0gc2VuZGluZyByZXF1ZXN0OmAsIHMpLCB1LnNlbmQoZSwgXCJQT1NUXCIsIGMsIG4sIDE1KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBSbyh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBDdSgpLCBpID0gWyB0aGlzLm1vLCBcIi9cIiwgXCJnb29nbGUuZmlyZXN0b3JlLnYxLkZpcmVzdG9yZVwiLCBcIi9cIiwgdCwgXCIvY2hhbm5lbFwiIF0sIHIgPSBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KCksIG8gPSBnZXRTdGF0RXZlbnRUYXJnZXQoKSwgdSA9IHtcbiAgICAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBiYWNrZW5kIHN0aWNraW5lc3MsIHJvdXRpbmcgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhpc1xuICAgICAgICAgICAgLy8gcGFyYW1ldGVyLlxuICAgICAgICAgICAgaHR0cFNlc3Npb25JZFBhcmFtOiBcImdzZXNzaW9uaWRcIixcbiAgICAgICAgICAgIGluaXRNZXNzYWdlSGVhZGVyczoge30sXG4gICAgICAgICAgICBtZXNzYWdlVXJsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBwYXJhbSBpcyB1c2VkIHRvIGltcHJvdmUgcm91dGluZyBhbmQgcHJvamVjdCBpc29sYXRpb24gYnkgdGhlXG4gICAgICAgICAgICAgICAgLy8gYmFja2VuZCBhbmQgbXVzdCBiZSBpbmNsdWRlZCBpbiBldmVyeSByZXF1ZXN0LlxuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBgcHJvamVjdHMvJHt0aGlzLmRhdGFiYXNlSWQucHJvamVjdElkfS9kYXRhYmFzZXMvJHt0aGlzLmRhdGFiYXNlSWQuZGF0YWJhc2V9YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbmRSYXdKc29uOiAhMCxcbiAgICAgICAgICAgIHN1cHBvcnRzQ3Jvc3NEb21haW5YaHI6ICEwLFxuICAgICAgICAgICAgaW50ZXJuYWxDaGFubmVsUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGltZW91dCAocmFuZG9taXplZCBiZXR3ZWVuIDEwLTIwIHNlY29uZHMpIHNpbmNlXG4gICAgICAgICAgICAgICAgLy8gYSBsYXJnZSB3cml0ZSBiYXRjaCBvbiBhIHNsb3cgaW50ZXJuZXQgY29ubmVjdGlvbiBtYXkgdGFrZSBhIGxvbmdcbiAgICAgICAgICAgICAgICAvLyB0aW1lIHRvIHNlbmQgdG8gdGhlIGJhY2tlbmQuIFJhdGhlciB0aGFuIGhhdmUgV2ViQ2hhbm5lbCBpbXBvc2UgYVxuICAgICAgICAgICAgICAgIC8vIHRpZ2h0IHRpbWVvdXQgd2hpY2ggY291bGQgbGVhZCB0byBpbmZpbml0ZSB0aW1lb3V0cyBhbmQgcmV0cmllcywgd2VcbiAgICAgICAgICAgICAgICAvLyBzZXQgaXQgdmVyeSBsYXJnZSAoNS0xMCBtaW51dGVzKSBhbmQgcmVseSBvbiB0aGUgYnJvd3NlcidzIGJ1aWx0aW5cbiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0cyB0byBraWNrIGluIGlmIHRoZSByZXF1ZXN0IGlzbid0IHdvcmtpbmcuXG4gICAgICAgICAgICAgICAgZm9yd2FyZENoYW5uZWxSZXF1ZXN0VGltZW91dE1zOiA2ZTVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JjZUxvbmdQb2xsaW5nOiB0aGlzLmZvcmNlTG9uZ1BvbGxpbmcsXG4gICAgICAgICAgICBkZXRlY3RCdWZmZXJpbmdQcm94eTogdGhpcy5hdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcbiAgICAgICAgfSwgYyA9IHRoaXMubG9uZ1BvbGxpbmdPcHRpb25zLnRpbWVvdXRTZWNvbmRzO1xuICAgICAgICB2b2lkIDAgIT09IGMgJiYgKHUubG9uZ1BvbGxpbmdUaW1lb3V0ID0gTWF0aC5yb3VuZCgxZTMgKiBjKSksIHRoaXMudXNlRmV0Y2hTdHJlYW1zICYmICh1LnhtbEh0dHBGYWN0b3J5ID0gbmV3IEZldGNoWG1sSHR0cEZhY3Rvcnkoe30pKSwgXG4gICAgICAgIHRoaXMuRW8odS5pbml0TWVzc2FnZUhlYWRlcnMsIGUsIG4pLCBcbiAgICAgICAgLy8gU2VuZGluZyB0aGUgY3VzdG9tIGhlYWRlcnMgd2UganVzdCBhZGRlZCB0byByZXF1ZXN0LmluaXRNZXNzYWdlSGVhZGVyc1xuICAgICAgICAvLyAoQXV0aG9yaXphdGlvbiwgZXRjLikgd2lsbCB0cmlnZ2VyIHRoZSBicm93c2VyIHRvIG1ha2UgYSBDT1JTIHByZWZsaWdodFxuICAgICAgICAvLyByZXF1ZXN0IGJlY2F1c2UgdGhlIFhIUiB3aWxsIG5vIGxvbmdlciBtZWV0IHRoZSBjcml0ZXJpYSBmb3IgYSBcInNpbXBsZVwiXG4gICAgICAgIC8vIENPUlMgcmVxdWVzdDpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9DT1JTI1NpbXBsZV9yZXF1ZXN0c1xuICAgICAgICAvLyBUaGVyZWZvcmUgdG8gYXZvaWQgdGhlIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3QgKGFuIGV4dHJhIG5ldHdvcmtcbiAgICAgICAgLy8gcm91bmR0cmlwKSwgd2UgdXNlIHRoZSBlbmNvZGVJbml0TWVzc2FnZUhlYWRlcnMgb3B0aW9uIHRvIHNwZWNpZnkgdGhhdFxuICAgICAgICAvLyB0aGUgaGVhZGVycyBzaG91bGQgaW5zdGVhZCBiZSBlbmNvZGVkIGluIHRoZSByZXF1ZXN0J3MgUE9TVCBwYXlsb2FkLFxuICAgICAgICAvLyB3aGljaCBpcyByZWNvZ25pemVkIGJ5IHRoZSB3ZWJjaGFubmVsIGJhY2tlbmQuXG4gICAgICAgIHUuZW5jb2RlSW5pdE1lc3NhZ2VIZWFkZXJzID0gITA7XG4gICAgICAgIGNvbnN0IGEgPSBpLmpvaW4oXCJcIik7XG4gICAgICAgIE4oa3UsIGBDcmVhdGluZyBSUEMgJyR7dH0nIHN0cmVhbSAke3N9OiAke2F9YCwgdSk7XG4gICAgICAgIGNvbnN0IGggPSByLmNyZWF0ZVdlYkNoYW5uZWwoYSwgdSk7XG4gICAgICAgIC8vIFdlYkNoYW5uZWwgc3VwcG9ydHMgc2VuZGluZyB0aGUgZmlyc3QgbWVzc2FnZSB3aXRoIHRoZSBoYW5kc2hha2UgLSBzYXZpbmdcbiAgICAgICAgLy8gYSBuZXR3b3JrIHJvdW5kIHRyaXAuIEhvd2V2ZXIsIGl0IHdpbGwgaGF2ZSB0byBjYWxsIHNlbmQgaW4gdGhlIHNhbWVcbiAgICAgICAgLy8gSlMgZXZlbnQgbG9vcCBhcyBvcGVuLiBJbiBvcmRlciB0byBlbmZvcmNlIHRoaXMsIHdlIGRlbGF5IGFjdHVhbGx5XG4gICAgICAgIC8vIG9wZW5pbmcgdGhlIFdlYkNoYW5uZWwgdW50aWwgc2VuZCBpcyBjYWxsZWQuIFdoZXRoZXIgd2UgaGF2ZSBjYWxsZWRcbiAgICAgICAgLy8gb3BlbiBpcyB0cmFja2VkIHdpdGggdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgICAgICAgICBsZXQgbCA9ICExLCBmID0gITE7XG4gICAgICAgIC8vIEEgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RyZWFtIHdhcyBjbG9zZWQgKGJ5IHVzIG9yIHRocm91Z2ggYW5cbiAgICAgICAgLy8gZXJyb3IvY2xvc2UgZXZlbnQpIHRvIGF2b2lkIGRlbGl2ZXJpbmcgbXVsdGlwbGUgY2xvc2UgZXZlbnRzIG9yIHNlbmRpbmdcbiAgICAgICAgLy8gb24gYSBjbG9zZWQgc3RyZWFtXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBOdSh7XG4gICAgICAgICAgICBybzogZSA9PiB7XG4gICAgICAgICAgICAgICAgZiA/IE4oa3UsIGBOb3Qgc2VuZGluZyBiZWNhdXNlIFJQQyAnJHt0fScgc3RyZWFtICR7c30gaXMgY2xvc2VkOmAsIGUpIDogKGwgfHwgKE4oa3UsIGBPcGVuaW5nIFJQQyAnJHt0fScgc3RyZWFtICR7c30gdHJhbnNwb3J0LmApLCBcbiAgICAgICAgICAgICAgICBoLm9wZW4oKSwgbCA9ICEwKSwgTihrdSwgYFJQQyAnJHt0fScgc3RyZWFtICR7c30gc2VuZGluZzpgLCBlKSwgaC5zZW5kKGUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbzogKCkgPT4gaC5jbG9zZSgpXG4gICAgICAgIH0pLCB3ID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE8oZGltb25kKTogY2xvc3VyZSB0eXBpbmcgc2VlbXMgYnJva2VuIGJlY2F1c2UgV2ViQ2hhbm5lbCBkb2VzXG4gICAgICAgICAgICAvLyBub3QgaW1wbGVtZW50IGdvb2cuZXZlbnRzLkxpc3RlbmFibGVcbiAgICAgICAgICAgIHQubGlzdGVuKGUsICh0ID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuKHQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2xvc3VyZSBldmVudHMgYXJlIGd1YXJkZWQgYW5kIGV4Y2VwdGlvbnMgYXJlIHN3YWxsb3dlZCwgc28gY2F0Y2ggYW55XG4gICAgICAgIC8vIGV4Y2VwdGlvbiBhbmQgcmV0aHJvdyB1c2luZyBhIHNldFRpbWVvdXQgc28gdGhleSBiZWNvbWUgdmlzaWJsZSBhZ2Fpbi5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGV2ZW50dWFsbHkgdGhpcyBmdW5jdGlvbiBjb3VsZCBnbyBhd2F5IGlmIHdlIGFyZSBjb25maWRlbnRcbiAgICAgICAgLy8gZW5vdWdoIHRoZSBjb2RlIGlzIGV4Y2VwdGlvbiBmcmVlLlxuICAgICAgICAgICAgICAgIHJldHVybiB3KGgsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk9QRU4sICgoKSA9PiB7XG4gICAgICAgICAgICBmIHx8IE4oa3UsIGBSUEMgJyR7dH0nIHN0cmVhbSAke3N9IHRyYW5zcG9ydCBvcGVuZWQuYCk7XG4gICAgICAgIH0pKSwgdyhoLCBXZWJDaGFubmVsLkV2ZW50VHlwZS5DTE9TRSwgKCgpID0+IHtcbiAgICAgICAgICAgIGYgfHwgKGYgPSAhMCwgTihrdSwgYFJQQyAnJHt0fScgc3RyZWFtICR7c30gdHJhbnNwb3J0IGNsb3NlZGApLCBkLndvKCkpO1xuICAgICAgICB9KSksIHcoaCwgV2ViQ2hhbm5lbC5FdmVudFR5cGUuRVJST1IsIChlID0+IHtcbiAgICAgICAgICAgIGYgfHwgKGYgPSAhMCwgTShrdSwgYFJQQyAnJHt0fScgc3RyZWFtICR7c30gdHJhbnNwb3J0IGVycm9yZWQ6YCwgZSksIGQud28obmV3IFUocS5VTkFWQUlMQUJMRSwgXCJUaGUgb3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWRcIikpKTtcbiAgICAgICAgfSkpLCB3KGgsIFdlYkNoYW5uZWwuRXZlbnRUeXBlLk1FU1NBR0UsIChlID0+IHtcbiAgICAgICAgICAgIHZhciBuO1xuICAgICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IGUuZGF0YVswXTtcbiAgICAgICAgICAgICAgICBGKCEhaSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhiLzM1MTQzODkxKTogVGhlcmUgaXMgYSBidWcgaW4gT25lIFBsYXRmb3JtIHRoYXQgY2F1c2VkIGVycm9yc1xuICAgICAgICAgICAgICAgIC8vIChhbmQgb25seSBlcnJvcnMpIHRvIGJlIHdyYXBwZWQgaW4gYW4gZXh0cmEgYXJyYXkuIFRvIGJlIGZvcndhcmRcbiAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggdGhlIGJ1ZyB3ZSBuZWVkIHRvIGNoZWNrIGVpdGhlciBjb25kaXRpb24uIFRoZSBsYXR0ZXJcbiAgICAgICAgICAgICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBmaXggaGFzIGJlZW4gcm9sbGVkIG91dC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgYW55IGJlY2F1c2UgbXNnRGF0YS5lcnJvciBpcyBub3QgdHlwZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGksIG8gPSByLmVycm9yIHx8IChudWxsID09PSAobiA9IHJbMF0pIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgICAgICAgICAgIE4oa3UsIGBSUEMgJyR7dH0nIHN0cmVhbSAke3N9IHJlY2VpdmVkIGVycm9yOmAsIG8pO1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvci5zdGF0dXMgd2lsbCBiZSBhIHN0cmluZyBsaWtlICdPSycgb3IgJ05PVF9GT1VORCcuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBvLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSBcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gKiBNYXBzIGFuIGVycm9yIENvZGUgZnJvbSBhIEdSUEMgc3RhdHVzIGlkZW50aWZpZXIgbGlrZSAnTk9UX0ZPVU5EJy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgQ29kZSBlcXVpdmFsZW50IHRvIHRoZSBnaXZlbiBzdGF0dXMgc3RyaW5nIG9yIHVuZGVmaW5lZCBpZlxuICogICAgIHRoZXJlIGlzIG5vIG1hdGNoLlxuICovXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb2t1cCBieSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaWlbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlKSByZXR1cm4gdWkoZSk7XG4gICAgICAgICAgICAgICAgICAgIH0oZSksIGkgPSBvLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gbiAmJiAobiA9IHEuSU5URVJOQUwsIGkgPSBcIlVua25vd24gZXJyb3Igc3RhdHVzOiBcIiArIGUgKyBcIiB3aXRoIG1lc3NhZ2UgXCIgKyBvLm1lc3NhZ2UpLCBcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBjbG9zZWQgc28gbm8gZnVydGhlciBldmVudHMgYXJlIHByb3BhZ2F0ZWRcbiAgICAgICAgICAgICAgICAgICAgZiA9ICEwLCBkLndvKG5ldyBVKG4sIGkpKSwgaC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBOKGt1LCBgUlBDICcke3R9JyBzdHJlYW0gJHtzfSByZWNlaXZlZDpgLCBpKSwgZC5fbyhpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpLCB3KG8sIEV2ZW50LlNUQVRfRVZFTlQsIChlID0+IHtcbiAgICAgICAgICAgIGUuc3RhdCA9PT0gU3RhdC5QUk9YWSA/IE4oa3UsIGBSUEMgJyR7dH0nIHN0cmVhbSAke3N9IGRldGVjdGVkIGJ1ZmZlcmluZyBwcm94eWApIDogZS5zdGF0ID09PSBTdGF0Lk5PUFJPWFkgJiYgTihrdSwgYFJQQyAnJHt0fScgc3RyZWFtICR7c30gZGV0ZWN0ZWQgbm8gYnVmZmVyaW5nIHByb3h5YCk7XG4gICAgICAgIH0pKSwgc2V0VGltZW91dCgoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2UgY291bGQvc2hvdWxkIHdhaXQgZm9yIHRoZSBXZWJDaGFubmVsIG9wZW5lZCBldmVudCxcbiAgICAgICAgICAgIC8vIGJ1dCBiZWNhdXNlIHdlIHdhbnQgdG8gc2VuZCB0aGUgZmlyc3QgbWVzc2FnZSB3aXRoIHRoZSBXZWJDaGFubmVsXG4gICAgICAgICAgICAvLyBoYW5kc2hha2Ugd2UgcHJldGVuZCB0aGUgY2hhbm5lbCBvcGVuZWQgaGVyZSAoYXN5bmNocm9ub3VzbHkpLCBhbmRcbiAgICAgICAgICAgIC8vIHRoZW4gZGVsYXkgdGhlIGFjdHVhbCBvcGVuIHVudGlsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHNlbnQuXG4gICAgICAgICAgICBkLmZvKCk7XG4gICAgICAgIH0pLCAwKSwgZDtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogSW5pdGlhbGl6ZXMgdGhlIFdlYkNoYW5uZWxDb25uZWN0aW9uIGZvciB0aGUgYnJvd3Nlci4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogVGhlIFBsYXRmb3JtJ3MgJ3dpbmRvdycgaW1wbGVtZW50YXRpb24gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLiAqL1xuZnVuY3Rpb24gJHUoKSB7XG4gICAgLy8gYHdpbmRvd2AgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIGUuZy4gaW4gUmVhY3ROYXRpdmUgYW5kIFdlYldvcmtlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiBudWxsO1xufVxuXG4vKiogVGhlIFBsYXRmb3JtJ3MgJ2RvY3VtZW50JyBpbXBsZW1lbnRhdGlvbiBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUuICovIGZ1bmN0aW9uIE91KCkge1xuICAgIC8vIGBkb2N1bWVudGAgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIGUuZy4gaW4gUmVhY3ROYXRpdmUgYW5kIFdlYldvcmtlcnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBkb2N1bWVudCA/IGRvY3VtZW50IDogbnVsbDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gZnVuY3Rpb24gRnUodCkge1xuICAgIHJldHVybiBuZXcgVmkodCwgLyogdXNlUHJvdG8zSnNvbj0gKi8gITApO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGhlbHBlciBmb3IgcnVubmluZyBkZWxheWVkIHRhc2tzIGZvbGxvd2luZyBhbiBleHBvbmVudGlhbCBiYWNrb2ZmIGN1cnZlXG4gKiBiZXR3ZWVuIGF0dGVtcHRzLlxuICpcbiAqIEVhY2ggZGVsYXkgaXMgbWFkZSB1cCBvZiBhIFwiYmFzZVwiIGRlbGF5IHdoaWNoIGZvbGxvd3MgdGhlIGV4cG9uZW50aWFsXG4gKiBiYWNrb2ZmIGN1cnZlLCBhbmQgYSArLy0gNTAlIFwiaml0dGVyXCIgdGhhdCBpcyBjYWxjdWxhdGVkIGFuZCBhZGRlZCB0byB0aGVcbiAqIGJhc2UgZGVsYXkuIFRoaXMgcHJldmVudHMgY2xpZW50cyBmcm9tIGFjY2lkZW50YWxseSBzeW5jaHJvbml6aW5nIHRoZWlyXG4gKiBkZWxheXMgY2F1c2luZyBzcGlrZXMgb2YgbG9hZCB0byB0aGUgYmFja2VuZC5cbiAqL1xuY2xhc3MgQnUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBBc3luY1F1ZXVlIHRvIHJ1biBiYWNrb2ZmIG9wZXJhdGlvbnMgb24uXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqXG4gICAgICogVGhlIElEIHRvIHVzZSB3aGVuIHNjaGVkdWxpbmcgYmFja29mZiBvcGVyYXRpb25zIG9uIHRoZSBBc3luY1F1ZXVlLlxuICAgICAqL1xuICAgIGUsIFxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRlbGF5ICh1c2VkIGFzIHRoZSBiYXNlIGRlbGF5IG9uIHRoZSBmaXJzdCByZXRyeSBhdHRlbXB0KS5cbiAgICAgKiBOb3RlIHRoYXQgaml0dGVyIHdpbGwgc3RpbGwgYmUgYXBwbGllZCwgc28gdGhlIGFjdHVhbCBkZWxheSBjb3VsZCBiZSBhc1xuICAgICAqIGxpdHRsZSBhcyAwLjUqaW5pdGlhbERlbGF5TXMuXG4gICAgICovXG4gICAgbiA9IDFlM1xuICAgIC8qKlxuICAgICAqIFRoZSBtdWx0aXBsaWVyIHRvIHVzZSB0byBkZXRlcm1pbmUgdGhlIGV4dGVuZGVkIGJhc2UgZGVsYXkgYWZ0ZXIgZWFjaFxuICAgICAqIGF0dGVtcHQuXG4gICAgICovICwgcyA9IDEuNVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGJhc2UgZGVsYXkgYWZ0ZXIgd2hpY2ggbm8gZnVydGhlciBiYWNrb2ZmIGlzIHBlcmZvcm1lZC5cbiAgICAgKiBOb3RlIHRoYXQgaml0dGVyIHdpbGwgc3RpbGwgYmUgYXBwbGllZCwgc28gdGhlIGFjdHVhbCBkZWxheSBjb3VsZCBiZSBhc1xuICAgICAqIG11Y2ggYXMgMS41Km1heERlbGF5TXMuXG4gICAgICovICwgaSA9IDZlNCkge1xuICAgICAgICB0aGlzLmlpID0gdCwgdGhpcy50aW1lcklkID0gZSwgdGhpcy5QbyA9IG4sIHRoaXMuYm8gPSBzLCB0aGlzLlZvID0gaSwgdGhpcy5TbyA9IDAsIFxuICAgICAgICB0aGlzLkRvID0gbnVsbCwgXG4gICAgICAgIC8qKiBUaGUgbGFzdCBiYWNrb2ZmIGF0dGVtcHQsIGFzIGVwb2NoIG1pbGxpc2Vjb25kcy4gKi9cbiAgICAgICAgdGhpcy5DbyA9IERhdGUubm93KCksIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBiYWNrb2ZmIGRlbGF5LlxuICAgICAqXG4gICAgICogVGhlIHZlcnkgbmV4dCBiYWNrb2ZmQW5kV2FpdCgpIHdpbGwgaGF2ZSBubyBkZWxheS4gSWYgaXQgaXMgY2FsbGVkIGFnYWluXG4gICAgICogKGkuZS4gZHVlIHRvIGFuIGVycm9yKSwgaW5pdGlhbERlbGF5TXMgKHBsdXMgaml0dGVyKSB3aWxsIGJlIHVzZWQsIGFuZFxuICAgICAqIHN1YnNlcXVlbnQgb25lcyB3aWxsIGluY3JlYXNlIGFjY29yZGluZyB0byB0aGUgYmFja29mZkZhY3Rvci5cbiAgICAgKi8gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuU28gPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGJhY2tvZmYgZGVsYXkgdG8gdGhlIG1heGltdW0gZGVsYXkgKGUuZy4gZm9yIHVzZSBhZnRlciBhXG4gICAgICogUkVTT1VSQ0VfRVhIQVVTVEVEIGVycm9yKS5cbiAgICAgKi8gICAgeG8oKSB7XG4gICAgICAgIHRoaXMuU28gPSB0aGlzLlZvO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGN1cnJlbnREZWxheU1zLCBhbmQgaW5jcmVhc2VzIHRoZVxuICAgICAqIGRlbGF5IGZvciBhbnkgc3Vic2VxdWVudCBhdHRlbXB0cy4gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBiYWNrb2ZmIG9wZXJhdGlvblxuICAgICAqIGFscmVhZHksIGl0IHdpbGwgYmUgY2FuY2VsZWQuXG4gICAgICovICAgIE5vKHQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIGJhY2tvZmYgb3BlcmF0aW9uLlxuICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICAvLyBGaXJzdCBzY2hlZHVsZSB1c2luZyB0aGUgY3VycmVudCBiYXNlICh3aGljaCBtYXkgYmUgMCBhbmQgc2hvdWxkIGJlXG4gICAgICAgIC8vIGhvbm9yZWQgYXMgc3VjaCkuXG4gICAgICAgIGNvbnN0IGUgPSBNYXRoLmZsb29yKHRoaXMuU28gKyB0aGlzLmtvKCkpLCBuID0gTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHRoaXMuQ28pLCBzID0gTWF0aC5tYXgoMCwgZSAtIG4pO1xuICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGxhc3RBdHRlbXB0VGltZSBiZWluZyBpbiB0aGUgZnV0dXJlIGR1ZSB0byBhIGNsb2NrIGNoYW5nZS5cbiAgICAgICAgICAgICAgICBzID4gMCAmJiBOKFwiRXhwb25lbnRpYWxCYWNrb2ZmXCIsIGBCYWNraW5nIG9mZiBmb3IgJHtzfSBtcyAoYmFzZSBkZWxheTogJHt0aGlzLlNvfSBtcywgZGVsYXkgd2l0aCBqaXR0ZXI6ICR7ZX0gbXMsIGxhc3QgYXR0ZW1wdDogJHtufSBtcyBhZ28pYCksIFxuICAgICAgICB0aGlzLkRvID0gdGhpcy5paS5lbnF1ZXVlQWZ0ZXJEZWxheSh0aGlzLnRpbWVySWQsIHMsICgoKSA9PiAodGhpcy5DbyA9IERhdGUubm93KCksIFxuICAgICAgICB0KCkpKSksIFxuICAgICAgICAvLyBBcHBseSBiYWNrb2ZmIGZhY3RvciB0byBkZXRlcm1pbmUgbmV4dCBkZWxheSBhbmQgZW5zdXJlIGl0IGlzIHdpdGhpblxuICAgICAgICAvLyBib3VuZHMuXG4gICAgICAgIHRoaXMuU28gKj0gdGhpcy5ibywgdGhpcy5TbyA8IHRoaXMuUG8gJiYgKHRoaXMuU28gPSB0aGlzLlBvKSwgdGhpcy5TbyA+IHRoaXMuVm8gJiYgKHRoaXMuU28gPSB0aGlzLlZvKTtcbiAgICB9XG4gICAgTW8oKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMuRG8gJiYgKHRoaXMuRG8uc2tpcERlbGF5KCksIHRoaXMuRG8gPSBudWxsKTtcbiAgICB9XG4gICAgY2FuY2VsKCkge1xuICAgICAgICBudWxsICE9PSB0aGlzLkRvICYmICh0aGlzLkRvLmNhbmNlbCgpLCB0aGlzLkRvID0gbnVsbCk7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHZhbHVlIGluIHRoZSByYW5nZSBbLWN1cnJlbnRCYXNlTXMvMiwgY3VycmVudEJhc2VNcy8yXSAqLyAgICBrbygpIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gLjUpICogdGhpcy5TbztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgUGVyc2lzdGVudFN0cmVhbSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHN0cmVhbWluZyBSUENcbiAqIHRvIHRoZSBGaXJlc3RvcmUgYmFja2VuZC4gSXQncyBidWlsdCBvbiB0b3Agb2YgdGhlIGNvbm5lY3Rpb25zIG93biBzdXBwb3J0XG4gKiBmb3Igc3RyZWFtaW5nIFJQQ3MsIGFuZCBhZGRzIHNldmVyYWwgY3JpdGljYWwgZmVhdHVyZXMgZm9yIG91ciBjbGllbnRzOlxuICpcbiAqICAgLSBFeHBvbmVudGlhbCBiYWNrb2ZmIG9uIGZhaWx1cmVcbiAqICAgLSBBdXRoZW50aWNhdGlvbiB2aWEgQ3JlZGVudGlhbHNQcm92aWRlclxuICogICAtIERpc3BhdGNoaW5nIGFsbCBjYWxsYmFja3MgaW50byB0aGUgc2hhcmVkIHdvcmtlciBxdWV1ZVxuICogICAtIENsb3NpbmcgaWRsZSBzdHJlYW1zIGFmdGVyIDYwIHNlY29uZHMgb2YgaW5hY3Rpdml0eVxuICpcbiAqIFN1YmNsYXNzZXMgb2YgUGVyc2lzdGVudFN0cmVhbSBpbXBsZW1lbnQgc2VyaWFsaXphdGlvbiBvZiBtb2RlbHMgdG8gYW5kXG4gKiBmcm9tIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzIGZvciBhIHNwZWNpZmljXG4gKiBzdHJlYW1pbmcgUlBDLlxuICpcbiAqICMjIFN0YXJ0aW5nIGFuZCBTdG9wcGluZ1xuICpcbiAqIFN0cmVhbWluZyBSUENzIGFyZSBzdGF0ZWZ1bCBhbmQgbmVlZCB0byBiZSBzdGFydCgpZWQgYmVmb3JlIG1lc3NhZ2VzIGNhblxuICogYmUgc2VudCBhbmQgcmVjZWl2ZWQuIFRoZSBQZXJzaXN0ZW50U3RyZWFtIHdpbGwgY2FsbCB0aGUgb25PcGVuKCkgZnVuY3Rpb25cbiAqIG9mIHRoZSBsaXN0ZW5lciBvbmNlIHRoZSBzdHJlYW0gaXMgcmVhZHkgdG8gYWNjZXB0IHJlcXVlc3RzLlxuICpcbiAqIFNob3VsZCBhIHN0YXJ0KCkgZmFpbCwgUGVyc2lzdGVudFN0cmVhbSB3aWxsIGNhbGwgdGhlIHJlZ2lzdGVyZWQgb25DbG9zZSgpXG4gKiBsaXN0ZW5lciB3aXRoIGEgRmlyZXN0b3JlRXJyb3IgaW5kaWNhdGluZyB3aGF0IHdlbnQgd3JvbmcuXG4gKlxuICogQSBQZXJzaXN0ZW50U3RyZWFtIGNhbiBiZSBzdGFydGVkIGFuZCBzdG9wcGVkIHJlcGVhdGVkbHkuXG4gKlxuICogR2VuZXJpYyB0eXBlczpcbiAqICBTZW5kVHlwZTogVGhlIHR5cGUgb2YgdGhlIG91dGdvaW5nIG1lc3NhZ2Ugb2YgdGhlIHVuZGVybHlpbmdcbiAqICAgIGNvbm5lY3Rpb24gc3RyZWFtXG4gKiAgUmVjZWl2ZVR5cGU6IFRoZSB0eXBlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIG9mIHRoZSB1bmRlcmx5aW5nXG4gKiAgICBjb25uZWN0aW9uIHN0cmVhbVxuICogIExpc3RlbmVyVHlwZTogVGhlIHR5cGUgb2YgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBjYWxsYmFja3NcbiAqL1xuY2xhc3MgTHUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIsIG8sIHUpIHtcbiAgICAgICAgdGhpcy5paSA9IHQsIHRoaXMuJG8gPSBuLCB0aGlzLk9vID0gcywgdGhpcy5jb25uZWN0aW9uID0gaSwgdGhpcy5hdXRoQ3JlZGVudGlhbHNQcm92aWRlciA9IHIsIFxuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlciA9IG8sIHRoaXMubGlzdGVuZXIgPSB1LCB0aGlzLnN0YXRlID0gMCAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuSW5pdGlhbCAqLyAsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjbG9zZSBjb3VudCB0aGF0J3MgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgc3RyZWFtIGlzIGNsb3NlZDsgdXNlZCBieVxuICAgICAgICAgKiBnZXRDbG9zZUd1YXJkZWREaXNwYXRjaGVyKCkgdG8gaW52YWxpZGF0ZSBjYWxsYmFja3MgdGhhdCBoYXBwZW4gYWZ0ZXJcbiAgICAgICAgICogY2xvc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkZvID0gMCwgdGhpcy5CbyA9IG51bGwsIHRoaXMuTG8gPSBudWxsLCB0aGlzLnN0cmVhbSA9IG51bGwsIHRoaXMucW8gPSBuZXcgQnUodCwgZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBzdGFydCgpIGhhcyBiZWVuIGNhbGxlZCBhbmQgbm8gZXJyb3IgaGFzIG9jY3VycmVkLiBUcnVlXG4gICAgICogaW5kaWNhdGVzIHRoZSBzdHJlYW0gaXMgb3BlbiBvciBpbiB0aGUgcHJvY2VzcyBvZiBvcGVuaW5nICh3aGljaFxuICAgICAqIGVuY29tcGFzc2VzIHJlc3BlY3RpbmcgYmFja29mZiwgZ2V0dGluZyBhdXRoIHRva2VucywgYW5kIHN0YXJ0aW5nIHRoZVxuICAgICAqIGFjdHVhbCBSUEMpLiBVc2UgaXNPcGVuKCkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdHJlYW0gaXMgb3BlbiBhbmQgcmVhZHkgZm9yXG4gICAgICogb3V0Ym91bmQgcmVxdWVzdHMuXG4gICAgICovICAgIFVvKCkge1xuICAgICAgICByZXR1cm4gMSAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuU3RhcnRpbmcgKi8gPT09IHRoaXMuc3RhdGUgfHwgNSAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuQmFja29mZiAqLyA9PT0gdGhpcy5zdGF0ZSB8fCB0aGlzLktvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBSUEMgaXMgb3BlbiAodGhlIG9uT3BlbigpIGxpc3RlbmVyIGhhcyBiZWVuXG4gICAgICogY2FsbGVkKSBhbmQgdGhlIHN0cmVhbSBpcyByZWFkeSBmb3Igb3V0Ym91bmQgcmVxdWVzdHMuXG4gICAgICovICAgIEtvKCkge1xuICAgICAgICByZXR1cm4gMiAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuT3BlbiAqLyA9PT0gdGhpcy5zdGF0ZSB8fCAzIC8qIFBlcnNpc3RlbnRTdHJlYW1TdGF0ZS5IZWFsdGh5ICovID09PSB0aGlzLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIFJQQy4gT25seSBhbGxvd2VkIGlmIGlzU3RhcnRlZCgpIHJldHVybnMgZmFsc2UuIFRoZSBzdHJlYW0gaXNcbiAgICAgKiBub3QgaW1tZWRpYXRlbHkgcmVhZHkgZm9yIHVzZTogb25PcGVuKCkgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIFJQQyBpc1xuICAgICAqIHJlYWR5IGZvciBvdXRib3VuZCByZXF1ZXN0cywgYXQgd2hpY2ggcG9pbnQgaXNPcGVuKCkgd2lsbCByZXR1cm4gdHJ1ZS5cbiAgICAgKlxuICAgICAqIFdoZW4gc3RhcnQgcmV0dXJucywgaXNTdGFydGVkKCkgd2lsbCByZXR1cm4gdHJ1ZS5cbiAgICAgKi8gICAgc3RhcnQoKSB7XG4gICAgICAgIDQgLyogUGVyc2lzdGVudFN0cmVhbVN0YXRlLkVycm9yICovICE9PSB0aGlzLnN0YXRlID8gdGhpcy5hdXRoKCkgOiB0aGlzLkdvKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBSUEMuIFRoaXMgY2FsbCBpcyBpZGVtcG90ZW50IGFuZCBhbGxvd2VkIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgICogY3VycmVudCBpc1N0YXJ0ZWQoKSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFdoZW4gc3RvcCByZXR1cm5zLCBpc1N0YXJ0ZWQoKSBhbmQgaXNPcGVuKCkgd2lsbCBib3RoIHJldHVybiBmYWxzZS5cbiAgICAgKi8gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5VbygpICYmIGF3YWl0IHRoaXMuY2xvc2UoMCAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuSW5pdGlhbCAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFmdGVyIGFuIGVycm9yIHRoZSBzdHJlYW0gd2lsbCB1c3VhbGx5IGJhY2sgb2ZmIG9uIHRoZSBuZXh0IGF0dGVtcHQgdG9cbiAgICAgKiBzdGFydCBpdC4gSWYgdGhlIGVycm9yIHdhcnJhbnRzIGFuIGltbWVkaWF0ZSByZXN0YXJ0IG9mIHRoZSBzdHJlYW0sIHRoZVxuICAgICAqIHNlbmRlciBjYW4gdXNlIHRoaXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVjZWl2ZXIgc2hvdWxkIG5vdCBiYWNrIG9mZi5cbiAgICAgKlxuICAgICAqIEVhY2ggZXJyb3Igd2lsbCBjYWxsIHRoZSBvbkNsb3NlKCkgbGlzdGVuZXIuIFRoYXQgZnVuY3Rpb24gY2FuIGRlY2lkZSB0b1xuICAgICAqIGluaGliaXQgYmFja29mZiBpZiByZXF1aXJlZC5cbiAgICAgKi8gICAgUW8oKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAwIC8qIFBlcnNpc3RlbnRTdHJlYW1TdGF0ZS5Jbml0aWFsICovICwgdGhpcy5xby5yZXNldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGlzIHN0cmVhbSBhcyBpZGxlLiBJZiBubyBmdXJ0aGVyIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGVcbiAgICAgKiBzdHJlYW0gZm9yIG9uZSBtaW51dGUsIHRoZSBzdHJlYW0gd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIGl0c2VsZiBhbmRcbiAgICAgKiBub3RpZnkgdGhlIHN0cmVhbSdzIG9uQ2xvc2UoKSBoYW5kbGVyIHdpdGggU3RhdHVzLk9LLiBUaGUgc3RyZWFtIHdpbGwgdGhlblxuICAgICAqIGJlIGluIGEgIWlzU3RhcnRlZCgpIHN0YXRlLCByZXF1aXJpbmcgdGhlIGNhbGxlciB0byBzdGFydCB0aGUgc3RyZWFtIGFnYWluXG4gICAgICogYmVmb3JlIGZ1cnRoZXIgdXNlLlxuICAgICAqXG4gICAgICogT25seSBzdHJlYW1zIHRoYXQgYXJlIGluIHN0YXRlICdPcGVuJyBjYW4gYmUgbWFya2VkIGlkbGUsIGFzIGFsbCBvdGhlclxuICAgICAqIHN0YXRlcyBpbXBseSBwZW5kaW5nIG5ldHdvcmsgb3BlcmF0aW9ucy5cbiAgICAgKi8gICAgam8oKSB7XG4gICAgICAgIC8vIFN0YXJ0cyB0aGUgaWRsZSB0aW1lIGlmIHdlIGFyZSBpbiBzdGF0ZSAnT3BlbicgYW5kIGFyZSBub3QgeWV0IGFscmVhZHlcbiAgICAgICAgLy8gcnVubmluZyBhIHRpbWVyIChpbiB3aGljaCBjYXNlIHRoZSBwcmV2aW91cyBpZGxlIHRpbWVvdXQgc3RpbGwgYXBwbGllcykuXG4gICAgICAgIHRoaXMuS28oKSAmJiBudWxsID09PSB0aGlzLkJvICYmICh0aGlzLkJvID0gdGhpcy5paS5lbnF1ZXVlQWZ0ZXJEZWxheSh0aGlzLiRvLCA2ZTQsICgoKSA9PiB0aGlzLnpvKCkpKSk7XG4gICAgfVxuICAgIC8qKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAqLyAgICBXbyh0KSB7XG4gICAgICAgIHRoaXMuSG8oKSwgdGhpcy5zdHJlYW0uc2VuZCh0KTtcbiAgICB9XG4gICAgLyoqIENhbGxlZCBieSB0aGUgaWRsZSB0aW1lciB3aGVuIHRoZSBzdHJlYW0gc2hvdWxkIGNsb3NlIGR1ZSB0byBpbmFjdGl2aXR5LiAqLyAgICBhc3luYyB6bygpIHtcbiAgICAgICAgaWYgKHRoaXMuS28oKSkgXG4gICAgICAgIC8vIFdoZW4gdGltaW5nIG91dCBhbiBpZGxlIHN0cmVhbSB0aGVyZSdzIG5vIHJlYXNvbiB0byBmb3JjZSB0aGUgc3RyZWFtIGludG8gYmFja29mZiB3aGVuXG4gICAgICAgIC8vIGl0IHJlc3RhcnRzIHNvIHNldCB0aGUgc3RyZWFtIHN0YXRlIHRvIEluaXRpYWwgaW5zdGVhZCBvZiBFcnJvci5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoMCAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuSW5pdGlhbCAqLyk7XG4gICAgfVxuICAgIC8qKiBNYXJrcyB0aGUgc3RyZWFtIGFzIGFjdGl2ZSBhZ2Fpbi4gKi8gICAgSG8oKSB7XG4gICAgICAgIHRoaXMuQm8gJiYgKHRoaXMuQm8uY2FuY2VsKCksIHRoaXMuQm8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqIENhbmNlbHMgdGhlIGhlYWx0aCBjaGVjayBkZWxheWVkIG9wZXJhdGlvbi4gKi8gICAgSm8oKSB7XG4gICAgICAgIHRoaXMuTG8gJiYgKHRoaXMuTG8uY2FuY2VsKCksIHRoaXMuTG8gPSBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIGNsZWFucyB1cCBhcyBuZWNlc3Nhcnk6XG4gICAgICpcbiAgICAgKiAqIGNsb3NlcyB0aGUgdW5kZXJseWluZyBHUlBDIHN0cmVhbTtcbiAgICAgKiAqIGNhbGxzIHRoZSBvbkNsb3NlIGhhbmRsZXIgd2l0aCB0aGUgZ2l2ZW4gJ2Vycm9yJztcbiAgICAgKiAqIHNldHMgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIHRvICdmaW5hbFN0YXRlJztcbiAgICAgKiAqIGFkanVzdHMgdGhlIGJhY2tvZmYgdGltZXIgYmFzZWQgb24gdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBBIG5ldyBzdHJlYW0gY2FuIGJlIG9wZW5lZCBieSBjYWxsaW5nIHN0YXJ0KCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmluYWxTdGF0ZSAtIHRoZSBpbnRlbmRlZCBzdGF0ZSBvZiB0aGUgc3RyZWFtIGFmdGVyIGNsb3NpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIC0gdGhlIGVycm9yIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgd2l0aC5cbiAgICAgKi8gICAgYXN5bmMgY2xvc2UodCwgZSkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IG91dHN0YW5kaW5nIHRpbWVycyAodGhleSdyZSBndWFyYW50ZWVkIG5vdCB0byBleGVjdXRlKS5cbiAgICAgICAgdGhpcy5IbygpLCB0aGlzLkpvKCksIHRoaXMucW8uY2FuY2VsKCksIFxuICAgICAgICAvLyBJbnZhbGlkYXRlcyBhbnkgc3RyZWFtLXJlbGF0ZWQgY2FsbGJhY2tzIChlLmcuIGZyb20gYXV0aCBvciB0aGVcbiAgICAgICAgLy8gdW5kZXJseWluZyBzdHJlYW0pLCBndWFyYW50ZWVpbmcgdGhleSB3b24ndCBleGVjdXRlLlxuICAgICAgICB0aGlzLkZvKyssIDQgLyogUGVyc2lzdGVudFN0cmVhbVN0YXRlLkVycm9yICovICE9PSB0ID8gXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW50ZW50aW9uYWwgY2xvc2UgZW5zdXJlIHdlIGRvbid0IGRlbGF5IG91ciBuZXh0IGNvbm5lY3Rpb24gYXR0ZW1wdC5cbiAgICAgICAgdGhpcy5xby5yZXNldCgpIDogZSAmJiBlLmNvZGUgPT09IHEuUkVTT1VSQ0VfRVhIQVVTVEVEID8gKFxuICAgICAgICAvLyBMb2cgdGhlIGVycm9yLiAoUHJvYmFibHkgZWl0aGVyICdxdW90YSBleGNlZWRlZCcgb3IgJ21heCBxdWV1ZSBsZW5ndGggcmVhY2hlZCcuKVxuICAgICAgICBrKGUudG9TdHJpbmcoKSksIGsoXCJVc2luZyBtYXhpbXVtIGJhY2tvZmYgZGVsYXkgdG8gcHJldmVudCBvdmVybG9hZGluZyB0aGUgYmFja2VuZC5cIiksIFxuICAgICAgICB0aGlzLnFvLnhvKCkpIDogZSAmJiBlLmNvZGUgPT09IHEuVU5BVVRIRU5USUNBVEVEICYmIDMgLyogUGVyc2lzdGVudFN0cmVhbVN0YXRlLkhlYWx0aHkgKi8gIT09IHRoaXMuc3RhdGUgJiYgKFxuICAgICAgICAvLyBcInVuYXV0aGVudGljYXRlZFwiIGVycm9yIG1lYW5zIHRoZSB0b2tlbiB3YXMgcmVqZWN0ZWQuIFRoaXMgc2hvdWxkIHJhcmVseVxuICAgICAgICAvLyBoYXBwZW4gc2luY2UgYm90aCBBdXRoIGFuZCBBcHBDaGVjayBlbnN1cmUgYSBzdWZmaWNpZW50IFRUTCB3aGVuIHdlXG4gICAgICAgIC8vIHJlcXVlc3QgYSB0b2tlbi4gSWYgYSB1c2VyIG1hbnVhbGx5IHJlc2V0cyB0aGVpciBzeXN0ZW0gY2xvY2sgdGhpcyBjYW5cbiAgICAgICAgLy8gZmFpbCwgaG93ZXZlci4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgZ2V0IGEgQ29kZS5VTkFVVEhFTlRJQ0FURUQgZXJyb3JcbiAgICAgICAgLy8gYmVmb3JlIHdlIHJlY2VpdmVkIHRoZSBmaXJzdCBtZXNzYWdlIGFuZCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlIHRva2VuXG4gICAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IHdlIGZldGNoIGEgbmV3IHRva2VuLlxuICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFsc1Byb3ZpZGVyLmludmFsaWRhdGVUb2tlbigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHNQcm92aWRlci5pbnZhbGlkYXRlVG9rZW4oKSksIFxuICAgICAgICAvLyBDbGVhbiB1cCB0aGUgdW5kZXJseWluZyBzdHJlYW0gYmVjYXVzZSB3ZSBhcmUgbm8gbG9uZ2VyIGludGVyZXN0ZWQgaW4gZXZlbnRzLlxuICAgICAgICBudWxsICE9PSB0aGlzLnN0cmVhbSAmJiAodGhpcy5ZbygpLCB0aGlzLnN0cmVhbS5jbG9zZSgpLCB0aGlzLnN0cmVhbSA9IG51bGwpLCBcbiAgICAgICAgLy8gVGhpcyBzdGF0ZSBtdXN0IGJlIGFzc2lnbmVkIGJlZm9yZSBjYWxsaW5nIG9uQ2xvc2UoKSB0byBhbGxvdyB0aGUgY2FsbGJhY2sgdG9cbiAgICAgICAgLy8gaW5oaWJpdCBiYWNrb2ZmIG9yIG90aGVyd2lzZSBtYW5pcHVsYXRlIHRoZSBzdGF0ZSBpbiBpdHMgbm9uLXN0YXJ0ZWQgc3RhdGUuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0LCBcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBzdHJlYW0gY2xvc2VkLlxuICAgICAgICBhd2FpdCB0aGlzLmxpc3RlbmVyLmFvKGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiB0byBwZXJmb3JtIGFkZGl0aW9uYWwgY2xlYW51cCBiZWZvcmUgdGhlIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICogQ2FsbGluZyBzdXBlci50ZWFyRG93bigpIGlzIG5vdCByZXF1aXJlZC5cbiAgICAgKi8gICAgWW8oKSB7fVxuICAgIGF1dGgoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAxIC8qIFBlcnNpc3RlbnRTdHJlYW1TdGF0ZS5TdGFydGluZyAqLztcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuWG8odGhpcy5GbyksIGUgPSB0aGlzLkZvO1xuICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IEp1c3QgdXNlIGRpc3BhdGNoSWZOb3RDbG9zZWQsIGJ1dCBzZWUgVE9ETyBiZWxvdy5cbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbIHRoaXMuYXV0aENyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0VG9rZW4oKSBdKS50aGVuKCgoW3QsIG5dKSA9PiB7XG4gICAgICAgICAgICAvLyBTdHJlYW0gY2FuIGJlIHN0b3BwZWQgd2hpbGUgd2FpdGluZyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAgICAvLyBUT0RPKG1pa2VsZWhlbik6IFdlIHJlYWxseSBzaG91bGQganVzdCB1c2UgZGlzcGF0Y2hJZk5vdENsb3NlZFxuICAgICAgICAgICAgLy8gYW5kIGxldCB0aGlzIGRpc3BhdGNoIG9udG8gdGhlIHF1ZXVlLCBidXQgdGhhdCBvcGVuZWQgYSBzcGVjIHRlc3QgY2FuXG4gICAgICAgICAgICAvLyBvZiB3b3JtcyB0aGF0IEkgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggaW4gdGhpcyBQUi5cbiAgICAgICAgICAgIHRoaXMuRm8gPT09IGUgJiYgXG4gICAgICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIGhhdmUgdG8gc2NoZWR1bGUgdGhlIGNhbGxiYWNrIG9uIHRoZSBBc3luY1F1ZXVlLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBjYWxscyBhcmUgc2FmZSB0byBiZSBjYWxsZWQgb3V0c2lkZSB0aGVcbiAgICAgICAgICAgIC8vIEFzeW5jUXVldWUgc2luY2UgdGhleSBkb24ndCBjaGFpbiBhc3luY2hyb25vdXMgY2FsbHNcbiAgICAgICAgICAgIHRoaXMuWm8odCwgbik7XG4gICAgICAgIH0pLCAoZSA9PiB7XG4gICAgICAgICAgICB0KCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBVKHEuVU5LTk9XTiwgXCJGZXRjaGluZyBhdXRoIHRva2VuIGZhaWxlZDogXCIgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnR1KHQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIFpvKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHRoaXMuWG8odGhpcy5Gbyk7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gdGhpcy5ldSh0LCBlKSwgdGhpcy5zdHJlYW0udW8oKCgpID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+ICh0aGlzLnN0YXRlID0gMiAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuT3BlbiAqLyAsIHRoaXMuTG8gPSB0aGlzLmlpLmVucXVldWVBZnRlckRlbGF5KHRoaXMuT28sIDFlNCwgKCgpID0+ICh0aGlzLktvKCkgJiYgKHRoaXMuc3RhdGUgPSAzIC8qIFBlcnNpc3RlbnRTdHJlYW1TdGF0ZS5IZWFsdGh5ICovKSwgXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKSkpKSwgdGhpcy5saXN0ZW5lci51bygpKSkpO1xuICAgICAgICB9KSksIHRoaXMuc3RyZWFtLmFvKCh0ID0+IHtcbiAgICAgICAgICAgIG4oKCgpID0+IHRoaXMudHUodCkpKTtcbiAgICAgICAgfSkpLCB0aGlzLnN0cmVhbS5vbk1lc3NhZ2UoKHQgPT4ge1xuICAgICAgICAgICAgbigoKCkgPT4gdGhpcy5vbk1lc3NhZ2UodCkpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBHbygpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDUgLyogUGVyc2lzdGVudFN0cmVhbVN0YXRlLkJhY2tvZmYgKi8gLCB0aGlzLnFvLk5vKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gMCAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuSW5pdGlhbCAqLyAsIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBWaXNpYmxlIGZvciB0ZXN0c1xuICAgIHR1KHQpIHtcbiAgICAgICAgLy8gSW4gdGhlb3J5IHRoZSBzdHJlYW0gY291bGQgY2xvc2UgY2xlYW5seSwgaG93ZXZlciwgaW4gb3VyIGN1cnJlbnQgbW9kZWxcbiAgICAgICAgLy8gd2UgbmV2ZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlY2F1c2UgaWYgd2Ugc3RvcCBhIHN0cmVhbSBvdXJzZWx2ZXMsXG4gICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBuZXZlciBiZSBjYWxsZWQuIFRvIHByZXZlbnQgY2FzZXMgd2hlcmUgd2UgcmV0cnlcbiAgICAgICAgLy8gd2l0aG91dCBhIGJhY2tvZmYgYWNjaWRlbnRhbGx5LCB3ZSBzZXQgdGhlIHN0cmVhbSB0byBlcnJvciBpbiBhbGwgY2FzZXMuXG4gICAgICAgIHJldHVybiBOKFwiUGVyc2lzdGVudFN0cmVhbVwiLCBgY2xvc2Ugd2l0aCBlcnJvcjogJHt0fWApLCB0aGlzLnN0cmVhbSA9IG51bGwsIHRoaXMuY2xvc2UoNCAvKiBQZXJzaXN0ZW50U3RyZWFtU3RhdGUuRXJyb3IgKi8gLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFwiZGlzcGF0Y2hlclwiIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvcGVyYXRpb25zIG9udG8gdGhlXG4gICAgICogQXN5bmNRdWV1ZSBidXQgb25seSBydW5zIHRoZW0gaWYgY2xvc2VDb3VudCByZW1haW5zIHVuY2hhbmdlZC4gVGhpcyBhbGxvd3NcbiAgICAgKiB1cyB0byB0dXJuIGF1dGggLyBzdHJlYW0gY2FsbGJhY2tzIGludG8gbm8tb3BzIGlmIHRoZSBzdHJlYW0gaXMgY2xvc2VkIC9cbiAgICAgKiByZS1vcGVuZWQsIGV0Yy5cbiAgICAgKi8gICAgWG8odCkge1xuICAgICAgICByZXR1cm4gZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlpLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHRoaXMuRm8gPT09IHQgPyBlKCkgOiAoTihcIlBlcnNpc3RlbnRTdHJlYW1cIiwgXCJzdHJlYW0gY2FsbGJhY2sgc2tpcHBlZCBieSBnZXRDbG9zZUd1YXJkZWREaXNwYXRjaGVyLlwiKSwgXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKSkpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBQZXJzaXN0ZW50U3RyZWFtIHRoYXQgaW1wbGVtZW50cyB0aGUgTGlzdGVuIFJQQy5cbiAqXG4gKiBPbmNlIHRoZSBMaXN0ZW4gc3RyZWFtIGhhcyBjYWxsZWQgdGhlIG9uT3BlbigpIGxpc3RlbmVyLCBhbnkgbnVtYmVyIG9mXG4gKiBsaXN0ZW4oKSBhbmQgdW5saXN0ZW4oKSBjYWxscyBjYW4gYmUgbWFkZSB0byBjb250cm9sIHdoYXQgY2hhbmdlcyB3aWxsIGJlXG4gKiBzZW50IGZyb20gdGhlIHNlcnZlciBmb3IgTGlzdGVuUmVzcG9uc2VzLlxuICovIGNsYXNzIHF1IGV4dGVuZHMgTHUge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgc3VwZXIodCwgXCJsaXN0ZW5fc3RyZWFtX2Nvbm5lY3Rpb25fYmFja29mZlwiIC8qIFRpbWVySWQuTGlzdGVuU3RyZWFtQ29ubmVjdGlvbkJhY2tvZmYgKi8gLCBcImxpc3Rlbl9zdHJlYW1faWRsZVwiIC8qIFRpbWVySWQuTGlzdGVuU3RyZWFtSWRsZSAqLyAsIFwiaGVhbHRoX2NoZWNrX3RpbWVvdXRcIiAvKiBUaW1lcklkLkhlYWx0aENoZWNrVGltZW91dCAqLyAsIGUsIG4sIHMsIHIpLCBcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gaTtcbiAgICB9XG4gICAgZXUodCwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLlJvKFwiTGlzdGVuXCIsIHQsIGUpO1xuICAgIH1cbiAgICBvbk1lc3NhZ2UodCkge1xuICAgICAgICAvLyBBIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgbWVhbnMgdGhlIHN0cmVhbSBpcyBoZWFsdGh5XG4gICAgICAgIHRoaXMucW8ucmVzZXQoKTtcbiAgICAgICAgY29uc3QgZSA9IFFpKHRoaXMuc2VyaWFsaXplciwgdCksIG4gPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIG9ubHkgcmVhY2hlZCBhIGNvbnNpc3RlbnQgc25hcHNob3QgZm9yIHRoZSBlbnRpcmUgc3RyZWFtIGlmIHRoZXJlXG4gICAgICAgICAgICAvLyBpcyBhIHJlYWRfdGltZSBzZXQgYW5kIGl0IGFwcGxpZXMgdG8gYWxsIHRhcmdldHMgKGkuZS4gdGhlIGxpc3Qgb2ZcbiAgICAgICAgICAgIC8vIHRhcmdldHMgaXMgZW1wdHkpLiBUaGUgYmFja2VuZCBpcyBndWFyYW50ZWVkIHRvIHNlbmQgc3VjaCByZXNwb25zZXMuXG4gICAgICAgICAgICBpZiAoIShcInRhcmdldENoYW5nZVwiIGluIHQpKSByZXR1cm4gcnQubWluKCk7XG4gICAgICAgICAgICBjb25zdCBlID0gdC50YXJnZXRDaGFuZ2U7XG4gICAgICAgICAgICByZXR1cm4gZS50YXJnZXRJZHMgJiYgZS50YXJnZXRJZHMubGVuZ3RoID8gcnQubWluKCkgOiBlLnJlYWRUaW1lID8gTmkoZS5yZWFkVGltZSkgOiBydC5taW4oKTtcbiAgICAgICAgfSh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIubnUoZSwgbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBpbnRlcmVzdCBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgZ2l2ZW4gdGFyZ2V0LiBJZiB0aGUgdGFyZ2V0XG4gICAgICogaW5jbHVkZXMgYSByZXN1bWVUb2tlbiBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0LiBSZXN1bHRzIHRoYXRcbiAgICAgKiBhZmZlY3QgdGhlIHRhcmdldCB3aWxsIGJlIHN0cmVhbWVkIGJhY2sgYXMgV2F0Y2hDaGFuZ2UgbWVzc2FnZXMgdGhhdFxuICAgICAqIHJlZmVyZW5jZSB0aGUgdGFyZ2V0SWQuXG4gICAgICovICAgIHN1KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHt9O1xuICAgICAgICBlLmRhdGFiYXNlID0gTGkodGhpcy5zZXJpYWxpemVyKSwgZS5hZGRUYXJnZXQgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGlmIChuID0gRm4ocykgPyB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBIaSh0LCBzKVxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBxdWVyeTogSmkodCwgcylcbiAgICAgICAgICAgIH0sIG4udGFyZ2V0SWQgPSBlLnRhcmdldElkLCBlLnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDApIHtcbiAgICAgICAgICAgICAgICBuLnJlc3VtZVRva2VuID0gQ2kodCwgZS5yZXN1bWVUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IFNpKHQsIGUuZXhwZWN0ZWRDb3VudCk7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcyAmJiAobi5leHBlY3RlZENvdW50ID0gcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGUuc25hcHNob3RWZXJzaW9uLmNvbXBhcmVUbyhydC5taW4oKSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyh3dWFuZHkpOiBDb25zaWRlciByZW1vdmluZyBhYm92ZSBjaGVjayBiZWNhdXNlIGl0IGlzIG1vc3QgbGlrZWx5IHRydWUuXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQgbm93LCBtYW55IHRlc3RzIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW91ciB0aG91Z2ggKGxlYXZpbmcgbWluKCkgb3V0XG4gICAgICAgICAgICAgICAgLy8gb2Ygc2VyaWFsaXphdGlvbikuXG4gICAgICAgICAgICAgICAgbi5yZWFkVGltZSA9IERpKHQsIGUuc25hcHNob3RWZXJzaW9uLnRvVGltZXN0YW1wKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBTaSh0LCBlLmV4cGVjdGVkQ291bnQpO1xuICAgICAgICAgICAgICAgIG51bGwgIT09IHMgJiYgKG4uZXhwZWN0ZWRDb3VudCA9IHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH0odGhpcy5zZXJpYWxpemVyLCB0KTtcbiAgICAgICAgY29uc3QgbiA9IFhpKHRoaXMuc2VyaWFsaXplciwgdCk7XG4gICAgICAgIG4gJiYgKGUubGFiZWxzID0gbiksIHRoaXMuV28oZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGludGVyZXN0IGluIHRoZSByZXN1bHRzIG9mIHRoZSB0YXJnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgICAqIGdpdmVuIHRhcmdldElkLlxuICAgICAqLyAgICBpdSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgICAgZS5kYXRhYmFzZSA9IExpKHRoaXMuc2VyaWFsaXplciksIGUucmVtb3ZlVGFyZ2V0ID0gdCwgdGhpcy5XbyhlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBTdHJlYW0gdGhhdCBpbXBsZW1lbnRzIHRoZSBXcml0ZSBSUEMuXG4gKlxuICogVGhlIFdyaXRlIFJQQyByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIG1haW50YWluIHNwZWNpYWwgc3RyZWFtVG9rZW5cbiAqIHN0YXRlIGluIGJldHdlZW4gY2FsbHMsIHRvIGhlbHAgdGhlIHNlcnZlciB1bmRlcnN0YW5kIHdoaWNoIHJlc3BvbnNlcyB0aGVcbiAqIGNsaWVudCBoYXMgcHJvY2Vzc2VkIGJ5IHRoZSB0aW1lIHRoZSBuZXh0IHJlcXVlc3QgaXMgbWFkZS4gRXZlcnkgcmVzcG9uc2VcbiAqIHdpbGwgY29udGFpbiBhIHN0cmVhbVRva2VuOyB0aGlzIHZhbHVlIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBuZXh0XG4gKiByZXF1ZXN0LlxuICpcbiAqIEFmdGVyIGNhbGxpbmcgc3RhcnQoKSBvbiB0aGlzIHN0cmVhbSwgdGhlIG5leHQgcmVxdWVzdCBtdXN0IGJlIGEgaGFuZHNoYWtlLFxuICogY29udGFpbmluZyB3aGF0ZXZlciBzdHJlYW1Ub2tlbiBpcyBvbiBoYW5kLiBPbmNlIGEgcmVzcG9uc2UgdG8gdGhpc1xuICogcmVxdWVzdCBpcyByZWNlaXZlZCwgYWxsIHBlbmRpbmcgbXV0YXRpb25zIG1heSBiZSBzdWJtaXR0ZWQuIFdoZW5cbiAqIHN1Ym1pdHRpbmcgbXVsdGlwbGUgYmF0Y2hlcyBvZiBtdXRhdGlvbnMgYXQgdGhlIHNhbWUgdGltZSwgaXQnc1xuICogb2theSB0byB1c2UgdGhlIHNhbWUgc3RyZWFtVG9rZW4gZm9yIHRoZSBjYWxscyB0byB3cml0ZU11dGF0aW9ucy5cbiAqXG4gKiBUT0RPKGIvMzMyNzEyMzUpOiBVc2UgcHJvdG8gdHlwZXNcbiAqLyBjbGFzcyBVdSBleHRlbmRzIEx1IHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByKSB7XG4gICAgICAgIHN1cGVyKHQsIFwid3JpdGVfc3RyZWFtX2Nvbm5lY3Rpb25fYmFja29mZlwiIC8qIFRpbWVySWQuV3JpdGVTdHJlYW1Db25uZWN0aW9uQmFja29mZiAqLyAsIFwid3JpdGVfc3RyZWFtX2lkbGVcIiAvKiBUaW1lcklkLldyaXRlU3RyZWFtSWRsZSAqLyAsIFwiaGVhbHRoX2NoZWNrX3RpbWVvdXRcIiAvKiBUaW1lcklkLkhlYWx0aENoZWNrVGltZW91dCAqLyAsIGUsIG4sIHMsIHIpLCBcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gaSwgdGhpcy5ydSA9ICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFja3Mgd2hldGhlciBvciBub3QgYSBoYW5kc2hha2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4Y2hhbmdlZCBhbmRcbiAgICAgKiB0aGUgc3RyZWFtIGlzIHJlYWR5IHRvIGFjY2VwdCBtdXRhdGlvbnMuXG4gICAgICovICAgIGdldCBvdSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnU7XG4gICAgfVxuICAgIC8vIE92ZXJyaWRlIG9mIFBlcnNpc3RlbnRTdHJlYW0uc3RhcnRcbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5ydSA9ICExLCB0aGlzLmxhc3RTdHJlYW1Ub2tlbiA9IHZvaWQgMCwgc3VwZXIuc3RhcnQoKTtcbiAgICB9XG4gICAgWW8oKSB7XG4gICAgICAgIHRoaXMucnUgJiYgdGhpcy51dShbXSk7XG4gICAgfVxuICAgIGV1KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5SbyhcIldyaXRlXCIsIHQsIGUpO1xuICAgIH1cbiAgICBvbk1lc3NhZ2UodCkge1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIEFsd2F5cyBjYXB0dXJlIHRoZSBsYXN0IHN0cmVhbSB0b2tlbi5cbiAgICAgICAgRighIXQuc3RyZWFtVG9rZW4pLCB0aGlzLmxhc3RTdHJlYW1Ub2tlbiA9IHQuc3RyZWFtVG9rZW4sIHRoaXMucnUpIHtcbiAgICAgICAgICAgIC8vIEEgc3VjY2Vzc2Z1bCBmaXJzdCB3cml0ZSByZXNwb25zZSBtZWFucyB0aGUgc3RyZWFtIGlzIGhlYWx0aHksXG4gICAgICAgICAgICAvLyBOb3RlLCB0aGF0IHdlIGNvdWxkIGNvbnNpZGVyIGEgc3VjY2Vzc2Z1bCBoYW5kc2hha2UgaGVhbHRoeSwgaG93ZXZlcixcbiAgICAgICAgICAgIC8vIHRoZSB3cml0ZSBpdHNlbGYgbWlnaHQgYmUgY2F1c2luZyBhbiBlcnJvciB3ZSB3YW50IHRvIGJhY2sgb2ZmIGZyb20uXG4gICAgICAgICAgICB0aGlzLnFvLnJlc2V0KCk7XG4gICAgICAgICAgICBjb25zdCBlID0gV2kodC53cml0ZVJlc3VsdHMsIHQuY29tbWl0VGltZSksIG4gPSBOaSh0LmNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY3UobiwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGZpcnN0IHJlc3BvbnNlIGlzIGFsd2F5cyB0aGUgaGFuZHNoYWtlIHJlc3BvbnNlXG4gICAgICAgIHJldHVybiBGKCF0LndyaXRlUmVzdWx0cyB8fCAwID09PSB0LndyaXRlUmVzdWx0cy5sZW5ndGgpLCB0aGlzLnJ1ID0gITAsIHRoaXMubGlzdGVuZXIuYXUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gaW5pdGlhbCBzdHJlYW1Ub2tlbiB0byB0aGUgc2VydmVyLCBwZXJmb3JtaW5nIHRoZSBoYW5kc2hha2VcbiAgICAgKiByZXF1aXJlZCB0byBtYWtlIHRoZSBTdHJlYW1pbmdXcml0ZSBSUEMgd29yay4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHNob3VsZCB3YWl0IHVudGlsIG9uSGFuZHNoYWtlQ29tcGxldGUgd2FzIGNhbGxlZC5cbiAgICAgKi8gICAgaHUoKSB7XG4gICAgICAgIC8vIFRPRE8oZGltb25kKTogU3VwcG9ydCBzdHJlYW0gcmVzdW1wdGlvbi4gV2UgaW50ZW50aW9uYWxseSBkbyBub3Qgc2V0IHRoZVxuICAgICAgICAvLyBzdHJlYW0gdG9rZW4gb24gdGhlIGhhbmRzaGFrZSwgaWdub3JpbmcgYW55IHN0cmVhbSB0b2tlbiB3ZSBtaWdodCBoYXZlLlxuICAgICAgICBjb25zdCB0ID0ge307XG4gICAgICAgIHQuZGF0YWJhc2UgPSBMaSh0aGlzLnNlcmlhbGl6ZXIpLCB0aGlzLldvKHQpO1xuICAgIH1cbiAgICAvKiogU2VuZHMgYSBncm91cCBvZiBtdXRhdGlvbnMgdG8gdGhlIEZpcmVzdG9yZSBiYWNrZW5kIHRvIGFwcGx5LiAqLyAgICB1dSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICBzdHJlYW1Ub2tlbjogdGhpcy5sYXN0U3RyZWFtVG9rZW4sXG4gICAgICAgICAgICB3cml0ZXM6IHQubWFwKCh0ID0+IGppKHRoaXMuc2VyaWFsaXplciwgdCkpKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLldvKGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRGF0YXN0b3JlIGFuZCBpdHMgcmVsYXRlZCBtZXRob2RzIGFyZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBHb29nbGVcbiAqIENsb3VkIERhdGFzdG9yZSBncnBjIEFQSSwgd2hpY2ggcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgbW9yZSBjb252ZW5pZW50XG4gKiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudCBTREsgYXJjaGl0ZWN0dXJlIHRvIGNvbnN1bWUuXG4gKi9cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgRGF0YXN0b3JlIHRoYXQgZXhwb3NlcyBhZGRpdGlvbmFsIHN0YXRlIGZvciBpbnRlcm5hbFxuICogY29uc3VtcHRpb24uXG4gKi9cbmNsYXNzIEt1IGV4dGVuZHMgY2xhc3Mge30ge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5hdXRoQ3JlZGVudGlhbHMgPSB0LCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMgPSBlLCB0aGlzLmNvbm5lY3Rpb24gPSBuLCBcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gcywgdGhpcy5sdSA9ICExO1xuICAgIH1cbiAgICBmdSgpIHtcbiAgICAgICAgaWYgKHRoaXMubHUpIHRocm93IG5ldyBVKHEuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJUaGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZC5cIik7XG4gICAgfVxuICAgIC8qKiBJbnZva2VzIHRoZSBwcm92aWRlZCBSUEMgd2l0aCBhdXRoIGFuZCBBcHBDaGVjayB0b2tlbnMuICovICAgIElvKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnUoKSwgUHJvbWlzZS5hbGwoWyB0aGlzLmF1dGhDcmVkZW50aWFscy5nZXRUb2tlbigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSBdKS50aGVuKCgoW3MsIGldKSA9PiB0aGlzLmNvbm5lY3Rpb24uSW8odCwgZSwgbiwgcywgaSkpKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aHJvdyBcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lID8gKHQuY29kZSA9PT0gcS5VTkFVVEhFTlRJQ0FURUQgJiYgKHRoaXMuYXV0aENyZWRlbnRpYWxzLmludmFsaWRhdGVUb2tlbigpLCBcbiAgICAgICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFscy5pbnZhbGlkYXRlVG9rZW4oKSksIHQpIDogbmV3IFUocS5VTktOT1dOLCB0LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKiBJbnZva2VzIHRoZSBwcm92aWRlZCBSUEMgd2l0aCBzdHJlYW1lZCByZXN1bHRzIHdpdGggYXV0aCBhbmQgQXBwQ2hlY2sgdG9rZW5zLiAqLyAgICB2byh0LCBlLCBuLCBzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1KCksIFByb21pc2UuYWxsKFsgdGhpcy5hdXRoQ3JlZGVudGlhbHMuZ2V0VG9rZW4oKSwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzLmdldFRva2VuKCkgXSkudGhlbigoKFtpLCByXSkgPT4gdGhpcy5jb25uZWN0aW9uLnZvKHQsIGUsIG4sIGksIHIsIHMpKSkuY2F0Y2goKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgXCJGaXJlYmFzZUVycm9yXCIgPT09IHQubmFtZSA/ICh0LmNvZGUgPT09IHEuVU5BVVRIRU5USUNBVEVEICYmICh0aGlzLmF1dGhDcmVkZW50aWFscy5pbnZhbGlkYXRlVG9rZW4oKSwgXG4gICAgICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuaW52YWxpZGF0ZVRva2VuKCkpLCB0KSA6IG5ldyBVKHEuVU5LTk9XTiwgdC50b1N0cmluZygpKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHRoaXMubHUgPSAhMDtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JleHApOiBNYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgRGF0YXN0b3JlIGluc3RhbmNlIHBlclxuLy8gZmlyZXN0b3JlLWV4cCBjbGllbnQuXG5hc3luYyBmdW5jdGlvbiBHdSh0LCBlLCBuKSB7XG4gICAgdmFyIHM7XG4gICAgY29uc3QgaSA9IEwodCksIHtyZXF1ZXN0OiByLCBkdTogb30gPSBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBKaSh0LCBlKSwgaSA9IHt9LCByID0gW107XG4gICAgICAgIGxldCBvID0gMDtcbiAgICAgICAgcmV0dXJuIG4uZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAvLyBNYXAgYWxsIGNsaWVudC1zaWRlIGFsaWFzZXMgdG8gYSB1bmlxdWUgc2hvcnQtZm9ybVxuICAgICAgICAgICAgLy8gYWxpYXMuIFRoaXMgYXZvaWRzIGlzc3VlcyB3aXRoIGNsaWVudC1zaWRlIGFsaWFzZXMgdGhhdFxuICAgICAgICAgICAgLy8gZXhjZWVkIHRoZSAxNTAwLWJ5dGUgc3RyaW5nIHNpemUgbGltaXQuXG4gICAgICAgICAgICBjb25zdCBlID0gXCJhZ2dyZWdhdGVfXCIgKyBvKys7XG4gICAgICAgICAgICBpW2VdID0gdC5hbGlhcywgXCJjb3VudFwiID09PSB0Lnl0ID8gci5wdXNoKHtcbiAgICAgICAgICAgICAgICBhbGlhczogZSxcbiAgICAgICAgICAgICAgICBjb3VudDoge31cbiAgICAgICAgICAgIH0pIDogXCJhdmdcIiA9PT0gdC55dCA/IHIucHVzaCh7XG4gICAgICAgICAgICAgICAgYWxpYXM6IGUsXG4gICAgICAgICAgICAgICAgYXZnOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzcih0LmZpZWxkUGF0aClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSA6IFwic3VtXCIgPT09IHQueXQgJiYgci5wdXNoKHtcbiAgICAgICAgICAgICAgICBhbGlhczogZSxcbiAgICAgICAgICAgICAgICBzdW06IHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHNyKHQuZmllbGRQYXRoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVkQWdncmVnYXRpb25RdWVyeToge1xuICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGlvbnM6IHIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZWRRdWVyeTogcy5zdHJ1Y3R1cmVkUXVlcnlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhcmVudDogcy5wYXJlbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdTogaVxuICAgICAgICB9O1xuICAgIH0oaS5zZXJpYWxpemVyLCBKbihlKSwgbiksIHUgPSByLnBhcmVudDtcbiAgICBpLmNvbm5lY3Rpb24ucG8gfHwgZGVsZXRlIHIucGFyZW50O1xuICAgIGNvbnN0IGMgPSAoYXdhaXQgaS52byhcIlJ1bkFnZ3JlZ2F0aW9uUXVlcnlcIiwgdSwgciwgLypleHBlY3RlZFJlc3BvbnNlQ291bnQ9Ki8gMSkpLmZpbHRlcigodCA9PiAhIXQucmVzdWx0KSk7XG4gICAgLy8gT21pdCBSdW5BZ2dyZWdhdGlvblF1ZXJ5UmVzcG9uc2UgdGhhdCBvbmx5IGNvbnRhaW4gcmVhZFRpbWVzLlxuICAgICAgICBGKDEgPT09IGMubGVuZ3RoKTtcbiAgICAvLyBSZW1hcCB0aGUgc2hvcnQtZm9ybSBhbGlhc2VzIHRoYXQgd2VyZSBzZW50IHRvIHRoZSBzZXJ2ZXJcbiAgICAvLyB0byB0aGUgY2xpZW50LXNpZGUgYWxpYXNlcy4gVXNlcnMgd2lsbCBhY2Nlc3MgdGhlIHJlc3VsdHNcbiAgICAvLyB1c2luZyB0aGUgY2xpZW50LXNpZGUgYWxpYXMuXG4gICAgY29uc3QgYSA9IG51bGwgPT09IChzID0gY1swXS5yZXN1bHQpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuYWdncmVnYXRlRmllbGRzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhhKS5yZWR1Y2UoKCh0LCBlKSA9PiAodFtvW2VdXSA9IGFbZV0sIHQpKSwge30pO1xufVxuXG4vKipcbiAqIEEgY29tcG9uZW50IHVzZWQgYnkgdGhlIFJlbW90ZVN0b3JlIHRvIHRyYWNrIHRoZSBPbmxpbmVTdGF0ZSAodGhhdCBpcyxcbiAqIHdoZXRoZXIgb3Igbm90IHRoZSBjbGllbnQgYXMgYSB3aG9sZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSBvbmxpbmUgb3JcbiAqIG9mZmxpbmUpLCBpbXBsZW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlIGhldXJpc3RpY3MuXG4gKlxuICogSW4gcGFydGljdWxhciwgd2hlbiB0aGUgY2xpZW50IGlzIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBiYWNrZW5kLCB3ZVxuICogYWxsb3cgdXAgdG8gTUFYX1dBVENIX1NUUkVBTV9GQUlMVVJFUyB3aXRoaW4gT05MSU5FX1NUQVRFX1RJTUVPVVRfTVMgZm9yXG4gKiBhIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC4gSWYgd2UgaGF2ZSB0b28gbWFueSBmYWlsdXJlcyBvciB0aGUgdGltZW91dCBlbGFwc2VzLFxuICogdGhlbiB3ZSBzZXQgdGhlIE9ubGluZVN0YXRlIHRvIE9mZmxpbmUsIGFuZCB0aGUgY2xpZW50IHdpbGwgYmVoYXZlIGFzIGlmXG4gKiBpdCBpcyBvZmZsaW5lIChnZXQoKXMgd2lsbCByZXR1cm4gY2FjaGVkIGRhdGEsIGV0Yy4pLlxuICovXG5jbGFzcyBRdSB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICB0aGlzLmFzeW5jUXVldWUgPSB0LCB0aGlzLm9ubGluZVN0YXRlSGFuZGxlciA9IGUsIFxuICAgICAgICAvKiogVGhlIGN1cnJlbnQgT25saW5lU3RhdGUuICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBcIlVua25vd25cIiAvKiBPbmxpbmVTdGF0ZS5Vbmtub3duICovICwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzIHRvIG9wZW4gdGhlIHN0cmVhbS4gSWYgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgICogbWF4aW11bSBkZWZpbmVkIGJ5IE1BWF9XQVRDSF9TVFJFQU1fRkFJTFVSRVMsIHdlJ2xsIHNldCB0aGUgT25saW5lU3RhdGUgdG9cbiAgICAgICAgICogT2ZmbGluZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3UgPSAwLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgdGltZXIgdGhhdCBlbGFwc2VzIGFmdGVyIE9OTElORV9TVEFURV9USU1FT1VUX01TLCBhdCB3aGljaCBwb2ludCB3ZVxuICAgICAgICAgKiB0cmFuc2l0aW9uIGZyb20gT25saW5lU3RhdGUuVW5rbm93biB0byBPbmxpbmVTdGF0ZS5PZmZsaW5lIHdpdGhvdXQgd2FpdGluZ1xuICAgICAgICAgKiBmb3IgdGhlIHN0cmVhbSB0byBhY3R1YWxseSBmYWlsIChNQVhfV0FUQ0hfU1RSRUFNX0ZBSUxVUkVTIHRpbWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3UgPSBudWxsLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNsaWVudCBzaG91bGQgbG9nIGEgd2FybmluZyBtZXNzYWdlIGlmIGl0IGZhaWxzIHRvIGNvbm5lY3QgdG9cbiAgICAgICAgICogdGhlIGJhY2tlbmQgKGluaXRpYWxseSB0cnVlLCBjbGVhcmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdHJlYW0sIG9yIGlmIHdlJ3ZlXG4gICAgICAgICAqIGxvZ2dlZCB0aGUgbWVzc2FnZSBhbHJlYWR5KS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubXUgPSAhMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJ5IFJlbW90ZVN0b3JlIHdoZW4gYSB3YXRjaCBzdHJlYW0gaXMgc3RhcnRlZCAoaW5jbHVkaW5nIG9uIGVhY2hcbiAgICAgKiBiYWNrb2ZmIGF0dGVtcHQpLlxuICAgICAqXG4gICAgICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdCwgaXQgc2V0cyB0aGUgT25saW5lU3RhdGUgdG8gVW5rbm93biBhbmQgc3RhcnRzXG4gICAgICogdGhlIG9ubGluZVN0YXRlVGltZXIuXG4gICAgICovICAgIGd1KCkge1xuICAgICAgICAwID09PSB0aGlzLnd1ICYmICh0aGlzLnl1KFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8pLCB0aGlzLl91ID0gdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBZnRlckRlbGF5KFwib25saW5lX3N0YXRlX3RpbWVvdXRcIiAvKiBUaW1lcklkLk9ubGluZVN0YXRlVGltZW91dCAqLyAsIDFlNCwgKCgpID0+ICh0aGlzLl91ID0gbnVsbCwgXG4gICAgICAgIHRoaXMucHUoXCJCYWNrZW5kIGRpZG4ndCByZXNwb25kIHdpdGhpbiAxMCBzZWNvbmRzLlwiKSwgdGhpcy55dShcIk9mZmxpbmVcIiAvKiBPbmxpbmVTdGF0ZS5PZmZsaW5lICovKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBvdXIgT25saW5lU3RhdGUgYXMgYXBwcm9wcmlhdGUgYWZ0ZXIgdGhlIHdhdGNoIHN0cmVhbSByZXBvcnRzIGFcbiAgICAgKiBmYWlsdXJlLiBUaGUgZmlyc3QgZmFpbHVyZSBtb3ZlcyB1cyB0byB0aGUgJ1Vua25vd24nIHN0YXRlLiBXZSB0aGVuIG1heVxuICAgICAqIGFsbG93IG11bHRpcGxlIGZhaWx1cmVzIChiYXNlZCBvbiBNQVhfV0FUQ0hfU1RSRUFNX0ZBSUxVUkVTKSBiZWZvcmUgd2VcbiAgICAgKiBhY3R1YWxseSB0cmFuc2l0aW9uIHRvIHRoZSAnT2ZmbGluZScgc3RhdGUuXG4gICAgICovICAgIEl1KHQpIHtcbiAgICAgICAgXCJPbmxpbmVcIiAvKiBPbmxpbmVTdGF0ZS5PbmxpbmUgKi8gPT09IHRoaXMuc3RhdGUgPyB0aGlzLnl1KFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8pIDogKHRoaXMud3UrKywgXG4gICAgICAgIHRoaXMud3UgPj0gMSAmJiAodGhpcy5UdSgpLCB0aGlzLnB1KGBDb25uZWN0aW9uIGZhaWxlZCAxIHRpbWVzLiBNb3N0IHJlY2VudCBlcnJvcjogJHt0LnRvU3RyaW5nKCl9YCksIFxuICAgICAgICB0aGlzLnl1KFwiT2ZmbGluZVwiIC8qIE9ubGluZVN0YXRlLk9mZmxpbmUgKi8pKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4cGxpY2l0bHkgc2V0cyB0aGUgT25saW5lU3RhdGUgdG8gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIHJlc2V0cyBvdXIgdGltZXJzIC8gZmFpbHVyZSBjb3VudGVycywgZXRjLiB1c2VkIGJ5IG91clxuICAgICAqIE9mZmxpbmUgaGV1cmlzdGljcywgc28gbXVzdCBub3QgYmUgdXNlZCBpbiBwbGFjZSBvZlxuICAgICAqIGhhbmRsZVdhdGNoU3RyZWFtU3RhcnQoKSBhbmQgaGFuZGxlV2F0Y2hTdHJlYW1GYWlsdXJlKCkuXG4gICAgICovICAgIHNldCh0KSB7XG4gICAgICAgIHRoaXMuVHUoKSwgdGhpcy53dSA9IDAsIFwiT25saW5lXCIgLyogT25saW5lU3RhdGUuT25saW5lICovID09PSB0ICYmIChcbiAgICAgICAgLy8gV2UndmUgY29ubmVjdGVkIHRvIHdhdGNoIGF0IGxlYXN0IG9uY2UuIERvbid0IHdhcm4gdGhlIGRldmVsb3BlclxuICAgICAgICAvLyBhYm91dCBiZWluZyBvZmZsaW5lIGdvaW5nIGZvcndhcmQuXG4gICAgICAgIHRoaXMubXUgPSAhMSksIHRoaXMueXUodCk7XG4gICAgfVxuICAgIHl1KHQpIHtcbiAgICAgICAgdCAhPT0gdGhpcy5zdGF0ZSAmJiAodGhpcy5zdGF0ZSA9IHQsIHRoaXMub25saW5lU3RhdGVIYW5kbGVyKHQpKTtcbiAgICB9XG4gICAgcHUodCkge1xuICAgICAgICBjb25zdCBlID0gYENvdWxkIG5vdCByZWFjaCBDbG91ZCBGaXJlc3RvcmUgYmFja2VuZC4gJHt0fVxcblRoaXMgdHlwaWNhbGx5IGluZGljYXRlcyB0aGF0IHlvdXIgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBoZWFsdGh5IEludGVybmV0IGNvbm5lY3Rpb24gYXQgdGhlIG1vbWVudC4gVGhlIGNsaWVudCB3aWxsIG9wZXJhdGUgaW4gb2ZmbGluZSBtb2RlIHVudGlsIGl0IGlzIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNvbm5lY3QgdG8gdGhlIGJhY2tlbmQuYDtcbiAgICAgICAgdGhpcy5tdSA/IChrKGUpLCB0aGlzLm11ID0gITEpIDogTihcIk9ubGluZVN0YXRlVHJhY2tlclwiLCBlKTtcbiAgICB9XG4gICAgVHUoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMuX3UgJiYgKHRoaXMuX3UuY2FuY2VsKCksIHRoaXMuX3UgPSBudWxsKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIGp1IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgbG9jYWwgc3RvcmUsIHVzZWQgdG8gZmlsbCB0aGUgd3JpdGUgcGlwZWxpbmUgd2l0aCBvdXRib3VuZCBtdXRhdGlvbnMuXG4gICAgICovXG4gICAgdCwgXG4gICAgLyoqIFRoZSBjbGllbnQtc2lkZSBwcm94eSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYmFja2VuZC4gKi9cbiAgICBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdG9yZSA9IHQsIHRoaXMuZGF0YXN0b3JlID0gZSwgdGhpcy5hc3luY1F1ZXVlID0gbiwgdGhpcy5yZW1vdGVTeW5jZXIgPSB7fSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgdXAgdG8gTUFYX1BFTkRJTkdfV1JJVEVTIHdyaXRlcyB0aGF0IHdlIGhhdmUgZmV0Y2hlZCBmcm9tIHRoZVxuICAgICAgICAgKiBMb2NhbFN0b3JlIHZpYSBmaWxsV3JpdGVQaXBlbGluZSgpIGFuZCBoYXZlIG9yIHdpbGwgc2VuZCB0byB0aGUgd3JpdGVcbiAgICAgICAgICogc3RyZWFtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBXaGVuZXZlciB3cml0ZVBpcGVsaW5lLmxlbmd0aCA+IDAgdGhlIFJlbW90ZVN0b3JlIHdpbGwgYXR0ZW1wdCB0byBzdGFydCBvclxuICAgICAgICAgKiByZXN0YXJ0IHRoZSB3cml0ZSBzdHJlYW0uIFdoZW4gdGhlIHN0cmVhbSBpcyBlc3RhYmxpc2hlZCB0aGUgd3JpdGVzIGluIHRoZVxuICAgICAgICAgKiBwaXBlbGluZSB3aWxsIGJlIHNlbnQgaW4gb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIFdyaXRlcyByZW1haW4gaW4gd3JpdGVQaXBlbGluZSB1bnRpbCB0aGV5IGFyZSBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmRcbiAgICAgICAgICogYW5kIHRodXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlLXNlbnQgaWYgdGhlIHN0cmVhbSBpcyBpbnRlcnJ1cHRlZCAvXG4gICAgICAgICAqIHJlc3RhcnRlZCBiZWZvcmUgdGhleSdyZSBhY2tub3dsZWRnZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFdyaXRlIHJlc3BvbnNlcyBmcm9tIHRoZSBiYWNrZW5kIGFyZSBsaW5rZWQgdG8gdGhlaXIgb3JpZ2luYXRpbmcgcmVxdWVzdFxuICAgICAgICAgKiBwdXJlbHkgYmFzZWQgb24gb3JkZXIsIGFuZCBzbyB3ZSBjYW4ganVzdCBzaGlmdCgpIHdyaXRlcyBmcm9tIHRoZSBmcm9udCBvZlxuICAgICAgICAgKiB0aGUgd3JpdGVQaXBlbGluZSBhcyB3ZSByZWNlaXZlIHJlc3BvbnNlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuRXUgPSBbXSwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIG1hcHBpbmcgb2Ygd2F0Y2hlZCB0YXJnZXRzIHRoYXQgdGhlIGNsaWVudCBjYXJlcyBhYm91dCB0cmFja2luZyBhbmQgdGhlXG4gICAgICAgICAqIHVzZXIgaGFzIGV4cGxpY2l0bHkgY2FsbGVkIGEgJ2xpc3RlbicgZm9yIHRoaXMgdGFyZ2V0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGVzZSB0YXJnZXRzIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBzZW50IHRvIG9yIGFja25vd2xlZGdlZCBieSB0aGVcbiAgICAgICAgICogc2VydmVyLiBPbiByZS1lc3RhYmxpc2hpbmcgdGhlIGxpc3RlbiBzdHJlYW0sIHRoZXNlIHRhcmdldHMgc2hvdWxkIGJlIHNlbnRcbiAgICAgICAgICogdG8gdGhlIHNlcnZlci4gVGhlIHRhcmdldHMgcmVtb3ZlZCB3aXRoIHVubGlzdGVucyBhcmUgcmVtb3ZlZCBlYWdlcmx5XG4gICAgICAgICAqIHdpdGhvdXQgd2FpdGluZyBmb3IgY29uZmlybWF0aW9uIGZyb20gdGhlIGxpc3RlbiBzdHJlYW0uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLkF1ID0gbmV3IE1hcCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHNldCBvZiByZWFzb25zIGZvciB3aHkgdGhlIFJlbW90ZVN0b3JlIG1heSBiZSBvZmZsaW5lLiBJZiBlbXB0eSwgdGhlXG4gICAgICAgICAqIFJlbW90ZVN0b3JlIG1heSBzdGFydCBpdHMgbmV0d29yayBjb25uZWN0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudnUgPSBuZXcgU2V0LCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2ZW50IGhhbmRsZXJzIHRoYXQgZ2V0IGNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBPUlRJTkcgTk9URTogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIG9uIHRoZSBXZWIgY2xpZW50IHRvIGNyZWF0ZSB0aGVcbiAgICAgICAgICogdW5kZXJseWluZyBzdHJlYW1zICh0byBzdXBwb3J0IHRyZWUtc2hha2VhYmxlIHN0cmVhbXMpLiBPbiBBbmRyb2lkIGFuZCBpT1MsXG4gICAgICAgICAqIHRoZSBzdHJlYW1zIGFyZSBjcmVhdGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgUmVtb3RlU3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLlJ1ID0gW10sIHRoaXMuUHUgPSBpLCB0aGlzLlB1LllyKCh0ID0+IHtcbiAgICAgICAgICAgIG4uZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFBvcnRpbmcgTm90ZTogVW5saWtlIGlPUywgYHJlc3RhcnROZXR3b3JrKClgIGlzIGNhbGxlZCBldmVuIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV0d29yayBiZWNvbWVzIHVucmVhY2hhYmxlIGFzIHdlIGRvbid0IGhhdmUgYW55IG90aGVyIHdheSB0byB0ZWFyXG4gICAgICAgICAgICAgICAgLy8gZG93biBvdXIgc3RyZWFtcy5cbiAgICAgICAgICAgICAgICBlYyh0aGlzKSAmJiAoTihcIlJlbW90ZVN0b3JlXCIsIFwiUmVzdGFydGluZyBzdHJlYW1zIGZvciBuZXR3b3JrIHJlYWNoYWJpbGl0eSBjaGFuZ2UuXCIpLCBcbiAgICAgICAgICAgICAgICBhd2FpdCBhc3luYyBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBMKHQpO1xuICAgICAgICAgICAgICAgICAgICBlLnZ1LmFkZCg0IC8qIE9mZmxpbmVDYXVzZS5Db25uZWN0aXZpdHlDaGFuZ2UgKi8pLCBhd2FpdCBXdShlKSwgZS5idS5zZXQoXCJVbmtub3duXCIgLyogT25saW5lU3RhdGUuVW5rbm93biAqLyksIFxuICAgICAgICAgICAgICAgICAgICBlLnZ1LmRlbGV0ZSg0IC8qIE9mZmxpbmVDYXVzZS5Db25uZWN0aXZpdHlDaGFuZ2UgKi8pLCBhd2FpdCB6dShlKTtcbiAgICAgICAgICAgICAgICB9KHRoaXMpKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpLCB0aGlzLmJ1ID0gbmV3IFF1KG4sIHMpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24genUodCkge1xuICAgIGlmIChlYyh0KSkgZm9yIChjb25zdCBlIG9mIHQuUnUpIGF3YWl0IGUoLyogZW5hYmxlZD0gKi8gITApO1xufVxuXG4vKipcbiAqIFRlbXBvcmFyaWx5IGRpc2FibGVzIHRoZSBuZXR3b3JrLiBUaGUgbmV0d29yayBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZ1xuICogZW5hYmxlTmV0d29yaygpLlxuICovIGFzeW5jIGZ1bmN0aW9uIFd1KHQpIHtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdC5SdSkgYXdhaXQgZSgvKiBlbmFibGVkPSAqLyAhMSk7XG59XG5cbi8qKlxuICogU3RhcnRzIG5ldyBsaXN0ZW4gZm9yIHRoZSBnaXZlbiB0YXJnZXQuIFVzZXMgcmVzdW1lIHRva2VuIGlmIHByb3ZpZGVkLiBJdFxuICogaXMgYSBuby1vcCBpZiB0aGUgdGFyZ2V0IG9mIGdpdmVuIGBUYXJnZXREYXRhYCBpcyBhbHJlYWR5IGJlaW5nIGxpc3RlbmVkIHRvLlxuICovXG5mdW5jdGlvbiBIdSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCk7XG4gICAgbi5BdS5oYXMoZS50YXJnZXRJZCkgfHwgKFxuICAgIC8vIE1hcmsgdGhpcyBhcyBzb21ldGhpbmcgdGhlIGNsaWVudCBpcyBjdXJyZW50bHkgbGlzdGVuaW5nIGZvci5cbiAgICBuLkF1LnNldChlLnRhcmdldElkLCBlKSwgdGMobikgPyBcbiAgICAvLyBUaGUgbGlzdGVuIHdpbGwgYmUgc2VudCBpbiBvbldhdGNoU3RyZWFtT3BlblxuICAgIFp1KG4pIDogcGMobikuS28oKSAmJiBZdShuLCBlKSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgbGlzdGVuIGZyb20gc2VydmVyLiBJdCBpcyBhIG5vLW9wIGlmIHRoZSBnaXZlbiB0YXJnZXQgaWQgaXNcbiAqIG5vdCBiZWluZyBsaXN0ZW5lZCB0by5cbiAqLyBmdW5jdGlvbiBKdSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCksIHMgPSBwYyhuKTtcbiAgICBuLkF1LmRlbGV0ZShlKSwgcy5LbygpICYmIFh1KG4sIGUpLCAwID09PSBuLkF1LnNpemUgJiYgKHMuS28oKSA/IHMuam8oKSA6IGVjKG4pICYmIFxuICAgIC8vIFJldmVydCB0byBPbmxpbmVTdGF0ZS5Vbmtub3duIGlmIHRoZSB3YXRjaCBzdHJlYW0gaXMgbm90IG9wZW4gYW5kIHdlXG4gICAgLy8gaGF2ZSBubyBsaXN0ZW5lcnMsIHNpbmNlIHdpdGhvdXQgYW55IGxpc3RlbnMgdG8gc2VuZCB3ZSBjYW5ub3RcbiAgICAvLyBjb25maXJtIGlmIHRoZSBzdHJlYW0gaXMgaGVhbHRoeSBhbmQgdXBncmFkZSB0byBPbmxpbmVTdGF0ZS5PbmxpbmUuXG4gICAgbi5idS5zZXQoXCJVbmtub3duXCIgLyogT25saW5lU3RhdGUuVW5rbm93biAqLykpO1xufVxuXG4vKipcbiAqIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBlbmRpbmcgcmVzcG9uc2VzIHdlJ3JlIGR1ZVxuICogZnJvbSB3YXRjaCBzbyB3ZSB3YWl0IGZvciB0aGUgYWNrIHRvIHByb2Nlc3MgYW55IG1lc3NhZ2VzIGZyb20gdGhpcyB0YXJnZXQuXG4gKi8gZnVuY3Rpb24gWXUodCwgZSkge1xuICAgIGlmICh0LlZ1LnF0KGUudGFyZ2V0SWQpLCBlLnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDAgfHwgZS5zbmFwc2hvdFZlcnNpb24uY29tcGFyZVRvKHJ0Lm1pbigpKSA+IDApIHtcbiAgICAgICAgY29uc3QgbiA9IHQucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQoZS50YXJnZXRJZCkuc2l6ZTtcbiAgICAgICAgZSA9IGUud2l0aEV4cGVjdGVkQ291bnQobik7XG4gICAgfVxuICAgIHBjKHQpLnN1KGUpO1xufVxuXG4vKipcbiAqIFdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcGVuZGluZyByZXNwb25zZXMgd2UncmUgZHVlXG4gKiBmcm9tIHdhdGNoIHNvIHdlIHdhaXQgZm9yIHRoZSByZW1vdmFsIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIHdlIHByb2Nlc3MgYW55XG4gKiBtZXNzYWdlcyBmcm9tIHRoaXMgdGFyZ2V0LlxuICovIGZ1bmN0aW9uIFh1KHQsIGUpIHtcbiAgICB0LlZ1LnF0KGUpLCBwYyh0KS5pdShlKTtcbn1cblxuZnVuY3Rpb24gWnUodCkge1xuICAgIHQuVnUgPSBuZXcgRWkoe1xuICAgICAgICBnZXRSZW1vdGVLZXlzRm9yVGFyZ2V0OiBlID0+IHQucmVtb3RlU3luY2VyLmdldFJlbW90ZUtleXNGb3JUYXJnZXQoZSksXG4gICAgICAgIGxlOiBlID0+IHQuQXUuZ2V0KGUpIHx8IG51bGwsXG4gICAgICAgIHVlOiAoKSA9PiB0LmRhdGFzdG9yZS5zZXJpYWxpemVyLmRhdGFiYXNlSWRcbiAgICB9KSwgcGModCkuc3RhcnQoKSwgdC5idS5ndSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgd2F0Y2ggc3RyZWFtIHNob3VsZCBiZSBzdGFydGVkIGJlY2F1c2UgaXQncyBuZWNlc3NhcnlcbiAqIGFuZCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQuXG4gKi8gZnVuY3Rpb24gdGModCkge1xuICAgIHJldHVybiBlYyh0KSAmJiAhcGModCkuVW8oKSAmJiB0LkF1LnNpemUgPiAwO1xufVxuXG5mdW5jdGlvbiBlYyh0KSB7XG4gICAgcmV0dXJuIDAgPT09IEwodCkudnUuc2l6ZTtcbn1cblxuZnVuY3Rpb24gbmModCkge1xuICAgIHQuVnUgPSB2b2lkIDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjKHQpIHtcbiAgICB0LkF1LmZvckVhY2goKChlLCBuKSA9PiB7XG4gICAgICAgIFl1KHQsIGUpO1xuICAgIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaWModCwgZSkge1xuICAgIG5jKHQpLCBcbiAgICAvLyBJZiB3ZSBzdGlsbCBuZWVkIHRoZSB3YXRjaCBzdHJlYW0sIHJldHJ5IHRoZSBjb25uZWN0aW9uLlxuICAgIHRjKHQpID8gKHQuYnUuSXUoZSksIFp1KHQpKSA6IFxuICAgIC8vIE5vIG5lZWQgdG8gcmVzdGFydCB3YXRjaCBzdHJlYW0gYmVjYXVzZSB0aGVyZSBhcmUgbm8gYWN0aXZlIHRhcmdldHMuXG4gICAgLy8gVGhlIG9ubGluZSBzdGF0ZSBpcyBzZXQgdG8gdW5rbm93biBiZWNhdXNlIHRoZXJlIGlzIG5vIGFjdGl2ZSBhdHRlbXB0XG4gICAgLy8gYXQgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvblxuICAgIHQuYnUuc2V0KFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByYyh0LCBlLCBuKSB7XG4gICAgaWYgKFxuICAgIC8vIE1hcmsgdGhlIGNsaWVudCBhcyBvbmxpbmUgc2luY2Ugd2UgZ290IGEgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICB0LmJ1LnNldChcIk9ubGluZVwiIC8qIE9ubGluZVN0YXRlLk9ubGluZSAqLyksIGUgaW5zdGFuY2VvZiBJaSAmJiAyIC8qIFdhdGNoVGFyZ2V0Q2hhbmdlU3RhdGUuUmVtb3ZlZCAqLyA9PT0gZS5zdGF0ZSAmJiBlLmNhdXNlKSBcbiAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3Igb24gYSB0YXJnZXQsIGRvbid0IHdhaXQgZm9yIGEgY29uc2lzdGVudCBzbmFwc2hvdFxuICAgIC8vIHRvIHJhaXNlIGV2ZW50c1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFxuICAgICAgICAvKiogSGFuZGxlcyBhbiBlcnJvciBvbiBhIHRhcmdldCAqL1xuICAgICAgICBhc3luYyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gZS5jYXVzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBlLnRhcmdldElkcykgXG4gICAgICAgICAgICAvLyBBIHdhdGNoZWQgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIGFscmVhZHkuXG4gICAgICAgICAgICB0LkF1LmhhcyhzKSAmJiAoYXdhaXQgdC5yZW1vdGVTeW5jZXIucmVqZWN0TGlzdGVuKHMsIG4pLCB0LkF1LmRlbGV0ZShzKSwgdC5WdS5yZW1vdmVUYXJnZXQocykpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQXR0ZW1wdHMgdG8gZmlsbCBvdXIgd3JpdGUgcGlwZWxpbmUgd2l0aCB3cml0ZXMgZnJvbSB0aGUgTG9jYWxTdG9yZS5cbiAqXG4gKiBDYWxsZWQgaW50ZXJuYWxseSB0byBib290c3RyYXAgb3IgcmVmaWxsIHRoZSB3cml0ZSBwaXBlbGluZSBhbmQgYnlcbiAqIFN5bmNFbmdpbmUgd2hlbmV2ZXIgdGhlcmUgYXJlIG5ldyBtdXRhdGlvbnMgdG8gcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdyaXRlIHN0cmVhbSBpZiBuZWNlc3NhcnkuXG4gKi8gKHQsIGUpO1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgTihcIlJlbW90ZVN0b3JlXCIsIFwiRmFpbGVkIHRvIHJlbW92ZSB0YXJnZXRzICVzOiAlcyBcIiwgZS50YXJnZXRJZHMuam9pbihcIixcIiksIG4pLCBcbiAgICAgICAgYXdhaXQgb2ModCwgbik7XG4gICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgeWkgPyB0LlZ1Lkh0KGUpIDogZSBpbnN0YW5jZW9mIHBpID8gdC5WdS5uZShlKSA6IHQuVnUuWHQoZSksIFxuICAgICFuLmlzRXF1YWwocnQubWluKCkpKSB0cnkge1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgb3UodC5sb2NhbFN0b3JlKTtcbiAgICAgICAgbi5jb21wYXJlVG8oZSkgPj0gMCAmJiBcbiAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIHRhcmdldCBjaGFuZ2Ugd2l0aCBhIGdsb2JhbCBzbmFwc2hvdCBpZiB0aGUgc25hcHNob3RcbiAgICAgICAgLy8gdmVyc2lvbiBpcyBub3QgZXF1YWwgdG8gU25hcHNob3RWZXJzaW9uLm1pbigpLlxuICAgICAgICBhd2FpdCBcbiAgICAgICAgLyoqXG4gKiBUYWtlcyBhIGJhdGNoIG9mIGNoYW5nZXMgZnJvbSB0aGUgRGF0YXN0b3JlLCByZXBhY2thZ2VzIHRoZW0gYXMgYVxuICogUmVtb3RlRXZlbnQsIGFuZCBwYXNzZXMgdGhhdCBvbiB0byB0aGUgbGlzdGVuZXIsIHdoaWNoIGlzIHR5cGljYWxseSB0aGVcbiAqIFN5bmNFbmdpbmUuXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuVnUuY2UoZSk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgaW4tbWVtb3J5IHJlc3VtZSB0b2tlbnMuIExvY2FsU3RvcmUgd2lsbCB1cGRhdGUgdGhlXG4gICAgICAgICAgICAvLyBwZXJzaXN0ZW50IHZpZXcgb2YgdGhlc2Ugd2hlbiBhcHBseWluZyB0aGUgY29tcGxldGVkIFJlbW90ZUV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udGFyZ2V0Q2hhbmdlcy5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLnJlc3VtZVRva2VuLmFwcHJveGltYXRlQnl0ZVNpemUoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuQXUuZ2V0KHMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIHdhdGNoZWQgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkIGFscmVhZHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0LkF1LnNldChzLCBpLndpdGhSZXN1bWVUb2tlbihuLnJlc3VtZVRva2VuLCBlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpLCBcbiAgICAgICAgICAgIC8vIFJlLWVzdGFibGlzaCBsaXN0ZW5zIGZvciB0aGUgdGFyZ2V0cyB0aGF0IGhhdmUgYmVlbiBpbnZhbGlkYXRlZCBieVxuICAgICAgICAgICAgLy8gZXhpc3RlbmNlIGZpbHRlciBtaXNtYXRjaGVzLlxuICAgICAgICAgICAgbi50YXJnZXRNaXNtYXRjaGVzLmZvckVhY2goKChlLCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IHQuQXUuZ2V0KGUpO1xuICAgICAgICAgICAgICAgIGlmICghcykgXG4gICAgICAgICAgICAgICAgLy8gQSB3YXRjaGVkIHRhcmdldCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCBhbHJlYWR5LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgcmVzdW1lIHRva2VuIGZvciB0aGUgdGFyZ2V0LCBzaW5jZSB3ZSdyZSBpbiBhIGtub3duIG1pc21hdGNoXG4gICAgICAgICAgICAgICAgLy8gc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuQXUuc2V0KGUsIHMud2l0aFJlc3VtZVRva2VuKFZlLkVNUFRZX0JZVEVfU1RSSU5HLCBzLnNuYXBzaG90VmVyc2lvbikpLCBcbiAgICAgICAgICAgICAgICAvLyBDYXVzZSBhIGhhcmQgcmVzZXQgYnkgdW53YXRjaGluZyBhbmQgcmV3YXRjaGluZyBpbW1lZGlhdGVseSwgYnV0XG4gICAgICAgICAgICAgICAgLy8gZGVsaWJlcmF0ZWx5IGRvbid0IHNlbmQgYSByZXN1bWUgdG9rZW4gc28gdGhhdCB3ZSBnZXQgYSBmdWxsIHVwZGF0ZS5cbiAgICAgICAgICAgICAgICBYdSh0LCBlKTtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSB0YXJnZXQgd2Ugc2VuZCBhcyBiZWluZyBvbiBiZWhhbGYgb2YgYW4gZXhpc3RlbmNlIGZpbHRlclxuICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoLCBidXQgZG9uJ3QgYWN0dWFsbHkgcmV0YWluIHRoYXQgaW4gbGlzdGVuVGFyZ2V0cy4gVGhpcyBlbnN1cmVzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBmbGFnIHRoZSBmaXJzdCByZS1saXN0ZW4gdGhpcyB3YXkgd2l0aG91dCBpbXBhY3RpbmcgZnV0dXJlXG4gICAgICAgICAgICAgICAgLy8gbGlzdGVucyBvZiB0aGlzIHRhcmdldCAodGhhdCBtaWdodCBoYXBwZW4gZS5nLiBvbiByZWNvbm5lY3QpLlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgY3Iocy50YXJnZXQsIGUsIG4sIHMuc2VxdWVuY2VOdW1iZXIpO1xuICAgICAgICAgICAgICAgIFl1KHQsIGkpO1xuICAgICAgICAgICAgfSkpLCB0LnJlbW90ZVN5bmNlci5hcHBseVJlbW90ZUV2ZW50KG4pO1xuICAgICAgICB9KHQsIG4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgTihcIlJlbW90ZVN0b3JlXCIsIFwiRmFpbGVkIHRvIHJhaXNlIHNuYXBzaG90OlwiLCBlKSwgYXdhaXQgb2ModCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlY292ZXJ5IGxvZ2ljIGZvciBJbmRleGVkREIgZXJyb3JzIHRoYXQgdGFrZXMgdGhlIG5ldHdvcmsgb2ZmbGluZSB1bnRpbFxuICogYG9wYCBzdWNjZWVkcy4gUmV0cmllcyBhcmUgc2NoZWR1bGVkIHdpdGggYmFja29mZiB1c2luZ1xuICogYGVucXVldWVSZXRyeWFibGUoKWAuIElmIGBvcCgpYCBpcyBub3QgcHJvdmlkZWQsIEluZGV4ZWREQiBhY2Nlc3MgaXNcbiAqIHZhbGlkYXRlZCB2aWEgYSBnZW5lcmljIG9wZXJhdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgUHJvbWlzZSBpcyByZXNvbHZlZCBvbmNlIHRoZSBuZXR3b3JrIGlzIGRpc2FibGVkIGFuZCBiZWZvcmVcbiAqIGFueSByZXRyeSBhdHRlbXB0LlxuICovIGFzeW5jIGZ1bmN0aW9uIG9jKHQsIGUsIG4pIHtcbiAgICBpZiAoIUR0KGUpKSB0aHJvdyBlO1xuICAgIHQudnUuYWRkKDEgLyogT2ZmbGluZUNhdXNlLkluZGV4ZWREYkZhaWxlZCAqLyksIFxuICAgIC8vIERpc2FibGUgbmV0d29yayBhbmQgcmFpc2Ugb2ZmbGluZSBzbmFwc2hvdHNcbiAgICBhd2FpdCBXdSh0KSwgdC5idS5zZXQoXCJPZmZsaW5lXCIgLyogT25saW5lU3RhdGUuT2ZmbGluZSAqLyksIG4gfHwgKFxuICAgIC8vIFVzZSBhIHNpbXBsZSByZWFkIG9wZXJhdGlvbiB0byBkZXRlcm1pbmUgaWYgSW5kZXhlZERCIHJlY292ZXJlZC5cbiAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBleHBvc2UgYSBoZWFsdGggY2hlY2sgZGlyZWN0bHkgb24gU2ltcGxlRGIsIGJ1dFxuICAgIC8vIFJlbW90ZVN0b3JlIG9ubHkgaGFzIGFjY2VzcyB0byBwZXJzaXN0ZW5jZSB0aHJvdWdoIExvY2FsU3RvcmUuXG4gICAgbiA9ICgpID0+IG91KHQubG9jYWxTdG9yZSkpLCBcbiAgICAvLyBQcm9iZSBJbmRleGVkREIgcGVyaW9kaWNhbGx5IGFuZCByZS1lbmFibGUgbmV0d29ya1xuICAgIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlUmV0cnlhYmxlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIE4oXCJSZW1vdGVTdG9yZVwiLCBcIlJldHJ5aW5nIEluZGV4ZWREQiBhY2Nlc3NcIiksIGF3YWl0IG4oKSwgdC52dS5kZWxldGUoMSAvKiBPZmZsaW5lQ2F1c2UuSW5kZXhlZERiRmFpbGVkICovKSwgXG4gICAgICAgIGF3YWl0IHp1KHQpO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBgb3BgLiBJZiBgb3BgIGZhaWxzLCB0YWtlcyB0aGUgbmV0d29yayBvZmZsaW5lIHVudGlsIGBvcGBcbiAqIHN1Y2NlZWRzLiBSZXR1cm5zIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LlxuICovIGZ1bmN0aW9uIHVjKHQsIGUpIHtcbiAgICByZXR1cm4gZSgpLmNhdGNoKChuID0+IG9jKHQsIG4sIGUpKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNjKHQpIHtcbiAgICBjb25zdCBlID0gTCh0KSwgbiA9IEljKGUpO1xuICAgIGxldCBzID0gZS5FdS5sZW5ndGggPiAwID8gZS5FdVtlLkV1Lmxlbmd0aCAtIDFdLmJhdGNoSWQgOiAtMTtcbiAgICBmb3IgKDthYyhlKTsgKSB0cnkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgYXUoZS5sb2NhbFN0b3JlLCBzKTtcbiAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIDAgPT09IGUuRXUubGVuZ3RoICYmIG4uam8oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHMgPSB0LmJhdGNoSWQsIGhjKGUsIHQpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgYXdhaXQgb2MoZSwgdCk7XG4gICAgfVxuICAgIGxjKGUpICYmIGZjKGUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB3ZSBjYW4gYWRkIHRvIHRoZSB3cml0ZSBwaXBlbGluZSAoaS5lLiB0aGUgbmV0d29yayBpc1xuICogZW5hYmxlZCBhbmQgdGhlIHdyaXRlIHBpcGVsaW5lIGlzIG5vdCBmdWxsKS5cbiAqLyBmdW5jdGlvbiBhYyh0KSB7XG4gICAgcmV0dXJuIGVjKHQpICYmIHQuRXUubGVuZ3RoIDwgMTA7XG59XG5cbi8qKlxuICogUXVldWVzIGFkZGl0aW9uYWwgd3JpdGVzIHRvIGJlIHNlbnQgdG8gdGhlIHdyaXRlIHN0cmVhbSwgc2VuZGluZyB0aGVtXG4gKiBpbW1lZGlhdGVseSBpZiB0aGUgd3JpdGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkLlxuICovIGZ1bmN0aW9uIGhjKHQsIGUpIHtcbiAgICB0LkV1LnB1c2goZSk7XG4gICAgY29uc3QgbiA9IEljKHQpO1xuICAgIG4uS28oKSAmJiBuLm91ICYmIG4udXUoZS5tdXRhdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBsYyh0KSB7XG4gICAgcmV0dXJuIGVjKHQpICYmICFJYyh0KS5VbygpICYmIHQuRXUubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmModCkge1xuICAgIEljKHQpLnN0YXJ0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRjKHQpIHtcbiAgICBJYyh0KS5odSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3Yyh0KSB7XG4gICAgY29uc3QgZSA9IEljKHQpO1xuICAgIC8vIFNlbmQgdGhlIHdyaXRlIHBpcGVsaW5lIG5vdyB0aGF0IHRoZSBzdHJlYW0gaXMgZXN0YWJsaXNoZWQuXG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LkV1KSBlLnV1KG4ubXV0YXRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gX2ModCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSB0LkV1LnNoaWZ0KCksIGkgPSB0aS5mcm9tKHMsIGUsIG4pO1xuICAgIGF3YWl0IHVjKHQsICgoKSA9PiB0LnJlbW90ZVN5bmNlci5hcHBseVN1Y2Nlc3NmdWxXcml0ZShpKSkpLCBcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2l0aCB0aGUgY29tcGxldGlvbiBvZiB0aGlzIG11dGF0aW9uIGFub3RoZXJcbiAgICAvLyBzbG90IGhhcyBmcmVlZCB1cC5cbiAgICBhd2FpdCBjYyh0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWModCwgZSkge1xuICAgIC8vIElmIHRoZSB3cml0ZSBzdHJlYW0gY2xvc2VkIGFmdGVyIHRoZSB3cml0ZSBoYW5kc2hha2UgY29tcGxldGVzLCBhIHdyaXRlXG4gICAgLy8gb3BlcmF0aW9uIGZhaWxlZCBhbmQgd2UgZmFpbCB0aGUgcGVuZGluZyBvcGVyYXRpb24uXG4gICAgZSAmJiBJYyh0KS5vdSAmJiBcbiAgICAvLyBUaGlzIGVycm9yIGFmZmVjdHMgdGhlIGFjdHVhbCB3cml0ZS5cbiAgICBhd2FpdCBhc3luYyBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIE9ubHkgaGFuZGxlIHBlcm1hbmVudCBlcnJvcnMgaGVyZS4gSWYgaXQncyB0cmFuc2llbnQsIGp1c3QgbGV0IHRoZSByZXRyeVxuICAgICAgICAvLyBsb2dpYyBraWNrIGluLlxuICAgICAgICBpZiAobiA9IGUuY29kZSwgb2kobikgJiYgbiAhPT0gcS5BQk9SVEVEKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHdhcyBhIHBlcm1hbmVudCBlcnJvciwgdGhlIHJlcXVlc3QgaXRzZWxmIHdhcyB0aGUgcHJvYmxlbVxuICAgICAgICAgICAgLy8gc28gaXQncyBub3QgZ29pbmcgdG8gc3VjY2VlZCBpZiB3ZSByZXNlbmQgaXQuXG4gICAgICAgICAgICBjb25zdCBuID0gdC5FdS5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGl0J3MgYWxzbyB1bmxpa2VseSB0aGF0IHRoZSBzZXJ2ZXIgaXRzZWxmIGlzIG1lbHRpbmdcbiAgICAgICAgICAgIC8vIGRvd24gLS0gdGhpcyB3YXMganVzdCBhIGJhZCByZXF1ZXN0IHNvIGluaGliaXQgYmFja29mZiBvbiB0aGUgbmV4dFxuICAgICAgICAgICAgLy8gcmVzdGFydC5cbiAgICAgICAgICAgICAgICAgICAgICAgIEljKHQpLlFvKCksIGF3YWl0IHVjKHQsICgoKSA9PiB0LnJlbW90ZVN5bmNlci5yZWplY3RGYWlsZWRXcml0ZShuLmJhdGNoSWQsIGUpKSksIFxuICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdpdGggdGhlIGNvbXBsZXRpb24gb2YgdGhpcyBtdXRhdGlvblxuICAgICAgICAgICAgLy8gYW5vdGhlciBzbG90IGhhcyBmcmVlZCB1cC5cbiAgICAgICAgICAgIGF3YWl0IGNjKHQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuO1xuICAgIH0odCwgZSksIFxuICAgIC8vIFRoZSB3cml0ZSBzdHJlYW0gbWlnaHQgaGF2ZSBiZWVuIHN0YXJ0ZWQgYnkgcmVmaWxsaW5nIHRoZSB3cml0ZVxuICAgIC8vIHBpcGVsaW5lIGZvciBmYWlsZWQgd3JpdGVzXG4gICAgbGModCkgJiYgZmModCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICBuLmFzeW5jUXVldWUudmVyaWZ5T3BlcmF0aW9uSW5Qcm9ncmVzcygpLCBOKFwiUmVtb3RlU3RvcmVcIiwgXCJSZW1vdGVTdG9yZSByZWNlaXZlZCBuZXcgY3JlZGVudGlhbHNcIik7XG4gICAgY29uc3QgcyA9IGVjKG4pO1xuICAgIC8vIFRlYXIgZG93biBhbmQgcmUtY3JlYXRlIG91ciBuZXR3b3JrIHN0cmVhbXMuIFRoaXMgd2lsbCBlbnN1cmUgd2UgZ2V0IGFcbiAgICAvLyBmcmVzaCBhdXRoIHRva2VuIGZvciB0aGUgbmV3IHVzZXIgYW5kIHJlLWZpbGwgdGhlIHdyaXRlIHBpcGVsaW5lIHdpdGhcbiAgICAvLyBuZXcgbXV0YXRpb25zIGZyb20gdGhlIExvY2FsU3RvcmUgKHNpbmNlIG11dGF0aW9ucyBhcmUgcGVyLXVzZXIpLlxuICAgICAgICBuLnZ1LmFkZCgzIC8qIE9mZmxpbmVDYXVzZS5DcmVkZW50aWFsQ2hhbmdlICovKSwgYXdhaXQgV3UobiksIHMgJiYgXG4gICAgLy8gRG9uJ3Qgc2V0IHRoZSBuZXR3b3JrIHN0YXR1cyB0byBVbmtub3duIGlmIHdlIGFyZSBvZmZsaW5lLlxuICAgIG4uYnUuc2V0KFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8pLCBhd2FpdCBuLnJlbW90ZVN5bmNlci5oYW5kbGVDcmVkZW50aWFsQ2hhbmdlKGUpLCBcbiAgICBuLnZ1LmRlbGV0ZSgzIC8qIE9mZmxpbmVDYXVzZS5DcmVkZW50aWFsQ2hhbmdlICovKSwgYXdhaXQgenUobik7XG59XG5cbi8qKlxuICogVG9nZ2xlcyB0aGUgbmV0d29yayBzdGF0ZSB3aGVuIHRoZSBjbGllbnQgZ2FpbnMgb3IgbG9zZXMgaXRzIHByaW1hcnkgbGVhc2UuXG4gKi8gYXN5bmMgZnVuY3Rpb24geWModCwgZSkge1xuICAgIGNvbnN0IG4gPSBMKHQpO1xuICAgIGUgPyAobi52dS5kZWxldGUoMiAvKiBPZmZsaW5lQ2F1c2UuSXNTZWNvbmRhcnkgKi8pLCBhd2FpdCB6dShuKSkgOiBlIHx8IChuLnZ1LmFkZCgyIC8qIE9mZmxpbmVDYXVzZS5Jc1NlY29uZGFyeSAqLyksIFxuICAgIGF3YWl0IFd1KG4pLCBuLmJ1LnNldChcIlVua25vd25cIiAvKiBPbmxpbmVTdGF0ZS5Vbmtub3duICovKSk7XG59XG5cbi8qKlxuICogSWYgbm90IHlldCBpbml0aWFsaXplZCwgcmVnaXN0ZXJzIHRoZSBXYXRjaFN0cmVhbSBhbmQgaXRzIG5ldHdvcmsgc3RhdGVcbiAqIGNhbGxiYWNrIHdpdGggYHJlbW90ZVN0b3JlSW1wbGAuIFJldHVybnMgdGhlIGV4aXN0aW5nIHN0cmVhbSBpZiBvbmUgaXNcbiAqIGFscmVhZHkgYXZhaWxhYmxlLlxuICpcbiAqIFBPUlRJTkcgTk9URTogT24gaU9TIGFuZCBBbmRyb2lkLCB0aGUgV2F0Y2hTdHJlYW0gZ2V0cyByZWdpc3RlcmVkIG9uIHN0YXJ0dXAuXG4gKiBUaGlzIGlzIG5vdCBkb25lIG9uIFdlYiB0byBhbGxvdyBpdCB0byBiZSB0cmVlLXNoYWtlbi5cbiAqLyBmdW5jdGlvbiBwYyh0KSB7XG4gICAgcmV0dXJuIHQuU3UgfHwgKFxuICAgIC8vIENyZWF0ZSBzdHJlYW0gKGJ1dCBub3RlIHRoYXQgaXQgaXMgbm90IHN0YXJ0ZWQgeWV0KS5cbiAgICB0LlN1ID0gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gTCh0KTtcbiAgICAgICAgcmV0dXJuIHMuZnUoKSwgbmV3IHF1KGUsIHMuY29ubmVjdGlvbiwgcy5hdXRoQ3JlZGVudGlhbHMsIHMuYXBwQ2hlY2tDcmVkZW50aWFscywgcy5zZXJpYWxpemVyLCBuKTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi8gKHQuZGF0YXN0b3JlLCB0LmFzeW5jUXVldWUsIHtcbiAgICAgICAgdW86IHNjLmJpbmQobnVsbCwgdCksXG4gICAgICAgIGFvOiBpYy5iaW5kKG51bGwsIHQpLFxuICAgICAgICBudTogcmMuYmluZChudWxsLCB0KVxuICAgIH0pLCB0LlJ1LnB1c2goKGFzeW5jIGUgPT4ge1xuICAgICAgICBlID8gKHQuU3UuUW8oKSwgdGModCkgPyBadSh0KSA6IHQuYnUuc2V0KFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8pKSA6IChhd2FpdCB0LlN1LnN0b3AoKSwgXG4gICAgICAgIG5jKHQpKTtcbiAgICB9KSkpLCB0LlN1O1xufVxuXG4vKipcbiAqIElmIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIHJlZ2lzdGVycyB0aGUgV3JpdGVTdHJlYW0gYW5kIGl0cyBuZXR3b3JrIHN0YXRlXG4gKiBjYWxsYmFjayB3aXRoIGByZW1vdGVTdG9yZUltcGxgLiBSZXR1cm5zIHRoZSBleGlzdGluZyBzdHJlYW0gaWYgb25lIGlzXG4gKiBhbHJlYWR5IGF2YWlsYWJsZS5cbiAqXG4gKiBQT1JUSU5HIE5PVEU6IE9uIGlPUyBhbmQgQW5kcm9pZCwgdGhlIFdyaXRlU3RyZWFtIGdldHMgcmVnaXN0ZXJlZCBvbiBzdGFydHVwLlxuICogVGhpcyBpcyBub3QgZG9uZSBvbiBXZWIgdG8gYWxsb3cgaXQgdG8gYmUgdHJlZS1zaGFrZW4uXG4gKi8gZnVuY3Rpb24gSWModCkge1xuICAgIHJldHVybiB0LkR1IHx8IChcbiAgICAvLyBDcmVhdGUgc3RyZWFtIChidXQgbm90ZSB0aGF0IGl0IGlzIG5vdCBzdGFydGVkIHlldCkuXG4gICAgdC5EdSA9IGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgcyA9IEwodCk7XG4gICAgICAgIHJldHVybiBzLmZ1KCksIG5ldyBVdShlLCBzLmNvbm5lY3Rpb24sIHMuYXV0aENyZWRlbnRpYWxzLCBzLmFwcENoZWNrQ3JlZGVudGlhbHMsIHMuc2VyaWFsaXplciwgbik7XG4gICAgfSh0LmRhdGFzdG9yZSwgdC5hc3luY1F1ZXVlLCB7XG4gICAgICAgIHVvOiBkYy5iaW5kKG51bGwsIHQpLFxuICAgICAgICBhbzogbWMuYmluZChudWxsLCB0KSxcbiAgICAgICAgYXU6IHdjLmJpbmQobnVsbCwgdCksXG4gICAgICAgIGN1OiBfYy5iaW5kKG51bGwsIHQpXG4gICAgfSksIHQuUnUucHVzaCgoYXN5bmMgZSA9PiB7XG4gICAgICAgIGUgPyAodC5EdS5RbygpLCBcbiAgICAgICAgLy8gVGhpcyB3aWxsIHN0YXJ0IHRoZSB3cml0ZSBzdHJlYW0gaWYgbmVjZXNzYXJ5LlxuICAgICAgICBhd2FpdCBjYyh0KSkgOiAoYXdhaXQgdC5EdS5zdG9wKCksIHQuRXUubGVuZ3RoID4gMCAmJiAoTihcIlJlbW90ZVN0b3JlXCIsIGBTdG9wcGluZyB3cml0ZSBzdHJlYW0gd2l0aCAke3QuRXUubGVuZ3RofSBwZW5kaW5nIHdyaXRlc2ApLCBcbiAgICAgICAgdC5FdSA9IFtdKSk7XG4gICAgfSkpKSwgdC5EdTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVyYXRpb24gc2NoZWR1bGVkIHRvIGJlIHJ1biBpbiB0aGUgZnV0dXJlIG9uIGFuIEFzeW5jUXVldWUuXG4gKlxuICogSXQgaXMgY3JlYXRlZCB2aWEgRGVsYXllZE9wZXJhdGlvbi5jcmVhdGVBbmRTY2hlZHVsZSgpLlxuICpcbiAqIFN1cHBvcnRzIGNhbmNlbGxhdGlvbiAodmlhIGNhbmNlbCgpKSBhbmQgZWFybHkgZXhlY3V0aW9uICh2aWEgc2tpcERlbGF5KCkpLlxuICpcbiAqIE5vdGU6IFdlIGltcGxlbWVudCBgUHJvbWlzZUxpa2VgIGluc3RlYWQgb2YgYFByb21pc2VgLCBhcyB0aGUgYFByb21pc2VgIHR5cGVcbiAqIGluIG5ld2VyIHZlcnNpb25zIG9mIFR5cGVTY3JpcHQgZGVmaW5lcyBgZmluYWxseWAsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW5cbiAqIElFLlxuICovXG5jbGFzcyBUYyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSkge1xuICAgICAgICB0aGlzLmFzeW5jUXVldWUgPSB0LCB0aGlzLnRpbWVySWQgPSBlLCB0aGlzLnRhcmdldFRpbWVNcyA9IG4sIHRoaXMub3AgPSBzLCB0aGlzLnJlbW92YWxDYWxsYmFjayA9IGksIFxuICAgICAgICB0aGlzLmRlZmVycmVkID0gbmV3IEssIHRoaXMudGhlbiA9IHRoaXMuZGVmZXJyZWQucHJvbWlzZS50aGVuLmJpbmQodGhpcy5kZWZlcnJlZC5wcm9taXNlKSwgXG4gICAgICAgIC8vIEl0J3Mgbm9ybWFsIGZvciB0aGUgZGVmZXJyZWQgcHJvbWlzZSB0byBiZSBjYW5jZWxlZCAoZHVlIHRvIGNhbmNlbGxhdGlvbilcbiAgICAgICAgLy8gYW5kIHNvIHdlIGF0dGFjaCBhIGR1bW15IGNhdGNoIGNhbGxiYWNrIHRvIGF2b2lkXG4gICAgICAgIC8vICdVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZycgbG9nIHNwYW0uXG4gICAgICAgIHRoaXMuZGVmZXJyZWQucHJvbWlzZS5jYXRjaCgodCA9PiB7fSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgRGVsYXllZE9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBiZVxuICAgICAqIGV4ZWN1dGVkIG9uIHRoZSBwcm92aWRlZCBhc3luY1F1ZXVlIGFmdGVyIHRoZSBwcm92aWRlZCBkZWxheU1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFzeW5jUXVldWUgLSBUaGUgcXVldWUgdG8gc2NoZWR1bGUgdGhlIG9wZXJhdGlvbiBvbi5cbiAgICAgKiBAcGFyYW0gaWQgLSBBIFRpbWVyIElEIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGlzIGlzLlxuICAgICAqIEBwYXJhbSBkZWxheU1zIC0gVGhlIGRlbGF5IChtcykgYmVmb3JlIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHNjaGVkdWxlZC5cbiAgICAgKiBAcGFyYW0gb3AgLSBUaGUgb3BlcmF0aW9uIHRvIHJ1bi5cbiAgICAgKiBAcGFyYW0gcmVtb3ZhbENhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgc3luY2hyb25vdXNseSBvbmNlIHRoZVxuICAgICAqICAgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIG9yIGNhbmNlbGVkLCBub3RpZnlpbmcgdGhlIEFzeW5jUXVldWUgdG8gcmVtb3ZlIGl0XG4gICAgICogICBmcm9tIGl0cyBkZWxheWVkT3BlcmF0aW9ucyBsaXN0LlxuICAgICAqICAgUE9SVElORyBOT1RFOiBUaGlzIGV4aXN0cyB0byBwcmV2ZW50IG1ha2luZyByZW1vdmVEZWxheWVkT3BlcmF0aW9uKCkgYW5kXG4gICAgICogICB0aGUgRGVsYXllZE9wZXJhdGlvbiBjbGFzcyBwdWJsaWMuXG4gICAgICovICAgIHN0YXRpYyBjcmVhdGVBbmRTY2hlZHVsZSh0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBEYXRlLm5vdygpICsgbiwgbyA9IG5ldyBUYyh0LCBlLCByLCBzLCBpKTtcbiAgICAgICAgcmV0dXJuIG8uc3RhcnQobiksIG87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGltZXIuIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbiBieVxuICAgICAqIGNyZWF0ZUFuZFNjaGVkdWxlKCkuXG4gICAgICovICAgIHN0YXJ0KHQpIHtcbiAgICAgICAgdGhpcy50aW1lckhhbmRsZSA9IHNldFRpbWVvdXQoKCgpID0+IHRoaXMuaGFuZGxlRGVsYXlFbGFwc2VkKCkpLCB0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVldWVzIHRoZSBvcGVyYXRpb24gdG8gcnVuIGltbWVkaWF0ZWx5IChpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJ1biBvclxuICAgICAqIGNhbmNlbGVkKS5cbiAgICAgKi8gICAgc2tpcERlbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVEZWxheUVsYXBzZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgb3BlcmF0aW9uIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgb3IgY2FuY2VsZWQuIFRoZVxuICAgICAqIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICAgKlxuICAgICAqIEFzIGxvbmcgYXMgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJ1biwgY2FsbGluZyBjYW5jZWwoKSBwcm92aWRlcyBhXG4gICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBydW4uXG4gICAgICovICAgIGNhbmNlbCh0KSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMuY2xlYXJUaW1lb3V0KCksIHRoaXMuZGVmZXJyZWQucmVqZWN0KG5ldyBVKHEuQ0FOQ0VMTEVELCBcIk9wZXJhdGlvbiBjYW5jZWxsZWRcIiArICh0ID8gXCI6IFwiICsgdCA6IFwiXCIpKSkpO1xuICAgIH1cbiAgICBoYW5kbGVEZWxheUVsYXBzZWQoKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBudWxsICE9PSB0aGlzLnRpbWVySGFuZGxlID8gKHRoaXMuY2xlYXJUaW1lb3V0KCksIFxuICAgICAgICB0aGlzLm9wKCkudGhlbigodCA9PiB0aGlzLmRlZmVycmVkLnJlc29sdmUodCkpKSkgOiBQcm9taXNlLnJlc29sdmUoKSkpO1xuICAgIH1cbiAgICBjbGVhclRpbWVvdXQoKSB7XG4gICAgICAgIG51bGwgIT09IHRoaXMudGltZXJIYW5kbGUgJiYgKHRoaXMucmVtb3ZhbENhbGxiYWNrKHRoaXMpLCBjbGVhclRpbWVvdXQodGhpcy50aW1lckhhbmRsZSksIFxuICAgICAgICB0aGlzLnRpbWVySGFuZGxlID0gbnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBGaXJlc3RvcmVFcnJvciB0aGF0IGNhbiBiZSBzdXJmYWNlZCB0byB0aGUgdXNlciBpZiB0aGUgcHJvdmlkZWRcbiAqIGVycm9yIGlzIGFuIEluZGV4ZWREYlRyYW5zYWN0aW9uRXJyb3IuIFJlLXRocm93cyB0aGUgZXJyb3Igb3RoZXJ3aXNlLlxuICovIGZ1bmN0aW9uIEVjKHQsIGUpIHtcbiAgICBpZiAoayhcIkFzeW5jUXVldWVcIiwgYCR7ZX06ICR7dH1gKSwgRHQodCkpIHJldHVybiBuZXcgVShxLlVOQVZBSUxBQkxFLCBgJHtlfTogJHt0fWApO1xuICAgIHRocm93IHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIERvY3VtZW50U2V0IGlzIGFuIGltbXV0YWJsZSAoY29weS1vbi13cml0ZSkgY29sbGVjdGlvbiB0aGF0IGhvbGRzIGRvY3VtZW50c1xuICogaW4gb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBwcm92aWRlZCBjb21wYXJhdG9yLiBXZSBhbHdheXMgYWRkIGEgZG9jdW1lbnQga2V5XG4gKiBjb21wYXJhdG9yIG9uIHRvcCBvZiB3aGF0IGlzIHByb3ZpZGVkIHRvIGd1YXJhbnRlZSBkb2N1bWVudCBlcXVhbGl0eSBiYXNlZCBvblxuICogdGhlIGtleS5cbiAqLyBjbGFzcyBBYyB7XG4gICAgLyoqIFRoZSBkZWZhdWx0IG9yZGVyaW5nIGlzIGJ5IGtleSBpZiB0aGUgY29tcGFyYXRvciBpcyBvbWl0dGVkICovXG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAvLyBXZSBhcmUgYWRkaW5nIGRvY3VtZW50IGtleSBjb21wYXJhdG9yIHRvIHRoZSBlbmQgYXMgaXQncyB0aGUgb25seVxuICAgICAgICAvLyBndWFyYW50ZWVkIHVuaXF1ZSBwcm9wZXJ0eSBvZiBhIGRvY3VtZW50LlxuICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSB0ID8gKGUsIG4pID0+IHQoZSwgbikgfHwgaHQuY29tcGFyYXRvcihlLmtleSwgbi5rZXkpIDogKHQsIGUpID0+IGh0LmNvbXBhcmF0b3IodC5rZXksIGUua2V5KSwgXG4gICAgICAgIHRoaXMua2V5ZWRNYXAgPSBocygpLCB0aGlzLnNvcnRlZFNldCA9IG5ldyBwZSh0aGlzLmNvbXBhcmF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGNvcHkgb2YgdGhlIGV4aXN0aW5nIERvY3VtZW50U2V0LCB1c2luZyB0aGUgc2FtZVxuICAgICAqIGNvbXBhcmF0b3IuXG4gICAgICovICAgIHN0YXRpYyBlbXB0eVNldCh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQWModC5jb21wYXJhdG9yKTtcbiAgICB9XG4gICAgaGFzKHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT0gdGhpcy5rZXllZE1hcC5nZXQodCk7XG4gICAgfVxuICAgIGdldCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleWVkTWFwLmdldCh0KTtcbiAgICB9XG4gICAgZmlyc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5taW5LZXkoKTtcbiAgICB9XG4gICAgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkU2V0Lm1heEtleSgpO1xuICAgIH1cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRTZXQuaXNFbXB0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJvdmlkZWQga2V5IGluIHRoZSBkb2N1bWVudCBzZXQsIG9yIC0xIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgc2V0O1xuICAgICAqLyAgICBpbmRleE9mKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMua2V5ZWRNYXAuZ2V0KHQpO1xuICAgICAgICByZXR1cm4gZSA/IHRoaXMuc29ydGVkU2V0LmluZGV4T2YoZSkgOiAtMTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRlZFNldC5zaXplO1xuICAgIH1cbiAgICAvKiogSXRlcmF0ZXMgZG9jdW1lbnRzIGluIG9yZGVyIGRlZmluZWQgYnkgXCJjb21wYXJhdG9yXCIgKi8gICAgZm9yRWFjaCh0KSB7XG4gICAgICAgIHRoaXMuc29ydGVkU2V0Lmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiAodChlKSwgITEpKSk7XG4gICAgfVxuICAgIC8qKiBJbnNlcnRzIG9yIHVwZGF0ZXMgYSBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIGtleSAqLyAgICBhZGQodCkge1xuICAgICAgICAvLyBGaXJzdCByZW1vdmUgdGhlIGVsZW1lbnQgaWYgd2UgaGF2ZSBpdC5cbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVsZXRlKHQua2V5KTtcbiAgICAgICAgcmV0dXJuIGUuY29weShlLmtleWVkTWFwLmluc2VydCh0LmtleSwgdCksIGUuc29ydGVkU2V0Lmluc2VydCh0LCBudWxsKSk7XG4gICAgfVxuICAgIC8qKiBEZWxldGVzIGEgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIGtleSAqLyAgICBkZWxldGUodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5nZXQodCk7XG4gICAgICAgIHJldHVybiBlID8gdGhpcy5jb3B5KHRoaXMua2V5ZWRNYXAucmVtb3ZlKHQpLCB0aGlzLnNvcnRlZFNldC5yZW1vdmUoZSkpIDogdGhpcztcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBBYykpIHJldHVybiAhMTtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdC5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnNvcnRlZFNldC5nZXRJdGVyYXRvcigpLCBuID0gdC5zb3J0ZWRTZXQuZ2V0SXRlcmF0b3IoKTtcbiAgICAgICAgZm9yICg7ZS5oYXNOZXh0KCk7ICkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuZ2V0TmV4dCgpLmtleSwgcyA9IG4uZ2V0TmV4dCgpLmtleTtcbiAgICAgICAgICAgIGlmICghdC5pc0VxdWFsKHMpKSByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgdCA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQucHVzaChlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIDAgPT09IHQubGVuZ3RoID8gXCJEb2N1bWVudFNldCAoKVwiIDogXCJEb2N1bWVudFNldCAoXFxuICBcIiArIHQuam9pbihcIiAgXFxuXCIpICsgXCJcXG4pXCI7XG4gICAgfVxuICAgIGNvcHkodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gbmV3IEFjO1xuICAgICAgICByZXR1cm4gbi5jb21wYXJhdG9yID0gdGhpcy5jb21wYXJhdG9yLCBuLmtleWVkTWFwID0gdCwgbi5zb3J0ZWRTZXQgPSBlLCBuO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRG9jdW1lbnRDaGFuZ2VTZXQga2VlcHMgdHJhY2sgb2YgYSBzZXQgb2YgY2hhbmdlcyB0byBkb2NzIGluIGEgcXVlcnksIG1lcmdpbmdcbiAqIGR1cGxpY2F0ZSBldmVudHMgZm9yIHRoZSBzYW1lIGRvYy5cbiAqLyBjbGFzcyB2YyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuQ3UgPSBuZXcgcGUoaHQuY29tcGFyYXRvcik7XG4gICAgfVxuICAgIHRyYWNrKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuZG9jLmtleSwgbiA9IHRoaXMuQ3UuZ2V0KGUpO1xuICAgICAgICBuID8gXG4gICAgICAgIC8vIE1lcmdlIHRoZSBuZXcgY2hhbmdlIHdpdGggdGhlIGV4aXN0aW5nIGNoYW5nZS5cbiAgICAgICAgMCAvKiBDaGFuZ2VUeXBlLkFkZGVkICovICE9PSB0LnR5cGUgJiYgMyAvKiBDaGFuZ2VUeXBlLk1ldGFkYXRhICovID09PSBuLnR5cGUgPyB0aGlzLkN1ID0gdGhpcy5DdS5pbnNlcnQoZSwgdCkgOiAzIC8qIENoYW5nZVR5cGUuTWV0YWRhdGEgKi8gPT09IHQudHlwZSAmJiAxIC8qIENoYW5nZVR5cGUuUmVtb3ZlZCAqLyAhPT0gbi50eXBlID8gdGhpcy5DdSA9IHRoaXMuQ3UuaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IG4udHlwZSxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiAyIC8qIENoYW5nZVR5cGUuTW9kaWZpZWQgKi8gPT09IHQudHlwZSAmJiAyIC8qIENoYW5nZVR5cGUuTW9kaWZpZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuQ3UgPSB0aGlzLkN1Lmluc2VydChlLCB7XG4gICAgICAgICAgICB0eXBlOiAyIC8qIENoYW5nZVR5cGUuTW9kaWZpZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiB0LmRvY1xuICAgICAgICB9KSA6IDIgLyogQ2hhbmdlVHlwZS5Nb2RpZmllZCAqLyA9PT0gdC50eXBlICYmIDAgLyogQ2hhbmdlVHlwZS5BZGRlZCAqLyA9PT0gbi50eXBlID8gdGhpcy5DdSA9IHRoaXMuQ3UuaW5zZXJ0KGUsIHtcbiAgICAgICAgICAgIHR5cGU6IDAgLyogQ2hhbmdlVHlwZS5BZGRlZCAqLyAsXG4gICAgICAgICAgICBkb2M6IHQuZG9jXG4gICAgICAgIH0pIDogMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gPT09IHQudHlwZSAmJiAwIC8qIENoYW5nZVR5cGUuQWRkZWQgKi8gPT09IG4udHlwZSA/IHRoaXMuQ3UgPSB0aGlzLkN1LnJlbW92ZShlKSA6IDEgLyogQ2hhbmdlVHlwZS5SZW1vdmVkICovID09PSB0LnR5cGUgJiYgMiAvKiBDaGFuZ2VUeXBlLk1vZGlmaWVkICovID09PSBuLnR5cGUgPyB0aGlzLkN1ID0gdGhpcy5DdS5pbnNlcnQoZSwge1xuICAgICAgICAgICAgdHlwZTogMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgZG9jOiBuLmRvY1xuICAgICAgICB9KSA6IDAgLyogQ2hhbmdlVHlwZS5BZGRlZCAqLyA9PT0gdC50eXBlICYmIDEgLyogQ2hhbmdlVHlwZS5SZW1vdmVkICovID09PSBuLnR5cGUgPyB0aGlzLkN1ID0gdGhpcy5DdS5pbnNlcnQoZSwge1xuICAgICAgICAgICAgdHlwZTogMiAvKiBDaGFuZ2VUeXBlLk1vZGlmaWVkICovICxcbiAgICAgICAgICAgIGRvYzogdC5kb2NcbiAgICAgICAgfSkgOiBcbiAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aGVzZSBjYXNlcywgd2hpY2ggZG9uJ3QgbWFrZSBzZW5zZTpcbiAgICAgICAgLy8gQWRkZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPlJlbW92ZWRcbiAgICAgICAgLy8gTW9kaWZpZWQtPkFkZGVkXG4gICAgICAgIC8vIFJlbW92ZWQtPk1vZGlmaWVkXG4gICAgICAgIC8vIE1ldGFkYXRhLT5BZGRlZFxuICAgICAgICAvLyBSZW1vdmVkLT5NZXRhZGF0YVxuICAgICAgICBPKCkgOiB0aGlzLkN1ID0gdGhpcy5DdS5pbnNlcnQoZSwgdCk7XG4gICAgfVxuICAgIHh1KCkge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLkN1Lmlub3JkZXJUcmF2ZXJzYWwoKChlLCBuKSA9PiB7XG4gICAgICAgICAgICB0LnB1c2gobik7XG4gICAgICAgIH0pKSwgdDtcbiAgICB9XG59XG5cbmNsYXNzIFJjIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpLCByLCBvLCB1LCBjKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB0LCB0aGlzLmRvY3MgPSBlLCB0aGlzLm9sZERvY3MgPSBuLCB0aGlzLmRvY0NoYW5nZXMgPSBzLCB0aGlzLm11dGF0ZWRLZXlzID0gaSwgXG4gICAgICAgIHRoaXMuZnJvbUNhY2hlID0gciwgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID0gbywgdGhpcy5leGNsdWRlc01ldGFkYXRhQ2hhbmdlcyA9IHUsIFxuICAgICAgICB0aGlzLmhhc0NhY2hlZFJlc3VsdHMgPSBjO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIHZpZXcgc25hcHNob3QgYXMgaWYgYWxsIGRvY3VtZW50cyBpbiB0aGUgc25hcHNob3Qgd2VyZSBhZGRlZC4gKi8gICAgc3RhdGljIGZyb21Jbml0aWFsRG9jdW1lbnRzKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IFtdO1xuICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogMCAvKiBDaGFuZ2VUeXBlLkFkZGVkICovICxcbiAgICAgICAgICAgICAgICBkb2M6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIG5ldyBSYyh0LCBlLCBBYy5lbXB0eVNldChlKSwgciwgbiwgcywgXG4gICAgICAgIC8qIHN5bmNTdGF0ZUNoYW5nZWQ9ICovICEwLCBcbiAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICExLCBpKTtcbiAgICB9XG4gICAgZ2V0IGhhc1BlbmRpbmdXcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5tdXRhdGVkS2V5cy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICBpZiAoISh0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGUgJiYgdGhpcy5oYXNDYWNoZWRSZXN1bHRzID09PSB0Lmhhc0NhY2hlZFJlc3VsdHMgJiYgdGhpcy5zeW5jU3RhdGVDaGFuZ2VkID09PSB0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgdGhpcy5tdXRhdGVkS2V5cy5pc0VxdWFsKHQubXV0YXRlZEtleXMpICYmIFpuKHRoaXMucXVlcnksIHQucXVlcnkpICYmIHRoaXMuZG9jcy5pc0VxdWFsKHQuZG9jcykgJiYgdGhpcy5vbGREb2NzLmlzRXF1YWwodC5vbGREb2NzKSkpIHJldHVybiAhMTtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuZG9jQ2hhbmdlcywgbiA9IHQuZG9jQ2hhbmdlcztcbiAgICAgICAgaWYgKGUubGVuZ3RoICE9PSBuLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIGlmIChlW3RdLnR5cGUgIT09IG5bdF0udHlwZSB8fCAhZVt0XS5kb2MuaXNFcXVhbChuW3RdLmRvYykpIHJldHVybiAhMTtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSG9sZHMgdGhlIGxpc3RlbmVycyBhbmQgdGhlIGxhc3QgcmVjZWl2ZWQgVmlld1NuYXBzaG90IGZvciBhIHF1ZXJ5IGJlaW5nXG4gKiB0cmFja2VkIGJ5IEV2ZW50TWFuYWdlci5cbiAqLyBjbGFzcyBQYyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuTnUgPSB2b2lkIDAsIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgfVxufVxuXG5jbGFzcyBiYyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVlcmllcyA9IG5ldyBvcygodCA9PiB0cyh0KSksIFpuKSwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8gLCBcbiAgICAgICAgdGhpcy5rdSA9IG5ldyBTZXQ7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBWYyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCksIHMgPSBlLnF1ZXJ5O1xuICAgIGxldCBpID0gITEsIHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyIHx8IChpID0gITAsIHIgPSBuZXcgUGMpLCBpKSB0cnkge1xuICAgICAgICByLk51ID0gYXdhaXQgbi5vbkxpc3RlbihzKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIGNvbnN0IG4gPSBFYyh0LCBgSW5pdGlhbGl6YXRpb24gb2YgcXVlcnkgJyR7ZXMoZS5xdWVyeSl9JyBmYWlsZWRgKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgZS5vbkVycm9yKG4pO1xuICAgIH1cbiAgICBpZiAobi5xdWVyaWVzLnNldChzLCByKSwgci5saXN0ZW5lcnMucHVzaChlKSwgXG4gICAgLy8gUnVuIGdsb2JhbCBzbmFwc2hvdCBsaXN0ZW5lcnMgaWYgYSBjb25zaXN0ZW50IHNuYXBzaG90IGhhcyBiZWVuIGVtaXR0ZWQuXG4gICAgZS5NdShuLm9ubGluZVN0YXRlKSwgci5OdSkge1xuICAgICAgICBlLiR1KHIuTnUpICYmIHhjKG4pO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gU2ModCwgZSkge1xuICAgIGNvbnN0IG4gPSBMKHQpLCBzID0gZS5xdWVyeTtcbiAgICBsZXQgaSA9ICExO1xuICAgIGNvbnN0IHIgPSBuLnF1ZXJpZXMuZ2V0KHMpO1xuICAgIGlmIChyKSB7XG4gICAgICAgIGNvbnN0IHQgPSByLmxpc3RlbmVycy5pbmRleE9mKGUpO1xuICAgICAgICB0ID49IDAgJiYgKHIubGlzdGVuZXJzLnNwbGljZSh0LCAxKSwgaSA9IDAgPT09IHIubGlzdGVuZXJzLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChpKSByZXR1cm4gbi5xdWVyaWVzLmRlbGV0ZShzKSwgbi5vblVubGlzdGVuKHMpO1xufVxuXG5mdW5jdGlvbiBEYyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCk7XG4gICAgbGV0IHMgPSAhMTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICBjb25zdCBlID0gdC5xdWVyeSwgaSA9IG4ucXVlcmllcy5nZXQoZSk7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgaS5saXN0ZW5lcnMpIGUuJHUodCkgJiYgKHMgPSAhMCk7XG4gICAgICAgICAgICBpLk51ID0gdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzICYmIHhjKG4pO1xufVxuXG5mdW5jdGlvbiBDYyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEwodCksIGkgPSBzLnF1ZXJpZXMuZ2V0KGUpO1xuICAgIGlmIChpKSBmb3IgKGNvbnN0IHQgb2YgaS5saXN0ZW5lcnMpIHQub25FcnJvcihuKTtcbiAgICAvLyBSZW1vdmUgYWxsIGxpc3RlbmVycy4gTk9URTogV2UgZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNFbmdpbmUudW5saXN0ZW4oKVxuICAgIC8vIGFmdGVyIGFuIGVycm9yLlxuICAgICAgICBzLnF1ZXJpZXMuZGVsZXRlKGUpO1xufVxuXG4vLyBDYWxsIGFsbCBnbG9iYWwgc25hcHNob3QgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIHNldC5cbmZ1bmN0aW9uIHhjKHQpIHtcbiAgICB0Lmt1LmZvckVhY2goKHQgPT4ge1xuICAgICAgICB0Lm5leHQoKTtcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUXVlcnlMaXN0ZW5lciB0YWtlcyBhIHNlcmllcyBvZiBpbnRlcm5hbCB2aWV3IHNuYXBzaG90cyBhbmQgZGV0ZXJtaW5lc1xuICogd2hlbiB0byByYWlzZSB0aGUgZXZlbnQuXG4gKlxuICogSXQgdXNlcyBhbiBPYnNlcnZlciB0byBkaXNwYXRjaCBldmVudHMuXG4gKi8gY2xhc3MgTmMge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuT3UgPSBlLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluaXRpYWwgc25hcHNob3RzIChlLmcuIGZyb20gY2FjaGUpIG1heSBub3QgYmUgcHJvcGFnYXRlZCB0byB0aGUgd3JhcHBlZFxuICAgICAgICAgKiBvYnNlcnZlci4gVGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIG9uY2Ugd2UndmUgYWN0dWFsbHkgcmFpc2VkIGFuIGV2ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5GdSA9ICExLCB0aGlzLkJ1ID0gbnVsbCwgdGhpcy5vbmxpbmVTdGF0ZSA9IFwiVW5rbm93blwiIC8qIE9ubGluZVN0YXRlLlVua25vd24gKi8gLCBcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbiB8fCB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgbmV3IFZpZXdTbmFwc2hvdCB0byB0aGlzIGxpc3RlbmVyLCByYWlzaW5nIGEgdXNlci1mYWNpbmcgZXZlbnRcbiAgICAgKiBpZiBhcHBsaWNhYmxlIChkZXBlbmRpbmcgb24gd2hhdCBjaGFuZ2VkLCB3aGV0aGVyIHRoZSB1c2VyIGhhcyBvcHRlZCBpbnRvXG4gICAgICogbWV0YWRhdGEtb25seSBjaGFuZ2VzLCBldGMuKS4gUmV0dXJucyB0cnVlIGlmIGEgdXNlci1mYWNpbmcgZXZlbnQgd2FzXG4gICAgICogaW5kZWVkIHJhaXNlZC5cbiAgICAgKi8gICAgJHUodCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pbmNsdWRlTWV0YWRhdGFDaGFuZ2VzKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1ldGFkYXRhIG9ubHkgY2hhbmdlcy5cbiAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmRvY0NoYW5nZXMpIDMgLyogQ2hhbmdlVHlwZS5NZXRhZGF0YSAqLyAhPT0gbi50eXBlICYmIGUucHVzaChuKTtcbiAgICAgICAgICAgIHQgPSBuZXcgUmModC5xdWVyeSwgdC5kb2NzLCB0Lm9sZERvY3MsIGUsIHQubXV0YXRlZEtleXMsIHQuZnJvbUNhY2hlLCB0LnN5bmNTdGF0ZUNoYW5nZWQsIFxuICAgICAgICAgICAgLyogZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXM9ICovICEwLCB0Lmhhc0NhY2hlZFJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlID0gITE7XG4gICAgICAgIHJldHVybiB0aGlzLkZ1ID8gdGhpcy5MdSh0KSAmJiAodGhpcy5PdS5uZXh0KHQpLCBlID0gITApIDogdGhpcy5xdSh0LCB0aGlzLm9ubGluZVN0YXRlKSAmJiAodGhpcy5VdSh0KSwgXG4gICAgICAgIGUgPSAhMCksIHRoaXMuQnUgPSB0LCBlO1xuICAgIH1cbiAgICBvbkVycm9yKHQpIHtcbiAgICAgICAgdGhpcy5PdS5lcnJvcih0KTtcbiAgICB9XG4gICAgLyoqIFJldHVybnMgd2hldGhlciBhIHNuYXBzaG90IHdhcyByYWlzZWQuICovICAgIE11KHQpIHtcbiAgICAgICAgdGhpcy5vbmxpbmVTdGF0ZSA9IHQ7XG4gICAgICAgIGxldCBlID0gITE7XG4gICAgICAgIHJldHVybiB0aGlzLkJ1ICYmICF0aGlzLkZ1ICYmIHRoaXMucXUodGhpcy5CdSwgdCkgJiYgKHRoaXMuVXUodGhpcy5CdSksIGUgPSAhMCksIFxuICAgICAgICBlO1xuICAgIH1cbiAgICBxdSh0LCBlKSB7XG4gICAgICAgIC8vIEFsd2F5cyByYWlzZSB0aGUgZmlyc3QgZXZlbnQgd2hlbiB3ZSdyZSBzeW5jZWRcbiAgICAgICAgaWYgKCF0LmZyb21DYWNoZSkgcmV0dXJuICEwO1xuICAgICAgICAvLyBOT1RFOiBXZSBjb25zaWRlciBPbmxpbmVTdGF0ZS5Vbmtub3duIGFzIG9ubGluZSAoaXQgc2hvdWxkIGJlY29tZSBPZmZsaW5lXG4gICAgICAgIC8vIG9yIE9ubGluZSBpZiB3ZSB3YWl0IGxvbmcgZW5vdWdoKS5cbiAgICAgICAgICAgICAgICBjb25zdCBuID0gXCJPZmZsaW5lXCIgLyogT25saW5lU3RhdGUuT2ZmbGluZSAqLyAhPT0gZTtcbiAgICAgICAgLy8gRG9uJ3QgcmFpc2UgdGhlIGV2ZW50IGlmIHdlJ3JlIG9ubGluZSwgYXJlbid0IHN5bmNlZCB5ZXQgKGNoZWNrZWRcbiAgICAgICAgLy8gYWJvdmUpIGFuZCBhcmUgd2FpdGluZyBmb3IgYSBzeW5jLlxuICAgICAgICAgICAgICAgIHJldHVybiAoIXRoaXMub3B0aW9ucy5LdSB8fCAhbikgJiYgKCF0LmRvY3MuaXNFbXB0eSgpIHx8IHQuaGFzQ2FjaGVkUmVzdWx0cyB8fCBcIk9mZmxpbmVcIiAvKiBPbmxpbmVTdGF0ZS5PZmZsaW5lICovID09PSBlKTtcbiAgICAgICAgLy8gUmFpc2UgZGF0YSBmcm9tIGNhY2hlIGlmIHdlIGhhdmUgYW55IGRvY3VtZW50cywgaGF2ZSBjYWNoZWQgcmVzdWx0cyBiZWZvcmUsXG4gICAgICAgIC8vIG9yIHdlIGFyZSBvZmZsaW5lLlxuICAgICAgICB9XG4gICAgTHUodCkge1xuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBpbmNsdWRlRG9jdW1lbnRNZXRhZGF0YUNoYW5nZXMgaGVyZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBNZXRhZGF0YSBvbmx5IGNoYW5nZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RyaXBwZWQgb3V0IGlmIG5lZWRlZC5cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgb25seSBjaGFuZ2VzIHdlIHdpbGwgc2VlIGFyZSB0aGUgb25lcyB3ZSBzaG91bGRcbiAgICAgICAgLy8gcHJvcGFnYXRlLlxuICAgICAgICBpZiAodC5kb2NDaGFuZ2VzLmxlbmd0aCA+IDApIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMuQnUgJiYgdGhpcy5CdS5oYXNQZW5kaW5nV3JpdGVzICE9PSB0Lmhhc1BlbmRpbmdXcml0ZXM7XG4gICAgICAgIHJldHVybiAhKCF0LnN5bmNTdGF0ZUNoYW5nZWQgJiYgIWUpICYmICEwID09PSB0aGlzLm9wdGlvbnMuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgLy8gR2VuZXJhbGx5IHdlIHNob3VsZCBoYXZlIGhpdCBvbmUgb2YgdGhlIGNhc2VzIGFib3ZlLCBidXQgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyB0byBnZXQgaGVyZSBpZiB0aGVyZSB3ZXJlIG9ubHkgbWV0YWRhdGEgZG9jQ2hhbmdlcyBhbmQgdGhleSBnb3RcbiAgICAgICAgLy8gc3RyaXBwZWQgb3V0LlxuICAgICAgICB9XG4gICAgVXUodCkge1xuICAgICAgICB0ID0gUmMuZnJvbUluaXRpYWxEb2N1bWVudHModC5xdWVyeSwgdC5kb2NzLCB0Lm11dGF0ZWRLZXlzLCB0LmZyb21DYWNoZSwgdC5oYXNDYWNoZWRSZXN1bHRzKSwgXG4gICAgICAgIHRoaXMuRnUgPSAhMCwgdGhpcy5PdS5uZXh0KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb21wbGV0ZSBlbGVtZW50IGluIHRoZSBidW5kbGUgc3RyZWFtLCB0b2dldGhlciB3aXRoIHRoZSBieXRlIGxlbmd0aCBpdFxuICogb2NjdXBpZXMgaW4gdGhlIHN0cmVhbS5cbiAqLyBjbGFzcyBrYyB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLy8gSG93IG1hbnkgYnl0ZXMgdGhpcyBlbGVtZW50IHRha2VzIHRvIHN0b3JlIGluIHRoZSBidW5kbGUuXG4gICAgZSkge1xuICAgICAgICB0aGlzLkd1ID0gdCwgdGhpcy5ieXRlTGVuZ3RoID0gZTtcbiAgICB9XG4gICAgUXUoKSB7XG4gICAgICAgIHJldHVybiBcIm1ldGFkYXRhXCIgaW4gdGhpcy5HdTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IG9iamVjdHMgZnJvbSBidW5kbGVzIHRvIG1vZGVsIG9iamVjdHMgaW4gdGhlIFNESy5cbiAqLyBjbGFzcyBNYyB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0O1xuICAgIH1cbiAgICBycih0KSB7XG4gICAgICAgIHJldHVybiBPaSh0aGlzLnNlcmlhbGl6ZXIsIHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIEJ1bmRsZURvY3VtZW50IHRvIGEgTXV0YWJsZURvY3VtZW50LlxuICAgICAqLyAgICB1cih0KSB7XG4gICAgICAgIHJldHVybiB0Lm1ldGFkYXRhLmV4aXN0cyA/IEtpKHRoaXMuc2VyaWFsaXplciwgdC5kb2N1bWVudCwgITEpIDogYW4ubmV3Tm9Eb2N1bWVudCh0aGlzLnJyKHQubWV0YWRhdGEubmFtZSksIHRoaXMuY3IodC5tZXRhZGF0YS5yZWFkVGltZSkpO1xuICAgIH1cbiAgICBjcih0KSB7XG4gICAgICAgIHJldHVybiBOaSh0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBjbGFzcyB0byBwcm9jZXNzIHRoZSBlbGVtZW50cyBmcm9tIGEgYnVuZGxlLCBsb2FkIHRoZW0gaW50byBsb2NhbFxuICogc3RvcmFnZSBhbmQgcHJvdmlkZSBwcm9ncmVzcyB1cGRhdGUgd2hpbGUgbG9hZGluZy5cbiAqLyBjbGFzcyAkYyB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmp1ID0gdCwgdGhpcy5sb2NhbFN0b3JlID0gZSwgdGhpcy5zZXJpYWxpemVyID0gbiwgXG4gICAgICAgIC8qKiBCYXRjaGVkIHF1ZXJpZXMgdG8gYmUgc2F2ZWQgaW50byBzdG9yYWdlICovXG4gICAgICAgIHRoaXMucXVlcmllcyA9IFtdLCBcbiAgICAgICAgLyoqIEJhdGNoZWQgZG9jdW1lbnRzIHRvIGJlIHNhdmVkIGludG8gc3RvcmFnZSAqL1xuICAgICAgICB0aGlzLmRvY3VtZW50cyA9IFtdLCBcbiAgICAgICAgLyoqIFRoZSBjb2xsZWN0aW9uIGdyb3VwcyBhZmZlY3RlZCBieSB0aGlzIGJ1bmRsZS4gKi9cbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uR3JvdXBzID0gbmV3IFNldCwgdGhpcy5wcm9ncmVzcyA9IE9jKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGVsZW1lbnQgZnJvbSB0aGUgYnVuZGxlIHRvIHRoZSBsb2FkZXIuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHByb2dyZXNzIGlmIGFkZGluZyB0aGUgZWxlbWVudCBsZWFkcyB0byBhIG5ldyBwcm9ncmVzcyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICAgICAqLyAgICB6dSh0KSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MuYnl0ZXNMb2FkZWQgKz0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICBsZXQgZSA9IHRoaXMucHJvZ3Jlc3MuZG9jdW1lbnRzTG9hZGVkO1xuICAgICAgICBpZiAodC5HdS5uYW1lZFF1ZXJ5KSB0aGlzLnF1ZXJpZXMucHVzaCh0Lkd1Lm5hbWVkUXVlcnkpOyBlbHNlIGlmICh0Lkd1LmRvY3VtZW50TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0Lkd1LmRvY3VtZW50TWV0YWRhdGFcbiAgICAgICAgICAgIH0pLCB0Lkd1LmRvY3VtZW50TWV0YWRhdGEuZXhpc3RzIHx8ICsrZTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB1dC5mcm9tU3RyaW5nKHQuR3UuZG9jdW1lbnRNZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbkdyb3Vwcy5hZGQobi5nZXQobi5sZW5ndGggLSAyKSk7XG4gICAgICAgIH0gZWxzZSB0Lkd1LmRvY3VtZW50ICYmICh0aGlzLmRvY3VtZW50c1t0aGlzLmRvY3VtZW50cy5sZW5ndGggLSAxXS5kb2N1bWVudCA9IHQuR3UuZG9jdW1lbnQsIFxuICAgICAgICArK2UpO1xuICAgICAgICByZXR1cm4gZSAhPT0gdGhpcy5wcm9ncmVzcy5kb2N1bWVudHNMb2FkZWQgPyAodGhpcy5wcm9ncmVzcy5kb2N1bWVudHNMb2FkZWQgPSBlLCBcbiAgICAgICAgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9ncmVzcykpIDogbnVsbDtcbiAgICB9XG4gICAgV3UodCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IE1hcCwgbiA9IG5ldyBNYyh0aGlzLnNlcmlhbGl6ZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgdCkgaWYgKHMubWV0YWRhdGEucXVlcmllcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG4ucnIocy5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBzLm1ldGFkYXRhLnF1ZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gKGUuZ2V0KG4pIHx8IGdzKCkpLmFkZCh0KTtcbiAgICAgICAgICAgICAgICBlLnNldChuLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwcm9ncmVzcyB0byAnU3VjY2VzcycgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBwcm9ncmVzcy5cbiAgICAgKi8gICAgYXN5bmMgY29tcGxldGUoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBtdSh0aGlzLmxvY2FsU3RvcmUsIG5ldyBNYyh0aGlzLnNlcmlhbGl6ZXIpLCB0aGlzLmRvY3VtZW50cywgdGhpcy5qdS5pZCksIGUgPSB0aGlzLld1KHRoaXMuZG9jdW1lbnRzKTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMucXVlcmllcykgYXdhaXQgZ3UodGhpcy5sb2NhbFN0b3JlLCB0LCBlLmdldCh0Lm5hbWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MudGFza1N0YXRlID0gXCJTdWNjZXNzXCIsIHtcbiAgICAgICAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzLFxuICAgICAgICAgICAgSHU6IHRoaXMuY29sbGVjdGlvbkdyb3VwcyxcbiAgICAgICAgICAgIEp1OiB0XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBgTG9hZEJ1bmRsZVRhc2tQcm9ncmVzc2AgcmVwcmVzZW50aW5nIHRoZSBpbml0aWFsIHByb2dyZXNzIG9mXG4gKiBsb2FkaW5nIGEgYnVuZGxlLlxuICovIGZ1bmN0aW9uIE9jKHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YXNrU3RhdGU6IFwiUnVubmluZ1wiLFxuICAgICAgICBkb2N1bWVudHNMb2FkZWQ6IDAsXG4gICAgICAgIGJ5dGVzTG9hZGVkOiAwLFxuICAgICAgICB0b3RhbERvY3VtZW50czogdC50b3RhbERvY3VtZW50cyxcbiAgICAgICAgdG90YWxCeXRlczogdC50b3RhbEJ5dGVzXG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHJlcHJlc2VudGluZyB0aGUgcHJvZ3Jlc3MgdGhhdCB0aGUgbG9hZGluZ1xuICogaGFzIHN1Y2NlZWRlZC5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmNsYXNzIEZjIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2V5ID0gdDtcbiAgICB9XG59XG5cbmNsYXNzIEJjIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2V5ID0gdDtcbiAgICB9XG59XG5cbi8qKlxuICogVmlldyBpcyByZXNwb25zaWJsZSBmb3IgY29tcHV0aW5nIHRoZSBmaW5hbCBtZXJnZWQgdHJ1dGggb2Ygd2hhdCBkb2NzIGFyZSBpblxuICogYSBxdWVyeS4gSXQgZ2V0cyBub3RpZmllZCBvZiBsb2NhbCBhbmQgcmVtb3RlIGNoYW5nZXMgdG8gZG9jcywgYW5kIGFwcGxpZXNcbiAqIHRoZSBxdWVyeSBmaWx0ZXJzIGFuZCBsaW1pdHMgdG8gZGV0ZXJtaW5lIHRoZSBtb3N0IGNvcnJlY3QgcG9zc2libGUgcmVzdWx0cy5cbiAqLyBjbGFzcyBMYyB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLyoqIERvY3VtZW50cyBpbmNsdWRlZCBpbiB0aGUgcmVtb3RlIHRhcmdldCAqL1xuICAgIGUpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMuWXUgPSBlLCB0aGlzLlh1ID0gbnVsbCwgdGhpcy5oYXNDYWNoZWRSZXN1bHRzID0gITEsIFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBmbGFnIHdoZXRoZXIgdGhlIHZpZXcgaXMgY3VycmVudCB3aXRoIHRoZSBiYWNrZW5kLiBBIHZpZXcgaXMgY29uc2lkZXJlZFxuICAgICAgICAgKiBjdXJyZW50IGFmdGVyIGl0IGhhcyBzZWVuIHRoZSBjdXJyZW50IGZsYWcgZnJvbSB0aGUgYmFja2VuZCBhbmQgZGlkIG5vdFxuICAgICAgICAgKiBsb3NlIGNvbnNpc3RlbmN5IHdpdGhpbiB0aGUgd2F0Y2ggc3RyZWFtIChlLmcuIGJlY2F1c2Ugb2YgYW4gZXhpc3RlbmNlXG4gICAgICAgICAqIGZpbHRlciBtaXNtYXRjaCkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAhMSwgXG4gICAgICAgIC8qKiBEb2N1bWVudHMgaW4gdGhlIHZpZXcgYnV0IG5vdCBpbiB0aGUgcmVtb3RlIHRhcmdldCAqL1xuICAgICAgICB0aGlzLlp1ID0gZ3MoKSwgXG4gICAgICAgIC8qKiBEb2N1bWVudCBLZXlzIHRoYXQgaGF2ZSBsb2NhbCBjaGFuZ2VzICovXG4gICAgICAgIHRoaXMubXV0YXRlZEtleXMgPSBncygpLCB0aGlzLnRjID0gaXModCksIHRoaXMuZWMgPSBuZXcgQWModGhpcy50Yyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcmVtb3RlIGRvY3VtZW50cyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHRvbGQgdXMgYmVsb25ncyB0byB0aGUgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIHRoaXMgdmlldy5cbiAgICAgKi8gICAgZ2V0IG5jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ZdTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBhIHNldCBvZiBkb2MgY2hhbmdlcywgYXBwbGllcyB0aGUgcXVlcnkgbGltaXQsIGFuZCBjb21wdXRlc1xuICAgICAqIHdoYXQgdGhlIG5ldyByZXN1bHRzIHNob3VsZCBiZSwgd2hhdCB0aGUgY2hhbmdlcyB3ZXJlLCBhbmQgd2hldGhlciB3ZSBtYXlcbiAgICAgKiBuZWVkIHRvIGdvIGJhY2sgdG8gdGhlIGxvY2FsIGNhY2hlIGZvciBtb3JlIHJlc3VsdHMuIERvZXMgbm90IG1ha2UgYW55XG4gICAgICogY2hhbmdlcyB0byB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0gZG9jQ2hhbmdlcyAtIFRoZSBkb2MgY2hhbmdlcyB0byBhcHBseSB0byB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHByZXZpb3VzQ2hhbmdlcyAtIElmIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYSByZWZpbGwsIHRoZW4gc3RhcnRcbiAgICAgKiAgICAgICAgd2l0aCB0aGlzIHNldCBvZiBkb2NzIGFuZCBjaGFuZ2VzIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdmlldy5cbiAgICAgKiBAcmV0dXJucyBhIG5ldyBzZXQgb2YgZG9jcywgY2hhbmdlcywgYW5kIHJlZmlsbCBmbGFnLlxuICAgICAqLyAgICBzYyh0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBlID8gZS5pYyA6IG5ldyB2YywgcyA9IGUgPyBlLmVjIDogdGhpcy5lYztcbiAgICAgICAgbGV0IGkgPSBlID8gZS5tdXRhdGVkS2V5cyA6IHRoaXMubXV0YXRlZEtleXMsIHIgPSBzLCBvID0gITE7XG4gICAgICAgIC8vIFRyYWNrIHRoZSBsYXN0IGRvYyBpbiBhIChmdWxsKSBsaW1pdC4gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZVxuICAgICAgICAvLyB1cGRhdGUgKGEgZGVsZXRlLCBvciBhbiB1cGRhdGUgbW92aW5nIGEgZG9jIHBhc3QgdGhlIG9sZCBsaW1pdCkgbWlnaHRcbiAgICAgICAgLy8gbWVhbiB0aGVyZSBpcyBzb21lIG90aGVyIGRvY3VtZW50IGluIHRoZSBsb2NhbCBjYWNoZSB0aGF0IGVpdGhlciBzaG91bGRcbiAgICAgICAgLy8gY29tZSAoMSkgYmV0d2VlbiB0aGUgb2xkIGxhc3QgbGltaXQgZG9jIGFuZCB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZVxuICAgICAgICAvLyBjYXNlIG9mIHVwZGF0ZXMsIG9yICgyKSBhZnRlciB0aGUgbmV3IGxhc3QgZG9jdW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgIC8vIGRlbGV0ZXMuIFNvIHdlIGtlZXAgdGhpcyBkb2MgYXQgdGhlIG9sZCBsaW1pdCB0byBjb21wYXJlIHRoZSB1cGRhdGVzIHRvLlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBzaG91bGQgbmV2ZXIgZ2V0IHVzZWQgaW4gYSByZWZpbGwgKHdoZW4gcHJldmlvdXNDaGFuZ2VzIGlzXG4gICAgICAgIC8vIHNldCksIGJlY2F1c2UgdGhlcmUgd2lsbCBvbmx5IGJlIGFkZHMgLS0gbm8gZGVsZXRlcyBvciB1cGRhdGVzLlxuICAgICAgICBjb25zdCB1ID0gXCJGXCIgLyogTGltaXRUeXBlLkZpcnN0ICovID09PSB0aGlzLnF1ZXJ5LmxpbWl0VHlwZSAmJiBzLnNpemUgPT09IHRoaXMucXVlcnkubGltaXQgPyBzLmxhc3QoKSA6IG51bGwsIGMgPSBcIkxcIiAvKiBMaW1pdFR5cGUuTGFzdCAqLyA9PT0gdGhpcy5xdWVyeS5saW1pdFR5cGUgJiYgcy5zaXplID09PSB0aGlzLnF1ZXJ5LmxpbWl0ID8gcy5maXJzdCgpIDogbnVsbDtcbiAgICAgICAgLy8gRHJvcCBkb2N1bWVudHMgb3V0IHRvIG1lZXQgbGltaXQvbGltaXRUb0xhc3QgcmVxdWlyZW1lbnQuXG4gICAgICAgIGlmICh0Lmlub3JkZXJUcmF2ZXJzYWwoKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gcy5nZXQodCksIGggPSBucyh0aGlzLnF1ZXJ5LCBlKSA/IGUgOiBudWxsLCBsID0gISFhICYmIHRoaXMubXV0YXRlZEtleXMuaGFzKGEua2V5KSwgZiA9ICEhaCAmJiAoaC5oYXNMb2NhbE11dGF0aW9ucyB8fCBcbiAgICAgICAgICAgIC8vIFdlIG9ubHkgY29uc2lkZXIgY29tbWl0dGVkIG11dGF0aW9ucyBmb3IgZG9jdW1lbnRzIHRoYXQgd2VyZVxuICAgICAgICAgICAgLy8gbXV0YXRlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSB2aWV3LlxuICAgICAgICAgICAgdGhpcy5tdXRhdGVkS2V5cy5oYXMoaC5rZXkpICYmIGguaGFzQ29tbWl0dGVkTXV0YXRpb25zKTtcbiAgICAgICAgICAgIGxldCBkID0gITE7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBoKSB7XG4gICAgICAgICAgICAgICAgYS5kYXRhLmlzRXF1YWwoaC5kYXRhKSA/IGwgIT09IGYgJiYgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAzIC8qIENoYW5nZVR5cGUuTWV0YWRhdGEgKi8gLFxuICAgICAgICAgICAgICAgICAgICBkb2M6IGhcbiAgICAgICAgICAgICAgICB9KSwgZCA9ICEwKSA6IHRoaXMucmMoYSwgaCkgfHwgKG4udHJhY2soe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAyIC8qIENoYW5nZVR5cGUuTW9kaWZpZWQgKi8gLFxuICAgICAgICAgICAgICAgICAgICBkb2M6IGhcbiAgICAgICAgICAgICAgICB9KSwgZCA9ICEwLCAodSAmJiB0aGlzLnRjKGgsIHUpID4gMCB8fCBjICYmIHRoaXMudGMoaCwgYykgPCAwKSAmJiAoXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBkb2MgbW92ZWQgZnJvbSBpbnNpZGUgdGhlIGxpbWl0IHRvIG91dHNpZGUgdGhlIGxpbWl0LlxuICAgICAgICAgICAgICAgIC8vIFRoYXQgbWVhbnMgdGhlcmUgbWF5IGJlIHNvbWUgb3RoZXIgZG9jIGluIHRoZSBsb2NhbCBjYWNoZVxuICAgICAgICAgICAgICAgIC8vIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgbyA9ICEwKSk7XG4gICAgICAgICAgICB9IGVsc2UgIWEgJiYgaCA/IChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAwIC8qIENoYW5nZVR5cGUuQWRkZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogaFxuICAgICAgICAgICAgfSksIGQgPSAhMCkgOiBhICYmICFoICYmIChuLnRyYWNrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxIC8qIENoYW5nZVR5cGUuUmVtb3ZlZCAqLyAsXG4gICAgICAgICAgICAgICAgZG9jOiBhXG4gICAgICAgICAgICB9KSwgZCA9ICEwLCAodSB8fCBjKSAmJiAoXG4gICAgICAgICAgICAvLyBBIGRvYyB3YXMgcmVtb3ZlZCBmcm9tIGEgZnVsbCBsaW1pdCBxdWVyeS4gV2UnbGwgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVxdWVyeSBmcm9tIHRoZSBsb2NhbCBjYWNoZSB0byBzZWUgaWYgd2Uga25vdyBhYm91dCBzb21lIG90aGVyXG4gICAgICAgICAgICAvLyBkb2MgdGhhdCBzaG91bGQgYmUgaW4gdGhlIHJlc3VsdHMuXG4gICAgICAgICAgICBvID0gITApKTtcbiAgICAgICAgICAgIGQgJiYgKGggPyAociA9IHIuYWRkKGgpLCBpID0gZiA/IGkuYWRkKHQpIDogaS5kZWxldGUodCkpIDogKHIgPSByLmRlbGV0ZSh0KSwgaSA9IGkuZGVsZXRlKHQpKSk7XG4gICAgICAgIH0pKSwgbnVsbCAhPT0gdGhpcy5xdWVyeS5saW1pdCkgZm9yICg7ci5zaXplID4gdGhpcy5xdWVyeS5saW1pdDsgKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gXCJGXCIgLyogTGltaXRUeXBlLkZpcnN0ICovID09PSB0aGlzLnF1ZXJ5LmxpbWl0VHlwZSA/IHIubGFzdCgpIDogci5maXJzdCgpO1xuICAgICAgICAgICAgciA9IHIuZGVsZXRlKHQua2V5KSwgaSA9IGkuZGVsZXRlKHQua2V5KSwgbi50cmFjayh7XG4gICAgICAgICAgICAgICAgdHlwZTogMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gLFxuICAgICAgICAgICAgICAgIGRvYzogdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVjOiByLFxuICAgICAgICAgICAgaWM6IG4sXG4gICAgICAgICAgICB6aTogbyxcbiAgICAgICAgICAgIG11dGF0ZWRLZXlzOiBpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJjKHQsIGUpIHtcbiAgICAgICAgLy8gV2Ugc3VwcHJlc3MgdGhlIGluaXRpYWwgY2hhbmdlIGV2ZW50IGZvciBkb2N1bWVudHMgdGhhdCB3ZXJlIG1vZGlmaWVkIGFzXG4gICAgICAgIC8vIHBhcnQgb2YgYSB3cml0ZSBhY2tub3dsZWRnbWVudCAoZS5nLiB3aGVuIHRoZSB2YWx1ZSBvZiBhIHNlcnZlciB0cmFuc2Zvcm1cbiAgICAgICAgLy8gaXMgYXBwbGllZCkgYXMgV2F0Y2ggd2lsbCBzZW5kIHVzIHRoZSBzYW1lIGRvY3VtZW50IGFnYWluLlxuICAgICAgICAvLyBCeSBzdXBwcmVzc2luZyB0aGUgZXZlbnQsIHdlIG9ubHkgcmFpc2UgdHdvIHVzZXIgdmlzaWJsZSBldmVudHMgKG9uZSB3aXRoXG4gICAgICAgIC8vIGBoYXNQZW5kaW5nV3JpdGVzYCBhbmQgdGhlIGZpbmFsIHN0YXRlIG9mIHRoZSBkb2N1bWVudCkgaW5zdGVhZCBvZiB0aHJlZVxuICAgICAgICAvLyAob25lIHdpdGggYGhhc1BlbmRpbmdXcml0ZXNgLCB0aGUgbW9kaWZpZWQgZG9jdW1lbnQgd2l0aFxuICAgICAgICAvLyBgaGFzUGVuZGluZ1dyaXRlc2AgYW5kIHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQpLlxuICAgICAgICByZXR1cm4gdC5oYXNMb2NhbE11dGF0aW9ucyAmJiBlLmhhc0NvbW1pdHRlZE11dGF0aW9ucyAmJiAhZS5oYXNMb2NhbE11dGF0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBnaXZlbiBWaWV3RG9jdW1lbnRDaGFuZ2VzIGFuZCBvcHRpb25hbGx5IHVwZGF0ZXNcbiAgICAgKiBsaW1ibyBkb2NzIGFuZCBzeW5jIHN0YXRlIGZyb20gdGhlIHByb3ZpZGVkIHRhcmdldCBjaGFuZ2UuXG4gICAgICogQHBhcmFtIGRvY0NoYW5nZXMgLSBUaGUgc2V0IG9mIGNoYW5nZXMgdG8gbWFrZSB0byB0aGUgdmlldydzIGRvY3MuXG4gICAgICogQHBhcmFtIHVwZGF0ZUxpbWJvRG9jdW1lbnRzIC0gV2hldGhlciB0byB1cGRhdGUgbGltYm8gZG9jdW1lbnRzIGJhc2VkIG9uXG4gICAgICogICAgICAgIHRoaXMgY2hhbmdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDaGFuZ2UgLSBBIHRhcmdldCBjaGFuZ2UgdG8gYXBwbHkgZm9yIGNvbXB1dGluZyBsaW1ibyBkb2NzIGFuZFxuICAgICAqICAgICAgICBzeW5jIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFZpZXdDaGFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gZG9jcywgY2hhbmdlcywgYW5kIHN5bmMgc3RhdGUuXG4gICAgICovXG4gICAgLy8gUE9SVElORyBOT1RFOiBUaGUgaU9TL0FuZHJvaWQgY2xpZW50cyBhbHdheXMgY29tcHV0ZSBsaW1ibyBkb2N1bWVudCBjaGFuZ2VzLlxuICAgIGFwcGx5Q2hhbmdlcyh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmVjO1xuICAgICAgICB0aGlzLmVjID0gdC5lYywgdGhpcy5tdXRhdGVkS2V5cyA9IHQubXV0YXRlZEtleXM7XG4gICAgICAgIC8vIFNvcnQgY2hhbmdlcyBiYXNlZCBvbiB0eXBlIGFuZCBxdWVyeSBjb21wYXJhdG9yXG4gICAgICAgIGNvbnN0IGkgPSB0LmljLnh1KCk7XG4gICAgICAgIGkuc29ydCgoKHQsIGUpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBDaGFuZ2VUeXBlLkFkZGVkICovIDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBDaGFuZ2VUeXBlLk1vZGlmaWVkICovIDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBDaGFuZ2VUeXBlLk1ldGFkYXRhICovIDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBtZXRhZGF0YSBjaGFuZ2UgaXMgY29udmVydGVkIHRvIGEgbW9kaWZpZWQgY2hhbmdlIGF0IHRoZSBwdWJsaWNcbiAgICAgICAgICAgICAgICAgICAgLy8gYXBpIGxheWVyLiAgU2luY2Ugd2Ugc29ydCBieSBkb2N1bWVudCBrZXkgYW5kIHRoZW4gY2hhbmdlIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhIGFuZCBtb2RpZmllZCBjaGFuZ2VzIG11c3QgYmUgc29ydGVkIGVxdWl2YWxlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIG4odCkgLSBuKGUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0LnR5cGUsIGUudHlwZSkgfHwgdGhpcy50Yyh0LmRvYywgZS5kb2MpKSksIHRoaXMub2Mobik7XG4gICAgICAgIGNvbnN0IHIgPSBlID8gdGhpcy51YygpIDogW10sIG8gPSAwID09PSB0aGlzLlp1LnNpemUgJiYgdGhpcy5jdXJyZW50ID8gMSAvKiBTeW5jU3RhdGUuU3luY2VkICovIDogMCAvKiBTeW5jU3RhdGUuTG9jYWwgKi8gLCB1ID0gbyAhPT0gdGhpcy5YdTtcbiAgICAgICAgaWYgKHRoaXMuWHUgPSBvLCAwICE9PSBpLmxlbmd0aCB8fCB1KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBuZXcgUmModGhpcy5xdWVyeSwgdC5lYywgcywgaSwgdC5tdXRhdGVkS2V5cywgMCAvKiBTeW5jU3RhdGUuTG9jYWwgKi8gPT09IG8sIHUsIFxuICAgICAgICAgICAgICAgIC8qIGV4Y2x1ZGVzTWV0YWRhdGFDaGFuZ2VzPSAqLyAhMSwgISFuICYmIG4ucmVzdW1lVG9rZW4uYXBwcm94aW1hdGVCeXRlU2l6ZSgpID4gMCksXG4gICAgICAgICAgICAgICAgY2M6IHJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gY2hhbmdlc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2M6IHJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBPbmxpbmVTdGF0ZSBjaGFuZ2UgdG8gdGhlIHZpZXcsIHBvdGVudGlhbGx5IGdlbmVyYXRpbmcgYVxuICAgICAqIFZpZXdDaGFuZ2UgaWYgdGhlIHZpZXcncyBzeW5jU3RhdGUgY2hhbmdlcyBhcyBhIHJlc3VsdC5cbiAgICAgKi8gICAgTXUodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50ICYmIFwiT2ZmbGluZVwiIC8qIE9ubGluZVN0YXRlLk9mZmxpbmUgKi8gPT09IHQgPyAoXG4gICAgICAgIC8vIElmIHdlJ3JlIG9mZmxpbmUsIHNldCBgY3VycmVudGAgdG8gZmFsc2UgYW5kIHRoZW4gY2FsbCBhcHBseUNoYW5nZXMoKVxuICAgICAgICAvLyB0byByZWZyZXNoIG91ciBzeW5jU3RhdGUgYW5kIGdlbmVyYXRlIGEgVmlld0NoYW5nZSBhcyBhcHByb3ByaWF0ZS4gV2VcbiAgICAgICAgLy8gYXJlIGd1YXJhbnRlZWQgdG8gZ2V0IGEgbmV3IFRhcmdldENoYW5nZSB0aGF0IHNldHMgYGN1cnJlbnRgIGJhY2sgdG9cbiAgICAgICAgLy8gdHJ1ZSBvbmNlIHRoZSBjbGllbnQgaXMgYmFjayBvbmxpbmUuXG4gICAgICAgIHRoaXMuY3VycmVudCA9ICExLCB0aGlzLmFwcGx5Q2hhbmdlcyh7XG4gICAgICAgICAgICBlYzogdGhpcy5lYyxcbiAgICAgICAgICAgIGljOiBuZXcgdmMsXG4gICAgICAgICAgICBtdXRhdGVkS2V5czogdGhpcy5tdXRhdGVkS2V5cyxcbiAgICAgICAgICAgIHppOiAhMVxuICAgICAgICB9LCBcbiAgICAgICAgLyogdXBkYXRlTGltYm9Eb2N1bWVudHM9ICovICExKSkgOiB7XG4gICAgICAgICAgICBjYzogW11cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBkb2MgZm9yIHRoZSBnaXZlbiBrZXkgc2hvdWxkIGJlIGluIGxpbWJvLlxuICAgICAqLyAgICBhYyh0KSB7XG4gICAgICAgIC8vIElmIHRoZSByZW1vdGUgZW5kIHNheXMgaXQncyBwYXJ0IG9mIHRoaXMgcXVlcnksIGl0J3Mgbm90IGluIGxpbWJvLlxuICAgICAgICByZXR1cm4gIXRoaXMuWXUuaGFzKHQpICYmIChcbiAgICAgICAgLy8gVGhlIGxvY2FsIHN0b3JlIGRvZXNuJ3QgdGhpbmsgaXQncyBhIHJlc3VsdCwgc28gaXQgc2hvdWxkbid0IGJlIGluIGxpbWJvLlxuICAgICAgICAhIXRoaXMuZWMuaGFzKHQpICYmICF0aGlzLmVjLmdldCh0KS5oYXNMb2NhbE11dGF0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgc3luY2VkRG9jdW1lbnRzLCBjdXJyZW50LCBhbmQgbGltYm8gZG9jcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2hhbmdlLlxuICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hhbmdlcyB0byB3aGljaCBkb2NzIGFyZSBpbiBsaW1iby5cbiAgICAgKi8gICAgb2ModCkge1xuICAgICAgICB0ICYmICh0LmFkZGVkRG9jdW1lbnRzLmZvckVhY2goKHQgPT4gdGhpcy5ZdSA9IHRoaXMuWXUuYWRkKHQpKSksIHQubW9kaWZpZWREb2N1bWVudHMuZm9yRWFjaCgodCA9PiB7fSkpLCBcbiAgICAgICAgdC5yZW1vdmVkRG9jdW1lbnRzLmZvckVhY2goKHQgPT4gdGhpcy5ZdSA9IHRoaXMuWXUuZGVsZXRlKHQpKSksIHRoaXMuY3VycmVudCA9IHQuY3VycmVudCk7XG4gICAgfVxuICAgIHVjKCkge1xuICAgICAgICAvLyBXZSBjYW4gb25seSBkZXRlcm1pbmUgbGltYm8gZG9jdW1lbnRzIHdoZW4gd2UncmUgaW4tc3luYyB3aXRoIHRoZSBzZXJ2ZXIuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSByZXR1cm4gW107XG4gICAgICAgIC8vIFRPRE8oa2xpbXQpOiBEbyB0aGlzIGluY3JlbWVudGFsbHkgc28gdGhhdCBpdCdzIG5vdCBxdWFkcmF0aWMgd2hlblxuICAgICAgICAvLyB1cGRhdGluZyBtYW55IGRvY3VtZW50cy5cbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5adTtcbiAgICAgICAgdGhpcy5adSA9IGdzKCksIHRoaXMuZWMuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjKHQua2V5KSAmJiAodGhpcy5adSA9IHRoaXMuWnUuYWRkKHQua2V5KSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gRGlmZiB0aGUgbmV3IGxpbWJvIGRvY3Mgd2l0aCB0aGUgb2xkIGxpbWJvIGRvY3MuXG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLlp1Lmhhcyh0KSB8fCBlLnB1c2gobmV3IEJjKHQpKTtcbiAgICAgICAgfSkpLCB0aGlzLlp1LmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgdC5oYXMobikgfHwgZS5wdXNoKG5ldyBGYyhuKSk7XG4gICAgICAgIH0pKSwgZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpbi1tZW1vcnkgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdmlldyB3aXRoIHRoZSBzdGF0ZSByZWFkIGZyb21cbiAgICAgKiBwZXJzaXN0ZW5jZS5cbiAgICAgKlxuICAgICAqIFdlIHVwZGF0ZSB0aGUgcXVlcnkgdmlldyB3aGVuZXZlciBhIGNsaWVudCdzIHByaW1hcnkgc3RhdHVzIGNoYW5nZXM6XG4gICAgICogLSBXaGVuIGEgY2xpZW50IHRyYW5zaXRpb25zIGZyb20gcHJpbWFyeSB0byBzZWNvbmRhcnksIGl0IGNhbiBtaXNzXG4gICAgICogICBMb2NhbFN0b3JhZ2UgdXBkYXRlcyBhbmQgaXRzIHF1ZXJ5IHZpZXdzIG1heSB0ZW1wb3JhcmlseSBub3QgYmVcbiAgICAgKiAgIHN5bmNocm9uaXplZCB3aXRoIHRoZSBzdGF0ZSBvbiBkaXNrLlxuICAgICAqIC0gRm9yIHNlY29uZGFyeSB0byBwcmltYXJ5IHRyYW5zaXRpb25zLCB0aGUgY2xpZW50IG5lZWRzIHRvIHVwZGF0ZSB0aGUgbGlzdFxuICAgICAqICAgb2YgYHN5bmNlZERvY3VtZW50c2Agc2luY2Ugc2Vjb25kYXJ5IGNsaWVudHMgdXBkYXRlIHRoZWlyIHF1ZXJ5IHZpZXdzXG4gICAgICogICBiYXNlZCBwdXJlbHkgb24gc3ludGhlc2l6ZWQgUmVtb3RlRXZlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJ5UmVzdWx0LmRvY3VtZW50cyAtIFRoZSBkb2N1bWVudHMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIExvY2FsU3RvcmUuXG4gICAgICogQHBhcmFtIHF1ZXJ5UmVzdWx0LnJlbW90ZUtleXMgLSBUaGUga2V5cyBvZiB0aGUgZG9jdW1lbnRzIHRoYXQgbWF0Y2ggdGhlXG4gICAgICogcXVlcnkgYWNjb3JkaW5nIHRvIHRoZSBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFZpZXdDaGFuZ2UgdGhhdCByZXN1bHRlZCBmcm9tIHRoaXMgc3luY2hyb25pemF0aW9uLlxuICAgICAqL1xuICAgIC8vIFBPUlRJTkcgTk9URTogTXVsdGktdGFiIG9ubHkuXG4gICAgaGModCkge1xuICAgICAgICB0aGlzLll1ID0gdC5pciwgdGhpcy5adSA9IGdzKCk7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnNjKHQuZG9jdW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlDaGFuZ2VzKGUsIC8qdXBkYXRlTGltYm9Eb2N1bWVudHM9Ki8gITApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdmlldyBzbmFwc2hvdCBhcyBpZiB0aGlzIHF1ZXJ5IHdhcyBqdXN0IGxpc3RlbmVkIHRvLiBDb250YWluc1xuICAgICAqIGEgZG9jdW1lbnQgYWRkIGZvciBldmVyeSBleGlzdGluZyBkb2N1bWVudCBhbmQgdGhlIGBmcm9tQ2FjaGVgIGFuZFxuICAgICAqIGBoYXNQZW5kaW5nV3JpdGVzYCBzdGF0dXMgb2YgdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgdmlldy5cbiAgICAgKi9cbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLXRhYiBvbmx5LlxuICAgIGxjKCkge1xuICAgICAgICByZXR1cm4gUmMuZnJvbUluaXRpYWxEb2N1bWVudHModGhpcy5xdWVyeSwgdGhpcy5lYywgdGhpcy5tdXRhdGVkS2V5cywgMCAvKiBTeW5jU3RhdGUuTG9jYWwgKi8gPT09IHRoaXMuWHUsIHRoaXMuaGFzQ2FjaGVkUmVzdWx0cyk7XG4gICAgfVxufVxuXG4vKipcbiAqIFF1ZXJ5VmlldyBjb250YWlucyBhbGwgb2YgdGhlIGRhdGEgdGhhdCBTeW5jRW5naW5lIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgZm9yXG4gKiBhIHBhcnRpY3VsYXIgcXVlcnkuXG4gKi9cbmNsYXNzIHFjIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgaXRzZWxmLlxuICAgICAqL1xuICAgIHQsIFxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgbnVtYmVyIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCB0aGF0IGlzIHVzZWQgaW4gdGhlIHdhdGNoXG4gICAgICogc3RyZWFtIHRvIGlkZW50aWZ5IHRoaXMgcXVlcnkuXG4gICAgICovXG4gICAgZSwgXG4gICAgLyoqXG4gICAgICogVGhlIHZpZXcgaXMgcmVzcG9uc2libGUgZm9yIGNvbXB1dGluZyB0aGUgZmluYWwgbWVyZ2VkIHRydXRoIG9mIHdoYXRcbiAgICAgKiBkb2NzIGFyZSBpbiB0aGUgcXVlcnkuIEl0IGdldHMgbm90aWZpZWQgb2YgbG9jYWwgYW5kIHJlbW90ZSBjaGFuZ2VzLFxuICAgICAqIGFuZCBhcHBsaWVzIHRoZSBxdWVyeSBmaWx0ZXJzIGFuZCBsaW1pdHMgdG8gZGV0ZXJtaW5lIHRoZSBtb3N0IGNvcnJlY3RcbiAgICAgKiBwb3NzaWJsZSByZXN1bHRzLlxuICAgICAqL1xuICAgIG4pIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHQsIHRoaXMudGFyZ2V0SWQgPSBlLCB0aGlzLnZpZXcgPSBuO1xuICAgIH1cbn1cblxuLyoqIFRyYWNrcyBhIGxpbWJvIHJlc29sdXRpb24uICovIGNsYXNzIFVjIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2V5ID0gdCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdG8gdHJ1ZSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGEgZG9jdW1lbnQuIFRoaXMgaXMgdXNlZCBpblxuICAgICAgICAgKiBnZXRSZW1vdGVLZXlzRm9yVGFyZ2V0KCkgYW5kIHVsdGltYXRlbHkgdXNlZCBieSBXYXRjaENoYW5nZUFnZ3JlZ2F0b3IgdG9cbiAgICAgICAgICogZGVjaWRlIHdoZXRoZXIgaXQgbmVlZHMgdG8gbWFudWZhY3R1cmUgYSBkZWxldGUgZXZlbnQgZm9yIHRoZSB0YXJnZXQgb25jZVxuICAgICAgICAgKiB0aGUgdGFyZ2V0IGlzIENVUlJFTlQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZjID0gITE7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBTeW5jRW5naW5lYCBjb29yZGluYXRpbmcgd2l0aCBvdGhlciBwYXJ0cyBvZiBTREsuXG4gKlxuICogVGhlIHBhcnRzIG9mIFN5bmNFbmdpbmUgdGhhdCBhY3QgYXMgYSBjYWxsYmFjayB0byBSZW1vdGVTdG9yZSBuZWVkIHRvIGJlXG4gKiByZWdpc3RlcmVkIGluZGl2aWR1YWxseS4gVGhpcyBpcyBkb25lIGluIGBzeW5jRW5naW5lV3JpdGUoKWAgYW5kXG4gKiBgc3luY0VuZ2luZUxpc3RlbigpYCAoYXMgd2VsbCBhcyBgYXBwbHlQcmltYXJ5U3RhdGUoKWApIGFzIHRoZXNlIG1ldGhvZHNcbiAqIHNlcnZlIGFzIGVudHJ5IHBvaW50cyB0byBSZW1vdGVTdG9yZSdzIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogTm90ZTogc29tZSBmaWVsZCBkZWZpbmVkIGluIHRoaXMgY2xhc3MgbWlnaHQgaGF2ZSBwdWJsaWMgYWNjZXNzIGxldmVsLCBidXRcbiAqIHRoZSBjbGFzcyBpcyBub3QgZXhwb3J0ZWQgc28gdGhleSBhcmUgb25seSBhY2Nlc3NpYmxlIGZyb20gdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgb3B0aW9uYWwgZmVhdHVyZXMgKGxpa2UgYnVuZGxlcykgaW4gZnJlZVxuICogZnVuY3Rpb25zLCBzdWNoIHRoYXQgdGhleSBhcmUgdHJlZS1zaGFrZWFibGUuXG4gKi8gY2xhc3MgS2Mge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIFxuICAgIC8vIFBPUlRJTkcgTk9URTogTWFuYWdlcyBzdGF0ZSBzeW5jaHJvbml6YXRpb24gaW4gbXVsdGktdGFiIGVudmlyb25tZW50cy5cbiAgICBzLCBpLCByKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdG9yZSA9IHQsIHRoaXMucmVtb3RlU3RvcmUgPSBlLCB0aGlzLmV2ZW50TWFuYWdlciA9IG4sIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUgPSBzLCBcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IGksIHRoaXMubWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnMgPSByLCB0aGlzLmRjID0ge30sIHRoaXMud2MgPSBuZXcgb3MoKHQgPT4gdHModCkpLCBabiksIFxuICAgICAgICB0aGlzLl9jID0gbmV3IE1hcCwgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUga2V5cyBvZiBkb2N1bWVudHMgdGhhdCBhcmUgaW4gbGltYm8gZm9yIHdoaWNoIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYVxuICAgICAgICAgKiBsaW1ibyByZXNvbHV0aW9uIHF1ZXJ5LiBUaGUgc3RyaW5ncyBpbiB0aGlzIHNldCBhcmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gICAgICAgICAqIGBrZXkucGF0aC5jYW5vbmljYWxTdHJpbmcoKWAgd2hlcmUgYGtleWAgaXMgYSBgRG9jdW1lbnRLZXlgIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGBTZXRgIHR5cGUgd2FzIGNob3NlbiBiZWNhdXNlIGl0IHByb3ZpZGVzIGVmZmljaWVudCBsb29rdXAgYW5kIHJlbW92YWxcbiAgICAgICAgICogb2YgYXJiaXRyYXJ5IGVsZW1lbnRzIGFuZCBpdCBhbHNvIG1haW50YWlucyBpbnNlcnRpb24gb3JkZXIsIHByb3ZpZGluZyB0aGVcbiAgICAgICAgICogZGVzaXJlZCBxdWV1ZS1saWtlIEZJRk8gc2VtYW50aWNzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYyA9IG5ldyBTZXQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIHRhcmdldCBJRCBmb3IgZWFjaCBkb2N1bWVudCB0aGF0IGlzIGluIGxpbWJvIHdpdGggYW5cbiAgICAgICAgICogYWN0aXZlIHRhcmdldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2MgPSBuZXcgcGUoaHQuY29tcGFyYXRvciksIFxuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IGFuIGFjdGl2ZSBsaW1ibyByZXNvbHV0aW9uIGZvciBlYWNoXG4gICAgICAgICAqIGFjdGl2ZSB0YXJnZXQgSUQgdGhhdCB3YXMgc3RhcnRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbGltYm8gcmVzb2x1dGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMueWMgPSBuZXcgTWFwLCB0aGlzLkljID0gbmV3IE9vLCBcbiAgICAgICAgLyoqIFN0b3JlcyB1c2VyIGNvbXBsZXRpb24gaGFuZGxlcnMsIGluZGV4ZWQgYnkgVXNlciBhbmQgQmF0Y2hJZC4gKi9cbiAgICAgICAgdGhpcy5UYyA9IHt9LCBcbiAgICAgICAgLyoqIFN0b3JlcyB1c2VyIGNhbGxiYWNrcyB3YWl0aW5nIGZvciBhbGwgcGVuZGluZyB3cml0ZXMgdG8gYmUgYWNrbm93bGVkZ2VkLiAqL1xuICAgICAgICB0aGlzLkVjID0gbmV3IE1hcCwgdGhpcy5BYyA9IGxvLk1uKCksIHRoaXMub25saW5lU3RhdGUgPSBcIlVua25vd25cIiAvKiBPbmxpbmVTdGF0ZS5Vbmtub3duICovICwgXG4gICAgICAgIC8vIFRoZSBwcmltYXJ5IHN0YXRlIGlzIHNldCB0byBgdHJ1ZWAgb3IgYGZhbHNlYCBpbW1lZGlhdGVseSBhZnRlciBGaXJlc3RvcmVcbiAgICAgICAgLy8gc3RhcnR1cC4gSW4gdGhlIGludGVyaW0sIGEgY2xpZW50IHNob3VsZCBvbmx5IGJlIGNvbnNpZGVyZWQgcHJpbWFyeSBpZlxuICAgICAgICAvLyBgaXNQcmltYXJ5YCBpcyB0cnVlLlxuICAgICAgICB0aGlzLnZjID0gdm9pZCAwO1xuICAgIH1cbiAgICBnZXQgaXNQcmltYXJ5Q2xpZW50KCkge1xuICAgICAgICByZXR1cm4gITAgPT09IHRoaXMudmM7XG4gICAgfVxufVxuXG4vKipcbiAqIEluaXRpYXRlcyB0aGUgbmV3IGxpc3RlbiwgcmVzb2x2ZXMgcHJvbWlzZSB3aGVuIGxpc3RlbiBlbnF1ZXVlZCB0byB0aGVcbiAqIHNlcnZlci4gQWxsIHRoZSBzdWJzZXF1ZW50IHZpZXcgc25hcHNob3RzIG9yIGVycm9ycyBhcmUgc2VudCB0byB0aGVcbiAqIHN1YnNjcmliZWQgaGFuZGxlcnMuIFJldHVybnMgdGhlIGluaXRpYWwgc25hcHNob3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIEdjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gcGEodCk7XG4gICAgbGV0IHMsIGk7XG4gICAgY29uc3QgciA9IG4ud2MuZ2V0KGUpO1xuICAgIGlmIChyKSBcbiAgICAvLyBQT1JUSU5HIE5PVEU6IFdpdGggTXVsdGktVGFiIFdlYiwgaXQgaXMgcG9zc2libGUgdGhhdCBhIHF1ZXJ5IHZpZXdcbiAgICAvLyBhbHJlYWR5IGV4aXN0cyB3aGVuIEV2ZW50TWFuYWdlciBjYWxscyB1cyBmb3IgdGhlIGZpcnN0IHRpbWUuIFRoaXNcbiAgICAvLyBoYXBwZW5zIHdoZW4gdGhlIHByaW1hcnkgdGFiIGlzIGFscmVhZHkgbGlzdGVuaW5nIHRvIHRoaXMgcXVlcnkgb25cbiAgICAvLyBiZWhhbGYgb2YgYW5vdGhlciB0YWIgYW5kIHRoZSB1c2VyIG9mIHRoZSBwcmltYXJ5IGFsc28gc3RhcnRzIGxpc3RlbmluZ1xuICAgIC8vIHRvIHRoZSBxdWVyeS4gRXZlbnRNYW5hZ2VyIHdpbGwgbm90IGhhdmUgYW4gYXNzaWduZWQgdGFyZ2V0IElEIGluIHRoaXNcbiAgICAvLyBjYXNlIGFuZCBjYWxscyBgbGlzdGVuYCB0byBvYnRhaW4gdGhpcyBJRC5cbiAgICBzID0gci50YXJnZXRJZCwgbi5zaGFyZWRDbGllbnRTdGF0ZS5hZGRMb2NhbFF1ZXJ5VGFyZ2V0KHMpLCBpID0gci52aWV3LmxjKCk7IGVsc2Uge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgaHUobi5sb2NhbFN0b3JlLCBKbihlKSksIHIgPSBuLnNoYXJlZENsaWVudFN0YXRlLmFkZExvY2FsUXVlcnlUYXJnZXQodC50YXJnZXRJZCk7XG4gICAgICAgIHMgPSB0LnRhcmdldElkLCBpID0gYXdhaXQgUWMobiwgZSwgcywgXCJjdXJyZW50XCIgPT09IHIsIHQucmVzdW1lVG9rZW4pLCBuLmlzUHJpbWFyeUNsaWVudCAmJiBIdShuLnJlbW90ZVN0b3JlLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgdmlldyBmb3IgYSBwcmV2aW91c2x5IHVua25vd24gcXVlcnkgYW5kIGNvbXB1dGVzIGl0cyBpbml0aWFsXG4gKiBzbmFwc2hvdC5cbiAqLyBhc3luYyBmdW5jdGlvbiBRYyh0LCBlLCBuLCBzLCBpKSB7XG4gICAgLy8gUE9SVElORyBOT1RFOiBPbiBXZWIgb25seSwgd2UgaW5qZWN0IHRoZSBjb2RlIHRoYXQgcmVnaXN0ZXJzIG5ldyBMaW1ib1xuICAgIC8vIHRhcmdldHMgYmFzZWQgb24gdmlldyBjaGFuZ2VzLiBUaGlzIGFsbG93cyB1cyB0byBvbmx5IGRlcGVuZCBvbiBMaW1ib1xuICAgIC8vIGNoYW5nZXMgd2hlbiB1c2VyIGNvZGUgaW5jbHVkZXMgcXVlcmllcy5cbiAgICB0LlJjID0gKGUsIG4sIHMpID0+IGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgbGV0IGkgPSBlLnZpZXcuc2Mobik7XG4gICAgICAgIGkuemkgJiYgKFxuICAgICAgICAvLyBUaGUgcXVlcnkgaGFzIGEgbGltaXQgYW5kIHNvbWUgZG9jcyB3ZXJlIHJlbW92ZWQsIHNvIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gcmUtcnVuIHRoZSBxdWVyeSBhZ2FpbnN0IHRoZSBsb2NhbCBzdG9yZSB0byBtYWtlIHN1cmUgd2VcbiAgICAgICAgLy8gZGlkbid0IGxvc2UgYW55IGdvb2QgZG9jcyB0aGF0IGhhZCBiZWVuIHBhc3QgdGhlIGxpbWl0LlxuICAgICAgICBpID0gYXdhaXQgZnUodC5sb2NhbFN0b3JlLCBlLnF1ZXJ5LCBcbiAgICAgICAgLyogdXNlUHJldmlvdXNSZXN1bHRzPSAqLyAhMSkudGhlbigoKHtkb2N1bWVudHM6IHR9KSA9PiBlLnZpZXcuc2ModCwgaSkpKSk7XG4gICAgICAgIGNvbnN0IHIgPSBzICYmIHMudGFyZ2V0Q2hhbmdlcy5nZXQoZS50YXJnZXRJZCksIG8gPSBlLnZpZXcuYXBwbHlDaGFuZ2VzKGksIFxuICAgICAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gdC5pc1ByaW1hcnlDbGllbnQsIHIpO1xuICAgICAgICByZXR1cm4gaWEodCwgZS50YXJnZXRJZCwgby5jYyksIG8uc25hcHNob3Q7XG4gICAgfSh0LCBlLCBuLCBzKTtcbiAgICBjb25zdCByID0gYXdhaXQgZnUodC5sb2NhbFN0b3JlLCBlLCBcbiAgICAvKiB1c2VQcmV2aW91c1Jlc3VsdHM9ICovICEwKSwgbyA9IG5ldyBMYyhlLCByLmlyKSwgdSA9IG8uc2Moci5kb2N1bWVudHMpLCBjID0gZ2kuY3JlYXRlU3ludGhlc2l6ZWRUYXJnZXRDaGFuZ2VGb3JDdXJyZW50Q2hhbmdlKG4sIHMgJiYgXCJPZmZsaW5lXCIgLyogT25saW5lU3RhdGUuT2ZmbGluZSAqLyAhPT0gdC5vbmxpbmVTdGF0ZSwgaSksIGEgPSBvLmFwcGx5Q2hhbmdlcyh1LCBcbiAgICAvKiB1cGRhdGVMaW1ib0RvY3VtZW50cz0gKi8gdC5pc1ByaW1hcnlDbGllbnQsIGMpO1xuICAgIGlhKHQsIG4sIGEuY2MpO1xuICAgIGNvbnN0IGggPSBuZXcgcWMoZSwgbiwgbyk7XG4gICAgcmV0dXJuIHQud2Muc2V0KGUsIGgpLCB0Ll9jLmhhcyhuKSA/IHQuX2MuZ2V0KG4pLnB1c2goZSkgOiB0Ll9jLnNldChuLCBbIGUgXSksIGEuc25hcHNob3Q7XG59XG5cbi8qKiBTdG9wcyBsaXN0ZW5pbmcgdG8gdGhlIHF1ZXJ5LiAqLyBhc3luYyBmdW5jdGlvbiBqYyh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCksIHMgPSBuLndjLmdldChlKSwgaSA9IG4uX2MuZ2V0KHMudGFyZ2V0SWQpO1xuICAgIGlmIChpLmxlbmd0aCA+IDEpIHJldHVybiBuLl9jLnNldChzLnRhcmdldElkLCBpLmZpbHRlcigodCA9PiAhWm4odCwgZSkpKSksIHZvaWQgbi53Yy5kZWxldGUoZSk7XG4gICAgLy8gTm8gb3RoZXIgcXVlcmllcyBhcmUgbWFwcGVkIHRvIHRoZSB0YXJnZXQsIGNsZWFuIHVwIHRoZSBxdWVyeSBhbmQgdGhlIHRhcmdldC5cbiAgICAgICAgaWYgKG4uaXNQcmltYXJ5Q2xpZW50KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCBxdWVyeSB0YXJnZXQgZmlyc3QgdG8gYWxsb3cgdXMgdG8gdmVyaWZ5XG4gICAgICAgIC8vIHdoZXRoZXIgYW55IG90aGVyIGNsaWVudCBpcyBzdGlsbCBpbnRlcmVzdGVkIGluIHRoaXMgdGFyZ2V0LlxuICAgICAgICBuLnNoYXJlZENsaWVudFN0YXRlLnJlbW92ZUxvY2FsUXVlcnlUYXJnZXQocy50YXJnZXRJZCk7XG4gICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUuaXNBY3RpdmVRdWVyeVRhcmdldChzLnRhcmdldElkKSB8fCBhd2FpdCBsdShuLmxvY2FsU3RvcmUsIHMudGFyZ2V0SWQsIFxuICAgICAgICAvKmtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhPSovICExKS50aGVuKCgoKSA9PiB7XG4gICAgICAgICAgICBuLnNoYXJlZENsaWVudFN0YXRlLmNsZWFyUXVlcnlTdGF0ZShzLnRhcmdldElkKSwgSnUobi5yZW1vdGVTdG9yZSwgcy50YXJnZXRJZCksIFxuICAgICAgICAgICAgbmEobiwgcy50YXJnZXRJZCk7XG4gICAgICAgIH0pKS5jYXRjaCh2dCk7XG4gICAgfSBlbHNlIG5hKG4sIHMudGFyZ2V0SWQpLCBhd2FpdCBsdShuLmxvY2FsU3RvcmUsIHMudGFyZ2V0SWQsIFxuICAgIC8qa2VlcFBlcnNpc3RlZFRhcmdldERhdGE9Ki8gITApO1xufVxuXG4vKipcbiAqIEluaXRpYXRlcyB0aGUgd3JpdGUgb2YgbG9jYWwgbXV0YXRpb24gYmF0Y2ggd2hpY2ggaW52b2x2ZXMgYWRkaW5nIHRoZVxuICogd3JpdGVzIHRvIHRoZSBtdXRhdGlvbiBxdWV1ZSwgbm90aWZ5aW5nIHRoZSByZW1vdGUgc3RvcmUgYWJvdXQgbmV3XG4gKiBtdXRhdGlvbnMgYW5kIHJhaXNpbmcgZXZlbnRzIGZvciBhbnkgY2hhbmdlcyB0aGlzIHdyaXRlIGNhdXNlZC5cbiAqXG4gKiBUaGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGlzIGNhbGwgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgYWJvdmUgc3RlcHNcbiAqIGhhdmUgY29tcGxldGVkLCAqbm90KiB3aGVuIHRoZSB3cml0ZSB3YXMgYWNrZWQgYnkgdGhlIGJhY2tlbmQuIFRoZVxuICogdXNlckNhbGxiYWNrIGlzIHJlc29sdmVkIG9uY2UgdGhlIHdyaXRlIHdhcyBhY2tlZC9yZWplY3RlZCBieSB0aGVcbiAqIGJhY2tlbmQgKG9yIGZhaWxlZCBsb2NhbGx5IGZvciBhbnkgb3RoZXIgcmVhc29uKS5cbiAqLyBhc3luYyBmdW5jdGlvbiB6Yyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IElhKHQpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gTCh0KSwgcyA9IGl0Lm5vdygpLCBpID0gZS5yZWR1Y2UoKCh0LCBlKSA9PiB0LmFkZChlLmtleSkpLCBncygpKTtcbiAgICAgICAgICAgIGxldCByLCBvO1xuICAgICAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJMb2NhbGx5IHdyaXRlIG11dGF0aW9uc1wiLCBcInJlYWR3cml0ZVwiLCAodCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBrZXlzIGRvIG5vdCBoYXZlIGEgcmVtb3RlIHZlcnNpb24gaW4gdGhlIGNhY2hlLCB0aGlzXG4gICAgICAgICAgICAgICAgLy8gaXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgcmlnaHQgb3ZlcmxheSBtdXRhdGlvbjogaWYgbm8gcmVtb3RlIHZlcnNpb25cbiAgICAgICAgICAgICAgICAvLyBwcmVzZW50cywgd2UgZG8gbm90IG5lZWQgdG8gY3JlYXRlIG92ZXJsYXlzIGFzIHBhdGNoIG11dGF0aW9ucy5cbiAgICAgICAgICAgICAgICAvLyBUT0RPKE92ZXJsYXkpOiBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lIHRoaXM/IFVzaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vICBkb2N1bWVudCB2ZXJzaW9uIGRvZXMgbm90IHdvcmsgYmVjYXVzZSBsb2NhbCBtdXRhdGlvbnMgc2V0IHRoZW0gYmFja1xuICAgICAgICAgICAgICAgIC8vICB0byAwLlxuICAgICAgICAgICAgICAgIGxldCB1ID0gY3MoKSwgYyA9IGdzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4uWmkuZ2V0RW50cmllcyh0LCBpKS5uZXh0KCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdSA9IHQsIHUuZm9yRWFjaCgoKHQsIGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuaXNWYWxpZERvY3VtZW50KCkgfHwgKGMgPSBjLmFkZCh0KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KSkubmV4dCgoKCkgPT4gbi5sb2NhbERvY3VtZW50cy5nZXRPdmVybGF5ZWREb2N1bWVudHModCwgdSkpKS5uZXh0KChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgciA9IGk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBub24taWRlbXBvdGVudCBtdXRhdGlvbnMgKHN1Y2ggYXMgYEZpZWxkVmFsdWUuaW5jcmVtZW50KClgKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVjb3JkIHRoZSBiYXNlIHN0YXRlIGluIGEgc2VwYXJhdGUgcGF0Y2ggbXV0YXRpb24uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXIgdXNlZCB0byBndWFyYW50ZWUgY29uc2lzdGVudCB2YWx1ZXMgYW5kIHByZXZlbnRzIGZsaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgYmFja2VuZCBzZW5kcyB1cyBhbiB1cGRhdGUgdGhhdCBhbHJlYWR5IGluY2x1ZGVzIG91clxuICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBHcyh0LCByLmdldCh0LmtleSkub3ZlcmxheWVkRG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBlICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhlIGJhc2Ugc3RhdGUgc2hvdWxkIG9ubHkgYmUgYXBwbGllZCBpZiB0aGVyZSdzIHNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGRvY3VtZW50IHRvIG92ZXJyaWRlLCBzbyB1c2UgYSBQcmVjb25kaXRpb24gb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cz10cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2gobmV3IHpzKHQua2V5LCBlLCBjbihlLnZhbHVlLm1hcFZhbHVlKSwgRnMuZXhpc3RzKCEwKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuLm11dGF0aW9uUXVldWUuYWRkTXV0YXRpb25CYXRjaCh0LCBzLCBvLCBlKTtcbiAgICAgICAgICAgICAgICB9KSkubmV4dCgoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gZS5hcHBseVRvTG9jYWxEb2N1bWVudFNldChyLCBjKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZG9jdW1lbnRPdmVybGF5Q2FjaGUuc2F2ZU92ZXJsYXlzKHQsIGUuYmF0Y2hJZCwgcyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpLnRoZW4oKCgpID0+ICh7XG4gICAgICAgICAgICAgICAgYmF0Y2hJZDogby5iYXRjaElkLFxuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGxzKHIpXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICB9KHMubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIHMuc2hhcmVkQ2xpZW50U3RhdGUuYWRkUGVuZGluZ011dGF0aW9uKHQuYmF0Y2hJZCksIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgICAgIGxldCBzID0gdC5UY1t0LmN1cnJlbnRVc2VyLnRvS2V5KCldO1xuICAgICAgICAgICAgcyB8fCAocyA9IG5ldyBwZShldCkpO1xuICAgICAgICAgICAgcyA9IHMuaW5zZXJ0KGUsIG4pLCB0LlRjW3QuY3VycmVudFVzZXIudG9LZXkoKV0gPSBzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmVzb2x2ZXMgb3IgcmVqZWN0cyB0aGUgdXNlciBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIGJhdGNoIGFuZCB0aGVuIGRpc2NhcmRzXG4gKiBpdC5cbiAqLyAocywgdC5iYXRjaElkLCBuKSwgYXdhaXQgdWEocywgdC5jaGFuZ2VzKSwgYXdhaXQgY2Mocy5yZW1vdGVTdG9yZSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBwZXJzaXN0IHRoZSBtdXRhdGlvbiwgd2UgcmVqZWN0IHRoZSB1c2VyIGNhbGxiYWNrIGFuZFxuICAgICAgICAvLyBkb24ndCBzZW5kIHRoZSBtdXRhdGlvbi4gVGhlIHVzZXIgY2FuIHRoZW4gcmV0cnkgdGhlIHdyaXRlLlxuICAgICAgICBjb25zdCBlID0gRWModCwgXCJGYWlsZWQgdG8gcGVyc2lzdCB3cml0ZVwiKTtcbiAgICAgICAgbi5yZWplY3QoZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgb25lIHJlbW90ZSBldmVudCB0byB0aGUgc3luYyBlbmdpbmUsIG5vdGlmeWluZyBhbnkgdmlld3Mgb2YgdGhlXG4gKiBjaGFuZ2VzLCBhbmQgcmVsZWFzaW5nIGFueSBwZW5kaW5nIG11dGF0aW9uIGJhdGNoZXMgdGhhdCB3b3VsZCBiZWNvbWVcbiAqIHZpc2libGUgYmVjYXVzZSBvZiB0aGUgc25hcHNob3QgdmVyc2lvbiB0aGUgcmVtb3RlIGV2ZW50IGNvbnRhaW5zLlxuICovIGFzeW5jIGZ1bmN0aW9uIFdjKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdXUobi5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgLy8gVXBkYXRlIGByZWNlaXZlZERvY3VtZW50YCBhcyBhcHByb3ByaWF0ZSBmb3IgYW55IGxpbWJvIHRhcmdldHMuXG4gICAgICAgICAgICAgICAgZS50YXJnZXRDaGFuZ2VzLmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gbi55Yy5nZXQoZSk7XG4gICAgICAgICAgICBzICYmIChcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBsaW1ibyByZXNvbHV0aW9uIGxvb2t1cCwgaXQncyBmb3IgYSBzaW5nbGUgZG9jdW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBpdCBjb3VsZCBiZSBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQsIGJ1dCBub3QgYSBjb21iaW5hdGlvbi5cbiAgICAgICAgICAgIEYodC5hZGRlZERvY3VtZW50cy5zaXplICsgdC5tb2RpZmllZERvY3VtZW50cy5zaXplICsgdC5yZW1vdmVkRG9jdW1lbnRzLnNpemUgPD0gMSksIFxuICAgICAgICAgICAgdC5hZGRlZERvY3VtZW50cy5zaXplID4gMCA/IHMuZmMgPSAhMCA6IHQubW9kaWZpZWREb2N1bWVudHMuc2l6ZSA+IDAgPyBGKHMuZmMpIDogdC5yZW1vdmVkRG9jdW1lbnRzLnNpemUgPiAwICYmIChGKHMuZmMpLCBcbiAgICAgICAgICAgIHMuZmMgPSAhMSkpO1xuICAgICAgICB9KSksIGF3YWl0IHVhKG4sIHQsIGUpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgYXdhaXQgdnQodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYW4gT25saW5lU3RhdGUgY2hhbmdlIHRvIHRoZSBzeW5jIGVuZ2luZSBhbmQgbm90aWZpZXMgYW55IHZpZXdzIG9mXG4gKiB0aGUgY2hhbmdlLlxuICovIGZ1bmN0aW9uIEhjKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gTCh0KTtcbiAgICAvLyBJZiB3ZSBhcmUgdGhlIHNlY29uZGFyeSBjbGllbnQsIHdlIGV4cGxpY2l0bHkgaWdub3JlIHRoZSByZW1vdGUgc3RvcmUnc1xuICAgIC8vIG9ubGluZSBzdGF0ZSAodGhlIGxvY2FsIGNsaWVudCBtYXkgZ28gb2ZmbGluZSwgZXZlbiB0aG91Z2ggdGhlIHByaW1hcnlcbiAgICAvLyB0YWIgcmVtYWlucyBvbmxpbmUpIGFuZCBvbmx5IGFwcGx5IHRoZSBwcmltYXJ5IHRhYidzIG9ubGluZSBzdGF0ZSBmcm9tXG4gICAgLy8gU2hhcmVkQ2xpZW50U3RhdGUuXG4gICAgICAgIGlmIChzLmlzUHJpbWFyeUNsaWVudCAmJiAwIC8qIE9ubGluZVN0YXRlU291cmNlLlJlbW90ZVN0b3JlICovID09PSBuIHx8ICFzLmlzUHJpbWFyeUNsaWVudCAmJiAxIC8qIE9ubGluZVN0YXRlU291cmNlLlNoYXJlZENsaWVudFN0YXRlICovID09PSBuKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcy53Yy5mb3JFYWNoKCgobiwgcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHMudmlldy5NdShlKTtcbiAgICAgICAgICAgIGkuc25hcHNob3QgJiYgdC5wdXNoKGkuc25hcHNob3QpO1xuICAgICAgICB9KSksIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBMKHQpO1xuICAgICAgICAgICAgbi5vbmxpbmVTdGF0ZSA9IGU7XG4gICAgICAgICAgICBsZXQgcyA9ICExO1xuICAgICAgICAgICAgbi5xdWVyaWVzLmZvckVhY2goKCh0LCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIG4ubGlzdGVuZXJzKSBcbiAgICAgICAgICAgICAgICAvLyBSdW4gZ2xvYmFsIHNuYXBzaG90IGxpc3RlbmVycyBpZiBhIGNvbnNpc3RlbnQgc25hcHNob3QgaGFzIGJlZW4gZW1pdHRlZC5cbiAgICAgICAgICAgICAgICB0Lk11KGUpICYmIChzID0gITApO1xuICAgICAgICAgICAgfSkpLCBzICYmIHhjKG4pO1xuICAgICAgICB9KHMuZXZlbnRNYW5hZ2VyLCBlKSwgdC5sZW5ndGggJiYgcy5kYy5udSh0KSwgcy5vbmxpbmVTdGF0ZSA9IGUsIHMuaXNQcmltYXJ5Q2xpZW50ICYmIHMuc2hhcmVkQ2xpZW50U3RhdGUuc2V0T25saW5lU3RhdGUoZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlamVjdHMgdGhlIGxpc3RlbiBmb3IgdGhlIGdpdmVuIHRhcmdldElELiBUaGlzIGNhbiBiZSB0cmlnZ2VyZWQgYnkgdGhlXG4gKiBiYWNrZW5kIGZvciBhbnkgYWN0aXZlIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0gc3luY0VuZ2luZSAtIFRoZSBzeW5jIGVuZ2luZSBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB0YXJnZXRJZCAtIFRoZSB0YXJnZXRJRCBjb3JyZXNwb25kcyB0byBvbmUgcHJldmlvdXNseSBpbml0aWF0ZWQgYnkgdGhlXG4gKiB1c2VyIGFzIHBhcnQgb2YgVGFyZ2V0RGF0YSBwYXNzZWQgdG8gbGlzdGVuKCkgb24gUmVtb3RlU3RvcmUuXG4gKiBAcGFyYW0gZXJyIC0gQSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZGl0aW9uIHRoYXQgaGFzIGZvcmNlZCB0aGUgcmVqZWN0aW9uLlxuICogTmVhcmx5IGFsd2F5cyB0aGlzIHdpbGwgYmUgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSB1c2VyIGlzIG5vIGxvbmdlclxuICogYXV0aG9yaXplZCB0byBzZWUgdGhlIGRhdGEgbWF0Y2hpbmcgdGhlIHRhcmdldC5cbiAqLyBhc3luYyBmdW5jdGlvbiBKYyh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEwodCk7XG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS10YWIgb25seS5cbiAgICAgICAgcy5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVRdWVyeVN0YXRlKGUsIFwicmVqZWN0ZWRcIiwgbik7XG4gICAgY29uc3QgaSA9IHMueWMuZ2V0KGUpLCByID0gaSAmJiBpLmtleTtcbiAgICBpZiAocikge1xuICAgICAgICAvLyBUT0RPKGtsaW10KTogV2UgcmVhbGx5IG9ubHkgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmcgb24gcGVybWlzc2lvblxuICAgICAgICAvLyBkZW5pZWQgZXJyb3JzLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgY2F1c2UgY29kZSBoZXJlLlxuICAgICAgICAvLyBJdCdzIGEgbGltYm8gZG9jLiBDcmVhdGUgYSBzeW50aGV0aWMgZXZlbnQgc2F5aW5nIGl0IHdhcyBkZWxldGVkLlxuICAgICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBoYWNrLiBJZGVhbGx5LCB3ZSB3b3VsZCBoYXZlIGEgbWV0aG9kIGluIHRoZSBsb2NhbFxuICAgICAgICAvLyBzdG9yZSB0byBwdXJnZSBhIGRvY3VtZW50LiBIb3dldmVyLCBpdCB3b3VsZCBiZSB0cmlja3kgdG8ga2VlcCBhbGwgb2ZcbiAgICAgICAgLy8gdGhlIGxvY2FsIHN0b3JlJ3MgaW52YXJpYW50cyB3aXRoIGFub3RoZXIgbWV0aG9kLlxuICAgICAgICBsZXQgdCA9IG5ldyBwZShodC5jb21wYXJhdG9yKTtcbiAgICAgICAgLy8gVE9ETyhiLzIxNzE4OTIxNik6IFRoaXMgbGltYm8gZG9jdW1lbnQgc2hvdWxkIGlkZWFsbHkgaGF2ZSBhIHJlYWQgdGltZSxcbiAgICAgICAgLy8gc28gdGhhdCBpdCBpcyBwaWNrZWQgdXAgYnkgYW55IHJlYWQtdGltZSBiYXNlZCBzY2Fucy4gVGhlIGJhY2tlbmQsXG4gICAgICAgIC8vIGhvd2V2ZXIsIGRvZXMgbm90IHNlbmQgYSByZWFkIHRpbWUgZm9yIHRhcmdldCByZW1vdmFscy5cbiAgICAgICAgICAgICAgICB0ID0gdC5pbnNlcnQociwgYW4ubmV3Tm9Eb2N1bWVudChyLCBydC5taW4oKSkpO1xuICAgICAgICBjb25zdCBuID0gZ3MoKS5hZGQociksIGkgPSBuZXcgbWkocnQubWluKCksIFxuICAgICAgICAvKiB0YXJnZXRDaGFuZ2VzPSAqLyBuZXcgTWFwLCBcbiAgICAgICAgLyogdGFyZ2V0TWlzbWF0Y2hlcz0gKi8gbmV3IHBlKGV0KSwgdCwgbik7XG4gICAgICAgIGF3YWl0IFdjKHMsIGkpLCBcbiAgICAgICAgLy8gU2luY2UgdGhpcyBxdWVyeSBmYWlsZWQsIHdlIHdvbid0IHdhbnQgdG8gbWFudWFsbHkgdW5saXN0ZW4gdG8gaXQuXG4gICAgICAgIC8vIFdlIG9ubHkgcmVtb3ZlIGl0IGZyb20gYm9va2tlZXBpbmcgYWZ0ZXIgd2Ugc3VjY2Vzc2Z1bGx5IGFwcGxpZWQgdGhlXG4gICAgICAgIC8vIFJlbW90ZUV2ZW50LiBJZiBgYXBwbHlSZW1vdGVFdmVudCgpYCB0aHJvd3MsIHdlIHdhbnQgdG8gcmUtbGlzdGVuIHRvXG4gICAgICAgIC8vIHRoaXMgcXVlcnkgd2hlbiB0aGUgUmVtb3RlU3RvcmUgcmVzdGFydHMgdGhlIFdhdGNoIHN0cmVhbSwgd2hpY2ggc2hvdWxkXG4gICAgICAgIC8vIHJlLXRyaWdnZXIgdGhlIHRhcmdldCBmYWlsdXJlLlxuICAgICAgICBzLmdjID0gcy5nYy5yZW1vdmUociksIHMueWMuZGVsZXRlKGUpLCBvYShzKTtcbiAgICB9IGVsc2UgYXdhaXQgbHUocy5sb2NhbFN0b3JlLCBlLCBcbiAgICAvKiBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YSAqLyAhMSkudGhlbigoKCkgPT4gbmEocywgZSwgbikpKS5jYXRjaCh2dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIFljKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KSwgcyA9IGUuYmF0Y2guYmF0Y2hJZDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgcnUobi5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgLy8gVGhlIGxvY2FsIHN0b3JlIG1heSBvciBtYXkgbm90IGJlIGFibGUgdG8gYXBwbHkgdGhlIHdyaXRlIHJlc3VsdCBhbmRcbiAgICAgICAgLy8gcmFpc2UgZXZlbnRzIGltbWVkaWF0ZWx5IChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgd2F0Y2hlciBpcyBjYXVnaHRcbiAgICAgICAgLy8gdXApLCBzbyB3ZSByYWlzZSB1c2VyIGNhbGxiYWNrcyBmaXJzdCBzbyB0aGF0IHRoZXkgY29uc2lzdGVudGx5IGhhcHBlblxuICAgICAgICAvLyBiZWZvcmUgbGlzdGVuIGV2ZW50cy5cbiAgICAgICAgICAgICAgICBlYShuLCBzLCAvKmVycm9yPSovIG51bGwpLCB0YShuLCBzKSwgbi5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVNdXRhdGlvblN0YXRlKHMsIFwiYWNrbm93bGVkZ2VkXCIpLCBcbiAgICAgICAgYXdhaXQgdWEobiwgdCk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgICBhd2FpdCB2dCh0KTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIFhjKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gTCh0KTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEwodCk7XG4gICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcIlJlamVjdCBiYXRjaFwiLCBcInJlYWR3cml0ZS1wcmltYXJ5XCIsICh0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5tdXRhdGlvblF1ZXVlLmxvb2t1cE11dGF0aW9uQmF0Y2godCwgZSkubmV4dCgoZSA9PiAoRihudWxsICE9PSBlKSwgcyA9IGUua2V5cygpLCBcbiAgICAgICAgICAgICAgICBuLm11dGF0aW9uUXVldWUucmVtb3ZlTXV0YXRpb25CYXRjaCh0LCBlKSkpKS5uZXh0KCgoKSA9PiBuLm11dGF0aW9uUXVldWUucGVyZm9ybUNvbnNpc3RlbmN5Q2hlY2sodCkpKS5uZXh0KCgoKSA9PiBuLmRvY3VtZW50T3ZlcmxheUNhY2hlLnJlbW92ZU92ZXJsYXlzRm9yQmF0Y2hJZCh0LCBzLCBlKSkpLm5leHQoKCgpID0+IG4ubG9jYWxEb2N1bWVudHMucmVjYWxjdWxhdGVBbmRTYXZlT3ZlcmxheXNGb3JEb2N1bWVudEtleXModCwgcykpKS5uZXh0KCgoKSA9PiBuLmxvY2FsRG9jdW1lbnRzLmdldERvY3VtZW50cyh0LCBzKSkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VzdCAobGF0ZXN0KSBiYXRjaCBpZCBpbiBtdXRhdGlvbiBxdWV1ZSB0aGF0IGlzIHBlbmRpbmdcbiAqIHNlcnZlciByZXNwb25zZS5cbiAqXG4gKiBSZXR1cm5zIGBCQVRDSElEX1VOS05PV05gIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAqLyAocy5sb2NhbFN0b3JlLCBlKTtcbiAgICAgICAgLy8gVGhlIGxvY2FsIHN0b3JlIG1heSBvciBtYXkgbm90IGJlIGFibGUgdG8gYXBwbHkgdGhlIHdyaXRlIHJlc3VsdCBhbmRcbiAgICAgICAgLy8gcmFpc2UgZXZlbnRzIGltbWVkaWF0ZWx5IChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgd2F0Y2hlciBpcyBjYXVnaHQgdXApLFxuICAgICAgICAvLyBzbyB3ZSByYWlzZSB1c2VyIGNhbGxiYWNrcyBmaXJzdCBzbyB0aGF0IHRoZXkgY29uc2lzdGVudGx5IGhhcHBlbiBiZWZvcmVcbiAgICAgICAgLy8gbGlzdGVuIGV2ZW50cy5cbiAgICAgICAgICAgICAgICBlYShzLCBlLCBuKSwgdGEocywgZSksIHMuc2hhcmVkQ2xpZW50U3RhdGUudXBkYXRlTXV0YXRpb25TdGF0ZShlLCBcInJlamVjdGVkXCIsIG4pLCBcbiAgICAgICAgYXdhaXQgdWEocywgdCk7XG4gICAgfSBjYXRjaCAobikge1xuICAgICAgICBhd2FpdCB2dChuKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgdXNlciBjYWxsYmFjayB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHBlbmRpbmcgbXV0YXRpb25zIGF0IHRoZSBtb21lbnQgb2YgY2FsbGluZ1xuICogYXJlIGFja25vd2xlZGdlZCAuXG4gKi8gYXN5bmMgZnVuY3Rpb24gWmModCwgZSkge1xuICAgIGNvbnN0IG4gPSBMKHQpO1xuICAgIGVjKG4ucmVtb3RlU3RvcmUpIHx8IE4oXCJTeW5jRW5naW5lXCIsIFwiVGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQuIFRoZSB0YXNrIHJldHVybmVkIGJ5ICdhd2FpdFBlbmRpbmdXcml0ZXMoKScgd2lsbCBub3QgY29tcGxldGUgdW50aWwgdGhlIG5ldHdvcmsgaXMgZW5hYmxlZC5cIik7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBMKHQpO1xuICAgICAgICAgICAgcmV0dXJuIGUucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJHZXQgaGlnaGVzdCB1bmFja25vd2xlZGdlZCBiYXRjaCBpZFwiLCBcInJlYWRvbmx5XCIsICh0ID0+IGUubXV0YXRpb25RdWV1ZS5nZXRIaWdoZXN0VW5hY2tub3dsZWRnZWRCYXRjaElkKHQpKSk7XG4gICAgICAgIH0obi5sb2NhbFN0b3JlKTtcbiAgICAgICAgaWYgKC0xID09PSB0KSBcbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgY2FsbGJhY2sgcmlnaHQgYXdheSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIHdyaXRlcyBhdCB0aGUgbW9tZW50LlxuICAgICAgICByZXR1cm4gdm9pZCBlLnJlc29sdmUoKTtcbiAgICAgICAgY29uc3QgcyA9IG4uRWMuZ2V0KHQpIHx8IFtdO1xuICAgICAgICBzLnB1c2goZSksIG4uRWMuc2V0KHQsIHMpO1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgY29uc3QgbiA9IEVjKHQsIFwiSW5pdGlhbGl6YXRpb24gb2Ygd2FpdEZvclBlbmRpbmdXcml0ZXMoKSBvcGVyYXRpb24gZmFpbGVkXCIpO1xuICAgICAgICBlLnJlamVjdChuKTtcbiAgICB9XG59XG5cbi8qKlxuICogVHJpZ2dlcnMgdGhlIGNhbGxiYWNrcyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGlzIGJhdGNoIGlkIHRvIGdldCBhY2tub3dsZWRnZWQgYnkgc2VydmVyLFxuICogaWYgdGhlcmUgYXJlIGFueS5cbiAqLyBmdW5jdGlvbiB0YSh0LCBlKSB7XG4gICAgKHQuRWMuZ2V0KGUpIHx8IFtdKS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgdC5yZXNvbHZlKCk7XG4gICAgfSkpLCB0LkVjLmRlbGV0ZShlKTtcbn1cblxuLyoqIFJlamVjdCBhbGwgb3V0c3RhbmRpbmcgY2FsbGJhY2tzIHdhaXRpbmcgZm9yIHBlbmRpbmcgd3JpdGVzIHRvIGNvbXBsZXRlLiAqLyBmdW5jdGlvbiBlYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEwodCk7XG4gICAgbGV0IGkgPSBzLlRjW3MuY3VycmVudFVzZXIudG9LZXkoKV07XG4gICAgLy8gTk9URTogTXV0YXRpb25zIHJlc3RvcmVkIGZyb20gcGVyc2lzdGVuY2Ugd29uJ3QgaGF2ZSBjYWxsYmFja3MsIHNvIGl0J3NcbiAgICAvLyBva2F5IGZvciB0aGVyZSB0byBiZSBubyBjYWxsYmFjayBmb3IgdGhpcyBJRC5cbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgY29uc3QgdCA9IGkuZ2V0KGUpO1xuICAgICAgICB0ICYmIChuID8gdC5yZWplY3QobikgOiB0LnJlc29sdmUoKSwgaSA9IGkucmVtb3ZlKGUpKSwgcy5UY1tzLmN1cnJlbnRVc2VyLnRvS2V5KCldID0gaTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5hKHQsIGUsIG4gPSBudWxsKSB7XG4gICAgdC5zaGFyZWRDbGllbnRTdGF0ZS5yZW1vdmVMb2NhbFF1ZXJ5VGFyZ2V0KGUpO1xuICAgIGZvciAoY29uc3QgcyBvZiB0Ll9jLmdldChlKSkgdC53Yy5kZWxldGUocyksIG4gJiYgdC5kYy5QYyhzLCBuKTtcbiAgICBpZiAodC5fYy5kZWxldGUoZSksIHQuaXNQcmltYXJ5Q2xpZW50KSB7XG4gICAgICAgIHQuSWMuSXMoZSkuZm9yRWFjaCgoZSA9PiB7XG4gICAgICAgICAgICB0LkljLmNvbnRhaW5zS2V5KGUpIHx8IFxuICAgICAgICAgICAgLy8gV2UgcmVtb3ZlZCB0aGUgbGFzdCByZWZlcmVuY2UgZm9yIHRoaXMga2V5XG4gICAgICAgICAgICBzYSh0LCBlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2EodCwgZSkge1xuICAgIHQubWMuZGVsZXRlKGUucGF0aC5jYW5vbmljYWxTdHJpbmcoKSk7XG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSB0YXJnZXQgYWxyZWFkeSBnb3QgcmVtb3ZlZCBiZWNhdXNlIHRoZSBxdWVyeSBmYWlsZWQuIEluIHRoYXQgY2FzZSxcbiAgICAvLyB0aGUga2V5IHdvbid0IGV4aXN0IGluIGBsaW1ib1RhcmdldHNCeUtleWAuIE9ubHkgZG8gdGhlIGNsZWFudXAgaWYgd2Ugc3RpbGwgaGF2ZSB0aGUgdGFyZ2V0LlxuICAgIGNvbnN0IG4gPSB0LmdjLmdldChlKTtcbiAgICBudWxsICE9PSBuICYmIChKdSh0LnJlbW90ZVN0b3JlLCBuKSwgdC5nYyA9IHQuZ2MucmVtb3ZlKGUpLCB0LnljLmRlbGV0ZShuKSwgb2EodCkpO1xufVxuXG5mdW5jdGlvbiBpYSh0LCBlLCBuKSB7XG4gICAgZm9yIChjb25zdCBzIG9mIG4pIGlmIChzIGluc3RhbmNlb2YgRmMpIHQuSWMuYWRkUmVmZXJlbmNlKHMua2V5LCBlKSwgcmEodCwgcyk7IGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBCYykge1xuICAgICAgICBOKFwiU3luY0VuZ2luZVwiLCBcIkRvY3VtZW50IG5vIGxvbmdlciBpbiBsaW1ibzogXCIgKyBzLmtleSksIHQuSWMucmVtb3ZlUmVmZXJlbmNlKHMua2V5LCBlKTtcbiAgICAgICAgdC5JYy5jb250YWluc0tleShzLmtleSkgfHwgXG4gICAgICAgIC8vIFdlIHJlbW92ZWQgdGhlIGxhc3QgcmVmZXJlbmNlIGZvciB0aGlzIGtleVxuICAgICAgICBzYSh0LCBzLmtleSk7XG4gICAgfSBlbHNlIE8oKTtcbn1cblxuZnVuY3Rpb24gcmEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBlLmtleSwgcyA9IG4ucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB0LmdjLmdldChuKSB8fCB0Lm1jLmhhcyhzKSB8fCAoTihcIlN5bmNFbmdpbmVcIiwgXCJOZXcgZG9jdW1lbnQgaW4gbGltYm86IFwiICsgbiksIHQubWMuYWRkKHMpLCBcbiAgICBvYSh0KSk7XG59XG5cbi8qKlxuICogU3RhcnRzIGxpc3RlbnMgZm9yIGRvY3VtZW50cyBpbiBsaW1ibyB0aGF0IGFyZSBlbnF1ZXVlZCBmb3IgcmVzb2x1dGlvbixcbiAqIHN1YmplY3QgdG8gYSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHJlc29sdXRpb25zLlxuICpcbiAqIFdpdGhvdXQgYm91bmRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHJlc29sdXRpb25zLCB0aGUgc2VydmVyIGNhbiBmYWlsXG4gKiB3aXRoIFwicmVzb3VyY2UgZXhoYXVzdGVkXCIgZXJyb3JzIHdoaWNoIGNhbiBsZWFkIHRvIHBhdGhvbG9naWNhbCBjbGllbnRcbiAqIGJlaGF2aW9yIGFzIHNlZW4gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvMjY4My5cbiAqLyBmdW5jdGlvbiBvYSh0KSB7XG4gICAgZm9yICg7dC5tYy5zaXplID4gMCAmJiB0LmdjLnNpemUgPCB0Lm1heENvbmN1cnJlbnRMaW1ib1Jlc29sdXRpb25zOyApIHtcbiAgICAgICAgY29uc3QgZSA9IHQubWMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICB0Lm1jLmRlbGV0ZShlKTtcbiAgICAgICAgY29uc3QgbiA9IG5ldyBodCh1dC5mcm9tU3RyaW5nKGUpKSwgcyA9IHQuQWMubmV4dCgpO1xuICAgICAgICB0LnljLnNldChzLCBuZXcgVWMobikpLCB0LmdjID0gdC5nYy5pbnNlcnQobiwgcyksIEh1KHQucmVtb3RlU3RvcmUsIG5ldyBjcihKbihHbihuLnBhdGgpKSwgcywgXCJUYXJnZXRQdXJwb3NlTGltYm9SZXNvbHV0aW9uXCIgLyogVGFyZ2V0UHVycG9zZS5MaW1ib1Jlc29sdXRpb24gKi8gLCBPdC5jdCkpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdWEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBMKHQpLCBpID0gW10sIHIgPSBbXSwgbyA9IFtdO1xuICAgIHMud2MuaXNFbXB0eSgpIHx8IChzLndjLmZvckVhY2goKCh0LCB1KSA9PiB7XG4gICAgICAgIG8ucHVzaChzLlJjKHUsIGUsIG4pLnRoZW4oKHQgPT4ge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHZpZXdzIGlmIHRoZXJlIGFyZSBhY3R1YWwgY2hhbmdlcy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBjaGFuZ2VzLCBvciB3ZSBhcmUgaGFuZGxpbmcgYSBnbG9iYWwgc25hcHNob3QsIG5vdGlmeVxuICAgICAgICAgICAgLy8gc2Vjb25kYXJ5IGNsaWVudHMgdG8gdXBkYXRlIHF1ZXJ5IHN0YXRlLlxuICAgICAgICAgICAgKHQgfHwgbikgJiYgcy5pc1ByaW1hcnlDbGllbnQgJiYgcy5zaGFyZWRDbGllbnRTdGF0ZS51cGRhdGVRdWVyeVN0YXRlKHUudGFyZ2V0SWQsIChudWxsID09IHQgPyB2b2lkIDAgOiB0LmZyb21DYWNoZSkgPyBcIm5vdC1jdXJyZW50XCIgOiBcImN1cnJlbnRcIiksIFxuICAgICAgICAgICAgdCkge1xuICAgICAgICAgICAgICAgIGkucHVzaCh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdHUuTGkodS50YXJnZXRJZCwgdCk7XG4gICAgICAgICAgICAgICAgci5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSkpO1xuICAgIH0pKSwgYXdhaXQgUHJvbWlzZS5hbGwobyksIHMuZGMubnUoaSksIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEwodCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwibm90aWZ5TG9jYWxWaWV3Q2hhbmdlc1wiLCBcInJlYWR3cml0ZVwiLCAodCA9PiBSdC5mb3JFYWNoKGUsIChlID0+IFJ0LmZvckVhY2goZS5GaSwgKHMgPT4gbi5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5hZGRSZWZlcmVuY2UodCwgZS50YXJnZXRJZCwgcykpKS5uZXh0KCgoKSA9PiBSdC5mb3JFYWNoKGUuQmksIChzID0+IG4ucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUucmVtb3ZlUmVmZXJlbmNlKHQsIGUudGFyZ2V0SWQsIHMpKSkpKSkpKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGlmICghRHQodCkpIHRocm93IHQ7XG4gICAgICAgICAgICAvLyBJZiBgbm90aWZ5TG9jYWxWaWV3Q2hhbmdlc2AgZmFpbHMsIHdlIGRpZCBub3QgYWR2YW5jZSB0aGUgc2VxdWVuY2VcbiAgICAgICAgICAgIC8vIG51bWJlciBmb3IgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgdHJpZ2dlciB0aGVtIHRvIGJlIGRlbGV0ZWQgZWFybGllciB0aGFuIHRoZXkgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyB3b3VsZCBoYXZlLCBidXQgaXQgc2hvdWxkIG5vdCBpbnZhbGlkYXRlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRhdGEuXG4gICAgICAgICAgICBOKFwiTG9jYWxTdG9yZVwiLCBcIkZhaWxlZCB0byB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyczogXCIgKyB0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQudGFyZ2V0SWQ7XG4gICAgICAgICAgICBpZiAoIXQuZnJvbUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG4uSmkuZ2V0KGUpLCBzID0gdC5zbmFwc2hvdFZlcnNpb24sIGkgPSB0LndpdGhMYXN0TGltYm9GcmVlU25hcHNob3RWZXJzaW9uKHMpO1xuICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIGxhc3QgbGltYm8gZnJlZSBzbmFwc2hvdCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uSmkgPSBuLkppLmluc2VydChlLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0ocy5sb2NhbFN0b3JlLCByKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICBpZiAoIW4uY3VycmVudFVzZXIuaXNFcXVhbChlKSkge1xuICAgICAgICBOKFwiU3luY0VuZ2luZVwiLCBcIlVzZXIgY2hhbmdlLiBOZXcgdXNlcjpcIiwgZS50b0tleSgpKTtcbiAgICAgICAgY29uc3QgdCA9IGF3YWl0IGl1KG4ubG9jYWxTdG9yZSwgZSk7XG4gICAgICAgIG4uY3VycmVudFVzZXIgPSBlLCBcbiAgICAgICAgLy8gRmFpbHMgdGFza3Mgd2FpdGluZyBmb3IgcGVuZGluZyB3cml0ZXMgcmVxdWVzdGVkIGJ5IHByZXZpb3VzIHVzZXIuXG4gICAgICAgIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHQuRWMuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdC5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdC5yZWplY3QobmV3IFUocS5DQU5DRUxMRUQsIGUpKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSksIHQuRWMuY2xlYXIoKTtcbiAgICAgICAgfShuLCBcIid3YWl0Rm9yUGVuZGluZ1dyaXRlcycgcHJvbWlzZSBpcyByZWplY3RlZCBkdWUgdG8gYSB1c2VyIGNoYW5nZS5cIiksIFxuICAgICAgICAvLyBUT0RPKGIvMTE0MjI2NDE3KTogQ29uc2lkZXIgY2FsbGluZyB0aGlzIG9ubHkgaW4gdGhlIHByaW1hcnkgdGFiLlxuICAgICAgICBuLnNoYXJlZENsaWVudFN0YXRlLmhhbmRsZVVzZXJDaGFuZ2UoZSwgdC5yZW1vdmVkQmF0Y2hJZHMsIHQuYWRkZWRCYXRjaElkcyksIGF3YWl0IHVhKG4sIHQuZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBMKHQpLCBzID0gbi55Yy5nZXQoZSk7XG4gICAgaWYgKHMgJiYgcy5mYykgcmV0dXJuIGdzKCkuYWRkKHMua2V5KTtcbiAgICB7XG4gICAgICAgIGxldCB0ID0gZ3MoKTtcbiAgICAgICAgY29uc3QgcyA9IG4uX2MuZ2V0KGUpO1xuICAgICAgICBpZiAoIXMpIHJldHVybiB0O1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2Ygcykge1xuICAgICAgICAgICAgY29uc3QgcyA9IG4ud2MuZ2V0KGUpO1xuICAgICAgICAgICAgdCA9IHQudW5pb25XaXRoKHMudmlldy5uYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlY29uY2lsZSB0aGUgbGlzdCBvZiBzeW5jZWQgZG9jdW1lbnRzIGluIGFuIGV4aXN0aW5nIHZpZXcgd2l0aCB0aG9zZVxuICogZnJvbSBwZXJzaXN0ZW5jZS5cbiAqLyBhc3luYyBmdW5jdGlvbiBoYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IEwodCksIHMgPSBhd2FpdCBmdShuLmxvY2FsU3RvcmUsIGUucXVlcnksIFxuICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITApLCBpID0gZS52aWV3LmhjKHMpO1xuICAgIHJldHVybiBuLmlzUHJpbWFyeUNsaWVudCAmJiBpYShuLCBlLnRhcmdldElkLCBpLmNjKSwgaTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgbmV3bHkgY2hhbmdlZCBkb2N1bWVudHMgZnJvbSByZW1vdGUgZG9jdW1lbnQgY2FjaGUgYW5kIHJhaXNlc1xuICogc25hcHNob3RzIGlmIG5lZWRlZC5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIGxhKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICByZXR1cm4gd3Uobi5sb2NhbFN0b3JlLCBlKS50aGVuKCh0ID0+IHVhKG4sIHQpKSk7XG59XG5cbi8qKiBBcHBsaWVzIGEgbXV0YXRpb24gc3RhdGUgdG8gYW4gZXhpc3RpbmcgYmF0Y2guICAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIGZhKHQsIGUsIG4sIHMpIHtcbiAgICBjb25zdCBpID0gTCh0KSwgciA9IGF3YWl0IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEwodCksIHMgPSBMKG4ubXV0YXRpb25RdWV1ZSk7XG4gICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiTG9va3VwIG11dGF0aW9uIGRvY3VtZW50c1wiLCBcInJlYWRvbmx5XCIsICh0ID0+IHMuU24odCwgZSkubmV4dCgoZSA9PiBlID8gbi5sb2NhbERvY3VtZW50cy5nZXREb2N1bWVudHModCwgZSkgOiBSdC5yZXNvbHZlKG51bGwpKSkpKTtcbiAgICB9XG4gICAgLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbiAgICAoaS5sb2NhbFN0b3JlLCBlKTtcbiAgICBudWxsICE9PSByID8gKFwicGVuZGluZ1wiID09PSBuID8gXG4gICAgLy8gSWYgd2UgYXJlIHRoZSBwcmltYXJ5IGNsaWVudCwgd2UgbmVlZCB0byBzZW5kIHRoaXMgd3JpdGUgdG8gdGhlXG4gICAgLy8gYmFja2VuZC4gU2Vjb25kYXJ5IGNsaWVudHMgd2lsbCBpZ25vcmUgdGhlc2Ugd3JpdGVzIHNpbmNlIHRoZWlyIHJlbW90ZVxuICAgIC8vIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWQuXG4gICAgYXdhaXQgY2MoaS5yZW1vdGVTdG9yZSkgOiBcImFja25vd2xlZGdlZFwiID09PSBuIHx8IFwicmVqZWN0ZWRcIiA9PT0gbiA/IChcbiAgICAvLyBOT1RFOiBCb3RoIHRoZXNlIG1ldGhvZHMgYXJlIG5vLW9wcyBmb3IgYmF0Y2hlcyB0aGF0IG9yaWdpbmF0ZWQgZnJvbVxuICAgIC8vIG90aGVyIGNsaWVudHMuXG4gICAgZWEoaSwgZSwgcyB8fCBudWxsKSwgdGEoaSwgZSksIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgTChMKHQpLm11dGF0aW9uUXVldWUpLkNuKGUpO1xuICAgIH1cbiAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuICAgIChpLmxvY2FsU3RvcmUsIGUpKSA6IE8oKSwgYXdhaXQgdWEoaSwgcikpIDogXG4gICAgLy8gQSB0aHJvdHRsZWQgdGFiIG1heSBub3QgaGF2ZSBzZWVuIHRoZSBtdXRhdGlvbiBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZFxuICAgIC8vIGFuZCByZW1vdmVkIGZyb20gdGhlIG11dGF0aW9uIHF1ZXVlLCBpbiB3aGljaCBjYXNlIHdlIHdvbid0IGhhdmUgY2FjaGVkXG4gICAgLy8gdGhlIGFmZmVjdGVkIGRvY3VtZW50cy4gSW4gdGhpcyBjYXNlIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSB1cGRhdGVcbiAgICAvLyBzaW5jZSB0aGF0IG1lYW5zIHdlIGRpZG4ndCBhcHBseSB0aGUgbXV0YXRpb24gbG9jYWxseSBhdCBhbGwgKGlmIHdlXG4gICAgLy8gaGFkLCB3ZSB3b3VsZCBoYXZlIGNhY2hlZCB0aGUgYWZmZWN0ZWQgZG9jdW1lbnRzKSwgYW5kIHNvIHdlIHdpbGwganVzdFxuICAgIC8vIHNlZSBhbnkgcmVzdWx0aW5nIGRvY3VtZW50IGNoYW5nZXMgdmlhIG5vcm1hbCByZW1vdGUgZG9jdW1lbnQgdXBkYXRlc1xuICAgIC8vIGFzIGFwcGxpY2FibGUuXG4gICAgTihcIlN5bmNFbmdpbmVcIiwgXCJDYW5ub3QgYXBwbHkgbXV0YXRpb24gYmF0Y2ggd2l0aCBpZDogXCIgKyBlKTtcbn1cblxuLyoqIEFwcGxpZXMgYSBxdWVyeSB0YXJnZXQgY2hhbmdlIGZyb20gYSBkaWZmZXJlbnQgdGFiLiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmFzeW5jIGZ1bmN0aW9uIGRhKHQsIGUpIHtcbiAgICBjb25zdCBuID0gTCh0KTtcbiAgICBpZiAocGEobiksIElhKG4pLCAhMCA9PT0gZSAmJiAhMCAhPT0gbi52Yykge1xuICAgICAgICAvLyBTZWNvbmRhcnkgdGFicyBvbmx5IG1haW50YWluIFZpZXdzIGZvciB0aGVpciBsb2NhbCBsaXN0ZW5lcnMgYW5kIHRoZVxuICAgICAgICAvLyBWaWV3cyBpbnRlcm5hbCBzdGF0ZSBtYXkgbm90IGJlIDEwMCUgcG9wdWxhdGVkIChpbiBwYXJ0aWN1bGFyXG4gICAgICAgIC8vIHNlY29uZGFyeSB0YWJzIGRvbid0IHRyYWNrIHN5bmNlZERvY3VtZW50cywgdGhlIHNldCBvZiBkb2N1bWVudHMgdGhlXG4gICAgICAgIC8vIHNlcnZlciBjb25zaWRlcnMgdG8gYmUgaW4gdGhlIHRhcmdldCkuIFNvIHdoZW4gYSBzZWNvbmRhcnkgYmVjb21lc1xuICAgICAgICAvLyBwcmltYXJ5LCB3ZSBuZWVkIHRvIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHZpZXdzIGZvciBhbGwgdGFyZ2V0c1xuICAgICAgICAvLyBtYXRjaCB0aGUgc3RhdGUgb24gZGlzay5cbiAgICAgICAgY29uc3QgdCA9IG4uc2hhcmVkQ2xpZW50U3RhdGUuZ2V0QWxsQWN0aXZlUXVlcnlUYXJnZXRzKCksIGUgPSBhd2FpdCB3YShuLCB0LnRvQXJyYXkoKSk7XG4gICAgICAgIG4udmMgPSAhMCwgYXdhaXQgeWMobi5yZW1vdGVTdG9yZSwgITApO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkgSHUobi5yZW1vdGVTdG9yZSwgdCk7XG4gICAgfSBlbHNlIGlmICghMSA9PT0gZSAmJiAhMSAhPT0gbi52Yykge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIGxldCBlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIG4uX2MuZm9yRWFjaCgoKHMsIGkpID0+IHtcbiAgICAgICAgICAgIG4uc2hhcmVkQ2xpZW50U3RhdGUuaXNMb2NhbFF1ZXJ5VGFyZ2V0KGkpID8gdC5wdXNoKGkpIDogZSA9IGUudGhlbigoKCkgPT4gKG5hKG4sIGkpLCBcbiAgICAgICAgICAgIGx1KG4ubG9jYWxTdG9yZSwgaSwgXG4gICAgICAgICAgICAvKmtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhPSovICEwKSkpKSwgSnUobi5yZW1vdGVTdG9yZSwgaSk7XG4gICAgICAgIH0pKSwgYXdhaXQgZSwgYXdhaXQgd2EobiwgdCksIFxuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gTCh0KTtcbiAgICAgICAgICAgIGUueWMuZm9yRWFjaCgoKHQsIG4pID0+IHtcbiAgICAgICAgICAgICAgICBKdShlLnJlbW90ZVN0b3JlLCBuKTtcbiAgICAgICAgICAgIH0pKSwgZS5JYy5UcygpLCBlLnljID0gbmV3IE1hcCwgZS5nYyA9IG5ldyBwZShodC5jb21wYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFJlY29uY2lsZSB0aGUgcXVlcnkgdmlld3Mgb2YgdGhlIHByb3ZpZGVkIHF1ZXJ5IHRhcmdldHMgd2l0aCB0aGUgc3RhdGUgZnJvbVxuICogcGVyc2lzdGVuY2UuIFJhaXNlcyBzbmFwc2hvdHMgZm9yIGFueSBjaGFuZ2VzIHRoYXQgYWZmZWN0IHRoZSBsb2NhbFxuICogY2xpZW50IGFuZCByZXR1cm5zIHRoZSB1cGRhdGVkIHN0YXRlIG9mIGFsbCB0YXJnZXQncyBxdWVyeSBkYXRhLlxuICpcbiAqIEBwYXJhbSBzeW5jRW5naW5lIC0gVGhlIHN5bmMgZW5naW5lIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gdGFyZ2V0cyAtIHRoZSBsaXN0IG9mIHRhcmdldHMgd2l0aCB2aWV3cyB0aGF0IG5lZWQgdG8gYmUgcmVjb21wdXRlZFxuICogQHBhcmFtIHRyYW5zaXRpb25Ub1ByaW1hcnkgLSBgdHJ1ZWAgaWZmIHRoZSB0YWIgdHJhbnNpdGlvbnMgZnJvbSBhIHNlY29uZGFyeVxuICogdGFiIHRvIGEgcHJpbWFyeSB0YWJcbiAqL1xuICAgICAgICAvLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuICAgICAgICAobiksIG4udmMgPSAhMSwgYXdhaXQgeWMobi5yZW1vdGVTdG9yZSwgITEpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2EodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBMKHQpLCBpID0gW10sIHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgY29uc3QgbiA9IHMuX2MuZ2V0KHQpO1xuICAgICAgICBpZiAobiAmJiAwICE9PSBuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRm9yIHF1ZXJpZXMgdGhhdCBoYXZlIGEgbG9jYWwgVmlldywgd2UgZmV0Y2ggdGhlaXIgY3VycmVudCBzdGF0ZVxuICAgICAgICAgICAgLy8gZnJvbSBMb2NhbFN0b3JlIChhcyB0aGUgcmVzdW1lIHRva2VuIGFuZCB0aGUgc25hcHNob3QgdmVyc2lvblxuICAgICAgICAgICAgLy8gbWlnaHQgaGF2ZSBjaGFuZ2VkKSBhbmQgcmVjb25jaWxlIHRoZWlyIHZpZXdzIHdpdGggdGhlIHBlcnNpc3RlZFxuICAgICAgICAgICAgLy8gc3RhdGUgKHRoZSBsaXN0IG9mIHN5bmNlZERvY3VtZW50cyBtYXkgaGF2ZSBnb3R0ZW4gb3V0IG9mIHN5bmMpLlxuICAgICAgICAgICAgZSA9IGF3YWl0IGh1KHMubG9jYWxTdG9yZSwgSm4oblswXSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gcy53Yy5nZXQodCksIG4gPSBhd2FpdCBoYShzLCBlKTtcbiAgICAgICAgICAgICAgICBuLnNuYXBzaG90ICYmIHIucHVzaChuLnNuYXBzaG90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBxdWVyaWVzIHRoYXQgbmV2ZXIgZXhlY3V0ZWQgb24gdGhpcyBjbGllbnQsIHdlIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZSB0YXJnZXQgaW4gTG9jYWxTdG9yZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBWaWV3LlxuICAgICAgICAgICAgY29uc3QgbiA9IGF3YWl0IGR1KHMubG9jYWxTdG9yZSwgdCk7XG4gICAgICAgICAgICBlID0gYXdhaXQgaHUocy5sb2NhbFN0b3JlLCBuKSwgYXdhaXQgUWMocywgX2EobiksIHQsIFxuICAgICAgICAgICAgLypjdXJyZW50PSovICExLCBlLnJlc3VtZVRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpLnB1c2goZSk7XG4gICAgfVxuICAgIHJldHVybiBzLmRjLm51KHIpLCBpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBgUXVlcnlgIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgYFRhcmdldGAuIFRoZXJlIGlzIG5vIHdheSB0b1xuICogb2J0YWluIHRoZSBvcmlnaW5hbCBgUXVlcnlgLCBzbyB3ZSBzeW50aGVzaXplIGEgYFF1ZXJ5YCBmcm9tIHRoZSBgVGFyZ2V0YFxuICogb2JqZWN0LlxuICpcbiAqIFRoZSBzeW50aGVzaXplZCByZXN1bHQgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGBRdWVyeWAsIGJ1dFxuICogc2luY2UgdGhlIHN5bnRoZXNpemVkIGBRdWVyeWAgc2hvdWxkIHJldHVybiB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZVxuICogb3JpZ2luYWwgb25lIChvbmx5IHRoZSBwcmVzZW50YXRpb24gb2YgcmVzdWx0cyBtaWdodCBkaWZmZXIpLCB0aGUgcG90ZW50aWFsXG4gKiBkaWZmZXJlbmNlIHdpbGwgbm90IGNhdXNlIGlzc3Vlcy5cbiAqL1xuLy8gUE9SVElORyBOT1RFOiBNdWx0aS1UYWIgb25seS5cbmZ1bmN0aW9uIF9hKHQpIHtcbiAgICByZXR1cm4gS24odC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgdC5vcmRlckJ5LCB0LmZpbHRlcnMsIHQubGltaXQsIFwiRlwiIC8qIExpbWl0VHlwZS5GaXJzdCAqLyAsIHQuc3RhcnRBdCwgdC5lbmRBdCk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBJRHMgb2YgdGhlIGNsaWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZS4gKi9cbi8vIFBPUlRJTkcgTk9URTogTXVsdGktVGFiIG9ubHkuXG5mdW5jdGlvbiBtYSh0KSB7XG4gICAgY29uc3QgZSA9IEwodCk7XG4gICAgcmV0dXJuIEwoTChlLmxvY2FsU3RvcmUpLnBlcnNpc3RlbmNlKS4kaSgpO1xufVxuXG4vKiogQXBwbGllcyBhIHF1ZXJ5IHRhcmdldCBjaGFuZ2UgZnJvbSBhIGRpZmZlcmVudCB0YWIuICovXG4vLyBQT1JUSU5HIE5PVEU6IE11bHRpLVRhYiBvbmx5LlxuYXN5bmMgZnVuY3Rpb24gZ2EodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBMKHQpO1xuICAgIGlmIChpLnZjKSBcbiAgICAvLyBJZiB3ZSByZWNlaXZlIGEgdGFyZ2V0IHN0YXRlIG5vdGlmaWNhdGlvbiB2aWEgV2ViU3RvcmFnZSwgd2UgYXJlXG4gICAgLy8gZWl0aGVyIGFscmVhZHkgc2Vjb25kYXJ5IG9yIGFub3RoZXIgdGFiIGhhcyB0YWtlbiB0aGUgcHJpbWFyeSBsZWFzZS5cbiAgICByZXR1cm4gdm9pZCBOKFwiU3luY0VuZ2luZVwiLCBcIklnbm9yaW5nIHVuZXhwZWN0ZWQgcXVlcnkgc3RhdGUgbm90aWZpY2F0aW9uLlwiKTtcbiAgICBjb25zdCByID0gaS5fYy5nZXQoZSk7XG4gICAgaWYgKHIgJiYgci5sZW5ndGggPiAwKSBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgXCJjdXJyZW50XCI6XG4gICAgICBjYXNlIFwibm90LWN1cnJlbnRcIjpcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdCA9IGF3YWl0IHd1KGkubG9jYWxTdG9yZSwgc3MoclswXSkpLCBzID0gbWkuY3JlYXRlU3ludGhlc2l6ZWRSZW1vdGVFdmVudEZvckN1cnJlbnRDaGFuZ2UoZSwgXCJjdXJyZW50XCIgPT09IG4sIFZlLkVNUFRZX0JZVEVfU1RSSU5HKTtcbiAgICAgICAgICAgIGF3YWl0IHVhKGksIHQsIHMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICAgIGF3YWl0IGx1KGkubG9jYWxTdG9yZSwgZSwgXG4gICAgICAgIC8qIGtlZXBQZXJzaXN0ZWRUYXJnZXREYXRhICovICEwKSwgbmEoaSwgZSwgcyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBPKCk7XG4gICAgfVxufVxuXG4vKiogQWRkcyBvciByZW1vdmVzIFdhdGNoIHRhcmdldHMgZm9yIHF1ZXJpZXMgZnJvbSBkaWZmZXJlbnQgdGFicy4gKi8gYXN5bmMgZnVuY3Rpb24geWEodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBwYSh0KTtcbiAgICBpZiAocy52Yykge1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZSkge1xuICAgICAgICAgICAgaWYgKHMuX2MuaGFzKHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gQSB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIGluIGEgcHJldmlvdXMgYXR0ZW1wdFxuICAgICAgICAgICAgICAgIE4oXCJTeW5jRW5naW5lXCIsIFwiQWRkaW5nIGFuIGFscmVhZHkgYWN0aXZlIHRhcmdldCBcIiArIHQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZSA9IGF3YWl0IGR1KHMubG9jYWxTdG9yZSwgdCksIG4gPSBhd2FpdCBodShzLmxvY2FsU3RvcmUsIGUpO1xuICAgICAgICAgICAgYXdhaXQgUWMocywgX2EoZSksIG4udGFyZ2V0SWQsIFxuICAgICAgICAgICAgLypjdXJyZW50PSovICExLCBuLnJlc3VtZVRva2VuKSwgSHUocy5yZW1vdGVTdG9yZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIFxuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSB0YXJnZXQgaXMgc3RpbGwgYWN0aXZlIHNpbmNlIHRoZSB0YXJnZXQgbWlnaHQgaGF2ZSBiZWVuXG4gICAgICAgIC8vIHJlbW92ZWQgaWYgaXQgaGFzIGJlZW4gcmVqZWN0ZWQgYnkgdGhlIGJhY2tlbmQuXG4gICAgICAgIHMuX2MuaGFzKHQpICYmIFxuICAgICAgICAvLyBSZWxlYXNlIHF1ZXJpZXMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlLlxuICAgICAgICBhd2FpdCBsdShzLmxvY2FsU3RvcmUsIHQsIFxuICAgICAgICAvKiBrZWVwUGVyc2lzdGVkVGFyZ2V0RGF0YSAqLyAhMSkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgSnUocy5yZW1vdGVTdG9yZSwgdCksIG5hKHMsIHQpO1xuICAgICAgICB9KSkuY2F0Y2godnQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGEodCkge1xuICAgIGNvbnN0IGUgPSBMKHQpO1xuICAgIHJldHVybiBlLnJlbW90ZVN0b3JlLnJlbW90ZVN5bmNlci5hcHBseVJlbW90ZUV2ZW50ID0gV2MuYmluZChudWxsLCBlKSwgZS5yZW1vdGVTdG9yZS5yZW1vdGVTeW5jZXIuZ2V0UmVtb3RlS2V5c0ZvclRhcmdldCA9IGFhLmJpbmQobnVsbCwgZSksIFxuICAgIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLnJlamVjdExpc3RlbiA9IEpjLmJpbmQobnVsbCwgZSksIGUuZGMubnUgPSBEYy5iaW5kKG51bGwsIGUuZXZlbnRNYW5hZ2VyKSwgXG4gICAgZS5kYy5QYyA9IENjLmJpbmQobnVsbCwgZS5ldmVudE1hbmFnZXIpLCBlO1xufVxuXG5mdW5jdGlvbiBJYSh0KSB7XG4gICAgY29uc3QgZSA9IEwodCk7XG4gICAgcmV0dXJuIGUucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLmFwcGx5U3VjY2Vzc2Z1bFdyaXRlID0gWWMuYmluZChudWxsLCBlKSwgZS5yZW1vdGVTdG9yZS5yZW1vdGVTeW5jZXIucmVqZWN0RmFpbGVkV3JpdGUgPSBYYy5iaW5kKG51bGwsIGUpLCBcbiAgICBlO1xufVxuXG4vKipcbiAqIExvYWRzIGEgRmlyZXN0b3JlIGJ1bmRsZSBpbnRvIHRoZSBTREsuIFRoZSByZXR1cm5lZCBwcm9taXNlIHJlc29sdmVzIHdoZW5cbiAqIHRoZSBidW5kbGUgZmluaXNoZWQgbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0gc3luY0VuZ2luZSAtIFN5bmNFbmdpbmUgdG8gdXNlLlxuICogQHBhcmFtIGJ1bmRsZVJlYWRlciAtIEJ1bmRsZSB0byBsb2FkIGludG8gdGhlIFNESy5cbiAqIEBwYXJhbSB0YXNrIC0gTG9hZEJ1bmRsZVRhc2sgdXNlZCB0byB1cGRhdGUgdGhlIGxvYWRpbmcgcHJvZ3Jlc3MgdG8gcHVibGljIEFQSS5cbiAqLyBmdW5jdGlvbiBUYSh0LCBlLCBuKSB7XG4gICAgY29uc3QgcyA9IEwodCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAoXG4gICAgLyoqIExvYWRzIGEgYnVuZGxlIGFuZCByZXR1cm5zIHRoZSBsaXN0IG9mIGFmZmVjdGVkIGNvbGxlY3Rpb24gZ3JvdXBzLiAqL1xuICAgIGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBlLmdldE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBMKHQpLCBzID0gTmkoZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5wZXJzaXN0ZW5jZS5ydW5UcmFuc2FjdGlvbihcImhhc05ld2VyQnVuZGxlXCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5xcy5nZXRCdW5kbGVNZXRhZGF0YSh0LCBlLmlkKSkpLnRoZW4oKHQgPT4gISF0ICYmIHQuY3JlYXRlVGltZS5jb21wYXJlVG8ocykgPj0gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gKiBTYXZlcyB0aGUgZ2l2ZW4gYEJ1bmRsZU1ldGFkYXRhYCB0byBsb2NhbCBwZXJzaXN0ZW5jZS5cbiAqLyAodC5sb2NhbFN0b3JlLCBzKSkgcmV0dXJuIGF3YWl0IGUuY2xvc2UoKSwgbi5fY29tcGxldGVXaXRoKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0YXNrU3RhdGU6IFwiU3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudHNMb2FkZWQ6IHQudG90YWxEb2N1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzTG9hZGVkOiB0LnRvdGFsQnl0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRG9jdW1lbnRzOiB0LnRvdGFsRG9jdW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzOiB0LnRvdGFsQnl0ZXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfShzKSksIFByb21pc2UucmVzb2x2ZShuZXcgU2V0KTtcbiAgICAgICAgICAgIG4uX3VwZGF0ZVByb2dyZXNzKE9jKHMpKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgJGMocywgdC5sb2NhbFN0b3JlLCBlLnNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCBlLmJjKCk7XG4gICAgICAgICAgICBmb3IgKDtyOyApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gYXdhaXQgaS56dShyKTtcbiAgICAgICAgICAgICAgICB0ICYmIG4uX3VwZGF0ZVByb2dyZXNzKHQpLCByID0gYXdhaXQgZS5iYygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbyA9IGF3YWl0IGkuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB1YSh0LCBvLkp1LCBcbiAgICAgICAgICAgIC8qIHJlbW90ZUV2ZW50ICovIHZvaWQgMCksIFxuICAgICAgICAgICAgLy8gU2F2ZSBtZXRhZGF0YSwgc28gbG9hZGluZyB0aGUgc2FtZSBidW5kbGUgd2lsbCBza2lwLlxuICAgICAgICAgICAgYXdhaXQgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBMKHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiU2F2ZSBidW5kbGVcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gbi5xcy5zYXZlQnVuZGxlTWV0YWRhdGEodCwgZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogUmV0dXJucyBhIHByb21pc2Ugb2YgYSBgTmFtZWRRdWVyeWAgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHF1ZXJ5IG5hbWUuIFByb21pc2VcbiAqIHJlc29sdmVzIHRvIHVuZGVmaW5lZCBpZiBubyBwZXJzaXN0ZWQgZGF0YSBjYW4gYmUgZm91bmQuXG4gKi8gKHQubG9jYWxTdG9yZSwgcyksIG4uX2NvbXBsZXRlV2l0aChvLnByb2dyZXNzKSwgUHJvbWlzZS5yZXNvbHZlKG8uSHUpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gTShcIlN5bmNFbmdpbmVcIiwgYExvYWRpbmcgYnVuZGxlIGZhaWxlZCB3aXRoICR7dH1gKSwgbi5fZmFpbFdpdGgodCksIFByb21pc2UucmVzb2x2ZShuZXcgU2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuICAgIC8qKlxuICogUHJvdmlkZXMgYWxsIGNvbXBvbmVudHMgbmVlZGVkIGZvciBGaXJlc3RvcmUgd2l0aCBpbi1tZW1vcnkgcGVyc2lzdGVuY2UuXG4gKiBVc2VzIEVhZ2VyR0MgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICovKShzLCBlLCBuKS50aGVuKCh0ID0+IHtcbiAgICAgICAgcy5zaGFyZWRDbGllbnRTdGF0ZS5ub3RpZnlCdW5kbGVMb2FkZWQodCk7XG4gICAgfSkpO1xufVxuXG5jbGFzcyBFYSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3luY2hyb25pemVUYWJzID0gITE7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBGdSh0LmRhdGFiYXNlSW5mby5kYXRhYmFzZUlkKSwgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZSA9IHRoaXMuY3JlYXRlU2hhcmVkQ2xpZW50U3RhdGUodCksIFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZSh0KSwgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zdGFydCgpLCB0aGlzLmxvY2FsU3RvcmUgPSB0aGlzLmNyZWF0ZUxvY2FsU3RvcmUodCksIFxuICAgICAgICB0aGlzLmdjU2NoZWR1bGVyID0gdGhpcy5jcmVhdGVHYXJiYWdlQ29sbGVjdGlvblNjaGVkdWxlcih0LCB0aGlzLmxvY2FsU3RvcmUpLCB0aGlzLmluZGV4QmFja2ZpbGxlclNjaGVkdWxlciA9IHRoaXMuY3JlYXRlSW5kZXhCYWNrZmlsbGVyU2NoZWR1bGVyKHQsIHRoaXMubG9jYWxTdG9yZSk7XG4gICAgfVxuICAgIGNyZWF0ZUdhcmJhZ2VDb2xsZWN0aW9uU2NoZWR1bGVyKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNyZWF0ZUluZGV4QmFja2ZpbGxlclNjaGVkdWxlcih0LCBlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjcmVhdGVMb2NhbFN0b3JlKHQpIHtcbiAgICAgICAgcmV0dXJuIHN1KHRoaXMucGVyc2lzdGVuY2UsIG5ldyBldSwgdC5pbml0aWFsVXNlciwgdGhpcy5zZXJpYWxpemVyKTtcbiAgICB9XG4gICAgY3JlYXRlUGVyc2lzdGVuY2UodCkge1xuICAgICAgICByZXR1cm4gbmV3IEtvKFFvLnpzLCB0aGlzLnNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgICBjcmVhdGVTaGFyZWRDbGllbnRTdGF0ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYnU7XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZSgpIHtcbiAgICAgICAgdGhpcy5nY1NjaGVkdWxlciAmJiB0aGlzLmdjU2NoZWR1bGVyLnN0b3AoKSwgYXdhaXQgdGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zaHV0ZG93bigpLCBcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zaHV0ZG93bigpO1xuICAgIH1cbn1cblxuY2xhc3MgQWEgZXh0ZW5kcyBFYSB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gdDtcbiAgICB9XG4gICAgY3JlYXRlR2FyYmFnZUNvbGxlY3Rpb25TY2hlZHVsZXIodCwgZSkge1xuICAgICAgICBGKHRoaXMucGVyc2lzdGVuY2UucmVmZXJlbmNlRGVsZWdhdGUgaW5zdGFuY2VvZiBqbyk7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnBlcnNpc3RlbmNlLnJlZmVyZW5jZURlbGVnYXRlLmdhcmJhZ2VDb2xsZWN0b3I7XG4gICAgICAgIHJldHVybiBuZXcgcG8obiwgdC5hc3luY1F1ZXVlLCBlKTtcbiAgICB9XG4gICAgY3JlYXRlUGVyc2lzdGVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gdm9pZCAwICE9PSB0aGlzLmNhY2hlU2l6ZUJ5dGVzID8gc28ud2l0aENhY2hlU2l6ZSh0aGlzLmNhY2hlU2l6ZUJ5dGVzKSA6IHNvLkRFRkFVTFQ7XG4gICAgICAgIHJldHVybiBuZXcgS28oKHQgPT4gam8uenModCwgZSkpLCB0aGlzLnNlcmlhbGl6ZXIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIEZpcmVzdG9yZSB3aXRoIEluZGV4ZWREQiBwZXJzaXN0ZW5jZS5cbiAqLyBjbGFzcyB2YSBleHRlbmRzIEVhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuVmMgPSB0LCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gZSwgdGhpcy5mb3JjZU93bmVyc2hpcCA9IG4sIHRoaXMuc3luY2hyb25pemVUYWJzID0gITE7XG4gICAgfVxuICAgIGFzeW5jIGluaXRpYWxpemUodCkge1xuICAgICAgICBhd2FpdCBzdXBlci5pbml0aWFsaXplKHQpLCBhd2FpdCB0aGlzLlZjLmluaXRpYWxpemUodGhpcywgdCksIFxuICAgICAgICAvLyBFbnF1ZXVlIHdyaXRlcyBmcm9tIGEgcHJldmlvdXMgc2Vzc2lvblxuICAgICAgICBhd2FpdCBJYSh0aGlzLlZjLnN5bmNFbmdpbmUpLCBhd2FpdCBjYyh0aGlzLlZjLnJlbW90ZVN0b3JlKSwgXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBsaXN0ZW5lciwgc28gd2UgbWFrZSBzdXJlIHRvXG4gICAgICAgIC8vIHNldCBpdCBhZnRlciBsb2NhbFN0b3JlIC8gcmVtb3RlU3RvcmUgYXJlIHN0YXJ0ZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdGVuY2UuSWkoKCgpID0+ICh0aGlzLmdjU2NoZWR1bGVyICYmICF0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0ZWQgJiYgdGhpcy5nY1NjaGVkdWxlci5zdGFydCgpLCBcbiAgICAgICAgdGhpcy5pbmRleEJhY2tmaWxsZXJTY2hlZHVsZXIgJiYgIXRoaXMuaW5kZXhCYWNrZmlsbGVyU2NoZWR1bGVyLnN0YXJ0ZWQgJiYgdGhpcy5pbmRleEJhY2tmaWxsZXJTY2hlZHVsZXIuc3RhcnQoKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpO1xuICAgIH1cbiAgICBjcmVhdGVMb2NhbFN0b3JlKHQpIHtcbiAgICAgICAgcmV0dXJuIHN1KHRoaXMucGVyc2lzdGVuY2UsIG5ldyBldSwgdC5pbml0aWFsVXNlciwgdGhpcy5zZXJpYWxpemVyKTtcbiAgICB9XG4gICAgY3JlYXRlR2FyYmFnZUNvbGxlY3Rpb25TY2hlZHVsZXIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gdGhpcy5wZXJzaXN0ZW5jZS5yZWZlcmVuY2VEZWxlZ2F0ZS5nYXJiYWdlQ29sbGVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IHBvKG4sIHQuYXN5bmNRdWV1ZSwgZSk7XG4gICAgfVxuICAgIGNyZWF0ZUluZGV4QmFja2ZpbGxlclNjaGVkdWxlcih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgJHQoZSwgdGhpcy5wZXJzaXN0ZW5jZSk7XG4gICAgICAgIHJldHVybiBuZXcgTXQodC5hc3luY1F1ZXVlLCBuKTtcbiAgICB9XG4gICAgY3JlYXRlUGVyc2lzdGVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gWm8odC5kYXRhYmFzZUluZm8uZGF0YWJhc2VJZCwgdC5kYXRhYmFzZUluZm8ucGVyc2lzdGVuY2VLZXkpLCBuID0gdm9pZCAwICE9PSB0aGlzLmNhY2hlU2l6ZUJ5dGVzID8gc28ud2l0aENhY2hlU2l6ZSh0aGlzLmNhY2hlU2l6ZUJ5dGVzKSA6IHNvLkRFRkFVTFQ7XG4gICAgICAgIHJldHVybiBuZXcgSm8odGhpcy5zeW5jaHJvbml6ZVRhYnMsIGUsIHQuY2xpZW50SWQsIG4sIHQuYXN5bmNRdWV1ZSwgJHUoKSwgT3UoKSwgdGhpcy5zZXJpYWxpemVyLCB0aGlzLnNoYXJlZENsaWVudFN0YXRlLCAhIXRoaXMuZm9yY2VPd25lcnNoaXApO1xuICAgIH1cbiAgICBjcmVhdGVTaGFyZWRDbGllbnRTdGF0ZSh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYnU7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGFsbCBjb21wb25lbnRzIG5lZWRlZCBmb3IgRmlyZXN0b3JlIHdpdGggbXVsdGktdGFiIEluZGV4ZWREQlxuICogcGVyc2lzdGVuY2UuXG4gKlxuICogSW4gdGhlIGxlZ2FjeSBjbGllbnQsIHRoaXMgcHJvdmlkZXIgaXMgdXNlZCB0byBwcm92aWRlIGJvdGggbXVsdGktdGFiIGFuZFxuICogbm9uLW11bHRpLXRhYiBwZXJzaXN0ZW5jZSBzaW5jZSB3ZSBjYW5ub3QgdGVsbCBhdCBidWlsZCB0aW1lIHdoZXRoZXJcbiAqIGBzeW5jaHJvbml6ZVRhYnNgIHdpbGwgYmUgZW5hYmxlZC5cbiAqLyBjbGFzcyBSYSBleHRlbmRzIHZhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHN1cGVyKHQsIGUsIC8qIGZvcmNlT3duZXJzaGlwPSAqLyAhMSksIHRoaXMuVmMgPSB0LCB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gZSwgdGhpcy5zeW5jaHJvbml6ZVRhYnMgPSAhMDtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSh0KSB7XG4gICAgICAgIGF3YWl0IHN1cGVyLmluaXRpYWxpemUodCk7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLlZjLnN5bmNFbmdpbmU7XG4gICAgICAgIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUgaW5zdGFuY2VvZiBQdSAmJiAodGhpcy5zaGFyZWRDbGllbnRTdGF0ZS5zeW5jRW5naW5lID0ge1xuICAgICAgICAgICAganI6IGZhLmJpbmQobnVsbCwgZSksXG4gICAgICAgICAgICB6cjogZ2EuYmluZChudWxsLCBlKSxcbiAgICAgICAgICAgIFdyOiB5YS5iaW5kKG51bGwsIGUpLFxuICAgICAgICAgICAgJGk6IG1hLmJpbmQobnVsbCwgZSksXG4gICAgICAgICAgICBRcjogbGEuYmluZChudWxsLCBlKVxuICAgICAgICB9LCBhd2FpdCB0aGlzLnNoYXJlZENsaWVudFN0YXRlLnN0YXJ0KCkpLCBcbiAgICAgICAgLy8gTk9URTogVGhpcyB3aWxsIGltbWVkaWF0ZWx5IGNhbGwgdGhlIGxpc3RlbmVyLCBzbyB3ZSBtYWtlIHN1cmUgdG9cbiAgICAgICAgLy8gc2V0IGl0IGFmdGVyIGxvY2FsU3RvcmUgLyByZW1vdGVTdG9yZSBhcmUgc3RhcnRlZC5cbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5JaSgoYXN5bmMgdCA9PiB7XG4gICAgICAgICAgICBhd2FpdCBkYSh0aGlzLlZjLnN5bmNFbmdpbmUsIHQpLCB0aGlzLmdjU2NoZWR1bGVyICYmICh0ICYmICF0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0ZWQgPyB0aGlzLmdjU2NoZWR1bGVyLnN0YXJ0KCkgOiB0IHx8IHRoaXMuZ2NTY2hlZHVsZXIuc3RvcCgpKSwgXG4gICAgICAgICAgICB0aGlzLmluZGV4QmFja2ZpbGxlclNjaGVkdWxlciAmJiAodCAmJiAhdGhpcy5pbmRleEJhY2tmaWxsZXJTY2hlZHVsZXIuc3RhcnRlZCA/IHRoaXMuaW5kZXhCYWNrZmlsbGVyU2NoZWR1bGVyLnN0YXJ0KCkgOiB0IHx8IHRoaXMuaW5kZXhCYWNrZmlsbGVyU2NoZWR1bGVyLnN0b3AoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY3JlYXRlU2hhcmVkQ2xpZW50U3RhdGUodCkge1xuICAgICAgICBjb25zdCBlID0gJHUoKTtcbiAgICAgICAgaWYgKCFQdS5EKGUpKSB0aHJvdyBuZXcgVShxLlVOSU1QTEVNRU5URUQsIFwiSW5kZXhlZERCIHBlcnNpc3RlbmNlIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgTG9jYWxTdG9yYWdlLlwiKTtcbiAgICAgICAgY29uc3QgbiA9IFpvKHQuZGF0YWJhc2VJbmZvLmRhdGFiYXNlSWQsIHQuZGF0YWJhc2VJbmZvLnBlcnNpc3RlbmNlS2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQdShlLCB0LmFzeW5jUXVldWUsIG4sIHQuY2xpZW50SWQsIHQuaW5pdGlhbFVzZXIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbmQgd2lyZXMgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgbmVlZGVkIHRvIGludGVyZmFjZSB3aXRoIHRoZVxuICogbmV0d29yay5cbiAqLyBjbGFzcyBQYSB7XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSh0LCBlKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdG9yZSB8fCAodGhpcy5sb2NhbFN0b3JlID0gdC5sb2NhbFN0b3JlLCB0aGlzLnNoYXJlZENsaWVudFN0YXRlID0gdC5zaGFyZWRDbGllbnRTdGF0ZSwgXG4gICAgICAgIHRoaXMuZGF0YXN0b3JlID0gdGhpcy5jcmVhdGVEYXRhc3RvcmUoZSksIHRoaXMucmVtb3RlU3RvcmUgPSB0aGlzLmNyZWF0ZVJlbW90ZVN0b3JlKGUpLCBcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSB0aGlzLmNyZWF0ZUV2ZW50TWFuYWdlcihlKSwgdGhpcy5zeW5jRW5naW5lID0gdGhpcy5jcmVhdGVTeW5jRW5naW5lKGUsIFxuICAgICAgICAvKiBzdGFydEFzUHJpbWFyeT0qLyAhdC5zeW5jaHJvbml6ZVRhYnMpLCB0aGlzLnNoYXJlZENsaWVudFN0YXRlLm9ubGluZVN0YXRlSGFuZGxlciA9IHQgPT4gSGModGhpcy5zeW5jRW5naW5lLCB0LCAxIC8qIE9ubGluZVN0YXRlU291cmNlLlNoYXJlZENsaWVudFN0YXRlICovKSwgXG4gICAgICAgIHRoaXMucmVtb3RlU3RvcmUucmVtb3RlU3luY2VyLmhhbmRsZUNyZWRlbnRpYWxDaGFuZ2UgPSBjYS5iaW5kKG51bGwsIHRoaXMuc3luY0VuZ2luZSksIFxuICAgICAgICBhd2FpdCB5Yyh0aGlzLnJlbW90ZVN0b3JlLCB0aGlzLnN5bmNFbmdpbmUuaXNQcmltYXJ5Q2xpZW50KSk7XG4gICAgfVxuICAgIGNyZWF0ZUV2ZW50TWFuYWdlcih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgYmM7XG4gICAgfVxuICAgIGNyZWF0ZURhdGFzdG9yZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBGdSh0LmRhdGFiYXNlSW5mby5kYXRhYmFzZUlkKSwgbiA9IChzID0gdC5kYXRhYmFzZUluZm8sIG5ldyBNdShzKSk7XG4gICAgICAgIHZhciBzO1xuICAgICAgICAvKiogUmV0dXJuIHRoZSBQbGF0Zm9ybS1zcGVjaWZpYyBjb25uZWN0aXZpdHkgbW9uaXRvci4gKi8gICAgICAgIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEt1KHQsIGUsIG4sIHMpO1xuICAgICAgICB9KHQuYXV0aENyZWRlbnRpYWxzLCB0LmFwcENoZWNrQ3JlZGVudGlhbHMsIG4sIGUpO1xuICAgIH1cbiAgICBjcmVhdGVSZW1vdGVTdG9yZSh0KSB7XG4gICAgICAgIHJldHVybiBlID0gdGhpcy5sb2NhbFN0b3JlLCBuID0gdGhpcy5kYXRhc3RvcmUsIHMgPSB0LmFzeW5jUXVldWUsIGkgPSB0ID0+IEhjKHRoaXMuc3luY0VuZ2luZSwgdCwgMCAvKiBPbmxpbmVTdGF0ZVNvdXJjZS5SZW1vdGVTdG9yZSAqLyksIFxuICAgICAgICByID0gU3UuRCgpID8gbmV3IFN1IDogbmV3IFZ1LCBuZXcganUoZSwgbiwgcywgaSwgcik7XG4gICAgICAgIHZhciBlLCBuLCBzLCBpLCByO1xuICAgICAgICAvKiogUmUtZW5hYmxlcyB0aGUgbmV0d29yay4gSWRlbXBvdGVudC4gKi8gICAgfVxuICAgIGNyZWF0ZVN5bmNFbmdpbmUodCwgZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgXG4gICAgICAgIC8vIFBPUlRJTkcgTk9URTogTWFuYWdlcyBzdGF0ZSBzeW5jaHJvbml6YXRpb24gaW4gbXVsdGktdGFiIGVudmlyb25tZW50cy5cbiAgICAgICAgcywgaSwgciwgbykge1xuICAgICAgICAgICAgY29uc3QgdSA9IG5ldyBLYyh0LCBlLCBuLCBzLCBpLCByKTtcbiAgICAgICAgICAgIHJldHVybiBvICYmICh1LnZjID0gITApLCB1O1xuICAgICAgICB9KHRoaXMubG9jYWxTdG9yZSwgdGhpcy5yZW1vdGVTdG9yZSwgdGhpcy5ldmVudE1hbmFnZXIsIHRoaXMuc2hhcmVkQ2xpZW50U3RhdGUsIHQuaW5pdGlhbFVzZXIsIHQubWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnMsIGUpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gTCh0KTtcbiAgICAgICAgICAgIE4oXCJSZW1vdGVTdG9yZVwiLCBcIlJlbW90ZVN0b3JlIHNodXR0aW5nIGRvd24uXCIpLCBlLnZ1LmFkZCg1IC8qIE9mZmxpbmVDYXVzZS5TaHV0ZG93biAqLyksIFxuICAgICAgICAgICAgYXdhaXQgV3UoZSksIGUuUHUuc2h1dGRvd24oKSwgXG4gICAgICAgICAgICAvLyBTZXQgdGhlIE9ubGluZVN0YXRlIHRvIFVua25vd24gKHJhdGhlciB0aGFuIE9mZmxpbmUpIHRvIGF2b2lkIHBvdGVudGlhbGx5XG4gICAgICAgICAgICAvLyB0cmlnZ2VyaW5nIHNwdXJpb3VzIGxpc3RlbmVyIGV2ZW50cyB3aXRoIGNhY2hlZCBkYXRhLCBldGMuXG4gICAgICAgICAgICBlLmJ1LnNldChcIlVua25vd25cIiAvKiBPbmxpbmVTdGF0ZS5Vbmtub3duICovKTtcbiAgICAgICAgfSh0aGlzLnJlbW90ZVN0b3JlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEhvdyBtYW55IGJ5dGVzIHRvIHJlYWQgZWFjaCB0aW1lIHdoZW4gYFJlYWRhYmxlU3RyZWFtUmVhZGVyLnJlYWQoKWAgaXNcbiAqIGNhbGxlZC4gT25seSBhcHBsaWNhYmxlIGZvciBieXRlIHN0cmVhbXMgdGhhdCB3ZSBjb250cm9sIChlLmcuIHRob3NlIGJhY2tlZFxuICogYnkgYW4gVUludDhBcnJheSkuXG4gKi9cbi8qKlxuICogQnVpbGRzIGEgYEJ5dGVTdHJlYW1SZWFkZXJgIGZyb20gYSBVSW50OEFycmF5LlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBkYXRhIHNvdXJjZSB0byB1c2UuXG4gKiBAcGFyYW0gYnl0ZXNQZXJSZWFkIC0gSG93IG1hbnkgYnl0ZXMgZWFjaCBgcmVhZCgpYCBmcm9tIHRoZSByZXR1cm5lZCByZWFkZXJcbiAqICAgICAgICB3aWxsIHJlYWQuXG4gKi9cbmZ1bmN0aW9uIGJhKHQsIGUgPSAxMDI0MCkge1xuICAgIGxldCBuID0gMDtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZvciBSZWFkYWJsZVN0cmVhbVJlYWRlciBjaGFuZ2VkLiBXZSB1c2VcbiAgICAvLyBgYW55YCBoZXJlIHRvIGFsbG93IHRoaXMgY29kZSB0byBjb21waWxlIHdpdGggZGlmZmVyZW50IHZlcnNpb25zLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQyOTcwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICAgIGlmIChuIDwgdC5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQuc2xpY2UobiwgbiArIGUpLFxuICAgICAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gKz0gZSwgcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGNhbmNlbCgpIHt9LFxuICAgICAgICByZWxlYXNlTG9jaygpIHt9LFxuICAgICAgICBjbG9zZWQ6IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogT24gd2ViLCBhIGBSZWFkYWJsZVN0cmVhbWAgaXMgd3JhcHBlZCBhcm91bmQgYnkgYSBgQnl0ZVN0cmVhbVJlYWRlcmAuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKlxuICogQSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIG9mIE9ic2VydmVyPFQ+IHRoYXQgd2lsbCBkaXNwYXRjaCBldmVudHNcbiAqIGFzeW5jaHJvbm91c2x5LiBUbyBhbGxvdyBpbW1lZGlhdGUgc2lsZW5jaW5nLCBhIG11dGUgY2FsbCBpcyBhZGRlZCB3aGljaFxuICogY2F1c2VzIGV2ZW50cyBzY2hlZHVsZWQgdG8gbm8gbG9uZ2VyIGJlIHJhaXNlZC5cbiAqL1xuY2xhc3MgVmEge1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHQsIFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgd2lsbCBub3QgcmFpc2UgZnV0dXJlIGV2ZW50cy4gTmVjZXNzYXJ5IHRvIGRlYWwgd2l0aFxuICAgICAgICAgKiBhc3luYyBkZXRhY2htZW50IG9mIGxpc3RlbmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tdXRlZCA9ICExO1xuICAgIH1cbiAgICBuZXh0KHQpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5uZXh0ICYmIHRoaXMuU2ModGhpcy5vYnNlcnZlci5uZXh0LCB0KTtcbiAgICB9XG4gICAgZXJyb3IodCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmVycm9yID8gdGhpcy5TYyh0aGlzLm9ic2VydmVyLmVycm9yLCB0KSA6IGsoXCJVbmNhdWdodCBFcnJvciBpbiBzbmFwc2hvdCBsaXN0ZW5lcjpcIiwgdC50b1N0cmluZygpKTtcbiAgICB9XG4gICAgRGMoKSB7XG4gICAgICAgIHRoaXMubXV0ZWQgPSAhMDtcbiAgICB9XG4gICAgU2ModCwgZSkge1xuICAgICAgICB0aGlzLm11dGVkIHx8IHNldFRpbWVvdXQoKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXV0ZWQgfHwgdChlKTtcbiAgICAgICAgfSksIDApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjbGFzcyByZXByZXNlbnRpbmcgYSBidW5kbGUuXG4gKlxuICogVGFrZXMgYSBidW5kbGUgc3RyZWFtIG9yIGJ1ZmZlciwgYW5kIHByZXNlbnRzIGFic3RyYWN0aW9ucyB0byByZWFkIGJ1bmRsZWRcbiAqIGVsZW1lbnRzIG91dCBvZiB0aGUgdW5kZXJseWluZyBjb250ZW50LlxuICovIGNsYXNzIFNhIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHJlYWRlciB0byByZWFkIGZyb20gdW5kZXJseWluZyBiaW5hcnkgYnVuZGxlIGRhdGEgc291cmNlLiAqL1xuICAgIHQsIGUpIHtcbiAgICAgICAgdGhpcy5DYyA9IHQsIHRoaXMuc2VyaWFsaXplciA9IGUsIFxuICAgICAgICAvKiogQ2FjaGVkIGJ1bmRsZSBtZXRhZGF0YS4gKi9cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBLLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybmFsIGJ1ZmZlciB0byBob2xkIGJ1bmRsZSBjb250ZW50LCBhY2N1bXVsYXRpbmcgaW5jb21wbGV0ZSBlbGVtZW50XG4gICAgICAgICAqIGNvbnRlbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5LCB0aGlzLnhjID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiksIFxuICAgICAgICAvLyBSZWFkIHRoZSBtZXRhZGF0YSAod2hpY2ggaXMgdGhlIGZpcnN0IGVsZW1lbnQpLlxuICAgICAgICB0aGlzLk5jKCkudGhlbigodCA9PiB7XG4gICAgICAgICAgICB0ICYmIHQuUXUoKSA/IHRoaXMubWV0YWRhdGEucmVzb2x2ZSh0Lkd1Lm1ldGFkYXRhKSA6IHRoaXMubWV0YWRhdGEucmVqZWN0KG5ldyBFcnJvcihgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGJ1bmRsZSBpcyBub3QgYSBtZXRhZGF0YSwgaXQgaXNcXG4gICAgICAgICAgICAgJHtKU09OLnN0cmluZ2lmeShudWxsID09IHQgPyB2b2lkIDAgOiB0Lkd1KX1gKSk7XG4gICAgICAgIH0pLCAodCA9PiB0aGlzLm1ldGFkYXRhLnJlamVjdCh0KSkpO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ2MuY2FuY2VsKCk7XG4gICAgfVxuICAgIGFzeW5jIGdldE1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5wcm9taXNlO1xuICAgIH1cbiAgICBhc3luYyBiYygpIHtcbiAgICAgICAgLy8gTWFrZXMgc3VyZSBtZXRhZGF0YSBpcyByZWFkIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZXRhZGF0YSgpLCB0aGlzLk5jKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGZyb20gdGhlIGhlYWQgb2YgaW50ZXJuYWwgYnVmZmVyLCBhbmQgcHVsbGluZyBtb3JlIGRhdGEgZnJvbVxuICAgICAqIHVuZGVybHlpbmcgc3RyZWFtIGlmIGEgY29tcGxldGUgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQsIHVudGlsIGFuXG4gICAgICogZWxlbWVudChpbmNsdWRpbmcgdGhlIHByZWZpeGVkIGxlbmd0aCBhbmQgdGhlIEpTT04gc3RyaW5nKSBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIE9uY2UgYSBjb21wbGV0ZSBlbGVtZW50IGlzIHJlYWQsIGl0IGlzIGRyb3BwZWQgZnJvbSBpbnRlcm5hbCBidWZmZXIuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGVpdGhlciB0aGUgYnVuZGxlZCBlbGVtZW50LCBvciBudWxsIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mXG4gICAgICogdGhlIHN0cmVhbS5cbiAgICAgKi8gICAgYXN5bmMgTmMoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhd2FpdCB0aGlzLmtjKCk7XG4gICAgICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMueGMuZGVjb2RlKHQpLCBuID0gTnVtYmVyKGUpO1xuICAgICAgICBpc05hTihuKSAmJiB0aGlzLk1jKGBsZW5ndGggc3RyaW5nICgke2V9KSBpcyBub3QgdmFsaWQgbnVtYmVyYCk7XG4gICAgICAgIGNvbnN0IHMgPSBhd2FpdCB0aGlzLiRjKG4pO1xuICAgICAgICByZXR1cm4gbmV3IGtjKEpTT04ucGFyc2UocyksIHQubGVuZ3RoICsgbik7XG4gICAgfVxuICAgIC8qKiBGaXJzdCBpbmRleCBvZiAneycgZnJvbSB0aGUgdW5kZXJseWluZyBidWZmZXIuICovICAgIE9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuZmluZEluZGV4KCh0ID0+IHQgPT09IFwie1wiLmNoYXJDb2RlQXQoMCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIsIHVudGlsIHRoZSBmaXJzdCAneycsIGFuZFxuICAgICAqIHJldHVybiB0aGUgY29udGVudC5cbiAgICAgKlxuICAgICAqIElmIHJlYWNoZWQgZW5kIG9mIHRoZSBzdHJlYW0sIHJldHVybnMgYSBudWxsLlxuICAgICAqLyAgICBhc3luYyBrYygpIHtcbiAgICAgICAgZm9yICg7dGhpcy5PYygpIDwgMDsgKSB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5GYygpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBCcm9rZSBvdXQgb2YgdGhlIGxvb3AgYmVjYXVzZSB1bmRlcmx5aW5nIHN0cmVhbSBpcyBjbG9zZWQsIGFuZCB0aGVyZVxuICAgICAgICAvLyBoYXBwZW5zIHRvIGJlIG5vIG1vcmUgZGF0YSB0byBwcm9jZXNzLlxuICAgICAgICAgICAgICAgIGlmICgwID09PSB0aGlzLmJ1ZmZlci5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5PYygpO1xuICAgICAgICAvLyBCcm9rZSBvdXQgb2YgdGhlIGxvb3AgYmVjYXVzZSB1bmRlcmx5aW5nIHN0cmVhbSBpcyBjbG9zZWQsIGJ1dCBzdGlsbFxuICAgICAgICAvLyBjYW5ub3QgZmluZCBhbiBvcGVuIGJyYWNrZXQuXG4gICAgICAgICAgICAgICAgdCA8IDAgJiYgdGhpcy5NYyhcIlJlYWNoZWQgdGhlIGVuZCBvZiBidW5kbGUgd2hlbiBhIGxlbmd0aCBzdHJpbmcgaXMgZXhwZWN0ZWQuXCIpO1xuICAgICAgICBjb25zdCBlID0gdGhpcy5idWZmZXIuc2xpY2UoMCwgdCk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGRyb3AgdGhlIHJlYWQgbGVuZ3RoLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKHQpLCBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBmcm9tIGEgc3BlY2lmaWVkIHBvc2l0aW9uIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlciwgZm9yIGEgc3BlY2lmaWVkXG4gICAgICogbnVtYmVyIG9mIGJ5dGVzLCBwdWxsaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpZiBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlY29kZWQgZnJvbSB0aGUgcmVhZCBieXRlcy5cbiAgICAgKi8gICAgYXN5bmMgJGModCkge1xuICAgICAgICBmb3IgKDt0aGlzLmJ1ZmZlci5sZW5ndGggPCB0OyApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuRmMoKSAmJiB0aGlzLk1jKFwiUmVhY2hlZCB0aGUgZW5kIG9mIGJ1bmRsZSB3aGVuIG1vcmUgaXMgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnhjLmRlY29kZSh0aGlzLmJ1ZmZlci5zbGljZSgwLCB0KSk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGRyb3AgdGhlIHJlYWQganNvbiBzdHJpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc2xpY2UodCksIGU7XG4gICAgfVxuICAgIE1jKHQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICB0aHJvdyB0aGlzLkNjLmNhbmNlbCgpLCBuZXcgRXJyb3IoYEludmFsaWQgYnVuZGxlIGZvcm1hdDogJHt0fWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdWxscyBtb3JlIGRhdGEgZnJvbSB1bmRlcmx5aW5nIHN0cmVhbSB0byBpbnRlcm5hbCBidWZmZXIuXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgZmluaXNoZWQuXG4gICAgICovICAgIGFzeW5jIEZjKCkge1xuICAgICAgICBjb25zdCB0ID0gYXdhaXQgdGhpcy5DYy5yZWFkKCk7XG4gICAgICAgIGlmICghdC5kb25lKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIubGVuZ3RoICsgdC52YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgZS5zZXQodGhpcy5idWZmZXIpLCBlLnNldCh0LnZhbHVlLCB0aGlzLmJ1ZmZlci5sZW5ndGgpLCB0aGlzLmJ1ZmZlciA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQuZG9uZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEludGVybmFsIHRyYW5zYWN0aW9uIG9iamVjdCByZXNwb25zaWJsZSBmb3IgYWNjdW11bGF0aW5nIHRoZSBtdXRhdGlvbnMgdG9cbiAqIHBlcmZvcm0gYW5kIHRoZSBiYXNlIHZlcnNpb25zIGZvciBhbnkgZG9jdW1lbnRzIHJlYWQuXG4gKi9cbmNsYXNzIERhIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZGF0YXN0b3JlID0gdCwgXG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uIG9mIGVhY2ggZG9jdW1lbnQgdGhhdCB3YXMgcmVhZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgICAgdGhpcy5yZWFkVmVyc2lvbnMgPSBuZXcgTWFwLCB0aGlzLm11dGF0aW9ucyA9IFtdLCB0aGlzLmNvbW1pdHRlZCA9ICExLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmZXJyZWQgdXNhZ2UgZXJyb3IgdGhhdCBvY2N1cnJlZCBwcmV2aW91c2x5IGluIHRoaXMgdHJhbnNhY3Rpb24gdGhhdFxuICAgICAgICAgKiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvbiB0byBmYWlsIG9uY2UgaXQgYWN0dWFsbHkgY29tbWl0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGFzdFdyaXRlRXJyb3IgPSBudWxsLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiBkb2N1bWVudHMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiBpbiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIFdoZW4gdGhlcmUncyBtb3JlIHRoYW4gb25lIHdyaXRlIHRvIHRoZSBzYW1lIGtleSBpbiBhIHRyYW5zYWN0aW9uLCBhbnlcbiAgICAgICAgICogd3JpdGVzIGFmdGVyIHRoZSBmaXJzdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdHRlbkRvY3MgPSBuZXcgU2V0O1xuICAgIH1cbiAgICBhc3luYyBsb29rdXAodCkge1xuICAgICAgICBpZiAodGhpcy5lbnN1cmVDb21taXROb3RDYWxsZWQoKSwgdGhpcy5tdXRhdGlvbnMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkZpcmVzdG9yZSB0cmFuc2FjdGlvbnMgcmVxdWlyZSBhbGwgcmVhZHMgdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIGFsbCB3cml0ZXMuXCIpO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgYXN5bmMgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IEwodCksIHMgPSBMaShuLnNlcmlhbGl6ZXIpICsgXCIvZG9jdW1lbnRzXCIsIGkgPSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBlLm1hcCgodCA9PiAkaShuLnNlcmlhbGl6ZXIsIHQpKSlcbiAgICAgICAgICAgIH0sIHIgPSBhd2FpdCBuLnZvKFwiQmF0Y2hHZXREb2N1bWVudHNcIiwgcywgaSwgZS5sZW5ndGgpLCBvID0gbmV3IE1hcDtcbiAgICAgICAgICAgIHIuZm9yRWFjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IEdpKG4uc2VyaWFsaXplciwgdCk7XG4gICAgICAgICAgICAgICAgby5zZXQoZS5rZXkudG9TdHJpbmcoKSwgZSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCB1ID0gW107XG4gICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gby5nZXQodC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBGKCEhZSksIHUucHVzaChlKTtcbiAgICAgICAgICAgIH0pKSwgdTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdCk7XG4gICAgICAgIHJldHVybiBlLmZvckVhY2goKHQgPT4gdGhpcy5yZWNvcmRWZXJzaW9uKHQpKSksIGU7XG4gICAgfVxuICAgIHNldCh0LCBlKSB7XG4gICAgICAgIHRoaXMud3JpdGUoZS50b011dGF0aW9uKHQsIHRoaXMucHJlY29uZGl0aW9uKHQpKSksIHRoaXMud3JpdHRlbkRvY3MuYWRkKHQudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKGUudG9NdXRhdGlvbih0LCB0aGlzLnByZWNvbmRpdGlvbkZvclVwZGF0ZSh0KSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RXcml0ZUVycm9yID0gdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBkZWxldGUodCkge1xuICAgICAgICB0aGlzLndyaXRlKG5ldyBZcyh0LCB0aGlzLnByZWNvbmRpdGlvbih0KSkpLCB0aGlzLndyaXR0ZW5Eb2NzLmFkZCh0LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBhc3luYyBjb21taXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuc3VyZUNvbW1pdE5vdENhbGxlZCgpLCB0aGlzLmxhc3RXcml0ZUVycm9yKSB0aHJvdyB0aGlzLmxhc3RXcml0ZUVycm9yO1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5yZWFkVmVyc2lvbnM7XG4gICAgICAgIC8vIEZvciBlYWNoIG11dGF0aW9uLCBub3RlIHRoYXQgdGhlIGRvYyB3YXMgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5mb3JFYWNoKChlID0+IHtcbiAgICAgICAgICAgIHQuZGVsZXRlKGUua2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KSksIFxuICAgICAgICAvLyBGb3IgZWFjaCBkb2N1bWVudCB0aGF0IHdhcyByZWFkIGJ1dCBub3Qgd3JpdHRlbiB0bywgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAgICAgIC8vIGEgYHZlcmlmeWAgb3BlcmF0aW9uLlxuICAgICAgICB0LmZvckVhY2goKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gaHQuZnJvbVBhdGgoZSk7XG4gICAgICAgICAgICB0aGlzLm11dGF0aW9ucy5wdXNoKG5ldyBYcyhuLCB0aGlzLnByZWNvbmRpdGlvbihuKSkpO1xuICAgICAgICB9KSksIGF3YWl0IGFzeW5jIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBMKHQpLCBzID0gTGkobi5zZXJpYWxpemVyKSArIFwiL2RvY3VtZW50c1wiLCBpID0ge1xuICAgICAgICAgICAgICAgIHdyaXRlczogZS5tYXAoKHQgPT4gamkobi5zZXJpYWxpemVyLCB0KSkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgbi5JbyhcIkNvbW1pdFwiLCBzLCBpKTtcbiAgICAgICAgfSh0aGlzLmRhdGFzdG9yZSwgdGhpcy5tdXRhdGlvbnMpLCB0aGlzLmNvbW1pdHRlZCA9ICEwO1xuICAgIH1cbiAgICByZWNvcmRWZXJzaW9uKHQpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIGlmICh0LmlzRm91bmREb2N1bWVudCgpKSBlID0gdC52ZXJzaW9uOyBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdC5pc05vRG9jdW1lbnQoKSkgdGhyb3cgTygpO1xuICAgICAgICAgICAgLy8gUmVwcmVzZW50IGEgZGVsZXRlZCBkb2MgdXNpbmcgU25hcHNob3RWZXJzaW9uLm1pbigpLlxuICAgICAgICAgICAgZSA9IHJ0Lm1pbigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnJlYWRWZXJzaW9ucy5nZXQodC5rZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICBpZiAoIWUuaXNFcXVhbChuKSkgXG4gICAgICAgICAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgZmFpbCBubyBtYXR0ZXIgd2hhdC5cbiAgICAgICAgICAgIHRocm93IG5ldyBVKHEuQUJPUlRFRCwgXCJEb2N1bWVudCB2ZXJzaW9uIGNoYW5nZWQgYmV0d2VlbiB0d28gcmVhZHMuXCIpO1xuICAgICAgICB9IGVsc2UgdGhpcy5yZWFkVmVyc2lvbnMuc2V0KHQua2V5LnRvU3RyaW5nKCksIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgd2hlbiBpdCB3YXMgcmVhZCBpbiB0aGlzIHRyYW5zYWN0aW9uLFxuICAgICAqIGFzIGEgcHJlY29uZGl0aW9uLCBvciBubyBwcmVjb25kaXRpb24gaWYgaXQgd2FzIG5vdCByZWFkLlxuICAgICAqLyAgICBwcmVjb25kaXRpb24odCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5yZWFkVmVyc2lvbnMuZ2V0KHQudG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiAhdGhpcy53cml0dGVuRG9jcy5oYXModC50b1N0cmluZygpKSAmJiBlID8gZS5pc0VxdWFsKHJ0Lm1pbigpKSA/IEZzLmV4aXN0cyghMSkgOiBGcy51cGRhdGVUaW1lKGUpIDogRnMubm9uZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmVjb25kaXRpb24gZm9yIGEgZG9jdW1lbnQgaWYgdGhlIG9wZXJhdGlvbiBpcyBhbiB1cGRhdGUuXG4gICAgICovICAgIHByZWNvbmRpdGlvbkZvclVwZGF0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnJlYWRWZXJzaW9ucy5nZXQodC50b1N0cmluZygpKTtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSBkb2N1bWVudCBpcyB3cml0dGVuLCB3ZSB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IHRoZVxuICAgICAgICAvLyByZWFkIHRpbWUgYW5kIGV4aXN0ZW5jZVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy53cml0dGVuRG9jcy5oYXModC50b1N0cmluZygpKSAmJiBlKSB7XG4gICAgICAgICAgICBpZiAoZS5pc0VxdWFsKHJ0Lm1pbigpKSkgXG4gICAgICAgICAgICAvLyBUaGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdCwgc28gZmFpbCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIGhhcyB0byBiZSB2YWxpZGF0ZWQgbG9jYWxseSBiZWNhdXNlIHlvdSBjYW4ndCBzZW5kIGFcbiAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiB0aGF0IGEgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3Qgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgICAgICAgIC8vIHNlbWFudGljcyBvZiB0aGUgYmFja2VuZCB3cml0ZSB0byBiZSBhbiBpbnNlcnQuIFRoaXMgaXMgdGhlIHJldmVyc2VcbiAgICAgICAgICAgIC8vIG9mIHdoYXQgd2Ugd2FudCwgc2luY2Ugd2Ugd2FudCB0byBhc3NlcnQgdGhhdCB0aGUgZG9jdW1lbnQgZG9lc24ndFxuICAgICAgICAgICAgLy8gZXhpc3QgYnV0IHRoZW4gc2VuZCB0aGUgdXBkYXRlIGFuZCBoYXZlIGl0IGZhaWwuIFNpbmNlIHdlIGNhbid0XG4gICAgICAgICAgICAvLyBleHByZXNzIHRoYXQgdG8gdGhlIGJhY2tlbmQsIHdlIGhhdmUgdG8gdmFsaWRhdGUgbG9jYWxseS5cbiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgY2FuIGNoYW5nZSBvbmNlIHdlIGNhbiBzZW5kIHNlcGFyYXRlIHZlcmlmeSB3cml0ZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmFuc2FjdGlvbi5cbiAgICAgICAgICAgIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgXCJDYW4ndCB1cGRhdGUgYSBkb2N1bWVudCB0aGF0IGRvZXNuJ3QgZXhpc3QuXCIpO1xuICAgICAgICAgICAgLy8gRG9jdW1lbnQgZXhpc3RzLCBiYXNlIHByZWNvbmRpdGlvbiBvbiBkb2N1bWVudCB1cGRhdGUgdGltZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGcy51cGRhdGVUaW1lKGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvY3VtZW50IHdhcyBub3QgcmVhZCwgc28gd2UganVzdCB1c2UgdGhlIHByZWNvbmRpdGlvbnMgZm9yIGEgYmxpbmRcbiAgICAgICAgLy8gdXBkYXRlLlxuICAgICAgICByZXR1cm4gRnMuZXhpc3RzKCEwKTtcbiAgICB9XG4gICAgd3JpdGUodCkge1xuICAgICAgICB0aGlzLmVuc3VyZUNvbW1pdE5vdENhbGxlZCgpLCB0aGlzLm11dGF0aW9ucy5wdXNoKHQpO1xuICAgIH1cbiAgICBlbnN1cmVDb21taXROb3RDYWxsZWQoKSB7fVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBUcmFuc2FjdGlvblJ1bm5lciBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG5lZWRlZCB0byBydW4gYW5kIHJldHJ5IHRyYW5zYWN0aW9uc1xuICogd2l0aCBiYWNrb2ZmLlxuICovIGNsYXNzIENhIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZSA9IHQsIHRoaXMuZGF0YXN0b3JlID0gZSwgdGhpcy5vcHRpb25zID0gbiwgdGhpcy51cGRhdGVGdW5jdGlvbiA9IHMsIFxuICAgICAgICB0aGlzLmRlZmVycmVkID0gaSwgdGhpcy5CYyA9IG4ubWF4QXR0ZW1wdHMsIHRoaXMucW8gPSBuZXcgQnUodGhpcy5hc3luY1F1ZXVlLCBcInRyYW5zYWN0aW9uX3JldHJ5XCIgLyogVGltZXJJZC5UcmFuc2FjdGlvblJldHJ5ICovKTtcbiAgICB9XG4gICAgLyoqIFJ1bnMgdGhlIHRyYW5zYWN0aW9uIGFuZCBzZXRzIHRoZSByZXN1bHQgb24gZGVmZXJyZWQuICovICAgIHJ1bigpIHtcbiAgICAgICAgdGhpcy5CYyAtPSAxLCB0aGlzLkxjKCk7XG4gICAgfVxuICAgIExjKCkge1xuICAgICAgICB0aGlzLnFvLk5vKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IERhKHRoaXMuZGF0YXN0b3JlKSwgZSA9IHRoaXMucWModCk7XG4gICAgICAgICAgICBlICYmIGUudGhlbigoZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IHQuY29tbWl0KCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVycmVkLnJlc29sdmUoZSk7XG4gICAgICAgICAgICAgICAgfSkpLmNhdGNoKCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VYyh0KTtcbiAgICAgICAgICAgICAgICB9KSkpKTtcbiAgICAgICAgICAgIH0pKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5VYyh0KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBxYyh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy51cGRhdGVGdW5jdGlvbih0KTtcbiAgICAgICAgICAgIHJldHVybiAhRnQoZSkgJiYgZS5jYXRjaCAmJiBlLnRoZW4gPyBlIDogKHRoaXMuZGVmZXJyZWQucmVqZWN0KEVycm9yKFwiVHJhbnNhY3Rpb24gY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBQcm9taXNlXCIpKSwgXG4gICAgICAgICAgICBudWxsKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHJldHJ5IGVycm9ycyB0aHJvd24gYnkgdXNlciBwcm92aWRlZCB1cGRhdGVGdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmVycmVkLnJlamVjdCh0KSwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBVYyh0KSB7XG4gICAgICAgIHRoaXMuQmMgPiAwICYmIHRoaXMuS2ModCkgPyAodGhpcy5CYyAtPSAxLCB0aGlzLmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoKCkgPT4gKHRoaXMuTGMoKSwgXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpKSkpKSA6IHRoaXMuZGVmZXJyZWQucmVqZWN0KHQpO1xuICAgIH1cbiAgICBLYyh0KSB7XG4gICAgICAgIGlmIChcIkZpcmViYXNlRXJyb3JcIiA9PT0gdC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBJbiB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZW5kIHdpbGwgZmFpbCBvdXRkYXRlZCByZWFkcyB3aXRoIEZBSUxFRF9QUkVDT05ESVRJT04gYW5kXG4gICAgICAgICAgICAvLyBub24tbWF0Y2hpbmcgZG9jdW1lbnQgdmVyc2lvbnMgd2l0aCBBQk9SVEVELiBUaGVzZSBlcnJvcnMgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAgICAgICAgICBjb25zdCBlID0gdC5jb2RlO1xuICAgICAgICAgICAgcmV0dXJuIFwiYWJvcnRlZFwiID09PSBlIHx8IFwiZmFpbGVkLXByZWNvbmRpdGlvblwiID09PSBlIHx8IFwiYWxyZWFkeS1leGlzdHNcIiA9PT0gZSB8fCAhb2koZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRmlyZXN0b3JlQ2xpZW50IGlzIGEgdG9wLWxldmVsIGNsYXNzIHRoYXQgY29uc3RydWN0cyBhbmQgb3ducyBhbGwgb2YgdGhlIC8vXG4gKiBwaWVjZXMgb2YgdGhlIGNsaWVudCBTREsgYXJjaGl0ZWN0dXJlLiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIC8vXG4gKiBhc3luYyBxdWV1ZSB0aGF0IGlzIHNoYXJlZCBieSBhbGwgb2YgdGhlIG90aGVyIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbS4gLy9cbiAqL1xuY2xhc3MgeGEge1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIFxuICAgIC8qKlxuICAgICAqIEFzeW5jaHJvbm91cyBxdWV1ZSByZXNwb25zaWJsZSBmb3IgYWxsIG9mIG91ciBpbnRlcm5hbCBwcm9jZXNzaW5nLiBXaGVuXG4gICAgICogd2UgZ2V0IGluY29taW5nIHdvcmsgZnJvbSB0aGUgdXNlciAodmlhIHB1YmxpYyBBUEkpIG9yIHRoZSBuZXR3b3JrXG4gICAgICogKGluY29taW5nIEdSUEMgbWVzc2FnZXMpLCB3ZSBzaG91bGQgYWx3YXlzIHNjaGVkdWxlIG9udG8gdGhpcyBxdWV1ZS5cbiAgICAgKiBUaGlzIGVuc3VyZXMgYWxsIG9mIG91ciB3b3JrIGlzIHByb3Blcmx5IHNlcmlhbGl6ZWQgKGUuZy4gd2UgZG9uJ3RcbiAgICAgKiBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IG9wZXJhdGlvbiB3aGlsZSB0aGUgcHJldmlvdXMgb25lIGlzIHdhaXRpbmcgZm9yXG4gICAgICogYW4gYXN5bmMgSS9PIHRvIGNvbXBsZXRlKS5cbiAgICAgKi9cbiAgICBuLCBzKSB7XG4gICAgICAgIHRoaXMuYXV0aENyZWRlbnRpYWxzID0gdCwgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxzID0gZSwgdGhpcy5hc3luY1F1ZXVlID0gbiwgdGhpcy5kYXRhYmFzZUluZm8gPSBzLCBcbiAgICAgICAgdGhpcy51c2VyID0gVi5VTkFVVEhFTlRJQ0FURUQsIHRoaXMuY2xpZW50SWQgPSB0dC5BKCksIHRoaXMuYXV0aENyZWRlbnRpYWxMaXN0ZW5lciA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLCBcbiAgICAgICAgdGhpcy5hcHBDaGVja0NyZWRlbnRpYWxMaXN0ZW5lciA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLCB0aGlzLmF1dGhDcmVkZW50aWFscy5zdGFydChuLCAoYXN5bmMgdCA9PiB7XG4gICAgICAgICAgICBOKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiUmVjZWl2ZWQgdXNlcj1cIiwgdC51aWQpLCBhd2FpdCB0aGlzLmF1dGhDcmVkZW50aWFsTGlzdGVuZXIodCksIFxuICAgICAgICAgICAgdGhpcy51c2VyID0gdDtcbiAgICAgICAgfSkpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuc3RhcnQobiwgKHQgPT4gKE4oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJSZWNlaXZlZCBuZXcgYXBwIGNoZWNrIHRva2VuPVwiLCB0KSwgXG4gICAgICAgIHRoaXMuYXBwQ2hlY2tDcmVkZW50aWFsTGlzdGVuZXIodCwgdGhpcy51c2VyKSkpKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFzeW5jUXVldWU6IHRoaXMuYXN5bmNRdWV1ZSxcbiAgICAgICAgICAgIGRhdGFiYXNlSW5mbzogdGhpcy5kYXRhYmFzZUluZm8sXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgICAgIGF1dGhDcmVkZW50aWFsczogdGhpcy5hdXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICBhcHBDaGVja0NyZWRlbnRpYWxzOiB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICBpbml0aWFsVXNlcjogdGhpcy51c2VyLFxuICAgICAgICAgICAgbWF4Q29uY3VycmVudExpbWJvUmVzb2x1dGlvbnM6IDEwMFxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFsTGlzdGVuZXIgPSB0O1xuICAgIH1cbiAgICBzZXRBcHBDaGVja1Rva2VuQ2hhbmdlTGlzdGVuZXIodCkge1xuICAgICAgICB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbExpc3RlbmVyID0gdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHRoYXQgdGhlIGNsaWVudCBoYXMgbm90IGJlZW4gdGVybWluYXRlZC4gRW5zdXJlcyB0aGF0IG90aGVyIG1ldGhvZHMgb24gLy9cbiAgICAgKiB0aGlzIGNsYXNzIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNsaWVudCBpcyB0ZXJtaW5hdGVkLiAvL1xuICAgICAqLyAgICB2ZXJpZnlOb3RUZXJtaW5hdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5hc3luY1F1ZXVlLmlzU2h1dHRpbmdEb3duKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiVGhlIGNsaWVudCBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWQuXCIpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHRoaXMuYXN5bmNRdWV1ZS5lbnRlclJlc3RyaWN0ZWRNb2RlKCk7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgSztcbiAgICAgICAgcmV0dXJuIHRoaXMuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0RXZlbldoaWxlUmVzdHJpY3RlZCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbmxpbmVDb21wb25lbnRzICYmIGF3YWl0IHRoaXMuX29ubGluZUNvbXBvbmVudHMudGVybWluYXRlKCksIHRoaXMuX29mZmxpbmVDb21wb25lbnRzICYmIGF3YWl0IHRoaXMuX29mZmxpbmVDb21wb25lbnRzLnRlcm1pbmF0ZSgpLCBcbiAgICAgICAgICAgICAgICAvLyBUaGUgY3JlZGVudGlhbHMgcHJvdmlkZXIgbXVzdCBiZSB0ZXJtaW5hdGVkIGFmdGVyIHNodXR0aW5nIGRvd24gdGhlXG4gICAgICAgICAgICAgICAgLy8gUmVtb3RlU3RvcmUgYXMgaXQgd2lsbCBwcmV2ZW50IHRoZSBSZW1vdGVTdG9yZSBmcm9tIHJldHJpZXZpbmcgYXV0aFxuICAgICAgICAgICAgICAgIC8vIHRva2Vucy5cbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDcmVkZW50aWFscy5zaHV0ZG93bigpLCB0aGlzLmFwcENoZWNrQ3JlZGVudGlhbHMuc2h1dGRvd24oKSwgdC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IEVjKGUsIFwiRmFpbGVkIHRvIHNodXRkb3duIHBlcnNpc3RlbmNlXCIpO1xuICAgICAgICAgICAgICAgIHQucmVqZWN0KG4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSksIHQucHJvbWlzZTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIE5hKHQsIGUpIHtcbiAgICB0LmFzeW5jUXVldWUudmVyaWZ5T3BlcmF0aW9uSW5Qcm9ncmVzcygpLCBOKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiSW5pdGlhbGl6aW5nIE9mZmxpbmVDb21wb25lbnRQcm92aWRlclwiKTtcbiAgICBjb25zdCBuID0gYXdhaXQgdC5nZXRDb25maWd1cmF0aW9uKCk7XG4gICAgYXdhaXQgZS5pbml0aWFsaXplKG4pO1xuICAgIGxldCBzID0gbi5pbml0aWFsVXNlcjtcbiAgICB0LnNldENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lcigoYXN5bmMgdCA9PiB7XG4gICAgICAgIHMuaXNFcXVhbCh0KSB8fCAoYXdhaXQgaXUoZS5sb2NhbFN0b3JlLCB0KSwgcyA9IHQpO1xuICAgIH0pKSwgXG4gICAgLy8gV2hlbiBhIHVzZXIgY2FsbHMgY2xlYXJQZXJzaXN0ZW5jZSgpIGluIG9uZSBjbGllbnQsIGFsbCBvdGhlciBjbGllbnRzXG4gICAgLy8gbmVlZCB0byBiZSB0ZXJtaW5hdGVkIHRvIGFsbG93IHRoZSBkZWxldGUgdG8gc3VjY2VlZC5cbiAgICBlLnBlcnNpc3RlbmNlLnNldERhdGFiYXNlRGVsZXRlZExpc3RlbmVyKCgoKSA9PiB0LnRlcm1pbmF0ZSgpKSksIHQuX29mZmxpbmVDb21wb25lbnRzID0gZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2EodCwgZSkge1xuICAgIHQuYXN5bmNRdWV1ZS52ZXJpZnlPcGVyYXRpb25JblByb2dyZXNzKCk7XG4gICAgY29uc3QgbiA9IGF3YWl0ICRhKHQpO1xuICAgIE4oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJJbml0aWFsaXppbmcgT25saW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgY29uc3QgcyA9IGF3YWl0IHQuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIGF3YWl0IGUuaW5pdGlhbGl6ZShuLCBzKSwgXG4gICAgLy8gVGhlIENyZWRlbnRpYWxDaGFuZ2VMaXN0ZW5lciBvZiB0aGUgb25saW5lIGNvbXBvbmVudCBwcm92aWRlciB0YWtlc1xuICAgIC8vIHByZWNlZGVuY2Ugb3ZlciB0aGUgb2ZmbGluZSBjb21wb25lbnQgcHJvdmlkZXIuXG4gICAgdC5zZXRDcmVkZW50aWFsQ2hhbmdlTGlzdGVuZXIoKHQgPT4gZ2MoZS5yZW1vdGVTdG9yZSwgdCkpKSwgdC5zZXRBcHBDaGVja1Rva2VuQ2hhbmdlTGlzdGVuZXIoKCh0LCBuKSA9PiBnYyhlLnJlbW90ZVN0b3JlLCBuKSkpLCBcbiAgICB0Ll9vbmxpbmVDb21wb25lbnRzID0gZTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVycm9yIGFsbG93cyB1cyB0byBncmFjZWZ1bGx5IGRpc2FibGVcbiAqIHBlcnNpc3RlbmNlIChhcyBvcHBvc2VkIHRvIGNyYXNoaW5nIHRoZSBjbGllbnQpLlxuICovIGZ1bmN0aW9uIE1hKHQpIHtcbiAgICByZXR1cm4gXCJGaXJlYmFzZUVycm9yXCIgPT09IHQubmFtZSA/IHQuY29kZSA9PT0gcS5GQUlMRURfUFJFQ09ORElUSU9OIHx8IHQuY29kZSA9PT0gcS5VTklNUExFTUVOVEVEIDogIShcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBET01FeGNlcHRpb24gJiYgdCBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikgfHwgKFxuICAgIC8vIFdoZW4gdGhlIGJyb3dzZXIgaXMgb3V0IG9mIHF1b3RhIHdlIGNvdWxkIGdldCBlaXRoZXIgcXVvdGEgZXhjZWVkZWRcbiAgICAvLyBvciBhbiBhYm9ydGVkIGVycm9yIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlcnJvciBoYXBwZW5lZCBkdXJpbmdcbiAgICAvLyBzY2hlbWEgbWlncmF0aW9uLlxuICAgIDIyID09PSB0LmNvZGUgfHwgMjAgPT09IHQuY29kZSB8fCBcbiAgICAvLyBGaXJlZm94IFByaXZhdGUgQnJvd3NpbmcgbW9kZSBkaXNhYmxlcyBJbmRleGVkRGIgYW5kIHJldHVybnNcbiAgICAvLyBJTlZBTElEX1NUQVRFIGZvciBhbnkgdXNhZ2UuXG4gICAgMTEgPT09IHQuY29kZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uICRhKHQpIHtcbiAgICBpZiAoIXQuX29mZmxpbmVDb21wb25lbnRzKSBpZiAodC5fdW5pbml0aWFsaXplZENvbXBvbmVudHNQcm92aWRlcikge1xuICAgICAgICBOKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiVXNpbmcgdXNlciBwcm92aWRlZCBPZmZsaW5lQ29tcG9uZW50UHJvdmlkZXJcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBOYSh0LCB0Ll91bmluaXRpYWxpemVkQ29tcG9uZW50c1Byb3ZpZGVyLl9vZmZsaW5lKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGU7XG4gICAgICAgICAgICBpZiAoIU1hKG4pKSB0aHJvdyBuO1xuICAgICAgICAgICAgTShcIkVycm9yIHVzaW5nIHVzZXIgcHJvdmlkZWQgY2FjaGUuIEZhbGxpbmcgYmFjayB0byBtZW1vcnkgY2FjaGU6IFwiICsgbiksIGF3YWl0IE5hKHQsIG5ldyBFYSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgTihcIkZpcmVzdG9yZUNsaWVudFwiLCBcIlVzaW5nIGRlZmF1bHQgT2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyXCIpLCBhd2FpdCBOYSh0LCBuZXcgRWEpO1xuICAgIHJldHVybiB0Ll9vZmZsaW5lQ29tcG9uZW50cztcbn1cblxuYXN5bmMgZnVuY3Rpb24gT2EodCkge1xuICAgIHJldHVybiB0Ll9vbmxpbmVDb21wb25lbnRzIHx8ICh0Ll91bmluaXRpYWxpemVkQ29tcG9uZW50c1Byb3ZpZGVyID8gKE4oXCJGaXJlc3RvcmVDbGllbnRcIiwgXCJVc2luZyB1c2VyIHByb3ZpZGVkIE9ubGluZUNvbXBvbmVudFByb3ZpZGVyXCIpLCBcbiAgICBhd2FpdCBrYSh0LCB0Ll91bmluaXRpYWxpemVkQ29tcG9uZW50c1Byb3ZpZGVyLl9vbmxpbmUpKSA6IChOKFwiRmlyZXN0b3JlQ2xpZW50XCIsIFwiVXNpbmcgZGVmYXVsdCBPbmxpbmVDb21wb25lbnRQcm92aWRlclwiKSwgXG4gICAgYXdhaXQga2EodCwgbmV3IFBhKSkpLCB0Ll9vbmxpbmVDb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBGYSh0KSB7XG4gICAgcmV0dXJuICRhKHQpLnRoZW4oKHQgPT4gdC5wZXJzaXN0ZW5jZSkpO1xufVxuXG5mdW5jdGlvbiBCYSh0KSB7XG4gICAgcmV0dXJuICRhKHQpLnRoZW4oKHQgPT4gdC5sb2NhbFN0b3JlKSk7XG59XG5cbmZ1bmN0aW9uIExhKHQpIHtcbiAgICByZXR1cm4gT2EodCkudGhlbigodCA9PiB0LnJlbW90ZVN0b3JlKSk7XG59XG5cbmZ1bmN0aW9uIHFhKHQpIHtcbiAgICByZXR1cm4gT2EodCkudGhlbigodCA9PiB0LnN5bmNFbmdpbmUpKTtcbn1cblxuZnVuY3Rpb24gVWEodCkge1xuICAgIHJldHVybiBPYSh0KS50aGVuKCh0ID0+IHQuZGF0YXN0b3JlKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIEthKHQpIHtcbiAgICBjb25zdCBlID0gYXdhaXQgT2EodCksIG4gPSBlLmV2ZW50TWFuYWdlcjtcbiAgICByZXR1cm4gbi5vbkxpc3RlbiA9IEdjLmJpbmQobnVsbCwgZS5zeW5jRW5naW5lKSwgbi5vblVubGlzdGVuID0gamMuYmluZChudWxsLCBlLnN5bmNFbmdpbmUpLCBcbiAgICBuO1xufVxuXG4vKiogRW5hYmxlcyB0aGUgbmV0d29yayBjb25uZWN0aW9uIGFuZCByZS1lbnF1ZXVlcyBhbGwgcGVuZGluZyBvcGVyYXRpb25zLiAqLyBmdW5jdGlvbiBHYSh0KSB7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGUgPSBhd2FpdCBGYSh0KSwgbiA9IGF3YWl0IExhKHQpO1xuICAgICAgICByZXR1cm4gZS5zZXROZXR3b3JrRW5hYmxlZCghMCksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBMKHQpO1xuICAgICAgICAgICAgcmV0dXJuIGUudnUuZGVsZXRlKDAgLyogT2ZmbGluZUNhdXNlLlVzZXJEaXNhYmxlZCAqLyksIHp1KGUpO1xuICAgICAgICB9KG4pO1xuICAgIH0pKTtcbn1cblxuLyoqIERpc2FibGVzIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24uIFBlbmRpbmcgb3BlcmF0aW9ucyB3aWxsIG5vdCBjb21wbGV0ZS4gKi8gZnVuY3Rpb24gUWEodCkge1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZSgoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgRmEodCksIG4gPSBhd2FpdCBMYSh0KTtcbiAgICAgICAgcmV0dXJuIGUuc2V0TmV0d29ya0VuYWJsZWQoITEpLCBhc3luYyBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gTCh0KTtcbiAgICAgICAgICAgIGUudnUuYWRkKDAgLyogT2ZmbGluZUNhdXNlLlVzZXJEaXNhYmxlZCAqLyksIGF3YWl0IFd1KGUpLCBcbiAgICAgICAgICAgIC8vIFNldCB0aGUgT25saW5lU3RhdGUgdG8gT2ZmbGluZSBzbyBnZXQoKXMgcmV0dXJuIGZyb20gY2FjaGUsIGV0Yy5cbiAgICAgICAgICAgIGUuYnUuc2V0KFwiT2ZmbGluZVwiIC8qIE9ubGluZVN0YXRlLk9mZmxpbmUgKi8pO1xuICAgICAgICB9KG4pO1xuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHdyaXRlcyB0aGF0IHdlcmUgcGVuZGluZyBhdCB0aGUgdGltZVxuICogdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCByZWNlaXZlZCBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LiBBbiBhY2tub3dsZWRnZW1lbnRcbiAqIGNhbiBiZSBlaXRoZXIgYWNjZXB0YW5jZSBvciByZWplY3Rpb24uXG4gKi8gZnVuY3Rpb24gamEodCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgSztcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IEwodCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4ucGVyc2lzdGVuY2UucnVuVHJhbnNhY3Rpb24oXCJyZWFkIGRvY3VtZW50XCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5sb2NhbERvY3VtZW50cy5nZXREb2N1bWVudCh0LCBlKSkpO1xuICAgICAgICAgICAgfSh0LCBlKTtcbiAgICAgICAgICAgIHMuaXNGb3VuZERvY3VtZW50KCkgPyBuLnJlc29sdmUocykgOiBzLmlzTm9Eb2N1bWVudCgpID8gbi5yZXNvbHZlKG51bGwpIDogbi5yZWplY3QobmV3IFUocS5VTkFWQUlMQUJMRSwgXCJGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGZyb20gY2FjaGUuIChIb3dldmVyLCB0aGlzIGRvY3VtZW50IG1heSBleGlzdCBvbiB0aGUgc2VydmVyLiBSdW4gYWdhaW4gd2l0aG91dCBzZXR0aW5nICdzb3VyY2UnIGluIHRoZSBHZXRPcHRpb25zIHRvIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGRvY3VtZW50IGZyb20gdGhlIHNlcnZlci4pXCIpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IEVjKHQsIGBGYWlsZWQgdG8gZ2V0IGRvY3VtZW50ICcke2V9IGZyb20gY2FjaGVgKTtcbiAgICAgICAgICAgIG4ucmVqZWN0KHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICogUmV0cmlldmVzIGEgbGF0ZW5jeS1jb21wZW5zYXRlZCBkb2N1bWVudCBmcm9tIHRoZSBiYWNrZW5kIHZpYSBhXG4gKiBTbmFwc2hvdExpc3RlbmVyLlxuICovIChhd2FpdCBCYSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiB6YSh0LCBlLCBuID0ge30pIHtcbiAgICBjb25zdCBzID0gbmV3IEs7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBuZXcgVmEoe1xuICAgICAgICAgICAgbmV4dDogciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHF1ZXJ5IGZpcnN0IGJlZm9yZSBwYXNzaW5nIGV2ZW50IHRvIHVzZXIgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAvLyB1c2VyIGFjdGlvbnMgYWZmZWN0aW5nIHRoZSBub3cgc3RhbGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgZS5lbnF1ZXVlQW5kRm9yZ2V0KCgoKSA9PiBTYyh0LCBvKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHUgPSByLmRvY3MuaGFzKG4pO1xuICAgICAgICAgICAgICAgICF1ICYmIHIuZnJvbUNhY2hlID8gXG4gICAgICAgICAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiBJZiB3ZSdyZSBvbmxpbmUgYW5kIHRoZSBkb2N1bWVudCBkb2Vzbid0XG4gICAgICAgICAgICAgICAgLy8gZXhpc3QgdGhlbiB3ZSByZXNvbHZlIHdpdGggYSBkb2MuZXhpc3RzIHNldCB0byBmYWxzZS4gSWZcbiAgICAgICAgICAgICAgICAvLyB3ZSdyZSBvZmZsaW5lIGhvd2V2ZXIsIHdlIHJlamVjdCB0aGUgUHJvbWlzZSBpbiB0aGlzXG4gICAgICAgICAgICAgICAgLy8gY2FzZS4gVHdvIG9wdGlvbnM6IDEpIENhY2hlIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZlciBzbyB3ZSBjYW4gZGVsaXZlciB0aGF0IGV2ZW4gd2hlbiB5b3UncmVcbiAgICAgICAgICAgICAgICAvLyBvZmZsaW5lIDIpIEFjdHVhbGx5IHJlamVjdCB0aGUgUHJvbWlzZSBpbiB0aGUgb25saW5lIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICAgICAgICBpLnJlamVjdChuZXcgVShxLlVOQVZBSUxBQkxFLCBcIkZhaWxlZCB0byBnZXQgZG9jdW1lbnQgYmVjYXVzZSB0aGUgY2xpZW50IGlzIG9mZmxpbmUuXCIpKSA6IHUgJiYgci5mcm9tQ2FjaGUgJiYgcyAmJiBcInNlcnZlclwiID09PSBzLnNvdXJjZSA/IGkucmVqZWN0KG5ldyBVKHEuVU5BVkFJTEFCTEUsICdGYWlsZWQgdG8gZ2V0IGRvY3VtZW50IGZyb20gc2VydmVyLiAoSG93ZXZlciwgdGhpcyBkb2N1bWVudCBkb2VzIGV4aXN0IGluIHRoZSBsb2NhbCBjYWNoZS4gUnVuIGFnYWluIHdpdGhvdXQgc2V0dGluZyBzb3VyY2UgdG8gXCJzZXJ2ZXJcIiB0byByZXRyaWV2ZSB0aGUgY2FjaGVkIGRvY3VtZW50LiknKSkgOiBpLnJlc29sdmUocik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IHQgPT4gaS5yZWplY3QodClcbiAgICAgICAgfSksIG8gPSBuZXcgTmMoR24obi5wYXRoKSwgciwge1xuICAgICAgICAgICAgaW5jbHVkZU1ldGFkYXRhQ2hhbmdlczogITAsXG4gICAgICAgICAgICBLdTogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBWYyh0LCBvKTtcbiAgICB9KGF3YWl0IEthKHQpLCB0LmFzeW5jUXVldWUsIGUsIG4sIHMpKSksIHMucHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gV2EodCwgZSkge1xuICAgIGNvbnN0IG4gPSBuZXcgSztcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGFzeW5jIGZ1bmN0aW9uKHQsIGUsIG4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBmdSh0LCBlLCBcbiAgICAgICAgICAgIC8qIHVzZVByZXZpb3VzUmVzdWx0cz0gKi8gITApLCBpID0gbmV3IExjKGUsIHMuaXIpLCByID0gaS5zYyhzLmRvY3VtZW50cyksIG8gPSBpLmFwcGx5Q2hhbmdlcyhyLCBcbiAgICAgICAgICAgIC8qIHVwZGF0ZUxpbWJvRG9jdW1lbnRzPSAqLyAhMSk7XG4gICAgICAgICAgICBuLnJlc29sdmUoby5zbmFwc2hvdCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBFYyh0LCBgRmFpbGVkIHRvIGV4ZWN1dGUgcXVlcnkgJyR7ZX0gYWdhaW5zdCBjYWNoZWApO1xuICAgICAgICAgICAgbi5yZWplY3Qocyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gKiBSZXRyaWV2ZXMgYSBsYXRlbmN5LWNvbXBlbnNhdGVkIHF1ZXJ5IHNuYXBzaG90IGZyb20gdGhlIGJhY2tlbmQgdmlhIGFcbiAqIFNuYXBzaG90TGlzdGVuZXIuXG4gKi8gKGF3YWl0IEJhKHQpLCBlLCBuKSkpLCBuLnByb21pc2U7XG59XG5cbmZ1bmN0aW9uIEhhKHQsIGUsIG4gPSB7fSkge1xuICAgIGNvbnN0IHMgPSBuZXcgSztcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUsIG4sIHMsIGkpIHtcbiAgICAgICAgY29uc3QgciA9IG5ldyBWYSh7XG4gICAgICAgICAgICBuZXh0OiBuID0+IHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgcXVlcnkgZmlyc3QgYmVmb3JlIHBhc3NpbmcgZXZlbnQgdG8gdXNlciB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIHVzZXIgYWN0aW9ucyBhZmZlY3RpbmcgdGhlIG5vdyBzdGFsZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBlLmVucXVldWVBbmRGb3JnZXQoKCgpID0+IFNjKHQsIG8pKSksIG4uZnJvbUNhY2hlICYmIFwic2VydmVyXCIgPT09IHMuc291cmNlID8gaS5yZWplY3QobmV3IFUocS5VTkFWQUlMQUJMRSwgJ0ZhaWxlZCB0byBnZXQgZG9jdW1lbnRzIGZyb20gc2VydmVyLiAoSG93ZXZlciwgdGhlc2UgZG9jdW1lbnRzIG1heSBleGlzdCBpbiB0aGUgbG9jYWwgY2FjaGUuIFJ1biBhZ2FpbiB3aXRob3V0IHNldHRpbmcgc291cmNlIHRvIFwic2VydmVyXCIgdG8gcmV0cmlldmUgdGhlIGNhY2hlZCBkb2N1bWVudHMuKScpKSA6IGkucmVzb2x2ZShuKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogdCA9PiBpLnJlamVjdCh0KVxuICAgICAgICB9KSwgbyA9IG5ldyBOYyhuLCByLCB7XG4gICAgICAgICAgICBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOiAhMCxcbiAgICAgICAgICAgIEt1OiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFZjKHQsIG8pO1xuICAgIH0oYXdhaXQgS2EodCksIHQuYXN5bmNRdWV1ZSwgZSwgbiwgcykpKSwgcy5wcm9taXNlO1xufVxuXG5mdW5jdGlvbiBKYSh0LCBlKSB7XG4gICAgY29uc3QgbiA9IG5ldyBWYShlKTtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgTCh0KS5rdS5hZGQoZSksIFxuICAgICAgICAvLyBJbW1lZGlhdGVseSBmaXJlIGFuIGluaXRpYWwgZXZlbnQsIGluZGljYXRpbmcgYWxsIGV4aXN0aW5nIGxpc3RlbmVyc1xuICAgICAgICAvLyBhcmUgaW4tc3luYy5cbiAgICAgICAgZS5uZXh0KCk7XG4gICAgfShhd2FpdCBLYSh0KSwgbikpKSwgKCkgPT4ge1xuICAgICAgICBuLkRjKCksIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICBMKHQpLmt1LmRlbGV0ZShlKTtcbiAgICAgICAgfShhd2FpdCBLYSh0KSwgbikpKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRha2VzIGFuIHVwZGF0ZUZ1bmN0aW9uIGluIHdoaWNoIGEgc2V0IG9mIHJlYWRzIGFuZCB3cml0ZXMgY2FuIGJlIHBlcmZvcm1lZFxuICogYXRvbWljYWxseS4gSW4gdGhlIHVwZGF0ZUZ1bmN0aW9uLCB0aGUgY2xpZW50IGNhbiByZWFkIGFuZCB3cml0ZSB2YWx1ZXNcbiAqIHVzaW5nIHRoZSBzdXBwbGllZCB0cmFuc2FjdGlvbiBvYmplY3QuIEFmdGVyIHRoZSB1cGRhdGVGdW5jdGlvbiwgYWxsXG4gKiBjaGFuZ2VzIHdpbGwgYmUgY29tbWl0dGVkLiBJZiBhIHJldHJ5YWJsZSBlcnJvciBvY2N1cnMgKGV4OiBzb21lIG90aGVyXG4gKiBjbGllbnQgaGFzIGNoYW5nZWQgYW55IG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQpLCB0aGVuIHRoZSB1cGRhdGVGdW5jdGlvblxuICogd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgYSBiYWNrb2ZmLiBJZiB0aGUgdXBkYXRlRnVuY3Rpb24gc3RpbGwgZmFpbHNcbiAqIGFmdGVyIGFsbCByZXRyaWVzLCB0aGVuIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlamVjdGVkLlxuICpcbiAqIFRoZSB0cmFuc2FjdGlvbiBvYmplY3QgcGFzc2VkIHRvIHRoZSB1cGRhdGVGdW5jdGlvbiBjb250YWlucyBtZXRob2RzIGZvclxuICogYWNjZXNzaW5nIGRvY3VtZW50cyBhbmQgY29sbGVjdGlvbnMuIFVubGlrZSBvdGhlciBkYXRhc3RvcmUgYWNjZXNzLCBkYXRhXG4gKiBhY2Nlc3NlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiB3aWxsIG5vdCByZWZsZWN0IGxvY2FsIGNoYW5nZXMgdGhhdCBoYXZlIG5vdFxuICogYmVlbiBjb21taXR0ZWQuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwgcmVhZHMgYXJlXG4gKiBwZXJmb3JtZWQgYmVmb3JlIGFueSB3cml0ZXMuIFRyYW5zYWN0aW9ucyBtdXN0IGJlIHBlcmZvcm1lZCB3aGlsZSBvbmxpbmUuXG4gKi8gZnVuY3Rpb24gWWEodCwgZSwgbiwgcykge1xuICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBuID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IGhpKCkuZW5jb2RlKHQpIDogdDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2EodCwgZSk7XG4gICAgICAgIH0oZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gYmEodCwgZSk7XG4gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gYmEobmV3IFVpbnQ4QXJyYXkodCksIGUpO1xuICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkgcmV0dXJuIHQuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2Ugb2YgYHRvQnl0ZVN0cmVhbVJlYWRlcmAgaGFzIHRvIGJlIGEgQXJyYXlCdWZmZXIgb3IgUmVhZGFibGVTdHJlYW1cIik7XG4gICAgICAgIH0obiksIGUpO1xuICAgIH0obiwgRnUoZSkpO1xuICAgIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB7XG4gICAgICAgIFRhKGF3YWl0IHFhKHQpLCBpLCBzKTtcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIFhhKHQsIGUpIHtcbiAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWUoKGFzeW5jICgpID0+IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IEwodCk7XG4gICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiR2V0IG5hbWVkIHF1ZXJ5XCIsIFwicmVhZG9ubHlcIiwgKHQgPT4gbi5xcy5nZXROYW1lZFF1ZXJ5KHQsIGUpKSk7XG4gICAgfShhd2FpdCBCYSh0KSwgZSkpKTtcbn1cblxuZnVuY3Rpb24gWmEodCwgZSkge1xuICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZSgoYXN5bmMgKCkgPT4gYXN5bmMgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gTCh0KSwgcyA9IG4uaW5kZXhNYW5hZ2VyLCBpID0gW107XG4gICAgICAgIHJldHVybiBuLnBlcnNpc3RlbmNlLnJ1blRyYW5zYWN0aW9uKFwiQ29uZmlndXJlIGluZGV4ZXNcIiwgXCJyZWFkd3JpdGVcIiwgKHQgPT4gcy5nZXRGaWVsZEluZGV4ZXModCkubmV4dCgobiA9PiBcbiAgICAgICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAgICAgLyoqXG4gKiBDb21wYXJlcyB0d28gYXJyYXkgZm9yIGVxdWFsaXR5IHVzaW5nIGNvbXBhcmF0b3IuIFRoZSBtZXRob2QgY29tcHV0ZXMgdGhlXG4gKiBpbnRlcnNlY3Rpb24gYW5kIGludm9rZXMgYG9uQWRkYCBmb3IgZXZlcnkgZWxlbWVudCB0aGF0IGlzIGluIGBhZnRlcmAgYnV0IG5vdFxuICogYGJlZm9yZWAuIGBvblJlbW92ZWAgaXMgaW52b2tlZCBmb3IgZXZlcnkgZWxlbWVudCBpbiBgYmVmb3JlYCBidXQgbWlzc2luZ1xuICogZnJvbSBgYWZ0ZXJgLlxuICpcbiAqIFRoZSBtZXRob2QgY3JlYXRlcyBhIGNvcHkgb2YgYm90aCBgYmVmb3JlYCBhbmQgYGFmdGVyYCBhbmQgcnVucyBpbiBPKG4gbG9nXG4gKiBuKSwgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzLlxuICpcbiAqIEBwYXJhbSBiZWZvcmUgLSBUaGUgZWxlbWVudHMgdGhhdCBleGlzdCBpbiB0aGUgb3JpZ2luYWwgYXJyYXkuXG4gKiBAcGFyYW0gYWZ0ZXIgLSBUaGUgZWxlbWVudHMgdG8gZGlmZiBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBhcnJheS5cbiAqIEBwYXJhbSBjb21wYXJhdG9yIC0gVGhlIGNvbXBhcmF0b3IgZm9yIHRoZSBlbGVtZW50cyBpbiBiZWZvcmUgYW5kIGFmdGVyLlxuICogQHBhcmFtIG9uQWRkIC0gQSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGV2ZXJ5IGVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGBcbiAqIGFmdGVyYCBidXQgbm90IGBiZWZvcmVgLlxuICogQHBhcmFtIG9uUmVtb3ZlIC0gQSBmdW5jdGlvbiB0byBpbnZva2UgZm9yIGV2ZXJ5IGVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mXG4gKiBgYmVmb3JlYCBidXQgbm90IGBhZnRlcmAuXG4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSwgbiwgcywgaSkge1xuICAgICAgICAgICAgdCA9IFsgLi4udCBdLCBlID0gWyAuLi5lIF0sIHQuc29ydChuKSwgZS5zb3J0KG4pO1xuICAgICAgICAgICAgY29uc3QgciA9IHQubGVuZ3RoLCBvID0gZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdSA9IDAsIGMgPSAwO1xuICAgICAgICAgICAgZm9yICg7dSA8IG8gJiYgYyA8IHI7ICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuKHRbY10sIGVbdV0pO1xuICAgICAgICAgICAgICAgIHIgPCAwID8gXG4gICAgICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgd2FzIHJlbW92ZWQgaWYgdGhlIG5leHQgZWxlbWVudCBpbiBvdXIgb3JkZXJlZFxuICAgICAgICAgICAgICAgIC8vIHdhbGt0aHJvdWdoIGlzIG9ubHkgaW4gYGJlZm9yZWAuXG4gICAgICAgICAgICAgICAgaSh0W2MrK10pIDogciA+IDAgPyBcbiAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCB3YXMgYWRkZWQgaWYgdGhlIG5leHQgZWxlbWVudCBpbiBvdXIgb3JkZXJlZCB3YWxrdGhyb3VnaFxuICAgICAgICAgICAgICAgIC8vIGlzIG9ubHkgaW4gYGFmdGVyYC5cbiAgICAgICAgICAgICAgICBzKGVbdSsrXSkgOiAodSsrLCBjKyspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7dSA8IG87ICkgcyhlW3UrK10pO1xuICAgICAgICAgICAgZm9yICg7YyA8IHI7ICkgaSh0W2MrK10pO1xuICAgICAgICB9KG4sIGUsIHd0LCAoZSA9PiB7XG4gICAgICAgICAgICBpLnB1c2gocy5hZGRGaWVsZEluZGV4KHQsIGUpKTtcbiAgICAgICAgfSksIChlID0+IHtcbiAgICAgICAgICAgIGkucHVzaChzLmRlbGV0ZUZpZWxkSW5kZXgodCwgZSkpO1xuICAgICAgICB9KSkpKS5uZXh0KCgoKSA9PiBSdC53YWl0Rm9yKGkpKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBMb2NhbFN0b3JhZ2Uga2V5IHRoYXQgc3RvcmVzIHRoZSBjbGllbnQgc3RhdGUgaXM6XG4gICAgLy8gICAgIGZpcmVzdG9yZV9jbGllbnRzXzxwZXJzaXN0ZW5jZV9wcmVmaXg+XzxpbnN0YW5jZV9rZXk+XG4gICAgKGF3YWl0IEJhKHQpLCBlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDb21wYXJlcyB0d28gYEV4cGVyaW1lbnRhbExvbmdQb2xsaW5nT3B0aW9uc2Agb2JqZWN0cyBmb3IgZXF1YWxpdHkuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBgRXhwZXJpbWVudGFsTG9uZ1BvbGxpbmdPcHRpb25zYCB3aXRoIHRoZSBzYW1lXG4gKiBvcHRpb24gdmFsdWVzIGFzIHRoZSBnaXZlbiBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gdGgodCkge1xuICAgIGNvbnN0IGUgPSB7fTtcbiAgICByZXR1cm4gdm9pZCAwICE9PSB0LnRpbWVvdXRTZWNvbmRzICYmIChlLnRpbWVvdXRTZWNvbmRzID0gdC50aW1lb3V0U2Vjb25kcyksIGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IGVoID0gbmV3IE1hcDtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBtYXAgdGhhdCBlbnN1cmVzIG9ubHkgb25lIERhdGFzdG9yZSBleGlzdHMgcGVyIEZpcmVzdG9yZVxuICogaW5zdGFuY2UuXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiBuaCh0LCBlLCBuKSB7XG4gICAgaWYgKCFuKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBGdW5jdGlvbiAke3R9KCkgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5ICR7ZX0uYCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdHdvIGJvb2xlYW4gb3B0aW9ucyBhcmUgbm90IHNldCBhdCB0aGUgc2FtZSB0aW1lLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gc2godCwgZSwgbiwgcykge1xuICAgIGlmICghMCA9PT0gZSAmJiAhMCA9PT0gcykgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgJHt0fSBhbmQgJHtufSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgZG9jdW1lbnQgKGluZGljYXRlZCBieSB0aGUgZmFjdCBpdCBjb250YWluc1xuICogYW4gZXZlbiBudW1iZXJzIG9mIHNlZ21lbnRzKS5cbiAqLyBmdW5jdGlvbiBpaCh0KSB7XG4gICAgaWYgKCFodC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGRvY3VtZW50IHJlZmVyZW5jZS4gRG9jdW1lbnQgcmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBgcGF0aGAgcmVmZXJzIHRvIGEgY29sbGVjdGlvbiAoaW5kaWNhdGVkIGJ5IHRoZSBmYWN0IGl0XG4gKiBjb250YWlucyBhbiBvZGQgbnVtYmVycyBvZiBzZWdtZW50cykuXG4gKi8gZnVuY3Rpb24gcmgodCkge1xuICAgIGlmIChodC5pc0RvY3VtZW50S2V5KHQpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIGNvbGxlY3Rpb24gcmVmZXJlbmNlLiBDb2xsZWN0aW9uIHJlZmVyZW5jZXMgbXVzdCBoYXZlIGFuIG9kZCBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAke3R9IGhhcyAke3QubGVuZ3RofS5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgaXQncyBhIG5vbi1udWxsIG9iamVjdCB3aXRob3V0IGEgY3VzdG9tIHByb3RvdHlwZVxuICogKGkuZS4gZXhjbHVkZXMgQXJyYXksIERhdGUsIGV0Yy4pLlxuICovXG4vKiogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIC8gdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGlucHV0LiAqL1xuZnVuY3Rpb24gb2godCkge1xuICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChudWxsID09PSB0KSByZXR1cm4gXCJudWxsXCI7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0Lmxlbmd0aCA+IDIwICYmICh0ID0gYCR7dC5zdWJzdHJpbmcoMCwgMjApfS4uLmApLCBcbiAgICBKU09OLnN0cmluZ2lmeSh0KTtcbiAgICBpZiAoXCJudW1iZXJcIiA9PSB0eXBlb2YgdCB8fCBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdCkgcmV0dXJuIFwiXCIgKyB0O1xuICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBcImFuIGFycmF5XCI7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBcbiAgICAgICAgICAgIC8qKiB0cnkgdG8gZ2V0IHRoZSBjb25zdHJ1Y3RvciBuYW1lIGZvciBhbiBvYmplY3QuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IpIHJldHVybiB0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAqIENhc3RzIGBvYmpgIHRvIGBUYCwgb3B0aW9uYWxseSB1bndyYXBwaW5nIENvbXBhdCB0eXBlcyB0byBleHBvc2UgdGhlXG4gKiB1bmRlcmx5aW5nIGluc3RhbmNlLiBUaHJvd3MgaWYgIGBvYmpgIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBgVGAuXG4gKlxuICogVGhpcyBjYXN0IGlzIHVzZWQgaW4gdGhlIExpdGUgYW5kIEZ1bGwgU0RLIHRvIHZlcmlmeSBpbnN0YW5jZSB0eXBlcyBmb3JcbiAqIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHB1YmxpYyBBUEkuXG4gKiBAaW50ZXJuYWxcbiAqLyAodCk7XG4gICAgICAgICAgICByZXR1cm4gZSA/IGBhIGN1c3RvbSAke2V9IG9iamVjdGAgOiBcImFuIG9iamVjdFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQgPyBcImEgZnVuY3Rpb25cIiA6IE8oKTtcbn1cblxuZnVuY3Rpb24gdWgodCwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZSkge1xuICAgIGlmIChcIl9kZWxlZ2F0ZVwiIGluIHQgJiYgKFxuICAgIC8vIFVud3JhcCBDb21wYXQgdHlwZXNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHQgPSB0Ll9kZWxlZ2F0ZSksICEodCBpbnN0YW5jZW9mIGUpKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09IHQuY29uc3RydWN0b3IubmFtZSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGluc3RhbmNlLiBEaWQgeW91IHBhc3MgYSByZWZlcmVuY2UgZnJvbSBhIGRpZmZlcmVudCBGaXJlc3RvcmUgU0RLP1wiKTtcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbiA9IG9oKHQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgRXhwZWN0ZWQgdHlwZSAnJHtlLm5hbWV9JywgYnV0IGl0IHdhczogJHtufWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5mdW5jdGlvbiBjaCh0LCBlKSB7XG4gICAgaWYgKGUgPD0gMCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgRnVuY3Rpb24gJHt0fSgpIHJlcXVpcmVzIGEgcG9zaXRpdmUgbnVtYmVyLCBidXQgaXQgd2FzOiAke2V9LmApO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gc2V0dGluZ3MoKSBkZWZhdWx0czpcbi8qKlxuICogQSBjb25jcmV0ZSB0eXBlIGRlc2NyaWJpbmcgYWxsIHRoZSB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB2aWEgYVxuICogdXNlci1zdXBwbGllZCBgRmlyZXN0b3JlU2V0dGluZ3NgIG9iamVjdC4gVGhpcyBpcyBhIHNlcGFyYXRlIHR5cGUgc28gdGhhdFxuICogZGVmYXVsdHMgY2FuIGJlIHN1cHBsaWVkIGFuZCB0aGUgdmFsdWUgY2FuIGJlIGNoZWNrZWQgZm9yIGVxdWFsaXR5LlxuICovXG5jbGFzcyBhaCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB2YXIgZSwgbjtcbiAgICAgICAgaWYgKHZvaWQgMCA9PT0gdC5ob3N0KSB7XG4gICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0LnNzbCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkNhbid0IHByb3ZpZGUgc3NsIG9wdGlvbiBpZiBob3N0IG9wdGlvbiBpcyBub3Qgc2V0XCIpO1xuICAgICAgICAgICAgdGhpcy5ob3N0ID0gXCJmaXJlc3RvcmUuZ29vZ2xlYXBpcy5jb21cIiwgdGhpcy5zc2wgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgdGhpcy5ob3N0ID0gdC5ob3N0LCB0aGlzLnNzbCA9IG51bGwgPT09IChlID0gdC5zc2wpIHx8IHZvaWQgMCA9PT0gZSB8fCBlO1xuICAgICAgICBpZiAodGhpcy5jcmVkZW50aWFscyA9IHQuY3JlZGVudGlhbHMsIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9ICEhdC5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCBcbiAgICAgICAgdGhpcy5jYWNoZSA9IHQubG9jYWxDYWNoZSwgdm9pZCAwID09PSB0LmNhY2hlU2l6ZUJ5dGVzKSB0aGlzLmNhY2hlU2l6ZUJ5dGVzID0gNDE5NDMwNDA7IGVsc2Uge1xuICAgICAgICAgICAgaWYgKC0xICE9PSB0LmNhY2hlU2l6ZUJ5dGVzICYmIHQuY2FjaGVTaXplQnl0ZXMgPCAxMDQ4NTc2KSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiY2FjaGVTaXplQnl0ZXMgbXVzdCBiZSBhdCBsZWFzdCAxMDQ4NTc2XCIpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZVNpemVCeXRlcyA9IHQuY2FjaGVTaXplQnl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgc2goXCJleHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nXCIsIHQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZywgXCJleHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmdcIiwgdC5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcpLCBcbiAgICAgICAgdGhpcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcsIHRoaXMuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZyA/IHRoaXMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nID0gITEgOiB2b2lkIDAgPT09IHQuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nID8gdGhpcy5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgPSB0cnVlIDogXG4gICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgY29lcmNlIHRoZSB2YWx1ZSB0byBib29sZWFuIGV2ZW4gdGhvdWdoXG4gICAgICAgIC8vIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIGhhcyBuYXJyb3dlZCB0aGUgdHlwZSB0byBib29sZWFuIGFscmVhZHkuXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgICAgIHRoaXMuZXhwZXJpbWVudGFsQXV0b0RldGVjdExvbmdQb2xsaW5nID0gISF0LmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZywgXG4gICAgICAgIHRoaXMuZXhwZXJpbWVudGFsTG9uZ1BvbGxpbmdPcHRpb25zID0gdGgobnVsbCAhPT0gKG4gPSB0LmV4cGVyaW1lbnRhbExvbmdQb2xsaW5nT3B0aW9ucykgJiYgdm9pZCAwICE9PSBuID8gbiA6IHt9KSwgXG4gICAgICAgIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQudGltZW91dFNlY29uZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4odC50aW1lb3V0U2Vjb25kcykpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYGludmFsaWQgbG9uZyBwb2xsaW5nIHRpbWVvdXQ6ICR7dC50aW1lb3V0U2Vjb25kc30gKG11c3Qgbm90IGJlIE5hTilgKTtcbiAgICAgICAgICAgICAgICBpZiAodC50aW1lb3V0U2Vjb25kcyA8IDUpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYGludmFsaWQgbG9uZyBwb2xsaW5nIHRpbWVvdXQ6ICR7dC50aW1lb3V0U2Vjb25kc30gKG1pbmltdW0gYWxsb3dlZCB2YWx1ZSBpcyA1KWApO1xuICAgICAgICAgICAgICAgIGlmICh0LnRpbWVvdXRTZWNvbmRzID4gMzApIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYGludmFsaWQgbG9uZyBwb2xsaW5nIHRpbWVvdXQ6ICR7dC50aW1lb3V0U2Vjb25kc30gKG1heGltdW0gYWxsb3dlZCB2YWx1ZSBpcyAzMClgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuICAgICAgICAvKipcbiAqIFRoZSBDbG91ZCBGaXJlc3RvcmUgc2VydmljZSBpbnRlcmZhY2UuXG4gKlxuICogRG8gbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS4gSW5zdGVhZCwgdXNlIHtAbGluayAoZ2V0RmlyZXN0b3JlOjEpfS5cbiAqLyAodGhpcy5leHBlcmltZW50YWxMb25nUG9sbGluZ09wdGlvbnMpLCB0aGlzLnVzZUZldGNoU3RyZWFtcyA9ICEhdC51c2VGZXRjaFN0cmVhbXM7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0ID09PSB0Lmhvc3QgJiYgdGhpcy5zc2wgPT09IHQuc3NsICYmIHRoaXMuY3JlZGVudGlhbHMgPT09IHQuY3JlZGVudGlhbHMgJiYgdGhpcy5jYWNoZVNpemVCeXRlcyA9PT0gdC5jYWNoZVNpemVCeXRlcyAmJiB0aGlzLmV4cGVyaW1lbnRhbEZvcmNlTG9uZ1BvbGxpbmcgPT09IHQuZXhwZXJpbWVudGFsRm9yY2VMb25nUG9sbGluZyAmJiB0aGlzLmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZyA9PT0gdC5leHBlcmltZW50YWxBdXRvRGV0ZWN0TG9uZ1BvbGxpbmcgJiYgKGUgPSB0aGlzLmV4cGVyaW1lbnRhbExvbmdQb2xsaW5nT3B0aW9ucywgXG4gICAgICAgIG4gPSB0LmV4cGVyaW1lbnRhbExvbmdQb2xsaW5nT3B0aW9ucywgZS50aW1lb3V0U2Vjb25kcyA9PT0gbi50aW1lb3V0U2Vjb25kcykgJiYgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzID09PSB0Lmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMgJiYgdGhpcy51c2VGZXRjaFN0cmVhbXMgPT09IHQudXNlRmV0Y2hTdHJlYW1zO1xuICAgICAgICB2YXIgZSwgbjtcbiAgICB9XG59XG5cbmNsYXNzIGhoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgdGhpcy5fYXV0aENyZWRlbnRpYWxzID0gdCwgdGhpcy5fYXBwQ2hlY2tDcmVkZW50aWFscyA9IGUsIHRoaXMuX2RhdGFiYXNlSWQgPSBuLCBcbiAgICAgICAgdGhpcy5fYXBwID0gcywgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGl0J3MgYSBGaXJlc3RvcmUgb3IgRmlyZXN0b3JlIExpdGUgaW5zdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcImZpcmVzdG9yZS1saXRlXCIsIHRoaXMuX3BlcnNpc3RlbmNlS2V5ID0gXCIobGl0ZSlcIiwgdGhpcy5fc2V0dGluZ3MgPSBuZXcgYWgoe30pLCBcbiAgICAgICAgdGhpcy5fc2V0dGluZ3NGcm96ZW4gPSAhMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBgRmlyZXN0b3JlYCBzZXJ2aWNlXG4gICAgICogaW5zdGFuY2UuXG4gICAgICovICAgIGdldCBhcHAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fYXBwKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiRmlyZXN0b3JlIHdhcyBub3QgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIEZpcmViYXNlIFNESy4gJ2FwcCcgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcDtcbiAgICB9XG4gICAgZ2V0IF9pbml0aWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzRnJvemVuO1xuICAgIH1cbiAgICBnZXQgX3Rlcm1pbmF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuX3Rlcm1pbmF0ZVRhc2s7XG4gICAgfVxuICAgIF9zZXRTZXR0aW5ncyh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc0Zyb3plbikgdGhyb3cgbmV3IFUocS5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkZpcmVzdG9yZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgYW5kIGl0cyBzZXR0aW5ncyBjYW4gbm8gbG9uZ2VyIGJlIGNoYW5nZWQuIFlvdSBjYW4gb25seSBtb2RpZnkgc2V0dGluZ3MgYmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIG1ldGhvZHMgb24gYSBGaXJlc3RvcmUgb2JqZWN0LlwiKTtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBuZXcgYWgodCksIHZvaWQgMCAhPT0gdC5jcmVkZW50aWFscyAmJiAodGhpcy5fYXV0aENyZWRlbnRpYWxzID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgaWYgKCF0KSByZXR1cm4gbmV3IFE7XG4gICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiZmlyc3RQYXJ0eVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSCh0LnNlc3Npb25JbmRleCB8fCBcIjBcIiwgdC5pYW1Ub2tlbiB8fCBudWxsLCB0LmF1dGhUb2tlbkZhY3RvcnkgfHwgbnVsbCk7XG5cbiAgICAgICAgICAgICAgY2FzZSBcInByb3ZpZGVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuY2xpZW50O1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIm1ha2VBdXRoQ3JlZGVudGlhbHNQcm92aWRlciBmYWlsZWQgZHVlIHRvIGludmFsaWQgY3JlZGVudGlhbCB0eXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHQuY3JlZGVudGlhbHMpKTtcbiAgICB9XG4gICAgX2dldFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XG4gICAgfVxuICAgIF9mcmVlemVTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzRnJvemVuID0gITAsIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbiAgICBfZGVsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVybWluYXRlVGFzayB8fCAodGhpcy5fdGVybWluYXRlVGFzayA9IHRoaXMuX3Rlcm1pbmF0ZSgpKSwgdGhpcy5fdGVybWluYXRlVGFzaztcbiAgICB9XG4gICAgLyoqIFJldHVybnMgYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBGaXJlc3RvcmVgIGluc3RhbmNlLiAqLyAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcHA6IHRoaXMuX2FwcCxcbiAgICAgICAgICAgIGRhdGFiYXNlSWQ6IHRoaXMuX2RhdGFiYXNlSWQsXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5fc2V0dGluZ3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVybWluYXRlcyBhbGwgY29tcG9uZW50cyB1c2VkIGJ5IHRoaXMgY2xpZW50LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgICAqIHRoaXMgbWV0aG9kIHRvIGNsZWFuIHVwIHRoZWlyIG93biBkZXBlbmRlbmNpZXMsIGJ1dCBtdXN0IGFsc28gY2FsbCB0aGlzXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogT25seSBldmVyIGNhbGxlZCBvbmNlLlxuICAgICAqLyAgICBfdGVybWluYXRlKCkge1xuICAgICAgICAvKipcbiAqIFJlbW92ZXMgYWxsIGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpbnN0YW5jZS4gTXVzdCBiZSBjYWxsZWRcbiAqIHdoZW4gdGhlIGBGaXJlc3RvcmVgIGluc3RhbmNlIGlzIHRlcm1pbmF0ZWQuXG4gKi9cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBlaC5nZXQodCk7XG4gICAgICAgICAgICBlICYmIChOKFwiQ29tcG9uZW50UHJvdmlkZXJcIiwgXCJSZW1vdmluZyBEYXRhc3RvcmVcIiksIGVoLmRlbGV0ZSh0KSwgZS50ZXJtaW5hdGUoKSk7XG4gICAgICAgIH0odGhpcyksIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNb2RpZnkgdGhpcyBpbnN0YW5jZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBDbG91ZCBGaXJlc3RvcmUgZW11bGF0b3IuXG4gKlxuICogTm90ZTogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBpbnN0YW5jZSBoYXMgYmVlbiB1c2VkIHRvIGRvIGFueVxuICogb3BlcmF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gVGhlIGBGaXJlc3RvcmVgIGluc3RhbmNlIHRvIGNvbmZpZ3VyZSB0byBjb25uZWN0IHRvIHRoZVxuICogZW11bGF0b3IuXG4gKiBAcGFyYW0gaG9zdCAtIHRoZSBlbXVsYXRvciBob3N0IChleDogbG9jYWxob3N0KS5cbiAqIEBwYXJhbSBwb3J0IC0gdGhlIGVtdWxhdG9yIHBvcnQgKGV4OiA5MDAwKS5cbiAqIEBwYXJhbSBvcHRpb25zLm1vY2tVc2VyVG9rZW4gLSB0aGUgbW9jayBhdXRoIHRva2VuIHRvIHVzZSBmb3IgdW5pdCB0ZXN0aW5nXG4gKiBTZWN1cml0eSBSdWxlcy5cbiAqLyBmdW5jdGlvbiBsaCh0LCBlLCBuLCBzID0ge30pIHtcbiAgICB2YXIgaTtcbiAgICBjb25zdCByID0gKHQgPSB1aCh0LCBoaCkpLl9nZXRTZXR0aW5ncygpLCBvID0gYCR7ZX06JHtufWA7XG4gICAgaWYgKFwiZmlyZXN0b3JlLmdvb2dsZWFwaXMuY29tXCIgIT09IHIuaG9zdCAmJiByLmhvc3QgIT09IG8gJiYgTShcIkhvc3QgaGFzIGJlZW4gc2V0IGluIGJvdGggc2V0dGluZ3MoKSBhbmQgY29ubmVjdEZpcmVzdG9yZUVtdWxhdG9yKCksIGVtdWxhdG9yIGhvc3Qgd2lsbCBiZSB1c2VkLlwiKSwgXG4gICAgdC5fc2V0U2V0dGluZ3MoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByKSwge1xuICAgICAgICBob3N0OiBvLFxuICAgICAgICBzc2w6ICExXG4gICAgfSkpLCBzLm1vY2tVc2VyVG9rZW4pIHtcbiAgICAgICAgbGV0IGUsIG47XG4gICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBzLm1vY2tVc2VyVG9rZW4pIGUgPSBzLm1vY2tVc2VyVG9rZW4sIG4gPSBWLk1PQ0tfVVNFUjsgZWxzZSB7XG4gICAgICAgICAgICAvLyBMZXQgY3JlYXRlTW9ja1VzZXJUb2tlbiB2YWxpZGF0ZSBmaXJzdCAoY2F0Y2hlcyBjb21tb24gbWlzdGFrZXMgbGlrZVxuICAgICAgICAgICAgLy8gaW52YWxpZCBmaWVsZCBcInVpZFwiIGFuZCBtaXNzaW5nIGZpZWxkIFwic3ViXCIgLyBcInVzZXJfaWRcIi4pXG4gICAgICAgICAgICBlID0gY3JlYXRlTW9ja1VzZXJUb2tlbihzLm1vY2tVc2VyVG9rZW4sIG51bGwgPT09IChpID0gdC5fYXBwKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLm9wdGlvbnMucHJvamVjdElkKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBzLm1vY2tVc2VyVG9rZW4uc3ViIHx8IHMubW9ja1VzZXJUb2tlbi51c2VyX2lkO1xuICAgICAgICAgICAgaWYgKCFyKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwibW9ja1VzZXJUb2tlbiBtdXN0IGNvbnRhaW4gJ3N1Yicgb3IgJ3VzZXJfaWQnIGZpZWxkIVwiKTtcbiAgICAgICAgICAgIG4gPSBuZXcgVihyKTtcbiAgICAgICAgfVxuICAgICAgICB0Ll9hdXRoQ3JlZGVudGlhbHMgPSBuZXcgaihuZXcgRyhlLCBuKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGBEb2N1bWVudFJlZmVyZW5jZWAgcmVmZXJzIHRvIGEgZG9jdW1lbnQgbG9jYXRpb24gaW4gYSBGaXJlc3RvcmUgZGF0YWJhc2VcbiAqIGFuZCBjYW4gYmUgdXNlZCB0byB3cml0ZSwgcmVhZCwgb3IgbGlzdGVuIHRvIHRoZSBsb2NhdGlvbi4gVGhlIGRvY3VtZW50IGF0XG4gKiB0aGUgcmVmZXJlbmNlZCBsb2NhdGlvbiBtYXkgb3IgbWF5IG5vdCBleGlzdC5cbiAqLyBjbGFzcyBmaCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGBGaXJlc3RvcmVEYXRhQ29udmVydGVyYCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBlLCBuKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVyID0gZSwgdGhpcy5fa2V5ID0gbiwgXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIEZpcmVzdG9yZSByZWZlcmVuY2UuICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwiZG9jdW1lbnRcIiwgdGhpcy5maXJlc3RvcmUgPSB0O1xuICAgIH1cbiAgICBnZXQgX3BhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXkucGF0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRvY3VtZW50J3MgaWRlbnRpZmllciB3aXRoaW4gaXRzIGNvbGxlY3Rpb24uXG4gICAgICovICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleS5wYXRoLmxhc3RTZWdtZW50KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCBvZiB0aGUgcmVmZXJlbmNlZCBkb2N1bWVudCAocmVsYXRpdmVcbiAgICAgKiB0byB0aGUgcm9vdCBvZiB0aGUgZGF0YWJhc2UpLlxuICAgICAqLyAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleS5wYXRoLmNhbm9uaWNhbFN0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29sbGVjdGlvbiB0aGlzIGBEb2N1bWVudFJlZmVyZW5jZWAgYmVsb25ncyB0by5cbiAgICAgKi8gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB3aCh0aGlzLmZpcmVzdG9yZSwgdGhpcy5jb252ZXJ0ZXIsIHRoaXMuX2tleS5wYXRoLnBvcExhc3QoKSk7XG4gICAgfVxuICAgIHdpdGhDb252ZXJ0ZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IGZoKHRoaXMuZmlyZXN0b3JlLCB0LCB0aGlzLl9rZXkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBRdWVyeWAgcmVmZXJzIHRvIGEgcXVlcnkgd2hpY2ggeW91IGNhbiByZWFkIG9yIGxpc3RlbiB0by4gWW91IGNhbiBhbHNvXG4gKiBjb25zdHJ1Y3QgcmVmaW5lZCBgUXVlcnlgIG9iamVjdHMgYnkgYWRkaW5nIGZpbHRlcnMgYW5kIG9yZGVyaW5nLlxuICovIGNsYXNzIGRoIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBsaXRlIHZlcnNpb24gb2YgdGhlIFF1ZXJ5IGNsYXNzIGluIHRoZSBtYWluIFNESy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGBGaXJlc3RvcmVEYXRhQ29udmVydGVyYCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBlLCBuKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVyID0gZSwgdGhpcy5fcXVlcnkgPSBuLCBcbiAgICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoaXMgRmlyZXN0b3JlIHJlZmVyZW5jZS4gKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJxdWVyeVwiLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIHdpdGhDb252ZXJ0ZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IGRoKHRoaXMuZmlyZXN0b3JlLCB0LCB0aGlzLl9xdWVyeSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYENvbGxlY3Rpb25SZWZlcmVuY2VgIG9iamVjdCBjYW4gYmUgdXNlZCBmb3IgYWRkaW5nIGRvY3VtZW50cywgZ2V0dGluZ1xuICogZG9jdW1lbnQgcmVmZXJlbmNlcywgYW5kIHF1ZXJ5aW5nIGZvciBkb2N1bWVudHMgKHVzaW5nIHtAbGluayAocXVlcnk6MSl9KS5cbiAqLyBjbGFzcyB3aCBleHRlbmRzIGRoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIodCwgZSwgR24obikpLCB0aGlzLl9wYXRoID0gbiwgXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIEZpcmVzdG9yZSByZWZlcmVuY2UuICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwiY29sbGVjdGlvblwiO1xuICAgIH1cbiAgICAvKiogVGhlIGNvbGxlY3Rpb24ncyBpZGVudGlmaWVyLiAqLyAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeS5wYXRoLmxhc3RTZWdtZW50KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCBvZiB0aGUgcmVmZXJlbmNlZCBjb2xsZWN0aW9uIChyZWxhdGl2ZVxuICAgICAqIHRvIHRoZSByb290IG9mIHRoZSBkYXRhYmFzZSkuXG4gICAgICovICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnkucGF0aC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5pbmcgYERvY3VtZW50UmVmZXJlbmNlYCBpZiB0aGlzIGlzIGFcbiAgICAgKiBzdWJjb2xsZWN0aW9uLiBJZiB0aGlzIGlzbid0IGEgc3ViY29sbGVjdGlvbiwgdGhlIHJlZmVyZW5jZSBpcyBudWxsLlxuICAgICAqLyAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5fcGF0aC5wb3BMYXN0KCk7XG4gICAgICAgIHJldHVybiB0LmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgZmgodGhpcy5maXJlc3RvcmUsIFxuICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIG5ldyBodCh0KSk7XG4gICAgfVxuICAgIHdpdGhDb252ZXJ0ZXIodCkge1xuICAgICAgICByZXR1cm4gbmV3IHdoKHRoaXMuZmlyZXN0b3JlLCB0LCB0aGlzLl9wYXRoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9oKHQsIGUsIC4uLm4pIHtcbiAgICBpZiAodCA9IGdldE1vZHVsYXJJbnN0YW5jZSh0KSwgbmgoXCJjb2xsZWN0aW9uXCIsIFwicGF0aFwiLCBlKSwgdCBpbnN0YW5jZW9mIGhoKSB7XG4gICAgICAgIGNvbnN0IHMgPSB1dC5mcm9tU3RyaW5nKGUsIC4uLm4pO1xuICAgICAgICByZXR1cm4gcmgocyksIG5ldyB3aCh0LCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIHMpO1xuICAgIH1cbiAgICB7XG4gICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBmaCB8fCB0IGluc3RhbmNlb2Ygd2gpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gY29sbGVjdGlvbigpIHRvIGJlIGEgQ29sbGVjdGlvblJlZmVyZW5jZSwgYSBEb2N1bWVudFJlZmVyZW5jZSBvciBGaXJlYmFzZUZpcmVzdG9yZVwiKTtcbiAgICAgICAgY29uc3QgcyA9IHQuX3BhdGguY2hpbGQodXQuZnJvbVN0cmluZyhlLCAuLi5uKSk7XG4gICAgICAgIHJldHVybiByaChzKSwgbmV3IHdoKHQuZmlyZXN0b3JlLCBcbiAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsLCBzKTtcbiAgICB9XG59XG5cbi8vIFRPRE8oZmlyZXN0b3JlbGl0ZSk6IENvbnNpZGVyIHVzaW5nIEVycm9yRmFjdG9yeSAtXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2Jsb2IvMDEzMWUxZi9wYWNrYWdlcy91dGlsL3NyYy9lcnJvcnMudHMjTDEwNlxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGBRdWVyeWAgaW5zdGFuY2UgdGhhdCBpbmNsdWRlcyBhbGwgZG9jdW1lbnRzIGluIHRoZVxuICogZGF0YWJhc2UgdGhhdCBhcmUgY29udGFpbmVkIGluIGEgY29sbGVjdGlvbiBvciBzdWJjb2xsZWN0aW9uIHdpdGggdGhlXG4gKiBnaXZlbiBgY29sbGVjdGlvbklkYC5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgYEZpcmVzdG9yZWAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29sbGVjdGlvbklkIC0gSWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbnMgdG8gcXVlcnkgb3Zlci4gRXZlcnlcbiAqIGNvbGxlY3Rpb24gb3Igc3ViY29sbGVjdGlvbiB3aXRoIHRoaXMgSUQgYXMgdGhlIGxhc3Qgc2VnbWVudCBvZiBpdHMgcGF0aFxuICogd2lsbCBiZSBpbmNsdWRlZC4gQ2Fubm90IGNvbnRhaW4gYSBzbGFzaC5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGBRdWVyeWAuXG4gKi8gZnVuY3Rpb24gbWgodCwgZSkge1xuICAgIGlmICh0ID0gdWgodCwgaGgpLCBuaChcImNvbGxlY3Rpb25Hcm91cFwiLCBcImNvbGxlY3Rpb24gaWRcIiwgZSksIGUuaW5kZXhPZihcIi9cIikgPj0gMCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBjb2xsZWN0aW9uIElEICcke2V9JyBwYXNzZWQgdG8gZnVuY3Rpb24gY29sbGVjdGlvbkdyb3VwKCkuIENvbGxlY3Rpb24gSURzIG11c3Qgbm90IGNvbnRhaW4gJy8nLmApO1xuICAgIHJldHVybiBuZXcgZGgodCwgXG4gICAgLyogY29udmVydGVyPSAqLyBudWxsLCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVW4odXQuZW1wdHlQYXRoKCksIHQpO1xuICAgIH0oZSkpO1xufVxuXG5mdW5jdGlvbiBnaCh0LCBlLCAuLi5uKSB7XG4gICAgaWYgKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIFxuICAgIC8vIFdlIGFsbG93IG9taXNzaW9uIG9mICdwYXRoU3RyaW5nJyBidXQgZXhwbGljaXRseSBwcm9oaWJpdCBwYXNzaW5nIGluIGJvdGhcbiAgICAvLyAndW5kZWZpbmVkJyBhbmQgJ251bGwnLlxuICAgIDEgPT09IGFyZ3VtZW50cy5sZW5ndGggJiYgKGUgPSB0dC5BKCkpLCBuaChcImRvY1wiLCBcInBhdGhcIiwgZSksIHQgaW5zdGFuY2VvZiBoaCkge1xuICAgICAgICBjb25zdCBzID0gdXQuZnJvbVN0cmluZyhlLCAuLi5uKTtcbiAgICAgICAgcmV0dXJuIGloKHMpLCBuZXcgZmgodCwgXG4gICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgbmV3IGh0KHMpKTtcbiAgICB9XG4gICAge1xuICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgZmggfHwgdCBpbnN0YW5jZW9mIHdoKSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGNvbGxlY3Rpb24oKSB0byBiZSBhIENvbGxlY3Rpb25SZWZlcmVuY2UsIGEgRG9jdW1lbnRSZWZlcmVuY2Ugb3IgRmlyZWJhc2VGaXJlc3RvcmVcIik7XG4gICAgICAgIGNvbnN0IHMgPSB0Ll9wYXRoLmNoaWxkKHV0LmZyb21TdHJpbmcoZSwgLi4ubikpO1xuICAgICAgICByZXR1cm4gaWgocyksIG5ldyBmaCh0LmZpcmVzdG9yZSwgdCBpbnN0YW5jZW9mIHdoID8gdC5jb252ZXJ0ZXIgOiBudWxsLCBuZXcgaHQocykpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHJlZmVyZW5jZXMgYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBsZWZ0IC0gQSByZWZlcmVuY2UgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSByaWdodCAtIEEgcmVmZXJlbmNlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSByZWZlcmVuY2VzIHBvaW50IHRvIHRoZSBzYW1lIGxvY2F0aW9uIGluIHRoZSBzYW1lXG4gKiBGaXJlc3RvcmUgZGF0YWJhc2UuXG4gKi8gZnVuY3Rpb24geWgodCwgZSkge1xuICAgIHJldHVybiB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpLCBlID0gZ2V0TW9kdWxhckluc3RhbmNlKGUpLCAodCBpbnN0YW5jZW9mIGZoIHx8IHQgaW5zdGFuY2VvZiB3aCkgJiYgKGUgaW5zdGFuY2VvZiBmaCB8fCBlIGluc3RhbmNlb2Ygd2gpICYmICh0LmZpcmVzdG9yZSA9PT0gZS5maXJlc3RvcmUgJiYgdC5wYXRoID09PSBlLnBhdGggJiYgdC5jb252ZXJ0ZXIgPT09IGUuY29udmVydGVyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHF1ZXJpZXMgcG9pbnQgdG8gdGhlIHNhbWUgY29sbGVjdGlvbiBhbmQgYXBwbHlcbiAqIHRoZSBzYW1lIGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBsZWZ0IC0gQSBgUXVlcnlgIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gcmlnaHQgLSBBIGBRdWVyeWAgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHJlZmVyZW5jZXMgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIHNhbWVcbiAqIEZpcmVzdG9yZSBkYXRhYmFzZS5cbiAqLyBmdW5jdGlvbiBwaCh0LCBlKSB7XG4gICAgcmV0dXJuIHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCksIGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSksIHQgaW5zdGFuY2VvZiBkaCAmJiBlIGluc3RhbmNlb2YgZGggJiYgKHQuZmlyZXN0b3JlID09PSBlLmZpcmVzdG9yZSAmJiBabih0Ll9xdWVyeSwgZS5fcXVlcnkpICYmIHQuY29udmVydGVyID09PSBlLmNvbnZlcnRlcik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNsYXNzIEloIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gVGhlIGxhc3QgcHJvbWlzZSBpbiB0aGUgcXVldWUuXG4gICAgICAgIHRoaXMuR2MgPSBQcm9taXNlLnJlc29sdmUoKSwgXG4gICAgICAgIC8vIEEgbGlzdCBvZiByZXRyeWFibGUgb3BlcmF0aW9ucy4gUmV0cnlhYmxlIG9wZXJhdGlvbnMgYXJlIHJ1biBpbiBvcmRlciBhbmRcbiAgICAgICAgLy8gcmV0cmllZCB3aXRoIGJhY2tvZmYuXG4gICAgICAgIHRoaXMuUWMgPSBbXSwgXG4gICAgICAgIC8vIElzIHRoaXMgQXN5bmNRdWV1ZSBiZWluZyBzaHV0IGRvd24/IE9uY2UgaXQgaXMgc2V0IHRvIHRydWUsIGl0IHdpbGwgbm90XG4gICAgICAgIC8vIGJlIGNoYW5nZWQgYWdhaW4uXG4gICAgICAgIHRoaXMuamMgPSAhMSwgXG4gICAgICAgIC8vIE9wZXJhdGlvbnMgc2NoZWR1bGVkIHRvIGJlIHF1ZXVlZCBpbiB0aGUgZnV0dXJlLiBPcGVyYXRpb25zIGFyZVxuICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgdGhleSBhcmUgcnVuIG9yIGNhbmNlbGVkLlxuICAgICAgICB0aGlzLnpjID0gW10sIFxuICAgICAgICAvLyB2aXNpYmxlIGZvciB0ZXN0aW5nXG4gICAgICAgIHRoaXMuV2MgPSBudWxsLCBcbiAgICAgICAgLy8gRmxhZyBzZXQgd2hpbGUgdGhlcmUncyBhbiBvdXRzdGFuZGluZyBBc3luY1F1ZXVlIG9wZXJhdGlvbiwgdXNlZCBmb3JcbiAgICAgICAgLy8gYXNzZXJ0aW9uIHNhbml0eS1jaGVja3MuXG4gICAgICAgIHRoaXMuSGMgPSAhMSwgXG4gICAgICAgIC8vIEVuYWJsZWQgZHVyaW5nIHNodXRkb3duIG9uIFNhZmFyaSB0byBwcmV2ZW50IGZ1dHVyZSBhY2Nlc3MgdG8gSW5kZXhlZERCLlxuICAgICAgICB0aGlzLkpjID0gITEsIFxuICAgICAgICAvLyBMaXN0IG9mIFRpbWVySWRzIHRvIGZhc3QtZm9yd2FyZCBkZWxheXMgZm9yLlxuICAgICAgICB0aGlzLlljID0gW10sIFxuICAgICAgICAvLyBCYWNrb2ZmIHRpbWVyIHVzZWQgdG8gc2NoZWR1bGUgcmV0cmllcyBmb3IgcmV0cnlhYmxlIG9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5xbyA9IG5ldyBCdSh0aGlzLCBcImFzeW5jX3F1ZXVlX3JldHJ5XCIgLyogVGltZXJJZC5Bc3luY1F1ZXVlUmV0cnkgKi8pLCBcbiAgICAgICAgLy8gVmlzaWJpbGl0eSBoYW5kbGVyIHRoYXQgdHJpZ2dlcnMgYW4gaW1tZWRpYXRlIHJldHJ5IG9mIGFsbCByZXRyeWFibGVcbiAgICAgICAgLy8gb3BlcmF0aW9ucy4gTWVhbnQgdG8gc3BlZWQgdXAgcmVjb3Zlcnkgd2hlbiB3ZSByZWdhaW4gZmlsZSBzeXN0ZW0gYWNjZXNzXG4gICAgICAgIC8vIGFmdGVyIHBhZ2UgY29tZXMgaW50byBmb3JlZ3JvdW5kLlxuICAgICAgICB0aGlzLlhjID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdCA9IE91KCk7XG4gICAgICAgICAgICB0ICYmIE4oXCJBc3luY1F1ZXVlXCIsIFwiVmlzaWJpbGl0eSBzdGF0ZSBjaGFuZ2VkIHRvIFwiICsgdC52aXNpYmlsaXR5U3RhdGUpLCB0aGlzLnFvLk1vKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHQgPSBPdSgpO1xuICAgICAgICB0ICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyICYmIHQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgdGhpcy5YYyk7XG4gICAgfVxuICAgIGdldCBpc1NodXR0aW5nRG93bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuamM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgb3BlcmF0aW9uIHRvIHRoZSBxdWV1ZSB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlIChpLmUuXG4gICAgICogd2UgaWdub3JlIHRoZSBQcm9taXNlIHJlc3VsdCkuXG4gICAgICovICAgIGVucXVldWVBbmRGb3JnZXQodCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMuZW5xdWV1ZSh0KTtcbiAgICB9XG4gICAgZW5xdWV1ZUFuZEZvcmdldEV2ZW5XaGlsZVJlc3RyaWN0ZWQodCkge1xuICAgICAgICB0aGlzLlpjKCksIFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMudGEodCk7XG4gICAgfVxuICAgIGVudGVyUmVzdHJpY3RlZE1vZGUodCkge1xuICAgICAgICBpZiAoIXRoaXMuamMpIHtcbiAgICAgICAgICAgIHRoaXMuamMgPSAhMCwgdGhpcy5KYyA9IHQgfHwgITE7XG4gICAgICAgICAgICBjb25zdCBlID0gT3UoKTtcbiAgICAgICAgICAgIGUgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB0aGlzLlhjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnF1ZXVlKHQpIHtcbiAgICAgICAgaWYgKHRoaXMuWmMoKSwgdGhpcy5qYykgXG4gICAgICAgIC8vIFJldHVybiBhIFByb21pc2Ugd2hpY2ggbmV2ZXIgcmVzb2x2ZXMuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKCkgPT4ge30pKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgZGVmZXJyZWQgUHJvbWlzZSB0aGF0IHdlIGNhbiByZXR1cm4gdG8gdGhlIGNhbGxlZS4gVGhpc1xuICAgICAgICAvLyBhbGxvd3MgdXMgdG8gcmV0dXJuIGEgXCJoYW5naW5nIFByb21pc2VcIiBvbmx5IHRvIHRoZSBjYWxsZWUgYW5kIHN0aWxsXG4gICAgICAgIC8vIGFkdmFuY2UgdGhlIHF1ZXVlIGV2ZW4gd2hlbiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBydW4uXG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBLO1xuICAgICAgICByZXR1cm4gdGhpcy50YSgoKCkgPT4gdGhpcy5qYyAmJiB0aGlzLkpjID8gUHJvbWlzZS5yZXNvbHZlKCkgOiAodCgpLnRoZW4oZS5yZXNvbHZlLCBlLnJlamVjdCksIFxuICAgICAgICBlLnByb21pc2UpKSkudGhlbigoKCkgPT4gZS5wcm9taXNlKSk7XG4gICAgfVxuICAgIGVucXVldWVSZXRyeWFibGUodCkge1xuICAgICAgICB0aGlzLmVucXVldWVBbmRGb3JnZXQoKCgpID0+ICh0aGlzLlFjLnB1c2godCksIHRoaXMuZWEoKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgbmV4dCBvcGVyYXRpb24gZnJvbSB0aGUgcmV0cnlhYmxlIHF1ZXVlLiBJZiB0aGUgb3BlcmF0aW9uIGZhaWxzLFxuICAgICAqIHJlc2NoZWR1bGVzIHdpdGggYmFja29mZi5cbiAgICAgKi8gICAgYXN5bmMgZWEoKSB7XG4gICAgICAgIGlmICgwICE9PSB0aGlzLlFjLmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLlFjWzBdKCksIHRoaXMuUWMuc2hpZnQoKSwgdGhpcy5xby5yZXNldCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIGlmICghRHQodCkpIHRocm93IHQ7XG4gLy8gRmFpbHVyZSB3aWxsIGJlIGhhbmRsZWQgYnkgQXN5bmNRdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKFwiQXN5bmNRdWV1ZVwiLCBcIk9wZXJhdGlvbiBmYWlsZWQgd2l0aCByZXRyeWFibGUgZXJyb3I6IFwiICsgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLlFjLmxlbmd0aCA+IDAgJiYgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBvcGVyYXRpb25zLCB3ZSByZS1zY2hlZHVsZSBgcmV0cnlOZXh0T3AoKWAuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBydW4gcmV0cnlhYmxlIG9wZXJhdGlvbnMgdGhhdCBmYWlsZWQgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGVpciBpbml0aWFsIGF0dGVtcHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXkgYXJlIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGVucXVldWVkLiBJZiwgZm9yIGV4YW1wbGUsIGBvcDFgLCBgb3AyYCwgYG9wM2AgYXJlIGVucXVldWVkIGFuZCBgb3AxYFxuICAgICAgICAgICAgLy8gbmVlZHMgdG8gIGJlIHJlLXJ1biwgd2Ugd2lsbCBydW4gYG9wMWAsIGBvcDFgLCBgb3AyYCB1c2luZyB0aGVcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZW5xdWV1ZWQgY2FsbHMgdG8gYHJldHJ5TmV4dE9wKClgLiBgb3AzKClgIHdpbGwgdGhlbiBydW4gaW4gdGhlXG4gICAgICAgICAgICAvLyBjYWxsIHNjaGVkdWxlZCBoZXJlLlxuICAgICAgICAgICAgLy8gU2luY2UgYGJhY2tvZmZBbmRSdW4oKWAgY2FuY2VscyBhbiBleGlzdGluZyBiYWNrb2ZmIGFuZCBzY2hlZHVsZXMgYVxuICAgICAgICAgICAgLy8gbmV3IGJhY2tvZmYgb24gZXZlcnkgY2FsbCwgdGhlcmUgaXMgb25seSBldmVyIGEgc2luZ2xlIGFkZGl0aW9uYWxcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBpbiB0aGUgcXVldWUuXG4gICAgICAgICAgICB0aGlzLnFvLk5vKCgoKSA9PiB0aGlzLmVhKCkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0YSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLkdjLnRoZW4oKCgpID0+ICh0aGlzLkhjID0gITAsIHQoKS5jYXRjaCgodCA9PiB7XG4gICAgICAgICAgICB0aGlzLldjID0gdCwgdGhpcy5IYyA9ICExO1xuICAgICAgICAgICAgY29uc3QgZSA9IFxuICAgICAgICAgICAgLyoqXG4gKiBDaHJvbWUgaW5jbHVkZXMgRXJyb3IubWVzc2FnZSBpbiBFcnJvci5zdGFjay4gT3RoZXIgYnJvd3NlcnMgZG8gbm90LlxuICogVGhpcyByZXR1cm5zIGV4cGVjdGVkIG91dHB1dCBvZiBtZXNzYWdlICsgc3RhY2sgd2hlbiBhdmFpbGFibGUuXG4gKiBAcGFyYW0gZXJyb3IgLSBFcnJvciBvciBGaXJlc3RvcmVFcnJvclxuICovXG4gICAgICAgICAgICBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSB0Lm1lc3NhZ2UgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICB0LnN0YWNrICYmIChlID0gdC5zdGFjay5pbmNsdWRlcyh0Lm1lc3NhZ2UpID8gdC5zdGFjayA6IHQubWVzc2FnZSArIFwiXFxuXCIgKyB0LnN0YWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovICh0KTtcbiAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZSBlcnJvciBzbyB0aGF0IHRoaXMudGFpbCBiZWNvbWVzIGEgcmVqZWN0ZWQgUHJvbWlzZSBhbmRcbiAgICAgICAgICAgIC8vIGFsbCBmdXJ0aGVyIGF0dGVtcHRzIHRvIGNoYWluICh2aWEgLnRoZW4pIHdpbGwganVzdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyBhbmQgcmV0dXJuIHRoZSByZWplY3RlZCBQcm9taXNlLlxuICAgICAgICAgICAgdGhyb3cgayhcIklOVEVSTkFMIFVOSEFORExFRCBFUlJPUjogXCIsIGUpLCB0O1xuICAgICAgICB9KSkudGhlbigodCA9PiAodGhpcy5IYyA9ICExLCB0KSkpKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5HYyA9IGUsIGU7XG4gICAgfVxuICAgIGVucXVldWVBZnRlckRlbGF5KHQsIGUsIG4pIHtcbiAgICAgICAgdGhpcy5aYygpLCBcbiAgICAgICAgLy8gRmFzdC1mb3J3YXJkIGRlbGF5cyBmb3IgdGltZXJJZHMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGVuLlxuICAgICAgICB0aGlzLlljLmluZGV4T2YodCkgPiAtMSAmJiAoZSA9IDApO1xuICAgICAgICBjb25zdCBzID0gVGMuY3JlYXRlQW5kU2NoZWR1bGUodGhpcywgdCwgZSwgbiwgKHQgPT4gdGhpcy5uYSh0KSkpO1xuICAgICAgICByZXR1cm4gdGhpcy56Yy5wdXNoKHMpLCBzO1xuICAgIH1cbiAgICBaYygpIHtcbiAgICAgICAgdGhpcy5XYyAmJiBPKCk7XG4gICAgfVxuICAgIHZlcmlmeU9wZXJhdGlvbkluUHJvZ3Jlc3MoKSB7fVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcXVldWVkIHRhc2tzIGFyZSBmaW5pc2hlZCBleGVjdXRpbmcuIERlbGF5ZWRcbiAgICAgKiBvcGVyYXRpb25zIGFyZSBub3QgcnVuLlxuICAgICAqLyAgICBhc3luYyBzYSgpIHtcbiAgICAgICAgLy8gT3BlcmF0aW9ucyBpbiB0aGUgcXVldWUgcHJpb3IgdG8gZHJhaW5pbmcgbWF5IGhhdmUgZW5xdWV1ZWQgYWRkaXRpb25hbFxuICAgICAgICAvLyBvcGVyYXRpb25zLiBLZWVwIGRyYWluaW5nIHRoZSBxdWV1ZSB1bnRpbCB0aGUgdGFpbCBpcyBubyBsb25nZXIgYWR2YW5jZWQsXG4gICAgICAgIC8vIHdoaWNoIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgbmV3IG9wZXJhdGlvbnMgd2VyZSBlbnF1ZXVlZCBhbmQgdGhhdCBhbGxcbiAgICAgICAgLy8gb3BlcmF0aW9ucyB3ZXJlIGV4ZWN1dGVkLlxuICAgICAgICBsZXQgdDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdCA9IHRoaXMuR2MsIGF3YWl0IHQ7XG4gICAgICAgIH0gd2hpbGUgKHQgIT09IHRoaXMuR2MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IERldGVybWluZSBpZiBhIGRlbGF5ZWQgb3BlcmF0aW9uIHdpdGggYSBwYXJ0aWN1bGFyIFRpbWVySWRcbiAgICAgKiBleGlzdHMuXG4gICAgICovICAgIGlhKHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuemMpIGlmIChlLnRpbWVySWQgPT09IHQpIHJldHVybiAhMDtcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IFJ1bnMgc29tZSBvciBhbGwgZGVsYXllZCBvcGVyYXRpb25zIGVhcmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhc3RUaW1lcklkIC0gRGVsYXllZCBvcGVyYXRpb25zIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBUaW1lcklkXG4gICAgICogd2lsbCBiZSBkcmFpbmVkLiBQYXNzIFRpbWVySWQuQWxsIHRvIHJ1biBhbGwgZGVsYXllZCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKi8gICAgcmEodCkge1xuICAgICAgICAvLyBOb3RlIHRoYXQgZHJhaW5pbmcgbWF5IGdlbmVyYXRlIG1vcmUgZGVsYXllZCBvcHMsIHNvIHdlIGRvIHRoYXQgZmlyc3QuXG4gICAgICAgIHJldHVybiB0aGlzLnNhKCkudGhlbigoKCkgPT4ge1xuICAgICAgICAgICAgLy8gUnVuIG9wcyBpbiB0aGUgc2FtZSBvcmRlciB0aGV5J2QgcnVuIGlmIHRoZXkgcmFuIG5hdHVyYWxseS5cbiAgICAgICAgICAgIHRoaXMuemMuc29ydCgoKHQsIGUpID0+IHQudGFyZ2V0VGltZU1zIC0gZS50YXJnZXRUaW1lTXMpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLnpjKSBpZiAoZS5za2lwRGVsYXkoKSwgXCJhbGxcIiAvKiBUaW1lcklkLkFsbCAqLyAhPT0gdCAmJiBlLnRpbWVySWQgPT09IHQpIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2EoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgVGVzdHM6IFNraXAgYWxsIHN1YnNlcXVlbnQgZGVsYXlzIGZvciBhIHRpbWVyIGlkLlxuICAgICAqLyAgICBvYSh0KSB7XG4gICAgICAgIHRoaXMuWWMucHVzaCh0KTtcbiAgICB9XG4gICAgLyoqIENhbGxlZCBvbmNlIGEgRGVsYXllZE9wZXJhdGlvbiBpcyBydW4gb3IgY2FuY2VsZWQuICovICAgIG5hKHQpIHtcbiAgICAgICAgLy8gTk9URTogaW5kZXhPZiAvIHNsaWNlIGFyZSBPKG4pLCBidXQgZGVsYXllZE9wZXJhdGlvbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc21hbGwuXG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLnpjLmluZGV4T2YodCk7XG4gICAgICAgIHRoaXMuemMuc3BsaWNlKGUsIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gVGgodCkge1xuICAgIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhbiBvYmplY3QgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkXG4gKiBtZXRob2RzLlxuICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgbnVsbCA9PT0gdCkgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBuID0gdDtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIGlmICh0IGluIG4gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBuW3RdKSByZXR1cm4gITA7XG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbiAgICAvKipcbiAqIFJlcHJlc2VudHMgdGhlIHRhc2sgb2YgbG9hZGluZyBhIEZpcmVzdG9yZSBidW5kbGUuIEl0IHByb3ZpZGVzIHByb2dyZXNzIG9mIGJ1bmRsZVxuICogbG9hZGluZywgYXMgd2VsbCBhcyB0YXNrIGNvbXBsZXRpb24gYW5kIGVycm9yIGV2ZW50cy5cbiAqXG4gKiBUaGUgQVBJIGlzIGNvbXBhdGlibGUgd2l0aCBgUHJvbWlzZTxMb2FkQnVuZGxlVGFza1Byb2dyZXNzPmAuXG4gKi8gKHQsIFsgXCJuZXh0XCIsIFwiZXJyb3JcIiwgXCJjb21wbGV0ZVwiIF0pO1xufVxuXG5jbGFzcyBFaCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIgPSB7fSwgdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlciA9IG5ldyBLLCB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7XG4gICAgICAgICAgICB0YXNrU3RhdGU6IFwiUnVubmluZ1wiLFxuICAgICAgICAgICAgdG90YWxCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsRG9jdW1lbnRzOiAwLFxuICAgICAgICAgICAgYnl0ZXNMb2FkZWQ6IDAsXG4gICAgICAgICAgICBkb2N1bWVudHNMb2FkZWQ6IDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGZ1bmN0aW9ucyB0byBsaXN0ZW4gdG8gYnVuZGxlIGxvYWRpbmcgcHJvZ3Jlc3MgZXZlbnRzLlxuICAgICAqIEBwYXJhbSBuZXh0IC0gQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBwcm9ncmVzcyB1cGRhdGUgZnJvbSBidW5kbGUgbG9hZGluZy4gVHlwaWNhbGx5IGBuZXh0YCBjYWxscyBvY2N1clxuICAgICAqICAgZWFjaCB0aW1lIGEgRmlyZXN0b3JlIGRvY3VtZW50IGlzIGxvYWRlZCBmcm9tIHRoZSBidW5kbGUuXG4gICAgICogQHBhcmFtIGVycm9yIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy4gVGhlIHRhc2sgYWJvcnRzIGFmdGVyIHJlcG9ydGluZyB0aGVcbiAgICAgKiAgIGVycm9yLCBhbmQgdGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgdXBkYXRlcyBhZnRlciB0aGlzLlxuICAgICAqIEBwYXJhbSBjb21wbGV0ZSAtIENhbGxlZCB3aGVuIHRoZSBsb2FkaW5nIHRhc2sgaXMgY29tcGxldGUuXG4gICAgICovICAgIG9uUHJvZ3Jlc3ModCwgZSwgbikge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyID0ge1xuICAgICAgICAgICAgbmV4dDogdCxcbiAgICAgICAgICAgIGVycm9yOiBlLFxuICAgICAgICAgICAgY29tcGxldGU6IG5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB0aGUgYFByb21pc2U8TG9hZEJ1bmRsZVRhc2tQcm9ncmVzcz4uY2F0Y2hgIGludGVyZmFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvblJlamVjdGVkIC0gQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBidW5kbGUgbG9hZGluZy5cbiAgICAgKi8gICAgY2F0Y2godCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFza0NvbXBsZXRpb25SZXNvbHZlci5wcm9taXNlLmNhdGNoKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHRoZSBgUHJvbWlzZTxMb2FkQnVuZGxlVGFza1Byb2dyZXNzPi50aGVuYCBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25GdWxmaWxsZWQgLSBDYWxsZWQgb24gdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxvYWRpbmcgdGFzayB3aXRoIGEgZmluYWwgYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIHVwZGF0ZS5cbiAgICAgKiAgIFRoZSB1cGRhdGUgd2lsbCBhbHdheXMgaGF2ZSBpdHMgYHRhc2tTdGF0ZWAgc2V0IHRvIGBcIlN1Y2Nlc3NcImAuXG4gICAgICogQHBhcmFtIG9uUmVqZWN0ZWQgLSBDYWxsZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGJ1bmRsZSBsb2FkaW5nLlxuICAgICAqLyAgICB0aGVuKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucHJvbWlzZS50aGVuKHQsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIHRoYXQgYnVuZGxlIGxvYWRpbmcgaGFzIGNvbXBsZXRlZCwgd2l0aCBhIHByb3ZpZGVkXG4gICAgICogYExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3NgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovICAgIF9jb21wbGV0ZVdpdGgodCkge1xuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyh0KSwgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5jb21wbGV0ZSAmJiB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmNvbXBsZXRlKCksIFxuICAgICAgICB0aGlzLl90YXNrQ29tcGxldGlvblJlc29sdmVyLnJlc29sdmUodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgdGhhdCBidW5kbGUgbG9hZGluZyBoYXMgZmFpbGVkLCB3aXRoIGEgcHJvdmlkZWRcbiAgICAgKiBgRXJyb3JgIGFzIHRoZSByZWFzb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfZmFpbFdpdGgodCkge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MudGFza1N0YXRlID0gXCJFcnJvclwiLCB0aGlzLl9wcm9ncmVzc09ic2VydmVyLm5leHQgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0KHRoaXMuX2xhc3RQcm9ncmVzcyksIFxuICAgICAgICB0aGlzLl9wcm9ncmVzc09ic2VydmVyLmVycm9yICYmIHRoaXMuX3Byb2dyZXNzT2JzZXJ2ZXIuZXJyb3IodCksIHRoaXMuX3Rhc2tDb21wbGV0aW9uUmVzb2x2ZXIucmVqZWN0KHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhIHByb2dyZXNzIHVwZGF0ZSBvZiBsb2FkaW5nIGEgYnVuZGxlLlxuICAgICAqIEBwYXJhbSBwcm9ncmVzcyAtIFRoZSBuZXcgcHJvZ3Jlc3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqLyAgICBfdXBkYXRlUHJvZ3Jlc3ModCkge1xuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB0LCB0aGlzLl9wcm9ncmVzc09ic2VydmVyLm5leHQgJiYgdGhpcy5fcHJvZ3Jlc3NPYnNlcnZlci5uZXh0KHQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgTFJVIGdhcmJhZ2UgY29sbGVjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQuXG4gKiBTZXQgdGhpcyB2YWx1ZSBhcyB0aGUgYGNhY2hlU2l6ZUJ5dGVzYCBvbiB0aGUgc2V0dGluZ3MgcGFzc2VkIHRvIHRoZVxuICoge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKi8gY29uc3QgQWggPSAtMTtcblxuLyoqXG4gKiBUaGUgQ2xvdWQgRmlyZXN0b3JlIHNlcnZpY2UgaW50ZXJmYWNlLlxuICpcbiAqIERvIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuIEluc3RlYWQsIHVzZSB7QGxpbmsgKGdldEZpcmVzdG9yZToxKX0uXG4gKi8gY2xhc3MgdmggZXh0ZW5kcyBoaCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHN1cGVyKHQsIGUsIG4sIHMpLCBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgaXQncyBhIHtAbGluayBGaXJlc3RvcmV9IG9yIEZpcmVzdG9yZSBMaXRlIGluc3RhbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJmaXJlc3RvcmVcIiwgdGhpcy5fcXVldWUgPSBuZXcgSWgsIHRoaXMuX3BlcnNpc3RlbmNlS2V5ID0gKG51bGwgPT0gcyA/IHZvaWQgMCA6IHMubmFtZSkgfHwgXCJbREVGQVVMVF1cIjtcbiAgICB9XG4gICAgX3Rlcm1pbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVzdG9yZUNsaWVudCB8fCBcbiAgICAgICAgLy8gVGhlIGNsaWVudCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGVuc3VyZSB0aGF0IGFsbCBzdWJzZXF1ZW50IEFQSVxuICAgICAgICAvLyB1c2FnZSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICBWaCh0aGlzKSwgdGhpcy5fZmlyZXN0b3JlQ2xpZW50LnRlcm1pbmF0ZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgRmlyZXN0b3JlfSB3aXRoIHRoZSBwcm92aWRlZCBzZXR0aW5ncy5cbiAqIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uLCBpbmNsdWRpbmdcbiAqIHtAbGluayAoZ2V0RmlyZXN0b3JlOjEpfS4gSWYgdGhlIGN1c3RvbSBzZXR0aW5ncyBhcmUgZW1wdHksIHRoaXMgZnVuY3Rpb24gaXNcbiAqIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgKGdldEZpcmVzdG9yZToxKX0uXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gd2l0aCB3aGljaCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogYmUgYXNzb2NpYXRlZC5cbiAqIEBwYXJhbSBzZXR0aW5ncyAtIEEgc2V0dGluZ3Mgb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZGF0YWJhc2VJZCAtIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZS5cbiAqIEByZXR1cm5zIEEgbmV3bHkgaW5pdGlhbGl6ZWQge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKi8gZnVuY3Rpb24gUmgodCwgZSwgbikge1xuICAgIG4gfHwgKG4gPSBcIihkZWZhdWx0KVwiKTtcbiAgICBjb25zdCBzID0gX2dldFByb3ZpZGVyKHQsIFwiZmlyZXN0b3JlXCIpO1xuICAgIGlmIChzLmlzSW5pdGlhbGl6ZWQobikpIHtcbiAgICAgICAgY29uc3QgdCA9IHMuZ2V0SW1tZWRpYXRlKHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IG5cbiAgICAgICAgfSksIGkgPSBzLmdldE9wdGlvbnMobik7XG4gICAgICAgIGlmIChkZWVwRXF1YWwoaSwgZSkpIHJldHVybiB0O1xuICAgICAgICB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiaW5pdGlhbGl6ZUZpcmVzdG9yZSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbnMuIFRvIGF2b2lkIHRoaXMgZXJyb3IsIGNhbGwgaW5pdGlhbGl6ZUZpcmVzdG9yZSgpIHdpdGggdGhlIHNhbWUgb3B0aW9ucyBhcyB3aGVuIGl0IHdhcyBvcmlnaW5hbGx5IGNhbGxlZCwgb3IgY2FsbCBnZXRGaXJlc3RvcmUoKSB0byByZXR1cm4gdGhlIGFscmVhZHkgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuXCIpO1xuICAgIH1cbiAgICBpZiAodm9pZCAwICE9PSBlLmNhY2hlU2l6ZUJ5dGVzICYmIHZvaWQgMCAhPT0gZS5sb2NhbENhY2hlKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiY2FjaGUgYW5kIGNhY2hlU2l6ZUJ5dGVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBjYWNoZVNpemVCeXRlcyB3aWxsYmUgZGVwcmVjYXRlZC4gSW5zdGVhZCwgc3BlY2lmeSB0aGUgY2FjaGUgc2l6ZSBpbiB0aGUgY2FjaGUgb2JqZWN0XCIpO1xuICAgIGlmICh2b2lkIDAgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgLTEgIT09IGUuY2FjaGVTaXplQnl0ZXMgJiYgZS5jYWNoZVNpemVCeXRlcyA8IDEwNDg1NzYpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgXCJjYWNoZVNpemVCeXRlcyBtdXN0IGJlIGF0IGxlYXN0IDEwNDg1NzZcIik7XG4gICAgcmV0dXJuIHMuaW5pdGlhbGl6ZSh7XG4gICAgICAgIG9wdGlvbnM6IGUsXG4gICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogblxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBQaChlLCBuKSB7XG4gICAgY29uc3QgcyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIGUgPyBlIDogZ2V0QXBwKCksIGkgPSBcInN0cmluZ1wiID09IHR5cGVvZiBlID8gZSA6IG4gfHwgXCIoZGVmYXVsdClcIiwgciA9IF9nZXRQcm92aWRlcihzLCBcImZpcmVzdG9yZVwiKS5nZXRJbW1lZGlhdGUoe1xuICAgICAgICBpZGVudGlmaWVyOiBpXG4gICAgfSk7XG4gICAgaWYgKCFyLl9pbml0aWFsaXplZCkge1xuICAgICAgICBjb25zdCB0ID0gZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdG5hbWVBbmRQb3J0KFwiZmlyZXN0b3JlXCIpO1xuICAgICAgICB0ICYmIGxoKHIsIC4uLnQpO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqLyBmdW5jdGlvbiBiaCh0KSB7XG4gICAgcmV0dXJuIHQuX2ZpcmVzdG9yZUNsaWVudCB8fCBWaCh0KSwgdC5fZmlyZXN0b3JlQ2xpZW50LnZlcmlmeU5vdFRlcm1pbmF0ZWQoKSwgdC5fZmlyZXN0b3JlQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBWaCh0KSB7XG4gICAgdmFyIGUsIG4sIHM7XG4gICAgY29uc3QgaSA9IHQuX2ZyZWV6ZVNldHRpbmdzKCksIHIgPSBmdW5jdGlvbih0LCBlLCBuLCBzKSB7XG4gICAgICAgIHJldHVybiBuZXcgJGUodCwgZSwgbiwgcy5ob3N0LCBzLnNzbCwgcy5leHBlcmltZW50YWxGb3JjZUxvbmdQb2xsaW5nLCBzLmV4cGVyaW1lbnRhbEF1dG9EZXRlY3RMb25nUG9sbGluZywgdGgocy5leHBlcmltZW50YWxMb25nUG9sbGluZ09wdGlvbnMpLCBzLnVzZUZldGNoU3RyZWFtcyk7XG4gICAgfSh0Ll9kYXRhYmFzZUlkLCAobnVsbCA9PT0gKGUgPSB0Ll9hcHApIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUub3B0aW9ucy5hcHBJZCkgfHwgXCJcIiwgdC5fcGVyc2lzdGVuY2VLZXksIGkpO1xuICAgIHQuX2ZpcmVzdG9yZUNsaWVudCA9IG5ldyB4YSh0Ll9hdXRoQ3JlZGVudGlhbHMsIHQuX2FwcENoZWNrQ3JlZGVudGlhbHMsIHQuX3F1ZXVlLCByKSwgXG4gICAgKG51bGwgPT09IChuID0gaS5jYWNoZSkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi5fb2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyKSAmJiAobnVsbCA9PT0gKHMgPSBpLmNhY2hlKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLl9vbmxpbmVDb21wb25lbnRQcm92aWRlcikgJiYgKHQuX2ZpcmVzdG9yZUNsaWVudC5fdW5pbml0aWFsaXplZENvbXBvbmVudHNQcm92aWRlciA9IHtcbiAgICAgICAgX29mZmxpbmVLaW5kOiBpLmNhY2hlLmtpbmQsXG4gICAgICAgIF9vZmZsaW5lOiBpLmNhY2hlLl9vZmZsaW5lQ29tcG9uZW50UHJvdmlkZXIsXG4gICAgICAgIF9vbmxpbmU6IGkuY2FjaGUuX29ubGluZUNvbXBvbmVudFByb3ZpZGVyXG4gICAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gZW5hYmxlIHBlcnNpc3RlbnQgc3RvcmFnZSwgaWYgcG9zc2libGUuXG4gKlxuICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvbnMgKG90aGVyIHRoYW5cbiAqIHtAbGluayBpbml0aWFsaXplRmlyZXN0b3JlfSwge0BsaW5rIChnZXRGaXJlc3RvcmU6MSl9IG9yXG4gKiB7QGxpbmsgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZX0uXG4gKlxuICogSWYgdGhpcyBmYWlscywgYGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlKClgIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGl0XG4gKiByZXR1cm5zLiBOb3RlIHRoYXQgZXZlbiBhZnRlciB0aGlzIGZhaWx1cmUsIHRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB3aWxsXG4gKiByZW1haW4gdXNhYmxlLCBob3dldmVyIG9mZmxpbmUgcGVyc2lzdGVuY2Ugd2lsbCBiZSBkaXNhYmxlZC5cbiAqXG4gKiBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSB0aGlzIGNhbiBmYWlsLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieVxuICogdGhlIGBjb2RlYCBvbiB0aGUgZXJyb3IuXG4gKlxuICogICAqIGZhaWxlZC1wcmVjb25kaXRpb246IFRoZSBhcHAgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgYnJvd3NlciB0YWIuXG4gKiAgICogdW5pbXBsZW1lbnRlZDogVGhlIGJyb3dzZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG9mZmxpbmVcbiAqICAgICBwZXJzaXN0ZW5jZSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBQZXJzaXN0ZW5jZSBjYW5ub3QgYmUgdXNlZCBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byBlbmFibGUgcGVyc2lzdGVuY2UgZm9yLlxuICogQHBhcmFtIHBlcnNpc3RlbmNlU2V0dGluZ3MgLSBPcHRpb25hbCBzZXR0aW5ncyBvYmplY3QgdG8gY29uZmlndXJlXG4gKiBwZXJzaXN0ZW5jZS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudCBzdG9yYWdlLlxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gSW5zdGVhZCwgc2V0XG4gKiBgRmlyZXN0b3JlU2V0dGluZ3MuY2FjaGVgIHRvIGFuIGluc3RhbmNlIG9mIGBJbmRleGVkRGJMb2NhbENhY2hlYCB0b1xuICogdHVybiBvbiBJbmRleGVkRGIgY2FjaGUuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aGVuIGBGaXJlc3RvcmVTZXR0aW5ncy5jYWNoZWBcbiAqIGlzIGFscmVhZHkgc3BlY2lmaWVkIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICovIGZ1bmN0aW9uIFNoKHQsIGUpIHtcbiAgICBCaCh0ID0gdWgodCwgdmgpKTtcbiAgICBjb25zdCBuID0gYmgodCk7XG4gICAgaWYgKG4uX3VuaW5pdGlhbGl6ZWRDb21wb25lbnRzUHJvdmlkZXIpIHRocm93IG5ldyBVKHEuRkFJTEVEX1BSRUNPTkRJVElPTiwgXCJTREsgY2FjaGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQuXCIpO1xuICAgIE0oXCJlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSgpIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLCB5b3UgY2FuIHVzZSBgRmlyZXN0b3JlU2V0dGluZ3MuY2FjaGVgIGluc3RlYWQuXCIpO1xuICAgIGNvbnN0IHMgPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBpID0gbmV3IFBhO1xuICAgIHJldHVybiBDaChuLCBpLCBuZXcgdmEoaSwgcy5jYWNoZVNpemVCeXRlcywgbnVsbCA9PSBlID8gdm9pZCAwIDogZS5mb3JjZU93bmVyc2hpcCkpO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGVuYWJsZSBtdWx0aS10YWIgcGVyc2lzdGVudCBzdG9yYWdlLCBpZiBwb3NzaWJsZS4gSWYgZW5hYmxlZFxuICogYWNyb3NzIGFsbCB0YWJzLCBhbGwgb3BlcmF0aW9ucyBzaGFyZSBhY2Nlc3MgdG8gbG9jYWwgcGVyc2lzdGVuY2UsIGluY2x1ZGluZ1xuICogc2hhcmVkIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGFuZCBsYXRlbmN5LWNvbXBlbnNhdGVkIGxvY2FsIGRvY3VtZW50IHVwZGF0ZXNcbiAqIGFjcm9zcyBhbGwgY29ubmVjdGVkIGluc3RhbmNlcy5cbiAqXG4gKiBJZiB0aGlzIGZhaWxzLCBgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZVxuICogaXQgcmV0dXJucy4gTm90ZSB0aGF0IGV2ZW4gYWZ0ZXIgdGhpcyBmYWlsdXJlLCB0aGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2Ugd2lsbFxuICogcmVtYWluIHVzYWJsZSwgaG93ZXZlciBvZmZsaW5lIHBlcnNpc3RlbmNlIHdpbGwgYmUgZGlzYWJsZWQuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgdGhpcyBjYW4gZmFpbCwgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnlcbiAqIHRoZSBgY29kZWAgb24gdGhlIGVycm9yLlxuICpcbiAqICAgKiBmYWlsZWQtcHJlY29uZGl0aW9uOiBUaGUgYXBwIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGJyb3dzZXIgdGFiIGFuZFxuICogICAgIG11bHRpLXRhYiBpcyBub3QgZW5hYmxlZC5cbiAqICAgKiB1bmltcGxlbWVudGVkOiBUaGUgYnJvd3NlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb2ZmbGluZVxuICogICAgIHBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gZW5hYmxlIHBlcnNpc3RlbmNlIGZvci5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVwcmVzZW50cyBzdWNjZXNzZnVsbHkgZW5hYmxpbmcgcGVyc2lzdGVudFxuICogc3RvcmFnZS5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIEluc3RlYWQsIHNldFxuICogYEZpcmVzdG9yZVNldHRpbmdzLmNhY2hlYCB0byBhbiBpbnN0YW5jZSBvZiBgSW5kZXhlZERiTG9jYWxDYWNoZWAgdG9cbiAqIHR1cm4gb24gaW5kZXhlZGRiIGNhY2hlLiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2hlbiBgRmlyZXN0b3JlU2V0dGluZ3MuY2FjaGVgXG4gKiBpcyBhbHJlYWR5IHNwZWNpZmllZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAqLyBmdW5jdGlvbiBEaCh0KSB7XG4gICAgQmgodCA9IHVoKHQsIHZoKSk7XG4gICAgY29uc3QgZSA9IGJoKHQpO1xuICAgIGlmIChlLl91bmluaXRpYWxpemVkQ29tcG9uZW50c1Byb3ZpZGVyKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiU0RLIGNhY2hlIGlzIGFscmVhZHkgc3BlY2lmaWVkLlwiKTtcbiAgICBNKFwiZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLCB5b3UgY2FuIHVzZSBgRmlyZXN0b3JlU2V0dGluZ3MuY2FjaGVgIGluc3RlYWQuXCIpO1xuICAgIGNvbnN0IG4gPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBzID0gbmV3IFBhO1xuICAgIHJldHVybiBDaChlLCBzLCBuZXcgUmEocywgbi5jYWNoZVNpemVCeXRlcykpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBib3RoIHRoZSBgT2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyYCBhbmQgYE9ubGluZUNvbXBvbmVudFByb3ZpZGVyYC5cbiAqIElmIHRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhIHJlY292ZXJhYmxlIGVycm9yIChzZWVcbiAqIGBjYW5SZWNvdmVyRnJvbUluZGV4ZWREYkVycm9yKClgIGJlbG93KSwgdGhlIHJldHVybmVkIFByb21pc2UgaXMgcmVqZWN0ZWRcbiAqIGJ1dCB0aGUgY2xpZW50IHJlbWFpbnMgdXNhYmxlLlxuICovIGZ1bmN0aW9uIENoKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gbmV3IEs7XG4gICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlKChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBOYSh0LCBuKSwgYXdhaXQga2EodCwgZSksIHMucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdDtcbiAgICAgICAgICAgIGlmICghTWEoZSkpIHRocm93IGU7XG4gICAgICAgICAgICBNKFwiRXJyb3IgZW5hYmxpbmcgaW5kZXhlZGRiIGNhY2hlLiBGYWxsaW5nIGJhY2sgdG8gbWVtb3J5IGNhY2hlOiBcIiArIGUpLCBzLnJlamVjdChlKTtcbiAgICAgICAgfVxuICAgIH0pKS50aGVuKCgoKSA9PiBzLnByb21pc2UpKTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIHBlcnNpc3RlbnQgc3RvcmFnZS4gVGhpcyBpbmNsdWRlcyBwZW5kaW5nIHdyaXRlcyBhbmQgY2FjaGVkXG4gKiBkb2N1bWVudHMuXG4gKlxuICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgdGhlIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIGlzIG5vdCBzdGFydGVkIChhZnRlciB0aGUgYXBwIGlzXG4gKiB0ZXJtaW5hdGVkIG9yIHdoZW4gdGhlIGFwcCBpcyBmaXJzdCBpbml0aWFsaXplZCkuIE9uIHN0YXJ0dXAsIHRoaXMgZnVuY3Rpb25cbiAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBmdW5jdGlvbnMgKG90aGVyIHRoYW4ge0BsaW5rXG4gKiBpbml0aWFsaXplRmlyZXN0b3JlfSBvciB7QGxpbmsgKGdldEZpcmVzdG9yZToxKX0pKS4gSWYgdGhlIHtAbGluayBGaXJlc3RvcmV9XG4gKiBpbnN0YW5jZSBpcyBzdGlsbCBydW5uaW5nLCB0aGUgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIGVycm9yIGNvZGVcbiAqIG9mIGBmYWlsZWQtcHJlY29uZGl0aW9uYC5cbiAqXG4gKiBOb3RlOiBgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSgpYCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gaGVscCB3cml0ZVxuICogcmVsaWFibGUgdGVzdHMgdGhhdCB1c2UgQ2xvdWQgRmlyZXN0b3JlLiBJdCB1c2VzIGFuIGVmZmljaWVudCBtZWNoYW5pc20gZm9yXG4gKiBkcm9wcGluZyBleGlzdGluZyBkYXRhIGJ1dCBkb2VzIG5vdCBhdHRlbXB0IHRvIHNlY3VyZWx5IG92ZXJ3cml0ZSBvclxuICogb3RoZXJ3aXNlIG1ha2UgY2FjaGVkIGRhdGEgdW5yZWNvdmVyYWJsZS4gRm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBzZW5zaXRpdmVcbiAqIHRvIHRoZSBkaXNjbG9zdXJlIG9mIGNhY2hlZCBkYXRhIGluIGJldHdlZW4gdXNlciBzZXNzaW9ucywgd2Ugc3Ryb25nbHlcbiAqIHJlY29tbWVuZCBub3QgZW5hYmxpbmcgcGVyc2lzdGVuY2UgYXQgYWxsLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gY2xlYXIgcGVyc2lzdGVuY2UgZm9yLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgaXNcbiAqIGNsZWFyZWQuIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvci5cbiAqLyBmdW5jdGlvbiB4aCh0KSB7XG4gICAgaWYgKHQuX2luaXRpYWxpemVkICYmICF0Ll90ZXJtaW5hdGVkKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiUGVyc2lzdGVuY2UgY2FuIG9ubHkgYmUgY2xlYXJlZCBiZWZvcmUgYSBGaXJlc3RvcmUgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQgb3IgYWZ0ZXIgaXQgaXMgdGVybWluYXRlZC5cIik7XG4gICAgY29uc3QgZSA9IG5ldyBLO1xuICAgIHJldHVybiB0Ll9xdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0RXZlbldoaWxlUmVzdHJpY3RlZCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgYXN5bmMgZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICghYnQuRCgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHQgKyBcIm1haW5cIjtcbiAgICAgICAgICAgICAgICBhd2FpdCBidC5kZWxldGUoZSk7XG4gICAgICAgICAgICB9KFpvKHQuX2RhdGFiYXNlSWQsIHQuX3BlcnNpc3RlbmNlS2V5KSksIGUucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBlLnJlamVjdCh0KTtcbiAgICAgICAgfVxuICAgIH0pKSwgZS5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgZm9yIHRoZSBhY3RpdmUgdXNlciBoYXZlIGJlZW5cbiAqIGFja25vd2xlZGdlZCBieSB0aGUgYmFja2VuZC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgd3JpdGVzLlxuICogT3RoZXJ3aXNlLCB0aGUgcHJvbWlzZSB3YWl0cyBmb3IgYWxsIHByZXZpb3VzbHkgaXNzdWVkIHdyaXRlcyAoaW5jbHVkaW5nXG4gKiB0aG9zZSB3cml0dGVuIGluIGEgcHJldmlvdXMgYXBwIHNlc3Npb24pLCBidXQgaXQgZG9lcyBub3Qgd2FpdCBmb3Igd3JpdGVzXG4gKiB0aGF0IHdlcmUgYWRkZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSWYgeW91IHdhbnQgdG8gd2FpdCBmb3JcbiAqIGFkZGl0aW9uYWwgd3JpdGVzLCBjYWxsIGB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpYCBhZ2Fpbi5cbiAqXG4gKiBBbnkgb3V0c3RhbmRpbmcgYHdhaXRGb3JQZW5kaW5nV3JpdGVzKClgIHByb21pc2VzIGFyZSByZWplY3RlZCBkdXJpbmcgdXNlclxuICogY2hhbmdlcy5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB3aGljaCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50bHkgcGVuZGluZyB3cml0ZXMgaGF2ZSBiZWVuXG4gKiBhY2tub3dsZWRnZWQgYnkgdGhlIGJhY2tlbmQuXG4gKi8gZnVuY3Rpb24gTmgodCkge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgSztcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBaYyhhd2FpdCBxYSh0KSwgZSkpKSwgZS5wcm9taXNlO1xuICAgIH0oYmgodCA9IHVoKHQsIHZoKSkpO1xufVxuXG4vKipcbiAqIFJlLWVuYWJsZXMgdXNlIG9mIHRoZSBuZXR3b3JrIGZvciB0aGlzIHtAbGluayBGaXJlc3RvcmV9IGluc3RhbmNlIGFmdGVyIGEgcHJpb3JcbiAqIGNhbGwgdG8ge0BsaW5rIGRpc2FibGVOZXR3b3JrfS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZW5hYmxlZC5cbiAqLyBmdW5jdGlvbiBraCh0KSB7XG4gICAgcmV0dXJuIEdhKGJoKHQgPSB1aCh0LCB2aCkpKTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlcyBuZXR3b3JrIHVzYWdlIGZvciB0aGlzIGluc3RhbmNlLiBJdCBjYW4gYmUgcmUtZW5hYmxlZCB2aWEge0BsaW5rXG4gKiBlbmFibGVOZXR3b3JrfS4gV2hpbGUgdGhlIG5ldHdvcmsgaXMgZGlzYWJsZWQsIGFueSBzbmFwc2hvdCBsaXN0ZW5lcnMsXG4gKiBgZ2V0RG9jKClgIG9yIGBnZXREb2NzKClgIGNhbGxzIHdpbGwgcmV0dXJuIHJlc3VsdHMgZnJvbSBjYWNoZSwgYW5kIGFueSB3cml0ZVxuICogb3BlcmF0aW9ucyB3aWxsIGJlIHF1ZXVlZCB1bnRpbCB0aGUgbmV0d29yayBpcyByZXN0b3JlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIG9uY2UgdGhlIG5ldHdvcmsgaGFzIGJlZW4gZGlzYWJsZWQuXG4gKi8gZnVuY3Rpb24gTWgodCkge1xuICAgIHJldHVybiBRYShiaCh0ID0gdWgodCwgdmgpKSk7XG59XG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgcHJvdmlkZWQge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UuXG4gKlxuICogQWZ0ZXIgY2FsbGluZyBgdGVybWluYXRlKClgIG9ubHkgdGhlIGBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlKClgIGZ1bmN0aW9uXG4gKiBtYXkgYmUgdXNlZC4gQW55IG90aGVyIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYSBgRmlyZXN0b3JlRXJyb3JgLlxuICpcbiAqIFRvIHJlc3RhcnQgYWZ0ZXIgdGVybWluYXRpb24sIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBGaXJlYmFzZUZpcmVzdG9yZSB3aXRoXG4gKiB7QGxpbmsgKGdldEZpcmVzdG9yZToxKX0uXG4gKlxuICogVGVybWluYXRpb24gZG9lcyBub3QgY2FuY2VsIGFueSBwZW5kaW5nIHdyaXRlcywgYW5kIGFueSBwcm9taXNlcyB0aGF0IGFyZVxuICogYXdhaXRpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgd2lsbCBub3QgYmUgcmVzb2x2ZWQuIElmIHlvdSBoYXZlXG4gKiBwZXJzaXN0ZW5jZSBlbmFibGVkLCB0aGUgbmV4dCB0aW1lIHlvdSBzdGFydCB0aGlzIGluc3RhbmNlLCBpdCB3aWxsIHJlc3VtZVxuICogc2VuZGluZyB0aGVzZSB3cml0ZXMgdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBOb3RlOiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgY2FsbGluZyBgdGVybWluYXRlKClgIGlzIG5vdCByZXF1aXJlZC4gVGhpc1xuICogZnVuY3Rpb24gaXMgdXNlZnVsIG9ubHkgd2hlbiB5b3Ugd2FudCB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIHJlbGVhc2UgYWxsXG4gKiBvZiBpdHMgcmVzb3VyY2VzIG9yIGluIGNvbWJpbmF0aW9uIHdpdGggYGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoKWAgdG9cbiAqIGVuc3VyZSB0aGF0IGFsbCBsb2NhbCBzdGF0ZSBpcyBkZXN0cm95ZWQgYmV0d2VlbiB0ZXN0IHJ1bnMuXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHlcbiAqIHRlcm1pbmF0ZWQuXG4gKi8gZnVuY3Rpb24gJGgodCkge1xuICAgIHJldHVybiBfcmVtb3ZlU2VydmljZUluc3RhbmNlKHQuYXBwLCBcImZpcmVzdG9yZVwiLCB0Ll9kYXRhYmFzZUlkLmRhdGFiYXNlKSwgdC5fZGVsZXRlKCk7XG59XG5cbi8qKlxuICogTG9hZHMgYSBGaXJlc3RvcmUgYnVuZGxlIGludG8gdGhlIGxvY2FsIGNhY2hlLlxuICpcbiAqIEBwYXJhbSBmaXJlc3RvcmUgLSBUaGUge0BsaW5rIEZpcmVzdG9yZX0gaW5zdGFuY2UgdG8gbG9hZCBidW5kbGVzIGZvci5cbiAqIEBwYXJhbSBidW5kbGVEYXRhIC0gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYnVuZGxlIHRvIGJlIGxvYWRlZC4gVmFsaWRcbiAqIG9iamVjdHMgYXJlIGBBcnJheUJ1ZmZlcmAsIGBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PmAgb3IgYHN0cmluZ2AuXG4gKlxuICogQHJldHVybnMgQSBgTG9hZEJ1bmRsZVRhc2tgIG9iamVjdCwgd2hpY2ggbm90aWZpZXMgY2FsbGVycyB3aXRoIHByb2dyZXNzXG4gKiB1cGRhdGVzLCBhbmQgY29tcGxldGlvbiBvciBlcnJvciBldmVudHMuIEl0IGNhbiBiZSB1c2VkIGFzIGFcbiAqIGBQcm9taXNlPExvYWRCdW5kbGVUYXNrUHJvZ3Jlc3M+YC5cbiAqLyBmdW5jdGlvbiBPaCh0LCBlKSB7XG4gICAgY29uc3QgbiA9IGJoKHQgPSB1aCh0LCB2aCkpLCBzID0gbmV3IEVoO1xuICAgIHJldHVybiBZYShuLCB0Ll9kYXRhYmFzZUlkLCBlLCBzKSwgcztcbn1cblxuLyoqXG4gKiBSZWFkcyBhIEZpcmVzdG9yZSB7QGxpbmsgUXVlcnl9IGZyb20gbG9jYWwgY2FjaGUsIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuXG4gKiBuYW1lLlxuICpcbiAqIFRoZSBuYW1lZCBxdWVyaWVzIGFyZSBwYWNrYWdlZCAgaW50byBidW5kbGVzIG9uIHRoZSBzZXJ2ZXIgc2lkZSAoYWxvbmdcbiAqIHdpdGggcmVzdWx0aW5nIGRvY3VtZW50cyksIGFuZCBsb2FkZWQgdG8gbG9jYWwgY2FjaGUgdXNpbmcgYGxvYWRCdW5kbGVgLiBPbmNlXG4gKiBpbiBsb2NhbCBjYWNoZSwgdXNlIHRoaXMgbWV0aG9kIHRvIGV4dHJhY3QgYSB7QGxpbmsgUXVlcnl9IGJ5IG5hbWUuXG4gKlxuICogQHBhcmFtIGZpcmVzdG9yZSAtIFRoZSB7QGxpbmsgRmlyZXN0b3JlfSBpbnN0YW5jZSB0byByZWFkIHRoZSBxdWVyeSBmcm9tLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIFF1ZXJ5IG9yIGBudWxsYC5cbiAqLyBmdW5jdGlvbiBGaCh0LCBlKSB7XG4gICAgcmV0dXJuIFhhKGJoKHQgPSB1aCh0LCB2aCkpLCBlKS50aGVuKChlID0+IGUgPyBuZXcgZGgodCwgbnVsbCwgZS5xdWVyeSkgOiBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIEJoKHQpIHtcbiAgICBpZiAodC5faW5pdGlhbGl6ZWQgfHwgdC5fdGVybWluYXRlZCkgdGhyb3cgbmV3IFUocS5GQUlMRURfUFJFQ09ORElUSU9OLCBcIkZpcmVzdG9yZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgYW5kIHBlcnNpc3RlbmNlIGNhbiBubyBsb25nZXIgYmUgZW5hYmxlZC4gWW91IGNhbiBvbmx5IGVuYWJsZSBwZXJzaXN0ZW5jZSBiZWZvcmUgY2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kcyBvbiBhIEZpcmVzdG9yZSBvYmplY3QuXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhZ2dyZWdhdGlvbiB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgYnkgRmlyZXN0b3JlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5jbGFzcyBMaCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IEFnZ3JlZ2F0ZUZpZWxkPFQ+XG4gICAgICogQHBhcmFtIF9hZ2dyZWdhdGVUeXBlIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBhZ2dyZWdhdGlvbiBvcGVyYXRpb24gdG8gcGVyZm9ybS5cbiAgICAgKiBAcGFyYW0gX2ludGVybmFsRmllbGRQYXRoIE9wdGlvbmFsbHkgc3BlY2lmaWVzIHRoZSBmaWVsZCB0aGF0IGlzIGFnZ3JlZ2F0ZWQuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVE9ETyAoc3VtL2F2ZykgbWFrZSBhZ2dyZWdhdGVUeXBlIHB1YmxpYyB3aGVuIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZFxuICAgIHQgPSBcImNvdW50XCIsIGUpIHtcbiAgICAgICAgdGhpcy5fYWdncmVnYXRlVHlwZSA9IHQsIHRoaXMuX2ludGVybmFsRmllbGRQYXRoID0gZSwgXG4gICAgICAgIC8qKiBBIHR5cGUgc3RyaW5nIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBcIkFnZ3JlZ2F0ZUZpZWxkXCI7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSByZXN1bHRzIG9mIGV4ZWN1dGluZyBhbiBhZ2dyZWdhdGlvbiBxdWVyeS5cbiAqLyBjbGFzcyBxaCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuX3VzZXJEYXRhV3JpdGVyID0gZSwgdGhpcy5fZGF0YSA9IG4sIFxuICAgICAgICAvKiogQSB0eXBlIHN0cmluZyB0byB1bmlxdWVseSBpZGVudGlmeSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJBZ2dyZWdhdGVRdWVyeVNuYXBzaG90XCIsIHRoaXMucXVlcnkgPSB0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHRzIG9mIHRoZSBhZ2dyZWdhdGlvbnMgcGVyZm9ybWVkIG92ZXIgdGhlIHVuZGVybHlpbmdcbiAgICAgKiBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSBrZXlzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGVcbiAgICAgKiBgQWdncmVnYXRlU3BlY2Agb2JqZWN0IHNwZWNpZmllZCB0byB0aGUgYWdncmVnYXRpb24gbWV0aG9kLCBhbmQgdGhlIHZhbHVlc1xuICAgICAqIHdpbGwgYmUgdGhlIGNvcnJlc3BvbmRpbmcgYWdncmVnYXRpb24gcmVzdWx0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdHMgb2YgdGhlIGFnZ3JlZ2F0aW9ucyBwZXJmb3JtZWQgb3ZlciB0aGUgdW5kZXJseWluZ1xuICAgICAqIHF1ZXJ5LlxuICAgICAqLyAgICBkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlckRhdGFXcml0ZXIuY29udmVydE9iamVjdE1hcCh0aGlzLl9kYXRhKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEFuIGltbXV0YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIGJ5dGVzLlxuICovIGNsYXNzIFVoIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5fYnl0ZVN0cmluZyA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYEJ5dGVzYCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZywgY29udmVydGluZyBpdCB0b1xuICAgICAqIGJ5dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgc3RhdGljIGZyb21CYXNlNjRTdHJpbmcodCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaChWZS5mcm9tQmFzZTY0U3RyaW5nKHQpKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkZhaWxlZCB0byBjb25zdHJ1Y3QgZGF0YSBmcm9tIEJhc2U2NCBzdHJpbmc6IFwiICsgdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgQnl0ZXNgIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBVaW50OEFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFycmF5IC0gVGhlIFVpbnQ4QXJyYXkgdXNlZCB0byBjcmVhdGUgdGhlIGBCeXRlc2Agb2JqZWN0LlxuICAgICAqLyAgICBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkodCkge1xuICAgICAgICByZXR1cm4gbmV3IFVoKFZlLmZyb21VaW50OEFycmF5KHQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBieXRlcyBhcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9CYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ieXRlU3RyaW5nLnRvQmFzZTY0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgaW4gYSBuZXcgYFVpbnQ4QXJyYXlgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIFVpbnQ4QXJyYXkgY3JlYXRlZCBmcm9tIHRoZSBgQnl0ZXNgIG9iamVjdC5cbiAgICAgKi8gICAgdG9VaW50OEFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnl0ZVN0cmluZy50b1VpbnQ4QXJyYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYEJ5dGVzYCBvYmplY3QuXG4gICAgICovICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gXCJCeXRlcyhiYXNlNjQ6IFwiICsgdGhpcy50b0Jhc2U2NCgpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBCeXRlc2Agb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYEJ5dGVzYCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgQnl0ZXNgIG9iamVjdCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J5dGVTdHJpbmcuaXNFcXVhbCh0Ll9ieXRlU3RyaW5nKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgYEZpZWxkUGF0aGAgcmVmZXJzIHRvIGEgZmllbGQgaW4gYSBkb2N1bWVudC4gVGhlIHBhdGggbWF5IGNvbnNpc3Qgb2YgYVxuICogc2luZ2xlIGZpZWxkIG5hbWUgKHJlZmVycmluZyB0byBhIHRvcC1sZXZlbCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQpLCBvciBhXG4gKiBsaXN0IG9mIGZpZWxkIG5hbWVzIChyZWZlcnJpbmcgdG8gYSBuZXN0ZWQgZmllbGQgaW4gdGhlIGRvY3VtZW50KS5cbiAqXG4gKiBDcmVhdGUgYSBgRmllbGRQYXRoYCBieSBwcm92aWRpbmcgZmllbGQgbmFtZXMuIElmIG1vcmUgdGhhbiBvbmUgZmllbGRcbiAqIG5hbWUgaXMgcHJvdmlkZWQsIHRoZSBwYXRoIHdpbGwgcG9pbnQgdG8gYSBuZXN0ZWQgZmllbGQgaW4gYSBkb2N1bWVudC5cbiAqLyBjbGFzcyBLaCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBGaWVsZFBhdGhgIGZyb20gdGhlIHByb3ZpZGVkIGZpZWxkIG5hbWVzLiBJZiBtb3JlIHRoYW4gb25lIGZpZWxkXG4gICAgICogbmFtZSBpcyBwcm92aWRlZCwgdGhlIHBhdGggd2lsbCBwb2ludCB0byBhIG5lc3RlZCBmaWVsZCBpbiBhIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkTmFtZXMgLSBBIGxpc3Qgb2YgZmllbGQgbmFtZXMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoLi4udCkge1xuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IHQubGVuZ3RoOyArK2UpIGlmICgwID09PSB0W2VdLmxlbmd0aCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkludmFsaWQgZmllbGQgbmFtZSBhdCBhcmd1bWVudCAkKGkgKyAxKS4gRmllbGQgbmFtZXMgbXVzdCBub3QgYmUgZW1wdHkuXCIpO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbFBhdGggPSBuZXcgYXQodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBGaWVsZFBhdGhgIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgYEZpZWxkUGF0aGAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgRmllbGRQYXRoYCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsUGF0aC5pc0VxdWFsKHQuX2ludGVybmFsUGF0aCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzcGVjaWFsIHNlbnRpbmVsIGBGaWVsZFBhdGhgIHRvIHJlZmVyIHRvIHRoZSBJRCBvZiBhIGRvY3VtZW50LlxuICogSXQgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyB0byBzb3J0IG9yIGZpbHRlciBieSB0aGUgZG9jdW1lbnQgSUQuXG4gKi8gZnVuY3Rpb24gR2goKSB7XG4gICAgcmV0dXJuIG5ldyBLaChcIl9fbmFtZV9fXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBTZW50aW5lbCB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHdyaXRpbmcgZG9jdW1lbnQgZmllbGRzIHdpdGggYHNldCgpYFxuICogb3IgYHVwZGF0ZSgpYC5cbiAqLyBjbGFzcyBRaCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIF9tZXRob2ROYW1lIC0gVGhlIHB1YmxpYyBBUEkgZW5kcG9pbnQgdGhhdCByZXR1cm5zIHRoaXMgY2xhc3MuXG4gICAgICogQGhpZGVjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgdGhpcy5fbWV0aG9kTmFtZSA9IHQ7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBbiBpbW11dGFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGdlb2dyYXBoaWMgbG9jYXRpb24gaW4gRmlyZXN0b3JlLiBUaGVcbiAqIGxvY2F0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGxhdGl0dWRlL2xvbmdpdHVkZSBwYWlyLlxuICpcbiAqIExhdGl0dWRlIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIG9mIFstOTAsIDkwXS5cbiAqIExvbmdpdHVkZSB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSBvZiBbLTE4MCwgMTgwXS5cbiAqLyBjbGFzcyBqaCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbW11dGFibGUgYEdlb1BvaW50YCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQgbGF0aXR1ZGUgYW5kXG4gICAgICogbG9uZ2l0dWRlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gbGF0aXR1ZGUgLSBUaGUgbGF0aXR1ZGUgYXMgbnVtYmVyIGJldHdlZW4gLTkwIGFuZCA5MC5cbiAgICAgKiBAcGFyYW0gbG9uZ2l0dWRlIC0gVGhlIGxvbmdpdHVkZSBhcyBudW1iZXIgYmV0d2VlbiAtMTgwIGFuZCAxODAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBpZiAoIWlzRmluaXRlKHQpIHx8IHQgPCAtOTAgfHwgdCA+IDkwKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiTGF0aXR1ZGUgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIC05MCBhbmQgOTAsIGJ1dCB3YXM6IFwiICsgdCk7XG4gICAgICAgIGlmICghaXNGaW5pdGUoZSkgfHwgZSA8IC0xODAgfHwgZSA+IDE4MCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkxvbmdpdHVkZSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gLTE4MCBhbmQgMTgwLCBidXQgd2FzOiBcIiArIGUpO1xuICAgICAgICB0aGlzLl9sYXQgPSB0LCB0aGlzLl9sb25nID0gZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGl0dWRlIG9mIHRoaXMgYEdlb1BvaW50YCBpbnN0YW5jZS5cbiAgICAgKi8gICAgZ2V0IGxhdGl0dWRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbG9uZ2l0dWRlIG9mIHRoaXMgYEdlb1BvaW50YCBpbnN0YW5jZS5cbiAgICAgKi8gICAgZ2V0IGxvbmdpdHVkZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGBHZW9Qb2ludGAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgR2VvUG9pbnRgIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYEdlb1BvaW50YCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgb25lLlxuICAgICAqLyAgICBpc0VxdWFsKHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdCA9PT0gdC5fbGF0ICYmIHRoaXMuX2xvbmcgPT09IHQuX2xvbmc7XG4gICAgfVxuICAgIC8qKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBHZW9Qb2ludC4gKi8gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0aXR1ZGU6IHRoaXMuX2xhdCxcbiAgICAgICAgICAgIGxvbmdpdHVkZTogdGhpcy5fbG9uZ1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3R1YWxseSBwcml2YXRlIHRvIEpTIGNvbnN1bWVycyBvZiBvdXIgQVBJLCBzbyB0aGlzIGZ1bmN0aW9uIGlzIHByZWZpeGVkXG4gICAgICogd2l0aCBhbiB1bmRlcnNjb3JlLlxuICAgICAqLyAgICBfY29tcGFyZVRvKHQpIHtcbiAgICAgICAgcmV0dXJuIGV0KHRoaXMuX2xhdCwgdC5fbGF0KSB8fCBldCh0aGlzLl9sb25nLCB0Ll9sb25nKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGNvbnN0IHpoID0gL15fXy4qX18kLztcblxuLyoqIFRoZSByZXN1bHQgb2YgcGFyc2luZyBkb2N1bWVudCBkYXRhIChlLmcuIGZvciBhIHNldERhdGEgY2FsbCkuICovIGNsYXNzIFdoIHtcbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHQsIHRoaXMuZmllbGRNYXNrID0gZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMgPSBuO1xuICAgIH1cbiAgICB0b011dGF0aW9uKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuZmllbGRNYXNrID8gbmV3IHpzKHQsIHRoaXMuZGF0YSwgdGhpcy5maWVsZE1hc2ssIGUsIHRoaXMuZmllbGRUcmFuc2Zvcm1zKSA6IG5ldyBqcyh0LCB0aGlzLmRhdGEsIGUsIHRoaXMuZmllbGRUcmFuc2Zvcm1zKTtcbiAgICB9XG59XG5cbi8qKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgXCJ1cGRhdGVcIiBkYXRhIChpLmUuIGZvciBhbiB1cGRhdGVEYXRhIGNhbGwpLiAqLyBjbGFzcyBIaCB7XG4gICAgY29uc3RydWN0b3IodCwgXG4gICAgLy8gVGhlIGZpZWxkTWFzayBkb2VzIG5vdCBpbmNsdWRlIGRvY3VtZW50IHRyYW5zZm9ybXMuXG4gICAgZSwgbikge1xuICAgICAgICB0aGlzLmRhdGEgPSB0LCB0aGlzLmZpZWxkTWFzayA9IGUsIHRoaXMuZmllbGRUcmFuc2Zvcm1zID0gbjtcbiAgICB9XG4gICAgdG9NdXRhdGlvbih0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgenModCwgdGhpcy5kYXRhLCB0aGlzLmZpZWxkTWFzaywgZSwgdGhpcy5maWVsZFRyYW5zZm9ybXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gSmgodCkge1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgY2FzZSAwIC8qIFVzZXJEYXRhU291cmNlLlNldCAqLyA6XG4gLy8gZmFsbCB0aHJvdWdoXG4gICAgICAgICAgICAgIGNhc2UgMiAvKiBVc2VyRGF0YVNvdXJjZS5NZXJnZVNldCAqLyA6XG4gLy8gZmFsbCB0aHJvdWdoXG4gICAgICAgICAgICAgIGNhc2UgMSAvKiBVc2VyRGF0YVNvdXJjZS5VcGRhdGUgKi8gOlxuICAgICAgICByZXR1cm4gITA7XG5cbiAgICAgIGNhc2UgMyAvKiBVc2VyRGF0YVNvdXJjZS5Bcmd1bWVudCAqLyA6XG4gICAgICBjYXNlIDQgLyogVXNlckRhdGFTb3VyY2UuQXJyYXlBcmd1bWVudCAqLyA6XG4gICAgICAgIHJldHVybiAhMTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgTygpO1xuICAgIH1cbn1cblxuLyoqIEEgXCJjb250ZXh0XCIgb2JqZWN0IHBhc3NlZCBhcm91bmQgd2hpbGUgcGFyc2luZyB1c2VyIGRhdGEuICovIGNsYXNzIFloIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhIFBhcnNlQ29udGV4dCB3aXRoIHRoZSBnaXZlbiBzb3VyY2UgYW5kIHBhdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MgZm9yIHRoZSBwYXJzZXIuXG4gICAgICogQHBhcmFtIGRhdGFiYXNlSWQgLSBUaGUgZGF0YWJhc2UgSUQgb2YgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gc2VyaWFsaXplciAtIFRoZSBzZXJpYWxpemVyIHRvIHVzZSB0byBnZW5lcmF0ZSB0aGUgVmFsdWUgcHJvdG8uXG4gICAgICogQHBhcmFtIGlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMgLSBXaGV0aGVyIHRvIGlnbm9yZSB1bmRlZmluZWQgcHJvcGVydGllc1xuICAgICAqIHJhdGhlciB0aGFuIHRocm93LlxuICAgICAqIEBwYXJhbSBmaWVsZFRyYW5zZm9ybXMgLSBBIG11dGFibGUgbGlzdCBvZiBmaWVsZCB0cmFuc2Zvcm1zIGVuY291bnRlcmVkXG4gICAgICogd2hpbGUgcGFyc2luZyB0aGUgZGF0YS5cbiAgICAgKiBAcGFyYW0gZmllbGRNYXNrIC0gQSBtdXRhYmxlIGxpc3Qgb2YgZmllbGQgcGF0aHMgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZ1xuICAgICAqIHRoZSBkYXRhLlxuICAgICAqXG4gICAgICogVE9ETyhiLzM0ODcxMTMxKTogV2UgZG9uJ3Qgc3VwcG9ydCBhcnJheSBwYXRocyByaWdodCBub3csIHNvIHBhdGggY2FuIGJlXG4gICAgICogbnVsbCB0byBpbmRpY2F0ZSB0aGUgY29udGV4dCByZXByZXNlbnRzIGFueSBsb2NhdGlvbiB3aXRoaW4gYW4gYXJyYXkgKGluXG4gICAgICogd2hpY2ggY2FzZSBjZXJ0YWluIGZlYXR1cmVzIHdpbGwgbm90IHdvcmsgYW5kIGVycm9ycyB3aWxsIGJlIHNvbWV3aGF0XG4gICAgICogY29tcHJvbWlzZWQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHQsIHRoaXMuZGF0YWJhc2VJZCA9IGUsIHRoaXMuc2VyaWFsaXplciA9IG4sIHRoaXMuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyA9IHMsIFxuICAgICAgICAvLyBNaW5vciBoYWNrOiBJZiBmaWVsZFRyYW5zZm9ybXMgaXMgdW5kZWZpbmVkLCB3ZSBhc3N1bWUgdGhpcyBpcyBhblxuICAgICAgICAvLyBleHRlcm5hbCBjYWxsIGFuZCB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoZSBlbnRpcmUgcGF0aC5cbiAgICAgICAgdm9pZCAwID09PSBpICYmIHRoaXMudWEoKSwgdGhpcy5maWVsZFRyYW5zZm9ybXMgPSBpIHx8IFtdLCB0aGlzLmZpZWxkTWFzayA9IHIgfHwgW107XG4gICAgfVxuICAgIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5wYXRoO1xuICAgIH1cbiAgICBnZXQgY2EoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmNhO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyBhIG5ldyBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBzZXR0aW5ncyBvdmVyd3JpdHRlbi4gKi8gICAgYWEodCkge1xuICAgICAgICByZXR1cm4gbmV3IFloKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zZXR0aW5ncyksIHQpLCB0aGlzLmRhdGFiYXNlSWQsIHRoaXMuc2VyaWFsaXplciwgdGhpcy5pZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzLCB0aGlzLmZpZWxkVHJhbnNmb3JtcywgdGhpcy5maWVsZE1hc2spO1xuICAgIH1cbiAgICBoYSh0KSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBjb25zdCBuID0gbnVsbCA9PT0gKGUgPSB0aGlzLnBhdGgpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuY2hpbGQodCksIHMgPSB0aGlzLmFhKHtcbiAgICAgICAgICAgIHBhdGg6IG4sXG4gICAgICAgICAgICBsYTogITFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzLmZhKHQpLCBzO1xuICAgIH1cbiAgICBkYSh0KSB7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBjb25zdCBuID0gbnVsbCA9PT0gKGUgPSB0aGlzLnBhdGgpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuY2hpbGQodCksIHMgPSB0aGlzLmFhKHtcbiAgICAgICAgICAgIHBhdGg6IG4sXG4gICAgICAgICAgICBsYTogITFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzLnVhKCksIHM7XG4gICAgfVxuICAgIHdhKHQpIHtcbiAgICAgICAgLy8gVE9ETyhiLzM0ODcxMTMxKTogV2UgZG9uJ3Qgc3VwcG9ydCBhcnJheSBwYXRocyByaWdodCBub3c7IHNvIG1ha2UgcGF0aFxuICAgICAgICAvLyB1bmRlZmluZWQuXG4gICAgICAgIHJldHVybiB0aGlzLmFhKHtcbiAgICAgICAgICAgIHBhdGg6IHZvaWQgMCxcbiAgICAgICAgICAgIGxhOiAhMFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2EodCkge1xuICAgICAgICByZXR1cm4gZ2wodCwgdGhpcy5zZXR0aW5ncy5tZXRob2ROYW1lLCB0aGlzLnNldHRpbmdzLm1hIHx8ICExLCB0aGlzLnBhdGgsIHRoaXMuc2V0dGluZ3MuZ2EpO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyAndHJ1ZScgaWYgJ2ZpZWxkUGF0aCcgd2FzIHRyYXZlcnNlZCB3aGVuIGNyZWF0aW5nIHRoaXMgY29udGV4dC4gKi8gICAgY29udGFpbnModCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0aGlzLmZpZWxkTWFzay5maW5kKChlID0+IHQuaXNQcmVmaXhPZihlKSkpIHx8IHZvaWQgMCAhPT0gdGhpcy5maWVsZFRyYW5zZm9ybXMuZmluZCgoZSA9PiB0LmlzUHJlZml4T2YoZS5maWVsZCkpKTtcbiAgICB9XG4gICAgdWEoKSB7XG4gICAgICAgIC8vIFRPRE8oYi8zNDg3MTEzMSk6IFJlbW92ZSBudWxsIGNoZWNrIG9uY2Ugd2UgaGF2ZSBwcm9wZXIgcGF0aHMgZm9yIGZpZWxkc1xuICAgICAgICAvLyB3aXRoaW4gYXJyYXlzLlxuICAgICAgICBpZiAodGhpcy5wYXRoKSBmb3IgKGxldCB0ID0gMDsgdCA8IHRoaXMucGF0aC5sZW5ndGg7IHQrKykgdGhpcy5mYSh0aGlzLnBhdGguZ2V0KHQpKTtcbiAgICB9XG4gICAgZmEodCkge1xuICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpIHRocm93IHRoaXMuX2EoXCJEb2N1bWVudCBmaWVsZHMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgICAgIGlmIChKaCh0aGlzLmNhKSAmJiB6aC50ZXN0KHQpKSB0aHJvdyB0aGlzLl9hKCdEb2N1bWVudCBmaWVsZHMgY2Fubm90IGJlZ2luIGFuZCBlbmQgd2l0aCBcIl9fXCInKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBwYXJzaW5nIHJhdyB1c2VyIGlucHV0IChwcm92aWRlZCB2aWEgdGhlIEFQSSkgaW50byBpbnRlcm5hbCBtb2RlbFxuICogY2xhc3Nlcy5cbiAqLyBjbGFzcyBYaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSwgbikge1xuICAgICAgICB0aGlzLmRhdGFiYXNlSWQgPSB0LCB0aGlzLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMgPSBlLCB0aGlzLnNlcmlhbGl6ZXIgPSBuIHx8IEZ1KHQpO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlcyBhIG5ldyB0b3AtbGV2ZWwgcGFyc2UgY29udGV4dC4gKi8gICAgeWEodCwgZSwgbiwgcyA9ICExKSB7XG4gICAgICAgIHJldHVybiBuZXcgWWgoe1xuICAgICAgICAgICAgY2E6IHQsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBlLFxuICAgICAgICAgICAgZ2E6IG4sXG4gICAgICAgICAgICBwYXRoOiBhdC5lbXB0eVBhdGgoKSxcbiAgICAgICAgICAgIGxhOiAhMSxcbiAgICAgICAgICAgIG1hOiBzXG4gICAgICAgIH0sIHRoaXMuZGF0YWJhc2VJZCwgdGhpcy5zZXJpYWxpemVyLCB0aGlzLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gWmgodCkge1xuICAgIGNvbnN0IGUgPSB0Ll9mcmVlemVTZXR0aW5ncygpLCBuID0gRnUodC5fZGF0YWJhc2VJZCk7XG4gICAgcmV0dXJuIG5ldyBYaCh0Ll9kYXRhYmFzZUlkLCAhIWUuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcywgbik7XG59XG5cbi8qKiBQYXJzZSBkb2N1bWVudCBkYXRhIGZyb20gYSBzZXQoKSBjYWxsLiAqLyBmdW5jdGlvbiB0bCh0LCBlLCBuLCBzLCBpLCByID0ge30pIHtcbiAgICBjb25zdCBvID0gdC55YShyLm1lcmdlIHx8IHIubWVyZ2VGaWVsZHMgPyAyIC8qIFVzZXJEYXRhU291cmNlLk1lcmdlU2V0ICovIDogMCAvKiBVc2VyRGF0YVNvdXJjZS5TZXQgKi8gLCBlLCBuLCBpKTtcbiAgICBkbChcIkRhdGEgbXVzdCBiZSBhbiBvYmplY3QsIGJ1dCBpdCB3YXM6XCIsIG8sIHMpO1xuICAgIGNvbnN0IHUgPSBsbChzLCBvKTtcbiAgICBsZXQgYywgYTtcbiAgICBpZiAoci5tZXJnZSkgYyA9IG5ldyBSZShvLmZpZWxkTWFzayksIGEgPSBvLmZpZWxkVHJhbnNmb3JtczsgZWxzZSBpZiAoci5tZXJnZUZpZWxkcykge1xuICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiByLm1lcmdlRmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gd2woZSwgcywgbik7XG4gICAgICAgICAgICBpZiAoIW8uY29udGFpbnMoaSkpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYEZpZWxkICcke2l9JyBpcyBzcGVjaWZpZWQgaW4geW91ciBmaWVsZCBtYXNrIGJ1dCBtaXNzaW5nIGZyb20geW91ciBpbnB1dCBkYXRhLmApO1xuICAgICAgICAgICAgeWwodCwgaSkgfHwgdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGMgPSBuZXcgUmUodCksIGEgPSBvLmZpZWxkVHJhbnNmb3Jtcy5maWx0ZXIoKHQgPT4gYy5jb3ZlcnModC5maWVsZCkpKTtcbiAgICB9IGVsc2UgYyA9IG51bGwsIGEgPSBvLmZpZWxkVHJhbnNmb3JtcztcbiAgICByZXR1cm4gbmV3IFdoKG5ldyB1bih1KSwgYywgYSk7XG59XG5cbmNsYXNzIGVsIGV4dGVuZHMgUWgge1xuICAgIF90b0ZpZWxkVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgaWYgKDIgLyogVXNlckRhdGFTb3VyY2UuTWVyZ2VTZXQgKi8gIT09IHQuY2EpIHRocm93IDEgLyogVXNlckRhdGFTb3VyY2UuVXBkYXRlICovID09PSB0LmNhID8gdC5fYShgJHt0aGlzLl9tZXRob2ROYW1lfSgpIGNhbiBvbmx5IGFwcGVhciBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgdXBkYXRlIGRhdGFgKSA6IHQuX2EoYCR7dGhpcy5fbWV0aG9kTmFtZX0oKSBjYW5ub3QgYmUgdXNlZCB3aXRoIHNldCgpIHVubGVzcyB5b3UgcGFzcyB7bWVyZ2U6dHJ1ZX1gKTtcbiAgICAgICAgLy8gTm8gdHJhbnNmb3JtIHRvIGFkZCBmb3IgYSBkZWxldGUsIGJ1dCB3ZSBuZWVkIHRvIGFkZCBpdCB0byBvdXJcbiAgICAgICAgLy8gZmllbGRNYXNrIHNvIGl0IGdldHMgZGVsZXRlZC5cbiAgICAgICAgcmV0dXJuIHQuZmllbGRNYXNrLnB1c2godC5wYXRoKSwgbnVsbDtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgZWw7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjaGlsZCBjb250ZXh0IGZvciBwYXJzaW5nIFNlcmlhbGl6YWJsZUZpZWxkVmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gY2FsbGluZyBgUGFyc2VDb250ZXh0LmNvbnRleHRXaXRoYCBiZWNhdXNlIGl0IGtlZXBzXG4gKiB0aGUgZmllbGRUcmFuc2Zvcm1zIGFuZCBmaWVsZE1hc2sgc2VwYXJhdGUuXG4gKlxuICogVGhlIGNyZWF0ZWQgY29udGV4dCBoYXMgaXRzIGBkYXRhU291cmNlYCBzZXQgdG8gYFVzZXJEYXRhU291cmNlLkFyZ3VtZW50YC5cbiAqIEFsdGhvdWdoIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCB3aXRoIHdyaXRlcywgYW55IGVsZW1lbnRzIGluIHRoZXNlIEZpZWxkVmFsdWVzXG4gKiBhcmUgbm90IGNvbnNpZGVyZWQgd3JpdGVzIHNpbmNlIHRoZXkgY2Fubm90IGNvbnRhaW4gYW55IEZpZWxkVmFsdWUgc2VudGluZWxzLFxuICogZXRjLlxuICpcbiAqIEBwYXJhbSBmaWVsZFZhbHVlIC0gVGhlIHNlbnRpbmVsIEZpZWxkVmFsdWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIGNoaWxkXG4gKiAgICAgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHBhcmVudCBjb250ZXh0LlxuICogQHBhcmFtIGFycmF5RWxlbWVudCAtIFdoZXRoZXIgb3Igbm90IHRoZSBGaWVsZFZhbHVlIGhhcyBhbiBhcnJheS5cbiAqLyBmdW5jdGlvbiBubCh0LCBlLCBuKSB7XG4gICAgcmV0dXJuIG5ldyBZaCh7XG4gICAgICAgIGNhOiAzIC8qIFVzZXJEYXRhU291cmNlLkFyZ3VtZW50ICovICxcbiAgICAgICAgZ2E6IGUuc2V0dGluZ3MuZ2EsXG4gICAgICAgIG1ldGhvZE5hbWU6IHQuX21ldGhvZE5hbWUsXG4gICAgICAgIGxhOiBuXG4gICAgfSwgZS5kYXRhYmFzZUlkLCBlLnNlcmlhbGl6ZXIsIGUuaWdub3JlVW5kZWZpbmVkUHJvcGVydGllcyk7XG59XG5cbmNsYXNzIHNsIGV4dGVuZHMgUWgge1xuICAgIF90b0ZpZWxkVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNcyh0LnBhdGgsIG5ldyBicyk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIHNsO1xuICAgIH1cbn1cblxuY2xhc3MgaWwgZXh0ZW5kcyBRaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0KSwgdGhpcy5wYSA9IGU7XG4gICAgfVxuICAgIF90b0ZpZWxkVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5sKHRoaXMsIHQsIFxuICAgICAgICAvKmFycmF5PSovICEwKSwgbiA9IHRoaXMucGEubWFwKCh0ID0+IGhsKHQsIGUpKSksIHMgPSBuZXcgVnMobik7XG4gICAgICAgIHJldHVybiBuZXcgTXModC5wYXRoLCBzKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogSW1wbGVtZW50IGlzRXF1YWxzXG4gICAgICAgIHJldHVybiB0aGlzID09PSB0O1xuICAgIH1cbn1cblxuY2xhc3MgcmwgZXh0ZW5kcyBRaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0KSwgdGhpcy5wYSA9IGU7XG4gICAgfVxuICAgIF90b0ZpZWxkVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5sKHRoaXMsIHQsIFxuICAgICAgICAvKmFycmF5PSovICEwKSwgbiA9IHRoaXMucGEubWFwKCh0ID0+IGhsKHQsIGUpKSksIHMgPSBuZXcgRHMobik7XG4gICAgICAgIHJldHVybiBuZXcgTXModC5wYXRoLCBzKTtcbiAgICB9XG4gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIC8vIFRPRE8obXJzY2htaWR0KTogSW1wbGVtZW50IGlzRXF1YWxzXG4gICAgICAgIHJldHVybiB0aGlzID09PSB0O1xuICAgIH1cbn1cblxuY2xhc3Mgb2wgZXh0ZW5kcyBRaCB7XG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcih0KSwgdGhpcy5JYSA9IGU7XG4gICAgfVxuICAgIF90b0ZpZWxkVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyB4cyh0LnNlcmlhbGl6ZXIsIEVzKHQuc2VyaWFsaXplciwgdGhpcy5JYSkpO1xuICAgICAgICByZXR1cm4gbmV3IE1zKHQucGF0aCwgZSk7XG4gICAgfVxuICAgIGlzRXF1YWwodCkge1xuICAgICAgICAvLyBUT0RPKG1yc2NobWlkdCk6IEltcGxlbWVudCBpc0VxdWFsc1xuICAgICAgICByZXR1cm4gdGhpcyA9PT0gdDtcbiAgICB9XG59XG5cbi8qKiBQYXJzZSB1cGRhdGUgZGF0YSBmcm9tIGFuIHVwZGF0ZSgpIGNhbGwuICovIGZ1bmN0aW9uIHVsKHQsIGUsIG4sIHMpIHtcbiAgICBjb25zdCBpID0gdC55YSgxIC8qIFVzZXJEYXRhU291cmNlLlVwZGF0ZSAqLyAsIGUsIG4pO1xuICAgIGRsKFwiRGF0YSBtdXN0IGJlIGFuIG9iamVjdCwgYnV0IGl0IHdhczpcIiwgaSwgcyk7XG4gICAgY29uc3QgciA9IFtdLCBvID0gdW4uZW1wdHkoKTtcbiAgICBnZShzLCAoKHQsIHMpID0+IHtcbiAgICAgICAgY29uc3QgdSA9IG1sKGUsIHQsIG4pO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgcyA9IGdldE1vZHVsYXJJbnN0YW5jZShzKTtcbiAgICAgICAgY29uc3QgYyA9IGkuZGEodSk7XG4gICAgICAgIGlmIChzIGluc3RhbmNlb2YgZWwpIFxuICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGZpZWxkIG1hc2ssIGJ1dCBkb24ndCBhZGQgYW55dGhpbmcgdG8gdXBkYXRlRGF0YS5cbiAgICAgICAgci5wdXNoKHUpOyBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBobChzLCBjKTtcbiAgICAgICAgICAgIG51bGwgIT0gdCAmJiAoci5wdXNoKHUpLCBvLnNldCh1LCB0KSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgdSA9IG5ldyBSZShyKTtcbiAgICByZXR1cm4gbmV3IEhoKG8sIHUsIGkuZmllbGRUcmFuc2Zvcm1zKTtcbn1cblxuLyoqIFBhcnNlIHVwZGF0ZSBkYXRhIGZyb20gYSBsaXN0IG9mIGZpZWxkL3ZhbHVlIGFyZ3VtZW50cy4gKi8gZnVuY3Rpb24gY2wodCwgZSwgbiwgcywgaSwgcikge1xuICAgIGNvbnN0IG8gPSB0LnlhKDEgLyogVXNlckRhdGFTb3VyY2UuVXBkYXRlICovICwgZSwgbiksIHUgPSBbIHdsKGUsIHMsIG4pIF0sIGMgPSBbIGkgXTtcbiAgICBpZiAoci5sZW5ndGggJSAyICE9IDApIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYEZ1bmN0aW9uICR7ZX0oKSBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCBhbHRlcm5hdGUgYmV0d2VlbiBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzLmApO1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgci5sZW5ndGg7IHQgKz0gMikgdS5wdXNoKHdsKGUsIHJbdF0pKSwgYy5wdXNoKHJbdCArIDFdKTtcbiAgICBjb25zdCBhID0gW10sIGggPSB1bi5lbXB0eSgpO1xuICAgIC8vIFdlIGl0ZXJhdGUgaW4gcmV2ZXJzZSBvcmRlciB0byBwaWNrIHRoZSBsYXN0IHZhbHVlIGZvciBhIGZpZWxkIGlmIHRoZVxuICAgIC8vIHVzZXIgc3BlY2lmaWVkIHRoZSBmaWVsZCBtdWx0aXBsZSB0aW1lcy5cbiAgICBmb3IgKGxldCB0ID0gdS5sZW5ndGggLSAxOyB0ID49IDA7IC0tdCkgaWYgKCF5bChhLCB1W3RdKSkge1xuICAgICAgICBjb25zdCBlID0gdVt0XTtcbiAgICAgICAgbGV0IG4gPSBjW3RdO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgbiA9IGdldE1vZHVsYXJJbnN0YW5jZShuKTtcbiAgICAgICAgY29uc3QgcyA9IG8uZGEoZSk7XG4gICAgICAgIGlmIChuIGluc3RhbmNlb2YgZWwpIFxuICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGZpZWxkIG1hc2ssIGJ1dCBkb24ndCBhZGQgYW55dGhpbmcgdG8gdXBkYXRlRGF0YS5cbiAgICAgICAgYS5wdXNoKGUpOyBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBobChuLCBzKTtcbiAgICAgICAgICAgIG51bGwgIT0gdCAmJiAoYS5wdXNoKGUpLCBoLnNldChlLCB0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbCA9IG5ldyBSZShhKTtcbiAgICByZXR1cm4gbmV3IEhoKGgsIGwsIG8uZmllbGRUcmFuc2Zvcm1zKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIFwicXVlcnkgdmFsdWVcIiAoZS5nLiB2YWx1ZSBpbiBhIHdoZXJlIGZpbHRlciBvciBhIHZhbHVlIGluIGEgY3Vyc29yXG4gKiBib3VuZCkuXG4gKlxuICogQHBhcmFtIGFsbG93QXJyYXlzIC0gV2hldGhlciB0aGUgcXVlcnkgdmFsdWUgaXMgYW4gYXJyYXkgdGhhdCBtYXkgZGlyZWN0bHlcbiAqIGNvbnRhaW4gYWRkaXRpb25hbCBhcnJheXMgKGUuZy4gdGhlIG9wZXJhbmQgb2YgYW4gYGluYCBxdWVyeSkuXG4gKi8gZnVuY3Rpb24gYWwodCwgZSwgbiwgcyA9ICExKSB7XG4gICAgcmV0dXJuIGhsKG4sIHQueWEocyA/IDQgLyogVXNlckRhdGFTb3VyY2UuQXJyYXlBcmd1bWVudCAqLyA6IDMgLyogVXNlckRhdGFTb3VyY2UuQXJndW1lbnQgKi8gLCBlKSk7XG59XG5cbi8qKlxuICogUGFyc2VzIHVzZXIgZGF0YSB0byBQcm90b2J1ZiBWYWx1ZXMuXG4gKlxuICogQHBhcmFtIGlucHV0IC0gRGF0YSB0byBiZSBwYXJzZWQuXG4gKiBAcGFyYW0gY29udGV4dCAtIEEgY29udGV4dCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHBhdGggYmVpbmcgcGFyc2VkLFxuICogdGhlIHNvdXJjZSBvZiB0aGUgZGF0YSBiZWluZyBwYXJzZWQsIGV0Yy5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgdmFsdWUsIG9yIG51bGwgaWYgdGhlIHZhbHVlIHdhcyBhIEZpZWxkVmFsdWUgc2VudGluZWxcbiAqIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHBhcnNlZCBkYXRhLlxuICovIGZ1bmN0aW9uIGhsKHQsIGUpIHtcbiAgICBpZiAoZmwoXG4gICAgLy8gVW53cmFwIHRoZSBBUEkgdHlwZSBmcm9tIHRoZSBDb21wYXQgU0RLLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBBUEkgdHlwZVxuICAgIC8vIGZyb20gZmlyZXN0b3JlLWV4cC5cbiAgICB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpKSkgcmV0dXJuIGRsKFwiVW5zdXBwb3J0ZWQgZmllbGQgdmFsdWU6XCIsIGUsIHQpLCBsbCh0LCBlKTtcbiAgICBpZiAodCBpbnN0YW5jZW9mIFFoKSBcbiAgICAvLyBGaWVsZFZhbHVlcyB1c3VhbGx5IHBhcnNlIGludG8gdHJhbnNmb3JtcyAoZXhjZXB0IGRlbGV0ZUZpZWxkKCkpXG4gICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoaXMgZmllbGQgaW4gb3VyIHBhcnNlZCBkYXRhXG4gICAgLy8gKGFzIGRvaW5nIHNvIHdpbGwgb3ZlcndyaXRlIHRoZSBmaWVsZCBkaXJlY3RseSBwcmlvciB0byB0aGUgdHJhbnNmb3JtXG4gICAgLy8gdHJ5aW5nIHRvIHRyYW5zZm9ybSBpdCkuIFNvIHdlIGRvbid0IGFkZCB0aGlzIGxvY2F0aW9uIHRvXG4gICAgLy8gY29udGV4dC5maWVsZE1hc2sgYW5kIHdlIHJldHVybiBudWxsIGFzIG91ciBwYXJzaW5nIHJlc3VsdC5cbiAgICAvKipcbiAqIFwiUGFyc2VzXCIgdGhlIHByb3ZpZGVkIEZpZWxkVmFsdWVJbXBsLCBhZGRpbmcgYW55IG5lY2Vzc2FyeSB0cmFuc2Zvcm1zIHRvXG4gKiBjb250ZXh0LmZpZWxkVHJhbnNmb3Jtcy5cbiAqL1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIC8vIFNlbnRpbmVscyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCB3cml0ZXMsIGFuZCBub3Qgd2l0aGluIGFycmF5cy5cbiAgICAgICAgaWYgKCFKaChlLmNhKSkgdGhyb3cgZS5fYShgJHt0Ll9tZXRob2ROYW1lfSgpIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB1cGRhdGUoKSBhbmQgc2V0KClgKTtcbiAgICAgICAgaWYgKCFlLnBhdGgpIHRocm93IGUuX2EoYCR7dC5fbWV0aG9kTmFtZX0oKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbnNpZGUgYXJyYXlzYCk7XG4gICAgICAgIGNvbnN0IG4gPSB0Ll90b0ZpZWxkVHJhbnNmb3JtKGUpO1xuICAgICAgICBuICYmIGUuZmllbGRUcmFuc2Zvcm1zLnB1c2gobik7XG4gICAgfVxuICAgIC8qKlxuICogSGVscGVyIHRvIHBhcnNlIGEgc2NhbGFyIHZhbHVlIChpLmUuIG5vdCBhbiBPYmplY3QsIEFycmF5LCBvciBGaWVsZFZhbHVlKVxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgdmFsdWVcbiAqLyAodCwgZSksIG51bGw7XG4gICAgaWYgKHZvaWQgMCA9PT0gdCAmJiBlLmlnbm9yZVVuZGVmaW5lZFByb3BlcnRpZXMpIFxuICAgIC8vIElmIHRoZSBpbnB1dCBpcyB1bmRlZmluZWQgaXQgY2FuIG5ldmVyIHBhcnRpY2lwYXRlIGluIHRoZSBmaWVsZE1hc2ssIHNvXG4gICAgLy8gZG9uJ3QgaGFuZGxlIHRoaXMgYmVsb3cuIElmIGBpZ25vcmVVbmRlZmluZWRQcm9wZXJ0aWVzYCBpcyBmYWxzZSxcbiAgICAvLyBgcGFyc2VTY2FsYXJWYWx1ZWAgd2lsbCByZWplY3QgYW4gdW5kZWZpbmVkIHZhbHVlLlxuICAgIHJldHVybiBudWxsO1xuICAgIGlmIChcbiAgICAvLyBJZiBjb250ZXh0LnBhdGggaXMgbnVsbCB3ZSBhcmUgaW5zaWRlIGFuIGFycmF5IGFuZCB3ZSBkb24ndCBzdXBwb3J0XG4gICAgLy8gZmllbGQgbWFzayBwYXRocyBtb3JlIGdyYW51bGFyIHRoYW4gdGhlIHRvcC1sZXZlbCBhcnJheS5cbiAgICBlLnBhdGggJiYgZS5maWVsZE1hc2sucHVzaChlLnBhdGgpLCB0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgLy8gVE9ETyhiLzM0ODcxMTMxKTogSW5jbHVkZSB0aGUgcGF0aCBjb250YWluaW5nIHRoZSBhcnJheSBpbiB0aGUgZXJyb3JcbiAgICAgICAgLy8gbWVzc2FnZS5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgSU4gcXVlcmllcywgdGhlIHBhcnNlZCBkYXRhIGlzIGFuIGFycmF5IChyZXByZXNlbnRpbmdcbiAgICAgICAgLy8gdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmUgaW5jbHVkZWQgZm9yIHRoZSBJTiBxdWVyeSkgdGhhdCBtYXkgZGlyZWN0bHlcbiAgICAgICAgLy8gY29udGFpbiBhZGRpdGlvbmFsIGFycmF5cyAoZWFjaCByZXByZXNlbnRpbmcgYW4gaW5kaXZpZHVhbCBmaWVsZFxuICAgICAgICAvLyB2YWx1ZSksIHNvIHdlIGRpc2FibGUgdGhpcyB2YWxpZGF0aW9uLlxuICAgICAgICBpZiAoZS5zZXR0aW5ncy5sYSAmJiA0IC8qIFVzZXJEYXRhU291cmNlLkFycmF5QXJndW1lbnQgKi8gIT09IGUuY2EpIHRocm93IGUuX2EoXCJOZXN0ZWQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IFtdO1xuICAgICAgICAgICAgbGV0IHMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGhsKGksIGUud2EocykpO1xuICAgICAgICAgICAgICAgIG51bGwgPT0gdCAmJiAoXG4gICAgICAgICAgICAgICAgLy8gSnVzdCBpbmNsdWRlIG51bGxzIGluIHRoZSBhcnJheSBmb3IgZmllbGRzIGJlaW5nIHJlcGxhY2VkIHdpdGggYVxuICAgICAgICAgICAgICAgIC8vIHNlbnRpbmVsLlxuICAgICAgICAgICAgICAgIHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbiAgICAgICAgICAgICAgICB9KSwgbi5wdXNoKHQpLCBzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFycmF5VmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSh0LCBlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgaWYgKG51bGwgPT09ICh0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpKSkgcmV0dXJuIHtcbiAgICAgICAgICAgIG51bGxWYWx1ZTogXCJOVUxMX1ZBTFVFXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIHQpIHJldHVybiBFcyhlLnNlcmlhbGl6ZXIsIHQpO1xuICAgICAgICBpZiAoXCJib29sZWFuXCIgPT0gdHlwZW9mIHQpIHJldHVybiB7XG4gICAgICAgICAgICBib29sZWFuVmFsdWU6IHRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB7XG4gICAgICAgICAgICBzdHJpbmdWYWx1ZTogdFxuICAgICAgICB9O1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBpdC5mcm9tRGF0ZSh0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wVmFsdWU6IERpKGUuc2VyaWFsaXplciwgbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBpdCkge1xuICAgICAgICAgICAgLy8gRmlyZXN0b3JlIGJhY2tlbmQgdHJ1bmNhdGVzIHByZWNpc2lvbiBkb3duIHRvIG1pY3Jvc2Vjb25kcy4gVG8gZW5zdXJlXG4gICAgICAgICAgICAvLyBvZmZsaW5lIG1vZGUgd29ya3MgdGhlIHNhbWUgd2l0aCByZWdhcmRzIHRvIHRydW5jYXRpb24sIHBlcmZvcm0gdGhlXG4gICAgICAgICAgICAvLyB0cnVuY2F0aW9uIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGJhY2tlbmQgdG8gZG8gdGhhdC5cbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgaXQodC5zZWNvbmRzLCAxZTMgKiBNYXRoLmZsb29yKHQubmFub3NlY29uZHMgLyAxZTMpKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wVmFsdWU6IERpKGUuc2VyaWFsaXplciwgbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBqaCkgcmV0dXJuIHtcbiAgICAgICAgICAgIGdlb1BvaW50VmFsdWU6IHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogdC5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHQubG9uZ2l0dWRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWgpIHJldHVybiB7XG4gICAgICAgICAgICBieXRlc1ZhbHVlOiBDaShlLnNlcmlhbGl6ZXIsIHQuX2J5dGVTdHJpbmcpXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgZmgpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRhdGFiYXNlSWQsIHMgPSB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZDtcbiAgICAgICAgICAgIGlmICghcy5pc0VxdWFsKG4pKSB0aHJvdyBlLl9hKGBEb2N1bWVudCByZWZlcmVuY2UgaXMgZm9yIGRhdGFiYXNlICR7cy5wcm9qZWN0SWR9LyR7cy5kYXRhYmFzZX0gYnV0IHNob3VsZCBiZSBmb3IgZGF0YWJhc2UgJHtuLnByb2plY3RJZH0vJHtuLmRhdGFiYXNlfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VWYWx1ZToga2kodC5maXJlc3RvcmUuX2RhdGFiYXNlSWQgfHwgZS5kYXRhYmFzZUlkLCB0Ll9rZXkucGF0aClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZS5fYShgVW5zdXBwb3J0ZWQgZmllbGQgdmFsdWU6ICR7b2godCl9YCk7XG4gICAgfVxuICAgIC8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYW4gb2JqZWN0IGxvb2tzIGxpa2UgYSBKU09OIG9iamVjdCB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAqIGludG8gYSBzdHJ1Y3QuIE5vcm1hbCBjbGFzcy9wcm90b3R5cGUgaW5zdGFuY2VzIGFyZSBjb25zaWRlcmVkIHRvIGxvb2sgbGlrZVxuICogSlNPTiBvYmplY3RzIHNpbmNlIHRoZXkgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhIHN0cnVjdCB2YWx1ZS4gQXJyYXlzLCBEYXRlcyxcbiAqIEdlb1BvaW50cywgZXRjLiBhcmUgbm90IGNvbnNpZGVyZWQgdG8gbG9vayBsaWtlIEpTT04gb2JqZWN0cyBzaW5jZSB0aGV5IG1hcFxuICogdG8gc3BlY2lmaWMgRmllbGRWYWx1ZSB0eXBlcyBvdGhlciB0aGFuIE9iamVjdFZhbHVlLlxuICovICh0LCBlKTtcbn1cblxuZnVuY3Rpb24gbGwodCwgZSkge1xuICAgIGNvbnN0IG4gPSB7fTtcbiAgICByZXR1cm4geWUodCkgPyBcbiAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZW1wdHkgb2JqZWN0LCB3ZSBleHBsaWNpdGx5IGFkZCBpdCB0byB0aGUgdXBkYXRlXG4gICAgLy8gbWFzayB0byBlbnN1cmUgdGhhdCB0aGUgc2VydmVyIGNyZWF0ZXMgYSBtYXAgZW50cnkuXG4gICAgZS5wYXRoICYmIGUucGF0aC5sZW5ndGggPiAwICYmIGUuZmllbGRNYXNrLnB1c2goZS5wYXRoKSA6IGdlKHQsICgodCwgcykgPT4ge1xuICAgICAgICBjb25zdCBpID0gaGwocywgZS5oYSh0KSk7XG4gICAgICAgIG51bGwgIT0gaSAmJiAoblt0XSA9IGkpO1xuICAgIH0pKSwge1xuICAgICAgICBtYXBWYWx1ZToge1xuICAgICAgICAgICAgZmllbGRzOiBuXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmbCh0KSB7XG4gICAgcmV0dXJuICEoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCBudWxsID09PSB0IHx8IHQgaW5zdGFuY2VvZiBBcnJheSB8fCB0IGluc3RhbmNlb2YgRGF0ZSB8fCB0IGluc3RhbmNlb2YgaXQgfHwgdCBpbnN0YW5jZW9mIGpoIHx8IHQgaW5zdGFuY2VvZiBVaCB8fCB0IGluc3RhbmNlb2YgZmggfHwgdCBpbnN0YW5jZW9mIFFoKTtcbn1cblxuZnVuY3Rpb24gZGwodCwgZSwgbikge1xuICAgIGlmICghZmwobikgfHwgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCAmJiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpID09PSBPYmplY3QucHJvdG90eXBlIHx8IG51bGwgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSk7XG4gICAgfShuKSkge1xuICAgICAgICBjb25zdCBzID0gb2gobik7XG4gICAgICAgIHRocm93IFwiYW4gb2JqZWN0XCIgPT09IHMgPyBlLl9hKHQgKyBcIiBhIGN1c3RvbSBvYmplY3RcIikgOiBlLl9hKHQgKyBcIiBcIiArIHMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCBjYWxscyBmcm9tRG90U2VwYXJhdGVkU3RyaW5nKCkgYnV0IHdyYXBzIGFueSBlcnJvciB0aHJvd24uXG4gKi8gZnVuY3Rpb24gd2wodCwgZSwgbikge1xuICAgIGlmICgoXG4gICAgLy8gSWYgcmVxdWlyZWQsIHJlcGxhY2UgdGhlIEZpZWxkUGF0aCBDb21wYXQgY2xhc3Mgd2l0aCB3aXRoIHRoZSBmaXJlc3RvcmUtZXhwXG4gICAgLy8gRmllbGRQYXRoLlxuICAgIGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSkpIGluc3RhbmNlb2YgS2gpIHJldHVybiBlLl9pbnRlcm5hbFBhdGg7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHJldHVybiBtbCh0LCBlKTtcbiAgICB0aHJvdyBnbChcIkZpZWxkIHBhdGggYXJndW1lbnRzIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgXCIsIHQsIFxuICAgIC8qIGhhc0NvbnZlcnRlcj0gKi8gITEsIFxuICAgIC8qIHBhdGg9ICovIHZvaWQgMCwgbik7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBhbnkgY2hhcmFjdGVycyBpbiBhIGZpZWxkIHBhdGggc3RyaW5nIHRoYXQgYXJlIHJlc2VydmVkLlxuICovIGNvbnN0IF9sID0gbmV3IFJlZ0V4cChcIlt+XFxcXCovXFxcXFtcXFxcXV1cIik7XG5cbi8qKlxuICogV3JhcHMgZnJvbURvdFNlcGFyYXRlZFN0cmluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIG1ldGhvZCB0aGF0XG4gKiB3YXMgdGhyb3duLlxuICogQHBhcmFtIG1ldGhvZE5hbWUgLSBUaGUgcHVibGljbHkgdmlzaWJsZSBtZXRob2QgbmFtZVxuICogQHBhcmFtIHBhdGggLSBUaGUgZG90LXNlcGFyYXRlZCBzdHJpbmcgZm9ybSBvZiBhIGZpZWxkIHBhdGggd2hpY2ggd2lsbCBiZVxuICogc3BsaXQgb24gZG90cy5cbiAqIEBwYXJhbSB0YXJnZXREb2MgLSBUaGUgZG9jdW1lbnQgYWdhaW5zdCB3aGljaCB0aGUgZmllbGQgcGF0aCB3aWxsIGJlXG4gKiBldmFsdWF0ZWQuXG4gKi8gZnVuY3Rpb24gbWwodCwgZSwgbikge1xuICAgIGlmIChlLnNlYXJjaChfbCkgPj0gMCkgdGhyb3cgZ2woYEludmFsaWQgZmllbGQgcGF0aCAoJHtlfSkuIFBhdGhzIG11c3Qgbm90IGNvbnRhaW4gJ34nLCAnKicsICcvJywgJ1snLCBvciAnXSdgLCB0LCBcbiAgICAvKiBoYXNDb252ZXJ0ZXI9ICovICExLCBcbiAgICAvKiBwYXRoPSAqLyB2b2lkIDAsIG4pO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgS2goLi4uZS5zcGxpdChcIi5cIikpLl9pbnRlcm5hbFBhdGg7XG4gICAgfSBjYXRjaCAocykge1xuICAgICAgICB0aHJvdyBnbChgSW52YWxpZCBmaWVsZCBwYXRoICgke2V9KS4gUGF0aHMgbXVzdCBub3QgYmUgZW1wdHksIGJlZ2luIHdpdGggJy4nLCBlbmQgd2l0aCAnLicsIG9yIGNvbnRhaW4gJy4uJ2AsIHQsIFxuICAgICAgICAvKiBoYXNDb252ZXJ0ZXI9ICovICExLCBcbiAgICAgICAgLyogcGF0aD0gKi8gdm9pZCAwLCBuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdsKHQsIGUsIG4sIHMsIGkpIHtcbiAgICBjb25zdCByID0gcyAmJiAhcy5pc0VtcHR5KCksIG8gPSB2b2lkIDAgIT09IGk7XG4gICAgbGV0IHUgPSBgRnVuY3Rpb24gJHtlfSgpIGNhbGxlZCB3aXRoIGludmFsaWQgZGF0YWA7XG4gICAgbiAmJiAodSArPSBcIiAodmlhIGB0b0ZpcmVzdG9yZSgpYClcIiksIHUgKz0gXCIuIFwiO1xuICAgIGxldCBjID0gXCJcIjtcbiAgICByZXR1cm4gKHIgfHwgbykgJiYgKGMgKz0gXCIgKGZvdW5kXCIsIHIgJiYgKGMgKz0gYCBpbiBmaWVsZCAke3N9YCksIG8gJiYgKGMgKz0gYCBpbiBkb2N1bWVudCAke2l9YCksIFxuICAgIGMgKz0gXCIpXCIpLCBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIHUgKyB0ICsgYyk7XG59XG5cbi8qKiBDaGVja3MgYGhheXN0YWNrYCBpZiBGaWVsZFBhdGggYG5lZWRsZWAgaXMgcHJlc2VudC4gUnVucyBpbiBPKG4pLiAqLyBmdW5jdGlvbiB5bCh0LCBlKSB7XG4gICAgcmV0dXJuIHQuc29tZSgodCA9PiB0LmlzRXF1YWwoZSkpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbnMgZGF0YSByZWFkIGZyb20gYSBkb2N1bWVudCBpbiB5b3VyIEZpcmVzdG9yZVxuICogZGF0YWJhc2UuIFRoZSBkYXRhIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBgLmRhdGEoKWAgb3IgYC5nZXQoPGZpZWxkPilgIHRvXG4gKiBnZXQgYSBzcGVjaWZpYyBmaWVsZC5cbiAqXG4gKiBGb3IgYSBgRG9jdW1lbnRTbmFwc2hvdGAgdGhhdCBwb2ludHMgdG8gYSBub24tZXhpc3RpbmcgZG9jdW1lbnQsIGFueSBkYXRhXG4gKiBhY2Nlc3Mgd2lsbCByZXR1cm4gJ3VuZGVmaW5lZCcuIFlvdSBjYW4gdXNlIHRoZSBgZXhpc3RzKClgIG1ldGhvZCB0b1xuICogZXhwbGljaXRseSB2ZXJpZnkgYSBkb2N1bWVudCdzIGV4aXN0ZW5jZS5cbiAqLyBjbGFzcyBwbCB7XG4gICAgLy8gTm90ZTogVGhpcyBjbGFzcyBpcyBzdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgdGhlIERvY3VtZW50U25hcHNob3QgaW5cbiAgICAvLyB0aGUgbGVnYWN5IFNESy4gVGhlIGNoYW5nZXMgYXJlOlxuICAgIC8vIC0gTm8gc3VwcG9ydCBmb3IgU25hcHNob3RNZXRhZGF0YS5cbiAgICAvLyAtIE5vIHN1cHBvcnQgZm9yIFNuYXBzaG90T3B0aW9ucy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX3VzZXJEYXRhV3JpdGVyID0gZSwgdGhpcy5fa2V5ID0gbiwgdGhpcy5fZG9jdW1lbnQgPSBzLCBcbiAgICAgICAgdGhpcy5fY29udmVydGVyID0gaTtcbiAgICB9XG4gICAgLyoqIFByb3BlcnR5IG9mIHRoZSBgRG9jdW1lbnRTbmFwc2hvdGAgdGhhdCBwcm92aWRlcyB0aGUgZG9jdW1lbnQncyBJRC4gKi8gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5LnBhdGgubGFzdFNlZ21lbnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBEb2N1bWVudFJlZmVyZW5jZWAgZm9yIHRoZSBkb2N1bWVudCBpbmNsdWRlZCBpbiB0aGUgYERvY3VtZW50U25hcHNob3RgLlxuICAgICAqLyAgICBnZXQgcmVmKCkge1xuICAgICAgICByZXR1cm4gbmV3IGZoKHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fY29udmVydGVyLCB0aGlzLl9rZXkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaWduYWxzIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBhdCB0aGUgc25hcHNob3QncyBsb2NhdGlvbiBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkb2N1bWVudCBleGlzdHMuXG4gICAgICovICAgIGV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuX2RvY3VtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgYXMgYW4gYE9iamVjdGAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWZcbiAgICAgKiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQgb3IgYHVuZGVmaW5lZGBcbiAgICAgKiBpZiB0aGUgZG9jdW1lbnQgZG9lc24ndCBleGlzdC5cbiAgICAgKi8gICAgZGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHVzZSB0aGUgY29udmVydGVyIGFuZCBjcmVhdGUgYSBuZXcgRG9jdW1lbnRTbmFwc2hvdFxuICAgICAgICAgICAgICAgIC8vIGlmIGEgY29udmVydGVyIGhhcyBiZWVuIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgSWwodGhpcy5fZmlyZXN0b3JlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgdGhpcy5fa2V5LCB0aGlzLl9kb2N1bWVudCwgXG4gICAgICAgICAgICAgICAgLyogY29udmVydGVyPSAqLyBudWxsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydGVyLmZyb21GaXJlc3RvcmUodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXNlckRhdGFXcml0ZXIuY29udmVydFZhbHVlKHRoaXMuX2RvY3VtZW50LmRhdGEudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmllbGRQYXRoIC0gVGhlIHBhdGggKGZvciBleGFtcGxlICdmb28nIG9yICdmb28uYmFyJykgdG8gYSBzcGVjaWZpY1xuICAgICAqIGZpZWxkLlxuICAgICAqIEByZXR1cm5zIFRoZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmllbGQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2hcbiAgICAgKiBmaWVsZCBleGlzdHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIC8vIFdlIGFyZSB1c2luZyBgYW55YCBoZXJlIHRvIGF2b2lkIGFuIGV4cGxpY2l0IGNhc3QgYnkgb3VyIHVzZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0KHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5fZG9jdW1lbnQuZGF0YS5maWVsZChUbChcIkRvY3VtZW50U25hcHNob3QuZ2V0XCIsIHQpKTtcbiAgICAgICAgICAgIGlmIChudWxsICE9PSBlKSByZXR1cm4gdGhpcy5fdXNlckRhdGFXcml0ZXIuY29udmVydFZhbHVlKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbnMgZGF0YSByZWFkIGZyb20gYSBkb2N1bWVudCBpbiB5b3VyXG4gKiBGaXJlc3RvcmUgZGF0YWJhc2UgYXMgcGFydCBvZiBhIHF1ZXJ5LiBUaGUgZG9jdW1lbnQgaXMgZ3VhcmFudGVlZCB0byBleGlzdFxuICogYW5kIGl0cyBkYXRhIGNhbiBiZSBleHRyYWN0ZWQgd2l0aCBgLmRhdGEoKWAgb3IgYC5nZXQoPGZpZWxkPilgIHRvIGdldCBhXG4gKiBzcGVjaWZpYyBmaWVsZC5cbiAqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIG9mZmVycyB0aGUgc2FtZSBBUEkgc3VyZmFjZSBhcyBhXG4gKiBgRG9jdW1lbnRTbmFwc2hvdGAuIFNpbmNlIHF1ZXJ5IHJlc3VsdHMgY29udGFpbiBvbmx5IGV4aXN0aW5nIGRvY3VtZW50cywgdGhlXG4gKiBgZXhpc3RzYCBwcm9wZXJ0eSB3aWxsIGFsd2F5cyBiZSB0cnVlIGFuZCBgZGF0YSgpYCB3aWxsIG5ldmVyIHJldHVyblxuICogJ3VuZGVmaW5lZCcuXG4gKi8gY2xhc3MgSWwgZXh0ZW5kcyBwbCB7XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLlxuICAgICAqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHJldHVybnMgQW4gYE9iamVjdGAgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBkYXRhKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZGF0YSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCBjYWxscyBgZnJvbURvdFNlcGFyYXRlZFN0cmluZygpYCBidXQgd3JhcHMgYW55IGVycm9yIHRocm93bi5cbiAqLyBmdW5jdGlvbiBUbCh0LCBlKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIGUgPyBtbCh0LCBlKSA6IGUgaW5zdGFuY2VvZiBLaCA/IGUuX2ludGVybmFsUGF0aCA6IGUuX2RlbGVnYXRlLl9pbnRlcm5hbFBhdGg7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIGZ1bmN0aW9uIEVsKHQpIHtcbiAgICBpZiAoXCJMXCIgLyogTGltaXRUeXBlLkxhc3QgKi8gPT09IHQubGltaXRUeXBlICYmIDAgPT09IHQuZXhwbGljaXRPcmRlckJ5Lmxlbmd0aCkgdGhyb3cgbmV3IFUocS5VTklNUExFTUVOVEVELCBcImxpbWl0VG9MYXN0KCkgcXVlcmllcyByZXF1aXJlIHNwZWNpZnlpbmcgYXQgbGVhc3Qgb25lIG9yZGVyQnkoKSBjbGF1c2VcIik7XG59XG5cbi8qKlxuICogQW4gYEFwcGxpYWJsZUNvbnN0cmFpbnRgIGlzIGFuIGFic3RyYWN0aW9uIG9mIGEgY29uc3RyYWludCB0aGF0IGNhbiBiZSBhcHBsaWVkXG4gKiB0byBhIEZpcmVzdG9yZSBxdWVyeS5cbiAqLyBjbGFzcyBBbCB7fVxuXG4vKipcbiAqIEEgYFF1ZXJ5Q29uc3RyYWludGAgaXMgdXNlZCB0byBuYXJyb3cgdGhlIHNldCBvZiBkb2N1bWVudHMgcmV0dXJuZWQgYnkgYVxuICogRmlyZXN0b3JlIHF1ZXJ5LiBgUXVlcnlDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcge0BsaW5rIHdoZXJlfSxcbiAqIHtAbGluayBvcmRlckJ5fSwge0BsaW5rIChzdGFydEF0OjEpfSwge0BsaW5rIChzdGFydEFmdGVyOjEpfSwge0BsaW5rXG4gKiAoZW5kQmVmb3JlOjEpfSwge0BsaW5rIChlbmRBdDoxKX0sIHtAbGluayBsaW1pdH0sIHtAbGluayBsaW1pdFRvTGFzdH0gYW5kXG4gKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8ge0BsaW5rIChxdWVyeToxKX0gdG8gY3JlYXRlIGEgbmV3IHF1ZXJ5IGluc3RhbmNlIHRoYXRcbiAqIGFsc28gY29udGFpbnMgdGhpcyBgUXVlcnlDb25zdHJhaW50YC5cbiAqLyBjbGFzcyB2bCBleHRlbmRzIEFsIHt9XG5cbmZ1bmN0aW9uIFJsKHQsIGUsIC4uLm4pIHtcbiAgICBsZXQgcyA9IFtdO1xuICAgIGUgaW5zdGFuY2VvZiBBbCAmJiBzLnB1c2goZSksIHMgPSBzLmNvbmNhdChuKSwgZnVuY3Rpb24odCkge1xuICAgICAgICBjb25zdCBlID0gdC5maWx0ZXIoKHQgPT4gdCBpbnN0YW5jZW9mIFZsKSkubGVuZ3RoLCBuID0gdC5maWx0ZXIoKHQgPT4gdCBpbnN0YW5jZW9mIFBsKSkubGVuZ3RoO1xuICAgICAgICBpZiAoZSA+IDEgfHwgZSA+IDAgJiYgbiA+IDApIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkUXVlcnkuIFdoZW4gdXNpbmcgY29tcG9zaXRlIGZpbHRlcnMsIHlvdSBjYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgZmlsdGVyIGF0IHRoZSB0b3AgbGV2ZWwuIENvbnNpZGVyIG5lc3RpbmcgdGhlIG11bHRpcGxlIGZpbHRlcnMgd2l0aGluIGFuIGBhbmQoLi4uKWAgc3RhdGVtZW50LiBGb3IgZXhhbXBsZTogY2hhbmdlIGBxdWVyeShxdWVyeSwgd2hlcmUoLi4uKSwgb3IoLi4uKSlgIHRvIGBxdWVyeShxdWVyeSwgYW5kKHdoZXJlKC4uLiksIG9yKC4uLikpKWAuXCIpO1xuICAgIH1cbiAgICAvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuICAgIC8qKlxuICogQ29udmVydHMgRmlyZXN0b3JlJ3MgaW50ZXJuYWwgdHlwZXMgdG8gdGhlIEphdmFTY3JpcHQgdHlwZXMgdGhhdCB3ZSBleHBvc2VcbiAqIHRvIHRoZSB1c2VyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIChzKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgcykgdCA9IGUuX2FwcGx5KHQpO1xuICAgIHJldHVybiB0O1xufVxuXG4vKipcbiAqIEEgYFF1ZXJ5RmllbGRGaWx0ZXJDb25zdHJhaW50YCBpcyB1c2VkIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGRvY3VtZW50cyByZXR1cm5lZCBieVxuICogYSBGaXJlc3RvcmUgcXVlcnkgYnkgZmlsdGVyaW5nIG9uIG9uZSBvciBtb3JlIGRvY3VtZW50IGZpZWxkcy5cbiAqIGBRdWVyeUZpZWxkRmlsdGVyQ29uc3RyYWludGBzIGFyZSBjcmVhdGVkIGJ5IGludm9raW5nIHtAbGluayB3aGVyZX0gYW5kIGNhbiB0aGVuXG4gKiBiZSBwYXNzZWQgdG8ge0BsaW5rIChxdWVyeToxKX0gdG8gY3JlYXRlIGEgbmV3IHF1ZXJ5IGluc3RhbmNlIHRoYXQgYWxzbyBjb250YWluc1xuICogdGhpcyBgUXVlcnlGaWVsZEZpbHRlckNvbnN0cmFpbnRgLlxuICovIGNsYXNzIFBsIGV4dGVuZHMgdmwge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgc3VwZXIoKSwgdGhpcy5fZmllbGQgPSB0LCB0aGlzLl9vcCA9IGUsIHRoaXMuX3ZhbHVlID0gbiwgXG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIHF1ZXJ5IGNvbnN0cmFpbnQgKi9cbiAgICAgICAgdGhpcy50eXBlID0gXCJ3aGVyZVwiO1xuICAgIH1cbiAgICBzdGF0aWMgX2NyZWF0ZSh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGwodCwgZSwgbik7XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLl9wYXJzZSh0KTtcbiAgICAgICAgcmV0dXJuIFFsKHQuX3F1ZXJ5LCBlKSwgbmV3IGRoKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgWW4odC5fcXVlcnksIGUpKTtcbiAgICB9XG4gICAgX3BhcnNlKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFpoKHQuZmlyZXN0b3JlKSwgbiA9IGZ1bmN0aW9uKHQsIGUsIG4sIHMsIGksIHIsIG8pIHtcbiAgICAgICAgICAgIGxldCB1O1xuICAgICAgICAgICAgaWYgKGkuaXNLZXlGaWVsZCgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiYXJyYXktY29udGFpbnNcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOUyAqLyA9PT0gciB8fCBcImFycmF5LWNvbnRhaW5zLWFueVwiIC8qIE9wZXJhdG9yLkFSUkFZX0NPTlRBSU5TX0FOWSAqLyA9PT0gcikgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBRdWVyeS4gWW91IGNhbid0IHBlcmZvcm0gJyR7cn0nIHF1ZXJpZXMgb24gZG9jdW1lbnRJZCgpLmApO1xuICAgICAgICAgICAgICAgIGlmIChcImluXCIgLyogT3BlcmF0b3IuSU4gKi8gPT09IHIgfHwgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gPT09IHIpIHtcbiAgICAgICAgICAgICAgICAgICAgR2wobywgcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIG8pIGUucHVzaChLbChzLCB0LCBuKSk7XG4gICAgICAgICAgICAgICAgICAgIHUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHUgPSBLbChzLCB0LCBvKTtcbiAgICAgICAgICAgIH0gZWxzZSBcImluXCIgLyogT3BlcmF0b3IuSU4gKi8gIT09IHIgJiYgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gIT09IHIgJiYgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOU19BTlkgKi8gIT09IHIgfHwgR2wobywgciksIFxuICAgICAgICAgICAgdSA9IGFsKG4sIGUsIG8sIFxuICAgICAgICAgICAgLyogYWxsb3dBcnJheXM9ICovIFwiaW5cIiAvKiBPcGVyYXRvci5JTiAqLyA9PT0gciB8fCBcIm5vdC1pblwiIC8qIE9wZXJhdG9yLk5PVF9JTiAqLyA9PT0gcik7XG4gICAgICAgICAgICByZXR1cm4gbW4uY3JlYXRlKGksIHIsIHUpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBcIndoZXJlXCIsIGUsIHQuZmlyZXN0b3JlLl9kYXRhYmFzZUlkLCB0aGlzLl9maWVsZCwgdGhpcy5fb3AsIHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUXVlcnlGaWVsZEZpbHRlckNvbnN0cmFpbnR9IHRoYXQgZW5mb3JjZXMgdGhhdCBkb2N1bWVudHNcbiAqIG11c3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgc2F0aXNmeSB0aGVcbiAqIHJlbGF0aW9uIGNvbnN0cmFpbnQgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIGZpZWxkUGF0aCAtIFRoZSBwYXRoIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBvcFN0ciAtIFRoZSBvcGVyYXRpb24gc3RyaW5nIChlLmcgXCImbHQ7XCIsIFwiJmx0Oz1cIiwgXCI9PVwiLCBcIiZsdDtcIixcbiAqICAgXCImbHQ7PVwiLCBcIiE9XCIpLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIGZvciBjb21wYXJpc29uXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB7QGxpbmsgUXVlcnlGaWVsZEZpbHRlckNvbnN0cmFpbnR9LlxuICovIGZ1bmN0aW9uIGJsKHQsIGUsIG4pIHtcbiAgICBjb25zdCBzID0gZSwgaSA9IFRsKFwid2hlcmVcIiwgdCk7XG4gICAgcmV0dXJuIFBsLl9jcmVhdGUoaSwgcywgbik7XG59XG5cbi8qKlxuICogQSBgUXVlcnlDb21wb3NpdGVGaWx0ZXJDb25zdHJhaW50YCBpcyB1c2VkIHRvIG5hcnJvdyB0aGUgc2V0IG9mIGRvY3VtZW50c1xuICogcmV0dXJuZWQgYnkgYSBGaXJlc3RvcmUgcXVlcnkgYnkgcGVyZm9ybWluZyB0aGUgbG9naWNhbCBPUiBvciBBTkQgb2YgbXVsdGlwbGVcbiAqIHtAbGluayBRdWVyeUZpZWxkRmlsdGVyQ29uc3RyYWludH1zIG9yIHtAbGluayBRdWVyeUNvbXBvc2l0ZUZpbHRlckNvbnN0cmFpbnR9cy5cbiAqIGBRdWVyeUNvbXBvc2l0ZUZpbHRlckNvbnN0cmFpbnRgcyBhcmUgY3JlYXRlZCBieSBpbnZva2luZyB7QGxpbmsgb3J9IG9yXG4gKiB7QGxpbmsgYW5kfSBhbmQgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHtAbGluayAocXVlcnk6MSl9IHRvIGNyZWF0ZSBhIG5ldyBxdWVyeVxuICogaW5zdGFuY2UgdGhhdCBhbHNvIGNvbnRhaW5zIHRoZSBgUXVlcnlDb21wb3NpdGVGaWx0ZXJDb25zdHJhaW50YC5cbiAqLyBjbGFzcyBWbCBleHRlbmRzIEFsIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBxdWVyeSBjb25zdHJhaW50ICovXG4gICAgdCwgZSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLl9xdWVyeUNvbnN0cmFpbnRzID0gZTtcbiAgICB9XG4gICAgc3RhdGljIF9jcmVhdGUodCwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IFZsKHQsIGUpO1xuICAgIH1cbiAgICBfcGFyc2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5fcXVlcnlDb25zdHJhaW50cy5tYXAoKGUgPT4gZS5fcGFyc2UodCkpKS5maWx0ZXIoKHQgPT4gdC5nZXRGaWx0ZXJzKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICByZXR1cm4gMSA9PT0gZS5sZW5ndGggPyBlWzBdIDogZ24uY3JlYXRlKGUsIHRoaXMuX2dldE9wZXJhdG9yKCkpO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5fcGFyc2UodCk7XG4gICAgICAgIHJldHVybiAwID09PSBlLmdldEZpbHRlcnMoKS5sZW5ndGggPyB0IDogKGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIGxldCBuID0gdDtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBlLmdldEZsYXR0ZW5lZEZpbHRlcnMoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBzKSBRbChuLCB0KSwgbiA9IFluKG4sIHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrcyBpZiBhbnkgb2YgdGhlIHByb3ZpZGVkIGZpbHRlciBvcGVyYXRvcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBsaXN0IG9mIGZpbHRlcnMgYW5kXG4gICAgICAgIC8vIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzLCBvciBudWxsIGlmIG5vbmUgYXJlLlxuICAgICAgICAodC5fcXVlcnksIGUpLCBuZXcgZGgodC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBZbih0Ll9xdWVyeSwgZSkpKTtcbiAgICB9XG4gICAgX2dldFF1ZXJ5Q29uc3RyYWludHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbnN0cmFpbnRzO1xuICAgIH1cbiAgICBfZ2V0T3BlcmF0b3IoKSB7XG4gICAgICAgIHJldHVybiBcImFuZFwiID09PSB0aGlzLnR5cGUgPyBcImFuZFwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLkFORCAqLyA6IFwib3JcIiAvKiBDb21wb3NpdGVPcGVyYXRvci5PUiAqLztcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVlcnlDb21wb3NpdGVGaWx0ZXJDb25zdHJhaW50fSB0aGF0IGlzIGEgZGlzanVuY3Rpb24gb2ZcbiAqIHRoZSBnaXZlbiBmaWx0ZXIgY29uc3RyYWludHMuIEEgZGlzanVuY3Rpb24gZmlsdGVyIGluY2x1ZGVzIGEgZG9jdW1lbnQgaWYgaXRcbiAqIHNhdGlzZmllcyBhbnkgb2YgdGhlIGdpdmVuIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIHF1ZXJ5Q29uc3RyYWludHMgLSBPcHRpb25hbC4gVGhlIGxpc3Qgb2ZcbiAqIHtAbGluayBRdWVyeUZpbHRlckNvbnN0cmFpbnR9cyB0byBwZXJmb3JtIGEgZGlzanVuY3Rpb24gZm9yLiBUaGVzZSBtdXN0IGJlXG4gKiBjcmVhdGVkIHdpdGggY2FsbHMgdG8ge0BsaW5rIHdoZXJlfSwge0BsaW5rIG9yfSwgb3Ige0BsaW5rIGFuZH0uXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgUXVlcnlDb21wb3NpdGVGaWx0ZXJDb25zdHJhaW50fS5cbiAqLyBmdW5jdGlvbiBTbCguLi50KSB7XG4gICAgLy8gT25seSBzdXBwb3J0IFF1ZXJ5RmlsdGVyQ29uc3RyYWludHNcbiAgICByZXR1cm4gdC5mb3JFYWNoKCh0ID0+IHpsKFwib3JcIiwgdCkpKSwgVmwuX2NyZWF0ZShcIm9yXCIgLyogQ29tcG9zaXRlT3BlcmF0b3IuT1IgKi8gLCB0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHtAbGluayBRdWVyeUNvbXBvc2l0ZUZpbHRlckNvbnN0cmFpbnR9IHRoYXQgaXMgYSBjb25qdW5jdGlvbiBvZlxuICogdGhlIGdpdmVuIGZpbHRlciBjb25zdHJhaW50cy4gQSBjb25qdW5jdGlvbiBmaWx0ZXIgaW5jbHVkZXMgYSBkb2N1bWVudCBpZiBpdFxuICogc2F0aXNmaWVzIGFsbCBvZiB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gcXVlcnlDb25zdHJhaW50cyAtIE9wdGlvbmFsLiBUaGUgbGlzdCBvZlxuICoge0BsaW5rIFF1ZXJ5RmlsdGVyQ29uc3RyYWludH1zIHRvIHBlcmZvcm0gYSBjb25qdW5jdGlvbiBmb3IuIFRoZXNlIG11c3QgYmVcbiAqIGNyZWF0ZWQgd2l0aCBjYWxscyB0byB7QGxpbmsgd2hlcmV9LCB7QGxpbmsgb3J9LCBvciB7QGxpbmsgYW5kfS5cbiAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIHtAbGluayBRdWVyeUNvbXBvc2l0ZUZpbHRlckNvbnN0cmFpbnR9LlxuICovIGZ1bmN0aW9uIERsKC4uLnQpIHtcbiAgICAvLyBPbmx5IHN1cHBvcnQgUXVlcnlGaWx0ZXJDb25zdHJhaW50c1xuICAgIHJldHVybiB0LmZvckVhY2goKHQgPT4gemwoXCJhbmRcIiwgdCkpKSwgVmwuX2NyZWF0ZShcImFuZFwiIC8qIENvbXBvc2l0ZU9wZXJhdG9yLkFORCAqLyAsIHQpO1xufVxuXG4vKipcbiAqIEEgYFF1ZXJ5T3JkZXJCeUNvbnN0cmFpbnRgIGlzIHVzZWQgdG8gc29ydCB0aGUgc2V0IG9mIGRvY3VtZW50cyByZXR1cm5lZCBieSBhXG4gKiBGaXJlc3RvcmUgcXVlcnkuIGBRdWVyeU9yZGVyQnlDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmdcbiAqIHtAbGluayBvcmRlckJ5fSBhbmQgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHtAbGluayAocXVlcnk6MSl9IHRvIGNyZWF0ZSBhIG5ldyBxdWVyeVxuICogaW5zdGFuY2UgdGhhdCBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5T3JkZXJCeUNvbnN0cmFpbnRgLlxuICpcbiAqIE5vdGU6IERvY3VtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBvcmRlckJ5IGZpZWxkIHdpbGwgbm90IGJlIHByZXNlbnQgaW5cbiAqIHRoZSBxdWVyeSByZXN1bHQuXG4gKi8gY2xhc3MgQ2wgZXh0ZW5kcyB2bCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLl9maWVsZCA9IHQsIHRoaXMuX2RpcmVjdGlvbiA9IGUsIFxuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBxdWVyeSBjb25zdHJhaW50ICovXG4gICAgICAgIHRoaXMudHlwZSA9IFwib3JkZXJCeVwiO1xuICAgIH1cbiAgICBzdGF0aWMgX2NyZWF0ZSh0LCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2wodCwgZSk7XG4gICAgfVxuICAgIF9hcHBseSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdC5zdGFydEF0KSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiSW52YWxpZCBxdWVyeS4gWW91IG11c3Qgbm90IGNhbGwgc3RhcnRBdCgpIG9yIHN0YXJ0QWZ0ZXIoKSBiZWZvcmUgY2FsbGluZyBvcmRlckJ5KCkuXCIpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHQuZW5kQXQpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgXCJJbnZhbGlkIHF1ZXJ5LiBZb3UgbXVzdCBub3QgY2FsbCBlbmRBdCgpIG9yIGVuZEJlZm9yZSgpIGJlZm9yZSBjYWxsaW5nIG9yZGVyQnkoKS5cIik7XG4gICAgICAgICAgICBjb25zdCBzID0gbmV3IGRuKGUsIG4pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gam4odCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgb3JkZXIgYnkuIEl0IG11c3QgbWF0Y2ggYW55IGluZXF1YWxpdHkuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB6bih0KTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gbiAmJiBqbCh0LCBuLCBlLmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KHQsIHMpLCBzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICogQ3JlYXRlIGEgYEJvdW5kYCBmcm9tIGEgcXVlcnkgYW5kIGEgZG9jdW1lbnQuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBgQm91bmRgIHdpbGwgYWx3YXlzIGluY2x1ZGUgdGhlIGtleSBvZiB0aGUgZG9jdW1lbnRcbiAqIGFuZCBzbyBvbmx5IHRoZSBwcm92aWRlZCBkb2N1bWVudCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gdGhlIHJldHVybmVkXG4gKiBwb3NpdGlvbi5cbiAqXG4gKiBXaWxsIHRocm93IGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGFsbCBmaWVsZHMgb2YgdGhlIG9yZGVyIGJ5XG4gKiBvZiB0aGUgcXVlcnkgb3IgaWYgYW55IG9mIHRoZSBmaWVsZHMgaW4gdGhlIG9yZGVyIGJ5IGFyZSBhbiB1bmNvbW1pdHRlZFxuICogc2VydmVyIHRpbWVzdGFtcC5cbiAqLyAodC5fcXVlcnksIHRoaXMuX2ZpZWxkLCB0aGlzLl9kaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4gbmV3IGRoKHQuZmlyZXN0b3JlLCB0LmNvbnZlcnRlciwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgLy8gVE9ETyhkaW1vbmQpOiB2YWxpZGF0ZSB0aGF0IG9yZGVyQnkgZG9lcyBub3QgbGlzdCB0aGUgc2FtZSBrZXkgdHdpY2UuXG4gICAgICAgICAgICBjb25zdCBuID0gdC5leHBsaWNpdE9yZGVyQnkuY29uY2F0KFsgZSBdKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVW4odC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgbiwgdC5maWx0ZXJzLnNsaWNlKCksIHQubGltaXQsIHQubGltaXRUeXBlLCB0LnN0YXJ0QXQsIHQuZW5kQXQpO1xuICAgICAgICB9KHQuX3F1ZXJ5LCBlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUXVlcnlPcmRlckJ5Q29uc3RyYWludH0gdGhhdCBzb3J0cyB0aGUgcXVlcnkgcmVzdWx0IGJ5IHRoZVxuICogc3BlY2lmaWVkIGZpZWxkLCBvcHRpb25hbGx5IGluIGRlc2NlbmRpbmcgb3JkZXIgaW5zdGVhZCBvZiBhc2NlbmRpbmcuXG4gKlxuICogTm90ZTogRG9jdW1lbnRzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBmaWVsZCB3aWxsIG5vdCBiZSBwcmVzZW50XG4gKiBpbiB0aGUgcXVlcnkgcmVzdWx0LlxuICpcbiAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgZmllbGQgdG8gc29ydCBieS5cbiAqIEBwYXJhbSBkaXJlY3Rpb25TdHIgLSBPcHRpb25hbCBkaXJlY3Rpb24gdG8gc29ydCBieSAoJ2FzYycgb3IgJ2Rlc2MnKS4gSWZcbiAqIG5vdCBzcGVjaWZpZWQsIG9yZGVyIHdpbGwgYmUgYXNjZW5kaW5nLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQge0BsaW5rIFF1ZXJ5T3JkZXJCeUNvbnN0cmFpbnR9LlxuICovIGZ1bmN0aW9uIHhsKHQsIGUgPSBcImFzY1wiKSB7XG4gICAgY29uc3QgbiA9IGUsIHMgPSBUbChcIm9yZGVyQnlcIiwgdCk7XG4gICAgcmV0dXJuIENsLl9jcmVhdGUocywgbik7XG59XG5cbi8qKlxuICogQSBgUXVlcnlMaW1pdENvbnN0cmFpbnRgIGlzIHVzZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiBkb2N1bWVudHMgcmV0dXJuZWQgYnlcbiAqIGEgRmlyZXN0b3JlIHF1ZXJ5LlxuICogYFF1ZXJ5TGltaXRDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcge0BsaW5rIGxpbWl0fSBvclxuICoge0BsaW5rIGxpbWl0VG9MYXN0fSBhbmQgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHtAbGluayAocXVlcnk6MSl9IHRvIGNyZWF0ZSBhIG5ld1xuICogcXVlcnkgaW5zdGFuY2UgdGhhdCBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5TGltaXRDb25zdHJhaW50YC5cbiAqLyBjbGFzcyBObCBleHRlbmRzIHZsIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBxdWVyeSBjb25zdHJhaW50ICovXG4gICAgdCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLl9saW1pdCA9IGUsIHRoaXMuX2xpbWl0VHlwZSA9IG47XG4gICAgfVxuICAgIHN0YXRpYyBfY3JlYXRlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBObCh0LCBlLCBuKTtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkaCh0LmZpcmVzdG9yZSwgdC5jb252ZXJ0ZXIsIFhuKHQuX3F1ZXJ5LCB0aGlzLl9saW1pdCwgdGhpcy5fbGltaXRUeXBlKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUXVlcnlMaW1pdENvbnN0cmFpbnR9IHRoYXQgb25seSByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZ1xuICogZG9jdW1lbnRzLlxuICpcbiAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4uXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB7QGxpbmsgUXVlcnlMaW1pdENvbnN0cmFpbnR9LlxuICovIGZ1bmN0aW9uIGtsKHQpIHtcbiAgICByZXR1cm4gY2goXCJsaW1pdFwiLCB0KSwgTmwuX2NyZWF0ZShcImxpbWl0XCIsIHQsIFwiRlwiIC8qIExpbWl0VHlwZS5GaXJzdCAqLyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBRdWVyeUxpbWl0Q29uc3RyYWludH0gdGhhdCBvbmx5IHJldHVybnMgdGhlIGxhc3QgbWF0Y2hpbmdcbiAqIGRvY3VtZW50cy5cbiAqXG4gKiBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBgb3JkZXJCeWAgY2xhdXNlIGZvciBgbGltaXRUb0xhc3RgIHF1ZXJpZXMsXG4gKiBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGR1cmluZyBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybi5cbiAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHtAbGluayBRdWVyeUxpbWl0Q29uc3RyYWludH0uXG4gKi8gZnVuY3Rpb24gTWwodCkge1xuICAgIHJldHVybiBjaChcImxpbWl0VG9MYXN0XCIsIHQpLCBObC5fY3JlYXRlKFwibGltaXRUb0xhc3RcIiwgdCwgXCJMXCIgLyogTGltaXRUeXBlLkxhc3QgKi8pO1xufVxuXG4vKipcbiAqIEEgYFF1ZXJ5U3RhcnRBdENvbnN0cmFpbnRgIGlzIHVzZWQgdG8gZXhjbHVkZSBkb2N1bWVudHMgZnJvbSB0aGUgc3RhcnQgb2YgYVxuICogcmVzdWx0IHNldCByZXR1cm5lZCBieSBhIEZpcmVzdG9yZSBxdWVyeS5cbiAqIGBRdWVyeVN0YXJ0QXRDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcge0BsaW5rIChzdGFydEF0OjEpfSBvclxuICoge0BsaW5rIChzdGFydEFmdGVyOjEpfSBhbmQgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHtAbGluayAocXVlcnk6MSl9IHRvIGNyZWF0ZSBhXG4gKiBuZXcgcXVlcnkgaW5zdGFuY2UgdGhhdCBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5U3RhcnRBdENvbnN0cmFpbnRgLlxuICovIGNsYXNzICRsIGV4dGVuZHMgdmwge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgdHlwZSBvZiB0aGlzIHF1ZXJ5IGNvbnN0cmFpbnQgKi9cbiAgICB0LCBlLCBuKSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMudHlwZSA9IHQsIHRoaXMuX2RvY09yRmllbGRzID0gZSwgdGhpcy5faW5jbHVzaXZlID0gbjtcbiAgICB9XG4gICAgc3RhdGljIF9jcmVhdGUodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gbmV3ICRsKHQsIGUsIG4pO1xuICAgIH1cbiAgICBfYXBwbHkodCkge1xuICAgICAgICBjb25zdCBlID0gVWwodCwgdGhpcy50eXBlLCB0aGlzLl9kb2NPckZpZWxkcywgdGhpcy5faW5jbHVzaXZlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBkaCh0LmZpcmVzdG9yZSwgdC5jb252ZXJ0ZXIsIGZ1bmN0aW9uKHQsIGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVW4odC5wYXRoLCB0LmNvbGxlY3Rpb25Hcm91cCwgdC5leHBsaWNpdE9yZGVyQnkuc2xpY2UoKSwgdC5maWx0ZXJzLnNsaWNlKCksIHQubGltaXQsIHQubGltaXRUeXBlLCBlLCB0LmVuZEF0KTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgZSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gT2woLi4udCkge1xuICAgIHJldHVybiAkbC5fY3JlYXRlKFwic3RhcnRBdFwiLCB0LCBcbiAgICAvKmluY2x1c2l2ZT0qLyAhMCk7XG59XG5cbmZ1bmN0aW9uIEZsKC4uLnQpIHtcbiAgICByZXR1cm4gJGwuX2NyZWF0ZShcInN0YXJ0QWZ0ZXJcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITEpO1xufVxuXG4vKipcbiAqIEEgYFF1ZXJ5RW5kQXRDb25zdHJhaW50YCBpcyB1c2VkIHRvIGV4Y2x1ZGUgZG9jdW1lbnRzIGZyb20gdGhlIGVuZCBvZiBhXG4gKiByZXN1bHQgc2V0IHJldHVybmVkIGJ5IGEgRmlyZXN0b3JlIHF1ZXJ5LlxuICogYFF1ZXJ5RW5kQXRDb25zdHJhaW50YHMgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcge0BsaW5rIChlbmRBdDoxKX0gb3JcbiAqIHtAbGluayAoZW5kQmVmb3JlOjEpfSBhbmQgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHtAbGluayAocXVlcnk6MSl9IHRvIGNyZWF0ZSBhIG5ld1xuICogcXVlcnkgaW5zdGFuY2UgdGhhdCBhbHNvIGNvbnRhaW5zIHRoaXMgYFF1ZXJ5RW5kQXRDb25zdHJhaW50YC5cbiAqLyBjbGFzcyBCbCBleHRlbmRzIHZsIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIHR5cGUgb2YgdGhpcyBxdWVyeSBjb25zdHJhaW50ICovXG4gICAgdCwgZSwgbikge1xuICAgICAgICBzdXBlcigpLCB0aGlzLnR5cGUgPSB0LCB0aGlzLl9kb2NPckZpZWxkcyA9IGUsIHRoaXMuX2luY2x1c2l2ZSA9IG47XG4gICAgfVxuICAgIHN0YXRpYyBfY3JlYXRlKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbCh0LCBlLCBuKTtcbiAgICB9XG4gICAgX2FwcGx5KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFVsKHQsIHRoaXMudHlwZSwgdGhpcy5fZG9jT3JGaWVsZHMsIHRoaXMuX2luY2x1c2l2ZSk7XG4gICAgICAgIHJldHVybiBuZXcgZGgodC5maXJlc3RvcmUsIHQuY29udmVydGVyLCBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVuKHQucGF0aCwgdC5jb2xsZWN0aW9uR3JvdXAsIHQuZXhwbGljaXRPcmRlckJ5LnNsaWNlKCksIHQuZmlsdGVycy5zbGljZSgpLCB0LmxpbWl0LCB0LmxpbWl0VHlwZSwgdC5zdGFydEF0LCBlKTtcbiAgICAgICAgfSh0Ll9xdWVyeSwgZSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gTGwoLi4udCkge1xuICAgIHJldHVybiBCbC5fY3JlYXRlKFwiZW5kQmVmb3JlXCIsIHQsIFxuICAgIC8qaW5jbHVzaXZlPSovICExKTtcbn1cblxuZnVuY3Rpb24gcWwoLi4udCkge1xuICAgIHJldHVybiBCbC5fY3JlYXRlKFwiZW5kQXRcIiwgdCwgXG4gICAgLyppbmNsdXNpdmU9Ki8gITApO1xufVxuXG4vKiogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGJvdW5kIGZyb20gYSBkb2N1bWVudCBvciBmaWVsZHMgKi8gZnVuY3Rpb24gVWwodCwgZSwgbiwgcykge1xuICAgIGlmIChuWzBdID0gZ2V0TW9kdWxhckluc3RhbmNlKG5bMF0pLCBuWzBdIGluc3RhbmNlb2YgcGwpIHJldHVybiBmdW5jdGlvbih0LCBlLCBuLCBzLCBpKSB7XG4gICAgICAgIGlmICghcykgdGhyb3cgbmV3IFUocS5OT1RfRk9VTkQsIGBDYW4ndCB1c2UgYSBEb2N1bWVudFNuYXBzaG90IHRoYXQgZG9lc24ndCBleGlzdCBmb3IgJHtufSgpLmApO1xuICAgICAgICBjb25zdCByID0gW107XG4gICAgICAgIC8vIEJlY2F1c2UgcGVvcGxlIGV4cGVjdCB0byBjb250aW51ZS9lbmQgYSBxdWVyeSBhdCB0aGUgZXhhY3QgZG9jdW1lbnRcbiAgICAgICAgLy8gcHJvdmlkZWQsIHdlIG5lZWQgdG8gdXNlIHRoZSBpbXBsaWNpdCBzb3J0IG9yZGVyIHJhdGhlciB0aGFuIHRoZSBleHBsaWNpdFxuICAgICAgICAvLyBzb3J0IG9yZGVyLCBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBjb250YWluIHRoZSBkb2N1bWVudCBrZXkuIFRoYXQgd2F5XG4gICAgICAgIC8vIHRoZSBwb3NpdGlvbiBiZWNvbWVzIHVuYW1iaWd1b3VzIGFuZCB0aGUgcXVlcnkgY29udGludWVzL2VuZHMgZXhhY3RseSBhdFxuICAgICAgICAvLyB0aGUgcHJvdmlkZWQgZG9jdW1lbnQuIFdpdGhvdXQgdGhlIGtleSAoYnkgdXNpbmcgdGhlIGV4cGxpY2l0IHNvcnRcbiAgICAgICAgLy8gb3JkZXJzKSwgbXVsdGlwbGUgZG9jdW1lbnRzIGNvdWxkIG1hdGNoIHRoZSBwb3NpdGlvbiwgeWllbGRpbmcgZHVwbGljYXRlXG4gICAgICAgIC8vIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIEhuKHQpKSBpZiAobi5maWVsZC5pc0tleUZpZWxkKCkpIHIucHVzaChXZShlLCBzLmtleSkpOyBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBzLmRhdGEuZmllbGQobi5maWVsZCk7XG4gICAgICAgICAgICBpZiAoTmUodCkpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgJ0ludmFsaWQgcXVlcnkuIFlvdSBhcmUgdHJ5aW5nIHRvIHN0YXJ0IG9yIGVuZCBhIHF1ZXJ5IHVzaW5nIGEgZG9jdW1lbnQgZm9yIHdoaWNoIHRoZSBmaWVsZCBcIicgKyBuLmZpZWxkICsgJ1wiIGlzIGFuIHVuY29tbWl0dGVkIHNlcnZlciB0aW1lc3RhbXAuIChTaW5jZSB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyB1bmtub3duLCB5b3UgY2Fubm90IHN0YXJ0L2VuZCBhIHF1ZXJ5IHdpdGggaXQuKScpO1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbi5maWVsZC5jYW5vbmljYWxTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgYXJlIHRyeWluZyB0byBzdGFydCBvciBlbmQgYSBxdWVyeSB1c2luZyBhIGRvY3VtZW50IGZvciB3aGljaCB0aGUgZmllbGQgJyR7dH0nICh1c2VkIGFzIHRoZSBvcmRlckJ5KSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IGhuKHIsIGkpO1xuICAgIH1cbiAgICAvKipcbiAqIENvbnZlcnRzIGEgbGlzdCBvZiBmaWVsZCB2YWx1ZXMgdG8gYSBgQm91bmRgIGZvciB0aGUgZ2l2ZW4gcXVlcnkuXG4gKi8gKHQuX3F1ZXJ5LCB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCwgZSwgblswXS5fZG9jdW1lbnQsIHMpO1xuICAgIHtcbiAgICAgICAgY29uc3QgaSA9IFpoKHQuZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIGUsIG4sIHMsIGksIHIpIHtcbiAgICAgICAgICAgIC8vIFVzZSBleHBsaWNpdCBvcmRlciBieSdzIGJlY2F1c2UgaXQgaGFzIHRvIG1hdGNoIHRoZSBxdWVyeSB0aGUgdXNlciBtYWRlXG4gICAgICAgICAgICBjb25zdCBvID0gdC5leHBsaWNpdE9yZGVyQnk7XG4gICAgICAgICAgICBpZiAoaS5sZW5ndGggPiBvLmxlbmd0aCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkIHRvICR7c30oKS4gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBvcmRlckJ5KCkgY2xhdXNlc2ApO1xuICAgICAgICAgICAgY29uc3QgdSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBpLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGlbcl07XG4gICAgICAgICAgICAgICAgaWYgKG9bcl0uZmllbGQuaXNLZXlGaWVsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiBjKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBFeHBlY3RlZCBhIHN0cmluZyBmb3IgZG9jdW1lbnQgSUQgaW4gJHtzfSgpLCBidXQgZ290IGEgJHt0eXBlb2YgY31gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFXbih0KSAmJiAtMSAhPT0gYy5pbmRleE9mKFwiL1wiKSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gYW5kIG9yZGVyaW5nIGJ5IGRvY3VtZW50SWQoKSwgdGhlIHZhbHVlIHBhc3NlZCB0byAke3N9KCkgbXVzdCBiZSBhIHBsYWluIGRvY3VtZW50IElELCBidXQgJyR7Y30nIGNvbnRhaW5zIGEgc2xhc2guYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnBhdGguY2hpbGQodXQuZnJvbVN0cmluZyhjKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaHQuaXNEb2N1bWVudEtleShuKSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gZ3JvdXAgYW5kIG9yZGVyaW5nIGJ5IGRvY3VtZW50SWQoKSwgdGhlIHZhbHVlIHBhc3NlZCB0byAke3N9KCkgbXVzdCByZXN1bHQgaW4gYSB2YWxpZCBkb2N1bWVudCBwYXRoLCBidXQgJyR7bn0nIGlzIG5vdCBiZWNhdXNlIGl0IGNvbnRhaW5zIGFuIG9kZCBudW1iZXIgb2Ygc2VnbWVudHMuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgaHQobik7XG4gICAgICAgICAgICAgICAgICAgIHUucHVzaChXZShlLCBpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGFsKG4sIHMsIGMpO1xuICAgICAgICAgICAgICAgICAgICB1LnB1c2godCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBobih1LCByKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAqIFBhcnNlcyB0aGUgZ2l2ZW4gYGRvY3VtZW50SWRWYWx1ZWAgaW50byBhIGBSZWZlcmVuY2VWYWx1ZWAsIHRocm93aW5nXG4gKiBhcHByb3ByaWF0ZSBlcnJvcnMgaWYgdGhlIHZhbHVlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSBgRG9jdW1lbnRSZWZlcmVuY2VgXG4gKiBvciBgc3RyaW5nYCwgb3IgaWYgdGhlIHN0cmluZyBpcyBtYWxmb3JtZWQuXG4gKi8gKHQuX3F1ZXJ5LCB0LmZpcmVzdG9yZS5fZGF0YWJhc2VJZCwgaSwgZSwgbiwgcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBLbCh0LCBlLCBuKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIChuID0gZ2V0TW9kdWxhckluc3RhbmNlKG4pKSkge1xuICAgICAgICBpZiAoXCJcIiA9PT0gbikgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIkludmFsaWQgcXVlcnkuIFdoZW4gcXVlcnlpbmcgd2l0aCBkb2N1bWVudElkKCksIHlvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCBkb2N1bWVudCBJRCwgYnV0IGl0IHdhcyBhbiBlbXB0eSBzdHJpbmcuXCIpO1xuICAgICAgICBpZiAoIVduKGUpICYmIC0xICE9PSBuLmluZGV4T2YoXCIvXCIpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBXaGVuIHF1ZXJ5aW5nIGEgY29sbGVjdGlvbiBieSBkb2N1bWVudElkKCksIHlvdSBtdXN0IHByb3ZpZGUgYSBwbGFpbiBkb2N1bWVudCBJRCwgYnV0ICcke259JyBjb250YWlucyBhICcvJyBjaGFyYWN0ZXIuYCk7XG4gICAgICAgIGNvbnN0IHMgPSBlLnBhdGguY2hpbGQodXQuZnJvbVN0cmluZyhuKSk7XG4gICAgICAgIGlmICghaHQuaXNEb2N1bWVudEtleShzKSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gV2hlbiBxdWVyeWluZyBhIGNvbGxlY3Rpb24gZ3JvdXAgYnkgZG9jdW1lbnRJZCgpLCB0aGUgdmFsdWUgcHJvdmlkZWQgbXVzdCByZXN1bHQgaW4gYSB2YWxpZCBkb2N1bWVudCBwYXRoLCBidXQgJyR7c30nIGlzIG5vdCBiZWNhdXNlIGl0IGhhcyBhbiBvZGQgbnVtYmVyIG9mIHNlZ21lbnRzICgke3MubGVuZ3RofSkuYCk7XG4gICAgICAgIHJldHVybiBXZSh0LCBuZXcgaHQocykpO1xuICAgIH1cbiAgICBpZiAobiBpbnN0YW5jZW9mIGZoKSByZXR1cm4gV2UodCwgbi5fa2V5KTtcbiAgICB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBXaGVuIHF1ZXJ5aW5nIHdpdGggZG9jdW1lbnRJZCgpLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgc3RyaW5nIG9yIGEgRG9jdW1lbnRSZWZlcmVuY2UsIGJ1dCBpdCB3YXM6ICR7b2gobil9LmApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBwYXNzZWQgaW50byBhIGRpc2p1bmN0aXZlIGZpbHRlciBzYXRpc2ZpZXMgYWxsXG4gKiBhcnJheSByZXF1aXJlbWVudHMuXG4gKi8gZnVuY3Rpb24gR2wodCwgZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSB8fCAwID09PSB0Lmxlbmd0aCkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBRdWVyeS4gQSBub24tZW1wdHkgYXJyYXkgaXMgcmVxdWlyZWQgZm9yICcke2UudG9TdHJpbmcoKX0nIGZpbHRlcnMuYCk7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb3BlcmF0b3IsIHJldHVybnMgdGhlIHNldCBvZiBvcGVyYXRvcnMgdGhhdCBjYW5ub3QgYmUgdXNlZCB3aXRoIGl0LlxuICpcbiAqIFRoaXMgaXMgbm90IGEgY29tcHJlaGVuc2l2ZSBjaGVjaywgYW5kIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlbW92ZWQgaW4gdGhlXG4gKiBsb25nIHRlcm0uIFZhbGlkYXRpb25zIHNob3VsZCBvY2N1ciBpbiB0aGUgRmlyZXN0b3JlIGJhY2tlbmQuXG4gKlxuICogT3BlcmF0b3JzIGluIGEgcXVlcnkgbXVzdCBhZGhlcmUgdG8gdGhlIGZvbGxvd2luZyBzZXQgb2YgcnVsZXM6XG4gKiAxLiBPbmx5IG9uZSBpbmVxdWFsaXR5IHBlciBxdWVyeS5cbiAqIDIuIGBOT1RfSU5gIGNhbm5vdCBiZSB1c2VkIHdpdGggYXJyYXksIGRpc2p1bmN0aXZlLCBvciBgTk9UX0VRVUFMYCBvcGVyYXRvcnMuXG4gKi8gZnVuY3Rpb24gUWwodCwgZSkge1xuICAgIGlmIChlLmlzSW5lcXVhbGl0eSgpKSB7XG4gICAgICAgIGNvbnN0IG4gPSB6bih0KSwgcyA9IGUuZmllbGQ7XG4gICAgICAgIGlmIChudWxsICE9PSBuICYmICFuLmlzRXF1YWwocykpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgYEludmFsaWQgcXVlcnkuIEFsbCB3aGVyZSBmaWx0ZXJzIHdpdGggYW4gaW5lcXVhbGl0eSAoPCwgPD0sICE9LCBub3QtaW4sID4sIG9yID49KSBtdXN0IGJlIG9uIHRoZSBzYW1lIGZpZWxkLiBCdXQgeW91IGhhdmUgaW5lcXVhbGl0eSBmaWx0ZXJzIG9uICcke24udG9TdHJpbmcoKX0nIGFuZCAnJHtzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICBjb25zdCBpID0gam4odCk7XG4gICAgICAgIG51bGwgIT09IGkgJiYgamwodCwgcywgaSk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBmb3IgKGNvbnN0IHQgb2Ygbi5nZXRGbGF0dGVuZWRGaWx0ZXJzKCkpIGlmIChlLmluZGV4T2YodC5vcCkgPj0gMCkgcmV0dXJuIHQub3A7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0odC5maWx0ZXJzLCBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgIGNhc2UgXCIhPVwiIC8qIE9wZXJhdG9yLk5PVF9FUVVBTCAqLyA6XG4gICAgICAgICAgICByZXR1cm4gWyBcIiE9XCIgLyogT3BlcmF0b3IuTk9UX0VRVUFMICovICwgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gXTtcblxuICAgICAgICAgIGNhc2UgXCJhcnJheS1jb250YWlucy1hbnlcIiAvKiBPcGVyYXRvci5BUlJBWV9DT05UQUlOU19BTlkgKi8gOlxuICAgICAgICAgIGNhc2UgXCJpblwiIC8qIE9wZXJhdG9yLklOICovIDpcbiAgICAgICAgICAgIHJldHVybiBbIFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovIF07XG5cbiAgICAgICAgICBjYXNlIFwibm90LWluXCIgLyogT3BlcmF0b3IuTk9UX0lOICovIDpcbiAgICAgICAgICAgIHJldHVybiBbIFwiYXJyYXktY29udGFpbnMtYW55XCIgLyogT3BlcmF0b3IuQVJSQVlfQ09OVEFJTlNfQU5ZICovICwgXCJpblwiIC8qIE9wZXJhdG9yLklOICovICwgXCJub3QtaW5cIiAvKiBPcGVyYXRvci5OT1RfSU4gKi8gLCBcIiE9XCIgLyogT3BlcmF0b3IuTk9UX0VRVUFMICovIF07XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfShlLm9wKSk7XG4gICAgaWYgKG51bGwgIT09IG4pIFxuICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVuIGl0J3MgYSBkdXBsaWNhdGUgb3AgdG8gZ2l2ZSBhIHNsaWdodGx5IGNsZWFyZXIgZXJyb3IgbWVzc2FnZS5cbiAgICB0aHJvdyBuID09PSBlLm9wID8gbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBgSW52YWxpZCBxdWVyeS4gWW91IGNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSAnJHtlLm9wLnRvU3RyaW5nKCl9JyBmaWx0ZXIuYCkgOiBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgY2Fubm90IHVzZSAnJHtlLm9wLnRvU3RyaW5nKCl9JyBmaWx0ZXJzIHdpdGggJyR7bi50b1N0cmluZygpfScgZmlsdGVycy5gKTtcbn1cblxuZnVuY3Rpb24gamwodCwgZSwgbikge1xuICAgIGlmICghbi5pc0VxdWFsKGUpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBJbnZhbGlkIHF1ZXJ5LiBZb3UgaGF2ZSBhIHdoZXJlIGZpbHRlciB3aXRoIGFuIGluZXF1YWxpdHkgKDwsIDw9LCAhPSwgbm90LWluLCA+LCBvciA+PSkgb24gZmllbGQgJyR7ZS50b1N0cmluZygpfScgYW5kIHNvIHlvdSBtdXN0IGFsc28gdXNlICcke2UudG9TdHJpbmcoKX0nIGFzIHlvdXIgZmlyc3QgYXJndW1lbnQgdG8gb3JkZXJCeSgpLCBidXQgeW91ciBmaXJzdCBvcmRlckJ5KCkgaXMgb24gZmllbGQgJyR7bi50b1N0cmluZygpfScgaW5zdGVhZC5gKTtcbn1cblxuZnVuY3Rpb24gemwodCwgZSkge1xuICAgIGlmICghKGUgaW5zdGFuY2VvZiBQbCB8fCBlIGluc3RhbmNlb2YgVmwpKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIGBGdW5jdGlvbiAke3R9KCkgcmVxdWlyZXMgQXBwbGlhYmxlQ29uc3RyYWludHMgY3JlYXRlZCB3aXRoIGEgY2FsbCB0byAnd2hlcmUoLi4uKScsICdvciguLi4pJywgb3IgJ2FuZCguLi4pJy5gKTtcbn1cblxuY2xhc3MgV2wge1xuICAgIGNvbnZlcnRWYWx1ZSh0LCBlID0gXCJub25lXCIpIHtcbiAgICAgICAgc3dpdGNoIChMZSh0KSkge1xuICAgICAgICAgIGNhc2UgMCAvKiBUeXBlT3JkZXIuTnVsbFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgY2FzZSAxIC8qIFR5cGVPcmRlci5Cb29sZWFuVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHQuYm9vbGVhblZhbHVlO1xuXG4gICAgICAgICAgY2FzZSAyIC8qIFR5cGVPcmRlci5OdW1iZXJWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gQ2UodC5pbnRlZ2VyVmFsdWUgfHwgdC5kb3VibGVWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDMgLyogVHlwZU9yZGVyLlRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXAodC50aW1lc3RhbXBWYWx1ZSk7XG5cbiAgICAgICAgICBjYXNlIDQgLyogVHlwZU9yZGVyLlNlcnZlclRpbWVzdGFtcFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTZXJ2ZXJUaW1lc3RhbXAodCwgZSk7XG5cbiAgICAgICAgICBjYXNlIDUgLyogVHlwZU9yZGVyLlN0cmluZ1ZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0LnN0cmluZ1ZhbHVlO1xuXG4gICAgICAgICAgY2FzZSA2IC8qIFR5cGVPcmRlci5CbG9iVmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJ5dGVzKHhlKHQuYnl0ZXNWYWx1ZSkpO1xuXG4gICAgICAgICAgY2FzZSA3IC8qIFR5cGVPcmRlci5SZWZWYWx1ZSAqLyA6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmVmZXJlbmNlKHQucmVmZXJlbmNlVmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSA4IC8qIFR5cGVPcmRlci5HZW9Qb2ludFZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRHZW9Qb2ludCh0Lmdlb1BvaW50VmFsdWUpO1xuXG4gICAgICAgICAgY2FzZSA5IC8qIFR5cGVPcmRlci5BcnJheVZhbHVlICovIDpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBcnJheSh0LmFycmF5VmFsdWUsIGUpO1xuXG4gICAgICAgICAgY2FzZSAxMCAvKiBUeXBlT3JkZXIuT2JqZWN0VmFsdWUgKi8gOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9iamVjdCh0Lm1hcFZhbHVlLCBlKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBPKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udmVydE9iamVjdCh0LCBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3RNYXAodC5maWVsZHMsIGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi8gICAgY29udmVydE9iamVjdE1hcCh0LCBlID0gXCJub25lXCIpIHtcbiAgICAgICAgY29uc3QgbiA9IHt9O1xuICAgICAgICByZXR1cm4gZ2UodCwgKCh0LCBzKSA9PiB7XG4gICAgICAgICAgICBuW3RdID0gdGhpcy5jb252ZXJ0VmFsdWUocywgZSk7XG4gICAgICAgIH0pKSwgbjtcbiAgICB9XG4gICAgY29udmVydEdlb1BvaW50KHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqaChDZSh0LmxhdGl0dWRlKSwgQ2UodC5sb25naXR1ZGUpKTtcbiAgICB9XG4gICAgY29udmVydEFycmF5KHQsIGUpIHtcbiAgICAgICAgcmV0dXJuICh0LnZhbHVlcyB8fCBbXSkubWFwKCh0ID0+IHRoaXMuY29udmVydFZhbHVlKHQsIGUpKSk7XG4gICAgfVxuICAgIGNvbnZlcnRTZXJ2ZXJUaW1lc3RhbXAodCwgZSkge1xuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIFwicHJldmlvdXNcIjpcbiAgICAgICAgICAgIGNvbnN0IG4gPSBrZSh0KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IG4gPyBudWxsIDogdGhpcy5jb252ZXJ0VmFsdWUobiwgZSk7XG5cbiAgICAgICAgICBjYXNlIFwiZXN0aW1hdGVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXAoTWUodCkpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnZlcnRUaW1lc3RhbXAodCkge1xuICAgICAgICBjb25zdCBlID0gRGUodCk7XG4gICAgICAgIHJldHVybiBuZXcgaXQoZS5zZWNvbmRzLCBlLm5hbm9zKTtcbiAgICB9XG4gICAgY29udmVydERvY3VtZW50S2V5KHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IHV0LmZyb21TdHJpbmcodCk7XG4gICAgICAgIEYodXIobikpO1xuICAgICAgICBjb25zdCBzID0gbmV3IE9lKG4uZ2V0KDEpLCBuLmdldCgzKSksIGkgPSBuZXcgaHQobi5wb3BGaXJzdCg1KSk7XG4gICAgICAgIHJldHVybiBzLmlzRXF1YWwoZSkgfHwgXG4gICAgICAgIC8vIFRPRE8oYi82NDEzMDIwMik6IFNvbWVob3cgc3VwcG9ydCBmb3JlaWduIHJlZmVyZW5jZXMuXG4gICAgICAgIGsoYERvY3VtZW50ICR7aX0gY29udGFpbnMgYSBkb2N1bWVudCByZWZlcmVuY2Ugd2l0aGluIGEgZGlmZmVyZW50IGRhdGFiYXNlICgke3MucHJvamVjdElkfS8ke3MuZGF0YWJhc2V9KSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBJdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UgKCR7ZS5wcm9qZWN0SWR9LyR7ZS5kYXRhYmFzZX0pIGluc3RlYWQuYCksIFxuICAgICAgICBpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ29udmVydHMgY3VzdG9tIG1vZGVsIG9iamVjdCBvZiB0eXBlIFQgaW50byBgRG9jdW1lbnREYXRhYCBieSBhcHBseWluZyB0aGVcbiAqIGNvbnZlcnRlciBpZiBpdCBleGlzdHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gY29udmVydGluZyB1c2VyIG9iamVjdHMgdG8gYERvY3VtZW50RGF0YWBcbiAqIGJlY2F1c2Ugd2Ugd2FudCB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgaWZcbiAqIHRoZWlyIGBzZXQoKWAgb3IgZmFpbHMgZHVlIHRvIGludmFsaWQgZGF0YSBvcmlnaW5hdGluZyBmcm9tIGEgYHRvRmlyZXN0b3JlKClgXG4gKiBjYWxsLlxuICovIGZ1bmN0aW9uIEhsKHQsIGUsIG4pIHtcbiAgICBsZXQgcztcbiAgICAvLyBDYXN0IHRvIGBhbnlgIGluIG9yZGVyIHRvIHNhdGlzZnkgdGhlIHVuaW9uIHR5cGUgY29uc3RyYWludCBvblxuICAgIC8vIHRvRmlyZXN0b3JlKCkuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gcyA9IHQgPyBuICYmIChuLm1lcmdlIHx8IG4ubWVyZ2VGaWVsZHMpID8gdC50b0ZpcmVzdG9yZShlLCBuKSA6IHQudG9GaXJlc3RvcmUoZSkgOiBlLCBcbiAgICBzO1xufVxuXG5jbGFzcyBKbCBleHRlbmRzIFdsIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHN1cGVyKCksIHRoaXMuZmlyZXN0b3JlID0gdDtcbiAgICB9XG4gICAgY29udmVydEJ5dGVzKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaCh0KTtcbiAgICB9XG4gICAgY29udmVydFJlZmVyZW5jZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmNvbnZlcnREb2N1bWVudEtleSh0LCB0aGlzLmZpcmVzdG9yZS5fZGF0YWJhc2VJZCk7XG4gICAgICAgIHJldHVybiBuZXcgZmgodGhpcy5maXJlc3RvcmUsIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCwgZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDcmVhdGUgYW4gQWdncmVnYXRlRmllbGQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgc3VtIG9mXG4gKiBhIHNwZWNpZmllZCBmaWVsZCBvdmVyIGEgcmFuZ2Ugb2YgZG9jdW1lbnRzIGluIHRoZSByZXN1bHQgc2V0IG9mIGEgcXVlcnkuXG4gKiBAcGFyYW0gZmllbGQgU3BlY2lmaWVzIHRoZSBmaWVsZCB0byBzdW0gYWNyb3NzIHRoZSByZXN1bHQgc2V0LlxuICogQGludGVybmFsIFRPRE8gKHN1bS9hdmcpIHJlbW92ZSB3aGVuIHB1YmxpY1xuICovIGZ1bmN0aW9uIFlsKHQpIHtcbiAgICByZXR1cm4gbmV3IExoKFwic3VtXCIsIHdsKFwic3VtXCIsIHQpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gQWdncmVnYXRlRmllbGQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgYXZlcmFnZSBvZlxuICogYSBzcGVjaWZpZWQgZmllbGQgb3ZlciBhIHJhbmdlIG9mIGRvY3VtZW50cyBpbiB0aGUgcmVzdWx0IHNldCBvZiBhIHF1ZXJ5LlxuICogQHBhcmFtIGZpZWxkIFNwZWNpZmllcyB0aGUgZmllbGQgdG8gYXZlcmFnZSBhY3Jvc3MgdGhlIHJlc3VsdCBzZXQuXG4gKiBAaW50ZXJuYWwgVE9ETyAoc3VtL2F2ZykgcmVtb3ZlIHdoZW4gcHVibGljXG4gKi8gZnVuY3Rpb24gWGwodCkge1xuICAgIHJldHVybiBuZXcgTGgoXCJhdmdcIiwgd2woXCJhdmVyYWdlXCIsIHQpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gQWdncmVnYXRlRmllbGQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgY291bnQgb2ZcbiAqIGRvY3VtZW50cyBpbiB0aGUgcmVzdWx0IHNldCBvZiBhIHF1ZXJ5LlxuICogQGludGVybmFsIFRPRE8gKHN1bS9hdmcpIHJlbW92ZSB3aGVuIHB1YmxpY1xuICovIGZ1bmN0aW9uIFpsKCkge1xuICAgIHJldHVybiBuZXcgTGgoXCJjb3VudFwiKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gJ0FnZ3JlZ2F0ZUZpZWxkYCBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSBsZWZ0IENvbXBhcmUgdGhpcyBBZ2dyZWdhdGVGaWVsZCB0byB0aGUgYHJpZ2h0YC5cbiAqIEBwYXJhbSByaWdodCBDb21wYXJlIHRoaXMgQWdncmVnYXRlRmllbGQgdG8gdGhlIGBsZWZ0YC5cbiAqIEBpbnRlcm5hbCBUT0RPIChzdW0vYXZnKSByZW1vdmUgd2hlbiBwdWJsaWNcbiAqLyBmdW5jdGlvbiB0Zih0LCBlKSB7XG4gICAgdmFyIG4sIHM7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBMaCAmJiBlIGluc3RhbmNlb2YgTGggJiYgdC5fYWdncmVnYXRlVHlwZSA9PT0gZS5fYWdncmVnYXRlVHlwZSAmJiAobnVsbCA9PT0gKG4gPSB0Ll9pbnRlcm5hbEZpZWxkUGF0aCkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi5jYW5vbmljYWxTdHJpbmcoKSkgPT09IChudWxsID09PSAocyA9IGUuX2ludGVybmFsRmllbGRQYXRoKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLmNhbm9uaWNhbFN0cmluZygpKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gYEFnZ3JlZ2F0ZVF1ZXJ5U25hcHNob3RgIGluc3RhbmNlcyBmb3IgZXF1YWxpdHkuXG4gKlxuICogVHdvIGBBZ2dyZWdhdGVRdWVyeVNuYXBzaG90YCBpbnN0YW5jZXMgYXJlIGNvbnNpZGVyZWQgXCJlcXVhbFwiIGlmIHRoZXkgaGF2ZVxuICogdW5kZXJseWluZyBxdWVyaWVzIHRoYXQgY29tcGFyZSBlcXVhbCwgYW5kIHRoZSBzYW1lIGRhdGEuXG4gKlxuICogQHBhcmFtIGxlZnQgLSBUaGUgZmlyc3QgYEFnZ3JlZ2F0ZVF1ZXJ5U25hcHNob3RgIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gcmlnaHQgLSBUaGUgc2Vjb25kIGBBZ2dyZWdhdGVRdWVyeVNuYXBzaG90YCB0byBjb21wYXJlLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgXCJlcXVhbFwiLCBhcyBkZWZpbmVkIGFib3ZlLCBvciBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKi8gZnVuY3Rpb24gZWYodCwgZSkge1xuICAgIHJldHVybiBwaCh0LnF1ZXJ5LCBlLnF1ZXJ5KSAmJiBkZWVwRXF1YWwodC5kYXRhKCksIGUuZGF0YSgpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYSBzbmFwc2hvdCwgZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgdGhlIHNuYXBzaG90LlxuICovIGNsYXNzIG5mIHtcbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5oYXNQZW5kaW5nV3JpdGVzID0gdCwgdGhpcy5mcm9tQ2FjaGUgPSBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBgU25hcHNob3RNZXRhZGF0YWAgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBgU25hcHNob3RNZXRhZGF0YWAgaXMgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG9uZS5cbiAgICAgKi8gICAgaXNFcXVhbCh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BlbmRpbmdXcml0ZXMgPT09IHQuaGFzUGVuZGluZ1dyaXRlcyAmJiB0aGlzLmZyb21DYWNoZSA9PT0gdC5mcm9tQ2FjaGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYERvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91ciBGaXJlc3RvcmVcbiAqIGRhdGFiYXNlLiBUaGUgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0b1xuICogZ2V0IGEgc3BlY2lmaWMgZmllbGQuXG4gKlxuICogRm9yIGEgYERvY3VtZW50U25hcHNob3RgIHRoYXQgcG9pbnRzIHRvIGEgbm9uLWV4aXN0aW5nIGRvY3VtZW50LCBhbnkgZGF0YVxuICogYWNjZXNzIHdpbGwgcmV0dXJuICd1bmRlZmluZWQnLiBZb3UgY2FuIHVzZSB0aGUgYGV4aXN0cygpYCBtZXRob2QgdG9cbiAqIGV4cGxpY2l0bHkgdmVyaWZ5IGEgZG9jdW1lbnQncyBleGlzdGVuY2UuXG4gKi8gY2xhc3Mgc2YgZXh0ZW5kcyBwbCB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgcHJvdGVjdGVkICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcywgaSwgcikge1xuICAgICAgICBzdXBlcih0LCBlLCBuLCBzLCByKSwgdGhpcy5fZmlyZXN0b3JlID0gdCwgdGhpcy5fZmlyZXN0b3JlSW1wbCA9IHQsIHRoaXMubWV0YWRhdGEgPSBpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGV4aXN0cy4gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgZXhpc3RzLlxuICAgICAqLyAgICBleGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5leGlzdHMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IGFzIGFuIGBPYmplY3RgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBgc2VydmVyVGltZXN0YW1wKClgIHZhbHVlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuXG4gICAgICogc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYG51bGxgLiBZb3UgY2FuIG92ZXJyaWRlXG4gICAgICogdGhpcyBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IGRhdGEgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgKiB0aGUgc25hcHNob3QgKGZvciBleGFtcGxlIHRoZSBkZXNpcmVkIGJlaGF2aW9yIGZvciBzZXJ2ZXIgdGltZXN0YW1wcyB0aGF0XG4gICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0IHRvIHRoZWlyIGZpbmFsIHZhbHVlKS5cbiAgICAgKiBAcmV0dXJucyBBbiBgT2JqZWN0YCBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIGRvY3VtZW50IG9yIGB1bmRlZmluZWRgIGlmXG4gICAgICogdGhlIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3QuXG4gICAgICovICAgIGRhdGEodCA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnZlcnRlcikge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGNvbnZlcnRlciBhbmQgY3JlYXRlIGEgbmV3IERvY3VtZW50U25hcHNob3RcbiAgICAgICAgICAgICAgICAvLyBpZiBhIGNvbnZlcnRlciBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IHJmKHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHRoaXMuX2tleSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMubWV0YWRhdGEsIFxuICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlcj0gKi8gbnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlci5mcm9tRmlyZXN0b3JlKGUsIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJEYXRhV3JpdGVyLmNvbnZlcnRWYWx1ZSh0aGlzLl9kb2N1bWVudC5kYXRhLnZhbHVlLCB0LnNlcnZlclRpbWVzdGFtcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGBmaWVsZFBhdGhgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZVxuICAgICAqIGRvY3VtZW50IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBhIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdGhhdCBoYXMgbm90IHlldCBiZWVuIHNldCB0b1xuICAgICAqIGl0cyBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFzIGBudWxsYC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5XG4gICAgICogcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWVsZFBhdGggLSBUaGUgcGF0aCAoZm9yIGV4YW1wbGUgJ2Zvbycgb3IgJ2Zvby5iYXInKSB0byBhIHNwZWNpZmljXG4gICAgICogZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25zIG9iamVjdCB0byBjb25maWd1cmUgaG93IHRoZSBmaWVsZCBpcyByZXRyaWV2ZWRcbiAgICAgKiBmcm9tIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzXG4gICAgICogdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIFRoZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgZmllbGQgbG9jYXRpb24gb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2hcbiAgICAgKiBmaWVsZCBleGlzdHMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIC8vIFdlIGFyZSB1c2luZyBgYW55YCBoZXJlIHRvIGF2b2lkIGFuIGV4cGxpY2l0IGNhc3QgYnkgb3VyIHVzZXJzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0KHQsIGUgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5kYXRhLmZpZWxkKFRsKFwiRG9jdW1lbnRTbmFwc2hvdC5nZXRcIiwgdCkpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IG4pIHJldHVybiB0aGlzLl91c2VyRGF0YVdyaXRlci5jb252ZXJ0VmFsdWUobiwgZS5zZXJ2ZXJUaW1lc3RhbXBzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGNvbnRhaW5zIGRhdGEgcmVhZCBmcm9tIGEgZG9jdW1lbnQgaW4geW91clxuICogRmlyZXN0b3JlIGRhdGFiYXNlIGFzIHBhcnQgb2YgYSBxdWVyeS4gVGhlIGRvY3VtZW50IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3RcbiAqIGFuZCBpdHMgZGF0YSBjYW4gYmUgZXh0cmFjdGVkIHdpdGggYC5kYXRhKClgIG9yIGAuZ2V0KDxmaWVsZD4pYCB0byBnZXQgYVxuICogc3BlY2lmaWMgZmllbGQuXG4gKlxuICogQSBgUXVlcnlEb2N1bWVudFNuYXBzaG90YCBvZmZlcnMgdGhlIHNhbWUgQVBJIHN1cmZhY2UgYXMgYVxuICogYERvY3VtZW50U25hcHNob3RgLiBTaW5jZSBxdWVyeSByZXN1bHRzIGNvbnRhaW4gb25seSBleGlzdGluZyBkb2N1bWVudHMsIHRoZVxuICogYGV4aXN0c2AgcHJvcGVydHkgd2lsbCBhbHdheXMgYmUgdHJ1ZSBhbmQgYGRhdGEoKWAgd2lsbCBuZXZlciByZXR1cm5cbiAqICd1bmRlZmluZWQnLlxuICovIGNsYXNzIHJmIGV4dGVuZHMgc2Yge1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZmllbGRzIGluIHRoZSBkb2N1bWVudCBhcyBhbiBgT2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQsIGBzZXJ2ZXJUaW1lc3RhbXAoKWAgdmFsdWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW5cbiAgICAgKiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhcyBgbnVsbGAuIFlvdSBjYW4gb3ZlcnJpZGVcbiAgICAgKiB0aGlzIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbnMgb2JqZWN0IHRvIGNvbmZpZ3VyZSBob3cgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAqIHRoZSBzbmFwc2hvdCAoZm9yIGV4YW1wbGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIHNlcnZlciB0aW1lc3RhbXBzIHRoYXRcbiAgICAgKiBoYXZlIG5vdCB5ZXQgYmVlbiBzZXQgdG8gdGhlaXIgZmluYWwgdmFsdWUpLlxuICAgICAqIEByZXR1cm5zIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgZGF0YSh0ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRhdGEodCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYFF1ZXJ5U25hcHNob3RgIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBgRG9jdW1lbnRTbmFwc2hvdGAgb2JqZWN0c1xuICogcmVwcmVzZW50aW5nIHRoZSByZXN1bHRzIG9mIGEgcXVlcnkuIFRoZSBkb2N1bWVudHMgY2FuIGJlIGFjY2Vzc2VkIGFzIGFuXG4gKiBhcnJheSB2aWEgdGhlIGBkb2NzYCBwcm9wZXJ0eSBvciBlbnVtZXJhdGVkIHVzaW5nIHRoZSBgZm9yRWFjaGAgbWV0aG9kLiBUaGVcbiAqIG51bWJlciBvZiBkb2N1bWVudHMgY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBgZW1wdHlgIGFuZCBgc2l6ZWBcbiAqIHByb3BlcnRpZXMuXG4gKi8gY2xhc3Mgb2Yge1xuICAgIC8qKiBAaGlkZWNvbnN0cnVjdG9yICovXG4gICAgY29uc3RydWN0b3IodCwgZSwgbiwgcykge1xuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSB0LCB0aGlzLl91c2VyRGF0YVdyaXRlciA9IGUsIHRoaXMuX3NuYXBzaG90ID0gcywgdGhpcy5tZXRhZGF0YSA9IG5ldyBuZihzLmhhc1BlbmRpbmdXcml0ZXMsIHMuZnJvbUNhY2hlKSwgXG4gICAgICAgIHRoaXMucXVlcnkgPSBuO1xuICAgIH1cbiAgICAvKiogQW4gYXJyYXkgb2YgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIGBRdWVyeVNuYXBzaG90YC4gKi8gICAgZ2V0IGRvY3MoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yRWFjaCgoZSA9PiB0LnB1c2goZSkpKSwgdDtcbiAgICB9XG4gICAgLyoqIFRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc25hcHNob3QuZG9jcy5zaXplO1xuICAgIH1cbiAgICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gZG9jdW1lbnRzIGluIHRoZSBgUXVlcnlTbmFwc2hvdGAuICovICAgIGdldCBlbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW51bWVyYXRlcyBhbGwgb2YgdGhlIGRvY3VtZW50cyBpbiB0aGUgYFF1ZXJ5U25hcHNob3RgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2l0aCBhIGBRdWVyeURvY3VtZW50U25hcHNob3RgIGZvclxuICAgICAqIGVhY2ggZG9jdW1lbnQgaW4gdGhlIHNuYXBzaG90LlxuICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGB0aGlzYCBiaW5kaW5nIGZvciB0aGUgY2FsbGJhY2suXG4gICAgICovICAgIGZvckVhY2godCwgZSkge1xuICAgICAgICB0aGlzLl9zbmFwc2hvdC5kb2NzLmZvckVhY2goKG4gPT4ge1xuICAgICAgICAgICAgdC5jYWxsKGUsIG5ldyByZih0aGlzLl9maXJlc3RvcmUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCBuLmtleSwgbiwgbmV3IG5mKHRoaXMuX3NuYXBzaG90Lm11dGF0ZWRLZXlzLmhhcyhuLmtleSksIHRoaXMuX3NuYXBzaG90LmZyb21DYWNoZSksIHRoaXMucXVlcnkuY29udmVydGVyKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZG9jdW1lbnRzIGNoYW5nZXMgc2luY2UgdGhlIGxhc3Qgc25hcHNob3QuIElmIHRoaXNcbiAgICAgKiBpcyB0aGUgZmlyc3Qgc25hcHNob3QsIGFsbCBkb2N1bWVudHMgd2lsbCBiZSBpbiB0aGUgbGlzdCBhcyAnYWRkZWQnXG4gICAgICogY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYFNuYXBzaG90TGlzdGVuT3B0aW9uc2AgdGhhdCBjb250cm9sIHdoZXRoZXIgbWV0YWRhdGEtb25seVxuICAgICAqIGNoYW5nZXMgKGkuZS4gb25seSBgRG9jdW1lbnRTbmFwc2hvdC5tZXRhZGF0YWAgY2hhbmdlZCkgc2hvdWxkIHRyaWdnZXJcbiAgICAgKiBzbmFwc2hvdCBldmVudHMuXG4gICAgICovICAgIGRvY0NoYW5nZXModCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGUgPSAhIXQuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlcztcbiAgICAgICAgaWYgKGUgJiYgdGhpcy5fc25hcHNob3QuZXhjbHVkZXNNZXRhZGF0YUNoYW5nZXMpIHRocm93IG5ldyBVKHEuSU5WQUxJRF9BUkdVTUVOVCwgXCJUbyBpbmNsdWRlIG1ldGFkYXRhIGNoYW5nZXMgd2l0aCB5b3VyIGRvY3VtZW50IGNoYW5nZXMsIHlvdSBtdXN0IGFsc28gcGFzcyB7IGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6dHJ1ZSB9IHRvIG9uU25hcHNob3QoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRDaGFuZ2VzICYmIHRoaXMuX2NhY2hlZENoYW5nZXNJbmNsdWRlTWV0YWRhdGFDaGFuZ2VzID09PSBlIHx8ICh0aGlzLl9jYWNoZWRDaGFuZ2VzID0gXG4gICAgICAgIC8qKiBDYWxjdWxhdGVzIHRoZSBhcnJheSBvZiBgRG9jdW1lbnRDaGFuZ2VgcyBmb3IgYSBnaXZlbiBgVmlld1NuYXBzaG90YC4gKi9cbiAgICAgICAgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3NuYXBzaG90Lm9sZERvY3MuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiB0Ll9zbmFwc2hvdC5kb2NDaGFuZ2VzLm1hcCgobiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgcmYodC5fZmlyZXN0b3JlLCB0Ll91c2VyRGF0YVdyaXRlciwgbi5kb2Mua2V5LCBuLmRvYywgbmV3IG5mKHQuX3NuYXBzaG90Lm11dGF0ZWRLZXlzLmhhcyhuLmRvYy5rZXkpLCB0Ll9zbmFwc2hvdC5mcm9tQ2FjaGUpLCB0LnF1ZXJ5LmNvbnZlcnRlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRvYywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhZGRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkSW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5kZXg6IGUrK1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBBIGBEb2N1bWVudFNldGAgdGhhdCBpcyB1cGRhdGVkIGluY3JlbWVudGFsbHkgYXMgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB1c2VcbiAgICAgICAgICAgICAgICAvLyB0byBsb29rdXAgdGhlIGluZGV4IG9mIGEgZG9jdW1lbnQuXG4gICAgICAgICAgICAgICAgbGV0IG4gPSB0Ll9zbmFwc2hvdC5vbGREb2NzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0Ll9zbmFwc2hvdC5kb2NDaGFuZ2VzLmZpbHRlcigodCA9PiBlIHx8IDMgLyogQ2hhbmdlVHlwZS5NZXRhZGF0YSAqLyAhPT0gdC50eXBlKSkubWFwKChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyByZih0Ll9maXJlc3RvcmUsIHQuX3VzZXJEYXRhV3JpdGVyLCBlLmRvYy5rZXksIGUuZG9jLCBuZXcgbmYodC5fc25hcHNob3QubXV0YXRlZEtleXMuaGFzKGUuZG9jLmtleSksIHQuX3NuYXBzaG90LmZyb21DYWNoZSksIHQucXVlcnkuY29udmVydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAtMSwgciA9IC0xO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBDaGFuZ2VUeXBlLkFkZGVkICovICE9PSBlLnR5cGUgJiYgKGkgPSBuLmluZGV4T2YoZS5kb2Mua2V5KSwgbiA9IG4uZGVsZXRlKGUuZG9jLmtleSkpLCBcbiAgICAgICAgICAgICAgICAgICAgMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gIT09IGUudHlwZSAmJiAobiA9IG4uYWRkKGUuZG9jKSwgciA9IG4uaW5kZXhPZihlLmRvYy5rZXkpKSwgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHVmKGUudHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2M6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRJbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZGV4OiByXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHRoaXMsIGUpLCB0aGlzLl9jYWNoZWRDaGFuZ2VzSW5jbHVkZU1ldGFkYXRhQ2hhbmdlcyA9IGUpLCB0aGlzLl9jYWNoZWRDaGFuZ2VzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdWYodCkge1xuICAgIHN3aXRjaCAodCkge1xuICAgICAgY2FzZSAwIC8qIENoYW5nZVR5cGUuQWRkZWQgKi8gOlxuICAgICAgICByZXR1cm4gXCJhZGRlZFwiO1xuXG4gICAgICBjYXNlIDIgLyogQ2hhbmdlVHlwZS5Nb2RpZmllZCAqLyA6XG4gICAgICBjYXNlIDMgLyogQ2hhbmdlVHlwZS5NZXRhZGF0YSAqLyA6XG4gICAgICAgIHJldHVybiBcIm1vZGlmaWVkXCI7XG5cbiAgICAgIGNhc2UgMSAvKiBDaGFuZ2VUeXBlLlJlbW92ZWQgKi8gOlxuICAgICAgICByZXR1cm4gXCJyZW1vdmVkXCI7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPKCk7XG4gICAgfVxufVxuXG4vLyBUT0RPKGZpcmVzdG9yZWV4cCk6IEFkZCB0ZXN0cyBmb3Igc25hcHNob3RFcXVhbCB3aXRoIGRpZmZlcmVudCBzbmFwc2hvdFxuLy8gbWV0YWRhdGFcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBzbmFwc2hvdHMgYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBsZWZ0IC0gQSBzbmFwc2hvdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHJpZ2h0IC0gQSBzbmFwc2hvdCB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc25hcHNob3RzIGFyZSBlcXVhbC5cbiAqLyBmdW5jdGlvbiBjZih0LCBlKSB7XG4gICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBzZiAmJiBlIGluc3RhbmNlb2Ygc2YgPyB0Ll9maXJlc3RvcmUgPT09IGUuX2ZpcmVzdG9yZSAmJiB0Ll9rZXkuaXNFcXVhbChlLl9rZXkpICYmIChudWxsID09PSB0Ll9kb2N1bWVudCA/IG51bGwgPT09IGUuX2RvY3VtZW50IDogdC5fZG9jdW1lbnQuaXNFcXVhbChlLl9kb2N1bWVudCkpICYmIHQuX2NvbnZlcnRlciA9PT0gZS5fY29udmVydGVyIDogdCBpbnN0YW5jZW9mIG9mICYmIGUgaW5zdGFuY2VvZiBvZiAmJiAodC5fZmlyZXN0b3JlID09PSBlLl9maXJlc3RvcmUgJiYgcGgodC5xdWVyeSwgZS5xdWVyeSkgJiYgdC5tZXRhZGF0YS5pc0VxdWFsKGUubWV0YWRhdGEpICYmIHQuX3NuYXBzaG90LmlzRXF1YWwoZS5fc25hcHNob3QpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYC5cbiAqXG4gKiBOb3RlOiBgZ2V0RG9jKClgIGF0dGVtcHRzIHRvIHByb3ZpZGUgdXAtdG8tZGF0ZSBkYXRhIHdoZW4gcG9zc2libGUgYnkgd2FpdGluZ1xuICogZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBidXQgaXQgbWF5IHJldHVybiBjYWNoZWQgZGF0YSBvciBmYWlsIGlmIHlvdSBhcmVcbiAqIG9mZmxpbmUgYW5kIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIHJlYWNoZWQuIFRvIHNwZWNpZnkgdGhpcyBiZWhhdmlvciwgaW52b2tlXG4gKiB7QGxpbmsgZ2V0RG9jRnJvbUNhY2hlfSBvciB7QGxpbmsgZ2V0RG9jRnJvbVNlcnZlcn0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2Ugb2YgdGhlIGRvY3VtZW50IHRvIGZldGNoLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRTbmFwc2hvdGAgY29udGFpbmluZyB0aGVcbiAqIGN1cnJlbnQgZG9jdW1lbnQgY29udGVudHMuXG4gKi8gZnVuY3Rpb24gYWYodCkge1xuICAgIHQgPSB1aCh0LCBmaCk7XG4gICAgY29uc3QgZSA9IHVoKHQuZmlyZXN0b3JlLCB2aCk7XG4gICAgcmV0dXJuIHphKGJoKGUpLCB0Ll9rZXkpLnRoZW4oKG4gPT4gQWYoZSwgdCwgbikpKTtcbn1cblxuY2xhc3MgaGYgZXh0ZW5kcyBXbCB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBzdXBlcigpLCB0aGlzLmZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIGNvbnZlcnRCeXRlcyh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWgodCk7XG4gICAgfVxuICAgIGNvbnZlcnRSZWZlcmVuY2UodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb252ZXJ0RG9jdW1lbnRLZXkodCwgdGhpcy5maXJlc3RvcmUuX2RhdGFiYXNlSWQpO1xuICAgICAgICByZXR1cm4gbmV3IGZoKHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwsIGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhpcyBgRG9jdW1lbnRSZWZlcmVuY2VgIGZyb20gY2FjaGUuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBkb2N1bWVudCBpcyBub3QgY3VycmVudGx5IGNhY2hlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCByZXNvbHZlZCB3aXRoIGEgYERvY3VtZW50U25hcHNob3RgIGNvbnRhaW5pbmcgdGhlXG4gKiBjdXJyZW50IGRvY3VtZW50IGNvbnRlbnRzLlxuICovIGZ1bmN0aW9uIGxmKHQpIHtcbiAgICB0ID0gdWgodCwgZmgpO1xuICAgIGNvbnN0IGUgPSB1aCh0LmZpcmVzdG9yZSwgdmgpLCBuID0gYmgoZSksIHMgPSBuZXcgaGYoZSk7XG4gICAgcmV0dXJuIGphKG4sIHQuX2tleSkudGhlbigobiA9PiBuZXcgc2YoZSwgcywgdC5fa2V5LCBuLCBuZXcgbmYobnVsbCAhPT0gbiAmJiBuLmhhc0xvY2FsTXV0YXRpb25zLCBcbiAgICAvKiBmcm9tQ2FjaGU9ICovICEwKSwgdC5jb252ZXJ0ZXIpKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoaXMgYERvY3VtZW50UmVmZXJlbmNlYCBmcm9tIHRoZSBzZXJ2ZXIuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBuZXR3b3JrIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgcmVzb2x2ZWQgd2l0aCBhIGBEb2N1bWVudFNuYXBzaG90YCBjb250YWluaW5nIHRoZVxuICogY3VycmVudCBkb2N1bWVudCBjb250ZW50cy5cbiAqLyBmdW5jdGlvbiBmZih0KSB7XG4gICAgdCA9IHVoKHQsIGZoKTtcbiAgICBjb25zdCBlID0gdWgodC5maXJlc3RvcmUsIHZoKTtcbiAgICByZXR1cm4gemEoYmgoZSksIHQuX2tleSwge1xuICAgICAgICBzb3VyY2U6IFwic2VydmVyXCJcbiAgICB9KS50aGVuKChuID0+IEFmKGUsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgLlxuICpcbiAqIE5vdGU6IGBnZXREb2NzKClgIGF0dGVtcHRzIHRvIHByb3ZpZGUgdXAtdG8tZGF0ZSBkYXRhIHdoZW4gcG9zc2libGUgYnlcbiAqIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBidXQgaXQgbWF5IHJldHVybiBjYWNoZWQgZGF0YSBvciBmYWlsIGlmXG4gKiB5b3UgYXJlIG9mZmxpbmUgYW5kIHRoZSBzZXJ2ZXIgY2Fubm90IGJlIHJlYWNoZWQuIFRvIHNwZWNpZnkgdGhpcyBiZWhhdmlvcixcbiAqIGludm9rZSB7QGxpbmsgZ2V0RG9jc0Zyb21DYWNoZX0gb3Ige0BsaW5rIGdldERvY3NGcm9tU2VydmVyfS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gZGYodCkge1xuICAgIHQgPSB1aCh0LCBkaCk7XG4gICAgY29uc3QgZSA9IHVoKHQuZmlyZXN0b3JlLCB2aCksIG4gPSBiaChlKSwgcyA9IG5ldyBoZihlKTtcbiAgICByZXR1cm4gRWwodC5fcXVlcnkpLCBIYShuLCB0Ll9xdWVyeSkudGhlbigobiA9PiBuZXcgb2YoZSwgcywgdCwgbikpKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMgYXMgYSBgUXVlcnlTbmFwc2hvdGAgZnJvbSBjYWNoZS5cbiAqIFJldHVybnMgYW4gZW1wdHkgcmVzdWx0IHNldCBpZiBubyBkb2N1bWVudHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGFyZSBjdXJyZW50bHlcbiAqIGNhY2hlZC5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gd2YodCkge1xuICAgIHQgPSB1aCh0LCBkaCk7XG4gICAgY29uc3QgZSA9IHVoKHQuZmlyZXN0b3JlLCB2aCksIG4gPSBiaChlKSwgcyA9IG5ldyBoZihlKTtcbiAgICByZXR1cm4gV2EobiwgdC5fcXVlcnkpLnRoZW4oKG4gPT4gbmV3IG9mKGUsIHMsIHQsIG4pKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGEgYFF1ZXJ5U25hcHNob3RgIGZyb20gdGhlXG4gKiBzZXJ2ZXIuIFJldHVybnMgYW4gZXJyb3IgaWYgdGhlIG5ldHdvcmsgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkuXG4gKi8gZnVuY3Rpb24gX2YodCkge1xuICAgIHQgPSB1aCh0LCBkaCk7XG4gICAgY29uc3QgZSA9IHVoKHQuZmlyZXN0b3JlLCB2aCksIG4gPSBiaChlKSwgcyA9IG5ldyBoZihlKTtcbiAgICByZXR1cm4gSGEobiwgdC5fcXVlcnksIHtcbiAgICAgICAgc291cmNlOiBcInNlcnZlclwiXG4gICAgfSkudGhlbigobiA9PiBuZXcgb2YoZSwgcywgdCwgbikpKTtcbn1cblxuZnVuY3Rpb24gbWYodCwgZSwgbikge1xuICAgIHQgPSB1aCh0LCBmaCk7XG4gICAgY29uc3QgcyA9IHVoKHQuZmlyZXN0b3JlLCB2aCksIGkgPSBIbCh0LmNvbnZlcnRlciwgZSwgbik7XG4gICAgcmV0dXJuIEVmKHMsIFsgdGwoWmgocyksIFwic2V0RG9jXCIsIHQuX2tleSwgaSwgbnVsbCAhPT0gdC5jb252ZXJ0ZXIsIG4pLnRvTXV0YXRpb24odC5fa2V5LCBGcy5ub25lKCkpIF0pO1xufVxuXG5mdW5jdGlvbiBnZih0LCBlLCBuLCAuLi5zKSB7XG4gICAgdCA9IHVoKHQsIGZoKTtcbiAgICBjb25zdCBpID0gdWgodC5maXJlc3RvcmUsIHZoKSwgciA9IFpoKGkpO1xuICAgIGxldCBvO1xuICAgIG8gPSBcInN0cmluZ1wiID09IHR5cGVvZiAoXG4gICAgLy8gRm9yIENvbXBhdCB0eXBlcywgd2UgaGF2ZSB0byBcImV4dHJhY3RcIiB0aGUgdW5kZXJseWluZyB0eXBlcyBiZWZvcmVcbiAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgZSA9IGdldE1vZHVsYXJJbnN0YW5jZShlKSkgfHwgZSBpbnN0YW5jZW9mIEtoID8gY2wociwgXCJ1cGRhdGVEb2NcIiwgdC5fa2V5LCBlLCBuLCBzKSA6IHVsKHIsIFwidXBkYXRlRG9jXCIsIHQuX2tleSwgZSk7XG4gICAgcmV0dXJuIEVmKGksIFsgby50b011dGF0aW9uKHQuX2tleSwgRnMuZXhpc3RzKCEwKSkgXSk7XG59XG5cbi8qKlxuICogRGVsZXRlcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhlIHNwZWNpZmllZCBgRG9jdW1lbnRSZWZlcmVuY2VgLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogZGVsZXRlZCBmcm9tIHRoZSBiYWNrZW5kIChub3RlIHRoYXQgaXQgd29uJ3QgcmVzb2x2ZSB3aGlsZSB5b3UncmUgb2ZmbGluZSkuXG4gKi8gZnVuY3Rpb24geWYodCkge1xuICAgIHJldHVybiBFZih1aCh0LmZpcmVzdG9yZSwgdmgpLCBbIG5ldyBZcyh0Ll9rZXksIEZzLm5vbmUoKSkgXSk7XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGRvY3VtZW50IHRvIHNwZWNpZmllZCBgQ29sbGVjdGlvblJlZmVyZW5jZWAgd2l0aCB0aGUgZ2l2ZW4gZGF0YSxcbiAqIGFzc2lnbmluZyBpdCBhIGRvY3VtZW50IElEIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjb2xsZWN0aW9uIHRvIGFkZCB0aGlzIGRvY3VtZW50IHRvLlxuICogQHBhcmFtIGRhdGEgLSBBbiBPYmplY3QgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIG5ldyBkb2N1bWVudC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIHdpdGggYSBgRG9jdW1lbnRSZWZlcmVuY2VgIHBvaW50aW5nIHRvIHRoZVxuICogbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBhZnRlciBpdCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBiYWNrZW5kIChOb3RlIHRoYXQgaXRcbiAqIHdvbid0IHJlc29sdmUgd2hpbGUgeW91J3JlIG9mZmxpbmUpLlxuICovIGZ1bmN0aW9uIHBmKHQsIGUpIHtcbiAgICBjb25zdCBuID0gdWgodC5maXJlc3RvcmUsIHZoKSwgcyA9IGdoKHQpLCBpID0gSGwodC5jb252ZXJ0ZXIsIGUpO1xuICAgIHJldHVybiBFZihuLCBbIHRsKFpoKHQuZmlyZXN0b3JlKSwgXCJhZGREb2NcIiwgcy5fa2V5LCBpLCBudWxsICE9PSB0LmNvbnZlcnRlciwge30pLnRvTXV0YXRpb24ocy5fa2V5LCBGcy5leGlzdHMoITEpKSBdKS50aGVuKCgoKSA9PiBzKSk7XG59XG5cbmZ1bmN0aW9uIElmKHQsIC4uLmUpIHtcbiAgICB2YXIgbiwgcywgaTtcbiAgICB0ID0gZ2V0TW9kdWxhckluc3RhbmNlKHQpO1xuICAgIGxldCByID0ge1xuICAgICAgICBpbmNsdWRlTWV0YWRhdGFDaGFuZ2VzOiAhMVxuICAgIH0sIG8gPSAwO1xuICAgIFwib2JqZWN0XCIgIT0gdHlwZW9mIGVbb10gfHwgVGgoZVtvXSkgfHwgKHIgPSBlW29dLCBvKyspO1xuICAgIGNvbnN0IHUgPSB7XG4gICAgICAgIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM6IHIuaW5jbHVkZU1ldGFkYXRhQ2hhbmdlc1xuICAgIH07XG4gICAgaWYgKFRoKGVbb10pKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlW29dO1xuICAgICAgICBlW29dID0gbnVsbCA9PT0gKG4gPSB0Lm5leHQpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uYmluZCh0KSwgZVtvICsgMV0gPSBudWxsID09PSAocyA9IHQuZXJyb3IpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuYmluZCh0KSwgXG4gICAgICAgIGVbbyArIDJdID0gbnVsbCA9PT0gKGkgPSB0LmNvbXBsZXRlKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmJpbmQodCk7XG4gICAgfVxuICAgIGxldCBjLCBhLCBoO1xuICAgIGlmICh0IGluc3RhbmNlb2YgZmgpIGEgPSB1aCh0LmZpcmVzdG9yZSwgdmgpLCBoID0gR24odC5fa2V5LnBhdGgpLCBjID0ge1xuICAgICAgICBuZXh0OiBuID0+IHtcbiAgICAgICAgICAgIGVbb10gJiYgZVtvXShBZihhLCB0LCBuKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlW28gKyAxXSxcbiAgICAgICAgY29tcGxldGU6IGVbbyArIDJdXG4gICAgfTsgZWxzZSB7XG4gICAgICAgIGNvbnN0IG4gPSB1aCh0LCBkaCk7XG4gICAgICAgIGEgPSB1aChuLmZpcmVzdG9yZSwgdmgpLCBoID0gbi5fcXVlcnk7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgaGYoYSk7XG4gICAgICAgIGMgPSB7XG4gICAgICAgICAgICBuZXh0OiB0ID0+IHtcbiAgICAgICAgICAgICAgICBlW29dICYmIGVbb10obmV3IG9mKGEsIHMsIG4sIHQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZVtvICsgMV0sXG4gICAgICAgICAgICBjb21wbGV0ZTogZVtvICsgMl1cbiAgICAgICAgfSwgRWwodC5fcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbiwgcykge1xuICAgICAgICBjb25zdCBpID0gbmV3IFZhKHMpLCByID0gbmV3IE5jKGUsIGksIG4pO1xuICAgICAgICByZXR1cm4gdC5hc3luY1F1ZXVlLmVucXVldWVBbmRGb3JnZXQoKGFzeW5jICgpID0+IFZjKGF3YWl0IEthKHQpLCByKSkpLCAoKSA9PiB7XG4gICAgICAgICAgICBpLkRjKCksIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiBTYyhhd2FpdCBLYSh0KSwgcikpKTtcbiAgICAgICAgfTtcbiAgICB9KGJoKGEpLCBoLCB1LCBjKTtcbn1cblxuZnVuY3Rpb24gVGYodCwgZSkge1xuICAgIHJldHVybiBKYShiaCh0ID0gdWgodCwgdmgpKSwgVGgoZSkgPyBlIDoge1xuICAgICAgICBuZXh0OiBlXG4gICAgfSk7XG59XG5cbi8qKlxuICogTG9jYWxseSB3cml0ZXMgYG11dGF0aW9uc2Agb24gdGhlIGFzeW5jIHF1ZXVlLlxuICogQGludGVybmFsXG4gKi8gZnVuY3Rpb24gRWYodCwgZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuZXcgSztcbiAgICAgICAgcmV0dXJuIHQuYXN5bmNRdWV1ZS5lbnF1ZXVlQW5kRm9yZ2V0KChhc3luYyAoKSA9PiB6Yyhhd2FpdCBxYSh0KSwgZSwgbikpKSwgbi5wcm9taXNlO1xuICAgIH0oYmgodCksIGUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEge0BsaW5rIFZpZXdTbmFwc2hvdH0gdGhhdCBjb250YWlucyB0aGUgc2luZ2xlIGRvY3VtZW50IHNwZWNpZmllZCBieSBgcmVmYFxuICogdG8gYSB7QGxpbmsgRG9jdW1lbnRTbmFwc2hvdH0uXG4gKi8gZnVuY3Rpb24gQWYodCwgZSwgbikge1xuICAgIGNvbnN0IHMgPSBuLmRvY3MuZ2V0KGUuX2tleSksIGkgPSBuZXcgaGYodCk7XG4gICAgcmV0dXJuIG5ldyBzZih0LCBpLCBlLl9rZXksIHMsIG5ldyBuZihuLmhhc1BlbmRpbmdXcml0ZXMsIG4uZnJvbUNhY2hlKSwgZS5jb252ZXJ0ZXIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoZSByZXN1bHQgc2V0IG9mIHRoZSBnaXZlbiBxdWVyeSxcbiAqIHdpdGhvdXQgYWN0dWFsbHkgZG93bmxvYWRpbmcgdGhlIGRvY3VtZW50cy5cbiAqXG4gKiBVc2luZyB0aGlzIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBkb2N1bWVudHMgaXMgZWZmaWNpZW50IGJlY2F1c2Ugb25seSB0aGVcbiAqIGZpbmFsIGNvdW50LCBub3QgdGhlIGRvY3VtZW50cycgZGF0YSwgaXMgZG93bmxvYWRlZC4gVGhpcyBmdW5jdGlvbiBjYW4gZXZlblxuICogY291bnQgdGhlIGRvY3VtZW50cyBpZiB0aGUgcmVzdWx0IHNldCB3b3VsZCBiZSBwcm9oaWJpdGl2ZWx5IGxhcmdlIHRvXG4gKiBkb3dubG9hZCBlbnRpcmVseSAoZS5nLiB0aG91c2FuZHMgb2YgZG9jdW1lbnRzKS5cbiAqXG4gKiBUaGUgcmVzdWx0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBwcmVzZW50ZWQsIHVuYWx0ZXJlZCwgd2l0aG91dFxuICogY29uc2lkZXJpbmcgYW55IGxvY2FsIHN0YXRlLiBUaGF0IGlzLCBkb2N1bWVudHMgaW4gdGhlIGxvY2FsIGNhY2hlIGFyZSBub3RcbiAqIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgbmVpdGhlciBhcmUgbG9jYWwgbW9kaWZpY2F0aW9ucyBub3QgeWV0XG4gKiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc2VydmVyLiBQcmV2aW91c2x5LWRvd25sb2FkZWQgcmVzdWx0cywgaWYgYW55LCBhcmUgbm90XG4gKiB1c2VkOiBldmVyeSByZXF1ZXN0IHVzaW5nIHRoaXMgc291cmNlIG5lY2Vzc2FyaWx5IGludm9sdmVzIGEgcm91bmQgdHJpcCB0b1xuICogdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgd2hvc2UgcmVzdWx0IHNldCBzaXplIHRvIGNhbGN1bGF0ZS5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgY291bnQ7IHRoZSBjb3VudCBjYW4gYmVcbiAqIHJldHJpZXZlZCBmcm9tIGBzbmFwc2hvdC5kYXRhKCkuY291bnRgLCB3aGVyZSBgc25hcHNob3RgIGlzIHRoZVxuICogYEFnZ3JlZ2F0ZVF1ZXJ5U25hcHNob3RgIHRvIHdoaWNoIHRoZSByZXR1cm5lZCBQcm9taXNlIHJlc29sdmVzLlxuICovIGZ1bmN0aW9uIHZmKHQpIHtcbiAgICByZXR1cm4gUmYodCwge1xuICAgICAgICBjb3VudDogWmwoKVxuICAgIH0pO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNwZWNpZmllZCBhZ2dyZWdhdGlvbnMgb3ZlciB0aGUgZG9jdW1lbnRzIGluIHRoZSByZXN1bHRcbiAqIHNldCBvZiB0aGUgZ2l2ZW4gcXVlcnksIHdpdGhvdXQgYWN0dWFsbHkgZG93bmxvYWRpbmcgdGhlIGRvY3VtZW50cy5cbiAqXG4gKiBVc2luZyB0aGlzIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYWdncmVnYXRpb25zIGlzIGVmZmljaWVudCBiZWNhdXNlIG9ubHkgdGhlXG4gKiBmaW5hbCBhZ2dyZWdhdGlvbiB2YWx1ZXMsIG5vdCB0aGUgZG9jdW1lbnRzJyBkYXRhLCBpcyBkb3dubG9hZGVkLiBUaGlzXG4gKiBmdW5jdGlvbiBjYW4gZXZlbiBwZXJmb3JtIGFnZ3JlZ2F0aW9ucyBvZiB0aGUgZG9jdW1lbnRzIGlmIHRoZSByZXN1bHQgc2V0XG4gKiB3b3VsZCBiZSBwcm9oaWJpdGl2ZWx5IGxhcmdlIHRvIGRvd25sb2FkIGVudGlyZWx5IChlLmcuIHRob3VzYW5kcyBvZiBkb2N1bWVudHMpLlxuICpcbiAqIFRoZSByZXN1bHQgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGlzIHByZXNlbnRlZCwgdW5hbHRlcmVkLCB3aXRob3V0XG4gKiBjb25zaWRlcmluZyBhbnkgbG9jYWwgc3RhdGUuIFRoYXQgaXMsIGRvY3VtZW50cyBpbiB0aGUgbG9jYWwgY2FjaGUgYXJlIG5vdFxuICogdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLCBuZWl0aGVyIGFyZSBsb2NhbCBtb2RpZmljYXRpb25zIG5vdCB5ZXRcbiAqIHN5bmNocm9uaXplZCB3aXRoIHRoZSBzZXJ2ZXIuIFByZXZpb3VzbHktZG93bmxvYWRlZCByZXN1bHRzLCBpZiBhbnksIGFyZSBub3RcbiAqIHVzZWQ6IGV2ZXJ5IHJlcXVlc3QgdXNpbmcgdGhpcyBzb3VyY2UgbmVjZXNzYXJpbHkgaW52b2x2ZXMgYSByb3VuZCB0cmlwIHRvXG4gKiB0aGUgc2VydmVyLlxuICpcbiAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgd2hvc2UgcmVzdWx0IHNldCB0byBhZ2dyZWdhdGUgb3Zlci5cbiAqIEBwYXJhbSBhZ2dyZWdhdGVTcGVjIEFuIGBBZ2dyZWdhdGVTcGVjYCBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIGFnZ3JlZ2F0ZXNcbiAqIHRvIHBlcmZvcm0gb3ZlciB0aGUgcmVzdWx0IHNldC4gVGhlIEFnZ3JlZ2F0ZVNwZWMgc3BlY2lmaWVzIGFsaWFzZXMgZm9yIGVhY2hcbiAqIGFnZ3JlZ2F0ZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGFnZ3JlZ2F0ZSByZXN1bHQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWdncmVnYXRlU25hcHNob3QgPSBhd2FpdCBnZXRBZ2dyZWdhdGVGcm9tU2VydmVyKHF1ZXJ5LCB7XG4gKiAgIGNvdW50T2ZEb2NzOiBjb3VudCgpLFxuICogICB0b3RhbEhvdXJzOiBzdW0oJ2hvdXJzJyksXG4gKiAgIGF2ZXJhZ2VTY29yZTogYXZlcmFnZSgnc2NvcmUnKVxuICogfSk7XG4gKlxuICogY29uc3QgY291bnRPZkRvY3M6IG51bWJlciA9IGFnZ3JlZ2F0ZVNuYXBzaG90LmRhdGEoKS5jb3VudE9mRG9jcztcbiAqIGNvbnN0IHRvdGFsSG91cnM6IG51bWJlciA9IGFnZ3JlZ2F0ZVNuYXBzaG90LmRhdGEoKS50b3RhbEhvdXJzO1xuICogY29uc3QgYXZlcmFnZVNjb3JlOiBudW1iZXIgfCBudWxsID0gYWdncmVnYXRlU25hcHNob3QuZGF0YSgpLmF2ZXJhZ2VTY29yZTtcbiAqIGBgYFxuICogQGludGVybmFsIFRPRE8gKHN1bS9hdmcpIHJlbW92ZSB3aGVuIHB1YmxpY1xuICovIGZ1bmN0aW9uIFJmKHQsIGUpIHtcbiAgICBjb25zdCBuID0gdWgodC5maXJlc3RvcmUsIHZoKSwgcyA9IGJoKG4pLCBpID0gZnVuY3Rpb24odCwgZSkge1xuICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcyBpbiB0KSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgcykgJiYgbi5wdXNoKGUodFtzXSwgcywgdCkpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9KGUsICgodCwgZSkgPT4gbmV3IG5pKGUsIHQuX2FnZ3JlZ2F0ZVR5cGUsIHQuX2ludGVybmFsRmllbGRQYXRoKSkpO1xuICAgIC8vIFJ1biB0aGUgYWdncmVnYXRpb24gYW5kIGNvbnZlcnQgdGhlIHJlc3VsdHNcbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gbmV3IEs7XG4gICAgICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETyAoc3VtL2F2Zykgc2hvdWxkIHdlIHVwZGF0ZSB0aGlzIHRvIHVzZSB0aGUgZXZlbnQgbWFuYWdlcj9cbiAgICAgICAgICAgIC8vIEltcGxlbWVudCBhbmQgY2FsbCBleGVjdXRlQWdncmVnYXRlUXVlcnlWaWFTbmFwc2hvdExpc3RlbmVyLCBzaW1pbGFyXG4gICAgICAgICAgICAvLyB0byB0aGUgaW1wbGVtZW50YXRpb24gaW4gZmlyZXN0b3JlQ2xpZW50R2V0RG9jdW1lbnRzVmlhU25hcHNob3RMaXN0ZW5lclxuICAgICAgICAgICAgLy8gYWJvdmVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhiLzI3NzYyODM4NCk6IGNoZWNrIGBjYW5Vc2VOZXR3b3JrKClgIGFuZCBoYW5kbGUgbXVsdGktdGFiLlxuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBhd2FpdCBVYSh0KTtcbiAgICAgICAgICAgICAgICBzLnJlc29sdmUoR3UoaSwgZSwgbikpO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgIHMucmVqZWN0KHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSksIHMucHJvbWlzZTtcbiAgICB9KHMsIHQuX3F1ZXJ5LCBpKS50aGVuKChlID0+IFxuICAgIC8qKlxuICogQ29udmVydHMgdGhlIGNvcmUgYWdncmVncmF0aW9uIHJlc3VsdCB0byBhbiBgQWdncmVnYXRlUXVlcnlTbmFwc2hvdGBcbiAqIHRoYXQgY2FuIGJlIHJldHVybmVkIHRvIHRoZSBjb25zdW1lci5cbiAqIEBwYXJhbSBxdWVyeVxuICogQHBhcmFtIGFnZ3JlZ2F0ZVJlc3VsdCBDb3JlIGFnZ3JlZ2F0aW9uIHJlc3VsdFxuICogQGludGVybmFsXG4gKi9cbiAgICBmdW5jdGlvbih0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgaGYodCk7XG4gICAgICAgIHJldHVybiBuZXcgcWgoZSwgcywgbik7XG4gICAgfVxuICAgIC8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovIChuLCB0LCBlKSkpO1xufVxuXG5jbGFzcyBQZiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBcIm1lbW9yeVwiLCB0aGlzLl9vbmxpbmVDb21wb25lbnRQcm92aWRlciA9IG5ldyBQYSwgKG51bGwgPT0gdCA/IHZvaWQgMCA6IHQuZ2FyYmFnZUNvbGxlY3RvcikgPyB0aGlzLl9vZmZsaW5lQ29tcG9uZW50UHJvdmlkZXIgPSB0LmdhcmJhZ2VDb2xsZWN0b3IuX29mZmxpbmVDb21wb25lbnRQcm92aWRlciA6IHRoaXMuX29mZmxpbmVDb21wb25lbnRQcm92aWRlciA9IG5ldyBFYTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogdGhpcy5raW5kXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5jbGFzcyBiZiB7XG4gICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgdGhpcy5raW5kID0gXCJwZXJzaXN0ZW50XCIsIChudWxsID09IHQgPyB2b2lkIDAgOiB0LnRhYk1hbmFnZXIpID8gKHQudGFiTWFuYWdlci5faW5pdGlhbGl6ZSh0KSwgXG4gICAgICAgIGUgPSB0LnRhYk1hbmFnZXIpIDogKGUgPSAkZih2b2lkIDApLCBlLl9pbml0aWFsaXplKHQpKSwgdGhpcy5fb25saW5lQ29tcG9uZW50UHJvdmlkZXIgPSBlLl9vbmxpbmVDb21wb25lbnRQcm92aWRlciwgXG4gICAgICAgIHRoaXMuX29mZmxpbmVDb21wb25lbnRQcm92aWRlciA9IGUuX29mZmxpbmVDb21wb25lbnRQcm92aWRlcjtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogdGhpcy5raW5kXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5jbGFzcyBWZiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMua2luZCA9IFwibWVtb3J5RWFnZXJcIiwgdGhpcy5fb2ZmbGluZUNvbXBvbmVudFByb3ZpZGVyID0gbmV3IEVhO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiB0aGlzLmtpbmRcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNsYXNzIFNmIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMua2luZCA9IFwibWVtb3J5THJ1XCIsIHRoaXMuX29mZmxpbmVDb21wb25lbnRQcm92aWRlciA9IG5ldyBBYSh0KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogdGhpcy5raW5kXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYE1lbW9yeUVhZ2VyR2FyYmFnZUNvbGxlY3RvcmAuIFRoaXMgaXMgYWxzbyB0aGVcbiAqIGRlZmF1bHQgZ2FyYmFnZSBjb2xsZWN0b3IgdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG90aGVyd2lzZS5cbiAqLyBmdW5jdGlvbiBEZigpIHtcbiAgICByZXR1cm4gbmV3IFZmO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYE1lbW9yeUxydUdhcmJhZ2VDb2xsZWN0b3JgLlxuICpcbiAqIEEgdGFyZ2V0IHNpemUgY2FuIGJlIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBzZXR0aW5nIHBhcmFtZXRlci4gVGhlXG4gKiBjb2xsZWN0b3Igd2lsbCBzdGFydCBkZWxldGluZyBkb2N1bWVudHMgb25jZSB0aGUgY2FjaGUgc2l6ZSBleGNlZWRzXG4gKiB0aGUgZ2l2ZW4gc2l6ZS4gVGhlIGRlZmF1bHQgY2FjaGUgc2l6ZSBpcyA0ME1CICg0MCAqIDEwMjQgKiAxMDI0IGJ5dGVzKS5cbiAqLyBmdW5jdGlvbiBDZih0KSB7XG4gICAgcmV0dXJuIG5ldyBTZihudWxsID09IHQgPyB2b2lkIDAgOiB0LmNhY2hlU2l6ZUJ5dGVzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBNZW1vcnlMb2NhbENhY2hlYC4gVGhlIGluc3RhbmNlIGNhbiBiZSBzZXQgdG9cbiAqIGBGaXJlc3RvcmVTZXR0aW5ncy5jYWNoZWAgdG8gdGVsbCB0aGUgU0RLIHdoaWNoIGNhY2hlIGxheWVyIHRvIHVzZS5cbiAqLyBmdW5jdGlvbiB4Zih0KSB7XG4gICAgcmV0dXJuIG5ldyBQZih0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBQZXJzaXN0ZW50TG9jYWxDYWNoZWAuIFRoZSBpbnN0YW5jZSBjYW4gYmUgc2V0IHRvXG4gKiBgRmlyZXN0b3JlU2V0dGluZ3MuY2FjaGVgIHRvIHRlbGwgdGhlIFNESyB3aGljaCBjYWNoZSBsYXllciB0byB1c2UuXG4gKlxuICogUGVyc2lzdGVudCBjYWNoZSBjYW5ub3QgYmUgdXNlZCBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKi8gZnVuY3Rpb24gTmYodCkge1xuICAgIHJldHVybiBuZXcgYmYodCk7XG59XG5cbmNsYXNzIGtmIHtcbiAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgIHRoaXMuZm9yY2VPd25lcnNoaXAgPSB0LCB0aGlzLmtpbmQgPSBcInBlcnNpc3RlbnRTaW5nbGVUYWJcIjtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogdGhpcy5raW5kXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqLyAgICBfaW5pdGlhbGl6ZSh0KSB7XG4gICAgICAgIHRoaXMuX29ubGluZUNvbXBvbmVudFByb3ZpZGVyID0gbmV3IFBhLCB0aGlzLl9vZmZsaW5lQ29tcG9uZW50UHJvdmlkZXIgPSBuZXcgdmEodGhpcy5fb25saW5lQ29tcG9uZW50UHJvdmlkZXIsIG51bGwgPT0gdCA/IHZvaWQgMCA6IHQuY2FjaGVTaXplQnl0ZXMsIHRoaXMuZm9yY2VPd25lcnNoaXApO1xuICAgIH1cbn1cblxuY2xhc3MgTWYge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBcIlBlcnNpc3RlbnRNdWx0aXBsZVRhYlwiO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiB0aGlzLmtpbmRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovICAgIF9pbml0aWFsaXplKHQpIHtcbiAgICAgICAgdGhpcy5fb25saW5lQ29tcG9uZW50UHJvdmlkZXIgPSBuZXcgUGEsIHRoaXMuX29mZmxpbmVDb21wb25lbnRQcm92aWRlciA9IG5ldyBSYSh0aGlzLl9vbmxpbmVDb21wb25lbnRQcm92aWRlciwgbnVsbCA9PSB0ID8gdm9pZCAwIDogdC5jYWNoZVNpemVCeXRlcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFBlcnNpc3RlbnRTaW5nbGVUYWJNYW5hZ2VyYC5cbiAqXG4gKiBAcGFyYW0gc2V0dGluZ3MgQ29uZmlndXJlcyB0aGUgY3JlYXRlZCB0YWIgbWFuYWdlci5cbiAqLyBmdW5jdGlvbiAkZih0KSB7XG4gICAgcmV0dXJuIG5ldyBrZihudWxsID09IHQgPyB2b2lkIDAgOiB0LmZvcmNlT3duZXJzaGlwKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBQZXJzaXN0ZW50TXVsdGlwbGVUYWJNYW5hZ2VyYC5cbiAqLyBmdW5jdGlvbiBPZigpIHtcbiAgICByZXR1cm4gbmV3IE1mO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBjb25zdCBGZiA9IHtcbiAgICBtYXhBdHRlbXB0czogNVxufTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB3cml0ZSBiYXRjaCwgdXNlZCB0byBwZXJmb3JtIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZSBhdG9taWMgdW5pdC5cbiAqXG4gKiBBIGBXcml0ZUJhdGNoYCBvYmplY3QgY2FuIGJlIGFjcXVpcmVkIGJ5IGNhbGxpbmcge0BsaW5rIHdyaXRlQmF0Y2h9LiBJdFxuICogcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWRkaW5nIHdyaXRlcyB0byB0aGUgd3JpdGUgYmF0Y2guIE5vbmUgb2YgdGhlIHdyaXRlc1xuICogd2lsbCBiZSBjb21taXR0ZWQgKG9yIHZpc2libGUgbG9jYWxseSkgdW50aWwge0BsaW5rIFdyaXRlQmF0Y2guY29tbWl0fSBpc1xuICogY2FsbGVkLlxuICovXG5jbGFzcyBCZiB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX2NvbW1pdEhhbmRsZXIgPSBlLCB0aGlzLl9tdXRhdGlvbnMgPSBbXSwgdGhpcy5fY29tbWl0dGVkID0gITEsIFxuICAgICAgICB0aGlzLl9kYXRhUmVhZGVyID0gWmgodCk7XG4gICAgfVxuICAgIHNldCh0LCBlLCBuKSB7XG4gICAgICAgIHRoaXMuX3ZlcmlmeU5vdENvbW1pdHRlZCgpO1xuICAgICAgICBjb25zdCBzID0gTGYodCwgdGhpcy5fZmlyZXN0b3JlKSwgaSA9IEhsKHMuY29udmVydGVyLCBlLCBuKSwgciA9IHRsKHRoaXMuX2RhdGFSZWFkZXIsIFwiV3JpdGVCYXRjaC5zZXRcIiwgcy5fa2V5LCBpLCBudWxsICE9PSBzLmNvbnZlcnRlciwgbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdXRhdGlvbnMucHVzaChyLnRvTXV0YXRpb24ocy5fa2V5LCBGcy5ub25lKCkpKSwgdGhpcztcbiAgICB9XG4gICAgdXBkYXRlKHQsIGUsIG4sIC4uLnMpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5Tm90Q29tbWl0dGVkKCk7XG4gICAgICAgIGNvbnN0IGkgPSBMZih0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgIHJldHVybiByID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgKGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSkpIHx8IGUgaW5zdGFuY2VvZiBLaCA/IGNsKHRoaXMuX2RhdGFSZWFkZXIsIFwiV3JpdGVCYXRjaC51cGRhdGVcIiwgaS5fa2V5LCBlLCBuLCBzKSA6IHVsKHRoaXMuX2RhdGFSZWFkZXIsIFwiV3JpdGVCYXRjaC51cGRhdGVcIiwgaS5fa2V5LCBlKSwgXG4gICAgICAgIHRoaXMuX211dGF0aW9ucy5wdXNoKHIudG9NdXRhdGlvbihpLl9rZXksIEZzLmV4aXN0cyghMCkpKSwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyB0aGUgZG9jdW1lbnQgcmVmZXJyZWQgdG8gYnkgdGhlIHByb3ZpZGVkIHtAbGluayBEb2N1bWVudFJlZmVyZW5jZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRSZWYgLSBBIHJlZmVyZW5jZSB0byB0aGUgZG9jdW1lbnQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcmV0dXJucyBUaGlzIGBXcml0ZUJhdGNoYCBpbnN0YW5jZS4gVXNlZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqLyAgICBkZWxldGUodCkge1xuICAgICAgICB0aGlzLl92ZXJpZnlOb3RDb21taXR0ZWQoKTtcbiAgICAgICAgY29uc3QgZSA9IExmKHQsIHRoaXMuX2ZpcmVzdG9yZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdXRhdGlvbnMgPSB0aGlzLl9tdXRhdGlvbnMuY29uY2F0KG5ldyBZcyhlLl9rZXksIEZzLm5vbmUoKSkpLCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21taXRzIGFsbCBvZiB0aGUgd3JpdGVzIGluIHRoaXMgd3JpdGUgYmF0Y2ggYXMgYSBzaW5nbGUgYXRvbWljIHVuaXQuXG4gICAgICpcbiAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZXNlIHdyaXRlcyB3aWxsIG9ubHkgYmUgcmVmbGVjdGVkIGluIGRvY3VtZW50IHJlYWRzIHRoYXRcbiAgICAgKiBvY2N1ciBhZnRlciB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcy4gSWYgdGhlIGNsaWVudCBpcyBvZmZsaW5lLCB0aGVcbiAgICAgKiB3cml0ZSBmYWlscy4gSWYgeW91IHdvdWxkIGxpa2UgdG8gc2VlIGxvY2FsIG1vZGlmaWNhdGlvbnMgb3IgYnVmZmVyIHdyaXRlc1xuICAgICAqIHVudGlsIHRoZSBjbGllbnQgaXMgb25saW5lLCB1c2UgdGhlIGZ1bGwgRmlyZXN0b3JlIFNESy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmVkIG9uY2UgYWxsIG9mIHRoZSB3cml0ZXMgaW4gdGhlIGJhdGNoIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvIHRoZSBiYWNrZW5kIGFzIGFuIGF0b21pYyB1bml0IChub3RlIHRoYXQgaXQgd29uJ3RcbiAgICAgKiByZXNvbHZlIHdoaWxlIHlvdSdyZSBvZmZsaW5lKS5cbiAgICAgKi8gICAgY29tbWl0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5Tm90Q29tbWl0dGVkKCksIHRoaXMuX2NvbW1pdHRlZCA9ICEwLCB0aGlzLl9tdXRhdGlvbnMubGVuZ3RoID4gMCA/IHRoaXMuX2NvbW1pdEhhbmRsZXIodGhpcy5fbXV0YXRpb25zKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBfdmVyaWZ5Tm90Q29tbWl0dGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB0aHJvdyBuZXcgVShxLkZBSUxFRF9QUkVDT05ESVRJT04sIFwiQSB3cml0ZSBiYXRjaCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY29tbWl0KCkgaGFzIGJlZW4gY2FsbGVkLlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIExmKHQsIGUpIHtcbiAgICBpZiAoKHQgPSBnZXRNb2R1bGFySW5zdGFuY2UodCkpLmZpcmVzdG9yZSAhPT0gZSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIlByb3ZpZGVkIGRvY3VtZW50IHJlZmVyZW5jZSBpcyBmcm9tIGEgZGlmZmVyZW50IEZpcmVzdG9yZSBpbnN0YW5jZS5cIik7XG4gICAgcmV0dXJuIHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBUT0RPKG1yc2NobWlkdCkgQ29uc2lkZXIgdXNpbmcgYEJhc2VUcmFuc2FjdGlvbmAgYXMgdGhlIGJhc2UgY2xhc3MgaW4gdGhlXG4vLyBsZWdhY3kgU0RLLlxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHRyYW5zYWN0aW9uLlxuICpcbiAqIFRoZSBgVHJhbnNhY3Rpb25gIG9iamVjdCBwYXNzZWQgdG8gYSB0cmFuc2FjdGlvbidzIGB1cGRhdGVGdW5jdGlvbmAgcHJvdmlkZXNcbiAqIHRoZSBtZXRob2RzIHRvIHJlYWQgYW5kIHdyaXRlIGRhdGEgd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0LiBTZWVcbiAqIHtAbGluayBydW5UcmFuc2FjdGlvbn0uXG4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGEgdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGBUcmFuc2FjdGlvbmAgb2JqZWN0IHBhc3NlZCB0byBhIHRyYW5zYWN0aW9uJ3MgYHVwZGF0ZUZ1bmN0aW9uYCBwcm92aWRlc1xuICogdGhlIG1ldGhvZHMgdG8gcmVhZCBhbmQgd3JpdGUgZGF0YSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQuIFNlZVxuICoge0BsaW5rIHJ1blRyYW5zYWN0aW9ufS5cbiAqL1xuY2xhc3MgcWYgZXh0ZW5kcyBjbGFzcyB7XG4gICAgLyoqIEBoaWRlY29uc3RydWN0b3IgKi9cbiAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IHQsIHRoaXMuX3RyYW5zYWN0aW9uID0gZSwgdGhpcy5fZGF0YVJlYWRlciA9IFpoKHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgcHJvdmlkZWQge0BsaW5rIERvY3VtZW50UmVmZXJlbmNlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2N1bWVudFJlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCB0byBiZSByZWFkLlxuICAgICAqIEByZXR1cm5zIEEgYERvY3VtZW50U25hcHNob3RgIHdpdGggdGhlIHJlYWQgZGF0YS5cbiAgICAgKi8gICAgZ2V0KHQpIHtcbiAgICAgICAgY29uc3QgZSA9IExmKHQsIHRoaXMuX2ZpcmVzdG9yZSksIG4gPSBuZXcgSmwodGhpcy5fZmlyZXN0b3JlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uLmxvb2t1cChbIGUuX2tleSBdKS50aGVuKCh0ID0+IHtcbiAgICAgICAgICAgIGlmICghdCB8fCAxICE9PSB0Lmxlbmd0aCkgcmV0dXJuIE8oKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0WzBdO1xuICAgICAgICAgICAgaWYgKHMuaXNGb3VuZERvY3VtZW50KCkpIHJldHVybiBuZXcgcGwodGhpcy5fZmlyZXN0b3JlLCBuLCBzLmtleSwgcywgZS5jb252ZXJ0ZXIpO1xuICAgICAgICAgICAgaWYgKHMuaXNOb0RvY3VtZW50KCkpIHJldHVybiBuZXcgcGwodGhpcy5fZmlyZXN0b3JlLCBuLCBlLl9rZXksIG51bGwsIGUuY29udmVydGVyKTtcbiAgICAgICAgICAgIHRocm93IE8oKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBzZXQodCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gTGYodCwgdGhpcy5fZmlyZXN0b3JlKSwgaSA9IEhsKHMuY29udmVydGVyLCBlLCBuKSwgciA9IHRsKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24uc2V0XCIsIHMuX2tleSwgaSwgbnVsbCAhPT0gcy5jb252ZXJ0ZXIsIG4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2V0KHMuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZSh0LCBlLCBuLCAuLi5zKSB7XG4gICAgICAgIGNvbnN0IGkgPSBMZih0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICAvLyBGb3IgQ29tcGF0IHR5cGVzLCB3ZSBoYXZlIHRvIFwiZXh0cmFjdFwiIHRoZSB1bmRlcmx5aW5nIHR5cGVzIGJlZm9yZVxuICAgICAgICAvLyBwZXJmb3JtaW5nIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgIHJldHVybiByID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgKGUgPSBnZXRNb2R1bGFySW5zdGFuY2UoZSkpIHx8IGUgaW5zdGFuY2VvZiBLaCA/IGNsKHRoaXMuX2RhdGFSZWFkZXIsIFwiVHJhbnNhY3Rpb24udXBkYXRlXCIsIGkuX2tleSwgZSwgbiwgcykgOiB1bCh0aGlzLl9kYXRhUmVhZGVyLCBcIlRyYW5zYWN0aW9uLnVwZGF0ZVwiLCBpLl9rZXksIGUpLCBcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24udXBkYXRlKGkuX2tleSwgciksIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgdGhlIGRvY3VtZW50IHJlZmVycmVkIHRvIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHJldHVybnMgVGhpcyBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBVc2VkIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovICAgIGRlbGV0ZSh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBMZih0LCB0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uZGVsZXRlKGUuX2tleSksIHRoaXM7XG4gICAgfVxufSB7XG4gICAgLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBUcmFuc2FjdGlvbiBBUEkgaW4gdGhlIExpdGUgU0RLXG4gICAgLy8gYnV0IGlzIHN1YmNsYXNzZWQgaW4gb3JkZXIgdG8gcmV0dXJuIGl0cyBvd24gRG9jdW1lbnRTbmFwc2hvdCB0eXBlcy5cbiAgICAvKiogQGhpZGVjb25zdHJ1Y3RvciAqL1xuICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgc3VwZXIodCwgZSksIHRoaXMuX2ZpcmVzdG9yZSA9IHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBwcm92aWRlZCB7QGxpbmsgRG9jdW1lbnRSZWZlcmVuY2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvY3VtZW50UmVmIC0gQSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHRvIGJlIHJlYWQuXG4gICAgICogQHJldHVybnMgQSBgRG9jdW1lbnRTbmFwc2hvdGAgd2l0aCB0aGUgcmVhZCBkYXRhLlxuICAgICAqLyAgICBnZXQodCkge1xuICAgICAgICBjb25zdCBlID0gTGYodCwgdGhpcy5fZmlyZXN0b3JlKSwgbiA9IG5ldyBoZih0aGlzLl9maXJlc3RvcmUpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KHQpLnRoZW4oKHQgPT4gbmV3IHNmKHRoaXMuX2ZpcmVzdG9yZSwgbiwgZS5fa2V5LCB0Ll9kb2N1bWVudCwgbmV3IG5mKFxuICAgICAgICAvKiBoYXNQZW5kaW5nV3JpdGVzPSAqLyAhMSwgXG4gICAgICAgIC8qIGZyb21DYWNoZT0gKi8gITEpLCBlLmNvbnZlcnRlcikpKTtcbiAgICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGB1cGRhdGVGdW5jdGlvbmAgYW5kIHRoZW4gYXR0ZW1wdHMgdG8gY29tbWl0IHRoZSBjaGFuZ2VzXG4gKiBhcHBsaWVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uIElmIGFueSBkb2N1bWVudCByZWFkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGhhcyBjaGFuZ2VkLCBDbG91ZCBGaXJlc3RvcmUgcmV0cmllcyB0aGUgYHVwZGF0ZUZ1bmN0aW9uYC4gSWYgaXQgZmFpbHMgdG9cbiAqIGNvbW1pdCBhZnRlciA1IGF0dGVtcHRzLCB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuXG4gKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGlzIDUwMC5cbiAqXG4gKiBAcGFyYW0gZmlyZXN0b3JlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEZpcmVzdG9yZSBkYXRhYmFzZSB0byBydW4gdGhpc1xuICogdHJhbnNhY3Rpb24gYWdhaW5zdC5cbiAqIEBwYXJhbSB1cGRhdGVGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIGNvbnRleHQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbnMgb2JqZWN0IHRvIGNvbmZpZ3VyZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyB0b1xuICogY29tbWl0LlxuICogQHJldHVybnMgSWYgdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgb3Igd2FzIGV4cGxpY2l0bHkgYWJvcnRlZFxuICogKHRoZSBgdXBkYXRlRnVuY3Rpb25gIHJldHVybmVkIGEgZmFpbGVkIHByb21pc2UpLCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGVcbiAqIGB1cGRhdGVGdW5jdGlvbiBgaXMgcmV0dXJuZWQgaGVyZS4gT3RoZXJ3aXNlLCBpZiB0aGUgdHJhbnNhY3Rpb24gZmFpbGVkLCBhXG4gKiByZWplY3RlZCBwcm9taXNlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmFpbHVyZSBlcnJvciBpcyByZXR1cm5lZC5cbiAqLyBmdW5jdGlvbiBVZih0LCBlLCBuKSB7XG4gICAgdCA9IHVoKHQsIHZoKTtcbiAgICBjb25zdCBzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBGZiksIG4pO1xuICAgICFmdW5jdGlvbih0KSB7XG4gICAgICAgIGlmICh0Lm1heEF0dGVtcHRzIDwgMSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIk1heCBhdHRlbXB0cyBtdXN0IGJlIGF0IGxlYXN0IDFcIik7XG4gICAgfShzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCwgZSwgbikge1xuICAgICAgICBjb25zdCBzID0gbmV3IEs7XG4gICAgICAgIHJldHVybiB0LmFzeW5jUXVldWUuZW5xdWV1ZUFuZEZvcmdldCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IGF3YWl0IFVhKHQpO1xuICAgICAgICAgICAgbmV3IENhKHQuYXN5bmNRdWV1ZSwgaSwgbiwgZSwgcykucnVuKCk7XG4gICAgICAgIH0pKSwgcy5wcm9taXNlO1xuICAgIH0oYmgodCksIChuID0+IGUobmV3IHFmKHQsIG4pKSksIHMpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgc2VudGluZWwgZm9yIHVzZSB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gb3JcbiAqIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gd2l0aCBge21lcmdlOiB0cnVlfWAgdG8gbWFyayBhIGZpZWxkIGZvciBkZWxldGlvbi5cbiAqLyBmdW5jdGlvbiBLZigpIHtcbiAgICByZXR1cm4gbmV3IGVsKFwiZGVsZXRlRmllbGRcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNlbnRpbmVsIHVzZWQgd2l0aCB7QGxpbmsgQGZpcmViYXNlL2ZpcmVzdG9yZS9saXRlIyhzZXREb2M6MSl9IG9yIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdG9cbiAqIGluY2x1ZGUgYSBzZXJ2ZXItZ2VuZXJhdGVkIHRpbWVzdGFtcCBpbiB0aGUgd3JpdHRlbiBkYXRhLlxuICovIGZ1bmN0aW9uIEdmKCkge1xuICAgIHJldHVybiBuZXcgc2woXCJzZXJ2ZXJUaW1lc3RhbXBcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHVuaW9uIHRoZSBnaXZlbiBlbGVtZW50cyB3aXRoIGFueSBhcnJheVxuICogdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc2VydmVyLiBFYWNoIHNwZWNpZmllZCBlbGVtZW50IHRoYXQgZG9lc24ndFxuICogYWxyZWFkeSBleGlzdCBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kLiBJZiB0aGUgZmllbGQgYmVpbmdcbiAqIG1vZGlmaWVkIGlzIG5vdCBhbHJlYWR5IGFuIGFycmF5IGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCBhbiBhcnJheVxuICogY29udGFpbmluZyBleGFjdGx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gVGhlIGVsZW1lbnRzIHRvIHVuaW9uIGludG8gdGhlIGFycmF5LlxuICogQHJldHVybnMgVGhlIGBGaWVsZFZhbHVlYCBzZW50aW5lbCBmb3IgdXNlIGluIGEgY2FsbCB0byBgc2V0RG9jKClgIG9yXG4gKiBgdXBkYXRlRG9jKClgLlxuICovIGZ1bmN0aW9uIFFmKC4uLnQpIHtcbiAgICAvLyBOT1RFOiBXZSBkb24ndCBhY3R1YWxseSBwYXJzZSB0aGUgZGF0YSB1bnRpbCBpdCdzIHVzZWQgaW4gc2V0KCkgb3JcbiAgICAvLyB1cGRhdGUoKSBzaW5jZSB3ZSdkIG5lZWQgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZSB0byBkbyB0aGlzLlxuICAgIHJldHVybiBuZXcgaWwoXCJhcnJheVVuaW9uXCIsIHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzcGVjaWFsIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiB1cGRhdGVEb2M6MX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIHJlbW92ZSB0aGUgZ2l2ZW4gZWxlbWVudHMgZnJvbSBhbnlcbiAqIGFycmF5IHZhbHVlIHRoYXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIHNlcnZlci4gQWxsIGluc3RhbmNlcyBvZiBlYWNoIGVsZW1lbnRcbiAqIHNwZWNpZmllZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuIElmIHRoZSBmaWVsZCBiZWluZyBtb2RpZmllZCBpcyBub3RcbiAqIGFscmVhZHkgYW4gYXJyYXkgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGFuIGVtcHR5IGFycmF5LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIFRoZSBlbGVtZW50cyB0byByZW1vdmUgZnJvbSB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiBqZiguLi50KSB7XG4gICAgLy8gTk9URTogV2UgZG9uJ3QgYWN0dWFsbHkgcGFyc2UgdGhlIGRhdGEgdW50aWwgaXQncyB1c2VkIGluIHNldCgpIG9yXG4gICAgLy8gdXBkYXRlKCkgc2luY2Ugd2UnZCBuZWVkIHRoZSBGaXJlc3RvcmUgaW5zdGFuY2UgdG8gZG8gdGhpcy5cbiAgICByZXR1cm4gbmV3IHJsKFwiYXJyYXlSZW1vdmVcIiwgdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNwZWNpYWwgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHNldERvYzoxKX0gb3Ige0BsaW5rXG4gKiBAZmlyZWJhc2UvZmlyZXN0b3JlL2xpdGUjKHVwZGF0ZURvYzoxKX0gdGhhdCB0ZWxscyB0aGUgc2VydmVyIHRvIGluY3JlbWVudCB0aGUgZmllbGQncyBjdXJyZW50IHZhbHVlIGJ5XG4gKiB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogSWYgZWl0aGVyIHRoZSBvcGVyYW5kIG9yIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIHVzZXMgZmxvYXRpbmcgcG9pbnRcbiAqIHByZWNpc2lvbiwgYWxsIGFyaXRobWV0aWMgZm9sbG93cyBJRUVFIDc1NCBzZW1hbnRpY3MuIElmIGJvdGggdmFsdWVzIGFyZVxuICogaW50ZWdlcnMsIHZhbHVlcyBvdXRzaWRlIG9mIEphdmFTY3JpcHQncyBzYWZlIG51bWJlciByYW5nZVxuICogKGBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUmAgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCkgYXJlIGFsc28gc3ViamVjdCB0b1xuICogcHJlY2lzaW9uIGxvc3MuIEZ1cnRoZXJtb3JlLCBvbmNlIHByb2Nlc3NlZCBieSB0aGUgRmlyZXN0b3JlIGJhY2tlbmQsIGFsbFxuICogaW50ZWdlciBvcGVyYXRpb25zIGFyZSBjYXBwZWQgYmV0d2VlbiAtMl42MyBhbmQgMl42My0xLlxuICpcbiAqIElmIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlIGlzIG5vdCBvZiB0eXBlIGBudW1iZXJgLCBvciBpZiB0aGUgZmllbGQgZG9lcyBub3RcbiAqIHlldCBleGlzdCwgdGhlIHRyYW5zZm9ybWF0aW9uIHNldHMgdGhlIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbiAtIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyBUaGUgYEZpZWxkVmFsdWVgIHNlbnRpbmVsIGZvciB1c2UgaW4gYSBjYWxsIHRvIGBzZXREb2MoKWAgb3JcbiAqIGB1cGRhdGVEb2MoKWBcbiAqLyBmdW5jdGlvbiB6Zih0KSB7XG4gICAgcmV0dXJuIG5ldyBvbChcImluY3JlbWVudFwiLCB0KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhIHdyaXRlIGJhdGNoLCB1c2VkIGZvciBwZXJmb3JtaW5nIG11bHRpcGxlIHdyaXRlcyBhcyBhIHNpbmdsZVxuICogYXRvbWljIG9wZXJhdGlvbi4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyBhbGxvd2VkIGluIGEgc2luZ2xlIHtAbGluayBXcml0ZUJhdGNofVxuICogaXMgNTAwLlxuICpcbiAqIFVubGlrZSB0cmFuc2FjdGlvbnMsIHdyaXRlIGJhdGNoZXMgYXJlIHBlcnNpc3RlZCBvZmZsaW5lIGFuZCB0aGVyZWZvcmUgYXJlXG4gKiBwcmVmZXJhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgdG8gY29uZGl0aW9uIHlvdXIgd3JpdGVzIG9uIHJlYWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBXcml0ZUJhdGNofSB0aGF0IGNhbiBiZSB1c2VkIHRvIGF0b21pY2FsbHkgZXhlY3V0ZSBtdWx0aXBsZVxuICogd3JpdGVzLlxuICovIGZ1bmN0aW9uIFdmKHQpIHtcbiAgICByZXR1cm4gYmgodCA9IHVoKHQsIHZoKSksIG5ldyBCZih0LCAoZSA9PiBFZih0LCBlKSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqLyBmdW5jdGlvbiBIZih0LCBlKSB7XG4gICAgdmFyIG47XG4gICAgY29uc3QgcyA9IGJoKHQgPSB1aCh0LCB2aCkpO1xuICAgIGlmICghcy5fdW5pbml0aWFsaXplZENvbXBvbmVudHNQcm92aWRlciB8fCBcIm1lbW9yeVwiID09PSAobnVsbCA9PT0gKG4gPSBzLl91bmluaXRpYWxpemVkQ29tcG9uZW50c1Byb3ZpZGVyKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLl9vZmZsaW5lS2luZCkpIFxuICAgIC8vIFBPUlRJTkcgTk9URTogV2UgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSB1c2VyIGhhcyBub3QgZW5hYmxlZFxuICAgIC8vIHBlcnNpc3RlbmNlIHNpbmNlIGBlbmFibGVJbmRleGVkZGJQZXJzaXN0ZW5jZSgpYCBjYW4gZmFpbCBvbiB0aGUgV2ViLlxuICAgIHJldHVybiBNKFwiQ2Fubm90IGVuYWJsZSBpbmRleGVzIHdoZW4gcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIiksIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBcInN0cmluZ1wiID09IHR5cGVvZiB0ID8gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsIFwiRmFpbGVkIHRvIHBhcnNlIEpTT046IFwiICsgKG51bGwgPT0gdCA/IHZvaWQgMCA6IHQubWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHQpIDogdCwgbiA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlLmluZGV4ZXMpKSBmb3IgKGNvbnN0IHQgb2YgZS5pbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gSmYodCwgXCJjb2xsZWN0aW9uR3JvdXBcIiksIHMgPSBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQuZmllbGRzKSkgZm9yIChjb25zdCBlIG9mIHQuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IG1sKFwic2V0SW5kZXhDb25maWd1cmF0aW9uXCIsIEpmKGUsIFwiZmllbGRQYXRoXCIpKTtcbiAgICAgICAgICAgICAgICBcIkNPTlRBSU5TXCIgPT09IGUuYXJyYXlDb25maWcgPyBzLnB1c2gobmV3IF90KHQsIDIgLyogSW5kZXhLaW5kLkNPTlRBSU5TICovKSkgOiBcIkFTQ0VORElOR1wiID09PSBlLm9yZGVyID8gcy5wdXNoKG5ldyBfdCh0LCAwIC8qIEluZGV4S2luZC5BU0NFTkRJTkcgKi8pKSA6IFwiREVTQ0VORElOR1wiID09PSBlLm9yZGVyICYmIHMucHVzaChuZXcgX3QodCwgMSAvKiBJbmRleEtpbmQuREVTQ0VORElORyAqLykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbi5wdXNoKG5ldyBsdChsdC5VTktOT1dOX0lELCBlLCBzLCBndC5lbXB0eSgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG47XG4gICAgfShlKTtcbiAgICByZXR1cm4gWmEocywgaSk7XG59XG5cbmZ1bmN0aW9uIEpmKHQsIGUpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdFtlXSkgdGhyb3cgbmV3IFUocS5JTlZBTElEX0FSR1VNRU5ULCBcIk1pc3Npbmcgc3RyaW5nIHZhbHVlIGZvcjogXCIgKyBlKTtcbiAgICByZXR1cm4gdFtlXTtcbn1cblxuLyoqXG4gKiBDbG91ZCBGaXJlc3RvcmVcbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqLyAhZnVuY3Rpb24odCwgZSA9ICEwKSB7XG4gICAgIWZ1bmN0aW9uKHQpIHtcbiAgICAgICAgUyA9IHQ7XG4gICAgfShTREtfVkVSU0lPTiksIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KFwiZmlyZXN0b3JlXCIsICgodCwge2luc3RhbmNlSWRlbnRpZmllcjogbiwgb3B0aW9uczogc30pID0+IHtcbiAgICAgICAgY29uc3QgaSA9IHQuZ2V0UHJvdmlkZXIoXCJhcHBcIikuZ2V0SW1tZWRpYXRlKCksIHIgPSBuZXcgdmgobmV3IHoodC5nZXRQcm92aWRlcihcImF1dGgtaW50ZXJuYWxcIikpLCBuZXcgWSh0LmdldFByb3ZpZGVyKFwiYXBwLWNoZWNrLWludGVybmFsXCIpKSwgZnVuY3Rpb24odCwgZSkge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmFwcGx5KHQub3B0aW9ucywgWyBcInByb2plY3RJZFwiIF0pKSB0aHJvdyBuZXcgVShxLklOVkFMSURfQVJHVU1FTlQsICdcInByb2plY3RJZFwiIG5vdCBwcm92aWRlZCBpbiBmaXJlYmFzZS5pbml0aWFsaXplQXBwLicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPZSh0Lm9wdGlvbnMucHJvamVjdElkLCBlKTtcbiAgICAgICAgfShpLCBuKSwgaSk7XG4gICAgICAgIHJldHVybiBzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICB1c2VGZXRjaFN0cmVhbXM6IGVcbiAgICAgICAgfSwgcyksIHIuX3NldFNldHRpbmdzKHMpLCByO1xuICAgIH0pLCBcIlBVQkxJQ1wiKS5zZXRNdWx0aXBsZUluc3RhbmNlcyghMCkpLCByZWdpc3RlclZlcnNpb24oYiwgXCIzLjEzLjBcIiwgdCksIFxuICAgIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXG4gICAgcmVnaXN0ZXJWZXJzaW9uKGIsIFwiMy4xMy4wXCIsIFwiZXNtMjAxN1wiKTtcbn0oKTtcblxuZXhwb3J0IHsgV2wgYXMgQWJzdHJhY3RVc2VyRGF0YVdyaXRlciwgTGggYXMgQWdncmVnYXRlRmllbGQsIHFoIGFzIEFnZ3JlZ2F0ZVF1ZXJ5U25hcHNob3QsIFVoIGFzIEJ5dGVzLCBBaCBhcyBDQUNIRV9TSVpFX1VOTElNSVRFRCwgd2ggYXMgQ29sbGVjdGlvblJlZmVyZW5jZSwgZmggYXMgRG9jdW1lbnRSZWZlcmVuY2UsIHNmIGFzIERvY3VtZW50U25hcHNob3QsIEtoIGFzIEZpZWxkUGF0aCwgUWggYXMgRmllbGRWYWx1ZSwgdmggYXMgRmlyZXN0b3JlLCBVIGFzIEZpcmVzdG9yZUVycm9yLCBqaCBhcyBHZW9Qb2ludCwgRWggYXMgTG9hZEJ1bmRsZVRhc2ssIGRoIGFzIFF1ZXJ5LCBWbCBhcyBRdWVyeUNvbXBvc2l0ZUZpbHRlckNvbnN0cmFpbnQsIHZsIGFzIFF1ZXJ5Q29uc3RyYWludCwgcmYgYXMgUXVlcnlEb2N1bWVudFNuYXBzaG90LCBCbCBhcyBRdWVyeUVuZEF0Q29uc3RyYWludCwgUGwgYXMgUXVlcnlGaWVsZEZpbHRlckNvbnN0cmFpbnQsIE5sIGFzIFF1ZXJ5TGltaXRDb25zdHJhaW50LCBDbCBhcyBRdWVyeU9yZGVyQnlDb25zdHJhaW50LCBvZiBhcyBRdWVyeVNuYXBzaG90LCAkbCBhcyBRdWVyeVN0YXJ0QXRDb25zdHJhaW50LCBuZiBhcyBTbmFwc2hvdE1ldGFkYXRhLCBpdCBhcyBUaW1lc3RhbXAsIHFmIGFzIFRyYW5zYWN0aW9uLCBCZiBhcyBXcml0ZUJhdGNoLCBPZSBhcyBfRGF0YWJhc2VJZCwgaHQgYXMgX0RvY3VtZW50S2V5LCBYIGFzIF9FbXB0eUFwcENoZWNrVG9rZW5Qcm92aWRlciwgUSBhcyBfRW1wdHlBdXRoQ3JlZGVudGlhbHNQcm92aWRlciwgYXQgYXMgX0ZpZWxkUGF0aCwgY2kgYXMgX1Rlc3RpbmdIb29rcywgdWggYXMgX2Nhc3QsIEIgYXMgX2RlYnVnQXNzZXJ0LCBiZSBhcyBfaXNCYXNlNjRBdmFpbGFibGUsIE0gYXMgX2xvZ1dhcm4sIHNoIGFzIF92YWxpZGF0ZUlzTm90VXNlZFRvZ2V0aGVyLCBwZiBhcyBhZGREb2MsIHRmIGFzIGFnZ3JlZ2F0ZUZpZWxkRXF1YWwsIGVmIGFzIGFnZ3JlZ2F0ZVF1ZXJ5U25hcHNob3RFcXVhbCwgRGwgYXMgYW5kLCBqZiBhcyBhcnJheVJlbW92ZSwgUWYgYXMgYXJyYXlVbmlvbiwgWGwgYXMgYXZlcmFnZSwgeGggYXMgY2xlYXJJbmRleGVkRGJQZXJzaXN0ZW5jZSwgX2ggYXMgY29sbGVjdGlvbiwgbWggYXMgY29sbGVjdGlvbkdyb3VwLCBsaCBhcyBjb25uZWN0RmlyZXN0b3JlRW11bGF0b3IsIFpsIGFzIGNvdW50LCB5ZiBhcyBkZWxldGVEb2MsIEtmIGFzIGRlbGV0ZUZpZWxkLCBNaCBhcyBkaXNhYmxlTmV0d29yaywgZ2ggYXMgZG9jLCBHaCBhcyBkb2N1bWVudElkLCBTaCBhcyBlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSwgRGggYXMgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZSwga2ggYXMgZW5hYmxlTmV0d29yaywgcWwgYXMgZW5kQXQsIExsIGFzIGVuZEJlZm9yZSwgYmggYXMgZW5zdXJlRmlyZXN0b3JlQ29uZmlndXJlZCwgRWYgYXMgZXhlY3V0ZVdyaXRlLCBSZiBhcyBnZXRBZ2dyZWdhdGVGcm9tU2VydmVyLCB2ZiBhcyBnZXRDb3VudEZyb21TZXJ2ZXIsIGFmIGFzIGdldERvYywgbGYgYXMgZ2V0RG9jRnJvbUNhY2hlLCBmZiBhcyBnZXREb2NGcm9tU2VydmVyLCBkZiBhcyBnZXREb2NzLCB3ZiBhcyBnZXREb2NzRnJvbUNhY2hlLCBfZiBhcyBnZXREb2NzRnJvbVNlcnZlciwgUGggYXMgZ2V0RmlyZXN0b3JlLCB6ZiBhcyBpbmNyZW1lbnQsIFJoIGFzIGluaXRpYWxpemVGaXJlc3RvcmUsIGtsIGFzIGxpbWl0LCBNbCBhcyBsaW1pdFRvTGFzdCwgT2ggYXMgbG9hZEJ1bmRsZSwgRGYgYXMgbWVtb3J5RWFnZXJHYXJiYWdlQ29sbGVjdG9yLCB4ZiBhcyBtZW1vcnlMb2NhbENhY2hlLCBDZiBhcyBtZW1vcnlMcnVHYXJiYWdlQ29sbGVjdG9yLCBGaCBhcyBuYW1lZFF1ZXJ5LCBJZiBhcyBvblNuYXBzaG90LCBUZiBhcyBvblNuYXBzaG90c0luU3luYywgU2wgYXMgb3IsIHhsIGFzIG9yZGVyQnksIE5mIGFzIHBlcnNpc3RlbnRMb2NhbENhY2hlLCBPZiBhcyBwZXJzaXN0ZW50TXVsdGlwbGVUYWJNYW5hZ2VyLCAkZiBhcyBwZXJzaXN0ZW50U2luZ2xlVGFiTWFuYWdlciwgUmwgYXMgcXVlcnksIHBoIGFzIHF1ZXJ5RXF1YWwsIHloIGFzIHJlZkVxdWFsLCBVZiBhcyBydW5UcmFuc2FjdGlvbiwgR2YgYXMgc2VydmVyVGltZXN0YW1wLCBtZiBhcyBzZXREb2MsIEhmIGFzIHNldEluZGV4Q29uZmlndXJhdGlvbiwgeCBhcyBzZXRMb2dMZXZlbCwgY2YgYXMgc25hcHNob3RFcXVhbCwgRmwgYXMgc3RhcnRBZnRlciwgT2wgYXMgc3RhcnRBdCwgWWwgYXMgc3VtLCAkaCBhcyB0ZXJtaW5hdGUsIGdmIGFzIHVwZGF0ZURvYywgTmggYXMgd2FpdEZvclBlbmRpbmdXcml0ZXMsIGJsIGFzIHdoZXJlLCBXZiBhcyB3cml0ZUJhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiY29uc3QgaW5zdGFuY2VPZkFueSA9IChvYmplY3QsIGNvbnN0cnVjdG9ycykgPT4gY29uc3RydWN0b3JzLnNvbWUoKGMpID0+IG9iamVjdCBpbnN0YW5jZW9mIGMpO1xuXG5sZXQgaWRiUHJveHlhYmxlVHlwZXM7XG5sZXQgY3Vyc29yQWR2YW5jZU1ldGhvZHM7XG4vLyBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gcHJldmVudCBpdCB0aHJvd2luZyB1cCBpbiBub2RlIGVudmlyb25tZW50cy5cbmZ1bmN0aW9uIGdldElkYlByb3h5YWJsZVR5cGVzKCkge1xuICAgIHJldHVybiAoaWRiUHJveHlhYmxlVHlwZXMgfHxcbiAgICAgICAgKGlkYlByb3h5YWJsZVR5cGVzID0gW1xuICAgICAgICAgICAgSURCRGF0YWJhc2UsXG4gICAgICAgICAgICBJREJPYmplY3RTdG9yZSxcbiAgICAgICAgICAgIElEQkluZGV4LFxuICAgICAgICAgICAgSURCQ3Vyc29yLFxuICAgICAgICAgICAgSURCVHJhbnNhY3Rpb24sXG4gICAgICAgIF0pKTtcbn1cbi8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBwcmV2ZW50IGl0IHRocm93aW5nIHVwIGluIG5vZGUgZW52aXJvbm1lbnRzLlxuZnVuY3Rpb24gZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIChjdXJzb3JBZHZhbmNlTWV0aG9kcyB8fFxuICAgICAgICAoY3Vyc29yQWR2YW5jZU1ldGhvZHMgPSBbXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmFkdmFuY2UsXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlLFxuICAgICAgICAgICAgSURCQ3Vyc29yLnByb3RvdHlwZS5jb250aW51ZVByaW1hcnlLZXksXG4gICAgICAgIF0pKTtcbn1cbmNvbnN0IGN1cnNvclJlcXVlc3RNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNhY3Rpb25Eb25lTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRyYW5zYWN0aW9uU3RvcmVOYW1lc01hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB0cmFuc2Zvcm1DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdW5saXN0ZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCBzdWNjZXNzKTtcbiAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHdyYXAocmVxdWVzdC5yZXN1bHQpKTtcbiAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgc3VjY2Vzcyk7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgfSk7XG4gICAgcHJvbWlzZVxuICAgICAgICAudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgLy8gU2luY2UgY3Vyc29yaW5nIHJldXNlcyB0aGUgSURCUmVxdWVzdCAoKnNpZ2gqKSwgd2UgY2FjaGUgaXQgZm9yIGxhdGVyIHJldHJpZXZhbFxuICAgICAgICAvLyAoc2VlIHdyYXBGdW5jdGlvbikuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElEQkN1cnNvcikge1xuICAgICAgICAgICAgY3Vyc29yUmVxdWVzdE1hcC5zZXQodmFsdWUsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhdGNoaW5nIHRvIGF2b2lkIFwiVW5jYXVnaHQgUHJvbWlzZSBleGNlcHRpb25zXCJcbiAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAvLyBUaGlzIG1hcHBpbmcgZXhpc3RzIGluIHJldmVyc2VUcmFuc2Zvcm1DYWNoZSBidXQgZG9lc24ndCBkb2Vzbid0IGV4aXN0IGluIHRyYW5zZm9ybUNhY2hlLiBUaGlzXG4gICAgLy8gaXMgYmVjYXVzZSB3ZSBjcmVhdGUgbWFueSBwcm9taXNlcyBmcm9tIGEgc2luZ2xlIElEQlJlcXVlc3QuXG4gICAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChwcm9taXNlLCByZXF1ZXN0KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbih0eCkge1xuICAgIC8vIEVhcmx5IGJhaWwgaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIGEgZG9uZSBwcm9taXNlIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgIGlmICh0cmFuc2FjdGlvbkRvbmVNYXAuaGFzKHR4KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGRvbmUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHVubGlzdGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29tcGxldGUnLCBjb21wbGV0ZSk7XG4gICAgICAgICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBET01FeGNlcHRpb24oJ0Fib3J0RXJyb3InLCAnQWJvcnRFcnJvcicpKTtcbiAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBsZXRlJywgY29tcGxldGUpO1xuICAgICAgICB0eC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgdHguYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBlcnJvcik7XG4gICAgfSk7XG4gICAgLy8gQ2FjaGUgaXQgZm9yIGxhdGVyIHJldHJpZXZhbC5cbiAgICB0cmFuc2FjdGlvbkRvbmVNYXAuc2V0KHR4LCBkb25lKTtcbn1cbmxldCBpZGJQcm94eVRyYXBzID0ge1xuICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdHJhbnNhY3Rpb24uZG9uZS5cbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnZG9uZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uRG9uZU1hcC5nZXQodGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIFBvbHlmaWxsIGZvciBvYmplY3RTdG9yZU5hbWVzIGJlY2F1c2Ugb2YgRWRnZS5cbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnb2JqZWN0U3RvcmVOYW1lcycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm9iamVjdFN0b3JlTmFtZXMgfHwgdHJhbnNhY3Rpb25TdG9yZU5hbWVzTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTWFrZSB0eC5zdG9yZSByZXR1cm4gdGhlIG9ubHkgc3RvcmUgaW4gdGhlIHRyYW5zYWN0aW9uLCBvciB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG1hbnkuXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3N0b3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzFdXG4gICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIDogcmVjZWl2ZXIub2JqZWN0U3RvcmUocmVjZWl2ZXIub2JqZWN0U3RvcmVOYW1lc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSB0cmFuc2Zvcm0gd2hhdGV2ZXIgd2UgZ2V0IGJhY2suXG4gICAgICAgIHJldHVybiB3cmFwKHRhcmdldFtwcm9wXSk7XG4gICAgfSxcbiAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbiAmJlxuICAgICAgICAgICAgKHByb3AgPT09ICdkb25lJyB8fCBwcm9wID09PSAnc3RvcmUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3AgaW4gdGFyZ2V0O1xuICAgIH0sXG59O1xuZnVuY3Rpb24gcmVwbGFjZVRyYXBzKGNhbGxiYWNrKSB7XG4gICAgaWRiUHJveHlUcmFwcyA9IGNhbGxiYWNrKGlkYlByb3h5VHJhcHMpO1xufVxuZnVuY3Rpb24gd3JhcEZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAvLyBEdWUgdG8gZXhwZWN0ZWQgb2JqZWN0IGVxdWFsaXR5ICh3aGljaCBpcyBlbmZvcmNlZCBieSB0aGUgY2FjaGluZyBpbiBgd3JhcGApLCB3ZVxuICAgIC8vIG9ubHkgY3JlYXRlIG9uZSBuZXcgZnVuYyBwZXIgZnVuYy5cbiAgICAvLyBFZGdlIGRvZXNuJ3Qgc3VwcG9ydCBvYmplY3RTdG9yZU5hbWVzIChib29vKSwgc28gd2UgcG9seWZpbGwgaXQgaGVyZS5cbiAgICBpZiAoZnVuYyA9PT0gSURCRGF0YWJhc2UucHJvdG90eXBlLnRyYW5zYWN0aW9uICYmXG4gICAgICAgICEoJ29iamVjdFN0b3JlTmFtZXMnIGluIElEQlRyYW5zYWN0aW9uLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdG9yZU5hbWVzLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCB0eCA9IGZ1bmMuY2FsbCh1bndyYXAodGhpcyksIHN0b3JlTmFtZXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25TdG9yZU5hbWVzTWFwLnNldCh0eCwgc3RvcmVOYW1lcy5zb3J0ID8gc3RvcmVOYW1lcy5zb3J0KCkgOiBbc3RvcmVOYW1lc10pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXAodHgpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBDdXJzb3IgbWV0aG9kcyBhcmUgc3BlY2lhbCwgYXMgdGhlIGJlaGF2aW91ciBpcyBhIGxpdHRsZSBtb3JlIGRpZmZlcmVudCB0byBzdGFuZGFyZCBJREIuIEluXG4gICAgLy8gSURCLCB5b3UgYWR2YW5jZSB0aGUgY3Vyc29yIGFuZCB3YWl0IGZvciBhIG5ldyAnc3VjY2Vzcycgb24gdGhlIElEQlJlcXVlc3QgdGhhdCBnYXZlIHlvdSB0aGVcbiAgICAvLyBjdXJzb3IuIEl0J3Mga2luZGEgbGlrZSBhIHByb21pc2UgdGhhdCBjYW4gcmVzb2x2ZSB3aXRoIG1hbnkgdmFsdWVzLiBUaGF0IGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIC8vIHdpdGggcmVhbCBwcm9taXNlcywgc28gZWFjaCBhZHZhbmNlIG1ldGhvZHMgcmV0dXJucyBhIG5ldyBwcm9taXNlIGZvciB0aGUgY3Vyc29yIG9iamVjdCwgb3JcbiAgICAvLyB1bmRlZmluZWQgaWYgdGhlIGVuZCBvZiB0aGUgY3Vyc29yIGhhcyBiZWVuIHJlYWNoZWQuXG4gICAgaWYgKGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkuaW5jbHVkZXMoZnVuYykpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyBDYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm94eSBhcyAndGhpcycgY2F1c2VzIElMTEVHQUwgSU5WT0NBVElPTiwgc28gd2UgdXNlXG4gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgICAgICAgZnVuYy5hcHBseSh1bndyYXAodGhpcyksIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXAoY3Vyc29yUmVxdWVzdE1hcC5nZXQodGhpcykpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgLy8gQ2FsbGluZyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJveHkgYXMgJ3RoaXMnIGNhdXNlcyBJTExFR0FMIElOVk9DQVRJT04sIHNvIHdlIHVzZVxuICAgICAgICAvLyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgICByZXR1cm4gd3JhcChmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncykpO1xuICAgIH07XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1DYWNoYWJsZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIHdyYXBGdW5jdGlvbih2YWx1ZSk7XG4gICAgLy8gVGhpcyBkb2Vzbid0IHJldHVybiwgaXQganVzdCBjcmVhdGVzIGEgJ2RvbmUnIHByb21pc2UgZm9yIHRoZSB0cmFuc2FjdGlvbixcbiAgICAvLyB3aGljaCBpcyBsYXRlciByZXR1cm5lZCBmb3IgdHJhbnNhY3Rpb24uZG9uZSAoc2VlIGlkYk9iamVjdEhhbmRsZXIpLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uKVxuICAgICAgICBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odmFsdWUpO1xuICAgIGlmIChpbnN0YW5jZU9mQW55KHZhbHVlLCBnZXRJZGJQcm94eWFibGVUeXBlcygpKSlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgaWRiUHJveHlUcmFwcyk7XG4gICAgLy8gUmV0dXJuIHRoZSBzYW1lIHZhbHVlIGJhY2sgaWYgd2UncmUgbm90IGdvaW5nIHRvIHRyYW5zZm9ybSBpdC5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiB3cmFwKHZhbHVlKSB7XG4gICAgLy8gV2Ugc29tZXRpbWVzIGdlbmVyYXRlIG11bHRpcGxlIHByb21pc2VzIGZyb20gYSBzaW5nbGUgSURCUmVxdWVzdCAoZWcgd2hlbiBjdXJzb3JpbmcpLCBiZWNhdXNlXG4gICAgLy8gSURCIGlzIHdlaXJkIGFuZCBhIHNpbmdsZSBJREJSZXF1ZXN0IGNhbiB5aWVsZCBtYW55IHJlc3BvbnNlcywgc28gdGhlc2UgY2FuJ3QgYmUgY2FjaGVkLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElEQlJlcXVlc3QpXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHZhbHVlKTtcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHRyYW5zZm9ybWVkIHRoaXMgdmFsdWUgYmVmb3JlLCByZXVzZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUuXG4gICAgLy8gVGhpcyBpcyBmYXN0ZXIsIGJ1dCBpdCBhbHNvIHByb3ZpZGVzIG9iamVjdCBlcXVhbGl0eS5cbiAgICBpZiAodHJhbnNmb3JtQ2FjaGUuaGFzKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZSk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0cmFuc2Zvcm1DYWNoYWJsZVZhbHVlKHZhbHVlKTtcbiAgICAvLyBOb3QgYWxsIHR5cGVzIGFyZSB0cmFuc2Zvcm1lZC5cbiAgICAvLyBUaGVzZSBtYXkgYmUgcHJpbWl0aXZlIHR5cGVzLCBzbyB0aGV5IGNhbid0IGJlIFdlYWtNYXAga2V5cy5cbiAgICBpZiAobmV3VmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHRyYW5zZm9ybUNhY2hlLnNldCh2YWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KG5ld1ZhbHVlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cbmNvbnN0IHVud3JhcCA9ICh2YWx1ZSkgPT4gcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLmdldCh2YWx1ZSk7XG5cbmV4cG9ydCB7IHJldmVyc2VUcmFuc2Zvcm1DYWNoZSBhcyBhLCBpbnN0YW5jZU9mQW55IGFzIGksIHJlcGxhY2VUcmFwcyBhcyByLCB1bndyYXAgYXMgdSwgd3JhcCBhcyB3IH07XG4iLCJpbXBvcnQgeyB3IGFzIHdyYXAsIHIgYXMgcmVwbGFjZVRyYXBzIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5leHBvcnQgeyB1IGFzIHVud3JhcCwgdyBhcyB3cmFwIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5cbi8qKlxuICogT3BlbiBhIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRhdGFiYXNlLlxuICogQHBhcmFtIHZlcnNpb24gU2NoZW1hIHZlcnNpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2tzIEFkZGl0aW9uYWwgY2FsbGJhY2tzLlxuICovXG5mdW5jdGlvbiBvcGVuREIobmFtZSwgdmVyc2lvbiwgeyBibG9ja2VkLCB1cGdyYWRlLCBibG9ja2luZywgdGVybWluYXRlZCB9ID0ge30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4obmFtZSwgdmVyc2lvbik7XG4gICAgY29uc3Qgb3BlblByb21pc2UgPSB3cmFwKHJlcXVlc3QpO1xuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigndXBncmFkZW5lZWRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdXBncmFkZSh3cmFwKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgd3JhcChyZXF1ZXN0LnRyYW5zYWN0aW9uKSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIG9wZW5Qcm9taXNlXG4gICAgICAgIC50aGVuKChkYikgPT4ge1xuICAgICAgICBpZiAodGVybWluYXRlZClcbiAgICAgICAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKCkgPT4gdGVybWluYXRlZCgpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nKSB7XG4gICAgICAgICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCd2ZXJzaW9uY2hhbmdlJywgKGV2ZW50KSA9PiBibG9ja2luZyhldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG9wZW5Qcm9taXNlO1xufVxuLyoqXG4gKiBEZWxldGUgYSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkYXRhYmFzZS5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlREIobmFtZSwgeyBibG9ja2VkIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UobmFtZSk7XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwKHJlcXVlc3QpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbn1cblxuY29uc3QgcmVhZE1ldGhvZHMgPSBbJ2dldCcsICdnZXRLZXknLCAnZ2V0QWxsJywgJ2dldEFsbEtleXMnLCAnY291bnQnXTtcbmNvbnN0IHdyaXRlTWV0aG9kcyA9IFsncHV0JywgJ2FkZCcsICdkZWxldGUnLCAnY2xlYXInXTtcbmNvbnN0IGNhY2hlZE1ldGhvZHMgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURCRGF0YWJhc2UgJiZcbiAgICAgICAgIShwcm9wIGluIHRhcmdldCkgJiZcbiAgICAgICAgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZWRNZXRob2RzLmdldChwcm9wKSlcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApO1xuICAgIGNvbnN0IHRhcmdldEZ1bmNOYW1lID0gcHJvcC5yZXBsYWNlKC9Gcm9tSW5kZXgkLywgJycpO1xuICAgIGNvbnN0IHVzZUluZGV4ID0gcHJvcCAhPT0gdGFyZ2V0RnVuY05hbWU7XG4gICAgY29uc3QgaXNXcml0ZSA9IHdyaXRlTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSk7XG4gICAgaWYgKFxuICAgIC8vIEJhaWwgaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQuIEVnLCBnZXRBbGwgaXNuJ3QgaW4gRWRnZS5cbiAgICAhKHRhcmdldEZ1bmNOYW1lIGluICh1c2VJbmRleCA/IElEQkluZGV4IDogSURCT2JqZWN0U3RvcmUpLnByb3RvdHlwZSkgfHxcbiAgICAgICAgIShpc1dyaXRlIHx8IHJlYWRNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBhc3luYyBmdW5jdGlvbiAoc3RvcmVOYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIGlzV3JpdGUgPyAncmVhZHdyaXRlJyA6IHVuZGVmaW5lZCBnemlwcHMgYmV0dGVyLCBidXQgZmFpbHMgaW4gRWRnZSA6KFxuICAgICAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHR4LnN0b3JlO1xuICAgICAgICBpZiAodXNlSW5kZXgpXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaW5kZXgoYXJncy5zaGlmdCgpKTtcbiAgICAgICAgLy8gTXVzdCByZWplY3QgaWYgb3AgcmVqZWN0cy5cbiAgICAgICAgLy8gSWYgaXQncyBhIHdyaXRlIG9wZXJhdGlvbiwgbXVzdCByZWplY3QgaWYgdHguZG9uZSByZWplY3RzLlxuICAgICAgICAvLyBNdXN0IHJlamVjdCB3aXRoIG9wIHJlamVjdGlvbiBmaXJzdC5cbiAgICAgICAgLy8gTXVzdCByZXNvbHZlIHdpdGggb3AgdmFsdWUuXG4gICAgICAgIC8vIE11c3QgaGFuZGxlIGJvdGggcHJvbWlzZXMgKG5vIHVuaGFuZGxlZCByZWplY3Rpb25zKVxuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRhcmdldFt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksXG4gICAgICAgICAgICBpc1dyaXRlICYmIHR4LmRvbmUsXG4gICAgICAgIF0pKVswXTtcbiAgICB9O1xuICAgIGNhY2hlZE1ldGhvZHMuc2V0KHByb3AsIG1ldGhvZCk7XG4gICAgcmV0dXJuIG1ldGhvZDtcbn1cbnJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7XG4gICAgLi4ub2xkVHJhcHMsXG4gICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpLFxuICAgIGhhczogKHRhcmdldCwgcHJvcCkgPT4gISFnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKSxcbn0pKTtcblxuZXhwb3J0IHsgZGVsZXRlREIsIG9wZW5EQiB9O1xuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IExvZ2dlciwgc2V0VXNlckxvZ0hhbmRsZXIsIHNldExvZ0xldmVsIGFzIHNldExvZ0xldmVsJDEgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IEVycm9yRmFjdG9yeSwgZ2V0RGVmYXVsdEFwcENvbmZpZywgZGVlcEVxdWFsLCBGaXJlYmFzZUVycm9yLCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZywgaXNJbmRleGVkREJBdmFpbGFibGUsIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5leHBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgb3BlbkRCIH0gZnJvbSAnaWRiJztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIH1cclxuICAgIC8vIEluIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgaW5zdGFsbGF0aW9ucyBvblxyXG4gICAgLy8gYXV0aCB0b2tlbiByZWZyZXNoLCBhbmQgaW5zdGFsbGF0aW9ucyB3aWxsIHNlbmQgdGhpcyBzdHJpbmcuXHJcbiAgICBnZXRQbGF0Zm9ybUluZm9TdHJpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gdGhpcy5jb250YWluZXIuZ2V0UHJvdmlkZXJzKCk7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHByb3ZpZGVycyBhbmQgZ2V0IGxpYnJhcnkvdmVyc2lvbiBwYWlycyBmcm9tIGFueSB0aGF0IGFyZVxyXG4gICAgICAgIC8vIHZlcnNpb24gY29tcG9uZW50cy5cclxuICAgICAgICByZXR1cm4gcHJvdmlkZXJzXHJcbiAgICAgICAgICAgIC5tYXAocHJvdmlkZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3NlcnZpY2UubGlicmFyeX0vJHtzZXJ2aWNlLnZlcnNpb259YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcihsb2dTdHJpbmcgPT4gbG9nU3RyaW5nKVxyXG4gICAgICAgICAgICAuam9pbignICcpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvdmlkZXIgY2hlY2sgaWYgdGhpcyBwcm92aWRlciBwcm92aWRlcyBhIFZlcnNpb25TZXJ2aWNlXHJcbiAqXHJcbiAqIE5PVEU6IFVzaW5nIFByb3ZpZGVyPCdhcHAtdmVyc2lvbic+IGlzIGEgaGFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm92aWRlclxyXG4gKiBwcm92aWRlcyBWZXJzaW9uU2VydmljZS4gVGhlIHByb3ZpZGVyIGlzIG5vdCBuZWNlc3NhcmlseSBhICdhcHAtdmVyc2lvbidcclxuICogcHJvdmlkZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXIpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHByb3ZpZGVyLmdldENvbXBvbmVudCgpO1xyXG4gICAgcmV0dXJuIChjb21wb25lbnQgPT09IG51bGwgfHwgY29tcG9uZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wb25lbnQudHlwZSkgPT09IFwiVkVSU0lPTlwiIC8qIENvbXBvbmVudFR5cGUuVkVSU0lPTiAqLztcclxufVxuXG5jb25zdCBuYW1lJG8gPSBcIkBmaXJlYmFzZS9hcHBcIjtcbmNvbnN0IHZlcnNpb24kMSA9IFwiMC45LjEzXCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hcHAnKTtcblxuY29uc3QgbmFtZSRuID0gXCJAZmlyZWJhc2UvYXBwLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJG0gPSBcIkBmaXJlYmFzZS9hbmFseXRpY3MtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkbCA9IFwiQGZpcmViYXNlL2FuYWx5dGljc1wiO1xuXG5jb25zdCBuYW1lJGsgPSBcIkBmaXJlYmFzZS9hcHAtY2hlY2stY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkaiA9IFwiQGZpcmViYXNlL2FwcC1jaGVja1wiO1xuXG5jb25zdCBuYW1lJGkgPSBcIkBmaXJlYmFzZS9hdXRoXCI7XG5cbmNvbnN0IG5hbWUkaCA9IFwiQGZpcmViYXNlL2F1dGgtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkZyA9IFwiQGZpcmViYXNlL2RhdGFiYXNlXCI7XG5cbmNvbnN0IG5hbWUkZiA9IFwiQGZpcmViYXNlL2RhdGFiYXNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGUgPSBcIkBmaXJlYmFzZS9mdW5jdGlvbnNcIjtcblxuY29uc3QgbmFtZSRkID0gXCJAZmlyZWJhc2UvZnVuY3Rpb25zLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJGMgPSBcIkBmaXJlYmFzZS9pbnN0YWxsYXRpb25zXCI7XG5cbmNvbnN0IG5hbWUkYiA9IFwiQGZpcmViYXNlL2luc3RhbGxhdGlvbnMtY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkYSA9IFwiQGZpcmViYXNlL21lc3NhZ2luZ1wiO1xuXG5jb25zdCBuYW1lJDkgPSBcIkBmaXJlYmFzZS9tZXNzYWdpbmctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkOCA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlXCI7XG5cbmNvbnN0IG5hbWUkNyA9IFwiQGZpcmViYXNlL3BlcmZvcm1hbmNlLWNvbXBhdFwiO1xuXG5jb25zdCBuYW1lJDYgPSBcIkBmaXJlYmFzZS9yZW1vdGUtY29uZmlnXCI7XG5cbmNvbnN0IG5hbWUkNSA9IFwiQGZpcmViYXNlL3JlbW90ZS1jb25maWctY29tcGF0XCI7XG5cbmNvbnN0IG5hbWUkNCA9IFwiQGZpcmViYXNlL3N0b3JhZ2VcIjtcblxuY29uc3QgbmFtZSQzID0gXCJAZmlyZWJhc2Uvc3RvcmFnZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSQyID0gXCJAZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbmNvbnN0IG5hbWUkMSA9IFwiQGZpcmViYXNlL2ZpcmVzdG9yZS1jb21wYXRcIjtcblxuY29uc3QgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbmNvbnN0IHZlcnNpb24gPSBcIjkuMjMuMFwiO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGRlZmF1bHQgYXBwIG5hbWVcclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBERUZBVUxUX0VOVFJZX05BTUUgPSAnW0RFRkFVTFRdJztcclxuY29uc3QgUExBVEZPUk1fTE9HX1NUUklORyA9IHtcclxuICAgIFtuYW1lJG9dOiAnZmlyZS1jb3JlJyxcclxuICAgIFtuYW1lJG5dOiAnZmlyZS1jb3JlLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRsXTogJ2ZpcmUtYW5hbHl0aWNzJyxcclxuICAgIFtuYW1lJG1dOiAnZmlyZS1hbmFseXRpY3MtY29tcGF0JyxcclxuICAgIFtuYW1lJGpdOiAnZmlyZS1hcHAtY2hlY2snLFxyXG4gICAgW25hbWUka106ICdmaXJlLWFwcC1jaGVjay1jb21wYXQnLFxyXG4gICAgW25hbWUkaV06ICdmaXJlLWF1dGgnLFxyXG4gICAgW25hbWUkaF06ICdmaXJlLWF1dGgtY29tcGF0JyxcclxuICAgIFtuYW1lJGddOiAnZmlyZS1ydGRiJyxcclxuICAgIFtuYW1lJGZdOiAnZmlyZS1ydGRiLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRlXTogJ2ZpcmUtZm4nLFxyXG4gICAgW25hbWUkZF06ICdmaXJlLWZuLWNvbXBhdCcsXHJcbiAgICBbbmFtZSRjXTogJ2ZpcmUtaWlkJyxcclxuICAgIFtuYW1lJGJdOiAnZmlyZS1paWQtY29tcGF0JyxcclxuICAgIFtuYW1lJGFdOiAnZmlyZS1mY20nLFxyXG4gICAgW25hbWUkOV06ICdmaXJlLWZjbS1jb21wYXQnLFxyXG4gICAgW25hbWUkOF06ICdmaXJlLXBlcmYnLFxyXG4gICAgW25hbWUkN106ICdmaXJlLXBlcmYtY29tcGF0JyxcclxuICAgIFtuYW1lJDZdOiAnZmlyZS1yYycsXHJcbiAgICBbbmFtZSQ1XTogJ2ZpcmUtcmMtY29tcGF0JyxcclxuICAgIFtuYW1lJDRdOiAnZmlyZS1nY3MnLFxyXG4gICAgW25hbWUkM106ICdmaXJlLWdjcy1jb21wYXQnLFxyXG4gICAgW25hbWUkMl06ICdmaXJlLWZzdCcsXHJcbiAgICBbbmFtZSQxXTogJ2ZpcmUtZnN0LWNvbXBhdCcsXHJcbiAgICAnZmlyZS1qcyc6ICdmaXJlLWpzJyxcclxuICAgIFtuYW1lXTogJ2ZpcmUtanMtYWxsJ1xyXG59O1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5jb25zdCBfYXBwcyA9IG5ldyBNYXAoKTtcclxuLyoqXHJcbiAqIFJlZ2lzdGVyZWQgY29tcG9uZW50cy5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5jb25zdCBfY29tcG9uZW50cyA9IG5ldyBNYXAoKTtcclxuLyoqXHJcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIHRvIHRoaXMgYXBwJ3MgY29udGFpbmVyXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2FkZENvbXBvbmVudChhcHAsIGNvbXBvbmVudCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBhcHAuY29udGFpbmVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBGaXJlYmFzZUFwcCAke2FwcC5uYW1lfWAsIGUpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChhcHAsIGNvbXBvbmVudCkge1xyXG4gICAgYXBwLmNvbnRhaW5lci5hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChjb21wb25lbnQpO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdGhlIGNvbXBvbmVudCB0byByZWdpc3RlclxyXG4gKiBAcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgaWYgKF9jb21wb25lbnRzLmhhcyhjb21wb25lbnROYW1lKSkge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlcmUgd2VyZSBtdWx0aXBsZSBhdHRlbXB0cyB0byByZWdpc3RlciBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBfY29tcG9uZW50cy5zZXQoY29tcG9uZW50TmFtZSwgY29tcG9uZW50KTtcclxuICAgIC8vIGFkZCB0aGUgY29tcG9uZW50IHRvIGV4aXN0aW5nIGFwcCBpbnN0YW5jZXNcclxuICAgIGZvciAoY29uc3QgYXBwIG9mIF9hcHBzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgX2FkZENvbXBvbmVudChhcHAsIGNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXHJcbiAqIEBwYXJhbSBuYW1lIC0gc2VydmljZSBuYW1lXHJcbiAqXHJcbiAqIEByZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZVxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9nZXRQcm92aWRlcihhcHAsIG5hbWUpIHtcclxuICAgIGNvbnN0IGhlYXJ0YmVhdENvbnRyb2xsZXIgPSBhcHAuY29udGFpbmVyXHJcbiAgICAgICAgLmdldFByb3ZpZGVyKCdoZWFydGJlYXQnKVxyXG4gICAgICAgIC5nZXRJbW1lZGlhdGUoeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICAgIGlmIChoZWFydGJlYXRDb250cm9sbGVyKSB7XHJcbiAgICAgICAgdm9pZCBoZWFydGJlYXRDb250cm9sbGVyLnRyaWdnZXJIZWFydGJlYXQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcHAuY29udGFpbmVyLmdldFByb3ZpZGVyKG5hbWUpO1xyXG59XHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcclxuICogQHBhcmFtIG5hbWUgLSBzZXJ2aWNlIG5hbWVcclxuICogQHBhcmFtIGluc3RhbmNlSWRlbnRpZmllciAtIHNlcnZpY2UgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlc1xyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmZ1bmN0aW9uIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UoYXBwLCBuYW1lLCBpbnN0YW5jZUlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgIF9nZXRQcm92aWRlcihhcHAsIG5hbWUpLmNsZWFySW5zdGFuY2UoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxufVxyXG4vKipcclxuICogVGVzdCBvbmx5XHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZnVuY3Rpb24gX2NsZWFyQ29tcG9uZW50cygpIHtcclxuICAgIF9jb21wb25lbnRzLmNsZWFyKCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgRVJST1JTID0ge1xyXG4gICAgW1wibm8tYXBwXCIgLyogQXBwRXJyb3IuTk9fQVBQICovXTogXCJObyBGaXJlYmFzZSBBcHAgJ3skYXBwTmFtZX0nIGhhcyBiZWVuIGNyZWF0ZWQgLSBcIiArXHJcbiAgICAgICAgJ2NhbGwgaW5pdGlhbGl6ZUFwcCgpIGZpcnN0JyxcclxuICAgIFtcImJhZC1hcHAtbmFtZVwiIC8qIEFwcEVycm9yLkJBRF9BUFBfTkFNRSAqL106IFwiSWxsZWdhbCBBcHAgbmFtZTogJ3skYXBwTmFtZX1cIixcclxuICAgIFtcImR1cGxpY2F0ZS1hcHBcIiAvKiBBcHBFcnJvci5EVVBMSUNBVEVfQVBQICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgb3IgY29uZmlnXCIsXHJcbiAgICBbXCJhcHAtZGVsZXRlZFwiIC8qIEFwcEVycm9yLkFQUF9ERUxFVEVEICovXTogXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZGVsZXRlZFwiLFxyXG4gICAgW1wibm8tb3B0aW9uc1wiIC8qIEFwcEVycm9yLk5PX09QVElPTlMgKi9dOiAnTmVlZCB0byBwcm92aWRlIG9wdGlvbnMsIHdoZW4gbm90IGJlaW5nIGRlcGxveWVkIHRvIGhvc3RpbmcgdmlhIHNvdXJjZS4nLFxyXG4gICAgW1wiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBBcHBFcnJvci5JTlZBTElEX0FQUF9BUkdVTUVOVCAqL106ICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXHJcbiAgICAgICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nLFxyXG4gICAgW1wiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBBcHBFcnJvci5JTlZBTElEX0xPR19BUkdVTUVOVCAqL106ICdGaXJzdCBhcmd1bWVudCB0byBgb25Mb2dgIG11c3QgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLicsXHJcbiAgICBbXCJpZGItb3BlblwiIC8qIEFwcEVycm9yLklEQl9PUEVOICovXTogJ0Vycm9yIHRocm93biB3aGVuIG9wZW5pbmcgSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcclxuICAgIFtcImlkYi1nZXRcIiAvKiBBcHBFcnJvci5JREJfR0VUICovXTogJ0Vycm9yIHRocm93biB3aGVuIHJlYWRpbmcgZnJvbSBJbmRleGVkREIuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxyXG4gICAgW1wiaWRiLXNldFwiIC8qIEFwcEVycm9yLklEQl9XUklURSAqL106ICdFcnJvciB0aHJvd24gd2hlbiB3cml0aW5nIHRvIEluZGV4ZWREQi4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9LicsXHJcbiAgICBbXCJpZGItZGVsZXRlXCIgLyogQXBwRXJyb3IuSURCX0RFTEVURSAqL106ICdFcnJvciB0aHJvd24gd2hlbiBkZWxldGluZyBmcm9tIEluZGV4ZWREQi4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9LidcclxufTtcclxuY29uc3QgRVJST1JfRkFDVE9SWSA9IG5ldyBFcnJvckZhY3RvcnkoJ2FwcCcsICdGaXJlYmFzZScsIEVSUk9SUyk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIEZpcmViYXNlQXBwSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb25maWcsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuX2lzRGVsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xyXG4gICAgICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcclxuICAgICAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPVxyXG4gICAgICAgICAgICBjb25maWcuYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDb21wb25lbnQobmV3IENvbXBvbmVudCgnYXBwJywgKCkgPT4gdGhpcywgXCJQVUJMSUNcIiAvKiBDb21wb25lbnRUeXBlLlBVQkxJQyAqLykpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCgpIHtcclxuICAgICAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDtcclxuICAgIH1cclxuICAgIHNldCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQodmFsKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHRoaXMuX2F1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCA9IHZhbDtcclxuICAgIH1cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcclxuICAgIH1cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcclxuICAgIH1cclxuICAgIGdldCBjb25maWcoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XHJcbiAgICB9XHJcbiAgICBnZXQgY29udGFpbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RlbGV0ZWQ7XHJcbiAgICB9XHJcbiAgICBzZXQgaXNEZWxldGVkKHZhbCkge1xyXG4gICAgICAgIHRoaXMuX2lzRGVsZXRlZCA9IHZhbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGFuIEVycm9yIGlmIHRoZSBBcHAgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkIC1cclxuICAgICAqIHVzZSBiZWZvcmUgcGVyZm9ybWluZyBBUEkgYWN0aW9ucyBvbiB0aGUgQXBwLlxyXG4gICAgICovXHJcbiAgICBjaGVja0Rlc3Ryb3llZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0RlbGV0ZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJhcHAtZGVsZXRlZFwiIC8qIEFwcEVycm9yLkFQUF9ERUxFVEVEICovLCB7IGFwcE5hbWU6IHRoaXMuX25hbWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBUaGUgY3VycmVudCBTREsgdmVyc2lvbi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuY29uc3QgU0RLX1ZFUlNJT04gPSB2ZXJzaW9uO1xyXG5mdW5jdGlvbiBpbml0aWFsaXplQXBwKF9vcHRpb25zLCByYXdDb25maWcgPSB7fSkge1xyXG4gICAgbGV0IG9wdGlvbnMgPSBfb3B0aW9ucztcclxuICAgIGlmICh0eXBlb2YgcmF3Q29uZmlnICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSByYXdDb25maWc7XHJcbiAgICAgICAgcmF3Q29uZmlnID0geyBuYW1lIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHsgbmFtZTogREVGQVVMVF9FTlRSWV9OQU1FLCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGZhbHNlIH0sIHJhd0NvbmZpZyk7XHJcbiAgICBjb25zdCBuYW1lID0gY29uZmlnLm5hbWU7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8ICFuYW1lKSB7XHJcbiAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJiYWQtYXBwLW5hbWVcIiAvKiBBcHBFcnJvci5CQURfQVBQX05BTUUgKi8sIHtcclxuICAgICAgICAgICAgYXBwTmFtZTogU3RyaW5nKG5hbWUpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0gZ2V0RGVmYXVsdEFwcENvbmZpZygpKTtcclxuICAgIGlmICghb3B0aW9ucykge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwibm8tb3B0aW9uc1wiIC8qIEFwcEVycm9yLk5PX09QVElPTlMgKi8pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBfYXBwcy5nZXQobmFtZSk7XHJcbiAgICBpZiAoZXhpc3RpbmdBcHApIHtcclxuICAgICAgICAvLyByZXR1cm4gdGhlIGV4aXN0aW5nIGFwcCBpZiBvcHRpb25zIGFuZCBjb25maWcgZGVlcCBlcXVhbCB0aGUgb25lcyBpbiB0aGUgZXhpc3RpbmcgYXBwLlxyXG4gICAgICAgIGlmIChkZWVwRXF1YWwob3B0aW9ucywgZXhpc3RpbmdBcHAub3B0aW9ucykgJiZcclxuICAgICAgICAgICAgZGVlcEVxdWFsKGNvbmZpZywgZXhpc3RpbmdBcHAuY29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdBcHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImR1cGxpY2F0ZS1hcHBcIiAvKiBBcHBFcnJvci5EVVBMSUNBVEVfQVBQICovLCB7IGFwcE5hbWU6IG5hbWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IENvbXBvbmVudENvbnRhaW5lcihuYW1lKTtcclxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIF9jb21wb25lbnRzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgY29udGFpbmVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV3QXBwID0gbmV3IEZpcmViYXNlQXBwSW1wbChvcHRpb25zLCBjb25maWcsIGNvbnRhaW5lcik7XHJcbiAgICBfYXBwcy5zZXQobmFtZSwgbmV3QXBwKTtcclxuICAgIHJldHVybiBuZXdBcHA7XHJcbn1cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfSBpbnN0YW5jZS5cclxuICpcclxuICogV2hlbiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIHRoZSBkZWZhdWx0IGFwcCBpcyByZXR1cm5lZC4gV2hlbiBhbiBhcHAgbmFtZVxyXG4gKiBpcyBwcm92aWRlZCwgdGhlIGFwcCBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbmFtZSBpcyByZXR1cm5lZC5cclxuICpcclxuICogQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgYXBwIGJlaW5nIHJldHJpZXZlZCBoYXMgbm90IHlldCBiZWVuXHJcbiAqIGluaXRpYWxpemVkLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFJldHVybiB0aGUgZGVmYXVsdCBhcHBcclxuICogY29uc3QgYXBwID0gZ2V0QXBwKCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIFJldHVybiBhIG5hbWVkIGFwcFxyXG4gKiBjb25zdCBvdGhlckFwcCA9IGdldEFwcChcIm90aGVyQXBwXCIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIG5hbWUgLSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhcHAgdG8gcmV0dXJuLiBJZiBubyBuYW1lIGlzXHJcbiAqICAgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGlzIGBcIltERUZBVUxUXVwiYC5cclxuICpcclxuICogQHJldHVybnMgVGhlIGFwcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBhcHAgbmFtZS5cclxuICogICBJZiBubyBhcHAgbmFtZSBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYXBwIGlzIHJldHVybmVkLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBcHAobmFtZSA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgY29uc3QgYXBwID0gX2FwcHMuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKCFhcHAgJiYgbmFtZSA9PT0gREVGQVVMVF9FTlRSWV9OQU1FICYmIGdldERlZmF1bHRBcHBDb25maWcoKSkge1xyXG4gICAgICAgIHJldHVybiBpbml0aWFsaXplQXBwKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWFwcCkge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwibm8tYXBwXCIgLyogQXBwRXJyb3IuTk9fQVBQICovLCB7IGFwcE5hbWU6IG5hbWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXBwO1xyXG59XHJcbi8qKlxyXG4gKiBBIChyZWFkLW9ubHkpIGFycmF5IG9mIGFsbCBpbml0aWFsaXplZCBhcHBzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBcHBzKCkge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2FwcHMudmFsdWVzKCkpO1xyXG59XHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgYXBwIHVudXNhYmxlIGFuZCBmcmVlcyB0aGUgcmVzb3VyY2VzIG9mIGFsbCBhc3NvY2lhdGVkXHJcbiAqIHNlcnZpY2VzLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGRlbGV0ZUFwcChhcHApXHJcbiAqICAgLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAqICAgICBjb25zb2xlLmxvZyhcIkFwcCBkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICogICB9KVxyXG4gKiAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xyXG4gKiAgICAgY29uc29sZS5sb2coXCJFcnJvciBkZWxldGluZyBhcHA6XCIsIGVycm9yKTtcclxuICogICB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFwcChhcHApIHtcclxuICAgIGNvbnN0IG5hbWUgPSBhcHAubmFtZTtcclxuICAgIGlmIChfYXBwcy5oYXMobmFtZSkpIHtcclxuICAgICAgICBfYXBwcy5kZWxldGUobmFtZSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXBwLmNvbnRhaW5lclxyXG4gICAgICAgICAgICAuZ2V0UHJvdmlkZXJzKClcclxuICAgICAgICAgICAgLm1hcChwcm92aWRlciA9PiBwcm92aWRlci5kZWxldGUoKSkpO1xyXG4gICAgICAgIGFwcC5pc0RlbGV0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZWdpc3RlcnMgYSBsaWJyYXJ5J3MgbmFtZSBhbmQgdmVyc2lvbiBmb3IgcGxhdGZvcm0gbG9nZ2luZyBwdXJwb3Nlcy5cclxuICogQHBhcmFtIGxpYnJhcnkgLSBOYW1lIG9mIDFwIG9yIDNwIGxpYnJhcnkgKGUuZy4gZmlyZXN0b3JlLCBhbmd1bGFyZmlyZSlcclxuICogQHBhcmFtIHZlcnNpb24gLSBDdXJyZW50IHZlcnNpb24gb2YgdGhhdCBsaWJyYXJ5LlxyXG4gKiBAcGFyYW0gdmFyaWFudCAtIEJ1bmRsZSB2YXJpYW50LCBlLmcuLCBub2RlLCBybiwgZXRjLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlclZlcnNpb24obGlicmFyeUtleU9yTmFtZSwgdmVyc2lvbiwgdmFyaWFudCkge1xyXG4gICAgdmFyIF9hO1xyXG4gICAgLy8gVE9ETzogV2UgY2FuIHVzZSB0aGlzIGNoZWNrIHRvIHdoaXRlbGlzdCBzdHJpbmdzIHdoZW4vaWYgd2Ugc2V0IHVwXHJcbiAgICAvLyBhIGdvb2Qgd2hpdGVsaXN0IHN5c3RlbS5cclxuICAgIGxldCBsaWJyYXJ5ID0gKF9hID0gUExBVEZPUk1fTE9HX1NUUklOR1tsaWJyYXJ5S2V5T3JOYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbGlicmFyeUtleU9yTmFtZTtcclxuICAgIGlmICh2YXJpYW50KSB7XHJcbiAgICAgICAgbGlicmFyeSArPSBgLSR7dmFyaWFudH1gO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGlicmFyeU1pc21hdGNoID0gbGlicmFyeS5tYXRjaCgvXFxzfFxcLy8pO1xyXG4gICAgY29uc3QgdmVyc2lvbk1pc21hdGNoID0gdmVyc2lvbi5tYXRjaCgvXFxzfFxcLy8pO1xyXG4gICAgaWYgKGxpYnJhcnlNaXNtYXRjaCB8fCB2ZXJzaW9uTWlzbWF0Y2gpIHtcclxuICAgICAgICBjb25zdCB3YXJuaW5nID0gW1xyXG4gICAgICAgICAgICBgVW5hYmxlIHRvIHJlZ2lzdGVyIGxpYnJhcnkgXCIke2xpYnJhcnl9XCIgd2l0aCB2ZXJzaW9uIFwiJHt2ZXJzaW9ufVwiOmBcclxuICAgICAgICBdO1xyXG4gICAgICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2gpIHtcclxuICAgICAgICAgICAgd2FybmluZy5wdXNoKGBsaWJyYXJ5IG5hbWUgXCIke2xpYnJhcnl9XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlicmFyeU1pc21hdGNoICYmIHZlcnNpb25NaXNtYXRjaCkge1xyXG4gICAgICAgICAgICB3YXJuaW5nLnB1c2goJ2FuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmVyc2lvbk1pc21hdGNoKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmcucHVzaChgdmVyc2lvbiBuYW1lIFwiJHt2ZXJzaW9ufVwiIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycyAod2hpdGVzcGFjZSBvciBcIi9cIilgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nZ2VyLndhcm4od2FybmluZy5qb2luKCcgJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIF9yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KGAke2xpYnJhcnl9LXZlcnNpb25gLCAoKSA9PiAoeyBsaWJyYXJ5LCB2ZXJzaW9uIH0pLCBcIlZFUlNJT05cIiAvKiBDb21wb25lbnRUeXBlLlZFUlNJT04gKi8pKTtcclxufVxyXG4vKipcclxuICogU2V0cyBsb2cgaGFuZGxlciBmb3IgYWxsIEZpcmViYXNlIFNES3MuXHJcbiAqIEBwYXJhbSBsb2dDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGN1c3RvbSBsb2cgaGFuZGxlciB0aGF0IGV4ZWN1dGVzIHVzZXIgY29kZSB3aGVuZXZlclxyXG4gKiB0aGUgRmlyZWJhc2UgU0RLIG1ha2VzIGEgbG9nZ2luZyBjYWxsLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBvbkxvZyhsb2dDYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgaWYgKGxvZ0NhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBsb2dDYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiaW52YWxpZC1sb2ctYXJndW1lbnRcIiAvKiBBcHBFcnJvci5JTlZBTElEX0xPR19BUkdVTUVOVCAqLyk7XHJcbiAgICB9XHJcbiAgICBzZXRVc2VyTG9nSGFuZGxlcihsb2dDYWxsYmFjaywgb3B0aW9ucyk7XHJcbn1cclxuLyoqXHJcbiAqIFNldHMgbG9nIGxldmVsIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cclxuICpcclxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFyZSBjYXB0dXJlZCAoaS5lLiBpZlxyXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYGluZm9gLCBlcnJvcnMgYXJlIGxvZ2dlZCwgYnV0IGBkZWJ1Z2AgYW5kXHJcbiAqIGB2ZXJib3NlYCBsb2dzIGFyZSBub3QpLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRMb2dMZXZlbChsb2dMZXZlbCkge1xyXG4gICAgc2V0TG9nTGV2ZWwkMShsb2dMZXZlbCk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgREJfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtZGF0YWJhc2UnO1xyXG5jb25zdCBEQl9WRVJTSU9OID0gMTtcclxuY29uc3QgU1RPUkVfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnO1xyXG5sZXQgZGJQcm9taXNlID0gbnVsbDtcclxuZnVuY3Rpb24gZ2V0RGJQcm9taXNlKCkge1xyXG4gICAgaWYgKCFkYlByb21pc2UpIHtcclxuICAgICAgICBkYlByb21pc2UgPSBvcGVuREIoREJfTkFNRSwgREJfVkVSU0lPTiwge1xyXG4gICAgICAgICAgICB1cGdyYWRlOiAoZGIsIG9sZFZlcnNpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHVzZSAnYnJlYWsnIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCwgdGhlIGZhbGwtdGhyb3VnaFxyXG4gICAgICAgICAgICAgICAgLy8gYmVoYXZpb3IgaXMgd2hhdCB3ZSB3YW50LCBiZWNhdXNlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBiZXR3ZWVuXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgb2xkIHZlcnNpb24gYW5kIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIHdhbnQgQUxMIHRoZSBtaWdyYXRpb25zXHJcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhvc2UgdmVyc2lvbnMgdG8gcnVuLCBub3Qgb25seSB0aGUgbGFzdCBvbmUuXHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9sZFZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKFwiaWRiLW9wZW5cIiAvKiBBcHBFcnJvci5JREJfT1BFTiAqLywge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYlByb21pc2U7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gcmVhZEhlYXJ0YmVhdHNGcm9tSW5kZXhlZERCKGFwcCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IGdldERiUHJvbWlzZSgpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXHJcbiAgICAgICAgICAgIC50cmFuc2FjdGlvbihTVE9SRV9OQU1FKVxyXG4gICAgICAgICAgICAub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSlcclxuICAgICAgICAgICAgLmdldChjb21wdXRlS2V5KGFwcCkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xyXG4gICAgICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaWRiR2V0RXJyb3IgPSBFUlJPUl9GQUNUT1JZLmNyZWF0ZShcImlkYi1nZXRcIiAvKiBBcHBFcnJvci5JREJfR0VUICovLCB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLm1lc3NhZ2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGlkYkdldEVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5hc3luYyBmdW5jdGlvbiB3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQihhcHAsIGhlYXJ0YmVhdE9iamVjdCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IGdldERiUHJvbWlzZSgpO1xyXG4gICAgICAgIGNvbnN0IHR4ID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xyXG4gICAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XHJcbiAgICAgICAgYXdhaXQgb2JqZWN0U3RvcmUucHV0KGhlYXJ0YmVhdE9iamVjdCwgY29tcHV0ZUtleShhcHApKTtcclxuICAgICAgICBhd2FpdCB0eC5kb25lO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkYkdldEVycm9yID0gRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJpZGItc2V0XCIgLyogQXBwRXJyb3IuSURCX1dSSVRFICovLCB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLm1lc3NhZ2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGlkYkdldEVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjb21wdXRlS2V5KGFwcCkge1xyXG4gICAgcmV0dXJuIGAke2FwcC5uYW1lfSEke2FwcC5vcHRpb25zLmFwcElkfWA7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgTUFYX0hFQURFUl9CWVRFUyA9IDEwMjQ7XHJcbi8vIDMwIGRheXNcclxuY29uc3QgU1RPUkVEX0hFQVJUQkVBVF9SRVRFTlRJT05fTUFYX01JTExJUyA9IDMwICogMjQgKiA2MCAqIDYwICogMTAwMDtcclxuY2xhc3MgSGVhcnRiZWF0U2VydmljZUltcGwge1xyXG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyKSB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW4tbWVtb3J5IGNhY2hlIGZvciBoZWFydGJlYXRzLCB1c2VkIGJ5IGdldEhlYXJ0YmVhdHNIZWFkZXIoKSB0byBnZW5lcmF0ZVxyXG4gICAgICAgICAqIHRoZSBoZWFkZXIgc3RyaW5nLlxyXG4gICAgICAgICAqIFN0b3JlcyBvbmUgcmVjb3JkIHBlciBkYXRlLiBUaGlzIHdpbGwgYmUgY29uc29saWRhdGVkIGludG8gdGhlIHN0YW5kYXJkXHJcbiAgICAgICAgICogZm9ybWF0IG9mIG9uZSByZWNvcmQgcGVyIHVzZXIgYWdlbnQgc3RyaW5nIGJlZm9yZSBiZWluZyBzZW50IGFzIGEgaGVhZGVyLlxyXG4gICAgICAgICAqIFBvcHVsYXRlZCBmcm9tIGluZGV4ZWREQiB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGluc3RhbnRpYXRlZCBhbmQgc2hvdWxkXHJcbiAgICAgICAgICogYmUga2VwdCBpbiBzeW5jIHdpdGggaW5kZXhlZERCLlxyXG4gICAgICAgICAqIExlYXZlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlID0gbnVsbDtcclxuICAgICAgICBjb25zdCBhcHAgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwJykuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBIZWFydGJlYXRTdG9yYWdlSW1wbChhcHApO1xyXG4gICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2UgPSB0aGlzLl9zdG9yYWdlLnJlYWQoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHRvIHJlcG9ydCBhIGhlYXJ0YmVhdC4gVGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGVcclxuICAgICAqIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IG9iamVjdCwgdXBkYXRlIGhlYXJ0YmVhdHNDYWNoZSwgYW5kIHBlcnNpc3QgaXRcclxuICAgICAqIHRvIEluZGV4ZWREQi5cclxuICAgICAqIE5vdGUgdGhhdCB3ZSBvbmx5IHN0b3JlIG9uZSBoZWFydGJlYXQgcGVyIGRheS4gU28gaWYgYSBoZWFydGJlYXQgZm9yIHRvZGF5IGlzXHJcbiAgICAgKiBhbHJlYWR5IGxvZ2dlZCwgc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGRheSB3aWxsIGJlIGlnbm9yZWQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyaWdnZXJIZWFydGJlYXQoKSB7XHJcbiAgICAgICAgY29uc3QgcGxhdGZvcm1Mb2dnZXIgPSB0aGlzLmNvbnRhaW5lclxyXG4gICAgICAgICAgICAuZ2V0UHJvdmlkZXIoJ3BsYXRmb3JtLWxvZ2dlcicpXHJcbiAgICAgICAgICAgIC5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBcIkZpcmViYXNlIHVzZXIgYWdlbnRcIiBzdHJpbmcgZnJvbSB0aGUgcGxhdGZvcm0gbG9nZ2VyXHJcbiAgICAgICAgLy8gc2VydmljZSwgbm90IHRoZSBicm93c2VyIHVzZXIgYWdlbnQuXHJcbiAgICAgICAgY29uc3QgYWdlbnQgPSBwbGF0Zm9ybUxvZ2dlci5nZXRQbGF0Zm9ybUluZm9TdHJpbmcoKTtcclxuICAgICAgICBjb25zdCBkYXRlID0gZ2V0VVRDRGF0ZVN0cmluZygpO1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlID0gYXdhaXQgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG8gbm90IHN0b3JlIGEgaGVhcnRiZWF0IGlmIG9uZSBpcyBhbHJlYWR5IHN0b3JlZCBmb3IgdGhpcyBkYXlcclxuICAgICAgICAvLyBvciBpZiBhIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG9kYXkuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5sYXN0U2VudEhlYXJ0YmVhdERhdGUgPT09IGRhdGUgfHxcclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuc29tZShzaW5nbGVEYXRlSGVhcnRiZWF0ID0+IHNpbmdsZURhdGVIZWFydGJlYXQuZGF0ZSA9PT0gZGF0ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMgZGF0ZS4gQ3JlYXRlIG9uZS5cclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMucHVzaCh7IGRhdGUsIGFnZW50IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgZW50cmllcyBvbGRlciB0aGFuIDMwIGRheXMuXHJcbiAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5maWx0ZXIoc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhiVGltZXN0YW1wID0gbmV3IERhdGUoc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlKS52YWx1ZU9mKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBub3cgLSBoYlRpbWVzdGFtcCA8PSBTVE9SRURfSEVBUlRCRUFUX1JFVEVOVElPTl9NQVhfTUlMTElTO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLm92ZXJ3cml0ZSh0aGlzLl9oZWFydGJlYXRzQ2FjaGUpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIHdoaWNoIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgaGVhcnRiZWF0LXNwZWNpZmljIGhlYWRlciBkaXJlY3RseS5cclxuICAgICAqIEl0IGFsc28gY2xlYXJzIGFsbCBoZWFydGJlYXRzIGZyb20gbWVtb3J5IGFzIHdlbGwgYXMgaW4gSW5kZXhlZERCLlxyXG4gICAgICpcclxuICAgICAqIE5PVEU6IENvbnN1bWluZyBwcm9kdWN0IFNES3Mgc2hvdWxkIG5vdCBzZW5kIHRoZSBoZWFkZXIgaWYgdGhpcyBtZXRob2RcclxuICAgICAqIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRIZWFydGJlYXRzSGVhZGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBudWxsIG9yIHRoZSBhcnJheSBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gZGF0YSB0byBzZW5kLlxyXG4gICAgICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwgfHxcclxuICAgICAgICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IGdldFVUQ0RhdGVTdHJpbmcoKTtcclxuICAgICAgICAvLyBFeHRyYWN0IGFzIG1hbnkgaGVhcnRiZWF0cyBmcm9tIHRoZSBjYWNoZSBhcyB3aWxsIGZpdCB1bmRlciB0aGUgc2l6ZSBsaW1pdC5cclxuICAgICAgICBjb25zdCB7IGhlYXJ0YmVhdHNUb1NlbmQsIHVuc2VudEVudHJpZXMgfSA9IGV4dHJhY3RIZWFydGJlYXRzRm9ySGVhZGVyKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJTdHJpbmcgPSBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDIsIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNUb1NlbmQgfSkpO1xyXG4gICAgICAgIC8vIFN0b3JlIGxhc3Qgc2VudCBkYXRlIHRvIHByZXZlbnQgYW5vdGhlciBiZWluZyBsb2dnZWQvc2VudCBmb3IgdGhlIHNhbWUgZGF5LlxyXG4gICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5sYXN0U2VudEhlYXJ0YmVhdERhdGUgPSBkYXRlO1xyXG4gICAgICAgIGlmICh1bnNlbnRFbnRyaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgYW55IHVuc2VudCBlbnRyaWVzIGlmIHRoZXkgZXhpc3QuXHJcbiAgICAgICAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gdW5zZW50RW50cmllcztcclxuICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyBtb3JlIGxpa2VseSB0aGFuIGVtcHR5aW5nIHRoZSBhcnJheSAoYmVsb3cpIHRvIGxlYWQgdG8gc29tZSBvZGQgc3RhdGVcclxuICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNhY2hlIGlzbid0IGVtcHR5IGFuZCB0aGlzIHdpbGwgYmUgY2FsbGVkIGFnYWluIG9uIHRoZSBuZXh0IHJlcXVlc3QsXHJcbiAgICAgICAgICAgIC8vIGFuZCBpcyBwcm9iYWJseSBzYWZlc3QgaWYgd2UgYXdhaXQgaXQuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cyA9IFtdO1xyXG4gICAgICAgICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhpcywgdG8gcmVkdWNlIGxhdGVuY3kuXHJcbiAgICAgICAgICAgIHZvaWQgdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhlYWRlclN0cmluZztcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBnZXRVVENEYXRlU3RyaW5nKCkge1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gUmV0dXJucyBkYXRlIGZvcm1hdCAnWVlZWS1NTS1ERCdcclxuICAgIHJldHVybiB0b2RheS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XHJcbn1cclxuZnVuY3Rpb24gZXh0cmFjdEhlYXJ0YmVhdHNGb3JIZWFkZXIoaGVhcnRiZWF0c0NhY2hlLCBtYXhTaXplID0gTUFYX0hFQURFUl9CWVRFUykge1xyXG4gICAgLy8gSGVhcnRiZWF0cyBncm91cGVkIGJ5IHVzZXIgYWdlbnQgaW4gdGhlIHN0YW5kYXJkIGZvcm1hdCB0byBiZSBzZW50IGluXHJcbiAgICAvLyB0aGUgaGVhZGVyLlxyXG4gICAgY29uc3QgaGVhcnRiZWF0c1RvU2VuZCA9IFtdO1xyXG4gICAgLy8gU2luZ2xlIGRhdGUgZm9ybWF0IGhlYXJ0YmVhdHMgdGhhdCBhcmUgbm90IHNlbnQuXHJcbiAgICBsZXQgdW5zZW50RW50cmllcyA9IGhlYXJ0YmVhdHNDYWNoZS5zbGljZSgpO1xyXG4gICAgZm9yIChjb25zdCBzaW5nbGVEYXRlSGVhcnRiZWF0IG9mIGhlYXJ0YmVhdHNDYWNoZSkge1xyXG4gICAgICAgIC8vIExvb2sgZm9yIGFuIGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgdXNlciBhZ2VudC5cclxuICAgICAgICBjb25zdCBoZWFydGJlYXRFbnRyeSA9IGhlYXJ0YmVhdHNUb1NlbmQuZmluZChoYiA9PiBoYi5hZ2VudCA9PT0gc2luZ2xlRGF0ZUhlYXJ0YmVhdC5hZ2VudCk7XHJcbiAgICAgICAgaWYgKCFoZWFydGJlYXRFbnRyeSkge1xyXG4gICAgICAgICAgICAvLyBJZiBubyBlbnRyeSBmb3IgdGhpcyB1c2VyIGFnZW50IGV4aXN0cywgY3JlYXRlIG9uZS5cclxuICAgICAgICAgICAgaGVhcnRiZWF0c1RvU2VuZC5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGFnZW50OiBzaW5nbGVEYXRlSGVhcnRiZWF0LmFnZW50LFxyXG4gICAgICAgICAgICAgICAgZGF0ZXM6IFtzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGVdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBoZWFkZXIgd291bGQgZXhjZWVkIG1heCBzaXplLCByZW1vdmUgdGhlIGFkZGVkIGhlYXJ0YmVhdFxyXG4gICAgICAgICAgICAgICAgLy8gZW50cnkgYW5kIHN0b3AgYWRkaW5nIHRvIHRoZSBoZWFkZXIuXHJcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRzVG9TZW5kLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGhlYXJ0YmVhdEVudHJ5LmRhdGVzLnB1c2goc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlKTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgZGF0ZVxyXG4gICAgICAgICAgICAvLyBhbmQgc3RvcCBhZGRpbmcgdG8gdGhlIGhlYWRlci5cclxuICAgICAgICAgICAgaWYgKGNvdW50Qnl0ZXMoaGVhcnRiZWF0c1RvU2VuZCkgPiBtYXhTaXplKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRFbnRyeS5kYXRlcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFBvcCB1bnNlbnQgZW50cnkgZnJvbSBxdWV1ZS4gKFNraXBwZWQgaWYgYWRkaW5nIHRoZSBlbnRyeSBleGNlZWRlZFxyXG4gICAgICAgIC8vIHF1b3RhIGFuZCB0aGUgbG9vcCBicmVha3MgZWFybHkuKVxyXG4gICAgICAgIHVuc2VudEVudHJpZXMgPSB1bnNlbnRFbnRyaWVzLnNsaWNlKDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFydGJlYXRzVG9TZW5kLFxyXG4gICAgICAgIHVuc2VudEVudHJpZXNcclxuICAgIH07XHJcbn1cclxuY2xhc3MgSGVhcnRiZWF0U3RvcmFnZUltcGwge1xyXG4gICAgY29uc3RydWN0b3IoYXBwKSB7XHJcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XHJcbiAgICAgICAgdGhpcy5fY2FuVXNlSW5kZXhlZERCUHJvbWlzZSA9IHRoaXMucnVuSW5kZXhlZERCRW52aXJvbm1lbnRDaGVjaygpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcnVuSW5kZXhlZERCRW52aXJvbm1lbnRDaGVjaygpIHtcclxuICAgICAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWFkIGFsbCBoZWFydGJlYXRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyByZWFkKCkge1xyXG4gICAgICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XHJcbiAgICAgICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgaGVhcnRiZWF0czogW10gfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkYkhlYXJ0YmVhdE9iamVjdCA9IGF3YWl0IHJlYWRIZWFydGJlYXRzRnJvbUluZGV4ZWREQih0aGlzLmFwcCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpZGJIZWFydGJlYXRPYmplY3QgfHwgeyBoZWFydGJlYXRzOiBbXSB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIG92ZXJ3cml0ZSB0aGUgc3RvcmFnZSB3aXRoIHRoZSBwcm92aWRlZCBoZWFydGJlYXRzXHJcbiAgICBhc3luYyBvdmVyd3JpdGUoaGVhcnRiZWF0c09iamVjdCkge1xyXG4gICAgICAgIHZhciBfYTtcclxuICAgICAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xyXG4gICAgICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIodGhpcy5hcHAsIHtcclxuICAgICAgICAgICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTogKF9hID0gaGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXHJcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRzOiBoZWFydGJlYXRzT2JqZWN0LmhlYXJ0YmVhdHNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gYWRkIGhlYXJ0YmVhdHNcclxuICAgIGFzeW5jIGFkZChoZWFydGJlYXRzT2JqZWN0KSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XHJcbiAgICAgICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0ID0gYXdhaXQgdGhpcy5yZWFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQih0aGlzLmFwcCwge1xyXG4gICAgICAgICAgICAgICAgbGFzdFNlbnRIZWFydGJlYXREYXRlOiAoX2EgPSBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSxcclxuICAgICAgICAgICAgICAgIGhlYXJ0YmVhdHM6IFtcclxuICAgICAgICAgICAgICAgICAgICAuLi5leGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAuLi5oZWFydGJlYXRzT2JqZWN0LmhlYXJ0YmVhdHNcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgYnl0ZXMgb2YgYSBIZWFydGJlYXRzQnlVc2VyQWdlbnQgYXJyYXkgYWZ0ZXIgYmVpbmcgd3JhcHBlZFxyXG4gKiBpbiBhIHBsYXRmb3JtIGxvZ2dpbmcgaGVhZGVyIEpTT04gb2JqZWN0LCBzdHJpbmdpZmllZCwgYW5kIGNvbnZlcnRlZFxyXG4gKiB0byBiYXNlIDY0LlxyXG4gKi9cclxuZnVuY3Rpb24gY291bnRCeXRlcyhoZWFydGJlYXRzQ2FjaGUpIHtcclxuICAgIC8vIGJhc2U2NCBoYXMgYSByZXN0cmljdGVkIHNldCBvZiBjaGFyYWN0ZXJzLCBhbGwgb2Ygd2hpY2ggc2hvdWxkIGJlIDEgYnl0ZS5cclxuICAgIHJldHVybiBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhcclxuICAgIC8vIGhlYXJ0YmVhdHNDYWNoZSB3cmFwcGVyIHByb3BlcnRpZXNcclxuICAgIEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbjogMiwgaGVhcnRiZWF0czogaGVhcnRiZWF0c0NhY2hlIH0pKS5sZW5ndGg7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVnaXN0ZXJDb3JlQ29tcG9uZW50cyh2YXJpYW50KSB7XHJcbiAgICBfcmVnaXN0ZXJDb21wb25lbnQobmV3IENvbXBvbmVudCgncGxhdGZvcm0tbG9nZ2VyJywgY29udGFpbmVyID0+IG5ldyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsKGNvbnRhaW5lciksIFwiUFJJVkFURVwiIC8qIENvbXBvbmVudFR5cGUuUFJJVkFURSAqLykpO1xyXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ2hlYXJ0YmVhdCcsIGNvbnRhaW5lciA9PiBuZXcgSGVhcnRiZWF0U2VydmljZUltcGwoY29udGFpbmVyKSwgXCJQUklWQVRFXCIgLyogQ29tcG9uZW50VHlwZS5QUklWQVRFICovKSk7XHJcbiAgICAvLyBSZWdpc3RlciBgYXBwYCBwYWNrYWdlLlxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUkbywgdmVyc2lvbiQxLCB2YXJpYW50KTtcclxuICAgIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXHJcbiAgICByZWdpc3RlclZlcnNpb24obmFtZSRvLCB2ZXJzaW9uJDEsICdlc20yMDE3Jyk7XHJcbiAgICAvLyBSZWdpc3RlciBwbGF0Zm9ybSBTREsgaWRlbnRpZmllciAobm8gdmVyc2lvbikuXHJcbiAgICByZWdpc3RlclZlcnNpb24oJ2ZpcmUtanMnLCAnJyk7XHJcbn1cblxuLyoqXHJcbiAqIEZpcmViYXNlIEFwcFxyXG4gKlxyXG4gKiBAcmVtYXJrcyBUaGlzIHBhY2thZ2UgY29vcmRpbmF0ZXMgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZGlmZmVyZW50IEZpcmViYXNlIGNvbXBvbmVudHNcclxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXHJcbiAqL1xyXG5yZWdpc3RlckNvcmVDb21wb25lbnRzKCcnKTtcblxuZXhwb3J0IHsgU0RLX1ZFUlNJT04sIERFRkFVTFRfRU5UUllfTkFNRSBhcyBfREVGQVVMVF9FTlRSWV9OQU1FLCBfYWRkQ29tcG9uZW50LCBfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQsIF9hcHBzLCBfY2xlYXJDb21wb25lbnRzLCBfY29tcG9uZW50cywgX2dldFByb3ZpZGVyLCBfcmVnaXN0ZXJDb21wb25lbnQsIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UsIGRlbGV0ZUFwcCwgZ2V0QXBwLCBnZXRBcHBzLCBpbml0aWFsaXplQXBwLCBvbkxvZywgcmVnaXN0ZXJWZXJzaW9uLCBzZXRMb2dMZXZlbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsInZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG52YXIgZXNtID0ge307XG5cbi8qXG5cbiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLlxuIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4qL1xuXG52YXIgayxnb29nPWdvb2d8fHt9LGw9Y29tbW9uanNHbG9iYWx8fHNlbGY7ZnVuY3Rpb24gYWEoYSl7dmFyIGI9dHlwZW9mIGE7Yj1cIm9iamVjdFwiIT1iP2I6YT9BcnJheS5pc0FycmF5KGEpP1wiYXJyYXlcIjpiOlwibnVsbFwiO3JldHVybiBcImFycmF5XCI9PWJ8fFwib2JqZWN0XCI9PWImJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aH1mdW5jdGlvbiBwKGEpe3ZhciBiPXR5cGVvZiBhO3JldHVybiBcIm9iamVjdFwiPT1iJiZudWxsIT1hfHxcImZ1bmN0aW9uXCI9PWJ9ZnVuY3Rpb24gYmEoYSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGNhKSYmYVtjYV18fChhW2NhXT0rK2RhKX12YXIgY2E9XCJjbG9zdXJlX3VpZF9cIisoMUU5Kk1hdGgucmFuZG9tKCk+Pj4wKSxkYT0wO2Z1bmN0aW9uIGVhKGEsYixjKXtyZXR1cm4gYS5jYWxsLmFwcGx5KGEuYmluZCxhcmd1bWVudHMpfVxuZnVuY3Rpb24gZmEoYSxiLGMpe2lmKCFhKXRocm93IEVycm9yKCk7aWYoMjxhcmd1bWVudHMubGVuZ3RoKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShlLGQpO3JldHVybiBhLmFwcGx5KGIsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gcShhLGIsYyl7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQmJi0xIT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoXCJuYXRpdmUgY29kZVwiKT9xPWVhOnE9ZmE7cmV0dXJuIHEuYXBwbHkobnVsbCxhcmd1bWVudHMpfVxuZnVuY3Rpb24gaGEoYSxiKXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9Yy5zbGljZSgpO2QucHVzaC5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIGEuYXBwbHkodGhpcyxkKX19ZnVuY3Rpb24gcihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9Yi5wcm90b3R5cGU7YS4kPWIucHJvdG90eXBlO2EucHJvdG90eXBlPW5ldyBjO2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWE7YS5hYz1mdW5jdGlvbihkLGUsZil7Zm9yKHZhciBoPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMiksbj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspaFtuLTJdPWFyZ3VtZW50c1tuXTtyZXR1cm4gYi5wcm90b3R5cGVbZV0uYXBwbHkoZCxoKX07fWZ1bmN0aW9uIHYoKXt0aGlzLnM9dGhpcy5zO3RoaXMubz10aGlzLm87fXZhciBpYT0wO3YucHJvdG90eXBlLnM9ITE7di5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oKXtpZighdGhpcy5zJiYodGhpcy5zPSEwLHRoaXMuTigpLDAhPWlhKSl7YmEodGhpcyk7fX07di5wcm90b3R5cGUuTj1mdW5jdGlvbigpe2lmKHRoaXMubylmb3IoO3RoaXMuby5sZW5ndGg7KXRoaXMuby5zaGlmdCgpKCk7fTtjb25zdCBrYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gXCJzdHJpbmdcIiE9PXR5cGVvZiBifHwxIT1iLmxlbmd0aD8tMTphLmluZGV4T2YoYiwwKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihjIGluIGEmJmFbY109PT1iKXJldHVybiBjO3JldHVybiAtMX07ZnVuY3Rpb24gbWEoYSl7Y29uc3QgYj1hLmxlbmd0aDtpZigwPGIpe2NvbnN0IGM9QXJyYXkoYik7Zm9yKGxldCBkPTA7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9cmV0dXJuIFtdfVxuZnVuY3Rpb24gbmEoYSxiKXtmb3IobGV0IGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXtjb25zdCBkPWFyZ3VtZW50c1tjXTtpZihhYShkKSl7Y29uc3QgZT1hLmxlbmd0aHx8MCxmPWQubGVuZ3RofHwwO2EubGVuZ3RoPWUrZjtmb3IobGV0IGg9MDtoPGY7aCsrKWFbZStoXT1kW2hdO31lbHNlIGEucHVzaChkKTt9fWZ1bmN0aW9uIHcoYSxiKXt0aGlzLnR5cGU9YTt0aGlzLmc9dGhpcy50YXJnZXQ9Yjt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITE7fXcucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7fTt2YXIgb2E9ZnVuY3Rpb24oKXtpZighbC5hZGRFdmVudExpc3RlbmVyfHwhT2JqZWN0LmRlZmluZVByb3BlcnR5KXJldHVybiAhMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7YT0hMDt9fSk7dHJ5e2wuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwoKT0+e30sYiksbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLCgpPT57fSxiKTt9Y2F0Y2goYyl7fXJldHVybiBhfSgpO2Z1bmN0aW9uIHgoYSl7cmV0dXJuIC9eW1xcc1xceGEwXSokLy50ZXN0KGEpfWZ1bmN0aW9uIHBhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOlwiXCJ9ZnVuY3Rpb24geShhKXtyZXR1cm4gLTEhPXBhKCkuaW5kZXhPZihhKX1mdW5jdGlvbiBxYShhKXtxYVtcIiBcIl0oYSk7cmV0dXJuIGF9cWFbXCIgXCJdPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiByYShhLGIpe3ZhciBjPXNhO3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxhKT9jW2FdOmNbYV09YihhKX12YXIgdGE9eShcIk9wZXJhXCIpLHo9eShcIlRyaWRlbnRcIil8fHkoXCJNU0lFXCIpLHVhPXkoXCJFZGdlXCIpLHZhPXVhfHx6LHdhPXkoXCJHZWNrb1wiKSYmISgtMSE9cGEoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ3ZWJraXRcIikmJiF5KFwiRWRnZVwiKSkmJiEoeShcIlRyaWRlbnRcIil8fHkoXCJNU0lFXCIpKSYmIXkoXCJFZGdlXCIpLHhhPS0xIT1wYSgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIndlYmtpdFwiKSYmIXkoXCJFZGdlXCIpO2Z1bmN0aW9uIHlhKCl7dmFyIGE9bC5kb2N1bWVudDtyZXR1cm4gYT9hLmRvY3VtZW50TW9kZTp2b2lkIDB9dmFyIHphO1xuYTp7dmFyIEFhPVwiXCIsQmE9ZnVuY3Rpb24oKXt2YXIgYT1wYSgpO2lmKHdhKXJldHVybiAvcnY6KFteXFwpO10rKShcXCl8OykvLmV4ZWMoYSk7aWYodWEpcmV0dXJuIC9FZGdlXFwvKFtcXGRcXC5dKykvLmV4ZWMoYSk7aWYoeilyZXR1cm4gL1xcYig/Ok1TSUV8cnYpWzogXShbXlxcKTtdKykoXFwpfDspLy5leGVjKGEpO2lmKHhhKXJldHVybiAvV2ViS2l0XFwvKFxcUyspLy5leGVjKGEpO2lmKHRhKXJldHVybiAvKD86VmVyc2lvbilbIFxcL10/KFxcUyspLy5leGVjKGEpfSgpO0JhJiYoQWE9QmE/QmFbMV06XCJcIik7aWYoeil7dmFyIENhPXlhKCk7aWYobnVsbCE9Q2EmJkNhPnBhcnNlRmxvYXQoQWEpKXt6YT1TdHJpbmcoQ2EpO2JyZWFrIGF9fXphPUFhO312YXIgRGE7aWYobC5kb2N1bWVudCYmeil7dmFyIEVhPXlhKCk7RGE9RWE/RWE6cGFyc2VJbnQoemEsMTApfHx2b2lkIDA7fWVsc2UgRGE9dm9pZCAwO3ZhciBGYT1EYTtmdW5jdGlvbiBBKGEsYil7dy5jYWxsKHRoaXMsYT9hLnR5cGU6XCJcIik7dGhpcy5yZWxhdGVkVGFyZ2V0PXRoaXMuZz10aGlzLnRhcmdldD1udWxsO3RoaXMuYnV0dG9uPXRoaXMuc2NyZWVuWT10aGlzLnNjcmVlblg9dGhpcy5jbGllbnRZPXRoaXMuY2xpZW50WD0wO3RoaXMua2V5PVwiXCI7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLnBvaW50ZXJJZD0wO3RoaXMucG9pbnRlclR5cGU9XCJcIjt0aGlzLmk9bnVsbDtpZihhKXt2YXIgYz10aGlzLnR5cGU9YS50eXBlLGQ9YS5jaGFuZ2VkVG91Y2hlcyYmYS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg/YS5jaGFuZ2VkVG91Y2hlc1swXTpudWxsO3RoaXMudGFyZ2V0PWEudGFyZ2V0fHxhLnNyY0VsZW1lbnQ7dGhpcy5nPWI7aWYoYj1hLnJlbGF0ZWRUYXJnZXQpe2lmKHdhKXthOnt0cnl7cWEoYi5ub2RlTmFtZSk7dmFyIGU9ITA7YnJlYWsgYX1jYXRjaChmKXt9ZT1cbiExO31lfHwoYj1udWxsKTt9fWVsc2UgXCJtb3VzZW92ZXJcIj09Yz9iPWEuZnJvbUVsZW1lbnQ6XCJtb3VzZW91dFwiPT1jJiYoYj1hLnRvRWxlbWVudCk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPXZvaWQgMCE9PWQuY2xpZW50WD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9dm9pZCAwIT09ZC5jbGllbnRZP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD12b2lkIDAhPT1hLmNsaWVudFg/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPXZvaWQgMCE9PWEuY2xpZW50WT9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMua2V5PWEua2V5fHxcIlwiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1cbmEuc2hpZnRLZXk7dGhpcy5tZXRhS2V5PWEubWV0YUtleTt0aGlzLnBvaW50ZXJJZD1hLnBvaW50ZXJJZHx8MDt0aGlzLnBvaW50ZXJUeXBlPVwic3RyaW5nXCI9PT10eXBlb2YgYS5wb2ludGVyVHlwZT9hLnBvaW50ZXJUeXBlOkdhW2EucG9pbnRlclR5cGVdfHxcIlwiO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLmk9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJkEuJC5oLmNhbGwodGhpcyk7fX1yKEEsdyk7dmFyIEdhPXsyOlwidG91Y2hcIiwzOlwicGVuXCIsNDpcIm1vdXNlXCJ9O0EucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtBLiQuaC5jYWxsKHRoaXMpO3ZhciBhPXRoaXMuaTthLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExO307dmFyIEhhPVwiY2xvc3VyZV9saXN0ZW5hYmxlX1wiKygxRTYqTWF0aC5yYW5kb20oKXwwKTt2YXIgSWE9MDtmdW5jdGlvbiBKYShhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMubGE9ZTt0aGlzLmtleT0rK0lhO3RoaXMuZmE9dGhpcy5pYT0hMTt9ZnVuY3Rpb24gS2EoYSl7YS5mYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5sYT1udWxsO31mdW5jdGlvbiBOYShhLGIsYyl7Zm9yKGNvbnN0IGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSk7fWZ1bmN0aW9uIE9hKGEsYil7Zm9yKGNvbnN0IGMgaW4gYSliLmNhbGwodm9pZCAwLGFbY10sYyxhKTt9ZnVuY3Rpb24gUGEoYSl7Y29uc3QgYj17fTtmb3IoY29uc3QgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn1jb25zdCBRYT1cImNvbnN0cnVjdG9yIGhhc093blByb3BlcnR5IGlzUHJvdG90eXBlT2YgcHJvcGVydHlJc0VudW1lcmFibGUgdG9Mb2NhbGVTdHJpbmcgdG9TdHJpbmcgdmFsdWVPZlwiLnNwbGl0KFwiIFwiKTtmdW5jdGlvbiBSYShhLGIpe2xldCBjLGQ7Zm9yKGxldCBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7ZD1hcmd1bWVudHNbZV07Zm9yKGMgaW4gZClhW2NdPWRbY107Zm9yKGxldCBmPTA7ZjxRYS5sZW5ndGg7ZisrKWM9UWFbZl0sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsYykmJihhW2NdPWRbY10pO319ZnVuY3Rpb24gU2EoYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTA7fVNhLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1UYShhLGIsZCxlKTstMTxoPyhiPWFbaF0sY3x8KGIuaWE9ITEpKTooYj1uZXcgSmEoYix0aGlzLnNyYyxmLCEhZCxlKSxiLmlhPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07ZnVuY3Rpb24gVWEoYSxiKXt2YXIgYz1iLnR5cGU7aWYoYyBpbiBhLmcpe3ZhciBkPWEuZ1tjXSxlPWthKGQsYiksZjsoZj0wPD1lKSYmQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGQsZSwxKTtmJiYoS2EoYiksMD09YS5nW2NdLmxlbmd0aCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKTt9fVxuZnVuY3Rpb24gVGEoYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuZmEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLmxhPT1kKXJldHVybiBlfXJldHVybiAtMX12YXIgVmE9XCJjbG9zdXJlX2xtX1wiKygxRTYqTWF0aC5yYW5kb20oKXwwKSxXYT17fTtmdW5jdGlvbiBZYShhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gWmEoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylZYShhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9JGEoYyk7cmV0dXJuIGEmJmFbSGFdP2EuTyhiLGMscChkKT8hIWQuY2FwdHVyZTohIWQsZSk6YWIoYSxiLGMsITEsZCxlKX1cbmZ1bmN0aW9uIGFiKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcihcIkludmFsaWQgZXZlbnQgdHlwZVwiKTt2YXIgaD1wKGUpPyEhZS5jYXB0dXJlOiEhZSxuPWJiKGEpO258fChhW1ZhXT1uPW5ldyBTYShhKSk7Yz1uLmFkZChiLGMsZCxoLGYpO2lmKGMucHJveHkpcmV0dXJuIGM7ZD1jYigpO2MucHJveHk9ZDtkLnNyYz1hO2QubGlzdGVuZXI9YztpZihhLmFkZEV2ZW50TGlzdGVuZXIpb2F8fChlPWgpLHZvaWQgMD09PWUmJihlPSExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYi50b1N0cmluZygpLGQsZSk7ZWxzZSBpZihhLmF0dGFjaEV2ZW50KWEuYXR0YWNoRXZlbnQoZGIoYi50b1N0cmluZygpKSxkKTtlbHNlIGlmKGEuYWRkTGlzdGVuZXImJmEucmVtb3ZlTGlzdGVuZXIpYS5hZGRMaXN0ZW5lcihkKTtlbHNlIHRocm93IEVycm9yKFwiYWRkRXZlbnRMaXN0ZW5lciBhbmQgYXR0YWNoRXZlbnQgYXJlIHVuYXZhaWxhYmxlLlwiKTtyZXR1cm4gY31cbmZ1bmN0aW9uIGNiKCl7ZnVuY3Rpb24gYShjKXtyZXR1cm4gYi5jYWxsKGEuc3JjLGEubGlzdGVuZXIsYyl9Y29uc3QgYj1lYjtyZXR1cm4gYX1mdW5jdGlvbiBaYShhLGIsYyxkLGUpe2lmKEFycmF5LmlzQXJyYXkoYikpe2Zvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKVphKGEsYltmXSxjLGQsZSk7cmV0dXJuIG51bGx9Yz0kYShjKTtyZXR1cm4gYSYmYVtIYV0/YS5QKGIsYyxwKGQpPyEhZC5jYXB0dXJlOiEhZCxlKTphYihhLGIsYywhMCxkLGUpfVxuZnVuY3Rpb24gZmIoYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWZiKGEsYltmXSxjLGQsZSk7ZWxzZSAoZD1wKGQpPyEhZC5jYXB0dXJlOiEhZCxjPSRhKGMpLGEmJmFbSGFdKT8oYT1hLmksYj1TdHJpbmcoYikudG9TdHJpbmcoKSxiIGluIGEuZyYmKGY9YS5nW2JdLGM9VGEoZixjLGQsZSksLTE8YyYmKEthKGZbY10pLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChmLGMsMSksMD09Zi5sZW5ndGgmJihkZWxldGUgYS5nW2JdLGEuaC0tKSkpKTphJiYoYT1iYihhKSkmJihiPWEuZ1tiLnRvU3RyaW5nKCldLGE9LTEsYiYmKGE9VGEoYixjLGQsZSkpLChjPS0xPGE/YlthXTpudWxsKSYmZ2IoYykpO31cbmZ1bmN0aW9uIGdiKGEpe2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYSYmYSYmIWEuZmEpe3ZhciBiPWEuc3JjO2lmKGImJmJbSGFdKVVhKGIuaSxhKTtlbHNlIHt2YXIgYz1hLnR5cGUsZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KGRiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7KGM9YmIoYikpPyhVYShjLGEpLDA9PWMuaCYmKGMuc3JjPW51bGwsYltWYV09bnVsbCkpOkthKGEpO319fWZ1bmN0aW9uIGRiKGEpe3JldHVybiBhIGluIFdhP1dhW2FdOldhW2FdPVwib25cIithfWZ1bmN0aW9uIGViKGEsYil7aWYoYS5mYSlhPSEwO2Vsc2Uge2I9bmV3IEEoYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5sYXx8YS5zcmM7YS5pYSYmZ2IoYSk7YT1jLmNhbGwoZCxiKTt9cmV0dXJuIGF9XG5mdW5jdGlvbiBiYihhKXthPWFbVmFdO3JldHVybiBhIGluc3RhbmNlb2YgU2E/YTpudWxsfXZhciBoYj1cIl9fY2xvc3VyZV9ldmVudHNfZm5fXCIrKDFFOSpNYXRoLnJhbmRvbSgpPj4+MCk7ZnVuY3Rpb24gJGEoYSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7YVtoYl18fChhW2hiXT1mdW5jdGlvbihiKXtyZXR1cm4gYS5oYW5kbGVFdmVudChiKX0pO3JldHVybiBhW2hiXX1mdW5jdGlvbiBCKCl7di5jYWxsKHRoaXMpO3RoaXMuaT1uZXcgU2EodGhpcyk7dGhpcy5TPXRoaXM7dGhpcy5KPW51bGw7fXIoQix2KTtCLnByb3RvdHlwZVtIYV09ITA7Qi5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyxkKXtmYih0aGlzLGEsYixjLGQpO307XG5mdW5jdGlvbiBDKGEsYil7dmFyIGMsZD1hLko7aWYoZClmb3IoYz1bXTtkO2Q9ZC5KKWMucHVzaChkKTthPWEuUztkPWIudHlwZXx8YjtpZihcInN0cmluZ1wiPT09dHlwZW9mIGIpYj1uZXcgdyhiLGEpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIHcpYi50YXJnZXQ9Yi50YXJnZXR8fGE7ZWxzZSB7dmFyIGU9YjtiPW5ldyB3KGQsYSk7UmEoYixlKTt9ZT0hMDtpZihjKWZvcih2YXIgZj1jLmxlbmd0aC0xOzA8PWY7Zi0tKXt2YXIgaD1iLmc9Y1tmXTtlPWliKGgsZCwhMCxiKSYmZTt9aD1iLmc9YTtlPWliKGgsZCwhMCxiKSYmZTtlPWliKGgsZCwhMSxiKSYmZTtpZihjKWZvcihmPTA7ZjxjLmxlbmd0aDtmKyspaD1iLmc9Y1tmXSxlPWliKGgsZCwhMSxiKSYmZTt9XG5CLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7Qi4kLk4uY2FsbCh0aGlzKTtpZih0aGlzLmkpe3ZhciBhPXRoaXMuaSxjO2ZvcihjIGluIGEuZyl7Zm9yKHZhciBkPWEuZ1tjXSxlPTA7ZTxkLmxlbmd0aDtlKyspS2EoZFtlXSk7ZGVsZXRlIGEuZ1tjXTthLmgtLTt9fXRoaXMuSj1udWxsO307Qi5wcm90b3R5cGUuTz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5pLmFkZChTdHJpbmcoYSksYiwhMSxjLGQpfTtCLnByb3RvdHlwZS5QPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmkuYWRkKFN0cmluZyhhKSxiLCEwLGMsZCl9O1xuZnVuY3Rpb24gaWIoYSxiLGMsZCl7Yj1hLmkuZ1tTdHJpbmcoYildO2lmKCFiKXJldHVybiAhMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5mYSYmaC5jYXB0dXJlPT1jKXt2YXIgbj1oLmxpc3RlbmVyLHQ9aC5sYXx8aC5zcmM7aC5pYSYmVWEoYS5pLGgpO2U9ITEhPT1uLmNhbGwodCxkKSYmZTt9fXJldHVybiBlJiYhZC5kZWZhdWx0UHJldmVudGVkfXZhciBqYj1sLkpTT04uc3RyaW5naWZ5O2NsYXNzIGtie2NvbnN0cnVjdG9yKGEsYil7dGhpcy5pPWE7dGhpcy5qPWI7dGhpcy5oPTA7dGhpcy5nPW51bGw7fWdldCgpe2xldCBhOzA8dGhpcy5oPyh0aGlzLmgtLSxhPXRoaXMuZyx0aGlzLmc9YS5uZXh0LGEubmV4dD1udWxsKTphPXRoaXMuaSgpO3JldHVybiBhfX1mdW5jdGlvbiBsYigpe3ZhciBhPW1iO2xldCBiPW51bGw7YS5nJiYoYj1hLmcsYS5nPWEuZy5uZXh0LGEuZ3x8KGEuaD1udWxsKSxiLm5leHQ9bnVsbCk7cmV0dXJuIGJ9Y2xhc3MgbmJ7Y29uc3RydWN0b3IoKXt0aGlzLmg9dGhpcy5nPW51bGw7fWFkZChhLGIpe2NvbnN0IGM9b2IuZ2V0KCk7Yy5zZXQoYSxiKTt0aGlzLmg/dGhpcy5oLm5leHQ9Yzp0aGlzLmc9Yzt0aGlzLmg9Yzt9fXZhciBvYj1uZXcga2IoKCk9Pm5ldyBwYixhPT5hLnJlc2V0KCkpO2NsYXNzIHBie2NvbnN0cnVjdG9yKCl7dGhpcy5uZXh0PXRoaXMuZz10aGlzLmg9bnVsbDt9c2V0KGEsYil7dGhpcy5oPWE7dGhpcy5nPWI7dGhpcy5uZXh0PW51bGw7fXJlc2V0KCl7dGhpcy5uZXh0PXRoaXMuZz10aGlzLmg9bnVsbDt9fWZ1bmN0aW9uIHFiKGEpe3ZhciBiPTE7YT1hLnNwbGl0KFwiOlwiKTtjb25zdCBjPVtdO2Zvcig7MDxiJiZhLmxlbmd0aDspYy5wdXNoKGEuc2hpZnQoKSksYi0tO2EubGVuZ3RoJiZjLnB1c2goYS5qb2luKFwiOlwiKSk7cmV0dXJuIGN9ZnVuY3Rpb24gcmIoYSl7bC5zZXRUaW1lb3V0KCgpPT57dGhyb3cgYTt9LDApO31sZXQgc2IsdGI9ITEsbWI9bmV3IG5iLHZiPSgpPT57Y29uc3QgYT1sLlByb21pc2UucmVzb2x2ZSh2b2lkIDApO3NiPSgpPT57YS50aGVuKHViKTt9O307dmFyIHViPSgpPT57Zm9yKHZhciBhO2E9bGIoKTspe3RyeXthLmguY2FsbChhLmcpO31jYXRjaChjKXtyYihjKTt9dmFyIGI9b2I7Yi5qKGEpOzEwMD5iLmgmJihiLmgrKyxhLm5leHQ9Yi5nLGIuZz1hKTt9dGI9ITE7fTtmdW5jdGlvbiB3YihhLGIpe0IuY2FsbCh0aGlzKTt0aGlzLmg9YXx8MTt0aGlzLmc9Ynx8bDt0aGlzLmo9cSh0aGlzLnFiLHRoaXMpO3RoaXMubD1EYXRlLm5vdygpO31yKHdiLEIpO2s9d2IucHJvdG90eXBlO2suZ2E9ITE7ay5UPW51bGw7ay5xYj1mdW5jdGlvbigpe2lmKHRoaXMuZ2Epe3ZhciBhPURhdGUubm93KCktdGhpcy5sOzA8YSYmYTwuOCp0aGlzLmg/dGhpcy5UPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgtYSk6KHRoaXMuVCYmKHRoaXMuZy5jbGVhclRpbWVvdXQodGhpcy5UKSx0aGlzLlQ9bnVsbCksQyh0aGlzLFwidGlja1wiKSx0aGlzLmdhJiYoeGIodGhpcyksdGhpcy5zdGFydCgpKSk7fX07ay5zdGFydD1mdW5jdGlvbigpe3RoaXMuZ2E9ITA7dGhpcy5UfHwodGhpcy5UPXRoaXMuZy5zZXRUaW1lb3V0KHRoaXMuaix0aGlzLmgpLHRoaXMubD1EYXRlLm5vdygpKTt9O1xuZnVuY3Rpb24geGIoYSl7YS5nYT0hMTthLlQmJihhLmcuY2xlYXJUaW1lb3V0KGEuVCksYS5UPW51bGwpO31rLk49ZnVuY3Rpb24oKXt3Yi4kLk4uY2FsbCh0aGlzKTt4Yih0aGlzKTtkZWxldGUgdGhpcy5nO307ZnVuY3Rpb24geWIoYSxiLGMpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWMmJihhPXEoYSxjKSk7ZWxzZSBpZihhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmhhbmRsZUV2ZW50KWE9cShhLmhhbmRsZUV2ZW50LGEpO2Vsc2UgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGxpc3RlbmVyIGFyZ3VtZW50XCIpO3JldHVybiAyMTQ3NDgzNjQ3PE51bWJlcihiKT8tMTpsLnNldFRpbWVvdXQoYSxifHwwKX1mdW5jdGlvbiB6YihhKXthLmc9eWIoKCk9PnthLmc9bnVsbDthLmkmJihhLmk9ITEsemIoYSkpO30sYS5qKTtjb25zdCBiPWEuaDthLmg9bnVsbDthLm0uYXBwbHkobnVsbCxiKTt9Y2xhc3MgQWIgZXh0ZW5kcyB2e2NvbnN0cnVjdG9yKGEsYil7c3VwZXIoKTt0aGlzLm09YTt0aGlzLmo9Yjt0aGlzLmg9bnVsbDt0aGlzLmk9ITE7dGhpcy5nPW51bGw7fWwoYSl7dGhpcy5oPWFyZ3VtZW50czt0aGlzLmc/dGhpcy5pPSEwOnpiKHRoaXMpO31OKCl7c3VwZXIuTigpO3RoaXMuZyYmKGwuY2xlYXJUaW1lb3V0KHRoaXMuZyksdGhpcy5nPW51bGwsdGhpcy5pPSExLHRoaXMuaD1udWxsKTt9fWZ1bmN0aW9uIEJiKGEpe3YuY2FsbCh0aGlzKTt0aGlzLmg9YTt0aGlzLmc9e307fXIoQmIsdik7dmFyIENiPVtdO2Z1bmN0aW9uIERiKGEsYixjLGQpe0FycmF5LmlzQXJyYXkoYyl8fChjJiYoQ2JbMF09Yy50b1N0cmluZygpKSxjPUNiKTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9WWEoYixjW2VdLGR8fGEuaGFuZGxlRXZlbnQsITEsYS5ofHxhKTtpZighZilicmVhazthLmdbZi5rZXldPWY7fX1mdW5jdGlvbiBGYihhKXtOYShhLmcsZnVuY3Rpb24oYixjKXt0aGlzLmcuaGFzT3duUHJvcGVydHkoYykmJmdiKGIpO30sYSk7YS5nPXt9O31CYi5wcm90b3R5cGUuTj1mdW5jdGlvbigpe0JiLiQuTi5jYWxsKHRoaXMpO0ZiKHRoaXMpO307QmIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoXCJFdmVudEhhbmRsZXIuaGFuZGxlRXZlbnQgbm90IGltcGxlbWVudGVkXCIpO307ZnVuY3Rpb24gR2IoKXt0aGlzLmc9ITA7fUdiLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3RoaXMuZz0hMTt9O2Z1bmN0aW9uIEhiKGEsYixjLGQsZSxmKXthLmluZm8oZnVuY3Rpb24oKXtpZihhLmcpaWYoZil7dmFyIGg9XCJcIjtmb3IodmFyIG49Zi5zcGxpdChcIiZcIiksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgbT1uW3RdLnNwbGl0KFwiPVwiKTtpZigxPG0ubGVuZ3RoKXt2YXIgdT1tWzBdO209bVsxXTt2YXIgTD11LnNwbGl0KFwiX1wiKTtoPTI8PUwubGVuZ3RoJiZcInR5cGVcIj09TFsxXT9oKyh1K1wiPVwiK20rXCImXCIpOmgrKHUrXCI9cmVkYWN0ZWQmXCIpO319fWVsc2UgaD1udWxsO2Vsc2UgaD1mO3JldHVybiBcIlhNTEhUVFAgUkVRIChcIitkK1wiKSBbYXR0ZW1wdCBcIitlK1wiXTogXCIrYitcIlxcblwiK2MrXCJcXG5cIitofSk7fVxuZnVuY3Rpb24gSWIoYSxiLGMsZCxlLGYsaCl7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiWE1MSFRUUCBSRVNQIChcIitkK1wiKSBbIGF0dGVtcHQgXCIrZStcIl06IFwiK2IrXCJcXG5cIitjK1wiXFxuXCIrZitcIiBcIitofSk7fWZ1bmN0aW9uIEQoYSxiLGMsZCl7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiWE1MSFRUUCBURVhUIChcIitiK1wiKTogXCIrSmIoYSxjKSsoZD9cIiBcIitkOlwiXCIpfSk7fWZ1bmN0aW9uIEtiKGEsYil7YS5pbmZvKGZ1bmN0aW9uKCl7cmV0dXJuIFwiVElNRU9VVDogXCIrYn0pO31HYi5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe307XG5mdW5jdGlvbiBKYihhLGIpe2lmKCFhLmcpcmV0dXJuIGI7aWYoIWIpcmV0dXJuIG51bGw7dHJ5e3ZhciBjPUpTT04ucGFyc2UoYik7aWYoYylmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWlmKEFycmF5LmlzQXJyYXkoY1thXSkpe3ZhciBkPWNbYV07aWYoISgyPmQubGVuZ3RoKSl7dmFyIGU9ZFsxXTtpZihBcnJheS5pc0FycmF5KGUpJiYhKDE+ZS5sZW5ndGgpKXt2YXIgZj1lWzBdO2lmKFwibm9vcFwiIT1mJiZcInN0b3BcIiE9ZiYmXCJjbG9zZVwiIT1mKWZvcih2YXIgaD0xO2g8ZS5sZW5ndGg7aCsrKWVbaF09XCJcIjt9fX1yZXR1cm4gamIoYyl9Y2F0Y2gobil7cmV0dXJuIGJ9fXZhciBFPXt9LExiPW51bGw7ZnVuY3Rpb24gTWIoKXtyZXR1cm4gTGI9TGJ8fG5ldyBCfUUuVGE9XCJzZXJ2ZXJyZWFjaGFiaWxpdHlcIjtmdW5jdGlvbiBOYihhKXt3LmNhbGwodGhpcyxFLlRhLGEpO31yKE5iLHcpO2Z1bmN0aW9uIE9iKGEpe2NvbnN0IGI9TWIoKTtDKGIsbmV3IE5iKGIpKTt9RS5TVEFUX0VWRU5UPVwic3RhdGV2ZW50XCI7ZnVuY3Rpb24gUGIoYSxiKXt3LmNhbGwodGhpcyxFLlNUQVRfRVZFTlQsYSk7dGhpcy5zdGF0PWI7fXIoUGIsdyk7ZnVuY3Rpb24gRihhKXtjb25zdCBiPU1iKCk7QyhiLG5ldyBQYihiLGEpKTt9RS5VYT1cInRpbWluZ2V2ZW50XCI7ZnVuY3Rpb24gUWIoYSxiKXt3LmNhbGwodGhpcyxFLlVhLGEpO3RoaXMuc2l6ZT1iO31yKFFiLHcpO1xuZnVuY3Rpb24gUmIoYSxiKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIkZuIG11c3Qgbm90IGJlIG51bGwgYW5kIG11c3QgYmUgYSBmdW5jdGlvblwiKTtyZXR1cm4gbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSgpO30sYil9dmFyIFNiPXtOT19FUlJPUjowLHJiOjEsRWI6MixEYjozLHliOjQsQ2I6NSxGYjo2LFFhOjcsVElNRU9VVDo4LEliOjl9O3ZhciBUYj17d2I6XCJjb21wbGV0ZVwiLFNiOlwic3VjY2Vzc1wiLFJhOlwiZXJyb3JcIixRYTpcImFib3J0XCIsS2I6XCJyZWFkeVwiLExiOlwicmVhZHlzdGF0ZWNoYW5nZVwiLFRJTUVPVVQ6XCJ0aW1lb3V0XCIsR2I6XCJpbmNyZW1lbnRhbGRhdGFcIixKYjpcInByb2dyZXNzXCIsemI6XCJkb3dubG9hZHByb2dyZXNzXCIsJGI6XCJ1cGxvYWRwcm9ncmVzc1wifTtmdW5jdGlvbiBVYigpe31VYi5wcm90b3R5cGUuaD1udWxsO2Z1bmN0aW9uIFZiKGEpe3JldHVybiBhLmh8fChhLmg9YS5pKCkpfWZ1bmN0aW9uIFdiKCl7fXZhciBYYj17T1BFTjpcImFcIix2YjpcImJcIixSYTpcImNcIixIYjpcImRcIn07ZnVuY3Rpb24gWWIoKXt3LmNhbGwodGhpcyxcImRcIik7fXIoWWIsdyk7ZnVuY3Rpb24gWmIoKXt3LmNhbGwodGhpcyxcImNcIik7fXIoWmIsdyk7dmFyICRiO2Z1bmN0aW9uIGFjKCl7fXIoYWMsVWIpO2FjLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH07YWMucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4ge319OyRiPW5ldyBhYztmdW5jdGlvbiBiYyhhLGIsYyxkKXt0aGlzLmw9YTt0aGlzLmo9Yjt0aGlzLm09Yzt0aGlzLlc9ZHx8MTt0aGlzLlU9bmV3IEJiKHRoaXMpO3RoaXMuUD1jYzthPXZhPzEyNTp2b2lkIDA7dGhpcy5WPW5ldyB3YihhKTt0aGlzLkk9bnVsbDt0aGlzLmk9ITE7dGhpcy5zPXRoaXMuQT10aGlzLnY9dGhpcy5MPXRoaXMuRz10aGlzLlk9dGhpcy5CPW51bGw7dGhpcy5GPVtdO3RoaXMuZz1udWxsO3RoaXMuQz0wO3RoaXMubz10aGlzLnU9bnVsbDt0aGlzLmNhPS0xO3RoaXMuSj0hMTt0aGlzLk89MDt0aGlzLk09bnVsbDt0aGlzLmJhPXRoaXMuSz10aGlzLmFhPXRoaXMuUz0hMTt0aGlzLmg9bmV3IGRjO31mdW5jdGlvbiBkYygpe3RoaXMuaT1udWxsO3RoaXMuZz1cIlwiO3RoaXMuaD0hMTt9dmFyIGNjPTQ1RTMsZWM9e30sZmM9e307az1iYy5wcm90b3R5cGU7ay5zZXRUaW1lb3V0PWZ1bmN0aW9uKGEpe3RoaXMuUD1hO307XG5mdW5jdGlvbiBnYyhhLGIsYyl7YS5MPTE7YS52PWhjKEcoYikpO2Eucz1jO2EuUz0hMDtpYyhhLG51bGwpO31mdW5jdGlvbiBpYyhhLGIpe2EuRz1EYXRlLm5vdygpO2pjKGEpO2EuQT1HKGEudik7dmFyIGM9YS5BLGQ9YS5XO0FycmF5LmlzQXJyYXkoZCl8fChkPVtTdHJpbmcoZCldKTtrYyhjLmksXCJ0XCIsZCk7YS5DPTA7Yz1hLmwuSjthLmg9bmV3IGRjO2EuZz1sYyhhLmwsYz9iOm51bGwsIWEucyk7MDxhLk8mJihhLk09bmV3IEFiKHEoYS5QYSxhLGEuZyksYS5PKSk7RGIoYS5VLGEuZyxcInJlYWR5c3RhdGVjaGFuZ2VcIixhLm5iKTtiPWEuST9QYShhLkkpOnt9O2Eucz8oYS51fHwoYS51PVwiUE9TVFwiKSxiW1wiQ29udGVudC1UeXBlXCJdPVwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsYS5nLmhhKGEuQSxhLnUsYS5zLGIpKTooYS51PVwiR0VUXCIsYS5nLmhhKGEuQSxhLnUsbnVsbCxiKSk7T2IoKTtIYihhLmosYS51LGEuQSxhLm0sYS5XLGEucyk7fVxuay5uYj1mdW5jdGlvbihhKXthPWEudGFyZ2V0O2NvbnN0IGI9dGhpcy5NO2ImJjM9PUgoYSk/Yi5sKCk6dGhpcy5QYShhKTt9O1xuay5QYT1mdW5jdGlvbihhKXt0cnl7aWYoYT09dGhpcy5nKWE6e2NvbnN0IHU9SCh0aGlzLmcpO3ZhciBiPXRoaXMuZy5JYSgpO2NvbnN0IEw9dGhpcy5nLmRhKCk7aWYoISgzPnUpJiYoMyE9dXx8dmF8fHRoaXMuZyYmKHRoaXMuaC5ofHx0aGlzLmcuamEoKXx8bWModGhpcy5nKSkpKXt0aGlzLkp8fDQhPXV8fDc9PWJ8fCg4PT1ifHwwPj1MP09iKDMpOk9iKDIpKTtuYyh0aGlzKTt2YXIgYz10aGlzLmcuZGEoKTt0aGlzLmNhPWM7YjppZihvYyh0aGlzKSl7dmFyIGQ9bWModGhpcy5nKTthPVwiXCI7dmFyIGU9ZC5sZW5ndGgsZj00PT1IKHRoaXMuZyk7aWYoIXRoaXMuaC5pKXtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIFRleHREZWNvZGVyKXtJKHRoaXMpO3BjKHRoaXMpO3ZhciBoPVwiXCI7YnJlYWsgYn10aGlzLmguaT1uZXcgbC5UZXh0RGVjb2Rlcjt9Zm9yKGI9MDtiPGU7YisrKXRoaXMuaC5oPSEwLGErPXRoaXMuaC5pLmRlY29kZShkW2JdLHtzdHJlYW06ZiYmYj09ZS0xfSk7ZC5zcGxpY2UoMCxcbmUpO3RoaXMuaC5nKz1hO3RoaXMuQz0wO2g9dGhpcy5oLmc7fWVsc2UgaD10aGlzLmcuamEoKTt0aGlzLmk9MjAwPT1jO0liKHRoaXMuaix0aGlzLnUsdGhpcy5BLHRoaXMubSx0aGlzLlcsdSxjKTtpZih0aGlzLmkpe2lmKHRoaXMuYWEmJiF0aGlzLkspe2I6e2lmKHRoaXMuZyl7dmFyIG4sdD10aGlzLmc7aWYoKG49dC5nP3QuZy5nZXRSZXNwb25zZUhlYWRlcihcIlgtSFRUUC1Jbml0aWFsLVJlc3BvbnNlXCIpOm51bGwpJiYheChuKSl7dmFyIG09bjticmVhayBifX1tPW51bGw7fWlmKGM9bSlEKHRoaXMuaix0aGlzLm0sYyxcIkluaXRpYWwgaGFuZHNoYWtlIHJlc3BvbnNlIHZpYSBYLUhUVFAtSW5pdGlhbC1SZXNwb25zZVwiKSx0aGlzLks9ITAscWModGhpcyxjKTtlbHNlIHt0aGlzLmk9ITE7dGhpcy5vPTM7RigxMik7SSh0aGlzKTtwYyh0aGlzKTticmVhayBhfX10aGlzLlM/KHJjKHRoaXMsdSxoKSx2YSYmdGhpcy5pJiYzPT11JiYoRGIodGhpcy5VLHRoaXMuVixcInRpY2tcIix0aGlzLm1iKSxcbnRoaXMuVi5zdGFydCgpKSk6KEQodGhpcy5qLHRoaXMubSxoLG51bGwpLHFjKHRoaXMsaCkpOzQ9PXUmJkkodGhpcyk7dGhpcy5pJiYhdGhpcy5KJiYoND09dT9zYyh0aGlzLmwsdGhpcyk6KHRoaXMuaT0hMSxqYyh0aGlzKSkpO31lbHNlIHRjKHRoaXMuZyksNDAwPT1jJiYwPGguaW5kZXhPZihcIlVua25vd24gU0lEXCIpPyh0aGlzLm89MyxGKDEyKSk6KHRoaXMubz0wLEYoMTMpKSxJKHRoaXMpLHBjKHRoaXMpO319fWNhdGNoKHUpe31maW5hbGx5e319O2Z1bmN0aW9uIG9jKGEpe3JldHVybiBhLmc/XCJHRVRcIj09YS51JiYyIT1hLkwmJmEubC5IYTohMX1cbmZ1bmN0aW9uIHJjKGEsYixjKXtsZXQgZD0hMCxlO2Zvcig7IWEuSiYmYS5DPGMubGVuZ3RoOylpZihlPXVjKGEsYyksZT09ZmMpezQ9PWImJihhLm89NCxGKDE0KSxkPSExKTtEKGEuaixhLm0sbnVsbCxcIltJbmNvbXBsZXRlIFJlc3BvbnNlXVwiKTticmVha31lbHNlIGlmKGU9PWVjKXthLm89NDtGKDE1KTtEKGEuaixhLm0sYyxcIltJbnZhbGlkIENodW5rXVwiKTtkPSExO2JyZWFrfWVsc2UgRChhLmosYS5tLGUsbnVsbCkscWMoYSxlKTtvYyhhKSYmZSE9ZmMmJmUhPWVjJiYoYS5oLmc9XCJcIixhLkM9MCk7NCE9Ynx8MCE9Yy5sZW5ndGh8fGEuaC5ofHwoYS5vPTEsRigxNiksZD0hMSk7YS5pPWEuaSYmZDtkPzA8Yy5sZW5ndGgmJiFhLmJhJiYoYS5iYT0hMCxiPWEubCxiLmc9PWEmJmIuY2EmJiFiLk0mJihiLmwuaW5mbyhcIkdyZWF0LCBubyBidWZmZXJpbmcgcHJveHkgZGV0ZWN0ZWQuIEJ5dGVzIHJlY2VpdmVkOiBcIitjLmxlbmd0aCksdmMoYiksYi5NPSEwLEYoMTEpKSk6KEQoYS5qLGEubSxcbmMsXCJbSW52YWxpZCBDaHVua2VkIFJlc3BvbnNlXVwiKSxJKGEpLHBjKGEpKTt9ay5tYj1mdW5jdGlvbigpe2lmKHRoaXMuZyl7dmFyIGE9SCh0aGlzLmcpLGI9dGhpcy5nLmphKCk7dGhpcy5DPGIubGVuZ3RoJiYobmModGhpcykscmModGhpcyxhLGIpLHRoaXMuaSYmNCE9YSYmamModGhpcykpO319O2Z1bmN0aW9uIHVjKGEsYil7dmFyIGM9YS5DLGQ9Yi5pbmRleE9mKFwiXFxuXCIsYyk7aWYoLTE9PWQpcmV0dXJuIGZjO2M9TnVtYmVyKGIuc3Vic3RyaW5nKGMsZCkpO2lmKGlzTmFOKGMpKXJldHVybiBlYztkKz0xO2lmKGQrYz5iLmxlbmd0aClyZXR1cm4gZmM7Yj1iLnNsaWNlKGQsZCtjKTthLkM9ZCtjO3JldHVybiBifWsuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5KPSEwO0kodGhpcyk7fTtmdW5jdGlvbiBqYyhhKXthLlk9RGF0ZS5ub3coKSthLlA7d2MoYSxhLlApO31cbmZ1bmN0aW9uIHdjKGEsYil7aWYobnVsbCE9YS5CKXRocm93IEVycm9yKFwiV2F0Y2hEb2cgdGltZXIgbm90IG51bGxcIik7YS5CPVJiKHEoYS5sYixhKSxiKTt9ZnVuY3Rpb24gbmMoYSl7YS5CJiYobC5jbGVhclRpbWVvdXQoYS5CKSxhLkI9bnVsbCk7fWsubGI9ZnVuY3Rpb24oKXt0aGlzLkI9bnVsbDtjb25zdCBhPURhdGUubm93KCk7MDw9YS10aGlzLlk/KEtiKHRoaXMuaix0aGlzLkEpLDIhPXRoaXMuTCYmKE9iKCksRigxNykpLEkodGhpcyksdGhpcy5vPTIscGModGhpcykpOndjKHRoaXMsdGhpcy5ZLWEpO307ZnVuY3Rpb24gcGMoYSl7MD09YS5sLkh8fGEuSnx8c2MoYS5sLGEpO31mdW5jdGlvbiBJKGEpe25jKGEpO3ZhciBiPWEuTTtiJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBiLnNhJiZiLnNhKCk7YS5NPW51bGw7eGIoYS5WKTtGYihhLlUpO2EuZyYmKGI9YS5nLGEuZz1udWxsLGIuYWJvcnQoKSxiLnNhKCkpO31cbmZ1bmN0aW9uIHFjKGEsYil7dHJ5e3ZhciBjPWEubDtpZigwIT1jLkgmJihjLmc9PWF8fHhjKGMuaSxhKSkpaWYoIWEuSyYmeGMoYy5pLGEpJiYzPT1jLkgpe3RyeXt2YXIgZD1jLkphLmcucGFyc2UoYik7fWNhdGNoKG0pe2Q9bnVsbDt9aWYoQXJyYXkuaXNBcnJheShkKSYmMz09ZC5sZW5ndGgpe3ZhciBlPWQ7aWYoMD09ZVswXSlhOntpZighYy51KXtpZihjLmcpaWYoYy5nLkcrM0UzPGEuRyl5YyhjKSx6YyhjKTtlbHNlIGJyZWFrIGE7QWMoYyk7RigxOCk7fX1lbHNlIGMuRmE9ZVsxXSwwPGMuRmEtYy5WJiYzNzUwMD5lWzJdJiZjLkcmJjA9PWMuQSYmIWMudiYmKGMudj1SYihxKGMuaWIsYyksNkUzKSk7aWYoMT49QmMoYy5pKSYmYy5vYSl7dHJ5e2Mub2EoKTt9Y2F0Y2gobSl7fWMub2E9dm9pZCAwO319ZWxzZSBKKGMsMTEpO31lbHNlIGlmKChhLkt8fGMuZz09YSkmJnljKGMpLCF4KGIpKWZvcihlPWMuSmEuZy5wYXJzZShiKSxiPTA7YjxlLmxlbmd0aDtiKyspe2xldCBtPWVbYl07Yy5WPVxubVswXTttPW1bMV07aWYoMj09Yy5IKWlmKFwiY1wiPT1tWzBdKXtjLks9bVsxXTtjLnBhPW1bMl07Y29uc3QgdT1tWzNdO251bGwhPXUmJihjLnJhPXUsYy5sLmluZm8oXCJWRVI9XCIrYy5yYSkpO2NvbnN0IEw9bVs0XTtudWxsIT1MJiYoYy5HYT1MLGMubC5pbmZvKFwiU1ZFUj1cIitjLkdhKSk7Y29uc3QgTGE9bVs1XTtudWxsIT1MYSYmXCJudW1iZXJcIj09PXR5cGVvZiBMYSYmMDxMYSYmKGQ9MS41KkxhLGMuTD1kLGMubC5pbmZvKFwiYmFja0NoYW5uZWxSZXF1ZXN0VGltZW91dE1zXz1cIitkKSk7ZD1jO2NvbnN0IGxhPWEuZztpZihsYSl7Y29uc3QgTWE9bGEuZz9sYS5nLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1DbGllbnQtV2lyZS1Qcm90b2NvbFwiKTpudWxsO2lmKE1hKXt2YXIgZj1kLmk7Zi5nfHwtMT09TWEuaW5kZXhPZihcInNwZHlcIikmJi0xPT1NYS5pbmRleE9mKFwicXVpY1wiKSYmLTE9PU1hLmluZGV4T2YoXCJoMlwiKXx8KGYuaj1mLmwsZi5nPW5ldyBTZXQsZi5oJiYoQ2MoZixmLmgpLGYuaD1udWxsKSk7fWlmKGQuRil7Y29uc3QgRWI9XG5sYS5nP2xhLmcuZ2V0UmVzcG9uc2VIZWFkZXIoXCJYLUhUVFAtU2Vzc2lvbi1JZFwiKTpudWxsO0ViJiYoZC5EYT1FYixLKGQuSSxkLkYsRWIpKTt9fWMuSD0zO2MuaCYmYy5oLkJhKCk7Yy5jYSYmKGMuUz1EYXRlLm5vdygpLWEuRyxjLmwuaW5mbyhcIkhhbmRzaGFrZSBSVFQ6IFwiK2MuUytcIm1zXCIpKTtkPWM7dmFyIGg9YTtkLndhPURjKGQsZC5KP2QucGE6bnVsbCxkLlkpO2lmKGguSyl7RWMoZC5pLGgpO3ZhciBuPWgsdD1kLkw7dCYmbi5zZXRUaW1lb3V0KHQpO24uQiYmKG5jKG4pLGpjKG4pKTtkLmc9aDt9ZWxzZSBGYyhkKTswPGMuai5sZW5ndGgmJkdjKGMpO31lbHNlIFwic3RvcFwiIT1tWzBdJiZcImNsb3NlXCIhPW1bMF18fEooYyw3KTtlbHNlIDM9PWMuSCYmKFwic3RvcFwiPT1tWzBdfHxcImNsb3NlXCI9PW1bMF0/XCJzdG9wXCI9PW1bMF0/SihjLDcpOkhjKGMpOlwibm9vcFwiIT1tWzBdJiZjLmgmJmMuaC5BYShtKSxjLkE9MCk7fU9iKDQpO31jYXRjaChtKXt9fWZ1bmN0aW9uIEljKGEpe2lmKGEuWiYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5aKXJldHVybiBhLlooKTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIE1hcCYmYSBpbnN0YW5jZW9mIE1hcHx8XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBTZXQmJmEgaW5zdGFuY2VvZiBTZXQpcmV0dXJuIEFycmF5LmZyb20oYS52YWx1ZXMoKSk7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBhLnNwbGl0KFwiXCIpO2lmKGFhKGEpKXtmb3IodmFyIGI9W10sYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyliLnB1c2goYVtkXSk7cmV0dXJuIGJ9Yj1bXTtjPTA7Zm9yKGQgaW4gYSliW2MrK109YVtkXTtyZXR1cm4gYn1cbmZ1bmN0aW9uIEpjKGEpe2lmKGEudGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEudGEpcmV0dXJuIGEudGEoKTtpZighYS5afHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBhLlope2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgTWFwJiZhIGluc3RhbmNlb2YgTWFwKXJldHVybiBBcnJheS5mcm9tKGEua2V5cygpKTtpZighKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgU2V0JiZhIGluc3RhbmNlb2YgU2V0KSl7aWYoYWEoYSl8fFwic3RyaW5nXCI9PT10eXBlb2YgYSl7dmFyIGI9W107YT1hLmxlbmd0aDtmb3IodmFyIGM9MDtjPGE7YysrKWIucHVzaChjKTtyZXR1cm4gYn1iPVtdO2M9MDtmb3IoY29uc3QgZCBpbiBhKWJbYysrXT1kO3JldHVybiBifX19XG5mdW5jdGlvbiBLYyhhLGIpe2lmKGEuZm9yRWFjaCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5mb3JFYWNoKWEuZm9yRWFjaChiLHZvaWQgMCk7ZWxzZSBpZihhYShhKXx8XCJzdHJpbmdcIj09PXR5cGVvZiBhKUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSxiLHZvaWQgMCk7ZWxzZSBmb3IodmFyIGM9SmMoYSksZD1JYyhhKSxlPWQubGVuZ3RoLGY9MDtmPGU7ZisrKWIuY2FsbCh2b2lkIDAsZFtmXSxjJiZjW2ZdLGEpO312YXIgTGM9UmVnRXhwKFwiXig/OihbXjovPyMuXSspOik/KD86Ly8oPzooW15cXFxcXFxcXC8/I10qKUApPyhbXlxcXFxcXFxcLz8jXSo/KSg/OjooWzAtOV0rKSk/KD89W1xcXFxcXFxcLz8jXXwkKSk/KFtePyNdKyk/KD86XFxcXD8oW14jXSopKT8oPzojKFtcXFxcc1xcXFxTXSopKT8kXCIpO2Z1bmN0aW9uIE1jKGEsYil7aWYoYSl7YT1hLnNwbGl0KFwiJlwiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5pbmRleE9mKFwiPVwiKSxlPW51bGw7aWYoMDw9ZCl7dmFyIGY9YVtjXS5zdWJzdHJpbmcoMCxkKTtlPWFbY10uc3Vic3RyaW5nKGQrMSk7fWVsc2UgZj1hW2NdO2IoZixlP2RlY29kZVVSSUNvbXBvbmVudChlLnJlcGxhY2UoL1xcKy9nLFwiIFwiKSk6XCJcIik7fX19ZnVuY3Rpb24gTShhKXt0aGlzLmc9dGhpcy5zPXRoaXMuaj1cIlwiO3RoaXMubT1udWxsO3RoaXMubz10aGlzLmw9XCJcIjt0aGlzLmg9ITE7aWYoYSBpbnN0YW5jZW9mIE0pe3RoaXMuaD1hLmg7TmModGhpcyxhLmopO3RoaXMucz1hLnM7dGhpcy5nPWEuZztPYyh0aGlzLGEubSk7dGhpcy5sPWEubDt2YXIgYj1hLmk7dmFyIGM9bmV3IFBjO2MuaT1iLmk7Yi5nJiYoYy5nPW5ldyBNYXAoYi5nKSxjLmg9Yi5oKTtRYyh0aGlzLGMpO3RoaXMubz1hLm87fWVsc2UgYSYmKGI9U3RyaW5nKGEpLm1hdGNoKExjKSk/KHRoaXMuaD0hMSxOYyh0aGlzLGJbMV18fFwiXCIsITApLHRoaXMucz1SYyhiWzJdfHxcIlwiKSx0aGlzLmc9UmMoYlszXXx8XCJcIiwhMCksT2ModGhpcyxiWzRdKSx0aGlzLmw9UmMoYls1XXx8XCJcIiwhMCksUWModGhpcyxiWzZdfHxcIlwiLCEwKSx0aGlzLm89UmMoYls3XXx8XCJcIikpOih0aGlzLmg9ITEsdGhpcy5pPW5ldyBQYyhudWxsLHRoaXMuaCkpO31cbk0ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj10aGlzLmo7YiYmYS5wdXNoKFNjKGIsVGMsITApLFwiOlwiKTt2YXIgYz10aGlzLmc7aWYoY3x8XCJmaWxlXCI9PWIpYS5wdXNoKFwiLy9cIiksKGI9dGhpcy5zKSYmYS5wdXNoKFNjKGIsVGMsITApLFwiQFwiKSxhLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjKSkucmVwbGFjZSgvJTI1KFswLTlhLWZBLUZdezJ9KS9nLFwiJSQxXCIpKSxjPXRoaXMubSxudWxsIT1jJiZhLnB1c2goXCI6XCIsU3RyaW5nKGMpKTtpZihjPXRoaXMubCl0aGlzLmcmJlwiL1wiIT1jLmNoYXJBdCgwKSYmYS5wdXNoKFwiL1wiKSxhLnB1c2goU2MoYyxcIi9cIj09Yy5jaGFyQXQoMCk/VWM6VmMsITApKTsoYz10aGlzLmkudG9TdHJpbmcoKSkmJmEucHVzaChcIj9cIixjKTsoYz10aGlzLm8pJiZhLnB1c2goXCIjXCIsU2MoYyxXYykpO3JldHVybiBhLmpvaW4oXCJcIil9O2Z1bmN0aW9uIEcoYSl7cmV0dXJuIG5ldyBNKGEpfVxuZnVuY3Rpb24gTmMoYSxiLGMpe2Euaj1jP1JjKGIsITApOmI7YS5qJiYoYS5qPWEuai5yZXBsYWNlKC86JC8sXCJcIikpO31mdW5jdGlvbiBPYyhhLGIpe2lmKGIpe2I9TnVtYmVyKGIpO2lmKGlzTmFOKGIpfHwwPmIpdGhyb3cgRXJyb3IoXCJCYWQgcG9ydCBudW1iZXIgXCIrYik7YS5tPWI7fWVsc2UgYS5tPW51bGw7fWZ1bmN0aW9uIFFjKGEsYixjKXtiIGluc3RhbmNlb2YgUGM/KGEuaT1iLFhjKGEuaSxhLmgpKTooY3x8KGI9U2MoYixZYykpLGEuaT1uZXcgUGMoYixhLmgpKTt9ZnVuY3Rpb24gSyhhLGIsYyl7YS5pLnNldChiLGMpO31mdW5jdGlvbiBoYyhhKXtLKGEsXCJ6eFwiLE1hdGguZmxvb3IoMjE0NzQ4MzY0OCpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikrTWF0aC5hYnMoTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpXkRhdGUubm93KCkpLnRvU3RyaW5nKDM2KSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBSYyhhLGIpe3JldHVybiBhP2I/ZGVjb2RlVVJJKGEucmVwbGFjZSgvJTI1L2csXCIlMjUyNVwiKSk6ZGVjb2RlVVJJQ29tcG9uZW50KGEpOlwiXCJ9ZnVuY3Rpb24gU2MoYSxiLGMpe3JldHVybiBcInN0cmluZ1wiPT09dHlwZW9mIGE/KGE9ZW5jb2RlVVJJKGEpLnJlcGxhY2UoYixaYyksYyYmKGE9YS5yZXBsYWNlKC8lMjUoWzAtOWEtZkEtRl17Mn0pL2csXCIlJDFcIikpLGEpOm51bGx9ZnVuY3Rpb24gWmMoYSl7YT1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIFwiJVwiKyhhPj40JjE1KS50b1N0cmluZygxNikrKGEmMTUpLnRvU3RyaW5nKDE2KX12YXIgVGM9L1sjXFwvXFw/QF0vZyxWYz0vWyNcXD86XS9nLFVjPS9bI1xcP10vZyxZYz0vWyNcXD9AXS9nLFdjPS8jL2c7ZnVuY3Rpb24gUGMoYSxiKXt0aGlzLmg9dGhpcy5nPW51bGw7dGhpcy5pPWF8fG51bGw7dGhpcy5qPSEhYjt9XG5mdW5jdGlvbiBOKGEpe2EuZ3x8KGEuZz1uZXcgTWFwLGEuaD0wLGEuaSYmTWMoYS5pLGZ1bmN0aW9uKGIsYyl7YS5hZGQoZGVjb2RlVVJJQ29tcG9uZW50KGIucmVwbGFjZSgvXFwrL2csXCIgXCIpKSxjKTt9KSk7fWs9UGMucHJvdG90eXBlO2suYWRkPWZ1bmN0aW9uKGEsYil7Tih0aGlzKTt0aGlzLmk9bnVsbDthPU8odGhpcyxhKTt2YXIgYz10aGlzLmcuZ2V0KGEpO2N8fHRoaXMuZy5zZXQoYSxjPVtdKTtjLnB1c2goYik7dGhpcy5oKz0xO3JldHVybiB0aGlzfTtmdW5jdGlvbiAkYyhhLGIpe04oYSk7Yj1PKGEsYik7YS5nLmhhcyhiKSYmKGEuaT1udWxsLGEuaC09YS5nLmdldChiKS5sZW5ndGgsYS5nLmRlbGV0ZShiKSk7fWZ1bmN0aW9uIGFkKGEsYil7TihhKTtiPU8oYSxiKTtyZXR1cm4gYS5nLmhhcyhiKX1cbmsuZm9yRWFjaD1mdW5jdGlvbihhLGIpe04odGhpcyk7dGhpcy5nLmZvckVhY2goZnVuY3Rpb24oYyxkKXtjLmZvckVhY2goZnVuY3Rpb24oZSl7YS5jYWxsKGIsZSxkLHRoaXMpO30sdGhpcyk7fSx0aGlzKTt9O2sudGE9ZnVuY3Rpb24oKXtOKHRoaXMpO2NvbnN0IGE9QXJyYXkuZnJvbSh0aGlzLmcudmFsdWVzKCkpLGI9QXJyYXkuZnJvbSh0aGlzLmcua2V5cygpKSxjPVtdO2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtjb25zdCBlPWFbZF07Zm9yKGxldCBmPTA7ZjxlLmxlbmd0aDtmKyspYy5wdXNoKGJbZF0pO31yZXR1cm4gY307ay5aPWZ1bmN0aW9uKGEpe04odGhpcyk7bGV0IGI9W107aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWFkKHRoaXMsYSkmJihiPWIuY29uY2F0KHRoaXMuZy5nZXQoTyh0aGlzLGEpKSkpO2Vsc2Uge2E9QXJyYXkuZnJvbSh0aGlzLmcudmFsdWVzKCkpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWI9Yi5jb25jYXQoYVtjXSk7fXJldHVybiBifTtcbmsuc2V0PWZ1bmN0aW9uKGEsYil7Tih0aGlzKTt0aGlzLmk9bnVsbDthPU8odGhpcyxhKTthZCh0aGlzLGEpJiYodGhpcy5oLT10aGlzLmcuZ2V0KGEpLmxlbmd0aCk7dGhpcy5nLnNldChhLFtiXSk7dGhpcy5oKz0xO3JldHVybiB0aGlzfTtrLmdldD1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBiO2E9dGhpcy5aKGEpO3JldHVybiAwPGEubGVuZ3RoP1N0cmluZyhhWzBdKTpifTtmdW5jdGlvbiBrYyhhLGIsYyl7JGMoYSxiKTswPGMubGVuZ3RoJiYoYS5pPW51bGwsYS5nLnNldChPKGEsYiksbWEoYykpLGEuaCs9Yy5sZW5ndGgpO31cbmsudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLmkpcmV0dXJuIHRoaXMuaTtpZighdGhpcy5nKXJldHVybiBcIlwiO2NvbnN0IGE9W10sYj1BcnJheS5mcm9tKHRoaXMuZy5rZXlzKCkpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdO2NvbnN0IGY9ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhkKSksaD10aGlzLlooZCk7Zm9yKGQ9MDtkPGgubGVuZ3RoO2QrKyl7dmFyIGU9ZjtcIlwiIT09aFtkXSYmKGUrPVwiPVwiK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaFtkXSkpKTthLnB1c2goZSk7fX1yZXR1cm4gdGhpcy5pPWEuam9pbihcIiZcIil9O2Z1bmN0aW9uIE8oYSxiKXtiPVN0cmluZyhiKTthLmomJihiPWIudG9Mb3dlckNhc2UoKSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiBYYyhhLGIpe2ImJiFhLmomJihOKGEpLGEuaT1udWxsLGEuZy5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7dmFyIGU9ZC50b0xvd2VyQ2FzZSgpO2QhPWUmJigkYyh0aGlzLGQpLGtjKHRoaXMsZSxjKSk7fSxhKSk7YS5qPWI7fXZhciBiZD1jbGFzc3tjb25zdHJ1Y3RvcihhLGIpe3RoaXMuZz1hO3RoaXMubWFwPWI7fX07ZnVuY3Rpb24gY2QoYSl7dGhpcy5sPWF8fGRkO2wuUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nPyhhPWwucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm5hdmlnYXRpb25cIiksYT0wPGEubGVuZ3RoJiYoXCJocVwiPT1hWzBdLm5leHRIb3BQcm90b2NvbHx8XCJoMlwiPT1hWzBdLm5leHRIb3BQcm90b2NvbCkpOmE9ISEobC5nJiZsLmcuS2EmJmwuZy5LYSgpJiZsLmcuS2EoKS5lYyk7dGhpcy5qPWE/dGhpcy5sOjE7dGhpcy5nPW51bGw7MTx0aGlzLmomJih0aGlzLmc9bmV3IFNldCk7dGhpcy5oPW51bGw7dGhpcy5pPVtdO312YXIgZGQ9MTA7ZnVuY3Rpb24gZWQoYSl7cmV0dXJuIGEuaD8hMDphLmc/YS5nLnNpemU+PWEuajohMX1mdW5jdGlvbiBCYyhhKXtyZXR1cm4gYS5oPzE6YS5nP2EuZy5zaXplOjB9ZnVuY3Rpb24geGMoYSxiKXtyZXR1cm4gYS5oP2EuaD09YjphLmc/YS5nLmhhcyhiKTohMX1mdW5jdGlvbiBDYyhhLGIpe2EuZz9hLmcuYWRkKGIpOmEuaD1iO31cbmZ1bmN0aW9uIEVjKGEsYil7YS5oJiZhLmg9PWI/YS5oPW51bGw6YS5nJiZhLmcuaGFzKGIpJiZhLmcuZGVsZXRlKGIpO31jZC5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy5pPWZkKHRoaXMpO2lmKHRoaXMuaCl0aGlzLmguY2FuY2VsKCksdGhpcy5oPW51bGw7ZWxzZSBpZih0aGlzLmcmJjAhPT10aGlzLmcuc2l6ZSl7Zm9yKGNvbnN0IGEgb2YgdGhpcy5nLnZhbHVlcygpKWEuY2FuY2VsKCk7dGhpcy5nLmNsZWFyKCk7fX07ZnVuY3Rpb24gZmQoYSl7aWYobnVsbCE9YS5oKXJldHVybiBhLmkuY29uY2F0KGEuaC5GKTtpZihudWxsIT1hLmcmJjAhPT1hLmcuc2l6ZSl7bGV0IGI9YS5pO2Zvcihjb25zdCBjIG9mIGEuZy52YWx1ZXMoKSliPWIuY29uY2F0KGMuRik7cmV0dXJuIGJ9cmV0dXJuIG1hKGEuaSl9dmFyIGdkPWNsYXNze3N0cmluZ2lmeShhKXtyZXR1cm4gbC5KU09OLnN0cmluZ2lmeShhLHZvaWQgMCl9cGFyc2UoYSl7cmV0dXJuIGwuSlNPTi5wYXJzZShhLHZvaWQgMCl9fTtmdW5jdGlvbiBoZCgpe3RoaXMuZz1uZXcgZ2Q7fWZ1bmN0aW9uIGlkKGEsYixjKXtjb25zdCBkPWN8fFwiXCI7dHJ5e0tjKGEsZnVuY3Rpb24oZSxmKXtsZXQgaD1lO3AoZSkmJihoPWpiKGUpKTtiLnB1c2goZCtmK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChoKSk7fSk7fWNhdGNoKGUpe3Rocm93IGIucHVzaChkK1widHlwZT1cIitlbmNvZGVVUklDb21wb25lbnQoXCJfYmFkbWFwXCIpKSxlO319ZnVuY3Rpb24gamQoYSxiKXtjb25zdCBjPW5ldyBHYjtpZihsLkltYWdlKXtjb25zdCBkPW5ldyBJbWFnZTtkLm9ubG9hZD1oYShrZCxjLGQsXCJUZXN0TG9hZEltYWdlOiBsb2FkZWRcIiwhMCxiKTtkLm9uZXJyb3I9aGEoa2QsYyxkLFwiVGVzdExvYWRJbWFnZTogZXJyb3JcIiwhMSxiKTtkLm9uYWJvcnQ9aGEoa2QsYyxkLFwiVGVzdExvYWRJbWFnZTogYWJvcnRcIiwhMSxiKTtkLm9udGltZW91dD1oYShrZCxjLGQsXCJUZXN0TG9hZEltYWdlOiB0aW1lb3V0XCIsITEsYik7bC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoZC5vbnRpbWVvdXQpZC5vbnRpbWVvdXQoKTt9LDFFNCk7ZC5zcmM9YTt9ZWxzZSBiKCExKTt9ZnVuY3Rpb24ga2QoYSxiLGMsZCxlKXt0cnl7Yi5vbmxvYWQ9bnVsbCxiLm9uZXJyb3I9bnVsbCxiLm9uYWJvcnQ9bnVsbCxiLm9udGltZW91dD1udWxsLGUoZCk7fWNhdGNoKGYpe319ZnVuY3Rpb24gbGQoYSl7dGhpcy5sPWEuZmN8fG51bGw7dGhpcy5qPWEub2J8fCExO31yKGxkLFViKTtsZC5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiBuZXcgbWQodGhpcy5sLHRoaXMuail9O2xkLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhfX0oe30pO2Z1bmN0aW9uIG1kKGEsYil7Qi5jYWxsKHRoaXMpO3RoaXMuRj1hO3RoaXMudT1iO3RoaXMubT12b2lkIDA7dGhpcy5yZWFkeVN0YXRlPW5kO3RoaXMuc3RhdHVzPTA7dGhpcy5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVRleHQ9dGhpcy5yZXNwb25zZT10aGlzLnN0YXR1c1RleHQ9XCJcIjt0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO3RoaXMudj1uZXcgSGVhZGVyczt0aGlzLmg9bnVsbDt0aGlzLkM9XCJHRVRcIjt0aGlzLkI9XCJcIjt0aGlzLmc9ITE7dGhpcy5BPXRoaXMuaj10aGlzLmw9bnVsbDt9cihtZCxCKTt2YXIgbmQ9MDtrPW1kLnByb3RvdHlwZTtcbmsub3Blbj1mdW5jdGlvbihhLGIpe2lmKHRoaXMucmVhZHlTdGF0ZSE9bmQpdGhyb3cgdGhpcy5hYm9ydCgpLEVycm9yKFwiRXJyb3IgcmVvcGVuaW5nIGEgY29ubmVjdGlvblwiKTt0aGlzLkM9YTt0aGlzLkI9Yjt0aGlzLnJlYWR5U3RhdGU9MTtvZCh0aGlzKTt9O2suc2VuZD1mdW5jdGlvbihhKXtpZigxIT10aGlzLnJlYWR5U3RhdGUpdGhyb3cgdGhpcy5hYm9ydCgpLEVycm9yKFwibmVlZCB0byBjYWxsIG9wZW4oKSBmaXJzdC4gXCIpO3RoaXMuZz0hMDtjb25zdCBiPXtoZWFkZXJzOnRoaXMudixtZXRob2Q6dGhpcy5DLGNyZWRlbnRpYWxzOnRoaXMubSxjYWNoZTp2b2lkIDB9O2EmJihiLmJvZHk9YSk7KHRoaXMuRnx8bCkuZmV0Y2gobmV3IFJlcXVlc3QodGhpcy5CLGIpKS50aGVuKHRoaXMuJGEuYmluZCh0aGlzKSx0aGlzLmthLmJpbmQodGhpcykpO307XG5rLmFib3J0PWZ1bmN0aW9uKCl7dGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dD1cIlwiO3RoaXMudj1uZXcgSGVhZGVyczt0aGlzLnN0YXR1cz0wO3RoaXMuaiYmdGhpcy5qLmNhbmNlbChcIlJlcXVlc3Qgd2FzIGFib3J0ZWQuXCIpLmNhdGNoKCgpPT57fSk7MTw9dGhpcy5yZWFkeVN0YXRlJiZ0aGlzLmcmJjQhPXRoaXMucmVhZHlTdGF0ZSYmKHRoaXMuZz0hMSxwZCh0aGlzKSk7dGhpcy5yZWFkeVN0YXRlPW5kO307XG5rLiRhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZyYmKHRoaXMubD1hLHRoaXMuaHx8KHRoaXMuc3RhdHVzPXRoaXMubC5zdGF0dXMsdGhpcy5zdGF0dXNUZXh0PXRoaXMubC5zdGF0dXNUZXh0LHRoaXMuaD1hLmhlYWRlcnMsdGhpcy5yZWFkeVN0YXRlPTIsb2QodGhpcykpLHRoaXMuZyYmKHRoaXMucmVhZHlTdGF0ZT0zLG9kKHRoaXMpLHRoaXMuZykpKWlmKFwiYXJyYXlidWZmZXJcIj09PXRoaXMucmVzcG9uc2VUeXBlKWEuYXJyYXlCdWZmZXIoKS50aGVuKHRoaXMuWWEuYmluZCh0aGlzKSx0aGlzLmthLmJpbmQodGhpcykpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBsLlJlYWRhYmxlU3RyZWFtJiZcImJvZHlcImluIGEpe3RoaXMuaj1hLmJvZHkuZ2V0UmVhZGVyKCk7aWYodGhpcy51KXtpZih0aGlzLnJlc3BvbnNlVHlwZSl0aHJvdyBFcnJvcigncmVzcG9uc2VUeXBlIG11c3QgYmUgZW1wdHkgZm9yIFwic3RyZWFtQmluYXJ5Q2h1bmtzXCIgbW9kZSByZXNwb25zZXMuJyk7dGhpcy5yZXNwb25zZT1cbltdO31lbHNlIHRoaXMucmVzcG9uc2U9dGhpcy5yZXNwb25zZVRleHQ9XCJcIix0aGlzLkE9bmV3IFRleHREZWNvZGVyO3FkKHRoaXMpO31lbHNlIGEudGV4dCgpLnRoZW4odGhpcy5aYS5iaW5kKHRoaXMpLHRoaXMua2EuYmluZCh0aGlzKSk7fTtmdW5jdGlvbiBxZChhKXthLmoucmVhZCgpLnRoZW4oYS5YYS5iaW5kKGEpKS5jYXRjaChhLmthLmJpbmQoYSkpO31rLlhhPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZyl7aWYodGhpcy51JiZhLnZhbHVlKXRoaXMucmVzcG9uc2UucHVzaChhLnZhbHVlKTtlbHNlIGlmKCF0aGlzLnUpe3ZhciBiPWEudmFsdWU/YS52YWx1ZTpuZXcgVWludDhBcnJheSgwKTtpZihiPXRoaXMuQS5kZWNvZGUoYix7c3RyZWFtOiFhLmRvbmV9KSl0aGlzLnJlc3BvbnNlPXRoaXMucmVzcG9uc2VUZXh0Kz1iO31hLmRvbmU/cGQodGhpcyk6b2QodGhpcyk7Mz09dGhpcy5yZWFkeVN0YXRlJiZxZCh0aGlzKTt9fTtcbmsuWmE9ZnVuY3Rpb24oYSl7dGhpcy5nJiYodGhpcy5yZXNwb25zZT10aGlzLnJlc3BvbnNlVGV4dD1hLHBkKHRoaXMpKTt9O2suWWE9ZnVuY3Rpb24oYSl7dGhpcy5nJiYodGhpcy5yZXNwb25zZT1hLHBkKHRoaXMpKTt9O2sua2E9ZnVuY3Rpb24oKXt0aGlzLmcmJnBkKHRoaXMpO307ZnVuY3Rpb24gcGQoYSl7YS5yZWFkeVN0YXRlPTQ7YS5sPW51bGw7YS5qPW51bGw7YS5BPW51bGw7b2QoYSk7fWsuc2V0UmVxdWVzdEhlYWRlcj1mdW5jdGlvbihhLGIpe3RoaXMudi5hcHBlbmQoYSxiKTt9O2suZ2V0UmVzcG9uc2VIZWFkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaD90aGlzLmguZ2V0KGEudG9Mb3dlckNhc2UoKSl8fFwiXCI6XCJcIn07XG5rLmdldEFsbFJlc3BvbnNlSGVhZGVycz1mdW5jdGlvbigpe2lmKCF0aGlzLmgpcmV0dXJuIFwiXCI7Y29uc3QgYT1bXSxiPXRoaXMuaC5lbnRyaWVzKCk7Zm9yKHZhciBjPWIubmV4dCgpOyFjLmRvbmU7KWM9Yy52YWx1ZSxhLnB1c2goY1swXStcIjogXCIrY1sxXSksYz1iLm5leHQoKTtyZXR1cm4gYS5qb2luKFwiXFxyXFxuXCIpfTtmdW5jdGlvbiBvZChhKXthLm9ucmVhZHlzdGF0ZWNoYW5nZSYmYS5vbnJlYWR5c3RhdGVjaGFuZ2UuY2FsbChhKTt9T2JqZWN0LmRlZmluZVByb3BlcnR5KG1kLnByb3RvdHlwZSxcIndpdGhDcmVkZW50aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gXCJpbmNsdWRlXCI9PT10aGlzLm19LHNldDpmdW5jdGlvbihhKXt0aGlzLm09YT9cImluY2x1ZGVcIjpcInNhbWUtb3JpZ2luXCI7fX0pO3ZhciByZD1sLkpTT04ucGFyc2U7ZnVuY3Rpb24gUChhKXtCLmNhbGwodGhpcyk7dGhpcy5oZWFkZXJzPW5ldyBNYXA7dGhpcy51PWF8fG51bGw7dGhpcy5oPSExO3RoaXMuQz10aGlzLmc9bnVsbDt0aGlzLkk9XCJcIjt0aGlzLm09MDt0aGlzLmo9XCJcIjt0aGlzLmw9dGhpcy5HPXRoaXMudj10aGlzLkY9ITE7dGhpcy5CPTA7dGhpcy5BPW51bGw7dGhpcy5LPXNkO3RoaXMuTD10aGlzLk09ITE7fXIoUCxCKTt2YXIgc2Q9XCJcIix0ZD0vXmh0dHBzPyQvaSx1ZD1bXCJQT1NUXCIsXCJQVVRcIl07az1QLnByb3RvdHlwZTtrLk9hPWZ1bmN0aW9uKGEpe3RoaXMuTT1hO307XG5rLmhhPWZ1bmN0aW9uKGEsYixjLGQpe2lmKHRoaXMuZyl0aHJvdyBFcnJvcihcIltnb29nLm5ldC5YaHJJb10gT2JqZWN0IGlzIGFjdGl2ZSB3aXRoIGFub3RoZXIgcmVxdWVzdD1cIit0aGlzLkkrXCI7IG5ld1VyaT1cIithKTtiPWI/Yi50b1VwcGVyQ2FzZSgpOlwiR0VUXCI7dGhpcy5JPWE7dGhpcy5qPVwiXCI7dGhpcy5tPTA7dGhpcy5GPSExO3RoaXMuaD0hMDt0aGlzLmc9dGhpcy51P3RoaXMudS5nKCk6JGIuZygpO3RoaXMuQz10aGlzLnU/VmIodGhpcy51KTpWYigkYik7dGhpcy5nLm9ucmVhZHlzdGF0ZWNoYW5nZT1xKHRoaXMuTGEsdGhpcyk7dHJ5e3RoaXMuRz0hMCx0aGlzLmcub3BlbihiLFN0cmluZyhhKSwhMCksdGhpcy5HPSExO31jYXRjaChmKXt2ZCh0aGlzLGYpO3JldHVybn1hPWN8fFwiXCI7Yz1uZXcgTWFwKHRoaXMuaGVhZGVycyk7aWYoZClpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZCk9PT1PYmplY3QucHJvdG90eXBlKWZvcih2YXIgZSBpbiBkKWMuc2V0KGUsZFtlXSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBkLmtleXMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmdldClmb3IoY29uc3QgZiBvZiBkLmtleXMoKSljLnNldChmLGQuZ2V0KGYpKTtlbHNlIHRocm93IEVycm9yKFwiVW5rbm93biBpbnB1dCB0eXBlIGZvciBvcHRfaGVhZGVyczogXCIrU3RyaW5nKGQpKTtkPUFycmF5LmZyb20oYy5rZXlzKCkpLmZpbmQoZj0+XCJjb250ZW50LXR5cGVcIj09Zi50b0xvd2VyQ2FzZSgpKTtlPWwuRm9ybURhdGEmJmEgaW5zdGFuY2VvZiBsLkZvcm1EYXRhOyEoMDw9a2EodWQsYikpfHxkfHxlfHxjLnNldChcIkNvbnRlbnQtVHlwZVwiLFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLThcIik7Zm9yKGNvbnN0IFtmLGhdb2YgYyl0aGlzLmcuc2V0UmVxdWVzdEhlYWRlcihmLGgpO3RoaXMuSyYmKHRoaXMuZy5yZXNwb25zZVR5cGU9dGhpcy5LKTtcIndpdGhDcmVkZW50aWFsc1wiaW4gdGhpcy5nJiZ0aGlzLmcud2l0aENyZWRlbnRpYWxzIT09dGhpcy5NJiYodGhpcy5nLndpdGhDcmVkZW50aWFscz1cbnRoaXMuTSk7dHJ5e3dkKHRoaXMpLDA8dGhpcy5CJiYoKHRoaXMuTD14ZCh0aGlzLmcpKT8odGhpcy5nLnRpbWVvdXQ9dGhpcy5CLHRoaXMuZy5vbnRpbWVvdXQ9cSh0aGlzLnVhLHRoaXMpKTp0aGlzLkE9eWIodGhpcy51YSx0aGlzLkIsdGhpcykpLHRoaXMudj0hMCx0aGlzLmcuc2VuZChhKSx0aGlzLnY9ITE7fWNhdGNoKGYpe3ZkKHRoaXMsZik7fX07ZnVuY3Rpb24geGQoYSl7cmV0dXJuIHomJlwibnVtYmVyXCI9PT10eXBlb2YgYS50aW1lb3V0JiZ2b2lkIDAhPT1hLm9udGltZW91dH1rLnVhPWZ1bmN0aW9uKCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdvb2cmJnRoaXMuZyYmKHRoaXMuaj1cIlRpbWVkIG91dCBhZnRlciBcIit0aGlzLkIrXCJtcywgYWJvcnRpbmdcIix0aGlzLm09OCxDKHRoaXMsXCJ0aW1lb3V0XCIpLHRoaXMuYWJvcnQoOCkpO307ZnVuY3Rpb24gdmQoYSxiKXthLmg9ITE7YS5nJiYoYS5sPSEwLGEuZy5hYm9ydCgpLGEubD0hMSk7YS5qPWI7YS5tPTU7eWQoYSk7emQoYSk7fVxuZnVuY3Rpb24geWQoYSl7YS5GfHwoYS5GPSEwLEMoYSxcImNvbXBsZXRlXCIpLEMoYSxcImVycm9yXCIpKTt9ay5hYm9ydD1mdW5jdGlvbihhKXt0aGlzLmcmJnRoaXMuaCYmKHRoaXMuaD0hMSx0aGlzLmw9ITAsdGhpcy5nLmFib3J0KCksdGhpcy5sPSExLHRoaXMubT1hfHw3LEModGhpcyxcImNvbXBsZXRlXCIpLEModGhpcyxcImFib3J0XCIpLHpkKHRoaXMpKTt9O2suTj1mdW5jdGlvbigpe3RoaXMuZyYmKHRoaXMuaCYmKHRoaXMuaD0hMSx0aGlzLmw9ITAsdGhpcy5nLmFib3J0KCksdGhpcy5sPSExKSx6ZCh0aGlzLCEwKSk7UC4kLk4uY2FsbCh0aGlzKTt9O2suTGE9ZnVuY3Rpb24oKXt0aGlzLnN8fCh0aGlzLkd8fHRoaXMudnx8dGhpcy5sP0FkKHRoaXMpOnRoaXMua2IoKSk7fTtrLmtiPWZ1bmN0aW9uKCl7QWQodGhpcyk7fTtcbmZ1bmN0aW9uIEFkKGEpe2lmKGEuaCYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdvb2cmJighYS5DWzFdfHw0IT1IKGEpfHwyIT1hLmRhKCkpKWlmKGEudiYmND09SChhKSl5YihhLkxhLDAsYSk7ZWxzZSBpZihDKGEsXCJyZWFkeXN0YXRlY2hhbmdlXCIpLDQ9PUgoYSkpe2EuaD0hMTt0cnl7Y29uc3QgaD1hLmRhKCk7YTpzd2l0Y2goaCl7Y2FzZSAyMDA6Y2FzZSAyMDE6Y2FzZSAyMDI6Y2FzZSAyMDQ6Y2FzZSAyMDY6Y2FzZSAzMDQ6Y2FzZSAxMjIzOnZhciBiPSEwO2JyZWFrIGE7ZGVmYXVsdDpiPSExO312YXIgYztpZighKGM9Yikpe3ZhciBkO2lmKGQ9MD09PWgpe3ZhciBlPVN0cmluZyhhLkkpLm1hdGNoKExjKVsxXXx8bnVsbDshZSYmbC5zZWxmJiZsLnNlbGYubG9jYXRpb24mJihlPWwuc2VsZi5sb2NhdGlvbi5wcm90b2NvbC5zbGljZSgwLC0xKSk7ZD0hdGQudGVzdChlP2UudG9Mb3dlckNhc2UoKTpcIlwiKTt9Yz1kO31pZihjKUMoYSxcImNvbXBsZXRlXCIpLEMoYSxcInN1Y2Nlc3NcIik7ZWxzZSB7YS5tPVxuNjt0cnl7dmFyIGY9MjxIKGEpP2EuZy5zdGF0dXNUZXh0OlwiXCI7fWNhdGNoKG4pe2Y9XCJcIjt9YS5qPWYrXCIgW1wiK2EuZGEoKStcIl1cIjt5ZChhKTt9fWZpbmFsbHl7emQoYSk7fX19ZnVuY3Rpb24gemQoYSxiKXtpZihhLmcpe3dkKGEpO2NvbnN0IGM9YS5nLGQ9YS5DWzBdPygpPT57fTpudWxsO2EuZz1udWxsO2EuQz1udWxsO2J8fEMoYSxcInJlYWR5XCIpO3RyeXtjLm9ucmVhZHlzdGF0ZWNoYW5nZT1kO31jYXRjaChlKXt9fX1mdW5jdGlvbiB3ZChhKXthLmcmJmEuTCYmKGEuZy5vbnRpbWVvdXQ9bnVsbCk7YS5BJiYobC5jbGVhclRpbWVvdXQoYS5BKSxhLkE9bnVsbCk7fWsuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gISF0aGlzLmd9O2Z1bmN0aW9uIEgoYSl7cmV0dXJuIGEuZz9hLmcucmVhZHlTdGF0ZTowfWsuZGE9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIDI8SCh0aGlzKT90aGlzLmcuc3RhdHVzOi0xfWNhdGNoKGEpe3JldHVybiAtMX19O1xuay5qYT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gdGhpcy5nP3RoaXMuZy5yZXNwb25zZVRleHQ6XCJcIn1jYXRjaChhKXtyZXR1cm4gXCJcIn19O2suV2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5nKXt2YXIgYj10aGlzLmcucmVzcG9uc2VUZXh0O2EmJjA9PWIuaW5kZXhPZihhKSYmKGI9Yi5zdWJzdHJpbmcoYS5sZW5ndGgpKTtyZXR1cm4gcmQoYil9fTtmdW5jdGlvbiBtYyhhKXt0cnl7aWYoIWEuZylyZXR1cm4gbnVsbDtpZihcInJlc3BvbnNlXCJpbiBhLmcpcmV0dXJuIGEuZy5yZXNwb25zZTtzd2l0Y2goYS5LKXtjYXNlIHNkOmNhc2UgXCJ0ZXh0XCI6cmV0dXJuIGEuZy5yZXNwb25zZVRleHQ7Y2FzZSBcImFycmF5YnVmZmVyXCI6aWYoXCJtb3pSZXNwb25zZUFycmF5QnVmZmVyXCJpbiBhLmcpcmV0dXJuIGEuZy5tb3pSZXNwb25zZUFycmF5QnVmZmVyfXJldHVybiBudWxsfWNhdGNoKGIpe3JldHVybiBudWxsfX1cbmZ1bmN0aW9uIHRjKGEpe2NvbnN0IGI9e307YT0oYS5nJiYyPD1IKGEpP2EuZy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKXx8XCJcIjpcIlwiKS5zcGxpdChcIlxcclxcblwiKTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7aWYoeChhW2RdKSljb250aW51ZTt2YXIgYz1xYihhW2RdKTtjb25zdCBlPWNbMF07Yz1jWzFdO2lmKFwic3RyaW5nXCIhPT10eXBlb2YgYyljb250aW51ZTtjPWMudHJpbSgpO2NvbnN0IGY9YltlXXx8W107YltlXT1mO2YucHVzaChjKTt9T2EoYixmdW5jdGlvbihkKXtyZXR1cm4gZC5qb2luKFwiLCBcIil9KTt9ay5JYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm19O2suU2E9ZnVuY3Rpb24oKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiB0aGlzLmo/dGhpcy5qOlN0cmluZyh0aGlzLmopfTtmdW5jdGlvbiBCZChhKXtsZXQgYj1cIlwiO05hKGEsZnVuY3Rpb24oYyxkKXtiKz1kO2IrPVwiOlwiO2IrPWM7Yis9XCJcXHJcXG5cIjt9KTtyZXR1cm4gYn1mdW5jdGlvbiBDZChhLGIsYyl7YTp7Zm9yKGQgaW4gYyl7dmFyIGQ9ITE7YnJlYWsgYX1kPSEwO31kfHwoYz1CZChjKSxcInN0cmluZ1wiPT09dHlwZW9mIGE/KG51bGwhPWMmJmVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYykpKTpLKGEsYixjKSk7fWZ1bmN0aW9uIERkKGEsYixjKXtyZXR1cm4gYyYmYy5pbnRlcm5hbENoYW5uZWxQYXJhbXM/Yy5pbnRlcm5hbENoYW5uZWxQYXJhbXNbYV18fGI6Yn1cbmZ1bmN0aW9uIEVkKGEpe3RoaXMuR2E9MDt0aGlzLmo9W107dGhpcy5sPW5ldyBHYjt0aGlzLnBhPXRoaXMud2E9dGhpcy5JPXRoaXMuWT10aGlzLmc9dGhpcy5EYT10aGlzLkY9dGhpcy5uYT10aGlzLm89dGhpcy5VPXRoaXMucz1udWxsO3RoaXMuZmI9dGhpcy5XPTA7dGhpcy5jYj1EZChcImZhaWxGYXN0XCIsITEsYSk7dGhpcy5HPXRoaXMudj10aGlzLnU9dGhpcy5tPXRoaXMuaD1udWxsO3RoaXMuYWE9ITA7dGhpcy5GYT10aGlzLlY9LTE7dGhpcy5iYT10aGlzLkE9dGhpcy5DPTA7dGhpcy5hYj1EZChcImJhc2VSZXRyeURlbGF5TXNcIiw1RTMsYSk7dGhpcy5oYj1EZChcInJldHJ5RGVsYXlTZWVkTXNcIiwxRTQsYSk7dGhpcy5lYj1EZChcImZvcndhcmRDaGFubmVsTWF4UmV0cmllc1wiLDIsYSk7dGhpcy54YT1EZChcImZvcndhcmRDaGFubmVsUmVxdWVzdFRpbWVvdXRNc1wiLDJFNCxhKTt0aGlzLnZhPWEmJmEueG1sSHR0cEZhY3Rvcnl8fHZvaWQgMDt0aGlzLkhhPWEmJmEuZGN8fCExO3RoaXMuTD1cbnZvaWQgMDt0aGlzLko9YSYmYS5zdXBwb3J0c0Nyb3NzRG9tYWluWGhyfHwhMTt0aGlzLks9XCJcIjt0aGlzLmk9bmV3IGNkKGEmJmEuY29uY3VycmVudFJlcXVlc3RMaW1pdCk7dGhpcy5KYT1uZXcgaGQ7dGhpcy5QPWEmJmEuZmFzdEhhbmRzaGFrZXx8ITE7dGhpcy5PPWEmJmEuZW5jb2RlSW5pdE1lc3NhZ2VIZWFkZXJzfHwhMTt0aGlzLlAmJnRoaXMuTyYmKHRoaXMuTz0hMSk7dGhpcy5iYj1hJiZhLmJjfHwhMTthJiZhLkVhJiZ0aGlzLmwuRWEoKTthJiZhLmZvcmNlTG9uZ1BvbGxpbmcmJih0aGlzLmFhPSExKTt0aGlzLmNhPSF0aGlzLlAmJnRoaXMuYWEmJmEmJmEuZGV0ZWN0QnVmZmVyaW5nUHJveHl8fCExO3RoaXMucWE9dm9pZCAwO2EmJmEubG9uZ1BvbGxpbmdUaW1lb3V0JiYwPGEubG9uZ1BvbGxpbmdUaW1lb3V0JiYodGhpcy5xYT1hLmxvbmdQb2xsaW5nVGltZW91dCk7dGhpcy5vYT12b2lkIDA7dGhpcy5TPTA7dGhpcy5NPSExO3RoaXMubWE9dGhpcy5CPW51bGw7fWs9RWQucHJvdG90eXBlO1xuay5yYT04O2suSD0xO2Z1bmN0aW9uIEhjKGEpe0ZkKGEpO2lmKDM9PWEuSCl7dmFyIGI9YS5XKyssYz1HKGEuSSk7SyhjLFwiU0lEXCIsYS5LKTtLKGMsXCJSSURcIixiKTtLKGMsXCJUWVBFXCIsXCJ0ZXJtaW5hdGVcIik7R2QoYSxjKTtiPW5ldyBiYyhhLGEubCxiKTtiLkw9MjtiLnY9aGMoRyhjKSk7Yz0hMTtpZihsLm5hdmlnYXRvciYmbC5uYXZpZ2F0b3Iuc2VuZEJlYWNvbil0cnl7Yz1sLm5hdmlnYXRvci5zZW5kQmVhY29uKGIudi50b1N0cmluZygpLFwiXCIpO31jYXRjaChkKXt9IWMmJmwuSW1hZ2UmJigobmV3IEltYWdlKS5zcmM9Yi52LGM9ITApO2N8fChiLmc9bGMoYi5sLG51bGwpLGIuZy5oYShiLnYpKTtiLkc9RGF0ZS5ub3coKTtqYyhiKTt9SGQoYSk7fWZ1bmN0aW9uIHpjKGEpe2EuZyYmKHZjKGEpLGEuZy5jYW5jZWwoKSxhLmc9bnVsbCk7fVxuZnVuY3Rpb24gRmQoYSl7emMoYSk7YS51JiYobC5jbGVhclRpbWVvdXQoYS51KSxhLnU9bnVsbCk7eWMoYSk7YS5pLmNhbmNlbCgpO2EubSYmKFwibnVtYmVyXCI9PT10eXBlb2YgYS5tJiZsLmNsZWFyVGltZW91dChhLm0pLGEubT1udWxsKTt9ZnVuY3Rpb24gR2MoYSl7aWYoIWVkKGEuaSkmJiFhLm0pe2EubT0hMDt2YXIgYj1hLk5hO3NifHx2YigpO3RifHwoc2IoKSx0Yj0hMCk7bWIuYWRkKGIsYSk7YS5DPTA7fX1mdW5jdGlvbiBJZChhLGIpe2lmKEJjKGEuaSk+PWEuaS5qLShhLm0/MTowKSlyZXR1cm4gITE7aWYoYS5tKXJldHVybiBhLmo9Yi5GLmNvbmNhdChhLmopLCEwO2lmKDE9PWEuSHx8Mj09YS5IfHxhLkM+PShhLmNiPzA6YS5lYikpcmV0dXJuICExO2EubT1SYihxKGEuTmEsYSxiKSxKZChhLGEuQykpO2EuQysrO3JldHVybiAhMH1cbmsuTmE9ZnVuY3Rpb24oYSl7aWYodGhpcy5tKWlmKHRoaXMubT1udWxsLDE9PXRoaXMuSCl7aWYoIWEpe3RoaXMuVz1NYXRoLmZsb29yKDFFNSpNYXRoLnJhbmRvbSgpKTthPXRoaXMuVysrO2NvbnN0IGU9bmV3IGJjKHRoaXMsdGhpcy5sLGEpO2xldCBmPXRoaXMuczt0aGlzLlUmJihmPyhmPVBhKGYpLFJhKGYsdGhpcy5VKSk6Zj10aGlzLlUpO251bGwhPT10aGlzLm98fHRoaXMuT3x8KGUuST1mLGY9bnVsbCk7aWYodGhpcy5QKWE6e3ZhciBiPTA7Zm9yKHZhciBjPTA7Yzx0aGlzLmoubGVuZ3RoO2MrKyl7Yjp7dmFyIGQ9dGhpcy5qW2NdO2lmKFwiX19kYXRhX19cImluIGQubWFwJiYoZD1kLm1hcC5fX2RhdGFfXyxcInN0cmluZ1wiPT09dHlwZW9mIGQpKXtkPWQubGVuZ3RoO2JyZWFrIGJ9ZD12b2lkIDA7fWlmKHZvaWQgMD09PWQpYnJlYWs7Yis9ZDtpZig0MDk2PGIpe2I9YzticmVhayBhfWlmKDQwOTY9PT1ifHxjPT09dGhpcy5qLmxlbmd0aC0xKXtiPWMrMTticmVhayBhfX1iPTFFMzt9ZWxzZSBiPVxuMUUzO2I9S2QodGhpcyxlLGIpO2M9Ryh0aGlzLkkpO0soYyxcIlJJRFwiLGEpO0soYyxcIkNWRVJcIiwyMik7dGhpcy5GJiZLKGMsXCJYLUhUVFAtU2Vzc2lvbi1JZFwiLHRoaXMuRik7R2QodGhpcyxjKTtmJiYodGhpcy5PP2I9XCJoZWFkZXJzPVwiK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoQmQoZikpKStcIiZcIitiOnRoaXMubyYmQ2QoYyx0aGlzLm8sZikpO0NjKHRoaXMuaSxlKTt0aGlzLmJiJiZLKGMsXCJUWVBFXCIsXCJpbml0XCIpO3RoaXMuUD8oSyhjLFwiJHJlcVwiLGIpLEsoYyxcIlNJRFwiLFwibnVsbFwiKSxlLmFhPSEwLGdjKGUsYyxudWxsKSk6Z2MoZSxjLGIpO3RoaXMuSD0yO319ZWxzZSAzPT10aGlzLkgmJihhP0xkKHRoaXMsYSk6MD09dGhpcy5qLmxlbmd0aHx8ZWQodGhpcy5pKXx8TGQodGhpcykpO307XG5mdW5jdGlvbiBMZChhLGIpe3ZhciBjO2I/Yz1iLm06Yz1hLlcrKztjb25zdCBkPUcoYS5JKTtLKGQsXCJTSURcIixhLkspO0soZCxcIlJJRFwiLGMpO0soZCxcIkFJRFwiLGEuVik7R2QoYSxkKTthLm8mJmEucyYmQ2QoZCxhLm8sYS5zKTtjPW5ldyBiYyhhLGEubCxjLGEuQysxKTtudWxsPT09YS5vJiYoYy5JPWEucyk7YiYmKGEuaj1iLkYuY29uY2F0KGEuaikpO2I9S2QoYSxjLDFFMyk7Yy5zZXRUaW1lb3V0KE1hdGgucm91bmQoLjUqYS54YSkrTWF0aC5yb3VuZCguNSphLnhhKk1hdGgucmFuZG9tKCkpKTtDYyhhLmksYyk7Z2MoYyxkLGIpO31mdW5jdGlvbiBHZChhLGIpe2EubmEmJk5hKGEubmEsZnVuY3Rpb24oYyxkKXtLKGIsZCxjKTt9KTthLmgmJktjKHt9LGZ1bmN0aW9uKGMsZCl7SyhiLGQsYyk7fSk7fVxuZnVuY3Rpb24gS2QoYSxiLGMpe2M9TWF0aC5taW4oYS5qLmxlbmd0aCxjKTt2YXIgZD1hLmg/cShhLmguVmEsYS5oLGEpOm51bGw7YTp7dmFyIGU9YS5qO2xldCBmPS0xO2Zvcig7Oyl7Y29uc3QgaD1bXCJjb3VudD1cIitjXTstMT09Zj8wPGM/KGY9ZVswXS5nLGgucHVzaChcIm9mcz1cIitmKSk6Zj0wOmgucHVzaChcIm9mcz1cIitmKTtsZXQgbj0hMDtmb3IobGV0IHQ9MDt0PGM7dCsrKXtsZXQgbT1lW3RdLmc7Y29uc3QgdT1lW3RdLm1hcDttLT1mO2lmKDA+bSlmPU1hdGgubWF4KDAsZVt0XS5nLTEwMCksbj0hMTtlbHNlIHRyeXtpZCh1LGgsXCJyZXFcIittK1wiX1wiKTt9Y2F0Y2goTCl7ZCYmZCh1KTt9fWlmKG4pe2Q9aC5qb2luKFwiJlwiKTticmVhayBhfX19YT1hLmouc3BsaWNlKDAsYyk7Yi5GPWE7cmV0dXJuIGR9ZnVuY3Rpb24gRmMoYSl7aWYoIWEuZyYmIWEudSl7YS5iYT0xO3ZhciBiPWEuTWE7c2J8fHZiKCk7dGJ8fChzYigpLHRiPSEwKTttYi5hZGQoYixhKTthLkE9MDt9fVxuZnVuY3Rpb24gQWMoYSl7aWYoYS5nfHxhLnV8fDM8PWEuQSlyZXR1cm4gITE7YS5iYSsrO2EudT1SYihxKGEuTWEsYSksSmQoYSxhLkEpKTthLkErKztyZXR1cm4gITB9ay5NYT1mdW5jdGlvbigpe3RoaXMudT1udWxsO01kKHRoaXMpO2lmKHRoaXMuY2EmJiEodGhpcy5NfHxudWxsPT10aGlzLmd8fDA+PXRoaXMuUykpe3ZhciBhPTIqdGhpcy5TO3RoaXMubC5pbmZvKFwiQlAgZGV0ZWN0aW9uIHRpbWVyIGVuYWJsZWQ6IFwiK2EpO3RoaXMuQj1SYihxKHRoaXMuamIsdGhpcyksYSk7fX07ay5qYj1mdW5jdGlvbigpe3RoaXMuQiYmKHRoaXMuQj1udWxsLHRoaXMubC5pbmZvKFwiQlAgZGV0ZWN0aW9uIHRpbWVvdXQgcmVhY2hlZC5cIiksdGhpcy5sLmluZm8oXCJCdWZmZXJpbmcgcHJveHkgZGV0ZWN0ZWQgYW5kIHN3aXRjaCB0byBsb25nLXBvbGxpbmchXCIpLHRoaXMuRz0hMSx0aGlzLk09ITAsRigxMCksemModGhpcyksTWQodGhpcykpO307XG5mdW5jdGlvbiB2YyhhKXtudWxsIT1hLkImJihsLmNsZWFyVGltZW91dChhLkIpLGEuQj1udWxsKTt9ZnVuY3Rpb24gTWQoYSl7YS5nPW5ldyBiYyhhLGEubCxcInJwY1wiLGEuYmEpO251bGw9PT1hLm8mJihhLmcuST1hLnMpO2EuZy5PPTA7dmFyIGI9RyhhLndhKTtLKGIsXCJSSURcIixcInJwY1wiKTtLKGIsXCJTSURcIixhLkspO0soYixcIkFJRFwiLGEuVik7SyhiLFwiQ0lcIixhLkc/XCIwXCI6XCIxXCIpOyFhLkcmJmEucWEmJksoYixcIlRPXCIsYS5xYSk7SyhiLFwiVFlQRVwiLFwieG1saHR0cFwiKTtHZChhLGIpO2EubyYmYS5zJiZDZChiLGEubyxhLnMpO2EuTCYmYS5nLnNldFRpbWVvdXQoYS5MKTt2YXIgYz1hLmc7YT1hLnBhO2MuTD0xO2Mudj1oYyhHKGIpKTtjLnM9bnVsbDtjLlM9ITA7aWMoYyxhKTt9ay5pYj1mdW5jdGlvbigpe251bGwhPXRoaXMudiYmKHRoaXMudj1udWxsLHpjKHRoaXMpLEFjKHRoaXMpLEYoMTkpKTt9O1xuZnVuY3Rpb24geWMoYSl7bnVsbCE9YS52JiYobC5jbGVhclRpbWVvdXQoYS52KSxhLnY9bnVsbCk7fWZ1bmN0aW9uIHNjKGEsYil7dmFyIGM9bnVsbDtpZihhLmc9PWIpe3ljKGEpO3ZjKGEpO2EuZz1udWxsO3ZhciBkPTI7fWVsc2UgaWYoeGMoYS5pLGIpKWM9Yi5GLEVjKGEuaSxiKSxkPTE7ZWxzZSByZXR1cm47aWYoMCE9YS5IKWlmKGIuaSlpZigxPT1kKXtjPWIucz9iLnMubGVuZ3RoOjA7Yj1EYXRlLm5vdygpLWIuRzt2YXIgZT1hLkM7ZD1NYigpO0MoZCxuZXcgUWIoZCxjKSk7R2MoYSk7fWVsc2UgRmMoYSk7ZWxzZSBpZihlPWIubywzPT1lfHwwPT1lJiYwPGIuY2F8fCEoMT09ZCYmSWQoYSxiKXx8Mj09ZCYmQWMoYSkpKXN3aXRjaChjJiYwPGMubGVuZ3RoJiYoYj1hLmksYi5pPWIuaS5jb25jYXQoYykpLGUpe2Nhc2UgMTpKKGEsNSk7YnJlYWs7Y2FzZSA0OkooYSwxMCk7YnJlYWs7Y2FzZSAzOkooYSw2KTticmVhaztkZWZhdWx0OkooYSwyKTt9fVxuZnVuY3Rpb24gSmQoYSxiKXtsZXQgYz1hLmFiK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmhiKTthLmlzQWN0aXZlKCl8fChjKj0yKTtyZXR1cm4gYypifWZ1bmN0aW9uIEooYSxiKXthLmwuaW5mbyhcIkVycm9yIGNvZGUgXCIrYik7aWYoMj09Yil7dmFyIGM9bnVsbDthLmgmJihjPW51bGwpO3ZhciBkPXEoYS5wYixhKTtjfHwoYz1uZXcgTShcIi8vd3d3Lmdvb2dsZS5jb20vaW1hZ2VzL2NsZWFyZG90LmdpZlwiKSxsLmxvY2F0aW9uJiZcImh0dHBcIj09bC5sb2NhdGlvbi5wcm90b2NvbHx8TmMoYyxcImh0dHBzXCIpLGhjKGMpKTtqZChjLnRvU3RyaW5nKCksZCk7fWVsc2UgRigyKTthLkg9MDthLmgmJmEuaC56YShiKTtIZChhKTtGZChhKTt9ay5wYj1mdW5jdGlvbihhKXthPyh0aGlzLmwuaW5mbyhcIlN1Y2Nlc3NmdWxseSBwaW5nZWQgZ29vZ2xlLmNvbVwiKSxGKDIpKToodGhpcy5sLmluZm8oXCJGYWlsZWQgdG8gcGluZyBnb29nbGUuY29tXCIpLEYoMSkpO307XG5mdW5jdGlvbiBIZChhKXthLkg9MDthLm1hPVtdO2lmKGEuaCl7Y29uc3QgYj1mZChhLmkpO2lmKDAhPWIubGVuZ3RofHwwIT1hLmoubGVuZ3RoKW5hKGEubWEsYiksbmEoYS5tYSxhLmopLGEuaS5pLmxlbmd0aD0wLG1hKGEuaiksYS5qLmxlbmd0aD0wO2EuaC55YSgpO319ZnVuY3Rpb24gRGMoYSxiLGMpe3ZhciBkPWMgaW5zdGFuY2VvZiBNP0coYyk6bmV3IE0oYyk7aWYoXCJcIiE9ZC5nKWImJihkLmc9YitcIi5cIitkLmcpLE9jKGQsZC5tKTtlbHNlIHt2YXIgZT1sLmxvY2F0aW9uO2Q9ZS5wcm90b2NvbDtiPWI/YitcIi5cIitlLmhvc3RuYW1lOmUuaG9zdG5hbWU7ZT0rZS5wb3J0O3ZhciBmPW5ldyBNKG51bGwpO2QmJk5jKGYsZCk7YiYmKGYuZz1iKTtlJiZPYyhmLGUpO2MmJihmLmw9Yyk7ZD1mO31jPWEuRjtiPWEuRGE7YyYmYiYmSyhkLGMsYik7SyhkLFwiVkVSXCIsYS5yYSk7R2QoYSxkKTtyZXR1cm4gZH1cbmZ1bmN0aW9uIGxjKGEsYixjKXtpZihiJiYhYS5KKXRocm93IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIHNlY29uZGFyeSBkb21haW4gY2FwYWJsZSBYaHJJbyBvYmplY3QuXCIpO2I9YyYmYS5IYSYmIWEudmE/bmV3IFAobmV3IGxkKHtvYjohMH0pKTpuZXcgUChhLnZhKTtiLk9hKGEuSik7cmV0dXJuIGJ9ay5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiAhIXRoaXMuaCYmdGhpcy5oLmlzQWN0aXZlKHRoaXMpfTtmdW5jdGlvbiBOZCgpe31rPU5kLnByb3RvdHlwZTtrLkJhPWZ1bmN0aW9uKCl7fTtrLkFhPWZ1bmN0aW9uKCl7fTtrLnphPWZ1bmN0aW9uKCl7fTtrLnlhPWZ1bmN0aW9uKCl7fTtrLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuICEwfTtrLlZhPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBPZCgpe2lmKHomJiEoMTA8PU51bWJlcihGYSkpKXRocm93IEVycm9yKFwiRW52aXJvbm1lbnRhbCBlcnJvcjogbm8gYXZhaWxhYmxlIHRyYW5zcG9ydC5cIik7fU9kLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBRKGEsYil9O1xuZnVuY3Rpb24gUShhLGIpe0IuY2FsbCh0aGlzKTt0aGlzLmc9bmV3IEVkKGIpO3RoaXMubD1hO3RoaXMuaD1iJiZiLm1lc3NhZ2VVcmxQYXJhbXN8fG51bGw7YT1iJiZiLm1lc3NhZ2VIZWFkZXJzfHxudWxsO2ImJmIuY2xpZW50UHJvdG9jb2xIZWFkZXJSZXF1aXJlZCYmKGE/YVtcIlgtQ2xpZW50LVByb3RvY29sXCJdPVwid2ViY2hhbm5lbFwiOmE9e1wiWC1DbGllbnQtUHJvdG9jb2xcIjpcIndlYmNoYW5uZWxcIn0pO3RoaXMuZy5zPWE7YT1iJiZiLmluaXRNZXNzYWdlSGVhZGVyc3x8bnVsbDtiJiZiLm1lc3NhZ2VDb250ZW50VHlwZSYmKGE/YVtcIlgtV2ViQ2hhbm5lbC1Db250ZW50LVR5cGVcIl09Yi5tZXNzYWdlQ29udGVudFR5cGU6YT17XCJYLVdlYkNoYW5uZWwtQ29udGVudC1UeXBlXCI6Yi5tZXNzYWdlQ29udGVudFR5cGV9KTtiJiZiLkNhJiYoYT9hW1wiWC1XZWJDaGFubmVsLUNsaWVudC1Qcm9maWxlXCJdPWIuQ2E6YT17XCJYLVdlYkNoYW5uZWwtQ2xpZW50LVByb2ZpbGVcIjpiLkNhfSk7dGhpcy5nLlU9XG5hOyhhPWImJmIuY2MpJiYheChhKSYmKHRoaXMuZy5vPWEpO3RoaXMuQT1iJiZiLnN1cHBvcnRzQ3Jvc3NEb21haW5YaHJ8fCExO3RoaXMudj1iJiZiLnNlbmRSYXdKc29ufHwhMTsoYj1iJiZiLmh0dHBTZXNzaW9uSWRQYXJhbSkmJiF4KGIpJiYodGhpcy5nLkY9YixhPXRoaXMuaCxudWxsIT09YSYmYiBpbiBhJiYoYT10aGlzLmgsYiBpbiBhJiZkZWxldGUgYVtiXSkpO3RoaXMuaj1uZXcgUih0aGlzKTt9cihRLEIpO1EucHJvdG90eXBlLm09ZnVuY3Rpb24oKXt0aGlzLmcuaD10aGlzLmo7dGhpcy5BJiYodGhpcy5nLko9ITApO3ZhciBhPXRoaXMuZyxiPXRoaXMubCxjPXRoaXMuaHx8dm9pZCAwO0YoMCk7YS5ZPWI7YS5uYT1jfHx7fTthLkc9YS5hYTthLkk9RGMoYSxudWxsLGEuWSk7R2MoYSk7fTtRLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe0hjKHRoaXMuZyk7fTtcblEucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7dmFyIGM9e307Yy5fX2RhdGFfXz1hO2E9Yzt9ZWxzZSB0aGlzLnYmJihjPXt9LGMuX19kYXRhX189amIoYSksYT1jKTtiLmoucHVzaChuZXcgYmQoYi5mYisrLGEpKTszPT1iLkgmJkdjKGIpO307US5wcm90b3R5cGUuTj1mdW5jdGlvbigpe3RoaXMuZy5oPW51bGw7ZGVsZXRlIHRoaXMuajtIYyh0aGlzLmcpO2RlbGV0ZSB0aGlzLmc7US4kLk4uY2FsbCh0aGlzKTt9O1xuZnVuY3Rpb24gUGQoYSl7WWIuY2FsbCh0aGlzKTthLl9faGVhZGVyc19fJiYodGhpcy5oZWFkZXJzPWEuX19oZWFkZXJzX18sdGhpcy5zdGF0dXNDb2RlPWEuX19zdGF0dXNfXyxkZWxldGUgYS5fX2hlYWRlcnNfXyxkZWxldGUgYS5fX3N0YXR1c19fKTt2YXIgYj1hLl9fc21fXztpZihiKXthOntmb3IoY29uc3QgYyBpbiBiKXthPWM7YnJlYWsgYX1hPXZvaWQgMDt9aWYodGhpcy5pPWEpYT10aGlzLmksYj1udWxsIT09YiYmYSBpbiBiP2JbYV06dm9pZCAwO3RoaXMuZGF0YT1iO31lbHNlIHRoaXMuZGF0YT1hO31yKFBkLFliKTtmdW5jdGlvbiBRZCgpe1piLmNhbGwodGhpcyk7dGhpcy5zdGF0dXM9MTt9cihRZCxaYik7ZnVuY3Rpb24gUihhKXt0aGlzLmc9YTt9cihSLE5kKTtSLnByb3RvdHlwZS5CYT1mdW5jdGlvbigpe0ModGhpcy5nLFwiYVwiKTt9O1IucHJvdG90eXBlLkFhPWZ1bmN0aW9uKGEpe0ModGhpcy5nLG5ldyBQZChhKSk7fTtcblIucHJvdG90eXBlLnphPWZ1bmN0aW9uKGEpe0ModGhpcy5nLG5ldyBRZCgpKTt9O1IucHJvdG90eXBlLnlhPWZ1bmN0aW9uKCl7Qyh0aGlzLmcsXCJiXCIpO307ZnVuY3Rpb24gUmQoKXt0aGlzLmJsb2NrU2l6ZT0tMTt9ZnVuY3Rpb24gUygpe3RoaXMuYmxvY2tTaXplPS0xO3RoaXMuYmxvY2tTaXplPTY0O3RoaXMuZz1BcnJheSg0KTt0aGlzLm09QXJyYXkodGhpcy5ibG9ja1NpemUpO3RoaXMuaT10aGlzLmg9MDt0aGlzLnJlc2V0KCk7fXIoUyxSZCk7Uy5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmdbMF09MTczMjU4NDE5Mzt0aGlzLmdbMV09NDAyMzIzMzQxNzt0aGlzLmdbMl09MjU2MjM4MzEwMjt0aGlzLmdbM109MjcxNzMzODc4O3RoaXMuaT10aGlzLmg9MDt9O1xuZnVuY3Rpb24gU2QoYSxiLGMpe2N8fChjPTApO3ZhciBkPUFycmF5KDE2KTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGIpZm9yKHZhciBlPTA7MTY+ZTsrK2UpZFtlXT1iLmNoYXJDb2RlQXQoYysrKXxiLmNoYXJDb2RlQXQoYysrKTw8OHxiLmNoYXJDb2RlQXQoYysrKTw8MTZ8Yi5jaGFyQ29kZUF0KGMrKyk8PDI0O2Vsc2UgZm9yKGU9MDsxNj5lOysrZSlkW2VdPWJbYysrXXxiW2MrK108PDh8YltjKytdPDwxNnxiW2MrK108PDI0O2I9YS5nWzBdO2M9YS5nWzFdO2U9YS5nWzJdO3ZhciBmPWEuZ1szXTt2YXIgaD1iKyhmXmMmKGVeZikpK2RbMF0rMzYxNDA5MDM2MCY0Mjk0OTY3Mjk1O2I9YysoaDw8NyY0Mjk0OTY3Mjk1fGg+Pj4yNSk7aD1mKyhlXmImKGNeZSkpK2RbMV0rMzkwNTQwMjcxMCY0Mjk0OTY3Mjk1O2Y9YisoaDw8MTImNDI5NDk2NzI5NXxoPj4+MjApO2g9ZSsoY15mJihiXmMpKStkWzJdKzYwNjEwNTgxOSY0Mjk0OTY3Mjk1O2U9ZisoaDw8MTcmNDI5NDk2NzI5NXxoPj4+MTUpO1xuaD1jKyhiXmUmKGZeYikpK2RbM10rMzI1MDQ0MTk2NiY0Mjk0OTY3Mjk1O2M9ZSsoaDw8MjImNDI5NDk2NzI5NXxoPj4+MTApO2g9YisoZl5jJihlXmYpKStkWzRdKzQxMTg1NDgzOTkmNDI5NDk2NzI5NTtiPWMrKGg8PDcmNDI5NDk2NzI5NXxoPj4+MjUpO2g9ZisoZV5iJihjXmUpKStkWzVdKzEyMDAwODA0MjYmNDI5NDk2NzI5NTtmPWIrKGg8PDEyJjQyOTQ5NjcyOTV8aD4+PjIwKTtoPWUrKGNeZiYoYl5jKSkrZFs2XSsyODIxNzM1OTU1JjQyOTQ5NjcyOTU7ZT1mKyhoPDwxNyY0Mjk0OTY3Mjk1fGg+Pj4xNSk7aD1jKyhiXmUmKGZeYikpK2RbN10rNDI0OTI2MTMxMyY0Mjk0OTY3Mjk1O2M9ZSsoaDw8MjImNDI5NDk2NzI5NXxoPj4+MTApO2g9YisoZl5jJihlXmYpKStkWzhdKzE3NzAwMzU0MTYmNDI5NDk2NzI5NTtiPWMrKGg8PDcmNDI5NDk2NzI5NXxoPj4+MjUpO2g9ZisoZV5iJihjXmUpKStkWzldKzIzMzY1NTI4NzkmNDI5NDk2NzI5NTtmPWIrKGg8PDEyJjQyOTQ5NjcyOTV8XG5oPj4+MjApO2g9ZSsoY15mJihiXmMpKStkWzEwXSs0Mjk0OTI1MjMzJjQyOTQ5NjcyOTU7ZT1mKyhoPDwxNyY0Mjk0OTY3Mjk1fGg+Pj4xNSk7aD1jKyhiXmUmKGZeYikpK2RbMTFdKzIzMDQ1NjMxMzQmNDI5NDk2NzI5NTtjPWUrKGg8PDIyJjQyOTQ5NjcyOTV8aD4+PjEwKTtoPWIrKGZeYyYoZV5mKSkrZFsxMl0rMTgwNDYwMzY4MiY0Mjk0OTY3Mjk1O2I9YysoaDw8NyY0Mjk0OTY3Mjk1fGg+Pj4yNSk7aD1mKyhlXmImKGNeZSkpK2RbMTNdKzQyNTQ2MjYxOTUmNDI5NDk2NzI5NTtmPWIrKGg8PDEyJjQyOTQ5NjcyOTV8aD4+PjIwKTtoPWUrKGNeZiYoYl5jKSkrZFsxNF0rMjc5Mjk2NTAwNiY0Mjk0OTY3Mjk1O2U9ZisoaDw8MTcmNDI5NDk2NzI5NXxoPj4+MTUpO2g9YysoYl5lJihmXmIpKStkWzE1XSsxMjM2NTM1MzI5JjQyOTQ5NjcyOTU7Yz1lKyhoPDwyMiY0Mjk0OTY3Mjk1fGg+Pj4xMCk7aD1iKyhlXmYmKGNeZSkpK2RbMV0rNDEyOTE3MDc4NiY0Mjk0OTY3Mjk1O2I9YysoaDw8XG41JjQyOTQ5NjcyOTV8aD4+PjI3KTtoPWYrKGNeZSYoYl5jKSkrZFs2XSszMjI1NDY1NjY0JjQyOTQ5NjcyOTU7Zj1iKyhoPDw5JjQyOTQ5NjcyOTV8aD4+PjIzKTtoPWUrKGJeYyYoZl5iKSkrZFsxMV0rNjQzNzE3NzEzJjQyOTQ5NjcyOTU7ZT1mKyhoPDwxNCY0Mjk0OTY3Mjk1fGg+Pj4xOCk7aD1jKyhmXmImKGVeZikpK2RbMF0rMzkyMTA2OTk5NCY0Mjk0OTY3Mjk1O2M9ZSsoaDw8MjAmNDI5NDk2NzI5NXxoPj4+MTIpO2g9YisoZV5mJihjXmUpKStkWzVdKzM1OTM0MDg2MDUmNDI5NDk2NzI5NTtiPWMrKGg8PDUmNDI5NDk2NzI5NXxoPj4+MjcpO2g9ZisoY15lJihiXmMpKStkWzEwXSszODAxNjA4MyY0Mjk0OTY3Mjk1O2Y9YisoaDw8OSY0Mjk0OTY3Mjk1fGg+Pj4yMyk7aD1lKyhiXmMmKGZeYikpK2RbMTVdKzM2MzQ0ODg5NjEmNDI5NDk2NzI5NTtlPWYrKGg8PDE0JjQyOTQ5NjcyOTV8aD4+PjE4KTtoPWMrKGZeYiYoZV5mKSkrZFs0XSszODg5NDI5NDQ4JjQyOTQ5NjcyOTU7Yz1cbmUrKGg8PDIwJjQyOTQ5NjcyOTV8aD4+PjEyKTtoPWIrKGVeZiYoY15lKSkrZFs5XSs1Njg0NDY0MzgmNDI5NDk2NzI5NTtiPWMrKGg8PDUmNDI5NDk2NzI5NXxoPj4+MjcpO2g9ZisoY15lJihiXmMpKStkWzE0XSszMjc1MTYzNjA2JjQyOTQ5NjcyOTU7Zj1iKyhoPDw5JjQyOTQ5NjcyOTV8aD4+PjIzKTtoPWUrKGJeYyYoZl5iKSkrZFszXSs0MTA3NjAzMzM1JjQyOTQ5NjcyOTU7ZT1mKyhoPDwxNCY0Mjk0OTY3Mjk1fGg+Pj4xOCk7aD1jKyhmXmImKGVeZikpK2RbOF0rMTE2MzUzMTUwMSY0Mjk0OTY3Mjk1O2M9ZSsoaDw8MjAmNDI5NDk2NzI5NXxoPj4+MTIpO2g9YisoZV5mJihjXmUpKStkWzEzXSsyODUwMjg1ODI5JjQyOTQ5NjcyOTU7Yj1jKyhoPDw1JjQyOTQ5NjcyOTV8aD4+PjI3KTtoPWYrKGNeZSYoYl5jKSkrZFsyXSs0MjQzNTYzNTEyJjQyOTQ5NjcyOTU7Zj1iKyhoPDw5JjQyOTQ5NjcyOTV8aD4+PjIzKTtoPWUrKGJeYyYoZl5iKSkrZFs3XSsxNzM1MzI4NDczJjQyOTQ5NjcyOTU7XG5lPWYrKGg8PDE0JjQyOTQ5NjcyOTV8aD4+PjE4KTtoPWMrKGZeYiYoZV5mKSkrZFsxMl0rMjM2ODM1OTU2MiY0Mjk0OTY3Mjk1O2M9ZSsoaDw8MjAmNDI5NDk2NzI5NXxoPj4+MTIpO2g9YisoY15lXmYpK2RbNV0rNDI5NDU4ODczOCY0Mjk0OTY3Mjk1O2I9YysoaDw8NCY0Mjk0OTY3Mjk1fGg+Pj4yOCk7aD1mKyhiXmNeZSkrZFs4XSsyMjcyMzkyODMzJjQyOTQ5NjcyOTU7Zj1iKyhoPDwxMSY0Mjk0OTY3Mjk1fGg+Pj4yMSk7aD1lKyhmXmJeYykrZFsxMV0rMTgzOTAzMDU2MiY0Mjk0OTY3Mjk1O2U9ZisoaDw8MTYmNDI5NDk2NzI5NXxoPj4+MTYpO2g9YysoZV5mXmIpK2RbMTRdKzQyNTk2NTc3NDAmNDI5NDk2NzI5NTtjPWUrKGg8PDIzJjQyOTQ5NjcyOTV8aD4+PjkpO2g9YisoY15lXmYpK2RbMV0rMjc2Mzk3NTIzNiY0Mjk0OTY3Mjk1O2I9YysoaDw8NCY0Mjk0OTY3Mjk1fGg+Pj4yOCk7aD1mKyhiXmNeZSkrZFs0XSsxMjcyODkzMzUzJjQyOTQ5NjcyOTU7Zj1iKyhoPDwxMSY0Mjk0OTY3Mjk1fFxuaD4+PjIxKTtoPWUrKGZeYl5jKStkWzddKzQxMzk0Njk2NjQmNDI5NDk2NzI5NTtlPWYrKGg8PDE2JjQyOTQ5NjcyOTV8aD4+PjE2KTtoPWMrKGVeZl5iKStkWzEwXSszMjAwMjM2NjU2JjQyOTQ5NjcyOTU7Yz1lKyhoPDwyMyY0Mjk0OTY3Mjk1fGg+Pj45KTtoPWIrKGNeZV5mKStkWzEzXSs2ODEyNzkxNzQmNDI5NDk2NzI5NTtiPWMrKGg8PDQmNDI5NDk2NzI5NXxoPj4+MjgpO2g9ZisoYl5jXmUpK2RbMF0rMzkzNjQzMDA3NCY0Mjk0OTY3Mjk1O2Y9YisoaDw8MTEmNDI5NDk2NzI5NXxoPj4+MjEpO2g9ZSsoZl5iXmMpK2RbM10rMzU3MjQ0NTMxNyY0Mjk0OTY3Mjk1O2U9ZisoaDw8MTYmNDI5NDk2NzI5NXxoPj4+MTYpO2g9YysoZV5mXmIpK2RbNl0rNzYwMjkxODkmNDI5NDk2NzI5NTtjPWUrKGg8PDIzJjQyOTQ5NjcyOTV8aD4+PjkpO2g9YisoY15lXmYpK2RbOV0rMzY1NDYwMjgwOSY0Mjk0OTY3Mjk1O2I9YysoaDw8NCY0Mjk0OTY3Mjk1fGg+Pj4yOCk7aD1mKyhiXmNeZSkrZFsxMl0rXG4zODczMTUxNDYxJjQyOTQ5NjcyOTU7Zj1iKyhoPDwxMSY0Mjk0OTY3Mjk1fGg+Pj4yMSk7aD1lKyhmXmJeYykrZFsxNV0rNTMwNzQyNTIwJjQyOTQ5NjcyOTU7ZT1mKyhoPDwxNiY0Mjk0OTY3Mjk1fGg+Pj4xNik7aD1jKyhlXmZeYikrZFsyXSszMjk5NjI4NjQ1JjQyOTQ5NjcyOTU7Yz1lKyhoPDwyMyY0Mjk0OTY3Mjk1fGg+Pj45KTtoPWIrKGVeKGN8fmYpKStkWzBdKzQwOTYzMzY0NTImNDI5NDk2NzI5NTtiPWMrKGg8PDYmNDI5NDk2NzI5NXxoPj4+MjYpO2g9ZisoY14oYnx+ZSkpK2RbN10rMTEyNjg5MTQxNSY0Mjk0OTY3Mjk1O2Y9YisoaDw8MTAmNDI5NDk2NzI5NXxoPj4+MjIpO2g9ZSsoYl4oZnx+YykpK2RbMTRdKzI4Nzg2MTIzOTEmNDI5NDk2NzI5NTtlPWYrKGg8PDE1JjQyOTQ5NjcyOTV8aD4+PjE3KTtoPWMrKGZeKGV8fmIpKStkWzVdKzQyMzc1MzMyNDEmNDI5NDk2NzI5NTtjPWUrKGg8PDIxJjQyOTQ5NjcyOTV8aD4+PjExKTtoPWIrKGVeKGN8fmYpKStkWzEyXSsxNzAwNDg1NTcxJlxuNDI5NDk2NzI5NTtiPWMrKGg8PDYmNDI5NDk2NzI5NXxoPj4+MjYpO2g9ZisoY14oYnx+ZSkpK2RbM10rMjM5OTk4MDY5MCY0Mjk0OTY3Mjk1O2Y9YisoaDw8MTAmNDI5NDk2NzI5NXxoPj4+MjIpO2g9ZSsoYl4oZnx+YykpK2RbMTBdKzQyOTM5MTU3NzMmNDI5NDk2NzI5NTtlPWYrKGg8PDE1JjQyOTQ5NjcyOTV8aD4+PjE3KTtoPWMrKGZeKGV8fmIpKStkWzFdKzIyNDAwNDQ0OTcmNDI5NDk2NzI5NTtjPWUrKGg8PDIxJjQyOTQ5NjcyOTV8aD4+PjExKTtoPWIrKGVeKGN8fmYpKStkWzhdKzE4NzMzMTMzNTkmNDI5NDk2NzI5NTtiPWMrKGg8PDYmNDI5NDk2NzI5NXxoPj4+MjYpO2g9ZisoY14oYnx+ZSkpK2RbMTVdKzQyNjQzNTU1NTImNDI5NDk2NzI5NTtmPWIrKGg8PDEwJjQyOTQ5NjcyOTV8aD4+PjIyKTtoPWUrKGJeKGZ8fmMpKStkWzZdKzI3MzQ3Njg5MTYmNDI5NDk2NzI5NTtlPWYrKGg8PDE1JjQyOTQ5NjcyOTV8aD4+PjE3KTtoPWMrKGZeKGV8fmIpKStkWzEzXSsxMzA5MTUxNjQ5JlxuNDI5NDk2NzI5NTtjPWUrKGg8PDIxJjQyOTQ5NjcyOTV8aD4+PjExKTtoPWIrKGVeKGN8fmYpKStkWzRdKzQxNDk0NDQyMjYmNDI5NDk2NzI5NTtiPWMrKGg8PDYmNDI5NDk2NzI5NXxoPj4+MjYpO2g9ZisoY14oYnx+ZSkpK2RbMTFdKzMxNzQ3NTY5MTcmNDI5NDk2NzI5NTtmPWIrKGg8PDEwJjQyOTQ5NjcyOTV8aD4+PjIyKTtoPWUrKGJeKGZ8fmMpKStkWzJdKzcxODc4NzI1OSY0Mjk0OTY3Mjk1O2U9ZisoaDw8MTUmNDI5NDk2NzI5NXxoPj4+MTcpO2g9YysoZl4oZXx+YikpK2RbOV0rMzk1MTQ4MTc0NSY0Mjk0OTY3Mjk1O2EuZ1swXT1hLmdbMF0rYiY0Mjk0OTY3Mjk1O2EuZ1sxXT1hLmdbMV0rKGUrKGg8PDIxJjQyOTQ5NjcyOTV8aD4+PjExKSkmNDI5NDk2NzI5NTthLmdbMl09YS5nWzJdK2UmNDI5NDk2NzI5NTthLmdbM109YS5nWzNdK2YmNDI5NDk2NzI5NTt9XG5TLnByb3RvdHlwZS5qPWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9YS5sZW5ndGgpO2Zvcih2YXIgYz1iLXRoaXMuYmxvY2tTaXplLGQ9dGhpcy5tLGU9dGhpcy5oLGY9MDtmPGI7KXtpZigwPT1lKWZvcig7Zjw9YzspU2QodGhpcyxhLGYpLGYrPXRoaXMuYmxvY2tTaXplO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlmb3IoO2Y8Yjspe2lmKGRbZSsrXT1hLmNoYXJDb2RlQXQoZisrKSxlPT10aGlzLmJsb2NrU2l6ZSl7U2QodGhpcyxkKTtlPTA7YnJlYWt9fWVsc2UgZm9yKDtmPGI7KWlmKGRbZSsrXT1hW2YrK10sZT09dGhpcy5ibG9ja1NpemUpe1NkKHRoaXMsZCk7ZT0wO2JyZWFrfX10aGlzLmg9ZTt0aGlzLmkrPWI7fTtcblMucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXt2YXIgYT1BcnJheSgoNTY+dGhpcy5oP3RoaXMuYmxvY2tTaXplOjIqdGhpcy5ibG9ja1NpemUpLXRoaXMuaCk7YVswXT0xMjg7Zm9yKHZhciBiPTE7YjxhLmxlbmd0aC04OysrYilhW2JdPTA7dmFyIGM9OCp0aGlzLmk7Zm9yKGI9YS5sZW5ndGgtODtiPGEubGVuZ3RoOysrYilhW2JdPWMmMjU1LGMvPTI1Njt0aGlzLmooYSk7YT1BcnJheSgxNik7Zm9yKGI9Yz0wOzQ+YjsrK2IpZm9yKHZhciBkPTA7MzI+ZDtkKz04KWFbYysrXT10aGlzLmdbYl0+Pj5kJjI1NTtyZXR1cm4gYX07ZnVuY3Rpb24gVChhLGIpe3RoaXMuaD1iO2Zvcih2YXIgYz1bXSxkPSEwLGU9YS5sZW5ndGgtMTswPD1lO2UtLSl7dmFyIGY9YVtlXXwwO2QmJmY9PWJ8fChjW2VdPWYsZD0hMSk7fXRoaXMuZz1jO312YXIgc2E9e307ZnVuY3Rpb24gVGQoYSl7cmV0dXJuIC0xMjg8PWEmJjEyOD5hP3JhKGEsZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBUKFtifDBdLDA+Yj8tMTowKX0pOm5ldyBUKFthfDBdLDA+YT8tMTowKX1mdW5jdGlvbiBVKGEpe2lmKGlzTmFOKGEpfHwhaXNGaW5pdGUoYSkpcmV0dXJuIFY7aWYoMD5hKXJldHVybiBXKFUoLWEpKTtmb3IodmFyIGI9W10sYz0xLGQ9MDthPj1jO2QrKyliW2RdPWEvY3wwLGMqPVVkO3JldHVybiBuZXcgVChiLDApfVxuZnVuY3Rpb24gVmQoYSxiKXtpZigwPT1hLmxlbmd0aCl0aHJvdyBFcnJvcihcIm51bWJlciBmb3JtYXQgZXJyb3I6IGVtcHR5IHN0cmluZ1wiKTtiPWJ8fDEwO2lmKDI+Ynx8MzY8Yil0aHJvdyBFcnJvcihcInJhZGl4IG91dCBvZiByYW5nZTogXCIrYik7aWYoXCItXCI9PWEuY2hhckF0KDApKXJldHVybiBXKFZkKGEuc3Vic3RyaW5nKDEpLGIpKTtpZigwPD1hLmluZGV4T2YoXCItXCIpKXRocm93IEVycm9yKCdudW1iZXIgZm9ybWF0IGVycm9yOiBpbnRlcmlvciBcIi1cIiBjaGFyYWN0ZXInKTtmb3IodmFyIGM9VShNYXRoLnBvdyhiLDgpKSxkPVYsZT0wO2U8YS5sZW5ndGg7ZSs9OCl7dmFyIGY9TWF0aC5taW4oOCxhLmxlbmd0aC1lKSxoPXBhcnNlSW50KGEuc3Vic3RyaW5nKGUsZStmKSxiKTs4PmY/KGY9VShNYXRoLnBvdyhiLGYpKSxkPWQuUihmKS5hZGQoVShoKSkpOihkPWQuUihjKSxkPWQuYWRkKFUoaCkpKTt9cmV0dXJuIGR9XG52YXIgVWQ9NDI5NDk2NzI5NixWPVRkKDApLFdkPVRkKDEpLFhkPVRkKDE2Nzc3MjE2KTtrPVQucHJvdG90eXBlO2suZWE9ZnVuY3Rpb24oKXtpZihYKHRoaXMpKXJldHVybiAtVyh0aGlzKS5lYSgpO2Zvcih2YXIgYT0wLGI9MSxjPTA7Yzx0aGlzLmcubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5EKGMpO2ErPSgwPD1kP2Q6VWQrZCkqYjtiKj1VZDt9cmV0dXJuIGF9O1xuay50b1N0cmluZz1mdW5jdGlvbihhKXthPWF8fDEwO2lmKDI+YXx8MzY8YSl0aHJvdyBFcnJvcihcInJhZGl4IG91dCBvZiByYW5nZTogXCIrYSk7aWYoWSh0aGlzKSlyZXR1cm4gXCIwXCI7aWYoWCh0aGlzKSlyZXR1cm4gXCItXCIrVyh0aGlzKS50b1N0cmluZyhhKTtmb3IodmFyIGI9VShNYXRoLnBvdyhhLDYpKSxjPXRoaXMsZD1cIlwiOzspe3ZhciBlPVlkKGMsYikuZztjPVpkKGMsZS5SKGIpKTt2YXIgZj0oKDA8Yy5nLmxlbmd0aD9jLmdbMF06Yy5oKT4+PjApLnRvU3RyaW5nKGEpO2M9ZTtpZihZKGMpKXJldHVybiBmK2Q7Zm9yKDs2PmYubGVuZ3RoOylmPVwiMFwiK2Y7ZD1mK2Q7fX07ay5EPWZ1bmN0aW9uKGEpe3JldHVybiAwPmE/MDphPHRoaXMuZy5sZW5ndGg/dGhpcy5nW2FdOnRoaXMuaH07ZnVuY3Rpb24gWShhKXtpZigwIT1hLmgpcmV0dXJuICExO2Zvcih2YXIgYj0wO2I8YS5nLmxlbmd0aDtiKyspaWYoMCE9YS5nW2JdKXJldHVybiAhMTtyZXR1cm4gITB9XG5mdW5jdGlvbiBYKGEpe3JldHVybiAtMT09YS5ofWsuWD1mdW5jdGlvbihhKXthPVpkKHRoaXMsYSk7cmV0dXJuIFgoYSk/LTE6WShhKT8wOjF9O2Z1bmN0aW9uIFcoYSl7Zm9yKHZhciBiPWEuZy5sZW5ndGgsYz1bXSxkPTA7ZDxiO2QrKyljW2RdPX5hLmdbZF07cmV0dXJuIChuZXcgVChjLH5hLmgpKS5hZGQoV2QpfWsuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIFgodGhpcyk/Vyh0aGlzKTp0aGlzfTtrLmFkZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9TWF0aC5tYXgodGhpcy5nLmxlbmd0aCxhLmcubGVuZ3RoKSxjPVtdLGQ9MCxlPTA7ZTw9YjtlKyspe3ZhciBmPWQrKHRoaXMuRChlKSY2NTUzNSkrKGEuRChlKSY2NTUzNSksaD0oZj4+PjE2KSsodGhpcy5EKGUpPj4+MTYpKyhhLkQoZSk+Pj4xNik7ZD1oPj4+MTY7ZiY9NjU1MzU7aCY9NjU1MzU7Y1tlXT1oPDwxNnxmO31yZXR1cm4gbmV3IFQoYyxjW2MubGVuZ3RoLTFdJi0yMTQ3NDgzNjQ4Py0xOjApfTtcbmZ1bmN0aW9uIFpkKGEsYil7cmV0dXJuIGEuYWRkKFcoYikpfVxuay5SPWZ1bmN0aW9uKGEpe2lmKFkodGhpcyl8fFkoYSkpcmV0dXJuIFY7aWYoWCh0aGlzKSlyZXR1cm4gWChhKT9XKHRoaXMpLlIoVyhhKSk6VyhXKHRoaXMpLlIoYSkpO2lmKFgoYSkpcmV0dXJuIFcodGhpcy5SKFcoYSkpKTtpZigwPnRoaXMuWChYZCkmJjA+YS5YKFhkKSlyZXR1cm4gVSh0aGlzLmVhKCkqYS5lYSgpKTtmb3IodmFyIGI9dGhpcy5nLmxlbmd0aCthLmcubGVuZ3RoLGM9W10sZD0wO2Q8MipiO2QrKyljW2RdPTA7Zm9yKGQ9MDtkPHRoaXMuZy5sZW5ndGg7ZCsrKWZvcih2YXIgZT0wO2U8YS5nLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMuRChkKT4+PjE2LGg9dGhpcy5EKGQpJjY1NTM1LG49YS5EKGUpPj4+MTYsdD1hLkQoZSkmNjU1MzU7Y1syKmQrMiplXSs9aCp0OyRkKGMsMipkKzIqZSk7Y1syKmQrMiplKzFdKz1mKnQ7JGQoYywyKmQrMiplKzEpO2NbMipkKzIqZSsxXSs9aCpuOyRkKGMsMipkKzIqZSsxKTtjWzIqZCsyKmUrMl0rPWYqbjskZChjLDIqZCsyKmUrMik7fWZvcihkPVxuMDtkPGI7ZCsrKWNbZF09Y1syKmQrMV08PDE2fGNbMipkXTtmb3IoZD1iO2Q8MipiO2QrKyljW2RdPTA7cmV0dXJuIG5ldyBUKGMsMCl9O2Z1bmN0aW9uICRkKGEsYil7Zm9yKDsoYVtiXSY2NTUzNSkhPWFbYl07KWFbYisxXSs9YVtiXT4+PjE2LGFbYl0mPTY1NTM1LGIrKzt9ZnVuY3Rpb24gYWUoYSxiKXt0aGlzLmc9YTt0aGlzLmg9Yjt9XG5mdW5jdGlvbiBZZChhLGIpe2lmKFkoYikpdGhyb3cgRXJyb3IoXCJkaXZpc2lvbiBieSB6ZXJvXCIpO2lmKFkoYSkpcmV0dXJuIG5ldyBhZShWLFYpO2lmKFgoYSkpcmV0dXJuIGI9WWQoVyhhKSxiKSxuZXcgYWUoVyhiLmcpLFcoYi5oKSk7aWYoWChiKSlyZXR1cm4gYj1ZZChhLFcoYikpLG5ldyBhZShXKGIuZyksYi5oKTtpZigzMDxhLmcubGVuZ3RoKXtpZihYKGEpfHxYKGIpKXRocm93IEVycm9yKFwic2xvd0RpdmlkZV8gb25seSB3b3JrcyB3aXRoIHBvc2l0aXZlIGludGVnZXJzLlwiKTtmb3IodmFyIGM9V2QsZD1iOzA+PWQuWChhKTspYz1iZShjKSxkPWJlKGQpO3ZhciBlPVooYywxKSxmPVooZCwxKTtkPVooZCwyKTtmb3IoYz1aKGMsMik7IVkoZCk7KXt2YXIgaD1mLmFkZChkKTswPj1oLlgoYSkmJihlPWUuYWRkKGMpLGY9aCk7ZD1aKGQsMSk7Yz1aKGMsMSk7fWI9WmQoYSxlLlIoYikpO3JldHVybiBuZXcgYWUoZSxiKX1mb3IoZT1WOzA8PWEuWChiKTspe2M9TWF0aC5tYXgoMSxNYXRoLmZsb29yKGEuZWEoKS9cbmIuZWEoKSkpO2Q9TWF0aC5jZWlsKE1hdGgubG9nKGMpL01hdGguTE4yKTtkPTQ4Pj1kPzE6TWF0aC5wb3coMixkLTQ4KTtmPVUoYyk7Zm9yKGg9Zi5SKGIpO1goaCl8fDA8aC5YKGEpOyljLT1kLGY9VShjKSxoPWYuUihiKTtZKGYpJiYoZj1XZCk7ZT1lLmFkZChmKTthPVpkKGEsaCk7fXJldHVybiBuZXcgYWUoZSxhKX1rLmdiPWZ1bmN0aW9uKGEpe3JldHVybiBZZCh0aGlzLGEpLmh9O2suYW5kPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1NYXRoLm1heCh0aGlzLmcubGVuZ3RoLGEuZy5sZW5ndGgpLGM9W10sZD0wO2Q8YjtkKyspY1tkXT10aGlzLkQoZCkmYS5EKGQpO3JldHVybiBuZXcgVChjLHRoaXMuaCZhLmgpfTtrLm9yPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1NYXRoLm1heCh0aGlzLmcubGVuZ3RoLGEuZy5sZW5ndGgpLGM9W10sZD0wO2Q8YjtkKyspY1tkXT10aGlzLkQoZCl8YS5EKGQpO3JldHVybiBuZXcgVChjLHRoaXMuaHxhLmgpfTtcbmsueG9yPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1NYXRoLm1heCh0aGlzLmcubGVuZ3RoLGEuZy5sZW5ndGgpLGM9W10sZD0wO2Q8YjtkKyspY1tkXT10aGlzLkQoZCleYS5EKGQpO3JldHVybiBuZXcgVChjLHRoaXMuaF5hLmgpfTtmdW5jdGlvbiBiZShhKXtmb3IodmFyIGI9YS5nLmxlbmd0aCsxLGM9W10sZD0wO2Q8YjtkKyspY1tkXT1hLkQoZCk8PDF8YS5EKGQtMSk+Pj4zMTtyZXR1cm4gbmV3IFQoYyxhLmgpfWZ1bmN0aW9uIFooYSxiKXt2YXIgYz1iPj41O2IlPTMyO2Zvcih2YXIgZD1hLmcubGVuZ3RoLWMsZT1bXSxmPTA7ZjxkO2YrKyllW2ZdPTA8Yj9hLkQoZitjKT4+PmJ8YS5EKGYrYysxKTw8MzItYjphLkQoZitjKTtyZXR1cm4gbmV3IFQoZSxhLmgpfU9kLnByb3RvdHlwZS5jcmVhdGVXZWJDaGFubmVsPU9kLnByb3RvdHlwZS5nO1EucHJvdG90eXBlLnNlbmQ9US5wcm90b3R5cGUudTtRLnByb3RvdHlwZS5vcGVuPVEucHJvdG90eXBlLm07US5wcm90b3R5cGUuY2xvc2U9US5wcm90b3R5cGUuY2xvc2U7U2IuTk9fRVJST1I9MDtTYi5USU1FT1VUPTg7U2IuSFRUUF9FUlJPUj02O1RiLkNPTVBMRVRFPVwiY29tcGxldGVcIjtXYi5FdmVudFR5cGU9WGI7WGIuT1BFTj1cImFcIjtYYi5DTE9TRT1cImJcIjtYYi5FUlJPUj1cImNcIjtYYi5NRVNTQUdFPVwiZFwiO0IucHJvdG90eXBlLmxpc3Rlbj1CLnByb3RvdHlwZS5PO1AucHJvdG90eXBlLmxpc3Rlbk9uY2U9UC5wcm90b3R5cGUuUDtQLnByb3RvdHlwZS5nZXRMYXN0RXJyb3I9UC5wcm90b3R5cGUuU2E7UC5wcm90b3R5cGUuZ2V0TGFzdEVycm9yQ29kZT1QLnByb3RvdHlwZS5JYTtQLnByb3RvdHlwZS5nZXRTdGF0dXM9UC5wcm90b3R5cGUuZGE7UC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VKc29uPVAucHJvdG90eXBlLldhO1xuUC5wcm90b3R5cGUuZ2V0UmVzcG9uc2VUZXh0PVAucHJvdG90eXBlLmphO1AucHJvdG90eXBlLnNlbmQ9UC5wcm90b3R5cGUuaGE7UC5wcm90b3R5cGUuc2V0V2l0aENyZWRlbnRpYWxzPVAucHJvdG90eXBlLk9hO1MucHJvdG90eXBlLmRpZ2VzdD1TLnByb3RvdHlwZS5sO1MucHJvdG90eXBlLnJlc2V0PVMucHJvdG90eXBlLnJlc2V0O1MucHJvdG90eXBlLnVwZGF0ZT1TLnByb3RvdHlwZS5qO1QucHJvdG90eXBlLmFkZD1ULnByb3RvdHlwZS5hZGQ7VC5wcm90b3R5cGUubXVsdGlwbHk9VC5wcm90b3R5cGUuUjtULnByb3RvdHlwZS5tb2R1bG89VC5wcm90b3R5cGUuZ2I7VC5wcm90b3R5cGUuY29tcGFyZT1ULnByb3RvdHlwZS5YO1QucHJvdG90eXBlLnRvTnVtYmVyPVQucHJvdG90eXBlLmVhO1QucHJvdG90eXBlLnRvU3RyaW5nPVQucHJvdG90eXBlLnRvU3RyaW5nO1QucHJvdG90eXBlLmdldEJpdHM9VC5wcm90b3R5cGUuRDtULmZyb21OdW1iZXI9VTtULmZyb21TdHJpbmc9VmQ7XG52YXIgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCA9IGVzbS5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBPZH07dmFyIGdldFN0YXRFdmVudFRhcmdldCA9IGVzbS5nZXRTdGF0RXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWIoKX07dmFyIEVycm9yQ29kZSA9IGVzbS5FcnJvckNvZGU9U2I7dmFyIEV2ZW50VHlwZSA9IGVzbS5FdmVudFR5cGU9VGI7dmFyIEV2ZW50ID0gZXNtLkV2ZW50PUU7dmFyIFN0YXQgPSBlc20uU3RhdD17eGI6MCxBYjoxLEJiOjIsVWI6MyxaYjo0LFdiOjUsWGI6NixWYjo3LFRiOjgsWWI6OSxQUk9YWToxMCxOT1BST1hZOjExLFJiOjEyLE5iOjEzLE9iOjE0LE1iOjE1LFBiOjE2LFFiOjE3LHRiOjE4LHNiOjE5LHViOjIwfTt2YXIgRmV0Y2hYbWxIdHRwRmFjdG9yeSA9IGVzbS5GZXRjaFhtbEh0dHBGYWN0b3J5PWxkO3ZhciBXZWJDaGFubmVsID0gZXNtLldlYkNoYW5uZWw9V2I7dmFyIFhocklvID0gZXNtLlhocklvPVA7dmFyIE1kNSA9IGVzbS5NZDU9Uzt2YXIgSW50ZWdlciA9IGVzbS5JbnRlZ2VyPVQ7XG5cbmV4cG9ydCB7IEVycm9yQ29kZSwgRXZlbnQsIEV2ZW50VHlwZSwgRmV0Y2hYbWxIdHRwRmFjdG9yeSwgSW50ZWdlciwgTWQ1LCBTdGF0LCBXZWJDaGFubmVsLCBYaHJJbywgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCwgZXNtIGFzIGRlZmF1bHQsIGdldFN0YXRFdmVudFRhcmdldCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8qKlxyXG4gKiBBIGNvbnRhaW5lciBmb3IgYWxsIG9mIHRoZSBMb2dnZXIgaW5zdGFuY2VzXHJcbiAqL1xyXG5jb25zdCBpbnN0YW5jZXMgPSBbXTtcclxuLyoqXHJcbiAqIFRoZSBKUyBTREsgc3VwcG9ydHMgNSBsb2cgbGV2ZWxzIGFuZCBhbHNvIGFsbG93cyBhIHVzZXIgdGhlIGFiaWxpdHkgdG9cclxuICogc2lsZW5jZSB0aGUgbG9ncyBhbHRvZ2V0aGVyLlxyXG4gKlxyXG4gKiBUaGUgb3JkZXIgaXMgYSBmb2xsb3dzOlxyXG4gKiBERUJVRyA8IFZFUkJPU0UgPCBJTkZPIDwgV0FSTiA8IEVSUk9SXHJcbiAqXHJcbiAqIEFsbCBvZiB0aGUgbG9nIHR5cGVzIGFib3ZlIHRoZSBjdXJyZW50IGxvZyBsZXZlbCB3aWxsIGJlIGNhcHR1cmVkIChpLmUuIGlmXHJcbiAqIHlvdSBzZXQgdGhlIGxvZyBsZXZlbCB0byBgSU5GT2AsIGVycm9ycyB3aWxsIHN0aWxsIGJlIGxvZ2dlZCwgYnV0IGBERUJVR2AgYW5kXHJcbiAqIGBWRVJCT1NFYCBsb2dzIHdpbGwgbm90KVxyXG4gKi9cclxudmFyIExvZ0xldmVsO1xyXG4oZnVuY3Rpb24gKExvZ0xldmVsKSB7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRFQlVHXCJdID0gMF0gPSBcIkRFQlVHXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlZFUkJPU0VcIl0gPSAxXSA9IFwiVkVSQk9TRVwiO1xyXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJJTkZPXCJdID0gMl0gPSBcIklORk9cIjtcclxuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiV0FSTlwiXSA9IDNdID0gXCJXQVJOXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkVSUk9SXCJdID0gNF0gPSBcIkVSUk9SXCI7XHJcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIlNJTEVOVFwiXSA9IDVdID0gXCJTSUxFTlRcIjtcclxufSkoTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTtcclxuY29uc3QgbGV2ZWxTdHJpbmdUb0VudW0gPSB7XHJcbiAgICAnZGVidWcnOiBMb2dMZXZlbC5ERUJVRyxcclxuICAgICd2ZXJib3NlJzogTG9nTGV2ZWwuVkVSQk9TRSxcclxuICAgICdpbmZvJzogTG9nTGV2ZWwuSU5GTyxcclxuICAgICd3YXJuJzogTG9nTGV2ZWwuV0FSTixcclxuICAgICdlcnJvcic6IExvZ0xldmVsLkVSUk9SLFxyXG4gICAgJ3NpbGVudCc6IExvZ0xldmVsLlNJTEVOVFxyXG59O1xyXG4vKipcclxuICogVGhlIGRlZmF1bHQgbG9nIGxldmVsXHJcbiAqL1xyXG5jb25zdCBkZWZhdWx0TG9nTGV2ZWwgPSBMb2dMZXZlbC5JTkZPO1xyXG4vKipcclxuICogQnkgZGVmYXVsdCwgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIGRldmVsb3BlciBjb25zb2xlIChpblxyXG4gKiBjaHJvbWUpLiBUbyBhdm9pZCBmb3JjaW5nIHVzZXJzIHRvIGhhdmUgdG8gb3B0LWluIHRvIHRoZXNlIGxvZ3MgdHdpY2VcclxuICogKGkuZS4gb25jZSBmb3IgZmlyZWJhc2UsIGFuZCBvbmNlIGluIHRoZSBjb25zb2xlKSwgd2UgYXJlIHNlbmRpbmcgYERFQlVHYFxyXG4gKiBsb2dzIHRvIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uLlxyXG4gKi9cclxuY29uc3QgQ29uc29sZU1ldGhvZCA9IHtcclxuICAgIFtMb2dMZXZlbC5ERUJVR106ICdsb2cnLFxyXG4gICAgW0xvZ0xldmVsLlZFUkJPU0VdOiAnbG9nJyxcclxuICAgIFtMb2dMZXZlbC5JTkZPXTogJ2luZm8nLFxyXG4gICAgW0xvZ0xldmVsLldBUk5dOiAnd2FybicsXHJcbiAgICBbTG9nTGV2ZWwuRVJST1JdOiAnZXJyb3InXHJcbn07XHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBsb2cgaGFuZGxlciB3aWxsIGZvcndhcmQgREVCVUcsIFZFUkJPU0UsIElORk8sIFdBUk4sIGFuZCBFUlJPUlxyXG4gKiBtZXNzYWdlcyBvbiB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbnNvbGUgY291bnRlcnBhcnRzIChpZiB0aGUgbG9nIG1ldGhvZFxyXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgbG9nIGxldmVsKVxyXG4gKi9cclxuY29uc3QgZGVmYXVsdExvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxvZ1R5cGUsIC4uLmFyZ3MpID0+IHtcclxuICAgIGlmIChsb2dUeXBlIDwgaW5zdGFuY2UubG9nTGV2ZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICBjb25zdCBtZXRob2QgPSBDb25zb2xlTWV0aG9kW2xvZ1R5cGVdO1xyXG4gICAgaWYgKG1ldGhvZCkge1xyXG4gICAgICAgIGNvbnNvbGVbbWV0aG9kXShgWyR7bm93fV0gICR7aW5zdGFuY2UubmFtZX06YCwgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBsb2cgYSBtZXNzYWdlIHdpdGggYW4gaW52YWxpZCBsb2dUeXBlICh2YWx1ZTogJHtsb2dUeXBlfSlgKTtcclxuICAgIH1cclxufTtcclxuY2xhc3MgTG9nZ2VyIHtcclxuICAgIC8qKlxyXG4gICAgICogR2l2ZXMgeW91IGFuIGluc3RhbmNlIG9mIGEgTG9nZ2VyIHRvIGNhcHR1cmUgbWVzc2FnZXMgYWNjb3JkaW5nIHRvXHJcbiAgICAgKiBGaXJlYmFzZSdzIGxvZ2dpbmcgc2NoZW1lLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRoYXQgdGhlIGxvZ3Mgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZSkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxvZyBsZXZlbCBvZiB0aGUgZ2l2ZW4gTG9nZ2VyIGluc3RhbmNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gZGVmYXVsdExvZ0xldmVsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYWluIChpbnRlcm5hbCkgbG9nIGhhbmRsZXIgZm9yIHRoZSBMb2dnZXIgaW5zdGFuY2UuXHJcbiAgICAgICAgICogQ2FuIGJlIHNldCB0byBhIG5ldyBmdW5jdGlvbiBpbiBpbnRlcm5hbCBwYWNrYWdlIGNvZGUgYnV0IG5vdCBieSB1c2VyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIgPSBkZWZhdWx0TG9nSGFuZGxlcjtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3B0aW9uYWwsIGFkZGl0aW9uYWwsIHVzZXItZGVmaW5lZCBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FwdHVyZSB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbGF0ZXIgdXNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW5zdGFuY2VzLnB1c2godGhpcyk7XHJcbiAgICB9XHJcbiAgICBnZXQgbG9nTGV2ZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ0xldmVsO1xyXG4gICAgfVxyXG4gICAgc2V0IGxvZ0xldmVsKHZhbCkge1xyXG4gICAgICAgIGlmICghKHZhbCBpbiBMb2dMZXZlbCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBcIiR7dmFsfVwiIGFzc2lnbmVkIHRvIFxcYGxvZ0xldmVsXFxgYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gdmFsO1xyXG4gICAgfVxyXG4gICAgLy8gV29ya2Fyb3VuZCBmb3Igc2V0dGVyL2dldHRlciBoYXZpbmcgdG8gYmUgdGhlIHNhbWUgdHlwZS5cclxuICAgIHNldExvZ0xldmVsKHZhbCkge1xyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBsZXZlbFN0cmluZ1RvRW51bVt2YWxdIDogdmFsO1xyXG4gICAgfVxyXG4gICAgZ2V0IGxvZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ0hhbmRsZXI7XHJcbiAgICB9XHJcbiAgICBzZXQgbG9nSGFuZGxlcih2YWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBhc3NpZ25lZCB0byBgbG9nSGFuZGxlcmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgdXNlckxvZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJMb2dIYW5kbGVyO1xyXG4gICAgfVxyXG4gICAgc2V0IHVzZXJMb2dIYW5kbGVyKHZhbCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyID0gdmFsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBhbGwgYmFzZWQgb24gdGhlIGBjb25zb2xlYCBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgZGVidWcoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGxvZyguLi5hcmdzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiZcclxuICAgICAgICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuVkVSQk9TRSwgLi4uYXJncyk7XHJcbiAgICAgICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5WRVJCT1NFLCAuLi5hcmdzKTtcclxuICAgIH1cclxuICAgIGluZm8oLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLklORk8sIC4uLmFyZ3MpO1xyXG4gICAgICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuSU5GTywgLi4uYXJncyk7XHJcbiAgICB9XHJcbiAgICB3YXJuKC4uLmFyZ3MpIHtcclxuICAgICAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5XQVJOLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLldBUk4sIC4uLmFyZ3MpO1xyXG4gICAgfVxyXG4gICAgZXJyb3IoLi4uYXJncykge1xyXG4gICAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcclxuICAgICAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBzZXRMb2dMZXZlbChsZXZlbCkge1xyXG4gICAgaW5zdGFuY2VzLmZvckVhY2goaW5zdCA9PiB7XHJcbiAgICAgICAgaW5zdC5zZXRMb2dMZXZlbChsZXZlbCk7XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiBzZXRVc2VyTG9nSGFuZGxlcihsb2dDYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcclxuICAgICAgICBsZXQgY3VzdG9tTG9nTGV2ZWwgPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGV2ZWwpIHtcclxuICAgICAgICAgICAgY3VzdG9tTG9nTGV2ZWwgPSBsZXZlbFN0cmluZ1RvRW51bVtvcHRpb25zLmxldmVsXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxvZ0NhbGxiYWNrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlLnVzZXJMb2dIYW5kbGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlLnVzZXJMb2dIYW5kbGVyID0gKGluc3RhbmNlLCBsZXZlbCwgLi4uYXJncykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3NcclxuICAgICAgICAgICAgICAgICAgICAubWFwKGFyZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZy50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGlnbm9yZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGFyZyA9PiBhcmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcclxuICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+PSAoY3VzdG9tTG9nTGV2ZWwgIT09IG51bGwgJiYgY3VzdG9tTG9nTGV2ZWwgIT09IHZvaWQgMCA/IGN1c3RvbUxvZ0xldmVsIDogaW5zdGFuY2UubG9nTGV2ZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nQ2FsbGJhY2soe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWxbbGV2ZWxdLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGluc3RhbmNlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuZXhwb3J0IHsgTG9nTGV2ZWwsIExvZ2dlciwgc2V0TG9nTGV2ZWwsIHNldFVzZXJMb2dIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qKlxyXG4gKiBDb21wb25lbnQgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuIGBhdXRoYCwgYGF1dGgtaW50ZXJuYWxgXHJcbiAqL1xyXG5jbGFzcyBDb21wb25lbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIHB1YmxpYyBzZXJ2aWNlIG5hbWUsIGUuZy4gYXBwLCBhdXRoLCBmaXJlc3RvcmUsIGRhdGFiYXNlXHJcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2VGYWN0b3J5IFNlcnZpY2UgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHB1YmxpYyBpbnRlcmZhY2VcclxuICAgICAqIEBwYXJhbSB0eXBlIHdoZXRoZXIgdGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBpcyBwdWJsaWMgb3IgcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBpbnN0YW5jZUZhY3RvcnksIHR5cGUpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VGYWN0b3J5ID0gaW5zdGFuY2VGYWN0b3J5O1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyA9IGZhbHNlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHNlcnZpY2UgbmFtZXNwYWNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlUHJvcHMgPSB7fTtcclxuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25Nb2RlID0gXCJMQVpZXCIgLyogSW5zdGFudGlhdGlvbk1vZGUuTEFaWSAqLztcclxuICAgICAgICB0aGlzLm9uSW5zdGFuY2VDcmVhdGVkID0gbnVsbDtcclxuICAgIH1cclxuICAgIHNldEluc3RhbnRpYXRpb25Nb2RlKG1vZGUpIHtcclxuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25Nb2RlID0gbW9kZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldE11bHRpcGxlSW5zdGFuY2VzKG11bHRpcGxlSW5zdGFuY2VzKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyA9IG11bHRpcGxlSW5zdGFuY2VzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgc2V0U2VydmljZVByb3BzKHByb3BzKSB7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlUHJvcHMgPSBwcm9wcztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldEluc3RhbmNlQ3JlYXRlZENhbGxiYWNrKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5vbkluc3RhbmNlQ3JlYXRlZCA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogUHJvdmlkZXIgZm9yIGluc3RhbmNlIGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiAnYXV0aCcsICdhdXRoLWludGVybmFsJ1xyXG4gKiBOYW1lU2VydmljZU1hcHBpbmdbVF0gaXMgYW4gYWxpYXMgZm9yIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZVxyXG4gKi9cclxuY2xhc3MgUHJvdmlkZXIge1xyXG4gICAgY29uc3RydWN0b3IobmFtZSwgY29udGFpbmVyKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZCA9IG5ldyBNYXAoKTtcclxuICAgICAgICB0aGlzLmluc3RhbmNlc09wdGlvbnMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5vbkluaXRDYWxsYmFja3MgPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIEEgcHJvdmlkZXIgY2FuIHByb3ZpZGUgbXVsaXRwbGUgaW5zdGFuY2VzIG9mIGEgc2VydmljZVxyXG4gICAgICogaWYgdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgaXMgdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0KGlkZW50aWZpZXIpIHtcclxuICAgICAgICAvLyBpZiBtdWx0aXBsZUluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIGRlZmF1bHQgbmFtZVxyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlc0RlZmVycmVkLmhhcyhub3JtYWxpemVkSWRlbnRpZmllcikpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5zZXQobm9ybWFsaXplZElkZW50aWZpZXIsIGRlZmVycmVkKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBpZiBpdCBjYW4gYmUgYXV0by1pbml0aWFsaXplZFxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IHRocm93cyBhbiBleGNlcHRpb24gZHVyaW5nIGdldCgpLCBpdCBzaG91bGQgbm90IGNhdXNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBmYXRhbCBlcnJvci4gV2UganVzdCByZXR1cm4gdGhlIHVucmVzb2x2ZWQgcHJvbWlzZSBpbiB0aGlzIGNhc2UuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZ2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyKS5wcm9taXNlO1xyXG4gICAgfVxyXG4gICAgZ2V0SW1tZWRpYXRlKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgLy8gaWYgbXVsdGlwbGVJbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZCwgdXNlIHRoZSBkZWZhdWx0IG5hbWVcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pZGVudGlmaWVyKTtcclxuICAgICAgICBjb25zdCBvcHRpb25hbCA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vcHRpb25hbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcclxuICAgICAgICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbiBjYXNlIGEgY29tcG9uZW50IGlzIG5vdCBpbml0aWFsaXplZCBhbmQgc2hvdWxkL2NhbiBub3QgYmUgYXV0by1pbml0aWFsaXplZCBhdCB0aGUgbW9tZW50LCByZXR1cm4gbnVsbCBpZiB0aGUgb3B0aW9uYWwgZmxhZyBpcyBzZXQsIG9yIHRocm93XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25hbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgU2VydmljZSAke3RoaXMubmFtZX0gaXMgbm90IGF2YWlsYWJsZWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0Q29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudDtcclxuICAgIH1cclxuICAgIHNldENvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT09IHRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgTWlzbWF0Y2hpbmcgQ29tcG9uZW50ICR7Y29tcG9uZW50Lm5hbWV9IGZvciBQcm92aWRlciAke3RoaXMubmFtZX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQ29tcG9uZW50IGZvciAke3RoaXMubmFtZX0gaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcclxuICAgICAgICAvLyByZXR1cm4gZWFybHkgd2l0aG91dCBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgdGhlIGNvbXBvbmVudCBpZiB0aGUgY29tcG9uZW50IHJlcXVpcmVzIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIChjYWxsaW5nIGBQcm92aWRlci5pbml0aWFsaXplKClgKVxyXG4gICAgICAgIGlmICghdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2UgaXMgZWFnZXIsIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW5zdGFuY2VcclxuICAgICAgICBpZiAoaXNDb21wb25lbnRFYWdlcihjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2UoeyBpbnN0YW5jZUlkZW50aWZpZXI6IERFRkFVTFRfRU5UUllfTkFNRSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaW5zdGFuY2UgZmFjdG9yeSBmb3IgYW4gZWFnZXIgQ29tcG9uZW50IHRocm93cyBhbiBleGNlcHRpb24gZHVyaW5nIHRoZSBlYWdlclxyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24sIGl0IHNob3VsZCBub3QgY2F1c2UgYSBmYXRhbCBlcnJvci5cclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIGlmIHdlIG5lZWQgdG8gbWFrZSBpdCBjb25maWd1cmFibGUsIGJlY2F1c2Ugc29tZSBjb21wb25lbnQgbWF5IHdhbnQgdG8gY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIGEgZmF0YWwgZXJyb3IgaW4gdGhpcyBjYXNlP1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGluc3RhbmNlcyBmb3IgdGhlIHBlbmRpbmcgcHJvbWlzZXMgYW5kIHJlc29sdmUgdGhlbVxyXG4gICAgICAgIC8vIE5PVEU6IGlmIHRoaXMubXVsdGlwbGVJbnN0YW5jZXMgaXMgZmFsc2UsIG9ubHkgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkXHJcbiAgICAgICAgLy8gYW5kIGFsbCBwcm9taXNlcyB3aXRoIHJlc29sdmUgd2l0aCBpdCByZWdhcmRsZXNzIG9mIHRoZSBpZGVudGlmaWVyLlxyXG4gICAgICAgIGZvciAoY29uc3QgW2luc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2VEZWZlcnJlZF0gb2YgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gYGdldE9ySW5pdGlhbGl6ZVNlcnZpY2UoKWAgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBpbnN0YW5jZSBzaW5jZSBhIGNvbXBvbmVudCBpcyBndWFyYW50ZWVkLiB1c2UgISB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHkuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IHRocm93cyBhbiBleGNlcHRpb24sIGl0IHNob3VsZCBub3QgY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIGEgZmF0YWwgZXJyb3IuIFdlIGp1c3QgbGVhdmUgdGhlIHByb21pc2UgdW5yZXNvbHZlZC5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNsZWFySW5zdGFuY2UoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZGVsZXRlKGlkZW50aWZpZXIpO1xyXG4gICAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5kZWxldGUoaWRlbnRpZmllcik7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMuZGVsZXRlKGlkZW50aWZpZXIpO1xyXG4gICAgfVxyXG4gICAgLy8gYXBwLmRlbGV0ZSgpIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCBvbiBldmVyeSBwcm92aWRlciB0byBkZWxldGUgdGhlIHNlcnZpY2VzXHJcbiAgICAvLyBUT0RPOiBzaG91bGQgd2UgbWFyayB0aGUgcHJvdmlkZXIgYXMgZGVsZXRlZD9cclxuICAgIGFzeW5jIGRlbGV0ZSgpIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlcyA9IEFycmF5LmZyb20odGhpcy5pbnN0YW5jZXMudmFsdWVzKCkpO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgLi4uc2VydmljZXNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoc2VydmljZSA9PiAnSU5URVJOQUwnIGluIHNlcnZpY2UpIC8vIGxlZ2FjeSBzZXJ2aWNlc1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIC5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLklOVEVSTkFMLmRlbGV0ZSgpKSxcclxuICAgICAgICAgICAgLi4uc2VydmljZXNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoc2VydmljZSA9PiAnX2RlbGV0ZScgaW4gc2VydmljZSkgLy8gbW9kdWxhcml6ZWQgc2VydmljZXNcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAubWFwKHNlcnZpY2UgPT4gc2VydmljZS5fZGVsZXRlKCkpXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcbiAgICBpc0NvbXBvbmVudFNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQgIT0gbnVsbDtcclxuICAgIH1cclxuICAgIGlzSW5pdGlhbGl6ZWQoaWRlbnRpZmllciA9IERFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5oYXMoaWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgICBnZXRPcHRpb25zKGlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNPcHRpb25zLmdldChpZGVudGlmaWVyKSB8fCB7fTtcclxuICAgIH1cclxuICAgIGluaXRpYWxpemUob3B0cyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgeyBvcHRpb25zID0ge30gfSA9IG9wdHM7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihvcHRzLmluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYCR7dGhpcy5uYW1lfSgke25vcm1hbGl6ZWRJZGVudGlmaWVyfSkgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNDb21wb25lbnRTZXQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgQ29tcG9uZW50ICR7dGhpcy5uYW1lfSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCB5ZXRgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xyXG4gICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyLFxyXG4gICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gcmVzb2x2ZSBhbnkgcGVuZGluZyBwcm9taXNlIHdhaXRpbmcgZm9yIHRoZSBzZXJ2aWNlIGluc3RhbmNlXHJcbiAgICAgICAgZm9yIChjb25zdCBbaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZURlZmVycmVkXSBvZiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRJZGVudGlmaWVyID09PSBub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgIGFmdGVyIHRoZSBwcm92aWRlciBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBjYWxsaW5nIHByb3ZpZGVyLmluaXRpYWxpemUoKS5cclxuICAgICAqIFRoZSBmdW5jdGlvbiBpcyBpbnZva2VkIFNZTkNIUk9OT1VTTFksIHNvIGl0IHNob3VsZCBub3QgZXhlY3V0ZSBhbnkgbG9uZ3J1bm5pbmcgdGFza3MgaW4gb3JkZXIgdG8gbm90IGJsb2NrIHRoZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIEFuIG9wdGlvbmFsIGluc3RhbmNlIGlkZW50aWZpZXJcclxuICAgICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGUgY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgb25Jbml0KGNhbGxiYWNrLCBpZGVudGlmaWVyKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaWRlbnRpZmllcik7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDYWxsYmFja3MgPSAoX2EgPSB0aGlzLm9uSW5pdENhbGxiYWNrcy5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgU2V0KCk7XHJcbiAgICAgICAgZXhpc3RpbmdDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcclxuICAgICAgICB0aGlzLm9uSW5pdENhbGxiYWNrcy5zZXQobm9ybWFsaXplZElkZW50aWZpZXIsIGV4aXN0aW5nQ2FsbGJhY2tzKTtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhleGlzdGluZ0luc3RhbmNlLCBub3JtYWxpemVkSWRlbnRpZmllcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlIG9uSW5pdCBjYWxsYmFja3Mgc3luY2hyb25vdXNseVxyXG4gICAgICogQHBhcmFtIGluc3RhbmNlIHRoZSBzZXJ2aWNlIGluc3RhbmNlYFxyXG4gICAgICovXHJcbiAgICBpbnZva2VPbkluaXRDYWxsYmFja3MoaW5zdGFuY2UsIGlkZW50aWZpZXIpIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLm9uSW5pdENhbGxiYWNrcy5nZXQoaWRlbnRpZmllcik7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soaW5zdGFuY2UsIGlkZW50aWZpZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9ycyBpbiB0aGUgb25Jbml0IGNhbGxiYWNrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRPckluaXRpYWxpemVTZXJ2aWNlKHsgaW5zdGFuY2VJZGVudGlmaWVyLCBvcHRpb25zID0ge30gfSkge1xyXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldChpbnN0YW5jZUlkZW50aWZpZXIpO1xyXG4gICAgICAgIGlmICghaW5zdGFuY2UgJiYgdGhpcy5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudC5pbnN0YW5jZUZhY3RvcnkodGhpcy5jb250YWluZXIsIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplSWRlbnRpZmllckZvckZhY3RvcnkoaW5zdGFuY2VJZGVudGlmaWVyKSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlKTtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSW52b2tlIG9uSW5pdCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgICAgICAqIE5vdGUgdGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQgaXMgZGlmZmVyZW50LCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQgY3JlYXRvcixcclxuICAgICAgICAgICAgICogd2hpbGUgb25Jbml0IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCBieSBjb25zdW1lcnMgb2YgdGhlIHByb3ZpZGVyLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5pbnZva2VPbkluaXRDYWxsYmFja3MoaW5zdGFuY2UsIGluc3RhbmNlSWRlbnRpZmllcik7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBPcmRlciBpcyBpbXBvcnRhbnRcclxuICAgICAgICAgICAgICogb25JbnN0YW5jZUNyZWF0ZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoaXMuaW5zdGFuY2VzLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlKTsgd2hpY2hcclxuICAgICAgICAgICAgICogbWFrZXMgYGlzSW5pdGlhbGl6ZWQoKWAgcmV0dXJuIHRydWUuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQodGhpcy5jb250YWluZXIsIGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9ycyBpbiB0aGUgb25JbnN0YW5jZUNyZWF0ZWRDYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgbm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIgPSBERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50Lm11bHRpcGxlSW5zdGFuY2VzID8gaWRlbnRpZmllciA6IERFRkFVTFRfRU5UUllfTkFNRTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpZGVudGlmaWVyOyAvLyBhc3N1bWUgbXVsdGlwbGUgaW5zdGFuY2VzIGFyZSBzdXBwb3J0ZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgcHJvdmlkZWQuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2hvdWxkQXV0b0luaXRpYWxpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuICghIXRoaXMuY29tcG9uZW50ICYmXHJcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlICE9PSBcIkVYUExJQ0lUXCIgLyogSW5zdGFudGlhdGlvbk1vZGUuRVhQTElDSVQgKi8pO1xyXG4gICAgfVxyXG59XHJcbi8vIHVuZGVmaW5lZCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBzZXJ2aWNlIGZhY3RvcnkgZm9yIHRoZSBkZWZhdWx0IGluc3RhbmNlXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5KGlkZW50aWZpZXIpIHtcclxuICAgIHJldHVybiBpZGVudGlmaWVyID09PSBERUZBVUxUX0VOVFJZX05BTUUgPyB1bmRlZmluZWQgOiBpZGVudGlmaWVyO1xyXG59XHJcbmZ1bmN0aW9uIGlzQ29tcG9uZW50RWFnZXIoY29tcG9uZW50KSB7XHJcbiAgICByZXR1cm4gY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlID09PSBcIkVBR0VSXCIgLyogSW5zdGFudGlhdGlvbk1vZGUuRUFHRVIgKi87XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIENvbXBvbmVudENvbnRhaW5lciB0aGF0IHByb3ZpZGVzIFByb3ZpZGVycyBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcclxuICovXHJcbmNsYXNzIENvbXBvbmVudENvbnRhaW5lciB7XHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLnByb3ZpZGVycyA9IG5ldyBNYXAoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IGJlaW5nIGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZW4gYSBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCxcclxuICAgICAqIGlmIG92ZXJ3cml0ZSBpcyB0cnVlOiBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNvbXBvbmVudCB3aXRoIHRoZSBuZXcgY29tcG9uZW50IGFuZCBjcmVhdGUgYSBuZXdcclxuICAgICAqIHByb3ZpZGVyIHdpdGggdGhlIG5ldyBjb21wb25lbnQuIEl0IGNhbiBiZSB1c2VmdWwgaW4gdGVzdHMgd2hlcmUgeW91IHdhbnQgdG8gdXNlIGRpZmZlcmVudCBtb2Nrc1xyXG4gICAgICogZm9yIGRpZmZlcmVudCB0ZXN0cy5cclxuICAgICAqIGlmIG92ZXJ3cml0ZSBpcyBmYWxzZTogdGhyb3cgYW4gZXhjZXB0aW9uXHJcbiAgICAgKi9cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIoY29tcG9uZW50Lm5hbWUpO1xyXG4gICAgICAgIGlmIChwcm92aWRlci5pc0NvbXBvbmVudFNldCgpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50ICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoICR7dGhpcy5uYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm92aWRlci5zZXRDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIGFkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcclxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBleGlzdGluZyBwcm92aWRlciBmcm9tIHRoZSBjb250YWluZXIsIHNvIHdlIGNhbiByZWdpc3RlciB0aGUgbmV3IGNvbXBvbmVudFxyXG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5kZWxldGUoY29tcG9uZW50Lm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXRQcm92aWRlciBwcm92aWRlcyBhIHR5cGUgc2FmZSBpbnRlcmZhY2Ugd2hlcmUgaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYSBmaWVsZCBuYW1lXHJcbiAgICAgKiBwcmVzZW50IGluIE5hbWVTZXJ2aWNlTWFwcGluZyBpbnRlcmZhY2UuXHJcbiAgICAgKlxyXG4gICAgICogRmlyZWJhc2UgU0RLcyBwcm92aWRpbmcgc2VydmljZXMgc2hvdWxkIGV4dGVuZCBOYW1lU2VydmljZU1hcHBpbmcgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyXHJcbiAgICAgKiB0aGVtc2VsdmVzLlxyXG4gICAgICovXHJcbiAgICBnZXRQcm92aWRlcihuYW1lKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvdmlkZXJzLmhhcyhuYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcnMuZ2V0KG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjcmVhdGUgYSBQcm92aWRlciBmb3IgYSBzZXJ2aWNlIHRoYXQgaGFzbid0IHJlZ2lzdGVyZWQgd2l0aCBGaXJlYmFzZVxyXG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKG5hbWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnNldChuYW1lLCBwcm92aWRlcik7XHJcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xyXG4gICAgfVxyXG4gICAgZ2V0UHJvdmlkZXJzKCkge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucHJvdmlkZXJzLnZhbHVlcygpKTtcclxuICAgIH1cclxufVxuXG5leHBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudENvbnRhaW5lciwgUHJvdmlkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iLCJpbXBvcnQgeyBFcnJvckZhY3RvcnksIGNvbnRhaW5zLCBkZWVwRXh0ZW5kLCBjcmVhdGVTdWJzY3JpYmUsIGlzQnJvd3NlciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0ICogYXMgbW9kdWxhckFQSXMgZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBfYWRkQ29tcG9uZW50LCBkZWxldGVBcHAsIF9ERUZBVUxUX0VOVFJZX05BTUUsIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudCwgcmVnaXN0ZXJWZXJzaW9uIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEdsb2JhbCBjb250ZXh0IG9iamVjdCBmb3IgYSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzIHVzaW5nXHJcbiAqIGEgc2hhcmVkIGF1dGhlbnRpY2F0aW9uIHN0YXRlLlxyXG4gKlxyXG4gKiBtYXJrZWQgYXMgaW50ZXJuYWwgYmVjYXVzZSBpdCByZWZlcmVuY2VzIGludGVybmFsIHR5cGVzIGV4cG9ydGVkIGZyb20gQGZpcmViYXNlL2FwcFxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNsYXNzIEZpcmViYXNlQXBwSW1wbCB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUsIGZpcmViYXNlKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7XHJcbiAgICAgICAgdGhpcy5maXJlYmFzZSA9IGZpcmViYXNlO1xyXG4gICAgICAgIC8vIGFkZCBpdHNlbGYgdG8gY29udGFpbmVyXHJcbiAgICAgICAgX2FkZENvbXBvbmVudChfZGVsZWdhdGUsIG5ldyBDb21wb25lbnQoJ2FwcC1jb21wYXQnLCAoKSA9PiB0aGlzLCBcIlBVQkxJQ1wiIC8qIENvbXBvbmVudFR5cGUuUFVCTElDICovKSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBfZGVsZWdhdGUuY29udGFpbmVyO1xyXG4gICAgfVxyXG4gICAgZ2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xyXG4gICAgfVxyXG4gICAgc2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCh2YWwpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSB2YWw7XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUubmFtZTtcclxuICAgIH1cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5vcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmViYXNlLklOVEVSTkFMLnJlbW92ZUFwcCh0aGlzLm5hbWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlQXBwKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgc2VydmljZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcHAgKGNyZWF0aW5nIGl0XHJcbiAgICAgKiBvbiBkZW1hbmQpLCBpZGVudGlmaWVkIGJ5IHRoZSBwYXNzZWQgaW5zdGFuY2VJZGVudGlmaWVyLlxyXG4gICAgICpcclxuICAgICAqIE5PVEU6IEN1cnJlbnRseSBzdG9yYWdlIGFuZCBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBhcmUgbGV2ZXJhZ2luZyB0aGlzXHJcbiAgICAgKiBmdW5jdGlvbmFsaXR5LiBUaGV5IGludm9rZSBpdCBieSBjYWxsaW5nOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGZpcmViYXNlLmFwcCgpLnN0b3JhZ2UoJ1NUT1JBR0UgQlVDS0VUIElEJylcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRoZSBzZXJ2aWNlIG5hbWUgaXMgcGFzc2VkIHRvIHRoaXMgYWxyZWFkeVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIF9nZXRTZXJ2aWNlKG5hbWUsIGluc3RhbmNlSWRlbnRpZmllciA9IF9ERUZBVUxUX0VOVFJZX05BTUUpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuY2hlY2tEZXN0cm95ZWQoKTtcclxuICAgICAgICAvLyBJbml0aWFsaXplIGluc3RhbmNlIGlmIEluc3RhdGlhdGlvbk1vZGUgaXMgYEVYUExJQ0lUYC5cclxuICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2RlbGVnYXRlLmNvbnRhaW5lci5nZXRQcm92aWRlcihuYW1lKTtcclxuICAgICAgICBpZiAoIXByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSAmJlxyXG4gICAgICAgICAgICAoKF9hID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbnN0YW50aWF0aW9uTW9kZSkgPT09IFwiRVhQTElDSVRcIiAvKiBJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVCAqLykge1xyXG4gICAgICAgICAgICBwcm92aWRlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGdldEltbWVkaWF0ZSB3aWxsIGFsd2F5cyBzdWNjZWVkIGJlY2F1c2UgX2dldFNlcnZpY2UgaXMgb25seSBjYWxsZWQgZm9yIHJlZ2lzdGVyZWQgY29tcG9uZW50cy5cclxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKHtcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogaW5zdGFuY2VJZGVudGlmaWVyXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhIHNlcnZpY2UgaW5zdGFuY2UgZnJvbSB0aGUgY2FjaGUsIHNvIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciB0aGlzIHNlcnZpY2VcclxuICAgICAqIHdoZW4gcGVvcGxlIHRyeSB0byBnZXQgaXQgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogTk9URTogY3VycmVudGx5IG9ubHkgZmlyZXN0b3JlIHVzZXMgdGhpcyBmdW5jdGlvbmFsaXR5IHRvIHN1cHBvcnQgZmlyZXN0b3JlIHNodXRkb3duLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBzZXJ2aWNlIG5hbWVcclxuICAgICAqIEBwYXJhbSBpbnN0YW5jZUlkZW50aWZpZXIgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIG11bHRpcGxlIGluc3RhbmNlcyBhcmUgYWxsb3dlZFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIF9yZW1vdmVTZXJ2aWNlSW5zdGFuY2UobmFtZSwgaW5zdGFuY2VJZGVudGlmaWVyID0gX0RFRkFVTFRfRU5UUllfTkFNRSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmNvbnRhaW5lclxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAuZ2V0UHJvdmlkZXIobmFtZSlcclxuICAgICAgICAgICAgLmNsZWFySW5zdGFuY2UoaW5zdGFuY2VJZGVudGlmaWVyKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50IGJlaW5nIGFkZGVkIHRvIHRoaXMgYXBwJ3MgY29udGFpbmVyXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgX2FkZENvbXBvbmVudChjb21wb25lbnQpIHtcclxuICAgICAgICBfYWRkQ29tcG9uZW50KHRoaXMuX2RlbGVnYXRlLCBjb21wb25lbnQpO1xyXG4gICAgfVxyXG4gICAgX2FkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCkge1xyXG4gICAgICAgIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudCh0aGlzLl9kZWxlZ2F0ZSwgY29tcG9uZW50KTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgICAgICAgIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogdGhpcy5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuLy8gVE9ETzogaW52ZXN0aWdhdGUgd2h5IHRoZSBmb2xsb3dpbmcgbmVlZHMgdG8gYmUgY29tbWVudGVkIG91dFxyXG4vLyBQcmV2ZW50IGRlYWQtY29kZSBlbGltaW5hdGlvbiBvZiB0aGVzZSBtZXRob2RzIHcvbyBpbnZhbGlkIHByb3BlcnR5XHJcbi8vIGNvcHlpbmcuXHJcbi8vIChGaXJlYmFzZUFwcEltcGwucHJvdG90eXBlLm5hbWUgJiYgRmlyZWJhc2VBcHBJbXBsLnByb3RvdHlwZS5vcHRpb25zKSB8fFxyXG4vLyAgIEZpcmViYXNlQXBwSW1wbC5wcm90b3R5cGUuZGVsZXRlIHx8XHJcbi8vICAgY29uc29sZS5sb2coJ2RjJyk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEVSUk9SUyA9IHtcclxuICAgIFtcIm5vLWFwcFwiIC8qIEFwcEVycm9yLk5PX0FQUCAqL106IFwiTm8gRmlyZWJhc2UgQXBwICd7JGFwcE5hbWV9JyBoYXMgYmVlbiBjcmVhdGVkIC0gXCIgK1xyXG4gICAgICAgICdjYWxsIEZpcmViYXNlIEFwcC5pbml0aWFsaXplQXBwKCknLFxyXG4gICAgW1wiaW52YWxpZC1hcHAtYXJndW1lbnRcIiAvKiBBcHBFcnJvci5JTlZBTElEX0FQUF9BUkdVTUVOVCAqL106ICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXHJcbiAgICAgICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nXHJcbn07XHJcbmNvbnN0IEVSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5KCdhcHAtY29tcGF0JywgJ0ZpcmViYXNlJywgRVJST1JTKTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIEJlY2F1c2UgYXV0aCBjYW4ndCBzaGFyZSBjb2RlIHdpdGggb3RoZXIgY29tcG9uZW50cywgd2UgYXR0YWNoIHRoZSB1dGlsaXR5IGZ1bmN0aW9uc1xyXG4gKiBpbiBhbiBpbnRlcm5hbCBuYW1lc3BhY2UgdG8gc2hhcmUgY29kZS5cclxuICogVGhpcyBmdW5jdGlvbiByZXR1cm4gYSBmaXJlYmFzZSBuYW1lc3BhY2Ugb2JqZWN0IHdpdGhvdXRcclxuICogYW55IHV0aWxpdHkgZnVuY3Rpb25zLCBzbyBpdCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gdGhlIHJlZ3VsYXIgZmlyZWJhc2VOYW1lc3BhY2UgYW5kXHJcbiAqIHRoZSBsaXRlIHZlcnNpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVGaXJlYmFzZU5hbWVzcGFjZUNvcmUoZmlyZWJhc2VBcHBJbXBsKSB7XHJcbiAgICBjb25zdCBhcHBzID0ge307XHJcbiAgICAvLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgLy8gY29uc3QgY29tcG9uZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnQ8YW55Pj4oKTtcclxuICAgIC8vIEEgbmFtZXNwYWNlIGlzIGEgcGxhaW4gSmF2YVNjcmlwdCBPYmplY3QuXHJcbiAgICBjb25zdCBuYW1lc3BhY2UgPSB7XHJcbiAgICAgICAgLy8gSGFjayB0byBwcmV2ZW50IEJhYmVsIGZyb20gbW9kaWZ5aW5nIHRoZSBvYmplY3QgcmV0dXJuZWRcclxuICAgICAgICAvLyBhcyB0aGUgZmlyZWJhc2UgbmFtZXNwYWNlLlxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxyXG4gICAgICAgIGluaXRpYWxpemVBcHA6IGluaXRpYWxpemVBcHBDb21wYXQsXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGFwcCxcclxuICAgICAgICByZWdpc3RlclZlcnNpb246IG1vZHVsYXJBUElzLnJlZ2lzdGVyVmVyc2lvbixcclxuICAgICAgICBzZXRMb2dMZXZlbDogbW9kdWxhckFQSXMuc2V0TG9nTGV2ZWwsXHJcbiAgICAgICAgb25Mb2c6IG1vZHVsYXJBUElzLm9uTG9nLFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBhcHBzOiBudWxsLFxyXG4gICAgICAgIFNES19WRVJTSU9OOiBtb2R1bGFyQVBJcy5TREtfVkVSU0lPTixcclxuICAgICAgICBJTlRFUk5BTDoge1xyXG4gICAgICAgICAgICByZWdpc3RlckNvbXBvbmVudDogcmVnaXN0ZXJDb21wb25lbnRDb21wYXQsXHJcbiAgICAgICAgICAgIHJlbW92ZUFwcCxcclxuICAgICAgICAgICAgdXNlQXNTZXJ2aWNlLFxyXG4gICAgICAgICAgICBtb2R1bGFyQVBJc1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvLyBJbmplY3QgYSBjaXJjdWxhciBkZWZhdWx0IGV4cG9ydCB0byBhbGxvdyBCYWJlbCB1c2VycyB3aG8gd2VyZSBwcmV2aW91c2x5XHJcbiAgICAvLyB1c2luZzpcclxuICAgIC8vXHJcbiAgICAvLyAgIGltcG9ydCBmaXJlYmFzZSBmcm9tICdmaXJlYmFzZSc7XHJcbiAgICAvLyAgIHdoaWNoIGJlY29tZXM6IHZhciBmaXJlYmFzZSA9IHJlcXVpcmUoJ2ZpcmViYXNlJykuZGVmYXVsdDtcclxuICAgIC8vXHJcbiAgICAvLyBpbnN0ZWFkIG9mXHJcbiAgICAvL1xyXG4gICAgLy8gICBpbXBvcnQgKiBhcyBmaXJlYmFzZSBmcm9tICdmaXJlYmFzZSc7XHJcbiAgICAvLyAgIHdoaWNoIGJlY29tZXM6IHZhciBmaXJlYmFzZSA9IHJlcXVpcmUoJ2ZpcmViYXNlJyk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgbmFtZXNwYWNlWydkZWZhdWx0J10gPSBuYW1lc3BhY2U7XHJcbiAgICAvLyBmaXJlYmFzZS5hcHBzIGlzIGEgcmVhZC1vbmx5IGdldHRlci5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYW1lc3BhY2UsICdhcHBzJywge1xyXG4gICAgICAgIGdldDogZ2V0QXBwc1xyXG4gICAgfSk7XHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBBcHAuZGVsZXRlKCkgLSBidXQgYmVmb3JlIGFueSBzZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFwcFxyXG4gICAgICogYXJlIGRlbGV0ZWQuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIHJlbW92ZUFwcChuYW1lKSB7XHJcbiAgICAgICAgZGVsZXRlIGFwcHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgQXBwIG9iamVjdCBmb3IgYSBnaXZlbiBuYW1lIChvciBERUZBVUxUKS5cclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gYXBwKG5hbWUpIHtcclxuICAgICAgICBuYW1lID0gbmFtZSB8fCBtb2R1bGFyQVBJcy5fREVGQVVMVF9FTlRSWV9OQU1FO1xyXG4gICAgICAgIGlmICghY29udGFpbnMoYXBwcywgbmFtZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJuby1hcHBcIiAvKiBBcHBFcnJvci5OT19BUFAgKi8sIHsgYXBwTmFtZTogbmFtZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFwcHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBhcHBbJ0FwcCddID0gZmlyZWJhc2VBcHBJbXBsO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgQXBwIGluc3RhbmNlIChuYW1lIG11c3QgYmUgdW5pcXVlKS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQuIEl0IGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSB1c2luZyB0aGUgc2FtZSBvcHRpb25zIGFuZCBjb25maWcuXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVBcHBDb21wYXQob3B0aW9ucywgcmF3Q29uZmlnID0ge30pIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBtb2R1bGFyQVBJcy5pbml0aWFsaXplQXBwKG9wdGlvbnMsIHJhd0NvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5zKGFwcHMsIGFwcC5uYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXBwc1thcHAubmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFwcENvbXBhdCA9IG5ldyBmaXJlYmFzZUFwcEltcGwoYXBwLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgIGFwcHNbYXBwLm5hbWVdID0gYXBwQ29tcGF0O1xyXG4gICAgICAgIHJldHVybiBhcHBDb21wYXQ7XHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgbm9uLWRlbGV0ZWQgRmlyZWJhc2VBcHBzLlxyXG4gICAgICovXHJcbiAgICBmdW5jdGlvbiBnZXRBcHBzKCkge1xyXG4gICAgICAgIC8vIE1ha2UgYSBjb3B5IHNvIGNhbGxlciBjYW5ub3QgbXV0YXRlIHRoZSBhcHBzIGxpc3QuXHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFwcHMpLm1hcChuYW1lID0+IGFwcHNbbmFtZV0pO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRDb21wYXQoY29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0ID0gY29tcG9uZW50TmFtZS5yZXBsYWNlKCctY29tcGF0JywgJycpO1xyXG4gICAgICAgIGlmIChtb2R1bGFyQVBJcy5fcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KSAmJlxyXG4gICAgICAgICAgICBjb21wb25lbnQudHlwZSA9PT0gXCJQVUJMSUNcIiAvKiBDb21wb25lbnRUeXBlLlBVQkxJQyAqLykge1xyXG4gICAgICAgICAgICAvLyBjcmVhdGUgc2VydmljZSBuYW1lc3BhY2UgZm9yIHB1YmxpYyBjb21wb25lbnRzXHJcbiAgICAgICAgICAgIC8vIFRoZSBTZXJ2aWNlIG5hbWVzcGFjZSBpcyBhbiBhY2Nlc3NvciBmdW5jdGlvbiAuLi5cclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZU5hbWVzcGFjZSA9IChhcHBBcmcgPSBhcHAoKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXBwQXJnW2NvbXBvbmVudE5hbWVXaXRob3V0Q29tcGF0XSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGluIHRoZSBmb2xsb3dpbmcgY2FzZTogZmlyZWJhc2Uuc3RvcmFnZSgnZ3M6LycpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoXCJpbnZhbGlkLWFwcC1hcmd1bWVudFwiIC8qIEFwcEVycm9yLklOVkFMSURfQVBQX0FSR1VNRU5UICovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IGNvbXBvbmVudE5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIEZvcndhcmQgc2VydmljZSBpbnN0YW5jZSBsb29rdXAgdG8gdGhlIEZpcmViYXNlQXBwLlxyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBBcmdbY29tcG9uZW50TmFtZVdpdGhvdXRDb21wYXRdKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIC4uLiBhbmQgYSBjb250YWluZXIgZm9yIHNlcnZpY2UtbGV2ZWwgcHJvcGVydGllcy5cclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXJ2aWNlUHJvcHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGVlcEV4dGVuZChzZXJ2aWNlTmFtZXNwYWNlLCBjb21wb25lbnQuc2VydmljZVByb3BzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICBuYW1lc3BhY2VbY29tcG9uZW50TmFtZVdpdGhvdXRDb21wYXRdID0gc2VydmljZU5hbWVzcGFjZTtcclxuICAgICAgICAgICAgLy8gUGF0Y2ggdGhlIEZpcmViYXNlQXBwSW1wbCBwcm90b3R5cGVcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgZmlyZWJhc2VBcHBJbXBsLnByb3RvdHlwZVtjb21wb25lbnROYW1lV2l0aG91dENvbXBhdF0gPVxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogVGhlIGVzbGludCBkaXNhYmxlIGNhbiBiZSByZW1vdmVkIGFuZCB0aGUgJ2lnbm9yZVJlc3RBcmdzJ1xyXG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uIGFkZGVkIHRvIHRoZSBuby1leHBsaWNpdC1hbnkgcnVsZSB3aGVuIEVTbGludCByZWxlYXNlcyBpdC5cclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoLi4uYXJncykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VGeG4gPSB0aGlzLl9nZXRTZXJ2aWNlLmJpbmQodGhpcywgY29tcG9uZW50TmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VGeG4uYXBwbHkodGhpcywgY29tcG9uZW50Lm11bHRpcGxlSW5zdGFuY2VzID8gYXJncyA6IFtdKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21wb25lbnQudHlwZSA9PT0gXCJQVUJMSUNcIiAvKiBDb21wb25lbnRUeXBlLlBVQkxJQyAqL1xyXG4gICAgICAgICAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2VbY29tcG9uZW50TmFtZVdpdGhvdXRDb21wYXRdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuICAgIH1cclxuICAgIC8vIE1hcCB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgdG8gYSByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZVxyXG4gICAgLy8gKHVzZWQgdG8gbWFwIGF1dGggdG8gc2VydmVyQXV0aCBzZXJ2aWNlIHdoZW4gbmVlZGVkKS5cclxuICAgIGZ1bmN0aW9uIHVzZUFzU2VydmljZShhcHAsIG5hbWUpIHtcclxuICAgICAgICBpZiAobmFtZSA9PT0gJ3NlcnZlckF1dGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB1c2VTZXJ2aWNlID0gbmFtZTtcclxuICAgICAgICByZXR1cm4gdXNlU2VydmljZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuYW1lc3BhY2U7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJldHVybiBhIGZpcmViYXNlIG5hbWVzcGFjZSBvYmplY3QuXHJcbiAqXHJcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGFuZCB0aGUgcmVzdWx0XHJcbiAqIGFzc2lnbmVkIHRvIHRoZSAnZmlyZWJhc2UnIGdsb2JhbC4gIEl0IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXNcclxuICogaW4gdW5pdCB0ZXN0cy5cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUZpcmViYXNlTmFtZXNwYWNlKCkge1xyXG4gICAgY29uc3QgbmFtZXNwYWNlID0gY3JlYXRlRmlyZWJhc2VOYW1lc3BhY2VDb3JlKEZpcmViYXNlQXBwSW1wbCk7XHJcbiAgICBuYW1lc3BhY2UuSU5URVJOQUwgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5hbWVzcGFjZS5JTlRFUk5BTCksIHsgY3JlYXRlRmlyZWJhc2VOYW1lc3BhY2UsXHJcbiAgICAgICAgZXh0ZW5kTmFtZXNwYWNlLFxyXG4gICAgICAgIGNyZWF0ZVN1YnNjcmliZSxcclxuICAgICAgICBFcnJvckZhY3RvcnksXHJcbiAgICAgICAgZGVlcEV4dGVuZCB9KTtcclxuICAgIC8qKlxyXG4gICAgICogUGF0Y2ggdGhlIHRvcC1sZXZlbCBmaXJlYmFzZSBuYW1lc3BhY2Ugd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogZmlyZWJhc2UuSU5URVJOQUwuZXh0ZW5kTmFtZXNwYWNlKClcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZXh0ZW5kTmFtZXNwYWNlKHByb3BzKSB7XHJcbiAgICAgICAgZGVlcEV4dGVuZChuYW1lc3BhY2UsIHByb3BzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuYW1lc3BhY2U7XHJcbn1cclxuY29uc3QgZmlyZWJhc2UkMSA9IGNyZWF0ZUZpcmViYXNlTmFtZXNwYWNlKCk7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hcHAtY29tcGF0Jyk7XG5cbmNvbnN0IG5hbWUgPSBcIkBmaXJlYmFzZS9hcHAtY29tcGF0XCI7XG5jb25zdCB2ZXJzaW9uID0gXCIwLjIuMTNcIjtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVnaXN0ZXJDb3JlQ29tcG9uZW50cyh2YXJpYW50KSB7XHJcbiAgICAvLyBSZWdpc3RlciBgYXBwYCBwYWNrYWdlLlxyXG4gICAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sIHZhcmlhbnQpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbi8vIEZpcmViYXNlIExpdGUgZGV0ZWN0aW9uXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmlmIChpc0Jyb3dzZXIoKSAmJiBzZWxmLmZpcmViYXNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGxvZ2dlci53YXJuKGBcbiAgICBXYXJuaW5nOiBGaXJlYmFzZSBpcyBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4gUGxlYXNlIG1ha2Ugc3VyZVxuICAgIEZpcmViYXNlIGxpYnJhcnkgaXMgb25seSBsb2FkZWQgb25jZS5cbiAgYCk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgIGNvbnN0IHNka1ZlcnNpb24gPSBzZWxmLmZpcmViYXNlLlNES19WRVJTSU9OO1xyXG4gICAgaWYgKHNka1ZlcnNpb24gJiYgc2RrVmVyc2lvbi5pbmRleE9mKCdMSVRFJykgPj0gMCkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKGBcbiAgICBXYXJuaW5nOiBZb3UgYXJlIHRyeWluZyB0byBsb2FkIEZpcmViYXNlIHdoaWxlIHVzaW5nIEZpcmViYXNlIFBlcmZvcm1hbmNlIHN0YW5kYWxvbmUgc2NyaXB0LlxuICAgIFlvdSBzaG91bGQgbG9hZCBGaXJlYmFzZSBQZXJmb3JtYW5jZSB3aXRoIHRoaXMgaW5zdGFuY2Ugb2YgRmlyZWJhc2UgdG8gYXZvaWQgbG9hZGluZyBkdXBsaWNhdGUgY29kZS5cbiAgICBgKTtcclxuICAgIH1cclxufVxyXG5jb25zdCBmaXJlYmFzZSA9IGZpcmViYXNlJDE7XHJcbnJlZ2lzdGVyQ29yZUNvbXBvbmVudHMoKTtcblxuZXhwb3J0IHsgZmlyZWJhc2UgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtMjAxNy5qcy5tYXBcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuICBJbiB0aGVcbi8vIGJyb3dzZXIgdGhpcyBpcyBhIGxpdHRsZSBjb21wbGljYXRlZCBkdWUgdG8gdW5rbm93biBxdWFsaXR5IG9mIE1hdGgucmFuZG9tKClcbi8vIGFuZCBpbmNvbnNpc3RlbnQgc3VwcG9ydCBmb3IgdGhlIGBjcnlwdG9gIEFQSS4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiB2aWFcbi8vIGZlYXR1cmUtZGV0ZWN0aW9uXG5cbi8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0b1xuLy8gaW1wbGVtZW50YXRpb24uIEFsc28sIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byBvbiBJRTExLlxudmFyIGdldFJhbmRvbVZhbHVlcyA9ICh0eXBlb2YoY3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YobXNDcnlwdG8pICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKTtcblxuaWYgKGdldFJhbmRvbVZhbHVlcykge1xuICAvLyBXSEFUV0cgY3J5cHRvIFJORyAtIGh0dHA6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9DcnlwdG9cbiAgdmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGF0d2dSTkcoKSB7XG4gICAgZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbiAgICByZXR1cm4gcm5kczg7XG4gIH07XG59IGVsc2Uge1xuICAvLyBNYXRoLnJhbmRvbSgpLWJhc2VkIChSTkcpXG4gIC8vXG4gIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgTWF0aC5yYW5kb20oKS4gIEl0J3MgZmFzdCwgYnV0IGlzIG9mIHVuc3BlY2lmaWVkXG4gIC8vIHF1YWxpdHkuXG4gIHZhciBybmRzID0gbmV3IEFycmF5KDE2KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hdGhSTkcoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHI7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBpZiAoKGkgJiAweDAzKSA9PT0gMCkgciA9IE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMDtcbiAgICAgIHJuZHNbaV0gPSByID4+PiAoKGkgJiAweDAzKSA8PCAzKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJuZHM7XG4gIH07XG59XG4iLCIvKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cbnZhciBieXRlVG9IZXggPSBbXTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4W2ldID0gKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKTtcbn1cblxuZnVuY3Rpb24gYnl0ZXNUb1V1aWQoYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBvZmZzZXQgfHwgMDtcbiAgdmFyIGJ0aCA9IGJ5dGVUb0hleDtcbiAgLy8gam9pbiB1c2VkIHRvIGZpeCBtZW1vcnkgaXNzdWUgY2F1c2VkIGJ5IGNvbmNhdGVuYXRpb246IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMxNzUjYzRcbiAgcmV0dXJuIChbXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV1cbiAgXSkuam9pbignJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnl0ZXNUb1V1aWQ7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCAqIGFzIHV1aWQgZnJvbSBcInV1aWRcIjtcblxuaW1wb3J0IGZpcmViYXNlIGZyb20gXCJmaXJlYmFzZS9jb21wYXQvYXBwXCI7XG5pbXBvcnQgXCJmaXJlYmFzZS9jb21wYXQvYXV0aFwiO1xuaW1wb3J0IFwiZmlyZWJhc2UvY29tcGF0L2ZpcmVzdG9yZVwiO1xuaW1wb3J0IHsgZG9jLCBzZXREb2MsIG9uU25hcHNob3QgfSBmcm9tIFwiZmlyZWJhc2UvZmlyZXN0b3JlXCI7XG5cbmNvbnN0IFNIQVJEX0NPTExFQ1RJT05fSUQgPSBcIl9jb3VudGVyX3NoYXJkc19cIjtcbmNvbnN0IENPT0tJRV9OQU1FID0gXCJGSVJFU1RPUkVfQ09VTlRFUl9TSEFSRF9JRFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJTbmFwc2hvdCB7XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgZGF0YTogKCkgPT4gbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ291bnRlciB7XG4gIHByaXZhdGUgZGI6IGZpcmViYXNlLmZpcmVzdG9yZS5GaXJlc3RvcmUgPSBudWxsO1xuICBwcml2YXRlIHNoYXJkSWQgPSBcIlwiO1xuICBwcml2YXRlIHNoYXJkczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBwcml2YXRlIG5vdGlmeVByb21pc2U6IFByb21pc2U8dm9pZD4gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgc2hhcmRlZCBjb3VudGVyIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgdG8gYSBmaWVsZFxuICAgKiBpbiBhIGRvY3VtZW50IHRoYXQgaXMgYSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIEEgcmVmZXJlbmNlIHRvIGEgZG9jdW1lbnQgd2l0aCBhIGNvdW50ZXIgZmllbGQuXG4gICAqIEBwYXJhbSBmaWVsZCBBIHBhdGggdG8gYSBjb3VudGVyIGZpZWxkIGluIHRoZSBhYm92ZSBkb2N1bWVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZG9jOiBmaXJlYmFzZS5maXJlc3RvcmUuRG9jdW1lbnRSZWZlcmVuY2UsXG4gICAgcHJpdmF0ZSBmaWVsZDogc3RyaW5nXG4gICkge1xuICAgIHRoaXMuZGIgPSBkb2MuZmlyZXN0b3JlO1xuICAgIHRoaXMuc2hhcmRJZCA9IGdldFNoYXJkSWQoQ09PS0lFX05BTUUpO1xuXG4gICAgZmlyZWJhc2UuaW5pdGlhbGl6ZUFwcCh0aGlzLmRiLmFwcC5vcHRpb25zKTtcblxuICAgIGNvbnN0IHNoYXJkc1JlZiA9IGZpcmViYXNlXG4gICAgICAuZmlyZXN0b3JlKClcbiAgICAgIC5jb2xsZWN0aW9uKGRvYy5wYXRoICsgXCIvXCIgKyBTSEFSRF9DT0xMRUNUSU9OX0lEKTtcbiAgICB0aGlzLnNoYXJkc1tkb2MucGF0aF0gPSAwO1xuXG4gICAgdGhpcy5zaGFyZHNbc2hhcmRzUmVmLnBhdGggKyBcIi9cIiArIHRoaXMuc2hhcmRJZF0gPSAwO1xuICAgIHRoaXMuc2hhcmRzW3NoYXJkc1JlZi5wYXRoICsgXCIvXCIgKyBcIlxcdFwiICsgdGhpcy5zaGFyZElkLnNsaWNlKDAsIDQpXSA9IDA7XG4gICAgdGhpcy5zaGFyZHNbc2hhcmRzUmVmLnBhdGggKyBcIi9cIiArIFwiXFx0XFx0XCIgKyB0aGlzLnNoYXJkSWQuc2xpY2UoMCwgMyldID0gMDtcbiAgICB0aGlzLnNoYXJkc1tzaGFyZHNSZWYucGF0aCArIFwiL1wiICsgXCJcXHRcXHRcXHRcIiArIHRoaXMuc2hhcmRJZC5zbGljZSgwLCAyKV0gPSAwO1xuICAgIHRoaXMuc2hhcmRzW3NoYXJkc1JlZi5wYXRoICsgXCIvXCIgKyBcIlxcdFxcdFxcdFwiICsgdGhpcy5zaGFyZElkLnNsaWNlKDAsIDEpXSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVuY3kgY29tcGVuc2F0ZWQgdmlldyBvZiB0aGUgY291bnRlci5cbiAgICpcbiAgICogQWxsIGxvY2FsIGluY3JlbWVudHMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGNvdW50ZXIgZXZlbiBpZiB0aGUgbWFpblxuICAgKiBjb3VudGVyIGhhc24ndCBiZWVuIHVwZGF0ZWQgeWV0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldChvcHRpb25zPzogZmlyZWJhc2UuZmlyZXN0b3JlLkdldE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHZhbHVlUHJvbWlzZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNoYXJkcykubWFwKGFzeW5jIChwYXRoKSA9PiB7XG4gICAgICBjb25zdCBzaGFyZCA9IGF3YWl0IHRoaXMuZGIuZG9jKHBhdGgpLmdldChvcHRpb25zKTtcbiAgICAgIHJldHVybiA8bnVtYmVyPnNoYXJkLmdldCh0aGlzLmZpZWxkKSB8fCAwO1xuICAgIH0pO1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlUHJvbWlzZXMpO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIHRvIGxhdGVuY3kgY29tcGVuc2F0ZWQgdmlldyBvZiB0aGUgY291bnRlci5cbiAgICpcbiAgICogQWxsIGxvY2FsIGluY3JlbWVudHMgdG8gdGhpcyBjb3VudGVyIHdpbGwgYmUgaW1tZWRpYXRlbHkgdmlzaWJsZSBpbiB0aGVcbiAgICogc25hcHNob3QuXG4gICAqL1xuICBwdWJsaWMgb25TbmFwc2hvdChvYnNlcnZhYmxlOiAobmV4dDogQ291bnRlclNuYXBzaG90KSA9PiB2b2lkKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zaGFyZHMpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gZmlyZWJhc2UuZmlyZXN0b3JlKCkuZG9jKHBhdGgpO1xuXG4gICAgICBvblNuYXBzaG90KGRvY3VtZW50LCAoc25hcDogZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50RGF0YSkgPT4ge1xuICAgICAgICB0aGlzLnNoYXJkc1tzbmFwLnJlZi5wYXRoXSA9IHNuYXAuZ2V0KHRoaXMuZmllbGQpIHx8IDA7XG4gICAgICAgIGlmICh0aGlzLm5vdGlmeVByb21pc2UgIT09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5ub3RpZnlQcm9taXNlID0gc2NoZWR1bGUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN1bSA9IE9iamVjdC52YWx1ZXModGhpcy5zaGFyZHMpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICAgIG9ic2VydmFibGUoeyBleGlzdHM6IHRydWUsIGRhdGE6ICgpID0+IHN1bSB9KTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVByb21pc2UgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCB0aGUgY291bnRlciBieSBhIGdpdmVuIHZhbHVlLlxuICAgKlxuICAgKiBlLmcuXG4gICAqIGNvbnN0IGNvdW50ZXIgPSBuZXcgc2hhcmRlZC5Db3VudGVyKGRiLmRvYyhcInBhdGgvZG9jdW1lbnRcIiksIFwiY291bnRlclwiKTtcbiAgICogY291bnRlci5pbmNyZW1lbnRCeSgxKTtcbiAgICovXG4gIHB1YmxpYyBpbmNyZW1lbnRCeSh2YWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbmNyZW1lbnQ6IGFueSA9IGZpcmViYXNlLmZpcmVzdG9yZS5GaWVsZFZhbHVlLmluY3JlbWVudCh2YWwpO1xuICAgIGNvbnN0IHVwZGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHRoaXMuZmllbGRcbiAgICAgIC5zcGxpdChcIi5cIilcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoKHZhbHVlLCBuYW1lKSA9PiAoeyBbbmFtZV06IHZhbHVlIH0pLCBpbmNyZW1lbnQpO1xuXG4gICAgY29uc3Qgc2hhcmRSZWYgPSBmaXJlYmFzZVxuICAgICAgLmZpcmVzdG9yZSgpXG4gICAgICAuY29sbGVjdGlvbih0aGlzLmRvYy5wYXRoICsgXCIvXCIgKyBTSEFSRF9DT0xMRUNUSU9OX0lEKTtcblxuICAgIHJldHVybiBzZXREb2MoZG9jKHNoYXJkUmVmLCB0aGlzLnNoYXJkSWQpLCB1cGRhdGUsIHsgbWVyZ2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBhc3NpZ25lZCBzaGFyZCBkaXJlY3RseS4gVXNlZnVsIHRvIHVwZGF0ZSBtdWx0aXBsZSBjb3VudGVyc1xuICAgKiBhdCB0aGUgc2FtZSB0aW1lLCBiYXRjaGVzIG9yIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogZS5nLlxuICAgKiBjb25zdCBjb3VudGVyID0gbmV3IHNoYXJkZWQuQ291bnRlcihkYi5kb2MoXCJwYXRoL2NvdW50ZXJcIiksIFwiXCIpO1xuICAgKiBjb25zdCBzaGFyZFJlZiA9IGNvdW50ZXIuc2hhcmQoKTtcbiAgICogc2hhcmRSZWYuc2V0KHtcImNvdW50ZXIxXCIsIGZpcmVzdG9yZS5GaWVsZFZhbHVlLkluY3JlbWVudCgxKSxcbiAgICogICAgICAgICAgICAgICBcImNvdW50ZXIyXCIsIGZpcmVzdG9yZS5GaWVsZFZhbHVlLkluY3JlbWVudCgxKSk7XG4gICAqL1xuICBwdWJsaWMgc2hhcmQoKTogZmlyZWJhc2UuZmlyZXN0b3JlLkRvY3VtZW50UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5kb2MuY29sbGVjdGlvbihTSEFSRF9DT0xMRUNUSU9OX0lEKS5kb2ModGhpcy5zaGFyZElkKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZTxUPihmdW5jOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0sIDApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmRJZChjb29raWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBSZWdFeHAoXG4gICAgXCIoPzpefDsgKVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSkgKyBcIj0oW147XSopXCJcbiAgKS5leGVjKGRvY3VtZW50LmNvb2tpZSk7XG4gIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHRbMV07XG5cbiAgY29uc3Qgc2hhcmRJZCA9IHV1aWQudjQoKTtcblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgY29uc3QgZXhwaXJlcyA9IFwiOyBleHBpcmVzPVwiICsgZGF0ZS50b1VUQ1N0cmluZygpO1xuXG4gIGRvY3VtZW50LmNvb2tpZSA9XG4gICAgZW5jb2RlVVJJQ29tcG9uZW50KGNvb2tpZSkgKyBcIj1cIiArIHNoYXJkSWQgKyBleHBpcmVzICsgXCI7IHBhdGg9L1wiO1xuICByZXR1cm4gc2hhcmRJZDtcbn1cbiIsInZhciB2MSA9IHJlcXVpcmUoJy4vdjEnKTtcbnZhciB2NCA9IHJlcXVpcmUoJy4vdjQnKTtcblxudmFyIHV1aWQgPSB2NDtcbnV1aWQudjEgPSB2MTtcbnV1aWQudjQgPSB2NDtcblxubW9kdWxlLmV4cG9ydHMgPSB1dWlkO1xuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IFtdO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCBfbm9kZUlkO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsb2Nrc2VxIDogX2Nsb2Nrc2VxO1xuXG4gIC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gcm5nKCk7XG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtcbiAgICAgICAgc2VlZEJ5dGVzWzBdIHwgMHgwMSxcbiAgICAgICAgc2VlZEJ5dGVzWzFdLCBzZWVkQnl0ZXNbMl0sIHNlZWRCeXRlc1szXSwgc2VlZEJ5dGVzWzRdLCBzZWVkQnl0ZXNbNV1cbiAgICAgIF07XG4gICAgfVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC4yLjIsIHJhbmRvbWl6ZSAoMTQgYml0KSBjbG9ja3NlcVxuICAgICAgY2xvY2tzZXEgPSBfY2xvY2tzZXEgPSAoc2VlZEJ5dGVzWzZdIDw8IDggfCBzZWVkQnl0ZXNbN10pICYgMHgzZmZmO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7XG5cbiAgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuICB2YXIgZHQgPSAobXNlY3MgLSBfbGFzdE1TZWNzKSArIChuc2VjcyAtIF9sYXN0TlNlY3MpLzEwMDAwO1xuXG4gIC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfVxuXG4gIC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH1cblxuICAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXVpZC52MSgpOiBDYW5cXCd0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlYycpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuXG4gIC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDtcblxuICAvLyBgdGltZV9sb3dgXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfbWlkYFxuICB2YXIgdG1oID0gKG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCkgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjtcblxuICAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwO1xuXG4gIC8vIGBjbG9ja19zZXFfbG93YFxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7XG5cbiAgLy8gYG5vZGVgXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiA/IGJ1ZiA6IGJ5dGVzVG9VdWlkKGIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHYxO1xuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG5cbiAgaWYgKHR5cGVvZihvcHRpb25zKSA9PSAnc3RyaW5nJykge1xuICAgIGJ1ZiA9IG9wdGlvbnMgPT09ICdiaW5hcnknID8gbmV3IEFycmF5KDE2KSA6IG51bGw7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gIC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcbiAgcm5kc1s2XSA9IChybmRzWzZdICYgMHgwZikgfCAweDQwO1xuICBybmRzWzhdID0gKHJuZHNbOF0gJiAweDNmKSB8IDB4ODA7XG5cbiAgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG4gIGlmIChidWYpIHtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgMTY7ICsraWkpIHtcbiAgICAgIGJ1ZltpICsgaWldID0gcm5kc1tpaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBieXRlc1RvVXVpZChybmRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2NDtcbiIsImltcG9ydCBmaXJlYmFzZSBmcm9tICdAZmlyZWJhc2UvYXBwLWNvbXBhdCc7XG5leHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnQGZpcmViYXNlL2FwcC1jb21wYXQnO1xuXG52YXIgbmFtZSA9IFwiZmlyZWJhc2VcIjtcbnZhciB2ZXJzaW9uID0gXCI5LjIzLjBcIjtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZmlyZWJhc2UucmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdhcHAtY29tcGF0Jyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCJpbXBvcnQgJ0BmaXJlYmFzZS9hdXRoLWNvbXBhdCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCJpbXBvcnQgZmlyZWJhc2UgZnJvbSAnQGZpcmViYXNlL2FwcC1jb21wYXQnO1xuaW1wb3J0ICogYXMgZXhwIGZyb20gJ0BmaXJlYmFzZS9hdXRoL2ludGVybmFsJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNCcm93c2VyRXh0ZW5zaW9uLCBnZXRVQSwgaXNSZWFjdE5hdGl2ZSwgaXNOb2RlLCBpc0luZGV4ZWREQkF2YWlsYWJsZSwgaXNJRSwgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxudmFyIG5hbWUgPSBcIkBmaXJlYmFzZS9hdXRoLWNvbXBhdFwiO1xudmFyIHZlcnNpb24gPSBcIjAuNC4yXCI7XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IENPUkRPVkFfT05ERVZJQ0VSRUFEWV9USU1FT1VUX01TID0gMTAwMDtcclxuZnVuY3Rpb24gX2dldEN1cnJlbnRTY2hlbWUoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICByZXR1cm4gKChfYSA9IHNlbGYgPT09IG51bGwgfHwgc2VsZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZi5sb2NhdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnByb3RvY29sKSB8fCBudWxsO1xyXG59XHJcbi8qKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGh0dHAgb3IgaHR0cHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNIdHRwT3JIdHRwcygpIHtcclxuICAgIHJldHVybiBfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnaHR0cDonIHx8IF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwczonO1xyXG59XHJcbi8qKlxyXG4gKiBAcGFyYW0gez9zdHJpbmc9fSB1YSBUaGUgdXNlciBhZ2VudC5cclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYXBwIGlzIHJlbmRlcmVkIGluIGEgbW9iaWxlIGlPUyBvciBBbmRyb2lkXHJcbiAqICAgICBDb3Jkb3ZhIGVudmlyb25tZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gX2lzQW5kcm9pZE9ySW9zQ29yZG92YVNjaGVtZSh1YSA9IGdldFVBKCkpIHtcclxuICAgIHJldHVybiAhISgoX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2ZpbGU6JyB8fFxyXG4gICAgICAgIF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdpb25pYzonIHx8XHJcbiAgICAgICAgX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2NhcGFjaXRvcjonKSAmJlxyXG4gICAgICAgIHVhLnRvTG93ZXJDYXNlKCkubWF0Y2goL2lwaG9uZXxpcGFkfGlwb2R8YW5kcm9pZC8pKTtcclxufVxyXG4vKipcclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZW52aXJvbm1lbnQgaXMgYSBuYXRpdmUgZW52aXJvbm1lbnQsIHdoZXJlXHJcbiAqICAgICBDT1JTIGNoZWNrcyBkbyBub3QgYXBwbHkuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNOYXRpdmVFbnZpcm9ubWVudCgpIHtcclxuICAgIHJldHVybiBpc1JlYWN0TmF0aXZlKCkgfHwgaXNOb2RlKCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIGFnZW50IGlzIElFMTEuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaXMgSUUxMS5cclxuICovXHJcbmZ1bmN0aW9uIF9pc0llMTEoKSB7XHJcbiAgICByZXR1cm4gaXNJRSgpICYmIChkb2N1bWVudCA9PT0gbnVsbCB8fCBkb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSA9PT0gMTE7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIGFnZW50IGlzIEVkZ2UuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyQWdlbnQgVGhlIGJyb3dzZXIgdXNlciBhZ2VudCBzdHJpbmcuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgaXMgRWRnZS5cclxuICovXHJcbmZ1bmN0aW9uIF9pc0VkZ2UodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gL0VkZ2VcXC9cXGQrLy50ZXN0KHVhKTtcclxufVxyXG4vKipcclxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X3VzZXJBZ2VudCBUaGUgbmF2aWdhdG9yIHVzZXIgYWdlbnQuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgbG9jYWwgc3RvcmFnZSBpcyBub3Qgc3luY2hyb25pemVkIGJldHdlZW4gYW4gaWZyYW1lXHJcbiAqICAgICBhbmQgYSBwb3B1cCBvZiB0aGUgc2FtZSBkb21haW4uXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNMb2NhbFN0b3JhZ2VOb3RTeW5jaHJvbml6ZWQodWEgPSBnZXRVQSgpKSB7XHJcbiAgICByZXR1cm4gX2lzSWUxMSgpIHx8IF9pc0VkZ2UodWEpO1xyXG59XHJcbi8qKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHdlYiBzdG9yYWdlIGlzIHN1cHBvcnRlZC4gKi9cclxuZnVuY3Rpb24gX2lzV2ViU3RvcmFnZVN1cHBvcnRlZCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IHNlbGYubG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGV4cC5fZ2VuZXJhdGVFdmVudElkKCk7XHJcbiAgICAgICAgaWYgKHN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgLy8gc2V0SXRlbSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZSBjYW5ub3QgYWNjZXNzIFdlYlN0b3JhZ2UgKGUuZy4sXHJcbiAgICAgICAgICAgIC8vIFNhZmFyaSBpbiBwcml2YXRlIG1vZGUpLlxyXG4gICAgICAgICAgICBzdG9yYWdlWydzZXRJdGVtJ10oa2V5LCAnMScpO1xyXG4gICAgICAgICAgICBzdG9yYWdlWydyZW1vdmVJdGVtJ10oa2V5KTtcclxuICAgICAgICAgICAgLy8gRm9yIGJyb3dzZXJzIHdoZXJlIGlmcmFtZSB3ZWIgc3RvcmFnZSBkb2VzIG5vdCBzeW5jaHJvbml6ZSB3aXRoIGEgcG9wdXBcclxuICAgICAgICAgICAgLy8gb2YgdGhlIHNhbWUgZG9tYWluLCBpbmRleGVkREIgaXMgdXNlZCBmb3IgcGVyc2lzdGVudCBzdG9yYWdlLiBUaGVzZVxyXG4gICAgICAgICAgICAvLyBicm93c2VycyBpbmNsdWRlIElFMTEgYW5kIEVkZ2UuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBpcyBzdXBwb3J0ZWQgKElFMTEgYW5kIEVkZ2UgcHJpdmF0ZSBtb2RlIGRvZXMgbm90IHN1cHBvcnRcclxuICAgICAgICAgICAgLy8gdGhhdCkuXHJcbiAgICAgICAgICAgIGlmIChfaXNMb2NhbFN0b3JhZ2VOb3RTeW5jaHJvbml6ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW4gc3VjaCBicm93c2VycywgaWYgaW5kZXhlZERCIGlzIG5vdCBzdXBwb3J0ZWQsIGFuIGlmcmFtZSBjYW5ub3QgYmVcclxuICAgICAgICAgICAgICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBwb3B1cCBzaWduIGluIHJlc3VsdC5cclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0luZGV4ZWREQkF2YWlsYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUgZnJvbSBhIHdvcmtlci4gVGVzdCBhdmFpbGFiaWxpdHkgb2ZcclxuICAgICAgICAvLyBpbmRleGVkREIuXHJcbiAgICAgICAgcmV0dXJuIF9pc1dvcmtlcigpICYmIGlzSW5kZXhlZERCQXZhaWxhYmxlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIEBwYXJhbSB7P09iamVjdD19IGdsb2JhbCBUaGUgb3B0aW9uYWwgZ2xvYmFsIHNjb3BlLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSB3b3JrZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBfaXNXb3JrZXIoKSB7XHJcbiAgICAvLyBXb3JrZXJHbG9iYWxTY29wZSBvbmx5IGRlZmluZWQgaW4gd29ya2VyIGVudmlyb25tZW50LlxyXG4gICAgcmV0dXJuICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICdXb3JrZXJHbG9iYWxTY29wZScgaW4gZ2xvYmFsICYmXHJcbiAgICAgICAgJ2ltcG9ydFNjcmlwdHMnIGluIGdsb2JhbCk7XHJcbn1cclxuZnVuY3Rpb24gX2lzUG9wdXBSZWRpcmVjdFN1cHBvcnRlZCgpIHtcclxuICAgIHJldHVybiAoKF9pc0h0dHBPckh0dHBzKCkgfHxcclxuICAgICAgICBpc0Jyb3dzZXJFeHRlbnNpb24oKSB8fFxyXG4gICAgICAgIF9pc0FuZHJvaWRPcklvc0NvcmRvdmFTY2hlbWUoKSkgJiZcclxuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgd2l0aCByZW1vdGUgZGVidWdnaW5nIHJlcG9ydHMgaXRzIGxvY2F0aW9uLnByb3RvY29sIGFzXHJcbiAgICAgICAgLy8gaHR0cC5cclxuICAgICAgICAhX2lzTmF0aXZlRW52aXJvbm1lbnQoKSAmJlxyXG4gICAgICAgIC8vIExvY2FsIHN0b3JhZ2UgaGFzIHRvIGJlIHN1cHBvcnRlZCBmb3IgYnJvd3NlciBwb3B1cCBhbmQgcmVkaXJlY3RcclxuICAgICAgICAvLyBvcGVyYXRpb25zIHRvIHdvcmsuXHJcbiAgICAgICAgX2lzV2ViU3RvcmFnZVN1cHBvcnRlZCgpICYmXHJcbiAgICAgICAgLy8gRE9NLCBwb3B1cHMgYW5kIHJlZGlyZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoaW4gYSB3b3JrZXIuXHJcbiAgICAgICAgIV9pc1dvcmtlcigpKTtcclxufVxyXG4vKiogUXVpY2sgY2hlY2sgdGhhdCBpbmRpY2F0ZXMgdGhlIHBsYXRmb3JtICptYXkqIGJlIENvcmRvdmEgKi9cclxuZnVuY3Rpb24gX2lzTGlrZWx5Q29yZG92YSgpIHtcclxuICAgIHJldHVybiBfaXNBbmRyb2lkT3JJb3NDb3Jkb3ZhU2NoZW1lKCkgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfaXNDb3Jkb3ZhKCkge1xyXG4gICAgaWYgKCFfaXNMaWtlbHlDb3Jkb3ZhKCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFdlJ3ZlIHdhaXRlZCBsb25nIGVub3VnaDsgdGhlIHRlbGx0YWxlIENvcmRvdmEgZXZlbnQgZGlkbid0IGhhcHBlblxyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9LCBDT1JET1ZBX09OREVWSUNFUkVBRFlfVElNRU9VVF9NUyk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gX2dldFNlbGZXaW5kb3coKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBudWxsO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IFBlcnNpc3RlbmNlID0ge1xyXG4gICAgTE9DQUw6ICdsb2NhbCcsXHJcbiAgICBOT05FOiAnbm9uZScsXHJcbiAgICBTRVNTSU9OOiAnc2Vzc2lvbidcclxufTtcclxuY29uc3QgX2Fzc2VydCQzID0gZXhwLl9hc3NlcnQ7XHJcbmNvbnN0IFBFUlNJU1RFTkNFX0tFWSA9ICdwZXJzaXN0ZW5jZSc7XHJcbi8qKlxyXG4gKiBWYWxpZGF0ZXMgdGhhdCBhbiBhcmd1bWVudCBpcyBhIHZhbGlkIHBlcnNpc3RlbmNlIHZhbHVlLiBJZiBhbiBpbnZhbGlkIHR5cGVcclxuICogaXMgc3BlY2lmaWVkLCBhbiBlcnJvciBpcyB0aHJvd24gc3luY2hyb25vdXNseS5cclxuICovXHJcbmZ1bmN0aW9uIF92YWxpZGF0ZVBlcnNpc3RlbmNlQXJndW1lbnQoYXV0aCwgcGVyc2lzdGVuY2UpIHtcclxuICAgIF9hc3NlcnQkMyhPYmplY3QudmFsdWVzKFBlcnNpc3RlbmNlKS5pbmNsdWRlcyhwZXJzaXN0ZW5jZSksIGF1dGgsIFwiaW52YWxpZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogZXhwLkF1dGhFcnJvckNvZGUuSU5WQUxJRF9QRVJTSVNURU5DRSAqLyk7XHJcbiAgICAvLyBWYWxpZGF0ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gICAgaWYgKGlzUmVhY3ROYXRpdmUoKSkge1xyXG4gICAgICAgIC8vIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gYSBicm93c2VyLlxyXG4gICAgICAgIF9hc3NlcnQkMyhwZXJzaXN0ZW5jZSAhPT0gUGVyc2lzdGVuY2UuU0VTU0lPTiwgYXV0aCwgXCJ1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlXCIgLyogZXhwLkF1dGhFcnJvckNvZGUuVU5TVVBQT1JURURfUEVSU0lTVEVOQ0UgKi8pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpc05vZGUoKSkge1xyXG4gICAgICAgIC8vIE9ubHkgbm9uZSBpcyBzdXBwb3J0ZWQgaW4gTm9kZS5qcy5cclxuICAgICAgICBfYXNzZXJ0JDMocGVyc2lzdGVuY2UgPT09IFBlcnNpc3RlbmNlLk5PTkUsIGF1dGgsIFwidW5zdXBwb3J0ZWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIGV4cC5BdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFICovKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoX2lzV29ya2VyKCkpIHtcclxuICAgICAgICAvLyBJbiBhIHdvcmtlciBlbnZpcm9ubWVudCwgZWl0aGVyIExPQ0FMIG9yIE5PTkUgYXJlIHN1cHBvcnRlZC5cclxuICAgICAgICAvLyBJZiBpbmRleGVkREIgbm90IHN1cHBvcnRlZCBhbmQgTE9DQUwgcHJvdmlkZWQsIHRocm93IGFuIGVycm9yXHJcbiAgICAgICAgX2Fzc2VydCQzKHBlcnNpc3RlbmNlID09PSBQZXJzaXN0ZW5jZS5OT05FIHx8XHJcbiAgICAgICAgICAgIChwZXJzaXN0ZW5jZSA9PT0gUGVyc2lzdGVuY2UuTE9DQUwgJiYgaXNJbmRleGVkREJBdmFpbGFibGUoKSksIGF1dGgsIFwidW5zdXBwb3J0ZWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIGV4cC5BdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFICovKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGlzIHJlc3RyaWN0ZWQgYnkgd2hhdCB0aGUgYnJvd3NlciBzdXBwb3J0cy5cclxuICAgIF9hc3NlcnQkMyhwZXJzaXN0ZW5jZSA9PT0gUGVyc2lzdGVuY2UuTk9ORSB8fCBfaXNXZWJTdG9yYWdlU3VwcG9ydGVkKCksIGF1dGgsIFwidW5zdXBwb3J0ZWQtcGVyc2lzdGVuY2UtdHlwZVwiIC8qIGV4cC5BdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFICovKTtcclxufVxyXG5hc3luYyBmdW5jdGlvbiBfc2F2ZVBlcnNpc3RlbmNlRm9yUmVkaXJlY3QoYXV0aCkge1xyXG4gICAgYXdhaXQgYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xyXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGdldFNlc3Npb25TdG9yYWdlSWZBdmFpbGFibGUoKTtcclxuICAgIGNvbnN0IGtleSA9IGV4cC5fcGVyc2lzdGVuY2VLZXlOYW1lKFBFUlNJU1RFTkNFX0tFWSwgYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLm5hbWUpO1xyXG4gICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgICBzZXNzaW9uLnNldEl0ZW0oa2V5LCBhdXRoLl9nZXRQZXJzaXN0ZW5jZSgpKTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBfZ2V0UGVyc2lzdGVuY2VzRnJvbVJlZGlyZWN0KGFwaUtleSwgYXBwTmFtZSkge1xyXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGdldFNlc3Npb25TdG9yYWdlSWZBdmFpbGFibGUoKTtcclxuICAgIGlmICghc2Vzc2lvbikge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IGtleSA9IGV4cC5fcGVyc2lzdGVuY2VLZXlOYW1lKFBFUlNJU1RFTkNFX0tFWSwgYXBpS2V5LCBhcHBOYW1lKTtcclxuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gc2Vzc2lvbi5nZXRJdGVtKGtleSk7XHJcbiAgICBzd2l0Y2ggKHBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgY2FzZSBQZXJzaXN0ZW5jZS5OT05FOlxyXG4gICAgICAgICAgICByZXR1cm4gW2V4cC5pbk1lbW9yeVBlcnNpc3RlbmNlXTtcclxuICAgICAgICBjYXNlIFBlcnNpc3RlbmNlLkxPQ0FMOlxyXG4gICAgICAgICAgICByZXR1cm4gW2V4cC5pbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlLCBleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZV07XHJcbiAgICAgICAgY2FzZSBQZXJzaXN0ZW5jZS5TRVNTSU9OOlxyXG4gICAgICAgICAgICByZXR1cm4gW2V4cC5icm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlXTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbn1cclxuLyoqIFJldHVybnMgc2Vzc2lvbiBzdG9yYWdlLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXJyb3JzICovXHJcbmZ1bmN0aW9uIGdldFNlc3Npb25TdG9yYWdlSWZBdmFpbGFibGUoKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiAoKF9hID0gX2dldFNlbGZXaW5kb3coKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlc3Npb25TdG9yYWdlKSB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5jb25zdCBfYXNzZXJ0JDIgPSBleHAuX2Fzc2VydDtcclxuLyoqIFBsYXRmb3JtLWFnbm9zdGljIHBvcHVwLXJlZGlyZWN0IHJlc29sdmVyICovXHJcbmNsYXNzIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyBDcmVhdGUgYm90aCByZXNvbHZlcnMgZm9yIGR5bmFtaWMgcmVzb2x1dGlvbiBsYXRlclxyXG4gICAgICAgIHRoaXMuYnJvd3NlclJlc29sdmVyID0gZXhwLl9nZXRJbnN0YW5jZShleHAuYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgdGhpcy5jb3Jkb3ZhUmVzb2x2ZXIgPSBleHAuX2dldEluc3RhbmNlKGV4cC5jb3Jkb3ZhUG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcclxuICAgICAgICAvLyBUaGUgYWN0dWFsIHJlc29sdmVyIGluIHVzZTogZWl0aGVyIGJyb3dzZXJSZXNvbHZlciBvciBjb3Jkb3ZhUmVzb2x2ZXIuXHJcbiAgICAgICAgdGhpcy51bmRlcmx5aW5nUmVzb2x2ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3JlZGlyZWN0UGVyc2lzdGVuY2UgPSBleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcclxuICAgICAgICB0aGlzLl9jb21wbGV0ZVJlZGlyZWN0Rm4gPSBleHAuX2dldFJlZGlyZWN0UmVzdWx0O1xyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQgPSBleHAuX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZShhdXRoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RVbmRlcmx5aW5nUmVzb2x2ZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFVuZGVybHlpbmdSZXNvbHZlci5faW5pdGlhbGl6ZShhdXRoKTtcclxuICAgIH1cclxuICAgIGFzeW5jIF9vcGVuUG9wdXAoYXV0aCwgcHJvdmlkZXIsIGF1dGhUeXBlLCBldmVudElkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RVbmRlcmx5aW5nUmVzb2x2ZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRlZFVuZGVybHlpbmdSZXNvbHZlci5fb3BlblBvcHVwKGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBfb3BlblJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyLCBhdXRoVHlwZSwgZXZlbnRJZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0VW5kZXJseWluZ1Jlc29sdmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX29wZW5SZWRpcmVjdChhdXRoLCBwcm92aWRlciwgYXV0aFR5cGUsIGV2ZW50SWQpO1xyXG4gICAgfVxyXG4gICAgX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChhdXRoLCBjYikge1xyXG4gICAgICAgIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChhdXRoLCBjYik7XHJcbiAgICB9XHJcbiAgICBfb3JpZ2luVmFsaWRhdGlvbihhdXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XHJcbiAgICB9XHJcbiAgICBnZXQgX3Nob3VsZEluaXRQcm9hY3RpdmVseSgpIHtcclxuICAgICAgICByZXR1cm4gX2lzTGlrZWx5Q29yZG92YSgpIHx8IHRoaXMuYnJvd3NlclJlc29sdmVyLl9zaG91bGRJbml0UHJvYWN0aXZlbHk7XHJcbiAgICB9XHJcbiAgICBnZXQgYXNzZXJ0ZWRVbmRlcmx5aW5nUmVzb2x2ZXIoKSB7XHJcbiAgICAgICAgX2Fzc2VydCQyKHRoaXMudW5kZXJseWluZ1Jlc29sdmVyLCBcImludGVybmFsLWVycm9yXCIgLyogZXhwLkF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IgKi8pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuZGVybHlpbmdSZXNvbHZlcjtcclxuICAgIH1cclxuICAgIGFzeW5jIHNlbGVjdFVuZGVybHlpbmdSZXNvbHZlcigpIHtcclxuICAgICAgICBpZiAodGhpcy51bmRlcmx5aW5nUmVzb2x2ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBXZSBoYXZlbid0IHlldCBkZXRlcm1pbmVkIHdoZXRoZXIgb3Igbm90IHdlJ3JlIGluIENvcmRvdmE7IGdvIGFoZWFkXHJcbiAgICAgICAgLy8gYW5kIGRldGVybWluZSB0aGF0IHN0YXRlIG5vdy5cclxuICAgICAgICBjb25zdCBpc0NvcmRvdmEgPSBhd2FpdCBfaXNDb3Jkb3ZhKCk7XHJcbiAgICAgICAgdGhpcy51bmRlcmx5aW5nUmVzb2x2ZXIgPSBpc0NvcmRvdmFcclxuICAgICAgICAgICAgPyB0aGlzLmNvcmRvdmFSZXNvbHZlclxyXG4gICAgICAgICAgICA6IHRoaXMuYnJvd3NlclJlc29sdmVyO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIHVud3JhcChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QudW53cmFwKCk7XHJcbn1cclxuZnVuY3Rpb24gd3JhcHBlZChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3Qud3JhcHBlZCgpO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmZ1bmN0aW9uIGNyZWRlbnRpYWxGcm9tUmVzcG9uc2UodXNlckNyZWRlbnRpYWwpIHtcclxuICAgIHJldHVybiBjcmVkZW50aWFsRnJvbU9iamVjdCh1c2VyQ3JlZGVudGlhbCk7XHJcbn1cclxuZnVuY3Rpb24gYXR0YWNoRXh0cmFFcnJvckZpZWxkcyhhdXRoLCBlKSB7XHJcbiAgICB2YXIgX2E7XHJcbiAgICAvLyBUaGUgcmVzcG9uc2UgY29udGFpbnMgYWxsIGZpZWxkcyBmcm9tIHRoZSBzZXJ2ZXIgd2hpY2ggbWF5IG9yIG1heSBub3RcclxuICAgIC8vIGFjdHVhbGx5IG1hdGNoIHRoZSB1bmRlcmx5aW5nIHR5cGVcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gKF9hID0gZS5jdXN0b21EYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX3Rva2VuUmVzcG9uc2U7XHJcbiAgICBpZiAoKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5jb2RlKSA9PT0gJ2F1dGgvbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnKSB7XHJcbiAgICAgICAgY29uc3QgbWZhRXJyID0gZTtcclxuICAgICAgICBtZmFFcnIucmVzb2x2ZXIgPSBuZXcgTXVsdGlGYWN0b3JSZXNvbHZlcihhdXRoLCBleHAuZ2V0TXVsdGlGYWN0b3JSZXNvbHZlcihhdXRoLCBlKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsRnJvbU9iamVjdChlKTtcclxuICAgICAgICBjb25zdCBjcmVkRXJyID0gZTtcclxuICAgICAgICBpZiAoY3JlZGVudGlhbCkge1xyXG4gICAgICAgICAgICBjcmVkRXJyLmNyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xyXG4gICAgICAgICAgICBjcmVkRXJyLnRlbmFudElkID0gcmVzcG9uc2UudGVuYW50SWQgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjcmVkRXJyLmVtYWlsID0gcmVzcG9uc2UuZW1haWwgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjcmVkRXJyLnBob25lTnVtYmVyID0gcmVzcG9uc2UucGhvbmVOdW1iZXIgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBjcmVkZW50aWFsRnJvbU9iamVjdChvYmplY3QpIHtcclxuICAgIGNvbnN0IHsgX3Rva2VuUmVzcG9uc2UgfSA9IChvYmplY3QgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yID8gb2JqZWN0LmN1c3RvbURhdGEgOiBvYmplY3QpO1xyXG4gICAgaWYgKCFfdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gSGFuZGxlIHBob25lIEF1dGggY3JlZGVudGlhbCByZXNwb25zZXMsIGFzIHRoZXkgaGF2ZSBhIGRpZmZlcmVudCBmb3JtYXRcclxuICAgIC8vIGZyb20gb3RoZXIgYmFja2VuZCByZXNwb25zZXMgKGkuZS4gbm8gcHJvdmlkZXJJZCkuIFRoaXMgaXMgYWxzbyBvbmx5IHRoZVxyXG4gICAgLy8gY2FzZSBmb3IgdXNlciBjcmVkZW50aWFscyAoZG9lcyBub3Qgd29yayBmb3IgZXJyb3JzKS5cclxuICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IpKSB7XHJcbiAgICAgICAgaWYgKCd0ZW1wb3JhcnlQcm9vZicgaW4gX3Rva2VuUmVzcG9uc2UgJiYgJ3Bob25lTnVtYmVyJyBpbiBfdG9rZW5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZXhwLlBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KG9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvdmlkZXJJZCA9IF90b2tlblJlc3BvbnNlLnByb3ZpZGVySWQ7XHJcbiAgICAvLyBFbWFpbCBhbmQgcGFzc3dvcmQgaXMgbm90IHN1cHBvcnRlZCBhcyB0aGVyZSBpcyBubyBzaXR1YXRpb24gd2hlcmUgdGhlXHJcbiAgICAvLyBzZXJ2ZXIgd291bGQgcmV0dXJuIHRoZSBwYXNzd29yZCB0byB0aGUgY2xpZW50LlxyXG4gICAgaWYgKCFwcm92aWRlcklkIHx8IHByb3ZpZGVySWQgPT09IGV4cC5Qcm92aWRlcklkLlBBU1NXT1JEKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBsZXQgcHJvdmlkZXI7XHJcbiAgICBzd2l0Y2ggKHByb3ZpZGVySWQpIHtcclxuICAgICAgICBjYXNlIGV4cC5Qcm92aWRlcklkLkdPT0dMRTpcclxuICAgICAgICAgICAgcHJvdmlkZXIgPSBleHAuR29vZ2xlQXV0aFByb3ZpZGVyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIGV4cC5Qcm92aWRlcklkLkZBQ0VCT09LOlxyXG4gICAgICAgICAgICBwcm92aWRlciA9IGV4cC5GYWNlYm9va0F1dGhQcm92aWRlcjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBleHAuUHJvdmlkZXJJZC5HSVRIVUI6XHJcbiAgICAgICAgICAgIHByb3ZpZGVyID0gZXhwLkdpdGh1YkF1dGhQcm92aWRlcjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBleHAuUHJvdmlkZXJJZC5UV0lUVEVSOlxyXG4gICAgICAgICAgICBwcm92aWRlciA9IGV4cC5Ud2l0dGVyQXV0aFByb3ZpZGVyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjb25zdCB7IG9hdXRoSWRUb2tlbiwgb2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCwgcGVuZGluZ1Rva2VuLCBub25jZSB9ID0gX3Rva2VuUmVzcG9uc2U7XHJcbiAgICAgICAgICAgIGlmICghb2F1dGhBY2Nlc3NUb2tlbiAmJlxyXG4gICAgICAgICAgICAgICAgIW9hdXRoVG9rZW5TZWNyZXQgJiZcclxuICAgICAgICAgICAgICAgICFvYXV0aElkVG9rZW4gJiZcclxuICAgICAgICAgICAgICAgICFwZW5kaW5nVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFRPRE8oYXZvbGtvdmkpOiB1bmNvbW1lbnQgdGhpcyBhbmQgZ2V0IGl0IHdvcmtpbmcgd2l0aCBTQU1MICYgT0lEQ1xyXG4gICAgICAgICAgICBpZiAocGVuZGluZ1Rva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJJZC5zdGFydHNXaXRoKCdzYW1sLicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cC5TQU1MQXV0aENyZWRlbnRpYWwuX2NyZWF0ZShwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT0lEQyBhbmQgbm9uLWRlZmF1bHQgcHJvdmlkZXJzIGV4Y2x1ZGluZyBUd2l0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHAuT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbkluTWV0aG9kOiBwcm92aWRlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW46IG9hdXRoSWRUb2tlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IG9hdXRoQWNjZXNzVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IGV4cC5PQXV0aFByb3ZpZGVyKHByb3ZpZGVySWQpLmNyZWRlbnRpYWwoe1xyXG4gICAgICAgICAgICAgICAgaWRUb2tlbjogb2F1dGhJZFRva2VuLFxyXG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IG9hdXRoQWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICByYXdOb25jZTogbm9uY2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvclxyXG4gICAgICAgID8gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21FcnJvcihvYmplY3QpXHJcbiAgICAgICAgOiBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChvYmplY3QpO1xyXG59XHJcbmZ1bmN0aW9uIGNvbnZlcnRDcmVkZW50aWFsKGF1dGgsIGNyZWRlbnRpYWxQcm9taXNlKSB7XHJcbiAgICByZXR1cm4gY3JlZGVudGlhbFByb21pc2VcclxuICAgICAgICAuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIGF0dGFjaEV4dHJhRXJyb3JGaWVsZHMoYXV0aCwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICB9KVxyXG4gICAgICAgIC50aGVuKGNyZWRlbnRpYWwgPT4ge1xyXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBjcmVkZW50aWFsLm9wZXJhdGlvblR5cGU7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IGNyZWRlbnRpYWwudXNlcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsRnJvbVJlc3BvbnNlKGNyZWRlbnRpYWwpLFxyXG4gICAgICAgICAgICBhZGRpdGlvbmFsVXNlckluZm86IGV4cC5nZXRBZGRpdGlvbmFsVXNlckluZm8oY3JlZGVudGlhbCksXHJcbiAgICAgICAgICAgIHVzZXI6IFVzZXIuZ2V0T3JDcmVhdGUodXNlcilcclxuICAgICAgICB9O1xyXG4gICAgfSk7XHJcbn1cclxuYXN5bmMgZnVuY3Rpb24gY29udmVydENvbmZpcm1hdGlvblJlc3VsdChhdXRoLCBjb25maXJtYXRpb25SZXN1bHRQcm9taXNlKSB7XHJcbiAgICBjb25zdCBjb25maXJtYXRpb25SZXN1bHRFeHAgPSBhd2FpdCBjb25maXJtYXRpb25SZXN1bHRQcm9taXNlO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB2ZXJpZmljYXRpb25JZDogY29uZmlybWF0aW9uUmVzdWx0RXhwLnZlcmlmaWNhdGlvbklkLFxyXG4gICAgICAgIGNvbmZpcm06ICh2ZXJpZmljYXRpb25Db2RlKSA9PiBjb252ZXJ0Q3JlZGVudGlhbChhdXRoLCBjb25maXJtYXRpb25SZXN1bHRFeHAuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKSlcclxuICAgIH07XHJcbn1cclxuY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihhdXRoLCByZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjtcclxuICAgICAgICB0aGlzLmF1dGggPSB3cmFwcGVkKGF1dGgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHNlc3Npb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXIuc2Vzc2lvbjtcclxuICAgIH1cclxuICAgIGdldCBoaW50cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlci5oaW50cztcclxuICAgIH1cclxuICAgIHJlc29sdmVTaWduSW4oYXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHVud3JhcCh0aGlzLmF1dGgpLCB0aGlzLnJlc29sdmVyLnJlc29sdmVTaWduSW4oYXNzZXJ0aW9uKSk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgVXNlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLm11bHRpRmFjdG9yID0gZXhwLm11bHRpRmFjdG9yKF9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZ2V0T3JDcmVhdGUodXNlcikge1xyXG4gICAgICAgIGlmICghVXNlci5VU0VSX01BUC5oYXModXNlcikpIHtcclxuICAgICAgICAgICAgVXNlci5VU0VSX01BUC5zZXQodXNlciwgbmV3IFVzZXIodXNlcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gVXNlci5VU0VSX01BUC5nZXQodXNlcik7XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmRlbGV0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5yZWxvYWQoKTtcclxuICAgIH1cclxuICAgIHRvSlNPTigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUudG9KU09OKCk7XHJcbiAgICB9XHJcbiAgICBnZXRJZFRva2VuUmVzdWx0KGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5nZXRJZFRva2VuUmVzdWx0KGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcbiAgICBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XHJcbiAgICB9XHJcbiAgICBsaW5rQW5kUmV0cmlldmVEYXRhV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGxpbmtXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHRoaXMuYXV0aCwgZXhwLmxpbmtXaXRoQ3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgY3JlZGVudGlhbCkpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgbGlua1dpdGhQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0KHRoaXMuYXV0aCwgZXhwLmxpbmtXaXRoUGhvbmVOdW1iZXIodGhpcy5fZGVsZWdhdGUsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKSk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBsaW5rV2l0aFBvcHVwKHByb3ZpZGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHRoaXMuYXV0aCwgZXhwLmxpbmtXaXRoUG9wdXAodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVyLCBDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIGxpbmtXaXRoUmVkaXJlY3QocHJvdmlkZXIpIHtcclxuICAgICAgICBhd2FpdCBfc2F2ZVBlcnNpc3RlbmNlRm9yUmVkaXJlY3QoZXhwLl9jYXN0QXV0aCh0aGlzLmF1dGgpKTtcclxuICAgICAgICByZXR1cm4gZXhwLmxpbmtXaXRoUmVkaXJlY3QodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVyLCBDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xyXG4gICAgfVxyXG4gICAgcmVhdXRoZW50aWNhdGVBbmRSZXRyaWV2ZURhdGFXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLmF1dGgsIGV4cC5yZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKHRoaXMuX2RlbGVnYXRlLCBjcmVkZW50aWFsKSk7XHJcbiAgICB9XHJcbiAgICByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0KHRoaXMuYXV0aCwgZXhwLnJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyKHRoaXMuX2RlbGVnYXRlLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgcmVhdXRoZW50aWNhdGVXaXRoUG9wdXAocHJvdmlkZXIpIHtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5hdXRoLCBleHAucmVhdXRoZW50aWNhdGVXaXRoUG9wdXAodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVyLCBDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHByb3ZpZGVyKSB7XHJcbiAgICAgICAgYXdhaXQgX3NhdmVQZXJzaXN0ZW5jZUZvclJlZGlyZWN0KGV4cC5fY2FzdEF1dGgodGhpcy5hdXRoKSk7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICB9XHJcbiAgICBzZW5kRW1haWxWZXJpZmljYXRpb24oYWN0aW9uQ29kZVNldHRpbmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5zZW5kRW1haWxWZXJpZmljYXRpb24odGhpcy5fZGVsZWdhdGUsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBhc3luYyB1bmxpbmsocHJvdmlkZXJJZCkge1xyXG4gICAgICAgIGF3YWl0IGV4cC51bmxpbmsodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVySWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgdXBkYXRlRW1haWwobmV3RW1haWwpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnVwZGF0ZUVtYWlsKHRoaXMuX2RlbGVnYXRlLCBuZXdFbWFpbCk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVQYXNzd29yZChuZXdQYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBleHAudXBkYXRlUGFzc3dvcmQodGhpcy5fZGVsZWdhdGUsIG5ld1Bhc3N3b3JkKTtcclxuICAgIH1cclxuICAgIHVwZGF0ZVBob25lTnVtYmVyKHBob25lQ3JlZGVudGlhbCkge1xyXG4gICAgICAgIHJldHVybiBleHAudXBkYXRlUGhvbmVOdW1iZXIodGhpcy5fZGVsZWdhdGUsIHBob25lQ3JlZGVudGlhbCk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVQcm9maWxlKHByb2ZpbGUpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnVwZGF0ZVByb2ZpbGUodGhpcy5fZGVsZWdhdGUsIHByb2ZpbGUpO1xyXG4gICAgfVxyXG4gICAgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwobmV3RW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncykge1xyXG4gICAgICAgIHJldHVybiBleHAudmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodGhpcy5fZGVsZWdhdGUsIG5ld0VtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtYWlsVmVyaWZpZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmVtYWlsVmVyaWZpZWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNBbm9ueW1vdXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlzQW5vbnltb3VzO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBwaG9uZU51bWJlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucGhvbmVOdW1iZXI7XHJcbiAgICB9XHJcbiAgICBnZXQgcHJvdmlkZXJEYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5wcm92aWRlckRhdGE7XHJcbiAgICB9XHJcbiAgICBnZXQgcmVmcmVzaFRva2VuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5yZWZyZXNoVG9rZW47XHJcbiAgICB9XHJcbiAgICBnZXQgdGVuYW50SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnRlbmFudElkO1xyXG4gICAgfVxyXG4gICAgZ2V0IGRpc3BsYXlOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5kaXNwbGF5TmFtZTtcclxuICAgIH1cclxuICAgIGdldCBlbWFpbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZW1haWw7XHJcbiAgICB9XHJcbiAgICBnZXQgcGhvdG9VUkwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnBob3RvVVJMO1xyXG4gICAgfVxyXG4gICAgZ2V0IHByb3ZpZGVySWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb3ZpZGVySWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgdWlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS51aWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgYXV0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuYXV0aDtcclxuICAgIH1cclxufVxyXG4vLyBNYWludGFpbiBhIG1hcCBzbyB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgMToxIG1hcHBpbmcgYmV0d2VlbiBuZXcgVXNlciBhbmRcclxuLy8gbGVnYWN5IGNvbXBhdCB1c2Vyc1xyXG5Vc2VyLlVTRVJfTUFQID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgX2Fzc2VydCQxID0gZXhwLl9hc3NlcnQ7XHJcbmNsYXNzIEF1dGgge1xyXG4gICAgY29uc3RydWN0b3IoYXBwLCBwcm92aWRlcikge1xyXG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xyXG4gICAgICAgIGlmIChwcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBwcm92aWRlci5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5saW5rVW5kZXJseWluZ0F1dGgoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IGFwaUtleSB9ID0gYXBwLm9wdGlvbnM7XHJcbiAgICAgICAgLy8gVE9ETzogcGxhdGZvcm0gbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCB1c2luZyBoZXVyaXN0aWNzXHJcbiAgICAgICAgX2Fzc2VydCQxKGFwaUtleSwgXCJpbnZhbGlkLWFwaS1rZXlcIiAvKiBleHAuQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVkgKi8sIHtcclxuICAgICAgICAgICAgYXBwTmFtZTogYXBwLm5hbWVcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBUT0RPOiBwbGF0Zm9ybSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIHVzaW5nIGhldXJpc3RpY3NcclxuICAgICAgICBfYXNzZXJ0JDEoYXBpS2V5LCBcImludmFsaWQtYXBpLWtleVwiIC8qIGV4cC5BdXRoRXJyb3JDb2RlLklOVkFMSURfQVBJX0tFWSAqLywge1xyXG4gICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE9ubHkgdXNlIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgaW4gYnJvd3NlciBlbnZpcm9ubWVudHNcclxuICAgICAgICBjb25zdCByZXNvbHZlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gQ29tcGF0UG9wdXBSZWRpcmVjdFJlc29sdmVyIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gcHJvdmlkZXIuaW5pdGlhbGl6ZSh7XHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlOiBidWlsZFBlcnNpc3RlbmNlSGllcmFyY2h5KGFwaUtleSwgYXBwLm5hbWUpLFxyXG4gICAgICAgICAgICAgICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiByZXNvbHZlclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuX3VwZGF0ZUVycm9yTWFwKGV4cC5kZWJ1Z0Vycm9yTWFwKTtcclxuICAgICAgICB0aGlzLmxpbmtVbmRlcmx5aW5nQXV0aCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtdWxhdG9yQ29uZmlnKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5lbXVsYXRvckNvbmZpZztcclxuICAgIH1cclxuICAgIGdldCBjdXJyZW50VXNlcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RlbGVnYXRlLmN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gVXNlci5nZXRPckNyZWF0ZSh0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50VXNlcik7XHJcbiAgICB9XHJcbiAgICBnZXQgbGFuZ3VhZ2VDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5sYW5ndWFnZUNvZGU7XHJcbiAgICB9XHJcbiAgICBzZXQgbGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmxhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZTtcclxuICAgIH1cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2V0dGluZ3M7XHJcbiAgICB9XHJcbiAgICBnZXQgdGVuYW50SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnRlbmFudElkO1xyXG4gICAgfVxyXG4gICAgc2V0IHRlbmFudElkKHRpZCkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLnRlbmFudElkID0gdGlkO1xyXG4gICAgfVxyXG4gICAgdXNlRGV2aWNlTGFuZ3VhZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUudXNlRGV2aWNlTGFuZ3VhZ2UoKTtcclxuICAgIH1cclxuICAgIHNpZ25PdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNpZ25PdXQoKTtcclxuICAgIH1cclxuICAgIHVzZUVtdWxhdG9yKHVybCwgb3B0aW9ucykge1xyXG4gICAgICAgIGV4cC5jb25uZWN0QXV0aEVtdWxhdG9yKHRoaXMuX2RlbGVnYXRlLCB1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgYXBwbHlBY3Rpb25Db2RlKGNvZGUpIHtcclxuICAgICAgICByZXR1cm4gZXhwLmFwcGx5QWN0aW9uQ29kZSh0aGlzLl9kZWxlZ2F0ZSwgY29kZSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0FjdGlvbkNvZGUoY29kZSkge1xyXG4gICAgICAgIHJldHVybiBleHAuY2hlY2tBY3Rpb25Db2RlKHRoaXMuX2RlbGVnYXRlLCBjb2RlKTtcclxuICAgIH1cclxuICAgIGNvbmZpcm1QYXNzd29yZFJlc2V0KGNvZGUsIG5ld1Bhc3N3b3JkKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5jb25maXJtUGFzc3dvcmRSZXNldCh0aGlzLl9kZWxlZ2F0ZSwgY29kZSwgbmV3UGFzc3dvcmQpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLmNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCh0aGlzLl9kZWxlZ2F0ZSwgZW1haWwsIHBhc3N3b3JkKSk7XHJcbiAgICB9XHJcbiAgICBmZXRjaFByb3ZpZGVyc0ZvckVtYWlsKGVtYWlsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoZW1haWwpO1xyXG4gICAgfVxyXG4gICAgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoZW1haWwpIHtcclxuICAgICAgICByZXR1cm4gZXhwLmZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsKHRoaXMuX2RlbGVnYXRlLCBlbWFpbCk7XHJcbiAgICB9XHJcbiAgICBpc1NpZ25JbldpdGhFbWFpbExpbmsoZW1haWxMaW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5pc1NpZ25JbldpdGhFbWFpbExpbmsodGhpcy5fZGVsZWdhdGUsIGVtYWlsTGluayk7XHJcbiAgICB9XHJcbiAgICBhc3luYyBnZXRSZWRpcmVjdFJlc3VsdCgpIHtcclxuICAgICAgICBfYXNzZXJ0JDEoX2lzUG9wdXBSZWRpcmVjdFN1cHBvcnRlZCgpLCB0aGlzLl9kZWxlZ2F0ZSwgXCJvcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50XCIgLyogZXhwLkF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgKi8pO1xyXG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBleHAuZ2V0UmVkaXJlY3RSZXN1bHQodGhpcy5fZGVsZWdhdGUsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICAgICAgaWYgKCFjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIFByb21pc2UucmVzb2x2ZShjcmVkZW50aWFsKSk7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBmcmFtZXdvcmtzIChlLmcuIEZpcmViYXNlVUktd2ViKSB0byBsb2cgdGhlaXIgdXNhZ2UuXHJcbiAgICAvLyBJdCBpcyBub3QgaW50ZW5kZWQgZm9yIGRpcmVjdCB1c2UgYnkgZGV2ZWxvcGVyIGFwcHMuIE5PIGpzZG9jIGhlcmUgdG8gaW50ZW50aW9uYWxseSBsZWF2ZSBpdFxyXG4gICAgLy8gb3V0IG9mIGF1dG9nZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBwYWdlcyB0byByZWR1Y2UgYWNjaWRlbnRhbCBtaXN1c2UuXHJcbiAgICBhZGRGcmFtZXdvcmtGb3JMb2dnaW5nKGZyYW1ld29yaykge1xyXG4gICAgICAgIGV4cC5hZGRGcmFtZXdvcmtGb3JMb2dnaW5nKHRoaXMuX2RlbGVnYXRlLCBmcmFtZXdvcmspO1xyXG4gICAgfVxyXG4gICAgb25BdXRoU3RhdGVDaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvckZuLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICBjb25zdCB7IG5leHQsIGVycm9yLCBjb21wbGV0ZSB9ID0gd3JhcE9ic2VydmVycyhuZXh0T3JPYnNlcnZlciwgZXJyb3JGbiwgY29tcGxldGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub25BdXRoU3RhdGVDaGFuZ2VkKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XHJcbiAgICB9XHJcbiAgICBvbklkVG9rZW5DaGFuZ2VkKG5leHRPck9ic2VydmVyLCBlcnJvckZuLCBjb21wbGV0ZWQpIHtcclxuICAgICAgICBjb25zdCB7IG5leHQsIGVycm9yLCBjb21wbGV0ZSB9ID0gd3JhcE9ic2VydmVycyhuZXh0T3JPYnNlcnZlciwgZXJyb3JGbiwgY29tcGxldGVkKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub25JZFRva2VuQ2hhbmdlZChuZXh0LCBlcnJvciwgY29tcGxldGUpO1xyXG4gICAgfVxyXG4gICAgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnNlbmRTaWduSW5MaW5rVG9FbWFpbCh0aGlzLl9kZWxlZ2F0ZSwgZW1haWwsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MpIHtcclxuICAgICAgICByZXR1cm4gZXhwLnNlbmRQYXNzd29yZFJlc2V0RW1haWwodGhpcy5fZGVsZWdhdGUsIGVtYWlsLCBhY3Rpb25Db2RlU2V0dGluZ3MgfHwgdW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNldFBlcnNpc3RlbmNlKHBlcnNpc3RlbmNlKSB7XHJcbiAgICAgICAgX3ZhbGlkYXRlUGVyc2lzdGVuY2VBcmd1bWVudCh0aGlzLl9kZWxlZ2F0ZSwgcGVyc2lzdGVuY2UpO1xyXG4gICAgICAgIGxldCBjb252ZXJ0ZWQ7XHJcbiAgICAgICAgc3dpdGNoIChwZXJzaXN0ZW5jZSkge1xyXG4gICAgICAgICAgICBjYXNlIFBlcnNpc3RlbmNlLlNFU1NJT046XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBleHAuYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBlcnNpc3RlbmNlLkxPQ0FMOlxyXG4gICAgICAgICAgICAgICAgLy8gTm90IHVzaW5nIGlzSW5kZXhlZERCQXZhaWxhYmxlKCkgc2luY2UgaXQgb25seSBjaGVja3MgaWYgaW5kZXhlZERCIGlzIGRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0luZGV4ZWREQkZ1bGx5U3VwcG9ydGVkID0gYXdhaXQgZXhwXHJcbiAgICAgICAgICAgICAgICAgICAgLl9nZXRJbnN0YW5jZShleHAuaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSlcclxuICAgICAgICAgICAgICAgICAgICAuX2lzQXZhaWxhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBpc0luZGV4ZWREQkZ1bGx5U3VwcG9ydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPyBleHAuaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgIDogZXhwLmJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUGVyc2lzdGVuY2UuTk9ORTpcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGV4cC5pbk1lbW9yeVBlcnNpc3RlbmNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwLl9mYWlsKFwiYXJndW1lbnQtZXJyb3JcIiAvKiBleHAuQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiAqLywge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IHRoaXMuX2RlbGVnYXRlLm5hbWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2V0UGVyc2lzdGVuY2UoY29udmVydGVkKTtcclxuICAgIH1cclxuICAgIHNpZ25JbkFuZFJldHJpZXZlRGF0YVdpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcclxuICAgIH1cclxuICAgIHNpZ25JbkFub255bW91c2x5KCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbkFub255bW91c2x5KHRoaXMuX2RlbGVnYXRlKSk7XHJcbiAgICB9XHJcbiAgICBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsKHRoaXMuX2RlbGVnYXRlLCBleHAuc2lnbkluV2l0aENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIGNyZWRlbnRpYWwpKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhDdXN0b21Ub2tlbih0b2tlbikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhDdXN0b21Ub2tlbih0aGlzLl9kZWxlZ2F0ZSwgdG9rZW4pKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCkge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKHRoaXMuX2RlbGVnYXRlLCBlbWFpbCwgcGFzc3dvcmQpKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhFbWFpbExpbmsoZW1haWwsIGVtYWlsTGluaykge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q3JlZGVudGlhbCh0aGlzLl9kZWxlZ2F0ZSwgZXhwLnNpZ25JbldpdGhFbWFpbExpbmsodGhpcy5fZGVsZWdhdGUsIGVtYWlsLCBlbWFpbExpbmspKTtcclxuICAgIH1cclxuICAgIHNpZ25JbldpdGhQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikge1xyXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q29uZmlybWF0aW9uUmVzdWx0KHRoaXMuX2RlbGVnYXRlLCBleHAuc2lnbkluV2l0aFBob25lTnVtYmVyKHRoaXMuX2RlbGVnYXRlLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcikpO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc2lnbkluV2l0aFBvcHVwKHByb3ZpZGVyKSB7XHJcbiAgICAgICAgX2Fzc2VydCQxKF9pc1BvcHVwUmVkaXJlY3RTdXBwb3J0ZWQoKSwgdGhpcy5fZGVsZWdhdGUsIFwib3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudFwiIC8qIGV4cC5BdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEICovKTtcclxuICAgICAgICByZXR1cm4gY29udmVydENyZWRlbnRpYWwodGhpcy5fZGVsZWdhdGUsIGV4cC5zaWduSW5XaXRoUG9wdXAodGhpcy5fZGVsZWdhdGUsIHByb3ZpZGVyLCBDb21wYXRQb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHNpZ25JbldpdGhSZWRpcmVjdChwcm92aWRlcikge1xyXG4gICAgICAgIF9hc3NlcnQkMShfaXNQb3B1cFJlZGlyZWN0U3VwcG9ydGVkKCksIHRoaXMuX2RlbGVnYXRlLCBcIm9wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnRcIiAvKiBleHAuQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCAqLyk7XHJcbiAgICAgICAgYXdhaXQgX3NhdmVQZXJzaXN0ZW5jZUZvclJlZGlyZWN0KHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICByZXR1cm4gZXhwLnNpZ25JbldpdGhSZWRpcmVjdCh0aGlzLl9kZWxlZ2F0ZSwgcHJvdmlkZXIsIENvbXBhdFBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVDdXJyZW50VXNlcih1c2VyKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIHRzLWlnbm9yZSBvbmNlIG92ZXJsb2FkcyBhcmUgZGVmaW5lZCBmb3IgZXhwIGZ1bmN0aW9ucyB0byBhY2NlcHQgY29tcGF0IG9iamVjdHNcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnVwZGF0ZUN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgfVxyXG4gICAgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUoY29kZSkge1xyXG4gICAgICAgIHJldHVybiBleHAudmVyaWZ5UGFzc3dvcmRSZXNldENvZGUodGhpcy5fZGVsZWdhdGUsIGNvZGUpO1xyXG4gICAgfVxyXG4gICAgdW53cmFwKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIF9kZWxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLl9kZWxldGUoKTtcclxuICAgIH1cclxuICAgIGxpbmtVbmRlcmx5aW5nQXV0aCgpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS53cmFwcGVkID0gKCkgPT4gdGhpcztcclxuICAgIH1cclxufVxyXG5BdXRoLlBlcnNpc3RlbmNlID0gUGVyc2lzdGVuY2U7XHJcbmZ1bmN0aW9uIHdyYXBPYnNlcnZlcnMobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xyXG4gICAgbGV0IG5leHQgPSBuZXh0T3JPYnNlcnZlcjtcclxuICAgIGlmICh0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAoeyBuZXh0LCBlcnJvciwgY29tcGxldGUgfSA9IG5leHRPck9ic2VydmVyKTtcclxuICAgIH1cclxuICAgIC8vIFdlIGtub3cgJ25leHQnIGlzIG5vdyBhIGZ1bmN0aW9uXHJcbiAgICBjb25zdCBvbGROZXh0ID0gbmV4dDtcclxuICAgIGNvbnN0IG5ld05leHQgPSAodXNlcikgPT4gb2xkTmV4dCh1c2VyICYmIFVzZXIuZ2V0T3JDcmVhdGUodXNlcikpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBuZXdOZXh0LFxyXG4gICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICBjb21wbGV0ZVxyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBidWlsZFBlcnNpc3RlbmNlSGllcmFyY2h5KGFwaUtleSwgYXBwTmFtZSkge1xyXG4gICAgLy8gTm90ZSB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvcjogaW4gdGhpcyBjYXNlLCB0aGUgc3RvcmVkXHJcbiAgICAvLyBwZXJzaXN0ZW5jZSBpcyBjaGVja2VkICpmaXJzdCogcmF0aGVyIHRoYW4gbGFzdC4gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnRcclxuICAgIC8vIHRvIHByZWZlciBzdG9yZWQgcGVyc2lzdGVuY2UgdHlwZSBpbiB0aGUgaGllcmFyY2h5LiBUaGlzIGlzIGFuIGVtcHR5XHJcbiAgICAvLyBhcnJheSBpZiB3aW5kb3cgaXMgbm90IGF2YWlsYWJsZSBvciB0aGVyZSBpcyBubyBwZW5kaW5nIHJlZGlyZWN0XHJcbiAgICBjb25zdCBwZXJzaXN0ZW5jZXMgPSBfZ2V0UGVyc2lzdGVuY2VzRnJvbVJlZGlyZWN0KGFwaUtleSwgYXBwTmFtZSk7XHJcbiAgICAvLyBJZiBcInNlbGZcIiBpcyBhdmFpbGFibGUsIGFkZCBpbmRleGVkREJcclxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICAhcGVyc2lzdGVuY2VzLmluY2x1ZGVzKGV4cC5pbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlKSkge1xyXG4gICAgICAgIHBlcnNpc3RlbmNlcy5wdXNoKGV4cC5pbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlKTtcclxuICAgIH1cclxuICAgIC8vIElmIFwid2luZG93XCIgaXMgYXZhaWxhYmxlLCBhZGQgSFRNTCBTdG9yYWdlIHBlcnNpc3RlbmNlc1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwZXJzaXN0ZW5jZSBvZiBbXHJcbiAgICAgICAgICAgIGV4cC5icm93c2VyTG9jYWxQZXJzaXN0ZW5jZSxcclxuICAgICAgICAgICAgZXhwLmJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcclxuICAgICAgICBdKSB7XHJcbiAgICAgICAgICAgIGlmICghcGVyc2lzdGVuY2VzLmluY2x1ZGVzKHBlcnNpc3RlbmNlKSkge1xyXG4gICAgICAgICAgICAgICAgcGVyc2lzdGVuY2VzLnB1c2gocGVyc2lzdGVuY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQWRkIGluLW1lbW9yeSBhcyBhIGZpbmFsIGZhbGxiYWNrXHJcbiAgICBpZiAoIXBlcnNpc3RlbmNlcy5pbmNsdWRlcyhleHAuaW5NZW1vcnlQZXJzaXN0ZW5jZSkpIHtcclxuICAgICAgICBwZXJzaXN0ZW5jZXMucHVzaChleHAuaW5NZW1vcnlQZXJzaXN0ZW5jZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGVyc2lzdGVuY2VzO1xyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNsYXNzIFBob25lQXV0aFByb3ZpZGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucHJvdmlkZXJJZCA9ICdwaG9uZSc7XHJcbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzLWlnbm9yZSB3aGVuIG1vdmluZyB0eXBlcyBmcm9tIGF1dGgtdHlwZXMgdG8gYXV0aC1jb21wYXRcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBuZXcgZXhwLlBob25lQXV0aFByb3ZpZGVyKHVud3JhcChmaXJlYmFzZS5hdXRoKCkpKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIGV4cC5QaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcclxuICAgIH1cclxuICAgIHZlcmlmeVBob25lTnVtYmVyKHBob25lSW5mb09wdGlvbnMsIGFwcGxpY2F0aW9uVmVyaWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUudmVyaWZ5UGhvbmVOdW1iZXIoXHJcbiAgICAgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgYnV0IHRoZSB0eXBlcyBhcmUgc3VidGx5IGluY29tcGF0aWJsZVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgcGhvbmVJbmZvT3B0aW9ucywgYXBwbGljYXRpb25WZXJpZmllcik7XHJcbiAgICB9XHJcbiAgICB1bndyYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlO1xyXG4gICAgfVxyXG59XHJcblBob25lQXV0aFByb3ZpZGVyLlBIT05FX1NJR05fSU5fTUVUSE9EID0gZXhwLlBob25lQXV0aFByb3ZpZGVyLlBIT05FX1NJR05fSU5fTUVUSE9EO1xyXG5QaG9uZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRCA9IGV4cC5QaG9uZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRDtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY29uc3QgX2Fzc2VydCA9IGV4cC5fYXNzZXJ0O1xyXG5jbGFzcyBSZWNhcHRjaGFWZXJpZmllciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIHBhcmFtZXRlcnMsIGFwcCA9IGZpcmViYXNlLmFwcCgpKSB7XHJcbiAgICAgICAgdmFyIF9hO1xyXG4gICAgICAgIC8vIEFQSSBrZXkgaXMgcmVxdWlyZWQgZm9yIHdlYiBjbGllbnQgUlBDIGNhbGxzLlxyXG4gICAgICAgIF9hc3NlcnQoKF9hID0gYXBwLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcGlLZXksIFwiaW52YWxpZC1hcGkta2V5XCIgLyogZXhwLkF1dGhFcnJvckNvZGUuSU5WQUxJRF9BUElfS0VZICovLCB7XHJcbiAgICAgICAgICAgIGFwcE5hbWU6IGFwcC5uYW1lXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBuZXcgZXhwLlJlY2FwdGNoYVZlcmlmaWVyKGNvbnRhaW5lciwgXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBwYXJhbWV0ZXJzLCBcclxuICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHMtaWdub3JlIHdoZW4gbW92aW5nIHR5cGVzIGZyb20gYXV0aC10eXBlcyB0byBhdXRoLWNvbXBhdFxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBhcHAuYXV0aCgpKTtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLl9kZWxlZ2F0ZS50eXBlO1xyXG4gICAgfVxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuY2xlYXIoKTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgICB2ZXJpZnkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnZlcmlmeSgpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IEFVVEhfVFlQRSA9ICdhdXRoLWNvbXBhdCc7XHJcbi8vIENyZWF0ZSBhdXRoIGNvbXBvbmVudHMgdG8gcmVnaXN0ZXIgd2l0aCBmaXJlYmFzZS5cclxuLy8gUHJvdmlkZXMgQXV0aCBwdWJsaWMgQVBJcy5cclxuZnVuY3Rpb24gcmVnaXN0ZXJBdXRoQ29tcGF0KGluc3RhbmNlKSB7XHJcbiAgICBpbnN0YW5jZS5JTlRFUk5BTC5yZWdpc3RlckNvbXBvbmVudChuZXcgQ29tcG9uZW50KEFVVEhfVFlQRSwgY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBnZXRJbW1lZGlhdGUgZm9yIEZpcmViYXNlQXBwIHdpbGwgYWx3YXlzIHN1Y2NlZWRcclxuICAgICAgICBjb25zdCBhcHAgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcC1jb21wYXQnKS5nZXRJbW1lZGlhdGUoKTtcclxuICAgICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2F1dGgnKTtcclxuICAgICAgICByZXR1cm4gbmV3IEF1dGgoYXBwLCBhdXRoUHJvdmlkZXIpO1xyXG4gICAgfSwgXCJQVUJMSUNcIiAvKiBDb21wb25lbnRUeXBlLlBVQkxJQyAqLylcclxuICAgICAgICAuc2V0U2VydmljZVByb3BzKHtcclxuICAgICAgICBBY3Rpb25Db2RlSW5mbzoge1xyXG4gICAgICAgICAgICBPcGVyYXRpb246IHtcclxuICAgICAgICAgICAgICAgIEVNQUlMX1NJR05JTjogZXhwLkFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOLFxyXG4gICAgICAgICAgICAgICAgUEFTU1dPUkRfUkVTRVQ6IGV4cC5BY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VULFxyXG4gICAgICAgICAgICAgICAgUkVDT1ZFUl9FTUFJTDogZXhwLkFjdGlvbkNvZGVPcGVyYXRpb24uUkVDT1ZFUl9FTUFJTCxcclxuICAgICAgICAgICAgICAgIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OOiBleHAuQWN0aW9uQ29kZU9wZXJhdGlvbi5SRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTixcclxuICAgICAgICAgICAgICAgIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOiBleHAuQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTCxcclxuICAgICAgICAgICAgICAgIFZFUklGWV9FTUFJTDogZXhwLkFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0VNQUlMXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIEVtYWlsQXV0aFByb3ZpZGVyOiBleHAuRW1haWxBdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgRmFjZWJvb2tBdXRoUHJvdmlkZXI6IGV4cC5GYWNlYm9va0F1dGhQcm92aWRlcixcclxuICAgICAgICBHaXRodWJBdXRoUHJvdmlkZXI6IGV4cC5HaXRodWJBdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgR29vZ2xlQXV0aFByb3ZpZGVyOiBleHAuR29vZ2xlQXV0aFByb3ZpZGVyLFxyXG4gICAgICAgIE9BdXRoUHJvdmlkZXI6IGV4cC5PQXV0aFByb3ZpZGVyLFxyXG4gICAgICAgIFNBTUxBdXRoUHJvdmlkZXI6IGV4cC5TQU1MQXV0aFByb3ZpZGVyLFxyXG4gICAgICAgIFBob25lQXV0aFByb3ZpZGVyOiBQaG9uZUF1dGhQcm92aWRlcixcclxuICAgICAgICBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yOiBleHAuUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvcixcclxuICAgICAgICBSZWNhcHRjaGFWZXJpZmllcjogUmVjYXB0Y2hhVmVyaWZpZXIsXHJcbiAgICAgICAgVHdpdHRlckF1dGhQcm92aWRlcjogZXhwLlR3aXR0ZXJBdXRoUHJvdmlkZXIsXHJcbiAgICAgICAgQXV0aCxcclxuICAgICAgICBBdXRoQ3JlZGVudGlhbDogZXhwLkF1dGhDcmVkZW50aWFsLFxyXG4gICAgICAgIEVycm9yOiBGaXJlYmFzZUVycm9yXHJcbiAgICB9KVxyXG4gICAgICAgIC5zZXRJbnN0YW50aWF0aW9uTW9kZShcIkxBWllcIiAvKiBJbnN0YW50aWF0aW9uTW9kZS5MQVpZICovKVxyXG4gICAgICAgIC5zZXRNdWx0aXBsZUluc3RhbmNlcyhmYWxzZSkpO1xyXG4gICAgaW5zdGFuY2UucmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24pO1xyXG59XHJcbnJlZ2lzdGVyQXV0aENvbXBhdChmaXJlYmFzZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20yMDE3LmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2ZpcmVzdG9yZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCJpbXBvcnQgZmlyZWJhc2UgZnJvbSAnQGZpcmViYXNlL2FwcC1jb21wYXQnO1xuaW1wb3J0IHsgRmlyZXN0b3JlRXJyb3IsIEJ5dGVzLCBfaXNCYXNlNjRBdmFpbGFibGUsIGVuYWJsZUluZGV4ZWREYlBlcnNpc3RlbmNlLCBlbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlLCBjbGVhckluZGV4ZWREYlBlcnNpc3RlbmNlLCBfRGF0YWJhc2VJZCwgX2xvZ1dhcm4sIGNvbm5lY3RGaXJlc3RvcmVFbXVsYXRvciwgZW5hYmxlTmV0d29yaywgZGlzYWJsZU5ldHdvcmssIF92YWxpZGF0ZUlzTm90VXNlZFRvZ2V0aGVyLCB3YWl0Rm9yUGVuZGluZ1dyaXRlcywgb25TbmFwc2hvdHNJblN5bmMsIGNvbGxlY3Rpb24sIGRvYywgY29sbGVjdGlvbkdyb3VwLCBydW5UcmFuc2FjdGlvbiwgZW5zdXJlRmlyZXN0b3JlQ29uZmlndXJlZCwgV3JpdGVCYXRjaCBhcyBXcml0ZUJhdGNoJDEsIGV4ZWN1dGVXcml0ZSwgbG9hZEJ1bmRsZSwgbmFtZWRRdWVyeSwgRG9jdW1lbnRTbmFwc2hvdCBhcyBEb2N1bWVudFNuYXBzaG90JDEsIERvY3VtZW50UmVmZXJlbmNlIGFzIERvY3VtZW50UmVmZXJlbmNlJDEsIF9Eb2N1bWVudEtleSwgcmVmRXF1YWwsIHNldERvYywgdXBkYXRlRG9jLCBkZWxldGVEb2MsIG9uU25hcHNob3QsIGdldERvY0Zyb21DYWNoZSwgZ2V0RG9jRnJvbVNlcnZlciwgZ2V0RG9jLCBzbmFwc2hvdEVxdWFsLCBxdWVyeSwgd2hlcmUsIG9yZGVyQnksIGxpbWl0LCBsaW1pdFRvTGFzdCwgc3RhcnRBdCwgc3RhcnRBZnRlciwgZW5kQmVmb3JlLCBlbmRBdCwgcXVlcnlFcXVhbCwgZ2V0RG9jc0Zyb21DYWNoZSwgZ2V0RG9jc0Zyb21TZXJ2ZXIsIGdldERvY3MsIFF1ZXJ5U25hcHNob3QgYXMgUXVlcnlTbmFwc2hvdCQxLCBhZGREb2MsIF9jYXN0LCBBYnN0cmFjdFVzZXJEYXRhV3JpdGVyLCBzZXRMb2dMZXZlbCBhcyBzZXRMb2dMZXZlbCQxLCBRdWVyeURvY3VtZW50U25hcHNob3QgYXMgUXVlcnlEb2N1bWVudFNuYXBzaG90JDEsIF9kZWJ1Z0Fzc2VydCwgRmllbGRQYXRoIGFzIEZpZWxkUGF0aCQxLCBfRmllbGRQYXRoLCBzZXJ2ZXJUaW1lc3RhbXAsIGRlbGV0ZUZpZWxkLCBhcnJheVVuaW9uLCBhcnJheVJlbW92ZSwgaW5jcmVtZW50LCBHZW9Qb2ludCwgVGltZXN0YW1wLCBDQUNIRV9TSVpFX1VOTElNSVRFRCB9IGZyb20gJ0BmaXJlYmFzZS9maXJlc3RvcmUnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5cbmNvbnN0IG5hbWUgPSBcIkBmaXJlYmFzZS9maXJlc3RvcmUtY29tcGF0XCI7XG5jb25zdCB2ZXJzaW9uID0gXCIwLjMuMTJcIjtcblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuZnVuY3Rpb24gdmFsaWRhdGVTZXRPcHRpb25zKG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtZXJnZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMubWVyZ2VGaWVsZHMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLm1lcmdlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRmlyZXN0b3JlRXJyb3IoJ2ludmFsaWQtYXJndW1lbnQnLCBgSW52YWxpZCBvcHRpb25zIHBhc3NlZCB0byBmdW5jdGlvbiAke21ldGhvZE5hbWV9KCk6IFlvdSBjYW5ub3QgYCArXHJcbiAgICAgICAgICAgICdzcGVjaWZ5IGJvdGggXCJtZXJnZVwiIGFuZCBcIm1lcmdlRmllbGRzXCIuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKiogSGVscGVyIGZ1bmN0aW9uIHRvIGFzc2VydCBVaW50OEFycmF5IGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLiAqL1xyXG5mdW5jdGlvbiBhc3NlcnRVaW50OEFycmF5QXZhaWxhYmxlKCkge1xyXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRocm93IG5ldyBGaXJlc3RvcmVFcnJvcigndW5pbXBsZW1lbnRlZCcsICdVaW50OEFycmF5cyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LicpO1xyXG4gICAgfVxyXG59XHJcbi8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gYXNzZXJ0IEJhc2U2NCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBhdCBydW50aW1lLiAqL1xyXG5mdW5jdGlvbiBhc3NlcnRCYXNlNjRBdmFpbGFibGUoKSB7XHJcbiAgICBpZiAoIV9pc0Jhc2U2NEF2YWlsYWJsZSgpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEZpcmVzdG9yZUVycm9yKCd1bmltcGxlbWVudGVkJywgJ0Jsb2JzIGFyZSB1bmF2YWlsYWJsZSBpbiBGaXJlc3RvcmUgaW4gdGhpcyBlbnZpcm9ubWVudC4nKTtcclxuICAgIH1cclxufVxyXG4vKiogSW1tdXRhYmxlIGNsYXNzIGhvbGRpbmcgYSBibG9iIChiaW5hcnkgZGF0YSkgKi9cclxuY2xhc3MgQmxvYiB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBmcm9tQmFzZTY0U3RyaW5nKGJhc2U2NCkge1xyXG4gICAgICAgIGFzc2VydEJhc2U2NEF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihCeXRlcy5mcm9tQmFzZTY0U3RyaW5nKGJhc2U2NCkpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZyb21VaW50OEFycmF5KGFycmF5KSB7XHJcbiAgICAgICAgYXNzZXJ0VWludDhBcnJheUF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgQmxvYihCeXRlcy5mcm9tVWludDhBcnJheShhcnJheSkpO1xyXG4gICAgfVxyXG4gICAgdG9CYXNlNjQoKSB7XHJcbiAgICAgICAgYXNzZXJ0QmFzZTY0QXZhaWxhYmxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnRvQmFzZTY0KCk7XHJcbiAgICB9XHJcbiAgICB0b1VpbnQ4QXJyYXkoKSB7XHJcbiAgICAgICAgYXNzZXJ0VWludDhBcnJheUF2YWlsYWJsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS50b1VpbnQ4QXJyYXkoKTtcclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNFcXVhbChvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuICdCbG9iKGJhc2U2NDogJyArIHRoaXMudG9CYXNlNjQoKSArICcpJztcclxuICAgIH1cclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1BhcnRpYWxPYnNlcnZlcihvYmopIHtcclxuICAgIHJldHVybiBpbXBsZW1lbnRzQW55TWV0aG9kcyhvYmosIFsnbmV4dCcsICdlcnJvcicsICdjb21wbGV0ZSddKTtcclxufVxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIG9iaiBpcyBhbiBvYmplY3QgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkXHJcbiAqIG1ldGhvZHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBpbXBsZW1lbnRzQW55TWV0aG9kcyhvYmosIG1ldGhvZHMpIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvYmplY3QgPSBvYmo7XHJcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XHJcbiAgICAgICAgaWYgKG1ldGhvZCBpbiBvYmplY3QgJiYgdHlwZW9mIG9iamVjdFttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vKipcclxuICogVGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGluY2x1ZGVkIHdpdGggdGhlIGZ1bGwgRmlyZXN0b3JlIFNESy5cclxuICovXHJcbmNsYXNzIEluZGV4ZWREYlBlcnNpc3RlbmNlUHJvdmlkZXIge1xyXG4gICAgZW5hYmxlSW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlLCBmb3JjZU93bmVyc2hpcCkge1xyXG4gICAgICAgIHJldHVybiBlbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUuX2RlbGVnYXRlLCB7IGZvcmNlT3duZXJzaGlwIH0pO1xyXG4gICAgfVxyXG4gICAgZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUpIHtcclxuICAgICAgICByZXR1cm4gZW5hYmxlTXVsdGlUYWJJbmRleGVkRGJQZXJzaXN0ZW5jZShmaXJlc3RvcmUuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UoZmlyZXN0b3JlLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbXBhdCBjbGFzcyBmb3IgRmlyZXN0b3JlLiBFeHBvc2VzIEZpcmVzdG9yZSBMZWdhY3kgQVBJLCBidXQgZGVsZWdhdGVzXHJcbiAqIHRvIHRoZSBmdW5jdGlvbmFsIEFQSSBvZiBmaXJlc3RvcmUtZXhwLlxyXG4gKi9cclxuY2xhc3MgRmlyZXN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKGRhdGFiYXNlSWRPckFwcCwgX2RlbGVnYXRlLCBfcGVyc2lzdGVuY2VQcm92aWRlcikge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlUHJvdmlkZXIgPSBfcGVyc2lzdGVuY2VQcm92aWRlcjtcclxuICAgICAgICB0aGlzLklOVEVSTkFMID0ge1xyXG4gICAgICAgICAgICBkZWxldGU6ICgpID0+IHRoaXMudGVybWluYXRlKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghKGRhdGFiYXNlSWRPckFwcCBpbnN0YW5jZW9mIF9EYXRhYmFzZUlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQgPSBkYXRhYmFzZUlkT3JBcHA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IF9kYXRhYmFzZUlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fZGF0YWJhc2VJZDtcclxuICAgIH1cclxuICAgIHNldHRpbmdzKHNldHRpbmdzTGl0ZXJhbCkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZXR0aW5ncyA9IHRoaXMuX2RlbGVnYXRlLl9nZXRTZXR0aW5ncygpO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NMaXRlcmFsLm1lcmdlICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRTZXR0aW5ncy5ob3N0ICE9PSBzZXR0aW5nc0xpdGVyYWwuaG9zdCkge1xyXG4gICAgICAgICAgICBfbG9nV2FybignWW91IGFyZSBvdmVycmlkaW5nIHRoZSBvcmlnaW5hbCBob3N0LiBJZiB5b3UgZGlkIG5vdCBpbnRlbmQgJyArXHJcbiAgICAgICAgICAgICAgICAndG8gb3ZlcnJpZGUgeW91ciBzZXR0aW5ncywgdXNlIHttZXJnZTogdHJ1ZX0uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0xpdGVyYWwubWVyZ2UpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3NMaXRlcmFsID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdXJyZW50U2V0dGluZ3MpLCBzZXR0aW5nc0xpdGVyYWwpO1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHNldHRpbmdzIG9uY2UgdGhlIG1lcmdlIGlzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBkZWxldGUgc2V0dGluZ3NMaXRlcmFsLm1lcmdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5fc2V0U2V0dGluZ3Moc2V0dGluZ3NMaXRlcmFsKTtcclxuICAgIH1cclxuICAgIHVzZUVtdWxhdG9yKGhvc3QsIHBvcnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbm5lY3RGaXJlc3RvcmVFbXVsYXRvcih0aGlzLl9kZWxlZ2F0ZSwgaG9zdCwgcG9ydCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBlbmFibGVOZXR3b3JrKCkge1xyXG4gICAgICAgIHJldHVybiBlbmFibGVOZXR3b3JrKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGRpc2FibGVOZXR3b3JrKCkge1xyXG4gICAgICAgIHJldHVybiBkaXNhYmxlTmV0d29yayh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBlbmFibGVQZXJzaXN0ZW5jZShzZXR0aW5ncykge1xyXG4gICAgICAgIGxldCBzeW5jaHJvbml6ZVRhYnMgPSBmYWxzZTtcclxuICAgICAgICBsZXQgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgc3luY2hyb25pemVUYWJzID0gISFzZXR0aW5ncy5zeW5jaHJvbml6ZVRhYnM7XHJcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbEZvcmNlT3duaW5nVGFiID0gISFzZXR0aW5ncy5leHBlcmltZW50YWxGb3JjZU93bmluZ1RhYjtcclxuICAgICAgICAgICAgX3ZhbGlkYXRlSXNOb3RVc2VkVG9nZXRoZXIoJ3N5bmNocm9uaXplVGFicycsIHN5bmNocm9uaXplVGFicywgJ2V4cGVyaW1lbnRhbEZvcmNlT3duaW5nVGFiJywgZXhwZXJpbWVudGFsRm9yY2VPd25pbmdUYWIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3luY2hyb25pemVUYWJzXHJcbiAgICAgICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2VQcm92aWRlci5lbmFibGVNdWx0aVRhYkluZGV4ZWREYlBlcnNpc3RlbmNlKHRoaXMpXHJcbiAgICAgICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2VQcm92aWRlci5lbmFibGVJbmRleGVkRGJQZXJzaXN0ZW5jZSh0aGlzLCBleHBlcmltZW50YWxGb3JjZU93bmluZ1RhYik7XHJcbiAgICB9XHJcbiAgICBjbGVhclBlcnNpc3RlbmNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZVByb3ZpZGVyLmNsZWFySW5kZXhlZERiUGVyc2lzdGVuY2UodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0ZXJtaW5hdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FwcENvbXBhdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQuX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSgnZmlyZXN0b3JlLWNvbXBhdCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBDb21wYXQuX3JlbW92ZVNlcnZpY2VJbnN0YW5jZSgnZmlyZXN0b3JlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fZGVsZXRlKCk7XHJcbiAgICB9XHJcbiAgICB3YWl0Rm9yUGVuZGluZ1dyaXRlcygpIHtcclxuICAgICAgICByZXR1cm4gd2FpdEZvclBlbmRpbmdXcml0ZXModGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgb25TbmFwc2hvdHNJblN5bmMoYXJnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9uU25hcHNob3RzSW5TeW5jKHRoaXMuX2RlbGVnYXRlLCBhcmcpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFwcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2FwcENvbXBhdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRmlyZXN0b3JlRXJyb3IoJ2ZhaWxlZC1wcmVjb25kaXRpb24nLCBcIkZpcmVzdG9yZSB3YXMgbm90IGluaXRpYWxpemVkIHVzaW5nIHRoZSBGaXJlYmFzZSBTREsuICdhcHAnIGlzIFwiICtcclxuICAgICAgICAgICAgICAgICdub3QgYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBDb21wYXQ7XHJcbiAgICB9XHJcbiAgICBjb2xsZWN0aW9uKHBhdGhTdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25SZWZlcmVuY2UodGhpcywgY29sbGVjdGlvbih0aGlzLl9kZWxlZ2F0ZSwgcGF0aFN0cmluZykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsICdjb2xsZWN0aW9uKCknLCAnRmlyZXN0b3JlLmNvbGxlY3Rpb24oKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRvYyhwYXRoU3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLCBkb2ModGhpcy5fZGVsZWdhdGUsIHBhdGhTdHJpbmcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnZG9jKCknLCAnRmlyZXN0b3JlLmRvYygpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29sbGVjdGlvbkdyb3VwKGNvbGxlY3Rpb25JZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgY29sbGVjdGlvbkdyb3VwKHRoaXMuX2RlbGVnYXRlLCBjb2xsZWN0aW9uSWQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnY29sbGVjdGlvbkdyb3VwKCknLCAnRmlyZXN0b3JlLmNvbGxlY3Rpb25Hcm91cCgpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcnVuVHJhbnNhY3Rpb24odXBkYXRlRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gcnVuVHJhbnNhY3Rpb24odGhpcy5fZGVsZWdhdGUsIHRyYW5zYWN0aW9uID0+IHVwZGF0ZUZ1bmN0aW9uKG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc2FjdGlvbikpKTtcclxuICAgIH1cclxuICAgIGJhdGNoKCkge1xyXG4gICAgICAgIGVuc3VyZUZpcmVzdG9yZUNvbmZpZ3VyZWQodGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgICAgIHJldHVybiBuZXcgV3JpdGVCYXRjaChuZXcgV3JpdGVCYXRjaCQxKHRoaXMuX2RlbGVnYXRlLCBtdXRhdGlvbnMgPT4gZXhlY3V0ZVdyaXRlKHRoaXMuX2RlbGVnYXRlLCBtdXRhdGlvbnMpKSk7XHJcbiAgICB9XHJcbiAgICBsb2FkQnVuZGxlKGJ1bmRsZURhdGEpIHtcclxuICAgICAgICByZXR1cm4gbG9hZEJ1bmRsZSh0aGlzLl9kZWxlZ2F0ZSwgYnVuZGxlRGF0YSk7XHJcbiAgICB9XHJcbiAgICBuYW1lZFF1ZXJ5KG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmFtZWRRdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgbmFtZSkudGhlbihleHBRdWVyeSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXhwUXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcywgXHJcbiAgICAgICAgICAgIC8vIFdlIGNhbiBwYXNzIGBleHBRdWVyeWAgaGVyZSBkaXJlY3RseSBzaW5jZSBuYW1lZCBxdWVyaWVzIGRvbid0IGhhdmUgYSBVc2VyRGF0YUNvbnZlcnRlci5cclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBFeHBRdWVyeSBhbmQgcGFzcyB0aGUgb2xkIFVzZXJEYXRhQ29udmVydGVyLlxyXG4gICAgICAgICAgICBleHBRdWVyeSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgVXNlckRhdGFXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFVzZXJEYXRhV3JpdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGZpcmVzdG9yZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5maXJlc3RvcmUgPSBmaXJlc3RvcmU7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0Qnl0ZXMoYnl0ZXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IobmV3IEJ5dGVzKGJ5dGVzKSk7XHJcbiAgICB9XHJcbiAgICBjb252ZXJ0UmVmZXJlbmNlKG5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbnZlcnREb2N1bWVudEtleShuYW1lLCB0aGlzLmZpcmVzdG9yZS5fZGF0YWJhc2VJZCk7XHJcbiAgICAgICAgcmV0dXJuIERvY3VtZW50UmVmZXJlbmNlLmZvcktleShrZXksIHRoaXMuZmlyZXN0b3JlLCAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XHJcbiAgICBzZXRMb2dMZXZlbCQxKGxldmVsKTtcclxufVxyXG4vKipcclxuICogQSByZWZlcmVuY2UgdG8gYSB0cmFuc2FjdGlvbi5cclxuICovXHJcbmNsYXNzIFRyYW5zYWN0aW9uIHtcclxuICAgIGNvbnN0cnVjdG9yKF9maXJlc3RvcmUsIF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHRoaXMuX2ZpcmVzdG9yZSA9IF9maXJlc3RvcmU7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7XHJcbiAgICAgICAgdGhpcy5fdXNlckRhdGFXcml0ZXIgPSBuZXcgVXNlckRhdGFXcml0ZXIoX2ZpcmVzdG9yZSk7XHJcbiAgICB9XHJcbiAgICBnZXQoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGVcclxuICAgICAgICAgICAgLmdldChyZWYpXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiBuZXcgRG9jdW1lbnRTbmFwc2hvdCh0aGlzLl9maXJlc3RvcmUsIG5ldyBEb2N1bWVudFNuYXBzaG90JDEodGhpcy5fZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHJlc3VsdC5fa2V5LCByZXN1bHQuX2RvY3VtZW50LCByZXN1bHQubWV0YWRhdGEsIHJlZi5jb252ZXJ0ZXIpKSk7XHJcbiAgICB9XHJcbiAgICBzZXQoZG9jdW1lbnRSZWYsIGRhdGEsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICB2YWxpZGF0ZVNldE9wdGlvbnMoJ1RyYW5zYWN0aW9uLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXQocmVmLCBkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldChyZWYsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHVwZGF0ZShkb2N1bWVudFJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkZWxldGUoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZWxldGUocmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxufVxyXG5jbGFzcyBXcml0ZUJhdGNoIHtcclxuICAgIGNvbnN0cnVjdG9yKF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgc2V0KGRvY3VtZW50UmVmLCBkYXRhLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGVTZXRPcHRpb25zKCdXcml0ZUJhdGNoLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXQocmVmLCBkYXRhLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldChyZWYsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHVwZGF0ZShkb2N1bWVudFJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZik7XHJcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUudXBkYXRlKHJlZiwgZGF0YU9yRmllbGQsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBkZWxldGUoZG9jdW1lbnRSZWYpIHtcclxuICAgICAgICBjb25zdCByZWYgPSBjYXN0UmVmZXJlbmNlKGRvY3VtZW50UmVmKTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZWxldGUocmVmKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGNvbW1pdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tbWl0KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFdyYXBzIGEgYFB1YmxpY0ZpcmVzdG9yZURhdGFDb252ZXJ0ZXJgIHRyYW5zbGF0aW5nIHRoZSB0eXBlcyBmcm9tIHRoZVxyXG4gKiBleHBlcmltZW50YWwgU0RLIGludG8gY29ycmVzcG9uZGluZyB0eXBlcyBmcm9tIHRoZSBDbGFzc2ljIFNESyBiZWZvcmUgcGFzc2luZ1xyXG4gKiB0aGVtIHRvIHRoZSB3cmFwcGVkIGNvbnZlcnRlci5cclxuICovXHJcbmNsYXNzIEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX3VzZXJEYXRhV3JpdGVyLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSBfZmlyZXN0b3JlO1xyXG4gICAgICAgIHRoaXMuX3VzZXJEYXRhV3JpdGVyID0gX3VzZXJEYXRhV3JpdGVyO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgZnJvbUZpcmVzdG9yZShzbmFwc2hvdCwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGV4cFNuYXBzaG90ID0gbmV3IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCQxKHRoaXMuX2ZpcmVzdG9yZS5fZGVsZWdhdGUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCBzbmFwc2hvdC5fa2V5LCBzbmFwc2hvdC5fZG9jdW1lbnQsIHNuYXBzaG90Lm1ldGFkYXRhLCBcclxuICAgICAgICAvKiBjb252ZXJ0ZXI9ICovIG51bGwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5mcm9tRmlyZXN0b3JlKG5ldyBRdWVyeURvY3VtZW50U25hcHNob3QodGhpcy5fZmlyZXN0b3JlLCBleHBTbmFwc2hvdCksIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9KTtcclxuICAgIH1cclxuICAgIHRvRmlyZXN0b3JlKG1vZGVsT2JqZWN0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS50b0ZpcmVzdG9yZShtb2RlbE9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUudG9GaXJlc3RvcmUobW9kZWxPYmplY3QsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFVzZSB0aGUgc2FtZSBpbnN0YW5jZSBvZiBgRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgZm9yIHRoZSBnaXZlbiBpbnN0YW5jZXNcclxuICAgIC8vIG9mIGBGaXJlc3RvcmVgIGFuZCBgUHVibGljRmlyZXN0b3JlRGF0YUNvbnZlcnRlcmAgc28gdGhhdCBpc0VxdWFsKCkgd2lsbFxyXG4gICAgLy8gY29tcGFyZSBlcXVhbCBmb3IgdHdvIG9iamVjdHMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGNvbnZlcnRlciBpbnN0YW5jZS5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShmaXJlc3RvcmUsIGNvbnZlcnRlcikge1xyXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlID0gRmlyZXN0b3JlRGF0YUNvbnZlcnRlci5JTlNUQU5DRVM7XHJcbiAgICAgICAgbGV0IHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlciA9IGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlLmdldChmaXJlc3RvcmUpO1xyXG4gICAgICAgIGlmICghdW50eXBlZENvbnZlcnRlckJ5Q29udmVydGVyKSB7XHJcbiAgICAgICAgICAgIHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlciA9IG5ldyBXZWFrTWFwKCk7XHJcbiAgICAgICAgICAgIGNvbnZlcnRlck1hcEJ5RmlyZXN0b3JlLnNldChmaXJlc3RvcmUsIHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHVudHlwZWRDb252ZXJ0ZXJCeUNvbnZlcnRlci5nZXQoY29udmVydGVyKTtcclxuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIoZmlyZXN0b3JlLCBuZXcgVXNlckRhdGFXcml0ZXIoZmlyZXN0b3JlKSwgY29udmVydGVyKTtcclxuICAgICAgICAgICAgdW50eXBlZENvbnZlcnRlckJ5Q29udmVydGVyLnNldChjb252ZXJ0ZXIsIGluc3RhbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59XHJcbkZpcmVzdG9yZURhdGFDb252ZXJ0ZXIuSU5TVEFOQ0VTID0gbmV3IFdlYWtNYXAoKTtcclxuLyoqXHJcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcGFydGljdWxhciBkb2N1bWVudCBpbiBhIGNvbGxlY3Rpb24gaW4gdGhlIGRhdGFiYXNlLlxyXG4gKi9cclxuY2xhc3MgRG9jdW1lbnRSZWZlcmVuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLl91c2VyRGF0YVdyaXRlciA9IG5ldyBVc2VyRGF0YVdyaXRlcihmaXJlc3RvcmUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGZvclBhdGgocGF0aCwgZmlyZXN0b3JlLCBjb252ZXJ0ZXIpIHtcclxuICAgICAgICBpZiAocGF0aC5sZW5ndGggJSAyICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBGaXJlc3RvcmVFcnJvcignaW52YWxpZC1hcmd1bWVudCcsICdJbnZhbGlkIGRvY3VtZW50IHJlZmVyZW5jZS4gRG9jdW1lbnQgJyArXHJcbiAgICAgICAgICAgICAgICAncmVmZXJlbmNlcyBtdXN0IGhhdmUgYW4gZXZlbiBudW1iZXIgb2Ygc2VnbWVudHMsIGJ1dCAnICtcclxuICAgICAgICAgICAgICAgIGAke3BhdGguY2Fub25pY2FsU3RyaW5nKCl9IGhhcyAke3BhdGgubGVuZ3RofWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UmVmZXJlbmNlKGZpcmVzdG9yZSwgbmV3IERvY3VtZW50UmVmZXJlbmNlJDEoZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgY29udmVydGVyLCBuZXcgX0RvY3VtZW50S2V5KHBhdGgpKSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZm9yS2V5KGtleSwgZmlyZXN0b3JlLCBjb252ZXJ0ZXIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50UmVmZXJlbmNlKGZpcmVzdG9yZSwgbmV3IERvY3VtZW50UmVmZXJlbmNlJDEoZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgY29udmVydGVyLCBrZXkpKTtcclxuICAgIH1cclxuICAgIGdldCBpZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcGFyZW50KCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUucGFyZW50KTtcclxuICAgIH1cclxuICAgIGdldCBwYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5wYXRoO1xyXG4gICAgfVxyXG4gICAgY29sbGVjdGlvbihwYXRoU3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVmZXJlbmNlKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uKHRoaXMuX2RlbGVnYXRlLCBwYXRoU3RyaW5nKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2NvbGxlY3Rpb24oKScsICdEb2N1bWVudFJlZmVyZW5jZS5jb2xsZWN0aW9uKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpc0VxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgb3RoZXIgPSBnZXRNb2R1bGFySW5zdGFuY2Uob3RoZXIpO1xyXG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRG9jdW1lbnRSZWZlcmVuY2UkMSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVmRXF1YWwodGhpcy5fZGVsZWdhdGUsIG90aGVyKTtcclxuICAgIH1cclxuICAgIHNldCh2YWx1ZSwgb3B0aW9ucykge1xyXG4gICAgICAgIG9wdGlvbnMgPSB2YWxpZGF0ZVNldE9wdGlvbnMoJ0RvY3VtZW50UmVmZXJlbmNlLnNldCcsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0RG9jKHRoaXMuX2RlbGVnYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0RG9jKHRoaXMuX2RlbGVnYXRlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnc2V0RG9jKCknLCAnRG9jdW1lbnRSZWZlcmVuY2Uuc2V0KCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGUoZmllbGRPclVwZGF0ZURhdGEsIHZhbHVlLCAuLi5tb3JlRmllbGRzQW5kVmFsdWVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVEb2ModGhpcy5fZGVsZWdhdGUsIGZpZWxkT3JVcGRhdGVEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVEb2ModGhpcy5fZGVsZWdhdGUsIGZpZWxkT3JVcGRhdGVEYXRhLCB2YWx1ZSwgLi4ubW9yZUZpZWxkc0FuZFZhbHVlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAndXBkYXRlRG9jKCknLCAnRG9jdW1lbnRSZWZlcmVuY2UudXBkYXRlKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZURvYyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBvblNuYXBzaG90KC4uLmFyZ3MpIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gZXh0cmFjdFNuYXBzaG90T3B0aW9ucyhhcmdzKTtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IHdyYXBPYnNlcnZlcihhcmdzLCByZXN1bHQgPT4gbmV3IERvY3VtZW50U25hcHNob3QodGhpcy5maXJlc3RvcmUsIG5ldyBEb2N1bWVudFNuYXBzaG90JDEodGhpcy5maXJlc3RvcmUuX2RlbGVnYXRlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgcmVzdWx0Ll9rZXksIHJlc3VsdC5fZG9jdW1lbnQsIHJlc3VsdC5tZXRhZGF0YSwgdGhpcy5fZGVsZWdhdGUuY29udmVydGVyKSkpO1xyXG4gICAgICAgIHJldHVybiBvblNuYXBzaG90KHRoaXMuX2RlbGVnYXRlLCBvcHRpb25zLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICBnZXQob3B0aW9ucykge1xyXG4gICAgICAgIGxldCBzbmFwO1xyXG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNvdXJjZSkgPT09ICdjYWNoZScpIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvY0Zyb21DYWNoZSh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc291cmNlKSA9PT0gJ3NlcnZlcicpIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvY0Zyb21TZXJ2ZXIodGhpcy5fZGVsZWdhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc25hcCA9IGdldERvYyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzbmFwLnRoZW4ocmVzdWx0ID0+IG5ldyBEb2N1bWVudFNuYXBzaG90KHRoaXMuZmlyZXN0b3JlLCBuZXcgRG9jdW1lbnRTbmFwc2hvdCQxKHRoaXMuZmlyZXN0b3JlLl9kZWxlZ2F0ZSwgdGhpcy5fdXNlckRhdGFXcml0ZXIsIHJlc3VsdC5fa2V5LCByZXN1bHQuX2RvY3VtZW50LCByZXN1bHQubWV0YWRhdGEsIHRoaXMuX2RlbGVnYXRlLmNvbnZlcnRlcikpKTtcclxuICAgIH1cclxuICAgIHdpdGhDb252ZXJ0ZXIoY29udmVydGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgY29udmVydGVyXHJcbiAgICAgICAgICAgID8gdGhpcy5fZGVsZWdhdGUud2l0aENvbnZlcnRlcihGaXJlc3RvcmVEYXRhQ29udmVydGVyLmdldEluc3RhbmNlKHRoaXMuZmlyZXN0b3JlLCBjb252ZXJ0ZXIpKVxyXG4gICAgICAgICAgICA6IHRoaXMuX2RlbGVnYXRlLndpdGhDb252ZXJ0ZXIobnVsbCkpO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZXBsYWNlcyB0aGUgZnVuY3Rpb24gbmFtZSBpbiBhbiBlcnJvciB0aHJvd24gYnkgdGhlIGZpcmVzdG9yZS1leHAgQVBJXHJcbiAqIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWVzIHVzZWQgaW4gdGhlIGNsYXNzaWMgQVBJLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCBvcmlnaW5hbCwgdXBkYXRlZCkge1xyXG4gICAgZS5tZXNzYWdlID0gZS5tZXNzYWdlLnJlcGxhY2Uob3JpZ2luYWwsIHVwZGF0ZWQpO1xyXG4gICAgcmV0dXJuIGU7XHJcbn1cclxuLyoqXHJcbiAqIEl0ZXJhdGVzIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBmcm9tIGFuIGBvblNuYXBzaG90YCBjYWxsIGFuZCByZXR1cm5zIHRoZVxyXG4gKiBmaXJzdCBhcmd1bWVudCB0aGF0IG1heSBiZSBhbiBgU25hcHNob3RMaXN0ZW5PcHRpb25zYCBvYmplY3QuIFJldHVybnMgYW5cclxuICogZW1wdHkgb2JqZWN0IGlmIG5vbmUgaXMgZm91bmQuXHJcbiAqL1xyXG5mdW5jdGlvbiBleHRyYWN0U25hcHNob3RPcHRpb25zKGFyZ3MpIHtcclxuICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgIWlzUGFydGlhbE9ic2VydmVyKGFyZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFyZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbn1cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gb2JzZXJ2ZXIgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBmaXJlc3RvcmUtZXhwIFNESy4gVGhlXHJcbiAqIG9ic2VydmVyIGNvbnZlcnRzIGFsbCBvYnNlcnZlZCB2YWx1ZXMgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBjbGFzc2ljXHJcbiAqIFNESy5cclxuICpcclxuICogQHBhcmFtIGFyZ3MgLSBUaGUgbGlzdCBvZiBhcmd1bWVudHMgZnJvbSBhbiBgb25TbmFwc2hvdGAgY2FsbC5cclxuICogQHBhcmFtIHdyYXBwZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyB0aGUgZmlyZXN0b3JlLWV4cCB0eXBlIGludG8gdGhlXHJcbiAqIHR5cGUgdXNlZCBieSB0aGlzIHNoaW0uXHJcbiAqL1xyXG5mdW5jdGlvbiB3cmFwT2JzZXJ2ZXIoYXJncywgd3JhcHBlcikge1xyXG4gICAgdmFyIF9hLCBfYjtcclxuICAgIGxldCB1c2VyT2JzZXJ2ZXI7XHJcbiAgICBpZiAoaXNQYXJ0aWFsT2JzZXJ2ZXIoYXJnc1swXSkpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSBhcmdzWzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNQYXJ0aWFsT2JzZXJ2ZXIoYXJnc1sxXSkpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSBhcmdzWzFdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5leHQ6IGFyZ3NbMF0sXHJcbiAgICAgICAgICAgIGVycm9yOiBhcmdzWzFdLFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogYXJnc1syXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB1c2VyT2JzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5leHQ6IGFyZ3NbMV0sXHJcbiAgICAgICAgICAgIGVycm9yOiBhcmdzWzJdLFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogYXJnc1szXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IHZhbCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyT2JzZXJ2ZXIubmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdXNlck9ic2VydmVyLm5leHQod3JhcHBlcih2YWwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChfYSA9IHVzZXJPYnNlcnZlci5lcnJvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJpbmQodXNlck9ic2VydmVyKSxcclxuICAgICAgICBjb21wbGV0ZTogKF9iID0gdXNlck9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYmluZCh1c2VyT2JzZXJ2ZXIpXHJcbiAgICB9O1xyXG59XHJcbmNsYXNzIERvY3VtZW50U25hcHNob3Qge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX2RlbGVnYXRlKSB7XHJcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gX2ZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCByZWYoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLl9maXJlc3RvcmUsIHRoaXMuX2RlbGVnYXRlLnJlZik7XHJcbiAgICB9XHJcbiAgICBnZXQgaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlkO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBleGlzdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmV4aXN0cygpO1xyXG4gICAgfVxyXG4gICAgZGF0YShvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmRhdGEob3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBnZXQoZmllbGRQYXRoLCBvcHRpb25zXHJcbiAgICAvLyBXZSBhcmUgdXNpbmcgYGFueWAgaGVyZSB0byBhdm9pZCBhbiBleHBsaWNpdCBjYXN0IGJ5IG91ciB1c2Vycy5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGZpZWxkUGF0aCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBpc0VxdWFsKG90aGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90RXF1YWwodGhpcy5fZGVsZWdhdGUsIG90aGVyLl9kZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUXVlcnlEb2N1bWVudFNuYXBzaG90IGV4dGVuZHMgRG9jdW1lbnRTbmFwc2hvdCB7XHJcbiAgICBkYXRhKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGVsZWdhdGUuZGF0YShvcHRpb25zKTtcclxuICAgICAgICBfZGVidWdBc3NlcnQoZGF0YSAhPT0gdW5kZWZpbmVkLCAnRG9jdW1lbnQgaW4gYSBRdWVyeURvY3VtZW50U25hcHNob3Qgc2hvdWxkIGV4aXN0Jyk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbn1cclxuY2xhc3MgUXVlcnkge1xyXG4gICAgY29uc3RydWN0b3IoZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgICAgICB0aGlzLl91c2VyRGF0YVdyaXRlciA9IG5ldyBVc2VyRGF0YVdyaXRlcihmaXJlc3RvcmUpO1xyXG4gICAgfVxyXG4gICAgd2hlcmUoZmllbGRQYXRoLCBvcFN0ciwgdmFsdWUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBUaGUgXCJhcyBzdHJpbmdcIiBjYXN0IGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2suIGB3aGVyZWAgYWNjZXB0cyB0aGVcclxuICAgICAgICAgICAgLy8gRmllbGRQYXRoIENvbXBhdCB0eXBlIGFzIGlucHV0LCBidXQgaXMgbm90IHR5cGVkIGFzIHN1Y2ggaW4gb3JkZXIgdG9cclxuICAgICAgICAgICAgLy8gbm90IGV4cG9zZSB0aGlzIHZpYSBvdXIgcHVibGljIHR5cGluZ3MgZmlsZS5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIHdoZXJlKGZpZWxkUGF0aCwgb3BTdHIsIHZhbHVlKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsIC8ob3JkZXJCeXx3aGVyZSlcXChcXCkvLCAnUXVlcnkuJDEoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9yZGVyQnkoZmllbGRQYXRoLCBkaXJlY3Rpb25TdHIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBUaGUgXCJhcyBzdHJpbmdcIiBjYXN0IGlzIGEgbGl0dGxlIGJpdCBvZiBhIGhhY2suIGBvcmRlckJ5YCBhY2NlcHRzIHRoZVxyXG4gICAgICAgICAgICAvLyBGaWVsZFBhdGggQ29tcGF0IHR5cGUgYXMgaW5wdXQsIGJ1dCBpcyBub3QgdHlwZWQgYXMgc3VjaCBpbiBvcmRlciB0b1xyXG4gICAgICAgICAgICAvLyBub3QgZXhwb3NlIHRoaXMgdmlhIG91ciBwdWJsaWMgdHlwaW5ncyBmaWxlLlxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuZmlyZXN0b3JlLCBxdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgb3JkZXJCeShmaWVsZFBhdGgsIGRpcmVjdGlvblN0cikpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAvKG9yZGVyQnl8d2hlcmUpXFwoXFwpLywgJ1F1ZXJ5LiQxKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBsaW1pdChuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIGxpbWl0KG4pKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2xpbWl0KCknLCAnUXVlcnkubGltaXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxpbWl0VG9MYXN0KG4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuZmlyZXN0b3JlLCBxdWVyeSh0aGlzLl9kZWxlZ2F0ZSwgbGltaXRUb0xhc3QobikpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnbGltaXRUb0xhc3QoKScsICdRdWVyeS5saW1pdFRvTGFzdCgpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3RhcnRBdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIHN0YXJ0QXQoLi4uYXJncykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnc3RhcnRBdCgpJywgJ1F1ZXJ5LnN0YXJ0QXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXJ0QWZ0ZXIoLi4uYXJncykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIHF1ZXJ5KHRoaXMuX2RlbGVnYXRlLCBzdGFydEFmdGVyKC4uLmFyZ3MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ3N0YXJ0QWZ0ZXIoKScsICdRdWVyeS5zdGFydEFmdGVyKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbmRCZWZvcmUoLi4uYXJncykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIHF1ZXJ5KHRoaXMuX2RlbGVnYXRlLCBlbmRCZWZvcmUoLi4uYXJncykpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgcmVwbGFjZUZ1bmN0aW9uTmFtZShlLCAnZW5kQmVmb3JlKCknLCAnUXVlcnkuZW5kQmVmb3JlKCknKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbmRBdCguLi5hcmdzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLmZpcmVzdG9yZSwgcXVlcnkodGhpcy5fZGVsZWdhdGUsIGVuZEF0KC4uLmFyZ3MpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IHJlcGxhY2VGdW5jdGlvbk5hbWUoZSwgJ2VuZEF0KCknLCAnUXVlcnkuZW5kQXQoKScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gcXVlcnlFcXVhbCh0aGlzLl9kZWxlZ2F0ZSwgb3RoZXIuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGdldChvcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHF1ZXJ5O1xyXG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNvdXJjZSkgPT09ICdjYWNoZScpIHtcclxuICAgICAgICAgICAgcXVlcnkgPSBnZXREb2NzRnJvbUNhY2hlKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zb3VyY2UpID09PSAnc2VydmVyJykge1xyXG4gICAgICAgICAgICBxdWVyeSA9IGdldERvY3NGcm9tU2VydmVyKHRoaXMuX2RlbGVnYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ID0gZ2V0RG9jcyh0aGlzLl9kZWxlZ2F0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBxdWVyeS50aGVuKHJlc3VsdCA9PiBuZXcgUXVlcnlTbmFwc2hvdCh0aGlzLmZpcmVzdG9yZSwgbmV3IFF1ZXJ5U25hcHNob3QkMSh0aGlzLmZpcmVzdG9yZS5fZGVsZWdhdGUsIHRoaXMuX3VzZXJEYXRhV3JpdGVyLCB0aGlzLl9kZWxlZ2F0ZSwgcmVzdWx0Ll9zbmFwc2hvdCkpKTtcclxuICAgIH1cclxuICAgIG9uU25hcHNob3QoLi4uYXJncykge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBleHRyYWN0U25hcHNob3RPcHRpb25zKGFyZ3MpO1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gd3JhcE9ic2VydmVyKGFyZ3MsIHNuYXAgPT4gbmV3IFF1ZXJ5U25hcHNob3QodGhpcy5maXJlc3RvcmUsIG5ldyBRdWVyeVNuYXBzaG90JDEodGhpcy5maXJlc3RvcmUuX2RlbGVnYXRlLCB0aGlzLl91c2VyRGF0YVdyaXRlciwgdGhpcy5fZGVsZWdhdGUsIHNuYXAuX3NuYXBzaG90KSkpO1xyXG4gICAgICAgIHJldHVybiBvblNuYXBzaG90KHRoaXMuX2RlbGVnYXRlLCBvcHRpb25zLCBvYnNlcnZlcik7XHJcbiAgICB9XHJcbiAgICB3aXRoQ29udmVydGVyKGNvbnZlcnRlcikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkodGhpcy5maXJlc3RvcmUsIGNvbnZlcnRlclxyXG4gICAgICAgICAgICA/IHRoaXMuX2RlbGVnYXRlLndpdGhDb252ZXJ0ZXIoRmlyZXN0b3JlRGF0YUNvbnZlcnRlci5nZXRJbnN0YW5jZSh0aGlzLmZpcmVzdG9yZSwgY29udmVydGVyKSlcclxuICAgICAgICAgICAgOiB0aGlzLl9kZWxlZ2F0ZS53aXRoQ29udmVydGVyKG51bGwpKTtcclxuICAgIH1cclxufVxyXG5jbGFzcyBEb2N1bWVudENoYW5nZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZmlyZXN0b3JlLCBfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9maXJlc3RvcmUgPSBfZmlyZXN0b3JlO1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xyXG4gICAgfVxyXG4gICAgZ2V0IHR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnR5cGU7XHJcbiAgICB9XHJcbiAgICBnZXQgZG9jKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlEb2N1bWVudFNuYXBzaG90KHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUuZG9jKTtcclxuICAgIH1cclxuICAgIGdldCBvbGRJbmRleCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUub2xkSW5kZXg7XHJcbiAgICB9XHJcbiAgICBnZXQgbmV3SW5kZXgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLm5ld0luZGV4O1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIFF1ZXJ5U25hcHNob3Qge1xyXG4gICAgY29uc3RydWN0b3IoX2ZpcmVzdG9yZSwgX2RlbGVnYXRlKSB7XHJcbiAgICAgICAgdGhpcy5fZmlyZXN0b3JlID0gX2ZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCBxdWVyeSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMuX2ZpcmVzdG9yZSwgdGhpcy5fZGVsZWdhdGUucXVlcnkpO1xyXG4gICAgfVxyXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5tZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBzaXplKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5zaXplO1xyXG4gICAgfVxyXG4gICAgZ2V0IGVtcHR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5lbXB0eTtcclxuICAgIH1cclxuICAgIGdldCBkb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5kb2NzLm1hcChkb2MgPT4gbmV3IFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCh0aGlzLl9maXJlc3RvcmUsIGRvYykpO1xyXG4gICAgfVxyXG4gICAgZG9jQ2hhbmdlcyhvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlXHJcbiAgICAgICAgICAgIC5kb2NDaGFuZ2VzKG9wdGlvbnMpXHJcbiAgICAgICAgICAgIC5tYXAoZG9jQ2hhbmdlID0+IG5ldyBEb2N1bWVudENoYW5nZSh0aGlzLl9maXJlc3RvcmUsIGRvY0NoYW5nZSkpO1xyXG4gICAgfVxyXG4gICAgZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLmZvckVhY2goc25hcHNob3QgPT4ge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIG5ldyBRdWVyeURvY3VtZW50U25hcHNob3QodGhpcy5fZmlyZXN0b3JlLCBzbmFwc2hvdCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIHJldHVybiBzbmFwc2hvdEVxdWFsKHRoaXMuX2RlbGVnYXRlLCBvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIENvbGxlY3Rpb25SZWZlcmVuY2UgZXh0ZW5kcyBRdWVyeSB7XHJcbiAgICBjb25zdHJ1Y3RvcihmaXJlc3RvcmUsIF9kZWxlZ2F0ZSkge1xyXG4gICAgICAgIHN1cGVyKGZpcmVzdG9yZSwgX2RlbGVnYXRlKTtcclxuICAgICAgICB0aGlzLmZpcmVzdG9yZSA9IGZpcmVzdG9yZTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIGdldCBpZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaWQ7XHJcbiAgICB9XHJcbiAgICBnZXQgcGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUucGF0aDtcclxuICAgIH1cclxuICAgIGdldCBwYXJlbnQoKSB7XHJcbiAgICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5fZGVsZWdhdGUucGFyZW50O1xyXG4gICAgICAgIHJldHVybiBkb2NSZWYgPyBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvY1JlZikgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgZG9jKGRvY3VtZW50UGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudFBhdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2FsbCBgZG9jYCB3aXRob3V0IGBkb2N1bWVudFBhdGhgIGlmIGBkb2N1bWVudFBhdGhgIGlzIGB1bmRlZmluZWRgXHJcbiAgICAgICAgICAgICAgICAvLyBhcyBgZG9jYCB2YWxpZGF0ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJldmVudCB1c2VycyBmcm9tXHJcbiAgICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzc2luZyBgdW5kZWZpbmVkYC5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvYyh0aGlzLl9kZWxlZ2F0ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudFJlZmVyZW5jZSh0aGlzLmZpcmVzdG9yZSwgZG9jKHRoaXMuX2RlbGVnYXRlLCBkb2N1bWVudFBhdGgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyByZXBsYWNlRnVuY3Rpb25OYW1lKGUsICdkb2MoKScsICdDb2xsZWN0aW9uUmVmZXJlbmNlLmRvYygpJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgYWRkKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gYWRkRG9jKHRoaXMuX2RlbGVnYXRlLCBkYXRhKS50aGVuKGRvY1JlZiA9PiBuZXcgRG9jdW1lbnRSZWZlcmVuY2UodGhpcy5maXJlc3RvcmUsIGRvY1JlZikpO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIHJldHVybiByZWZFcXVhbCh0aGlzLl9kZWxlZ2F0ZSwgb3RoZXIuX2RlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHdpdGhDb252ZXJ0ZXIoY29udmVydGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVmZXJlbmNlKHRoaXMuZmlyZXN0b3JlLCBjb252ZXJ0ZXJcclxuICAgICAgICAgICAgPyB0aGlzLl9kZWxlZ2F0ZS53aXRoQ29udmVydGVyKEZpcmVzdG9yZURhdGFDb252ZXJ0ZXIuZ2V0SW5zdGFuY2UodGhpcy5maXJlc3RvcmUsIGNvbnZlcnRlcikpXHJcbiAgICAgICAgICAgIDogdGhpcy5fZGVsZWdhdGUud2l0aENvbnZlcnRlcihudWxsKSk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY2FzdFJlZmVyZW5jZShkb2N1bWVudFJlZikge1xyXG4gICAgcmV0dXJuIF9jYXN0KGRvY3VtZW50UmVmLCBEb2N1bWVudFJlZmVyZW5jZSQxKTtcclxufVxuXG4vKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqL1xyXG4vLyBUaGUgb2JqZWN0cyB0aGF0IGFyZSBhIHBhcnQgb2YgdGhpcyBBUEkgYXJlIGV4cG9zZWQgdG8gdGhpcmQtcGFydGllcyBhc1xyXG4vLyBjb21waWxlZCBqYXZhc2NyaXB0IHNvIHdlIHdhbnQgdG8gZmxhZyBvdXIgcHJpdmF0ZSBtZW1iZXJzIHdpdGggYSBsZWFkaW5nXHJcbi8vIHVuZGVyc2NvcmUgdG8gZGlzY291cmFnZSB0aGVpciB1c2UuXHJcbi8qKlxyXG4gKiBBIGBGaWVsZFBhdGhgIHJlZmVycyB0byBhIGZpZWxkIGluIGEgZG9jdW1lbnQuIFRoZSBwYXRoIG1heSBjb25zaXN0IG9mIGFcclxuICogc2luZ2xlIGZpZWxkIG5hbWUgKHJlZmVycmluZyB0byBhIHRvcC1sZXZlbCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQpLCBvciBhIGxpc3RcclxuICogb2YgZmllbGQgbmFtZXMgKHJlZmVycmluZyB0byBhIG5lc3RlZCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQpLlxyXG4gKi9cclxuY2xhc3MgRmllbGRQYXRoIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZpZWxkUGF0aCBmcm9tIHRoZSBwcm92aWRlZCBmaWVsZCBuYW1lcy4gSWYgbW9yZSB0aGFuIG9uZSBmaWVsZFxyXG4gICAgICogbmFtZSBpcyBwcm92aWRlZCwgdGhlIHBhdGggd2lsbCBwb2ludCB0byBhIG5lc3RlZCBmaWVsZCBpbiBhIGRvY3VtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmaWVsZE5hbWVzIC0gQSBsaXN0IG9mIGZpZWxkIG5hbWVzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvciguLi5maWVsZE5hbWVzKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBuZXcgRmllbGRQYXRoJDEoLi4uZmllbGROYW1lcyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgZG9jdW1lbnRJZCgpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBOb3RlOiBUaGUgYmFja2VuZCBkb2Vzbid0IHRlY2huaWNhbGx5IHN1cHBvcnQgcXVlcnlpbmcgYnlcclxuICAgICAgICAgKiBkb2N1bWVudCBJRC4gSW5zdGVhZCBpdCBxdWVyaWVzIGJ5IHRoZSBlbnRpcmUgZG9jdW1lbnQgbmFtZSAoZnVsbCBwYXRoXHJcbiAgICAgICAgICogaW5jbHVkZWQpLCBidXQgaW4gdGhlIGNhc2VzIHdlIGN1cnJlbnRseSBzdXBwb3J0IGRvY3VtZW50SWQoKSwgdGhlIG5ldFxyXG4gICAgICAgICAqIGVmZmVjdCBpcyB0aGUgc2FtZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gbmV3IEZpZWxkUGF0aChfRmllbGRQYXRoLmtleUZpZWxkKCkuY2Fub25pY2FsU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaXNFcXVhbChvdGhlcikge1xyXG4gICAgICAgIG90aGVyID0gZ2V0TW9kdWxhckluc3RhbmNlKG90aGVyKTtcclxuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpZWxkUGF0aCQxKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5faW50ZXJuYWxQYXRoLmlzRXF1YWwob3RoZXIuX2ludGVybmFsUGF0aCk7XHJcbiAgICB9XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuY2xhc3MgRmllbGRWYWx1ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihfZGVsZWdhdGUpIHtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBzZXJ2ZXJUaW1lc3RhbXAoKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBzZXJ2ZXJUaW1lc3RhbXAoKTtcclxuICAgICAgICBkZWxlZ2F0ZS5fbWV0aG9kTmFtZSA9ICdGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBkZWxldGUoKSB7XHJcbiAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBkZWxldGVGaWVsZCgpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuZGVsZXRlJztcclxuICAgICAgICByZXR1cm4gbmV3IEZpZWxkVmFsdWUoZGVsZWdhdGUpO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIGFycmF5VW5pb24oLi4uZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFycmF5VW5pb24oLi4uZWxlbWVudHMpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuYXJyYXlVbmlvbic7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBhcnJheVJlbW92ZSguLi5lbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlID0gYXJyYXlSZW1vdmUoLi4uZWxlbWVudHMpO1xyXG4gICAgICAgIGRlbGVnYXRlLl9tZXRob2ROYW1lID0gJ0ZpZWxkVmFsdWUuYXJyYXlSZW1vdmUnO1xyXG4gICAgICAgIHJldHVybiBuZXcgRmllbGRWYWx1ZShkZWxlZ2F0ZSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgaW5jcmVtZW50KG4pIHtcclxuICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGluY3JlbWVudChuKTtcclxuICAgICAgICBkZWxlZ2F0ZS5fbWV0aG9kTmFtZSA9ICdGaWVsZFZhbHVlLmluY3JlbWVudCc7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWVsZFZhbHVlKGRlbGVnYXRlKTtcclxuICAgIH1cclxuICAgIGlzRXF1YWwob3RoZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXNFcXVhbChvdGhlci5fZGVsZWdhdGUpO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICovXHJcbmNvbnN0IGZpcmVzdG9yZU5hbWVzcGFjZSA9IHtcclxuICAgIEZpcmVzdG9yZSxcclxuICAgIEdlb1BvaW50LFxyXG4gICAgVGltZXN0YW1wLFxyXG4gICAgQmxvYixcclxuICAgIFRyYW5zYWN0aW9uLFxyXG4gICAgV3JpdGVCYXRjaCxcclxuICAgIERvY3VtZW50UmVmZXJlbmNlLFxyXG4gICAgRG9jdW1lbnRTbmFwc2hvdCxcclxuICAgIFF1ZXJ5LFxyXG4gICAgUXVlcnlEb2N1bWVudFNuYXBzaG90LFxyXG4gICAgUXVlcnlTbmFwc2hvdCxcclxuICAgIENvbGxlY3Rpb25SZWZlcmVuY2UsXHJcbiAgICBGaWVsZFBhdGgsXHJcbiAgICBGaWVsZFZhbHVlLFxyXG4gICAgc2V0TG9nTGV2ZWwsXHJcbiAgICBDQUNIRV9TSVpFX1VOTElNSVRFRFxyXG59O1xyXG4vKipcclxuICogQ29uZmlndXJlcyBGaXJlc3RvcmUgYXMgcGFydCBvZiB0aGUgRmlyZWJhc2UgU0RLIGJ5IGNhbGxpbmcgcmVnaXN0ZXJDb21wb25lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBmaXJlYmFzZSAtIFRoZSBGaXJlYmFzZU5hbWVzcGFjZSB0byByZWdpc3RlciBGaXJlc3RvcmUgd2l0aFxyXG4gKiBAcGFyYW0gZmlyZXN0b3JlRmFjdG9yeSAtIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgRmlyZXN0b3JlXHJcbiAqICAgIGluc3RhbmNlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29uZmlndXJlRm9yRmlyZWJhc2UoZmlyZWJhc2UsIGZpcmVzdG9yZUZhY3RvcnkpIHtcclxuICAgIGZpcmViYXNlLklOVEVSTkFMLnJlZ2lzdGVyQ29tcG9uZW50KG5ldyBDb21wb25lbnQoJ2ZpcmVzdG9yZS1jb21wYXQnLCBjb250YWluZXIgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwLWNvbXBhdCcpLmdldEltbWVkaWF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IGZpcmVzdG9yZUV4cCA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignZmlyZXN0b3JlJykuZ2V0SW1tZWRpYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIGZpcmVzdG9yZUZhY3RvcnkoYXBwLCBmaXJlc3RvcmVFeHApO1xyXG4gICAgfSwgJ1BVQkxJQycpLnNldFNlcnZpY2VQcm9wcyhPYmplY3QuYXNzaWduKHt9LCBmaXJlc3RvcmVOYW1lc3BhY2UpKSk7XHJcbn1cblxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKi9cclxuLyoqXHJcbiAqIFJlZ2lzdGVycyB0aGUgbWFpbiBGaXJlc3RvcmUgYnVpbGQgd2l0aCB0aGUgY29tcG9uZW50cyBmcmFtZXdvcmsuXHJcbiAqIFBlcnNpc3RlbmNlIGNhbiBiZSBlbmFibGVkIHZpYSBgZmlyZWJhc2UuZmlyZXN0b3JlKCkuZW5hYmxlUGVyc2lzdGVuY2UoKWAuXHJcbiAqL1xyXG5mdW5jdGlvbiByZWdpc3RlckZpcmVzdG9yZShpbnN0YW5jZSkge1xyXG4gICAgY29uZmlndXJlRm9yRmlyZWJhc2UoaW5zdGFuY2UsIChhcHAsIGZpcmVzdG9yZUV4cCkgPT4gbmV3IEZpcmVzdG9yZShhcHAsIGZpcmVzdG9yZUV4cCwgbmV3IEluZGV4ZWREYlBlcnNpc3RlbmNlUHJvdmlkZXIoKSkpO1xyXG4gICAgaW5zdGFuY2UucmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24pO1xyXG59XHJcbnJlZ2lzdGVyRmlyZXN0b3JlKGZpcmViYXNlKTtcblxuZXhwb3J0IHsgcmVnaXN0ZXJGaXJlc3RvcmUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbTIwMTcuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/firestore-counter/functions/package-lock.json b/firestore-counter/functions/package-lock.json index eaf374f9e..2a84b349e 100644 --- a/firestore-counter/functions/package-lock.json +++ b/firestore-counter/functions/package-lock.json @@ -7,21 +7,21 @@ "name": "firestore-counter-functions", "license": "Apache-2.0", "dependencies": { - "@types/express-serve-static-core": "4.17.30", - "deep-equal": "^1.0.1", + "@types/express-serve-static-core": "4.19.5", + "deep-equal": "^2.2.3", "firebase-admin": "^12.1.0", "firebase-functions": "^4.9.0", "rimraf": "^2.6.3", - "typescript": "^4.9.4", + "typescript": "^5.5.4", "uuid": "^3.3.2" }, "devDependencies": { "@types/deep-equal": "^1.0.1", "@types/jest": "29.5.0", + "@types/node": "^18.19.43", "jest": "29.5.0", - "prettier": "1.15.3", "ts-jest": "29.1.2", - "ts-node": "^7.0.1", + "ts-node": "^10.9.2", "wait-for-expect": "^3.0.2" } }, @@ -628,8 +628,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -642,8 +640,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -944,17 +940,6 @@ "concat-map": "0.0.1" } }, - "node_modules/@jest/core/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/@jest/core/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1032,62 +1017,6 @@ "node": "*" } }, - "node_modules/@jest/core/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -1493,33 +1422,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -1611,23 +1532,14 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/graceful-fs": { @@ -1693,9 +1605,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", "dependencies": { "undici-types": "~5.26.4" } @@ -1722,6 +1634,20 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", @@ -1787,8 +1713,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1801,8 +1725,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1875,9 +1797,22 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true, - "peer": true + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/array-flatten": { "version": "1.1.1", @@ -1908,6 +1843,20 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "optional": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2463,17 +2412,6 @@ "concat-map": "0.0.1" } }, - "node_modules/create-jest/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/create-jest/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2551,69 +2489,11 @@ "node": "*" } }, - "node_modules/create-jest/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/create-jest/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2674,16 +2554,31 @@ } }, "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2723,10 +2618,11 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2781,9 +2677,9 @@ } }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -2897,6 +2793,25 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3212,6 +3127,14 @@ "@google-cloud/storage": "^7.7.0" } }, + "node_modules/firebase-admin/node_modules/@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/firebase-admin/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -3251,6 +3174,14 @@ "@types/serve-static": "*" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -3523,6 +3454,14 @@ "node": ">=14.0.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3566,11 +3505,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3741,6 +3680,19 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -3764,12 +3716,64 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -3814,6 +3818,17 @@ "node": ">=6" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3823,6 +3838,20 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -3838,6 +3867,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3850,6 +3904,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4036,17 +4149,6 @@ "concat-map": "0.0.1" } }, - "node_modules/jest-cli/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/jest-cli/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4124,62 +4226,6 @@ "node": "*" } }, - "node_modules/jest-cli/node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -5169,6 +5215,23 @@ "node": ">= 0.4" } }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -5356,6 +5419,14 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", @@ -5381,18 +5452,6 @@ "node": ">=10" } }, - "node_modules/prettier": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz", - "integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -5587,13 +5646,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -5851,6 +5911,20 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -5967,16 +6041,6 @@ "node": ">=0.10.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/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6003,6 +6067,17 @@ "node": ">= 0.8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -6352,46 +6427,46 @@ } }, "node_modules/ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "ts-node": "dist/bin.js" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ts-node/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-node/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, - "bin": { - "mkdirp": "bin/cmd.js" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "node_modules/tslib": { @@ -6444,15 +6519,15 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/undici-types": { @@ -6524,9 +6599,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -6614,7 +6687,57 @@ "node-which": "bin/node-which" }, "engines": { - "node": ">= 8" + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wrap-ansi": { @@ -6694,12 +6817,12 @@ } }, "node_modules/yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/yocto-queue": { @@ -7174,8 +7297,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -7185,8 +7306,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -7441,14 +7560,6 @@ "concat-map": "0.0.1" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -7501,37 +7612,6 @@ "requires": { "brace-expansion": "^1.1.7" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true } } }, @@ -7873,33 +7953,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@types/babel__core": { "version": "7.20.5", @@ -7988,28 +8060,17 @@ "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" - }, - "dependencies": { - "@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - } } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "@types/graceful-fs": { @@ -8075,9 +8136,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", "requires": { "undici-types": "~5.26.4" } @@ -8104,6 +8165,22 @@ "form-data": "^2.5.0" } }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + }, + "dependencies": { + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + } + } + }, "@types/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", @@ -8162,17 +8239,13 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "agent-base": { "version": "7.1.1", @@ -8221,9 +8294,16 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true, - "peer": true + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } }, "array-flatten": { "version": "1.1.1", @@ -8251,6 +8331,14 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "optional": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -8644,14 +8732,6 @@ "concat-map": "0.0.1" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8704,37 +8784,6 @@ "requires": { "brace-expansion": "^1.1.7" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true } } }, @@ -8742,9 +8791,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "cross-spawn": { "version": "7.0.3", @@ -8781,16 +8828,28 @@ "requires": {} }, "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" } }, "deep-extend": { @@ -8815,10 +8874,11 @@ } }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -8851,9 +8911,9 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diff-sequences": { @@ -8946,6 +9006,22 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -9194,6 +9270,14 @@ "uuid": "^9.0.0" }, "dependencies": { + "@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "requires": { + "undici-types": "~5.26.4" + } + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -9225,6 +9309,14 @@ } } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -9423,6 +9515,11 @@ "jws": "^4.0.0" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9448,11 +9545,11 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasown": { @@ -9572,6 +9669,16 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -9586,12 +9693,43 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, "is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -9621,12 +9759,25 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, "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 }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -9636,12 +9787,60 @@ "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "requires": { + "call-bind": "^1.0.7" + } + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "devOptional": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9779,14 +9978,6 @@ "concat-map": "0.0.1" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9839,37 +10030,6 @@ "requires": { "brace-expansion": "^1.1.7" } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true } } }, @@ -10663,6 +10823,17 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -10795,6 +10966,11 @@ "find-up": "^4.0.0" } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", @@ -10814,12 +10990,6 @@ "tunnel-agent": "^0.6.0" } }, - "prettier": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz", - "integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==", - "dev": true - }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -10965,13 +11135,14 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "require-directory": { @@ -11158,6 +11329,17 @@ "has-property-descriptors": "^1.0.2" } }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11228,16 +11410,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "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" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -11258,6 +11430,14 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -11514,36 +11694,24 @@ } }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" } }, "tslib": { @@ -11581,9 +11749,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==" }, "undici-types": { "version": "5.26.5", @@ -11624,9 +11792,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "v8-to-istanbul": { "version": "9.2.0", @@ -11699,6 +11865,41 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11758,9 +11959,9 @@ "devOptional": true }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { diff --git a/firestore-counter/functions/package.json b/firestore-counter/functions/package.json index c1c95c424..a6ec987c5 100644 --- a/firestore-counter/functions/package.json +++ b/firestore-counter/functions/package.json @@ -5,22 +5,22 @@ "license": "Apache-2.0", "description": "Auto-scalable counters for your app.", "dependencies": { - "deep-equal": "^1.0.1", + "@types/express-serve-static-core": "4.19.5", + "deep-equal": "^2.2.3", "firebase-admin": "^12.1.0", "firebase-functions": "^4.9.0", - "uuid": "^3.3.2", "rimraf": "^2.6.3", - "typescript": "^4.9.4", - "@types/express-serve-static-core": "4.17.30" + "typescript": "^5.5.4", + "uuid": "^3.3.2" }, "devDependencies": { "@types/deep-equal": "^1.0.1", - "prettier": "1.15.3", - "ts-node": "^7.0.1", - "wait-for-expect": "^3.0.2", "@types/jest": "29.5.0", + "@types/node": "^18.19.43", "jest": "29.5.0", - "ts-jest": "29.1.2" + "ts-jest": "29.1.2", + "ts-node": "^10.9.2", + "wait-for-expect": "^3.0.2" }, "scripts": { "prepare": "npm run build", diff --git a/firestore-counter/stress_test/bin/package.json b/firestore-counter/stress_test/bin/package.json index 02162f7fb..f1e45a46c 100644 --- a/firestore-counter/stress_test/bin/package.json +++ b/firestore-counter/stress_test/bin/package.json @@ -3,14 +3,13 @@ "author": "patryk@google.com", "description": "Stress test for sharded counter.", "dependencies": { - "@google-cloud/firestore": "^1.3.0", - "@types/uuid": "^3.4.4", + "@google-cloud/firestore": "^7.9.0", "firebase-admin": "^11.4.1", - "uuid": "^3.3.2" + "uuid": "^10.0.0" }, "devDependencies": { - "prettier": "1.15.3", - "typescript": "^3.5.2" + "@types/uuid": "^10.0.0", + "typescript": "^5.5.4" }, "scripts": { "build": "tsc", diff --git a/firestore-send-email/functions/package-lock.json b/firestore-send-email/functions/package-lock.json index 37f168f0a..be97cd62d 100644 --- a/firestore-send-email/functions/package-lock.json +++ b/firestore-send-email/functions/package-lock.json @@ -1,6 +1,6 @@ { "name": "firestore-send-email-functions", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -13,8 +13,7 @@ "firebase-admin": "^12.1.0", "firebase-functions": "^4.9.0", "handlebars": "^4.5.3", - "nodemailer": "^6.9.13", - "nodemailer-sendgrid": "^1.0.3", + "nodemailer": "^6.9.14", "rimraf": "^2.6.3", "smtp-server": "^3.13.4", "typescript": "^4.8.4", @@ -30,11999 +29,721 @@ "ts-jest": "29.1.2" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, + "../../node_modules/.pnpm/@types+express-serve-static-core@4.17.30/node_modules/@types/express-serve-static-core": { + "version": "4.17.30", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "../../node_modules/.pnpm/@types+jest@29.5.0/node_modules/@types/jest": { + "version": "29.5.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node": { + "version": "20.14.14", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "../../node_modules/.pnpm/@types+nodemailer-sendgrid@1.0.3/node_modules/@types/nodemailer-sendgrid": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "@types/nodemailer": "*" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/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/.pnpm/@types+nodemailer@6.4.15/node_modules/@types/nodemailer": { + "version": "6.4.15", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "../../node_modules/.pnpm/concurrently@7.6.0/node_modules/concurrently": { + "version": "7.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "devDependencies": { + "@hirez_io/observer-spy": "^2.2.0", + "@swc/core": "^1.2.224", + "@swc/jest": "^0.2.21", + "@types/jest": "^28.1.8", + "@types/lodash": "^4.14.178", + "@types/node": "^16.11.47", + "@types/shell-quote": "^1.7.1", + "@types/supports-color": "^8.1.1", + "@types/yargs": "^17.0.11", + "@typescript-eslint/eslint-plugin": "^5.33.0", + "@typescript-eslint/parser": "^5.33.0", + "coveralls-next": "^4.1.2", + "ctrlc-wrapper": "^0.0.4", + "esbuild": "^0.15.1", + "eslint": "^8.21.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jest": "^27.0.4", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-simple-import-sort": "^8.0.0", + "jest": "^28.1.3", + "jest-create-mock-instance": "^2.0.0", + "lint-staged": "^12.4.1", + "prettier": "^2.6.2", + "simple-git-hooks": "^2.7.0", + "string-argv": "^0.3.1", + "typescript": "~4.9.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, + "../../node_modules/.pnpm/firebase-admin@12.3.0/node_modules/firebase-admin": { + "version": "12.3.0", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@fastify/busboy": "^3.0.0", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", + "farmhash-modern": "^1.1.0", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.1.0", + "node-forge": "^1.3.1", + "uuid": "^10.0.0" + }, + "devDependencies": { + "@firebase/api-documenter": "^0.4.0", + "@firebase/app-compat": "^0.2.1", + "@firebase/auth-compat": "^0.4.1", + "@firebase/auth-types": "^0.12.0", + "@microsoft/api-extractor": "^7.11.2", + "@types/bcrypt": "^5.0.0", + "@types/chai": "^4.0.0", + "@types/chai-as-promised": "^7.1.0", + "@types/firebase-token-generator": "^2.0.28", + "@types/jsonwebtoken": "8.5.1", + "@types/lodash": "^4.14.104", + "@types/minimist": "^1.2.2", + "@types/mocha": "^10.0.0", + "@types/nock": "^11.1.0", + "@types/request": "^2.47.0", + "@types/request-promise": "^4.1.41", + "@types/sinon": "^17.0.2", + "@types/sinon-chai": "^3.0.0", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "bcrypt": "^5.0.0", + "chai": "^4.2.0", + "chai-as-promised": "^7.0.0", + "chai-exclude": "^2.1.0", + "chalk": "^4.1.1", + "child-process-promise": "^2.2.1", + "del": "^6.0.0", + "eslint": "^8.12.0", + "firebase-token-generator": "^2.0.0", + "gulp": "^5.0.0", + "gulp-filter": "^7.0.0", + "gulp-header": "^2.0.9", + "gulp-typescript": "^5.0.1", + "http-message-parser": "^0.0.34", + "lodash": "^4.17.15", + "minimist": "^1.2.6", + "mocha": "^10.0.0", + "mz": "^2.7.0", + "nock": "^13.0.0", + "npm-run-all": "^4.1.5", + "nyc": "^17.0.0", + "request": "^2.75.0", + "request-promise": "^4.1.1", + "run-sequence": "^2.2.1", + "sinon": "^18.0.0", + "sinon-chai": "^3.0.0", + "ts-node": "^10.2.0", + "typescript": "5.1.6", + "yargs": "^17.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.7.0", + "@google-cloud/storage": "^7.7.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "../../node_modules/.pnpm/firebase-functions-test@0.2.3_firebase-admin@12.3.0_firebase-functions@4.9.0_firebase-admin@12.3.0_/node_modules/firebase-functions-test": { + "version": "0.2.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@types/lodash": "^4.14.104", + "lodash": "^4.17.5" + }, + "devDependencies": { + "@types/chai": "~4.2.4", + "@types/mocha": "^5.2.7", + "chai": "^4.2.0", + "firebase-admin": "~8.9.0", + "firebase-functions": "^3.3.0", + "firebase-tools": "^8.9.2", + "mocha": "^6.2.2", + "prettier": "^1.19.1", + "sinon": "^7.5.0", + "tslint": "^5.20.0", + "typescript": "^3.6.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=8.0.0" + }, + "peerDependencies": { + "firebase-admin": ">=6.0.0", + "firebase-functions": ">=2.0.0" } }, - "node_modules/@babel/helper-compilation-targets/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, + "../../node_modules/.pnpm/firebase-functions@4.9.0_firebase-admin@12.3.0/node_modules/firebase-functions": { + "version": "4.9.0", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/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, + "@types/cors": "^2.8.5", + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "protobufjs": "^7.2.2" + }, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/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/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "firebase-functions": "lib/bin/firebase-functions.js" }, - "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" + "devDependencies": { + "@firebase/api-documenter": "^0.2.0", + "@microsoft/api-documenter": "^7.13.45", + "@microsoft/api-extractor": "^7.18.7", + "@types/chai": "^4.1.7", + "@types/chai-as-promised": "^7.1.0", + "@types/jsonwebtoken": "^9.0.0", + "@types/mocha": "^5.2.7", + "@types/mock-require": "^2.0.0", + "@types/nock": "^10.0.3", + "@types/node": "^14.18.24", + "@types/node-fetch": "^3.0.3", + "@types/sinon": "^7.0.13", + "@typescript-eslint/eslint-plugin": "^5.33.1", + "@typescript-eslint/parser": "^5.33.1", + "api-extractor-model-me": "^0.1.1", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "child-process-promise": "^2.2.1", + "eslint": "^8.6.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-jsdoc": "^39.2.9", + "eslint-plugin-prettier": "^4.0.0", + "firebase-admin": "^12.0.0", + "js-yaml": "^3.13.1", + "jsdom": "^16.2.1", + "jsonwebtoken": "^9.0.0", + "jwk-to-pem": "^2.0.5", + "mocha": "^10.2.0", + "mock-require": "^3.0.3", + "mz": "^2.7.0", + "nock": "^13.2.9", + "node-fetch": "^2.6.7", + "portfinder": "^1.0.28", + "prettier": "^2.7.1", + "protobufjs-cli": "^1.1.1", + "semver": "^7.3.5", + "sinon": "^7.3.2", + "ts-node": "^10.4.0", + "typescript": "^4.3.5", + "yargs": "^15.3.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.10.0" + }, + "peerDependencies": { + "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, + "../../node_modules/.pnpm/handlebars@4.7.8/node_modules/handlebars": { + "version": "4.7.8", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "devDependencies": { + "@playwright/test": "^1.17.1", + "aws-sdk": "^2.1.49", + "babel-loader": "^5.0.0", + "babel-runtime": "^5.1.10", + "benchmark": "~1.0", + "chai": "^4.2.0", + "chai-diff": "^1.0.1", + "concurrently": "^5.0.0", + "dirty-chai": "^2.0.1", + "dtslint": "^0.5.5", + "dustjs-linkedin": "^2.0.2", + "eco": "~1.1.0-rc-3", + "eslint": "^6.7.2", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-compat": "^3.13.0", + "eslint-plugin-es5": "^1.4.1", + "fs-extra": "^8.1.0", + "grunt": "^1.0.4", + "grunt-babel": "^5.0.0", + "grunt-cli": "^1", + "grunt-contrib-clean": "^1", + "grunt-contrib-concat": "^1", + "grunt-contrib-connect": "^1", + "grunt-contrib-copy": "^1", + "grunt-contrib-requirejs": "^1", + "grunt-contrib-uglify": "^1", + "grunt-contrib-watch": "^1.1.0", + "grunt-shell": "^4.0.0", + "grunt-webpack": "^1.0.8", + "husky": "^3.1.0", + "jison": "~0.3.0", + "lint-staged": "^9.5.0", + "mocha": "^5", + "mock-stdin": "^0.3.0", + "mustache": "^2.1.3", + "nyc": "^14.1.1", + "prettier": "^1.19.1", + "semver": "^5.0.1", + "sinon": "^7.5.0", + "typescript": "^3.4.3", + "underscore": "^1.5.1", + "webpack": "^1.12.6", + "webpack-dev-server": "^1.12.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "../../node_modules/.pnpm/jest@29.5.0_@types+node@20.14.14_ts-node@10.9.2_@types+node@20.14.14_typescript@4.9.5_/node_modules/jest": { + "version": "29.5.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "devDependencies": { + "@tsd/typescript": "^4.9.0", + "tsd-lite": "^0.6.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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==", + "../../node_modules/.pnpm/mocked-env@1.3.5/node_modules/mocked-env": { + "version": "1.3.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "check-more-types": "2.24.0", + "debug": "4.3.2", + "lazy-ass": "1.6.0", + "ramda": "0.27.1" + }, + "devDependencies": { + "ban-sensitive-files": "1.9.15", + "dependency-check": "4.1.0", + "deps-ok": "1.4.1", + "git-issues": "1.3.1", + "license-checker": "20.2.0", + "mocha": "7.2.0", + "prettier-standard": "9.1.1", + "semantic-release": "17.4.4", + "standard": "11.0.1", + "stop-only": "3.1.0", + "travis-deploy-once": "5.0.11" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "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, + "../../node_modules/.pnpm/nodemailer-sendgrid@1.0.3/node_modules/nodemailer-sendgrid": { + "version": "1.0.3", + "extraneous": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@sendgrid/mail": "^6.2.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "devDependencies": { + "eslint-config-nodemailer": "^1.2.0", + "grunt": "^1.0.2", + "grunt-eslint": "^20.1.0", + "nodemailer": "^4.6.3" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, + "../../node_modules/.pnpm/nodemailer@6.9.14/node_modules/nodemailer": { + "version": "6.9.14", + "license": "MIT-0", + "devDependencies": { + "@aws-sdk/client-ses": "3.600.0", + "bunyan": "1.8.15", + "c8": "10.1.2", + "eslint": "8.57.0", + "eslint-config-nodemailer": "1.2.0", + "eslint-config-prettier": "9.1.0", + "libbase64": "1.3.0", + "libmime": "5.3.5", + "libqp": "2.1.0", + "nodemailer-ntlm-auth": "1.0.4", + "proxy": "1.0.2", + "proxy-test-server": "1.0.0", + "smtp-server": "3.13.4" + }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "../../node_modules/.pnpm/rimraf@2.7.1/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^12.1.1" } }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, + "../../node_modules/.pnpm/smtp-server@3.13.4/node_modules/smtp-server": { + "version": "3.13.4", + "license": "MIT-0", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "base32.js": "0.1.0", + "ipv6-normalize": "1.0.1", + "nodemailer": "6.9.13", + "punycode": "2.3.1" + }, + "devDependencies": { + "chai": "4.4.1", + "eslint-config-nodemailer": "1.2.0", + "eslint-config-prettier": "9.1.0", + "grunt": "1.6.1", + "grunt-cli": "1.4.3", + "grunt-eslint": "24.3.0", + "grunt-mocha-test": "0.13.3", + "mocha": "10.4.0", + "pem": "1.14.8" }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "../../node_modules/.pnpm/ts-jest@29.1.2_@babel+core@7.25.2_@jest+types@29.6.3_babel-jest@29.7.0_@babel+core@7.25.2__je_5ytjyom5p66nqjwysjtf4wlo7q/node_modules/ts-jest": { + "version": "29.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "devDependencies": { + "@commitlint/cli": "17.x", + "@commitlint/config-angular": "^17.6.5", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__core": "7.x", + "@types/cross-spawn": "latest", + "@types/fs-extra": "latest", + "@types/js-yaml": "latest", + "@types/lodash.camelcase": "4.x", + "@types/lodash.memoize": "4.x", + "@types/lodash.set": "4.x", + "@types/micromatch": "4.x", + "@types/node": "18.16.18", + "@types/react": "18.x", + "@types/rimraf": "^3.0.2", + "@types/semver": "latest", + "@types/yargs": "latest", + "@types/yargs-parser": "21.x", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "babel-jest": "^29.5.0", + "conventional-changelog-cli": "2.x", + "cross-spawn": "latest", + "esbuild": "~0.17.19", + "eslint": "^8.42.0", + "eslint-config-prettier": "latest", + "eslint-plugin-import": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prefer-arrow": "latest", + "eslint-plugin-prettier": "latest", + "execa": "5.1.1", + "fs-extra": "11.x", + "glob": "^10.2.6", + "glob-gitignore": "latest", + "husky": "4.x", + "jest": "^29.5.0", + "jest-snapshot-serializer-raw": "^1.2.0", + "js-yaml": "latest", + "json-schema-to-typescript": "^13.0.2", + "lint-staged": "latest", + "lodash.camelcase": "^4.3.0", + "lodash.set": "^4.3.2", + "node-fetch": "^3.3.2", + "prettier": "^2.8.8", + "typescript": "~5.1.3" }, "engines": { - "node": ">=6.9.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "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" + "../../node_modules/.pnpm/typescript@4.9.5/node_modules/typescript": { + "version": "4.9.5", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "devDependencies": { + "@octokit/rest": "latest", + "@types/chai": "latest", + "@types/fancy-log": "^2.0.0", + "@types/fs-extra": "^9.0.13", + "@types/glob": "latest", + "@types/gulp": "^4.0.9", + "@types/gulp-concat": "latest", + "@types/gulp-newer": "latest", + "@types/gulp-rename": "latest", + "@types/gulp-sourcemaps": "latest", + "@types/merge2": "latest", + "@types/microsoft__typescript-etw": "latest", + "@types/minimist": "latest", + "@types/mkdirp": "latest", + "@types/mocha": "latest", + "@types/ms": "latest", + "@types/node": "latest", + "@types/source-map-support": "latest", + "@types/which": "^2.0.1", + "@types/xml2js": "^0.4.11", + "@typescript-eslint/eslint-plugin": "^5.33.1", + "@typescript-eslint/parser": "^5.33.1", + "@typescript-eslint/utils": "^5.33.1", + "azure-devops-node-api": "^11.2.0", + "chai": "latest", + "chalk": "^4.1.2", + "del": "^6.1.1", + "diff": "^5.1.0", + "eslint": "^8.22.0", + "eslint-formatter-autolinkable-stylish": "^1.2.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsdoc": "^39.3.6", + "eslint-plugin-local": "^1.0.0", + "eslint-plugin-no-null": "^1.0.2", + "fancy-log": "latest", + "fs-extra": "^9.1.0", + "glob": "latest", + "gulp": "^4.0.2", + "gulp-concat": "latest", + "gulp-insert": "latest", + "gulp-newer": "latest", + "gulp-rename": "latest", + "gulp-sourcemaps": "latest", + "merge2": "latest", + "minimist": "latest", + "mkdirp": "latest", + "mocha": "latest", + "mocha-fivemat-progress-reporter": "latest", + "ms": "^2.1.3", + "node-fetch": "^3.2.10", + "source-map-support": "latest", + "typescript": "^4.8.4", + "vinyl": "latest", + "which": "^2.0.2", + "xml2js": "^0.4.23" }, "engines": { - "node": ">=4" + "node": ">=4.2.0" } }, - "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, + "../../node_modules/.pnpm/wait-on@7.2.0/node_modules/wait-on": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "devDependencies": { + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-chai-friendly": "^0.7.2", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.2.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "expect-legacy": "^1.20.2", + "mkdirp": "^1.0.4", + "mocha": "^10.2.0", + "temp": "^0.9.4" }, "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, - "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/@types/express-serve-static-core": { + "resolved": "../../node_modules/.pnpm/@types+express-serve-static-core@4.17.30/node_modules/@types/express-serve-static-core", + "link": true }, - "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/@types/jest": { + "resolved": "../../node_modules/.pnpm/@types+jest@29.5.0/node_modules/@types/jest", + "link": 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/@types/node": { + "resolved": "../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node", + "link": true }, - "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.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "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-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "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-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.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-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-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", - "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" - }, - "node_modules/@firebase/app-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", - "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", - "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" - }, - "node_modules/@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "dependencies": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", - "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", - "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", - "dependencies": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", - "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", - "dependencies": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.10.0.tgz", - "integrity": "sha512-aBNejLVzHpI7C8eJSMpBpfdq1lxvYuHqG+zy/xvs032RyPRxuu45DLMeXuAbgwyx1VBsxWGYifrPDx+O7hJrmw==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/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==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", - "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "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/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/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/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/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/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/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "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.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "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/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sendgrid/client": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.5.5.tgz", - "integrity": "sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==", - "dependencies": { - "@sendgrid/helpers": "^6.5.5", - "@types/request": "^2.48.4", - "request": "^2.88.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@sendgrid/helpers": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.5.5.tgz", - "integrity": "sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==", - "dependencies": { - "chalk": "^2.0.1", - "deepmerge": "^4.2.2" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sendgrid/helpers/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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/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==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@sendgrid/helpers/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==" - }, - "node_modules/@sendgrid/helpers/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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@sendgrid/helpers/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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/helpers/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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@sendgrid/mail": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.5.5.tgz", - "integrity": "sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==", - "dependencies": { - "@sendgrid/client": "^6.5.5", - "@sendgrid/helpers": "^6.5.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "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/@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==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", - "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/nodemailer": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==", - "dev": true, - "dependencies": { - "@types/nodemailer": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "devOptional": 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==", - "devOptional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==" - }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "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.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "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/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "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/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/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "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/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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==", - "devOptional": 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==", - "devOptional": true - }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/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/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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==", - "devOptional": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "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-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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/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/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, - "engines": { - "node": ">=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==" - }, - "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==" - }, - "node_modules/fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "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/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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/firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", - "dependencies": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/firebase-functions": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", - "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "node_modules/firebase-functions-test": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.3.tgz", - "integrity": "sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==", - "dev": true, - "dependencies": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "firebase-admin": ">=6.0.0", - "firebase-functions": ">=2.0.0" - } - }, - "node_modules/firebase-functions/node_modules/@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "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==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "optional": true - }, - "node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "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/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "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/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "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==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "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/ipv6-normalize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", - "integrity": "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==" - }, - "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-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": 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==" - }, - "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/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "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.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/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/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/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/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/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/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/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/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "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": "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/js-yaml/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/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "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-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "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 - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "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/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", - "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "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/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "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/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/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "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 - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "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/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.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==", - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mocked-env": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", - "integrity": "sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==", - "dev": true, - "dependencies": { - "check-more-types": "2.24.0", - "debug": "4.3.2", - "lazy-ass": "1.6.0", - "ramda": "0.27.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocked-env/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/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "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/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "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==" - }, - "node_modules/node-abi": { - "version": "3.59.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz", - "integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nodemailer": { - "version": "6.9.13", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", - "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==", - "dependencies": { - "@sendgrid/mail": "^6.2.1" - } - }, - "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/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "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==", - "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==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "devOptional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/p-locate/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/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/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "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/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "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/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "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==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "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==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/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==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "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/smtp-server": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/smtp-server/-/smtp-server-3.13.4.tgz", - "integrity": "sha512-BbElv5UP+HgPtCZtcRW35N/GFoc4DzPkrbSMLioXsrVMmQT1mMBoO0k+egl264hxWaWczoVvadSPY2pLUINFXg==", - "dependencies": { - "base32.js": "0.1.0", - "ipv6-normalize": "1.0.1", - "nodemailer": "6.9.13", - "punycode": "2.3.1" - }, - "engines": { - "node": ">=12.0.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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "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/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "devOptional": 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==", - "devOptional": 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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "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/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/test-exclude/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/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/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/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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-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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "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.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "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/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.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==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "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==", - "devOptional": 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==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true - }, - "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "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" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@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-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true - }, - "@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-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.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.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.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true - }, - "@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-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "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-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.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-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-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" - }, - "@firebase/app-check-interop-types": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", - "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" - }, - "@firebase/app-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", - "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" - }, - "@firebase/auth-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", - "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" - }, - "@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "requires": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "@firebase/database": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", - "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", - "requires": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "@firebase/database-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", - "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", - "requires": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "@firebase/database-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", - "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", - "requires": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - } - }, - "@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - } - }, - "@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "requires": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - } - }, - "@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true - }, - "@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true - }, - "@google-cloud/storage": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.10.0.tgz", - "integrity": "sha512-aBNejLVzHpI7C8eJSMpBpfdq1lxvYuHqG+zy/xvs032RyPRxuu45DLMeXuAbgwyx1VBsxWGYifrPDx+O7hJrmw==", - "optional": true, - "requires": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - } - } - }, - "@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, - "requires": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - } - }, - "@grpc/proto-loader": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", - "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", - "optional": true, - "requires": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@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" - } - }, - "@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 - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - } - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@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 - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sendgrid/client": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.5.5.tgz", - "integrity": "sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==", - "requires": { - "@sendgrid/helpers": "^6.5.5", - "@types/request": "^2.48.4", - "request": "^2.88.0" - } - }, - "@sendgrid/helpers": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.5.5.tgz", - "integrity": "sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==", - "requires": { - "chalk": "^2.0.1", - "deepmerge": "^4.2.2" - }, - "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==", - "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==", - "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==", - "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==" - }, - "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==" - }, - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@sendgrid/mail": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.5.5.tgz", - "integrity": "sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==", - "requires": { - "@sendgrid/client": "^6.5.5", - "@sendgrid/helpers": "^6.5.5" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "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" - } - }, - "@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==", - "optional": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==" - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", - "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.31", - "@types/qs": "*", - "@types/serve-static": "*" - }, - "dependencies": { - "@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - } - } - }, - "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/nodemailer": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==", - "requires": { - "@types/node": "*" - } - }, - "@types/nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==", - "dev": true, - "requires": { - "@types/nodemailer": "*" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - }, - "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "requires": { - "debug": "^4.3.4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.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==" - }, - "base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "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" - } - }, - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "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 - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "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" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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==", - "devOptional": 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==", - "devOptional": 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==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.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" - } - } - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "requires": {} - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==" - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "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==", - "devOptional": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "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-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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 - }, - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "requires": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - } - }, - "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==" - }, - "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==" - }, - "fast-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.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" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "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" - } - }, - "firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", - "requires": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - } - }, - "firebase-functions": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", - "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", - "requires": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "dependencies": { - "@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - } - } - }, - "firebase-functions-test": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.3.tgz", - "integrity": "sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==", - "dev": true, - "requires": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5" - } - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "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==", - "optional": true - }, - "gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "requires": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - } - }, - "gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "requires": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - } - }, - "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==", - "devOptional": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "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 - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "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 - }, - "google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "requires": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - } - }, - "google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "requires": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "requires": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - } - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.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-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "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 - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "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==", - "optional": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "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==", - "optional": true, - "requires": { - "debug": "4" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "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==", - "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==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "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==" - }, - "ipv6-normalize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", - "integrity": "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==" - }, - "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-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "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==", - "devOptional": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "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 - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.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.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "dependencies": { - "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" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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" - } - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==" - }, - "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": "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" - }, - "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" - } - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "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 - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - } - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", - "requires": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "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 - }, - "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" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", - "requires": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - } - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "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 - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "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" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "mocked-env": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", - "integrity": "sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==", - "dev": true, - "requires": { - "check-more-types": "2.24.0", - "debug": "4.3.2", - "lazy-ass": "1.6.0", - "ramda": "0.27.1" - }, - "dependencies": { - "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" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "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==" - }, - "node-abi": { - "version": "3.59.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz", - "integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==", - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "nodemailer": { - "version": "6.9.13", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", - "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==" - }, - "nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==", - "requires": { - "@sendgrid/mail": "^6.2.1" - } - }, - "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 - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "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==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.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==", - "devOptional": true, - "requires": { - "yocto-queue": "^0.1.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" - }, - "dependencies": { - "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-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 - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "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==" - }, - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "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 - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "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" - } - }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "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" - } - }, - "proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "requires": { - "protobufjs": "^7.2.5" - } - }, - "protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "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==", - "devOptional": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.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 - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true - }, - "retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "requires": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "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 - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.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 - }, - "smtp-server": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/smtp-server/-/smtp-server-3.13.4.tgz", - "integrity": "sha512-BbElv5UP+HgPtCZtcRW35N/GFoc4DzPkrbSMLioXsrVMmQT1mMBoO0k+egl264hxWaWczoVvadSPY2pLUINFXg==", - "requires": { - "base32.js": "0.1.0", - "ipv6-normalize": "1.0.1", - "nodemailer": "6.9.13", - "punycode": "2.3.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "requires": { - "stubs": "^3.0.0" - } - }, - "stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.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==", - "devOptional": 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==", - "devOptional": 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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "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 - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "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 - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "requires": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "dependencies": { - "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==", - "optional": true, - "requires": { - "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==", - "optional": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - } - } - }, - "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" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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-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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "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.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - }, - "v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - } - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", - "requires": { - "axios": "^1.6.1", - "joi": "^17.11.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.1" - } + "node_modules/@types/nodemailer": { + "resolved": "../../node_modules/.pnpm/@types+nodemailer@6.4.15/node_modules/@types/nodemailer", + "link": true }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } + "node_modules/@types/nodemailer-sendgrid": { + "resolved": "../../node_modules/.pnpm/@types+nodemailer-sendgrid@1.0.3/node_modules/@types/nodemailer-sendgrid", + "link": true }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true + "node_modules/concurrently": { + "resolved": "../../node_modules/.pnpm/concurrently@7.6.0/node_modules/concurrently", + "link": true }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } + "node_modules/firebase-admin": { + "resolved": "../../node_modules/.pnpm/firebase-admin@12.3.0/node_modules/firebase-admin", + "link": true }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "node_modules/firebase-functions": { + "resolved": "../../node_modules/.pnpm/firebase-functions@4.9.0_firebase-admin@12.3.0/node_modules/firebase-functions", + "link": true }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "node_modules/firebase-functions-test": { + "resolved": "../../node_modules/.pnpm/firebase-functions-test@0.2.3_firebase-admin@12.3.0_firebase-functions@4.9.0_firebase-admin@12.3.0_/node_modules/firebase-functions-test", + "link": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "node_modules/handlebars": { + "resolved": "../../node_modules/.pnpm/handlebars@4.7.8/node_modules/handlebars", + "link": 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==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } + "node_modules/jest": { + "resolved": "../../node_modules/.pnpm/jest@29.5.0_@types+node@20.14.14_ts-node@10.9.2_@types+node@20.14.14_typescript@4.9.5_/node_modules/jest", + "link": true }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "node_modules/mocked-env": { + "resolved": "../../node_modules/.pnpm/mocked-env@1.3.5/node_modules/mocked-env", + "link": true }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } + "node_modules/nodemailer": { + "resolved": "../../node_modules/.pnpm/nodemailer@6.9.14/node_modules/nodemailer", + "link": true }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true + "node_modules/rimraf": { + "resolved": "../../node_modules/.pnpm/rimraf@2.7.1/node_modules/rimraf", + "link": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/smtp-server": { + "resolved": "../../node_modules/.pnpm/smtp-server@3.13.4/node_modules/smtp-server", + "link": true }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } + "node_modules/ts-jest": { + "resolved": "../../node_modules/.pnpm/ts-jest@29.1.2_@babel+core@7.25.2_@jest+types@29.6.3_babel-jest@29.7.0_@babel+core@7.25.2__je_5ytjyom5p66nqjwysjtf4wlo7q/node_modules/ts-jest", + "link": true }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true + "node_modules/typescript": { + "resolved": "../../node_modules/.pnpm/typescript@4.9.5/node_modules/typescript", + "link": true }, - "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==", - "devOptional": true + "node_modules/wait-on": { + "resolved": "../../node_modules/.pnpm/wait-on@7.2.0/node_modules/wait-on", + "link": true } } } diff --git a/firestore-send-email/functions/package.json b/firestore-send-email/functions/package.json index a0abe55c7..8f29494bc 100644 --- a/firestore-send-email/functions/package.json +++ b/firestore-send-email/functions/package.json @@ -3,7 +3,6 @@ "description": "", "main": "lib/index.js", "scripts": { - "prepare": "npm run build", "build": "npm run clean && npm run compile", "build:watch": "npm run clean && tsc --watch", "clean": "rimraf lib", @@ -25,20 +24,19 @@ "firebase-admin": "^12.1.0", "firebase-functions": "^4.9.0", "handlebars": "^4.5.3", - "nodemailer": "^6.9.13", - "nodemailer-sendgrid": "^1.0.3", + "nodemailer": "^6.9.14", "rimraf": "^2.6.3", "smtp-server": "^3.13.4", "typescript": "^4.8.4", "wait-on": "^7.2.0" }, "devDependencies": { + "@types/jest": "29.5.0", "@types/nodemailer-sendgrid": "^1.0.3", "concurrently": "^7.2.1", "firebase-functions-test": "^0.2.3", - "mocked-env": "^1.3.2", - "@types/jest": "29.5.0", "jest": "29.5.0", + "mocked-env": "^1.3.2", "ts-jest": "29.1.2" }, "private": true diff --git a/lerna.json b/lerna.json deleted file mode 100644 index f2594cd33..000000000 --- a/lerna.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "packages": [ - "*", - "firestore-translate-text/functions", - "rtdb-limit-child-nodes/functions", - "firestore-shorten-urls-bitly/functions", - "auth-mailchimp-sync/functions", - "firestore-send-email/functions", - "firestore-counter/functions", - "delete-user-data/functions", - "delete-user-data/test-data", - "storage-resize-images/functions", - "firestore-bigquery-export/functions", - "firestore-bigquery-export/scripts/gen-schema-view", - "firestore-bigquery-export/scripts/import", - "firestore-bigquery-export/firestore-bigquery-change-tracker" - ], - "version": "0.0.0" -} diff --git a/package-lock.json b/package-lock.json index 5e4bd43be..4e99cec5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,19 +7,18 @@ "": { "name": "firebase-extensions", "version": "1.0.0", - "hasInstallScript": true, "license": "Apache-2.0", "devDependencies": { "@types/jest": "29.5.0", - "codecov": "^3.8.1", - "concurrently": "^7.2.1", - "husky": "^7.0.4", + "@types/node": "^22.1.0", + "codecov": "^3.8.2", + "concurrently": "^8.2.2", + "husky": "^9.1.4", "jest": "^29.7.0", - "lerna": "^3.4.3", - "lint-staged": "^12.4.0", - "prettier": "2.7.1", + "lint-staged": "^15.2.8", + "prettier": "3.3.3", "ts-jest": "29.1.2", - "typescript": "^4.8.4" + "typescript": "^5.5.4" } }, "node_modules/@ampproject/remapping": { @@ -590,110 +589,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@evocateur/libnpmaccess": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", - "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0" - } - }, - "node_modules/@evocateur/libnpmpublish": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", - "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - } - }, - "node_modules/@evocateur/libnpmpublish/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/@evocateur/npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "JSONStream": "^1.3.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/@evocateur/pacote": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", - "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "bluebird": "^3.5.3", - "cacache": "^12.0.3", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.5.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^3.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.3", - "safe-buffer": "^5.2.0", - "semver": "^5.7.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - } - }, - "node_modules/@evocateur/pacote/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/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -710,61 +605,6 @@ "node": ">=8" } }, - "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/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-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/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/@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", @@ -791,15 +631,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/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/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -847,136 +678,6 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jest/core/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/@jest/core/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/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/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/@jest/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -1017,15 +718,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", @@ -1101,36 +793,6 @@ } } }, - "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -1187,15 +849,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/test-sequencer/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/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", @@ -1222,90 +875,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/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/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -1367,12213 +953,3240 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@lerna/add": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", - "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.21.0", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">= 6.9.0" + "type-detect": "4.0.8" } }, - "node_modules/@lerna/bootstrap": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", - "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/changed": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", - "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "dependencies": { - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">= 6" } }, - "node_modules/@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" - }, - "engines": { - "node": ">= 6.9.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" - }, - "engines": { - "node": ">= 6.9.0" + "@babel/types": "^7.0.0" } }, - "node_modules/@lerna/child-process/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==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@lerna/child-process/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==", + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@babel/types": "^7.20.7" } }, - "node_modules/@lerna/child-process/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==", + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@types/node": "*" } }, - "node_modules/@lerna/child-process/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==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, - "node_modules/@lerna/child-process/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/@lerna/child-process/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==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@lerna/clean": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", - "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@lerna/cli": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", - "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@types/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", "dev": true, "dependencies": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.2" - }, - "engines": { - "node": ">= 6.9.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@lerna/cli/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==", + "node_modules/@types/node": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "undici-types": "~6.13.0" } }, - "node_modules/@lerna/cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, - "node_modules/@lerna/cli/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==", + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@types/yargs-parser": "*" } }, - "node_modules/@lerna/cli/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==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/@lerna/cli/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@lerna/cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "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": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@lerna/cli/node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.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": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" + "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/@lerna/cli/node_modules/yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "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": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", + "node_modules/argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, - "dependencies": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=0.6.10" } }, - "node_modules/@lerna/collect-uncommitted/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==", + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/@lerna/collect-uncommitted/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==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@lerna/collect-uncommitted/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==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@lerna/collect-uncommitted/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/@lerna/collect-uncommitted/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==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@lerna/collect-uncommitted/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==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@lerna/collect-updates": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", - "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@lerna/command": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", - "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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/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": { - "@lerna/child-process": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/project": "3.21.0", - "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^1.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 6.9.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@lerna/conventional-commits": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", - "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 6.9.0" + "node": ">=8" } }, - "node_modules/@lerna/create": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", - "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "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": { - "@evocateur/pacote": "^9.6.3", - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "camelcase": "^5.0.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "globby": "^9.2.0", - "init-package-json": "^1.10.3", - "npm-package-arg": "^6.1.0", - "p-reduce": "^1.0.0", - "pify": "^4.0.1", - "semver": "^6.2.0", - "slash": "^2.0.0", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^7.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">= 6.9.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@lerna/create-symlink": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", - "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "dependencies": { - "@zkochan/cmd-shim": "^3.1.0", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2" + "fast-json-stable-stringify": "2.x" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 6" } }, - "node_modules/@lerna/create/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node-int64": "^0.4.0" } }, - "node_modules/@lerna/describe-ref": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", - "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=6" } }, - "node_modules/@lerna/diff": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", - "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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, - "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/validation-error": "3.13.0", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=6" } }, - "node_modules/@lerna/exec": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", - "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/caniuse-lite": { + "version": "1.0.30001610", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", + "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", "dev": true, - "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - }, - "engines": { - "node": ">= 6.9.0" - } + "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/@lerna/filter-options": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", - "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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": { - "@lerna/collect-updates": "3.20.0", - "@lerna/filter-packages": "3.18.0", - "dedent": "^0.7.0", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@lerna/filter-packages": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", - "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/chalk/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": { - "@lerna/validation-error": "3.13.0", - "multimatch": "^3.0.0", - "npmlog": "^4.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=8" } }, - "node_modules/@lerna/get-npm-exec-opts": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", - "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/get-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", - "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "fs-extra": "^8.1.0", - "ssri": "^6.0.1", - "tar": "^4.4.8" - } - }, - "node_modules/@lerna/github-client": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", - "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "dependencies": { - "@lerna/child-process": "3.16.5", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^16.28.4", - "git-url-parse": "^11.1.2", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=10" } }, - "node_modules/@lerna/gitlab-client": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", - "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "dependencies": { - "node-fetch": "^2.5.0", - "npmlog": "^4.1.2", - "whatwg-url": "^7.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/gitlab-client/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node": ">=8" } }, - "node_modules/@lerna/global-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", - "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">= 6.9.0" - } + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true }, - "node_modules/@lerna/has-npm-version": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", - "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "semver": "^6.2.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/import": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", - "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "p-map-series": "^1.0.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/info": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", - "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "@lerna/command": "3.21.0", - "@lerna/output": "3.13.0", - "envinfo": "^7.3.1" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@lerna/init": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", - "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0", - "write-json-file": "^3.2.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/link": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", - "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@lerna/command": "3.21.0", - "@lerna/package-graph": "3.18.5", - "@lerna/symlink-dependencies": "3.17.0", - "p-map": "^2.1.0", - "slash": "^2.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@lerna/list": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", - "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" } }, - "node_modules/@lerna/listable": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", - "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "dependencies": { - "@lerna/query-graph": "3.18.5", - "chalk": "^2.3.1", - "columnify": "^1.5.4" - }, "engines": { - "node": ">= 6.9.0" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/@lerna/listable/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==", + "node_modules/codecov": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", + "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", + "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "argv": "0.0.2", + "ignore-walk": "3.0.4", + "js-yaml": "3.14.1", + "teeny-request": "7.1.1", + "urlgrey": "1.0.0" + }, + "bin": { + "codecov": "bin/codecov" }, "engines": { - "node": ">=4" + "node": ">=4.0" } }, - "node_modules/@lerna/listable/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==", + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/@lerna/listable/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/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/@lerna/listable/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==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/@lerna/listable/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==", + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@lerna/listable/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==", + "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/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">=4" + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/@lerna/log-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", - "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "dependencies": { - "byte-size": "^5.0.1", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" }, "engines": { - "node": ">= 6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@lerna/npm-conf": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", - "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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": { - "config-chain": "^1.1.11", - "pify": "^4.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 8" } }, - "node_modules/@lerna/npm-dist-tag": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", - "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/cross-spawn/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/cross-spawn/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": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "@lerna/otplease": "3.18.5", - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 8" } }, - "node_modules/@lerna/npm-install": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", - "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.2", - "write-pkg": "^3.1.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/@lerna/npm-publish": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", - "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { - "@evocateur/libnpmpublish": "^1.2.2", - "@lerna/otplease": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "read-package-json": "^2.0.13" + "ms": "2.1.2" }, "engines": { - "node": ">= 6.9.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@lerna/npm-run-script": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", - "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/otplease": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", - "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, - "dependencies": { - "@lerna/prompt": "3.18.5", - "figgy-pudding": "^3.5.1" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" }, - "engines": { - "node": ">= 6.9.0" + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "node_modules/@lerna/output": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", - "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@lerna/pack-directory": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", - "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "dependencies": { - "@lerna/get-packed": "3.16.0", - "@lerna/package": "3.16.0", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "npm-packlist": "^1.4.4", - "npmlog": "^4.1.2", - "tar": "^4.4.10", - "temp-write": "^3.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/@lerna/package": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", - "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "dependencies": { - "load-json-file": "^5.3.0", - "npm-package-arg": "^6.1.0", - "write-pkg": "^3.1.0" - }, "engines": { - "node": ">= 6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@lerna/package-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", - "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/electron-to-chromium": { + "version": "1.4.736", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", + "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "dependencies": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/@lerna/prerelease-id-from-version": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", - "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "semver": "^6.2.0" - }, - "engines": { - "node": ">= 6.9.0" + "iconv-lite": "^0.6.2" } }, - "node_modules/@lerna/profiler": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", - "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/encoding/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, + "optional": true, + "peer": true, "dependencies": { - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "upath": "^1.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@lerna/project": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", - "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "dependencies": { - "@lerna/package": "3.16.0", - "@lerna/validation-error": "3.13.0", - "cosmiconfig": "^5.1.0", - "dedent": "^0.7.0", - "dot-prop": "^4.2.0", - "glob-parent": "^5.0.0", - "globby": "^9.2.0", - "load-json-file": "^5.3.0", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "resolve-from": "^4.0.0", - "write-json-file": "^3.2.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/prompt": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", - "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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": { - "inquirer": "^6.2.0", - "npmlog": "^4.1.2" - }, - "engines": { - "node": ">= 6.9.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/@lerna/publish": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", - "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@evocateur/libnpmaccess": "^3.1.2", - "@evocateur/npm-registry-fetch": "^4.0.0", - "@evocateur/pacote": "^9.6.3", - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/describe-ref": "3.16.5", - "@lerna/log-packed": "3.16.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/npm-dist-tag": "3.18.5", - "@lerna/npm-publish": "3.18.5", - "@lerna/otplease": "3.18.5", - "@lerna/output": "3.13.0", - "@lerna/pack-directory": "3.16.4", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.22.1", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/pulse-till-done": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", - "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=6" } }, - "node_modules/@lerna/query-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", - "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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, - "dependencies": { - "@lerna/package-graph": "3.18.5", - "figgy-pudding": "^3.5.1" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=0.8.0" } }, - "node_modules/@lerna/resolve-symlink": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", - "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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, - "dependencies": { - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^1.0.1" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 6.9.0" + "node": ">=4" } }, - "node_modules/@lerna/rimraf-dir": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", - "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2", - "path-exists": "^3.0.0", - "rimraf": "^2.6.2" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@lerna/run": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", - "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "dependencies": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-run-script": "3.16.5", - "@lerna/output": "3.13.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/timer": "3.13.0", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=16.17.0" } }, - "node_modules/@lerna/run-lifecycle": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", - "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "dependencies": { - "@lerna/npm-conf": "3.16.0", - "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^3.1.2", - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/run-topologically": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", - "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "@lerna/query-graph": "3.18.5", - "figgy-pudding": "^3.5.1", - "p-queue": "^4.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/symlink-binary": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", - "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "@lerna/create-symlink": "3.16.2", - "@lerna/package": "3.16.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/symlink-dependencies": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", - "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "dependencies": { - "@lerna/create-symlink": "3.16.2", - "@lerna/resolve-symlink": "3.16.0", - "@lerna/symlink-binary": "3.17.0", - "fs-extra": "^8.1.0", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/timer": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", - "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "engines": { - "node": ">= 6.9.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/validation-error": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", - "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/execa/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "dependencies": { - "npmlog": "^4.1.2" - }, "engines": { - "node": ">= 6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@lerna/version": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", - "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/conventional-commits": "3.22.0", - "@lerna/github-client": "3.22.0", - "@lerna/gitlab-client": "3.15.0", - "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "chalk": "^2.3.1", - "dedent": "^0.7.0", - "load-json-file": "^5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "p-reduce": "^1.0.0", - "p-waterfall": "^1.0.0", - "semver": "^6.2.0", - "slash": "^2.0.0", - "temp-write": "^3.4.0", - "write-json-file": "^3.2.0" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/@lerna/version/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==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/@lerna/version/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==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@lerna/version/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==", + "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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "punycode": "^1.3.2" } }, - "node_modules/@lerna/version/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==", + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, - "node_modules/@lerna/version/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==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "bser": "2.1.1" } }, - "node_modules/@lerna/version/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==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@lerna/write-log-file": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", - "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "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": { - "npmlog": "^4.1.2", - "write-file-atomic": "^2.3.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": ">=8" } }, - "node_modules/@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "engines": { - "node": ">=4" - } + "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/@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@octokit/core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", - "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "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, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" } }, - "node_modules/@octokit/core/node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "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, - "peer": true, "engines": { - "node": ">= 18" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@octokit/core/node_modules/@octokit/endpoint": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", - "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", - "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "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, - "peer": true + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", - "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "dependencies": { - "@octokit/types": "^12.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 18" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.3.0.tgz", - "integrity": "sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==", + "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, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^19.0.2" + "engines": { + "node": ">=4" } }, - "node_modules/@octokit/core/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "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/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, - "peer": true + "engines": { + "node": ">=8" + } }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@octokit/endpoint/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "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/@octokit/graphql": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", - "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=10.17.0" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", - "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "node_modules/husky": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", + "integrity": "sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==", "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" + "bin": { + "husky": "bin.js" }, "engines": { - "node": ">= 18" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", - "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", "dev": true, - "peer": true + "dependencies": { + "minimatch": "^3.0.4" + } }, - "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", - "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "peer": true, "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">= 18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^12.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, "engines": { - "node": ">= 18" + "node": ">=0.8.19" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.3.0.tgz", - "integrity": "sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==", + "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, - "peer": true, "dependencies": { - "@octokit/openapi-types": "^19.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/@octokit/graphql/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "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/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "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/@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", - "dev": true, - "dependencies": { - "@octokit/types": "^2.0.1" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "@types/node": ">= 8" + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "dependencies": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" + "engines": { + "node": ">=6" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "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, - "dependencies": { - "@types/node": ">= 8" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/request/node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/@octokit/rest": { - "version": "16.43.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", - "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "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/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@zkochan/cmd-shim": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", - "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", - "dev": true, - "dependencies": { - "is-windows": "^1.0.0", - "mkdirp-promise": "^5.0.1", - "mz": "^2.5.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 4.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/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/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": "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/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/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/are-we-there-yet/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/are-we-there-yet/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/are-we-there-yet/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/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/argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": ">=0.6.10" - } - }, - "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-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-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-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "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/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/atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/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/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "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/braces/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/braces/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/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "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.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", - "dev": true - }, - "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/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "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/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/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-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "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/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "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/chalk/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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "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/class-utils/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/class-utils/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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/cliui/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/cliui/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/cliui/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/cliui/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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "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-deep/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/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "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/codecov": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", - "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", - "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", - "dev": true, - "dependencies": { - "argv": "0.0.2", - "ignore-walk": "3.0.4", - "js-yaml": "3.14.1", - "teeny-request": "7.1.1", - "urlgrey": "1.0.0" - }, - "bin": { - "codecov": "bin/codecov" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/columnify/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/columnify/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/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": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compare-func/node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/compare-func/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", - "dev": true, - "dependencies": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", - "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", - "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/conventional-recommended-bump/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "dependencies": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", - "dev": true, - "dependencies": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-recommended-bump/node_modules/trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "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/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/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/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", - "dev": true, - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cyclist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", - "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true - }, - "node_modules/dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "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": "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/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/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/duplexify/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/duplexify/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/duplexify/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/duplexify/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/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/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/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/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==", - "dev": true - }, - "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-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "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": "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/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/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/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/expand-brackets/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/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/expand-brackets/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/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/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": "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/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "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/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/extglob/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/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "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": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fast-glob/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/fast-glob/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/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-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "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/fill-range/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/fill-range/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/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/flush-write-stream/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/flush-write-stream/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/flush-write-stream/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/flush-write-stream/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/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "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/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "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/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/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/from2/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/from2/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/from2/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/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs-write-stream-atomic/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/fs-write-stream-atomic/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/fs-write-stream-atomic/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/fs-write-stream-atomic/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/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": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/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/gauge/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/gauge/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/gauge/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/gauge/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/genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "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-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "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-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha512-xPCyvcEOxCJDxhBfXDNH+zA7mIRGb2aY1gIUJWsZkpJbp1BLHl+/Sycg26Dv+ZbZAJkO61tzbBtqHUi30NGBvg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "bin": { - "get-pkg-repo": "cli.js" - } - }, - "node_modules/get-pkg-repo/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", - "dev": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", - "dev": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", - "dev": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "dependencies": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/git-raw-commits/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/node_modules/camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/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/git-raw-commits/node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/node_modules/meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "dependencies": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/node_modules/minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/git-raw-commits/node_modules/quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/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/git-raw-commits/node_modules/redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", - "dev": true, - "dependencies": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/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/git-raw-commits/node_modules/split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "dependencies": { - "through2": "^2.0.2" - } - }, - "node_modules/git-raw-commits/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/git-raw-commits/node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-raw-commits/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/git-raw-commits/node_modules/trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-remote-origin-url/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/git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", - "dev": true, - "dependencies": { - "meow": "^4.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/git-semver-tags/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "dependencies": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/git-semver-tags/node_modules/quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", - "dev": true, - "dependencies": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags/node_modules/trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-up": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", - "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", - "dev": true, - "dependencies": { - "is-ssh": "^1.3.0", - "parse-url": "^6.0.0" - } - }, - "node_modules/git-url-parse": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", - "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", - "dev": true, - "dependencies": { - "git-up": "^4.0.0" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", - "dev": true - }, - "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/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "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-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "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/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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-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/http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "dependencies": { - "agent-base": "4", - "debug": "3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/http-proxy-agent/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/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true - }, - "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/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "dev": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "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/init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", - "dev": true, - "dependencies": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "node_modules/init-package-json/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/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/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/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==", - "dev": true - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", - "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/is-extendable/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-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-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-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-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "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/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/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.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/jest-circus/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/jest-circus/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/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/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/jest-cli/node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/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/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/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/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/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/jest-config/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/jest-config/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/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/jest-config/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-config/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/jest-config/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/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/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/jest-haste-map/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/jest-haste-map/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/jest-haste-map/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/jest-haste-map/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/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-message-util/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/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/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/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/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/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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/jest-runtime/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/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/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/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/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/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/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/jest-validate/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest/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/jest/node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest/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/jest/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/jest/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/jest/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/jest/node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest/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/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": "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/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "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-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "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 - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": 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-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "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/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/lerna": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", - "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", - "dev": true, - "dependencies": { - "@lerna/add": "3.21.0", - "@lerna/bootstrap": "3.21.0", - "@lerna/changed": "3.21.0", - "@lerna/clean": "3.21.0", - "@lerna/cli": "3.18.5", - "@lerna/create": "3.22.0", - "@lerna/diff": "3.21.0", - "@lerna/exec": "3.21.0", - "@lerna/import": "3.22.0", - "@lerna/info": "3.21.0", - "@lerna/init": "3.21.0", - "@lerna/link": "3.21.0", - "@lerna/list": "3.21.0", - "@lerna/publish": "3.22.1", - "@lerna/run": "3.21.0", - "@lerna/version": "3.22.1", - "import-local": "^2.0.0", - "npmlog": "^4.1.2" - }, - "bin": { - "lerna": "cli.js" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "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/lint-staged": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz", - "integrity": "sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.16", - "commander": "^9.3.0", - "debug": "^4.3.4", - "execa": "^5.1.1", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", - "pidtree": "^0.5.0", - "string-argv": "^0.3.1", - "supports-color": "^9.2.2", - "yaml": "^1.10.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/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/lint-staged/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/lint-staged/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/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/lint-staged/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/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/lint-staged/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/lint-staged/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/lint-staged/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/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/lint-staged/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/lint-staged/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/lint-staged/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/lint-staged/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/lint-staged/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/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/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/listr2/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/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/listr2/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/listr2/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/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/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/listr2/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/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/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._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "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.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/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/log-update/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/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/log-update/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/log-update/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/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/log-update/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/log-update/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/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/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "dependencies": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "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-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/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/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/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/meow/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/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/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/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/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/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/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/meow/node_modules/read-pkg/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/meow/node_modules/read-pkg/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/meow/node_modules/read-pkg/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/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/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/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/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/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 - }, - "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": "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/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/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mississippi/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/mississippi/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/mississippi/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/mississippi/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/mississippi/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/mississippi/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/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/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dev": true, - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "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/multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", - "dev": true, - "dependencies": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, - "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/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/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 - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "deprecated": "This module is not used anymore, npm uses minipass-fetch for its fetch implementation now", - "dev": true, - "dependencies": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-gyp/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/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "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-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-lifecycle": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", - "dev": true, - "dependencies": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "node_modules/npm-package-arg/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/npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "node_modules/npm-pick-manifest/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/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "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/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/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/object-copy/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", - "dev": true - }, - "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/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "dependencies": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=6" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" } }, - "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==", + "node_modules/istanbul-lib-instrument/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": { - "p-try": "^2.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "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==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==", - "dev": true, - "dependencies": { - "p-reduce": "^1.0.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha512-IA8SqjIGA8l9qOksXJvsvkeQ+VGb0TAzNCzvKvz9wt5wWLqfWbV6fXy43gpR2L4Te8sOq3S+Ql9biAaMKPdbtw==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/p-queue": { + "node_modules/istanbul-lib-instrument/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", - "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", - "dev": true, - "dependencies": { - "eventemitter3": "^3.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/p-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", - "integrity": "sha512-KeXddIp6jBT8qzyxfQGOGzNYc/7ftxKtRc5Uggre02yvbZrSBHE2M2C842/WizMBFD4s0Ngwz3QFOit2A+Ezrg==", - "dev": true, - "dependencies": { - "p-reduce": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parallel-transform/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/parallel-transform/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==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "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" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/parallel-transform/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/parallel-transform/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==", + "node_modules/istanbul-lib-report/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": { - "safe-buffer": "~5.1.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha512-bSWyzBKqcSL4RrncTpGsEKoJ7H8a4L3++ifTAbTFeMHyq2wRV+42DGmQcHIrJIvdcacjIOxEuKH/w4tthF17gg==", - "dev": true - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "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": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/parse-path": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.4.tgz", - "integrity": "sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/parse-path/node_modules/protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "dev": true - }, - "node_modules/parse-url": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-6.0.5.tgz", - "integrity": "sha512-e35AeLTSIlkw/5GFq70IN7po8fmDUjpDPY1rIK+VubRfsUvBonjQ+PBZG+vWMACnQSmNlvl524IucoDmcioMxA==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "is-ssh": "^1.3.0", - "normalize-url": "^6.1.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/parse-url/node_modules/protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "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==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "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==", + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-key": { + "node_modules/jest-changed-files/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/jest-changed-files/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": { - "pify": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-type/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "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==", + "node_modules/jest-circus/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": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pidtree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, "bin": { - "pidtree": "bin/pidtree.js" + "jest": "bin/jest.js" }, "engines": { - "node": ">=0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "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==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { - "pinkie": "^2.0.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "find-up": "^3.0.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/pretty-format": { + "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=0.12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", - "dev": true, - "dependencies": { - "read": "1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "genfun": "^5.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "node_modules/jest-runner/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": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "mute-stream": "~0.0.4" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-cmd-shim": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", - "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2" - } - }, - "node_modules/read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/jest-snapshot/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": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/jest-snapshot/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/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "locate-path": "^2.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/read-pkg/node_modules/load-json-file": { + "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "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/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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 + }, + "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, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "node": ">=6" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "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, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "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==", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antonk52" } }, - "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, + "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/lint-staged": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.8.tgz", + "integrity": "sha512-PUWFf2zQzsd9EFU+kM1d7UP+AZDbKFKuj+9JNVTBkhUFhbg4MAt6WfyMMwBfM4lYqd4D2Jwac5iuTu9rVj4zCQ==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "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==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { - "node": ">=0.10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18.0.0" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "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": ">=4" + "node": ">=8" } }, - "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", + "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/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "environment": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=0.12" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "get-east-asian-width": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "aproba": "^1.1.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-queue/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "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": { - "ret": "~0.1.10" + "yallist": "^3.0.2" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "tmpl": "1.0.5" } }, - "node_modules/set-blocking": { + "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8.6" } }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "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==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/set-value/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==", + "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/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/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/set-value/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==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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/set-value/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==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "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": { - "kind-of": "^6.0.2" + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "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": { - "shebang-regex": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "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/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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": ">=6" + "node": ">=0.10.0" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "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, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "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/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": ">=12" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, "engines": { - "node": "*" + "node": ">=0.10" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "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.0.0", - "npm": ">= 3.0.0" + "node": ">= 6" } }, - "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==", + "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": { - "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" + "find-up": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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==", + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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": { - "is-buffer": "^1.1.5" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "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==", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, - "dependencies": { - "ms": "2.0.0" - } + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true }, - "node_modules/snapdragon/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==", + "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, - "dependencies": { - "is-descriptor": "^0.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/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==", + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/snapdragon/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==", + "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": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, "engines": { - "node": ">= 4.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" + "tslib": "^2.1.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==", + "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, - "engines": { - "node": ">=0.10.0" - } + "optional": true, + "peer": true }, - "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", + "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, - "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" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "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": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "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/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "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==", + "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, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "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/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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "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": ">=6" + "node": ">=8" } }, - "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==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "extend-shallow": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "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, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "figgy-pudding": "^3.5.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "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-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13595,54 +4208,6 @@ "node": ">=8" } }, - "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/static-extend/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/static-extend/node_modules/is-descriptor": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", - "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -13652,30 +4217,6 @@ "stubs": "^3.0.0" } }, - "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/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -13698,143 +4239,48 @@ "node": ">=10" } }, - "node_modules/string-length/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/string-length/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/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "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, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "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": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-final-newline": { @@ -13846,18 +4292,6 @@ "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "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", @@ -13870,23 +4304,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", @@ -13920,24 +4337,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, "node_modules/teeny-request": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", @@ -13951,174 +4350,69 @@ "uuid": "^8.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/teeny-request/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/teeny-request/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/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/teeny-request/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/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-write": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", - "integrity": "sha512-P8NK5aNqcGQBC37i/8pL/K9tFgx14CF2vdwluD/BA/dGWGD4T4E59TE7dAxPyb2wusts2FhMp36EiopBBsGJ2Q==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "is-stream": "^1.1.0", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-write/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-write/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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": ">=10" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/teeny-request/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": ">=0.10" + "node": ">= 6.0.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/teeny-request/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "any-promise": "^1.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "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==", + "node_modules/teeny-request/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": { - "thenify": ">= 3.1.0 < 4" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=0.8" + "node": ">= 6" } }, - "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.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "node_modules/teeny-request/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, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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": { - "os-tmpdir": "~1.0.2" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=0.6.0" + "node": ">=8" } }, "node_modules/tmpl": { @@ -14136,79 +4430,23 @@ "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/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "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": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=8.0" } }, "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/tree-kill": { "version": "1.2.2", @@ -14219,15 +4457,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-jest": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", @@ -14304,39 +4533,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -14347,271 +4549,36 @@ } }, "node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/umask": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", - "integrity": "sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA==", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.17" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "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/union-value/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/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "dev": true, - "dependencies": { - "os-name": "^3.1.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "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/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", "dev": true }, - "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.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -14637,27 +4604,11 @@ }, "bin": { "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "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" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "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/urlgrey": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", @@ -14667,40 +4618,6 @@ "fast-url-parser": "^1.1.3" } }, - "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/util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -14715,39 +4632,6 @@ "node": ">=10.12.0" } }, - "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/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -14757,104 +4641,22 @@ "makeerror": "1.0.12" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "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/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { - "execa": "^1.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -14872,167 +4674,21 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/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": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "dev": true, - "dependencies": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha512-84+F0igFp2dPD6UpAQjOUX3CdKUOqUzn6oE9sDBNzUXINR5VceJ1rauZltqQB/bcYsx3EpKys4C7/PivKUAiWQ==", - "dev": true, - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "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": ">=0.4" + "node": ">=10" } }, - "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/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -15040,12 +4696,15 @@ "dev": true }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { @@ -15067,74 +4726,6 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/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/yargs/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/yargs/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/yargs/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/yargs/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/yargs/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/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", diff --git a/package.json b/package.json index 4088af372..36014a3cc 100644 --- a/package.json +++ b/package.json @@ -6,36 +6,31 @@ "scripts": { "format": "prettier --write \"**/*.{js,md,yml,ts,json,yaml}\"", "lint": "prettier --list-different \"**/*.{js,md,yml,ts,json,yaml}\"", - "clean": "lerna run --parallel clean && lerna clean", - "build": "lerna run build", + "clean": "pnpm -r run clean && pnpm -r exec rm -rf node_modules", "local:emulator": "cd _emulator && firebase emulators:start -P demo-test", "test": "cd _emulator && firebase emulators:exec jest -P demo-test", "test:ci": "cd _emulator && firebase emulators:exec \"CI_TEST=true jest --detectOpenHandles --verbose --forceExit\" -P demo-test", - "test:local": "concurrently \"npm run local:emulator\" \"jest\"", - "test:watch": "concurrently \"npm run local:emulator\" \"jest --watch\"", + "test:local": "concurrently \"pnpm run local:emulator\" \"jest\"", + "test:watch": "concurrently \"pnpm run local:emulator\" \"jest --watch\"", "test-coverage": "jest --coverage --detectOpenHandles --forceExit", - "postinstall": "if test \"$SKIP_POSTINSTALL\" != \"yes\" ; then lerna bootstrap --no-ci && lerna run --parallel clean && npm run build && npm run generate-package-locks ; fi", - "generate-package-locks": "lerna exec -- npm i --package-lock-only", - "generate-readmes": "lerna run --parallel generate-readme", - "prepare": "husky install" + "generate-package-locks": "pnpm -r exec npm i --package-lock-only", + "generate-readmes": "pnpm -r run generate-readme", + "build": "pnpm -r --workspace-concurrency 1 --filter '!./_emulator/functions' build" }, "repository": "", "author": "Firebase (https://firebase.google.com/)", "license": "Apache-2.0", - "bugs": { - "url": "" - }, "devDependencies": { "@types/jest": "29.5.0", - "codecov": "^3.8.1", - "concurrently": "^7.2.1", - "husky": "^7.0.4", + "@types/node": "^22.1.0", + "codecov": "^3.8.2", + "concurrently": "^8.2.2", + "husky": "^9.1.4", "jest": "^29.7.0", - "lerna": "^3.4.3", - "lint-staged": "^12.4.0", - "prettier": "2.7.1", + "lint-staged": "^15.2.8", + "prettier": "3.3.3", "ts-jest": "29.1.2", - "typescript": "^4.8.4" + "typescript": "^5.5.4" }, "lint-staged": { "*.{js,md,yml,ts,json,yaml}": "prettier --write" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..669b489ab --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,17386 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + devDependencies: + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^22.1.0 + version: 22.1.0 + codecov: + specifier: ^3.8.2 + version: 3.8.3 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + husky: + specifier: ^9.1.4 + version: 9.1.4 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + lint-staged: + specifier: ^15.2.8 + version: 15.2.8 + prettier: + specifier: 3.3.3 + version: 3.3.3 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)))(typescript@5.5.4) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + + _emulator/functions: + dependencies: + "@types/express-serve-static-core": + specifier: 4.17.30 + version: 4.17.30 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + devDependencies: + typescript: + specifier: ^4.6.4 + version: 4.9.5 + + delete-user-data/functions: + dependencies: + "@google-cloud/pubsub": + specifier: ^4.3.3 + version: 4.5.0 + "@types/express-serve-static-core": + specifier: 4.17.24 + version: 4.17.24 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^16.18.34 + version: 16.18.104 + concurrently: + specifier: ^7.2.1 + version: 7.6.0 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + lodash.chunk: + specifier: ^4.2.0 + version: 4.2.0 + node-fetch: + specifier: ^2.6.2 + version: 2.7.0 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)))(typescript@4.9.5) + typescript: + specifier: ^4.9.4 + version: 4.9.5 + devDependencies: + "@types/lodash.chunk": + specifier: ^4.2.7 + version: 4.2.9 + "@types/node-fetch": + specifier: ^2.6.2 + version: 2.6.11 + concurrency: + specifier: ^0.1.4 + version: 0.1.4 + dotenv: + specifier: ^16.0.2 + version: 16.4.5 + firebase-functions-test: + specifier: ^3.2.0 + version: 3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5))) + wait-port: + specifier: ^0.2.9 + version: 0.2.14 + + firestore-bigquery-export/firestore-bigquery-change-tracker: + dependencies: + "@google-cloud/bigquery": + specifier: ^7.6.0 + version: 7.9.0 + "@google-cloud/resource-manager": + specifier: ^5.1.0 + version: 5.3.0 + firebase-admin: + specifier: ^12.0.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + generate-schema: + specifier: ^2.6.0 + version: 2.6.0 + inquirer: + specifier: ^6.4.0 + version: 6.5.2 + lodash: + specifier: ^4.17.14 + version: 4.17.21 + node-fetch: + specifier: ^2.6.1 + version: 2.7.0 + sql-formatter: + specifier: ^2.3.3 + version: 2.3.4 + traverse: + specifier: ^0.6.6 + version: 0.6.9 + devDependencies: + "@types/chai": + specifier: ^4.1.6 + version: 4.3.17 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: 14.18.34 + version: 14.18.34 + "@types/traverse": + specifier: ^0.6.32 + version: 0.6.37 + chai: + specifier: ^4.2.0 + version: 4.5.0 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-config: + specifier: 29.5.0 + version: 29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-environment-node: + specifier: 29.5.0 + version: 29.5.0 + mocked-env: + specifier: ^1.3.2 + version: 1.3.5 + nyc: + specifier: ^14.0.0 + version: 14.1.1 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)))(typescript@4.9.5) + typescript: + specifier: ^4.9.4 + version: 4.9.5 + + firestore-bigquery-export/functions: + dependencies: + "@firebaseextensions/firestore-bigquery-change-tracker": + specifier: ^1.1.35 + version: 1.1.35 + "@google-cloud/bigquery": + specifier: ^7.6.0 + version: 7.9.0 + "@types/chai": + specifier: ^4.1.6 + version: 4.3.17 + "@types/express-serve-static-core": + specifier: 4.17.30 + version: 4.17.30 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^20.4.4 + version: 20.14.14 + chai: + specifier: ^4.2.0 + version: 4.5.0 + firebase-admin: + specifier: ^12.0.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + firebase-functions-test: + specifier: ^0.3.3 + version: 0.3.3(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0)) + generate-schema: + specifier: ^2.6.0 + version: 2.6.0 + inquirer: + specifier: ^6.4.0 + version: 6.5.2 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + jest-config: + specifier: 29.5.0 + version: 29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + lodash: + specifier: ^4.17.14 + version: 4.17.21 + nyc: + specifier: ^14.0.0 + version: 14.1.1 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + sql-formatter: + specifier: ^2.3.3 + version: 2.3.4 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)))(typescript@4.9.5) + ts-node: + specifier: ^9.0.0 + version: 9.1.1(typescript@4.9.5) + typescript: + specifier: ^4.8.4 + version: 4.9.5 + devDependencies: + faker: + specifier: ^5.1.0 + version: 5.5.3 + mocked-env: + specifier: ^1.3.2 + version: 1.3.5 + + firestore-bigquery-export/scripts/gen-schema-view: + dependencies: + "@firebaseextensions/firestore-bigquery-change-tracker": + specifier: ^1.1.33 + version: 1.1.35 + "@google-cloud/bigquery": + specifier: ^7.9.0 + version: 7.9.0 + commander: + specifier: 5.0.0 + version: 5.0.0 + firebase-admin: + specifier: ^12.3.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.2.0 + version: 4.9.0(firebase-admin@12.3.0) + fs-find: + specifier: ^0.4.0 + version: 0.4.0 + generate-schema: + specifier: ^2.6.0 + version: 2.6.0 + glob: + specifier: 11.0.0 + version: 11.0.0 + inquirer: + specifier: ^6.4.0 + version: 6.5.2 + sql-formatter: + specifier: ^15.3.2 + version: 15.3.2 + devDependencies: + "@types/chai": + specifier: ^4.1.6 + version: 4.3.17 + "@types/express": + specifier: ^4.17.14 + version: 4.17.21 + "@types/express-serve-static-core": + specifier: 4.17.30 + version: 4.17.30 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^22.1.0 + version: 22.1.0 + chai: + specifier: ^4.2.0 + version: 4.5.0 + exec: + specifier: ^0.2.1 + version: 0.2.1 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + mocked-env: + specifier: ^1.3.2 + version: 1.3.5 + nyc: + specifier: ^14.0.0 + version: 14.1.1 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)))(typescript@4.9.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.1.0)(typescript@4.9.5) + typescript: + specifier: ^4.9.3 + version: 4.9.5 + + firestore-bigquery-export/scripts/import: + dependencies: + "@firebaseextensions/firestore-bigquery-change-tracker": + specifier: ^1.1.35 + version: 1.1.35 + "@google-cloud/bigquery": + specifier: ^7.9.0 + version: 7.9.0 + commander: + specifier: 12.1.0 + version: 12.1.0 + filenamify: + specifier: ^4.3.0 + version: 4.3.0 + firebase-admin: + specifier: ^12.3.0 + version: 12.3.0 + firebase-functions: + specifier: ^5.0.1 + version: 5.0.1(firebase-admin@12.3.0) + generate-schema: + specifier: ^2.6.0 + version: 2.6.0 + inquirer: + specifier: ^6.4.0 + version: 6.5.2 + sql-formatter: + specifier: ^15.3.2 + version: 15.3.2 + workerpool: + specifier: ^9.1.3 + version: 9.1.3 + devDependencies: + "@types/chai": + specifier: ^4.3.17 + version: 4.3.17 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^22.1.0 + version: 22.1.0 + "@types/workerpool": + specifier: ^6.4.7 + version: 6.4.7 + axios: + specifier: ^1.7.3 + version: 1.7.3 + chai: + specifier: ^4.5.0 + version: 4.5.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + nanoid: + specifier: ^4.0.2 + version: 4.0.2 + rimraf: + specifier: ^2.7.1 + version: 2.7.1 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)))(typescript@5.5.4) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.1.0)(typescript@5.5.4) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + + firestore-counter/clients/node: + dependencies: + uuid: + specifier: ^8.3.2 + version: 8.3.2 + devDependencies: + firebase-admin: + specifier: ^11.4.1 + version: 11.11.1 + + firestore-counter/clients/web: + dependencies: + "@types/uuid": + specifier: ^3.4.4 + version: 3.4.13 + uuid: + specifier: ^3.3.2 + version: 3.4.0 + devDependencies: + firebase: + specifier: ^9.6.1 + version: 9.23.0 + prettier: + specifier: 1.15.3 + version: 1.15.3 + ts-loader: + specifier: ^6.0.4 + version: 6.2.2(typescript@4.9.5) + typescript: + specifier: ^4.5.4 + version: 4.9.5 + webpack: + specifier: ^4.35.0 + version: 4.47.0(webpack-cli@4.10.0) + webpack-cli: + specifier: ^4.9.1 + version: 4.10.0(webpack@4.47.0) + + firestore-counter/functions: + dependencies: + "@types/express-serve-static-core": + specifier: 4.19.5 + version: 4.19.5 + deep-equal: + specifier: ^2.2.3 + version: 2.2.3 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + uuid: + specifier: ^3.3.2 + version: 3.4.0 + devDependencies: + "@types/deep-equal": + specifier: ^1.0.1 + version: 1.0.4 + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/node": + specifier: ^18.19.43 + version: 18.19.43 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)))(typescript@5.5.4) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.43)(typescript@5.5.4) + wait-for-expect: + specifier: ^3.0.2 + version: 3.0.2 + + firestore-send-email/functions: + dependencies: + "@types/express-serve-static-core": + specifier: 4.17.30 + version: 4.17.30 + "@types/node": + specifier: ^20.10.3 + version: 20.14.14 + "@types/nodemailer": + specifier: ^6.2.1 + version: 6.4.15 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + handlebars: + specifier: ^4.5.3 + version: 4.7.8 + nodemailer: + specifier: ^6.9.14 + version: 6.9.14 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + smtp-server: + specifier: ^3.13.4 + version: 3.13.4 + typescript: + specifier: ^4.8.4 + version: 4.9.5 + wait-on: + specifier: ^7.2.0 + version: 7.2.0 + devDependencies: + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/nodemailer-sendgrid": + specifier: ^1.0.3 + version: 1.0.3 + concurrently: + specifier: ^7.2.1 + version: 7.6.0 + firebase-functions-test: + specifier: ^0.2.3 + version: 0.2.3(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0)) + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + mocked-env: + specifier: ^1.3.2 + version: 1.3.5 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)))(typescript@4.9.5) + + firestore-shorten-urls-bitly/functions: + dependencies: + "@types/express-serve-static-core": + specifier: 4.17.30 + version: 4.17.30 + "@types/node": + specifier: ^20.10.3 + version: 20.14.14 + axios: + specifier: ^1.6.0 + version: 1.7.3 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + typescript: + specifier: ^4.8.4 + version: 4.9.5 + + firestore-translate-text/functions: + dependencies: + "@google-cloud/translate": + specifier: ^8.2.0 + version: 8.3.0 + "@types/express-serve-static-core": + specifier: 4.19.0 + version: 4.19.0 + "@types/node": + specifier: ^20.10.3 + version: 20.14.14 + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + typescript: + specifier: ^4.8.4 + version: 4.9.5 + devDependencies: + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + firebase-functions-test: + specifier: 3.2.0 + version: 3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5))) + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + js-yaml: + specifier: ^3.13.1 + version: 3.14.1 + mocked-env: + specifier: ^1.3.1 + version: 1.3.5 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)))(typescript@4.9.5) + + samples/rtdb-uppercase-messages/functions: + dependencies: + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + + samples/rtdb-uppercase-messages/functions/integration-tests/functions: + dependencies: + firebase-admin: + specifier: ^12.1.0 + version: 12.3.0 + firebase-functions: + specifier: ^4.9.0 + version: 4.9.0(firebase-admin@12.3.0) + devDependencies: + firebase-functions-test: + specifier: ^3.2.0 + version: 3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4))) + + storage-resize-images/functions: + dependencies: + "@google-cloud/storage": + specifier: ^7.12.1 + version: 7.12.1 + "@types/node": + specifier: ^20.10.3 + version: 20.14.14 + firebase-admin: + specifier: ^12.3.0 + version: 12.3.0 + firebase-functions: + specifier: ^5.0.1 + version: 5.0.1(firebase-admin@12.3.0) + mkdirp: + specifier: ^1.0.4 + version: 1.0.4 + rimraf: + specifier: ^2.6.3 + version: 2.7.1 + sharp: + specifier: 0.33.4 + version: 0.33.4 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + uuid: + specifier: ^10.0.0 + version: 10.0.0 + uuidv4: + specifier: ^6.1.0 + version: 6.2.13 + devDependencies: + "@types/jest": + specifier: 29.5.0 + version: 29.5.0 + "@types/mkdirp": + specifier: ^1.0.1 + version: 1.0.2 + child_process: + specifier: ^1.0.2 + version: 1.0.2 + dotenv: + specifier: ^16.0.3 + version: 16.4.5 + firebase: + specifier: ^10.4.0 + version: 10.12.5 + firebase-functions-test: + specifier: 3.2.0 + version: 3.2.0(firebase-admin@12.3.0)(firebase-functions@5.0.1(firebase-admin@12.3.0))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))) + image-size: + specifier: ^0.9.3 + version: 0.9.7 + image-type: + specifier: ^4.1.0 + version: 4.1.0 + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + mocked-env: + specifier: ^1.3.2 + version: 1.3.5 + ts-jest: + specifier: 29.1.2 + version: 29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4) + +packages: + "@ampproject/remapping@2.3.0": + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: ">=6.0.0" } + + "@babel/code-frame@7.24.7": + resolution: + { + integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.25.2": + resolution: + { + integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.25.2": + resolution: + { + integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.25.0": + resolution: + { + integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.25.2": + resolution: + { + integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.24.7": + resolution: + { + integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.25.2": + resolution: + { + integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-plugin-utils@7.24.8": + resolution: + { + integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-simple-access@7.24.7": + resolution: + { + integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.24.8": + resolution: + { + integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.24.7": + resolution: + { + integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.24.8": + resolution: + { + integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.25.0": + resolution: + { + integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.24.7": + resolution: + { + integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.25.3": + resolution: + { + integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/plugin-syntax-async-generators@7.8.4": + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-bigint@7.8.3": + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-class-properties@7.12.13": + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-meta@7.10.4": + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-json-strings@7.8.3": + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-jsx@7.24.7": + resolution: + { + integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-logical-assignment-operators@7.10.4": + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-numeric-separator@7.10.4": + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-object-rest-spread@7.8.3": + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-optional-catch-binding@7.8.3": + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-optional-chaining@7.8.3": + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-top-level-await@7.14.5": + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.24.7": + resolution: + { + integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/runtime@7.25.0": + resolution: + { + integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.25.0": + resolution: + { + integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.25.3": + resolution: + { + integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.25.2": + resolution: + { + integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==, + } + engines: { node: ">=6.9.0" } + + "@bcoe/v8-coverage@0.2.3": + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } + + "@cspotcode/source-map-support@0.8.1": + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: ">=12" } + + "@discoveryjs/json-ext@0.5.7": + resolution: + { + integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==, + } + engines: { node: ">=10.0.0" } + + "@emnapi/runtime@1.2.0": + resolution: + { + integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==, + } + + "@fastify/busboy@1.2.1": + resolution: + { + integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==, + } + engines: { node: ">=14" } + + "@fastify/busboy@2.1.1": + resolution: + { + integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==, + } + engines: { node: ">=14" } + + "@fastify/busboy@3.0.0": + resolution: + { + integrity: sha512-83rnH2nCvclWaPQQKvkJ2pdOjG4TZyEVuFDnlOF6KP08lDaaceVyw/W63mDuafQT+MKHCvXIPpE5uYWeM0rT4w==, + } + + "@firebase/analytics-compat@0.2.13": + resolution: + { + integrity: sha512-aZ4wGfNDMsCxhKzDbK2g1aV0JKsdQ9FbeIsjpNJPzhahV0XYj+z36Y4RNLPpG/6hHU4gxnezxs+yn3HhHkNL8w==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/analytics-compat@0.2.6": + resolution: + { + integrity: sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/analytics-types@0.8.0": + resolution: + { + integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==, + } + + "@firebase/analytics-types@0.8.2": + resolution: + { + integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==, + } + + "@firebase/analytics@0.10.0": + resolution: + { + integrity: sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/analytics@0.10.7": + resolution: + { + integrity: sha512-GE29uTT6y/Jv2EP0OjpTezeTQZ5FTCTaZXKrrdVGjb/t35AU4u/jiU+hUwUPpuK8fqhhiHkS/AawE3a3ZK/a9Q==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/app-check-compat@0.3.14": + resolution: + { + integrity: sha512-kK3bPfojAfXE53W+20rxMqIxrloFswXG9vh4kEdYL6Wa2IB3sD5++2dPiK3yGxl8oQiqS8qL2wcKB5/xLpEVEg==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/app-check-compat@0.3.7": + resolution: + { + integrity: sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/app-check-interop-types@0.3.0": + resolution: + { + integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==, + } + + "@firebase/app-check-interop-types@0.3.2": + resolution: + { + integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==, + } + + "@firebase/app-check-types@0.5.0": + resolution: + { + integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==, + } + + "@firebase/app-check-types@0.5.2": + resolution: + { + integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==, + } + + "@firebase/app-check@0.8.0": + resolution: + { + integrity: sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/app-check@0.8.7": + resolution: + { + integrity: sha512-EkOeJcMKVR0zZ6z/jqcFTqHb/xq+TVIRIuBNGHdpcIuFU1czhSlegvqv2+nC+nFrkD8M6Xvd3tAlUOkdbMeS6A==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/app-compat@0.2.13": + resolution: + { + integrity: sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg==, + } + + "@firebase/app-compat@0.2.38": + resolution: + { + integrity: sha512-36ZrSvkYLW7QR01Sii2X+IY18ErMpRg6e2B2f/DVTtJBolthwXOnNBps+wvaVBvegdvdVPspgDXZUV0ppqh45w==, + } + + "@firebase/app-types@0.9.0": + resolution: + { + integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==, + } + + "@firebase/app-types@0.9.2": + resolution: + { + integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==, + } + + "@firebase/app@0.10.8": + resolution: + { + integrity: sha512-xSLmW0/RShcnUEXH7l+wC0AFWaUtty4tUFF2loIgbtXTRmra0UH/SqYDf/IcfreUninRrCsusNmvoTidGkXJPw==, + } + + "@firebase/app@0.9.13": + resolution: + { + integrity: sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw==, + } + + "@firebase/auth-compat@0.4.2": + resolution: + { + integrity: sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/auth-compat@0.5.11": + resolution: + { + integrity: sha512-7rE3MkQDoWwI2qd8qsra4/QZCO2GzQSbCL6AVQpult9+Nbimg+5A+YeHxpLTcYAxUV6HDg2CqTDQreFLhcm1CQ==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/auth-interop-types@0.2.1": + resolution: + { + integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==, + } + + "@firebase/auth-interop-types@0.2.3": + resolution: + { + integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==, + } + + "@firebase/auth-types@0.12.0": + resolution: + { + integrity: sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/auth-types@0.12.2": + resolution: + { + integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/auth@0.23.2": + resolution: + { + integrity: sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/auth@1.7.6": + resolution: + { + integrity: sha512-T+lA5xoug9CByGYkD5WkfTh2ujEYq/frGZPbk0H+fNU6fNl7nqg88KcsmzsC6Fsqbjm3LLEb/i6wJvF6NSNEig==, + } + peerDependencies: + "@firebase/app": 0.x + "@react-native-async-storage/async-storage": ^1.18.1 + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + + "@firebase/component@0.6.4": + resolution: + { + integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==, + } + + "@firebase/component@0.6.8": + resolution: + { + integrity: sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==, + } + + "@firebase/database-compat@0.3.4": + resolution: + { + integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==, + } + + "@firebase/database-compat@1.0.7": + resolution: + { + integrity: sha512-R/3B+VVzEFN5YcHmfWns3eitA8fHLTL03io+FIoMcTYkajFnrBdS3A+g/KceN9omP7FYYYGTQWF9lvbEx6eMEg==, + } + + "@firebase/database-types@0.10.4": + resolution: + { + integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==, + } + + "@firebase/database-types@1.0.4": + resolution: + { + integrity: sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==, + } + + "@firebase/database@0.14.4": + resolution: + { + integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==, + } + + "@firebase/database@1.0.7": + resolution: + { + integrity: sha512-wjXr5AO8RPxVVg7rRCYffT7FMtBjHRfJ9KMwi19MbOf0vBf0H9YqW3WCgcnLpXI6ehiUcU3z3qgPnnU0nK6SnA==, + } + + "@firebase/firestore-compat@0.3.12": + resolution: + { + integrity: sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/firestore-compat@0.3.34": + resolution: + { + integrity: sha512-OBP2F/Ccydl2U2j8XIfpKBxf0EnQHEhbZ4LTwbSS2QlG9+8TwhvKFkKk/ZljWYqaype+qFKPuXZ5flCqYEETeA==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/firestore-types@2.5.1": + resolution: + { + integrity: sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/firestore-types@3.0.2": + resolution: + { + integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/firestore@3.13.0": + resolution: + { + integrity: sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg==, + } + engines: { node: ">=10.10.0" } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/firestore@4.6.5": + resolution: + { + integrity: sha512-0+Ascaht4qUzj4pCopMPWmoAujk8HKjwCpaNYOOjbYMZ65RVfZPsfZwwbWi/zWMXj6xvPsai5oBiErUUkrLwNw==, + } + engines: { node: ">=10.10.0" } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/functions-compat@0.3.12": + resolution: + { + integrity: sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/functions-compat@0.3.5": + resolution: + { + integrity: sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/functions-types@0.6.0": + resolution: + { + integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==, + } + + "@firebase/functions-types@0.6.2": + resolution: + { + integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==, + } + + "@firebase/functions@0.10.0": + resolution: + { + integrity: sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/functions@0.11.6": + resolution: + { + integrity: sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/installations-compat@0.2.4": + resolution: + { + integrity: sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/installations-compat@0.2.8": + resolution: + { + integrity: sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/installations-types@0.5.0": + resolution: + { + integrity: sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==, + } + peerDependencies: + "@firebase/app-types": 0.x + + "@firebase/installations-types@0.5.2": + resolution: + { + integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==, + } + peerDependencies: + "@firebase/app-types": 0.x + + "@firebase/installations@0.6.4": + resolution: + { + integrity: sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/installations@0.6.8": + resolution: + { + integrity: sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/logger@0.4.0": + resolution: + { + integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==, + } + + "@firebase/logger@0.4.2": + resolution: + { + integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==, + } + + "@firebase/messaging-compat@0.2.10": + resolution: + { + integrity: sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/messaging-compat@0.2.4": + resolution: + { + integrity: sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/messaging-interop-types@0.2.0": + resolution: + { + integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==, + } + + "@firebase/messaging-interop-types@0.2.2": + resolution: + { + integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==, + } + + "@firebase/messaging@0.12.10": + resolution: + { + integrity: sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/messaging@0.12.4": + resolution: + { + integrity: sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/performance-compat@0.2.4": + resolution: + { + integrity: sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/performance-compat@0.2.8": + resolution: + { + integrity: sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/performance-types@0.2.0": + resolution: + { + integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==, + } + + "@firebase/performance-types@0.2.2": + resolution: + { + integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==, + } + + "@firebase/performance@0.6.4": + resolution: + { + integrity: sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/performance@0.6.8": + resolution: + { + integrity: sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/remote-config-compat@0.2.4": + resolution: + { + integrity: sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/remote-config-compat@0.2.8": + resolution: + { + integrity: sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/remote-config-types@0.3.0": + resolution: + { + integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==, + } + + "@firebase/remote-config-types@0.3.2": + resolution: + { + integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==, + } + + "@firebase/remote-config@0.4.4": + resolution: + { + integrity: sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/remote-config@0.4.8": + resolution: + { + integrity: sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/storage-compat@0.3.2": + resolution: + { + integrity: sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/storage-compat@0.3.9": + resolution: + { + integrity: sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==, + } + peerDependencies: + "@firebase/app-compat": 0.x + + "@firebase/storage-types@0.8.0": + resolution: + { + integrity: sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/storage-types@0.8.2": + resolution: + { + integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==, + } + peerDependencies: + "@firebase/app-types": 0.x + "@firebase/util": 1.x + + "@firebase/storage@0.11.2": + resolution: + { + integrity: sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/storage@0.12.6": + resolution: + { + integrity: sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==, + } + peerDependencies: + "@firebase/app": 0.x + + "@firebase/util@1.9.3": + resolution: + { + integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==, + } + + "@firebase/util@1.9.7": + resolution: + { + integrity: sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==, + } + + "@firebase/vertexai-preview@0.0.3": + resolution: + { + integrity: sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + "@firebase/app": 0.x + "@firebase/app-types": 0.x + + "@firebase/webchannel-wrapper@0.10.1": + resolution: + { + integrity: sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==, + } + + "@firebase/webchannel-wrapper@1.0.1": + resolution: + { + integrity: sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==, + } + + "@firebaseextensions/firestore-bigquery-change-tracker@1.1.35": + resolution: + { + integrity: sha512-LbVwBsqZkyPAuX0cjhpCjL8b4TrNlFlUGjnOzkq1xX1hBDLK+ekMK/nn3sZD7e2gunKDEKkXs9CKX2cvJMMO0Q==, + } + + "@google-cloud/bigquery@7.9.0": + resolution: + { + integrity: sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/common@5.0.2": + resolution: + { + integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/firestore@6.8.0": + resolution: + { + integrity: sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==, + } + engines: { node: ">=12.0.0" } + + "@google-cloud/firestore@7.9.0": + resolution: + { + integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/paginator@3.0.7": + resolution: + { + integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==, + } + engines: { node: ">=10" } + + "@google-cloud/paginator@5.0.2": + resolution: + { + integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/precise-date@4.0.0": + resolution: + { + integrity: sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/projectify@3.0.0": + resolution: + { + integrity: sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==, + } + engines: { node: ">=12.0.0" } + + "@google-cloud/projectify@4.0.0": + resolution: + { + integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/promisify@3.0.1": + resolution: + { + integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==, + } + engines: { node: ">=12" } + + "@google-cloud/promisify@4.0.0": + resolution: + { + integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==, + } + engines: { node: ">=14" } + + "@google-cloud/pubsub@4.5.0": + resolution: + { + integrity: sha512-ptRLLDrAp1rStD1n3ZrG8FdAfpccqI6M5rCaceF6PL7DU3hqJbvQ2Y91G8MKG7c7zK+jiWv655Qf5r2IvjTzwA==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/resource-manager@5.3.0": + resolution: + { + integrity: sha512-uWJJf6S2PJL7oZ4ezv16aZl9+IJqPo5GzUv1pZ3/qRiMj13p0ylEgX1+LxBpX71eEPKTwMHoJV2IBBe3EAq7Xw==, + } + engines: { node: ">=14.0.0" } + + "@google-cloud/storage@6.12.0": + resolution: + { + integrity: sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==, + } + engines: { node: ">=12" } + + "@google-cloud/storage@7.12.1": + resolution: + { + integrity: sha512-Z3ZzOnF3YKLuvpkvF+TjQ6lztxcAyTILp+FjKonmVpEwPa9vFvxpZjubLR4sB6bf19i/8HL2AXRjA0YFgHFRmQ==, + } + engines: { node: ">=14" } + + "@google-cloud/translate@8.3.0": + resolution: + { + integrity: sha512-c9VXb0V/OzusaHMPh/hjAmaxPZXtNMEr1cRRHd2rRgsGZLSde7vU8rIsD9F959O7US4uFSkLxqjiyqYm1ConJA==, + } + engines: { node: ">=14.0.0" } + + "@grpc/grpc-js@1.11.1": + resolution: + { + integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==, + } + engines: { node: ">=12.10.0" } + + "@grpc/grpc-js@1.7.3": + resolution: + { + integrity: sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==, + } + engines: { node: ^8.13.0 || >=10.10.0 } + + "@grpc/grpc-js@1.8.22": + resolution: + { + integrity: sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==, + } + engines: { node: ^8.13.0 || >=10.10.0 } + + "@grpc/grpc-js@1.9.15": + resolution: + { + integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==, + } + engines: { node: ^8.13.0 || >=10.10.0 } + + "@grpc/proto-loader@0.6.13": + resolution: + { + integrity: sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==, + } + engines: { node: ">=6" } + hasBin: true + + "@grpc/proto-loader@0.7.13": + resolution: + { + integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==, + } + engines: { node: ">=6" } + hasBin: true + + "@hapi/hoek@9.3.0": + resolution: + { + integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==, + } + + "@hapi/topo@5.1.0": + resolution: + { + integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==, + } + + "@img/sharp-darwin-arm64@0.33.4": + resolution: + { + integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [darwin] + + "@img/sharp-darwin-x64@0.33.4": + resolution: + { + integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-darwin-arm64@1.0.2": + resolution: + { + integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==, + } + engines: { macos: ">=11", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [darwin] + + "@img/sharp-libvips-darwin-x64@1.0.2": + resolution: + { + integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==, + } + engines: + { macos: ">=10.13", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-linux-arm64@1.0.2": + resolution: + { + integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==, + } + engines: + { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linux-arm@1.0.2": + resolution: + { + integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==, + } + engines: + { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm] + os: [linux] + + "@img/sharp-libvips-linux-s390x@1.0.2": + resolution: + { + integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==, + } + engines: + { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [s390x] + os: [linux] + + "@img/sharp-libvips-linux-x64@1.0.2": + resolution: + { + integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==, + } + engines: + { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + resolution: + { + integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==, + } + engines: + { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + resolution: + { + integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==, + } + engines: + { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-linux-arm64@0.33.4": + resolution: + { + integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linux-arm@0.33.4": + resolution: + { + integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==, + } + engines: + { + glibc: ">=2.28", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm] + os: [linux] + + "@img/sharp-linux-s390x@0.33.4": + resolution: + { + integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==, + } + engines: + { + glibc: ">=2.31", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [s390x] + os: [linux] + + "@img/sharp-linux-x64@0.33.4": + resolution: + { + integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-linuxmusl-arm64@0.33.4": + resolution: + { + integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linuxmusl-x64@0.33.4": + resolution: + { + integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-wasm32@0.33.4": + resolution: + { + integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [wasm32] + + "@img/sharp-win32-ia32@0.33.4": + resolution: + { + integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [ia32] + os: [win32] + + "@img/sharp-win32-x64@0.33.4": + resolution: + { + integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [win32] + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@istanbuljs/load-nyc-config@1.1.0": + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + } + engines: { node: ">=8" } + + "@istanbuljs/schema@0.1.3": + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: ">=8" } + + "@jest/console@29.7.0": + resolution: + { + integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/core@29.7.0": + resolution: + { + integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + "@jest/environment@29.7.0": + resolution: + { + integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/expect-utils@29.7.0": + resolution: + { + integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/expect@29.7.0": + resolution: + { + integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/fake-timers@29.7.0": + resolution: + { + integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/globals@29.7.0": + resolution: + { + integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/reporters@29.7.0": + resolution: + { + integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + "@jest/schemas@29.6.3": + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/source-map@29.6.3": + resolution: + { + integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/test-result@29.7.0": + resolution: + { + integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/test-sequencer@29.7.0": + resolution: + { + integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/transform@29.7.0": + resolution: + { + integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/types@29.6.3": + resolution: + { + integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jridgewell/gen-mapping@0.3.5": + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@jridgewell/trace-mapping@0.3.9": + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + + "@js-sdsl/ordered-map@4.4.2": + resolution: + { + integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==, + } + + "@jsdoc/salty@0.2.8": + resolution: + { + integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==, + } + engines: { node: ">=v12.0.0" } + + "@opentelemetry/api@1.8.0": + resolution: + { + integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==, + } + engines: { node: ">=8.0.0" } + + "@opentelemetry/semantic-conventions@1.21.0": + resolution: + { + integrity: sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==, + } + engines: { node: ">=14" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@protobufjs/aspromise@1.1.2": + resolution: + { + integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, + } + + "@protobufjs/base64@1.1.2": + resolution: + { + integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, + } + + "@protobufjs/codegen@2.0.4": + resolution: + { + integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, + } + + "@protobufjs/eventemitter@1.1.0": + resolution: + { + integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, + } + + "@protobufjs/fetch@1.1.0": + resolution: + { + integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, + } + + "@protobufjs/float@1.0.2": + resolution: + { + integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, + } + + "@protobufjs/inquire@1.1.0": + resolution: + { + integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, + } + + "@protobufjs/path@1.1.2": + resolution: + { + integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, + } + + "@protobufjs/pool@1.1.0": + resolution: + { + integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, + } + + "@protobufjs/utf8@1.1.0": + resolution: + { + integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, + } + + "@sideway/address@4.1.5": + resolution: + { + integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==, + } + + "@sideway/formula@3.0.1": + resolution: + { + integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==, + } + + "@sideway/pinpoint@2.0.0": + resolution: + { + integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==, + } + + "@sinclair/typebox@0.27.8": + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + + "@sinonjs/commons@3.0.1": + resolution: + { + integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, + } + + "@sinonjs/fake-timers@10.3.0": + resolution: + { + integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, + } + + "@tootallnate/once@1.1.2": + resolution: + { + integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, + } + engines: { node: ">= 6" } + + "@tootallnate/once@2.0.0": + resolution: + { + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + } + engines: { node: ">= 10" } + + "@tsconfig/node10@1.0.11": + resolution: + { + integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==, + } + + "@tsconfig/node12@1.0.11": + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } + + "@tsconfig/node14@1.0.3": + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } + + "@tsconfig/node16@1.0.4": + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } + + "@types/babel__core@7.20.5": + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } + + "@types/babel__generator@7.6.8": + resolution: + { + integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, + } + + "@types/babel__template@7.4.4": + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } + + "@types/babel__traverse@7.20.6": + resolution: + { + integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==, + } + + "@types/body-parser@1.19.5": + resolution: + { + integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + } + + "@types/caseless@0.12.5": + resolution: + { + integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==, + } + + "@types/chai@4.3.17": + resolution: + { + integrity: sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==, + } + + "@types/connect@3.4.38": + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } + + "@types/cors@2.8.17": + resolution: + { + integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==, + } + + "@types/deep-equal@1.0.4": + resolution: + { + integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==, + } + + "@types/express-serve-static-core@4.17.24": + resolution: + { + integrity: sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==, + } + + "@types/express-serve-static-core@4.17.30": + resolution: + { + integrity: sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==, + } + + "@types/express-serve-static-core@4.19.0": + resolution: + { + integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==, + } + + "@types/express-serve-static-core@4.19.5": + resolution: + { + integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==, + } + + "@types/express@4.17.21": + resolution: + { + integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + } + + "@types/express@4.17.3": + resolution: + { + integrity: sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==, + } + + "@types/glob@8.1.0": + resolution: + { + integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==, + } + + "@types/graceful-fs@4.1.9": + resolution: + { + integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, + } + + "@types/http-errors@2.0.4": + resolution: + { + integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + } + + "@types/istanbul-lib-coverage@2.0.6": + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + + "@types/istanbul-lib-report@3.0.3": + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } + + "@types/istanbul-reports@3.0.4": + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + + "@types/jest@29.5.0": + resolution: + { + integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==, + } + + "@types/jsonwebtoken@9.0.6": + resolution: + { + integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==, + } + + "@types/linkify-it@5.0.0": + resolution: + { + integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==, + } + + "@types/lodash.chunk@4.2.9": + resolution: + { + integrity: sha512-Z9VtFUSnmT0No/QymqfG9AGbfOA4O5qB/uyP89xeZBqDAsKsB4gQFTqt7d0pHjbsTwtQ4yZObQVHuKlSOhIJ5Q==, + } + + "@types/lodash@4.17.7": + resolution: + { + integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==, + } + + "@types/long@4.0.2": + resolution: + { + integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==, + } + + "@types/markdown-it@14.1.2": + resolution: + { + integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==, + } + + "@types/mdurl@2.0.0": + resolution: + { + integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==, + } + + "@types/mime@1.3.5": + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } + + "@types/minimatch@5.1.2": + resolution: + { + integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==, + } + + "@types/mkdirp@1.0.2": + resolution: + { + integrity: sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==, + } + + "@types/node-fetch@2.6.11": + resolution: + { + integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, + } + + "@types/node@14.18.34": + resolution: + { + integrity: sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==, + } + + "@types/node@16.18.104": + resolution: + { + integrity: sha512-OF3keVCbfPlkzxnnDBUZJn1RiCJzKeadjiW0xTEb0G1SUJ5gDVb3qnzZr2T4uIFvsbKJbXy1v2DN7e2zaEY7jQ==, + } + + "@types/node@18.19.43": + resolution: + { + integrity: sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==, + } + + "@types/node@20.14.14": + resolution: + { + integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==, + } + + "@types/node@22.1.0": + resolution: + { + integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==, + } + + "@types/nodemailer-sendgrid@1.0.3": + resolution: + { + integrity: sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==, + } + + "@types/nodemailer@6.4.15": + resolution: + { + integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==, + } + + "@types/qs@6.9.15": + resolution: + { + integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==, + } + + "@types/range-parser@1.2.7": + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } + + "@types/request@2.48.12": + resolution: + { + integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==, + } + + "@types/rimraf@3.0.2": + resolution: + { + integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==, + } + + "@types/send@0.17.4": + resolution: + { + integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + } + + "@types/serve-static@1.15.7": + resolution: + { + integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, + } + + "@types/stack-utils@2.0.3": + resolution: + { + integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, + } + + "@types/tough-cookie@4.0.5": + resolution: + { + integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, + } + + "@types/traverse@0.6.37": + resolution: + { + integrity: sha512-c90MVeDiUI1FhOZ6rLQ3kDWr50YE8+paDpM+5zbHjbmsqEp2DlMYkqnZnwbK9oI+NvDe8yRajup4jFwnVX6xsA==, + } + + "@types/uuid@3.4.13": + resolution: + { + integrity: sha512-pAeZeUbLE4Z9Vi9wsWV2bYPTweEHeJJy0G4pEjOA/FSvy1Ad5U5Km8iDV6TKre1mjBiVNfAdVHKruP8bAh4Q5A==, + } + + "@types/uuid@8.3.4": + resolution: + { + integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, + } + + "@types/workerpool@6.4.7": + resolution: + { + integrity: sha512-DI2U4obcMzFViyNjLw0xXspim++qkAJ4BWRdYPVMMFtOpTvMr6PAk3UTZEoSqnZnvgUkJ3ck97Ybk+iIfuJHMg==, + } + + "@types/yargs-parser@21.0.3": + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } + + "@types/yargs@17.0.33": + resolution: + { + integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==, + } + + "@webassemblyjs/ast@1.9.0": + resolution: + { + integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==, + } + + "@webassemblyjs/floating-point-hex-parser@1.9.0": + resolution: + { + integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==, + } + + "@webassemblyjs/helper-api-error@1.9.0": + resolution: + { + integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==, + } + + "@webassemblyjs/helper-buffer@1.9.0": + resolution: + { + integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==, + } + + "@webassemblyjs/helper-code-frame@1.9.0": + resolution: + { + integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==, + } + + "@webassemblyjs/helper-fsm@1.9.0": + resolution: + { + integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==, + } + + "@webassemblyjs/helper-module-context@1.9.0": + resolution: + { + integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==, + } + + "@webassemblyjs/helper-wasm-bytecode@1.9.0": + resolution: + { + integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==, + } + + "@webassemblyjs/helper-wasm-section@1.9.0": + resolution: + { + integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==, + } + + "@webassemblyjs/ieee754@1.9.0": + resolution: + { + integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==, + } + + "@webassemblyjs/leb128@1.9.0": + resolution: + { + integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==, + } + + "@webassemblyjs/utf8@1.9.0": + resolution: + { + integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==, + } + + "@webassemblyjs/wasm-edit@1.9.0": + resolution: + { + integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==, + } + + "@webassemblyjs/wasm-gen@1.9.0": + resolution: + { + integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==, + } + + "@webassemblyjs/wasm-opt@1.9.0": + resolution: + { + integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==, + } + + "@webassemblyjs/wasm-parser@1.9.0": + resolution: + { + integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==, + } + + "@webassemblyjs/wast-parser@1.9.0": + resolution: + { + integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==, + } + + "@webassemblyjs/wast-printer@1.9.0": + resolution: + { + integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==, + } + + "@webpack-cli/configtest@1.2.0": + resolution: + { + integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==, + } + peerDependencies: + webpack: 4.x.x || 5.x.x + webpack-cli: 4.x.x + + "@webpack-cli/info@1.5.0": + resolution: + { + integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==, + } + peerDependencies: + webpack-cli: 4.x.x + + "@webpack-cli/serve@1.7.0": + resolution: + { + integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==, + } + peerDependencies: + webpack-cli: 4.x.x + webpack-dev-server: "*" + peerDependenciesMeta: + webpack-dev-server: + optional: true + + "@xtuc/ieee754@1.2.0": + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } + + "@xtuc/long@4.2.2": + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } + + abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } + + accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: + { + integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==, + } + engines: { node: ">=0.4.0" } + + acorn@6.4.2: + resolution: + { + integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + acorn@8.12.1: + resolution: + { + integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: ">= 6.0.0" } + + agent-base@7.1.1: + resolution: + { + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, + } + engines: { node: ">= 14" } + + ajv-errors@1.0.1: + resolution: + { + integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==, + } + peerDependencies: + ajv: ">=5.0.0" + + ajv-keywords@3.5.2: + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + + ansi-escapes@3.2.0: + resolution: + { + integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==, + } + engines: { node: ">=4" } + + ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: ">=8" } + + ansi-escapes@7.0.0: + resolution: + { + integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, + } + engines: { node: ">=18" } + + ansi-regex@3.0.1: + resolution: + { + integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==, + } + engines: { node: ">=4" } + + ansi-regex@4.1.1: + resolution: + { + integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, + } + engines: { node: ">=6" } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + + ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: ">=10" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + anymatch@2.0.0: + resolution: + { + integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==, + } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + append-transform@1.0.0: + resolution: + { + integrity: sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==, + } + engines: { node: ">=4" } + + aproba@1.2.0: + resolution: + { + integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==, + } + + archy@1.0.0: + resolution: + { + integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==, + } + + arg@4.1.3: + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } + + argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + argv@0.0.2: + resolution: + { + integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==, + } + engines: { node: ">=0.6.10" } + deprecated: + Package no longer supported. Contact Support at + https://www.npmjs.com/support for more info. + + arr-diff@4.0.0: + resolution: + { + integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, + } + engines: { node: ">=0.10.0" } + + arr-flatten@1.1.0: + resolution: + { + integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, + } + engines: { node: ">=0.10.0" } + + arr-union@3.1.0: + resolution: + { + integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, + } + engines: { node: ">=0.10.0" } + + array-buffer-byte-length@1.0.1: + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: ">= 0.4" } + + array-flatten@1.1.1: + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } + + array-unique@0.3.2: + resolution: + { + integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, + } + engines: { node: ">=0.10.0" } + + arraybuffer.prototype.slice@1.0.3: + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: ">= 0.4" } + + arrify@2.0.1: + resolution: + { + integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, + } + engines: { node: ">=8" } + + asn1.js@4.10.1: + resolution: + { + integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==, + } + + assert@1.5.1: + resolution: + { + integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==, + } + + assertion-error@1.1.0: + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } + + assign-symbols@1.0.0: + resolution: + { + integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, + } + engines: { node: ">=0.10.0" } + + async-each@1.0.6: + resolution: + { + integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==, + } + + async-retry@1.3.3: + resolution: + { + integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, + } + + asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + atob@2.1.2: + resolution: + { + integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, + } + engines: { node: ">= 4.5.0" } + hasBin: true + + available-typed-arrays@1.0.7: + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } + + axios@1.7.3: + resolution: + { + integrity: sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==, + } + + babel-jest@29.7.0: + resolution: + { + integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@babel/core": ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + } + engines: { node: ">=8" } + + babel-plugin-jest-hoist@29.6.3: + resolution: + { + integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + babel-preset-current-node-syntax@1.0.1: + resolution: + { + integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, + } + peerDependencies: + "@babel/core": ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: + { + integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@babel/core": ^7.0.0 + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base32.js@0.1.0: + resolution: + { + integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==, + } + engines: { node: ">=0.12.0" } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + base@0.11.2: + resolution: + { + integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, + } + engines: { node: ">=0.10.0" } + + big.js@5.2.2: + resolution: + { + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, + } + + big.js@6.2.1: + resolution: + { + integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==, + } + + bignumber.js@9.1.2: + resolution: + { + integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==, + } + + binary-extensions@1.13.1: + resolution: + { + integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==, + } + engines: { node: ">=0.10.0" } + + binary-extensions@2.3.0: + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } + + bindings@1.5.0: + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } + + bluebird@3.7.2: + resolution: + { + integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, + } + + bn.js@4.12.0: + resolution: + { + integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, + } + + bn.js@5.2.1: + resolution: + { + integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, + } + + body-parser@1.20.2: + resolution: + { + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + + brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + + braces@2.3.2: + resolution: + { + integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, + } + engines: { node: ">=0.10.0" } + + braces@3.0.3: + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } + + brorand@1.1.0: + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } + + browserify-aes@1.2.0: + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } + + browserify-cipher@1.0.1: + resolution: + { + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, + } + + browserify-des@1.0.2: + resolution: + { + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, + } + + browserify-rsa@4.1.0: + resolution: + { + integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==, + } + + browserify-sign@4.2.3: + resolution: + { + integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==, + } + engines: { node: ">= 0.12" } + + browserify-zlib@0.2.0: + resolution: + { + integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, + } + + browserslist@4.23.3: + resolution: + { + integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + bs-logger@0.2.6: + resolution: + { + integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, + } + engines: { node: ">= 6" } + + bser@2.1.1: + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + } + + buffer-equal-constant-time@1.0.1: + resolution: + { + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, + } + + buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + buffer-xor@1.0.3: + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } + + buffer@4.9.2: + resolution: + { + integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, + } + + builtin-status-codes@3.0.0: + resolution: + { + integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, + } + + bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } + + cacache@12.0.4: + resolution: + { + integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==, + } + + cache-base@1.0.1: + resolution: + { + integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, + } + engines: { node: ">=0.10.0" } + + caching-transform@3.0.2: + resolution: + { + integrity: sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==, + } + engines: { node: ">=6" } + + call-bind@1.0.7: + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } + + callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: ">=6" } + + camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: ">=10" } + + caniuse-lite@1.0.30001651: + resolution: + { + integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==, + } + + catharsis@0.9.0: + resolution: + { + integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==, + } + engines: { node: ">= 10" } + + chai@4.5.0: + resolution: + { + integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==, + } + engines: { node: ">=4" } + + chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + char-regex@1.0.2: + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: ">=10" } + + chardet@0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } + + check-error@1.0.3: + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + } + + check-more-types@2.24.0: + resolution: + { + integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==, + } + engines: { node: ">= 0.8.0" } + + child_process@1.0.2: + resolution: + { + integrity: sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==, + } + + chokidar@2.1.8: + resolution: + { + integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==, + } + deprecated: + Chokidar 2 does not receive security updates since 2019. Upgrade to + chokidar 3 with 15x fewer dependencies + + chokidar@3.6.0: + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } + + chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + + chrome-trace-event@1.0.4: + resolution: + { + integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, + } + engines: { node: ">=6.0" } + + ci-info@3.9.0: + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: ">=8" } + + cipher-base@1.0.4: + resolution: + { + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, + } + + cjs-module-lexer@1.3.1: + resolution: + { + integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==, + } + + class-utils@0.3.6: + resolution: + { + integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, + } + engines: { node: ">=0.10.0" } + + cli-cursor@2.1.0: + resolution: + { + integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, + } + engines: { node: ">=4" } + + cli-cursor@5.0.0: + resolution: + { + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, + } + engines: { node: ">=18" } + + cli-truncate@4.0.0: + resolution: + { + integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, + } + engines: { node: ">=18" } + + cli-width@2.2.1: + resolution: + { + integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==, + } + + cliui@5.0.0: + resolution: + { + integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==, + } + + cliui@7.0.4: + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + clone-deep@4.0.1: + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: ">=6" } + + co@4.6.0: + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + + codecov@3.8.3: + resolution: + { + integrity: sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==, + } + engines: { node: ">=4.0" } + deprecated: https://about.codecov.io/blog/codecov-uploader-deprecation-plan/ + hasBin: true + + collect-v8-coverage@1.0.2: + resolution: + { + integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, + } + + collection-visit@1.0.0: + resolution: + { + integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, + } + engines: { node: ">=0.10.0" } + + color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + + color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } + + colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + + combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + + commander@12.1.0: + resolution: + { + integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, + } + engines: { node: ">=18" } + + commander@2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + + commander@3.0.2: + resolution: + { + integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==, + } + + commander@5.0.0: + resolution: + { + integrity: sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==, + } + engines: { node: ">= 6" } + + commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + + commondir@1.0.1: + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } + + component-emitter@1.3.1: + resolution: + { + integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==, + } + + compressible@2.0.18: + resolution: + { + integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, + } + engines: { node: ">= 0.6" } + + concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + concat-stream@1.6.2: + resolution: + { + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, + } + engines: { "0": node >= 0.8 } + + concurrency@0.1.4: + resolution: + { + integrity: sha512-uwS/Z8zsvOUnIfTiMM5kV5N5JnsrR1fpt5thlg723jELkoORXmFs+BJHOaCn9OTGpCVkfG3vqiLGBPHiBXxKaA==, + } + + concurrently@7.6.0: + resolution: + { + integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==, + } + engines: { node: ^12.20.0 || ^14.13.0 || >=16.0.0 } + hasBin: true + + concurrently@8.2.2: + resolution: + { + integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==, + } + engines: { node: ^14.13.0 || >=16.0.0 } + hasBin: true + + console-browserify@1.2.0: + resolution: + { + integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==, + } + + constants-browserify@1.0.0: + resolution: + { + integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==, + } + + content-disposition@0.5.4: + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: ">= 0.6" } + + content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + + convert-source-map@1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + cookie-signature@1.0.6: + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } + + cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } + + copy-concurrently@1.0.5: + resolution: + { + integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==, + } + deprecated: This package is no longer supported. + + copy-descriptor@0.1.1: + resolution: + { + integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, + } + engines: { node: ">=0.10.0" } + + core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + cors@2.8.5: + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, + } + engines: { node: ">= 0.10" } + + cp-file@6.2.0: + resolution: + { + integrity: sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==, + } + engines: { node: ">=6" } + + create-ecdh@4.0.4: + resolution: + { + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, + } + + create-hash@1.2.0: + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } + + create-hmac@1.1.7: + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } + + create-jest@29.7.0: + resolution: + { + integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + + create-require@1.1.1: + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } + + cross-spawn@4.0.2: + resolution: + { + integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==, + } + + cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + + crypto-browserify@3.12.0: + resolution: + { + integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==, + } + + cyclist@1.0.2: + resolution: + { + integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==, + } + + data-view-buffer@1.0.1: + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: ">= 0.4" } + + data-view-byte-length@1.0.1: + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: ">= 0.4" } + + data-view-byte-offset@1.0.0: + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: ">= 0.4" } + + date-fns@2.30.0: + resolution: + { + integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, + } + engines: { node: ">=0.11" } + + debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.2: + resolution: + { + integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: + { + integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: ">=0.10.0" } + + decode-uri-component@0.2.2: + resolution: + { + integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==, + } + engines: { node: ">=0.10" } + + dedent@1.5.3: + resolution: + { + integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==, + } + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@4.1.4: + resolution: + { + integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==, + } + engines: { node: ">=6" } + + deep-equal@2.2.3: + resolution: + { + integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==, + } + engines: { node: ">= 0.4" } + + deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } + + default-require-extensions@2.0.0: + resolution: + { + integrity: sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==, + } + engines: { node: ">=4" } + + define-data-property@1.1.4: + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } + + define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + + define-property@0.2.5: + resolution: + { + integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, + } + engines: { node: ">=0.10.0" } + + define-property@1.0.0: + resolution: + { + integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, + } + engines: { node: ">=0.10.0" } + + define-property@2.0.2: + resolution: + { + integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, + } + engines: { node: ">=0.10.0" } + + delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + + depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + + des.js@1.1.0: + resolution: + { + integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==, + } + + destroy@1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + + detect-libc@2.0.3: + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } + + detect-newline@3.1.0: + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: ">=8" } + + diff-sequences@29.6.3: + resolution: + { + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + diff@4.0.2: + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: ">=0.3.1" } + + diffie-hellman@5.0.3: + resolution: + { + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, + } + + discontinuous-range@1.0.0: + resolution: + { + integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==, + } + + domain-browser@1.2.0: + resolution: + { + integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==, + } + engines: { node: ">=0.4", npm: ">=1.2" } + + dotenv@16.4.5: + resolution: + { + integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==, + } + engines: { node: ">=12" } + + duplexify@3.7.1: + resolution: + { + integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==, + } + + duplexify@4.1.3: + resolution: + { + integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==, + } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + ecdsa-sig-formatter@1.0.11: + resolution: + { + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, + } + + ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } + + electron-to-chromium@1.5.5: + resolution: + { + integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==, + } + + elliptic@6.5.6: + resolution: + { + integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==, + } + + emittery@0.13.1: + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + } + engines: { node: ">=12" } + + emoji-regex@10.3.0: + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } + + emoji-regex@7.0.3: + resolution: + { + integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + emojis-list@3.0.0: + resolution: + { + integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, + } + engines: { node: ">= 4" } + + encodeurl@1.0.2: + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } + + end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + + enhanced-resolve@4.5.0: + resolution: + { + integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==, + } + engines: { node: ">=6.9.0" } + + ent@2.2.1: + resolution: + { + integrity: sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==, + } + engines: { node: ">= 0.4" } + + entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + envinfo@7.13.0: + resolution: + { + integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==, + } + engines: { node: ">=4" } + hasBin: true + + environment@1.1.0: + resolution: + { + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, + } + engines: { node: ">=18" } + + errno@0.1.8: + resolution: + { + integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==, + } + hasBin: true + + error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + + es-abstract@1.23.3: + resolution: + { + integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==, + } + engines: { node: ">= 0.4" } + + es-define-property@1.0.0: + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } + + es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } + + es-get-iterator@1.1.3: + resolution: + { + integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, + } + + es-object-atoms@1.0.0: + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } + + es-set-tostringtag@2.0.3: + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: ">= 0.4" } + + es-to-primitive@1.2.1: + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } + + es6-error@4.1.1: + resolution: + { + integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==, + } + + escalade@3.1.2: + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } + + escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } + + escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + escape-string-regexp@2.0.0: + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + } + engines: { node: ">=8" } + + escodegen@1.14.3: + resolution: + { + integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, + } + engines: { node: ">=4.0" } + hasBin: true + + eslint-scope@4.0.3: + resolution: + { + integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==, + } + engines: { node: ">=4.0.0" } + + eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + + esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + + estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } + + estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } + + event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + events@3.3.0: + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } + + evp_bytestokey@1.0.3: + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } + + exec@0.2.1: + resolution: + { + integrity: sha512-lE5ZlJgRYh+rmwidatL2AqRA/U9IBoCpKlLriBmnfUIrV/Rj4oLjb63qZ57iBCHWi5j9IjLt5wOWkFYPiTfYAg==, + } + engines: { node: ">= v0.9.1" } + deprecated: deprecated in favor of builtin child_process.execFile + + execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + + execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + + exit@0.1.2: + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + } + engines: { node: ">= 0.8.0" } + + expand-brackets@2.1.4: + resolution: + { + integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, + } + engines: { node: ">=0.10.0" } + + expect@29.7.0: + resolution: + { + integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + express@4.19.2: + resolution: + { + integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, + } + engines: { node: ">= 0.10.0" } + + extend-shallow@2.0.1: + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } + + extend-shallow@3.0.2: + resolution: + { + integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, + } + engines: { node: ">=0.10.0" } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + external-editor@3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: ">=4" } + + extglob@2.0.4: + resolution: + { + integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, + } + engines: { node: ">=0.10.0" } + + faker@5.5.3: + resolution: + { + integrity: sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==, + } + + farmhash-modern@1.1.0: + resolution: + { + integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==, + } + engines: { node: ">=18.0.0" } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + fast-text-encoding@1.0.6: + resolution: + { + integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==, + } + + fast-url-parser@1.1.3: + resolution: + { + integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==, + } + + fast-xml-parser@4.4.1: + resolution: + { + integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==, + } + hasBin: true + + fastest-levenshtein@1.0.16: + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: ">= 4.9.1" } + + faye-websocket@0.11.4: + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: ">=0.8.0" } + + fb-watchman@2.0.2: + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + } + + figgy-pudding@3.5.2: + resolution: + { + integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==, + } + deprecated: This module is no longer supported. + + figures@2.0.0: + resolution: + { + integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, + } + engines: { node: ">=4" } + + file-type@10.11.0: + resolution: + { + integrity: sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==, + } + engines: { node: ">=6" } + + file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + + filename-reserved-regex@2.0.0: + resolution: + { + integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==, + } + engines: { node: ">=4" } + + filenamify@4.3.0: + resolution: + { + integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==, + } + engines: { node: ">=8" } + + fill-range@4.0.0: + resolution: + { + integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, + } + engines: { node: ">=0.10.0" } + + fill-range@7.1.1: + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } + + finalhandler@1.2.0: + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + } + engines: { node: ">= 0.8" } + + find-cache-dir@2.1.0: + resolution: + { + integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==, + } + engines: { node: ">=6" } + + find-up@3.0.0: + resolution: + { + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, + } + engines: { node: ">=6" } + + find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + + firebase-admin@11.11.1: + resolution: + { + integrity: sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==, + } + engines: { node: ">=14" } + + firebase-admin@12.3.0: + resolution: + { + integrity: sha512-AKJcFbOZ7W8Fwcqh6Ba7FThXVoXwPdsf+E9vyjk5Z1vN1Z9mnTw88EQWfIsR91YglQ0KvWu1rvMhW65bcB4sog==, + } + engines: { node: ">=14" } + + firebase-functions-test@0.2.3: + resolution: + { + integrity: sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==, + } + engines: { node: ">=8.0.0" } + peerDependencies: + firebase-admin: ">=6.0.0" + firebase-functions: ">=2.0.0" + + firebase-functions-test@0.3.3: + resolution: + { + integrity: sha512-dCppF/2Ztv87IyyBaUQlT1Z05ial5v/3LB0huS2ktXz05yNiID5FVIKtO0/+w9Q7/SThJ8qIDG0hoGDPt4Xcug==, + } + engines: { node: ">=8.0.0" } + peerDependencies: + firebase-admin: ">=6.0.0" + firebase-functions: ">=2.0.0" + + firebase-functions-test@3.2.0: + resolution: + { + integrity: sha512-UkOPIJH4I4qUGGSr4vaBcbAqn+YblVtMqRI2KQMW2nhMw5So91Iw1klu5Epk8vhEOhn1LPG5/tMaBI1MAtOt6Q==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + firebase-admin: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 + firebase-functions: ">=4.9.0" + jest: ">=28.0.0" + + firebase-functions@4.9.0: + resolution: + { + integrity: sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==, + } + engines: { node: ">=14.10.0" } + hasBin: true + peerDependencies: + firebase-admin: ^10.0.0 || ^11.0.0 || ^12.0.0 + + firebase-functions@5.0.1: + resolution: + { + integrity: sha512-1m+crtgAR8Tl36gjpM02KCY5zduAejFmDSXvih/DB93apg39f0U/WwRgT7sitGIRqyCcIpktNUbXJv7Y9JOF4A==, + } + engines: { node: ">=14.10.0" } + hasBin: true + peerDependencies: + firebase-admin: ^11.10.0 || ^12.0.0 + + firebase@10.12.5: + resolution: + { + integrity: sha512-J0yL3yh12CfFprTkSOQ9HqBugERyqvWwOuOoo1j1QHmYe9cYLKnBmtNCvGIYInDcsVUnJoRXCM+hxbGf48oVhg==, + } + + firebase@9.23.0: + resolution: + { + integrity: sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA==, + } + + flat@5.0.2: + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } + hasBin: true + + flush-write-stream@1.1.1: + resolution: + { + integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==, + } + + follow-redirects@1.15.6: + resolution: + { + integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + + for-in@1.0.2: + resolution: + { + integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==, + } + engines: { node: ">=0.10.0" } + + foreground-child@1.5.6: + resolution: + { + integrity: sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==, + } + + foreground-child@3.3.0: + resolution: + { + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: ">=14" } + + form-data@2.5.1: + resolution: + { + integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==, + } + engines: { node: ">= 0.12" } + + form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + + forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } + + fragment-cache@0.2.1: + resolution: + { + integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, + } + engines: { node: ">=0.10.0" } + + fresh@0.5.2: + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } + + from2@2.3.0: + resolution: + { + integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, + } + + fs-find@0.4.0: + resolution: + { + integrity: sha512-TPvyMSLMShZY4gjBgAseUGpKeg602/yCHwWwWTwjWuqBeSr4Usi9AXRED7LVDKKaaWZ+c1lfxnN1uNTUXWF2cA==, + } + + fs-write-stream-atomic@1.0.10: + resolution: + { + integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==, + } + deprecated: This package is no longer supported. + + fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + fsevents@1.2.13: + resolution: + { + integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==, + } + engines: { node: ">= 4.0" } + os: [darwin] + deprecated: + The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe + fsevents v2 + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + function.prototype.name@1.1.6: + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } + + functional-red-black-tree@1.0.1: + resolution: + { + integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==, + } + + functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + + gaxios@5.1.3: + resolution: + { + integrity: sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==, + } + engines: { node: ">=12" } + + gaxios@6.7.0: + resolution: + { + integrity: sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==, + } + engines: { node: ">=14" } + + gcp-metadata@5.3.0: + resolution: + { + integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==, + } + engines: { node: ">=12" } + + gcp-metadata@6.1.0: + resolution: + { + integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==, + } + engines: { node: ">=14" } + + generate-schema@2.6.0: + resolution: + { + integrity: sha512-EUBKfJNzT8f91xUk5X5gKtnbdejZeE065UAJ3BCzE8VEbvwKI9Pm5jaWmqVeK1MYc1g5weAVFDTSJzN7ymtTqA==, + } + hasBin: true + + gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + + get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.2.0: + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } + + get-func-name@2.0.2: + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + } + + get-intrinsic@1.2.4: + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } + + get-package-type@0.1.0: + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + } + engines: { node: ">=8.0.0" } + + get-stdin@8.0.0: + resolution: + { + integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==, + } + engines: { node: ">=10" } + + get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + + get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + + get-symbol-description@1.0.2: + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: ">= 0.4" } + + get-value@2.0.6: + resolution: + { + integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, + } + engines: { node: ">=0.10.0" } + + glob-parent@3.1.0: + resolution: + { + integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==, + } + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob@11.0.0: + resolution: + { + integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==, + } + engines: { node: 20 || >=22 } + hasBin: true + + glob@7.1.5: + resolution: + { + integrity: sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==, + } + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + + globalthis@1.0.4: + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: ">= 0.4" } + + google-auth-library@8.9.0: + resolution: + { + integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==, + } + engines: { node: ">=12" } + + google-auth-library@9.13.0: + resolution: + { + integrity: sha512-p9Y03Uzp/Igcs36zAaB0XTSwZ8Y0/tpYiz5KIde5By+H9DCVUSYtDWZu6aFXsWTqENMb8BD/pDT3hR8NVrPkfA==, + } + engines: { node: ">=14" } + + google-gax@3.6.1: + resolution: + { + integrity: sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==, + } + engines: { node: ">=12" } + hasBin: true + + google-gax@4.3.9: + resolution: + { + integrity: sha512-tcjQr7sXVGMdlvcG25wSv98ap1dtF4Z6mcV0rztGIddOcezw4YMb/uTXg72JPrLep+kXcVjaJjg6oo3KLf4itQ==, + } + engines: { node: ">=14" } + + google-p12-pem@4.0.1: + resolution: + { + integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==, + } + engines: { node: ">=12.0.0" } + deprecated: Package is no longer maintained + hasBin: true + + gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + gtoken@6.1.2: + resolution: + { + integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==, + } + engines: { node: ">=12.0.0" } + + gtoken@7.1.0: + resolution: + { + integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==, + } + engines: { node: ">=14.0.0" } + + handlebars@4.7.8: + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, + } + engines: { node: ">=0.4.7" } + hasBin: true + + has-bigints@1.0.2: + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } + + has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + has-property-descriptors@1.0.2: + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } + + has-proto@1.0.3: + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: ">= 0.4" } + + has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + + has-tostringtag@1.0.2: + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } + + has-value@0.3.1: + resolution: + { + integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, + } + engines: { node: ">=0.10.0" } + + has-value@1.0.0: + resolution: + { + integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, + } + engines: { node: ">=0.10.0" } + + has-values@0.1.4: + resolution: + { + integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, + } + engines: { node: ">=0.10.0" } + + has-values@1.0.0: + resolution: + { + integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, + } + engines: { node: ">=0.10.0" } + + hash-base@3.0.4: + resolution: + { + integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==, + } + engines: { node: ">=4" } + + hash-base@3.1.0: + resolution: + { + integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, + } + engines: { node: ">=4" } + + hash.js@1.1.7: + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } + + hasha@3.0.0: + resolution: + { + integrity: sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==, + } + engines: { node: ">=4" } + + hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + + heap-js@2.5.0: + resolution: + { + integrity: sha512-kUGoI3p7u6B41z/dp33G6OaL7J4DRqRYwVmeIlwLClx7yaaAy7hoDExnuejTKtuDwfcatGmddHDEOjf6EyIxtQ==, + } + engines: { node: ">=10.0.0" } + + hmac-drbg@1.0.1: + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } + + hosted-git-info@2.8.9: + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + + html-entities@2.5.2: + resolution: + { + integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, + } + + html-escaper@2.0.2: + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } + + html-tags@3.3.1: + resolution: + { + integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, + } + engines: { node: ">=8" } + + http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + + http-parser-js@0.5.8: + resolution: + { + integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, + } + + http-proxy-agent@4.0.1: + resolution: + { + integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, + } + engines: { node: ">= 6" } + + http-proxy-agent@5.0.0: + resolution: + { + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + } + engines: { node: ">= 6" } + + https-browserify@1.0.0: + resolution: + { + integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==, + } + + https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: ">= 6" } + + https-proxy-agent@7.0.5: + resolution: + { + integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==, + } + engines: { node: ">= 14" } + + human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + + human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + + husky@9.1.4: + resolution: + { + integrity: sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==, + } + engines: { node: ">=18" } + hasBin: true + + iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + + idb@7.0.1: + resolution: + { + integrity: sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==, + } + + idb@7.1.1: + resolution: + { + integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, + } + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + iferr@0.1.5: + resolution: + { + integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==, + } + + ignore-walk@3.0.4: + resolution: + { + integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==, + } + + image-size@0.9.7: + resolution: + { + integrity: sha512-KRVgLNZkr00YGN0qn9MlIrmlxbRhsCcEb1Byq3WKGnIV4M48iD185cprRtaoK4t5iC+ym2Q5qlArxZ/V1yzDgA==, + } + engines: { node: ">=10.18.0" } + hasBin: true + + image-type@4.1.0: + resolution: + { + integrity: sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==, + } + engines: { node: ">=6" } + + import-local@3.2.0: + resolution: + { + integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, + } + engines: { node: ">=8" } + hasBin: true + + imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + infer-owner@1.0.4: + resolution: + { + integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, + } + + inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + deprecated: + This module is not supported, and leaks memory. Do not use it. Check out + lru-cache if you want a good and tested way to coalesce async requests by + a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: + { + integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, + } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + inquirer@6.5.2: + resolution: + { + integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==, + } + engines: { node: ">=6.0.0" } + + internal-slot@1.0.7: + resolution: + { + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, + } + engines: { node: ">= 0.4" } + + interpret@2.2.0: + resolution: + { + integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==, + } + engines: { node: ">= 0.10" } + + ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } + + ipv6-normalize@1.0.1: + resolution: + { + integrity: sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==, + } + + is-accessor-descriptor@1.0.1: + resolution: + { + integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==, + } + engines: { node: ">= 0.10" } + + is-arguments@1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: ">= 0.4" } + + is-array-buffer@3.0.4: + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: ">= 0.4" } + + is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + + is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + + is-bigint@1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } + + is-binary-path@1.0.1: + resolution: + { + integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==, + } + engines: { node: ">=0.10.0" } + + is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + + is-boolean-object@1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } + + is-buffer@1.1.6: + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } + + is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + + is-core-module@2.15.0: + resolution: + { + integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==, + } + engines: { node: ">= 0.4" } + + is-data-descriptor@1.0.1: + resolution: + { + integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==, + } + engines: { node: ">= 0.4" } + + is-data-view@1.0.1: + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: ">= 0.4" } + + is-date-object@1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } + + is-descriptor@0.1.7: + resolution: + { + integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==, + } + engines: { node: ">= 0.4" } + + is-descriptor@1.0.3: + resolution: + { + integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==, + } + engines: { node: ">= 0.4" } + + is-extendable@0.1.1: + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } + + is-extendable@1.0.1: + resolution: + { + integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, + } + engines: { node: ">=0.10.0" } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-fullwidth-code-point@2.0.0: + resolution: + { + integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==, + } + engines: { node: ">=4" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-fullwidth-code-point@4.0.0: + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: ">=12" } + + is-fullwidth-code-point@5.0.0: + resolution: + { + integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, + } + engines: { node: ">=18" } + + is-generator-fn@2.1.0: + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + } + engines: { node: ">=6" } + + is-glob@3.1.0: + resolution: + { + integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==, + } + engines: { node: ">=0.10.0" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-html@2.0.0: + resolution: + { + integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==, + } + engines: { node: ">=8" } + + is-map@2.0.3: + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: ">= 0.4" } + + is-negative-zero@2.0.3: + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } + + is-number-object@1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } + + is-number@3.0.0: + resolution: + { + integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, + } + engines: { node: ">=0.10.0" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-plain-object@2.0.4: + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: ">=0.10.0" } + + is-regex@1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } + + is-set@2.0.3: + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: ">= 0.4" } + + is-shared-array-buffer@1.0.3: + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: ">= 0.4" } + + is-stream-ended@0.1.4: + resolution: + { + integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==, + } + + is-stream@1.1.0: + resolution: + { + integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, + } + engines: { node: ">=0.10.0" } + + is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + + is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + is-string@1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } + + is-symbol@1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } + + is-typed-array@1.1.13: + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: ">= 0.4" } + + is-weakmap@2.0.2: + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: ">= 0.4" } + + is-weakref@1.0.2: + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } + + is-weakset@2.0.3: + resolution: + { + integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==, + } + engines: { node: ">= 0.4" } + + is-windows@1.0.2: + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } + + is-wsl@1.1.0: + resolution: + { + integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==, + } + engines: { node: ">=4" } + + is@3.3.0: + resolution: + { + integrity: sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==, + } + + isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + isobject@2.1.0: + resolution: + { + integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, + } + engines: { node: ">=0.10.0" } + + isobject@3.0.1: + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: ">=0.10.0" } + + istanbul-lib-coverage@2.0.5: + resolution: + { + integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==, + } + engines: { node: ">=6" } + + istanbul-lib-coverage@3.2.2: + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: ">=8" } + + istanbul-lib-hook@2.0.7: + resolution: + { + integrity: sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==, + } + engines: { node: ">=6" } + + istanbul-lib-instrument@3.3.0: + resolution: + { + integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==, + } + engines: { node: ">=6" } + + istanbul-lib-instrument@5.2.1: + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + } + engines: { node: ">=8" } + + istanbul-lib-instrument@6.0.3: + resolution: + { + integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==, + } + engines: { node: ">=10" } + + istanbul-lib-report@2.0.8: + resolution: + { + integrity: sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==, + } + engines: { node: ">=6" } + + istanbul-lib-report@3.0.1: + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: ">=10" } + + istanbul-lib-source-maps@3.0.6: + resolution: + { + integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==, + } + engines: { node: ">=6" } + + istanbul-lib-source-maps@4.0.1: + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + } + engines: { node: ">=10" } + + istanbul-reports@2.2.7: + resolution: + { + integrity: sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==, + } + engines: { node: ">=6" } + + istanbul-reports@3.1.7: + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: ">=8" } + + jackspeak@4.0.1: + resolution: + { + integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==, + } + engines: { node: 20 || >=22 } + + jest-changed-files@29.7.0: + resolution: + { + integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-circus@29.7.0: + resolution: + { + integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-cli@29.7.0: + resolution: + { + integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.5.0: + resolution: + { + integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + + jest-config@29.7.0: + resolution: + { + integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: + { + integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-docblock@29.7.0: + resolution: + { + integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-each@29.7.0: + resolution: + { + integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-environment-node@29.5.0: + resolution: + { + integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-environment-node@29.7.0: + resolution: + { + integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-get-type@29.6.3: + resolution: + { + integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-haste-map@29.7.0: + resolution: + { + integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-leak-detector@29.7.0: + resolution: + { + integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-matcher-utils@29.7.0: + resolution: + { + integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-message-util@29.7.0: + resolution: + { + integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-mock@29.7.0: + resolution: + { + integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-pnp-resolver@1.2.3: + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + } + engines: { node: ">=6" } + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: + { + integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-resolve-dependencies@29.7.0: + resolution: + { + integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-resolve@29.7.0: + resolution: + { + integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-runner@29.7.0: + resolution: + { + integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-runtime@29.7.0: + resolution: + { + integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-snapshot@29.7.0: + resolution: + { + integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-util@29.7.0: + resolution: + { + integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-validate@29.7.0: + resolution: + { + integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-watcher@29.7.0: + resolution: + { + integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest-worker@29.7.0: + resolution: + { + integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + jest@29.5.0: + resolution: + { + integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest@29.7.0: + resolution: + { + integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + joi@17.13.3: + resolution: + { + integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==, + } + + jose@4.15.9: + resolution: + { + integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==, + } + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + + js2xmlparser@4.0.2: + resolution: + { + integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==, + } + + jsdoc@4.0.3: + resolution: + { + integrity: sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==, + } + engines: { node: ">=12.0.0" } + hasBin: true + + jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + + json-bigint@1.0.0: + resolution: + { + integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, + } + + json-parse-better-errors@1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + + json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + + json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json5@1.0.2: + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } + hasBin: true + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + + jsonwebtoken@9.0.2: + resolution: + { + integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, + } + engines: { node: ">=12", npm: ">=6" } + + jwa@1.4.1: + resolution: + { + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, + } + + jwa@2.0.0: + resolution: + { + integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==, + } + + jwks-rsa@3.1.0: + resolution: + { + integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==, + } + engines: { node: ">=14" } + + jws@3.2.2: + resolution: + { + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, + } + + jws@4.0.0: + resolution: + { + integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==, + } + + kind-of@3.2.2: + resolution: + { + integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, + } + engines: { node: ">=0.10.0" } + + kind-of@4.0.0: + resolution: + { + integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==, + } + engines: { node: ">=0.10.0" } + + kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } + + klaw@3.0.0: + resolution: + { + integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==, + } + + kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } + + lazy-ass@1.6.0: + resolution: + { + integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==, + } + engines: { node: "> 0.8" } + + leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: ">=6" } + + levn@0.3.0: + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: ">= 0.8.0" } + + lilconfig@3.1.2: + resolution: + { + integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==, + } + engines: { node: ">=14" } + + limiter@1.1.5: + resolution: + { + integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==, + } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + linkify-it@5.0.0: + resolution: + { + integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, + } + + lint-staged@15.2.8: + resolution: + { + integrity: sha512-PUWFf2zQzsd9EFU+kM1d7UP+AZDbKFKuj+9JNVTBkhUFhbg4MAt6WfyMMwBfM4lYqd4D2Jwac5iuTu9rVj4zCQ==, + } + engines: { node: ">=18.12.0" } + hasBin: true + + listr2@8.2.4: + resolution: + { + integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==, + } + engines: { node: ">=18.0.0" } + + load-json-file@4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: ">=4" } + + loader-runner@2.4.0: + resolution: + { + integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==, + } + engines: { node: ">=4.3.0 <5.0.0 || >=5.10" } + + loader-utils@1.4.2: + resolution: + { + integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==, + } + engines: { node: ">=4.0.0" } + + locate-path@3.0.0: + resolution: + { + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, + } + engines: { node: ">=6" } + + locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + + lodash.camelcase@4.3.0: + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } + + lodash.chunk@4.2.0: + resolution: + { + integrity: sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==, + } + + lodash.clonedeep@4.5.0: + resolution: + { + integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, + } + + lodash.flattendeep@4.4.0: + resolution: + { + integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, + } + + lodash.includes@4.3.0: + resolution: + { + integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, + } + + lodash.isboolean@3.0.3: + resolution: + { + integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, + } + + lodash.isinteger@4.0.4: + resolution: + { + integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, + } + + lodash.isnumber@3.0.3: + resolution: + { + integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, + } + + lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + + lodash.isstring@4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + + lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + + lodash.once@4.1.1: + resolution: + { + integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, + } + + lodash.snakecase@4.1.1: + resolution: + { + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, + } + + lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + log-update@6.1.0: + resolution: + { + integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, + } + engines: { node: ">=18" } + + long@4.0.0: + resolution: + { + integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==, + } + + long@5.2.3: + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } + + loupe@2.3.7: + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + } + + lru-cache@11.0.0: + resolution: + { + integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==, + } + engines: { node: 20 || >=22 } + + lru-cache@4.1.5: + resolution: + { + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, + } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + + lru-memoizer@2.3.0: + resolution: + { + integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==, + } + + make-dir@2.1.0: + resolution: + { + integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, + } + engines: { node: ">=6" } + + make-dir@4.0.0: + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: ">=10" } + + make-error@1.3.6: + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } + + makeerror@1.0.12: + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } + + map-cache@0.2.2: + resolution: + { + integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==, + } + engines: { node: ">=0.10.0" } + + map-visit@1.0.0: + resolution: + { + integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, + } + engines: { node: ">=0.10.0" } + + markdown-it-anchor@8.6.7: + resolution: + { + integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==, + } + peerDependencies: + "@types/markdown-it": "*" + markdown-it: "*" + + markdown-it@14.1.0: + resolution: + { + integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, + } + hasBin: true + + marked@4.3.0: + resolution: + { + integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, + } + engines: { node: ">= 12" } + hasBin: true + + md5.js@1.3.5: + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } + + mdurl@2.0.0: + resolution: + { + integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, + } + + media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } + + memory-fs@0.4.1: + resolution: + { + integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==, + } + + memory-fs@0.5.0: + resolution: + { + integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==, + } + engines: { node: ">=4.3.0 <5.0.0 || >=5.10" } + + merge-descriptors@1.0.1: + resolution: + { + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, + } + + merge-source-map@1.1.0: + resolution: + { + integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==, + } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + methods@1.1.2: + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: ">= 0.6" } + + micromatch@3.1.10: + resolution: + { + integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==, + } + engines: { node: ">=0.10.0" } + + micromatch@4.0.7: + resolution: + { + integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==, + } + engines: { node: ">=8.6" } + + miller-rabin@4.0.1: + resolution: + { + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, + } + hasBin: true + + mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + + mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + + mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } + hasBin: true + + mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + + mimic-fn@1.2.0: + resolution: + { + integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, + } + engines: { node: ">=4" } + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + mimic-function@5.0.1: + resolution: + { + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + } + engines: { node: ">=18" } + + minimalistic-assert@1.0.1: + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } + + minimalistic-crypto-utils@1.0.1: + resolution: + { + integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, + } + + minimatch@10.0.1: + resolution: + { + integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, + } + engines: { node: 20 || >=22 } + + minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + minipass@7.1.2: + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: ">=16 || 14 >=14.17" } + + mississippi@3.0.0: + resolution: + { + integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==, + } + engines: { node: ">=4.0.0" } + + mixin-deep@1.3.2: + resolution: + { + integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, + } + engines: { node: ">=0.10.0" } + + mkdirp@0.5.6: + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } + hasBin: true + + mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: ">=10" } + hasBin: true + + mocked-env@1.3.5: + resolution: + { + integrity: sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==, + } + engines: { node: ">=6" } + + moo@0.5.2: + resolution: + { + integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==, + } + + move-concurrently@1.0.1: + resolution: + { + integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==, + } + deprecated: This package is no longer supported. + + ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + + ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + mute-stream@0.0.7: + resolution: + { + integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==, + } + + nan@2.20.0: + resolution: + { + integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==, + } + + nanoid@4.0.2: + resolution: + { + integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==, + } + engines: { node: ^14 || ^16 || >=18 } + hasBin: true + + nanomatch@1.2.13: + resolution: + { + integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, + } + engines: { node: ">=0.10.0" } + + natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + nearley@2.20.1: + resolution: + { + integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==, + } + hasBin: true + + negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } + + neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + + nested-error-stacks@2.1.1: + resolution: + { + integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==, + } + + node-fetch@2.6.7: + resolution: + { + integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + + node-int64@0.4.0: + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } + + node-libs-browser@2.2.1: + resolution: + { + integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==, + } + + node-releases@2.0.18: + resolution: + { + integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, + } + + nodemailer@6.9.13: + resolution: + { + integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==, + } + engines: { node: ">=6.0.0" } + + nodemailer@6.9.14: + resolution: + { + integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==, + } + engines: { node: ">=6.0.0" } + + normalize-package-data@2.5.0: + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + + normalize-path@2.1.1: + resolution: + { + integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==, + } + engines: { node: ">=0.10.0" } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + + npm-run-path@5.3.0: + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + nyc@14.1.1: + resolution: + { + integrity: sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==, + } + engines: { node: ">=6" } + hasBin: true + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + + object-copy@0.1.0: + resolution: + { + integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, + } + engines: { node: ">=0.10.0" } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + object-inspect@1.13.2: + resolution: + { + integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==, + } + engines: { node: ">= 0.4" } + + object-is@1.1.6: + resolution: + { + integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==, + } + engines: { node: ">= 0.4" } + + object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + + object-visit@1.0.1: + resolution: + { + integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, + } + engines: { node: ">=0.10.0" } + + object.assign@4.1.5: + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } + + object.pick@1.3.0: + resolution: + { + integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==, + } + engines: { node: ">=0.10.0" } + + on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@2.0.1: + resolution: + { + integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, + } + engines: { node: ">=4" } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + + onetime@7.0.0: + resolution: + { + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + } + engines: { node: ">=18" } + + optionator@0.8.3: + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: ">= 0.8.0" } + + os-browserify@0.3.0: + resolution: + { + integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==, + } + + os-homedir@1.0.2: + resolution: + { + integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==, + } + engines: { node: ">=0.10.0" } + + os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: ">=0.10.0" } + + p-defer@3.0.0: + resolution: + { + integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==, + } + engines: { node: ">=8" } + + p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-locate@3.0.0: + resolution: + { + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, + } + engines: { node: ">=6" } + + p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + + p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + + package-hash@3.0.0: + resolution: + { + integrity: sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==, + } + engines: { node: ">=6" } + + package-json-from-dist@1.0.0: + resolution: + { + integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==, + } + + pako@1.0.11: + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } + + parallel-transform@1.2.0: + resolution: + { + integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==, + } + + parse-asn1@5.1.7: + resolution: + { + integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==, + } + engines: { node: ">= 0.10" } + + parse-json@4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: ">=4" } + + parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: ">=8" } + + parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } + + pascalcase@0.1.1: + resolution: + { + integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, + } + engines: { node: ">=0.10.0" } + + path-browserify@0.0.1: + resolution: + { + integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==, + } + + path-dirname@1.0.2: + resolution: + { + integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==, + } + + path-exists@3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: ">=4" } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-scurry@2.0.0: + resolution: + { + integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, + } + engines: { node: 20 || >=22 } + + path-to-regexp@0.1.7: + resolution: + { + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, + } + + path-type@3.0.0: + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: ">=4" } + + pathval@1.1.1: + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } + + pbkdf2@3.1.2: + resolution: + { + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, + } + engines: { node: ">=0.12" } + + picocolors@1.0.1: + resolution: + { + integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + + pify@3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: ">=4" } + + pify@4.0.1: + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: ">=6" } + + pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + + pkg-dir@3.0.0: + resolution: + { + integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==, + } + engines: { node: ">=6" } + + pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: ">=8" } + + posix-character-classes@0.1.1: + resolution: + { + integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, + } + engines: { node: ">=0.10.0" } + + possible-typed-array-names@1.0.0: + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } + + prelude-ls@1.1.2: + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: ">= 0.8.0" } + + prettier@1.15.3: + resolution: + { + integrity: sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==, + } + engines: { node: ">=4" } + hasBin: true + + prettier@3.3.3: + resolution: + { + integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==, + } + engines: { node: ">=14" } + hasBin: true + + pretty-format@29.7.0: + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: ">= 0.6.0" } + + promise-inflight@1.0.1: + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } + peerDependencies: + bluebird: "*" + peerDependenciesMeta: + bluebird: + optional: true + + prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: ">= 6" } + + proto3-json-serializer@1.1.1: + resolution: + { + integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==, + } + engines: { node: ">=12.0.0" } + + proto3-json-serializer@2.0.2: + resolution: + { + integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==, + } + engines: { node: ">=14.0.0" } + + protobufjs-cli@1.1.1: + resolution: + { + integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==, + } + engines: { node: ">=12.0.0" } + hasBin: true + peerDependencies: + protobufjs: ^7.0.0 + + protobufjs@6.11.4: + resolution: + { + integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==, + } + hasBin: true + + protobufjs@7.2.4: + resolution: + { + integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==, + } + engines: { node: ">=12.0.0" } + + protobufjs@7.3.2: + resolution: + { + integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==, + } + engines: { node: ">=12.0.0" } + + proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } + + proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + + prr@1.0.1: + resolution: + { + integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==, + } + + pseudomap@1.0.2: + resolution: + { + integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, + } + + public-encrypt@4.0.3: + resolution: + { + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, + } + + pump@2.0.1: + resolution: + { + integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==, + } + + pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + + pumpify@1.5.1: + resolution: + { + integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==, + } + + punycode.js@2.3.1: + resolution: + { + integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, + } + engines: { node: ">=6" } + + punycode@1.4.1: + resolution: + { + integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + pure-rand@6.1.0: + resolution: + { + integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==, + } + + qs@6.11.0: + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: ">=0.6" } + + qs@6.13.0: + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, + } + engines: { node: ">=0.6" } + + querystring-es3@0.2.1: + resolution: + { + integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==, + } + engines: { node: ">=0.4.x" } + + queue@6.0.2: + resolution: + { + integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, + } + + railroad-diagrams@1.0.0: + resolution: + { + integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==, + } + + ramda@0.27.1: + resolution: + { + integrity: sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==, + } + + randexp@0.4.6: + resolution: + { + integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==, + } + engines: { node: ">=0.12" } + + randombytes@2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } + + randomfill@1.0.4: + resolution: + { + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, + } + + range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + + raw-body@2.5.2: + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } + + react-is@18.3.1: + resolution: + { + integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, + } + + read-pkg-up@4.0.0: + resolution: + { + integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==, + } + engines: { node: ">=6" } + + read-pkg@3.0.0: + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: ">=4" } + + readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + + readdirp@2.2.1: + resolution: + { + integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==, + } + engines: { node: ">=0.10" } + + readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + + rechoir@0.7.1: + resolution: + { + integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==, + } + engines: { node: ">= 0.10" } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + regex-not@1.0.2: + resolution: + { + integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, + } + engines: { node: ">=0.10.0" } + + regexp.prototype.flags@1.5.2: + resolution: + { + integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==, + } + engines: { node: ">= 0.4" } + + release-zalgo@1.0.0: + resolution: + { + integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==, + } + engines: { node: ">=4" } + + remove-trailing-separator@1.1.0: + resolution: + { + integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, + } + + repeat-element@1.1.4: + resolution: + { + integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, + } + engines: { node: ">=0.10.0" } + + repeat-string@1.6.1: + resolution: + { + integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, + } + engines: { node: ">=0.10" } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + require-main-filename@2.0.0: + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } + + requizzle@0.2.4: + resolution: + { + integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==, + } + + resolve-cwd@3.0.0: + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: ">=8" } + + resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } + + resolve-url@0.2.1: + resolution: + { + integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, + } + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve.exports@2.0.2: + resolution: + { + integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, + } + engines: { node: ">=10" } + + resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + + restore-cursor@2.0.0: + resolution: + { + integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, + } + engines: { node: ">=4" } + + restore-cursor@5.1.0: + resolution: + { + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + } + engines: { node: ">=18" } + + ret@0.1.15: + resolution: + { + integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, + } + engines: { node: ">=0.12" } + + retry-request@5.0.2: + resolution: + { + integrity: sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==, + } + engines: { node: ">=12" } + + retry-request@7.0.2: + resolution: + { + integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==, + } + engines: { node: ">=14" } + + retry@0.13.1: + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: ">= 4" } + + rfdc@1.4.1: + resolution: + { + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, + } + + rimraf@2.7.1: + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + } + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.2: + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } + + run-async@2.4.1: + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: ">=0.12.0" } + + run-queue@1.0.3: + resolution: + { + integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==, + } + + rxjs@6.6.7: + resolution: + { + integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, + } + engines: { npm: ">=2.0.0" } + + rxjs@7.8.1: + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } + + safe-array-concat@1.1.2: + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: ">=0.4" } + + safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safe-regex-test@1.0.3: + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: ">= 0.4" } + + safe-regex@1.1.0: + resolution: + { + integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, + } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + schema-utils@1.0.0: + resolution: + { + integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==, + } + engines: { node: ">= 4" } + + semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.6.3: + resolution: + { + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + } + engines: { node: ">=10" } + hasBin: true + + send@0.18.0: + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + } + engines: { node: ">= 0.8.0" } + + serialize-javascript@4.0.0: + resolution: + { + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, + } + + serve-static@1.15.0: + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + } + engines: { node: ">= 0.8.0" } + + set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + + set-function-length@1.2.2: + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } + + set-function-name@2.0.2: + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } + + set-value@2.0.1: + resolution: + { + integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, + } + engines: { node: ">=0.10.0" } + + setimmediate@1.0.5: + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } + + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + + sha.js@2.4.11: + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } + hasBin: true + + shallow-clone@3.0.1: + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: ">=8" } + + sharp@0.33.4: + resolution: + { + integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==, + } + engines: { libvips: ">=8.15.2", node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + shell-quote@1.8.1: + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } + + side-channel@1.0.6: + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + + slice-ansi@5.0.0: + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: ">=12" } + + slice-ansi@7.1.0: + resolution: + { + integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, + } + engines: { node: ">=18" } + + smtp-server@3.13.4: + resolution: + { + integrity: sha512-BbElv5UP+HgPtCZtcRW35N/GFoc4DzPkrbSMLioXsrVMmQT1mMBoO0k+egl264hxWaWczoVvadSPY2pLUINFXg==, + } + engines: { node: ">=12.0.0" } + + snapdragon-node@2.1.1: + resolution: + { + integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, + } + engines: { node: ">=0.10.0" } + + snapdragon-util@3.0.1: + resolution: + { + integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, + } + engines: { node: ">=0.10.0" } + + snapdragon@0.8.2: + resolution: + { + integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, + } + engines: { node: ">=0.10.0" } + + source-list-map@2.0.1: + resolution: + { + integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, + } + + source-map-resolve@0.5.3: + resolution: + { + integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, + } + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.13: + resolution: + { + integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, + } + + source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + + source-map-url@0.4.1: + resolution: + { + integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, + } + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.5.7: + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: ">=0.10.0" } + + source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + spawn-command@0.0.2: + resolution: + { + integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==, + } + + spawn-wrap@1.4.3: + resolution: + { + integrity: sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==, + } + + spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + + spdx-exceptions@2.5.0: + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } + + spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + + spdx-license-ids@3.0.18: + resolution: + { + integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==, + } + + split-string@3.1.0: + resolution: + { + integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, + } + engines: { node: ">=0.10.0" } + + sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + + sql-formatter@15.3.2: + resolution: + { + integrity: sha512-pNxSMf5DtwhpZ8gUcOGCGZIWtCcyAUx9oLgAtlO4ag7DvlfnETL0BGqXaISc84pNrXvTWmt8Wal1FWKxdTsL3Q==, + } + hasBin: true + + sql-formatter@2.3.4: + resolution: + { + integrity: sha512-CajWtvzYoBJbD5PQeVe3E7AOHAIYvRQEPOKgF9kfKNeY8jtjBiiA6pDzkMuAID8jJMluoPvyKveLigSaA5tKQQ==, + } + + ssri@6.0.2: + resolution: + { + integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==, + } + + stack-utils@2.0.6: + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + } + engines: { node: ">=10" } + + static-extend@0.1.2: + resolution: + { + integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, + } + engines: { node: ">=0.10.0" } + + statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + + stop-iteration-iterator@1.0.0: + resolution: + { + integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, + } + engines: { node: ">= 0.4" } + + stream-browserify@2.0.2: + resolution: + { + integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==, + } + + stream-each@1.2.3: + resolution: + { + integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==, + } + + stream-events@1.0.5: + resolution: + { + integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==, + } + + stream-http@2.8.3: + resolution: + { + integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==, + } + + stream-shift@1.0.3: + resolution: + { + integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==, + } + + string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + + string-length@4.0.2: + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + } + engines: { node: ">=10" } + + string-width@2.1.1: + resolution: + { + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==, + } + engines: { node: ">=4" } + + string-width@3.1.0: + resolution: + { + integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==, + } + engines: { node: ">=6" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } + + string.prototype.trim@1.2.9: + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: ">= 0.4" } + + string.prototype.trimend@1.0.8: + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } + + string.prototype.trimstart@1.0.8: + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } + + string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + strip-ansi@4.0.0: + resolution: + { + integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==, + } + engines: { node: ">=4" } + + strip-ansi@5.2.0: + resolution: + { + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, + } + engines: { node: ">=6" } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + strip-bom@4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: ">=8" } + + strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + + strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + + strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + strip-outer@1.0.1: + resolution: + { + integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==, + } + engines: { node: ">=0.10.0" } + + strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + + stubs@3.0.0: + resolution: + { + integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==, + } + + supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + + supports-color@6.1.0: + resolution: + { + integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==, + } + engines: { node: ">=6" } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + + supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + tapable@1.1.3: + resolution: + { + integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, + } + engines: { node: ">=6" } + + teeny-request@7.1.1: + resolution: + { + integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==, + } + engines: { node: ">=10" } + + teeny-request@8.0.3: + resolution: + { + integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==, + } + engines: { node: ">=12" } + + teeny-request@9.0.0: + resolution: + { + integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==, + } + engines: { node: ">=14" } + + terser-webpack-plugin@1.4.6: + resolution: + { + integrity: sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==, + } + engines: { node: ">= 6.9.0" } + peerDependencies: + webpack: ^4.0.0 + + terser@4.8.1: + resolution: + { + integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + test-exclude@5.2.3: + resolution: + { + integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==, + } + engines: { node: ">=6" } + + test-exclude@6.0.0: + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: ">=8" } + + text-decoding@1.0.0: + resolution: + { + integrity: sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==, + } + + through2@2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + + through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + timers-browserify@2.0.12: + resolution: + { + integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==, + } + engines: { node: ">=0.6.0" } + + tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } + + tmp@0.2.3: + resolution: + { + integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, + } + engines: { node: ">=14.14" } + + tmpl@1.0.5: + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } + + to-arraybuffer@1.0.1: + resolution: + { + integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==, + } + + to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + + to-object-path@0.3.0: + resolution: + { + integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, + } + engines: { node: ">=0.10.0" } + + to-regex-range@2.1.1: + resolution: + { + integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, + } + engines: { node: ">=0.10.0" } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + to-regex@3.0.2: + resolution: + { + integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, + } + engines: { node: ">=0.10.0" } + + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + + tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + traverse@0.6.9: + resolution: + { + integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==, + } + engines: { node: ">= 0.4" } + + tree-kill@1.2.2: + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } + hasBin: true + + trim-repeated@1.0.0: + resolution: + { + integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==, + } + engines: { node: ">=0.10.0" } + + ts-deepmerge@2.0.7: + resolution: + { + integrity: sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==, + } + + ts-jest@29.1.2: + resolution: + { + integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==, + } + engines: { node: ^16.10.0 || ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + esbuild: "*" + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@6.2.2: + resolution: + { + integrity: sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==, + } + engines: { node: ">=8.6" } + peerDependencies: + typescript: "*" + + ts-node@10.9.2: + resolution: + { + integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, + } + hasBin: true + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + + ts-node@9.1.1: + resolution: + { + integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==, + } + engines: { node: ">=10.0.0" } + hasBin: true + peerDependencies: + typescript: ">=2.7" + + tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + + tslib@2.6.3: + resolution: + { + integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==, + } + + tty-browserify@0.0.0: + resolution: + { + integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==, + } + + type-check@0.3.2: + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: ">= 0.8.0" } + + type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: ">=4" } + + type-detect@4.1.0: + resolution: + { + integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==, + } + engines: { node: ">=4" } + + type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: ">=10" } + + type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } + + type-of-is@3.5.1: + resolution: + { + integrity: sha512-SOnx8xygcAh8lvDU2exnK2bomASfNjzB3Qz71s2tw9QnX8fkAo7aC+D0H7FV0HjRKj94CKV2Hi71kVkkO6nOxg==, + } + engines: { node: ">=0.10.5" } + + typed-array-buffer@1.0.2: + resolution: + { + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-length@1.0.1: + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-offset@1.0.2: + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: ">= 0.4" } + + typed-array-length@1.0.6: + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: ">= 0.4" } + + typedarray.prototype.slice@1.0.3: + resolution: + { + integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==, + } + engines: { node: ">= 0.4" } + + typedarray@0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + + typescript@4.9.5: + resolution: + { + integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + } + engines: { node: ">=4.2.0" } + hasBin: true + + typescript@5.5.4: + resolution: + { + integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==, + } + engines: { node: ">=14.17" } + hasBin: true + + uc.micro@2.1.0: + resolution: + { + integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, + } + + uglify-js@3.19.1: + resolution: + { + integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==, + } + engines: { node: ">=0.8.0" } + hasBin: true + + unbox-primitive@1.0.2: + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } + + underscore@1.13.7: + resolution: + { + integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==, + } + + undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + undici-types@6.13.0: + resolution: + { + integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==, + } + + undici@5.28.4: + resolution: + { + integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==, + } + engines: { node: ">=14.0" } + + union-value@1.0.1: + resolution: + { + integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, + } + engines: { node: ">=0.10.0" } + + unique-filename@1.1.1: + resolution: + { + integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, + } + + unique-slug@2.0.2: + resolution: + { + integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, + } + + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } + + unset-value@1.0.0: + resolution: + { + integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, + } + engines: { node: ">=0.10.0" } + + upath@1.2.0: + resolution: + { + integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, + } + engines: { node: ">=4" } + + update-browserslist-db@1.1.0: + resolution: + { + integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + + urix@0.1.0: + resolution: + { + integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, + } + deprecated: Please see https://github.com/lydell/urix#deprecated + + url@0.11.4: + resolution: + { + integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==, + } + engines: { node: ">= 0.4" } + + urlgrey@1.0.0: + resolution: + { + integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==, + } + + use@3.1.1: + resolution: + { + integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, + } + engines: { node: ">=0.10.0" } + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + util@0.10.4: + resolution: + { + integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==, + } + + util@0.11.1: + resolution: + { + integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==, + } + + utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } + + uuid@10.0.0: + resolution: + { + integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, + } + hasBin: true + + uuid@3.4.0: + resolution: + { + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, + } + deprecated: + Please upgrade to version 7 or higher. Older versions may use + Math.random() in certain circumstances, which is known to be + problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + + uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + + uuidv4@6.2.13: + resolution: + { + integrity: sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==, + } + + v8-compile-cache-lib@3.0.1: + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } + + v8-to-istanbul@9.3.0: + resolution: + { + integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==, + } + engines: { node: ">=10.12.0" } + + validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + + vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } + + vm-browserify@1.1.2: + resolution: + { + integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, + } + + wait-for-expect@3.0.2: + resolution: + { + integrity: sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==, + } + + wait-on@7.2.0: + resolution: + { + integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==, + } + engines: { node: ">=12.0.0" } + hasBin: true + + wait-port@0.2.14: + resolution: + { + integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==, + } + engines: { node: ">=8" } + hasBin: true + + walker@1.0.8: + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } + + watchpack-chokidar2@2.0.1: + resolution: + { + integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==, + } + + watchpack@1.7.5: + resolution: + { + integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==, + } + + webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + webpack-cli@4.10.0: + resolution: + { + integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==, + } + engines: { node: ">=10.13.0" } + hasBin: true + peerDependencies: + "@webpack-cli/generators": "*" + "@webpack-cli/migrate": "*" + webpack: 4.x.x || 5.x.x + webpack-bundle-analyzer: "*" + webpack-dev-server: "*" + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + "@webpack-cli/migrate": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@5.10.0: + resolution: + { + integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==, + } + engines: { node: ">=10.0.0" } + + webpack-sources@1.4.3: + resolution: + { + integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, + } + + webpack@4.47.0: + resolution: + { + integrity: sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==, + } + engines: { node: ">=6.11.5" } + hasBin: true + peerDependencies: + webpack-cli: "*" + webpack-command: "*" + peerDependenciesMeta: + webpack-cli: + optional: true + webpack-command: + optional: true + + websocket-driver@0.7.4: + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: ">=0.8.0" } + + websocket-extensions@0.1.4: + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: ">=0.8.0" } + + whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + + which-boxed-primitive@1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } + + which-collection@1.0.2: + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: ">= 0.4" } + + which-module@2.0.1: + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } + + which-typed-array@1.1.15: + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: ">= 0.4" } + + which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + wildcard@2.0.1: + resolution: + { + integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, + } + + word-wrap@1.2.5: + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } + + wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + + worker-farm@1.7.0: + resolution: + { + integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==, + } + + workerpool@9.1.3: + resolution: + { + integrity: sha512-LhUrk4tbxJRDQmRrrFWA9EnboXI79fe0ZNTy3u8m+dqPN1EkVSIsQYAB8OF/fkyhG8Rtup+c/bzj/+bzbG8fqg==, + } + + wrap-ansi@5.1.0: + resolution: + { + integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==, + } + engines: { node: ">=6" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + wrap-ansi@9.0.0: + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: ">=18" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + write-file-atomic@2.4.3: + resolution: + { + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, + } + + write-file-atomic@4.0.2: + resolution: + { + integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + + xmlcreate@2.0.4: + resolution: + { + integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==, + } + + xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + + y18n@4.0.3: + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yallist@2.1.2: + resolution: + { + integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, + } + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + yaml@2.5.0: + resolution: + { + integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==, + } + engines: { node: ">= 14" } + hasBin: true + + yargs-parser@13.1.2: + resolution: + { + integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==, + } + + yargs-parser@20.2.9: + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: ">=10" } + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@13.3.2: + resolution: + { + integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==, + } + + yargs@16.2.0: + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: ">=10" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + + yn@3.1.1: + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: ">=6" } + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + +snapshots: + "@ampproject/remapping@2.3.0": + dependencies: + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + + "@babel/code-frame@7.24.7": + dependencies: + "@babel/highlight": 7.24.7 + picocolors: 1.0.1 + + "@babel/compat-data@7.25.2": {} + + "@babel/core@7.25.2": + dependencies: + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.24.7 + "@babel/generator": 7.25.0 + "@babel/helper-compilation-targets": 7.25.2 + "@babel/helper-module-transforms": 7.25.2(@babel/core@7.25.2) + "@babel/helpers": 7.25.0 + "@babel/parser": 7.25.3 + "@babel/template": 7.25.0 + "@babel/traverse": 7.25.3 + "@babel/types": 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + "@babel/generator@7.25.0": + dependencies: + "@babel/types": 7.25.2 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + jsesc: 2.5.2 + + "@babel/helper-compilation-targets@7.25.2": + dependencies: + "@babel/compat-data": 7.25.2 + "@babel/helper-validator-option": 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + "@babel/helper-module-imports@7.24.7": + dependencies: + "@babel/traverse": 7.25.3 + "@babel/types": 7.25.2 + transitivePeerDependencies: + - supports-color + + "@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-module-imports": 7.24.7 + "@babel/helper-simple-access": 7.24.7 + "@babel/helper-validator-identifier": 7.24.7 + "@babel/traverse": 7.25.3 + transitivePeerDependencies: + - supports-color + + "@babel/helper-plugin-utils@7.24.8": {} + + "@babel/helper-simple-access@7.24.7": + dependencies: + "@babel/traverse": 7.25.3 + "@babel/types": 7.25.2 + transitivePeerDependencies: + - supports-color + + "@babel/helper-string-parser@7.24.8": {} + + "@babel/helper-validator-identifier@7.24.7": {} + + "@babel/helper-validator-option@7.24.8": {} + + "@babel/helpers@7.25.0": + dependencies: + "@babel/template": 7.25.0 + "@babel/types": 7.25.2 + + "@babel/highlight@7.24.7": + dependencies: + "@babel/helper-validator-identifier": 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + "@babel/parser@7.25.3": + dependencies: + "@babel/types": 7.25.2 + + "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)": + dependencies: + "@babel/core": 7.25.2 + "@babel/helper-plugin-utils": 7.24.8 + + "@babel/runtime@7.25.0": + dependencies: + regenerator-runtime: 0.14.1 + + "@babel/template@7.25.0": + dependencies: + "@babel/code-frame": 7.24.7 + "@babel/parser": 7.25.3 + "@babel/types": 7.25.2 + + "@babel/traverse@7.25.3": + dependencies: + "@babel/code-frame": 7.24.7 + "@babel/generator": 7.25.0 + "@babel/parser": 7.25.3 + "@babel/template": 7.25.0 + "@babel/types": 7.25.2 + debug: 4.3.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + "@babel/types@7.25.2": + dependencies: + "@babel/helper-string-parser": 7.24.8 + "@babel/helper-validator-identifier": 7.24.7 + to-fast-properties: 2.0.0 + + "@bcoe/v8-coverage@0.2.3": {} + + "@cspotcode/source-map-support@0.8.1": + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + + "@discoveryjs/json-ext@0.5.7": {} + + "@emnapi/runtime@1.2.0": + dependencies: + tslib: 2.6.3 + optional: true + + "@fastify/busboy@1.2.1": + dependencies: + text-decoding: 1.0.0 + + "@fastify/busboy@2.1.1": {} + + "@fastify/busboy@3.0.0": {} + + "@firebase/analytics-compat@0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/analytics": 0.10.7(@firebase/app@0.10.8) + "@firebase/analytics-types": 0.8.2 + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/analytics-compat@0.2.6(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/analytics": 0.10.0(@firebase/app@0.9.13) + "@firebase/analytics-types": 0.8.0 + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/analytics-types@0.8.0": {} + + "@firebase/analytics-types@0.8.2": {} + + "@firebase/analytics@0.10.0(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/analytics@0.10.7(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/app-check-compat@0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-check": 0.8.7(@firebase/app@0.10.8) + "@firebase/app-check-types": 0.5.2 + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/app-check-compat@0.3.7(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-check": 0.8.0(@firebase/app@0.9.13) + "@firebase/app-check-types": 0.5.0 + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/app-check-interop-types@0.3.0": {} + + "@firebase/app-check-interop-types@0.3.2": {} + + "@firebase/app-check-types@0.5.0": {} + + "@firebase/app-check-types@0.5.2": {} + + "@firebase/app-check@0.8.0(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/app-check@0.8.7(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/app-compat@0.2.13": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/app-compat@0.2.38": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/app-types@0.9.0": {} + + "@firebase/app-types@0.9.2": {} + + "@firebase/app@0.10.8": + dependencies: + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + idb: 7.1.1 + tslib: 2.6.3 + + "@firebase/app@0.9.13": + dependencies: + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + idb: 7.1.1 + tslib: 2.6.3 + + "@firebase/auth-compat@0.4.2(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/auth": 0.23.2(@firebase/app@0.9.13) + "@firebase/auth-types": 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) + "@firebase/component": 0.6.4 + "@firebase/util": 1.9.3 + node-fetch: 2.6.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + - encoding + + "@firebase/auth-compat@0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/auth": 1.7.6(@firebase/app@0.10.8) + "@firebase/auth-types": 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + "@firebase/component": 0.6.8 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + - "@react-native-async-storage/async-storage" + + "@firebase/auth-interop-types@0.2.1": {} + + "@firebase/auth-interop-types@0.2.3": {} + + "@firebase/auth-types@0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3)": + dependencies: + "@firebase/app-types": 0.9.0 + "@firebase/util": 1.9.3 + + "@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)": + dependencies: + "@firebase/app-types": 0.9.2 + "@firebase/util": 1.9.7 + + "@firebase/auth@0.23.2(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + node-fetch: 2.6.7 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + "@firebase/auth@1.7.6(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 + + "@firebase/component@0.6.4": + dependencies: + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/component@0.6.8": + dependencies: + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/database-compat@0.3.4": + dependencies: + "@firebase/component": 0.6.4 + "@firebase/database": 0.14.4 + "@firebase/database-types": 0.10.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/database-compat@1.0.7": + dependencies: + "@firebase/component": 0.6.8 + "@firebase/database": 1.0.7 + "@firebase/database-types": 1.0.4 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/database-types@0.10.4": + dependencies: + "@firebase/app-types": 0.9.0 + "@firebase/util": 1.9.3 + + "@firebase/database-types@1.0.4": + dependencies: + "@firebase/app-types": 0.9.2 + "@firebase/util": 1.9.7 + + "@firebase/database@0.14.4": + dependencies: + "@firebase/auth-interop-types": 0.2.1 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + faye-websocket: 0.11.4 + tslib: 2.6.3 + + "@firebase/database@1.0.7": + dependencies: + "@firebase/app-check-interop-types": 0.3.2 + "@firebase/auth-interop-types": 0.2.3 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + faye-websocket: 0.11.4 + tslib: 2.6.3 + + "@firebase/firestore-compat@0.3.12(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/firestore": 3.13.0(@firebase/app@0.9.13) + "@firebase/firestore-types": 2.5.1(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + - encoding + + "@firebase/firestore-compat@0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/firestore": 4.6.5(@firebase/app@0.10.8) + "@firebase/firestore-types": 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + + "@firebase/firestore-types@2.5.1(@firebase/app-types@0.9.0)(@firebase/util@1.9.3)": + dependencies: + "@firebase/app-types": 0.9.0 + "@firebase/util": 1.9.3 + + "@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)": + dependencies: + "@firebase/app-types": 0.9.2 + "@firebase/util": 1.9.7 + + "@firebase/firestore@3.13.0(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + "@firebase/webchannel-wrapper": 0.10.1 + "@grpc/grpc-js": 1.7.3 + "@grpc/proto-loader": 0.6.13 + node-fetch: 2.6.7 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + "@firebase/firestore@4.6.5(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + "@firebase/webchannel-wrapper": 1.0.1 + "@grpc/grpc-js": 1.9.15 + "@grpc/proto-loader": 0.7.13 + tslib: 2.6.3 + undici: 5.28.4 + + "@firebase/functions-compat@0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/functions": 0.11.6(@firebase/app@0.10.8) + "@firebase/functions-types": 0.6.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/functions-compat@0.3.5(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/functions": 0.10.0(@firebase/app@0.9.13) + "@firebase/functions-types": 0.6.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - encoding + + "@firebase/functions-types@0.6.0": {} + + "@firebase/functions-types@0.6.2": {} + + "@firebase/functions@0.10.0(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/app-check-interop-types": 0.3.0 + "@firebase/auth-interop-types": 0.2.1 + "@firebase/component": 0.6.4 + "@firebase/messaging-interop-types": 0.2.0 + "@firebase/util": 1.9.3 + node-fetch: 2.6.7 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + "@firebase/functions@0.11.6(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/app-check-interop-types": 0.3.2 + "@firebase/auth-interop-types": 0.2.3 + "@firebase/component": 0.6.8 + "@firebase/messaging-interop-types": 0.2.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 + + "@firebase/installations-compat@0.2.4(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/installations-types": 0.5.0(@firebase/app-types@0.9.0) + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + + "@firebase/installations-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/installations-types": 0.5.2(@firebase/app-types@0.9.2) + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + + "@firebase/installations-types@0.5.0(@firebase/app-types@0.9.0)": + dependencies: + "@firebase/app-types": 0.9.0 + + "@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2)": + dependencies: + "@firebase/app-types": 0.9.2 + + "@firebase/installations@0.6.4(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/util": 1.9.3 + idb: 7.0.1 + tslib: 2.6.3 + + "@firebase/installations@0.6.8(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/util": 1.9.7 + idb: 7.1.1 + tslib: 2.6.3 + + "@firebase/logger@0.4.0": + dependencies: + tslib: 2.6.3 + + "@firebase/logger@0.4.2": + dependencies: + tslib: 2.6.3 + + "@firebase/messaging-compat@0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/messaging": 0.12.10(@firebase/app@0.10.8) + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/messaging-compat@0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/messaging": 0.12.4(@firebase/app@0.9.13) + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/messaging-interop-types@0.2.0": {} + + "@firebase/messaging-interop-types@0.2.2": {} + + "@firebase/messaging@0.12.10(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/messaging-interop-types": 0.2.2 + "@firebase/util": 1.9.7 + idb: 7.1.1 + tslib: 2.6.3 + + "@firebase/messaging@0.12.4(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/messaging-interop-types": 0.2.0 + "@firebase/util": 1.9.3 + idb: 7.0.1 + tslib: 2.6.3 + + "@firebase/performance-compat@0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/performance": 0.6.4(@firebase/app@0.9.13) + "@firebase/performance-types": 0.2.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/performance-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/performance": 0.6.8(@firebase/app@0.10.8) + "@firebase/performance-types": 0.2.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/performance-types@0.2.0": {} + + "@firebase/performance-types@0.2.2": {} + + "@firebase/performance@0.6.4(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/performance@0.6.8(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/remote-config-compat@0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/logger": 0.4.0 + "@firebase/remote-config": 0.4.4(@firebase/app@0.9.13) + "@firebase/remote-config-types": 0.3.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/remote-config-compat@0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/remote-config": 0.4.8(@firebase/app@0.10.8) + "@firebase/remote-config-types": 0.3.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + + "@firebase/remote-config-types@0.3.0": {} + + "@firebase/remote-config-types@0.3.2": {} + + "@firebase/remote-config@0.4.4(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/logger": 0.4.0 + "@firebase/util": 1.9.3 + tslib: 2.6.3 + + "@firebase/remote-config@0.4.8(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/storage-compat@0.3.2(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13)": + dependencies: + "@firebase/app-compat": 0.2.13 + "@firebase/component": 0.6.4 + "@firebase/storage": 0.11.2(@firebase/app@0.9.13) + "@firebase/storage-types": 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3) + "@firebase/util": 1.9.3 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + - encoding + + "@firebase/storage-compat@0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app-compat": 0.2.38 + "@firebase/component": 0.6.8 + "@firebase/storage": 0.12.6(@firebase/app@0.10.8) + "@firebase/storage-types": 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7) + "@firebase/util": 1.9.7 + tslib: 2.6.3 + transitivePeerDependencies: + - "@firebase/app" + - "@firebase/app-types" + + "@firebase/storage-types@0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.3)": + dependencies: + "@firebase/app-types": 0.9.0 + "@firebase/util": 1.9.3 + + "@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.7)": + dependencies: + "@firebase/app-types": 0.9.2 + "@firebase/util": 1.9.7 + + "@firebase/storage@0.11.2(@firebase/app@0.9.13)": + dependencies: + "@firebase/app": 0.9.13 + "@firebase/component": 0.6.4 + "@firebase/util": 1.9.3 + node-fetch: 2.6.7 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + + "@firebase/storage@0.12.6(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/component": 0.6.8 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + undici: 5.28.4 + + "@firebase/util@1.9.3": + dependencies: + tslib: 2.6.3 + + "@firebase/util@1.9.7": + dependencies: + tslib: 2.6.3 + + "@firebase/vertexai-preview@0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8)": + dependencies: + "@firebase/app": 0.10.8 + "@firebase/app-check-interop-types": 0.3.2 + "@firebase/app-types": 0.9.2 + "@firebase/component": 0.6.8 + "@firebase/logger": 0.4.2 + "@firebase/util": 1.9.7 + tslib: 2.6.3 + + "@firebase/webchannel-wrapper@0.10.1": {} + + "@firebase/webchannel-wrapper@1.0.1": {} + + "@firebaseextensions/firestore-bigquery-change-tracker@1.1.35": + dependencies: + "@google-cloud/bigquery": 7.9.0 + "@google-cloud/resource-manager": 5.3.0 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + generate-schema: 2.6.0 + inquirer: 6.5.2 + lodash: 4.17.21 + node-fetch: 2.7.0 + sql-formatter: 2.3.4 + traverse: 0.6.9 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/bigquery@7.9.0": + dependencies: + "@google-cloud/common": 5.0.2 + "@google-cloud/paginator": 5.0.2 + "@google-cloud/precise-date": 4.0.0 + "@google-cloud/promisify": 4.0.0 + arrify: 2.0.1 + big.js: 6.2.1 + duplexify: 4.1.3 + extend: 3.0.2 + is: 3.3.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/common@5.0.2": + dependencies: + "@google-cloud/projectify": 4.0.0 + "@google-cloud/promisify": 4.0.0 + arrify: 2.0.1 + duplexify: 4.1.3 + extend: 3.0.2 + google-auth-library: 9.13.0 + html-entities: 2.5.2 + retry-request: 7.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/firestore@6.8.0": + dependencies: + fast-deep-equal: 3.1.3 + functional-red-black-tree: 1.0.1 + google-gax: 3.6.1 + protobufjs: 7.3.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + "@google-cloud/firestore@7.9.0": + dependencies: + fast-deep-equal: 3.1.3 + functional-red-black-tree: 1.0.1 + google-gax: 4.3.9 + protobufjs: 7.3.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + "@google-cloud/paginator@3.0.7": + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + optional: true + + "@google-cloud/paginator@5.0.2": + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + + "@google-cloud/precise-date@4.0.0": {} + + "@google-cloud/projectify@3.0.0": + optional: true + + "@google-cloud/projectify@4.0.0": {} + + "@google-cloud/promisify@3.0.1": + optional: true + + "@google-cloud/promisify@4.0.0": {} + + "@google-cloud/pubsub@4.5.0": + dependencies: + "@google-cloud/paginator": 5.0.2 + "@google-cloud/precise-date": 4.0.0 + "@google-cloud/projectify": 4.0.0 + "@google-cloud/promisify": 4.0.0 + "@opentelemetry/api": 1.8.0 + "@opentelemetry/semantic-conventions": 1.21.0 + arrify: 2.0.1 + extend: 3.0.2 + google-auth-library: 9.13.0 + google-gax: 4.3.9 + heap-js: 2.5.0 + is-stream-ended: 0.1.4 + lodash.snakecase: 4.1.1 + p-defer: 3.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/resource-manager@5.3.0": + dependencies: + google-gax: 4.3.9 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/storage@6.12.0": + dependencies: + "@google-cloud/paginator": 3.0.7 + "@google-cloud/projectify": 3.0.0 + "@google-cloud/promisify": 3.0.1 + abort-controller: 3.0.0 + async-retry: 1.3.3 + compressible: 2.0.18 + duplexify: 4.1.3 + ent: 2.2.1 + extend: 3.0.2 + fast-xml-parser: 4.4.1 + gaxios: 5.1.3 + google-auth-library: 8.9.0 + mime: 3.0.0 + mime-types: 2.1.35 + p-limit: 3.1.0 + retry-request: 5.0.2 + teeny-request: 8.0.3 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + "@google-cloud/storage@7.12.1": + dependencies: + "@google-cloud/paginator": 5.0.2 + "@google-cloud/projectify": 4.0.0 + "@google-cloud/promisify": 4.0.0 + abort-controller: 3.0.0 + async-retry: 1.3.3 + duplexify: 4.1.3 + fast-xml-parser: 4.4.1 + gaxios: 6.7.0 + google-auth-library: 9.13.0 + html-entities: 2.5.2 + mime: 3.0.0 + p-limit: 3.1.0 + retry-request: 7.0.2 + teeny-request: 9.0.0 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + + "@google-cloud/translate@8.3.0": + dependencies: + "@google-cloud/common": 5.0.2 + "@google-cloud/promisify": 4.0.0 + arrify: 2.0.1 + extend: 3.0.2 + google-gax: 4.3.9 + is-html: 2.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + "@grpc/grpc-js@1.11.1": + dependencies: + "@grpc/proto-loader": 0.7.13 + "@js-sdsl/ordered-map": 4.4.2 + + "@grpc/grpc-js@1.7.3": + dependencies: + "@grpc/proto-loader": 0.7.13 + "@types/node": 20.14.14 + + "@grpc/grpc-js@1.8.22": + dependencies: + "@grpc/proto-loader": 0.7.13 + "@types/node": 20.14.14 + optional: true + + "@grpc/grpc-js@1.9.15": + dependencies: + "@grpc/proto-loader": 0.7.13 + "@types/node": 20.14.14 + + "@grpc/proto-loader@0.6.13": + dependencies: + "@types/long": 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 6.11.4 + yargs: 16.2.0 + + "@grpc/proto-loader@0.7.13": + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.3.2 + yargs: 17.7.2 + + "@hapi/hoek@9.3.0": {} + + "@hapi/topo@5.1.0": + dependencies: + "@hapi/hoek": 9.3.0 + + "@img/sharp-darwin-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.0.2 + optional: true + + "@img/sharp-darwin-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.0.2 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-darwin-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm@1.0.2": + optional: true + + "@img/sharp-libvips-linux-s390x@1.0.2": + optional: true + + "@img/sharp-libvips-linux-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + optional: true + + "@img/sharp-linux-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.0.2 + optional: true + + "@img/sharp-linux-arm@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.0.2 + optional: true + + "@img/sharp-linux-s390x@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.0.2 + optional: true + + "@img/sharp-linux-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + optional: true + + "@img/sharp-wasm32@0.33.4": + dependencies: + "@emnapi/runtime": 1.2.0 + optional: true + + "@img/sharp-win32-ia32@0.33.4": + optional: true + + "@img/sharp-win32-x64@0.33.4": + optional: true + + "@isaacs/cliui@8.0.2": + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + "@istanbuljs/load-nyc-config@1.1.0": + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + "@istanbuljs/schema@0.1.3": {} + + "@jest/console@29.7.0": + dependencies: + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/core@29.7.0(ts-node@9.1.1(typescript@4.9.5))": + dependencies: + "@jest/console": 29.7.0 + "@jest/reporters": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + "@jest/environment@29.7.0": + dependencies: + "@jest/fake-timers": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + jest-mock: 29.7.0 + + "@jest/expect-utils@29.7.0": + dependencies: + jest-get-type: 29.6.3 + + "@jest/expect@29.7.0": + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + "@jest/fake-timers@29.7.0": + dependencies: + "@jest/types": 29.6.3 + "@sinonjs/fake-timers": 10.3.0 + "@types/node": 20.14.14 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + "@jest/globals@29.7.0": + dependencies: + "@jest/environment": 29.7.0 + "@jest/expect": 29.7.0 + "@jest/types": 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + "@jest/reporters@29.7.0": + dependencies: + "@bcoe/v8-coverage": 0.2.3 + "@jest/console": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@jridgewell/trace-mapping": 0.3.25 + "@types/node": 20.14.14 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.1.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + "@jest/schemas@29.6.3": + dependencies: + "@sinclair/typebox": 0.27.8 + + "@jest/source-map@29.6.3": + dependencies: + "@jridgewell/trace-mapping": 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + "@jest/test-result@29.7.0": + dependencies: + "@jest/console": 29.7.0 + "@jest/types": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.6 + collect-v8-coverage: 1.0.2 + + "@jest/test-sequencer@29.7.0": + dependencies: + "@jest/test-result": 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + "@jest/transform@29.7.0": + dependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + "@jridgewell/trace-mapping": 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + "@jest/types@29.6.3": + dependencies: + "@jest/schemas": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@types/node": 20.14.14 + "@types/yargs": 17.0.33 + chalk: 4.1.2 + + "@jridgewell/gen-mapping@0.3.5": + dependencies: + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/trace-mapping": 0.3.25 + + "@jridgewell/resolve-uri@3.1.2": {} + + "@jridgewell/set-array@1.2.1": {} + + "@jridgewell/sourcemap-codec@1.5.0": {} + + "@jridgewell/trace-mapping@0.3.25": + dependencies: + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.0 + + "@jridgewell/trace-mapping@0.3.9": + dependencies: + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.0 + + "@js-sdsl/ordered-map@4.4.2": {} + + "@jsdoc/salty@0.2.8": + dependencies: + lodash: 4.17.21 + optional: true + + "@opentelemetry/api@1.8.0": {} + + "@opentelemetry/semantic-conventions@1.21.0": {} + + "@pkgjs/parseargs@0.11.0": + optional: true + + "@protobufjs/aspromise@1.1.2": {} + + "@protobufjs/base64@1.1.2": {} + + "@protobufjs/codegen@2.0.4": {} + + "@protobufjs/eventemitter@1.1.0": {} + + "@protobufjs/fetch@1.1.0": + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/inquire": 1.1.0 + + "@protobufjs/float@1.0.2": {} + + "@protobufjs/inquire@1.1.0": {} + + "@protobufjs/path@1.1.2": {} + + "@protobufjs/pool@1.1.0": {} + + "@protobufjs/utf8@1.1.0": {} + + "@sideway/address@4.1.5": + dependencies: + "@hapi/hoek": 9.3.0 + + "@sideway/formula@3.0.1": {} + + "@sideway/pinpoint@2.0.0": {} + + "@sinclair/typebox@0.27.8": {} + + "@sinonjs/commons@3.0.1": + dependencies: + type-detect: 4.0.8 + + "@sinonjs/fake-timers@10.3.0": + dependencies: + "@sinonjs/commons": 3.0.1 + + "@tootallnate/once@1.1.2": {} + + "@tootallnate/once@2.0.0": {} + + "@tsconfig/node10@1.0.11": {} + + "@tsconfig/node12@1.0.11": {} + + "@tsconfig/node14@1.0.3": {} + + "@tsconfig/node16@1.0.4": {} + + "@types/babel__core@7.20.5": + dependencies: + "@babel/parser": 7.25.3 + "@babel/types": 7.25.2 + "@types/babel__generator": 7.6.8 + "@types/babel__template": 7.4.4 + "@types/babel__traverse": 7.20.6 + + "@types/babel__generator@7.6.8": + dependencies: + "@babel/types": 7.25.2 + + "@types/babel__template@7.4.4": + dependencies: + "@babel/parser": 7.25.3 + "@babel/types": 7.25.2 + + "@types/babel__traverse@7.20.6": + dependencies: + "@babel/types": 7.25.2 + + "@types/body-parser@1.19.5": + dependencies: + "@types/connect": 3.4.38 + "@types/node": 20.14.14 + + "@types/caseless@0.12.5": {} + + "@types/chai@4.3.17": {} + + "@types/connect@3.4.38": + dependencies: + "@types/node": 20.14.14 + + "@types/cors@2.8.17": + dependencies: + "@types/node": 20.14.14 + + "@types/deep-equal@1.0.4": {} + + "@types/express-serve-static-core@4.17.24": + dependencies: + "@types/node": 20.14.14 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + + "@types/express-serve-static-core@4.17.30": + dependencies: + "@types/node": 20.14.14 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + + "@types/express-serve-static-core@4.19.0": + dependencies: + "@types/node": 20.14.14 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + "@types/send": 0.17.4 + + "@types/express-serve-static-core@4.19.5": + dependencies: + "@types/node": 20.14.14 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + "@types/send": 0.17.4 + + "@types/express@4.17.21": + dependencies: + "@types/body-parser": 1.19.5 + "@types/express-serve-static-core": 4.19.5 + "@types/qs": 6.9.15 + "@types/serve-static": 1.15.7 + + "@types/express@4.17.3": + dependencies: + "@types/body-parser": 1.19.5 + "@types/express-serve-static-core": 4.17.30 + "@types/serve-static": 1.15.7 + + "@types/glob@8.1.0": + dependencies: + "@types/minimatch": 5.1.2 + "@types/node": 20.14.14 + optional: true + + "@types/graceful-fs@4.1.9": + dependencies: + "@types/node": 20.14.14 + + "@types/http-errors@2.0.4": {} + + "@types/istanbul-lib-coverage@2.0.6": {} + + "@types/istanbul-lib-report@3.0.3": + dependencies: + "@types/istanbul-lib-coverage": 2.0.6 + + "@types/istanbul-reports@3.0.4": + dependencies: + "@types/istanbul-lib-report": 3.0.3 + + "@types/jest@29.5.0": + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + "@types/jsonwebtoken@9.0.6": + dependencies: + "@types/node": 20.14.14 + + "@types/linkify-it@5.0.0": + optional: true + + "@types/lodash.chunk@4.2.9": + dependencies: + "@types/lodash": 4.17.7 + + "@types/lodash@4.17.7": {} + + "@types/long@4.0.2": {} + + "@types/markdown-it@14.1.2": + dependencies: + "@types/linkify-it": 5.0.0 + "@types/mdurl": 2.0.0 + optional: true + + "@types/mdurl@2.0.0": + optional: true + + "@types/mime@1.3.5": {} + + "@types/minimatch@5.1.2": + optional: true + + "@types/mkdirp@1.0.2": + dependencies: + "@types/node": 20.14.14 + + "@types/node-fetch@2.6.11": + dependencies: + "@types/node": 20.14.14 + form-data: 4.0.0 + + "@types/node@14.18.34": {} + + "@types/node@16.18.104": {} + + "@types/node@18.19.43": + dependencies: + undici-types: 5.26.5 + + "@types/node@20.14.14": + dependencies: + undici-types: 5.26.5 + + "@types/node@22.1.0": + dependencies: + undici-types: 6.13.0 + + "@types/nodemailer-sendgrid@1.0.3": + dependencies: + "@types/nodemailer": 6.4.15 + + "@types/nodemailer@6.4.15": + dependencies: + "@types/node": 20.14.14 + + "@types/qs@6.9.15": {} + + "@types/range-parser@1.2.7": {} + + "@types/request@2.48.12": + dependencies: + "@types/caseless": 0.12.5 + "@types/node": 22.1.0 + "@types/tough-cookie": 4.0.5 + form-data: 2.5.1 + + "@types/rimraf@3.0.2": + dependencies: + "@types/glob": 8.1.0 + "@types/node": 20.14.14 + optional: true + + "@types/send@0.17.4": + dependencies: + "@types/mime": 1.3.5 + "@types/node": 20.14.14 + + "@types/serve-static@1.15.7": + dependencies: + "@types/http-errors": 2.0.4 + "@types/node": 20.14.14 + "@types/send": 0.17.4 + + "@types/stack-utils@2.0.3": {} + + "@types/tough-cookie@4.0.5": {} + + "@types/traverse@0.6.37": {} + + "@types/uuid@3.4.13": {} + + "@types/uuid@8.3.4": {} + + "@types/workerpool@6.4.7": + dependencies: + "@types/node": 20.14.14 + + "@types/yargs-parser@21.0.3": {} + + "@types/yargs@17.0.33": + dependencies: + "@types/yargs-parser": 21.0.3 + + "@webassemblyjs/ast@1.9.0": + dependencies: + "@webassemblyjs/helper-module-context": 1.9.0 + "@webassemblyjs/helper-wasm-bytecode": 1.9.0 + "@webassemblyjs/wast-parser": 1.9.0 + + "@webassemblyjs/floating-point-hex-parser@1.9.0": {} + + "@webassemblyjs/helper-api-error@1.9.0": {} + + "@webassemblyjs/helper-buffer@1.9.0": {} + + "@webassemblyjs/helper-code-frame@1.9.0": + dependencies: + "@webassemblyjs/wast-printer": 1.9.0 + + "@webassemblyjs/helper-fsm@1.9.0": {} + + "@webassemblyjs/helper-module-context@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + + "@webassemblyjs/helper-wasm-bytecode@1.9.0": {} + + "@webassemblyjs/helper-wasm-section@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-buffer": 1.9.0 + "@webassemblyjs/helper-wasm-bytecode": 1.9.0 + "@webassemblyjs/wasm-gen": 1.9.0 + + "@webassemblyjs/ieee754@1.9.0": + dependencies: + "@xtuc/ieee754": 1.2.0 + + "@webassemblyjs/leb128@1.9.0": + dependencies: + "@xtuc/long": 4.2.2 + + "@webassemblyjs/utf8@1.9.0": {} + + "@webassemblyjs/wasm-edit@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-buffer": 1.9.0 + "@webassemblyjs/helper-wasm-bytecode": 1.9.0 + "@webassemblyjs/helper-wasm-section": 1.9.0 + "@webassemblyjs/wasm-gen": 1.9.0 + "@webassemblyjs/wasm-opt": 1.9.0 + "@webassemblyjs/wasm-parser": 1.9.0 + "@webassemblyjs/wast-printer": 1.9.0 + + "@webassemblyjs/wasm-gen@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-wasm-bytecode": 1.9.0 + "@webassemblyjs/ieee754": 1.9.0 + "@webassemblyjs/leb128": 1.9.0 + "@webassemblyjs/utf8": 1.9.0 + + "@webassemblyjs/wasm-opt@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-buffer": 1.9.0 + "@webassemblyjs/wasm-gen": 1.9.0 + "@webassemblyjs/wasm-parser": 1.9.0 + + "@webassemblyjs/wasm-parser@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-api-error": 1.9.0 + "@webassemblyjs/helper-wasm-bytecode": 1.9.0 + "@webassemblyjs/ieee754": 1.9.0 + "@webassemblyjs/leb128": 1.9.0 + "@webassemblyjs/utf8": 1.9.0 + + "@webassemblyjs/wast-parser@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/floating-point-hex-parser": 1.9.0 + "@webassemblyjs/helper-api-error": 1.9.0 + "@webassemblyjs/helper-code-frame": 1.9.0 + "@webassemblyjs/helper-fsm": 1.9.0 + "@xtuc/long": 4.2.2 + + "@webassemblyjs/wast-printer@1.9.0": + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/wast-parser": 1.9.0 + "@xtuc/long": 4.2.2 + + "@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack@4.47.0))(webpack@4.47.0(webpack-cli@4.10.0))": + dependencies: + webpack: 4.47.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack@4.47.0) + + "@webpack-cli/info@1.5.0(webpack-cli@4.10.0(webpack@4.47.0))": + dependencies: + envinfo: 7.13.0 + webpack-cli: 4.10.0(webpack@4.47.0) + + "@webpack-cli/serve@1.7.0(webpack-cli@4.10.0(webpack@4.47.0))": + dependencies: + webpack-cli: 4.10.0(webpack@4.47.0) + + "@xtuc/ieee754@1.2.0": {} + + "@xtuc/long@4.2.2": {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + optional: true + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@6.4.2: {} + + acorn@8.12.1: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.1: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + ajv-errors@1.0.1(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@3.2.0: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@2.0.0: + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + optional: true + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + append-transform@1.0.0: + dependencies: + default-require-extensions: 2.0.0 + + aproba@1.2.0: {} + + archy@1.0.0: {} + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + argv@0.0.2: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-flatten@1.1.1: {} + + array-unique@0.3.2: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@2.0.1: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + assert@1.5.1: + dependencies: + object.assign: 4.1.5 + util: 0.10.4 + + assertion-error@1.1.0: {} + + assign-symbols@1.0.0: {} + + async-each@1.0.6: + optional: true + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axios@1.7.3: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-jest@29.7.0(@babel/core@7.25.2): + dependencies: + "@babel/core": 7.25.2 + "@jest/transform": 29.7.0 + "@types/babel__core": 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.25.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + "@babel/helper-plugin-utils": 7.24.8 + "@istanbuljs/load-nyc-config": 1.1.0 + "@istanbuljs/schema": 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + "@babel/template": 7.25.0 + "@babel/types": 7.25.2 + "@types/babel__core": 7.20.5 + "@types/babel__traverse": 7.20.6 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): + dependencies: + "@babel/core": 7.25.2 + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.25.2) + "@babel/plugin-syntax-bigint": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.25.2) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.25.2) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.25.2) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.25.2) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.25.2) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.25.2) + + babel-preset-jest@29.6.3(@babel/core@7.25.2): + dependencies: + "@babel/core": 7.25.2 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + + balanced-match@1.0.2: {} + + base32.js@0.1.0: {} + + base64-js@1.5.1: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + big.js@5.2.2: {} + + big.js@6.2.1: {} + + bignumber.js@9.1.2: {} + + binary-extensions@1.13.1: + optional: true + + binary-extensions@2.3.0: + optional: true + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + bluebird@3.7.2: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + 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.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + + browserify-sign@4.2.3: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.6 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + builtin-status-codes@3.0.0: {} + + bytes@3.1.2: {} + + cacache@12.0.4: + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + figgy-pudding: 3.5.2 + glob: 7.1.5 + graceful-fs: 4.2.11 + infer-owner: 1.0.4 + lru-cache: 5.1.1 + mississippi: 3.0.0 + mkdirp: 0.5.6 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 2.7.1 + ssri: 6.0.2 + unique-filename: 1.1.1 + y18n: 4.0.3 + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + caching-transform@3.0.2: + dependencies: + hasha: 3.0.0 + make-dir: 2.1.0 + package-hash: 3.0.0 + write-file-atomic: 2.4.3 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001651: {} + + catharsis@0.9.0: + dependencies: + lodash: 4.17.21 + optional: true + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + char-regex@1.0.2: {} + + chardet@0.7.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + check-more-types@2.24.0: {} + + child_process@1.0.2: {} + + chokidar@2.1.8: + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + optional: true + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + optional: true + + chownr@1.1.4: {} + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + cjs-module-lexer@1.3.1: {} + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@2.2.1: {} + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + co@4.6.0: {} + + codecov@3.8.3: + dependencies: + argv: 0.0.2 + ignore-walk: 3.0.4 + js-yaml: 3.14.1 + teeny-request: 7.1.1 + urlgrey: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + collect-v8-coverage@1.0.2: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@3.0.2: {} + + commander@5.0.0: {} + + commander@7.2.0: {} + + commondir@1.0.1: {} + + component-emitter@1.3.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.52.0 + optional: true + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + concurrency@0.1.4: {} + + concurrently@7.6.0: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + + copy-concurrently@1.0.5: + dependencies: + aproba: 1.2.0 + fs-write-stream-atomic: 1.0.10 + iferr: 0.1.5 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + + copy-descriptor@0.1.1: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cp-file@6.2.0: + dependencies: + graceful-fs: 4.2.11 + make-dir: 2.1.0 + nested-error-stacks: 2.1.1 + pify: 4.0.1 + safe-buffer: 5.2.1 + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.6 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-jest@29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} + + cross-spawn@4.0.2: + dependencies: + lru-cache: 4.1.5 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + cyclist@1.0.2: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + date-fns@2.30.0: + dependencies: + "@babel/runtime": 7.25.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.2: + dependencies: + ms: 2.1.2 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + dedent@1.5.3: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + deep-is@0.1.4: + optional: true + + deepmerge@4.3.1: {} + + default-require-extensions@2.0.0: + dependencies: + strip-bom: 3.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + destroy@1.2.0: {} + + detect-libc@2.0.3: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + discontinuous-range@1.0.0: {} + + domain-browser@1.2.0: {} + + dotenv@16.4.5: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.5: {} + + elliptic@6.5.6: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emittery@0.13.1: {} + + emoji-regex@10.3.0: {} + + emoji-regex@7.0.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@4.5.0: + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.5.0 + tapable: 1.1.3 + + ent@2.2.1: + dependencies: + punycode: 1.4.1 + optional: true + + entities@4.5.0: + optional: true + + envinfo@7.13.0: {} + + environment@1.1.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es6-error@4.1.1: {} + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + optional: true + + eslint-scope@4.0.3: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-visitor-keys@3.4.3: + optional: true + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + optional: true + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: + optional: true + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + exec@0.2.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit@0.1.2: {} + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + expect@29.7.0: + dependencies: + "@jest/expect-utils": 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extglob@2.0.4: + 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.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + faker@5.5.3: {} + + farmhash-modern@1.1.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: + optional: true + + fast-text-encoding@1.0.6: + optional: true + + fast-url-parser@1.1.3: + dependencies: + punycode: 1.4.1 + + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + + fastest-levenshtein@1.0.16: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + figgy-pudding@3.5.2: {} + + figures@2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-type@10.11.0: {} + + file-uri-to-path@1.0.0: + optional: true + + filename-reserved-regex@2.0.0: {} + + filenamify@4.3.0: + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + firebase-admin@11.11.1: + dependencies: + "@fastify/busboy": 1.2.1 + "@firebase/database-compat": 0.3.4 + "@firebase/database-types": 0.10.4 + "@types/node": 20.14.14 + jsonwebtoken: 9.0.2 + jwks-rsa: 3.1.0 + node-forge: 1.3.1 + uuid: 9.0.1 + optionalDependencies: + "@google-cloud/firestore": 6.8.0 + "@google-cloud/storage": 6.12.0 + transitivePeerDependencies: + - encoding + - supports-color + + firebase-admin@12.3.0: + dependencies: + "@fastify/busboy": 3.0.0 + "@firebase/database-compat": 1.0.7 + "@firebase/database-types": 1.0.4 + "@types/node": 20.14.14 + farmhash-modern: 1.1.0 + jsonwebtoken: 9.0.2 + jwks-rsa: 3.1.0 + node-forge: 1.3.1 + uuid: 10.0.0 + optionalDependencies: + "@google-cloud/firestore": 7.9.0 + "@google-cloud/storage": 7.12.1 + transitivePeerDependencies: + - encoding + - supports-color + + firebase-functions-test@0.2.3(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0)): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + lodash: 4.17.21 + + firebase-functions-test@0.3.3(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0)): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + lodash: 4.17.21 + + firebase-functions-test@3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5))): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + jest: 29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + + firebase-functions-test@3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5))): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + jest: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + + firebase-functions-test@3.2.0(firebase-admin@12.3.0)(firebase-functions@4.9.0(firebase-admin@12.3.0))(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4))): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 4.9.0(firebase-admin@12.3.0) + jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + + firebase-functions-test@3.2.0(firebase-admin@12.3.0)(firebase-functions@5.0.1(firebase-admin@12.3.0))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))): + dependencies: + "@types/lodash": 4.17.7 + firebase-admin: 12.3.0 + firebase-functions: 5.0.1(firebase-admin@12.3.0) + jest: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + + firebase-functions@4.9.0(firebase-admin@12.3.0): + dependencies: + "@types/cors": 2.8.17 + "@types/express": 4.17.3 + cors: 2.8.5 + express: 4.19.2 + firebase-admin: 12.3.0 + protobufjs: 7.3.2 + transitivePeerDependencies: + - supports-color + + firebase-functions@5.0.1(firebase-admin@12.3.0): + dependencies: + "@types/cors": 2.8.17 + "@types/express": 4.17.3 + cors: 2.8.5 + express: 4.19.2 + firebase-admin: 12.3.0 + protobufjs: 7.3.2 + transitivePeerDependencies: + - supports-color + + firebase@10.12.5: + dependencies: + "@firebase/analytics": 0.10.7(@firebase/app@0.10.8) + "@firebase/analytics-compat": 0.2.13(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/app": 0.10.8 + "@firebase/app-check": 0.8.7(@firebase/app@0.10.8) + "@firebase/app-check-compat": 0.3.14(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/app-compat": 0.2.38 + "@firebase/app-types": 0.9.2 + "@firebase/auth": 1.7.6(@firebase/app@0.10.8) + "@firebase/auth-compat": 0.5.11(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + "@firebase/database": 1.0.7 + "@firebase/database-compat": 1.0.7 + "@firebase/firestore": 4.6.5(@firebase/app@0.10.8) + "@firebase/firestore-compat": 0.3.34(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + "@firebase/functions": 0.11.6(@firebase/app@0.10.8) + "@firebase/functions-compat": 0.3.12(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/installations": 0.6.8(@firebase/app@0.10.8) + "@firebase/installations-compat": 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + "@firebase/messaging": 0.12.10(@firebase/app@0.10.8) + "@firebase/messaging-compat": 0.2.10(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/performance": 0.6.8(@firebase/app@0.10.8) + "@firebase/performance-compat": 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/remote-config": 0.4.8(@firebase/app@0.10.8) + "@firebase/remote-config-compat": 0.2.8(@firebase/app-compat@0.2.38)(@firebase/app@0.10.8) + "@firebase/storage": 0.12.6(@firebase/app@0.10.8) + "@firebase/storage-compat": 0.3.9(@firebase/app-compat@0.2.38)(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + "@firebase/util": 1.9.7 + "@firebase/vertexai-preview": 0.0.3(@firebase/app-types@0.9.2)(@firebase/app@0.10.8) + transitivePeerDependencies: + - "@react-native-async-storage/async-storage" + + firebase@9.23.0: + dependencies: + "@firebase/analytics": 0.10.0(@firebase/app@0.9.13) + "@firebase/analytics-compat": 0.2.6(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/app": 0.9.13 + "@firebase/app-check": 0.8.0(@firebase/app@0.9.13) + "@firebase/app-check-compat": 0.3.7(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/app-compat": 0.2.13 + "@firebase/app-types": 0.9.0 + "@firebase/auth": 0.23.2(@firebase/app@0.9.13) + "@firebase/auth-compat": 0.4.2(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13) + "@firebase/database": 0.14.4 + "@firebase/database-compat": 0.3.4 + "@firebase/firestore": 3.13.0(@firebase/app@0.9.13) + "@firebase/firestore-compat": 0.3.12(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13) + "@firebase/functions": 0.10.0(@firebase/app@0.9.13) + "@firebase/functions-compat": 0.3.5(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/installations": 0.6.4(@firebase/app@0.9.13) + "@firebase/installations-compat": 0.2.4(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13) + "@firebase/messaging": 0.12.4(@firebase/app@0.9.13) + "@firebase/messaging-compat": 0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/performance": 0.6.4(@firebase/app@0.9.13) + "@firebase/performance-compat": 0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/remote-config": 0.4.4(@firebase/app@0.9.13) + "@firebase/remote-config-compat": 0.2.4(@firebase/app-compat@0.2.13)(@firebase/app@0.9.13) + "@firebase/storage": 0.11.2(@firebase/app@0.9.13) + "@firebase/storage-compat": 0.3.2(@firebase/app-compat@0.2.13)(@firebase/app-types@0.9.0)(@firebase/app@0.9.13) + "@firebase/util": 1.9.3 + transitivePeerDependencies: + - encoding + + flat@5.0.2: {} + + flush-write-stream@1.1.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + follow-redirects@1.15.6: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + foreground-child@1.5.6: + dependencies: + cross-spawn: 4.0.2 + signal-exit: 3.0.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@2.5.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fresh@0.5.2: {} + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-find@0.4.0: {} + + fs-write-stream-atomic@1.0.10: + dependencies: + graceful-fs: 4.2.11 + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.8 + + fs.realpath@1.0.0: {} + + fsevents@1.2.13: + dependencies: + bindings: 1.5.0 + nan: 2.20.0 + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functional-red-black-tree@1.0.1: + optional: true + + functions-have-names@1.2.3: {} + + gaxios@5.1.3: + dependencies: + extend: 3.0.2 + https-proxy-agent: 5.0.1 + is-stream: 2.0.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + gaxios@6.7.0: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.5 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 10.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@5.3.0: + dependencies: + gaxios: 5.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + gcp-metadata@6.1.0: + dependencies: + gaxios: 6.7.0 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + generate-schema@2.6.0: + dependencies: + commander: 2.20.3 + type-of-is: 3.5.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-stdin@8.0.0: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-value@2.0.6: {} + + glob-parent@3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + optional: true + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + glob@7.1.5: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + optional: true + + globals@11.12.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + google-auth-library@8.9.0: + dependencies: + arrify: 2.0.1 + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + fast-text-encoding: 1.0.6 + gaxios: 5.1.3 + gcp-metadata: 5.3.0 + gtoken: 6.1.2 + jws: 4.0.0 + lru-cache: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + google-auth-library@9.13.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.0 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-gax@3.6.1: + dependencies: + "@grpc/grpc-js": 1.8.22 + "@grpc/proto-loader": 0.7.13 + "@types/long": 4.0.2 + "@types/rimraf": 3.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.3 + fast-text-encoding: 1.0.6 + google-auth-library: 8.9.0 + is-stream-ended: 0.1.4 + node-fetch: 2.7.0 + object-hash: 3.0.0 + proto3-json-serializer: 1.1.1 + protobufjs: 7.2.4 + protobufjs-cli: 1.1.1(protobufjs@7.2.4) + retry-request: 5.0.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + google-gax@4.3.9: + dependencies: + "@grpc/grpc-js": 1.11.1 + "@grpc/proto-loader": 0.7.13 + "@types/long": 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.3 + google-auth-library: 9.13.0 + node-fetch: 2.7.0 + object-hash: 3.0.0 + proto3-json-serializer: 2.0.2 + protobufjs: 7.3.2 + retry-request: 7.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + google-p12-pem@4.0.1: + dependencies: + node-forge: 1.3.1 + optional: true + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + gtoken@6.1.2: + dependencies: + gaxios: 5.1.3 + google-p12-pem: 4.0.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + gtoken@7.1.0: + dependencies: + gaxios: 6.7.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.1 + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasha@3.0.0: + dependencies: + is-stream: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + heap-js@2.5.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hosted-git-info@2.8.9: {} + + html-entities@2.5.2: {} + + html-escaper@2.0.2: {} + + html-tags@3.3.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.8: {} + + http-proxy-agent@4.0.1: + dependencies: + "@tootallnate/once": 1.1.2 + agent-base: 6.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@5.0.0: + dependencies: + "@tootallnate/once": 2.0.0 + agent-base: 6.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + https-browserify@1.0.0: {} + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@9.1.4: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idb@7.0.1: {} + + idb@7.1.1: {} + + ieee754@1.2.1: {} + + iferr@0.1.5: {} + + ignore-walk@3.0.4: + dependencies: + minimatch: 3.1.2 + + image-size@0.9.7: + dependencies: + queue: 6.0.2 + + image-type@4.1.0: + dependencies: + file-type: 10.11.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + infer-owner@1.0.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + inquirer@6.5.2: + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + interpret@2.2.0: {} + + ipaddr.js@1.9.1: {} + + ipv6-normalize@1.0.1: {} + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@1.0.1: + dependencies: + binary-extensions: 1.13.1 + optional: true + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + optional: true + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: + optional: true + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-generator-fn@2.1.0: {} + + is-glob@3.1.0: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-html@2.0.0: + dependencies: + html-tags: 3.3.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream-ended@0.1.4: {} + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-windows@1.0.2: {} + + is-wsl@1.1.0: {} + + is@3.3.0: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + istanbul-lib-coverage@2.0.5: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@2.0.7: + dependencies: + append-transform: 1.0.0 + + istanbul-lib-instrument@3.3.0: + dependencies: + "@babel/generator": 7.25.0 + "@babel/parser": 7.25.3 + "@babel/template": 7.25.0 + "@babel/traverse": 7.25.3 + "@babel/types": 7.25.2 + istanbul-lib-coverage: 2.0.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@5.2.1: + dependencies: + "@babel/core": 7.25.2 + "@babel/parser": 7.25.3 + "@istanbuljs/schema": 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + "@babel/core": 7.25.2 + "@babel/parser": 7.25.3 + "@istanbuljs/schema": 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@2.0.8: + dependencies: + istanbul-lib-coverage: 2.0.5 + make-dir: 2.1.0 + supports-color: 6.1.0 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@3.0.6: + dependencies: + debug: 4.3.6 + istanbul-lib-coverage: 2.0.5 + make-dir: 2.1.0 + rimraf: 2.7.1 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.6 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@2.2.7: + dependencies: + html-escaper: 2.0.2 + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@4.0.1: + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + "@jest/environment": 29.7.0 + "@jest/expect": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@9.1.1(typescript@4.9.5)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 14.18.34 + ts-node: 10.9.2(@types/node@14.18.34)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 9.1.1(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 14.18.34 + ts-node: 10.9.2(@types/node@14.18.34)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 16.18.104 + ts-node: 10.9.2(@types/node@16.18.104)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 18.19.43 + ts-node: 10.9.2(@types/node@18.19.43)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@14.18.34)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@16.18.104)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@18.19.43)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@20.14.14)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@22.1.0)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 10.9.2(@types/node@22.1.0)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 20.14.14 + ts-node: 9.1.1(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 22.1.0 + ts-node: 10.9.2(@types/node@22.1.0)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@babel/core": 7.25.2 + "@jest/test-sequencer": 29.7.0 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + "@types/node": 22.1.0 + ts-node: 10.9.2(@types/node@22.1.0)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + "@jest/types": 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.5.0: + dependencies: + "@jest/environment": 29.7.0 + "@jest/fake-timers": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + "@jest/environment": 29.7.0 + "@jest/fake-timers": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + "@jest/types": 29.6.3 + "@types/graceful-fs": 4.1.9 + "@types/node": 20.14.14 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + "@babel/code-frame": 7.24.7 + "@jest/types": 29.6.3 + "@types/stack-utils": 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + "@jest/console": 29.7.0 + "@jest/environment": 29.7.0 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + "@jest/environment": 29.7.0 + "@jest/fake-timers": 29.7.0 + "@jest/globals": 29.7.0 + "@jest/source-map": 29.6.3 + "@jest/test-result": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.1.5 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + "@babel/core": 7.25.2 + "@babel/generator": 7.25.0 + "@babel/plugin-syntax-jsx": 7.24.7(@babel/core@7.25.2) + "@babel/plugin-syntax-typescript": 7.24.7(@babel/core@7.25.2) + "@babel/types": 7.25.2 + "@jest/expect-utils": 29.7.0 + "@jest/transform": 29.7.0 + "@jest/types": 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + "@jest/types": 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + "@jest/test-result": 29.7.0 + "@jest/types": 29.6.3 + "@types/node": 20.14.14 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + "@types/node": 20.14.14 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@9.1.1(typescript@4.9.5)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): + dependencies: + "@jest/core": 29.7.0(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + "@jest/types": 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + + joi@17.13.3: + dependencies: + "@hapi/hoek": 9.3.0 + "@hapi/topo": 5.1.0 + "@sideway/address": 4.1.5 + "@sideway/formula": 3.0.1 + "@sideway/pinpoint": 2.0.0 + + jose@4.15.9: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js2xmlparser@4.0.2: + dependencies: + xmlcreate: 2.0.4 + optional: true + + jsdoc@4.0.3: + dependencies: + "@babel/parser": 7.25.3 + "@jsdoc/salty": 0.2.8 + "@types/markdown-it": 14.1.2 + bluebird: 3.7.2 + catharsis: 0.9.0 + escape-string-regexp: 2.0.0 + js2xmlparser: 4.0.2 + klaw: 3.0.0 + markdown-it: 14.1.0 + markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + marked: 4.3.0 + mkdirp: 1.0.4 + requizzle: 0.2.4 + strip-json-comments: 3.1.1 + underscore: 1.13.7 + optional: true + + jsesc@2.5.2: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.1.2 + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.3 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwks-rsa@3.1.0: + dependencies: + "@types/express": 4.17.21 + "@types/jsonwebtoken": 9.0.6 + debug: 4.3.6 + jose: 4.15.9 + limiter: 1.1.5 + lru-memoizer: 2.3.0 + transitivePeerDependencies: + - supports-color + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@6.0.3: {} + + klaw@3.0.0: + dependencies: + graceful-fs: 4.2.11 + optional: true + + kleur@3.0.3: {} + + lazy-ass@1.6.0: {} + + leven@3.1.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + optional: true + + lilconfig@3.1.2: {} + + limiter@1.1.5: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + optional: true + + lint-staged@15.2.8: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + loader-runner@2.4.0: {} + + loader-utils@1.4.2: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.camelcase@4.3.0: {} + + lodash.chunk@4.2.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.flattendeep@4.4.0: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.memoize@4.1.2: {} + + lodash.once@4.1.1: {} + + lodash.snakecase@4.1.1: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + long@4.0.0: {} + + long@5.2.3: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@11.0.0: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-memoizer@2.3.0: + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 6.0.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): + dependencies: + "@types/markdown-it": 14.1.2 + markdown-it: 14.1.0 + optional: true + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + optional: true + + marked@4.3.0: + optional: true + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + mdurl@2.0.0: + optional: true + + media-typer@0.3.0: {} + + memory-fs@0.4.1: + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + + memory-fs@0.5.0: + dependencies: + errno: 0.1.8 + readable-stream: 2.3.8 + + merge-descriptors@1.0.1: {} + + merge-source-map@1.1.0: + dependencies: + source-map: 0.6.1 + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@3.0.0: {} + + mimic-fn@1.2.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + optional: true + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mississippi@3.0.0: + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.0 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mocked-env@1.3.5: + dependencies: + check-more-types: 2.24.0 + debug: 4.3.2 + lazy-ass: 1.6.0 + ramda: 0.27.1 + transitivePeerDependencies: + - supports-color + + moo@0.5.2: {} + + move-concurrently@1.0.1: + dependencies: + aproba: 1.2.0 + copy-concurrently: 1.0.5 + fs-write-stream-atomic: 1.0.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@0.0.7: {} + + nan@2.20.0: + optional: true + + nanoid@4.0.2: {} + + nanomatch@1.2.13: + 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.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare@1.4.0: {} + + nearley@2.20.1: + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + nested-error-stacks@2.1.1: {} + + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + node-int64@0.4.0: {} + + node-libs-browser@2.2.1: + dependencies: + assert: 1.5.1 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.8 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.4 + util: 0.11.1 + vm-browserify: 1.1.2 + + node-releases@2.0.18: {} + + nodemailer@6.9.13: {} + + nodemailer@6.9.14: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + optional: true + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nyc@14.1.1: + dependencies: + archy: 1.0.0 + caching-transform: 3.0.2 + convert-source-map: 1.9.0 + cp-file: 6.2.0 + find-cache-dir: 2.1.0 + find-up: 3.0.0 + foreground-child: 1.5.6 + glob: 7.1.5 + istanbul-lib-coverage: 2.0.5 + istanbul-lib-hook: 2.0.7 + istanbul-lib-instrument: 3.3.0 + istanbul-lib-report: 2.0.8 + istanbul-lib-source-maps: 3.0.6 + istanbul-reports: 2.2.7 + js-yaml: 3.14.1 + make-dir: 2.1.0 + merge-source-map: 1.1.0 + resolve-from: 4.0.0 + rimraf: 2.7.1 + signal-exit: 3.0.7 + spawn-wrap: 1.4.3 + test-exclude: 5.2.3 + uuid: 3.4.0 + yargs: 13.3.2 + yargs-parser: 13.1.2 + transitivePeerDependencies: + - supports-color + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-hash@3.0.0: {} + + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + optional: true + + os-browserify@0.3.0: {} + + os-homedir@1.0.2: {} + + os-tmpdir@1.0.2: {} + + p-defer@3.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + package-hash@3.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 3.0.0 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + + package-json-from-dist@1.0.0: {} + + pako@1.0.11: {} + + parallel-transform@1.2.0: + dependencies: + cyclist: 1.0.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + + parse-asn1@5.1.7: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + "@babel/code-frame": 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + pascalcase@0.1.1: {} + + path-browserify@0.0.1: {} + + path-dirname@1.0.2: + optional: true + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.0 + minipass: 7.1.2 + + path-to-regexp@0.1.7: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + pathval@1.1.1: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.0.0: {} + + prelude-ls@1.1.2: + optional: true + + prettier@1.15.3: {} + + prettier@3.3.3: {} + + pretty-format@29.7.0: + dependencies: + "@jest/schemas": 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + promise-inflight@1.0.1(bluebird@3.7.2): + optionalDependencies: + bluebird: 3.7.2 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proto3-json-serializer@1.1.1: + dependencies: + protobufjs: 7.3.2 + optional: true + + proto3-json-serializer@2.0.2: + dependencies: + protobufjs: 7.3.2 + + protobufjs-cli@1.1.1(protobufjs@7.2.4): + dependencies: + chalk: 4.1.2 + escodegen: 1.14.3 + espree: 9.6.1 + estraverse: 5.3.0 + glob: 8.1.0 + jsdoc: 4.0.3 + minimist: 1.2.8 + protobufjs: 7.2.4 + semver: 7.6.3 + tmp: 0.2.3 + uglify-js: 3.19.1 + optional: true + + protobufjs@6.11.4: + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/base64": 1.1.2 + "@protobufjs/codegen": 2.0.4 + "@protobufjs/eventemitter": 1.1.0 + "@protobufjs/fetch": 1.1.0 + "@protobufjs/float": 1.0.2 + "@protobufjs/inquire": 1.1.0 + "@protobufjs/path": 1.1.2 + "@protobufjs/pool": 1.1.0 + "@protobufjs/utf8": 1.1.0 + "@types/long": 4.0.2 + "@types/node": 20.14.14 + long: 4.0.0 + + protobufjs@7.2.4: + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/base64": 1.1.2 + "@protobufjs/codegen": 2.0.4 + "@protobufjs/eventemitter": 1.1.0 + "@protobufjs/fetch": 1.1.0 + "@protobufjs/float": 1.0.2 + "@protobufjs/inquire": 1.1.0 + "@protobufjs/path": 1.1.2 + "@protobufjs/pool": 1.1.0 + "@protobufjs/utf8": 1.1.0 + "@types/node": 20.14.14 + long: 5.2.3 + optional: true + + protobufjs@7.3.2: + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/base64": 1.1.2 + "@protobufjs/codegen": 2.0.4 + "@protobufjs/eventemitter": 1.1.0 + "@protobufjs/fetch": 1.1.0 + "@protobufjs/float": 1.0.2 + "@protobufjs/inquire": 1.1.0 + "@protobufjs/path": 1.1.2 + "@protobufjs/pool": 1.1.0 + "@protobufjs/utf8": 1.1.0 + "@types/node": 20.14.14 + long: 5.2.3 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + prr@1.0.1: {} + + pseudomap@1.0.2: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode.js@2.3.1: + optional: true + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + querystring-es3@0.2.1: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + railroad-diagrams@1.0.0: {} + + ramda@0.27.1: {} + + randexp@0.4.6: + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-is@18.3.1: {} + + read-pkg-up@4.0.0: + dependencies: + find-up: 3.0.0 + read-pkg: 3.0.0 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@2.2.1: + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + optional: true + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + optional: true + + rechoir@0.7.1: + dependencies: + resolve: 1.22.8 + + regenerator-runtime@0.14.1: {} + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + + remove-trailing-separator@1.1.0: + optional: true + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + requizzle@0.2.4: + dependencies: + lodash: 4.17.21 + optional: true + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-url@0.2.1: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + ret@0.1.15: {} + + retry-request@5.0.2: + dependencies: + debug: 4.3.6 + extend: 3.0.2 + transitivePeerDependencies: + - supports-color + optional: true + + retry-request@7.0.2: + dependencies: + "@types/request": 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + retry@0.13.1: {} + + rfdc@1.4.1: {} + + rimraf@2.7.1: + dependencies: + glob: 7.1.5 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + run-async@2.4.1: {} + + run-queue@1.0.3: + dependencies: + aproba: 1.2.0 + + rxjs@6.6.7: + dependencies: + tslib: 1.14.1 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safer-buffer@2.1.2: {} + + schema-utils@1.0.0: + dependencies: + ajv: 6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@4.0.0: + dependencies: + randombytes: 2.1.0 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + sharp@0.33.4: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.33.4 + "@img/sharp-darwin-x64": 0.33.4 + "@img/sharp-libvips-darwin-arm64": 1.0.2 + "@img/sharp-libvips-darwin-x64": 1.0.2 + "@img/sharp-libvips-linux-arm": 1.0.2 + "@img/sharp-libvips-linux-arm64": 1.0.2 + "@img/sharp-libvips-linux-s390x": 1.0.2 + "@img/sharp-libvips-linux-x64": 1.0.2 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + "@img/sharp-linux-arm": 0.33.4 + "@img/sharp-linux-arm64": 0.33.4 + "@img/sharp-linux-s390x": 0.33.4 + "@img/sharp-linux-x64": 0.33.4 + "@img/sharp-linuxmusl-arm64": 0.33.4 + "@img/sharp-linuxmusl-x64": 0.33.4 + "@img/sharp-wasm32": 0.33.4 + "@img/sharp-win32-ia32": 0.33.4 + "@img/sharp-win32-x64": 0.33.4 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smtp-server@3.13.4: + dependencies: + base32.js: 0.1.0 + ipv6-normalize: 1.0.1 + nodemailer: 6.9.13 + punycode: 2.3.1 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + source-list-map@2.0.1: {} + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-url@0.4.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + spawn-command@0.0.2: {} + + spawn-wrap@1.4.3: + dependencies: + foreground-child: 1.5.6 + mkdirp: 0.5.6 + os-homedir: 1.0.2 + rimraf: 2.7.1 + signal-exit: 3.0.7 + which: 1.3.1 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.18 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 + + spdx-license-ids@3.0.18: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + sprintf-js@1.0.3: {} + + sql-formatter@15.3.2: + dependencies: + argparse: 2.0.1 + get-stdin: 8.0.0 + nearley: 2.20.1 + + sql-formatter@2.3.4: + dependencies: + lodash: 4.17.21 + + ssri@6.0.2: + dependencies: + figgy-pudding: 3.5.2 + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + statuses@2.0.1: {} + + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + + stream-browserify@2.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + stream-each@1.2.3: + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.3 + + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-http@2.8.3: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.8 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + + stream-shift@1.0.3: {} + + string-argv@0.3.2: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-outer@1.0.1: + dependencies: + escape-string-regexp: 1.0.5 + + strnum@1.0.5: {} + + stubs@3.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@6.1.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@1.1.3: {} + + teeny-request@7.1.1: + dependencies: + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + + teeny-request@8.0.3: + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + teeny-request@9.0.0: + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + terser-webpack-plugin@1.4.6(webpack@4.47.0(webpack-cli@4.10.0)): + dependencies: + cacache: 12.0.4 + find-cache-dir: 2.1.0 + is-wsl: 1.1.0 + schema-utils: 1.0.0 + serialize-javascript: 4.0.0 + source-map: 0.6.1 + terser: 4.8.1 + webpack: 4.47.0(webpack-cli@4.10.0) + webpack-sources: 1.4.3 + worker-farm: 1.7.0 + + terser@4.8.1: + dependencies: + acorn: 8.12.1 + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.21 + + test-exclude@5.2.3: + dependencies: + glob: 7.1.5 + minimatch: 3.1.2 + read-pkg-up: 4.0.0 + require-main-filename: 2.0.0 + + test-exclude@6.0.0: + dependencies: + "@istanbuljs/schema": 0.1.3 + glob: 7.1.5 + minimatch: 3.1.2 + + text-decoding@1.0.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through@2.3.8: {} + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmp@0.2.3: + optional: true + + tmpl@1.0.5: {} + + to-arraybuffer@1.0.1: {} + + to-fast-properties@2.0.0: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + traverse@0.6.9: + dependencies: + gopd: 1.0.1 + typedarray.prototype.slice: 1.0.3 + which-typed-array: 1.1.15 + + tree-kill@1.2.2: {} + + trim-repeated@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + ts-deepmerge@2.0.7: {} + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@14.18.34)(ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@16.18.104)(ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@18.19.43)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@20.14.14)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@20.14.14)(ts-node@9.1.1(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)))(typescript@4.9.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-jest@29.1.2(@babel/core@7.25.2)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(jest@29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)))(typescript@5.5.4): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.1.0)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.5.4 + yargs-parser: 21.1.1 + optionalDependencies: + "@babel/core": 7.25.2 + "@jest/types": 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2) + + ts-loader@6.2.2(typescript@4.9.5): + dependencies: + chalk: 2.4.2 + enhanced-resolve: 4.5.0 + loader-utils: 1.4.2 + micromatch: 4.0.7 + semver: 6.3.1 + typescript: 4.9.5 + + ts-node@10.9.2(@types/node@14.18.34)(typescript@4.9.5): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 14.18.34 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@16.18.104)(typescript@4.9.5): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 16.18.104 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 18.19.43 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@20.14.14)(typescript@4.9.5): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 20.14.14 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 20.14.14 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@22.1.0)(typescript@4.9.5): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 22.1.0 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4): + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.11 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 22.1.0 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@9.1.1(typescript@4.9.5): + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.21 + typescript: 4.9.5 + yn: 3.1.1 + + tslib@1.14.1: {} + + tslib@2.6.3: {} + + tty-browserify@0.0.0: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + optional: true + + type-detect@4.0.8: {} + + type-detect@4.1.0: {} + + type-fest@0.21.3: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-of-is@3.5.1: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray.prototype.slice@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + typed-array-buffer: 1.0.2 + typed-array-byte-offset: 1.0.2 + + typedarray@0.0.6: {} + + typescript@4.9.5: {} + + typescript@5.5.4: {} + + uc.micro@2.1.0: + optional: true + + uglify-js@3.19.1: + optional: true + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + underscore@1.13.7: + optional: true + + undici-types@5.26.5: {} + + undici-types@6.13.0: {} + + undici@5.28.4: + dependencies: + "@fastify/busboy": 2.1.1 + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + + unpipe@1.0.0: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + upath@1.2.0: + optional: true + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + + urlgrey@1.0.0: + dependencies: + fast-url-parser: 1.1.3 + + use@3.1.1: {} + + util-deprecate@1.0.2: {} + + util@0.10.4: + dependencies: + inherits: 2.0.3 + + util@0.11.1: + dependencies: + inherits: 2.0.3 + + utils-merge@1.0.1: {} + + uuid@10.0.0: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + uuidv4@6.2.13: + dependencies: + "@types/uuid": 8.3.4 + uuid: 8.3.2 + + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + "@jridgewell/trace-mapping": 0.3.25 + "@types/istanbul-lib-coverage": 2.0.6 + convert-source-map: 2.0.0 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vary@1.1.2: {} + + vm-browserify@1.1.2: {} + + wait-for-expect@3.0.2: {} + + wait-on@7.2.0: + dependencies: + axios: 1.7.3 + joi: 17.13.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + wait-port@0.2.14: + dependencies: + chalk: 2.4.2 + commander: 3.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack-chokidar2@2.0.1: + dependencies: + chokidar: 2.1.8 + transitivePeerDependencies: + - supports-color + optional: true + + watchpack@1.7.5: + dependencies: + graceful-fs: 4.2.11 + neo-async: 2.6.2 + optionalDependencies: + chokidar: 3.6.0 + watchpack-chokidar2: 2.0.1 + transitivePeerDependencies: + - supports-color + + webidl-conversions@3.0.1: {} + + webpack-cli@4.10.0(webpack@4.47.0): + dependencies: + "@discoveryjs/json-ext": 0.5.7 + "@webpack-cli/configtest": 1.2.0(webpack-cli@4.10.0(webpack@4.47.0))(webpack@4.47.0(webpack-cli@4.10.0)) + "@webpack-cli/info": 1.5.0(webpack-cli@4.10.0(webpack@4.47.0)) + "@webpack-cli/serve": 1.7.0(webpack-cli@4.10.0(webpack@4.47.0)) + colorette: 2.0.20 + commander: 7.2.0 + cross-spawn: 7.0.3 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 2.2.0 + rechoir: 0.7.1 + webpack: 4.47.0(webpack-cli@4.10.0) + webpack-merge: 5.10.0 + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@1.4.3: + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + + webpack@4.47.0(webpack-cli@4.10.0): + dependencies: + "@webassemblyjs/ast": 1.9.0 + "@webassemblyjs/helper-module-context": 1.9.0 + "@webassemblyjs/wasm-edit": 1.9.0 + "@webassemblyjs/wasm-parser": 1.9.0 + acorn: 6.4.2 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + chrome-trace-event: 1.0.4 + enhanced-resolve: 4.5.0 + eslint-scope: 4.0.3 + json-parse-better-errors: 1.0.2 + loader-runner: 2.4.0 + loader-utils: 1.4.2 + memory-fs: 0.4.1 + micromatch: 3.1.10 + mkdirp: 0.5.6 + neo-async: 2.6.2 + node-libs-browser: 2.2.1 + schema-utils: 1.0.0 + tapable: 1.1.3 + terser-webpack-plugin: 1.4.6(webpack@4.47.0(webpack-cli@4.10.0)) + watchpack: 1.7.5 + webpack-sources: 1.4.3 + optionalDependencies: + webpack-cli: 4.10.0(webpack@4.47.0) + transitivePeerDependencies: + - supports-color + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-module@2.0.1: {} + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: + optional: true + + wordwrap@1.0.0: {} + + worker-farm@1.7.0: + dependencies: + errno: 0.1.8 + + workerpool@9.1.3: {} + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + xmlcreate@2.0.4: + optional: true + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.5.0: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..742d274d8 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,30 @@ +packages: + # emulator + - "_emulator/functions" + # firestore extensions + - "firestore-bigquery-export/functions" + - "firestore-counter/functions" + - "firestore-send-email/functions" + - "firestore-shorten-urls-bitly/functions" + - "firestore-translate-text/functions" + # firestore-counter clients + - "firestore-counter/clients/web" + - "firestore-counter/clients/node" + # - "firestore-counter/stress_test/bin" + # - "firestore-counter/stress_test/functions" + # firestore-bigquery-export scripts + - "firestore-bigquery-export/firestore-bigquery-change-tracker" + - "firestore-bigquery-export/scripts/gen-schema-view" + - "firestore-bigquery-export/scripts/import" + # samples + - "samples/rtdb-uppercase-messages/functions" + - "samples/rtdb-uppercase-messages/functions/integration-tests/functions" + # delete-user-data + # - "delete-user-data/test-data" + - "delete-user-data/functions" + # storage extensions + - "storage-resize-images/functions" + # rtdb extensions + - "rtdb-limit-child-nodes/function" + # root directory + - "." diff --git a/storage-resize-images/functions/package-lock.json b/storage-resize-images/functions/package-lock.json index 008c7d814..44782d0ad 100644 --- a/storage-resize-images/functions/package-lock.json +++ b/storage-resize-images/functions/package-lock.json @@ -1,20 +1,21 @@ { "name": "storage-resize-images-functions", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "storage-resize-images-functions", "license": "Apache-2.0", "dependencies": { + "@google-cloud/storage": "^7.12.1", "@types/node": "^20.10.3", - "firebase-admin": "^12.1.0", - "firebase-functions": "^4.9.0", + "firebase-admin": "^12.3.0", + "firebase-functions": "^5.0.1", "mkdirp": "^1.0.4", "rimraf": "^2.6.3", - "sharp": "0.32.6", - "typescript": "^4.9.4", - "uuid": "^9.0.0", + "sharp": "0.33.4", + "typescript": "^5.5.4", + "uuid": "^10.0.0", "uuidv4": "^6.1.0" }, "devDependencies": { @@ -31,12304 +32,810 @@ "ts-jest": "29.1.2" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, + "../../node_modules/.pnpm/@google-cloud+storage@7.12.1/node_modules/@google-cloud/storage": { + "version": "7.12.1", + "license": "Apache-2.0", "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "duplexify": "^4.1.3", + "fast-xml-parser": "^4.4.1", + "gaxios": "^6.0.2", + "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", + "mime": "^3.0.0", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "devDependencies": { + "@babel/cli": "^7.22.10", + "@babel/core": "^7.22.11", + "@google-cloud/pubsub": "^4.0.0", + "@grpc/grpc-js": "^1.0.3", + "@grpc/proto-loader": "^0.7.0", + "@types/async-retry": "^1.4.3", + "@types/duplexify": "^3.6.4", + "@types/mime": "^3.0.0", + "@types/mocha": "^9.1.1", + "@types/mockery": "^1.4.29", + "@types/node": "^20.4.4", + "@types/node-fetch": "^2.1.3", + "@types/proxyquire": "^1.3.28", + "@types/request": "^2.48.4", + "@types/sinon": "^17.0.0", + "@types/tmp": "0.2.6", + "@types/uuid": "^8.0.0", + "@types/yargs": "^17.0.10", + "c8": "^9.0.0", + "form-data": "^4.0.0", + "gapic-tools": "^0.4.0", + "gts": "^5.0.0", + "jsdoc": "^4.0.0", + "jsdoc-fresh": "^3.0.0", + "jsdoc-region-tag": "^3.0.0", + "linkinator": "^3.0.0", + "mocha": "^9.2.2", + "mockery": "^2.1.0", + "nock": "~13.5.0", + "node-fetch": "^2.6.7", + "pack-n-play": "^2.0.0", + "proxyquire": "^2.1.3", + "sinon": "^18.0.0", + "tmp": "^0.2.0", + "typescript": "^5.1.6", + "yargs": "^17.3.1" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/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": ">=14" } }, - "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "../../node_modules/.pnpm/@types+jest@29.5.0/node_modules/@types/jest": { + "version": "29.5.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "../../node_modules/.pnpm/@types+mkdirp@1.0.2/node_modules/@types/mkdirp": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": "*" } }, - "node_modules/@babel/helper-compilation-targets/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, + "../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node": { + "version": "20.14.14", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/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" + "undici-types": "~5.26.4" } }, - "node_modules/@babel/helper-compilation-targets/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/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "../../node_modules/.pnpm/child_process@1.0.2/node_modules/child_process": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">=6.9.0" - } + "license": "ISC" }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "../../node_modules/.pnpm/dotenv@16.4.5/node_modules/dotenv": { + "version": "16.4.5", "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "license": "BSD-2-Clause", + "devDependencies": { + "@definitelytyped/dtslint": "^0.0.133", + "@types/node": "^18.11.3", + "decache": "^4.6.1", + "sinon": "^14.0.1", + "standard": "^17.0.0", + "standard-markdown": "^7.1.0", + "standard-version": "^9.5.0", + "tap": "^16.3.0", + "tar": "^6.1.11", + "typescript": "^4.8.4" }, "engines": { - "node": ">=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" + "node": ">=12" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, + "../../node_modules/.pnpm/firebase-admin@12.3.0/node_modules/firebase-admin": { + "version": "12.3.0", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.24.0" + "@fastify/busboy": "^3.0.0", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", + "farmhash-modern": "^1.1.0", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.1.0", + "node-forge": "^1.3.1", + "uuid": "^10.0.0" + }, + "devDependencies": { + "@firebase/api-documenter": "^0.4.0", + "@firebase/app-compat": "^0.2.1", + "@firebase/auth-compat": "^0.4.1", + "@firebase/auth-types": "^0.12.0", + "@microsoft/api-extractor": "^7.11.2", + "@types/bcrypt": "^5.0.0", + "@types/chai": "^4.0.0", + "@types/chai-as-promised": "^7.1.0", + "@types/firebase-token-generator": "^2.0.28", + "@types/jsonwebtoken": "8.5.1", + "@types/lodash": "^4.14.104", + "@types/minimist": "^1.2.2", + "@types/mocha": "^10.0.0", + "@types/nock": "^11.1.0", + "@types/request": "^2.47.0", + "@types/request-promise": "^4.1.41", + "@types/sinon": "^17.0.2", + "@types/sinon-chai": "^3.0.0", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "bcrypt": "^5.0.0", + "chai": "^4.2.0", + "chai-as-promised": "^7.0.0", + "chai-exclude": "^2.1.0", + "chalk": "^4.1.1", + "child-process-promise": "^2.2.1", + "del": "^6.0.0", + "eslint": "^8.12.0", + "firebase-token-generator": "^2.0.0", + "gulp": "^5.0.0", + "gulp-filter": "^7.0.0", + "gulp-header": "^2.0.9", + "gulp-typescript": "^5.0.1", + "http-message-parser": "^0.0.34", + "lodash": "^4.17.15", + "minimist": "^1.2.6", + "mocha": "^10.0.0", + "mz": "^2.7.0", + "nock": "^13.0.0", + "npm-run-all": "^4.1.5", + "nyc": "^17.0.0", + "request": "^2.75.0", + "request-promise": "^4.1.1", + "run-sequence": "^2.2.1", + "sinon": "^18.0.0", + "sinon-chai": "^3.0.0", + "ts-node": "^10.2.0", + "typescript": "5.1.6", + "yargs": "^17.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.7.0", + "@google-cloud/storage": "^7.7.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "../../node_modules/.pnpm/firebase-functions-test@3.2.0_firebase-admin@12.3.0_firebase-functions@5.0.1_firebase-admin@1_tqqvbnej5bks2tqe3vgvd7isrq/node_modules/firebase-functions-test": { + "version": "3.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@types/lodash": "^4.14.104", + "lodash": "^4.17.5", + "ts-deepmerge": "^2.0.1" + }, + "devDependencies": { + "@types/chai": "~4.2.4", + "@types/mocha": "^5.2.7", + "chai": "^4.2.0", + "firebase-admin": "^12.0.0", + "firebase-functions": "^4.9.0", + "firebase-tools": "^8.9.2", + "mocha": "^6.2.2", + "prettier": "^1.19.1", + "sinon": "^7.5.0", + "tslint": "^5.20.0", + "typescript": "^4.2.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", + "firebase-functions": ">=4.9.0", + "jest": ">=28.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, + "../../node_modules/.pnpm/firebase-functions@5.0.1_firebase-admin@12.3.0/node_modules/firebase-functions": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@types/cors": "^2.8.5", + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "protobufjs": "^7.2.2" }, - "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" + "bin": { + "firebase-functions": "lib/bin/firebase-functions.js" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "devDependencies": { + "@firebase/api-documenter": "^0.2.0", + "@microsoft/api-documenter": "^7.13.45", + "@microsoft/api-extractor": "^7.18.7", + "@types/chai": "^4.1.7", + "@types/chai-as-promised": "^7.1.0", + "@types/jsonwebtoken": "^9.0.0", + "@types/mocha": "^5.2.7", + "@types/mock-require": "^2.0.0", + "@types/nock": "^10.0.3", + "@types/node": "^14.18.24", + "@types/node-fetch": "^3.0.3", + "@types/sinon": "^7.0.13", + "@typescript-eslint/eslint-plugin": "^5.33.1", + "@typescript-eslint/parser": "^5.33.1", + "api-extractor-model-me": "^0.1.1", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "child-process-promise": "^2.2.1", + "eslint": "^8.6.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-jsdoc": "^39.2.9", + "eslint-plugin-prettier": "^4.0.0", + "firebase-admin": "^12.1.0", + "js-yaml": "^3.13.1", + "jsdom": "^16.2.1", + "jsonwebtoken": "^9.0.0", + "jwk-to-pem": "^2.0.5", + "mocha": "^10.2.0", + "mock-require": "^3.0.3", + "mz": "^2.7.0", + "nock": "^13.2.9", + "node-fetch": "^2.6.7", + "portfinder": "^1.0.28", + "prettier": "^2.7.1", + "protobufjs-cli": "^1.1.1", + "semver": "^7.3.5", + "sinon": "^7.3.2", + "ts-node": "^10.4.0", + "typescript": "^4.3.5", + "yargs": "^15.3.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "node": ">=14.10.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "firebase-admin": "^11.10.0 || ^12.0.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==", + "../../node_modules/.pnpm/firebase@10.12.5/node_modules/firebase": { + "version": "10.12.5", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^1.9.0" + "@firebase/analytics": "0.10.7", + "@firebase/analytics-compat": "0.2.13", + "@firebase/app": "0.10.8", + "@firebase/app-check": "0.8.7", + "@firebase/app-check-compat": "0.3.14", + "@firebase/app-compat": "0.2.38", + "@firebase/app-types": "0.9.2", + "@firebase/auth": "1.7.6", + "@firebase/auth-compat": "0.5.11", + "@firebase/database": "1.0.7", + "@firebase/database-compat": "1.0.7", + "@firebase/firestore": "4.6.5", + "@firebase/firestore-compat": "0.3.34", + "@firebase/functions": "0.11.6", + "@firebase/functions-compat": "0.3.12", + "@firebase/installations": "0.6.8", + "@firebase/installations-compat": "0.2.8", + "@firebase/messaging": "0.12.10", + "@firebase/messaging-compat": "0.2.10", + "@firebase/performance": "0.6.8", + "@firebase/performance-compat": "0.2.8", + "@firebase/remote-config": "0.4.8", + "@firebase/remote-config-compat": "0.2.8", + "@firebase/storage": "0.12.6", + "@firebase/storage-compat": "0.3.9", + "@firebase/util": "1.9.7", + "@firebase/vertexai-preview": "0.0.3" }, - "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==", + "devDependencies": { + "@rollup/plugin-commonjs": "21.1.0", + "@rollup/plugin-node-resolve": "13.3.0", + "gulp": "4.0.2", + "gulp-replace": "1.1.4", + "gulp-sourcemaps": "3.0.0", + "rollup": "2.79.1", + "rollup-plugin-license": "3.0.1", + "rollup-plugin-sourcemaps": "0.6.3", + "rollup-plugin-terser": "7.0.2", + "rollup-plugin-typescript2": "0.31.2", + "rollup-plugin-uglify": "6.0.4", + "typescript": "4.2.2" + } + }, + "../../node_modules/.pnpm/image-size@0.9.7/node_modules/image-size": { + "version": "0.9.7", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "devDependencies": { + "@types/chai": "4.2.15", + "@types/glob": "7.1.3", + "@types/mocha": "8.2.1", + "@types/node": "14.14.34", + "@types/sinon": "9.0.11", + "@typescript-eslint/eslint-plugin": "4.17.0", + "@typescript-eslint/parser": "4.17.0", + "chai": "4.3.4", + "eslint": "7.22.0", + "glob": "7.1.6", + "mocha": "8.3.2", + "nyc": "15.1.0", + "sinon": "9.2.4", + "ts-node": "9.1.1", + "typedoc": "0.20.32", + "typescript": "4.2.3" }, "engines": { - "node": ">=4" + "node": ">=10.18.0" } }, - "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==", + "../../node_modules/.pnpm/image-type@4.1.0/node_modules/image-type": { + "version": "4.1.0", "dev": true, + "license": "MIT", "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, + "file-type": "^10.10.0" + }, + "devDependencies": { + "@types/node": "^11.13.0", + "ava": "^1.4.1", + "read-chunk": "^3.2.0", + "tsd": "^0.7.2", + "xo": "^0.24.0" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "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==", + "../../node_modules/.pnpm/jest@29.5.0_@types+node@20.14.14_ts-node@10.9.2_@types+node@20.14.14_typescript@5.5.4_/node_modules/jest": { + "version": "29.5.0", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, "bin": { - "parser": "bin/babel-parser.js" + "jest": "bin/jest.js" + }, + "devDependencies": { + "@tsd/typescript": "^4.9.0", + "tsd-lite": "^0.6.0" }, "engines": { - "node": ">=6.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" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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" + "../../node_modules/.pnpm/mkdirp@1.0.4/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "devDependencies": { + "require-inject": "^1.4.4", + "tap": "^14.10.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "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==", + "../../node_modules/.pnpm/mocked-env@1.3.5/node_modules/mocked-env": { + "version": "1.3.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "check-more-types": "2.24.0", + "debug": "4.3.2", + "lazy-ass": "1.6.0", + "ramda": "0.27.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "devDependencies": { + "ban-sensitive-files": "1.9.15", + "dependency-check": "4.1.0", + "deps-ok": "1.4.1", + "git-issues": "1.3.1", + "license-checker": "20.2.0", + "mocha": "7.2.0", + "prettier-standard": "9.1.1", + "semantic-release": "17.4.4", + "standard": "11.0.1", + "stop-only": "3.1.0", + "travis-deploy-once": "5.0.11" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6" } }, - "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, + "../../node_modules/.pnpm/rimraf@2.7.1/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "glob": "^7.1.3" }, - "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" + "bin": { + "rimraf": "bin.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^12.1.1" } }, - "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, + "../../node_modules/.pnpm/sharp@0.33.4/node_modules/sharp": { + "version": "0.33.4", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" }, - "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" + "devDependencies": { + "@emnapi/runtime": "^1.1.1", + "@img/sharp-libvips-dev": "1.0.2", + "@img/sharp-libvips-dev-wasm32": "1.0.3", + "@img/sharp-libvips-win32-ia32": "1.0.2", + "@img/sharp-libvips-win32-x64": "1.0.2", + "@types/node": "*", + "async": "^3.2.5", + "cc": "^3.0.1", + "emnapi": "^1.1.1", + "exif-reader": "^2.0.1", + "extract-zip": "^2.0.1", + "icc": "^3.0.0", + "jsdoc-to-markdown": "^8.0.1", + "license-checker": "^25.0.1", + "mocha": "^10.4.0", + "node-addon-api": "^8.0.0", + "nyc": "^15.1.0", + "prebuild": "^13.0.1", + "semistandard": "^17.0.0", + "tar-fs": "^3.0.6", + "tsd": "^0.31.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.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==", + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "../../node_modules/.pnpm/ts-jest@29.1.2_@babel+core@7.25.2_@jest+types@29.6.3_babel-jest@29.7.0_@babel+core@7.25.2__je_h63ri4ajjbunbre33jpsxe2lmy/node_modules/ts-jest": { + "version": "29.1.2", "dev": true, + "license": "MIT", "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-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-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "bin": { + "ts-jest": "cli.js" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "devDependencies": { + "@commitlint/cli": "17.x", + "@commitlint/config-angular": "^17.6.5", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__core": "7.x", + "@types/cross-spawn": "latest", + "@types/fs-extra": "latest", + "@types/js-yaml": "latest", + "@types/lodash.camelcase": "4.x", + "@types/lodash.memoize": "4.x", + "@types/lodash.set": "4.x", + "@types/micromatch": "4.x", + "@types/node": "18.16.18", + "@types/react": "18.x", + "@types/rimraf": "^3.0.2", + "@types/semver": "latest", + "@types/yargs": "latest", + "@types/yargs-parser": "21.x", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "babel-jest": "^29.5.0", + "conventional-changelog-cli": "2.x", + "cross-spawn": "latest", + "esbuild": "~0.17.19", + "eslint": "^8.42.0", + "eslint-config-prettier": "latest", + "eslint-plugin-import": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prefer-arrow": "latest", + "eslint-plugin-prettier": "latest", + "execa": "5.1.1", + "fs-extra": "11.x", + "glob": "^10.2.6", + "glob-gitignore": "latest", + "husky": "4.x", + "jest": "^29.5.0", + "jest-snapshot-serializer-raw": "^1.2.0", + "js-yaml": "latest", + "json-schema-to-typescript": "^13.0.2", + "lint-staged": "latest", + "lodash.camelcase": "^4.3.0", + "lodash.set": "^4.3.2", + "node-fetch": "^3.3.2", + "prettier": "^2.8.8", + "typescript": "~5.1.3" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dev": true, - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", - "dev": true - }, - "node_modules/@firebase/app": { - "version": "0.9.19", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.19.tgz", - "integrity": "sha512-t/SHyZ3xWkR77ZU9VMoobDNFLdDKQ5xqoCAn4o16gTsA1C8sJ6ZOMZ02neMOPxNHuQXVE4tA8ukilnDbnK7uJA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dev": true, - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==", - "dev": true - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", - "dev": true - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.19.tgz", - "integrity": "sha512-QkJDqYqjhvs4fTMcRVXQkP9hbo5yfoJXDWkhU4VA5Vzs8Qsp76VPzYbqx5SD5OmBy+bz/Ot1UV8qySPGI4aKuw==", - "dev": true, - "dependencies": { - "@firebase/app": "0.9.19", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", - "dev": true - }, - "node_modules/@firebase/auth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.3.0.tgz", - "integrity": "sha512-vjK4CHbY9aWdiVOrKi6mpa8z6uxeaf7LB/MZTHuZOiGHMcUoTGB6TeMbRShyqk1uaMrxhhZ5Ar/dR0965E1qyA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { + "@babel/core": { "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.6.tgz", - "integrity": "sha512-pKp1d4fSf+yoy1EBjTx9ISxlunqhW0vTICk0ByZ3e+Lp6ZIXThfUy4F1hAJlEafD/arM0oepRiAh7LXS1xn/BA==", - "dev": true, - "dependencies": { - "@firebase/auth": "1.3.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-compat/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { "optional": true } } }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", - "dev": true - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "dev": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/auth/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" + "../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript": { + "version": "5.5.4", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "encoding": "^0.1.0" + "devDependencies": { + "@dprint/formatter": "^0.3.0", + "@dprint/typescript": "0.91.0", + "@esfx/canceltoken": "^1.0.0", + "@octokit/rest": "^20.1.1", + "@types/chai": "^4.3.16", + "@types/microsoft__typescript-etw": "^0.1.3", + "@types/minimist": "^1.2.5", + "@types/mocha": "^10.0.6", + "@types/ms": "^0.7.34", + "@types/node": "latest", + "@types/source-map-support": "^0.5.10", + "@types/which": "^3.0.3", + "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/parser": "^7.11.0", + "@typescript-eslint/utils": "^7.11.0", + "azure-devops-node-api": "^13.0.0", + "c8": "^9.1.0", + "chai": "^4.4.1", + "chalk": "^4.1.2", + "chokidar": "^3.6.0", + "diff": "^5.2.0", + "dprint": "^0.46.1", + "esbuild": "^0.21.4", + "eslint": "^8.57.0", + "eslint-formatter-autolinkable-stylish": "^1.3.0", + "eslint-plugin-local": "^4.2.2", + "fast-xml-parser": "^4.4.0", + "glob": "^10.4.1", + "hereby": "^1.8.9", + "jsonc-parser": "^3.2.1", + "minimist": "^1.2.8", + "mocha": "^10.4.0", + "mocha-fivemat-progress-reporter": "^0.1.0", + "ms": "^2.1.3", + "node-fetch": "^3.3.2", + "playwright": "^1.44.1", + "source-map-support": "^0.5.21", + "tslib": "^2.6.2", + "typescript": "^5.4.5", + "which": "^3.0.1" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", - "dev": true, - "dependencies": { - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", - "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", + "devDependencies": { + "@babel/cli": "7.24.6", + "@babel/core": "7.24.6", + "@babel/eslint-parser": "7.24.6", + "@babel/plugin-syntax-import-attributes": "7.24.6", + "@babel/preset-env": "7.24.6", + "@commitlint/cli": "19.3.0", + "@commitlint/config-conventional": "19.2.2", + "@wdio/browserstack-service": "7.16.10", + "@wdio/cli": "7.16.10", + "@wdio/jasmine-framework": "7.16.6", + "@wdio/local-runner": "7.16.10", + "@wdio/spec-reporter": "7.16.9", + "@wdio/static-server-service": "7.16.6", + "bundlewatch": "0.3.3", + "eslint": "9.4.0", + "eslint-plugin-prettier": "5.1.3", + "globals": "15.3.0", + "husky": "9.0.11", + "jest": "29.7.0", + "lint-staged": "15.2.5", + "neostandard": "0.5.1", + "npm-run-all": "4.1.5", + "optional-dev-dependency": "2.0.1", + "prettier": "3.3.0", + "random-seed": "0.3.0", + "runmd": "1.3.9", + "standard-version": "9.5.0" + } + }, + "../../node_modules/.pnpm/uuidv4@6.2.13/node_modules/uuidv4": { + "version": "6.2.13", + "license": "MIT", "dependencies": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" + "@types/uuid": "8.3.4", + "uuid": "8.3.2" + }, + "devDependencies": { + "assertthat": "6.4.0", + "roboter": "12.7.1", + "semantic-release-configuration": "2.0.7" } }, - "node_modules/@firebase/database-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", - "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", - "dependencies": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } + "node_modules/@google-cloud/storage": { + "resolved": "../../node_modules/.pnpm/@google-cloud+storage@7.12.1/node_modules/@google-cloud/storage", + "link": true }, - "node_modules/@firebase/database-compat/node_modules/@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "dependencies": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } + "node_modules/@types/jest": { + "resolved": "../../node_modules/.pnpm/@types+jest@29.5.0/node_modules/@types/jest", + "link": true }, - "node_modules/@firebase/database-compat/node_modules/@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/@types/mkdirp": { + "resolved": "../../node_modules/.pnpm/@types+mkdirp@1.0.2/node_modules/@types/mkdirp", + "link": true }, - "node_modules/@firebase/database-compat/node_modules/@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/@types/node": { + "resolved": "../../node_modules/.pnpm/@types+node@20.14.14/node_modules/@types/node", + "link": true }, - "node_modules/@firebase/database-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", - "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", - "dependencies": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - } + "node_modules/child_process": { + "resolved": "../../node_modules/.pnpm/child_process@1.0.2/node_modules/child_process", + "link": true }, - "node_modules/@firebase/database-types/node_modules/@firebase/app-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", - "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" + "node_modules/dotenv": { + "resolved": "../../node_modules/.pnpm/dotenv@16.4.5/node_modules/dotenv", + "link": true }, - "node_modules/@firebase/database-types/node_modules/@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/firebase": { + "resolved": "../../node_modules/.pnpm/firebase@10.12.5/node_modules/firebase", + "link": true }, - "node_modules/@firebase/database/node_modules/@firebase/app-check-interop-types": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", - "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" + "node_modules/firebase-admin": { + "resolved": "../../node_modules/.pnpm/firebase-admin@12.3.0/node_modules/firebase-admin", + "link": true }, - "node_modules/@firebase/database/node_modules/@firebase/auth-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", - "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" + "node_modules/firebase-functions": { + "resolved": "../../node_modules/.pnpm/firebase-functions@5.0.1_firebase-admin@12.3.0/node_modules/firebase-functions", + "link": true }, - "node_modules/@firebase/database/node_modules/@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "dependencies": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } + "node_modules/firebase-functions-test": { + "resolved": "../../node_modules/.pnpm/firebase-functions-test@3.2.0_firebase-admin@12.3.0_firebase-functions@5.0.1_firebase-admin@1_tqqvbnej5bks2tqe3vgvd7isrq/node_modules/firebase-functions-test", + "link": true }, - "node_modules/@firebase/database/node_modules/@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/image-size": { + "resolved": "../../node_modules/.pnpm/image-size@0.9.7/node_modules/image-size", + "link": true }, - "node_modules/@firebase/database/node_modules/@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/image-type": { + "resolved": "../../node_modules/.pnpm/image-type@4.1.0/node_modules/image-type", + "link": true }, - "node_modules/@firebase/firestore": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.2.0.tgz", - "integrity": "sha512-iKZqIdOBJpJUcwY5airLX0W04TLrQSJuActOP1HG5WoIY5oyGTQE4Ml7hl5GW7mBqFieT4ojtUuDXj6MLrn1lA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } + "node_modules/jest": { + "resolved": "../../node_modules/.pnpm/jest@29.5.0_@types+node@20.14.14_ts-node@10.9.2_@types+node@20.14.14_typescript@5.5.4_/node_modules/jest", + "link": true }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.18.tgz", - "integrity": "sha512-hkqv4mb1oScKbEtzfcK8Go8c0VpDWmbAvbD6B6XnphLqi27pkXgo9Rp+aSKlD7cBL29VMEekP5bEm9lSVfZpNw==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } + "node_modules/mkdirp": { + "resolved": "../../node_modules/.pnpm/mkdirp@1.0.4/node_modules/mkdirp", + "link": true }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", - "dev": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } + "node_modules/mocked-env": { + "resolved": "../../node_modules/.pnpm/mocked-env@1.3.5/node_modules/mocked-env", + "link": true }, - "node_modules/@firebase/firestore/node_modules/@grpc/grpc-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.4.tgz", - "integrity": "sha512-oEnzYiDuEsBydZBtP84BkpduLsE1nSAO4KrhTLHRzNrIQE647fhchmosTQsJdCo8X9zBBt+l5+fNk+m/yCFJ/Q==", - "dev": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } + "node_modules/rimraf": { + "resolved": "../../node_modules/.pnpm/rimraf@2.7.1/node_modules/rimraf", + "link": true }, - "node_modules/@firebase/firestore/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } + "node_modules/sharp": { + "resolved": "../../node_modules/.pnpm/sharp@0.33.4/node_modules/sharp", + "link": true }, - "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dev": true, - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } + "node_modules/ts-jest": { + "resolved": "../../node_modules/.pnpm/ts-jest@29.1.2_@babel+core@7.25.2_@jest+types@29.6.3_babel-jest@29.7.0_@babel+core@7.25.2__je_h63ri4ajjbunbre33jpsxe2lmy/node_modules/ts-jest", + "link": true }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } + "node_modules/typescript": { + "resolved": "../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript", + "link": true }, - "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", - "dev": true + "node_modules/uuid": { + "resolved": "../../node_modules/.pnpm/uuid@10.0.0/node_modules/uuid", + "link": true }, - "node_modules/@firebase/functions/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "dev": true, - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "dev": true - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", - "dev": true - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "dev": true - }, - "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", - "dev": true - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", - "dev": true - }, - "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "dev": true, - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/storage/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==", - "dev": true - }, - "node_modules/@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.10.0.tgz", - "integrity": "sha512-aBNejLVzHpI7C8eJSMpBpfdq1lxvYuHqG+zy/xvs032RyPRxuu45DLMeXuAbgwyx1VBsxWGYifrPDx+O7hJrmw==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/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==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "devOptional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "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/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/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/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/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/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/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "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.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "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/@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==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.192", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz", - "integrity": "sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "node_modules/@types/mkdirp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", - "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "devOptional": 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==", - "devOptional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "optional": true - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "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.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "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/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "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/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/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "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/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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", - "dev": true - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.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==", - "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==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "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==", - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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==", - "devOptional": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "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/error-ex/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/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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/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/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/farmhash/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "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==", - "optional": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "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-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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/firebase": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.4.0.tgz", - "integrity": "sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w==", - "dev": true, - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.19", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.19", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.3.0", - "@firebase/auth-compat": "0.4.6", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-compat": "0.3.18", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" - } - }, - "node_modules/firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", - "dependencies": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/firebase-functions": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", - "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "node_modules/firebase-functions-test": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.2.0.tgz", - "integrity": "sha512-UkOPIJH4I4qUGGSr4vaBcbAqn+YblVtMqRI2KQMW2nhMw5So91Iw1klu5Epk8vhEOhn1LPG5/tMaBI1MAtOt6Q==", - "dev": true, - "dependencies": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5", - "ts-deepmerge": "^2.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", - "firebase-functions": ">=4.9.0", - "jest": ">=28.0.0" - } - }, - "node_modules/firebase-functions/node_modules/@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/firebase/node_modules/@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dev": true, - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dev": true, - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", - "dev": true, - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "optional": true - }, - "node_modules/gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "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-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "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/google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.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-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "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==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/image-size": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.9.7.tgz", - "integrity": "sha512-KRVgLNZkr00YGN0qn9MlIrmlxbRhsCcEb1Byq3WKGnIV4M48iD185cprRtaoK4t5iC+ym2Q5qlArxZ/V1yzDgA==", - "dev": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=10.18.0" - } - }, - "node_modules/image-type": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", - "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", - "dev": true, - "dependencies": { - "file-type": "^10.10.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "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/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "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.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/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/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/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/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/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/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/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/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "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": "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/js-yaml/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/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-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "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 - }, - "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/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", - "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "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/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "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/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/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "devOptional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "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 - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "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/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.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==", - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mocked-env": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", - "integrity": "sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==", - "dev": true, - "dependencies": { - "check-more-types": "2.24.0", - "debug": "4.3.2", - "lazy-ass": "1.6.0", - "ramda": "0.27.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocked-env/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/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "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/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.34.0.tgz", - "integrity": "sha512-O5sNsdgxptez/bSXk2CfpTcVu4yTiFW1YcMHIVn2uAY8MksXWQeReMx63krFrj/QSyjRJ5/jIBkWvJ3/ZimdcA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "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/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "devOptional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/p-locate/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/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/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "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/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": "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/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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/proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "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==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "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==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/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==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/sharp/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "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/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "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/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-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.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-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/streamx": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", - "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "devOptional": 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==", - "devOptional": 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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "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/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/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==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/test-exclude/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/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/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/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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-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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "devOptional": true - }, - "node_modules/ts-deepmerge": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", - "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", - "dev": true - }, - "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "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.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "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/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuidv4": { - "version": "6.2.13", - "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", - "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", - "dependencies": { - "@types/uuid": "8.3.4", - "uuid": "8.3.2" - } - }, - "node_modules/uuidv4/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==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "devOptional": true - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "devOptional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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/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==", - "devOptional": 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==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true - }, - "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "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" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@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-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true - }, - "@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-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.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.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.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true - }, - "@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-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "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-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.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-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-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" - }, - "@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dev": true, - "requires": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", - "dev": true - }, - "@firebase/app": { - "version": "0.9.19", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.19.tgz", - "integrity": "sha512-t/SHyZ3xWkR77ZU9VMoobDNFLdDKQ5xqoCAn4o16gTsA1C8sJ6ZOMZ02neMOPxNHuQXVE4tA8ukilnDbnK7uJA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dev": true, - "requires": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==", - "dev": true - }, - "@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", - "dev": true - }, - "@firebase/app-compat": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.19.tgz", - "integrity": "sha512-QkJDqYqjhvs4fTMcRVXQkP9hbo5yfoJXDWkhU4VA5Vzs8Qsp76VPzYbqx5SD5OmBy+bz/Ot1UV8qySPGI4aKuw==", - "dev": true, - "requires": { - "@firebase/app": "0.9.19", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", - "dev": true - }, - "@firebase/auth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.3.0.tgz", - "integrity": "sha512-vjK4CHbY9aWdiVOrKi6mpa8z6uxeaf7LB/MZTHuZOiGHMcUoTGB6TeMbRShyqk1uaMrxhhZ5Ar/dR0965E1qyA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "@firebase/auth-compat": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.6.tgz", - "integrity": "sha512-pKp1d4fSf+yoy1EBjTx9ISxlunqhW0vTICk0ByZ3e+Lp6ZIXThfUy4F1hAJlEafD/arM0oepRiAh7LXS1xn/BA==", - "dev": true, - "requires": { - "@firebase/auth": "1.3.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", - "dev": true - }, - "@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "dev": true, - "requires": {} - }, - "@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", - "dev": true, - "requires": { - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/database": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", - "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", - "requires": { - "@firebase/app-check-interop-types": "0.3.1", - "@firebase/auth-interop-types": "0.2.2", - "@firebase/component": "0.6.6", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "dependencies": { - "@firebase/app-check-interop-types": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", - "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" - }, - "@firebase/auth-interop-types": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", - "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" - }, - "@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "requires": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@firebase/database-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", - "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", - "requires": { - "@firebase/component": "0.6.6", - "@firebase/database": "1.0.4", - "@firebase/database-types": "1.0.2", - "@firebase/logger": "0.4.1", - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - }, - "dependencies": { - "@firebase/component": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", - "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", - "requires": { - "@firebase/util": "1.9.5", - "tslib": "^2.1.0" - } - }, - "@firebase/logger": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", - "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@firebase/database-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", - "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", - "requires": { - "@firebase/app-types": "0.9.1", - "@firebase/util": "1.9.5" - }, - "dependencies": { - "@firebase/app-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", - "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" - }, - "@firebase/util": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", - "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@firebase/firestore": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.2.0.tgz", - "integrity": "sha512-iKZqIdOBJpJUcwY5airLX0W04TLrQSJuActOP1HG5WoIY5oyGTQE4Ml7hl5GW7mBqFieT4ojtUuDXj6MLrn1lA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "dependencies": { - "@grpc/grpc-js": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.4.tgz", - "integrity": "sha512-oEnzYiDuEsBydZBtP84BkpduLsE1nSAO4KrhTLHRzNrIQE647fhchmosTQsJdCo8X9zBBt+l5+fNk+m/yCFJ/Q==", - "dev": true, - "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "@firebase/firestore-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.18.tgz", - "integrity": "sha512-hkqv4mb1oScKbEtzfcK8Go8c0VpDWmbAvbD6B6XnphLqi27pkXgo9Rp+aSKlD7cBL29VMEekP5bEm9lSVfZpNw==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", - "dev": true, - "requires": {} - }, - "@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dev": true, - "requires": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", - "dev": true - }, - "@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "dependencies": { - "idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "dev": true - } - } - }, - "@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "dev": true, - "requires": {} - }, - "@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "dependencies": { - "idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", - "dev": true - } - } - }, - "@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", - "dev": true - }, - "@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", - "dev": true - }, - "@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", - "dev": true - }, - "@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } - } - }, - "@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "dev": true, - "requires": {} - }, - "@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==", - "dev": true - }, - "@google-cloud/firestore": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.6.0.tgz", - "integrity": "sha512-WUDbaLY8UnPxgwsyIaxj6uxCtSDAaUyvzWJykNH5rZ9i92/SZCsPNNMN0ajrVpAR81hPIL4amXTaMJ40y5L+Yg==", - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.1", - "protobufjs": "^7.2.6" - } - }, - "@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "requires": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - } - }, - "@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true - }, - "@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true - }, - "@google-cloud/storage": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.10.0.tgz", - "integrity": "sha512-aBNejLVzHpI7C8eJSMpBpfdq1lxvYuHqG+zy/xvs032RyPRxuu45DLMeXuAbgwyx1VBsxWGYifrPDx+O7hJrmw==", - "optional": true, - "requires": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - } - } - }, - "@grpc/grpc-js": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", - "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", - "optional": true, - "requires": { - "@grpc/proto-loader": "^0.7.10", - "@js-sdsl/ordered-map": "^4.4.2" - } - }, - "@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "devOptional": true, - "requires": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - } - }, - "@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" - } - }, - "@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 - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@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.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "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" - } - }, - "@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==", - "optional": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", - "requires": { - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.192", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz", - "integrity": "sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==", - "dev": true - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "@types/mkdirp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", - "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" - }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "requires": { - "debug": "^4.3.4" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "optional": true - }, - "b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.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==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "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" - } - }, - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "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 - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "dev": true - }, - "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" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true - }, - "child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", - "dev": true - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "devOptional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.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==", - "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==" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "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" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "requires": {} - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "optional": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true - }, - "duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.4.736", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", - "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "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==", - "devOptional": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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 - }, - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "farmhash": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-3.3.1.tgz", - "integrity": "sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==", - "requires": { - "node-addon-api": "^5.1.0", - "prebuild-install": "^7.1.2" - }, - "dependencies": { - "node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - } - } - }, - "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==", - "optional": true - }, - "fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "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-xml-parser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", - "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", - "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" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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==" - } - } - }, - "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" - } - }, - "firebase": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.4.0.tgz", - "integrity": "sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w==", - "dev": true, - "requires": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.19", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.19", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.3.0", - "@firebase/auth-compat": "0.4.6", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.2.0", - "@firebase/firestore-compat": "0.3.18", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" - }, - "dependencies": { - "@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dev": true, - "requires": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dev": true, - "requires": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", - "dev": true, - "requires": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - } - } - }, - "firebase-admin": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.1.0.tgz", - "integrity": "sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==", - "requires": { - "@fastify/busboy": "^2.1.0", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0", - "@types/node": "^20.10.3", - "farmhash": "^3.3.0", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "long": "^5.2.3", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - } - }, - "firebase-functions": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.9.0.tgz", - "integrity": "sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==", - "requires": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "protobufjs": "^7.2.2" - }, - "dependencies": { - "@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - } - } - }, - "firebase-functions-test": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.2.0.tgz", - "integrity": "sha512-UkOPIJH4I4qUGGSr4vaBcbAqn+YblVtMqRI2KQMW2nhMw5So91Iw1klu5Epk8vhEOhn1LPG5/tMaBI1MAtOt6Q==", - "dev": true, - "requires": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5", - "ts-deepmerge": "^2.0.1" - } - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "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==", - "optional": true - }, - "gaxios": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz", - "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==", - "optional": true, - "requires": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - } - }, - "gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "requires": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - } - }, - "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==", - "devOptional": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "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-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "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 - }, - "google-auth-library": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.8.0.tgz", - "integrity": "sha512-TJJXFzMlVGRlIH27gYZ6XXyPf5Y3OItsKFfefsDAafNNywYRTkei83nEO29IrYj8GtdHWU78YnW+YZdaZaXIJA==", - "optional": true, - "requires": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - } - }, - "google-gax": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.2.tgz", - "integrity": "sha512-2mw7qgei2LPdtGrmd1zvxQviOcduTnsvAWYzCxhOWXK4IQKmQztHnDQwD0ApB690fBQJemFKSU7DnceAy3RLzw==", - "optional": true, - "requires": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "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 - }, - "gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "requires": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - } - }, - "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-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "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 - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "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==", - "optional": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "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==", - "optional": true, - "requires": { - "debug": "4" - } - } - } - }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "image-size": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.9.7.tgz", - "integrity": "sha512-KRVgLNZkr00YGN0qn9MlIrmlxbRhsCcEb1Byq3WKGnIV4M48iD185cprRtaoK4t5iC+ym2Q5qlArxZ/V1yzDgA==", - "dev": true, - "requires": { - "queue": "6.0.2" - } - }, - "image-type": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", - "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", - "dev": true, - "requires": { - "file-type": "^10.10.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "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==", - "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==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "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==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "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==", - "devOptional": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "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 - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.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.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jose": { - "version": "4.15.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", - "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==" - }, - "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": "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" - }, - "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" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "dependencies": { - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - } - } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", - "requires": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", - "debug": "^4.3.4", - "jose": "^4.10.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "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 - }, - "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" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "devOptional": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", - "requires": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - } - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "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 - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "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" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "mocked-env": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", - "integrity": "sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==", - "dev": true, - "requires": { - "check-more-types": "2.24.0", - "debug": "4.3.2", - "lazy-ass": "1.6.0", - "ramda": "0.27.1" - }, - "dependencies": { - "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" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-abi": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.34.0.tgz", - "integrity": "sha512-O5sNsdgxptez/bSXk2CfpTcVu4yTiFW1YcMHIVn2uAY8MksXWQeReMx63krFrj/QSyjRJ5/jIBkWvJ3/ZimdcA==", - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "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 - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.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==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.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==", - "devOptional": true, - "requires": { - "yocto-queue": "^0.1.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" - }, - "dependencies": { - "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-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 - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "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==" - }, - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "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 - }, - "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": "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" - } - }, - "prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "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" - } - }, - "proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "requires": { - "protobufjs": "^7.2.5" - } - }, - "protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, - "queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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==", - "devOptional": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.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 - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true - }, - "retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "requires": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "requires": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "requires": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - } - } - }, - "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 - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "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 - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "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 - }, - "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-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "requires": { - "stubs": "^3.0.0" - } - }, - "stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "streamx": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", - "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", - "requires": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.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==", - "devOptional": 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==", - "devOptional": 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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "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 - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "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 - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "requires": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "dependencies": { - "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==", - "optional": true, - "requires": { - "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==", - "optional": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - } - } - }, - "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" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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-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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "devOptional": true - }, - "ts-deepmerge": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", - "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", - "dev": true - }, - "ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.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.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - }, - "uuidv4": { - "version": "6.2.13", - "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-6.2.13.tgz", - "integrity": "sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==", - "requires": { - "@types/uuid": "8.3.4", - "uuid": "8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "devOptional": true - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "devOptional": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.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" - } - }, - "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==", - "devOptional": 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==" - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "devOptional": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true - }, - "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==", - "devOptional": true + "node_modules/uuidv4": { + "resolved": "../../node_modules/.pnpm/uuidv4@6.2.13/node_modules/uuidv4", + "link": true } } } diff --git a/storage-resize-images/functions/package.json b/storage-resize-images/functions/package.json index d5efe5935..b2c72b2e7 100644 --- a/storage-resize-images/functions/package.json +++ b/storage-resize-images/functions/package.json @@ -14,17 +14,19 @@ "generate-readme": "firebase ext:info .. --markdown > ../README.md" }, "dependencies": { + "@google-cloud/storage": "^7.12.1", "@types/node": "^20.10.3", - "firebase-admin": "^12.1.0", - "firebase-functions": "^4.9.0", + "firebase-admin": "^12.3.0", + "firebase-functions": "^5.0.1", "mkdirp": "^1.0.4", "rimraf": "^2.6.3", - "sharp": "0.32.6", - "typescript": "^4.9.4", - "uuid": "^9.0.0", + "sharp": "0.33.4", + "typescript": "^5.5.4", + "uuid": "^10.0.0", "uuidv4": "^6.1.0" }, "devDependencies": { + "@types/jest": "29.5.0", "@types/mkdirp": "^1.0.1", "child_process": "^1.0.2", "dotenv": "^16.0.3", @@ -32,7 +34,6 @@ "firebase-functions-test": "3.2.0", "image-size": "^0.9.3", "image-type": "^4.1.0", - "@types/jest": "29.5.0", "jest": "29.5.0", "mocked-env": "^1.3.2", "ts-jest": "29.1.2" diff --git a/storage-resize-images/functions/src/util.ts b/storage-resize-images/functions/src/util.ts index c32dbbed2..d188dd87b 100644 --- a/storage-resize-images/functions/src/util.ts +++ b/storage-resize-images/functions/src/util.ts @@ -28,6 +28,16 @@ export function convertToObjectMetadata( ): ObjectMetadata { const { acl, ...rest } = fileMetadata; + // stringify all values of rest.metadata + + const convertedMetadata = Object.entries(rest.metadata).reduce( + (acc, [key, value]) => { + acc[key] = JSON.stringify(value); + return acc; + }, + {} as { [key: string]: string } + ); + const convertedAcl = acl?.map((aclEntry) => ({ kind: aclEntry.kind, @@ -70,7 +80,7 @@ export function convertToObjectMetadata( contentDisposition: rest.contentDisposition, contentLanguage: rest.contentLanguage, cacheControl: rest.cacheControl, - metadata: rest.metadata, + metadata: convertedMetadata, owner: rest.owner, crc32c: rest.crc32c, componentCount: rest.componentCount?.toString(),