velocious 1.0.471 → 1.0.473

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/build/environment-handlers/node/cli/commands/generate/base-models.js +4 -1
  3. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +6 -5
  4. package/build/environment-handlers/node/cli/commands/generate/generated-file-banner.js +15 -0
  5. package/build/frontend-model-controller.js +9 -5
  6. package/build/frontend-models/websocket-channel.js +24 -20
  7. package/build/routes/resolver.js +7 -5
  8. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  9. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -2
  10. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  11. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +6 -5
  12. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.d.ts +9 -0
  13. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.d.ts.map +1 -0
  14. package/build/src/environment-handlers/node/cli/commands/generate/generated-file-banner.js +13 -0
  15. package/build/src/frontend-model-controller.d.ts.map +1 -1
  16. package/build/src/frontend-model-controller.js +10 -6
  17. package/build/src/frontend-models/websocket-channel.d.ts +6 -0
  18. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  19. package/build/src/frontend-models/websocket-channel.js +23 -19
  20. package/build/src/routes/resolver.d.ts.map +1 -1
  21. package/build/src/routes/resolver.js +8 -6
  22. package/build/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +1 -1
  24. package/src/environment-handlers/node/cli/commands/generate/base-models.js +4 -1
  25. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +6 -5
  26. package/src/environment-handlers/node/cli/commands/generate/generated-file-banner.js +15 -0
  27. package/src/frontend-model-controller.js +9 -5
  28. package/src/frontend-models/websocket-channel.js +24 -20
  29. package/src/routes/resolver.js +7 -5
@@ -1,9 +1,11 @@
1
1
  import BaseCommand from "../../../../../cli/base-command.js";
2
2
  import fs from "fs/promises";
3
+ import generatedFileBanner from "./generated-file-banner.js";
3
4
  import path from "node:path";
4
5
  import * as inflection from "inflection";
5
6
  import { frontendModelResourceIsBuiltIn, frontendModelResourcesWithBuiltInsForBackendProject } from "../../../../../frontend-models/built-in-resources.js";
6
7
  import { frontendModelResourceClassFromDefinition, frontendModelResourceConfigurationFromDefinition } from "../../../../../frontend-models/resource-definition.js";
8
+ const FRONTEND_MODELS_REGENERATE_COMMAND = "velocious generate:frontend-models";
7
9
  /**
8
10
  * Attribute metadata used for generated frontend-model JSDoc.
9
11
  * @typedef {object} FrontendAttributeConfig
@@ -279,7 +281,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
279
281
  && builtInMemberCommands.find === "find"
280
282
  && builtInMemberCommands.update === "update"
281
283
  && builtInMemberCommands.url === "url";
282
- let fileContent = "";
284
+ let fileContent = generatedFileBanner(FRONTEND_MODELS_REGENERATE_COMMAND);
283
285
  fileContent += `import FrontendModelBase from "${importPath}"\n`;
284
286
  fileContent += "\n";
285
287
  fileContent += "/**\n";
@@ -555,7 +557,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
555
557
  * @returns {string} - Index file content that imports and re-exports all models.
556
558
  */
557
559
  buildIndexFileContent(generatedFiles) {
558
- let content = "";
560
+ let content = generatedFileBanner(FRONTEND_MODELS_REGENERATE_COMMAND);
559
561
  for (const { className, fileName } of generatedFiles) {
560
562
  content += `export {default as ${className}} from "./${fileName}"\n`;
561
563
  }
@@ -567,8 +569,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
567
569
  * @returns {string} - Setup file content with side-effect imports for model registration.
568
570
  */
569
571
  buildSetupFileContent(generatedFiles) {
570
- let content = "// This file is auto-generated by Velocious. Do not edit manually.\n";
571
- content += "// Run `velocious g:frontend-models` to regenerate.\n";
572
+ let content = generatedFileBanner(FRONTEND_MODELS_REGENERATE_COMMAND);
572
573
  for (const { fileName } of generatedFiles) {
573
574
  content += `import "./${fileName}"\n`;
574
575
  }
@@ -2232,4 +2233,4 @@ export default class DbGenerateFrontendModels extends BaseCommand {
2232
2233
  };
2233
2234
  }
2234
2235
  }
2235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsRUFBQyxNQUFNLHNEQUFzRCxDQUFBO0FBQ3hKLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBQyxNQUFNLHVEQUF1RCxDQUFBO0FBRWhLOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSDs7O0dBR0c7QUFDSDs7Ozs7R0FLRztBQUNIOzs7Ozs7R0FNRztBQUNIOzs7Ozs7O0dBT0c7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELDJEQUEyRDtJQUMzRCwwQkFBMEIsR0FBRyxJQUFJLENBQUE7SUFFakMsZ0VBQWdFO0lBQ2hFLDZCQUE2QixHQUFHLElBQUksQ0FBQTtJQUVwQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLE9BQU8sa0JBQWtCLENBQUMscUJBQXFCLEtB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Q0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUU7WUFDcEMsZ0JBQWdCO1lBQ2hCLGVBQWU7WUFDZixjQUFjLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVFLElBQUksRUFBRSxnQkFBZ0I7U0FDdkIsQ0FBQTtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUlzQnVpbHRJbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZnJvbnRlbmQtbW9kZWxzL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24sIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbn0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuLyoqXG4gKiBBdHRyaWJ1dGUgbWV0YWRhdGEgdXNlZCBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRBdHRyaWJ1dGVDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uVHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3FsVHlwZV0gLSBTUUwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YVR5cGVdIC0gRGF0YSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtqc0RvY1R5cGVdIC0gRXhhY3QgSlNEb2MgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBBdHRyaWJ1dGUgbmFtZSB3aGVuIGNvbmZpZ3VyZWQgYXMgYW4gYXJyYXkgZW50cnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtudWxsXSAtIFdoZXRoZXIgbnVsbCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gW2dldFR5cGVdIC0gUmV0dXJucyBjb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gW2dldE51bGxdIC0gUmV0dXJucyB3aGV0aGVyIG51bGwgaXMgYWxsb3dlZC5cbiAqL1xuLyoqXG4gKiBQZXJtaXQgc3BlYyByZXR1cm5lZCBieSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZHVyaW5nIGdlbmVyYXRpb24uXG4gKiBAdHlwZWRlZiB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWM+Pn0gRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWNcbiAqL1xuLyoqXG4gKiBKU0RvYyBpbXBvcnQgYWxpYXMgZXh0cmFjdGVkIGZyb20gYSBiYWNrZW5kIHJlc291cmNlIHNvdXJjZSBmaWxlLlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb3VyY2VKc0RvY0ltcG9ydEFsaWFzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW1wb3J0ZWROYW1lIC0gRXhwb3J0ZWQgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNwZWNpZmllciAtIEltcG9ydCBzcGVjaWZpZXIgZnJvbSB0aGUgc291cmNlIGZpbGUuXG4gKi9cbi8qKlxuICogSlNEb2MgcmV0dXJuIHR5cGUgZXh0cmFjdGVkIGZyb20gYSBiYWNrZW5kIHJlc291cmNlIG1ldGhvZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZVxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBSZXNvdXJjZUpzRG9jSW1wb3J0QWxpYXM+fSBpbXBvcnRBbGlhc2VzIC0gSW1wb3J0IGFsaWFzZXMgdmlzaWJsZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIEpTRG9jIHJldHVybiB0eXBlLlxuICovXG4vKipcbiAqIEpTRG9jIHBhcmFtZXRlciB0eXBlIGV4dHJhY3RlZCBmcm9tIGEgYmFja2VuZCByZXNvdXJjZSBtZXRob2QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVcbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgUmVzb3VyY2VKc0RvY0ltcG9ydEFsaWFzPn0gaW1wb3J0QWxpYXNlcyAtIEltcG9ydCBhbGlhc2VzIHZpc2libGUgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIEpTRG9jIHBhcmFtZXRlciB0eXBlLlxuICovXG5cbi8qKiBOb2RlIENMSSBjb21tYW5kIHRoYXQgZ2VuZXJhdGVzIGZyb250ZW5kIG1vZGVsIGNsYXNzZXMgZnJvbSBiYWNrZW5kIHByb2plY3QgcmVzb3VyY2UgY29uZmlnLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZUZyb250ZW5kTW9kZWxzIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZT4gfCBudWxsfSAqL1xuICBfcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IG51bGxcblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZVtdPiB8IG51bGx9ICovXG4gIF9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZmlsZXMgYXJlIGdlbmVyYXRlZC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplTW9kZWxzKClcblxuICAgIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcblxuICAgIGlmICh0eXBlb2YgZW52aXJvbm1lbnRIYW5kbGVyLmF1dG9EaXNjb3ZlclJlc291cmNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIuYXV0b0Rpc2NvdmVyUmVzb3VyY2VzKGNvbmZpZ3VyYXRpb24pXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGJhY2tlbmRQcm9qZWN0cykgfHwgYmFja2VuZFByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYmFja2VuZCBwcm9qZWN0cyBjb25maWd1cmVkLiBDb25maWd1cmUgJ2JhY2tlbmRQcm9qZWN0cycgaW4geW91ciBjb25maWd1cmF0aW9uIGZpcnN0XCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlZCBkaXJlY3Rvcmllcy5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZW5zdXJlZERpcmVjdG9yaWVzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVkIG1vZGVsIG5hbWVzIGJ5IGRpcmVjdG9yeS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlZCBmaWxlcyBieSBkaXJlY3RvcnkuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIEFycmF5PHtjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZ30+Pn0gKi9cbiAgICBjb25zdCBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5ID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNvIGVxdWl2YWxlbnQgc3BlbGxpbmdzIChhIHRyYWlsaW5nXG4gICAgICAvLyBzbGFzaCwgYC5gL2AuLmAgc2VnbWVudHMsIGR1cGxpY2F0ZSBzZXBhcmF0b3JzLCByZWxhdGl2ZSB2cyBhYnNvbHV0ZSlcbiAgICAgIC8vIHJlc29sdmUgdG8gYSBzaW5nbGUga2V5LiBPdGhlcndpc2UgdGhlIHBlci1kaXJlY3RvcnkgbWFwcyBiZWxvdyB0cmVhdFxuICAgICAgLy8gdGhlbSBhcyBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGR1cGxpY2F0ZSBjbGFzcyBuYW1lcyBzbGlwIHBhc3QgZGV0ZWN0aW9uLFxuICAgICAgLy8gYW5kIHRoZSBzcGxpdCBidWNrZXRzIHdyaXRlIGluY29tcGxldGUgaW5kZXguanMvc2V0dXAuanMgZm9yIGZpbGVzIHRoYXRcbiAgICAgIC8vIGFjdHVhbGx5IGxhbmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uIGRpc2suXG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsc0RpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpKVxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aEZvckZyb250ZW5kTW9kZWxzRGlyZWN0b3J5KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWVuc3VyZWREaXJlY3Rvcmllcy5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZyb250ZW5kTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgICAgZW5zdXJlZERpcmVjdG9yaWVzLmFkZChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5Lmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIFtdKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXMgPSBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkuZ2V0KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZEZpbGVzKSB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBmaWxlcyBsaXN0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGlmICghZ2VuZXJhdGVkTW9kZWxOYW1lcykgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgbW9kZWwgbmFtZXMgc2V0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyA9IHRoaXMuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3NOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCBtb2RlbENvbmZpZyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsQ2xhc3NOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke2Zyb250ZW5kTW9kZWxzRGlyfS8ke2ZpbGVOYW1lfWBcblxuICAgICAgICBpZiAoIW1vZGVsQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVzb3VyY2VDbGFzcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXSlcbiAgICAgICAgLy8gQW4gYWJzdHJhY3QgYmFzZSByZXNvdXJjZSAobm8gc3RhdGljIE1vZGVsQ2xhc3Mg4oCUIGUuZy4gYW4gYXBwJ3Mgc2hhcmVkXG4gICAgICAgIC8vIGBCYXNlUmVzb3VyY2VgIHRoYXQgb3RoZXIgcmVzb3VyY2VzIGV4dGVuZCkgY2FuJ3QgYmFjayBhIGdlbmVyYXRlZFxuICAgICAgICAvLyBmcm9udGVuZCBtb2RlbC4gVHJlYXQgaXQgYXMgcmVzb3VyY2UtbGVzcyBzbyB0aGUgZ2VuZXJhdG9yIGZhbGxzIGJhY2tcbiAgICAgICAgLy8gdG8gYnktbmFtZSBtb2RlbCBsb29rdXAgKyBlbXB0eSB3cml0ZSBwYXJhbXMgaW5zdGVhZCBvZiB0aHJvd2luZyB3aGVuXG4gICAgICAgIC8vIGl0IGVhZ2VybHkgY2FsbHMgYG1vZGVsQ2xhc3MoKWAgLyBgcGVybWl0dGVkUGFyYW1zKClgIG9uIGl0LlxuICAgICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzICYmIHJlc29sdmVkUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzID8gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzIDogbnVsbFxuXG4gICAgICAgIHRoaXMudmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgICAgIGlmIChnZW5lcmF0ZWRNb2RlbE5hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgaWYgKGZyb250ZW5kTW9kZWxSZXNvdXJjZUlzQnVpbHRJbih7bW9kZWxOYW1lOiBtb2RlbENsYXNzTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uOiByZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdfSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lcy5hZGQoY2xhc3NOYW1lKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdGhpcy5idWlsZE1vZGVsRmlsZUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIGltcG9ydFBhdGgsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2VDbGFzcyA/IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpIDogY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVtjbGFzc05hbWVdLFxuICAgICAgICAgIG1vZGVsQ29uZmlnLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGZpbGVDb250ZW50KVxuICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHtjbGFzc05hbWUsIGZpbGVOYW1lfSlcblxuICAgICAgICBjb25zb2xlLmxvZyhgY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvJHtmaWxlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zyb250ZW5kTW9kZWxzRGlyLCBnZW5lcmF0ZWRGaWxlc10gb2YgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSkge1xuICAgICAgY29uc3QgaW5kZXhDb250ZW50ID0gdGhpcy5idWlsZEluZGV4RmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vaW5kZXguanNgLCBpbmRleENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvaW5kZXguanNcIilcblxuICAgICAgY29uc3Qgc2V0dXBDb250ZW50ID0gdGhpcy5idWlsZFNldHVwRmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vc2V0dXAuanNgLCBzZXR1cENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvc2V0dXAuanNcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB2YWxpZGF0ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhcmdzLmF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzIC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzIGluIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsQ29uZmlnLmFiaWxpdGllc1xuXG4gICAgaWYgKCFhYmlsaXRpZXMgfHwgdHlwZW9mIGFiaWxpdGllcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkICdhYmlsaXRpZXMnIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZEFjdGlvbnMgPSBbXG4gICAgICB7YWN0aW9uOiBcImluZGV4XCIsIGFiaWxpdHlBY3Rpb246IGFiaWxpdGllcy5pbmRleH0sXG4gICAgICB7YWN0aW9uOiBcImZpbmRcIiwgYWJpbGl0eUFjdGlvbjogYWJpbGl0aWVzLmZpbmR9XG4gICAgXVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9uLCBhYmlsaXR5QWN0aW9ufSBvZiByZWFkQWN0aW9ucykge1xuICAgICAgaWYgKHR5cGVvZiBhYmlsaXR5QWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHlBY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgYWJpbGl0aWVzLiR7YWN0aW9ufSBjb25maWdgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2Ygbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmICghYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMuaGFzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfScgcmVmZXJlbmNlcyAnJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfScsIGJ1dCBubyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBleGlzdHMgZm9yIHRoYXQgdGFyZ2V0IGluIHRoaXMgYmFja2VuZCBwcm9qZWN0YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZXMgZm9yIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbj59IHJlc291cmNlcyAtIFJlc291cmNlIGNvbmZpZ3VyYXRpb24ga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcy5cbiAgICovXG4gIGF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzKHJlc291cmNlcykge1xuICAgIC8qKlxuICAgICAqIENsYXNzIG5hbWVzLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY2xhc3NOYW1lcy5hZGQoaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbHMgZGlyZWN0b3J5IGZvciBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7e2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aD86IHN0cmluZ319IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBYnNvbHV0ZSBmcm9udGVuZCBtb2RlbHMgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYmFja2VuZFByb2plY3QuZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoIHx8IHRoaXMuZGlyZWN0b3J5KClcblxuICAgIHJldHVybiBgJHtvdXRwdXRQYXRofS9zcmMvZnJvbnRlbmQtbW9kZWxzYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IHBhdGggZm9yIGZyb250ZW5kIG1vZGVscyBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9udGVuZE1vZGVsc0RpciAtIEZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqL1xuICBpbXBvcnRQYXRoRm9yRnJvbnRlbmRNb2RlbHNEaXJlY3RvcnkoZnJvbnRlbmRNb2RlbHNEaXIpIHtcbiAgICBjb25zdCBkZXZNb2RlID0gZnJvbnRlbmRNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvZnJvbnRlbmQtbW9kZWxzXCIpXG5cbiAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgcmV0dXJuIFwiLi4vLi4vLi4vLi4vc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIG1vZGVsIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBNZXRob2QgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW1wb3J0UGF0aCAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBHZW5lcmF0ZWQgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRNb2RlbEZpbGVDb250ZW50KHtjbGFzc05hbWUsIGZyb250ZW5kTW9kZWxGaWxlUGF0aCwgaW1wb3J0UGF0aCwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHRoaXMucmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzICYmIHR5cGVvZiBtb2RlbENvbmZpZy5hdHRhY2htZW50cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBtb2RlbENvbmZpZy5hdHRhY2htZW50c1xuICAgICAgOiB7fVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1BdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1DcmVhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1VcGRhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgY29uc3QgcGVybWl0dGVkQ3JlYXRlUGFyYW1zID0gdGhpcy5wZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsLCBcImNyZWF0ZVwiKVxuICAgIGNvbnN0IHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyA9IHRoaXMucGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbCwgXCJ1cGRhdGVcIilcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzID0gdGhpcy5uZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMuY29uY2F0KHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyksIHJlbGF0aW9uc2hpcHN9KVxuICAgIGNvbnN0IHVzZXNUcmFuc3BvcnRWYWx1ZSA9IGF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUuanNEb2NUeXBlLmluY2x1ZGVzKFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIpKVxuICAgICAgfHwgbmVzdGVkV3JpdGVUeXBlcy5zb21lKChuZXN0ZWRXcml0ZVR5cGUpID0+IG5lc3RlZFdyaXRlVHlwZS5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLnR5cGUuaW5jbHVkZXMoXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIikpKVxuICAgIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSB7XG4gICAgICBjcmVhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlIHx8IFwiY3JlYXRlXCIsXG4gICAgICBpbmRleDogbW9kZWxDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmRleCB8fCBcImluZGV4XCJcbiAgICB9XG4gICAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzID0ge1xuICAgICAgYXR0YWNoOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoIHx8IFwiYXR0YWNoXCIsXG4gICAgICBkZXN0cm95OiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSB8fCBcImRlc3Ryb3lcIixcbiAgICAgIGRvd25sb2FkOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgfHwgXCJkb3dubG9hZFwiLFxuICAgICAgZmluZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgfHwgXCJmaW5kXCIsXG4gICAgICB1cGRhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgfHwgXCJ1cGRhdGVcIixcbiAgICAgIHVybDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVybCB8fCBcInVybFwiXG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1vZGVsQ29uZmlnLmNvbGxlY3Rpb25Db21tYW5kc1xuICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbW9kZWxDb25maWcubWVtYmVyQ29tbWFuZHNcbiAgICBjb25zdCBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSA9IG1vZGVsQ29uZmlnLmNvbW1hbmRNZXRhZGF0YSB8fCB7fVxuICAgIGNvbnN0IGNvbW1hbmRNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY29tbWFuZE1ldGFkYXRhV2l0aFJlc291cmNlSnNEb2Moe1xuICAgICAgY29tbWFuZE1ldGFkYXRhOiBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSxcbiAgICAgIGNvbW1hbmROYW1lczogWy4uLk9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcyksIC4uLk9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKV0sXG4gICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGgsXG4gICAgICByZXNvdXJjZUNsYXNzXG4gICAgfSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzQXJlRGVmYXVsdCA9IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlID09PSBcImNyZWF0ZVwiICYmIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggPT09IFwiaW5kZXhcIlxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoID09PSBcImF0dGFjaFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSA9PT0gXCJkZXN0cm95XCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kb3dubG9hZCA9PT0gXCJkb3dubG9hZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZmluZCA9PT0gXCJmaW5kXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgPT09IFwidXBkYXRlXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgPT09IFwidXJsXCJcblxuICAgIGxldCBmaWxlQ29udGVudCA9IFwiXCJcblxuICAgIGZpbGVDb250ZW50ICs9IGBpbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2UgZnJvbSBcIiR7aW1wb3J0UGF0aH1cIlxcbmBcblxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZy5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKiBGYWxsYmFjayBhdHRyaWJ1dGUgdmFsdWUgdHlwZSBmb3IgZ2VuZXJhdGVkIGZpZWxkcyB3aXRob3V0IG5hcnJvd2VyIG1ldGFkYXRhLlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBpZiAodXNlc1RyYW5zcG9ydFZhbHVlKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqIFZhbHVlIHN1cHBvcnRlZCBieSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqICR7YXR0cmlidXRlc1R5cGVOYW1lfSB0eXBlLlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHthdHRyaWJ1dGVzVHlwZU5hbWV9XFxuYFxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YXR0cmlidXRlLmpzRG9jVHlwZX19ICR7YXR0cmlidXRlLm5hbWV9IC0gQXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZvciAoY29uc3QgbmVzdGVkV3JpdGVUeXBlIG9mIG5lc3RlZFdyaXRlVHlwZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIGZvciBuZXN0ZWQgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX0gd3JpdGVzLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX1cXG5gXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZEF0dHJpYnV0ZSBvZiBuZXN0ZWRXcml0ZVR5cGUuYXR0cmlidXRlcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHByb3BlcnR5IHske25lc3RlZEF0dHJpYnV0ZS50eXBlfX0gWyR7bmVzdGVkQXR0cmlidXRlLm5hbWV9XSAtIE5lc3RlZCAke25lc3RlZEF0dHJpYnV0ZS5uYW1lfSB2YWx1ZS5cXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IGF3YWl0IHRoaXMud3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZENyZWF0ZVBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWU6IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0pXG4gICAgZmlsZUNvbnRlbnQgKz0gYXdhaXQgdGhpcy53cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkVXBkYXRlUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZTogdXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lfSlcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIGZvciAke2NsYXNzTmFtZX0uXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlPCR7YXR0cmlidXRlc1R5cGVOYW1lfSwgJHtjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9LCAke3VwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0+fVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGNsYXNzICR7Y2xhc3NOYW1lfSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlIHtcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnfSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIG1vZGVsTmFtZTogJHtKU09OLnN0cmluZ2lmeShjbGFzc05hbWUpfSxcXG5gXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRDb21tYW5kc1Byb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogY29sbGVjdGlvbkNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogbWVtYmVyQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yUmVzb3VyY2Uoe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pXG5cbiAgICBpZiAocHJpbWFyeUtleSAhPT0gXCJpZFwiKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcHJpbWFyeUtleTogJHtKU09OLnN0cmluZ2lmeShwcmltYXJ5S2V5KX0sXFxuYFxuICAgIH1cbiAgICBjb25zdCBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcyA9IHRoaXMubmVzdGVkUmVsYXRpb25zaGlwTmFtZXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsKVxuICAgIGlmIChuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAgICR7cmVsYXRpb25zaGlwTmFtZX06IHt9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImJlbG9uZ3NUb1xcXCIgfCBcXFwiaGFzT25lXFxcIiB8IFxcXCJoYXNNYW55XFxcIiwgYXV0b2xvYWQ/OiBib29sZWFufT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2B0eXBlOiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC50eXBlKX1gXVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuYXV0b2xvYWQgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKFwiYXV0b2xvYWQ6IGZhbHNlXCIpXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9OiB7JHtwYXJ0cy5qb2luKFwiLCBcIil9fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgbmFtZXMuICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgY2FtZWxpemVkQXR0cmlidXRlID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSwgdHJ1ZSlcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZVVwcGVyID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSlcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV1gXG4gICAgICBjb25zdCBzZXR0ZXJBdHRyaWJ1dGVUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgfSlcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHske2F0dHJpYnV0ZVR5cGV9fSAtIEF0dHJpYnV0ZSB2YWx1ZS4gKi9cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAke2NhbWVsaXplZEF0dHJpYnV0ZX0oKSB7IHJldHVybiAvKiogQHR5cGUgeyR7YXR0cmlidXRlVHlwZX19ICovICh0aGlzLnJlYWRBdHRyaWJ1dGUoJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9KSkgfVxcbmBcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyQXR0cmlidXRlVHlwZX19IG5ld1ZhbHVlIC0gTmV3IGF0dHJpYnV0ZSB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiAvKiogQHR5cGUgeyR7c2V0dGVyQXR0cmlidXRlVHlwZX19ICovICh0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSkgfVxcbmBcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5jdXN0b21Db21tYW5kTWV0aG9kU2lnbmF0dXJlKHtjb21tYW5kTWV0YWRhdGEsIG1ldGhvZE5hbWV9KVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJ1bnMgJHttZXRob2ROYW1lfS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBzaWduYXR1cmUucGFyYW1Eb2NzXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3NpZ25hdHVyZS5yZXR1cm5UeXBlfT59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHN0YXRpYyBhc3luYyAke21ldGhvZE5hbWV9KCR7c2lnbmF0dXJlLnBhcmFtZXRlcnN9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICByZXR1cm4gLyoqIEB0eXBlIHske3NpZ25hdHVyZS5yZXR1cm5UeXBlfX0gKi8gKGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShjb2xsZWN0aW9uQ29tbWFuZHNbbWV0aG9kTmFtZV0pfSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZFR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cygke3NpZ25hdHVyZS5wYXlsb2FkQXJndW1lbnRzfSksXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICByZXNvdXJjZVBhdGg6IHRoaXMucmVzb3VyY2VQYXRoKClcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSkpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IHNpZ25hdHVyZS5wYXJhbURvY3NcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7c2lnbmF0dXJlLnJldHVyblR5cGV9Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHttZXRob2ROYW1lfSgke3NpZ25hdHVyZS5wYXJhbWV0ZXJzfSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIC8qKiBAdHlwZSB7JHtzaWduYXR1cmUucmV0dXJuVHlwZX19ICovIChhd2FpdCAke2NsYXNzTmFtZX0uZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kVHlwZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgbWVtYmVySWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKCksXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwYXlsb2FkOiAke2NsYXNzTmFtZX0ubm9ybWFsaXplQ3VzdG9tQ29tbWFuZFBheWxvYWRBcmd1bWVudHMoJHtzaWduYXR1cmUucGF5bG9hZEFyZ3VtZW50c30pLFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICByZXNvdXJjZVBhdGg6ICR7Y2xhc3NOYW1lfS5yZXNvdXJjZVBhdGgoKVxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH0pKVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW5zdGFuY2VUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfWBcbiAgICAgIGNvbnN0IHRhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfUNyZWF0ZUF0dHJpYnV0ZXNgXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAudHlwZSA9PSBcImhhc01hbnlcIikge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgbG9hZGVkICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge0FycmF5PCR7dGFyZ2V0SW5zdGFuY2VUeXBlfT59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9TG9hZGVkKCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWRlZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTwke3RhcmdldEluc3RhbmNlVHlwZX0+Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZCgpIH1cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGx9IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZGVkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBCdWlsZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9fSBbYXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9fSAtIEJ1aWx0IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KGF0dHJpYnV0ZXMgPSB7fSkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmJ1aWxkKGF0dHJpYnV0ZXMpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyBsb2FkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zIG9yIGxvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbD59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1PckxvYWQoKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkub3JMb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBTZXRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0obW9kZWwpIHsgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLnNldExvYWRlZChtb2RlbCkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IHske2NsYXNzTmFtZX19XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgJHtjbGFzc05hbWV9XFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBpbmRleCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT59IGdlbmVyYXRlZEZpbGVzIC0gR2VuZXJhdGVkIG1vZGVsIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEluZGV4IGZpbGUgY29udGVudCB0aGF0IGltcG9ydHMgYW5kIHJlLWV4cG9ydHMgYWxsIG1vZGVscy5cbiAgICovXG4gIGJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcykge1xuICAgIGxldCBjb250ZW50ID0gXCJcIlxuXG4gICAgZm9yIChjb25zdCB7Y2xhc3NOYW1lLCBmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCB7ZGVmYXVsdCBhcyAke2NsYXNzTmFtZX19IGZyb20gXCIuLyR7ZmlsZU5hbWV9XCJcXG5gXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHNldHVwIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2V0dXAgZmlsZSBjb250ZW50IHdpdGggc2lkZS1lZmZlY3QgaW1wb3J0cyBmb3IgbW9kZWwgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgYnVpbGRTZXR1cEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIi8vIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBieSBWZWxvY2lvdXMuIERvIG5vdCBlZGl0IG1hbnVhbGx5LlxcblwiXG5cbiAgICBjb250ZW50ICs9IFwiLy8gUnVuIGB2ZWxvY2lvdXMgZzpmcm9udGVuZC1tb2RlbHNgIHRvIHJlZ2VuZXJhdGUuXFxuXCJcblxuICAgIGZvciAoY29uc3Qge2ZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgaW1wb3J0IFwiLi8ke2ZpbGVOYW1lfVwiXFxuYFxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZSBhdHRyaWJ1dGVzIHR5cGVkZWYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nLCB3cml0ZUpzRG9jVHlwZTogc3RyaW5nfT59IGFyZ3MuYXR0cmlidXRlcyAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZXNUeXBlTmFtZSAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMgdHlwZWRlZiBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSBhcmdzLm5lc3RlZFdyaXRlVHlwZXMgLSBOZXN0ZWQgd3JpdGUgdHlwZWRlZnMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gUmVzb3VyY2UgcGVybWl0dGVkIHBhcmFtcyBzcGVjLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnR5cGVOYW1lIC0gVHlwZWRlZiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEdlbmVyYXRlZCB0eXBlZGVmIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIHdyaXRlQXR0cmlidXRlc1R5cGVkZWYoe2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgbW9kZWxDbGFzcywgbmVzdGVkV3JpdGVUeXBlcywgcGVybWl0dGVkUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZX0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVMaW5lcyA9IFtdXG5cbiAgICBsZXQgb3V0cHV0ID0gXCIvKipcXG5cIlxuXG4gICAgY29uc3QgYXR0cmlidXRlc0J5TmFtZSA9IG5ldyBNYXAoYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gW2F0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkgPSBuZXcgTWFwKG5lc3RlZFdyaXRlVHlwZXMubWFwKChuZXN0ZWRXcml0ZVR5cGUpID0+IFtgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX1BdHRyaWJ1dGVzYCwgbmVzdGVkV3JpdGVUeXBlXSkpXG4gICAgY29uc3QgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lOiBlbnRyeSwgYXR0cmlidXRlc0J5TmFtZSwgbW9kZWxDbGFzc30pXG5cbiAgICAgICAgaWYgKGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcy5oYXMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhd2FpdCB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZXNCeU5hbWUuZ2V0KGF0dHJpYnV0ZU5hbWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlc1R5cGVOYW1lLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVMaW5lcy5wdXNoKGAgKiBAcHJvcGVydHkgeyR7dHlwZX19IFske2F0dHJpYnV0ZU5hbWV9XSAtIFBlcm1pdHRlZCAke2F0dHJpYnV0ZU5hbWV9IHZhbHVlLlxcbmApXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5ICYmIHR5cGVvZiBlbnRyeSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGUgPSBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkuZ2V0KGtleSlcbiAgICAgICAgICBjb25zdCB0eXBlID0gbmVzdGVkV3JpdGVUeXBlID8gYEFycmF5PCR7bmVzdGVkV3JpdGVUeXBlLnR5cGVOYW1lfT5gIDogXCJBcnJheTxvYmplY3Q+XCJcblxuICAgICAgICAgIGF0dHJpYnV0ZUxpbmVzLnB1c2goYCAqIEBwcm9wZXJ0eSB7JHt0eXBlfX0gWyR7a2V5fV0gLSBQZXJtaXR0ZWQgbmVzdGVkICR7a2V5fSB2YWx1ZXMuXFxuYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCArPSBgICogQXR0cmlidXRlcyBhY2NlcHRlZCBieSAke3R5cGVOYW1lfS5cXG5gXG4gICAgaWYgKGF0dHJpYnV0ZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSAke3R5cGVOYW1lfVxcbmBcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke3R5cGVOYW1lfVxcbmBcbiAgICAgIG91dHB1dCArPSBhdHRyaWJ1dGVMaW5lcy5qb2luKFwiXCIpXG4gICAgfVxuICAgIG91dHB1dCArPSBcIiAqL1xcblwiXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlOiB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgd3JpdGVKc0RvY1R5cGU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgYXR0cmlidXRlc1R5cGVOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSlNEb2MgdHlwZSBmb3IgdGhlIHBlcm1pdHRlZCB3cml0ZSBmaWVsZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHthdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBzZXR0ZXJQYXJhbWV0ZXJUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pXG5cbiAgICBpZiAoc2V0dGVyUGFyYW1ldGVyVHlwZSkgcmV0dXJuIGAke3NldHRlclBhcmFtZXRlclR5cGV9IHwgbnVsbGBcblxuICAgIGlmICghYXR0cmlidXRlKSByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuXG4gICAgaWYgKGF0dHJpYnV0ZS5qc0RvY1R5cGUudHJpbSgpID09PSBcIm51bGxcIikgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcblxuICAgIGlmIChhdHRyaWJ1dGUud3JpdGVKc0RvY1R5cGUgIT09IGF0dHJpYnV0ZS5qc0RvY1R5cGUpIHJldHVybiBhdHRyaWJ1dGUud3JpdGVKc0RvY1R5cGVcblxuICAgIHJldHVybiBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgd3JpdGUgYXR0cmlidXRlIHNldHRlciBwYXJhbWV0ZXIgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZXNvdXJjZUNsYXNzOiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBTZXR0ZXIgdmFsdWUgcGFyYW1ldGVyIHR5cGUgd2hlbiBpdCBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpb24uXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3M/Lm5hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKX1BdHRyaWJ1dGVgXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBwYXJhbWV0ZXJJbmRleDogMSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogcmVzb3VyY2VDbGFzcy5uYW1lXG4gICAgfSlcblxuICAgIGlmICghcGFyYW1ldGVyVHlwZSkgcmV0dXJuIG51bGxcbiAgICBpZiAodGhpcy5pc0Jyb2FkR2VuZXJhdGVkVHlwZShwYXJhbWV0ZXJUeXBlKSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBicm9hZCBnZW5lcmF0ZWQgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIEpTRG9jIHR5cGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHR5cGUgaXMgdG9vIGJyb2FkIHRvIGltcHJvdmUgZ2VuZXJhdGVkIHdyaXRlIHR5cGluZy5cbiAgICovXG4gIGlzQnJvYWRHZW5lcmF0ZWRUeXBlKGpzRG9jVHlwZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0ganNEb2NUeXBlLnRyaW0oKVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlID09PSBcIj9cIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwiYW55XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcIm9iamVjdFwiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJ1bmtub3duXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcm1pdHRlZCB3cml0ZSBhdHRyaWJ1dGUgdG8gdGhlIGdlbmVyYXRlZCBmcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzQnlOYW1lOiBNYXA8c3RyaW5nLCB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIGF0dHJpYnV0ZSBuYW1lIHVzZWQgYnkgZ2VuZXJhdGVkIGFjY2Vzc29ycy5cbiAgICovXG4gIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzQnlOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmIChhdHRyaWJ1dGVzQnlOYW1lLmhhcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcblxuICAgIGlmIChtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGlmIChyZXNvbHZlZEF0dHJpYnV0ZU5hbWUgJiYgYXR0cmlidXRlc0J5TmFtZS5oYXMocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIHJlc29sdmVkQXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRBdHRyaWJ1dGVOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lLCB0cnVlKS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgbWF0Y2hpbmdBdHRyaWJ1dGVOYW1lID0gQXJyYXkuZnJvbShhdHRyaWJ1dGVzQnlOYW1lLmtleXMoKSkuZmluZCgoY2FuZGlkYXRlTmFtZSkgPT4gY2FuZGlkYXRlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkQXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChtYXRjaGluZ0F0dHJpYnV0ZU5hbWUpIHJldHVybiBtYXRjaGluZ0F0dHJpYnV0ZU5hbWVcblxuICAgIC8vIFdyaXRlLW9ubHkgdmlydHVhbCBwYXJhbXMgYXJlIHZhbGlkIHBlcm1pdHRlZCBwYXJhbXMgZXZlbiB3aGVuIHRoZXkgaGF2ZSBubyByZWFkIGF0dHJpYnV0ZS5cbiAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIHR5cGVzIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gQ29tYmluZWQgcGVybWl0dGVkIHBhcmFtcyBzcGVjcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gYXJncy5yZWxhdGlvbnNoaXBzIC0gR2VuZXJhdGVkIHJlbGF0aW9uc2hpcHMuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSAtIE5lc3RlZCB3cml0ZSB0eXBlZGVmcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlVHlwZXNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBwZXJtaXR0ZWRQYXJhbXMsIHJlbGF0aW9uc2hpcHN9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwc0J5TmFtZSA9IG5ldyBNYXAocmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gW3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lLCByZWxhdGlvbnNoaXBdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkgY29udGludWVcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGlmICgha2V5LmVuZHNXaXRoKFwiQXR0cmlidXRlc1wiKSkgY29udGludWVcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZSA9IGtleS5zbGljZSgwLCAtXCJBdHRyaWJ1dGVzXCIubGVuZ3RoKVxuICAgICAgICBjb25zdCBuZXN0ZWRTcGVjID0gZW50cnlba2V5XVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzQnlOYW1lLmdldChyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgICBsZXQgdGFyZ2V0TW9kZWxDbGFzc1xuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRhcmdldE1vZGVsQ2xhc3MgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5oYXMocmVsYXRpb25zaGlwTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgbmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5zZXQocmVsYXRpb25zaGlwTmFtZSwge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMubmVzdGVkV3JpdGVBdHRyaWJ1dGVzRm9yU3BlYyh7bmVzdGVkU3BlYywgdGFyZ2V0TW9kZWxDbGFzc30pLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgICAgdHlwZU5hbWU6IGAke2NsYXNzTmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwTmFtZSl9TmVzdGVkQXR0cmlidXRlc2BcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lLnZhbHVlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIGF0dHJpYnV0ZXMgZm9yIHNwZWMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIG9iamVjdD4+IHwgb2JqZWN0IHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5uZXN0ZWRTcGVjIC0gTmVzdGVkIHBlcm1pdCBzcGVjLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy50YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IGJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlQXR0cmlidXRlc0ZvclNwZWMoe25lc3RlZFNwZWMsIHRhcmdldE1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5lc3RlZFNwZWMpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBuZXN0ZWRTcGVjLmZpbHRlcigoZW50cnkpID0+IHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKS5tYXAoKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlTmFtZSA9IHRhcmdldE1vZGVsQ2xhc3M/LnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHx8IGF0dHJpYnV0ZU5hbWVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLFxuICAgICAgICB0eXBlOiBhdHRyaWJ1dGVDb25maWcgPyB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIDogXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJtaXR0ZWQgcGFyYW1zIGZvciBnZW5lcmF0b3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSByZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJjcmVhdGVcIiB8IFwidXBkYXRlXCJ9IGFjdGlvbiAtIFdyaXRlIGFjdGlvbi5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSAtIFBlcm1pdHRlZCBwYXJhbXMgc3BlYy5cbiAgICovXG4gIHBlcm1pdHRlZFBhcmFtc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzLCBhY3Rpb24pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyByZXNvdXJjZUNsYXNzKHtcbiAgICAgICAgYWJpbGl0eTogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgbG9jYWxzOiB7fSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgbW9kZWxOYW1lOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAqLyAoe2F0dHJpYnV0ZXM6IFtdfSlcbiAgICAgIH0pXG4gICAgICBjb25zdCBzcGVjID0gaW5zdGFuY2UucGVybWl0dGVkUGFyYW1zKHthY3Rpb24sIGFiaWxpdHk6IHVuZGVmaW5lZCwgbG9jYWxzOiB7fSwgcGFyYW1zOiB7fX0pXG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNwZWMpID8gc3BlYyA6IFtdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbCB3cml0ZSB0eXBlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZXMgYSBiYWNrZW5kIHJlc291cmNlJ3MgYHBlcm1pdHRlZFBhcmFtcygpYCBpbnN0YW5jZSBtZXRob2QgYXRcbiAgICogZ2VuZXJhdGlvbiB0aW1lIGFuZCBleHRyYWN0cyB0aGUgcmVsYXRpb25zaGlwIG5hbWVzIHRoYXQgYWNjZXB0XG4gICAqIG5lc3RlZCB3cml0ZXMgKGB7Zm9vQXR0cmlidXRlczogWy4uLl19YCBlbnRyaWVzKS4gVGhlIGdlbmVyYXRvclxuICAgKiBlbWl0cyB0aG9zZSBuYW1lcyBpbnRvIHRoZSBmcm9udGVuZCBtb2RlbCdzIGByZXNvdXJjZUNvbmZpZygpYCBzb1xuICAgKiB0aGUgY2xpZW50IGBzYXZlKClgIHdhbGtlciBrbm93cyB3aGljaCByZWxhdGlvbnNoaXBzIHRvIHNoaXAuXG4gICAqXG4gICAqIENvbnN0cnVjdGVkIHdpdGggbm8gY29udHJvbGxlci9hYmlsaXR5IHNvIHJlc291cmNlIG92ZXJyaWRlcyBtdXN0XG4gICAqIHN1cHBvcnQgYmVpbmcgY2FsbGVkIHdpdGhvdXQgYSByZXF1ZXN0IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSByZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBSZWxhdGlvbnNoaXAgbmFtZXMgdGhhdCBhY2NlcHQgbmVzdGVkIHdyaXRlcyAoZW1wdHkgd2hlbiBub25lKS5cbiAgICovXG4gIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MpIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBbXVxuXG4gICAgbGV0IHNwZWNcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gKi8gKHthdHRyaWJ1dGVzOiBbXX0pXG4gICAgICB9KVxuICAgICAgc3BlYyA9IGluc3RhbmNlLnBlcm1pdHRlZFBhcmFtcygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbHM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzcGVjKSkgcmV0dXJuIFtdXG5cbiAgICAvKipcbiAgICAgKiBSZWxhdGlvbnNoaXAgbmFtZXMuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc3BlYykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIGNvbnRpbnVlXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBpZiAoIWtleS5lbmRzV2l0aChcIkF0dHJpYnV0ZXNcIikpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IG5hbWUgPSBrZXkuc2xpY2UoMCwgLVwiQXR0cmlidXRlc1wiLmxlbmd0aClcbiAgICAgICAgaWYgKG5hbWUpIHJlbGF0aW9uc2hpcE5hbWVzLnB1c2gobmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwTmFtZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBhcnJheSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnZhbHVlcyAtIFN0cmluZyB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBhcnJheSBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZEFycmF5UHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgbGV0IG91dHB1dCA9IGAke2luZGVudH0ke3Byb3BlcnR5TmFtZX06IFtcXG5gXG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH1dLFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBjb21tYW5kcyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MudmFsdWVzIC0gQ29tbWFuZCBrZXktdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuIEFsd2F5cyBlbWl0c1xuICAgKiAgIHRoZSBjYW1lbENhc2UgbWV0aG9kLW5hbWUgYXJyYXkgZm9ybSAoYG1lbWJlckNvbW1hbmRzOiBbXCJ1cGRhdGVBY2Nlc3NcIl1gKVxuICAgKiAgIHNvIHRoZSBnZW5lcmF0ZWQgY29uZmlnIG1hdGNoZXMgdGhlIGNhbm9uaWNhbFxuICAgKiAgIGBGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWcue2NvbGxlY3Rpb24sbWVtYmVyfUNvbW1hbmRzOiBzdHJpbmdbXWBcbiAgICogICBzaGFwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUgY29tbWFuZCBzbHVnIGZyb20gdGhlIGNhbWVsQ2FzZVxuICAgKiAgIG1ldGhvZCBuYW1lOyBjb25zdW1lcnMgbmV2ZXIgbmVlZCB0byB3cml0ZSBvdXRcbiAgICogICBge3VwZGF0ZUFjY2VzczogXCJ1cGRhdGUtYWNjZXNzXCJ9YCBieSBoYW5kLlxuICAgKi9cbiAgZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzOiBPYmplY3Qua2V5cyh2YWx1ZXMpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBvYmplY3QgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIE9iamVjdCBrZXktdmFsdWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmZpbHRlckRlZmF1bHRWYWx1ZXNdIC0gRGVmYXVsdCB2YWx1ZXMgdG8gb21pdCBmcm9tIG91dHB1dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIG9iamVjdCBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtmaWx0ZXJEZWZhdWx0VmFsdWVzLCBpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiB7XFxuYFxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgaWYgKGZpbHRlckRlZmF1bHRWYWx1ZXMgJiYgZmlsdGVyRGVmYXVsdFZhbHVlc1tvYmplY3RLZXldID09PSB2YWx1ZXNbb2JqZWN0S2V5XSkgY29udGludWVcblxuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7b2JqZWN0S2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZXNbb2JqZWN0S2V5XSl9LFxcbmBcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gYCR7aW5kZW50fX0sXFxuYFxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHdyaXRlSnNEb2NUeXBlOiBzdHJpbmd9Pj59IC0gQXR0cmlidXRlIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBsZXQgYXR0cmlidXRlcyA9IG1vZGVsQ29uZmlnLmF0dHJpYnV0ZXNcblxuICAgIC8vIEF1dG8tZGVyaXZlIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCBjb2x1bW5zIHdoZW4gbm90IGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgIGlmICgoIWF0dHJpYnV0ZXMgfHwgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykgJiYgYXR0cmlidXRlcy5sZW5ndGggPT09IDApKSAmJiBtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGluZmxlY3Rpb24uY2FtZWxpemUoY29sdW1uLmdldE5hbWUoKSwgdHJ1ZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9uIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9ICovXG4gICAgICAgIGxldCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gbnVsbFxuICAgICAgICBsZXQgYXR0cmlidXRlTmFtZVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZURlZmluaXRpb25cbiAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uICYmIHR5cGVvZiBhdHRyaWJ1dGVEZWZpbml0aW9uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYXR0cmlidXRlRGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZURlZmluaXRpb24pXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9IFwic3RyaW5nXCIgfHwgYXR0cmlidXRlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgYXJyYXkgZW50cmllcyB0byBiZSBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBhIG5hbWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVEZWZpbml0aW9uKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckdlbmVyYXRlZEF0dHJpYnV0ZSh7XG4gICAgICAgICAgYXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgbW9kZWxDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF0dHJpYnV0ZURlZmluaXRpb25zLnB1c2goe1xuICAgICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnOiBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30pLFxuICAgICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgd3JpdGVKc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRXcml0ZUF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnOiBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVEZWZpbml0aW9uc1xuICAgIH1cblxuICAgIGlmICghYXR0cmlidXRlcyB8fCB0eXBlb2YgYXR0cmlidXRlcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnYXR0cmlidXRlcycgYXMgYXJyYXkgb3Igb2JqZWN0IGJ1dCBnb3Q6ICR7YXR0cmlidXRlc31gKVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IGF0dHJpYnV0ZUNvbmZpZyAmJiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZUNvbmZpZylcbiAgICAgICAgOiBudWxsXG4gICAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICB9KVxuICAgICAgY29uc3QgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHtcbiAgICAgICAgYXR0cmlidXRlQ29uZmlnOiBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBtb2RlbENsYXNzXG4gICAgICB9KVxuXG4gICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAganNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWc6IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnfSksXG4gICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIHdyaXRlSnNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlRGVmaW5pdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIGdlbmVyYXRlZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZUNvbmZpZzogRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAtIEF0dHJpYnV0ZSBjb25maWcgdXNlZCBmb3IgZ2VuZXJhdGVkIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZywgYXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVJc01vZGVsUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG4gICAgaWYgKHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNOdWxsYWJpbGl0eShhdHRyaWJ1dGVDb25maWcpKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG5cbiAgICByZXR1cm4gey4uLmF0dHJpYnV0ZUNvbmZpZywgbnVsbDogZmFsc2V9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHRoZSBtb2RlbCBwcmltYXJ5IGtleS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHR5cGVvZiBwcmltYXJ5S2V5ICE9IFwic3RyaW5nXCIgfHwgcHJpbWFyeUtleS5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gcHJpbWFyeUtleSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHByaW1hcnlLZXkpID09PSBhdHRyaWJ1dGVOYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHByaW1hcnkga2V5IGZyb20gZXhwbGljaXQgcmVzb3VyY2UgY29uZmlnIG9yIHRoZSBiYWNrZW5kIG1vZGVsLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBtb2RlbENvbmZpZzogaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn19IGFyZ3MgLSBQcmltYXJ5IGtleSByZXNvbHV0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+fSAtIEZyb250ZW5kLW1vZGVsIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlGb3JSZXNvdXJjZSh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSkge1xuICAgIGlmIChtb2RlbENvbmZpZy5wcmltYXJ5S2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZWRDb25maWd1cmVkUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZXMsIHByaW1hcnlLZXk6IG1vZGVsQ29uZmlnLnByaW1hcnlLZXl9KVxuICAgIH1cblxuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIFwiaWRcIlxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlGb3JNb2RlbENsYXNzKHthdHRyaWJ1dGVOYW1lcywgbW9kZWxDbGFzc30pXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCBmcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZXM6IEFycmF5PHN0cmluZz4sIHByaW1hcnlLZXk6IHN0cmluZ319IGFyZ3MgLSBDb25maWd1cmVkIHByaW1hcnkga2V5IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29uZmlndXJlZCBwcmltYXJ5IGtleS5cbiAgICovXG4gIHZhbGlkYXRlZENvbmZpZ3VyZWRQcmltYXJ5S2V5KHthdHRyaWJ1dGVOYW1lcywgcHJpbWFyeUtleX0pIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMocHJpbWFyeUtleSkpIHJldHVybiBwcmltYXJ5S2V5XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyZWQgZnJvbnRlbmQgbW9kZWwgcHJpbWFyeSBrZXkgXCIke3ByaW1hcnlLZXl9XCIgaXMgbm90IGEgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZS5gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYWNrZW5kIHByaW1hcnkga2V5IHRvIGdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBhdHRyaWJ1dGUgbmFtZXMuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gUHJpbWFyeSBrZXkgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yTW9kZWxDbGFzcyh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3N9KSB7XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG5cbiAgICBpZiAocHJpbWFyeUtleSA9PT0gXCJpZFwiKSByZXR1cm4gXCJpZFwiXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcmltYXJ5S2V5KSkge1xuICAgICAgcmV0dXJuIHByaW1hcnlLZXkubWFwKChjb2x1bW5OYW1lKSA9PiB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5QXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZXMsIGNvbHVtbk5hbWUsIG1vZGVsQ2xhc3N9KSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWVzLCBjb2x1bW5OYW1lOiBwcmltYXJ5S2V5LCBtb2RlbENsYXNzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgYmFja2VuZCBwcmltYXJ5IGtleSBjb2x1bW4gdG8gYSBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBjb2x1bW5OYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH19IGFyZ3MgLSBQcmltYXJ5IGtleSBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kLW1vZGVsIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lcywgY29sdW1uTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoY29sdW1uTmFtZSkpIHJldHVybiBjb2x1bW5OYW1lXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWUgJiYgYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsQ2xhc3MubmFtZX0ucHJpbWFyeUtleSgpIGNvbHVtbiBcIiR7Y29sdW1uTmFtZX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZS5gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZnJvbSBleHBsaWNpdCBtZXRhZGF0YSwgcmVzb3VyY2UgbWV0aG9kcywgbW9kZWwgY29sdW1ucywgdHJhbnNsYXRlZCBjb2x1bW5zLCBvciBtb2RlbCBhY2Nlc3NvciBKU0RvYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IGFyZ3MuY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyAtIFJlc291cmNlLXByb3ZpZGVkIGF0dHJpYnV0ZSBjb25maWcuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnPn0gLSBSZXNvbHZlZCBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7YXR0cmlidXRlTmFtZSwgY2xhc3NOYW1lLCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGluZmVycmVkUmVzb3VyY2VDb25maWcgPSBhd2FpdCB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yUmVzb3VyY2VBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkQ29sdW1uQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JUcmFuc2xhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZE1vZGVsQWNjZXNzb3JDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnIHx8IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IGF3YWl0IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEFjY2Vzc29yKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZENvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWcgfHwgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnIHx8IGluZmVycmVkTW9kZWxBY2Nlc3NvckNvbmZpZ1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgJiYgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc1R5cGUoY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBpbmZlcnJlZENvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnXG4gICAgfVxuXG4gICAgaWYgKGluZmVycmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBpbmZlcnJlZENvbmZpZ1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGluZmVyIEpTRG9jIHR5cGUgZm9yIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSAnJHtjbGFzc05hbWV9IyR7YXR0cmlidXRlTmFtZX0nLiBBZGQgYSBiYWNrZW5kIG1vZGVsIGNvbHVtbiwgdHJhbnNsYXRpb24gdGFibGUgY29sdW1uLCBleHBsaWNpdCByZXNvdXJjZSBtZXRhZGF0YSwgb3IgYSBAcmV0dXJucyBKU0RvYyB0eXBlIG9uICR7cmVzb3VyY2VDbGFzcz8ubmFtZSB8fCBcInRoZSByZXNvdXJjZVwifS4ke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlKCkuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgaGFzIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgYSB0eXBlIHNvdXJjZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKSA9PSBcInN0cmluZ1wiXG4gICAgICB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnPy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBoYXMgbnVsbGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgbnVsbGFiaWxpdHkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc051bGxhYmlsaXR5KGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cmlidXRlQ29uZmlnLCBcIm51bGxcIikpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLmF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTRG9jIHR5cGUuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSkge1xuICAgIGlmIChhdHRyaWJ1dGVDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIiAmJiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlXG4gICAgfVxuXG4gICAgY29uc3QganNEb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2pzRG9jVHlwZX0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIHdyaXRlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLmF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTRG9jIHR5cGUgYWNjZXB0ZWQgYnkgY3JlYXRlL3VwZGF0ZSBwYXlsb2Fkcy5cbiAgICovXG4gIGpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIHtcbiAgICBpZiAoYXR0cmlidXRlQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlID09IFwic3RyaW5nXCIgJiYgYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZVxuICAgIH1cblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRXcml0ZUF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2pzRG9jVHlwZX0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIHdyaXRlIGF0dHJpYnV0ZSBiYXNlIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBOb24tbnVsbGFibGUgSlNEb2MgdHlwZSBhY2NlcHRlZCBieSBjcmVhdGUvdXBkYXRlIHBheWxvYWRzLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRXcml0ZUF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGNvbnN0IHJlYWRUeXBlID0gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZVR5cGVJc1RlbXBvcmFsKGF0dHJpYnV0ZUNvbmZpZykpIHJldHVybiByZWFkVHlwZVxuXG4gICAgcmV0dXJuIGAke3JlYWRUeXBlfSB8IHN0cmluZ2BcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCBhdHRyaWJ1dGUgYmFzZSB0eXBlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9uLW51bGxhYmxlIEpTRG9jIHR5cGUuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgaWYgKHR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIlxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImpzb25cIiB8fCB0eXBlID09IFwianNvbmJcIikge1xuICAgICAgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiYmxvYlwiLCBcImNoYXJcIiwgXCJudmFyY2hhclwiLCBcInZhcmNoYXJcIiwgXCJ0ZXh0XCIsIFwibG9uZ3RleHRcIiwgXCJtZWRpdW10ZXh0XCIsIFwidGlueXRleHRcIiwgXCJ1dWlkXCIsIFwiY2hhcmFjdGVyIHZhcnlpbmdcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIFtcImJpdFwiLCBcImJpZ2ludFwiLCBcImRlY2ltYWxcIiwgXCJkb3VibGVcIiwgXCJkb3VibGUgcHJlY2lzaW9uXCIsIFwiZmxvYXRcIiwgXCJpbnRcIiwgXCJpbnRlZ2VyXCIsIFwibnVtZXJpY1wiLCBcInJlYWxcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIm51bWJlclwiXG4gICAgfSBlbHNlIGlmICh0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZUlzVGVtcG9yYWwoYXR0cmlidXRlQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZVwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIHR5cGUgaXMgdGVtcG9yYWwuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIHJlcHJlc2VudHMgYSBkYXRlL3RpbWUgdmFsdWUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZVR5cGVJc1RlbXBvcmFsKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgcmV0dXJuIHR5cGUgPyBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJ0aW1lc3RhbXBcIiwgXCJ0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVcIiwgXCJ0aW1lc3RhbXB0elwiXS5pbmNsdWRlcyh0eXBlKSA6IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY2FuIGJlIG51bGwuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGFsbG93cyBudWxsIHZhbHVlcy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ2FuQmVOdWxsKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldE51bGwgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLmdldE51bGwoKSA9PT0gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcubnVsbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIHR5cGUgdmFsdWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gTm9ybWFsaXplZCBjb2x1bW4gdHlwZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0VHlwZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoYXR0cmlidXRlQ29uZmlnLmdldFR5cGUoKSlcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlVmFsdWUgPSBhdHRyaWJ1dGVDb25maWcudHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuY29sdW1uVHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuc3FsVHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuZGF0YVR5cGVcblxuICAgIGlmICh0eXBlb2YgdHlwZVZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0eXBlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIHJlc291cmNlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGw+fSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSByZXNvdXJjZSBtZXRob2QgSlNEb2MuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclJlc291cmNlQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgJHthdHRyaWJ1dGVOYW1lfUF0dHJpYnV0ZWBcbiAgICBjb25zdCBvd25lckNsYXNzTmFtZSA9IHRoaXMubWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWUsIHRhcmdldENsYXNzOiByZXNvdXJjZUNsYXNzfSlcblxuICAgIGlmICghb3duZXJDbGFzc05hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7XG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgc291cmNlQ2xhc3NOYW1lOiBvd25lckNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICByZXR1cm4ganNEb2NUeXBlID8ge2pzRG9jVHlwZTogdGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGV9KX0gOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciB0cmFuc2xhdGVkIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbH0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gdHJhbnNsYXRlZCBhdHRyaWJ1dGUgY29sdW1ucy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yVHJhbnNsYXRlZEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlSXNUcmFuc2xhdGVkKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBUcmFuc2xhdGlvbkNsYXNzID0gbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBsZXQgY29sdW1uXG5cbiAgICB0cnkge1xuICAgICAgY29sdW1uID0gVHJhbnNsYXRpb25DbGFzcy5nZXRDb2x1bW5zSGFzaCgpW2NvbHVtbk5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGlzIHRyYW5zbGF0ZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGZyb250ZW5kIGF0dHJpYnV0ZSBpcyB0cmFuc2xhdGVkLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVJc1RyYW5zbGF0ZWQoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKHJlc291cmNlQ2xhc3MpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZWRBdHRyaWJ1dGVzID0gcmVzb3VyY2VDbGFzcy50cmFuc2xhdGVkQXR0cmlidXRlc1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmFuc2xhdGVkQXR0cmlidXRlcykgJiYgdHJhbnNsYXRlZEF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFuc2xhdGlvbnMgJiYgdHlwZW9mIHRyYW5zbGF0aW9ucyA9PSBcIm9iamVjdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0cmFuc2xhdGlvbnMsIGF0dHJpYnV0ZU5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgbW9kZWwgYWNjZXNzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGw+fSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSBtb2RlbCBhY2Nlc3NvciBKU0RvYy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBY2Nlc3Nvcih7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBvd25lckNsYXNzTmFtZSA9IHRoaXMubWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWU6IGF0dHJpYnV0ZU5hbWUsIHRhcmdldENsYXNzOiBtb2RlbENsYXNzfSlcblxuICAgIGlmICghb3duZXJDbGFzc05hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7XG4gICAgICBtZXRob2ROYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgc291cmNlQ2xhc3NOYW1lOiBvd25lckNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICAvLyBGcm9udGVuZCBhdHRyaWJ1dGVzIGhvbGQgdGhlIHNlcmlhbGl6ZWQgKHJlc29sdmVkKSB2YWx1ZSwgc28gYW4gYXN5bmNcbiAgICAvLyBiYWNrZW5kIGFjY2Vzc29yIHR5cGVkIGBQcm9taXNlPG51bWJlcj5gIG11c3Qgc3VyZmFjZSBhcyBgbnVtYmVyYCDigJQgdGhlXG4gICAgLy8gc2FtZSB1bndyYXBwaW5nIHRoZSByZXNvdXJjZS1tZXRob2QgaW5mZXJlbmNlIHBhdGggYXBwbGllcy5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgICA/IHtqc0RvY1R5cGU6IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlQXR0cmlidXRlSnNEb2NUeXBlKHRoaXMudW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSkpfVxuICAgICAgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQSBiYWNrZW5kIGFjY2Vzc29yJ3MgYEByZXR1cm5zYCBjYW4gcmVmZXJlbmNlIHR5cGVzIHRoYXQgZXhpc3Qgb25seSBvbiB0aGVcbiAgICogYmFja2VuZCAoZS5nLiBhIG1vZGVsLWxvY2FsIGBAdHlwZWRlZiBBZ2VudFJ1blBsYW5uaW5nQXJ0aWZhY3RgKS4gVGhlIGZyb250ZW5kXG4gICAqIG1vZGVsIGNhbid0IHJlc29sdmUgdGhvc2UsIHNvIGZhbGwgYmFjayB0byBgYW55YCByYXRoZXIgdGhhbiBlbWl0dGluZyBhblxuICAgKiB1bmRlZmluZWQgdHlwZSBuYW1lLiBUeXBlcyBidWlsdCBvbmx5IGZyb20gcHJpbWl0aXZlcyBhbmQga25vd24gZ2VuZXJpY1xuICAgKiBidWlsdGlucyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUeXBlIC0gUmVzb2x2ZWQgKFByb21pc2UtdW53cmFwcGVkKSBhdHRyaWJ1dGUgdHlwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBIGZyb250ZW5kLXJlc29sdmFibGUgYXR0cmlidXRlIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVBdHRyaWJ1dGVKc0RvY1R5cGUoanNEb2NUeXBlKSB7XG4gICAgY29uc3Qgc2FmZVR5cGVJZGVudGlmaWVycyA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKClcbiAgICBjb25zdCByZWZlcmVuY2VkSWRlbnRpZmllcnMgPSBqc0RvY1R5cGUubWF0Y2goL1tBLVpdW0EtWmEtejAtOV8kXSovZykgfHwgW11cblxuICAgIGlmIChyZWZlcmVuY2VkSWRlbnRpZmllcnMuc29tZSgoaWRlbnRpZmllcikgPT4gIXNhZmVUeXBlSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSkge1xuICAgICAgcmV0dXJuIFwiYW55XCJcbiAgICB9XG5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gIH1cblxuICAvKipcbiAgICogQ2FwaXRhbGl6ZWQgaWRlbnRpZmllcnMgYSBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgY2FuIHJlc29sdmUgb24gaXRzIG93blxuICAgKiAocHJpbWl0aXZlcyBhcmUgbG93ZXItY2FzZSBhbmQgbWF0Y2hlZCBzZXBhcmF0ZWx5KSwgc28gb25seSBmcmFtZXdvcmstb3duZWRcbiAgICogYW5kIGJ1aWx0aW4gZ2VuZXJpYyB0eXBlcyBhcmUgbGlzdGVkLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gRnJvbnRlbmQtcmVzb2x2YWJsZSB0eXBlIGlkZW50aWZpZXJzLlxuICAgKi9cbiAgZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgIFwiQXJyYXlcIiwgXCJEYXRlXCIsIFwiRXhjbHVkZVwiLCBcIkV4dHJhY3RcIiwgXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIiwgXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIixcbiAgICAgIFwiTWFwXCIsIFwiTm9uTnVsbGFibGVcIiwgXCJPbWl0XCIsIFwiUGFydGlhbFwiLCBcIlBpY2tcIiwgXCJQcm9taXNlXCIsIFwiUmVhZG9ubHlcIiwgXCJSZWFkb25seUFycmF5XCIsIFwiUmVjb3JkXCIsXG4gICAgICBcIlJlcXVpcmVkXCIsIFwiUmV0dXJuVHlwZVwiLCBcIlNldFwiXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyBhIGN1c3RvbS1jb21tYW5kIHBhcmFtL3JldHVybiBKU0RvYyB0eXBlIHNvIGl0IHJlc29sdmVzIGluIHRoZSBnZW5lcmF0ZWRcbiAgICogZnJvbnRlbmQgbW9kZWw6IGJhY2tlbmQgbW9kZWwgaW1wb3J0cyBhcmUgbWFwcGVkIHRvIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbFxuICAgKiBpbXBvcnRzLCBhbmQgb3RoZXJ3aXNlIG5vbi1mcm9udGVuZC1yZXNvbHZhYmxlIGlkZW50aWZpZXJzIGJlY29tZSBgYW55YCBpbiBwbGFjZVxuICAgKiBzbyBzaWJsaW5nIHNjYWxhciBmaWVsZHMga2VlcCB0aGVpciByZWFsIHR5cGVzLiBUaGUgd29yZCBib3VuZGFyeSBhdm9pZHMgbWF0Y2hpbmdcbiAgICogdGhlIGNhcGl0YWxpemVkIG1pZGRsZSBvZiBhIGNhbWVsQ2FzZSBwcm9wZXJ0eSBuYW1lIChlLmcuIGBhZGp1c3RlZFRvdGFsQ2VudHNgKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gYXJncy5mcm9udGVuZE1vZGVsRmlsZVBhdGggLSBHZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJlc291cmNlSnNEb2NJbXBvcnRBbGlhcz59IGFyZ3MuaW1wb3J0QWxpYXNlcyAtIEltcG9ydCBhbGlhc2VzIHZpc2libGUgdG8gdGhlIHNvdXJjZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpzRG9jVHlwZSAtIFJlc29sdmVkIChQcm9taXNlLXVud3JhcHBlZCkgSlNEb2MgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBhcmdzLnNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQSBmcm9udGVuZC1yZXNvbHZhYmxlIEpTRG9jIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVDb21tYW5kSnNEb2NUeXBlKHtmcm9udGVuZE1vZGVsRmlsZVBhdGgsIGltcG9ydEFsaWFzZXMsIGpzRG9jVHlwZSwgc291cmNlRmlsZX0pIHtcbiAgICBjb25zdCBzYWZlVHlwZUlkZW50aWZpZXJzID0gdGhpcy5mcm9udGVuZFJlc29sdmFibGVUeXBlSWRlbnRpZmllcnMoKVxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgcHJlc2VydmVkSW1wb3J0cyA9IFtdXG4gICAgLyoqXG4gICAgICogU3RvcmVzIGFuIGltcG9ydCBleHByZXNzaW9uIGJlaGluZCBhIGxvd2VyY2FzZSBwbGFjZWhvbGRlciB3aGlsZSBnZW5lcmljXG4gICAgICogaWRlbnRpZmllciBjbGVhbnVwIHJ1bnMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydEV4cHJlc3Npb24gLSBJbXBvcnQgZXhwcmVzc2lvbiB0byBwcmVzZXJ2ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBQbGFjZWhvbGRlciBpbnNlcnRlZCBpbnRvIHRoZSB0eXBlIHN0cmluZy5cbiAgICAgKi9cbiAgICBjb25zdCBwcmVzZXJ2ZUltcG9ydEV4cHJlc3Npb24gPSAoaW1wb3J0RXhwcmVzc2lvbikgPT4ge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBgX192ZWxvY2lvdXNfaW1wb3J0X3BsYWNlaG9sZGVyXyR7cHJlc2VydmVkSW1wb3J0cy5sZW5ndGh9X19gXG5cbiAgICAgIHByZXNlcnZlZEltcG9ydHMucHVzaChpbXBvcnRFeHByZXNzaW9uKVxuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydE5vQmFja2VuZExvY2FsQ29tbWFuZFR5cGVFeHByZXNzaW9ucyhqc0RvY1R5cGUpXG5cbiAgICBjb25zdCB3aXRoUmV3cml0dGVuSW5saW5lSW1wb3J0cyA9IGpzRG9jVHlwZVxuICAgICAgLy8gQSB0eXBlIHRoYXQgcmVhY2hlcyBpbnRvIGEgYmFja2VuZCBzb3VyY2UgZmlsZSB2aWEgYGltcG9ydChcIi4uLlwiKWBcbiAgICAgIC8vIChvcHRpb25hbGx5IGAuTWVtYmVyYCBhbmQgYFtdYCkgaXMgZnJvbnRlbmQtcmVzb2x2YWJsZSBvbmx5IHdoZW4gaXRcbiAgICAgIC8vIHBvaW50cyBhdCBhIGdlbmVyYXRlZCBtb2RlbCBmaWxlOyBvdGhlciBiYWNrZW5kLWxvY2FsIGltcG9ydHMgY29sbGFwc2VcbiAgICAgIC8vIHRvIGBhbnlgIHNvIGhlbHBlci9zZXJ2aWNlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZG8gbm90IGxlYWsuXG4gICAgICAucmVwbGFjZSgvaW1wb3J0XFwoXFxzKltcIiddKFteXCInXSopW1wiJ11cXHMqXFwpKCg/OlxccypcXC5cXHMqW0EtWmEtel8kXVtcXHckXSopKikoKD86XFxzKlxcW1xccypcXF0pKikvZywgKF9tYXRjaCwgc3BlY2lmaWVyLCBtZW1iZXJDaGFpbiwgYXJyYXlTdWZmaXgpID0+IHtcbiAgICAgICAgY29uc3QgcmV3cml0dGVuU3BlY2lmaWVyID0gdGhpcy5mcm9udGVuZFJlc29sdmFibGVKc0RvY0ltcG9ydFNwZWNpZmllcih7XG4gICAgICAgICAgZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgc3BlY2lmaWVyXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFyZXdyaXR0ZW5TcGVjaWZpZXIpIHJldHVybiBcImFueVwiXG5cbiAgICAgICAgcmV0dXJuIHByZXNlcnZlSW1wb3J0RXhwcmVzc2lvbihgaW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkocmV3cml0dGVuU3BlY2lmaWVyKX0pJHttZW1iZXJDaGFpbi5yZXBsYWNlKC9cXHMrL2csIFwiXCIpfSR7YXJyYXlTdWZmaXgucmVwbGFjZSgvXFxzKy9nLCBcIlwiKX1gKVxuICAgICAgfSlcblxuICAgIGxldCB3aXRoUmV3cml0dGVuQWxpYXNlcyA9IHdpdGhSZXdyaXR0ZW5JbmxpbmVJbXBvcnRzXG5cbiAgICBmb3IgKGNvbnN0IFthbGlhc05hbWUsIGltcG9ydEFsaWFzXSBvZiBpbXBvcnRBbGlhc2VzKSB7XG4gICAgICBjb25zdCByZXdyaXR0ZW5TcGVjaWZpZXIgPSB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUpzRG9jSW1wb3J0U3BlY2lmaWVyKHtcbiAgICAgICAgZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICBzcGVjaWZpZXI6IGltcG9ydEFsaWFzLnNwZWNpZmllclxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXdyaXR0ZW5TcGVjaWZpZXIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGFsaWFzUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7dGhpcy5lc2NhcGVSZWdFeHAoYWxpYXNOYW1lKX1cXFxcYmAsIFwiZ1wiKVxuXG4gICAgICB3aXRoUmV3cml0dGVuQWxpYXNlcyA9IHdpdGhSZXdyaXR0ZW5BbGlhc2VzLnJlcGxhY2UoYWxpYXNSZWdleCwgcHJlc2VydmVJbXBvcnRFeHByZXNzaW9uKGBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShyZXdyaXR0ZW5TcGVjaWZpZXIpfSkuJHtpbXBvcnRBbGlhcy5pbXBvcnRlZE5hbWV9YCkpXG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gd2l0aFJld3JpdHRlbkFsaWFzZXNcbiAgICAgIC8vIFJlbWFpbmluZyBjYXBpdGFsaXplZCBpZGVudGlmaWVycyBhcmUgbW9kZWwgY2xhc3NlcyBvciBvdGhlcndpc2Ugbm9uLXJlc29sdmFibGVcbiAgICAgIC8vIHR5cGVzOyBkb3duZ3JhZGUgZWFjaCBpbiBwbGFjZSBzbyBzaWJsaW5nIHNjYWxhciBmaWVsZHMga2VlcCB0aGVpciByZWFsIHR5cGVzLlxuICAgICAgLnJlcGxhY2UoL1xcYltBLVpdW0EtWmEtejAtOV8kXSovZywgKGlkZW50aWZpZXIpID0+IHNhZmVUeXBlSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpID8gaWRlbnRpZmllciA6IFwiYW55XCIpXG5cbiAgICByZXR1cm4gcHJlc2VydmVkSW1wb3J0cy5yZWR1Y2UoXG4gICAgICAodHlwZSwgaW1wb3J0RXhwcmVzc2lvbiwgaW5kZXgpID0+IHR5cGUucmVwbGFjZUFsbChgX192ZWxvY2lvdXNfaW1wb3J0X3BsYWNlaG9sZGVyXyR7aW5kZXh9X19gLCBpbXBvcnRFeHByZXNzaW9uKSxcbiAgICAgIHNhbml0aXplZFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSYWlzZXMgd2hlbiBhIGNvbW1hbmQgSlNEb2MgdHlwZSByZWZlcmVuY2VzIGEgYmFja2VuZC1sb2NhbCBoZWxwZXIgZXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIENvbW1hbmQgSlNEb2MgdHlwZS5cbiAgICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFzc2VydE5vQmFja2VuZExvY2FsQ29tbWFuZFR5cGVFeHByZXNzaW9ucyhqc0RvY1R5cGUpIHtcbiAgICBjb25zdCBsb2NhbFJldHVyblR5cGVNYXRjaCA9IGpzRG9jVHlwZS5tYXRjaCgvXFxiKD86QXdhaXRlZFxccyo8XFxzKik/UmV0dXJuVHlwZVxccyo8XFxzKnR5cGVvZlxccytbQS1aYS16XyRdW1xcdyRdKlxccyo+XFxzKj4/LylcblxuICAgIGlmICghbG9jYWxSZXR1cm5UeXBlTWF0Y2gpIHJldHVyblxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDdXN0b20gY29tbWFuZCBKU0RvYyB0eXBlIGNhbm5vdCB1c2UgYmFja2VuZC1sb2NhbCBSZXR1cm5UeXBlIGV4cHJlc3Npb25zIGluIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbHM6ICR7bG9jYWxSZXR1cm5UeXBlTWF0Y2hbMF19LiBNb3ZlIHRoZSBwYXlsb2FkIHNoYXBlIHRvIGEgc2hhcmVkIHR5cGVkZWYgYW5kIHJldHVybiB0aGF0IHR5cGUgZnJvbSB0aGUgY29tbWFuZCBtZXRob2QuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIHJlc29sdmFibGUganMgZG9jIGltcG9ydCBzcGVjaWZpZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBhcmdzLnNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBKU0RvYyB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zcGVjaWZpZXIgLSBTb3VyY2UtZmlsZSBpbXBvcnQgc3BlY2lmaWVyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBSZXdyaXR0ZW4gZnJvbnRlbmQtbW9kZWwgaW1wb3J0IHNwZWNpZmllciwgb3IgbnVsbCB3aGVuIGJhY2tlbmQtbG9jYWwuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVKc0RvY0ltcG9ydFNwZWNpZmllcih7ZnJvbnRlbmRNb2RlbEZpbGVQYXRoLCBzb3VyY2VGaWxlLCBzcGVjaWZpZXJ9KSB7XG4gICAgaWYgKCFzb3VyY2VGaWxlIHx8ICFmcm9udGVuZE1vZGVsRmlsZVBhdGgpIHJldHVybiBudWxsXG4gICAgaWYgKCFzcGVjaWZpZXIuc3RhcnRzV2l0aChcIi5cIikgJiYgIXNwZWNpZmllci5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIHNwZWNpZmllclxuXG4gICAgY29uc3QgaW1wb3J0ZWRQYXRoID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShzb3VyY2VGaWxlKSwgc3BlY2lmaWVyKVxuICAgIGNvbnN0IG1vZGVsSW1wb3J0U3BlY2lmaWVyID0gdGhpcy5mcm9udGVuZE1vZGVsSW1wb3J0U3BlY2lmaWVyRm9yQmFja2VuZE1vZGVsUGF0aCh7XG4gICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGgsXG4gICAgICBpbXBvcnRlZFBhdGhcbiAgICB9KVxuXG4gICAgaWYgKG1vZGVsSW1wb3J0U3BlY2lmaWVyKSByZXR1cm4gbW9kZWxJbXBvcnRTcGVjaWZpZXJcblxuICAgIGlmICh0aGlzLmZpbGVQYXRoSXNXaXRoaW5BbnlEaXJlY3Rvcnkoe2RpcmVjdG9yaWVzOiB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZURpcmVjdG9yaWVzKCksIGZpbGVQYXRoOiBpbXBvcnRlZFBhdGh9KSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZUltcG9ydFNwZWNpZmllcih7ZnJvbUZpbGU6IGZyb250ZW5kTW9kZWxGaWxlUGF0aCwgdG9GaWxlOiBpbXBvcnRlZFBhdGh9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgaW1wb3J0IHNwZWNpZmllciBmb3IgYmFja2VuZCBtb2RlbCBwYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW1wb3J0ZWRQYXRoIC0gU291cmNlLWZpbGUgaW1wb3J0IHBhdGggcmVzb2x2ZWQgZnJvbSBKU0RvYy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gR2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIGltcG9ydCBzcGVjaWZpZXIsIG9yIG51bGwgd2hlbiB0aGUgcGF0aCBpcyBub3QgYSByZWdpc3RlcmVkIG1vZGVsIGZpbGUuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsSW1wb3J0U3BlY2lmaWVyRm9yQmFja2VuZE1vZGVsUGF0aCh7ZnJvbnRlbmRNb2RlbEZpbGVQYXRoLCBpbXBvcnRlZFBhdGh9KSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUoZnJvbnRlbmRNb2RlbEZpbGVQYXRoKVxuICAgIGNvbnN0IGltcG9ydGVkTW9kZWxQYXRoID0gaW1wb3J0ZWRQYXRoLmVuZHNXaXRoKFwiLmpzXCIpID8gaW1wb3J0ZWRQYXRoIDogYCR7aW1wb3J0ZWRQYXRofS5qc2BcblxuICAgIGZvciAoY29uc3QgbW9kZWxGaWxlTmFtZSBvZiB0aGlzLmdlbmVyYXRlZEZyb250ZW5kTW9kZWxGaWxlTmFtZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBzb3VyY2VEaXJlY3Rvcnkgb2YgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsc0RpcmVjdG9yeSA9IHBhdGguam9pbihzb3VyY2VEaXJlY3RvcnksIFwibW9kZWxzXCIpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZU1vZGVsUGF0aCA9IHBhdGguam9pbihtb2RlbHNEaXJlY3RvcnksIG1vZGVsRmlsZU5hbWUpXG5cbiAgICAgICAgaWYgKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVNb2RlbFBhdGgpICE9PSBwYXRoLnJlc29sdmUoaW1wb3J0ZWRNb2RlbFBhdGgpKSBjb250aW51ZVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0aXZlSW1wb3J0U3BlY2lmaWVyKHtcbiAgICAgICAgICBmcm9tRmlsZTogZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgICAgIHRvRmlsZTogcGF0aC5qb2luKGZyb250ZW5kTW9kZWxzRGlyZWN0b3J5LCBtb2RlbEZpbGVOYW1lKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgZmlsZSBuYW1lcy5cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIEZyb250ZW5kIG1vZGVsIGZpbGVuYW1lcyB0aGF0IHRoaXMgZ2VuZXJhdGlvbiBydW4gY2FuIGVtaXQuXG4gICAqL1xuICBnZW5lcmF0ZWRGcm9udGVuZE1vZGVsRmlsZU5hbWVzKCkge1xuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZmlsZU5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEJhY2tlbmRQcm9qZWN0cygpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgZmlsZU5hbWVzLmFkZChgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZU5hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxhdGl2ZSBpbXBvcnQgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZnJvbUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0IGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRvRmlsZSAtIEZpbGUgYmVpbmcgaW1wb3J0ZWQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVsYXRpdmUgaW1wb3J0IHNwZWNpZmllci5cbiAgICovXG4gIHJlbGF0aXZlSW1wb3J0U3BlY2lmaWVyKHtmcm9tRmlsZSwgdG9GaWxlfSkge1xuICAgIGxldCByZWxhdGl2ZVNwZWNpZmllciA9IHBhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKGZyb21GaWxlKSwgdG9GaWxlKS5zcGxpdChwYXRoLnNlcCkuam9pbihcIi9cIilcblxuICAgIGlmICghcmVsYXRpdmVTcGVjaWZpZXIuc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgIHJlbGF0aXZlU3BlY2lmaWVyID0gYC4vJHtyZWxhdGl2ZVNwZWNpZmllcn1gXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aXZlU3BlY2lmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaWxlIHBhdGggaXMgd2l0aGluIGFueSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmRpcmVjdG9yaWVzIC0gQ2FuZGlkYXRlIHBhcmVudCBkaXJlY3Rvcmllcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZVBhdGggLSBGaWxlIHBhdGggdG8gdGVzdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZmlsZSBwYXRoIGlzIHVuZGVyIG9uZSBjYW5kaWRhdGUgZGlyZWN0b3J5LlxuICAgKi9cbiAgZmlsZVBhdGhJc1dpdGhpbkFueURpcmVjdG9yeSh7ZGlyZWN0b3JpZXMsIGZpbGVQYXRofSkge1xuICAgIHJldHVybiBkaXJlY3Rvcmllcy5zb21lKChkaXJlY3RvcnkpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGRpcmVjdG9yeSksIHBhdGgucmVzb2x2ZShmaWxlUGF0aCkpXG5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggPT09IFwiXCIgfHwgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi4uXCIpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIFJlZ0V4cC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlZ0V4cC1zYWZlIHZhbHVlLlxuICAgKi9cbiAgZXNjYXBlUmVnRXhwKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgSlNEb2MgcGFyYW0gYmxvY2ssIHBhcmFtZXRlciBsaXN0LCBwYXlsb2FkLWFyZ3VtZW50IGV4cHJlc3Npb24sIGFuZFxuICAgKiByZXR1cm4gdHlwZSBmb3IgYSBjdXN0b20gY29tbWFuZCBtZXRob2QuIFdpdGggZGVjbGFyZWQgYGFyZ3NgIGVhY2ggYmVjb21lcyBhXG4gICAqIG5hbWVkLCB0eXBlZCBwYXJhbWV0ZXIgbWFwcGVkIHBvc2l0aW9uYWxseSBpbnRvIHRoZSBjb21tYW5kIHBheWxvYWQ7IHdpdGhvdXRcbiAgICogdGhlbSB0aGUgbWV0aG9kIHN0YXlzIHZhcmlhZGljLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn0gYXJncy5jb21tYW5kTWV0YWRhdGEgLSBQZXItY29tbWFuZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIENvbW1hbmQgbWV0aG9kIG5hbWUuXG4gICAqIEByZXR1cm5zIHt7cGFyYW1Eb2NzOiBzdHJpbmcsIHBhcmFtZXRlcnM6IHN0cmluZywgcGF5bG9hZEFyZ3VtZW50czogc3RyaW5nLCByZXR1cm5UeXBlOiBzdHJpbmd9fSAtIEdlbmVyYXRpb24gcGllY2VzLlxuICAgKi9cbiAgY3VzdG9tQ29tbWFuZE1ldGhvZFNpZ25hdHVyZSh7Y29tbWFuZE1ldGFkYXRhLCBtZXRob2ROYW1lfSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gY29tbWFuZE1ldGFkYXRhW21ldGhvZE5hbWVdIHx8IHthcmdzOiBbXSwgcmV0dXJuVHlwZTogbnVsbH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0YWRhdGEucmV0dXJuVHlwZSB8fCBcIlJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZT5cIlxuXG4gICAgaWYgKG1ldGFkYXRhLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyTmFtZXMgPSBtZXRhZGF0YS5hcmdzLm1hcCgoYXJnKSA9PiBhcmcubmFtZSlcbiAgICAgIC8vIEEgc2luZ2xlIGFyZ3Mgb2JqZWN0IHdob3NlIGV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIGFjY2VwdHMgYHt9YCwgc28gZGVmYXVsdFxuICAgICAgLy8gdGhlIHBhcmFtZXRlciBhbmQgbWFyayBpdCBvcHRpb25hbCDigJQgY2FsbGVycyBjYW4gdGhlbiBvbWl0IGl0IGVudGlyZWx5XG4gICAgICAvLyAoYHJlY29yZC5jb21tYW5kKClgIGluc3RlYWQgb2YgYHJlY29yZC5jb21tYW5kKHt9KWApLiBSZXF1aXJlZC1maWVsZCBhcmdzIGtlZXBcbiAgICAgIC8vIHRoZSBtYW5kYXRvcnkgcGFyYW1ldGVyIChhIGB7fWAgZGVmYXVsdCB3b3VsZG4ndCBzYXRpc2Z5IHRoZWlyIHR5cGUpLlxuICAgICAgY29uc3QgZGVmYXVsdHNUb0VtcHR5T2JqZWN0ID0gbWV0YWRhdGEuYXJncy5sZW5ndGggPT09IDEgJiYgdGhpcy5hcmdUeXBlQWNjZXB0c0VtcHR5T2JqZWN0KG1ldGFkYXRhLmFyZ3NbMF0udHlwZSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyYW1Eb2NzOiBtZXRhZGF0YS5hcmdzLm1hcCgoYXJnKSA9PiBgICAgKiBAcGFyYW0geyR7YXJnLnR5cGV9fSAke2RlZmF1bHRzVG9FbXB0eU9iamVjdCA/IGBbJHthcmcubmFtZX1dYCA6IGFyZy5uYW1lfSAtIENvbW1hbmQgYXJndW1lbnQuXFxuYCkuam9pbihcIlwiKSxcbiAgICAgICAgcGFyYW1ldGVyczogZGVmYXVsdHNUb0VtcHR5T2JqZWN0ID8gYCR7cGFyYW1ldGVyTmFtZXNbMF19ID0ge31gIDogcGFyYW1ldGVyTmFtZXMuam9pbihcIiwgXCIpLFxuICAgICAgICBwYXlsb2FkQXJndW1lbnRzOiBgWyR7cGFyYW1ldGVyTmFtZXMuam9pbihcIiwgXCIpfV1gLFxuICAgICAgICByZXR1cm5UeXBlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtRG9jczogXCIgICAqIEBwYXJhbSB7Li4uRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlfSBjb21tYW5kQXJndW1lbnRzIC0gQ3VzdG9tIGNvbW1hbmQgYXJndW1lbnRzLlxcblwiLFxuICAgICAgcGFyYW1ldGVyczogXCIuLi5jb21tYW5kQXJndW1lbnRzXCIsXG4gICAgICBwYXlsb2FkQXJndW1lbnRzOiBcImNvbW1hbmRBcmd1bWVudHNcIixcbiAgICAgIHJldHVyblR5cGVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHNpbmdsZSBjb21tYW5kLWFyZ3MgSlNEb2MgdHlwZSBpcyBrbm93biB0byBhY2NlcHQgYW4gZW1wdHkgb2JqZWN0IGB7fWA6XG4gICAqIGEgc2luZ2xlIGJhbGFuY2VkIG9iamVjdCBsaXRlcmFsIHdob3NlIHRvcC1sZXZlbCBtZW1iZXJzIGFyZSBhbGwgb3B0aW9uYWwgKGBuYW1lPzpgKVxuICAgKiBvciBpbmRleCBzaWduYXR1cmVzIChgW2s6IC4uLl06YCkuIEFueXRoaW5nIGVsc2UgcmV0dXJucyBmYWxzZSBzbyB0aGUgcGFyYW1ldGVyIHN0YXlzXG4gICAqIHJlcXVpcmVkIOKAlCBpbmNsdWRpbmcgYSByZXF1aXJlZCBtZW1iZXIsIGEgbm9uLW9iamVjdC1saXRlcmFsIChhIHBvc2l0aW9uYWwgYG51bWJlcmAsXG4gICAqIGEgYFJlY29yZDwuLi4+YCAvIGBQYXJ0aWFsPC4uLj5gIHdob3NlIGtleS93cmFwcGVyIG1heSBzdGlsbCByZXF1aXJlIGRhdGEpLCBhbmQgYW55XG4gICAqIGludGVyc2VjdGlvbi91bmlvbiAoZS5nLiBge2E/OiB4fSAmIHtiOiBzdHJpbmd9YCksIHdoZXJlIGB7fWAgaXMgbm90IGFzc2lnbmFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGFyZydzIEpTRG9jIHR5cGUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgcGFyYW1ldGVyIGNhbiBkZWZhdWx0IHRvIGB7fWAuXG4gICAqL1xuICBhcmdUeXBlQWNjZXB0c0VtcHR5T2JqZWN0KHR5cGUpIHtcbiAgICBjb25zdCB0cmltbWVkVHlwZSA9IHR5cGUudHJpbSgpXG5cbiAgICAvLyBNdXN0IGJlIGEgc2luZ2xlIGJhbGFuY2VkIG9iamVjdCBsaXRlcmFsOiBzdGFydHMgd2l0aCBge2AsIGVuZHMgd2l0aCBgfWAsIGFuZCB0aGVcbiAgICAvLyBvcGVuaW5nIGJyYWNlIGNsb3NlcyBvbmx5IGF0IHRoZSBmaW5hbCBjaGFyYWN0ZXIuIFRoaXMgcmVqZWN0cyBpbnRlcnNlY3Rpb25zL3VuaW9uc1xuICAgIC8vIGxpa2UgYHthPzogeH0gJiB7Yjogc3RyaW5nfWAgdGhhdCBtZXJlbHkgaGFwcGVuIHRvIHN0YXJ0IGB7YCBhbmQgZW5kIGB9YC5cbiAgICBpZiAoISh0cmltbWVkVHlwZS5zdGFydHNXaXRoKFwie1wiKSAmJiB0cmltbWVkVHlwZS5lbmRzV2l0aChcIn1cIikpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIXRoaXMuaXNTaW5nbGVCYWxhbmNlZE9iamVjdExpdGVyYWwodHJpbW1lZFR5cGUpKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGlubmVyID0gdHJpbW1lZFR5cGUuc2xpY2UoMSwgLTEpXG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLnNwbGl0VG9wTGV2ZWxUeXBlTWVtYmVycyhpbm5lcikpIHtcbiAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0aGlzLnRvcExldmVsQ29sb25JbmRleChtZW1iZXIpXG5cbiAgICAgIC8vIE5vIHRvcC1sZXZlbCBjb2xvbjogYSBjYWxsL2NvbnN0cnVjdC9tYXBwZWQgc2lnbmF0dXJlIG9yIG1hbGZvcm1lZCBtZW1iZXIg4oCUXG4gICAgICAvLyBjYW4ndCBjb25maXJtIGl0J3Mgb3B0aW9uYWwsIHNvIHRyZWF0IHRoZSB0eXBlIGFzIG5vdCBlbXB0eS1kZWZhdWx0YWJsZS5cbiAgICAgIGlmIChjb2xvbkluZGV4IDwgMCkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IGtleSA9IG1lbWJlci5zbGljZSgwLCBjb2xvbkluZGV4KS50cmltKClcblxuICAgICAgLy8gSW5kZXggc2lnbmF0dXJlcyAoYFtrOiBzdHJpbmddYCkgZG9uJ3QgcmVxdWlyZSBhIHZhbHVlOyBvcHRpb25hbCBwcm9wcyBlbmQgaW4gYD9gLlxuICAgICAgLy8gQW55dGhpbmcgZWxzZSBpcyBhIHJlcXVpcmVkIHByb3BlcnR5LCBzbyBge31gIHdvdWxkIG5vdCBzYXRpc2Z5IHRoZSB0eXBlLlxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChcIltcIikgJiYgIWtleS5lbmRzV2l0aChcIj9cIikpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBpbm5lciBib2R5IG9mIGFuIG9iamVjdC1saXRlcmFsIHR5cGUgaW50byBpdHMgdG9wLWxldmVsIG1lbWJlcnMsXG4gICAqIHJlc3BlY3RpbmcgbmVzdGVkIGB7fWAgLyBgW11gIC8gYDw+YCAvIGAoKWAgc28gZmllbGQgdHlwZXMgbGlrZSBgc3RyaW5nW10gfCBudWxsYFxuICAgKiBvciBge2E6IGJ9YCBhcmVuJ3Qgc3BsaXQgbWlkLXR5cGUuIE1lbWJlcnMgYXJlIHNlcGFyYXRlZCBieSBgLGAgb3IgYDtgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5uZXIgLSBPYmplY3QtbGl0ZXJhbCBib2R5ICh3aXRob3V0IHRoZSBvdXRlciBicmFjZXMpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVHJpbW1lZCBub24tZW1wdHkgdG9wLWxldmVsIG1lbWJlcnMuXG4gICAqL1xuICBzcGxpdFRvcExldmVsVHlwZU1lbWJlcnMoaW5uZXIpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gW11cbiAgICBsZXQgZGVwdGggPSAwXG4gICAgbGV0IHN0YXJ0ID0gMFxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlubmVyLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gaW5uZXJbaW5kZXhdXG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IFwie1wiIHx8IGNoYXJhY3RlciA9PT0gXCJbXCIgfHwgY2hhcmFjdGVyID09PSBcIjxcIiB8fCBjaGFyYWN0ZXIgPT09IFwiKFwiKSB7XG4gICAgICAgIGRlcHRoICs9IDFcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBcIn1cIiB8fCBjaGFyYWN0ZXIgPT09IFwiXVwiIHx8IGNoYXJhY3RlciA9PT0gXCI+XCIgfHwgY2hhcmFjdGVyID09PSBcIilcIikge1xuICAgICAgICBkZXB0aCAtPSAxXG4gICAgICB9IGVsc2UgaWYgKChjaGFyYWN0ZXIgPT09IFwiLFwiIHx8IGNoYXJhY3RlciA9PT0gXCI7XCIpICYmIGRlcHRoID09PSAwKSB7XG4gICAgICAgIG1lbWJlcnMucHVzaChpbm5lci5zbGljZShzdGFydCwgaW5kZXgpKVxuICAgICAgICBzdGFydCA9IGluZGV4ICsgMVxuICAgICAgfVxuICAgIH1cblxuICAgIG1lbWJlcnMucHVzaChpbm5lci5zbGljZShzdGFydCkpXG5cbiAgICByZXR1cm4gbWVtYmVycy5tYXAoKG1lbWJlcikgPT4gbWVtYmVyLnRyaW0oKSkuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5sZW5ndGggPiAwKVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGV4IG9mIHRoZSBmaXJzdCB0b3AtbGV2ZWwgYDpgIGluIGFuIG9iamVjdC1saXRlcmFsIG1lbWJlciwgaWdub3JpbmcgY29sb25zXG4gICAqIG5lc3RlZCBpbnNpZGUgYHt9YCAvIGBbXWAgLyBgPD5gIC8gYCgpYCAoZS5nLiBhbiBpbmRleCBzaWduYXR1cmUgYFtrOiBzdHJpbmddYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZW1iZXIgLSBBIHNpbmdsZSBvYmplY3QtbGl0ZXJhbCBtZW1iZXIuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIGNvbG9uIGluZGV4LCBvciAtMSB3aGVuIG5vbmUgaXMgZm91bmQgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICovXG4gIHRvcExldmVsQ29sb25JbmRleChtZW1iZXIpIHtcbiAgICBsZXQgZGVwdGggPSAwXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVtYmVyLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gbWVtYmVyW2luZGV4XVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIntcIiB8fCBjaGFyYWN0ZXIgPT09IFwiW1wiIHx8IGNoYXJhY3RlciA9PT0gXCI8XCIgfHwgY2hhcmFjdGVyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gXCJ9XCIgfHwgY2hhcmFjdGVyID09PSBcIl1cIiB8fCBjaGFyYWN0ZXIgPT09IFwiPlwiIHx8IGNoYXJhY3RlciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IFwiOlwiICYmIGRlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpbmRleFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSBzaW5nbGUgYmFsYW5jZWQgb2JqZWN0IGxpdGVyYWwg4oCUIGl0cyBsZWFkaW5nIGB7YCBjbG9zZXMgb25seVxuICAgKiBhdCB0aGUgZmluYWwgY2hhcmFjdGVyLiBSZWplY3RzIHRvcC1sZXZlbCBpbnRlcnNlY3Rpb25zL3VuaW9ucyBsaWtlIGB7YT86IHh9ICYge2I6IHl9YFxuICAgKiBvciBge2E/OiB4fSB8IHN0cmluZ2Agd2hvc2UgYnJhY2UgZGVwdGggcmV0dXJucyB0byAwIGJlZm9yZSB0aGUgZW5kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEEgdHJpbW1lZCB0eXBlIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGB7YCBhbmQgZW5kcyB3aXRoIGB9YC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYnJhY2VzIHdyYXAgdGhlIHdob2xlIHR5cGUuXG4gICAqL1xuICBpc1NpbmdsZUJhbGFuY2VkT2JqZWN0TGl0ZXJhbCh0eXBlKSB7XG4gICAgbGV0IGRlcHRoID0gMFxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR5cGUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyYWN0ZXIgPSB0eXBlW2luZGV4XVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIntcIiB8fCBjaGFyYWN0ZXIgPT09IFwiW1wiIHx8IGNoYXJhY3RlciA9PT0gXCI8XCIgfHwgY2hhcmFjdGVyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gXCJ9XCIgfHwgY2hhcmFjdGVyID09PSBcIl1cIiB8fCBjaGFyYWN0ZXIgPT09IFwiPlwiIHx8IGNoYXJhY3RlciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMVxuXG4gICAgICAgIC8vIFRoZSBvcGVuaW5nIGJyYWNlIGJhbGFuY2VkIGJlZm9yZSB0aGUgZW5kLCBzbyBzb21ldGhpbmcgZm9sbG93cyB0aGUgbGl0ZXJhbC5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwICYmIGluZGV4IDwgdHlwZS5sZW5ndGggLSAxKSByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwdGggPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnJpY2hlcyBjdXN0b20tY29tbWFuZCBtZXRhZGF0YSBieSBkZXJpdmluZyBhIGNvbW1hbmQncyB0eXBlZCBhcmdzIGFuZCByZXR1cm5cbiAgICogdHlwZSBmcm9tIHRoZSBiYWNrZW5kIHJlc291cmNlIG1ldGhvZCdzIGBAcGFyYW1gL2BAcmV0dXJuc2AgSlNEb2Mgd2hlbiB0aGV5IGFyZVxuICAgKiBub3QgYWxyZWFkeSBkZWNsYXJlZCBpbiBgcmVzb3VyY2VDb25maWdgLiBQcmVjZWRlbmNlOiBleHBsaWNpdCBgcmVzb3VyY2VDb25maWdgXG4gICAqIGB7YXJncywgcmV0dXJuVHlwZX1gIHdpbnMsIHRoZW4gdGhlIGRlcml2ZWQgYmFja2VuZC1tZXRob2QgSlNEb2MsIHRoZW4gdGhlIGdlbmVyaWNcbiAgICogZGVmYXVsdC4gTW9kZWwtY2xhc3MgaWRlbnRpZmllcnMgaW4gdGhlIGRlcml2ZWQgdHlwZXMgYXJlIGRvd25ncmFkZWQgdG8gYGFueWBcbiAgICogYmVjYXVzZSB0aGUgZnJvbnRlbmQgcmVjZWl2ZXMgYSBzZXJpYWxpemVkIHJlY29yZCwgbm90IGEgbW9kZWwgaW5zdGFuY2UsIHdoaWNoIHRoZVxuICAgKiBjb25zdW1lciBoeWRyYXRlcyB3aXRoIGBNb2RlbC5pbnN0YW50aWF0ZUZyb21SZXNwb25zZSguLi4pYC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59IGFyZ3MuY29tbWFuZE1ldGFkYXRhIC0gRGVjbGFyZWQgcGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MuY29tbWFuZE5hbWVzIC0gQ29tbWFuZCBtZXRob2QgbmFtZXMgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pj59IC0gRW5yaWNoZWQgbWV0YWRhdGEuXG4gICAqL1xuICBhc3luYyBjb21tYW5kTWV0YWRhdGFXaXRoUmVzb3VyY2VKc0RvYyh7Y29tbWFuZE1ldGFkYXRhLCBjb21tYW5kTmFtZXMsIGZyb250ZW5kTW9kZWxGaWxlUGF0aCwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBjb21tYW5kTWV0YWRhdGFcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59ICovXG4gICAgY29uc3QgZW5yaWNoZWQgPSB7Li4uY29tbWFuZE1ldGFkYXRhfVxuXG4gICAgZm9yIChjb25zdCBjb21tYW5kTmFtZSBvZiBjb21tYW5kTmFtZXMpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmVkID0gY29tbWFuZE1ldGFkYXRhW2NvbW1hbmROYW1lXSB8fCB7YXJnczogW10sIHJldHVyblR5cGU6IG51bGx9XG4gICAgICBjb25zdCBzb3VyY2VDbGFzc05hbWUgPSB0aGlzLm1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lOiBjb21tYW5kTmFtZSwgdGFyZ2V0Q2xhc3M6IHJlc291cmNlQ2xhc3N9KVxuXG4gICAgICBpZiAoIXNvdXJjZUNsYXNzTmFtZSkge1xuICAgICAgICBlbnJpY2hlZFtjb21tYW5kTmFtZV0gPSBkZWNsYXJlZFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCByZXR1cm5UeXBlID0gZGVjbGFyZWQucmV0dXJuVHlwZVxuXG4gICAgICBpZiAoIXJldHVyblR5cGUpIHtcbiAgICAgICAgY29uc3QganNEb2NSZXR1cm5UeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVEZWZpbml0aW9uKHttZXRob2ROYW1lOiBjb21tYW5kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSlcblxuICAgICAgICBpZiAoanNEb2NSZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZSA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlQ29tbWFuZEpzRG9jVHlwZSh7XG4gICAgICAgICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGgsXG4gICAgICAgICAgICBpbXBvcnRBbGlhc2VzOiBqc0RvY1JldHVyblR5cGUuaW1wb3J0QWxpYXNlcyxcbiAgICAgICAgICAgIGpzRG9jVHlwZTogdGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGU6IGpzRG9jUmV0dXJuVHlwZS50eXBlfSksXG4gICAgICAgICAgICBzb3VyY2VGaWxlOiBqc0RvY1JldHVyblR5cGUuc291cmNlRmlsZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFyZ3MgPSBkZWNsYXJlZC5hcmdzXG5cbiAgICAgIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCBqc0RvY1BhcmFtZXRlcnMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVycyh7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG4gICAgICAgIC8vIFNraXAgb2JqZWN0LXByb3BlcnR5IHRhZ3MgKGBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlYCk7IG9ubHkgdGhlXG4gICAgICAgIC8vIHRvcC1sZXZlbCBwYXJhbWV0ZXJzIG1hcCB0byBtZXRob2QgYXJndW1lbnRzLCBvdGhlcndpc2UgdGhlIHNoYXJlZFxuICAgICAgICAvLyBgQHBhcmFtIHtvYmplY3R9IGFyZ3NgICsgcHJvcGVydHkgc3R5bGUgd291bGQgZW1pdCBgbmFtZShhcmdzLCBhcmdzKWAuXG4gICAgICAgIGNvbnN0IHRvcExldmVsUGFyYW1ldGVycyA9IChqc0RvY1BhcmFtZXRlcnMgfHwgW10pLmZpbHRlcigocGFyYW1ldGVyKSA9PiB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgIXBhcmFtZXRlci5uYW1lLmluY2x1ZGVzKFwiLlwiKSlcblxuICAgICAgICBpZiAodG9wTGV2ZWxQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhcmdzID0gdG9wTGV2ZWxQYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIubmFtZSksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUNvbW1hbmRKc0RvY1R5cGUoe1xuICAgICAgICAgICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGgsXG4gICAgICAgICAgICAgIGltcG9ydEFsaWFzZXM6IHBhcmFtZXRlci5pbXBvcnRBbGlhc2VzLFxuICAgICAgICAgICAgICBqc0RvY1R5cGU6IHBhcmFtZXRlci50eXBlLFxuICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBwYXJhbWV0ZXIuc291cmNlRmlsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlbnJpY2hlZFtjb21tYW5kTmFtZV0gPSB7YXJnczogYXJncyB8fCBbXSwgcmV0dXJuVHlwZTogcmV0dXJuVHlwZSB8fCBudWxsfVxuICAgIH1cblxuICAgIHJldHVybiBlbnJpY2hlZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW53cmFwcGVkIHByb21pc2UganMgZG9jIHR5cGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qc0RvY1R5cGUgLSBKU0RvYyB0eXBlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcmVzb2x2ZWQgdmFsdWUgdHlwZSBmb3Igc2VyaWFsaXplZCBmcm9udGVuZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgdW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSkge1xuICAgIGNvbnN0IHByb21pc2VQcmVmaXggPSBcIlByb21pc2U8XCJcblxuICAgIGlmICghanNEb2NUeXBlLnN0YXJ0c1dpdGgocHJvbWlzZVByZWZpeCkpIHJldHVybiBqc0RvY1R5cGVcblxuICAgIGlmICghanNEb2NUeXBlLmVuZHNXaXRoKFwiPlwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBQcm9taXNlIEpTRG9jIHR5cGUgdG8gZW5kIHdpdGggJz4nOiAke2pzRG9jVHlwZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGpzRG9jVHlwZS5zbGljZShwcm9taXNlUHJlZml4Lmxlbmd0aCwgLTEpLnRyaW0oKVxuXG4gICAgaWYgKHJlc29sdmVkVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFByb21pc2UgSlNEb2MgdHlwZSB0byBjb250YWluIGEgcmVzb2x2ZWQgdHlwZTogJHtqc0RvY1R5cGV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtZXRob2Qgb3duZXIgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gYXJncy50YXJnZXRDbGFzcyAtIFRhcmdldCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gQ2xhc3MgbmFtZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QuXG4gICAqL1xuICBtZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZSwgdGFyZ2V0Q2xhc3N9KSB7XG4gICAgbGV0IHByb3RvdHlwZSA9IHRhcmdldENsYXNzLnByb3RvdHlwZVxuXG4gICAgd2hpbGUgKHByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIG1ldGhvZE5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yPy52YWx1ZSAhPSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsXG5cbiAgICAgICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yPy5uYW1lXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3Rvck5hbWUgPT0gXCJzdHJpbmdcIiAmJiBjb25zdHJ1Y3Rvck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlQ2xhc3NOYW1lIC0gU291cmNlIGNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIEpTRG9jIHJldHVybiB0eXBlIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZURlZmluaXRpb24oe21ldGhvZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZSA/IHJldHVyblR5cGUudHlwZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZSBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VDbGFzc05hbWUgLSBTb3VyY2UgY2xhc3MgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlIHwgbnVsbD59IC0gSlNEb2MgcmV0dXJuIHR5cGUgZGVmaW5pdGlvbiB3aGVuIGRvY3VtZW50ZWQuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVEZWZpbml0aW9uKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcygpXG4gICAgY29uc3QgcmV0dXJuVHlwZUtleSA9IGAke3NvdXJjZUNsYXNzTmFtZX0uJHttZXRob2ROYW1lfWBcblxuICAgIGlmICghcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcy5oYXMocmV0dXJuVHlwZUtleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcy5nZXQocmV0dXJuVHlwZUtleSlcblxuICAgIGlmICghcmV0dXJuVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU0RvYyByZXR1cm4gdHlwZSBmb3IgJHtyZXR1cm5UeXBlS2V5fWApXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXR1cm5UeXBlLnR5cGUgIT0gXCJzdHJpbmdcIiB8fCByZXR1cm5UeXBlLnR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgZm9yICR7cmV0dXJuVHlwZUtleX1gKVxuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIHR5cGUuXG4gICAqIEBwYXJhbSB7e21ldGhvZE5hbWU6IHN0cmluZywgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgc291cmNlQ2xhc3NOYW1lOiBzdHJpbmd9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSB3aGVuIGRvY3VtZW50ZWQuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGUoe21ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4LCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJzKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KVxuXG4gICAgaWYgKCFwYXJhbWV0ZXJzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1twYXJhbWV0ZXJJbmRleF1cblxuICAgIGlmIChwYXJhbWV0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGxcblxuICAgIGlmIChwYXJhbWV0ZXIudHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBmb3IgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX0gcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyLnR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3ttZXRob2ROYW1lOiBzdHJpbmcsIHNvdXJjZUNsYXNzTmFtZTogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlW10gfCBudWxsPn0gLSBKU0RvYyBwYXJhbWV0ZXJzIChuYW1lICsgdHlwZSkgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJzKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcygpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXNLZXkgPSBgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gXG5cbiAgICBpZiAoIXJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMuaGFzKHBhcmFtZXRlclR5cGVzS2V5KSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmdldChwYXJhbWV0ZXJUeXBlc0tleSlcblxuICAgIGlmICghcGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU0RvYyBwYXJhbWV0ZXJzIGZvciAke3BhcmFtZXRlclR5cGVzS2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZT4+fSAtIFJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCByZXR1cm5UeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VGaWxlLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gcmV0dXJuVHlwZXNcblxuICAgIHJldHVybiByZXR1cm5UeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgUmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlW10+Pn0gLSBSZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVycyBrZXllZCBieSBDbGFzc05hbWUubWV0aG9kTmFtZS5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMoKSB7XG4gICAgaWYgKHRoaXMuX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMpIHJldHVybiB0aGlzLl9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzXG5cbiAgICBjb25zdCBzb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRmlsZXMoKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2Ygc291cmNlRmlsZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShzb3VyY2VGaWxlLCBcInV0ZjhcIilcblxuICAgICAgdGhpcy5hZGRSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzRnJvbVNvdXJjZSh7cGFyYW1ldGVyVHlwZXMsIHNvdXJjZUZpbGUsIHNvdXJjZVRleHR9KVxuICAgIH1cblxuICAgIHRoaXMuX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBwYXJhbWV0ZXJUeXBlc1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBKU0RvYyBzb3VyY2UgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBKYXZhU2NyaXB0IHNvdXJjZSBmaWxlcyB0aGF0IGNhbiBkZWZpbmUgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGFuZCBtb2RlbCBhY2Nlc3NvcnMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZURpcmVjdG9yeSBvZiB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZURpcmVjdG9yaWVzKCkpIHtcbiAgICAgIHNvdXJjZUZpbGVzLnB1c2goLi4uYXdhaXQgdGhpcy5qYXZhc2NyaXB0RmlsZXNJbkRpcmVjdG9yeShzb3VyY2VEaXJlY3RvcnkpKVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VGaWxlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgSlNEb2Mgc291cmNlIGRpcmVjdG9yaWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU291cmNlIGRpcmVjdG9yaWVzIHRvIHNjYW4gZm9yIGdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBKU0RvYy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZURpcmVjdG9yaWVzKCkge1xuICAgIGNvbnN0IHNvdXJjZURpcmVjdG9yaWVzID0gbmV3IFNldChbcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5KCksIFwic3JjXCIpXSlcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0QmFja2VuZFByb2plY3RzKCkpIHtcbiAgICAgIGlmICh0eXBlb2YgYmFja2VuZFByb2plY3QucGF0aCA9PSBcInN0cmluZ1wiICYmIGJhY2tlbmRQcm9qZWN0LnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICBzb3VyY2VEaXJlY3Rvcmllcy5hZGQocGF0aC5qb2luKGJhY2tlbmRQcm9qZWN0LnBhdGgsIFwic3JjXCIpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHNvdXJjZURpcmVjdG9yaWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgbWV0aG9kIHJldHVybiB0eXBlcyBmcm9tIHNvdXJjZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlPn0gYXJncy5yZXR1cm5UeXBlcyAtIE11dGFibGUgcmV0dXJuIHR5cGVzIG1hcC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbYXJncy5zb3VyY2VGaWxlXSAtIFNvdXJjZSBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRSZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzRnJvbVNvdXJjZSh7cmV0dXJuVHlwZXMsIHNvdXJjZUZpbGUgPSBudWxsLCBzb3VyY2VUZXh0fSkge1xuICAgIGNvbnN0IGNsYXNzUmVnZXggPSAvY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccysoPzpleHRlbmRzXFxzK1tee10rKT9cXHsvZ1xuICAgIGNvbnN0IGltcG9ydEFsaWFzZXMgPSB0aGlzLmpzRG9jSW1wb3J0QWxpYXNlc0Zyb21Tb3VyY2Uoc291cmNlVGV4dClcbiAgICBsZXQgY2xhc3NNYXRjaFxuXG4gICAgd2hpbGUgKChjbGFzc01hdGNoID0gY2xhc3NSZWdleC5leGVjKHNvdXJjZVRleHQpKSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gY2xhc3NNYXRjaFsxXVxuICAgICAgY29uc3QgY2xhc3NCb2R5U3RhcnQgPSBjbGFzc1JlZ2V4Lmxhc3RJbmRleFxuICAgICAgY29uc3QgY2xhc3NCb2R5RW5kID0gdGhpcy5tYXRjaGluZ0JyYWNlSW5kZXgoe29wZW5JbmRleDogY2xhc3NCb2R5U3RhcnQgLSAxLCBzb3VyY2VUZXh0fSlcblxuICAgICAgaWYgKGNsYXNzQm9keUVuZCA9PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBicmFjZSBtYXRjaGVyIGNhbid0IHRva2VuaXplIGV2ZXJ5IGNvbnN0cnVjdCAoZS5nLiBhIHJlZ2V4IGxpdGVyYWxcbiAgICAgICAgLy8gd2hvc2UgcXVvdGVzIGxvb2sgbGlrZSBzdHJpbmcgZGVsaW1pdGVycyksIHNvIGl0IGNhbiBmYWlsIHRvIGxvY2F0ZSBhXG4gICAgICAgIC8vIGNsYXNzIGJvZHkuIFNraXAgbWV0YWRhdGEgZXh0cmFjdGlvbiBmb3IgdGhhdCBjbGFzcyByYXRoZXIgdGhhblxuICAgICAgICAvLyBhYm9ydGluZyB0aGUgd2hvbGUgZnJvbnRlbmQtbW9kZWwgZ2VuZXJhdGlvbjsgcmVzb3VyY2VzIHRoYXQgcGFyc2VcbiAgICAgICAgLy8gY2xlYW5seSBzdGlsbCBnZXQgdGhlaXIgSlNEb2MtZGVyaXZlZCByZXR1cm4vcGFyYW0gdHlwZXMuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsYXNzQm9keSA9IHNvdXJjZVRleHQuc2xpY2UoY2xhc3NCb2R5U3RhcnQsIGNsYXNzQm9keUVuZClcbiAgICAgIGNvbnN0IGpzRG9jUmVnZXggPSAvXFwvXFwqXFwqKFtcXHNcXFNdKj8pXFwqXFwvL2dcbiAgICAgIGxldCBqc0RvY01hdGNoXG5cbiAgICAgIHdoaWxlICgoanNEb2NNYXRjaCA9IGpzRG9jUmVnZXguZXhlYyhjbGFzc0JvZHkpKSkge1xuICAgICAgICBjb25zdCBzb3VyY2VBZnRlckpzRG9jID0gY2xhc3NCb2R5LnNsaWNlKGpzRG9jUmVnZXgubGFzdEluZGV4KVxuICAgICAgICBjb25zdCBtZXRob2RNYXRjaCA9IHNvdXJjZUFmdGVySnNEb2MubWF0Y2goL15cXHMqKD86YXN5bmNcXHMrKT8oW0EtWmEtel8kXVtcXHckXSopXFxzKlxcKC8pXG5cbiAgICAgICAgaWYgKCFtZXRob2RNYXRjaCkgY29udGludWVcblxuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kTWF0Y2hbMV1cblxuICAgICAgICBjb25zdCByZXR1cm5UeXBlID0gdGhpcy5qc0RvY1JldHVyblR5cGUoanNEb2NNYXRjaFsxXSlcblxuICAgICAgICBpZiAocmV0dXJuVHlwZSkge1xuICAgICAgICAgIHJldHVyblR5cGVzLnNldChgJHtjbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gLCB7aW1wb3J0QWxpYXNlcywgc291cmNlRmlsZSwgdHlwZTogcmV0dXJuVHlwZX0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcyBmcm9tIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7cGFyYW1ldGVyVHlwZXM6IE1hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZVtdPiwgc291cmNlRmlsZT86IHN0cmluZyB8IG51bGwsIHNvdXJjZVRleHQ6IHN0cmluZ319IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc0Zyb21Tb3VyY2Uoe3BhcmFtZXRlclR5cGVzLCBzb3VyY2VGaWxlID0gbnVsbCwgc291cmNlVGV4dH0pIHtcbiAgICBjb25zdCBjbGFzc1JlZ2V4ID0gL2NsYXNzXFxzKyhbQS1aYS16XyRdW1xcdyRdKilcXHMrKD86ZXh0ZW5kc1xccytbXntdKyk/XFx7L2dcbiAgICBjb25zdCBpbXBvcnRBbGlhc2VzID0gdGhpcy5qc0RvY0ltcG9ydEFsaWFzZXNGcm9tU291cmNlKHNvdXJjZVRleHQpXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG4gICAgICAgIGNvbnN0IGpzRG9jUGFyYW1ldGVycyA9IHRoaXMuanNEb2NQYXJhbWV0ZXJzKGpzRG9jTWF0Y2hbMV0pXG5cbiAgICAgICAgaWYgKGpzRG9jUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIGpzRG9jUGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gKHsuLi5wYXJhbWV0ZXIsIGltcG9ydEFsaWFzZXMsIHNvdXJjZUZpbGV9KSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgSlNEb2MgaW1wb3J0IGFsaWFzZXMgZnJvbSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBSZXNvdXJjZUpzRG9jSW1wb3J0QWxpYXM+fSAtIEltcG9ydCBhbGlhc2VzIGtleWVkIGJ5IGxvY2FsIG5hbWUuXG4gICAqL1xuICBqc0RvY0ltcG9ydEFsaWFzZXNGcm9tU291cmNlKHNvdXJjZVRleHQpIHtcbiAgICBjb25zdCBpbXBvcnRBbGlhc2VzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgaW1wb3J0UmVnZXggPSAvQGltcG9ydFxccypcXHtcXHMqKFtefV0rPylcXHMqXFx9XFxzKmZyb21cXHMqW1wiJ10oW15cIiddKylbXCInXS9nXG4gICAgbGV0IGltcG9ydE1hdGNoXG5cbiAgICB3aGlsZSAoKGltcG9ydE1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGltcG9ydExpc3QgPSBpbXBvcnRNYXRjaFsxXVxuICAgICAgY29uc3Qgc3BlY2lmaWVyID0gaW1wb3J0TWF0Y2hbMl1cblxuICAgICAgZm9yIChjb25zdCByYXdJbXBvcnRFbnRyeSBvZiBpbXBvcnRMaXN0LnNwbGl0KFwiLFwiKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRFbnRyeSA9IHJhd0ltcG9ydEVudHJ5LnRyaW0oKVxuXG4gICAgICAgIGlmIChpbXBvcnRFbnRyeS5sZW5ndGggPCAxKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGVudHJ5TWF0Y2ggPSBpbXBvcnRFbnRyeS5tYXRjaCgvXihkZWZhdWx0fFtBLVphLXpfJF1bXFx3JF0qKSg/Olxccythc1xccysoW0EtWmEtel8kXVtcXHckXSopKT8kLylcblxuICAgICAgICBpZiAoIWVudHJ5TWF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBKU0RvYyBAaW1wb3J0IGVudHJ5OiAke2ltcG9ydEVudHJ5fWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbXBvcnRlZE5hbWUgPSBlbnRyeU1hdGNoWzFdXG4gICAgICAgIGNvbnN0IGFsaWFzTmFtZSA9IGVudHJ5TWF0Y2hbMl0gfHwgaW1wb3J0ZWROYW1lXG5cbiAgICAgICAgaW1wb3J0QWxpYXNlcy5zZXQoYWxpYXNOYW1lLCB7aW1wb3J0ZWROYW1lLCBzcGVjaWZpZXJ9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRBbGlhc2VzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1RleHQgLSBKU0RvYyB0ZXh0IGluc2lkZSBjb21tZW50IG1hcmtlcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEpTRG9jIHJldHVybiB0eXBlIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIGpzRG9jUmV0dXJuVHlwZShqc0RvY1RleHQpIHtcbiAgICBjb25zdCByZXR1cm5zTWF0Y2ggPSBqc0RvY1RleHQubWF0Y2goL0ByZXR1cm5zP1xccypcXHsvKVxuXG4gICAgaWYgKCFyZXR1cm5zTWF0Y2ggfHwgcmV0dXJuc01hdGNoLmluZGV4ID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB0eXBlT3BlbkluZGV4ID0gcmV0dXJuc01hdGNoLmluZGV4ICsgcmV0dXJuc01hdGNoWzBdLmxlbmd0aCAtIDFcbiAgICBjb25zdCB0eXBlQ2xvc2VJbmRleCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IHR5cGVPcGVuSW5kZXgsIHNvdXJjZVRleHQ6IGpzRG9jVGV4dH0pXG5cbiAgICBpZiAodHlwZUNsb3NlSW5kZXggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgSlNEb2MgcmV0dXJuIHR5cGUgZnJvbTogJHtqc0RvY1RleHR9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdGhpcy5ub3JtYWxpemVKc0RvY1R5cGUoanNEb2NUZXh0LnNsaWNlKHR5cGVPcGVuSW5kZXggKyAxLCB0eXBlQ2xvc2VJbmRleCkpXG5cbiAgICBpZiAocmV0dXJuVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyByZXR1cm4gdHlwZSBpbjogJHtqc0RvY1RleHR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlcyBhIEpTRG9jIHR5cGUgc3Bhbm5pbmcgbXVsdGlwbGUgY29tbWVudCBsaW5lcyBpbnRvIGEgc2luZ2xlIGxpbmUgc28gaXQgY2FuXG4gICAqIGJlIGVtaXR0ZWQgaW50byBhbiBpbmxpbmUgdHlwZS1hc3NlcnRpb24gY2FzdC4gQSBtdWx0aWxpbmUgYmFja2VuZCByZXR1cm4gdHlwZSBrZWVwc1xuICAgKiBpdHMgbGVhZGluZyBjb250aW51YXRpb24gYXN0ZXJpc2tzIGluIHRoZSBjYXB0dXJlZCBzdWJzdHJpbmcsIHdoaWNoIGFyZSBpbnZhbGlkIGluc2lkZVxuICAgKiBhbiBpbmxpbmUgY2FzdCBhbmQgbWFrZSBUeXBlU2NyaXB0IHJlYWQgdGhlIGFzc2VydGVkIHR5cGUgYXMgYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBSYXcgY2FwdHVyZWQgSlNEb2MgdHlwZSwgcG9zc2libHkgbXVsdGlsaW5lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNpbmdsZS1saW5lIEpTRG9jIHR5cGUuXG4gICAqL1xuICBub3JtYWxpemVKc0RvY1R5cGUoanNEb2NUeXBlKSB7XG4gICAgcmV0dXJuIGpzRG9jVHlwZS5yZXBsYWNlKC9cXHMqXFxuXFxzKlxcKj9bIFxcdF0qL2csIFwiIFwiKS50cmltKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUZXh0IC0gSlNEb2MgdGV4dCBpbnNpZGUgY29tbWVudCBtYXJrZXJzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZ30+fSAtIEpTRG9jIHBhcmFtZXRlcnMgKG5hbWUgKyB0eXBlKSBpbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgICovXG4gIGpzRG9jUGFyYW1ldGVycyhqc0RvY1RleHQpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gW11cbiAgICBjb25zdCBwYXJhbVJlZ2V4ID0gL0BwYXJhbVxccypcXHsvZ1xuICAgIGxldCBfcGFyYW1NYXRjaFxuXG4gICAgd2hpbGUgKChfcGFyYW1NYXRjaCA9IHBhcmFtUmVnZXguZXhlYyhqc0RvY1RleHQpKSkge1xuICAgICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHBhcmFtUmVnZXgubGFzdEluZGV4IC0gMVxuICAgICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgICBpZiAodHlwZUNsb3NlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBmcm9tOiAke2pzRG9jVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gdGhpcy5ub3JtYWxpemVKc0RvY1R5cGUoanNEb2NUZXh0LnNsaWNlKHR5cGVPcGVuSW5kZXggKyAxLCB0eXBlQ2xvc2VJbmRleCkpXG5cbiAgICAgIGlmICh0eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIHRoZSBjbG9zaW5nIGJyYWNlIHRoZSBwYXJhbWV0ZXIgbmFtZSBmb2xsb3dzIChvcHRpb25hbGx5IGJyYWNrZXRlZFxuICAgICAgLy8gZm9yIGBAcGFyYW0ge3R5cGV9IFtuYW1lXWApLiBDYXB0dXJlIHRoZSBsZWFkaW5nIG5hbWUgdG9rZW4g4oCUIGluY2x1ZGluZyBhbnlcbiAgICAgIC8vIGRvdHRlZCBwYXRoIHNvIG9iamVjdC1wcm9wZXJ0eSB0YWdzIGxpa2UgYEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1lc3NhZ2VgIHN0YXlcbiAgICAgIC8vIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSB0b3AtbGV2ZWwgYEBwYXJhbSB7b2JqZWN0fSBhcmdzYCBwYXJhbWV0ZXIuXG4gICAgICBjb25zdCBuYW1lTWF0Y2ggPSBqc0RvY1RleHQuc2xpY2UodHlwZUNsb3NlSW5kZXggKyAxKS5tYXRjaCgvXlxccypcXFs/XFxzKihbQS1aYS16XyRdW1xcdyQuXSopLylcblxuICAgICAgcGFyYW1ldGVycy5wdXNoKHtuYW1lOiBuYW1lTWF0Y2ggPyBuYW1lTWF0Y2hbMV0gOiBudWxsLCB0eXBlfSlcbiAgICAgIHBhcmFtUmVnZXgubGFzdEluZGV4ID0gdHlwZUNsb3NlSW5kZXggKyAxXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGphdmFzY3JpcHQgZmlsZXMgaW4gZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0b3J5IC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBKYXZhU2NyaXB0IHNvdXJjZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgYXN5bmMgamF2YXNjcmlwdEZpbGVzSW5EaXJlY3RvcnkoZGlyZWN0b3J5KSB7XG4gICAgbGV0IGVudHJpZXNcblxuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJlY3RvcnksIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PSBcIm9iamVjdFwiICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiBbXVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpXG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGZpbGVQYXRocy5wdXNoKC4uLmF3YWl0IHRoaXMuamF2YXNjcmlwdEZpbGVzSW5EaXJlY3RvcnkoZW50cnlQYXRoKSlcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkgJiYgL1xcLihtanN8anN8anN4fHRzKSQvLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgZmlsZVBhdGhzLnB1c2goZW50cnlQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWxlUGF0aHNcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG1hdGNoaW5nIGNsb3NpbmcgYnJhY2Ugd2hpbGUgcmVzcGVjdGluZyBKYXZhU2NyaXB0IHN0cmluZ3MgYW5kIGNvbW1lbnRzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3Mub3BlbkluZGV4IC0gT3BlbmluZyBicmFjZSBpbmRleC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlVGV4dCAtIFNvdXJjZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBDbG9zaW5nIGJyYWNlIGluZGV4IHdoZW4gZm91bmQuXG4gICAqL1xuICBtYXRjaGluZ0JyYWNlSW5kZXgoe29wZW5JbmRleCwgc291cmNlVGV4dH0pIHtcbiAgICBpZiAoc291cmNlVGV4dFtvcGVuSW5kZXhdICE9PSBcIntcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcGVuaW5nIGJyYWNlIGF0IGluZGV4ICR7b3BlbkluZGV4fWApXG4gICAgfVxuXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIGxldCBpbkJsb2NrQ29tbWVudCA9IGZhbHNlXG4gICAgbGV0IGluTGluZUNvbW1lbnQgPSBmYWxzZVxuICAgIGxldCBpblN0cmluZyA9IFwiXCJcblxuICAgIGZvciAobGV0IGluZGV4ID0gb3BlbkluZGV4OyBpbmRleCA8IHNvdXJjZVRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlVGV4dFtpbmRleF1cbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlVGV4dFtpbmRleCArIDFdXG4gICAgICBjb25zdCBwcmV2aW91c0NoYXIgPSBzb3VyY2VUZXh0W2luZGV4IC0gMV1cblxuICAgICAgaWYgKGluTGluZUNvbW1lbnQpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiXFxuXCIpIGluTGluZUNvbW1lbnQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpbkJsb2NrQ29tbWVudCkge1xuICAgICAgICBpZiAoY2hhciA9PT0gXCIqXCIgJiYgbmV4dENoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICAgICAgICAgIGluZGV4KytcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpblN0cmluZykge1xuICAgICAgICBpZiAoY2hhciA9PT0gaW5TdHJpbmcgJiYgcHJldmlvdXNDaGFyICE9PSBcIlxcXFxcIikgaW5TdHJpbmcgPSBcIlwiXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiL1wiICYmIG5leHRDaGFyID09PSBcIi9cIikge1xuICAgICAgICBpbkxpbmVDb21tZW50ID0gdHJ1ZVxuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIqXCIpIHtcbiAgICAgICAgaW5CbG9ja0NvbW1lbnQgPSB0cnVlXG4gICAgICAgIGluZGV4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiXFxcIlwiIHx8IGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09IFwiYFwiKSB7XG4gICAgICAgIGluU3RyaW5nID0gY2hhclxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCJ7XCIpIHtcbiAgICAgICAgZGVwdGgrK1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIn1cIikge1xuICAgICAgICBkZXB0aC0tXG5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gaW5kZXhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbH0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gdGhlIGJhY2tlbmQgbW9kZWwgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoIXJlc29sdmVkQXR0cmlidXRlTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGxldCBjb2x1bW5OYW1lXG5cbiAgICB0cnkge1xuICAgICAgY29sdW1uTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpW3Jlc29sdmVkQXR0cmlidXRlTmFtZV1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcInVzZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIpKSByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmICghY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgY29sdW1uXG5cbiAgICB0cnkge1xuICAgICAgY29sdW1uID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5zSGFzaCgpW2NvbHVtbk5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uID8gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBjb2x1bW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gYXJncy5jb2x1bW4gLSBEYXRhYmFzZSBjb2x1bW4uXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gdGhlIGRhdGFiYXNlIGNvbHVtbi5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yQ29sdW1uKHtjb2x1bW59KSB7XG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbi5nZXRUeXBlKClcblxuICAgIGlmICh0eXBlb2YgdHlwZSAhPSBcInN0cmluZ1wiIHx8IHR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgY29sdW1uIHR5cGUgZm9yIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBpbmZlcmVuY2UsIGdvdDogJHt0eXBlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG51bGw6IGNvbHVtbi5nZXROdWxsKCksXG4gICAgICB0eXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVsYXRpb25zaGlwcyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge0FycmF5PHthdXRvbG9hZDogYm9vbGVhbiwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSAtIFJlbGF0aW9uc2hpcHMuXG4gICAqL1xuICByZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ29uZmlnLnJlbGF0aW9uc2hpcHNcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzID09PSB1bmRlZmluZWQgfHwgcmVsYXRpb25zaGlwcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGhhcyBpbnZhbGlkIHJlbGF0aW9uc2hpcHMgY29uZmlnIOKAlCBtdXN0IGJlIGFuIGFycmF5IG9mIHJlbGF0aW9uc2hpcCBuYW1lcywgZ290ICR7dHlwZW9mIHJlbGF0aW9uc2hpcHN9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcE5hbWUpID0+IHRoaXMuaW5mZXJyZWRSZWxhdGlvbnNoaXBEZWZpbml0aW9uKHtjbGFzc05hbWUsIHJlbGF0aW9uc2hpcE5hbWUsIHJlc291cmNlQ2xhc3N9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluZmVycmVkIHJlbGF0aW9uc2hpcCBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge3thdXRvbG9hZDogYm9vbGVhbiwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn19IEluZmVycmVkIHJlbGF0aW9uc2hpcCBkZWZpbml0aW9uLlxuICAgKi9cbiAgaW5mZXJyZWRSZWxhdGlvbnNoaXBEZWZpbml0aW9uKHtjbGFzc05hbWUsIHJlbGF0aW9uc2hpcE5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlQ2xhc3MgPyByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKSA6IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3MoY2xhc3NOYW1lKVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwLmdldFR5cGUoKVxuXG4gICAgaWYgKHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiYmVsb25nc1RvXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNPbmVcIiAmJiByZWxhdGlvbnNoaXBUeXBlICE9PSBcImhhc01hbnlcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyB1bnN1cHBvcnRlZCB0eXBlICcke3JlbGF0aW9uc2hpcFR5cGV9J2ApXG4gICAgfVxuXG4gICAgbGV0IHRhcmdldENsYXNzTmFtZVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgIHRhcmdldENsYXNzTmFtZSA9IHRhcmdldE1vZGVsQ2xhc3M/LmdldE1vZGVsTmFtZSgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNb2RlbCBjbGFzcyBub3QgcmVnaXN0ZXJlZCB5ZXQg4oCUIGZhbGwgYmFjayB0byBjbGFzc05hbWUgZnJvbSByZWxhdGlvbnNoaXAgZGVmaW5pdGlvblxuICAgIH1cblxuICAgIGlmICghdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICB0YXJnZXRDbGFzc05hbWUgPSByZWxhdGlvbnNoaXAuY2xhc3NOYW1lXG5cbiAgICAgIGlmICghdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXV0b2xvYWQ6IHJlbGF0aW9uc2hpcC5nZXRBdXRvbG9hZCgpLFxuICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgIHRhcmdldENsYXNzTmFtZSxcbiAgICAgIHRhcmdldEZpbGVOYW1lOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGFyZ2V0Q2xhc3NOYW1lKSksXG4gICAgICB0eXBlOiByZWxhdGlvbnNoaXBUeXBlXG4gICAgfVxuICB9XG59XG4iXX0=
2236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxtQkFBbUIsTUFBTSw0QkFBNEIsQ0FBQTtBQUM1RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFDLDhCQUE4QixFQUFFLG1EQUFtRCxFQUFDLE1BQU0sc0RBQXNELENBQUE7QUFDeEosT0FBTyxFQUFDLHdDQUF3QyxFQUFFLGdEQUFnRCxFQUFDLE1BQU0sdURBQXVELENBQUE7QUFFaEssTUFBTSxrQ0FBa0MsR0FBRyxvQ0FBb0MsQ0FBQTtBQUUvRTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7O0dBTUc7QUFDSDs7Ozs7OztHQU9HO0FBRUgsbUdBQW1HO0FBQ25HLE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsV0FBVztJQUMvRCwyREFBMkQ7SUFDM0QsMEJBQTBCLEdBQUcsSUFBSSxDQUFBO0lBRWpDLGdFQUFnRTtJQUNoRSw2QkFBNkIsR0FBRyxJQUFJLENBQUE7SUFFcEM7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM3QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRXRDLE1BQU0sa0JBQWtC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QUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLFNBQVMsbUJBQW1CLGdCQUFnQiw2QkFBNkIsQ0FBQyxDQUFBO1lBQ3RHLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQ3BDLGdCQUFnQjtZQUNoQixlQUFlO1lBQ2YsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RSxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgZ2VuZXJhdGVkRmlsZUJhbm5lciBmcm9tIFwiLi9nZW5lcmF0ZWQtZmlsZS1iYW5uZXIuanNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlSXNCdWlsdEluLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcm9udGVuZC1tb2RlbHMvYnVpbHQtaW4tcmVzb3VyY2VzLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9ufSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZnJvbnRlbmQtbW9kZWxzL3Jlc291cmNlLWRlZmluaXRpb24uanNcIlxuXG5jb25zdCBGUk9OVEVORF9NT0RFTFNfUkVHRU5FUkFURV9DT01NQU5EID0gXCJ2ZWxvY2lvdXMgZ2VuZXJhdGU6ZnJvbnRlbmQtbW9kZWxzXCJcblxuLyoqXG4gKiBBdHRyaWJ1dGUgbWV0YWRhdGEgdXNlZCBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRBdHRyaWJ1dGVDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uVHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3FsVHlwZV0gLSBTUUwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YVR5cGVdIC0gRGF0YSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtqc0RvY1R5cGVdIC0gRXhhY3QgSlNEb2MgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBBdHRyaWJ1dGUgbmFtZSB3aGVuIGNvbmZpZ3VyZWQgYXMgYW4gYXJyYXkgZW50cnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtudWxsXSAtIFdoZXRoZXIgbnVsbCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gW2dldFR5cGVdIC0gUmV0dXJucyBjb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gW2dldE51bGxdIC0gUmV0dXJucyB3aGV0aGVyIG51bGwgaXMgYWxsb3dlZC5cbiAqL1xuLyoqXG4gKiBQZXJtaXQgc3BlYyByZXR1cm5lZCBieSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZHVyaW5nIGdlbmVyYXRpb24uXG4gKiBAdHlwZWRlZiB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWM+Pn0gRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWNcbiAqL1xuLyoqXG4gKiBKU0RvYyBpbXBvcnQgYWxpYXMgZXh0cmFjdGVkIGZyb20gYSBiYWNrZW5kIHJlc291cmNlIHNvdXJjZSBmaWxlLlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb3VyY2VKc0RvY0ltcG9ydEFsaWFzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW1wb3J0ZWROYW1lIC0gRXhwb3J0ZWQgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNwZWNpZmllciAtIEltcG9ydCBzcGVjaWZpZXIgZnJvbSB0aGUgc291cmNlIGZpbGUuXG4gKi9cbi8qKlxuICogSlNEb2MgcmV0dXJuIHR5cGUgZXh0cmFjdGVkIGZyb20gYSBiYWNrZW5kIHJlc291cmNlIG1ldGhvZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZVxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBSZXNvdXJjZUpzRG9jSW1wb3J0QWxpYXM+fSBpbXBvcnRBbGlhc2VzIC0gSW1wb3J0IGFsaWFzZXMgdmlzaWJsZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIEpTRG9jIHJldHVybiB0eXBlLlxuICovXG4vKipcbiAqIEpTRG9jIHBhcmFtZXRlciB0eXBlIGV4dHJhY3RlZCBmcm9tIGEgYmFja2VuZCByZXNvdXJjZSBtZXRob2QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVcbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgUmVzb3VyY2VKc0RvY0ltcG9ydEFsaWFzPn0gaW1wb3J0QWxpYXNlcyAtIEltcG9ydCBhbGlhc2VzIHZpc2libGUgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNvdXJjZUZpbGUgLSBTb3VyY2UgZmlsZSB0aGF0IGRlY2xhcmVkIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIEpTRG9jIHBhcmFtZXRlciB0eXBlLlxuICovXG5cbi8qKiBOb2RlIENMSSBjb21tYW5kIHRoYXQgZ2VuZXJhdGVzIGZyb250ZW5kIG1vZGVsIGNsYXNzZXMgZnJvbSBiYWNrZW5kIHByb2plY3QgcmVzb3VyY2UgY29uZmlnLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZUZyb250ZW5kTW9kZWxzIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZT4gfCBudWxsfSAqL1xuICBfcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IG51bGxcblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZVtdPiB8IG51bGx9ICovXG4gIF9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZmlsZXMgYXJlIGdlbmVyYXRlZC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplTW9kZWxzKClcblxuICAgIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcblxuICAgIGlmICh0eXBlb2YgZW52aXJvbm1lbnRIYW5kbGVyLmF1dG9EaXNjb3ZlclJlc291cmNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIuYXV0b0Rpc2NvdmVyUmVzb3VyY2VzKGNvbmZpZ3VyYXRpb24pXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGJhY2tlbmRQcm9qZWN0cykgfHwgYmFja2VuZFByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYmFja2VuZCBwcm9qZWN0cyBjb25maWd1cmVkLiBDb25maWd1cmUgJ2JhY2tlbmRQcm9qZWN0cycgaW4geW91ciBjb25maWd1cmF0aW9uIGZpcnN0XCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlZCBkaXJlY3Rvcmllcy5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZW5zdXJlZERpcmVjdG9yaWVzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVkIG1vZGVsIG5hbWVzIGJ5IGRpcmVjdG9yeS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlZCBmaWxlcyBieSBkaXJlY3RvcnkuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIEFycmF5PHtjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZ30+Pn0gKi9cbiAgICBjb25zdCBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5ID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNvIGVxdWl2YWxlbnQgc3BlbGxpbmdzIChhIHRyYWlsaW5nXG4gICAgICAvLyBzbGFzaCwgYC5gL2AuLmAgc2VnbWVudHMsIGR1cGxpY2F0ZSBzZXBhcmF0b3JzLCByZWxhdGl2ZSB2cyBhYnNvbHV0ZSlcbiAgICAgIC8vIHJlc29sdmUgdG8gYSBzaW5nbGUga2V5LiBPdGhlcndpc2UgdGhlIHBlci1kaXJlY3RvcnkgbWFwcyBiZWxvdyB0cmVhdFxuICAgICAgLy8gdGhlbSBhcyBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGR1cGxpY2F0ZSBjbGFzcyBuYW1lcyBzbGlwIHBhc3QgZGV0ZWN0aW9uLFxuICAgICAgLy8gYW5kIHRoZSBzcGxpdCBidWNrZXRzIHdyaXRlIGluY29tcGxldGUgaW5kZXguanMvc2V0dXAuanMgZm9yIGZpbGVzIHRoYXRcbiAgICAgIC8vIGFjdHVhbGx5IGxhbmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uIGRpc2suXG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsc0RpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpKVxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aEZvckZyb250ZW5kTW9kZWxzRGlyZWN0b3J5KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWVuc3VyZWREaXJlY3Rvcmllcy5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZyb250ZW5kTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgICAgZW5zdXJlZERpcmVjdG9yaWVzLmFkZChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5Lmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIFtdKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXMgPSBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkuZ2V0KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZEZpbGVzKSB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBmaWxlcyBsaXN0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGlmICghZ2VuZXJhdGVkTW9kZWxOYW1lcykgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgbW9kZWwgbmFtZXMgc2V0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyA9IHRoaXMuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3NOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCBtb2RlbENvbmZpZyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsQ2xhc3NOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke2Zyb250ZW5kTW9kZWxzRGlyfS8ke2ZpbGVOYW1lfWBcblxuICAgICAgICBpZiAoIW1vZGVsQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVzb3VyY2VDbGFzcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXSlcbiAgICAgICAgLy8gQW4gYWJzdHJhY3QgYmFzZSByZXNvdXJjZSAobm8gc3RhdGljIE1vZGVsQ2xhc3Mg4oCUIGUuZy4gYW4gYXBwJ3Mgc2hhcmVkXG4gICAgICAgIC8vIGBCYXNlUmVzb3VyY2VgIHRoYXQgb3RoZXIgcmVzb3VyY2VzIGV4dGVuZCkgY2FuJ3QgYmFjayBhIGdlbmVyYXRlZFxuICAgICAgICAvLyBmcm9udGVuZCBtb2RlbC4gVHJlYXQgaXQgYXMgcmVzb3VyY2UtbGVzcyBzbyB0aGUgZ2VuZXJhdG9yIGZhbGxzIGJhY2tcbiAgICAgICAgLy8gdG8gYnktbmFtZSBtb2RlbCBsb29rdXAgKyBlbXB0eSB3cml0ZSBwYXJhbXMgaW5zdGVhZCBvZiB0aHJvd2luZyB3aGVuXG4gICAgICAgIC8vIGl0IGVhZ2VybHkgY2FsbHMgYG1vZGVsQ2xhc3MoKWAgLyBgcGVybWl0dGVkUGFyYW1zKClgIG9uIGl0LlxuICAgICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzICYmIHJlc29sdmVkUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzID8gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzIDogbnVsbFxuXG4gICAgICAgIHRoaXMudmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgICAgIGlmIChnZW5lcmF0ZWRNb2RlbE5hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgaWYgKGZyb250ZW5kTW9kZWxSZXNvdXJjZUlzQnVpbHRJbih7bW9kZWxOYW1lOiBtb2RlbENsYXNzTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uOiByZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdfSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lcy5hZGQoY2xhc3NOYW1lKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdGhpcy5idWlsZE1vZGVsRmlsZUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIGltcG9ydFBhdGgsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2VDbGFzcyA/IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpIDogY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVtjbGFzc05hbWVdLFxuICAgICAgICAgIG1vZGVsQ29uZmlnLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGZpbGVDb250ZW50KVxuICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHtjbGFzc05hbWUsIGZpbGVOYW1lfSlcblxuICAgICAgICBjb25zb2xlLmxvZyhgY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvJHtmaWxlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zyb250ZW5kTW9kZWxzRGlyLCBnZW5lcmF0ZWRGaWxlc10gb2YgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSkge1xuICAgICAgY29uc3QgaW5kZXhDb250ZW50ID0gdGhpcy5idWlsZEluZGV4RmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vaW5kZXguanNgLCBpbmRleENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvaW5kZXguanNcIilcblxuICAgICAgY29uc3Qgc2V0dXBDb250ZW50ID0gdGhpcy5idWlsZFNldHVwRmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vc2V0dXAuanNgLCBzZXR1cENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvc2V0dXAuanNcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB2YWxpZGF0ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhcmdzLmF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzIC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzIGluIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsQ29uZmlnLmFiaWxpdGllc1xuXG4gICAgaWYgKCFhYmlsaXRpZXMgfHwgdHlwZW9mIGFiaWxpdGllcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkICdhYmlsaXRpZXMnIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZEFjdGlvbnMgPSBbXG4gICAgICB7YWN0aW9uOiBcImluZGV4XCIsIGFiaWxpdHlBY3Rpb246IGFiaWxpdGllcy5pbmRleH0sXG4gICAgICB7YWN0aW9uOiBcImZpbmRcIiwgYWJpbGl0eUFjdGlvbjogYWJpbGl0aWVzLmZpbmR9XG4gICAgXVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9uLCBhYmlsaXR5QWN0aW9ufSBvZiByZWFkQWN0aW9ucykge1xuICAgICAgaWYgKHR5cGVvZiBhYmlsaXR5QWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHlBY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgYWJpbGl0aWVzLiR7YWN0aW9ufSBjb25maWdgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2Ygbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmICghYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMuaGFzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfScgcmVmZXJlbmNlcyAnJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfScsIGJ1dCBubyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBleGlzdHMgZm9yIHRoYXQgdGFyZ2V0IGluIHRoaXMgYmFja2VuZCBwcm9qZWN0YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZXMgZm9yIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbj59IHJlc291cmNlcyAtIFJlc291cmNlIGNvbmZpZ3VyYXRpb24ga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcy5cbiAgICovXG4gIGF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzKHJlc291cmNlcykge1xuICAgIC8qKlxuICAgICAqIENsYXNzIG5hbWVzLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY2xhc3NOYW1lcy5hZGQoaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbHMgZGlyZWN0b3J5IGZvciBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7e2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aD86IHN0cmluZ319IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBYnNvbHV0ZSBmcm9udGVuZCBtb2RlbHMgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYmFja2VuZFByb2plY3QuZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoIHx8IHRoaXMuZGlyZWN0b3J5KClcblxuICAgIHJldHVybiBgJHtvdXRwdXRQYXRofS9zcmMvZnJvbnRlbmQtbW9kZWxzYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IHBhdGggZm9yIGZyb250ZW5kIG1vZGVscyBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9udGVuZE1vZGVsc0RpciAtIEZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqL1xuICBpbXBvcnRQYXRoRm9yRnJvbnRlbmRNb2RlbHNEaXJlY3RvcnkoZnJvbnRlbmRNb2RlbHNEaXIpIHtcbiAgICBjb25zdCBkZXZNb2RlID0gZnJvbnRlbmRNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvZnJvbnRlbmQtbW9kZWxzXCIpXG5cbiAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgcmV0dXJuIFwiLi4vLi4vLi4vLi4vc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIG1vZGVsIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBNZXRob2QgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW1wb3J0UGF0aCAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBHZW5lcmF0ZWQgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRNb2RlbEZpbGVDb250ZW50KHtjbGFzc05hbWUsIGZyb250ZW5kTW9kZWxGaWxlUGF0aCwgaW1wb3J0UGF0aCwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHRoaXMucmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzICYmIHR5cGVvZiBtb2RlbENvbmZpZy5hdHRhY2htZW50cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBtb2RlbENvbmZpZy5hdHRhY2htZW50c1xuICAgICAgOiB7fVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1BdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1DcmVhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1VcGRhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgY29uc3QgcGVybWl0dGVkQ3JlYXRlUGFyYW1zID0gdGhpcy5wZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsLCBcImNyZWF0ZVwiKVxuICAgIGNvbnN0IHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyA9IHRoaXMucGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbCwgXCJ1cGRhdGVcIilcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzID0gdGhpcy5uZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMuY29uY2F0KHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyksIHJlbGF0aW9uc2hpcHN9KVxuICAgIGNvbnN0IHVzZXNUcmFuc3BvcnRWYWx1ZSA9IGF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUuanNEb2NUeXBlLmluY2x1ZGVzKFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIpKVxuICAgICAgfHwgbmVzdGVkV3JpdGVUeXBlcy5zb21lKChuZXN0ZWRXcml0ZVR5cGUpID0+IG5lc3RlZFdyaXRlVHlwZS5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLnR5cGUuaW5jbHVkZXMoXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIikpKVxuICAgIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSB7XG4gICAgICBjcmVhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlIHx8IFwiY3JlYXRlXCIsXG4gICAgICBpbmRleDogbW9kZWxDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmRleCB8fCBcImluZGV4XCJcbiAgICB9XG4gICAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzID0ge1xuICAgICAgYXR0YWNoOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoIHx8IFwiYXR0YWNoXCIsXG4gICAgICBkZXN0cm95OiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSB8fCBcImRlc3Ryb3lcIixcbiAgICAgIGRvd25sb2FkOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgfHwgXCJkb3dubG9hZFwiLFxuICAgICAgZmluZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgfHwgXCJmaW5kXCIsXG4gICAgICB1cGRhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgfHwgXCJ1cGRhdGVcIixcbiAgICAgIHVybDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVybCB8fCBcInVybFwiXG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1vZGVsQ29uZmlnLmNvbGxlY3Rpb25Db21tYW5kc1xuICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbW9kZWxDb25maWcubWVtYmVyQ29tbWFuZHNcbiAgICBjb25zdCBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSA9IG1vZGVsQ29uZmlnLmNvbW1hbmRNZXRhZGF0YSB8fCB7fVxuICAgIGNvbnN0IGNvbW1hbmRNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY29tbWFuZE1ldGFkYXRhV2l0aFJlc291cmNlSnNEb2Moe1xuICAgICAgY29tbWFuZE1ldGFkYXRhOiBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSxcbiAgICAgIGNvbW1hbmROYW1lczogWy4uLk9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcyksIC4uLk9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKV0sXG4gICAgICBmcm9udGVuZE1vZGVsRmlsZVBhdGgsXG4gICAgICByZXNvdXJjZUNsYXNzXG4gICAgfSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzQXJlRGVmYXVsdCA9IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlID09PSBcImNyZWF0ZVwiICYmIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggPT09IFwiaW5kZXhcIlxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoID09PSBcImF0dGFjaFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSA9PT0gXCJkZXN0cm95XCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kb3dubG9hZCA9PT0gXCJkb3dubG9hZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZmluZCA9PT0gXCJmaW5kXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgPT09IFwidXBkYXRlXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgPT09IFwidXJsXCJcblxuICAgIGxldCBmaWxlQ29udGVudCA9IGdlbmVyYXRlZEZpbGVCYW5uZXIoRlJPTlRFTkRfTU9ERUxTX1JFR0VORVJBVEVfQ09NTUFORClcblxuICAgIGZpbGVDb250ZW50ICs9IGBpbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2UgZnJvbSBcIiR7aW1wb3J0UGF0aH1cIlxcbmBcblxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZy5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKiBGYWxsYmFjayBhdHRyaWJ1dGUgdmFsdWUgdHlwZSBmb3IgZ2VuZXJhdGVkIGZpZWxkcyB3aXRob3V0IG5hcnJvd2VyIG1ldGFkYXRhLlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBpZiAodXNlc1RyYW5zcG9ydFZhbHVlKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqIFZhbHVlIHN1cHBvcnRlZCBieSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqICR7YXR0cmlidXRlc1R5cGVOYW1lfSB0eXBlLlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHthdHRyaWJ1dGVzVHlwZU5hbWV9XFxuYFxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YXR0cmlidXRlLmpzRG9jVHlwZX19ICR7YXR0cmlidXRlLm5hbWV9IC0gQXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZvciAoY29uc3QgbmVzdGVkV3JpdGVUeXBlIG9mIG5lc3RlZFdyaXRlVHlwZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIGZvciBuZXN0ZWQgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX0gd3JpdGVzLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX1cXG5gXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZEF0dHJpYnV0ZSBvZiBuZXN0ZWRXcml0ZVR5cGUuYXR0cmlidXRlcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHByb3BlcnR5IHske25lc3RlZEF0dHJpYnV0ZS50eXBlfX0gWyR7bmVzdGVkQXR0cmlidXRlLm5hbWV9XSAtIE5lc3RlZCAke25lc3RlZEF0dHJpYnV0ZS5uYW1lfSB2YWx1ZS5cXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IGF3YWl0IHRoaXMud3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZENyZWF0ZVBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWU6IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0pXG4gICAgZmlsZUNvbnRlbnQgKz0gYXdhaXQgdGhpcy53cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkVXBkYXRlUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZTogdXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lfSlcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIGZvciAke2NsYXNzTmFtZX0uXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlPCR7YXR0cmlidXRlc1R5cGVOYW1lfSwgJHtjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9LCAke3VwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0+fVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGNsYXNzICR7Y2xhc3NOYW1lfSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlIHtcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnfSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIG1vZGVsTmFtZTogJHtKU09OLnN0cmluZ2lmeShjbGFzc05hbWUpfSxcXG5gXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRDb21tYW5kc1Byb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogY29sbGVjdGlvbkNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogbWVtYmVyQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yUmVzb3VyY2Uoe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pXG5cbiAgICBpZiAocHJpbWFyeUtleSAhPT0gXCJpZFwiKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcHJpbWFyeUtleTogJHtKU09OLnN0cmluZ2lmeShwcmltYXJ5S2V5KX0sXFxuYFxuICAgIH1cbiAgICBjb25zdCBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcyA9IHRoaXMubmVzdGVkUmVsYXRpb25zaGlwTmFtZXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsKVxuICAgIGlmIChuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAgICR7cmVsYXRpb25zaGlwTmFtZX06IHt9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImJlbG9uZ3NUb1xcXCIgfCBcXFwiaGFzT25lXFxcIiB8IFxcXCJoYXNNYW55XFxcIiwgYXV0b2xvYWQ/OiBib29sZWFufT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2B0eXBlOiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC50eXBlKX1gXVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuYXV0b2xvYWQgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKFwiYXV0b2xvYWQ6IGZhbHNlXCIpXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9OiB7JHtwYXJ0cy5qb2luKFwiLCBcIil9fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgbmFtZXMuICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgY2FtZWxpemVkQXR0cmlidXRlID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSwgdHJ1ZSlcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZVVwcGVyID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSlcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV1gXG4gICAgICBjb25zdCBzZXR0ZXJBdHRyaWJ1dGVUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgfSlcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHske2F0dHJpYnV0ZVR5cGV9fSAtIEF0dHJpYnV0ZSB2YWx1ZS4gKi9cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAke2NhbWVsaXplZEF0dHJpYnV0ZX0oKSB7IHJldHVybiAvKiogQHR5cGUgeyR7YXR0cmlidXRlVHlwZX19ICovICh0aGlzLnJlYWRBdHRyaWJ1dGUoJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9KSkgfVxcbmBcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyQXR0cmlidXRlVHlwZX19IG5ld1ZhbHVlIC0gTmV3IGF0dHJpYnV0ZSB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiAvKiogQHR5cGUgeyR7c2V0dGVyQXR0cmlidXRlVHlwZX19ICovICh0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSkgfVxcbmBcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5jdXN0b21Db21tYW5kTWV0aG9kU2lnbmF0dXJlKHtjb21tYW5kTWV0YWRhdGEsIG1ldGhvZE5hbWV9KVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJ1bnMgJHttZXRob2ROYW1lfS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBzaWduYXR1cmUucGFyYW1Eb2NzXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3NpZ25hdHVyZS5yZXR1cm5UeXBlfT59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHN0YXRpYyBhc3luYyAke21ldGhvZE5hbWV9KCR7c2lnbmF0dXJlLnBhcmFtZXRlcnN9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICByZXR1cm4gLyoqIEB0eXBlIHske3NpZ25hdHVyZS5yZXR1cm5UeXBlfX0gKi8gKGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShjb2xsZWN0aW9uQ29tbWFuZHNbbWV0aG9kTmFtZV0pfSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZFR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cygke3NpZ25hdHVyZS5wYXlsb2FkQXJndW1lbnRzfSksXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICByZXNvdXJjZVBhdGg6IHRoaXMucmVzb3VyY2VQYXRoKClcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSkpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IHNpZ25hdHVyZS5wYXJhbURvY3NcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7c2lnbmF0dXJlLnJldHVyblR5cGV9Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHttZXRob2ROYW1lfSgke3NpZ25hdHVyZS5wYXJhbWV0ZXJzfSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIC8qKiBAdHlwZSB7JHtzaWduYXR1cmUucmV0dXJuVHlwZX19ICovIChhd2FpdCAke2NsYXNzTmFtZX0uZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kVHlwZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgbWVtYmVySWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKCksXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwYXlsb2FkOiAke2NsYXNzTmFtZX0ubm9ybWFsaXplQ3VzdG9tQ29tbWFuZFBheWxvYWRBcmd1bWVudHMoJHtzaWduYXR1cmUucGF5bG9hZEFyZ3VtZW50c30pLFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICByZXNvdXJjZVBhdGg6ICR7Y2xhc3NOYW1lfS5yZXNvdXJjZVBhdGgoKVxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH0pKVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW5zdGFuY2VUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfWBcbiAgICAgIGNvbnN0IHRhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfUNyZWF0ZUF0dHJpYnV0ZXNgXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAudHlwZSA9PSBcImhhc01hbnlcIikge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgbG9hZGVkICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge0FycmF5PCR7dGFyZ2V0SW5zdGFuY2VUeXBlfT59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9TG9hZGVkKCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWRlZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTwke3RhcmdldEluc3RhbmNlVHlwZX0+Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZCgpIH1cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGx9IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZGVkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBCdWlsZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9fSBbYXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9fSAtIEJ1aWx0IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KGF0dHJpYnV0ZXMgPSB7fSkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmJ1aWxkKGF0dHJpYnV0ZXMpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyBsb2FkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zIG9yIGxvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbD59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1PckxvYWQoKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkub3JMb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBTZXRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0obW9kZWwpIHsgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLnNldExvYWRlZChtb2RlbCkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IHske2NsYXNzTmFtZX19XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgJHtjbGFzc05hbWV9XFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBpbmRleCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT59IGdlbmVyYXRlZEZpbGVzIC0gR2VuZXJhdGVkIG1vZGVsIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEluZGV4IGZpbGUgY29udGVudCB0aGF0IGltcG9ydHMgYW5kIHJlLWV4cG9ydHMgYWxsIG1vZGVscy5cbiAgICovXG4gIGJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcykge1xuICAgIGxldCBjb250ZW50ID0gZ2VuZXJhdGVkRmlsZUJhbm5lcihGUk9OVEVORF9NT0RFTFNfUkVHRU5FUkFURV9DT01NQU5EKVxuXG4gICAgZm9yIChjb25zdCB7Y2xhc3NOYW1lLCBmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCB7ZGVmYXVsdCBhcyAke2NsYXNzTmFtZX19IGZyb20gXCIuLyR7ZmlsZU5hbWV9XCJcXG5gXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHNldHVwIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2V0dXAgZmlsZSBjb250ZW50IHdpdGggc2lkZS1lZmZlY3QgaW1wb3J0cyBmb3IgbW9kZWwgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgYnVpbGRTZXR1cEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBnZW5lcmF0ZWRGaWxlQmFubmVyKEZST05URU5EX01PREVMU19SRUdFTkVSQVRFX0NPTU1BTkQpXG5cbiAgICBmb3IgKGNvbnN0IHtmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGltcG9ydCBcIi4vJHtmaWxlTmFtZX1cIlxcbmBcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUgYXR0cmlidXRlcyB0eXBlZGVmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtBcnJheTx7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgd3JpdGVKc0RvY1R5cGU6IHN0cmluZ30+fSBhcmdzLmF0dHJpYnV0ZXMgLSBHZW5lcmF0ZWQgcmVhZCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVzVHlwZU5hbWUgLSBHZW5lcmF0ZWQgcmVhZCBhdHRyaWJ1dGVzIHR5cGVkZWYgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2F0dHJpYnV0ZXM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmd9Pn0gYXJncy5uZXN0ZWRXcml0ZVR5cGVzIC0gTmVzdGVkIHdyaXRlIHR5cGVkZWZzLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSBhcmdzLnBlcm1pdHRlZFBhcmFtcyAtIFJlc291cmNlIHBlcm1pdHRlZCBwYXJhbXMgc3BlYy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50eXBlTmFtZSAtIFR5cGVkZWYgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBHZW5lcmF0ZWQgdHlwZWRlZiBzb3VyY2UuXG4gICAqL1xuICBhc3luYyB3cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWV9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlTGluZXMgPSBbXVxuXG4gICAgbGV0IG91dHB1dCA9IFwiLyoqXFxuXCJcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXNCeU5hbWUgPSBuZXcgTWFwKGF0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IFthdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlXSkpXG4gICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlc0J5S2V5ID0gbmV3IE1hcChuZXN0ZWRXcml0ZVR5cGVzLm1hcCgobmVzdGVkV3JpdGVUeXBlKSA9PiBbYCR7bmVzdGVkV3JpdGVUeXBlLnJlbGF0aW9uc2hpcE5hbWV9QXR0cmlidXRlc2AsIG5lc3RlZFdyaXRlVHlwZV0pKVxuICAgIGNvbnN0IGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZXJtaXR0ZWRQYXJhbXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZTogZW50cnksIGF0dHJpYnV0ZXNCeU5hbWUsIG1vZGVsQ2xhc3N9KVxuXG4gICAgICAgIGlmIChlbWl0dGVkQXR0cmlidXRlTmFtZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlTmFtZSlcblxuICAgICAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGVzQnlOYW1lLmdldChhdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXR0cmlidXRlTGluZXMucHVzaChgICogQHByb3BlcnR5IHske3R5cGV9fSBbJHthdHRyaWJ1dGVOYW1lfV0gLSBQZXJtaXR0ZWQgJHthdHRyaWJ1dGVOYW1lfSB2YWx1ZS5cXG5gKVxuICAgICAgfSBlbHNlIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlID0gbmVzdGVkV3JpdGVUeXBlc0J5S2V5LmdldChrZXkpXG4gICAgICAgICAgY29uc3QgdHlwZSA9IG5lc3RlZFdyaXRlVHlwZSA/IGBBcnJheTwke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX0+YCA6IFwiQXJyYXk8b2JqZWN0PlwiXG5cbiAgICAgICAgICBhdHRyaWJ1dGVMaW5lcy5wdXNoKGAgKiBAcHJvcGVydHkgeyR7dHlwZX19IFske2tleX1dIC0gUGVybWl0dGVkIG5lc3RlZCAke2tleX0gdmFsdWVzLlxcbmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gYCAqIEF0dHJpYnV0ZXMgYWNjZXB0ZWQgYnkgJHt0eXBlTmFtZX0uXFxuYFxuICAgIGlmIChhdHRyaWJ1dGVMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIG91dHB1dCArPSBgICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gJHt0eXBlTmFtZX1cXG5gXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHt0eXBlTmFtZX1cXG5gXG4gICAgICBvdXRwdXQgKz0gYXR0cmlidXRlTGluZXMuam9pbihcIlwiKVxuICAgIH1cbiAgICBvdXRwdXQgKz0gXCIgKi9cXG5cIlxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgd3JpdGUgYXR0cmlidXRlIHR5cGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZToge2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHdyaXRlSnNEb2NUeXBlOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXNUeXBlTmFtZTogc3RyaW5nLCByZXNvdXJjZUNsYXNzOiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEpTRG9jIHR5cGUgZm9yIHRoZSBwZXJtaXR0ZWQgd3JpdGUgZmllbGQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7YXR0cmlidXRlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3Qgc2V0dGVyUGFyYW1ldGVyVHlwZSA9IGF3YWl0IHRoaXMuZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVNldHRlclBhcmFtZXRlclR5cGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgaWYgKHNldHRlclBhcmFtZXRlclR5cGUpIHJldHVybiBgJHtzZXR0ZXJQYXJhbWV0ZXJUeXBlfSB8IG51bGxgXG5cbiAgICBpZiAoIWF0dHJpYnV0ZSkgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcblxuICAgIGlmIChhdHRyaWJ1dGUuanNEb2NUeXBlLnRyaW0oKSA9PT0gXCJudWxsXCIpIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG5cbiAgICBpZiAoYXR0cmlidXRlLndyaXRlSnNEb2NUeXBlICE9PSBhdHRyaWJ1dGUuanNEb2NUeXBlKSByZXR1cm4gYXR0cmlidXRlLndyaXRlSnNEb2NUeXBlXG5cbiAgICByZXR1cm4gYCR7YXR0cmlidXRlc1R5cGVOYW1lfVske0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX1dIHwgbnVsbGBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIHdyaXRlIGF0dHJpYnV0ZSBzZXR0ZXIgcGFyYW1ldGVyIHR5cGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gU2V0dGVyIHZhbHVlIHBhcmFtZXRlciB0eXBlIHdoZW4gaXQgaXMgdXNlZnVsIGZvciBnZW5lcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVNldHRlclBhcmFtZXRlclR5cGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzPy5uYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlTmFtZSl9QXR0cmlidXRlYFxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZSh7XG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGFyYW1ldGVySW5kZXg6IDEsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IHJlc291cmNlQ2xhc3MubmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXBhcmFtZXRlclR5cGUpIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMuaXNCcm9hZEdlbmVyYXRlZFR5cGUocGFyYW1ldGVyVHlwZSkpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgYnJvYWQgZ2VuZXJhdGVkIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBKU0RvYyB0eXBlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB0eXBlIGlzIHRvbyBicm9hZCB0byBpbXByb3ZlIGdlbmVyYXRlZCB3cml0ZSB0eXBpbmcuXG4gICAqL1xuICBpc0Jyb2FkR2VuZXJhdGVkVHlwZShqc0RvY1R5cGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IGpzRG9jVHlwZS50cmltKClcblxuICAgIHJldHVybiBub3JtYWxpemVkVHlwZSA9PT0gXCI/XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcImFueVwiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJvYmplY3RcIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwidW5rbm93blwiXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwZXJtaXR0ZWQgd3JpdGUgYXR0cmlidXRlIHRvIHRoZSBnZW5lcmF0ZWQgZnJvbnRlbmQgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgYXR0cmlidXRlc0J5TmFtZTogTWFwPHN0cmluZywge2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGcm9udGVuZCBhdHRyaWJ1dGUgbmFtZSB1c2VkIGJ5IGdlbmVyYXRlZCBhY2Nlc3NvcnMuXG4gICAqL1xuICBmcm9udGVuZFdyaXRlQXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZSwgYXR0cmlidXRlc0J5TmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoYXR0cmlidXRlc0J5TmFtZS5oYXMoYXR0cmlidXRlTmFtZSkpIHJldHVybiBhdHRyaWJ1dGVOYW1lXG5cbiAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBpZiAocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lICYmIGF0dHJpYnV0ZXNCeU5hbWUuaGFzKHJlc29sdmVkQXR0cmlidXRlTmFtZSkpIHJldHVybiByZXNvbHZlZEF0dHJpYnV0ZU5hbWVcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlTmFtZSwgdHJ1ZSkudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IG1hdGNoaW5nQXR0cmlidXRlTmFtZSA9IEFycmF5LmZyb20oYXR0cmlidXRlc0J5TmFtZS5rZXlzKCkpLmZpbmQoKGNhbmRpZGF0ZU5hbWUpID0+IGNhbmRpZGF0ZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9ybWFsaXplZEF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAobWF0Y2hpbmdBdHRyaWJ1dGVOYW1lKSByZXR1cm4gbWF0Y2hpbmdBdHRyaWJ1dGVOYW1lXG5cbiAgICAvLyBXcml0ZS1vbmx5IHZpcnR1YWwgcGFyYW1zIGFyZSB2YWxpZCBwZXJtaXR0ZWQgcGFyYW1zIGV2ZW4gd2hlbiB0aGV5IGhhdmUgbm8gcmVhZCBhdHRyaWJ1dGUuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5lc3RlZCB3cml0ZSB0eXBlcyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSBhcmdzLnBlcm1pdHRlZFBhcmFtcyAtIENvbWJpbmVkIHBlcm1pdHRlZCBwYXJhbXMgc3BlY3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2F1dG9sb2FkOiBib29sZWFuLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHRhcmdldENsYXNzTmFtZTogc3RyaW5nLCB0YXJnZXRGaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifT59IGFyZ3MucmVsYXRpb25zaGlwcyAtIEdlbmVyYXRlZCByZWxhdGlvbnNoaXBzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e2F0dHJpYnV0ZXM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgdHlwZWRlZnMuXG4gICAqL1xuICBuZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zLCByZWxhdGlvbnNoaXBzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNCeU5hbWUgPSBuZXcgTWFwKHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IFtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwXSkpXG4gICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlc0J5TmFtZSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZXJtaXR0ZWRQYXJhbXMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIGNvbnRpbnVlXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBpZiAoIWtleS5lbmRzV2l0aChcIkF0dHJpYnV0ZXNcIikpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgPSBrZXkuc2xpY2UoMCwgLVwiQXR0cmlidXRlc1wiLmxlbmd0aClcbiAgICAgICAgY29uc3QgbmVzdGVkU3BlYyA9IGVudHJ5W2tleV1cbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc0J5TmFtZS5nZXQocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgICAgbGV0IHRhcmdldE1vZGVsQ2xhc3NcblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB0YXJnZXRNb2RlbENsYXNzID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUuaGFzKHJlbGF0aW9uc2hpcE5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUuc2V0KHJlbGF0aW9uc2hpcE5hbWUsIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLm5lc3RlZFdyaXRlQXR0cmlidXRlc0ZvclNwZWMoe25lc3RlZFNwZWMsIHRhcmdldE1vZGVsQ2xhc3N9KSxcbiAgICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICAgIHR5cGVOYW1lOiBgJHtjbGFzc05hbWV9JHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcE5hbWUpfU5lc3RlZEF0dHJpYnV0ZXNgXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmVzdGVkV3JpdGVUeXBlc0J5TmFtZS52YWx1ZXMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5lc3RlZCB3cml0ZSBhdHRyaWJ1dGVzIGZvciBzcGVjLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+PiB8IG9iamVjdCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MubmVzdGVkU3BlYyAtIE5lc3RlZCBwZXJtaXQgc3BlYy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MudGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBiYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IC0gTmVzdGVkIHdyaXRlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXNGb3JTcGVjKHtuZXN0ZWRTcGVjLCB0YXJnZXRNb2RlbENsYXNzfSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuZXN0ZWRTcGVjKSkgcmV0dXJuIFtdXG5cbiAgICByZXR1cm4gbmVzdGVkU3BlYy5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikubWFwKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB8fCBhdHRyaWJ1dGVOYW1lXG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWU6IHJlc29sdmVkQXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzc30pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHJlc29sdmVkQXR0cmlidXRlTmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlQ29uZmlnID8gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZFdyaXRlQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWd9KSA6IFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVybWl0dGVkIHBhcmFtcyBmb3IgZ2VuZXJhdG9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gcmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwifSBhY3Rpb24gLSBXcml0ZSBhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY30gLSBQZXJtaXR0ZWQgcGFyYW1zIHNwZWMuXG4gICAqL1xuICBwZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcywgYWN0aW9uKSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gW11cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gKi8gKHthdHRyaWJ1dGVzOiBbXX0pXG4gICAgICB9KVxuICAgICAgY29uc3Qgc3BlYyA9IGluc3RhbmNlLnBlcm1pdHRlZFBhcmFtcyh7YWN0aW9uLCBhYmlsaXR5OiB1bmRlZmluZWQsIGxvY2Fsczoge30sIHBhcmFtczoge319KVxuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnZva2UgJHtyZXNvdXJjZUNsYXNzLm5hbWV9LnBlcm1pdHRlZFBhcmFtcygpIHdoaWxlIGdlbmVyYXRpbmcgZnJvbnRlbmQgbW9kZWwgd3JpdGUgdHlwZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGEgYmFja2VuZCByZXNvdXJjZSdzIGBwZXJtaXR0ZWRQYXJhbXMoKWAgaW5zdGFuY2UgbWV0aG9kIGF0XG4gICAqIGdlbmVyYXRpb24gdGltZSBhbmQgZXh0cmFjdHMgdGhlIHJlbGF0aW9uc2hpcCBuYW1lcyB0aGF0IGFjY2VwdFxuICAgKiBuZXN0ZWQgd3JpdGVzIChge2Zvb0F0dHJpYnV0ZXM6IFsuLi5dfWAgZW50cmllcykuIFRoZSBnZW5lcmF0b3JcbiAgICogZW1pdHMgdGhvc2UgbmFtZXMgaW50byB0aGUgZnJvbnRlbmQgbW9kZWwncyBgcmVzb3VyY2VDb25maWcoKWAgc29cbiAgICogdGhlIGNsaWVudCBgc2F2ZSgpYCB3YWxrZXIga25vd3Mgd2hpY2ggcmVsYXRpb25zaGlwcyB0byBzaGlwLlxuICAgKlxuICAgKiBDb25zdHJ1Y3RlZCB3aXRoIG5vIGNvbnRyb2xsZXIvYWJpbGl0eSBzbyByZXNvdXJjZSBvdmVycmlkZXMgbXVzdFxuICAgKiBzdXBwb3J0IGJlaW5nIGNhbGxlZCB3aXRob3V0IGEgcmVxdWVzdCBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gcmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gUmVsYXRpb25zaGlwIG5hbWVzIHRoYXQgYWNjZXB0IG5lc3RlZCB3cml0ZXMgKGVtcHR5IHdoZW4gbm9uZSkuXG4gICAqL1xuICBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzKSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gW11cblxuICAgIGxldCBzcGVjXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpXG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHJlc291cmNlQ2xhc3Moe1xuICAgICAgICBhYmlsaXR5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHQ6IHt9LFxuICAgICAgICBsb2NhbHM6IHt9LFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICBtb2RlbE5hbWU6IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgIHBhcmFtczoge30sXG4gICAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259ICovICh7YXR0cmlidXRlczogW119KVxuICAgICAgfSlcbiAgICAgIHNwZWMgPSBpbnN0YW5jZS5wZXJtaXR0ZWRQYXJhbXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnZva2UgJHtyZXNvdXJjZUNsYXNzLm5hbWV9LnBlcm1pdHRlZFBhcmFtcygpIHdoaWxlIGdlbmVyYXRpbmcgZnJvbnRlbmQgbW9kZWxzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3BlYykpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogUmVsYXRpb25zaGlwIG5hbWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNwZWMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgaWYgKCFrZXkuZW5kc1dpdGgoXCJBdHRyaWJ1dGVzXCIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCBuYW1lID0ga2V5LnNsaWNlKDAsIC1cIkF0dHJpYnV0ZXNcIi5sZW5ndGgpXG4gICAgICAgIGlmIChuYW1lKSByZWxhdGlvbnNoaXBOYW1lcy5wdXNoKG5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcE5hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgYXJyYXkgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy52YWx1ZXMgLSBTdHJpbmcgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiBbXFxuYFxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9XSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgY29tbWFuZHMgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIENvbW1hbmQga2V5LXZhbHVlcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIGFycmF5IHByb3BlcnR5LiBBbHdheXMgZW1pdHNcbiAgICogICB0aGUgY2FtZWxDYXNlIG1ldGhvZC1uYW1lIGFycmF5IGZvcm0gKGBtZW1iZXJDb21tYW5kczogW1widXBkYXRlQWNjZXNzXCJdYClcbiAgICogICBzbyB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBtYXRjaGVzIHRoZSBjYW5vbmljYWxcbiAgICogICBgRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnLntjb2xsZWN0aW9uLG1lbWJlcn1Db21tYW5kczogc3RyaW5nW11gXG4gICAqICAgc2hhcGUuIFRoZSBydW50aW1lIGRlcml2ZXMgdGhlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBjYW1lbENhc2VcbiAgICogICBtZXRob2QgbmFtZTsgY29uc3VtZXJzIG5ldmVyIG5lZWQgdG8gd3JpdGUgb3V0XG4gICAqICAgYHt1cGRhdGVBY2Nlc3M6IFwidXBkYXRlLWFjY2Vzc1wifWAgYnkgaGFuZC5cbiAgICovXG4gIGZvcm1hdHRlZENvbW1hbmRzUHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkQXJyYXlQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgb2JqZWN0IHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZvcm1hdHRpbmcgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW5kZW50IC0gQmFzZSBpbmRlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJvcGVydHlOYW1lIC0gT2JqZWN0IHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXJncy52YWx1ZXMgLSBPYmplY3Qga2V5LXZhbHVlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbYXJncy5maWx0ZXJEZWZhdWx0VmFsdWVzXSAtIERlZmF1bHQgdmFsdWVzIHRvIG9taXQgZnJvbSBvdXRwdXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBvYmplY3QgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7ZmlsdGVyRGVmYXVsdFZhbHVlcywgaW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICBsZXQgb3V0cHV0ID0gYCR7aW5kZW50fSR7cHJvcGVydHlOYW1lfToge1xcbmBcblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlcykpIHtcbiAgICAgIGlmIChmaWx0ZXJEZWZhdWx0VmFsdWVzICYmIGZpbHRlckRlZmF1bHRWYWx1ZXNbb2JqZWN0S2V5XSA9PT0gdmFsdWVzW29iamVjdEtleV0pIGNvbnRpbnVlXG5cbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke29iamVjdEtleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzW29iamVjdEtleV0pfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH19LFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nLCB3cml0ZUpzRG9jVHlwZTogc3RyaW5nfT4+fSAtIEF0dHJpYnV0ZSBkZWZpbml0aW9ucy5cbiAgICovXG4gIGFzeW5jIGF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBtb2RlbENvbmZpZy5hdHRyaWJ1dGVzXG5cbiAgICAvLyBBdXRvLWRlcml2ZSBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgY29sdW1ucyB3aGVuIG5vdCBleHBsaWNpdGx5IGRlZmluZWRcbiAgICBpZiAoKCFhdHRyaWJ1dGVzIHx8IChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpICYmIGF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSkgJiYgbW9kZWxDbGFzcykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1ucygpXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCksIHRydWUpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9ucyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGVmaW5pdGlvbiBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAqL1xuICAgICAgICBsZXQgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IG51bGxcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU5hbWVcblxuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZURlZmluaXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVEZWZpbml0aW9uXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlRGVmaW5pdGlvbiAmJiB0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9ICovIChhdHRyaWJ1dGVEZWZpbml0aW9uKVxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPSBcInN0cmluZ1wiIHx8IGF0dHJpYnV0ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIGFycmF5IGVudHJpZXMgdG8gYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBuYW1lLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlRGVmaW5pdGlvbil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IGF3YWl0IHRoaXMucmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe1xuICAgICAgICAgIGF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIG1vZGVsQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAgICBqc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KSxcbiAgICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIHdyaXRlSnNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmlidXRlRGVmaW5pdGlvbnNcbiAgICB9XG5cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgdHlwZW9mIGF0dHJpYnV0ZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ2F0dHJpYnV0ZXMnIGFzIGFycmF5IG9yIG9iamVjdCBidXQgZ290OiAke2F0dHJpYnV0ZXN9YClcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV1cbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgPSBhdHRyaWJ1dGVDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9ICovIChhdHRyaWJ1dGVDb25maWcpXG4gICAgICAgIDogbnVsbFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEF0dHJpYnV0ZUNvbmZpZyA9IGF3YWl0IHRoaXMucmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgfSlcbiAgICAgIGNvbnN0IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckdlbmVyYXRlZEF0dHJpYnV0ZSh7XG4gICAgICAgIGF0dHJpYnV0ZUNvbmZpZzogbm9ybWFsaXplZEF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgbW9kZWxDbGFzc1xuICAgICAgfSlcblxuICAgICAgYXR0cmlidXRlRGVmaW5pdGlvbnMucHVzaCh7XG4gICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnOiBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30pLFxuICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICB3cml0ZUpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZFdyaXRlQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWc6IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBnZW5lcmF0ZWQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVDb25maWc6IEZyb250ZW5kQXR0cmlidXRlQ29uZmlnLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gLSBBdHRyaWJ1dGUgY29uZmlnIHVzZWQgZm9yIGdlbmVyYXRlZCBKU0RvYy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuICAgIGlmICh0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzTnVsbGFiaWxpdHkoYXR0cmlidXRlQ29uZmlnKSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuXG4gICAgcmV0dXJuIHsuLi5hdHRyaWJ1dGVDb25maWcsIG51bGw6IGZhbHNlfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGlzIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUlzTW9kZWxQcmltYXJ5S2V5KHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcblxuICAgIGlmICh0eXBlb2YgcHJpbWFyeUtleSAhPSBcInN0cmluZ1wiIHx8IHByaW1hcnlLZXkubGVuZ3RoIDwgMSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IHByaW1hcnlLZXkpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShwcmltYXJ5S2V5KSA9PT0gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwcmltYXJ5IGtleSBmcm9tIGV4cGxpY2l0IHJlc291cmNlIGNvbmZpZyBvciB0aGUgYmFja2VuZCBtb2RlbC5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZXM6IEFycmF5PHN0cmluZz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgbW9kZWxDb25maWc6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259fSBhcmdzIC0gUHJpbWFyeSBrZXkgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yUmVzb3VyY2Uoe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pIHtcbiAgICBpZiAobW9kZWxDb25maWcucHJpbWFyeUtleSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVkQ29uZmlndXJlZFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWVzLCBwcmltYXJ5S2V5OiBtb2RlbENvbmZpZy5wcmltYXJ5S2V5fSlcbiAgICB9XG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBcImlkXCJcblxuICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yTW9kZWxDbGFzcyh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3N9KVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZnJvbnRlbmQtbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBwcmltYXJ5S2V5OiBzdHJpbmd9fSBhcmdzIC0gQ29uZmlndXJlZCBwcmltYXJ5IGtleSBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIENvbmZpZ3VyZWQgcHJpbWFyeSBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZWRDb25maWd1cmVkUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZXMsIHByaW1hcnlLZXl9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKHByaW1hcnlLZXkpKSByZXR1cm4gcHJpbWFyeUtleVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWd1cmVkIGZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5IFwiJHtwcmltYXJ5S2V5fVwiIGlzIG5vdCBhIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYmFja2VuZCBwcmltYXJ5IGtleSB0byBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgYXR0cmlidXRlIG5hbWVzLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFByaW1hcnkga2V5IHJlc29sdXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IEFycmF5PHN0cmluZz59IC0gRnJvbnRlbmQtbW9kZWwgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUHJpbWFyeUtleUZvck1vZGVsQ2xhc3Moe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzfSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHByaW1hcnlLZXkgPT09IFwiaWRcIikgcmV0dXJuIFwiaWRcIlxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUtleSkpIHtcbiAgICAgIHJldHVybiBwcmltYXJ5S2V5Lm1hcCgoY29sdW1uTmFtZSkgPT4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWVzLCBjb2x1bW5OYW1lLCBtb2RlbENsYXNzfSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lcywgY29sdW1uTmFtZTogcHJpbWFyeUtleSwgbW9kZWxDbGFzc30pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIGJhY2tlbmQgcHJpbWFyeSBrZXkgY29sdW1uIHRvIGEgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgY29sdW1uTmFtZTogc3RyaW5nLCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gUHJpbWFyeSBrZXkgYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5QXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZXMsIGNvbHVtbk5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSByZXR1cm4gY29sdW1uTmFtZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmIChhdHRyaWJ1dGVOYW1lICYmIGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbENsYXNzLm5hbWV9LnByaW1hcnlLZXkoKSBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZyb20gZXhwbGljaXQgbWV0YWRhdGEsIHJlc291cmNlIG1ldGhvZHMsIG1vZGVsIGNvbHVtbnMsIHRyYW5zbGF0ZWQgY29sdW1ucywgb3IgbW9kZWwgYWNjZXNzb3IgSlNEb2MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSBhcmdzLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgLSBSZXNvdXJjZS1wcm92aWRlZCBhdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZz59IC0gUmVzb2x2ZWQgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVkRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcoe2F0dHJpYnV0ZU5hbWUsIGNsYXNzTmFtZSwgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZywgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBpbmZlcnJlZFJlc291cmNlQ29uZmlnID0gYXdhaXQgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclJlc291cmNlQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZENvbHVtbkNvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yVHJhbnNsYXRlZEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRNb2RlbEFjY2Vzc29yQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZyB8fCBpbmZlcnJlZFRyYW5zbGF0ZWRDb25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiBhd2FpdCB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBY2Nlc3Nvcih7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnIHx8IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZyB8fCBpbmZlcnJlZE1vZGVsQWNjZXNzb3JDb25maWdcblxuICAgIGlmIChjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnICYmIHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNUeXBlKGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4gaW5mZXJyZWRDb25maWdcbiAgICAgICAgPyB7Li4uaW5mZXJyZWRDb25maWcsIC4uLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWd9XG4gICAgICAgIDogY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ1xuICAgIH1cblxuICAgIGlmIChpbmZlcnJlZENvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWdcbiAgICAgICAgPyB7Li4uaW5mZXJyZWRDb25maWcsIC4uLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWd9XG4gICAgICAgIDogaW5mZXJyZWRDb25maWdcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbmZlciBKU0RvYyB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgJyR7Y2xhc3NOYW1lfSMke2F0dHJpYnV0ZU5hbWV9Jy4gQWRkIGEgYmFja2VuZCBtb2RlbCBjb2x1bW4sIHRyYW5zbGF0aW9uIHRhYmxlIGNvbHVtbiwgZXhwbGljaXQgcmVzb3VyY2UgbWV0YWRhdGEsIG9yIGEgQHJldHVybnMgSlNEb2MgdHlwZSBvbiAke3Jlc291cmNlQ2xhc3M/Lm5hbWUgfHwgXCJ0aGUgcmVzb3VyY2VcIn0uJHthdHRyaWJ1dGVOYW1lfUF0dHJpYnV0ZSgpLmApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGhhcyB0eXBlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29uZmlnIGRlY2xhcmVzIGEgdHlwZSBzb3VyY2UuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc1R5cGUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZykgPT0gXCJzdHJpbmdcIlxuICAgICAgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZz8uanNEb2NUeXBlID09IFwic3RyaW5nXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgaGFzIG51bGxhYmlsaXR5LlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29uZmlnIGRlY2xhcmVzIG51bGxhYmlsaXR5LlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNOdWxsYWJpbGl0eShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJpYnV0ZUNvbmZpZywgXCJudWxsXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCA9PSBcImZ1bmN0aW9uXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5hdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIHtcbiAgICBpZiAoYXR0cmlidXRlQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlID09IFwic3RyaW5nXCIgJiYgYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZVxuICAgIH1cblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDYW5CZU51bGwoYXR0cmlidXRlQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIGpzRG9jVHlwZVxuICAgIH1cblxuICAgIHJldHVybiBgJHtqc0RvY1R5cGV9IHwgbnVsbGBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5hdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKU0RvYyB0eXBlIGFjY2VwdGVkIGJ5IGNyZWF0ZS91cGRhdGUgcGF5bG9hZHMuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZFdyaXRlQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWd9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZyAmJiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZSA9PSBcInN0cmluZ1wiICYmIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGUubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGVcbiAgICB9XG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDYW5CZU51bGwoYXR0cmlidXRlQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIGpzRG9jVHlwZVxuICAgIH1cblxuICAgIHJldHVybiBgJHtqc0RvY1R5cGV9IHwgbnVsbGBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUgYmFzZSB0eXBlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9uLW51bGxhYmxlIEpTRG9jIHR5cGUgYWNjZXB0ZWQgYnkgY3JlYXRlL3VwZGF0ZSBwYXlsb2Fkcy5cbiAgICovXG4gIGpzRG9jVHlwZUZvckZyb250ZW5kV3JpdGVBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBjb25zdCByZWFkVHlwZSA9IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlSXNUZW1wb3JhbChhdHRyaWJ1dGVDb25maWcpKSByZXR1cm4gcmVhZFR5cGVcblxuICAgIHJldHVybiBgJHtyZWFkVHlwZX0gfCBzdHJpbmdgXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgdHlwZSBmb3IgZnJvbnRlbmQgYXR0cmlidXRlIGJhc2UgdHlwZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vbi1udWxsYWJsZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJib29sZWFuXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJqc29uXCIgfHwgdHlwZSA9PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVwiXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIFtcImJsb2JcIiwgXCJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwidGV4dFwiLCBcImxvbmd0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcInRpbnl0ZXh0XCIsIFwidXVpZFwiLCBcImNoYXJhY3RlciB2YXJ5aW5nXCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJiaXRcIiwgXCJiaWdpbnRcIiwgXCJkZWNpbWFsXCIsIFwiZG91YmxlXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcImZsb2F0XCIsIFwiaW50XCIsIFwiaW50ZWdlclwiLCBcIm51bWVyaWNcIiwgXCJyZWFsXCIsIFwic21hbGxpbnRcIiwgXCJ0aW55aW50XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIlxuICAgIH0gZWxzZSBpZiAodGhpcy5mcm9udGVuZEF0dHJpYnV0ZVR5cGVJc1RlbXBvcmFsKGF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBcIkRhdGVcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSB0eXBlIGlzIHRlbXBvcmFsLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSByZXByZXNlbnRzIGEgZGF0ZS90aW1lIHZhbHVlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVUeXBlSXNUZW1wb3JhbChhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIHJldHVybiB0eXBlID8gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCIsIFwidGltZXN0YW1wdHpcIl0uaW5jbHVkZXModHlwZSkgOiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNhbiBiZSBudWxsLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBhbGxvd3MgbnVsbCB2YWx1ZXMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsKCkgPT09IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLm51bGwgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSB0eXBlIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIE5vcm1hbGl6ZWQgY29sdW1uIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldFR5cGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlKCkpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZVZhbHVlID0gYXR0cmlidXRlQ29uZmlnLnR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmNvbHVtblR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLnNxbFR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmRhdGFUeXBlXG5cbiAgICBpZiAodHlwZW9mIHR5cGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciByZXNvdXJjZSBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsPn0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gcmVzb3VyY2UgbWV0aG9kIEpTRG9jLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JSZXNvdXJjZUF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYCR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGVgXG4gICAgY29uc3Qgb3duZXJDbGFzc05hbWUgPSB0aGlzLm1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lLCB0YXJnZXRDbGFzczogcmVzb3VyY2VDbGFzc30pXG5cbiAgICBpZiAoIW93bmVyQ2xhc3NOYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QganNEb2NUeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe1xuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogb3duZXJDbGFzc05hbWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZSA/IHtqc0RvY1R5cGU6IHRoaXMudW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSl9IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgdHJhbnNsYXRlZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRyYW5zbGF0ZWQgYXR0cmlidXRlIGNvbHVtbnMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclRyYW5zbGF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gbnVsbFxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUlzVHJhbnNsYXRlZCh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgVHJhbnNsYXRpb25DbGFzcyA9IG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25DbGFzcygpXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IFRyYW5zbGF0aW9uQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpKSByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW4gPyB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yQ29sdW1uKHtjb2x1bW59KSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBpcyB0cmFuc2xhdGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgdHJhbnNsYXRlZC5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlSXNUcmFuc2xhdGVkKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmIChyZXNvdXJjZUNsYXNzKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGVkQXR0cmlidXRlcyA9IHJlc291cmNlQ2xhc3MudHJhbnNsYXRlZEF0dHJpYnV0ZXNcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNsYXRlZEF0dHJpYnV0ZXMpICYmIHRyYW5zbGF0ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1vZGVsQ2xhc3MuX3RyYW5zbGF0aW9uc1xuXG4gICAgcmV0dXJuIEJvb2xlYW4odHJhbnNsYXRpb25zICYmIHR5cGVvZiB0cmFuc2xhdGlvbnMgPT0gXCJvYmplY3RcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHJhbnNsYXRpb25zLCBhdHRyaWJ1dGVOYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGFjY2Vzc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsPn0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gbW9kZWwgYWNjZXNzb3IgSlNEb2MuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQWNjZXNzb3Ioe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgb3duZXJDbGFzc05hbWUgPSB0aGlzLm1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lOiBhdHRyaWJ1dGVOYW1lLCB0YXJnZXRDbGFzczogbW9kZWxDbGFzc30pXG5cbiAgICBpZiAoIW93bmVyQ2xhc3NOYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QganNEb2NUeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe1xuICAgICAgbWV0aG9kTmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogb3duZXJDbGFzc05hbWVcbiAgICB9KVxuXG4gICAgLy8gRnJvbnRlbmQgYXR0cmlidXRlcyBob2xkIHRoZSBzZXJpYWxpemVkIChyZXNvbHZlZCkgdmFsdWUsIHNvIGFuIGFzeW5jXG4gICAgLy8gYmFja2VuZCBhY2Nlc3NvciB0eXBlZCBgUHJvbWlzZTxudW1iZXI+YCBtdXN0IHN1cmZhY2UgYXMgYG51bWJlcmAg4oCUIHRoZVxuICAgIC8vIHNhbWUgdW53cmFwcGluZyB0aGUgcmVzb3VyY2UtbWV0aG9kIGluZmVyZW5jZSBwYXRoIGFwcGxpZXMuXG4gICAgcmV0dXJuIGpzRG9jVHlwZVxuICAgICAgPyB7anNEb2NUeXBlOiB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUF0dHJpYnV0ZUpzRG9jVHlwZSh0aGlzLnVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZX0pKX1cbiAgICAgIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEEgYmFja2VuZCBhY2Nlc3NvcidzIGBAcmV0dXJuc2AgY2FuIHJlZmVyZW5jZSB0eXBlcyB0aGF0IGV4aXN0IG9ubHkgb24gdGhlXG4gICAqIGJhY2tlbmQgKGUuZy4gYSBtb2RlbC1sb2NhbCBgQHR5cGVkZWYgQWdlbnRSdW5QbGFubmluZ0FydGlmYWN0YCkuIFRoZSBmcm9udGVuZFxuICAgKiBtb2RlbCBjYW4ndCByZXNvbHZlIHRob3NlLCBzbyBmYWxsIGJhY2sgdG8gYGFueWAgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYW5cbiAgICogdW5kZWZpbmVkIHR5cGUgbmFtZS4gVHlwZXMgYnVpbHQgb25seSBmcm9tIHByaW1pdGl2ZXMgYW5kIGtub3duIGdlbmVyaWNcbiAgICogYnVpbHRpbnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIFJlc29sdmVkIChQcm9taXNlLXVud3JhcHBlZCkgYXR0cmlidXRlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQSBmcm9udGVuZC1yZXNvbHZhYmxlIGF0dHJpYnV0ZSB0eXBlLlxuICAgKi9cbiAgZnJvbnRlbmRSZXNvbHZhYmxlQXR0cmlidXRlSnNEb2NUeXBlKGpzRG9jVHlwZSkge1xuICAgIGNvbnN0IHNhZmVUeXBlSWRlbnRpZmllcnMgPSB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZVR5cGVJZGVudGlmaWVycygpXG4gICAgY29uc3QgcmVmZXJlbmNlZElkZW50aWZpZXJzID0ganNEb2NUeXBlLm1hdGNoKC9bQS1aXVtBLVphLXowLTlfJF0qL2cpIHx8IFtdXG5cbiAgICBpZiAocmVmZXJlbmNlZElkZW50aWZpZXJzLnNvbWUoKGlkZW50aWZpZXIpID0+ICFzYWZlVHlwZUlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkpIHtcbiAgICAgIHJldHVybiBcImFueVwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIENhcGl0YWxpemVkIGlkZW50aWZpZXJzIGEgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGNhbiByZXNvbHZlIG9uIGl0cyBvd25cbiAgICogKHByaW1pdGl2ZXMgYXJlIGxvd2VyLWNhc2UgYW5kIG1hdGNoZWQgc2VwYXJhdGVseSksIHNvIG9ubHkgZnJhbWV3b3JrLW93bmVkXG4gICAqIGFuZCBidWlsdGluIGdlbmVyaWMgdHlwZXMgYXJlIGxpc3RlZC5cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIEZyb250ZW5kLXJlc29sdmFibGUgdHlwZSBpZGVudGlmaWVycy5cbiAgICovXG4gIGZyb250ZW5kUmVzb2x2YWJsZVR5cGVJZGVudGlmaWVycygpIHtcbiAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICBcIkFycmF5XCIsIFwiRGF0ZVwiLCBcIkV4Y2x1ZGVcIiwgXCJFeHRyYWN0XCIsIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCIsIFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIsXG4gICAgICBcIk1hcFwiLCBcIk5vbk51bGxhYmxlXCIsIFwiT21pdFwiLCBcIlBhcnRpYWxcIiwgXCJQaWNrXCIsIFwiUHJvbWlzZVwiLCBcIlJlYWRvbmx5XCIsIFwiUmVhZG9ubHlBcnJheVwiLCBcIlJlY29yZFwiLFxuICAgICAgXCJSZXF1aXJlZFwiLCBcIlJldHVyblR5cGVcIiwgXCJTZXRcIlxuICAgIF0pXG4gIH1cblxuICAvKipcbiAgICogUmV3cml0ZXMgYSBjdXN0b20tY29tbWFuZCBwYXJhbS9yZXR1cm4gSlNEb2MgdHlwZSBzbyBpdCByZXNvbHZlcyBpbiB0aGUgZ2VuZXJhdGVkXG4gICAqIGZyb250ZW5kIG1vZGVsOiBiYWNrZW5kIG1vZGVsIGltcG9ydHMgYXJlIG1hcHBlZCB0byBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWxcbiAgICogaW1wb3J0cywgYW5kIG90aGVyd2lzZSBub24tZnJvbnRlbmQtcmVzb2x2YWJsZSBpZGVudGlmaWVycyBiZWNvbWUgYGFueWAgaW4gcGxhY2VcbiAgICogc28gc2libGluZyBzY2FsYXIgZmllbGRzIGtlZXAgdGhlaXIgcmVhbCB0eXBlcy4gVGhlIHdvcmQgYm91bmRhcnkgYXZvaWRzIG1hdGNoaW5nXG4gICAqIHRoZSBjYXBpdGFsaXplZCBtaWRkbGUgb2YgYSBjYW1lbENhc2UgcHJvcGVydHkgbmFtZSAoZS5nLiBgYWRqdXN0ZWRUb3RhbENlbnRzYCkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGFyZ3MuZnJvbnRlbmRNb2RlbEZpbGVQYXRoIC0gR2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBSZXNvdXJjZUpzRG9jSW1wb3J0QWxpYXM+fSBhcmdzLmltcG9ydEFsaWFzZXMgLSBJbXBvcnQgYWxpYXNlcyB2aXNpYmxlIHRvIHRoZSBzb3VyY2UgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qc0RvY1R5cGUgLSBSZXNvbHZlZCAoUHJvbWlzZS11bndyYXBwZWQpIEpTRG9jIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gYXJncy5zb3VyY2VGaWxlIC0gU291cmNlIGZpbGUgdGhhdCBkZWNsYXJlZCB0aGUgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEEgZnJvbnRlbmQtcmVzb2x2YWJsZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAgZnJvbnRlbmRSZXNvbHZhYmxlQ29tbWFuZEpzRG9jVHlwZSh7ZnJvbnRlbmRNb2RlbEZpbGVQYXRoLCBpbXBvcnRBbGlhc2VzLCBqc0RvY1R5cGUsIHNvdXJjZUZpbGV9KSB7XG4gICAgY29uc3Qgc2FmZVR5cGVJZGVudGlmaWVycyA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKClcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IHByZXNlcnZlZEltcG9ydHMgPSBbXVxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhbiBpbXBvcnQgZXhwcmVzc2lvbiBiZWhpbmQgYSBsb3dlcmNhc2UgcGxhY2Vob2xkZXIgd2hpbGUgZ2VuZXJpY1xuICAgICAqIGlkZW50aWZpZXIgY2xlYW51cCBydW5zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbXBvcnRFeHByZXNzaW9uIC0gSW1wb3J0IGV4cHJlc3Npb24gdG8gcHJlc2VydmUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUGxhY2Vob2xkZXIgaW5zZXJ0ZWQgaW50byB0aGUgdHlwZSBzdHJpbmcuXG4gICAgICovXG4gICAgY29uc3QgcHJlc2VydmVJbXBvcnRFeHByZXNzaW9uID0gKGltcG9ydEV4cHJlc3Npb24pID0+IHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gYF9fdmVsb2Npb3VzX2ltcG9ydF9wbGFjZWhvbGRlcl8ke3ByZXNlcnZlZEltcG9ydHMubGVuZ3RofV9fYFxuXG4gICAgICBwcmVzZXJ2ZWRJbXBvcnRzLnB1c2goaW1wb3J0RXhwcmVzc2lvbilcblxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnROb0JhY2tlbmRMb2NhbENvbW1hbmRUeXBlRXhwcmVzc2lvbnMoanNEb2NUeXBlKVxuXG4gICAgY29uc3Qgd2l0aFJld3JpdHRlbklubGluZUltcG9ydHMgPSBqc0RvY1R5cGVcbiAgICAgIC8vIEEgdHlwZSB0aGF0IHJlYWNoZXMgaW50byBhIGJhY2tlbmQgc291cmNlIGZpbGUgdmlhIGBpbXBvcnQoXCIuLi5cIilgXG4gICAgICAvLyAob3B0aW9uYWxseSBgLk1lbWJlcmAgYW5kIGBbXWApIGlzIGZyb250ZW5kLXJlc29sdmFibGUgb25seSB3aGVuIGl0XG4gICAgICAvLyBwb2ludHMgYXQgYSBnZW5lcmF0ZWQgbW9kZWwgZmlsZTsgb3RoZXIgYmFja2VuZC1sb2NhbCBpbXBvcnRzIGNvbGxhcHNlXG4gICAgICAvLyB0byBgYW55YCBzbyBoZWxwZXIvc2VydmljZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGRvIG5vdCBsZWFrLlxuICAgICAgLnJlcGxhY2UoL2ltcG9ydFxcKFxccypbXCInXShbXlwiJ10qKVtcIiddXFxzKlxcKSgoPzpcXHMqXFwuXFxzKltBLVphLXpfJF1bXFx3JF0qKSopKCg/OlxccypcXFtcXHMqXFxdKSopL2csIChfbWF0Y2gsIHNwZWNpZmllciwgbWVtYmVyQ2hhaW4sIGFycmF5U3VmZml4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJld3JpdHRlblNwZWNpZmllciA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlSnNEb2NJbXBvcnRTcGVjaWZpZXIoe1xuICAgICAgICAgIGZyb250ZW5kTW9kZWxGaWxlUGF0aCxcbiAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgIHNwZWNpZmllclxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghcmV3cml0dGVuU3BlY2lmaWVyKSByZXR1cm4gXCJhbnlcIlxuXG4gICAgICAgIHJldHVybiBwcmVzZXJ2ZUltcG9ydEV4cHJlc3Npb24oYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHJld3JpdHRlblNwZWNpZmllcil9KSR7bWVtYmVyQ2hhaW4ucmVwbGFjZSgvXFxzKy9nLCBcIlwiKX0ke2FycmF5U3VmZml4LnJlcGxhY2UoL1xccysvZywgXCJcIil9YClcbiAgICAgIH0pXG5cbiAgICBsZXQgd2l0aFJld3JpdHRlbkFsaWFzZXMgPSB3aXRoUmV3cml0dGVuSW5saW5lSW1wb3J0c1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXNOYW1lLCBpbXBvcnRBbGlhc10gb2YgaW1wb3J0QWxpYXNlcykge1xuICAgICAgY29uc3QgcmV3cml0dGVuU3BlY2lmaWVyID0gdGhpcy5mcm9udGVuZFJlc29sdmFibGVKc0RvY0ltcG9ydFNwZWNpZmllcih7XG4gICAgICAgIGZyb250ZW5kTW9kZWxGaWxlUGF0aCxcbiAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgc3BlY2lmaWVyOiBpbXBvcnRBbGlhcy5zcGVjaWZpZXJcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmV3cml0dGVuU3BlY2lmaWVyKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBhbGlhc1JlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXGIke3RoaXMuZXNjYXBlUmVnRXhwKGFsaWFzTmFtZSl9XFxcXGJgLCBcImdcIilcblxuICAgICAgd2l0aFJld3JpdHRlbkFsaWFzZXMgPSB3aXRoUmV3cml0dGVuQWxpYXNlcy5yZXBsYWNlKGFsaWFzUmVnZXgsIHByZXNlcnZlSW1wb3J0RXhwcmVzc2lvbihgaW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkocmV3cml0dGVuU3BlY2lmaWVyKX0pLiR7aW1wb3J0QWxpYXMuaW1wb3J0ZWROYW1lfWApKVxuICAgIH1cblxuICAgIGNvbnN0IHNhbml0aXplZCA9IHdpdGhSZXdyaXR0ZW5BbGlhc2VzXG4gICAgICAvLyBSZW1haW5pbmcgY2FwaXRhbGl6ZWQgaWRlbnRpZmllcnMgYXJlIG1vZGVsIGNsYXNzZXMgb3Igb3RoZXJ3aXNlIG5vbi1yZXNvbHZhYmxlXG4gICAgICAvLyB0eXBlczsgZG93bmdyYWRlIGVhY2ggaW4gcGxhY2Ugc28gc2libGluZyBzY2FsYXIgZmllbGRzIGtlZXAgdGhlaXIgcmVhbCB0eXBlcy5cbiAgICAgIC5yZXBsYWNlKC9cXGJbQS1aXVtBLVphLXowLTlfJF0qL2csIChpZGVudGlmaWVyKSA9PiBzYWZlVHlwZUlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSA/IGlkZW50aWZpZXIgOiBcImFueVwiKVxuXG4gICAgcmV0dXJuIHByZXNlcnZlZEltcG9ydHMucmVkdWNlKFxuICAgICAgKHR5cGUsIGltcG9ydEV4cHJlc3Npb24sIGluZGV4KSA9PiB0eXBlLnJlcGxhY2VBbGwoYF9fdmVsb2Npb3VzX2ltcG9ydF9wbGFjZWhvbGRlcl8ke2luZGV4fV9fYCwgaW1wb3J0RXhwcmVzc2lvbiksXG4gICAgICBzYW5pdGl6ZWRcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmFpc2VzIHdoZW4gYSBjb21tYW5kIEpTRG9jIHR5cGUgcmVmZXJlbmNlcyBhIGJhY2tlbmQtbG9jYWwgaGVscGVyIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBDb21tYW5kIEpTRG9jIHR5cGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NlcnROb0JhY2tlbmRMb2NhbENvbW1hbmRUeXBlRXhwcmVzc2lvbnMoanNEb2NUeXBlKSB7XG4gICAgY29uc3QgbG9jYWxSZXR1cm5UeXBlTWF0Y2ggPSBqc0RvY1R5cGUubWF0Y2goL1xcYig/OkF3YWl0ZWRcXHMqPFxccyopP1JldHVyblR5cGVcXHMqPFxccyp0eXBlb2ZcXHMrW0EtWmEtel8kXVtcXHckXSpcXHMqPlxccyo+Py8pXG5cbiAgICBpZiAoIWxvY2FsUmV0dXJuVHlwZU1hdGNoKSByZXR1cm5cblxuICAgIHRocm93IG5ldyBFcnJvcihgQ3VzdG9tIGNvbW1hbmQgSlNEb2MgdHlwZSBjYW5ub3QgdXNlIGJhY2tlbmQtbG9jYWwgUmV0dXJuVHlwZSBleHByZXNzaW9ucyBpbiBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWxzOiAke2xvY2FsUmV0dXJuVHlwZU1hdGNoWzBdfS4gTW92ZSB0aGUgcGF5bG9hZCBzaGFwZSB0byBhIHNoYXJlZCB0eXBlZGVmIGFuZCByZXR1cm4gdGhhdCB0eXBlIGZyb20gdGhlIGNvbW1hbmQgbWV0aG9kLmApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCByZXNvbHZhYmxlIGpzIGRvYyBpbXBvcnQgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBhcmdzLmZyb250ZW5kTW9kZWxGaWxlUGF0aCAtIEdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gYXJncy5zb3VyY2VGaWxlIC0gU291cmNlIGZpbGUgdGhhdCBkZWNsYXJlZCB0aGUgSlNEb2MgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3BlY2lmaWVyIC0gU291cmNlLWZpbGUgaW1wb3J0IHNwZWNpZmllci5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmV3cml0dGVuIGZyb250ZW5kLW1vZGVsIGltcG9ydCBzcGVjaWZpZXIsIG9yIG51bGwgd2hlbiBiYWNrZW5kLWxvY2FsLlxuICAgKi9cbiAgZnJvbnRlbmRSZXNvbHZhYmxlSnNEb2NJbXBvcnRTcGVjaWZpZXIoe2Zyb250ZW5kTW9kZWxGaWxlUGF0aCwgc291cmNlRmlsZSwgc3BlY2lmaWVyfSkge1xuICAgIGlmICghc291cmNlRmlsZSB8fCAhZnJvbnRlbmRNb2RlbEZpbGVQYXRoKSByZXR1cm4gbnVsbFxuICAgIGlmICghc3BlY2lmaWVyLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFzcGVjaWZpZXIuc3RhcnRzV2l0aChcIi9cIikpIHJldHVybiBzcGVjaWZpZXJcblxuICAgIGNvbnN0IGltcG9ydGVkUGF0aCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoc291cmNlRmlsZSksIHNwZWNpZmllcilcbiAgICBjb25zdCBtb2RlbEltcG9ydFNwZWNpZmllciA9IHRoaXMuZnJvbnRlbmRNb2RlbEltcG9ydFNwZWNpZmllckZvckJhY2tlbmRNb2RlbFBhdGgoe1xuICAgICAgZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgaW1wb3J0ZWRQYXRoXG4gICAgfSlcblxuICAgIGlmIChtb2RlbEltcG9ydFNwZWNpZmllcikgcmV0dXJuIG1vZGVsSW1wb3J0U3BlY2lmaWVyXG5cbiAgICBpZiAodGhpcy5maWxlUGF0aElzV2l0aGluQW55RGlyZWN0b3J5KHtkaXJlY3RvcmllczogdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpLCBmaWxlUGF0aDogaW1wb3J0ZWRQYXRofSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVsYXRpdmVJbXBvcnRTcGVjaWZpZXIoe2Zyb21GaWxlOiBmcm9udGVuZE1vZGVsRmlsZVBhdGgsIHRvRmlsZTogaW1wb3J0ZWRQYXRofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGltcG9ydCBzcGVjaWZpZXIgZm9yIGJhY2tlbmQgbW9kZWwgcGF0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZyb250ZW5kTW9kZWxGaWxlUGF0aCAtIEdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmltcG9ydGVkUGF0aCAtIFNvdXJjZS1maWxlIGltcG9ydCBwYXRoIHJlc29sdmVkIGZyb20gSlNEb2MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBpbXBvcnQgc3BlY2lmaWVyLCBvciBudWxsIHdoZW4gdGhlIHBhdGggaXMgbm90IGEgcmVnaXN0ZXJlZCBtb2RlbCBmaWxlLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEltcG9ydFNwZWNpZmllckZvckJhY2tlbmRNb2RlbFBhdGgoe2Zyb250ZW5kTW9kZWxGaWxlUGF0aCwgaW1wb3J0ZWRQYXRofSkge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxzRGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZyb250ZW5kTW9kZWxGaWxlUGF0aClcbiAgICBjb25zdCBpbXBvcnRlZE1vZGVsUGF0aCA9IGltcG9ydGVkUGF0aC5lbmRzV2l0aChcIi5qc1wiKSA/IGltcG9ydGVkUGF0aCA6IGAke2ltcG9ydGVkUGF0aH0uanNgXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsRmlsZU5hbWUgb2YgdGhpcy5nZW5lcmF0ZWRGcm9udGVuZE1vZGVsRmlsZU5hbWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3Qgc291cmNlRGlyZWN0b3J5IG9mIHRoaXMuZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSkge1xuICAgICAgICBjb25zdCBtb2RlbHNEaXJlY3RvcnkgPSBwYXRoLmpvaW4oc291cmNlRGlyZWN0b3J5LCBcIm1vZGVsc1wiKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGVNb2RlbFBhdGggPSBwYXRoLmpvaW4obW9kZWxzRGlyZWN0b3J5LCBtb2RlbEZpbGVOYW1lKVxuXG4gICAgICAgIGlmIChwYXRoLnJlc29sdmUoY2FuZGlkYXRlTW9kZWxQYXRoKSAhPT0gcGF0aC5yZXNvbHZlKGltcG9ydGVkTW9kZWxQYXRoKSkgY29udGludWVcblxuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZUltcG9ydFNwZWNpZmllcih7XG4gICAgICAgICAgZnJvbUZpbGU6IGZyb250ZW5kTW9kZWxGaWxlUGF0aCxcbiAgICAgICAgICB0b0ZpbGU6IHBhdGguam9pbihmcm9udGVuZE1vZGVsc0RpcmVjdG9yeSwgbW9kZWxGaWxlTmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGZpbGUgbmFtZXMuXG4gICAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBGcm9udGVuZCBtb2RlbCBmaWxlbmFtZXMgdGhhdCB0aGlzIGdlbmVyYXRpb24gcnVuIGNhbiBlbWl0LlxuICAgKi9cbiAgZ2VuZXJhdGVkRnJvbnRlbmRNb2RlbEZpbGVOYW1lcygpIHtcbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZU1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVzb3VyY2VNb2RlbE5hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKVxuXG4gICAgICAgIGZpbGVOYW1lcy5hZGQoYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNsYXNzTmFtZSkpfS5qc2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVOYW1lc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVsYXRpdmUgaW1wb3J0IHNwZWNpZmllci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZyb21GaWxlIC0gU291cmNlIGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydCBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50b0ZpbGUgLSBGaWxlIGJlaW5nIGltcG9ydGVkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlbGF0aXZlIGltcG9ydCBzcGVjaWZpZXIuXG4gICAqL1xuICByZWxhdGl2ZUltcG9ydFNwZWNpZmllcih7ZnJvbUZpbGUsIHRvRmlsZX0pIHtcbiAgICBsZXQgcmVsYXRpdmVTcGVjaWZpZXIgPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmcm9tRmlsZSksIHRvRmlsZSkuc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpXG5cbiAgICBpZiAoIXJlbGF0aXZlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICByZWxhdGl2ZVNwZWNpZmllciA9IGAuLyR7cmVsYXRpdmVTcGVjaWZpZXJ9YFxuICAgIH1cblxuICAgIHJldHVybiByZWxhdGl2ZVNwZWNpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmlsZSBwYXRoIGlzIHdpdGhpbiBhbnkgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5kaXJlY3RvcmllcyAtIENhbmRpZGF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZpbGVQYXRoIC0gRmlsZSBwYXRoIHRvIHRlc3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGZpbGUgcGF0aCBpcyB1bmRlciBvbmUgY2FuZGlkYXRlIGRpcmVjdG9yeS5cbiAgICovXG4gIGZpbGVQYXRoSXNXaXRoaW5BbnlEaXJlY3Rvcnkoe2RpcmVjdG9yaWVzLCBmaWxlUGF0aH0pIHtcbiAgICByZXR1cm4gZGlyZWN0b3JpZXMuc29tZSgoZGlyZWN0b3J5KSA9PiB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpLCBwYXRoLnJlc29sdmUoZmlsZVBhdGgpKVxuXG4gICAgICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSBcIlwiIHx8ICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGVzIHRleHQgZm9yIHVzZSBpbnNpZGUgYSBSZWdFeHAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBSZWdFeHAtc2FmZSB2YWx1ZS5cbiAgICovXG4gIGVzY2FwZVJlZ0V4cCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIEpTRG9jIHBhcmFtIGJsb2NrLCBwYXJhbWV0ZXIgbGlzdCwgcGF5bG9hZC1hcmd1bWVudCBleHByZXNzaW9uLCBhbmRcbiAgICogcmV0dXJuIHR5cGUgZm9yIGEgY3VzdG9tIGNvbW1hbmQgbWV0aG9kLiBXaXRoIGRlY2xhcmVkIGBhcmdzYCBlYWNoIGJlY29tZXMgYVxuICAgKiBuYW1lZCwgdHlwZWQgcGFyYW1ldGVyIG1hcHBlZCBwb3NpdGlvbmFsbHkgaW50byB0aGUgY29tbWFuZCBwYXlsb2FkOyB3aXRob3V0XG4gICAqIHRoZW0gdGhlIG1ldGhvZCBzdGF5cyB2YXJpYWRpYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59IGFyZ3MuY29tbWFuZE1ldGFkYXRhIC0gUGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBDb21tYW5kIG1ldGhvZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7e3BhcmFtRG9jczogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmcsIHBheWxvYWRBcmd1bWVudHM6IHN0cmluZywgcmV0dXJuVHlwZTogc3RyaW5nfX0gLSBHZW5lcmF0aW9uIHBpZWNlcy5cbiAgICovXG4gIGN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGNvbW1hbmRNZXRhZGF0YVttZXRob2ROYW1lXSB8fCB7YXJnczogW10sIHJldHVyblR5cGU6IG51bGx9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGFkYXRhLnJldHVyblR5cGUgfHwgXCJSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWU+XCJcblxuICAgIGlmIChtZXRhZGF0YS5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYXJnLm5hbWUpXG4gICAgICAvLyBBIHNpbmdsZSBhcmdzIG9iamVjdCB3aG9zZSBldmVyeSBmaWVsZCBpcyBvcHRpb25hbCBhY2NlcHRzIGB7fWAsIHNvIGRlZmF1bHRcbiAgICAgIC8vIHRoZSBwYXJhbWV0ZXIgYW5kIG1hcmsgaXQgb3B0aW9uYWwg4oCUIGNhbGxlcnMgY2FuIHRoZW4gb21pdCBpdCBlbnRpcmVseVxuICAgICAgLy8gKGByZWNvcmQuY29tbWFuZCgpYCBpbnN0ZWFkIG9mIGByZWNvcmQuY29tbWFuZCh7fSlgKS4gUmVxdWlyZWQtZmllbGQgYXJncyBrZWVwXG4gICAgICAvLyB0aGUgbWFuZGF0b3J5IHBhcmFtZXRlciAoYSBge31gIGRlZmF1bHQgd291bGRuJ3Qgc2F0aXNmeSB0aGVpciB0eXBlKS5cbiAgICAgIGNvbnN0IGRlZmF1bHRzVG9FbXB0eU9iamVjdCA9IG1ldGFkYXRhLmFyZ3MubGVuZ3RoID09PSAxICYmIHRoaXMuYXJnVHlwZUFjY2VwdHNFbXB0eU9iamVjdChtZXRhZGF0YS5hcmdzWzBdLnR5cGUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmFtRG9jczogbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYCAgICogQHBhcmFtIHske2FyZy50eXBlfX0gJHtkZWZhdWx0c1RvRW1wdHlPYmplY3QgPyBgWyR7YXJnLm5hbWV9XWAgOiBhcmcubmFtZX0gLSBDb21tYW5kIGFyZ3VtZW50LlxcbmApLmpvaW4oXCJcIiksXG4gICAgICAgIHBhcmFtZXRlcnM6IGRlZmF1bHRzVG9FbXB0eU9iamVjdCA/IGAke3BhcmFtZXRlck5hbWVzWzBdfSA9IHt9YCA6IHBhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgcGF5bG9hZEFyZ3VtZW50czogYFske3BhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXJhbURvY3M6IFwiICAgKiBAcGFyYW0gey4uLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gY29tbWFuZEFyZ3VtZW50cyAtIEN1c3RvbSBjb21tYW5kIGFyZ3VtZW50cy5cXG5cIixcbiAgICAgIHBhcmFtZXRlcnM6IFwiLi4uY29tbWFuZEFyZ3VtZW50c1wiLFxuICAgICAgcGF5bG9hZEFyZ3VtZW50czogXCJjb21tYW5kQXJndW1lbnRzXCIsXG4gICAgICByZXR1cm5UeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBzaW5nbGUgY29tbWFuZC1hcmdzIEpTRG9jIHR5cGUgaXMga25vd24gdG8gYWNjZXB0IGFuIGVtcHR5IG9iamVjdCBge31gOlxuICAgKiBhIHNpbmdsZSBiYWxhbmNlZCBvYmplY3QgbGl0ZXJhbCB3aG9zZSB0b3AtbGV2ZWwgbWVtYmVycyBhcmUgYWxsIG9wdGlvbmFsIChgbmFtZT86YClcbiAgICogb3IgaW5kZXggc2lnbmF0dXJlcyAoYFtrOiAuLi5dOmApLiBBbnl0aGluZyBlbHNlIHJldHVybnMgZmFsc2Ugc28gdGhlIHBhcmFtZXRlciBzdGF5c1xuICAgKiByZXF1aXJlZCDigJQgaW5jbHVkaW5nIGEgcmVxdWlyZWQgbWVtYmVyLCBhIG5vbi1vYmplY3QtbGl0ZXJhbCAoYSBwb3NpdGlvbmFsIGBudW1iZXJgLFxuICAgKiBhIGBSZWNvcmQ8Li4uPmAgLyBgUGFydGlhbDwuLi4+YCB3aG9zZSBrZXkvd3JhcHBlciBtYXkgc3RpbGwgcmVxdWlyZSBkYXRhKSwgYW5kIGFueVxuICAgKiBpbnRlcnNlY3Rpb24vdW5pb24gKGUuZy4gYHthPzogeH0gJiB7Yjogc3RyaW5nfWApLCB3aGVyZSBge31gIGlzIG5vdCBhc3NpZ25hYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBhcmcncyBKU0RvYyB0eXBlIHN0cmluZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIHBhcmFtZXRlciBjYW4gZGVmYXVsdCB0byBge31gLlxuICAgKi9cbiAgYXJnVHlwZUFjY2VwdHNFbXB0eU9iamVjdCh0eXBlKSB7XG4gICAgY29uc3QgdHJpbW1lZFR5cGUgPSB0eXBlLnRyaW0oKVxuXG4gICAgLy8gTXVzdCBiZSBhIHNpbmdsZSBiYWxhbmNlZCBvYmplY3QgbGl0ZXJhbDogc3RhcnRzIHdpdGggYHtgLCBlbmRzIHdpdGggYH1gLCBhbmQgdGhlXG4gICAgLy8gb3BlbmluZyBicmFjZSBjbG9zZXMgb25seSBhdCB0aGUgZmluYWwgY2hhcmFjdGVyLiBUaGlzIHJlamVjdHMgaW50ZXJzZWN0aW9ucy91bmlvbnNcbiAgICAvLyBsaWtlIGB7YT86IHh9ICYge2I6IHN0cmluZ31gIHRoYXQgbWVyZWx5IGhhcHBlbiB0byBzdGFydCBge2AgYW5kIGVuZCBgfWAuXG4gICAgaWYgKCEodHJpbW1lZFR5cGUuc3RhcnRzV2l0aChcIntcIikgJiYgdHJpbW1lZFR5cGUuZW5kc1dpdGgoXCJ9XCIpKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlQmFsYW5jZWRPYmplY3RMaXRlcmFsKHRyaW1tZWRUeXBlKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBpbm5lciA9IHRyaW1tZWRUeXBlLnNsaWNlKDEsIC0xKVxuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5zcGxpdFRvcExldmVsVHlwZU1lbWJlcnMoaW5uZXIpKSB7XG4gICAgICBjb25zdCBjb2xvbkluZGV4ID0gdGhpcy50b3BMZXZlbENvbG9uSW5kZXgobWVtYmVyKVxuXG4gICAgICAvLyBObyB0b3AtbGV2ZWwgY29sb246IGEgY2FsbC9jb25zdHJ1Y3QvbWFwcGVkIHNpZ25hdHVyZSBvciBtYWxmb3JtZWQgbWVtYmVyIOKAlFxuICAgICAgLy8gY2FuJ3QgY29uZmlybSBpdCdzIG9wdGlvbmFsLCBzbyB0cmVhdCB0aGUgdHlwZSBhcyBub3QgZW1wdHktZGVmYXVsdGFibGUuXG4gICAgICBpZiAoY29sb25JbmRleCA8IDApIHJldHVybiBmYWxzZVxuXG4gICAgICBjb25zdCBrZXkgPSBtZW1iZXIuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpXG5cbiAgICAgIC8vIEluZGV4IHNpZ25hdHVyZXMgKGBbazogc3RyaW5nXWApIGRvbid0IHJlcXVpcmUgYSB2YWx1ZTsgb3B0aW9uYWwgcHJvcHMgZW5kIGluIGA/YC5cbiAgICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSwgc28gYHt9YCB3b3VsZCBub3Qgc2F0aXNmeSB0aGUgdHlwZS5cbiAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJbXCIpICYmICFrZXkuZW5kc1dpdGgoXCI/XCIpKSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyB0aGUgaW5uZXIgYm9keSBvZiBhbiBvYmplY3QtbGl0ZXJhbCB0eXBlIGludG8gaXRzIHRvcC1sZXZlbCBtZW1iZXJzLFxuICAgKiByZXNwZWN0aW5nIG5lc3RlZCBge31gIC8gYFtdYCAvIGA8PmAgLyBgKClgIHNvIGZpZWxkIHR5cGVzIGxpa2UgYHN0cmluZ1tdIHwgbnVsbGBcbiAgICogb3IgYHthOiBifWAgYXJlbid0IHNwbGl0IG1pZC10eXBlLiBNZW1iZXJzIGFyZSBzZXBhcmF0ZWQgYnkgYCxgIG9yIGA7YC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlubmVyIC0gT2JqZWN0LWxpdGVyYWwgYm9keSAod2l0aG91dCB0aGUgb3V0ZXIgYnJhY2VzKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRyaW1tZWQgbm9uLWVtcHR5IHRvcC1sZXZlbCBtZW1iZXJzLlxuICAgKi9cbiAgc3BsaXRUb3BMZXZlbFR5cGVNZW1iZXJzKGlubmVyKSB7XG4gICAgY29uc3QgbWVtYmVycyA9IFtdXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIGxldCBzdGFydCA9IDBcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbm5lci5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGlubmVyW2luZGV4XVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIntcIiB8fCBjaGFyYWN0ZXIgPT09IFwiW1wiIHx8IGNoYXJhY3RlciA9PT0gXCI8XCIgfHwgY2hhcmFjdGVyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gXCJ9XCIgfHwgY2hhcmFjdGVyID09PSBcIl1cIiB8fCBjaGFyYWN0ZXIgPT09IFwiPlwiIHx8IGNoYXJhY3RlciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMVxuICAgICAgfSBlbHNlIGlmICgoY2hhcmFjdGVyID09PSBcIixcIiB8fCBjaGFyYWN0ZXIgPT09IFwiO1wiKSAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgICBtZW1iZXJzLnB1c2goaW5uZXIuc2xpY2Uoc3RhcnQsIGluZGV4KSlcbiAgICAgICAgc3RhcnQgPSBpbmRleCArIDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1iZXJzLnB1c2goaW5uZXIuc2xpY2Uoc3RhcnQpKVxuXG4gICAgcmV0dXJuIG1lbWJlcnMubWFwKChtZW1iZXIpID0+IG1lbWJlci50cmltKCkpLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIubGVuZ3RoID4gMClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgZmlyc3QgdG9wLWxldmVsIGA6YCBpbiBhbiBvYmplY3QtbGl0ZXJhbCBtZW1iZXIsIGlnbm9yaW5nIGNvbG9uc1xuICAgKiBuZXN0ZWQgaW5zaWRlIGB7fWAgLyBgW11gIC8gYDw+YCAvIGAoKWAgKGUuZy4gYW4gaW5kZXggc2lnbmF0dXJlIGBbazogc3RyaW5nXWApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtYmVyIC0gQSBzaW5nbGUgb2JqZWN0LWxpdGVyYWwgbWVtYmVyLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBjb2xvbiBpbmRleCwgb3IgLTEgd2hlbiBub25lIGlzIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqL1xuICB0b3BMZXZlbENvbG9uSW5kZXgobWVtYmVyKSB7XG4gICAgbGV0IGRlcHRoID0gMFxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbWJlci5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IG1lbWJlcltpbmRleF1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gXCJ7XCIgfHwgY2hhcmFjdGVyID09PSBcIltcIiB8fCBjaGFyYWN0ZXIgPT09IFwiPFwiIHx8IGNoYXJhY3RlciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IFwifVwiIHx8IGNoYXJhY3RlciA9PT0gXCJdXCIgfHwgY2hhcmFjdGVyID09PSBcIj5cIiB8fCBjaGFyYWN0ZXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDFcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBcIjpcIiAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgc2luZ2xlIGJhbGFuY2VkIG9iamVjdCBsaXRlcmFsIOKAlCBpdHMgbGVhZGluZyBge2AgY2xvc2VzIG9ubHlcbiAgICogYXQgdGhlIGZpbmFsIGNoYXJhY3Rlci4gUmVqZWN0cyB0b3AtbGV2ZWwgaW50ZXJzZWN0aW9ucy91bmlvbnMgbGlrZSBge2E/OiB4fSAmIHtiOiB5fWBcbiAgICogb3IgYHthPzogeH0gfCBzdHJpbmdgIHdob3NlIGJyYWNlIGRlcHRoIHJldHVybnMgdG8gMCBiZWZvcmUgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBIHRyaW1tZWQgdHlwZSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBge2AgYW5kIGVuZHMgd2l0aCBgfWAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGJyYWNlcyB3cmFwIHRoZSB3aG9sZSB0eXBlLlxuICAgKi9cbiAgaXNTaW5nbGVCYWxhbmNlZE9iamVjdExpdGVyYWwodHlwZSkge1xuICAgIGxldCBkZXB0aCA9IDBcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gdHlwZVtpbmRleF1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gXCJ7XCIgfHwgY2hhcmFjdGVyID09PSBcIltcIiB8fCBjaGFyYWN0ZXIgPT09IFwiPFwiIHx8IGNoYXJhY3RlciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IFwifVwiIHx8IGNoYXJhY3RlciA9PT0gXCJdXCIgfHwgY2hhcmFjdGVyID09PSBcIj5cIiB8fCBjaGFyYWN0ZXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDFcblxuICAgICAgICAvLyBUaGUgb3BlbmluZyBicmFjZSBiYWxhbmNlZCBiZWZvcmUgdGhlIGVuZCwgc28gc29tZXRoaW5nIGZvbGxvd3MgdGhlIGxpdGVyYWwuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiBpbmRleCA8IHR5cGUubGVuZ3RoIC0gMSkgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcHRoID09PSAwXG4gIH1cblxuICAvKipcbiAgICogRW5yaWNoZXMgY3VzdG9tLWNvbW1hbmQgbWV0YWRhdGEgYnkgZGVyaXZpbmcgYSBjb21tYW5kJ3MgdHlwZWQgYXJncyBhbmQgcmV0dXJuXG4gICAqIHR5cGUgZnJvbSB0aGUgYmFja2VuZCByZXNvdXJjZSBtZXRob2QncyBgQHBhcmFtYC9gQHJldHVybnNgIEpTRG9jIHdoZW4gdGhleSBhcmVcbiAgICogbm90IGFscmVhZHkgZGVjbGFyZWQgaW4gYHJlc291cmNlQ29uZmlnYC4gUHJlY2VkZW5jZTogZXhwbGljaXQgYHJlc291cmNlQ29uZmlnYFxuICAgKiBge2FyZ3MsIHJldHVyblR5cGV9YCB3aW5zLCB0aGVuIHRoZSBkZXJpdmVkIGJhY2tlbmQtbWV0aG9kIEpTRG9jLCB0aGVuIHRoZSBnZW5lcmljXG4gICAqIGRlZmF1bHQuIE1vZGVsLWNsYXNzIGlkZW50aWZpZXJzIGluIHRoZSBkZXJpdmVkIHR5cGVzIGFyZSBkb3duZ3JhZGVkIHRvIGBhbnlgXG4gICAqIGJlY2F1c2UgdGhlIGZyb250ZW5kIHJlY2VpdmVzIGEgc2VyaWFsaXplZCByZWNvcmQsIG5vdCBhIG1vZGVsIGluc3RhbmNlLCB3aGljaCB0aGVcbiAgICogY29uc3VtZXIgaHlkcmF0ZXMgd2l0aCBgTW9kZWwuaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UoLi4uKWAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSBhcmdzLmNvbW1hbmRNZXRhZGF0YSAtIERlY2xhcmVkIHBlci1jb21tYW5kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmNvbW1hbmROYW1lcyAtIENvbW1hbmQgbWV0aG9kIG5hbWVzIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZyb250ZW5kTW9kZWxGaWxlUGF0aCAtIEdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT4+fSAtIEVucmljaGVkIG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgY29tbWFuZE1ldGFkYXRhV2l0aFJlc291cmNlSnNEb2Moe2NvbW1hbmRNZXRhZGF0YSwgY29tbWFuZE5hbWVzLCBmcm9udGVuZE1vZGVsRmlsZVBhdGgsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gY29tbWFuZE1ldGFkYXRhXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSAqL1xuICAgIGNvbnN0IGVucmljaGVkID0gey4uLmNvbW1hbmRNZXRhZGF0YX1cblxuICAgIGZvciAoY29uc3QgY29tbWFuZE5hbWUgb2YgY29tbWFuZE5hbWVzKSB7XG4gICAgICBjb25zdCBkZWNsYXJlZCA9IGNvbW1hbmRNZXRhZGF0YVtjb21tYW5kTmFtZV0gfHwge2FyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICAgICAgY29uc3Qgc291cmNlQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHRhcmdldENsYXNzOiByZXNvdXJjZUNsYXNzfSlcblxuICAgICAgaWYgKCFzb3VyY2VDbGFzc05hbWUpIHtcbiAgICAgICAgZW5yaWNoZWRbY29tbWFuZE5hbWVdID0gZGVjbGFyZWRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgcmV0dXJuVHlwZSA9IGRlY2xhcmVkLnJldHVyblR5cGVcblxuICAgICAgaWYgKCFyZXR1cm5UeXBlKSB7XG4gICAgICAgIGNvbnN0IGpzRG9jUmV0dXJuVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlRGVmaW5pdGlvbih7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG5cbiAgICAgICAgaWYgKGpzRG9jUmV0dXJuVHlwZSkge1xuICAgICAgICAgIHJldHVyblR5cGUgPSB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUNvbW1hbmRKc0RvY1R5cGUoe1xuICAgICAgICAgICAgZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgICAgICAgaW1wb3J0QWxpYXNlczoganNEb2NSZXR1cm5UeXBlLmltcG9ydEFsaWFzZXMsXG4gICAgICAgICAgICBqc0RvY1R5cGU6IHRoaXMudW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlOiBqc0RvY1JldHVyblR5cGUudHlwZX0pLFxuICAgICAgICAgICAgc291cmNlRmlsZToganNEb2NSZXR1cm5UeXBlLnNvdXJjZUZpbGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBhcmdzID0gZGVjbGFyZWQuYXJnc1xuXG4gICAgICBpZiAoIWFyZ3MgfHwgYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QganNEb2NQYXJhbWV0ZXJzID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFBhcmFtZXRlcnMoe21ldGhvZE5hbWU6IGNvbW1hbmROYW1lLCBzb3VyY2VDbGFzc05hbWV9KVxuICAgICAgICAvLyBTa2lwIG9iamVjdC1wcm9wZXJ0eSB0YWdzIChgQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWVzc2FnZWApOyBvbmx5IHRoZVxuICAgICAgICAvLyB0b3AtbGV2ZWwgcGFyYW1ldGVycyBtYXAgdG8gbWV0aG9kIGFyZ3VtZW50cywgb3RoZXJ3aXNlIHRoZSBzaGFyZWRcbiAgICAgICAgLy8gYEBwYXJhbSB7b2JqZWN0fSBhcmdzYCArIHByb3BlcnR5IHN0eWxlIHdvdWxkIGVtaXQgYG5hbWUoYXJncywgYXJncylgLlxuICAgICAgICBjb25zdCB0b3BMZXZlbFBhcmFtZXRlcnMgPSAoanNEb2NQYXJhbWV0ZXJzIHx8IFtdKS5maWx0ZXIoKHBhcmFtZXRlcikgPT4gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09PSBcInN0cmluZ1wiICYmICFwYXJhbWV0ZXIubmFtZS5pbmNsdWRlcyhcIi5cIikpXG5cbiAgICAgICAgaWYgKHRvcExldmVsUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXJncyA9IHRvcExldmVsUGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy5mcm9udGVuZFJlc29sdmFibGVDb21tYW5kSnNEb2NUeXBlKHtcbiAgICAgICAgICAgICAgZnJvbnRlbmRNb2RlbEZpbGVQYXRoLFxuICAgICAgICAgICAgICBpbXBvcnRBbGlhc2VzOiBwYXJhbWV0ZXIuaW1wb3J0QWxpYXNlcyxcbiAgICAgICAgICAgICAganNEb2NUeXBlOiBwYXJhbWV0ZXIudHlwZSxcbiAgICAgICAgICAgICAgc291cmNlRmlsZTogcGFyYW1ldGVyLnNvdXJjZUZpbGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5yaWNoZWRbY29tbWFuZE5hbWVdID0ge2FyZ3M6IGFyZ3MgfHwgW10sIHJldHVyblR5cGU6IHJldHVyblR5cGUgfHwgbnVsbH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5yaWNoZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVud3JhcHBlZCBwcm9taXNlIGpzIGRvYyB0eXBlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuanNEb2NUeXBlIC0gSlNEb2MgdHlwZSB0byBub3JtYWxpemUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHJlc29sdmVkIHZhbHVlIHR5cGUgZm9yIHNlcmlhbGl6ZWQgZnJvbnRlbmQgYXR0cmlidXRlcy5cbiAgICovXG4gIHVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZX0pIHtcbiAgICBjb25zdCBwcm9taXNlUHJlZml4ID0gXCJQcm9taXNlPFwiXG5cbiAgICBpZiAoIWpzRG9jVHlwZS5zdGFydHNXaXRoKHByb21pc2VQcmVmaXgpKSByZXR1cm4ganNEb2NUeXBlXG5cbiAgICBpZiAoIWpzRG9jVHlwZS5lbmRzV2l0aChcIj5cIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgUHJvbWlzZSBKU0RvYyB0eXBlIHRvIGVuZCB3aXRoICc+JzogJHtqc0RvY1R5cGV9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBqc0RvY1R5cGUuc2xpY2UocHJvbWlzZVByZWZpeC5sZW5ndGgsIC0xKS50cmltKClcblxuICAgIGlmIChyZXNvbHZlZFR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBQcm9taXNlIEpTRG9jIHR5cGUgdG8gY29udGFpbiBhIHJlc29sdmVkIHR5cGU6ICR7anNEb2NUeXBlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWV0aG9kIG93bmVyIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IGFyZ3MudGFyZ2V0Q2xhc3MgLSBUYXJnZXQgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIENsYXNzIG5hbWUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kLlxuICAgKi9cbiAgbWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWUsIHRhcmdldENsYXNzfSkge1xuICAgIGxldCBwcm90b3R5cGUgPSB0YXJnZXRDbGFzcy5wcm90b3R5cGVcblxuICAgIHdoaWxlIChwcm90b3R5cGUgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2ROYW1lKVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvcj8udmFsdWUgIT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHByb3RvdHlwZS5jb25zdHJ1Y3Rvcj8ubmFtZVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3JOYW1lID09IFwic3RyaW5nXCIgJiYgY29uc3RydWN0b3JOYW1lLmxlbmd0aCA+IDApIHJldHVybiBjb25zdHJ1Y3Rvck5hbWVcblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZUNsYXNzTmFtZSAtIFNvdXJjZSBjbGFzcyBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIGRvY3VtZW50ZWQuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe21ldGhvZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pIHtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVEZWZpbml0aW9uKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGUgPyByZXR1cm5UeXBlLnR5cGUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGUgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlQ2xhc3NOYW1lIC0gU291cmNlIGNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSB8IG51bGw+fSAtIEpTRG9jIHJldHVybiB0eXBlIGRlZmluaXRpb24gd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlRGVmaW5pdGlvbih7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMoKVxuICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gXG5cbiAgICBpZiAoIXJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuaGFzKHJldHVyblR5cGVLZXkpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuZ2V0KHJldHVyblR5cGVLZXkpXG5cbiAgICBpZiAoIXJldHVyblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNEb2MgcmV0dXJuIHR5cGUgZm9yICR7cmV0dXJuVHlwZUtleX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmV0dXJuVHlwZS50eXBlICE9IFwic3RyaW5nXCIgfHwgcmV0dXJuVHlwZS50eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHJldHVybiB0eXBlIGZvciAke3JldHVyblR5cGVLZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlLlxuICAgKiBAcGFyYW0ge3ttZXRob2ROYW1lOiBzdHJpbmcsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNvdXJjZUNsYXNzTmFtZTogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gSlNEb2MgcGFyYW1ldGVyIHR5cGUgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHttZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVycyh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSlcblxuICAgIGlmICghcGFyYW1ldGVycykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbcGFyYW1ldGVySW5kZXhdXG5cbiAgICBpZiAocGFyYW1ldGVyID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsXG5cbiAgICBpZiAocGFyYW1ldGVyLnR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgZm9yICR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9IHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlci50eXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHt7bWV0aG9kTmFtZTogc3RyaW5nLCBzb3VyY2VDbGFzc05hbWU6IHN0cmluZ319IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZVtdIHwgbnVsbD59IC0gSlNEb2MgcGFyYW1ldGVycyAobmFtZSArIHR5cGUpIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUGFyYW1ldGVycyh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMoKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzS2V5ID0gYCR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YFxuXG4gICAgaWYgKCFyZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmhhcyhwYXJhbWV0ZXJUeXBlc0tleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcy5nZXQocGFyYW1ldGVyVHlwZXNLZXkpXG5cbiAgICBpZiAoIXBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNEb2MgcGFyYW1ldGVycyBmb3IgJHtwYXJhbWV0ZXJUeXBlc0tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYXA8c3RyaW5nLCBSZXNvdXJjZU1ldGhvZFJldHVyblR5cGU+Pn0gLSBSZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzIGtleWVkIGJ5IENsYXNzTmFtZS5tZXRob2ROYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcygpIHtcbiAgICBpZiAodGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcykgcmV0dXJuIHRoaXMuX3Jlc291cmNlTWV0aG9kUmV0dXJuVHlwZXNcblxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpXG4gICAgY29uc3QgcmV0dXJuVHlwZXMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGUsIFwidXRmOFwiKVxuXG4gICAgICB0aGlzLmFkZFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXNGcm9tU291cmNlKHtyZXR1cm5UeXBlcywgc291cmNlRmlsZSwgc291cmNlVGV4dH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IHJldHVyblR5cGVzXG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZVtdPj59IC0gUmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcnMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc0Zyb21Tb3VyY2Uoe3BhcmFtZXRlclR5cGVzLCBzb3VyY2VGaWxlLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXNcblxuICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgSlNEb2Mgc291cmNlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZXMgdGhhdCBjYW4gZGVmaW5lIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbmQgbW9kZWwgYWNjZXNzb3JzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRmlsZXMoKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VEaXJlY3Rvcnkgb2YgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpKSB7XG4gICAgICBzb3VyY2VGaWxlcy5wdXNoKC4uLmF3YWl0IHRoaXMuamF2YXNjcmlwdEZpbGVzSW5EaXJlY3Rvcnkoc291cmNlRGlyZWN0b3J5KSlcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlRmlsZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIEpTRG9jIHNvdXJjZSBkaXJlY3Rvcmllcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNvdXJjZSBkaXJlY3RvcmllcyB0byBzY2FuIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgSlNEb2MuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpIHtcbiAgICBjb25zdCBzb3VyY2VEaXJlY3RvcmllcyA9IG5ldyBTZXQoW3BhdGguam9pbih0aGlzLmRpcmVjdG9yeSgpLCBcInNyY1wiKV0pXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEJhY2tlbmRQcm9qZWN0cygpKSB7XG4gICAgICBpZiAodHlwZW9mIGJhY2tlbmRQcm9qZWN0LnBhdGggPT0gXCJzdHJpbmdcIiAmJiBiYWNrZW5kUHJvamVjdC5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc291cmNlRGlyZWN0b3JpZXMuYWRkKHBhdGguam9pbihiYWNrZW5kUHJvamVjdC5wYXRoLCBcInNyY1wiKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzb3VyY2VEaXJlY3RvcmllcylcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMgZnJvbSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZT59IGFyZ3MucmV0dXJuVHlwZXMgLSBNdXRhYmxlIHJldHVybiB0eXBlcyBtYXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gW2FyZ3Muc291cmNlRmlsZV0gLSBTb3VyY2UgZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VGaWxlID0gbnVsbCwgc291cmNlVGV4dH0pIHtcbiAgICBjb25zdCBjbGFzc1JlZ2V4ID0gL2NsYXNzXFxzKyhbQS1aYS16XyRdW1xcdyRdKilcXHMrKD86ZXh0ZW5kc1xccytbXntdKyk/XFx7L2dcbiAgICBjb25zdCBpbXBvcnRBbGlhc2VzID0gdGhpcy5qc0RvY0ltcG9ydEFsaWFzZXNGcm9tU291cmNlKHNvdXJjZVRleHQpXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG5cbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHRoaXMuanNEb2NSZXR1cm5UeXBlKGpzRG9jTWF0Y2hbMV0pXG5cbiAgICAgICAgaWYgKHJldHVyblR5cGUpIHtcbiAgICAgICAgICByZXR1cm5UeXBlcy5zZXQoYCR7Y2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YCwge2ltcG9ydEFsaWFzZXMsIHNvdXJjZUZpbGUsIHR5cGU6IHJldHVyblR5cGV9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsYXNzUmVnZXgubGFzdEluZGV4ID0gY2xhc3NCb2R5RW5kICsgMVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMgZnJvbSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7e3BhcmFtZXRlclR5cGVzOiBNYXA8c3RyaW5nLCBSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVbXT4sIHNvdXJjZUZpbGU/OiBzdHJpbmcgfCBudWxsLCBzb3VyY2VUZXh0OiBzdHJpbmd9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNGcm9tU291cmNlKHtwYXJhbWV0ZXJUeXBlcywgc291cmNlRmlsZSA9IG51bGwsIHNvdXJjZVRleHR9KSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC9jbGFzc1xccysoW0EtWmEtel8kXVtcXHckXSopXFxzKyg/OmV4dGVuZHNcXHMrW157XSspP1xcey9nXG4gICAgY29uc3QgaW1wb3J0QWxpYXNlcyA9IHRoaXMuanNEb2NJbXBvcnRBbGlhc2VzRnJvbVNvdXJjZShzb3VyY2VUZXh0KVxuICAgIGxldCBjbGFzc01hdGNoXG5cbiAgICB3aGlsZSAoKGNsYXNzTWF0Y2ggPSBjbGFzc1JlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc01hdGNoWzFdXG4gICAgICBjb25zdCBjbGFzc0JvZHlTdGFydCA9IGNsYXNzUmVnZXgubGFzdEluZGV4XG4gICAgICBjb25zdCBjbGFzc0JvZHlFbmQgPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiBjbGFzc0JvZHlTdGFydCAtIDEsIHNvdXJjZVRleHR9KVxuXG4gICAgICBpZiAoY2xhc3NCb2R5RW5kID09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGJyYWNlIG1hdGNoZXIgY2FuJ3QgdG9rZW5pemUgZXZlcnkgY29uc3RydWN0IChlLmcuIGEgcmVnZXggbGl0ZXJhbFxuICAgICAgICAvLyB3aG9zZSBxdW90ZXMgbG9vayBsaWtlIHN0cmluZyBkZWxpbWl0ZXJzKSwgc28gaXQgY2FuIGZhaWwgdG8gbG9jYXRlIGFcbiAgICAgICAgLy8gY2xhc3MgYm9keS4gU2tpcCBtZXRhZGF0YSBleHRyYWN0aW9uIGZvciB0aGF0IGNsYXNzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFib3J0aW5nIHRoZSB3aG9sZSBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uOyByZXNvdXJjZXMgdGhhdCBwYXJzZVxuICAgICAgICAvLyBjbGVhbmx5IHN0aWxsIGdldCB0aGVpciBKU0RvYy1kZXJpdmVkIHJldHVybi9wYXJhbSB0eXBlcy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhc3NCb2R5ID0gc291cmNlVGV4dC5zbGljZShjbGFzc0JvZHlTdGFydCwgY2xhc3NCb2R5RW5kKVxuICAgICAgY29uc3QganNEb2NSZWdleCA9IC9cXC9cXCpcXCooW1xcc1xcU10qPylcXCpcXC8vZ1xuICAgICAgbGV0IGpzRG9jTWF0Y2hcblxuICAgICAgd2hpbGUgKChqc0RvY01hdGNoID0ganNEb2NSZWdleC5leGVjKGNsYXNzQm9keSkpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFmdGVySnNEb2MgPSBjbGFzc0JvZHkuc2xpY2UoanNEb2NSZWdleC5sYXN0SW5kZXgpXG4gICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gc291cmNlQWZ0ZXJKc0RvYy5tYXRjaCgvXlxccyooPzphc3luY1xccyspPyhbQS1aYS16XyRdW1xcdyRdKilcXHMqXFwoLylcblxuICAgICAgICBpZiAoIW1ldGhvZE1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXVxuICAgICAgICBjb25zdCBqc0RvY1BhcmFtZXRlcnMgPSB0aGlzLmpzRG9jUGFyYW1ldGVycyhqc0RvY01hdGNoWzFdKVxuXG4gICAgICAgIGlmIChqc0RvY1BhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmFtZXRlclR5cGVzLnNldChgJHtjbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gLCBqc0RvY1BhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+ICh7Li4ucGFyYW1ldGVyLCBpbXBvcnRBbGlhc2VzLCBzb3VyY2VGaWxlfSkpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNsYXNzUmVnZXgubGFzdEluZGV4ID0gY2xhc3NCb2R5RW5kICsgMVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIEpTRG9jIGltcG9ydCBhbGlhc2VzIGZyb20gc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlVGV4dCAtIFNvdXJjZSB0ZXh0LlxuICAgKiBAcmV0dXJucyB7TWFwPHN0cmluZywgUmVzb3VyY2VKc0RvY0ltcG9ydEFsaWFzPn0gLSBJbXBvcnQgYWxpYXNlcyBrZXllZCBieSBsb2NhbCBuYW1lLlxuICAgKi9cbiAganNEb2NJbXBvcnRBbGlhc2VzRnJvbVNvdXJjZShzb3VyY2VUZXh0KSB7XG4gICAgY29uc3QgaW1wb3J0QWxpYXNlcyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGltcG9ydFJlZ2V4ID0gL0BpbXBvcnRcXHMqXFx7XFxzKihbXn1dKz8pXFxzKlxcfVxccypmcm9tXFxzKltcIiddKFteXCInXSspW1wiJ10vZ1xuICAgIGxldCBpbXBvcnRNYXRjaFxuXG4gICAgd2hpbGUgKChpbXBvcnRNYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBpbXBvcnRMaXN0ID0gaW1wb3J0TWF0Y2hbMV1cbiAgICAgIGNvbnN0IHNwZWNpZmllciA9IGltcG9ydE1hdGNoWzJdXG5cbiAgICAgIGZvciAoY29uc3QgcmF3SW1wb3J0RW50cnkgb2YgaW1wb3J0TGlzdC5zcGxpdChcIixcIikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0RW50cnkgPSByYXdJbXBvcnRFbnRyeS50cmltKClcblxuICAgICAgICBpZiAoaW1wb3J0RW50cnkubGVuZ3RoIDwgMSkgY29udGludWVcblxuICAgICAgICBjb25zdCBlbnRyeU1hdGNoID0gaW1wb3J0RW50cnkubWF0Y2goL14oZGVmYXVsdHxbQS1aYS16XyRdW1xcdyRdKikoPzpcXHMrYXNcXHMrKFtBLVphLXpfJF1bXFx3JF0qKSk/JC8pXG5cbiAgICAgICAgaWYgKCFlbnRyeU1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgSlNEb2MgQGltcG9ydCBlbnRyeTogJHtpbXBvcnRFbnRyeX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW1wb3J0ZWROYW1lID0gZW50cnlNYXRjaFsxXVxuICAgICAgICBjb25zdCBhbGlhc05hbWUgPSBlbnRyeU1hdGNoWzJdIHx8IGltcG9ydGVkTmFtZVxuXG4gICAgICAgIGltcG9ydEFsaWFzZXMuc2V0KGFsaWFzTmFtZSwge2ltcG9ydGVkTmFtZSwgc3BlY2lmaWVyfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW1wb3J0QWxpYXNlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUZXh0IC0gSlNEb2MgdGV4dCBpbnNpZGUgY29tbWVudCBtYXJrZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBqc0RvY1JldHVyblR5cGUoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcmV0dXJuc01hdGNoID0ganNEb2NUZXh0Lm1hdGNoKC9AcmV0dXJucz9cXHMqXFx7LylcblxuICAgIGlmICghcmV0dXJuc01hdGNoIHx8IHJldHVybnNNYXRjaC5pbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHJldHVybnNNYXRjaC5pbmRleCArIHJldHVybnNNYXRjaFswXS5sZW5ndGggLSAxXG4gICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEpTRG9jIHJldHVybiB0eXBlIGZyb206ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHRoaXMubm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpKVxuXG4gICAgaWYgKHJldHVyblR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZXMgYSBKU0RvYyB0eXBlIHNwYW5uaW5nIG11bHRpcGxlIGNvbW1lbnQgbGluZXMgaW50byBhIHNpbmdsZSBsaW5lIHNvIGl0IGNhblxuICAgKiBiZSBlbWl0dGVkIGludG8gYW4gaW5saW5lIHR5cGUtYXNzZXJ0aW9uIGNhc3QuIEEgbXVsdGlsaW5lIGJhY2tlbmQgcmV0dXJuIHR5cGUga2VlcHNcbiAgICogaXRzIGxlYWRpbmcgY29udGludWF0aW9uIGFzdGVyaXNrcyBpbiB0aGUgY2FwdHVyZWQgc3Vic3RyaW5nLCB3aGljaCBhcmUgaW52YWxpZCBpbnNpZGVcbiAgICogYW4gaW5saW5lIGNhc3QgYW5kIG1ha2UgVHlwZVNjcmlwdCByZWFkIHRoZSBhc3NlcnRlZCB0eXBlIGFzIGB1bmRlZmluZWRgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUeXBlIC0gUmF3IGNhcHR1cmVkIEpTRG9jIHR5cGUsIHBvc3NpYmx5IG11bHRpbGluZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTaW5nbGUtbGluZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAgbm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVHlwZSkge1xuICAgIHJldHVybiBqc0RvY1R5cGUucmVwbGFjZSgvXFxzKlxcblxccypcXCo/WyBcXHRdKi9nLCBcIiBcIikudHJpbSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVGV4dCAtIEpTRG9jIHRleHQgaW5zaWRlIGNvbW1lbnQgbWFya2Vycy5cbiAgICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcgfCBudWxsLCB0eXBlOiBzdHJpbmd9Pn0gLSBKU0RvYyBwYXJhbWV0ZXJzIChuYW1lICsgdHlwZSkgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gICAqL1xuICBqc0RvY1BhcmFtZXRlcnMoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IFtdXG4gICAgY29uc3QgcGFyYW1SZWdleCA9IC9AcGFyYW1cXHMqXFx7L2dcbiAgICBsZXQgX3BhcmFtTWF0Y2hcblxuICAgIHdoaWxlICgoX3BhcmFtTWF0Y2ggPSBwYXJhbVJlZ2V4LmV4ZWMoanNEb2NUZXh0KSkpIHtcbiAgICAgIGNvbnN0IHR5cGVPcGVuSW5kZXggPSBwYXJhbVJlZ2V4Lmxhc3RJbmRleCAtIDFcbiAgICAgIGNvbnN0IHR5cGVDbG9zZUluZGV4ID0gdGhpcy5tYXRjaGluZ0JyYWNlSW5kZXgoe29wZW5JbmRleDogdHlwZU9wZW5JbmRleCwgc291cmNlVGV4dDoganNEb2NUZXh0fSlcblxuICAgICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgSlNEb2MgcGFyYW1ldGVyIHR5cGUgZnJvbTogJHtqc0RvY1RleHR9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZSA9IHRoaXMubm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpKVxuXG4gICAgICBpZiAodHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHBhcmFtZXRlciB0eXBlIGluOiAke2pzRG9jVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciB0aGUgY2xvc2luZyBicmFjZSB0aGUgcGFyYW1ldGVyIG5hbWUgZm9sbG93cyAob3B0aW9uYWxseSBicmFja2V0ZWRcbiAgICAgIC8vIGZvciBgQHBhcmFtIHt0eXBlfSBbbmFtZV1gKS4gQ2FwdHVyZSB0aGUgbGVhZGluZyBuYW1lIHRva2VuIOKAlCBpbmNsdWRpbmcgYW55XG4gICAgICAvLyBkb3R0ZWQgcGF0aCBzbyBvYmplY3QtcHJvcGVydHkgdGFncyBsaWtlIGBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlYCBzdGF5XG4gICAgICAvLyBkaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgdG9wLWxldmVsIGBAcGFyYW0ge29iamVjdH0gYXJnc2AgcGFyYW1ldGVyLlxuICAgICAgY29uc3QgbmFtZU1hdGNoID0ganNEb2NUZXh0LnNsaWNlKHR5cGVDbG9zZUluZGV4ICsgMSkubWF0Y2goL15cXHMqXFxbP1xccyooW0EtWmEtel8kXVtcXHckLl0qKS8pXG5cbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7bmFtZTogbmFtZU1hdGNoID8gbmFtZU1hdGNoWzFdIDogbnVsbCwgdHlwZX0pXG4gICAgICBwYXJhbVJlZ2V4Lmxhc3RJbmRleCA9IHR5cGVDbG9zZUluZGV4ICsgMVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqYXZhc2NyaXB0IGZpbGVzIGluIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGRpcmVjdG9yeSkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW11cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKVxuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBmaWxlUGF0aHMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGVudHJ5UGF0aCkpXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIC9cXC4obWpzfGpzfGpzeHx0cykkLy50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIGZpbGVQYXRocy5wdXNoKGVudHJ5UGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZVBhdGhzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBtYXRjaGluZyBjbG9zaW5nIGJyYWNlIHdoaWxlIHJlc3BlY3RpbmcgSmF2YVNjcmlwdCBzdHJpbmdzIGFuZCBjb21tZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLm9wZW5JbmRleCAtIE9wZW5pbmcgYnJhY2UgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ2xvc2luZyBicmFjZSBpbmRleCB3aGVuIGZvdW5kLlxuICAgKi9cbiAgbWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXgsIHNvdXJjZVRleHR9KSB7XG4gICAgaWYgKHNvdXJjZVRleHRbb3BlbkluZGV4XSAhPT0gXCJ7XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3BlbmluZyBicmFjZSBhdCBpbmRleCAke29wZW5JbmRleH1gKVxuICAgIH1cblxuICAgIGxldCBkZXB0aCA9IDBcbiAgICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICAgIGxldCBpbkxpbmVDb21tZW50ID0gZmFsc2VcbiAgICBsZXQgaW5TdHJpbmcgPSBcIlwiXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2VUZXh0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVRleHRbaW5kZXhdXG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVRleHRbaW5kZXggKyAxXVxuICAgICAgY29uc3QgcHJldmlvdXNDaGFyID0gc291cmNlVGV4dFtpbmRleCAtIDFdXG5cbiAgICAgIGlmIChpbkxpbmVDb21tZW50KSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIlxcblwiKSBpbkxpbmVDb21tZW50ID0gZmFsc2VcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKlwiICYmIG5leHRDaGFyID09PSBcIi9cIikge1xuICAgICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IGluU3RyaW5nICYmIHByZXZpb3VzQ2hhciAhPT0gXCJcXFxcXCIpIGluU3RyaW5nID0gXCJcIlxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgaW5MaW5lQ29tbWVudCA9IHRydWVcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIvXCIgJiYgbmV4dENoYXIgPT09IFwiKlwiKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gdHJ1ZVxuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIlxcXCJcIiB8fCBjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSBcImBcIikge1xuICAgICAgICBpblN0cmluZyA9IGNoYXJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwie1wiKSB7XG4gICAgICAgIGRlcHRoKytcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJ9XCIpIHtcbiAgICAgICAgZGVwdGgtLVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0ZU5hbWUpIHJldHVybiBudWxsXG5cbiAgICBsZXQgY29sdW1uTmFtZVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVtyZXNvbHZlZEF0dHJpYnV0ZU5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgY29sdW1uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29sdW1uIC0gRGF0YWJhc2UgY29sdW1uLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBkYXRhYmFzZSBjb2x1bW4uXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAodHlwZW9mIHR5cGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IGNvbHVtbiB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgaW5mZXJlbmNlLCBnb3Q6ICR7dHlwZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudWxsOiBjb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGF0aW9uc2hpcHMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXBzLlxuICAgKi9cbiAgcmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkIHx8IHJlbGF0aW9uc2hpcHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZyDigJQgbXVzdCBiZSBhbiBhcnJheSBvZiByZWxhdGlvbnNoaXAgbmFtZXMsIGdvdCAke3R5cGVvZiByZWxhdGlvbnNoaXBzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXBOYW1lKSA9PiB0aGlzLmluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9fSBJbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIGluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRUeXBlKClcblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAnJHtyZWxhdGlvbnNoaXBUeXBlfSdgKVxuICAgIH1cblxuICAgIGxldCB0YXJnZXRDbGFzc05hbWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICB0YXJnZXRDbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTW9kZWwgY2xhc3Mgbm90IHJlZ2lzdGVyZWQgeWV0IOKAlCBmYWxsIGJhY2sgdG8gY2xhc3NOYW1lIGZyb20gcmVsYXRpb25zaGlwIGRlZmluaXRpb25cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gcmVsYXRpb25zaGlwLmNsYXNzTmFtZVxuXG4gICAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9sb2FkOiByZWxhdGlvbnNoaXAuZ2V0QXV0b2xvYWQoKSxcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgdHlwZTogcmVsYXRpb25zaGlwVHlwZVxuICAgIH1cbiAgfVxufVxuIl19